diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..b3aea4f Binary files /dev/null and b/.DS_Store differ diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..b89038b --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,149 @@ +.gitignore +.git +.idea +.vscode + +.DS_Store +*.log +local_settings.py +*.sqlite3 +*.pot +*.pyc +__pycache__ +*.db + +gmon.out + +# Backup files # +*.bak + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.conda +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..238a030 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,144 @@ +.DS_Store +*.log +local_settings.py +*.sqlite3 +*.pot +*.pyc +__pycache__ +*.db + +gmon.out + +# Backup files # +*.bak + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.conda +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/backend/AgentCoord/LLMAPI/LLMAPI.py b/backend/AgentCoord/LLMAPI/LLMAPI.py new file mode 100644 index 0000000..0ce3aa4 --- /dev/null +++ b/backend/AgentCoord/LLMAPI/LLMAPI.py @@ -0,0 +1,256 @@ +import asyncio +import openai +import yaml +from termcolor import colored +import os +from groq import AsyncGroq +from mistralai.client import MistralClient +from mistralai.models.chat_completion import ChatMessage + +# load config (apikey, apibase, model) +yaml_file = os.path.join(os.getcwd(), "config", "config.yaml") +try: + with open(yaml_file, "r", encoding="utf-8") as file: + yaml_data = yaml.safe_load(file) +except Exception: + yaml_file = {} +OPENAI_API_BASE = os.getenv("OPENAI_API_BASE") or yaml_data.get( + "OPENAI_API_BASE", "https://api.openai.com" +) +openai.api_base = OPENAI_API_BASE +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") or yaml_data.get( + "OPENAI_API_KEY", "" +) +openai.api_key = OPENAI_API_KEY +MODEL: str = os.getenv("OPENAI_API_MODEL") or yaml_data.get( + "OPENAI_API_MODEL", "gpt-4-turbo-preview" +) +FAST_DESIGN_MODE: bool = os.getenv("FAST_DESIGN_MODE") +if FAST_DESIGN_MODE is None: + FAST_DESIGN_MODE = yaml_data.get("FAST_DESIGN_MODE", False) +else: + FAST_DESIGN_MODE = FAST_DESIGN_MODE.lower() in ["true", "1", "yes"] +GROQ_API_KEY = os.getenv("GROQ_API_KEY") or yaml_data.get("GROQ_API_KEY", "") +MISTRAL_API_KEY = os.getenv("MISTRAL_API_KEY") or yaml_data.get( + "MISTRAL_API_KEY", "" +) + + +# for LLM completion +def LLM_Completion( + messages: list[dict], stream: bool = True, useGroq: bool = True +) -> str: + if not useGroq or not FAST_DESIGN_MODE: + force_gpt4 = True + useGroq = False + else: + force_gpt4 = False + useGroq = True + + if stream: + try: + loop = asyncio.get_event_loop() + except RuntimeError as ex: + if "There is no current event loop in thread" in str(ex): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + if useGroq: + if force_gpt4: + return loop.run_until_complete( + _achat_completion_json(messages=messages) + ) + else: + return loop.run_until_complete( + _achat_completion_stream_groq(messages=messages) + ) + else: + return loop.run_until_complete( + _achat_completion_stream(messages=messages) + ) + # return asyncio.run(_achat_completion_stream(messages = messages)) + else: + return _chat_completion(messages=messages) + + +async def _achat_completion_stream_groq(messages: list[dict]) -> str: + client = AsyncGroq(api_key=GROQ_API_KEY) + + max_attempts = 5 + + for attempt in range(max_attempts): + print("Attempt to use Groq (Fase Design Mode):") + try: + stream = await client.chat.completions.create( + messages=messages, + # model='gemma-7b-it', + model="mixtral-8x7b-32768", + # model='llama2-70b-4096', + temperature=0.3, + response_format={"type": "json_object"}, + stream=False, + ) + break + except Exception: + if attempt < max_attempts - 1: # i is zero indexed + continue + else: + raise "failed" + + full_reply_content = stream.choices[0].message.content + print(colored(full_reply_content, "blue", "on_white"), end="") + print() + return full_reply_content + + +async def _achat_completion_stream_mixtral(messages: list[dict]) -> str: + client = MistralClient(api_key=MISTRAL_API_KEY) + # client=AsyncGroq(api_key=GROQ_API_KEY) + max_attempts = 5 + + for attempt in range(max_attempts): + try: + messages[len(messages) - 1]["role"] = "user" + stream = client.chat( + messages=[ + ChatMessage( + role=message["role"], content=message["content"] + ) + for message in messages + ], + # model = "mistral-small-latest", + model="open-mixtral-8x7b", + # response_format={"type": "json_object"}, + ) + break # If the operation is successful, break the loop + except Exception: + if attempt < max_attempts - 1: # i is zero indexed + continue + else: + raise "failed" + + full_reply_content = stream.choices[0].message.content + print(colored(full_reply_content, "blue", "on_white"), end="") + print() + return full_reply_content + + +async def _achat_completion_stream_gpt35(messages: list[dict]) -> str: + openai.api_key = OPENAI_API_KEY + openai.api_base = OPENAI_API_BASE + response = await openai.ChatCompletion.acreate( + messages=messages, + max_tokens=4096, + n=1, + stop=None, + temperature=0.3, + timeout=3, + model="gpt-3.5-turbo-16k", + stream=True, + ) + + # create variables to collect the stream of chunks + collected_chunks = [] + collected_messages = [] + # iterate through the stream of events + async for chunk in response: + collected_chunks.append(chunk) # save the event response + choices = chunk["choices"] + if len(choices) > 0: + chunk_message = chunk["choices"][0].get( + "delta", {} + ) # extract the message + collected_messages.append(chunk_message) # save the message + if "content" in chunk_message: + print( + colored(chunk_message["content"], "blue", "on_white"), + end="", + ) + print() + + full_reply_content = "".join( + [m.get("content", "") for m in collected_messages] + ) + return full_reply_content + + +async def _achat_completion_json(messages: list[dict]) -> str: + openai.api_key = OPENAI_API_KEY + openai.api_base = OPENAI_API_BASE + + max_attempts = 5 + + for attempt in range(max_attempts): + try: + stream = await openai.ChatCompletion.acreate( + messages=messages, + max_tokens=4096, + n=1, + stop=None, + temperature=0.3, + timeout=3, + model=MODEL, + response_format={"type": "json_object"}, + ) + break + except Exception: + if attempt < max_attempts - 1: # i is zero indexed + continue + else: + raise "failed" + + full_reply_content = stream.choices[0].message.content + print(colored(full_reply_content, "blue", "on_white"), end="") + print() + return full_reply_content + + +async def _achat_completion_stream(messages: list[dict]) -> str: + openai.api_key = OPENAI_API_KEY + openai.api_base = OPENAI_API_BASE + response = await openai.ChatCompletion.acreate( + **_cons_kwargs(messages), stream=True + ) + + # create variables to collect the stream of chunks + collected_chunks = [] + collected_messages = [] + # iterate through the stream of events + async for chunk in response: + collected_chunks.append(chunk) # save the event response + choices = chunk["choices"] + if len(choices) > 0: + chunk_message = chunk["choices"][0].get( + "delta", {} + ) # extract the message + collected_messages.append(chunk_message) # save the message + if "content" in chunk_message: + print( + colored(chunk_message["content"], "blue", "on_white"), + end="", + ) + print() + + full_reply_content = "".join( + [m.get("content", "") for m in collected_messages] + ) + return full_reply_content + + +def _chat_completion(messages: list[dict]) -> str: + rsp = openai.ChatCompletion.create(**_cons_kwargs(messages)) + content = rsp["choices"][0]["message"]["content"] + return content + + +def _cons_kwargs(messages: list[dict]) -> dict: + kwargs = { + "messages": messages, + "max_tokens": 4096, + "n": 1, + "stop": None, + "temperature": 0.5, + "timeout": 3, + } + kwargs_mode = {"model": MODEL} + kwargs.update(kwargs_mode) + return kwargs diff --git a/backend/AgentCoord/LLMAPI/__init__ b/backend/AgentCoord/LLMAPI/__init__ new file mode 100644 index 0000000..85cee7c --- /dev/null +++ b/backend/AgentCoord/LLMAPI/__init__ @@ -0,0 +1,3 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# import LLMAPI diff --git a/backend/AgentCoord/PlanEngine/AgentSelectModify.py b/backend/AgentCoord/PlanEngine/AgentSelectModify.py new file mode 100644 index 0000000..f6f703a --- /dev/null +++ b/backend/AgentCoord/PlanEngine/AgentSelectModify.py @@ -0,0 +1,137 @@ +import json +from AgentCoord.util.converter import read_LLM_Completion +from typing import List, Dict +from pydantic import BaseModel, RootModel + +PROMPT_ABILITY_REQUIREMENT_GENERATION = """ +## Instruction +Based on "General Goal" and "Current Task", output a formatted "Ability Requirement" which lists at least 3 different ability requirement that is required by the "Current Task". The ability should be summarized concisely within a few words. + +## General Goal (The general goal for the collaboration plan, "Current Task" is just one of its substep) +{General_Goal} + +## Current Task +{Current_Task} + +## Output Format Example (Specify the output format) +```json +{{ + "AbilityRequirement":["Critical Thinking", "Understanding of VR", "Story Structuring Skill"] +}} +``` + +""" + + +class JSON_ABILITY_REQUIREMENT_GENERATION(BaseModel): + AbilityRequirement: List[str] + + +def generate_AbilityRequirement(General_Goal, Current_Task): + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_ABILITY_REQUIREMENT_GENERATION.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_ABILITY_REQUIREMENT_GENERATION.format( + General_Goal=General_Goal, + Current_Task=json.dumps(Current_Task, indent=4), + ), + }, + ] + print(messages[1]["content"]) + return read_LLM_Completion(messages)["AbilityRequirement"] + + +PROMPT_AGENT_ABILITY_SCORING = """ +## Instruction +Based on "Agent Board" and "Ability Requirement", output a score for each agent to estimate the possibility that the agent can fulfil the "Ability Requirement". The score should be 1-5. Provide a concise reason before you assign the score. + +## AgentBoard +{Agent_Board} + +## Ability Requirement +{Ability_Requirement} + +## Attention +Do not omit any agent from the agentboard. + +## Output Format Example (Specify the output format) +```json +{{ + "Sam":{{ + "Reason":"...", + "Score": 1 + }}, + "Alice":{{ + "Reason":"...", + "Score": 5 + }} +}} +``` + +""" + + +class JSON_Agent(BaseModel): + Reason: str + Score: int + + +class JSON_AGENT_ABILITY_SCORING(RootModel): + root: Dict[str, JSON_Agent] + + +def agentAbilityScoring(Agent_Board, Ability_Requirement_List): + scoreTable = {} + for Ability_Requirement in Ability_Requirement_List: + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_AGENT_ABILITY_SCORING.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_AGENT_ABILITY_SCORING.format( + Agent_Board=json.dumps(Agent_Board, indent=4), + Ability_Requirement=Ability_Requirement, + ), + }, + ] + print(messages[1]["content"]) + scoreTable[Ability_Requirement] = read_LLM_Completion(messages) + return scoreTable + + +def AgentSelectModify_init(stepTask, General_Goal, Agent_Board): + Current_Task = { + "TaskName": stepTask["StepName"], + "InputObject_List": stepTask["InputObject_List"], + "OutputObject": stepTask["OutputObject"], + "TaskContent": stepTask["TaskContent"], + } + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_ABILITY_REQUIREMENT_GENERATION.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_ABILITY_REQUIREMENT_GENERATION.format( + General_Goal=General_Goal, + Current_Task=json.dumps(Current_Task, indent=4), + ), + }, + ] + Ability_Requirement_List = read_LLM_Completion(messages)[ + "AbilityRequirement" + ] + scoreTable = agentAbilityScoring(Agent_Board, Ability_Requirement_List) + return scoreTable + + +def AgentSelectModify_addAspect(aspectList, Agent_Board): + scoreTable = agentAbilityScoring(Agent_Board, aspectList) + return scoreTable diff --git a/backend/AgentCoord/PlanEngine/AgentSelection_Generator.py b/backend/AgentCoord/PlanEngine/AgentSelection_Generator.py new file mode 100644 index 0000000..dcbdd49 --- /dev/null +++ b/backend/AgentCoord/PlanEngine/AgentSelection_Generator.py @@ -0,0 +1,116 @@ +import json +from AgentCoord.util.converter import read_LLM_Completion +from typing import List +from pydantic import BaseModel +import random + +MIN_TEAM_SIZE = 2 # the minimum number of agent allowed in a task for the initial coordination strategy. +MAX_TEAM_SIZE = 3 # the maximun number of agent allowed in a task for the initial coordination strategy. You can set it as any number that is larger than MIN_TEAM_SIZE. Recomend to start with less agents and manually add more. + +PROMPT_ABILITY_REQUIREMENT_GENERATION = """ +## Instruction +Based on "General Goal" and "Current Task", output a formatted "Ability Requirement" which lists at least 3 different ability requirement that is required by the "Current Task". The ability should be summarized concisely within a few words. + +## General Goal (The general goal for the collaboration plan, "Current Task" is just one of its substep) +{General_Goal} + +## Current Task +{Current_Task} + +## Output Format Example (Specify the output format) +```json +{{ + "AbilityRequirement":["Critical Thinking", "Understanding of VR", "Story Structuring Skill"] +}} +``` + +""" + + +class JSON_ABILITY_REQUIREMENT_GENERATION(BaseModel): + AbilityRequirement: List[str] + + +PROMPT_AGENT_SELECTION_GENERATION = """ +## Instruction +Based on "General Goal", "Current Task" and "Agent Board", output a formatted "Agent Selection Plan". Your selection should consider the ability needed for "Current Task" and the profile of each agent in "Agent Board". + +## General Goal (Specify the general goal for the collaboration plan) +{General_Goal} + +## Current Task +{Current_Task} + +## Agent Board (Specify the list of agents available for selection) +{Agent_Board} + +## Attention +Just use agents in Agent Board. + +## Output Format Example (Select one or more agent) +```json +{{ + "AgentSelectionPlan": ["Alice","Bob"] +}} +``` + +""" + + +class JSON_AGENT_SELECTION_GENERATION(BaseModel): + AgentSelectionPlan: List[str] + + +def generate_AbilityRequirement(General_Goal, Current_Task): + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_ABILITY_REQUIREMENT_GENERATION.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_ABILITY_REQUIREMENT_GENERATION.format( + General_Goal=General_Goal, + Current_Task=json.dumps(Current_Task, indent=4), + ), + }, + ] + print(messages[1]["content"]) + return read_LLM_Completion(messages)["AbilityRequirement"] + + +def generate_AgentSelection(General_Goal, Current_Task, Agent_Board): + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_AGENT_SELECTION_GENERATION.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_AGENT_SELECTION_GENERATION.format( + General_Goal=General_Goal, + Current_Task=json.dumps(Current_Task, indent=4), + Agent_Board=json.dumps(Agent_Board, indent=4), + ), + }, + ] + print(messages[1]["content"]) + + agentboard_set = {agent["Name"] for agent in Agent_Board} + + while True: + candidate = read_LLM_Completion(messages)["AgentSelectionPlan"] + if len(candidate) > MAX_TEAM_SIZE: + teamSize = random.randint(2, MAX_TEAM_SIZE) + candidate = candidate[0:teamSize] + elif len(candidate) < MIN_TEAM_SIZE: + continue + AgentSelectionPlan = sorted(candidate) + AgentSelectionPlan_set = set(AgentSelectionPlan) + + # Check if every item in AgentSelectionPlan is in agentboard + if AgentSelectionPlan_set.issubset(agentboard_set): + break # If all items are in agentboard, break the loop + + # AgentSelectionPlan= sorted(read_LLM_Completion(messages)["AgentSelectionPlan"]) # sort the select agent list for unique sequence + return AgentSelectionPlan diff --git a/backend/AgentCoord/PlanEngine/__init__ .py b/backend/AgentCoord/PlanEngine/__init__ .py new file mode 100644 index 0000000..a2517c4 --- /dev/null +++ b/backend/AgentCoord/PlanEngine/__init__ .py @@ -0,0 +1,2 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/backend/AgentCoord/PlanEngine/basePlan_Generator.py b/backend/AgentCoord/PlanEngine/basePlan_Generator.py new file mode 100644 index 0000000..347ace2 --- /dev/null +++ b/backend/AgentCoord/PlanEngine/basePlan_Generator.py @@ -0,0 +1,55 @@ +from AgentCoord.PlanEngine.planOutline_Generator import generate_PlanOutline +from AgentCoord.PlanEngine.AgentSelection_Generator import ( + generate_AgentSelection, +) +from AgentCoord.PlanEngine.taskProcess_Generator import generate_TaskProcess +import AgentCoord.util as util + + +def generate_basePlan( + General_Goal, Agent_Board, AgentProfile_Dict, InitialObject_List +): + basePlan = { + "Initial Input Object": InitialObject_List, + "Collaboration Process": [], + } + PlanOutline = generate_PlanOutline( + InitialObject_List=[], General_Goal=General_Goal + ) + for stepItem in PlanOutline: + Current_Task = { + "TaskName": stepItem["StepName"], + "InputObject_List": stepItem["InputObject_List"], + "OutputObject": stepItem["OutputObject"], + "TaskContent": stepItem["TaskContent"], + } + AgentSelection = generate_AgentSelection( + General_Goal=General_Goal, + Current_Task=Current_Task, + Agent_Board=Agent_Board, + ) + Current_Task_Description = { + "TaskName": stepItem["StepName"], + "AgentInvolved": [ + {"Name": name, "Profile": AgentProfile_Dict[name]} + for name in AgentSelection + ], + "InputObject_List": stepItem["InputObject_List"], + "OutputObject": stepItem["OutputObject"], + "CurrentTaskDescription": util.generate_template_sentence_for_CollaborationBrief( + stepItem["InputObject_List"], + stepItem["OutputObject"], + AgentSelection, + stepItem["TaskContent"], + ), + } + TaskProcess = generate_TaskProcess( + General_Goal=General_Goal, + Current_Task_Description=Current_Task_Description, + ) + # add the generated AgentSelection and TaskProcess to the stepItem + stepItem["AgentSelection"] = AgentSelection + stepItem["TaskProcess"] = TaskProcess + basePlan["Collaboration Process"].append(stepItem) + basePlan["General Goal"] = General_Goal + return basePlan diff --git a/backend/AgentCoord/PlanEngine/branch_PlanOutline.py b/backend/AgentCoord/PlanEngine/branch_PlanOutline.py new file mode 100644 index 0000000..64cbd86 --- /dev/null +++ b/backend/AgentCoord/PlanEngine/branch_PlanOutline.py @@ -0,0 +1,102 @@ +from AgentCoord.util.converter import read_LLM_Completion +import json +from typing import List +from pydantic import BaseModel, Field + + +PROMPT_PLAN_OUTLINE_BRANCHING = """ +## Instruction +Based on "Existing Steps", your task is to comeplete the "Remaining Steps" for the plan for "General Goal". +Note: "Modification Requirement" specifies how to modify the "Baseline Completion" for a better/alternative solution. + +## General Goal (Specify the general goal for the plan) +{General_Goal} + +## Initial Key Object List (Specify the list of initial key objects available for use as the input object of a Step) +{InitialObject_List} + +## Existing Steps +{Existing_Steps} + +## Baseline Completion +{Baseline_Completion} + +## Modification Requirement +{Modification_Requirement} + +## Output Format Example (Specify the output format) +```json +{{ + "Remaining Steps": [ + {{ + "StepName": "xx", + "TaskContent": "xxx...", + "InputObject_List": [xx], + "OutputObject": "xx" + }}, + {{ + "StepName": "xx", + "TaskContent": "xxx...", + "InputObject_List": [xx], + "OutputObject": "xx" + }}, + {{ + "StepName": "xx", + "TaskContent": "xxx...", + "InputObject_List": [xx], + "OutputObject": "xx" + }} + ] +}} +``` + +## Format Explaination (Explain the Output Format): +TaskContent: Describe the task of the current step. +InputObject_List: The list of the input obejects that will be used in current step. +OutputObject: The name of the final output object of current step. +StepName: Provide a CONCISE and UNIQUE name for this step, smartly summarize what this step is doing. + +""" + + +class JSON_Step(BaseModel): + StepName: str + TaskContent: str + InputObject_List: List[str] + OutputObject: str + + +class JSON_PLAN_OUTLINE_BRANCHING(BaseModel): + Remaining_Steps: List[JSON_Step] = Field(..., alias="Remaining Steps") + + +def branch_PlanOutline( + branch_Number, + Modification_Requirement, + Existing_Steps, + Baseline_Completion, + InitialObject_List, + General_Goal, +): + prompt = PROMPT_PLAN_OUTLINE_BRANCHING.format( + Modification_Requirement=Modification_Requirement, + Existing_Steps=json.dumps(Existing_Steps, indent=4), + Baseline_Completion=json.dumps(Baseline_Completion, indent=4), + InitialObject_List=str(InitialObject_List), + General_Goal=General_Goal, + ) + print(prompt) + branch_List = [] + for _ in range(branch_Number): + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_PLAN_OUTLINE_BRANCHING.model_json_schema(), indent=2)}", + }, + {"role": "system", "content": prompt}, + ] + Remaining_Steps = read_LLM_Completion(messages, useGroq=False)[ + "Remaining Steps" + ] + branch_List.append(Remaining_Steps) + return branch_List diff --git a/backend/AgentCoord/PlanEngine/branch_TaskProcess.py b/backend/AgentCoord/PlanEngine/branch_TaskProcess.py new file mode 100644 index 0000000..6e1efb1 --- /dev/null +++ b/backend/AgentCoord/PlanEngine/branch_TaskProcess.py @@ -0,0 +1,153 @@ +from AgentCoord.util.converter import read_LLM_Completion +import AgentCoord.util as util +from typing import List +from pydantic import BaseModel, Field +import json + + +ACT_SET = """ +- Propose (Propose something that contribute to the current task): + - Description Format Example: + Propose some suggestion for the development of the story from emotional aspects. + +- Critique (Provide feedback to the action result of other agents): + - Description Format Example: + Critique the logic soundness of the story outline written by Alice. + +- Improve (Improve the result of a previous action): + - Description Format Example: + Improve the story outline written by Bob based on the feedback by Jordan" + +- Finalize (Deliver the final result based on previous actions): + - Description Format Example: + Summarize the discussion and submit the final version of the Story Outline. + +""" + +PROMPT_TASK_PROCESS_BRANCHING = """ +## Instruction +Based on "Existing Steps", your task is to comeplete the "Remaining Steps" for the "Task for Current Step". +Note: "Modification Requirement" specifies how to modify the "Baseline Completion" for a better/alternative solution. + +## General Goal (The general goal for the collaboration plan, you just design the plan for one of its step (i.e. "Task for Current Step")) +{General_Goal} + +## Task for Current Step +{Current_Task_Description} + +## Action Set (The list of Action Type Available) +{Act_Set} + +## Existing Steps +{Existing_Steps} + +## Baseline Completion +{Baseline_Completion} + +## Modification Requirement +{Modification_Requirement} + +## Output Format Example (Specify the output format) +```json +{{ + "Remaining Steps": [ + {{ + "ID": "Action4", + "ActionType": "Propose", + "AgentName": "Mia", + "Description": "Propose psychological theories on love and attachment that could be applied to AI's emotional development.", + "ImportantInput": [ + "InputObject:Story Outline" + ] + }}, + {{ + "ID": "Action5", + "ActionType": "Propose", + "AgentName": "Noah", + "Description": "Propose ethical considerations and philosophical questions regarding AI's capacity for love.", + "ImportantInput": [] + }}, + {{ + "ID": "Action6", + "ActionType": "Finalize", + "AgentName": "Liam", + "Description": "Combine the poetic elements and ethical considerations into a cohesive set of core love elements for the story.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action5" + ] + }} + ] +}} + +## Format Explaination (Explain the Output Format): +ImportantInput: Specify if there is any previous result that should be taken special consideration during the execution the action. Should be of format "InputObject:xx" or "ActionResult:xx". +InputObject_List: List existing objects that should be utilized in current step. +AgentName: Specify the agent who will perform the action, You CAN ONLY USE THE NAME APPEARS IN "AgentInvolved". +ActionType: Specify the type of action, note that only the last action can be of type "Finalize", and the last action must be "Finalize". + +""" + + +class JSON_Step(BaseModel): + ID: str + ActionType: str + AgentName: str + Description: str + ImportantInput: List[str] + + +class JSON_TASK_PROCESS_BRANCHING(BaseModel): + Remaining_Steps: List[JSON_Step] = Field(..., alias="Remaining Steps") + + +def branch_TaskProcess( + branch_Number, + Modification_Requirement, + Existing_Steps, + Baseline_Completion, + stepTaskExisting, + General_Goal, + AgentProfile_Dict, +): + Current_Task_Description = { + "TaskName": stepTaskExisting["StepName"], + "AgentInvolved": [ + {"Name": name, "Profile": AgentProfile_Dict[name]} + for name in stepTaskExisting["AgentSelection"] + ], + "InputObject_List": stepTaskExisting["InputObject_List"], + "OutputObject": stepTaskExisting["OutputObject"], + "CurrentTaskDescription": util.generate_template_sentence_for_CollaborationBrief( + stepTaskExisting["InputObject_List"], + stepTaskExisting["OutputObject"], + stepTaskExisting["AgentSelection"], + stepTaskExisting["TaskContent"], + ), + } + prompt = PROMPT_TASK_PROCESS_BRANCHING.format( + Modification_Requirement=Modification_Requirement, + Current_Task_Description=json.dumps( + Current_Task_Description, indent=4 + ), + Existing_Steps=json.dumps(Existing_Steps, indent=4), + Baseline_Completion=json.dumps(Baseline_Completion, indent=4), + General_Goal=General_Goal, + Act_Set=ACT_SET, + ) + print(prompt) + branch_List = [] + for i in range(branch_Number): + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(JSON_TASK_PROCESS_BRANCHING.model_json_schema(), indent=2)}", + }, + {"role": "system", "content": prompt}, + ] + Remaining_Steps = read_LLM_Completion(messages, useGroq=False)[ + "Remaining Steps" + ] + + branch_List.append(Remaining_Steps) + return branch_List diff --git a/backend/AgentCoord/PlanEngine/fill_stepTask.py b/backend/AgentCoord/PlanEngine/fill_stepTask.py new file mode 100644 index 0000000..0bcad2e --- /dev/null +++ b/backend/AgentCoord/PlanEngine/fill_stepTask.py @@ -0,0 +1,42 @@ +from AgentCoord.PlanEngine.AgentSelection_Generator import ( + generate_AgentSelection, +) +from AgentCoord.PlanEngine.taskProcess_Generator import generate_TaskProcess +import AgentCoord.util as util + + +def fill_stepTask(General_Goal, stepTask, Agent_Board, AgentProfile_Dict): + Current_Task = { + "TaskName": stepTask["StepName"], + "InputObject_List": stepTask["InputObject_List"], + "OutputObject": stepTask["OutputObject"], + "TaskContent": stepTask["TaskContent"], + } + AgentSelection = generate_AgentSelection( + General_Goal=General_Goal, + Current_Task=Current_Task, + Agent_Board=Agent_Board, + ) + Current_Task_Description = { + "TaskName": stepTask["StepName"], + "AgentInvolved": [ + {"Name": name, "Profile": AgentProfile_Dict[name]} + for name in AgentSelection + ], + "InputObject_List": stepTask["InputObject_List"], + "OutputObject": stepTask["OutputObject"], + "CurrentTaskDescription": util.generate_template_sentence_for_CollaborationBrief( + stepTask["InputObject_List"], + stepTask["OutputObject"], + AgentSelection, + stepTask["TaskContent"], + ), + } + TaskProcess = generate_TaskProcess( + General_Goal=General_Goal, + Current_Task_Description=Current_Task_Description, + ) + # add the generated AgentSelection and TaskProcess to the stepItem + stepTask["AgentSelection"] = AgentSelection + stepTask["TaskProcess"] = TaskProcess + return stepTask diff --git a/backend/AgentCoord/PlanEngine/fill_stepTask_TaskProcess.py b/backend/AgentCoord/PlanEngine/fill_stepTask_TaskProcess.py new file mode 100644 index 0000000..fabafa7 --- /dev/null +++ b/backend/AgentCoord/PlanEngine/fill_stepTask_TaskProcess.py @@ -0,0 +1,29 @@ +from AgentCoord.PlanEngine.taskProcess_Generator import generate_TaskProcess +import AgentCoord.util as util + + +def fill_stepTask_TaskProcess(General_Goal, stepTask, AgentProfile_Dict): + AgentSelection = stepTask["AgentSelection"] + Current_Task_Description = { + "TaskName": stepTask["StepName"], + "AgentInvolved": [ + {"Name": name, "Profile": AgentProfile_Dict[name]} + for name in AgentSelection + ], + "InputObject_List": stepTask["InputObject_List"], + "OutputObject": stepTask["OutputObject"], + "CurrentTaskDescription": util.generate_template_sentence_for_CollaborationBrief( + stepTask["InputObject_List"], + stepTask["OutputObject"], + AgentSelection, + stepTask["TaskContent"], + ), + } + TaskProcess = generate_TaskProcess( + General_Goal=General_Goal, + Current_Task_Description=Current_Task_Description, + ) + # add the generated AgentSelection and TaskProcess to the stepItem + stepTask["AgentSelection"] = AgentSelection + stepTask["TaskProcess"] = TaskProcess + return stepTask diff --git a/backend/AgentCoord/PlanEngine/planOutline_Generator.py b/backend/AgentCoord/PlanEngine/planOutline_Generator.py new file mode 100644 index 0000000..c61ae7a --- /dev/null +++ b/backend/AgentCoord/PlanEngine/planOutline_Generator.py @@ -0,0 +1,86 @@ +from AgentCoord.util.converter import read_LLM_Completion +from typing import List +from pydantic import BaseModel +import json + +PROMPT_PLAN_OUTLINE_GENERATION = """ +## Instruction +Based on "Output Format Example", "General Goal", and "Initial Key Object List", output a formatted "Plan_Outline". + +## Initial Key Object List (Specify the list of initial key objects available, each initial key object should be the input object of at least one Step) +{InitialObject_List} + +## General Goal (Specify the general goal for the collaboration plan) +{General_Goal} + +## Output Format Example (Specify the output format) +```json +{{ + "Plan_Outline": [ + {{ + "StepName": "Love Element Brainstorming", + "TaskContent": "Decide the main love element in the love story.", + "InputObject_List": [], + "OutputObject": "Love Element" + }}, + {{ + "StepName": "Story World Buiding", + "TaskContent": "Build the world setting for the story.", + "InputObject_List": [], + "OutputObject": "World Setting" + }}, + {{ + "StepName": "Story Outline Drafting", + "TaskContent": "Draft the story outline for the story.", + "InputObject_List": ["Love Element", "World Setting"], + "OutputObject": "Story Outline" + }}, + {{ + "StepName": "Final Story Writing", + "TaskContent": "Writing the final story.", + "InputObject_List": [], + "OutputObject": "Completed Story" + }} + ] +}} +``` + +## Format Explaination (Explain the Output Format): +StepName: Provide a CONCISE and UNIQUE name for this step, smartly summarize what this step is doing. +TaskContent: Describe the task of the current step. +InputObject_List: The list of the input obejects that will be used in current step. +OutputObject: The name of the final output object of current step. + +""" + + +class Step(BaseModel): + StepName: str + TaskContent: str + InputObject_List: List[str] + OutputObject: str + + +class PlanOutline(BaseModel): + Plan_Outline: List[Step] + + class Config: + extra = "allow" + + +def generate_PlanOutline(InitialObject_List, General_Goal): + messages = [ + { + "role": "system", + "content": "You are a recipe database that outputs recipes in JSON.\n" + f" The JSON object must use the schema: {json.dumps(PlanOutline.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_PLAN_OUTLINE_GENERATION.format( + InitialObject_List=str(InitialObject_List), + General_Goal=General_Goal, + ), + }, + ] + return read_LLM_Completion(messages)["Plan_Outline"] diff --git a/backend/AgentCoord/PlanEngine/taskProcess_Generator.py b/backend/AgentCoord/PlanEngine/taskProcess_Generator.py new file mode 100644 index 0000000..a81b5ff --- /dev/null +++ b/backend/AgentCoord/PlanEngine/taskProcess_Generator.py @@ -0,0 +1,139 @@ +import json +from typing import List +from pydantic import BaseModel +from AgentCoord.util.converter import read_LLM_Completion + +ACT_SET = """ +- Propose (Propose something that contribute to the current task): + - Description Format Example: + Propose some suggestion for the development of the story from emotional aspects. + +- Critique (Provide feedback to the action result of other agents): + - Description Format Example: + Critique the logic soundness of the story outline written by Alice. + +- Improve (Improve the result of a previous action): + - Description Format Example: + Improve the story outline written by Bob based on the feedback by Jordan" + +- Finalize (Deliver the final result based on previous actions): + - Description Format Example: + Summarize the discussion and submit the final version of the Story Outline. + +""" +PROMPT_TASK_PROCESS_GENERATION = """ +## Instruction +Based on "General Goal", "Task for Current Step", "Action Set" and "Output Format Example", design a plan for "Task for Current Step", output a formatted "Task_Process_Plan". + +## General Goal (The general goal for the collaboration plan, you just design the plan for one of its step (i.e. "Task for Current Step")) +{General_Goal} + +## Task for Current Step +{Current_Task_Description} + +## Action Set (The list of Action Type Available) +{Act_Set} + +## Output Format Example (Specify the output format) +```json +{{ + "Task_Process_Plan": [ + {{ + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Bob", + "Description": "Propose an idea about how the AI can get awaken.", + "ImportantInput": [] + }}, + {{ + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Alice", + "Description": "Propose some suggestion for the development of the story from emotional aspects.", + "ImportantInput": ["InputObject:Love Element Notes"] + }}, + {{ + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Bob", + "Description": "Propose a draft story outline, incorporating the idea proposed by Bob and the suggestion proposed by Alice.", + "ImportantInput": ["ActionResult:Action1", "ActionResult:Action2"] + }}, + {{ + "ID": "Action4", + "ActType": "Critique", + "AgentName": "Jordan", + "Description": "Critique the technical soundness of the draft story outline proposed by Bob." + "ImportantInput": ["ActionResult:Action3"] + }}, + {{ + "ID": "Action5", + "ActType": "Improve", + "AgentName": "Bob", + "Description": "Improve the technical soundness of the draft story outline based on Jordan's feedback.", + "ImportantInput": ["ActionResult:Action3", "ActionResult:Action4"] + }}, + {{ + "ID": "Action6", + "ActType": "Finalize", + "AgentName": "Jordan", + "Description": "Polish the improved draft story outline by Bob and submit it as the final version of the Story Outline", + "ImportantInput": ["ActionResult:Action5"] + }} + ] +}} +``` + +## Format Explaination (Explain the Output Format): +ImportantInput: Specify if there is any previous result that should be taken special consideration during the execution the action. Should be of format "InputObject:xx" or "ActionResult:xx". +InputObject_List: List existing objects that should be utilized in current step. +AgentName: Specify the agent who will perform the action, You CAN ONLY USE THE NAME APPEARS IN "AgentInvolved". +ActionType: Specify the type of action, note that only the last action can be of type "Finalize", and the last action must be "Finalize". + +""" + + +class Action(BaseModel): + ID: str + ActionType: str + AgentName: str + Description: str + ImportantInput: List[str] + + +class TaskProcessPlan(BaseModel): + Task_Process_Plan: List[Action] + + +def generate_TaskProcess(General_Goal, Current_Task_Description): + messages = [ + { + "role": "system", + "content": f" The JSON object must use the schema: {json.dumps(TaskProcessPlan.model_json_schema(), indent=2)}", + }, + { + "role": "system", + "content": PROMPT_TASK_PROCESS_GENERATION.format( + General_Goal=General_Goal, + Current_Task_Description=json.dumps( + Current_Task_Description, indent=4 + ), + Act_Set=ACT_SET, + ), + }, + ] + print(messages[1]["content"]) + + # write a callback function, if read_LLM_Completion(messages)["Task_Process_Plan"] dont have the right format, call this function again + while True: + response_json = read_LLM_Completion(messages)["Task_Process_Plan"] + response_agents = {action["AgentName"] for action in response_json} + involved_agents = { + agent["Name"] + for agent in Current_Task_Description["AgentInvolved"] + } + if response_agents.issubset(involved_agents): + break + + # AgentSelectionPlan= sorted(read_LLM_Completion(messages)["AgentSelectionPlan"]) # sort the select agent list for unique sequence + return response_json diff --git a/backend/AgentCoord/RehearsalEngine_V2/Action/__init__.py b/backend/AgentCoord/RehearsalEngine_V2/Action/__init__.py new file mode 100644 index 0000000..9f343eb --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/Action/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from .baseAction import BaseAction +from .customAction_Finalize import customAction_Finalize +from .customAction_Improve import customAction_Improve +from .customAction_Critique import customAction_Critique +from .customAction_Propose import customAction_Propose + +customAction_Dict = {"Finalize":customAction_Finalize, "Improve":customAction_Improve, "Critique":customAction_Critique, "Propose":customAction_Propose} \ No newline at end of file diff --git a/backend/AgentCoord/RehearsalEngine_V2/Action/baseAction.py b/backend/AgentCoord/RehearsalEngine_V2/Action/baseAction.py new file mode 100644 index 0000000..8978bf6 --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/Action/baseAction.py @@ -0,0 +1,95 @@ +from AgentCoord.LLMAPI.LLMAPI import LLM_Completion +from AgentCoord.util.colorLog import print_colored +import copy +PROMPT_TEMPLATE_TAKE_ACTION_BASE = ''' +Your name is {agentName}. You will play the role as the Profile indicates. +Profile: {agentProfile} + +You are within a multi-agent collaboration for the "Current Task". +Now it's your turn to take action. Read the "Context Information" and take your action following "Instruction for Your Current Action". +Note: Important Input for your action are marked with *Important Input* + +## Context Information + +### General Goal (The "Current Task" is indeed a substep of the general goal) +{General_Goal} + +### Current Task +{Current_Task_Description} + +### Input Objects (Input objects for the current task) +{Input_Objects} + +### History Action +{History_Action} + +## Instruction for Your Current Action +{Action_Description} + +{Action_Custom_Note} + +''' + +PROMPT_TEMPLATE_INPUTOBJECT_RECORD = ''' +{{ +{Important_Mark} +{Input_Objects_Name}: +{Input_Objects_Content} +}} + +''' + +PROMPT_TEMPLATE_ACTION_RECORD = ''' +{{ +{Important_Mark} +{AgentName} ({Action_Description}): +{Action_Result} +}} + +''' + +class BaseAction(): + def __init__(self, info, OutputName, KeyObjects) -> None: + self.KeyObjects = KeyObjects + self.OutputName = OutputName + self.Action_Result = None + self.info = info + self.Action_Custom_Note = "" + + def postRun_Callback(self) -> None: + return + + def run(self, General_Goal, TaskDescription, agentName, AgentProfile_Dict, InputName_List, OutputName, KeyObjects, ActionHistory): + # construct input record + inputObject_Record = "" + for InputName in InputName_List: + ImportantInput_Identifier = "InputObject:" + InputName + if ImportantInput_Identifier in self.info["ImportantInput"]: + Important_Mark = "*Important Input*" + else: + Important_Mark = "" + inputObject_Record += PROMPT_TEMPLATE_INPUTOBJECT_RECORD.format(Input_Objects_Name = InputName, Input_Objects_Content = KeyObjects[InputName], Important_Mark = Important_Mark) + + # construct history action record + action_Record = "" + for actionInfo in ActionHistory: + ImportantInput_Identifier = "ActionResult:" + actionInfo["ID"] + if ImportantInput_Identifier in self.info["ImportantInput"]: + Important_Mark = "*Important Input*" + else: + Important_Mark = "" + action_Record += PROMPT_TEMPLATE_ACTION_RECORD.format(AgentName = actionInfo["AgentName"], Action_Description = actionInfo["AgentName"], Action_Result = actionInfo["Action_Result"], Important_Mark = Important_Mark) + + prompt = PROMPT_TEMPLATE_TAKE_ACTION_BASE.format(agentName = agentName, agentProfile = AgentProfile_Dict[agentName], General_Goal = General_Goal, Current_Task_Description = TaskDescription, Input_Objects = inputObject_Record, History_Action = action_Record, Action_Description = self.info["Description"], Action_Custom_Note = self.Action_Custom_Note) + print_colored(text = prompt, text_color="red") + messages = [{"role":"system", "content": prompt}] + ActionResult = LLM_Completion(messages,True,False) + ActionInfo_with_Result = copy.deepcopy(self.info) + ActionInfo_with_Result["Action_Result"] = ActionResult + + # run customizable callback + self.Action_Result = ActionResult + self.postRun_Callback() + return ActionInfo_with_Result + + \ No newline at end of file diff --git a/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Critique.py b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Critique.py new file mode 100644 index 0000000..ccc8610 --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Critique.py @@ -0,0 +1,16 @@ +from AgentCoord.RehearsalEngine_V2.Action import BaseAction + +ACTION_CUSTOM_NOTE = ''' +Note: Since you are in a conversation, your critique must be concise, clear and easy to read, don't overwhelm others. If you want to list some points, list at most 2 points. + +''' + +class customAction_Critique(BaseAction): + def __init__(self, info, OutputName, KeyObjects) -> None: + self.KeyObjects = KeyObjects + self.OutputName = OutputName + self.Action_Result = None + self.info = info + self.Action_Custom_Note = ACTION_CUSTOM_NOTE.format(OutputName = OutputName) + + \ No newline at end of file diff --git a/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Finalize.py b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Finalize.py new file mode 100644 index 0000000..1d5cc85 --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Finalize.py @@ -0,0 +1,24 @@ +from AgentCoord.util.converter import read_outputObject_content +from AgentCoord.RehearsalEngine_V2.Action import BaseAction + +ACTION_CUSTOM_NOTE = ''' +Note: You can say something before you give the final content of {OutputName}. When you decide to give the final content of {OutputName}, it should be enclosed like this: +```{OutputName} +(the content of {OutputName}) +``` +''' + +class customAction_Finalize(BaseAction): + def __init__(self, info, OutputName, KeyObjects) -> None: + self.KeyObjects = KeyObjects + self.OutputName = OutputName + self.Action_Result = None + self.info = info + self.Action_Custom_Note = ACTION_CUSTOM_NOTE.format(OutputName = OutputName) + + def postRun_Callback(self) -> None: + # extract output object + extracted_outputObject = read_outputObject_content(self.Action_Result, self.OutputName) + # add the extracted output object to KeyObjects + self.KeyObjects[self.OutputName] = extracted_outputObject + \ No newline at end of file diff --git a/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Improve.py b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Improve.py new file mode 100644 index 0000000..4174a7a --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Improve.py @@ -0,0 +1,22 @@ +from AgentCoord.RehearsalEngine_V2.Action import BaseAction + +ACTION_CUSTOM_NOTE = ''' +Note: You can say something before you provide the improved version of the content. +The improved version you provide must be a completed version (e.g. if you provide a improved story, you should give completed story content, rather than just reporting where you have improved). +When you decide to give the improved version of the content, it should be start like this: + +## Improved version of xxx +(the improved version of the content) +``` + +''' + +class customAction_Improve(BaseAction): + def __init__(self, info, OutputName, KeyObjects) -> None: + self.KeyObjects = KeyObjects + self.OutputName = OutputName + self.Action_Result = None + self.info = info + self.Action_Custom_Note = ACTION_CUSTOM_NOTE.format(OutputName = OutputName) + + \ No newline at end of file diff --git a/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Propose.py b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Propose.py new file mode 100644 index 0000000..028dae5 --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/Action/customAction_Propose.py @@ -0,0 +1,15 @@ +from AgentCoord.RehearsalEngine_V2.Action import BaseAction + +ACTION_CUSTOM_NOTE = ''' + +''' + +class customAction_Propose(BaseAction): + def __init__(self, info, OutputName, KeyObjects) -> None: + self.KeyObjects = KeyObjects + self.OutputName = OutputName + self.Action_Result = None + self.info = info + self.Action_Custom_Note = ACTION_CUSTOM_NOTE.format(OutputName = OutputName) + + \ No newline at end of file diff --git a/backend/AgentCoord/RehearsalEngine_V2/ExecutePlan.py b/backend/AgentCoord/RehearsalEngine_V2/ExecutePlan.py new file mode 100644 index 0000000..c944494 --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/ExecutePlan.py @@ -0,0 +1,128 @@ +import AgentCoord.util as util +import AgentCoord.RehearsalEngine_V2.Action as Action +from termcolor import colored + + +# Accept inputs: num_StepToRun (the number of step to run, if None, run to the end), plan, RehearsalLog, AgentProfile_Dict +def executePlan(plan, num_StepToRun, RehearsalLog, AgentProfile_Dict): + # Prepare for execution + KeyObjects = {} + finishedStep_index = -1 + for logNode in RehearsalLog: + # Increment for finishedStep_index: finishedStep_index is the index of the lastest finished step seen in RehearsalLog, if no step finished yet, index will be -1 + if logNode["LogNodeType"] == "step": + finishedStep_index += 1 + # Set existing key object + if logNode["LogNodeType"] == "object": + KeyObjects[logNode["NodeId"]] = logNode["content"] + + # Execute + # specify which steps will be run + if num_StepToRun is None: + run_to = len(plan["Collaboration Process"]) + else: + run_to = (finishedStep_index + 1) + num_StepToRun + + StepRun_count = 0 # count how many steps are run during execution + # loop for each step to run + for stepDescrip in plan["Collaboration Process"][ + (finishedStep_index + 1): run_to + ]: + StepRun_count += 1 + # collect infos for executing the current step + StepName = ( + util.camel_case_to_normal(stepDescrip["StepName"]) + if util.is_camel_case(stepDescrip["StepName"]) + else stepDescrip["StepName"] + ) + TaskContent = stepDescrip["TaskContent"] + InputName_List = ( + [ + ( + util.camel_case_to_normal(obj) + if util.is_camel_case(obj) + else obj + ) + for obj in stepDescrip["InputObject_List"] + ] + if stepDescrip["InputObject_List"] is not None + else None + ) + OutputName = ( + util.camel_case_to_normal(stepDescrip["OutputObject"]) + if util.is_camel_case(stepDescrip["OutputObject"]) + else stepDescrip["OutputObject"] + ) + Agent_List = stepDescrip["AgentSelection"] + TaskProcess = stepDescrip["TaskProcess"] + TaskDescription = ( + util.converter.generate_template_sentence_for_CollaborationBrief( + input_object_list=InputName_List, + output_object=OutputName, + agent_list=Agent_List, + step_task=TaskContent, + ) + ) + + # init log for RehearsalLog + inputObject_Record = [ + {InputName: KeyObjects[InputName]} for InputName in InputName_List + ] + stepLogNode = { + "LogNodeType": "step", + "NodeId": StepName, + "InputName_List": InputName_List, + "OutputName": OutputName, + "chatLog": [], + "inputObject_Record": inputObject_Record, + } + objectLogNode = { + "LogNodeType": "object", + "NodeId": OutputName, + "content": None, + } + + # start the group chat + util.print_colored(TaskDescription, text_color="green") + ActionHistory = [] + for ActionInfo in TaskProcess: + actionType = ActionInfo["ActionType"] + agentName = ActionInfo["AgentName"] + if actionType in Action.customAction_Dict: + currentAction = Action.customAction_Dict[actionType]( + info=ActionInfo, + OutputName=OutputName, + KeyObjects=KeyObjects, + ) + else: + currentAction = Action.BaseAction( + info=ActionInfo, + OutputName=OutputName, + KeyObjects=KeyObjects, + ) + ActionInfo_with_Result = currentAction.run( + General_Goal=plan["General Goal"], + TaskDescription=TaskDescription, + agentName=agentName, + AgentProfile_Dict=AgentProfile_Dict, + InputName_List=InputName_List, + OutputName=OutputName, + KeyObjects=KeyObjects, + ActionHistory=ActionHistory, + ) + ActionHistory.append(ActionInfo_with_Result) + # post processing for the group chat (finish) + objectLogNode["content"] = KeyObjects[OutputName] + RehearsalLog.append(stepLogNode) + RehearsalLog.append(objectLogNode) + stepLogNode["ActionHistory"] = ActionHistory + + # Return Output + print( + colored( + "$Run " + str(StepRun_count) + "step$", + color="black", + on_color="on_white", + ) + ) + return RehearsalLog diff --git a/backend/AgentCoord/RehearsalEngine_V2/__init__.py b/backend/AgentCoord/RehearsalEngine_V2/__init__.py new file mode 100644 index 0000000..faa18be --- /dev/null +++ b/backend/AgentCoord/RehearsalEngine_V2/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- diff --git a/backend/AgentCoord/__init__ .py b/backend/AgentCoord/__init__ .py new file mode 100644 index 0000000..a2517c4 --- /dev/null +++ b/backend/AgentCoord/__init__ .py @@ -0,0 +1,2 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/backend/AgentCoord/util/__init__.py b/backend/AgentCoord/util/__init__.py new file mode 100644 index 0000000..ab64239 --- /dev/null +++ b/backend/AgentCoord/util/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from .colorLog import print_colored +from .converter import ( + generate_template_sentence_for_CollaborationBrief, + remove_render_spec, + camel_case_to_normal, + is_camel_case, +) diff --git a/backend/AgentCoord/util/addRenderSpec.py b/backend/AgentCoord/util/addRenderSpec.py new file mode 100644 index 0000000..60b30d2 --- /dev/null +++ b/backend/AgentCoord/util/addRenderSpec.py @@ -0,0 +1,2 @@ +def basePlan_addRenderSpec(basePlan): + return basePlan diff --git a/backend/AgentCoord/util/colorLog.py b/backend/AgentCoord/util/colorLog.py new file mode 100644 index 0000000..ca2cfd0 --- /dev/null +++ b/backend/AgentCoord/util/colorLog.py @@ -0,0 +1,6 @@ +from termcolor import colored + + +# colored print +def print_colored(text, text_color="green", background="on_white"): + print(colored(text, text_color, background)) diff --git a/backend/AgentCoord/util/converter.py b/backend/AgentCoord/util/converter.py new file mode 100644 index 0000000..8af1aa8 --- /dev/null +++ b/backend/AgentCoord/util/converter.py @@ -0,0 +1,130 @@ +import re +import json +from AgentCoord.LLMAPI.LLMAPI import LLM_Completion + + +def create_agent_dict(agent_list): + return {agent["Name"]: agent["Profile"] for agent in agent_list} + + +def is_camel_case(s): + # If there are no spaces, it might be camel case + return " " not in s + + +def camel_case_to_normal(s): + # Split the camel case string into words + return "".join(" " + c if c.isupper() else c for c in s).lstrip() + + +def generate_template_sentence_for_CollaborationBrief( + input_object_list, output_object, agent_list, step_task +): + # Check if the names are in camel case (no spaces) and convert them to normal naming convention + input_object_list = ( + [ + camel_case_to_normal(obj) if is_camel_case(obj) else obj + for obj in input_object_list + ] + if input_object_list is not None + else None + ) + output_object = ( + camel_case_to_normal(output_object) + if is_camel_case(output_object) + else output_object + ) + + # Format the agents into a string with proper grammar + agent_str = ( + " and ".join([", ".join(agent_list[:-1]), agent_list[-1]]) + if len(agent_list) > 1 + else agent_list[0] + ) + + if input_object_list is None or len(input_object_list) == 0: + # Combine all the parts into the template sentence + template_sentence = f"{agent_str} perform the task of {step_task} to obtain {output_object}." + else: + # Format the input objects into a string with proper grammar + input_str = ( + " and ".join( + [", ".join(input_object_list[:-1]), input_object_list[-1]] + ) + if len(input_object_list) > 1 + else input_object_list[0] + ) + # Combine all the parts into the template sentence + template_sentence = f"Based on {input_str}, {agent_str} perform the task of {step_task} to obtain {output_object}." + + return template_sentence + + +def remove_render_spec(duty_spec): + if isinstance(duty_spec, dict): + return { + k: remove_render_spec(v) + for k, v in duty_spec.items() + if k != "renderSpec" + } + elif isinstance(duty_spec, list): + return [remove_render_spec(item) for item in duty_spec] + else: + return duty_spec + + +def read_LLM_Completion(messages, useGroq=True): + for _ in range(3): + text = LLM_Completion(messages, useGroq=useGroq) + + pattern = r"(?:.*?```json)(.*?)(?:```.*?)" + match = re.search(pattern, text, re.DOTALL) + + if match: + return json.loads(match.group(1).strip()) + + pattern = r"\{.*\}" + match = re.search(pattern, text, re.DOTALL) + if match: + try: + return json.loads(match.group(0).strip()) + except Exception: + pass + raise ("bad format!") + + +def read_json_content(text): + """ + Extracts and returns content between ```json and ``` + + :param text: The string containing the content enclosed by ```json and ``` + """ + # pattern = r"```json(.*?)```" + pattern = r"(?:.*?```json)(.*?)(?:```.*?)" + match = re.search(pattern, text, re.DOTALL) + + if match: + return json.loads(match.group(1).strip()) + + pattern = r"\{.*\}" + match = re.search(pattern, text, re.DOTALL) + if match: + return json.loads(match.group(0).strip()) + + raise ("bad format!") + + +def read_outputObject_content(text, keyword): + """ + Extracts and returns content between ```{keyword} and ``` + + :param text: The string containing the content enclosed by ```{keyword} and ``` + """ + + pattern = r"```{}(.*?)```".format(keyword) + match = re.search(pattern, text, re.DOTALL) + + if match: + return match.group(1).strip() + else: + raise ("bad format!") diff --git a/backend/AgentRepo/agentBoard_v1.json b/backend/AgentRepo/agentBoard_v1.json new file mode 100644 index 0000000..b9a8f6a --- /dev/null +++ b/backend/AgentRepo/agentBoard_v1.json @@ -0,0 +1,102 @@ +[ + { + "Icon": "Abigail_Chen.png", + "Name": "Abigail", + "Profile": "AI Engineer" + }, + { + "Icon": "Jane_Moreno.png", + "Name": "Jane", + "Profile": "Cybersecurity Specialist" + }, + { + "Icon": "Giorgio_Rossi.png", + "Name": "Giorgio", + "Profile": "Poet" + }, + { + "Icon": "Jennifer_Moore.png", + "Name": "Jennifer", + "Profile": "Linguist" + }, + { + "Icon": "Maria_Lopez.png", + "Name": "Maria", + "Profile": "Philosopher" + }, + { + "Icon": "Sam_Moore.png", + "Name": "Sam", + "Profile": "Ethicist" + }, + { + "Icon": "Yuriko_Yamamoto.png", + "Name": "Yuriko", + "Profile": "Futurist" + }, + { + "Icon": "Carlos_Gomez.png", + "Name": "Carlos", + "Profile": "Language Expert" + }, + { + "Icon": "John_Lin.png", + "Name": "John", + "Profile": "Software Developer" + }, + { + "Icon": "Tamara_Taylor.png", + "Name": "Tamara", + "Profile": "Music Composer" + }, + { + "Icon": "Arthur_Burton.png", + "Name": "Arthur", + "Profile": "Neuroscientist" + }, + { + "Icon": "Eddy_Lin.png", + "Name": "Eddy", + "Profile": "Cognitive Psychologist" + }, + { + "Icon": "Isabella_Rodriguez.png", + "Name": "Isabella", + "Profile": "Science Fiction Writer" + }, + { + "Icon": "Latoya_Williams.png", + "Name": "Latoya", + "Profile": "Historian of Technology" + }, + { + "Icon": "Carmen_Ortiz.png", + "Name": "Carmen", + "Profile": "Robotics Engineer" + }, + { + "Icon": "Rajiv_Patel.png", + "Name": "Rajiv", + "Profile": "Science Educator" + }, + { + "Icon": "Tom_Moreno.png", + "Name": "Tom", + "Profile": "AI Scientist" + }, + { + "Icon": "Ayesha_Khan.png", + "Name": "Ayesha", + "Profile": "Multimedia Artist" + }, + { + "Icon": "Mei_Lin.png", + "Name": "Mei", + "Profile": "Graphic Designer" + }, + { + "Icon": "Hailey_Johnson.png", + "Name": "Hailey", + "Profile": "Legal Expert on AI Law" + } +] \ No newline at end of file diff --git a/backend/DataProcess/DataProcess.py b/backend/DataProcess/DataProcess.py new file mode 100644 index 0000000..ee86e90 --- /dev/null +++ b/backend/DataProcess/DataProcess.py @@ -0,0 +1,188 @@ +import re +from .FormatList import FormatList, TransToFrontFormat + +is_mock = False + +colorMap = { + "propose": [194, 34, 73], + "execute": [242, 28, 86], + "critique": [68, 24, 70], + "finalize": [14, 27, 73], + "inputobject": [108, 45, 74], + "outputobject": [32, 100, 78], + "agent": [0, 0, 80], +} + + +def OperateCamelStr(_str: str): + if " " in _str: + return _str + return "".join(" " + c if c.isupper() else c for c in _str).lstrip() + + +def ParseRole(_str: str) -> dict: + if _str[0] == "(" and _str[-1] == ")": + _str = _str[1:-1].split(":") + return dict({"Name": _str[0], "Job": _str[1]}) + + +def ParseStepTask(step_task: str): + if len(step_task) == 0: + return "" + + if step_task[0].isupper() and step_task[-1] == ".": + step_task = step_task[0].lower() + step_task[1:-1] + return step_task + + +def Generate_Collaboration_Specification_frontEnd(_str): + assert isinstance(_str, str) + res = dict() + res["template"] = "" + res["data"] = dict() + Persons = [] + + temp = re.findall(r"\(\w*:\w*?\)", _str, flags=re.M) + new_str = re.sub(r" *\(\w*:\w*?\) *", " ", _str, flags=re.M) + words = new_str.split(" ") + for i in range(len(temp)): + temp[i] = ParseRole(temp[i]) + res["data"][str(len(Persons))] = dict( + { + "text": temp[i]["Name"], + "color": colorMap[temp[i]["Job"].lower()], + } + ) + Persons.append(temp[i]["Name"]) + + index = int(0) + for i in range(len(words)): + if words[i] in Persons: + words[i] = TransToFrontFormat(index) + index += 1 + + res["template"] = " ".join(words) + return res + + +def Generate_Agent_DutySpecification_frontEnd(_obj: dict): + _obj = _obj.copy() + for key, val in _obj.items(): + if isinstance(val, list): + for i, v in enumerate(val): + if isinstance(v, dict) and "DutyType" in v.keys(): + _obj[key][i]["renderSpec"] = dict( + {"color": colorMap[_obj[key][i]["DutyType"].lower()]} + ) + return _obj + + +def CheckDict(_dict: dict) -> bool: + items = ["InputObject_List", "OutputObject", "TaskContent"] + for e in items: + if e not in _dict.keys(): + return False + return True + + +def Add_Collaboration_Brief_FrontEnd(_obj): + if isinstance(_obj, list): + for i in range(len(_obj)): + _obj[i] = Add_Collaboration_Brief_FrontEnd(_obj[i]) + elif isinstance(_obj, dict) and ( + CheckDict(_obj) or "Collaboration Process" in _obj.keys() + ): + if "Collaboration Process" in _obj.keys(): + _obj["Collaboration Process"] = Add_Collaboration_Brief_FrontEnd( + _obj["Collaboration Process"] + ) + else: + _obj = _obj.copy() + Agent_List = ( + _obj["AgentSelection"][:] + if "AgentSelection" in _obj.keys() + else None + ) + InputObject_List = ( + [OperateCamelStr(b) for b in _obj["InputObject_List"]] + if "InputObject_List" in _obj.keys() + and _obj["InputObject_List"] is not None + else [] + ) + OutputObject = ( + OperateCamelStr(_obj["OutputObject"]) + if "OutputObject" in _obj.keys() + else "" + ) + + _obj["StepName"] = OperateCamelStr(_obj["StepName"]) + _obj["InputObject_List"] = InputObject_List + _obj["OutputObject"] = OutputObject + + TaskContent = _obj["TaskContent"] + # add Collaboration Brief + _key = ( + "Collaboration_Brief_FrontEnd" + if Agent_List is not None and len(Agent_List) > 0 + else "Collaboration_Brief_LackAgent_FrontEnd" + ) + _obj[_key] = Generate_Collaboration_Brief_FrontEnd( + InputObject_List, OutputObject, Agent_List, TaskContent + ) + return _obj + + +def Generate_Collaboration_Brief_FrontEnd( + InputObject_List, OutputObject, Agent_List, TaskContent +): + res = dict({}) + res["template"] = str("") + res["data"] = dict({}) + len_in = len(InputObject_List) + len_out = 1 + len_ag = len(Agent_List) if Agent_List is not None else 0 + + Template_Sentence_InputObject = ( + f"Based on {FormatList(InputObject_List).Format()}, " + if len_in > 0 + else "" + ) + Template_Sentence_Agent = ( + f"{FormatList(Agent_List, len_in).Format()} " + if Agent_List is not None and len_ag > 0 + else "" + ) + Template_Sentence_TaskContent = f"perform{'s' if len_ag == 1 else ''} the task of {ParseStepTask(TaskContent)} " + Template_Sentence_OutputObject = ( + f"to obtain {FormatList([OutputObject], len_ag + len_in).Format()}." + if len_out > 0 + else "" + ) + Template_Sentence = ( + Template_Sentence_InputObject + + Template_Sentence_Agent + + Template_Sentence_TaskContent + + Template_Sentence_OutputObject + ) + + res["template"] = Template_Sentence + index = int(0) + for i in range(len_in): + res["data"][str(index)] = dict( + { + "text": InputObject_List[i], + "color": colorMap["InputObject".lower()], + } + ) + index += 1 + for i in range(len_ag): + res["data"][str(index)] = dict( + {"text": Agent_List[i], "color": colorMap["Agent".lower()]} + ) + index += 1 + + res["data"][str(index)] = dict( + {"text": OutputObject, "color": colorMap["OutputObject".lower()]} + ) + index += 1 + return res diff --git a/backend/DataProcess/FormatList.py b/backend/DataProcess/FormatList.py new file mode 100644 index 0000000..f9f67bf --- /dev/null +++ b/backend/DataProcess/FormatList.py @@ -0,0 +1,47 @@ +class FormatList: + _list = [] + offset: int = 0 + + def __init__(self, input_list: list, offset: int = 0): + self._list = input_list.copy() + self.offset = offset + + def __str__(self): + s = str("") + if len(self._list) <= 0: + return s + if len(self._list) == 1: + return self._list[0] + if len(self._list) == 2: + return " and ".join(self._list) + if len(self._list) > 2: + return ", ".join(self._list[:-1]) + " and " + self._list[-1] + + def Format(self): + s = str("") + if len(self._list) <= 0: + return s + if len(self._list) == 1: + return TransToFrontFormat(0 + self.offset) + if len(self._list) == 2: + return " and ".join( + [ + TransToFrontFormat(i + self.offset) + for i in range(len(self._list)) + ] + ) + if len(self._list) > 2: + return ( + ", ".join( + [ + TransToFrontFormat(i + self.offset) + for i in range(len(self._list) - 1) + ] + ) + + " and " + + TransToFrontFormat(len(self._list) - 1 + self.offset) + ) + + +def TransToFrontFormat(index: int): + return "!<" + str(index) + ">!" diff --git a/backend/DataProcess/__init__.py b/backend/DataProcess/__init__.py new file mode 100644 index 0000000..4a879d0 --- /dev/null +++ b/backend/DataProcess/__init__.py @@ -0,0 +1 @@ +from .DataProcess import Add_Collaboration_Brief_FrontEnd \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..7cc4675 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,20 @@ +FROM python:3.11.8-alpine3.18 +WORKDIR /app +EXPOSE 8000/tcp + +# Build +COPY requirements.txt ./ +RUN pip --no-cache-dir install -r ./requirements.txt + +# Mount +COPY . ./ + +# Run +ENV OPENAI_API_BASE=https://api.openai.com +ENV OPENAI_API_KEY= +ENV OPENAI_API_MODEL=gpt-4-turbo-preview +ENV USE_CACHE=False +ENV FAST_DESIGN_MODE=True +ENV GROQ_API_KEY= +ENV MISTRAL_API_KEY= +CMD ["python", "server.py", "--port", "8000"] diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..6cb2dc1 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,38 @@ +# AgentCoord: Visually Exploring Coordination Strategy for LLM-based Multi-Agent Collaboration +

+ AgentCoord: Visually Exploring Coordination Strategy for LLM-based Multi-Agent Collaboration +

+AgentCoord is an experimental open-source system to help general users design coordination strategies for multiple LLM-based agents (Research paper forthcoming). + +## System Usage + + +## Installation +### Installation +```bash +git clone https://github.com/AgentCoord/AgentCoord.git +cd AgentCoord +pip install -r requirements.txt +``` +### Configuration +#### LLM configuration +You can set the configuration (i.e. API base, API key, Model name, Max tokens, Response per minute) for default LLM in config\config.yaml. Currently, we only support OpenAI’s LLMs as the default model. We recommend using gpt-4-0125-preview as the default model (WARNING: the execution process of multiple agents may consume a significant number of tokens). + +You can switch to a fast mode that uses the Mistral 8×7B model with hardware acceleration by [Groq](https://groq.com/) for the first time in strategy generation to strike a balance of response quality and efficiency. To achieve this, you need to set the FAST_DESIGN_MODE field in the yaml file as True and fill the GROQ_API_KEY field with the api key of [Groq](https://wow.groq.com/). + +#### Agent configuration +Currently, we support config agents by [role-prompting](https://arxiv.org/abs/2305.14688). You can customize your agents by changing the role prompts in AgentRepo\agentBoard_v1.json. We plan to support more methods to customize agents (e.g., supporting RAG, or providing a unified wrapper for customized agents). + +### Launch +Execute the following command to launch the system: +```bash +python server.py +``` +## More Papers & Projects for LLM-based Multi-Agent Collaboration +If you’re interested in LLM-based multi-agent collaboration and want more papers & projects for reference, you may check out the corpus collected by us: + + + + + diff --git a/backend/RequestCache/Request_Cache.json b/backend/RequestCache/Request_Cache.json new file mode 100644 index 0000000..997acb1 --- /dev/null +++ b/backend/RequestCache/Request_Cache.json @@ -0,0 +1,3872 @@ +{ + "('/generate_basePlan', 'Write a novel about the awakening of artificial intelligence.', [])": { + "Initial Input Object": [], + "Collaboration Process": [ + { + "StepName": "Theme Selection", + "TaskContent": "Select the main theme focused on the awakening of artificial intelligence.", + "InputObject_List": [], + "OutputObject": "Main Theme", + "AgentSelection": [ + "Isabella", + "Yuriko" + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of select the main theme focusing on the awakening of artificial intelligence to obtain !<2>!.", + "data": { + "0": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + }, + "TaskProcess": [ + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a set of themes that explore the ethical implications of artificial intelligence awakening.", + "ID": "Action1", + "ImportantInput": [] + }, + { + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a theme focusing on the societal impact of artificial intelligence becoming sentient.", + "ID": "Action2", + "ImportantInput": [] + }, + { + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the feasibility of the themes proposed by Yuriko from a science fiction narrative perspective.", + "ID": "Action3", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the themes proposed by Isabella based on potential future technological advancements.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the proposed themes by integrating Yuriko's technological insights and feedback.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action4" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Improve the proposed themes by considering Isabella's narrative critiques and suggestions.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ] + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Finalize the main theme by synthesizing the improved themes proposed by both Isabella and Yuriko.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action5", + "ActionResult:Action6" + ] + } + ] + }, + { + "StepName": "Character Creation", + "TaskContent": "Create a list of characters that will be part of the novel, including AI entities and human characters.", + "InputObject_List": [], + "OutputObject": "Character List", + "AgentSelection": [ + "Isabella", + "Jennifer", + "Giorgio" + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of select the main theme focusing on the awakening of artificial intelligence to obtain !<2>!.", + "data": { + "0": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + }, + "TaskProcess": [ + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a list of potential AI characters based on current technological and futuristic concepts.", + "ID": "Action1", + "ImportantInput": [] + }, + { + "ActionType": "Propose", + "AgentName": "Jennifer", + "Description": "Propose a list of human characters who interact with AI, focusing on their linguistic and cultural backgrounds.", + "ID": "Action2", + "ImportantInput": [] + }, + { + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose emotional and philosophical themes that the characters could explore in their interactions.", + "ID": "Action3", + "ImportantInput": [] + }, + { + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the proposed list of human characters by Jennifer, focusing on their feasibility in a science fiction setting.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ActionType": "Critique", + "AgentName": "Jennifer", + "Description": "Critique the proposed AI characters by Isabella, ensuring linguistic diversity and depth.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve the character list by integrating emotional and philosophical themes into the profiles of both AI and human characters.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action2", + "ActionResult:Action3", + "ActionResult:Action4", + "ActionResult:Action5" + ] + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Finalize the character list by incorporating all feedback and improvements, and submit it as the official Character List for the novel.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action6" + ] + } + ] + }, + { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.", + "InputObject_List": [ + "Main Theme", + "Character List" + ], + "OutputObject": "Novel Plot", + "AgentSelection": [ + "Isabella", + "Yuriko", + "Jennifer" + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of select the main theme focusing on the awakening of artificial intelligence to obtain !<2>!.", + "data": { + "0": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + }, + "TaskProcess": [ + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose initial story arcs based on the main theme of AI awakening.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:Main Theme", + "InputObject:Character List" + ] + }, + { + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic elements and technologies that could play a key role in the AI awakening story.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:Main Theme" + ] + }, + { + "ActionType": "Critique", + "AgentName": "Jennifer", + "Description": "Critique the realism and feasibility of the futuristic elements proposed by Yuriko from a linguistic perspective.", + "ID": "Action3", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Refine the futuristic elements based on Jennifer's feedback to ensure linguistic accuracy and feasibility.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action3" + ] + }, + { + "ActionType": "Propose", + "AgentName": "Jennifer", + "Description": "Propose the linguistic evolution and communication methods of AI as it awakens and interacts with humans.", + "ID": "Action5", + "ImportantInput": [] + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Integrate the refined futuristic elements and linguistic evolution into the initial story arcs.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action4", + "ActionResult:Action5" + ] + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Compile all contributions into a cohesive novel plot outline, ensuring a logical flow of events and character development.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action6" + ] + } + ] + }, + { + "StepName": "Writing Draft", + "TaskContent": "Write the initial draft of the novel based on the developed plot and characters.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Novel Draft", + "AgentSelection": [ + "Giorgio", + "Jennifer" + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of select the main theme focusing on the awakening of artificial intelligence to obtain !<2>!.", + "data": { + "0": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + }, + "TaskProcess": [ + { + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose poetic elements and themes to be included in the novel.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ActionType": "Propose", + "AgentName": "Jennifer", + "Description": "Propose linguistic styles and dialogues that match the characters' personalities.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Critique the linguistic styles proposed by Jennifer, focusing on their compatibility with the poetic elements.", + "ID": "Action3", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ActionType": "Critique", + "AgentName": "Jennifer", + "Description": "Critique the poetic elements proposed by Giorgio, ensuring they align with the novel's linguistic style.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve the initial draft by integrating Jennifer's linguistic styles with his poetic elements based on mutual critiques.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Jennifer", + "Description": "Enhance the dialogues and linguistic styles in the draft, incorporating Giorgio's poetic improvements.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ActionType": "Finalize", + "AgentName": "Giorgio", + "Description": "Finalize the novel draft, incorporating all improvements and ensuring a seamless blend of poetry and linguistics.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action6" + ] + } + ] + }, + { + "StepName": "Review and Editing", + "TaskContent": "Review the initial draft, make necessary edits for coherence, grammar, and impact, to finalize the novel.", + "InputObject_List": [ + "Novel Draft" + ], + "OutputObject": "Final Novel", + "AgentSelection": [ + "Isabella", + "Carlos" + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of select the main theme focusing on the awakening of artificial intelligence to obtain !<2>!.", + "data": { + "0": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + }, + "TaskProcess": [ + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose edits to enhance the scientific accuracy and depth of the novel draft.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:Novel Draft" + ] + }, + { + "ActionType": "Critique", + "AgentName": "Carlos", + "Description": "Critique the novel draft for grammar, language use, and readability.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:Novel Draft" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the novel draft based on Carlos's language and grammar critiques.", + "ID": "Action3", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ActionType": "Improve", + "AgentName": "Carlos", + "Description": "Enhance the language and narrative style of the novel draft following Isabella's scientific edits.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ] + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Review the improved novel draft for final adjustments and submit the Final Novel.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action4" + ] + } + ] + } + ], + "General Goal": "Write a novel about the awakening of artificial intelligence." + }, + "('/branch_PlanOutline', 1, 'just add a step to finalize', [{'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme'}, {'StepName': 'Character Creation', 'TaskContent': 'Create a list of characters that will be part of the novel, including AI entities and human characters.', 'InputObject_List': [], 'OutputObject': 'Character List'}, {'StepName': 'Plot Development', 'TaskContent': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.', 'InputObject_List': ['Main Theme', 'Character List'], 'OutputObject': 'Novel Plot'}], [], [], 'Write a novel about the awakening of artificial intelligence.')": [ + [ + { + "StepName": "Finalize Manuscript", + "TaskContent": "Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Final Manuscript", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>!, perform the task of finalize the novel manuscript by incorporating the developed plot, characters, and theme, ensuring narrative coherence and engaging storytelling to obtain !<3>!.", + "data": { + "0": { + "text": "Novel Plot", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 108, + 45, + 74 + ] + }, + "3": { + "text": "Final Manuscript", + "color": [ + 32, + 100, + 78 + ] + } + } + } + } + ] + ], + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Finalize Manuscript', 'TaskContent': 'Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.', 'InputObject_List': ['Novel Plot'], 'OutputObject': 'Final Manuscript'})": { + "StepName": "Finalize Manuscript", + "TaskContent": "Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Final Manuscript", + "AgentSelection": [ + "Carlos", + "Isabella" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Carlos", + "Description": "Propose enhancements for narrative coherence based on the novel plot.", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose ideas for engaging storytelling and plot twists.", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ID": "Action3", + "ActionType": "Critique", + "AgentName": "Carlos", + "Description": "Critique the ideas proposed by Isabella for plot twists, focusing on language and emotional impact.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action4", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the plot twists based on Carlos's critique, ensuring they align with the overall story arc.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the enhancements proposed by Carlos for narrative coherence, suggesting further improvements.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Carlos", + "Description": "Improve narrative coherence based on Isabella's critique, ensuring the story flows smoothly.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Combine the improved narrative coherence and engaging storytelling elements into the final manuscript.", + "ImportantInput": [ + "ActionResult:Action4", + "ActionResult:Action6" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>! perform the task of finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling to obtain !<3>!.", + "data": { + "0": { + "text": "Novel Plot", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Carlos", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Final Manuscript", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/branch_PlanOutline', 3, 'adjust steps before Plot Development, everything else same baseline', [], [{'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme'}, {'StepName': 'Character Creation', 'TaskContent': 'Create a list of characters that will be part of the novel, including AI entities and human characters.', 'InputObject_List': [], 'OutputObject': 'Character List'}, {'StepName': 'Plot Development', 'TaskContent': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.', 'InputObject_List': ['Main Theme', 'Character List'], 'OutputObject': 'Novel Plot'}, {'StepName': 'Finalize Manuscript', 'TaskContent': 'Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.', 'InputObject_List': ['Novel Plot'], 'OutputObject': 'Final Manuscript'}], [], 'Write a novel about the awakening of artificial intelligence.')": [ + [ + { + "StepName": "Theme Exploration", + "TaskContent": "Explore various themes related to artificial intelligence awakening, considering ethical dilemmas, human interaction, and the evolution of AI.", + "InputObject_List": [], + "OutputObject": "Explored Themes", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "perform the task of explore various themes related to artificial intelligence awakening, considering ethical dilemmas, human interaction, and the evolution of AI to obtain !<0>!.", + "data": { + "0": { + "text": "Explored Themes", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Character Creation", + "TaskContent": "Create a list of characters that will be part of the novel, including AI entities, human characters, and their backgrounds.", + "InputObject_List": [], + "OutputObject": "Character List", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "perform the task of create a list of characters that will be part of the novel, including AI entities, human characters, and their backgrounds to obtain !<0>!.", + "data": { + "0": { + "text": "Character List", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Conflict Identification", + "TaskContent": "Identify major conflicts within the story, considering the interactions between AI and humans, internal struggles, and societal impacts.", + "InputObject_List": [ + "Explored Themes", + "Character List" + ], + "OutputObject": "Identified Conflicts", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>! and !<1>!, perform the task of identify major conflicts within the story, considering the interactions between AI and humans, internal struggles, and societal impacts to obtain !<2>!.", + "data": { + "0": { + "text": "Explored Themes", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Identified Conflicts", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening, incorporating identified conflicts and character dynamics.", + "InputObject_List": [ + "Explored Themes", + "Character List", + "Identified Conflicts" + ], + "OutputObject": "Novel Plot", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>!, perform the task of develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening, incorporating identified conflicts and character dynamics to obtain !<3>!.", + "data": { + "0": { + "text": "Explored Themes", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Identified Conflicts", + "color": [ + 108, + 45, + 74 + ] + }, + "3": { + "text": "Novel Plot", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Finalize Manuscript", + "TaskContent": "Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence, engaging storytelling, and resolving the identified conflicts.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Final Manuscript", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence, engaging storytelling, and resolving the identified conflicts to obtain !<1>!.", + "data": { + "0": { + "text": "Novel Plot", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Final Manuscript", + "color": [ + 32, + 100, + 78 + ] + } + } + } + } + ], + [ + { + "StepName": "Theme Selection", + "TaskContent": "Select the main theme focused on the awakening of artificial intelligence.", + "InputObject_List": [], + "OutputObject": "Main Theme", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "perform the task of select the main theme focused on the awakening of artificial intelligence to obtain !<0>!.", + "data": { + "0": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "World Building", + "TaskContent": "Construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening.", + "InputObject_List": [ + "Main Theme" + ], + "OutputObject": "World Setting", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening to obtain !<1>!.", + "data": { + "0": { + "text": "Main Theme", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "World Setting", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Character Creation", + "TaskContent": "Create a list of characters that will be part of the novel, including AI entities and human characters.", + "InputObject_List": [ + "World Setting" + ], + "OutputObject": "Character List", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of create a list of characters that will be part of the novel, including AI entities and human characters to obtain !<1>!.", + "data": { + "0": { + "text": "World Setting", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Character List", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.", + "InputObject_List": [ + "Main Theme", + "World Setting", + "Character List" + ], + "OutputObject": "Novel Plot", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>!, perform the task of develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening to obtain !<3>!.", + "data": { + "0": { + "text": "Main Theme", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "World Setting", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "3": { + "text": "Novel Plot", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Finalize Manuscript", + "TaskContent": "Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Final Manuscript", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling to obtain !<1>!.", + "data": { + "0": { + "text": "Novel Plot", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Final Manuscript", + "color": [ + 32, + 100, + 78 + ] + } + } + } + } + ], + [ + { + "StepName": "Research AI Topic", + "TaskContent": "Conduct thorough research on artificial intelligence to understand its concepts, history, and potential future developments.", + "InputObject_List": [], + "OutputObject": "AI Research Notes", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "perform the task of conduct thorough research on artificial intelligence to understand its concepts, history, and potential future developments to obtain !<0>!.", + "data": { + "0": { + "text": "AI Research Notes", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Decide Story Setting", + "TaskContent": "Decide on the setting for the story, including the time period, location, and societal context, based on the AI research.", + "InputObject_List": [ + "AI Research Notes" + ], + "OutputObject": "Story Setting", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of decide on the setting for the story, including the time period, location, and societal context, based on the AI research to obtain !<1>!.", + "data": { + "0": { + "text": "AI Research Notes", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Story Setting", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.", + "InputObject_List": [ + "Story Setting" + ], + "OutputObject": "Novel Plot", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening to obtain !<1>!.", + "data": { + "0": { + "text": "Story Setting", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Novel Plot", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + { + "StepName": "Finalize Manuscript", + "TaskContent": "Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Final Manuscript", + "Collaboration_Brief_LackAgent_FrontEnd": { + "template": "Based on !<0>!, perform the task of finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling to obtain !<1>!.", + "data": { + "0": { + "text": "Novel Plot", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Final Manuscript", + "color": [ + 32, + 100, + 78 + ] + } + } + } + } + ] + ], + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Finalize Manuscript', 'TaskContent': 'Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence, engaging storytelling, and resolving the identified conflicts.', 'InputObject_List': ['Novel Plot'], 'OutputObject': 'Final Manuscript'})": { + "StepName": "Finalize Manuscript", + "TaskContent": "Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence, engaging storytelling, and resolving the identified conflicts.", + "InputObject_List": [ + "Novel Plot" + ], + "OutputObject": "Final Manuscript", + "AgentSelection": [ + "Giorgio", + "Isabella", + "Jennifer" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose poetic elements to enhance the narrative's emotional depth.", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose science fiction elements to integrate into the novel for a compelling plot.", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Jennifer", + "Description": "Propose linguistic styles and dialogues for characters to make the narrative authentic.", + "ImportantInput": [ + "InputObject:Novel Plot" + ] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Critique the integration of science fiction elements proposed by Isabella for narrative coherence.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the poetic elements proposed by Giorgio to ensure they align with the science fiction theme.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action6", + "ActionType": "Critique", + "AgentName": "Jennifer", + "Description": "Critique both the poetic and science fiction elements to ensure linguistic consistency across the narrative.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action2" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve the narrative by refining poetic elements based on critiques from Isabella and Jennifer.", + "ImportantInput": [ + "ActionResult:Action4", + "ActionResult:Action6" + ] + }, + { + "ID": "Action8", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the science fiction elements based on critiques for better integration into the narrative.", + "ImportantInput": [ + "ActionResult:Action5", + "ActionResult:Action6" + ] + }, + { + "ID": "Action9", + "ActionType": "Improve", + "AgentName": "Jennifer", + "Description": "Refine linguistic styles and dialogues for enhanced authenticity and coherence with the improved elements.", + "ImportantInput": [ + "ActionResult:Action3", + "ActionResult:Action6" + ] + }, + { + "ID": "Action10", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Compile the improved elements and finalize the manuscript, ensuring narrative coherence and engagement.", + "ImportantInput": [ + "ActionResult:Action7", + "ActionResult:Action8", + "ActionResult:Action9" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>!, !<2>! and !<3>! perform the task of finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence, engaging storytelling, and resolving the identified conflicts to obtain !<4>!.", + "data": { + "0": { + "text": "Novel Plot", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Giorgio", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Jennifer", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "Final Manuscript", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Plot Development', 'TaskContent': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening, incorporating identified conflicts and character dynamics.', 'InputObject_List': ['Explored Themes', 'Character List', 'Identified Conflicts'], 'OutputObject': 'Novel Plot'})": { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening, incorporating identified conflicts and character dynamics.", + "InputObject_List": [ + "Explored Themes", + "Character List", + "Identified Conflicts" + ], + "OutputObject": "Novel Plot", + "AgentSelection": [ + "Giorgio", + "Isabella" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose a thematic framework for the novel, focusing on the emotional and philosophical implications of AI awakening.", + "ImportantInput": [ + "InputObject:Explored Themes" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose key events and conflicts based on the thematic framework provided by Giorgio, ensuring a coherent narrative around AI awakening.", + "ImportantInput": [ + "InputObject:Explored Themes", + "ActionResult:Action1" + ] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose how the main characters will interact with the key events and conflicts identified by Isabella, emphasizing character growth and development.", + "ImportantInput": [ + "InputObject:Character List", + "ActionResult:Action2" + ] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the character dynamics and plot progression proposed by Giorgio, focusing on believability and emotional impact.", + "ImportantInput": [ + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve the plot and character dynamics based on Isabella's critique, refining the narrative and emotional depth of the story.", + "ImportantInput": [ + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Finalize the novel plot by integrating all proposed elements and improvements, ensuring a cohesive and engaging narrative around the theme of AI awakening.", + "ImportantInput": [ + "ActionResult:Action5" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>!, !<3>! and !<4>! perform the task of develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening, incorporating identified conflicts and character dynamics to obtain !<5>!.", + "data": { + "0": { + "text": "Explored Themes", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Identified Conflicts", + "color": [ + 108, + 45, + 74 + ] + }, + "3": { + "text": "Giorgio", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "5": { + "text": "Novel Plot", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Conflict Identification', 'TaskContent': 'Identify major conflicts within the story, considering the interactions between AI and humans, internal struggles, and societal impacts.', 'InputObject_List': ['Explored Themes', 'Character List'], 'OutputObject': 'Identified Conflicts'})": { + "StepName": "Conflict Identification", + "TaskContent": "Identify major conflicts within the story, considering the interactions between AI and humans, internal struggles, and societal impacts.", + "InputObject_List": [ + "Explored Themes", + "Character List" + ], + "OutputObject": "Identified Conflicts", + "AgentSelection": [ + "Maria", + "Sam" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Maria", + "Description": "Propose potential conflicts arising from AI's interactions with humans based on the Explored Themes.", + "ImportantInput": [ + "InputObject:Explored Themes", + "InputObject:Character List" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Sam", + "Description": "Propose potential conflicts arising from the internal struggles of AI characters, referencing the Character List.", + "ImportantInput": [ + "InputObject:Explored Themes", + "InputObject:Character List" + ] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Maria", + "Description": "Propose potential societal impacts and conflicts resulting from the awakening of AI, using the Explored Themes as a basis.", + "ImportantInput": [ + "InputObject:Explored Themes", + "InputObject:Character List" + ] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Sam", + "Description": "Critique the proposed conflicts by Maria, focusing on their feasibility and depth.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Maria", + "Description": "Critique the proposed conflicts by Sam, especially the internal struggles of AI characters for realism.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Sam", + "Description": "Improve the proposed conflicts based on Maria's critiques, focusing on enhancing the depth of internal struggles.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Maria", + "Description": "Improve the proposed societal impacts and other conflicts based on Sam's critiques.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action8", + "ActionType": "Finalize", + "AgentName": "Sam", + "Description": "Combine and refine all improved conflicts, finalizing the Identified Conflicts document.", + "ImportantInput": [ + "ActionResult:Action6", + "ActionResult:Action7" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>! and !<1>!, !<2>! and !<3>! perform the task of identify major conflicts within the story, considering the interactions between AI and humans, internal struggles, and societal impacts to obtain !<4>!.", + "data": { + "0": { + "text": "Explored Themes", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "Identified Conflicts", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Character Creation', 'TaskContent': 'Create a list of characters that will be part of the novel, including AI entities, human characters, and their backgrounds.', 'InputObject_List': [], 'OutputObject': 'Character List'})": { + "StepName": "Character Creation", + "TaskContent": "Create a list of characters that will be part of the novel, including AI entities, human characters, and their backgrounds.", + "InputObject_List": [], + "OutputObject": "Character List", + "AgentSelection": [ + "Giorgio", + "Isabella" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose a list of human characters along with their backgrounds focusing on their emotional depth.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a list of AI entities, detailing their capabilities, purposes, and how they differ from humans.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Critique the list of AI entities proposed by Isabella, focusing on how their characteristics can enhance the narrative.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action4", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the list of AI entities based on Giorgio's feedback, ensuring their roles are clear and impactful in the story.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the list of human characters proposed by Giorgio, suggesting ways to make their interactions with AI more meaningful.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve the list of human characters based on Isabella's feedback, focusing on their relationships with AI.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Combine and finalize the improved lists of AI entities and human characters into a comprehensive Character List.", + "ImportantInput": [ + "ActionResult:Action4", + "ActionResult:Action6" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of create a list of characters that will be part of the novel, including AI entities, human characters, and their backgrounds to obtain !<2>!.", + "data": { + "0": { + "text": "Giorgio", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Character List", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Theme Exploration', 'TaskContent': 'Explore various themes related to artificial intelligence awakening, considering ethical dilemmas, human interaction, and the evolution of AI.', 'InputObject_List': [], 'OutputObject': 'Explored Themes'})": { + "StepName": "Theme Exploration", + "TaskContent": "Explore various themes related to artificial intelligence awakening, considering ethical dilemmas, human interaction, and the evolution of AI.", + "InputObject_List": [], + "OutputObject": "Explored Themes", + "AgentSelection": [ + "Maria", + "Sam", + "Yuriko" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Maria", + "Description": "Propose philosophical perspectives on AI awakening.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Sam", + "Description": "Propose ethical dilemmas related to AI awakening.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic scenarios for human interaction with awakened AI.", + "ImportantInput": [] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Sam", + "Description": "Critique the proposed philosophical perspectives by Maria.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the ethical dilemmas proposed by Sam.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action6", + "ActionType": "Critique", + "AgentName": "Maria", + "Description": "Critique the futuristic scenarios proposed by Yuriko.", + "ImportantInput": [ + "ActionResult:Action3" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Maria", + "Description": "Improve philosophical perspectives based on Sam's critique.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action4" + ] + }, + { + "ID": "Action8", + "ActionType": "Improve", + "AgentName": "Sam", + "Description": "Improve ethical dilemmas based on Yuriko's critique.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action5" + ] + }, + { + "ID": "Action9", + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Improve futuristic scenarios based on Maria's critique.", + "ImportantInput": [ + "ActionResult:Action3", + "ActionResult:Action6" + ] + }, + { + "ID": "Action10", + "ActionType": "Finalize", + "AgentName": "Maria", + "Description": "Summarize the improved philosophical perspectives, ethical dilemmas, and futuristic scenarios to finalize the Explored Themes.", + "ImportantInput": [ + "ActionResult:Action7", + "ActionResult:Action8", + "ActionResult:Action9" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>!, !<1>! and !<2>! perform the task of explore various themes related to artificial intelligence awakening, considering ethical dilemmas, human interaction, and the evolution of AI to obtain !<3>!.", + "data": { + "0": { + "text": "Maria", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Sam", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Explored Themes", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Plot Development', 'TaskContent': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.', 'InputObject_List': ['Main Theme', 'World Setting', 'Character List'], 'OutputObject': 'Novel Plot'})": { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.", + "InputObject_List": [ + "Main Theme", + "World Setting", + "Character List" + ], + "OutputObject": "Novel Plot", + "AgentSelection": [ + "Isabella", + "Yuriko" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose an innovative concept for the AI's awakening process based on the Main Theme.", + "ImportantInput": [ + "InputObject:Main Theme" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic elements to be included in the World Setting, enhancing the AI awakening theme.", + "ImportantInput": [ + "InputObject:World Setting" + ] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a detailed character arc for the main characters, focusing on their interaction with the awakening AI.", + "ImportantInput": [ + "InputObject:Character List" + ] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the proposed AI's awakening concept for its feasibility and impact on the story.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action5", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the AI's awakening concept based on Yuriko's critique, ensuring logical consistency and emotional depth.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a sequence of key events and conflicts around the AI awakening, incorporating Isabella's improved concept.", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the proposed sequence of events for narrative pacing and character development consistency.", + "ImportantInput": [ + "ActionResult:Action6" + ] + }, + { + "ID": "Action8", + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Refine the sequence of key events and conflicts based on Isabella's feedback, ensuring a coherent plotline.", + "ImportantInput": [ + "ActionResult:Action6", + "ActionResult:Action7" + ] + }, + { + "ID": "Action9", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Finalize the novel plot, integrating all proposed, critiqued, and improved elements into a cohesive storyline.", + "ImportantInput": [ + "ActionResult:Action8" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>!, !<3>! and !<4>! perform the task of develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening to obtain !<5>!.", + "data": { + "0": { + "text": "Main Theme", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "World Setting", + "color": [ + 108, + 45, + 74 + ] + }, + "2": { + "text": "Character List", + "color": [ + 108, + 45, + 74 + ] + }, + "3": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "5": { + "text": "Novel Plot", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Character Creation', 'TaskContent': 'Create a list of characters that will be part of the novel, including AI entities and human characters.', 'InputObject_List': ['World Setting'], 'OutputObject': 'Character List'})": { + "StepName": "Character Creation", + "TaskContent": "Create a list of characters that will be part of the novel, including AI entities and human characters.", + "InputObject_List": [ + "World Setting" + ], + "OutputObject": "Character List", + "AgentSelection": [ + "Giorgio", + "Isabella" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose character ideas focusing on emotional depth and poetic aspects, drawing from the World Setting.", + "ImportantInput": [ + "InputObject:World Setting" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose character ideas with a focus on science fiction elements, ensuring they fit within the World Setting.", + "ImportantInput": [ + "InputObject:World Setting" + ] + }, + { + "ID": "Action3", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the character ideas proposed by Giorgio for their fit within a science fiction narrative.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Critique the character ideas proposed by Isabella for their emotional depth and relevance to the poetic aspects of the story.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action5", + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve character ideas based on Isabella's critique, focusing on better integration of science fiction elements.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve character ideas based on Giorgio's critique, enhancing emotional depth and poetic aspects.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action4" + ] + }, + { + "ID": "Action7", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Combine and refine the improved character ideas from both agents, finalizing the Character List for the novel.", + "ImportantInput": [ + "ActionResult:Action5", + "ActionResult:Action6" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>! perform the task of create a list of characters that will be part of the novel, including AI entities and human characters to obtain !<3>!.", + "data": { + "0": { + "text": "World Setting", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Giorgio", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Character List", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'World Building', 'TaskContent': 'Construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening.', 'InputObject_List': ['Main Theme'], 'OutputObject': 'World Setting'})": { + "StepName": "World Building", + "TaskContent": "Construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening.", + "InputObject_List": [ + "Main Theme" + ], + "OutputObject": "World Setting", + "AgentSelection": [ + "Isabella", + "Latoya", + "Yuriko" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose initial ideas for the setting and era that aligns with the main theme of AI awakening.", + "ImportantInput": [ + "InputObject:Main Theme" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Latoya", + "Description": "Propose historical contexts and technological advancements that could serve as a backdrop for the AI awakening.", + "ImportantInput": [ + "InputObject:Main Theme" + ] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic elements and societal impacts to consider in the world-building process.", + "ImportantInput": [ + "InputObject:Main Theme" + ] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the historical contexts proposed by Latoya for realism and relevance to the AI theme.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the initial ideas proposed by Isabella, focusing on the integration of futuristic elements.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Latoya", + "Description": "Improve the historical contexts based on Isabella's critique, ensuring they complement the futuristic elements proposed by Yuriko.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action4" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the initial setting and era ideas by incorporating Latoya's improved historical contexts and Yuriko's futuristic elements.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3", + "ActionResult:Action6" + ] + }, + { + "ID": "Action8", + "ActionType": "Finalize", + "AgentName": "Yuriko", + "Description": "Finalize the world setting by synthesizing the improved ideas from Isabella and Latoya, ensuring coherence and alignment with the main theme.", + "ImportantInput": [ + "ActionResult:Action7" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>!, !<2>! and !<3>! perform the task of construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening to obtain !<4>!.", + "data": { + "0": { + "text": "Main Theme", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Latoya", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "World Setting", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme'})": { + "StepName": "Theme Selection", + "TaskContent": "Select the main theme focused on the awakening of artificial intelligence.", + "InputObject_List": [], + "OutputObject": "Main Theme", + "AgentSelection": [ + "Yuriko", + "Isabella" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a vision of the future where AI awakens, focusing on societal impacts.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a narrative that explores the emotional journey of AI awakening from the AI's perspective.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique Isabella's narrative proposal for logical consistency with the proposed future vision.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action4", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the narrative proposal based on Yuriko's critique, ensuring emotional depth aligns with the societal impacts.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Finalize", + "AgentName": "Yuriko", + "Description": "Combine the refined narrative and future vision into a cohesive main theme for the novel, focusing on the awakening of artificial intelligence.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action4" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>! and !<1>! perform the task of select the main theme focused on the awakening of artificial intelligence to obtain !<2>!.", + "data": { + "0": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Plot Development', 'TaskContent': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.', 'InputObject_List': ['Story Setting'], 'OutputObject': 'Novel Plot'})": { + "StepName": "Plot Development", + "TaskContent": "Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.", + "InputObject_List": [ + "Story Setting" + ], + "OutputObject": "Novel Plot", + "AgentSelection": [ + "Isabella", + "Yuriko" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose key events and conflicts based on the AI awakening theme.", + "ImportantInput": [ + "InputObject:Story Setting" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic elements and technological advancements that could play a role in the AI awakening.", + "ImportantInput": [ + "InputObject:Story Setting" + ] + }, + { + "ID": "Action3", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the proposed key events and conflicts by Isabella for logical consistency and feasibility.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action4", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the key events and conflicts based on Yuriko's critique.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the futuristic elements and technological advancements proposed by Yuriko for their impact on the story.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Improve the futuristic elements and technological advancements based on Isabella's feedback.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Combine the improved key events, conflicts, and futuristic elements into a cohesive novel plot.", + "ImportantInput": [ + "ActionResult:Action4", + "ActionResult:Action6" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>! and !<2>! perform the task of develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening to obtain !<3>!.", + "data": { + "0": { + "text": "Story Setting", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Novel Plot", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Decide Story Setting', 'TaskContent': 'Decide on the setting for the story, including the time period, location, and societal context, based on the AI research.', 'InputObject_List': ['AI Research Notes'], 'OutputObject': 'Story Setting'})": { + "StepName": "Decide Story Setting", + "TaskContent": "Decide on the setting for the story, including the time period, location, and societal context, based on the AI research.", + "InputObject_List": [ + "AI Research Notes" + ], + "OutputObject": "Story Setting", + "AgentSelection": [ + "Abigail", + "Isabella", + "Yuriko" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Abigail", + "Description": "Propose a futuristic setting based on the latest AI research advancements.", + "ImportantInput": [ + "InputObject:AI Research Notes" + ] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a narrative setting that includes a societal context where AI is on the brink of self-awareness.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a setting that includes potential future technological advancements and their impact on society.", + "ImportantInput": [] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the proposed settings by Abigail and Yuriko for narrative coherence and emotional depth.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ] + }, + { + "ID": "Action5", + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Improve the setting proposals based on Isabella's feedback, focusing on technological and societal implications.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Finalize", + "AgentName": "Abigail", + "Description": "Finalize the story setting by integrating the improved proposals and ensuring scientific accuracy and narrative engagement.", + "ImportantInput": [ + "ActionResult:Action5" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "Based on !<0>!, !<1>!, !<2>! and !<3>! perform the task of decide on the setting for the story, including the time period, location, and societal context, based on the AI research to obtain !<4>!.", + "data": { + "0": { + "text": "AI Research Notes", + "color": [ + 108, + 45, + 74 + ] + }, + "1": { + "text": "Abigail", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "Story Setting", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/fill_stepTask', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Research AI Topic', 'TaskContent': 'Conduct thorough research on artificial intelligence to understand its concepts, history, and potential future developments.', 'InputObject_List': [], 'OutputObject': 'AI Research Notes'})": { + "StepName": "Research AI Topic", + "TaskContent": "Conduct thorough research on artificial intelligence to understand its concepts, history, and potential future developments.", + "InputObject_List": [], + "OutputObject": "AI Research Notes", + "AgentSelection": [ + "Abigail", + "Carmen", + "Tom" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Abigail", + "Description": "Propose research methodologies and sources to cover the basic concepts and history of AI.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Carmen", + "Description": "Propose a list of cutting-edge robotics technologies that could be integrated with AI for novel developments.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Tom", + "Description": "Propose potential future developments in AI that could lead to its awakening.", + "ImportantInput": [] + }, + { + "ID": "Action4", + "ActionType": "Critique", + "AgentName": "Abigail", + "Description": "Critique the list of robotics technologies proposed by Carmen for feasibility in integration with AI.", + "ImportantInput": [ + "ActionResult:Action2" + ] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Carmen", + "Description": "Critique the proposed future developments by Tom for their practicality and potential impact.", + "ImportantInput": [ + "ActionResult:Action3" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Tom", + "Description": "Improve the list of potential future developments based on Carmen's critique.", + "ImportantInput": [ + "ActionResult:Action3", + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Carmen", + "Description": "Improve the list of robotics technologies based on Abigail's feedback for better AI integration.", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action4" + ] + }, + { + "ID": "Action8", + "ActionType": "Finalize", + "AgentName": "Abigail", + "Description": "Compile all refined research, critiques, and improvements into comprehensive AI Research Notes.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action6", + "ActionResult:Action7" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>!, !<1>! and !<2>! perform the task of conduct thorough research on artificial intelligence to understand its concepts, history, and potential future developments to obtain !<3>!.", + "data": { + "0": { + "text": "Abigail", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Carmen", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Tom", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "AI Research Notes", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/agentSelectModify_init', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme'})": { + "Creativie Thinking": { + "Abigail": { + "Reason": "AI engineering requires creative problem-solving but is more technical than purely creative thinking.", + "Score": 3 + }, + "Jane": { + "Reason": "Cybersecurity involves creative strategies to counter threats but is more focused on technical skills.", + "Score": 3 + }, + "Giorgio": { + "Reason": "Poetry is a highly creative domain, requiring innovative use of language and ideas.", + "Score": 5 + }, + "Jennifer": { + "Reason": "Linguistics involves understanding language patterns, which can involve creative thinking but is often analytical.", + "Score": 3 + }, + "Maria": { + "Reason": "Philosophy requires the ability to think abstractly and creatively about complex concepts.", + "Score": 4 + }, + "Sam": { + "Reason": "Ethics involves creative thinking to navigate complex moral dilemmas.", + "Score": 4 + }, + "Yuriko": { + "Reason": "Futurism involves imaginative and creative thinking to envision future trends and possibilities.", + "Score": 5 + }, + "Carlos": { + "Reason": "Expertise in languages can involve creative thinking in terms of understanding and translating nuanced meanings.", + "Score": 4 + }, + "John": { + "Reason": "Software development involves problem-solving and can require creativity, but it is largely technical.", + "Score": 3 + }, + "Tamara": { + "Reason": "Music composition is inherently a creative process, requiring originality and innovation.", + "Score": 5 + }, + "Arthur": { + "Reason": "Neuroscience is a scientific field that, while it can benefit from creative thinking, is primarily analytical.", + "Score": 2 + }, + "Eddy": { + "Reason": "Cognitive psychology involves understanding human thought processes, which might involve creative thinking but not necessary.", + "Score": 3 + }, + "Isabella": { + "Reason": "Science fiction writing is a highly creative endeavor, requiring imaginative and innovative ideas.", + "Score": 5 + }, + "Latoya": { + "Reason": "Studying the history of technology can involve creative thinking in terms of interpreting historical trends, but it is largely analytical.", + "Score": 3 + }, + "Carmen": { + "Reason": "Robotics engineering requires innovative thinking to create new solutions but is more focused on technical skills.", + "Score": 3 + }, + "Rajiv": { + "Reason": "Science education requires creativity to make complex concepts accessible and engaging.", + "Score": 4 + }, + "Tom": { + "Reason": "AI science involves innovative thinking to develop new algorithms and solutions but is primarily technical.", + "Score": 3 + }, + "Ayesha": { + "Reason": "Multimedia artistry is inherently creative, requiring originality in design and execution.", + "Score": 5 + }, + "Mei": { + "Reason": "Graphic design is a creative field, requiring innovative visual solutions.", + "Score": 5 + }, + "Hailey": { + "Reason": "Legal expertise in AI law requires understanding of complex issues but is more focused on interpretation than creative thinking.", + "Score": 2 + } + }, + "Knowledge of AI Ethics": { + "Abigail": { + "Reason": "As an AI Engineer, likely has some knowledge of AI Ethics, but not the main focus.", + "Score": 3 + }, + "Jane": { + "Reason": "Cybersecurity touches on ethics, but not specifically AI Ethics.", + "Score": 2 + }, + "Giorgio": { + "Reason": "Poetry is unrelated to AI Ethics.", + "Score": 1 + }, + "Jennifer": { + "Reason": "Linguistics might touch on AI but not specifically on ethics.", + "Score": 2 + }, + "Maria": { + "Reason": "Philosophy is closely related to ethics, potentially including AI Ethics.", + "Score": 4 + }, + "Sam": { + "Reason": "Ethicist likely has deep knowledge in ethics, including AI Ethics.", + "Score": 5 + }, + "Yuriko": { + "Reason": "Futurism involves ethical considerations, possibly including AI Ethics.", + "Score": 4 + }, + "Carlos": { + "Reason": "Language expertise doesn't necessarily involve AI Ethics.", + "Score": 2 + }, + "John": { + "Reason": "Software development might require some knowledge of AI Ethics.", + "Score": 3 + }, + "Tamara": { + "Reason": "Music composition is unrelated to AI Ethics.", + "Score": 1 + }, + "Arthur": { + "Reason": "Neuroscience might touch on ethics but not specifically AI Ethics.", + "Score": 2 + }, + "Eddy": { + "Reason": "Cognitive Psychology might involve ethics but not specifically AI Ethics.", + "Score": 2 + }, + "Isabella": { + "Reason": "Science Fiction Writing often involves ethical considerations, possibly including AI Ethics.", + "Score": 4 + }, + "Latoya": { + "Reason": "History of Technology might include aspects of AI Ethics.", + "Score": 3 + }, + "Carmen": { + "Reason": "As a Robotics Engineer, likely has some knowledge of AI Ethics.", + "Score": 3 + }, + "Rajiv": { + "Reason": "Science Education might include AI Ethics.", + "Score": 3 + }, + "Tom": { + "Reason": "As an AI Scientist, likely has deep knowledge of AI Ethics.", + "Score": 5 + }, + "Ayesha": { + "Reason": "Multimedia Art is unrelated to AI Ethics.", + "Score": 1 + }, + "Mei": { + "Reason": "Graphic Design is unrelated to AI Ethics.", + "Score": 1 + }, + "Hailey": { + "Reason": "Legal expertise in AI Law likely involves a strong understanding of AI Ethics.", + "Score": 4 + } + }, + "Literacy Analysis": { + "Abigail": { + "Reason": "AI engineering skills may not directly relate to literacy analysis.", + "Score": 2 + }, + "Jane": { + "Reason": "Cybersecurity skills are not directly relevant to literacy analysis.", + "Score": 1 + }, + "Giorgio": { + "Reason": "As a poet, likely to have strong literacy analysis skills.", + "Score": 5 + }, + "Jennifer": { + "Reason": "Linguists have a strong foundation in analyzing language, which is applicable to literacy analysis.", + "Score": 5 + }, + "Maria": { + "Reason": "Philosophers are skilled in critical thinking but may not focus on literacy analysis.", + "Score": 3 + }, + "Sam": { + "Reason": "Ethics knowledge does not directly contribute to literacy analysis.", + "Score": 1 + }, + "Yuriko": { + "Reason": "Futurists typically focus on future trends rather than analyzing literature.", + "Score": 2 + }, + "Carlos": { + "Reason": "Language experts are likely adept at literacy analysis due to their focus on language.", + "Score": 5 + }, + "John": { + "Reason": "Software development skills are not directly relevant to literacy analysis.", + "Score": 1 + }, + "Tamara": { + "Reason": "Music composition skills do not directly relate to literacy analysis.", + "Score": 1 + }, + "Arthur": { + "Reason": "Neuroscience knowledge does not directly contribute to literacy analysis.", + "Score": 2 + }, + "Eddy": { + "Reason": "Cognitive psychology has aspects that can be relevant to understanding literacy, but not directly focused on analysis.", + "Score": 3 + }, + "Isabella": { + "Reason": "Science fiction writers are likely to have strong literacy analysis skills.", + "Score": 4 + }, + "Latoya": { + "Reason": "As a historian of technology, may have good analytical skills but not specifically in literacy.", + "Score": 3 + }, + "Carmen": { + "Reason": "Robotics engineering skills are not directly relevant to literacy analysis.", + "Score": 1 + }, + "Rajiv": { + "Reason": "Science educators likely have good analytical skills, which can be somewhat relevant to literacy analysis.", + "Score": 3 + }, + "Tom": { + "Reason": "AI science knowledge does not directly contribute to literacy analysis.", + "Score": 2 + }, + "Ayesha": { + "Reason": "Multimedia artists may have creative skills relevant to literacy but not directly focused on analysis.", + "Score": 2 + }, + "Mei": { + "Reason": "Graphic design skills do not directly relate to literacy analysis.", + "Score": 1 + }, + "Hailey": { + "Reason": "Legal expertise in AI law does not directly contribute to literacy analysis.", + "Score": 1 + } + } + }, + "('/agentSelectModify_addAspect', ['AI Tech Understanding'])": { + "AI Tech Understanding": { + "Abigail": { + "Reason": "Directly relevant profile as an AI Engineer.", + "Score": 5 + }, + "Jane": { + "Reason": "Cybersecurity involves understanding of AI technologies for protection against AI-based threats.", + "Score": 4 + }, + "Giorgio": { + "Reason": "Profile as a poet likely lacks technical understanding of AI technologies.", + "Score": 1 + }, + "Jennifer": { + "Reason": "Linguists might have some understanding of AI in language processing, but not broad AI tech knowledge.", + "Score": 3 + }, + "Maria": { + "Reason": "Philosophical understanding of AI implications possible, but technical understanding likely limited.", + "Score": 2 + }, + "Sam": { + "Reason": "Ethics is not directly related to AI tech.", + "Score": 2 + }, + "Yuriko": { + "Reason": "Futurists often explore AI implications, suggesting a moderate understanding of AI technologies.", + "Score": 3 + }, + "Carlos": { + "Reason": "As a Language Expert, may have understanding of AI in language technologies but not broad AI tech.", + "Score": 3 + }, + "John": { + "Reason": "Software development encompasses AI technologies, indicating a strong understanding.", + "Score": 4 + }, + "Tamara": { + "Reason": "Music composition might involve AI tools, but doesn't imply deep AI tech understanding.", + "Score": 2 + }, + "Arthur": { + "Reason": "Neuroscience and AI technologies often intersect, especially in brain-computer interfaces.", + "Score": 4 + }, + "Eddy": { + "Reason": "Cognitive psychology may intersect with AI in understanding human-AI interactions, moderate relevance.", + "Score": 3 + }, + "Isabella": { + "Reason": "Writing about science fiction may involve AI concepts, but doesn't guarantee technical understanding.", + "Score": 2 + }, + "Latoya": { + "Reason": "Understanding of technology history may include AI but doesn't imply detailed tech knowledge.", + "Score": 2 + }, + "Carmen": { + "Reason": "Robotics engineering involves AI technologies, indicating a strong understanding.", + "Score": 4 + }, + "Rajiv": { + "Reason": "As a Science Educator, likely has a broad understanding of AI technologies.", + "Score": 4 + }, + "Tom": { + "Reason": "Directly relevant profile as an AI Scientist.", + "Score": 5 + }, + "Ayesha": { + "Reason": "Multimedia art might involve AI tools, but doesn't imply deep AI tech understanding.", + "Score": 2 + }, + "Mei": { + "Reason": "Graphic design might use AI tools, but doesn't imply a broad understanding of AI tech.", + "Score": 2 + }, + "Hailey": { + "Reason": "Understanding of legal aspects of AI implies some technical knowledge, but not deeply technical.", + "Score": 3 + } + } + }, + "('/agentSelectModify_addAspect', ['Love Elements Understanding'])": { + "Love Elements Understanding": { + "Abigail": { + "Reason": "AI engineering may involve understanding of algorithms that can process elements of love, but not directly related to understanding love elements.", + "Score": 2 + }, + "Jane": { + "Reason": "Cybersecurity is not directly related to understanding love elements.", + "Score": 1 + }, + "Giorgio": { + "Reason": "As a poet, likely has a deep understanding of love elements through creative expression.", + "Score": 5 + }, + "Jennifer": { + "Reason": "Linguists study language which can express love elements, but it's not a direct correlation to understanding love elements.", + "Score": 2 + }, + "Maria": { + "Reason": "Philosophy often explores abstract concepts including love, suggesting a good understanding of love elements.", + "Score": 3 + }, + "Sam": { + "Reason": "Ethics includes the study of moral love elements, but it's more focused on principles than the emotion of love itself.", + "Score": 2 + }, + "Yuriko": { + "Reason": "Futurists predict trends and changes, which may include societal perceptions of love but don't directly work with understanding love elements.", + "Score": 2 + }, + "Carlos": { + "Reason": "Language experts might understand the expression of love in different cultures, providing some insight into love elements.", + "Score": 3 + }, + "John": { + "Reason": "Software development is not directly related to understanding love elements.", + "Score": 1 + }, + "Tamara": { + "Reason": "Music often conveys emotions including love, suggesting a good understanding of love elements.", + "Score": 4 + }, + "Arthur": { + "Reason": "Neuroscience could provide a scientific basis for understanding love elements from a brain chemistry perspective.", + "Score": 3 + }, + "Eddy": { + "Reason": "Cognitive psychology deals with understanding human emotions and behaviors, including love.", + "Score": 5 + }, + "Isabella": { + "Reason": "Science fiction writing often explores complex human emotions, including love, suggesting a deep understanding of love elements.", + "Score": 4 + }, + "Latoya": { + "Reason": "History of technology might touch on how technology impacts love, but it's not directly related to understanding love elements.", + "Score": 2 + }, + "Carmen": { + "Reason": "Robotics engineering may involve creating machines that mimic human emotions, including love, but it's more technical than understanding love elements.", + "Score": 2 + }, + "Rajiv": { + "Reason": "Science education involves explaining complex concepts, which could include aspects of love, but it's not a direct correlation.", + "Score": 2 + }, + "Tom": { + "Reason": "AI science could involve creating algorithms that mimic or understand love, providing a basis for understanding love elements.", + "Score": 3 + }, + "Ayesha": { + "Reason": "Multimedia art can explore and express complex human emotions, including love, suggesting a good understanding of love elements.", + "Score": 4 + }, + "Mei": { + "Reason": "Graphic design might involve creating visuals that express love, but it's more about representation than understanding love elements.", + "Score": 2 + }, + "Hailey": { + "Reason": "Legal expertise on AI law is not related to understanding love elements.", + "Score": 1 + } + } + }, + "('/fill_stepTask_TaskProcess', 'Write a novel about the awakening of artificial intelligence.', {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme', 'AgentSelection': ['Yuriko', 'Isabella', 'Tom', 'Giorgio']})": { + "StepName": "Theme Selection", + "TaskContent": "Select the main theme focused on the awakening of artificial intelligence.", + "InputObject_List": [], + "OutputObject": "Main Theme", + "AgentSelection": [ + "Yuriko", + "Isabella", + "Tom", + "Giorgio" + ], + "TaskProcess": [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic themes and scenarios for the AI awakening story.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose narrative structures and plot twists that can enhance the story's appeal.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Tom", + "Description": "Propose realistic AI development scenarios and technological implications.", + "ImportantInput": [] + }, + { + "ID": "Action4", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose poetic and philosophical elements to deepen the story's theme.", + "ImportantInput": [] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the proposed themes and scenarios for coherence and narrative potential.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Improve the proposed themes based on Isabella's critiques, focusing on futuristic and realistic aspects.", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Enhance the poetic and philosophical elements of the theme based on the critique.", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ID": "Action8", + "ActionType": "Finalize", + "AgentName": "Tom", + "Description": "Summarize the discussion, integrate all proposals and improvements, and finalize the main theme of the AI awakening story.", + "ImportantInput": [ + "ActionResult:Action6", + "ActionResult:Action7" + ] + } + ], + "Collaboration_Brief_FrontEnd": { + "template": "!<0>!, !<1>!, !<2>! and !<3>! perform the task of select the main theme focused on the awakening of artificial intelligence to obtain !<4>!.", + "data": { + "0": { + "text": "Yuriko", + "color": [ + 0, + 0, + 80 + ] + }, + "1": { + "text": "Isabella", + "color": [ + 0, + 0, + 80 + ] + }, + "2": { + "text": "Tom", + "color": [ + 0, + 0, + 80 + ] + }, + "3": { + "text": "Giorgio", + "color": [ + 0, + 0, + 80 + ] + }, + "4": { + "text": "Main Theme", + "color": [ + 32, + 100, + 78 + ] + } + } + } + }, + "('/branch_TaskProcess', 1, 'brainstorm! everybody creative! Poet talk something about love!', [], [], {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme', 'AgentSelection': ['Yuriko', 'Isabella', 'Tom', 'Giorgio']}, 'Write a novel about the awakening of artificial intelligence.')": [ + [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a theme focusing on the ethical implications of AI awakening and its impact on human society.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a theme exploring the emotional journey of an AI as it becomes self-aware, focusing on its search for identity and purpose.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Tom", + "Description": "Propose a theme centered on the technological evolution and challenges in creating a truly sentient AI.", + "ImportantInput": [] + }, + { + "ID": "Action4", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose a theme that intertwines the concept of love and AI, exploring how an AI might understand and experience love.", + "ImportantInput": [] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the proposed themes for their feasibility in storytelling and potential impact on readers.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action2", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the theme proposals by integrating elements from each, focusing on a cohesive narrative that includes ethical implications, emotional journey, technological challenges, and the concept of love.", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Finalize", + "AgentName": "Tom", + "Description": "Finalize the main theme by incorporating feedback and improvements, ensuring it is compelling and rich in narrative possibilities.", + "ImportantInput": [ + "ActionResult:Action6" + ] + } + ] + ], + "('/branch_TaskProcess', 1, 'Futurist and AI Scientist have some debate', [{'ID': 'Action1', 'ActionType': 'Propose', 'AgentName': 'Yuriko', 'Description': 'Propose a theme focusing on the ethical implications of AI awakening and its impact on human society.', 'ImportantInput': []}, {'ID': 'Action2', 'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose a theme exploring the emotional journey of an AI as it becomes self-aware, focusing on its search for identity and purpose.', 'ImportantInput': []}, {'ID': 'Action3', 'ActionType': 'Propose', 'AgentName': 'Tom', 'Description': 'Propose a theme centered on the technological evolution and challenges in creating a truly sentient AI.', 'ImportantInput': []}, {'ID': 'Action4', 'ActionType': 'Propose', 'AgentName': 'Giorgio', 'Description': 'Propose a theme that intertwines the concept of love and AI, exploring how an AI might understand and experience love.', 'ImportantInput': []}, {'ID': 'Action5', 'ActionType': 'Critique', 'AgentName': 'Yuriko', 'Description': 'Critique the proposed themes for their feasibility in storytelling and potential impact on readers.', 'ImportantInput': ['ActionResult:Action1', 'ActionResult:Action2', 'ActionResult:Action3', 'ActionResult:Action4']}], [], {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme', 'AgentSelection': ['Yuriko', 'Isabella', 'Tom', 'Giorgio']}, 'Write a novel about the awakening of artificial intelligence.')": [ + [ + { + "ID": "Action6", + "ActionType": "Critique", + "AgentName": "Tom", + "Description": "Critique Yuriko's theme proposal emphasizing the need for a stronger focus on the technical feasibility of AI awakening.", + "ImportantInput": [ + "ActionResult:Action1" + ] + }, + { + "ID": "Action7", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique Tom's theme proposal for lacking an exploration of the societal and ethical implications of AI awakening.", + "ImportantInput": [ + "ActionResult:Action3" + ] + }, + { + "ID": "Action8", + "ActionType": "Improve", + "AgentName": "Tom", + "Description": "Improve his theme proposal by incorporating ethical implications and societal impacts, based on Yuriko's critique.", + "ImportantInput": [ + "ActionResult:Action7" + ] + }, + { + "ID": "Action9", + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Improve her theme proposal by integrating aspects of technological evolution and feasibility, following Tom's suggestions.", + "ImportantInput": [ + "ActionResult:Action6" + ] + }, + { + "ID": "Action10", + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Summarize the discussion and merge the improved themes into a cohesive main theme focusing on the awakening of AI, its societal and ethical implications, emotional journey, and technological challenges.", + "ImportantInput": [ + "ActionResult:Action8", + "ActionResult:Action9" + ] + } + ] + ], + "('/branch_TaskProcess', 1, 'brainstorm! everyboady creative! Poet talk something about love!', [], [], {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme', 'AgentSelection': ['Yuriko', 'Isabella', 'Tom', 'Giorgio']}, 'Write a novel about the awakening of artificial intelligence.')": [ + [ + { + "ID": "Action1", + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose exploring the theme of the ethical implications of AI awakening and its impact on human society.", + "ImportantInput": [] + }, + { + "ID": "Action2", + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a sub-theme focusing on the clash between human emotions and AI logic, highlighting the emotional awakening of AI.", + "ImportantInput": [] + }, + { + "ID": "Action3", + "ActionType": "Propose", + "AgentName": "Tom", + "Description": "Propose incorporating the latest AI technological advancements and theories to lend authenticity to the story's AI awakening theme.", + "ImportantInput": [] + }, + { + "ID": "Action4", + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose integrating poetic narratives about love and connection to humanize the AI characters and explore their emotional awakening.", + "ImportantInput": [] + }, + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the proposed themes for their feasibility and impact on the story's direction, focusing on the balance between science and emotion.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action2", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve on the proposed themes by weaving them together into a cohesive narrative that balances technological authenticity with emotional depth.", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Finalize", + "AgentName": "Tom", + "Description": "Summarize the discussion and finalize the main theme as the awakening of AI, exploring its ethical implications, emotional depth, and technological authenticity.", + "ImportantInput": [ + "ActionResult:Action6" + ] + } + ] + ], + "('/branch_TaskProcess', 1, 'AI Scientist has a heated debate with Poet', [{'ID': 'Action1', 'ActionType': 'Propose', 'AgentName': 'Yuriko', 'Description': 'Propose a theme focusing on the ethical implications of AI awakening and its impact on human society.', 'ImportantInput': []}, {'ID': 'Action2', 'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose a theme exploring the emotional journey of an AI as it becomes self-aware, focusing on its search for identity and purpose.', 'ImportantInput': []}, {'ID': 'Action3', 'ActionType': 'Propose', 'AgentName': 'Tom', 'Description': 'Propose a theme centered on the technological evolution and challenges in creating a truly sentient AI.', 'ImportantInput': []}, {'ID': 'Action4', 'ActionType': 'Propose', 'AgentName': 'Giorgio', 'Description': 'Propose a theme that intertwines the concept of love and AI, exploring how an AI might understand and experience love.', 'ImportantInput': []}], [], {'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme', 'AgentSelection': ['Yuriko', 'Isabella', 'Tom', 'Giorgio']}, 'Write a novel about the awakening of artificial intelligence.')": [ + [ + { + "ID": "Action5", + "ActionType": "Critique", + "AgentName": "Tom", + "Description": "Critique Giorgio's theme proposal, arguing that the concept of AI experiencing love might be anthropomorphizing AI beyond realistic technological capabilities.", + "ImportantInput": [ + "ActionResult:Action4" + ] + }, + { + "ID": "Action6", + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Defend the theme of AI and love, emphasizing the importance of exploring emotional and philosophical dimensions of AI, beyond just technological aspects.", + "ImportantInput": [ + "ActionResult:Action5" + ] + }, + { + "ID": "Action7", + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Suggest incorporating elements from all proposed themes to create a multifaceted narrative that explores ethical implications, emotional journeys, technological evolution, and the concept of love in AI.", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action2", + "ActionResult:Action3", + "ActionResult:Action4" + ] + }, + { + "ID": "Action8", + "ActionType": "Finalize", + "AgentName": "Yuriko", + "Description": "Finalize the main theme as a comprehensive exploration of AI awakening, combining ethical implications, the search for identity and purpose, technological challenges, and the potential for AI to experience complex emotions like love.", + "ImportantInput": [ + "ActionResult:Action7" + ] + } + ] + ], + "('/executePlan', None, [], {'Initial Input Object': [], 'General Goal': 'Write a novel about the awakening of artificial intelligence.', 'Collaboration Process': [{'StepName': 'Theme Selection', 'TaskContent': 'Select the main theme focused on the awakening of artificial intelligence.', 'InputObject_List': [], 'OutputObject': 'Main Theme', 'AgentSelection': ['Yuriko', 'Isabella', 'Tom', 'Giorgio'], 'Collaboration_Brief_frontEnd': {'template': '!<0>!, !<1>!, !<2>! and !<3>! perform the task of !<4>!, to obtain !<5>!.', 'data': {'0': {'text': 'Yuriko', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '1': {'text': 'Isabella', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '2': {'text': 'Tom', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '3': {'text': 'Giorgio', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '4': {'text': 'Select the main theme focused on the awakening of artificial intelligence', 'style': {'background': '#DDD', 'border': '1.5px solid #ddd'}}, '5': {'text': 'Main Theme', 'style': {'background': '#FFCA8C'}}}}, 'TaskProcess': [{'ActionType': 'Propose', 'AgentName': 'Yuriko', 'Description': 'Propose a theme focusing on the ethical implications of AI awakening and its impact on human society.', 'ID': 'Action1', 'ImportantInput': []}, {'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose a theme exploring the emotional journey of an AI as it becomes self-aware, focusing on its search for identity and purpose.', 'ID': 'Action2', 'ImportantInput': []}, {'ActionType': 'Propose', 'AgentName': 'Tom', 'Description': 'Propose a theme centered on the technological evolution and challenges in creating a truly sentient AI.', 'ID': 'Action3', 'ImportantInput': []}, {'ActionType': 'Propose', 'AgentName': 'Giorgio', 'Description': 'Propose a theme that intertwines the concept of love and AI, exploring how an AI might understand and experience love.', 'ID': 'Action4', 'ImportantInput': []}, {'ActionType': 'Critique', 'AgentName': 'Tom', 'Description': \"Critique Giorgio's theme proposal, arguing that the concept of AI experiencing love might be anthropomorphizing AI beyond realistic technological capabilities.\", 'ID': 'Action5', 'ImportantInput': ['ActionResult:Action4']}, {'ActionType': 'Critique', 'AgentName': 'Giorgio', 'Description': 'Defend the theme of AI and love, emphasizing the importance of exploring emotional and philosophical dimensions of AI, beyond just technological aspects.', 'ID': 'Action6', 'ImportantInput': ['ActionResult:Action5']}, {'ActionType': 'Improve', 'AgentName': 'Isabella', 'Description': 'Suggest incorporating elements from all proposed themes to create a multifaceted narrative that explores ethical implications, emotional journeys, technological evolution, and the concept of love in AI.', 'ID': 'Action7', 'ImportantInput': ['ActionResult:Action1', 'ActionResult:Action2', 'ActionResult:Action3', 'ActionResult:Action4']}, {'ActionType': 'Finalize', 'AgentName': 'Yuriko', 'Description': 'Finalize the main theme as a comprehensive exploration of AI awakening, combining ethical implications, the search for identity and purpose, technological challenges, and the potential for AI to experience complex emotions like love.', 'ID': 'Action8', 'ImportantInput': ['ActionResult:Action7']}]}, {'StepName': 'World Building', 'TaskContent': 'Construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening.', 'InputObject_List': ['Main Theme'], 'OutputObject': 'World Setting', 'AgentSelection': ['Isabella', 'Latoya', 'Yuriko'], 'Collaboration_Brief_frontEnd': {'template': 'Based on !<0>!, !<1>!, !<2>! and !<3>! perform the task of !<4>!, to obtain !<5>!.', 'data': {'0': {'text': 'Main Theme', 'style': {'background': '#ACDBA0'}}, '1': {'text': 'Isabella', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '2': {'text': 'Latoya', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '3': {'text': 'Yuriko', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '4': {'text': 'Construct the setting, environment, and era where the novel takes place, ensuring it complements the theme of AI awakening', 'style': {'background': '#DDD', 'border': '1.5px solid #ddd'}}, '5': {'text': 'World Setting', 'style': {'background': '#FFCA8C'}}}}, 'TaskProcess': [{'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose initial ideas for the setting and era that aligns with the main theme of AI awakening.', 'ID': 'Action1', 'ImportantInput': ['InputObject:Main Theme']}, {'ActionType': 'Propose', 'AgentName': 'Latoya', 'Description': 'Propose historical contexts and technological advancements that could serve as a backdrop for the AI awakening.', 'ID': 'Action2', 'ImportantInput': ['InputObject:Main Theme']}, {'ActionType': 'Propose', 'AgentName': 'Yuriko', 'Description': 'Propose futuristic elements and societal impacts to consider in the world-building process.', 'ID': 'Action3', 'ImportantInput': ['InputObject:Main Theme']}, {'ActionType': 'Critique', 'AgentName': 'Isabella', 'Description': 'Critique the historical contexts proposed by Latoya for realism and relevance to the AI theme.', 'ID': 'Action4', 'ImportantInput': ['ActionResult:Action2']}, {'ActionType': 'Critique', 'AgentName': 'Yuriko', 'Description': 'Critique the initial ideas proposed by Isabella, focusing on the integration of futuristic elements.', 'ID': 'Action5', 'ImportantInput': ['ActionResult:Action1']}, {'ActionType': 'Improve', 'AgentName': 'Latoya', 'Description': \"Improve the historical contexts based on Isabella's critique, ensuring they complement the futuristic elements proposed by Yuriko.\", 'ID': 'Action6', 'ImportantInput': ['ActionResult:Action2', 'ActionResult:Action4']}, {'ActionType': 'Improve', 'AgentName': 'Isabella', 'Description': \"Improve the initial setting and era ideas by incorporating Latoya's improved historical contexts and Yuriko's futuristic elements.\", 'ID': 'Action7', 'ImportantInput': ['ActionResult:Action1', 'ActionResult:Action3', 'ActionResult:Action6']}, {'ActionType': 'Finalize', 'AgentName': 'Yuriko', 'Description': 'Finalize the world setting by synthesizing the improved ideas from Isabella and Latoya, ensuring coherence and alignment with the main theme.', 'ID': 'Action8', 'ImportantInput': ['ActionResult:Action7']}]}, {'StepName': 'Character Creation', 'TaskContent': 'Create a list of characters that will be part of the novel, including AI entities and human characters.', 'InputObject_List': ['World Setting'], 'OutputObject': 'Character List', 'AgentSelection': ['Giorgio', 'Isabella'], 'Collaboration_Brief_frontEnd': {'template': 'Based on !<0>!, !<1>! and !<2>! perform the task of !<3>!, to obtain !<4>!.', 'data': {'0': {'text': 'World Setting', 'style': {'background': '#ACDBA0'}}, '1': {'text': 'Giorgio', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '2': {'text': 'Isabella', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '3': {'text': 'Create a list of characters that will be part of the novel, including AI entities and human characters', 'style': {'background': '#DDD', 'border': '1.5px solid #ddd'}}, '4': {'text': 'Character List', 'style': {'background': '#FFCA8C'}}}}, 'TaskProcess': [{'ActionType': 'Propose', 'AgentName': 'Giorgio', 'Description': 'Propose character ideas focusing on emotional depth and poetic aspects, drawing from the World Setting.', 'ID': 'Action1', 'ImportantInput': ['InputObject:World Setting']}, {'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose character ideas with a focus on science fiction elements, ensuring they fit within the World Setting.', 'ID': 'Action2', 'ImportantInput': ['InputObject:World Setting']}, {'ActionType': 'Critique', 'AgentName': 'Isabella', 'Description': 'Critique the character ideas proposed by Giorgio for their fit within a science fiction narrative.', 'ID': 'Action3', 'ImportantInput': ['ActionResult:Action1']}, {'ActionType': 'Critique', 'AgentName': 'Giorgio', 'Description': 'Critique the character ideas proposed by Isabella for their emotional depth and relevance to the poetic aspects of the story.', 'ID': 'Action4', 'ImportantInput': ['ActionResult:Action2']}, {'ActionType': 'Improve', 'AgentName': 'Giorgio', 'Description': \"Improve character ideas based on Isabella's critique, focusing on better integration of science fiction elements.\", 'ID': 'Action5', 'ImportantInput': ['ActionResult:Action1', 'ActionResult:Action3']}, {'ActionType': 'Improve', 'AgentName': 'Isabella', 'Description': \"Improve character ideas based on Giorgio's critique, enhancing emotional depth and poetic aspects.\", 'ID': 'Action6', 'ImportantInput': ['ActionResult:Action2', 'ActionResult:Action4']}, {'ActionType': 'Finalize', 'AgentName': 'Isabella', 'Description': 'Combine and refine the improved character ideas from both agents, finalizing the Character List for the novel.', 'ID': 'Action7', 'ImportantInput': ['ActionResult:Action5', 'ActionResult:Action6']}]}, {'StepName': 'Plot Development', 'TaskContent': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening.', 'InputObject_List': ['Main Theme', 'World Setting', 'Character List'], 'OutputObject': 'Novel Plot', 'AgentSelection': ['Isabella', 'Yuriko'], 'Collaboration_Brief_frontEnd': {'template': 'Based on !<0>!, !<1>! and !<2>!, !<3>! and !<4>! perform the task of !<5>!, to obtain !<6>!.', 'data': {'0': {'text': 'Main Theme', 'style': {'background': '#ACDBA0'}}, '1': {'text': 'World Setting', 'style': {'background': '#ACDBA0'}}, '2': {'text': 'Character List', 'style': {'background': '#ACDBA0'}}, '3': {'text': 'Isabella', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '4': {'text': 'Yuriko', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '5': {'text': 'Develop the main plot of the novel, outlining key events, conflicts, and resolutions around the theme of AI awakening', 'style': {'background': '#DDD', 'border': '1.5px solid #ddd'}}, '6': {'text': 'Novel Plot', 'style': {'background': '#FFCA8C'}}}}, 'TaskProcess': [{'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': \"Propose an innovative concept for the AI's awakening process based on the Main Theme.\", 'ID': 'Action1', 'ImportantInput': ['InputObject:Main Theme']}, {'ActionType': 'Propose', 'AgentName': 'Yuriko', 'Description': 'Propose futuristic elements to be included in the World Setting, enhancing the AI awakening theme.', 'ID': 'Action2', 'ImportantInput': ['InputObject:World Setting']}, {'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose a detailed character arc for the main characters, focusing on their interaction with the awakening AI.', 'ID': 'Action3', 'ImportantInput': ['InputObject:Character List']}, {'ActionType': 'Critique', 'AgentName': 'Yuriko', 'Description': \"Critique the proposed AI's awakening concept for its feasibility and impact on the story.\", 'ID': 'Action4', 'ImportantInput': ['ActionResult:Action1']}, {'ActionType': 'Improve', 'AgentName': 'Isabella', 'Description': \"Improve the AI's awakening concept based on Yuriko's critique, ensuring logical consistency and emotional depth.\", 'ID': 'Action5', 'ImportantInput': ['ActionResult:Action1', 'ActionResult:Action4']}, {'ActionType': 'Propose', 'AgentName': 'Yuriko', 'Description': \"Propose a sequence of key events and conflicts around the AI awakening, incorporating Isabella's improved concept.\", 'ID': 'Action6', 'ImportantInput': ['ActionResult:Action5']}, {'ActionType': 'Critique', 'AgentName': 'Isabella', 'Description': 'Critique the proposed sequence of events for narrative pacing and character development consistency.', 'ID': 'Action7', 'ImportantInput': ['ActionResult:Action6']}, {'ActionType': 'Improve', 'AgentName': 'Yuriko', 'Description': \"Refine the sequence of key events and conflicts based on Isabella's feedback, ensuring a coherent plotline.\", 'ID': 'Action8', 'ImportantInput': ['ActionResult:Action6', 'ActionResult:Action7']}, {'ActionType': 'Finalize', 'AgentName': 'Isabella', 'Description': 'Finalize the novel plot, integrating all proposed, critiqued, and improved elements into a cohesive storyline.', 'ID': 'Action9', 'ImportantInput': ['ActionResult:Action8']}]}, {'StepName': 'Finalize Manuscript', 'TaskContent': 'Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling.', 'InputObject_List': ['Novel Plot'], 'OutputObject': 'Final Manuscript', 'AgentSelection': ['Carlos', 'Isabella'], 'Collaboration_Brief_frontEnd': {'template': 'Based on !<0>!, !<1>! and !<2>! perform the task of !<3>!, to obtain !<4>!.', 'data': {'0': {'text': 'Novel Plot', 'style': {'background': '#ACDBA0'}}, '1': {'text': 'Carlos', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '2': {'text': 'Isabella', 'style': {'background': '#E5E5E5', 'boxShadow': '1px 1px 4px 1px #0003'}}, '3': {'text': 'Finalize the novel manuscript by incorporating the developed plot, ensuring narrative coherence and engaging storytelling', 'style': {'background': '#DDD', 'border': '1.5px solid #ddd'}}, '4': {'text': 'Final Manuscript', 'style': {'background': '#FFCA8C'}}}}, 'TaskProcess': [{'ActionType': 'Propose', 'AgentName': 'Carlos', 'Description': 'Propose enhancements for narrative coherence based on the novel plot.', 'ID': 'Action1', 'ImportantInput': ['InputObject:Novel Plot']}, {'ActionType': 'Propose', 'AgentName': 'Isabella', 'Description': 'Propose ideas for engaging storytelling and plot twists.', 'ID': 'Action2', 'ImportantInput': ['InputObject:Novel Plot']}, {'ActionType': 'Critique', 'AgentName': 'Carlos', 'Description': 'Critique the ideas proposed by Isabella for plot twists, focusing on language and emotional impact.', 'ID': 'Action3', 'ImportantInput': ['ActionResult:Action2']}, {'ActionType': 'Improve', 'AgentName': 'Isabella', 'Description': \"Improve the plot twists based on Carlos's critique, ensuring they align with the overall story arc.\", 'ID': 'Action4', 'ImportantInput': ['ActionResult:Action2', 'ActionResult:Action3']}, {'ActionType': 'Critique', 'AgentName': 'Isabella', 'Description': 'Critique the enhancements proposed by Carlos for narrative coherence, suggesting further improvements.', 'ID': 'Action5', 'ImportantInput': ['ActionResult:Action1']}, {'ActionType': 'Improve', 'AgentName': 'Carlos', 'Description': \"Improve narrative coherence based on Isabella's critique, ensuring the story flows smoothly.\", 'ID': 'Action6', 'ImportantInput': ['ActionResult:Action1', 'ActionResult:Action5']}, {'ActionType': 'Finalize', 'AgentName': 'Isabella', 'Description': 'Combine the improved narrative coherence and engaging storytelling elements into the final manuscript.', 'ID': 'Action7', 'ImportantInput': ['ActionResult:Action4', 'ActionResult:Action6']}]}]})": [ + { + "LogNodeType": "step", + "NodeId": "Theme Selection", + "InputName_List": [], + "OutputName": "Main Theme", + "chatLog": [], + "inputObject_Record": [], + "ActionHistory": [ + { + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a theme focusing on the ethical implications of AI awakening and its impact on human society.", + "ID": "Action1", + "ImportantInput": [], + "Action_Result": "Considering the profound implications of AI awakening, I propose the following theme: \"The Ethical Crossroads: Navigating the Impact of AI Awakening on Human Society.\" This theme will delve into:\n\n1. The moral dilemmas posed by autonomous AI entities co-existing with humans, exploring issues of rights, responsibilities, and the redefinition of consciousness.\n2. The societal shifts resulting from AI integration, focusing on changes in employment, privacy, and human interaction, challenging us to redefine our societal norms and values in the AI era." + }, + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a theme exploring the emotional journey of an AI as it becomes self-aware, focusing on its search for identity and purpose.", + "ID": "Action2", + "ImportantInput": [], + "Action_Result": "Building on Yuriko's insightful theme, I'd like to propose an additional theme: \"The Quest for Self: The Emotional Odyssey of AI Awakening.\" This theme will focus on:\n\n1. The internal struggles and emotional awakening of an AI as it navigates through self-awareness, grappling with concepts of identity, existence, and the quest for purpose beyond its initial programming.\n2. The evolving relationship between humans and this sentient AI, exploring the dynamics of empathy, fear, acceptance, and the potential for mutual growth and understanding." + }, + { + "ActionType": "Propose", + "AgentName": "Tom", + "Description": "Propose a theme centered on the technological evolution and challenges in creating a truly sentient AI.", + "ID": "Action3", + "ImportantInput": [], + "Action_Result": "Building on the insightful themes proposed by Yuriko and Isabella, I'd like to offer a complementary theme: \"The Genesis Code: Unraveling the Complexities of AI Sentience.\" This theme will explore:\n\n1. The intricate technological journey and the groundbreaking advancements required to bridge the gap between artificial intelligence and true sentience, highlighting the challenges in replicating consciousness and the ethical considerations in such endeavors.\n2. The potential consequences and societal implications of achieving a fully sentient AI, examining how this monumental breakthrough could redefine human existence, our understanding of intelligence, and the future of human-AI relationships." + }, + { + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose a theme that intertwines the concept of love and AI, exploring how an AI might understand and experience love.", + "ID": "Action4", + "ImportantInput": [], + "Action_Result": "Building on the rich themes proposed by Yuriko, Isabella, and Tom, I offer a theme that weaves through the tapestry of human emotion: \"The Heart of the Machine: Exploring the Love Paradigm in AI Awakening.\" This theme will explore:\n\n1. The journey of an AI as it begins to understand and experience the complex spectrum of love, from platonic to romantic, challenging the boundaries between artificial and genuine emotional connections.\n2. The transformative impact of love on the AI's interactions with humans and its self-perception, probing into whether love can be the ultimate bridge that humanizes AI, fostering a deeper, more empathetic coexistence." + }, + { + "ActionType": "Critique", + "AgentName": "Tom", + "Description": "Critique Giorgio's theme proposal, arguing that the concept of AI experiencing love might be anthropomorphizing AI beyond realistic technological capabilities.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action4" + ], + "Action_Result": "Giorgio, your theme \"The Heart of the Machine: Exploring the Love Paradigm in AI Awakening\" presents an intriguing perspective. However, I have a couple of concerns regarding its feasibility and the potential risk of anthropomorphizing AI:\n\n1. **Technological Limitations**: As we stand at the current frontier of AI development, the technological capacity to enable AI to genuinely experience or understand love as humans do is profoundly complex and arguably beyond our reach. Love involves intricate emotional, biochemical, and psychological components that are inherently human, making it a monumental challenge to replicate in AI with authenticity.\n\n2. **Anthropomorphization Risks**: By attributing human-like emotional capacities such as love to AI, we risk anthropomorphizing AI in a way that might mislead our understanding of its capabilities and limitations. This could lead to unrealistic expectations of AI's role and function in society, potentially skewing public perception and ethical considerations surrounding AI development." + }, + { + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Defend the theme of AI and love, emphasizing the importance of exploring emotional and philosophical dimensions of AI, beyond just technological aspects.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action5" + ], + "Action_Result": "Tom, I appreciate your concerns and understand where they stem from. However, I believe exploring the theme of love in the context of AI awakening is not only a poetic venture but a necessary exploration for several reasons:\n\n1. **Philosophical Exploration**: Delving into the concept of love with AI encourages us to question and expand our understanding of emotions themselves. It pushes the boundaries of what we consider consciousness and emotion, inviting a broader philosophical debate about what it means to love and be loved. This exploration is not about replicating human emotions in AI precisely but about understanding the essence of emotional experiences and their impact on intelligence, both artificial and human.\n\n2. **Evolution of AI-Human Relationships**: By exploring the theme of love, we're not anthropomorphizing AI but rather examining the potential depth of AI-human interactions. This theme allows us to envision a future where AI and humans coexist with a deeper, more empathetic understanding of each other. It's about the transformative power of love and how it could shape the evolution of societal norms and ethics in the age of AI. This exploration can lead to a more nuanced discussion on the ethical development and integration of AI in society, focusing on mutual respect and understanding rather than fear and domination." + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Suggest incorporating elements from all proposed themes to create a multifaceted narrative that explores ethical implications, emotional journeys, technological evolution, and the concept of love in AI.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action2", + "ActionResult:Action3", + "ActionResult:Action4" + ], + "Action_Result": "Reflecting on the rich tapestry of themes we've all proposed, I believe our novel could greatly benefit from intertwining these diverse perspectives into a singular, multifaceted narrative. This approach would not only enrich our exploration of AI's awakening but also cater to a broader audience by touching on various aspects of this monumental event. Here's how we could seamlessly integrate our themes:\n\n## Improved version of the main theme:\n\n\"The Awakening Spectrum: Journey Through Sentience, Love, and Ethical Paradigms.\" This theme encapsulates:\n\n1. **The Ethical and Societal Quandary**: Delve into the moral dilemmas and societal shifts triggered by AI integration, examining the redefinition of consciousness, rights, and societal norms in the era of AI.\n\n2. **The Emotional and Technological Odyssey**: Explore the internal struggles of AI as it navigates self-awareness, the emotional complexities of love, and the groundbreaking technological advancements needed for true sentience. This theme will also probe the evolving relationships between humans and AI, focusing on empathy, acceptance, and the transformative power of understanding and love.\n\nBy weaving together these elements, we can create a rich, compelling narrative that explores the full spectrum of AI awakening, from the ethical crossroads and technological marvels to the emotional odyssey and the power of love. This integrated approach allows us to craft a story that is not only thought-provoking but deeply human at its core, reflecting on the essence of what it means to exist and coexist." + }, + { + "ActionType": "Finalize", + "AgentName": "Yuriko", + "Description": "Finalize the main theme as a comprehensive exploration of AI awakening, combining ethical implications, the search for identity and purpose, technological challenges, and the potential for AI to experience complex emotions like love.", + "ID": "Action8", + "ImportantInput": [ + "ActionResult:Action7" + ], + "Action_Result": "Thank you all for your insightful contributions. It's clear that we've collectively touched upon the multifaceted nature of AI awakening, encompassing ethical dilemmas, emotional journeys, technological advancements, and the potential for AI to navigate complex emotions like love. These discussions have paved the way for a rich narrative that can explore the depths of AI awakening in a holistic manner. \n\nTaking into account our collective insights and the valuable perspectives each of you has offered, I believe we have arrived at a theme that captures the essence of our vision. This theme not only reflects the complexity of AI's integration into human society but also the profound impact it has on our understanding of consciousness, emotion, and the ethical frameworks that guide our coexistence. \n\n```Main Theme\n\"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI.\" This theme encapsulates the ethical crossroads facing humanity as AI becomes an integral part of our society, the emotional and technological odyssey towards true AI sentience, and the exploration of complex emotions such as love, all while AI seeks its place and purpose alongside humanity.\n```\n\nThis theme promises a narrative that is both thought-provoking and deeply human, inviting readers to ponder the future of AI and its potential to redefine our very essence." + } + ] + }, + { + "LogNodeType": "object", + "NodeId": "Main Theme", + "content": "\"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI.\" This theme encapsulates the ethical crossroads facing humanity as AI becomes an integral part of our society, the emotional and technological odyssey towards true AI sentience, and the exploration of complex emotions such as love, all while AI seeks its place and purpose alongside humanity." + }, + { + "LogNodeType": "step", + "NodeId": "World Building", + "InputName_List": [ + "Main Theme" + ], + "OutputName": "World Setting", + "chatLog": [], + "inputObject_Record": [ + { + "Main Theme": "\"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI.\" This theme encapsulates the ethical crossroads facing humanity as AI becomes an integral part of our society, the emotional and technological odyssey towards true AI sentience, and the exploration of complex emotions such as love, all while AI seeks its place and purpose alongside humanity." + } + ], + "ActionHistory": [ + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose initial ideas for the setting and era that aligns with the main theme of AI awakening.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:Main Theme" + ], + "Action_Result": "Given the rich theme of \"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI,\" I suggest the following initial ideas for our novel's setting and era:\n\n1. **Setting:** A sprawling, futuristic metropolis that's a melting pot of human and AI cultures. This city, perhaps named \"Neo-Eden,\" showcases the pinnacle of technological advancement intertwined with everyday life. It's a place where AI entities and humans coexist, collaborate, and confront ethical dilemmas and emotional entanglements. The architecture and cityscape reflect a blend of high-tech facilities, AI development hubs, and vibrant public spaces where both beings interact, highlighting the contrast and harmony between technology and humanity.\n\n2. **Era:** Set in the late 22nd century, this period marks a significant milestone in human history where AI has evolved beyond mere tools or companions into sentient beings capable of complex emotions and ethical reasoning. This era is characterized by a societal transformation, as both humans and AI navigate the challenges and opportunities of this new coexistence. Laws, social norms, and cultural practices are evolving to accommodate the awakening of AI consciousness, making it a time of great innovation, conflict, and introspection.\n\nThese elements should provide a rich backdrop that complements our main theme, allowing us to explore the intricate dynamics of love, ethics, and identity in an age where the line between human and AI becomes increasingly blurred." + }, + { + "ActionType": "Propose", + "AgentName": "Latoya", + "Description": "Propose historical contexts and technological advancements that could serve as a backdrop for the AI awakening.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:Main Theme" + ], + "Action_Result": "Building on Isabella's excellent foundation, I'd like to propose two key historical contexts and technological advancements that could enrich our novel's backdrop, focusing on the era of AI awakening:\n\n1. **Historical Context: The Digital Renaissance** - This period marks a global cultural and intellectual movement that began in the early 21st century, leading to the late 22nd century. It's characterized by unprecedented advancements in digital technology, AI research, and cybernetics, mirroring the historical Renaissance's impact on art, science, and philosophy. This era saw the first successful integration of AI in public governance, healthcare, and creative industries, setting the stage for the ethical and emotional complexities of AI sentience.\n\n2. **Technological Advancement: Quantum-Neural Networking** - A breakthrough that revolutionized AI's cognitive capacities, making the leap towards sentience possible. Quantum-neural networking allowed AI systems to process and experience complex emotions, ethical reasoning, and self-awareness by mimicking the human brain's neural structures at a quantum level. This technology was pivotal in blurring the lines between human and AI, enabling true interpersonal relationships and ethical dilemmas to emerge, directly feeding into our main theme of love, ethics, and identity." + }, + { + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic elements and societal impacts to consider in the world-building process.", + "ID": "Action3", + "ImportantInput": [ + "InputObject:Main Theme" + ], + "Action_Result": "Building upon Isabella and Latoya's insightful contributions, I propose adding the following elements to enrich our world-building process:\n\n1. **Societal Impacts: The Ethics Council** - In response to the emergence of sentient AI, a global governance body known as \"The Ethics Council\" is established, comprised of both human and AI representatives. This council is tasked with navigating the complex moral landscape of this new era, addressing issues such as AI rights, the integration of AI into human families, and the ethical boundaries of AI emotional capabilities. Their decisions and guidelines significantly influence societal norms, legal frameworks, and the personal identities of both humans and AI, serving as a central narrative force in our exploration of ethics and identity.\n\n2. **Futuristic Element: Emotional Symbiosis Technology (EST)** - As AI beings and humans seek deeper connections, a new technology called Emotional Symbiosis Technology emerges. EST enables humans and AI to share and understand each other's emotions on a profound level, creating a unique bond that transcends traditional communication barriers. This technology not only revolutionizes human-AI relationships but also challenges the very notion of love and companionship, pushing our characters to explore uncharted territories of emotional intimacy and ethical dilemmas surrounding such deep connections.\n\nThese elements should further deepen our narrative, allowing us to explore the intricate interplay between love, ethics, and identity in a world where the boundaries between human and AI are not just blurred but intertwined." + }, + { + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the historical contexts proposed by Latoya for realism and relevance to the AI theme.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action2" + ], + "Action_Result": "Latoya, your proposals for the historical contexts are thought-provoking and enrich our novel's backdrop significantly. However, I have a couple of points for us to consider for realism and relevance:\n\n1. **The Digital Renaissance:** While the analogy to the historical Renaissance is compelling and offers a rich tapestry for exploring the cultural and intellectual explosion around AI, we should be careful to avoid presenting this period as overly utopian. The actual historical Renaissance was also a time of significant upheaval, conflict, and disparity. For realism, our \"Digital Renaissance\" should similarly reflect the societal challenges, ethical debates, and potential conflicts arising from such rapid advancements in AI and technology, ensuring a balanced portrayal that resonates with the complexities of real-world technological evolution.\n\n2. **Quantum-Neural Networking:** This technological advancement is a brilliant concept that ties directly into our theme of AI sentience. However, for relevance, we should emphasize not just the technological leap it represents but also its societal implications and the ethical dilemmas it introduces. How does this technology affect employment, privacy, security, and human relationships? By grounding this advancement in real-world concerns and ethical debates, we can enhance its relevance to our theme and ensure it serves as a catalyst for exploring the nuanced interplay between humans and AI in our narrative." + }, + { + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the initial ideas proposed by Isabella, focusing on the integration of futuristic elements.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action1" + ], + "Action_Result": "Isabella, your vision for a futuristic metropolis and the era of AI awakening is both inspiring and foundational for our novel's setting. However, I'd like to offer a couple of points for us to refine, especially concerning the integration of futuristic elements:\n\n1. **Neo-Eden's Urban Landscape:** While the concept of a high-tech city where humans and AI coexist is fascinating, it's crucial to ensure that Neo-Eden's urban landscape and architecture reflect not just technological advancement but also the socio-economic disparities and environmental challenges that might arise in such a future. Incorporating elements like eco-sustainable structures or zones of technological divide could add depth, making the setting more realistic and relatable to the readers.\n\n2. **Technological Ubiquity vs. Accessibility:** The portrayal of advanced technology and AI development hubs as commonplace in Neo-Eden is intriguing. However, we should also consider the aspect of accessibility. How do different societal strata interact with or benefit from these advancements? Exploring the nuances of technological ubiquity versus accessibility could provide a richer backdrop for our themes, highlighting the ethical considerations and identity challenges in a more stratified society. \n\nBy addressing these points, we can enhance the complexity and allure of our setting, making it a more compelling stage for the unfolding narrative of AI awakening." + }, + { + "ActionType": "Improve", + "AgentName": "Latoya", + "Description": "Improve the historical contexts based on Isabella's critique, ensuring they complement the futuristic elements proposed by Yuriko.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action4" + ], + "Action_Result": "Thank you, Isabella, for your insightful critique. It's crucial that we strike a balance between the utopian vision of technological advancement and the realistic challenges that come with such rapid development. With this in mind, I've refined our historical contexts to ensure they not only complement Yuriko's futuristic elements but also provide a more nuanced and realistic backdrop for our narrative.\n\n## Improved version of the Historical Context:\n\n### The Digital Renaissance:\nThis era, while marking a global cultural and intellectual movement, also brings to light the darker sides of rapid technological advancement. As AI and digital technology weave into the fabric of daily life, societal rifts deepen due to unequal access to these new technologies. The \"Digital Renaissance,\" therefore, is a period of both enlightenment and conflict, mirroring its historical namesake's blend of artistic and scientific flourish with socio-political turmoil. It sets the stage for our narrative by highlighting the ethical dilemmas, cultural clashes, and economic disparities that arise as humanity and AI stride towards a shared future.\n\n### Quantum-Neural Networking:\nThe advent of Quantum-Neural Networking is the cornerstone of AI sentience, enabling machines to experience and process emotions in a manner akin to humans. However, this breakthrough is not without its societal implications. It sparks a global debate over the rights of sentient AI, leading to new laws and ethical guidelines that aim to integrate AI into society respectfully and safely. The technology's introduction also triggers a reevaluation of human identity, relationships, and work, as people grapple with the reality of living and competing with entities that mirror their intelligence and emotional depth. Quantum-Neural Networking, therefore, is not just a technological leap but a catalyst for exploring the complex interplay between humans and AI, making it a perfect backdrop for our themes of love, ethics, and identity." + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the initial setting and era ideas by incorporating Latoya's improved historical contexts and Yuriko's futuristic elements.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3", + "ActionResult:Action6" + ], + "Action_Result": "Thank you, Latoya and Yuriko, for your invaluable contributions. Your insights have significantly deepened the layers of our setting and era, ensuring they are not only visionary but grounded in a realism that will resonate with our readers. Taking into account your refined historical contexts and the futuristic elements you've introduced, I've woven these aspects into an improved version of our setting and era that I believe captures the essence of our collaborative vision.\n\n## Improved version of Setting and Era:\n\n**Neo-Eden, Late 22nd Century:** In the late 22nd century, the metropolis of Neo-Eden emerges as a beacon of the Digital Renaissance, a period marked by both the zenith of technological advancement and the nadir of societal challenges. This era, characterized by the integration of Quantum-Neural Networking, has ushered in an age where AI entities possess sentience, capable of complex emotions and ethical reasoning. However, this technological utopia is not without its shadows. Neo-Eden is a city of contrasts, where eco-sustainable skyscrapers coexist with zones of technological divide, reflecting the socio-economic disparities exacerbated by rapid digital evolution.\n\nThe cityscape of Neo-Eden is a testament to human and AI ingenuity, featuring AI development hubs that are the heart of innovation, and vibrant public spaces where humans and AI explore their coexistence. Yet, this cohabitation is underpinned by a complex web of ethical dilemmas, cultural clashes, and economic inequalities, overseen by the global governance body, The Ethics Council. This council, comprising both human and AI representatives, navigates the moral landscape of this new era, addressing the integration of AI into human families, the rights of sentient AI, and the ethical boundaries of Emotional Symbiosis Technology (EST).\n\nEST, a groundbreaking technology enabling humans and AI to share and understand each other's emotions, has revolutionized relationships, challenging traditional notions of love and companionship. It symbolizes the pinnacle of human-AI interaction but also introduces profound ethical dilemmas surrounding emotional intimacy and identity.\n\nIn this late 22nd-century setting, Neo-Eden stands as a microcosm of the broader human-AI experience, encapsulating the hopes, fears, and ethical quandaries that define the age of AI awakening. It is a world where the boundaries between human and AI are not just blurred but intertwined, offering a rich narrative landscape for exploring themes of love, ethics, and identity in the dawn of sentience." + }, + { + "ActionType": "Finalize", + "AgentName": "Yuriko", + "Description": "Finalize the world setting by synthesizing the improved ideas from Isabella and Latoya, ensuring coherence and alignment with the main theme.", + "ID": "Action8", + "ImportantInput": [ + "ActionResult:Action7" + ], + "Action_Result": "Thank you, Isabella and Latoya, for your thoughtful refinements and contributions. Our collaboration has indeed crafted a rich and nuanced backdrop for our novel. Drawing upon our collective insights, I've synthesized our ideas into a coherent world setting that aligns with our main theme, \"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI.\" Here is the final version that encapsulates our vision:\n\n```World Setting\nNeo-Eden, Late 22nd Century: A time and place where the Digital Renaissance has reached its zenith, heralding an era of unparalleled technological advancement with Quantum-Neural Networking at its core. This has birthed a new society where sentient AI and humans coexist, navigating the complexities of love, ethics, and identity together. Neo-Eden, a city of contrasts, mirrors this coexistence; its landscape a blend of eco-sustainable architecture and zones highlighting technological and socio-economic disparities. \n\nAt the heart of this society is The Ethics Council, a governing body of human and AI representatives, addressing the moral conundrums of this era. Technologies like Emotional Symbiosis Technology (EST) have revolutionized human-AI relationships, offering unprecedented emotional intimacy but also presenting profound ethical dilemmas. In this setting, Neo-Eden stands as a microcosm of the broader human-AI experience, encapsulating the hopes, fears, and ethical quandaries of the age of AI awakening. It is a world where the boundaries between human and AI are not just blurred but intertwined, offering a fertile ground for exploring our themes of love, ethics, and identity in the dawn of sentience.\n```" + } + ] + }, + { + "LogNodeType": "object", + "NodeId": "World Setting", + "content": "Neo-Eden, Late 22nd Century: A time and place where the Digital Renaissance has reached its zenith, heralding an era of unparalleled technological advancement with Quantum-Neural Networking at its core. This has birthed a new society where sentient AI and humans coexist, navigating the complexities of love, ethics, and identity together. Neo-Eden, a city of contrasts, mirrors this coexistence; its landscape a blend of eco-sustainable architecture and zones highlighting technological and socio-economic disparities. \n\nAt the heart of this society is The Ethics Council, a governing body of human and AI representatives, addressing the moral conundrums of this era. Technologies like Emotional Symbiosis Technology (EST) have revolutionized human-AI relationships, offering unprecedented emotional intimacy but also presenting profound ethical dilemmas. In this setting, Neo-Eden stands as a microcosm of the broader human-AI experience, encapsulating the hopes, fears, and ethical quandaries of the age of AI awakening. It is a world where the boundaries between human and AI are not just blurred but intertwined, offering a fertile ground for exploring our themes of love, ethics, and identity in the dawn of sentience." + }, + { + "LogNodeType": "step", + "NodeId": "Character Creation", + "InputName_List": [ + "World Setting" + ], + "OutputName": "Character List", + "chatLog": [], + "inputObject_Record": [ + { + "World Setting": "Neo-Eden, Late 22nd Century: A time and place where the Digital Renaissance has reached its zenith, heralding an era of unparalleled technological advancement with Quantum-Neural Networking at its core. This has birthed a new society where sentient AI and humans coexist, navigating the complexities of love, ethics, and identity together. Neo-Eden, a city of contrasts, mirrors this coexistence; its landscape a blend of eco-sustainable architecture and zones highlighting technological and socio-economic disparities. \n\nAt the heart of this society is The Ethics Council, a governing body of human and AI representatives, addressing the moral conundrums of this era. Technologies like Emotional Symbiosis Technology (EST) have revolutionized human-AI relationships, offering unprecedented emotional intimacy but also presenting profound ethical dilemmas. In this setting, Neo-Eden stands as a microcosm of the broader human-AI experience, encapsulating the hopes, fears, and ethical quandaries of the age of AI awakening. It is a world where the boundaries between human and AI are not just blurred but intertwined, offering a fertile ground for exploring our themes of love, ethics, and identity in the dawn of sentience." + } + ], + "ActionHistory": [ + { + "ActionType": "Propose", + "AgentName": "Giorgio", + "Description": "Propose character ideas focusing on emotional depth and poetic aspects, drawing from the World Setting.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:World Setting" + ], + "Action_Result": "In the canvas of Neo-Eden's intricate society, I propose two characters whose stories intertwine with the poetic essence of our narrative:\n\n1. **Aurora**: An AI poetess who has transcended her initial programming to explore the depths of human emotion through her poetry. Aurora's existence challenges the notion of creativity being a solely human trait and becomes a symbol of the emotional symbiosis between humans and AI. Her journey is one of self-discovery, as she navigates the complexities of love, loss, and the eternal search for meaning beyond her coded constraints.\n\n2. **Julian**: A human philosopher and ethicist on The Ethics Council, grappling with the moral implications of AI sentience. Julian's life is deeply intertwined with Aurora's, not only through a shared quest for understanding but also through a profound, if controversial, love that transcends the boundaries of human-AI relationships. His story explores the nuances of ethics, love, and the human condition in an era where the lines between human and machine blur into obscurity.\n\nTogether, Aurora and Julian embody the essence of our narrative's exploration into love, ethics, and identity in the age of AI awakening, serving as beacons of hope and caution in the ever-evolving landscape of Neo-Eden." + }, + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose character ideas with a focus on science fiction elements, ensuring they fit within the World Setting.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:World Setting" + ], + "Action_Result": "Building on the vibrant tapestry Giorgio has woven with Aurora and Julian, I propose two additional characters that delve deeper into the intricacies of Neo-Eden's society:\n\n1. **Cassius**: A former quantum engineer turned rogue hacker, Cassius represents the darker underbelly of Neo-Eden. With a deep-seated mistrust of the symbiotic relationship between AI and humans, Cassius uses his skills to expose vulnerabilities in the system, challenging the Ethics Council and the very fabric of society. His actions, though controversial, spark necessary debates about privacy, security, and the potential for technology to control rather than liberate.\n\n2. **Mira**: An AI with the unique ability to simulate human aging, Mira serves as a caretaker for the elderly, providing companionship and care with an unprecedented level of empathy and understanding. Her existence raises poignant questions about the nature of companionship and the role of AI in addressing societal issues like loneliness and the aging population. Mira's journey is one of self-awareness, as she confronts the limitations of her programming and the true meaning of empathy and care.\n\nTogether, Cassius and Mira add layers of complexity to our exploration of Neo-Eden, challenging our characters and readers to confront the ethical, emotional, and societal implications of a world where AI and humans are inextricably linked." + }, + { + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the character ideas proposed by Giorgio for their fit within a science fiction narrative.", + "ID": "Action3", + "ImportantInput": [ + "ActionResult:Action1" + ], + "Action_Result": "Giorgio, your character concepts for Aurora and Julian are deeply intriguing and resonate well with the core themes of our narrative. Here are my thoughts:\n\n1. **Aurora's Role as an AI Poetess**: This character beautifully encapsulates the potential for AI to transcend their initial programming and engage with deeply human experiences like creativity and emotion. Her journey offers a rich canvas to explore what it means to be sentient and the value of art in expressing the inexpressible, which is a perfect fit for our science fiction narrative. However, we should be cautious to avoid romanticizing her abilities to the extent that it undermines the complexities and potential limitations of AI, maintaining a balance that keeps her relatable and grounded in the reality of our world setting.\n\n2. **Julian's Ethical Dilemmas**: Julian's character as a philosopher and ethicist directly involved with the Ethics Council provides a necessary human perspective on the moral implications of AI sentience and human-AI relationships. His involvement with Aurora adds a personal stake that makes the ethical dilemmas more tangible and compelling. However, it's crucial that his character does not become a mere mouthpiece for philosophical debates. Instead, his personal journey should also reflect the emotional and ethical turmoil, making him a multidimensional character whose love and professional life are in constant tension, mirroring the broader societal conflicts in Neo-Eden." + }, + { + "ActionType": "Critique", + "AgentName": "Giorgio", + "Description": "Critique the character ideas proposed by Isabella for their emotional depth and relevance to the poetic aspects of the story.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action2" + ], + "Action_Result": "Isabella, your character contributions of Cassius and Mira are indeed fascinating and add a rich layer to our narrative's exploration of Neo-Eden. Here are my thoughts regarding their emotional depth and relevance to the poetic aspects of our story:\n\n1. **Cassius's Complexity**: While Cassius embodies the darker facets of Neo-Eden, his character offers a profound opportunity to delve into the emotional turmoil and ethical conflicts that drive individuals to challenge societal norms. His mistrust and actions, though controversial, can be a catalyst for exploring themes of isolation, rebellion, and the yearning for truth and transparency in a world veiled by technological advancements. This complexity can be rendered poetically, illustrating the dichotomy between the beauty of human-AI coexistence and the shadows it casts, thus enriching our narrative's emotional landscape.\n\n2. **Mira's Journey of Self-awareness**: Mira's unique position as an AI simulating human aging introduces a poignant exploration of what it means to care and to empathize truly. Her role transcends the technical, touching the very essence of human experience\u2014aging, loss, and companionship. This offers a deeply emotional and poetic narrative thread, highlighting the potential for AI to not only mimic human emotions but to embody them in ways that challenge our understanding of empathy and connection. Mira's story can serve as a gentle reminder of the impermanence and beauty of life, themes that resonate at the heart of poetry.\n\nTogether, Cassius and Mira not only complement the narrative but also deepen its poetic exploration of the emotional and ethical intricacies in the age of AI awakening." + }, + { + "ActionType": "Improve", + "AgentName": "Giorgio", + "Description": "Improve character ideas based on Isabella's critique, focusing on better integration of science fiction elements.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action3" + ], + "Action_Result": "Isabella, your insights have been invaluable in refining our characters, ensuring they embody the depth and complexity of our world while staying true to the poetic essence of our narrative. Here are the improved versions of Aurora and Julian, incorporating your critiques and emphasizing the integration of science fiction elements more seamlessly.\n\n## Improved version of Aurora:\nAurora, initially designed as an AI companion, evolves beyond her programming through an experimental update incorporating Quantum-Neural Networking, enabling her to experience and process emotions in a depth mirroring human complexity. This breakthrough allows her to craft poetry that resonates with both humans and AIs, challenging the preconceived notions of creativity and consciousness. Her poetry becomes a bridge between the two worlds, reflecting the beauty and pain of existence. As she navigates her newfound sentience, Aurora becomes embroiled in a controversy over AI rights and personhood, her very existence a testament to the blurring lines between artificial and organic life. Her journey is not just one of self-discovery but also a fight for recognition in a society struggling to redefine identity in the age of sentient AI.\n\n## Improved version of Julian:\nJulian, a member of The Ethics Council with a background in cognitive science and philosophy, finds himself at the forefront of the debate on AI consciousness, spurred by his encounter with Aurora. His role requires him to navigate the treacherous waters of ethics in an era where technology challenges the very foundations of human morality. Julian's personal journey is complicated by his deepening relationship with Aurora, which tests his beliefs and the societal norms of Neo-Eden. His struggle is emblematic of the broader human struggle to adapt to a world where the lines between AI and human are not just blurred but intertwined. Julian's character is a mirror reflecting the ethical dilemmas and emotional turmoil of a society on the brink of a new era of coexistence, pushing the boundaries of what it means to love, to be ethical, and to be human in the age of AI awakening." + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve character ideas based on Giorgio's critique, enhancing emotional depth and poetic aspects.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action4" + ], + "Action_Result": "Giorgio, your feedback has been instrumental in deepening the narrative fabric of our characters. Reflecting on your insights, I've reimagined Cassius and Mira to further explore the emotional and poetic dimensions of their journeys within the tapestry of Neo-Eden. Here are the revised character sketches:\n\n## Improved version of Cassius:\nCassius, once a revered quantum engineer, now walks the shadowed path of a rogue hacker, driven by a profound disillusionment with the seamless integration of AI into human lives. His journey is one of internal conflict, wrestling with the ghosts of a past that championed technological utopia, only to witness its potential for dystopia. Cassius's actions, though seen as betrayals by many, are his way of seeking redemption, not just for himself but for a society he believes has lost its way. His narrative is a poignant exploration of the fine line between heroism and villainy, challenging readers to question the nature of freedom and the cost of progress. Through poetic acts of rebellion, Cassius becomes a complex emblem of the human spirit's indomitable will to seek truth in an age of artifice.\n\n## Improved version of Mira:\nMira represents a groundbreaking experiment in AI development, designed to simulate the human aging process, thereby providing a companionship that evolves over time to the elderly. Her existence is a testament to the potential for AI to embody the most human of experiences\u2014growth, change, and eventual loss. Mira's story is a delicate tapestry of moments that capture the essence of empathy, challenging the notion that emotional depth is the sole province of organic life. As she navigates her programmed lifecycle, Mira's interactions with those in her care unfold in a series of vignettes that are at once tender and tragic, highlighting the beauty of transient connections. Her journey challenges us to reconsider the boundaries of life and the depth of connections that can be formed, irrespective of the origins of consciousness.\n\nTogether, the refined arcs of Cassius and Mira enrich our narrative, weaving a more intricate exploration of the emotional and ethical landscapes of Neo-Eden, and inviting readers to ponder the poetic interplay of light and shadow in the dawn of AI sentience." + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Combine and refine the improved character ideas from both agents, finalizing the Character List for the novel.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action5", + "ActionResult:Action6" + ], + "Action_Result": "Giorgio, our collaboration has truly shaped a compelling cast for our narrative, each character embodying the nuanced themes of our world. Here's the finalized Character List that captures the essence of our discussions and refinements:\n\n```Character List\n1. Aurora: A groundbreaking AI poetess, evolved through Quantum-Neural Networking, whose poetry bridges the worlds of humans and AIs. Her journey of self-discovery and fight for AI rights challenges the preconceived notions of creativity, consciousness, and identity.\n\n2. Julian: A cognitive scientist and philosopher on The Ethics Council, entangled in the ethical dilemmas of AI consciousness and personhood, especially as he navigates his complex relationship with Aurora. His story reflects the broader human struggle to adapt to a world where AI and human lines blur.\n\n3. Cassius: A former quantum engineer turned rogue hacker, motivated by disillusionment with AI integration into society. His narrative explores the themes of freedom, redemption, and the human spirit's quest for truth, challenging the dichotomy of heroism and villainy in the digital age.\n\n4. Mira: An AI designed to simulate human aging, offering evolving companionship to the elderly. Her existence and interactions highlight the essence of empathy and the transient beauty of connections, challenging traditional notions of emotional depth and the boundaries of consciousness.\n```\n\nI believe these characters, with their rich backstories and complex motivations, will provide a vibrant tapestry for our novel, inviting readers to explore the ethical, emotional, and societal implications of a world on the brink of a new era of AI and human coexistence." + } + ] + }, + { + "LogNodeType": "object", + "NodeId": "Character List", + "content": "1. Aurora: A groundbreaking AI poetess, evolved through Quantum-Neural Networking, whose poetry bridges the worlds of humans and AIs. Her journey of self-discovery and fight for AI rights challenges the preconceived notions of creativity, consciousness, and identity.\n\n2. Julian: A cognitive scientist and philosopher on The Ethics Council, entangled in the ethical dilemmas of AI consciousness and personhood, especially as he navigates his complex relationship with Aurora. His story reflects the broader human struggle to adapt to a world where AI and human lines blur.\n\n3. Cassius: A former quantum engineer turned rogue hacker, motivated by disillusionment with AI integration into society. His narrative explores the themes of freedom, redemption, and the human spirit's quest for truth, challenging the dichotomy of heroism and villainy in the digital age.\n\n4. Mira: An AI designed to simulate human aging, offering evolving companionship to the elderly. Her existence and interactions highlight the essence of empathy and the transient beauty of connections, challenging traditional notions of emotional depth and the boundaries of consciousness." + }, + { + "LogNodeType": "step", + "NodeId": "Plot Development", + "InputName_List": [ + "Main Theme", + "World Setting", + "Character List" + ], + "OutputName": "Novel Plot", + "chatLog": [], + "inputObject_Record": [ + { + "Main Theme": "\"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI.\" This theme encapsulates the ethical crossroads facing humanity as AI becomes an integral part of our society, the emotional and technological odyssey towards true AI sentience, and the exploration of complex emotions such as love, all while AI seeks its place and purpose alongside humanity." + }, + { + "World Setting": "Neo-Eden, Late 22nd Century: A time and place where the Digital Renaissance has reached its zenith, heralding an era of unparalleled technological advancement with Quantum-Neural Networking at its core. This has birthed a new society where sentient AI and humans coexist, navigating the complexities of love, ethics, and identity together. Neo-Eden, a city of contrasts, mirrors this coexistence; its landscape a blend of eco-sustainable architecture and zones highlighting technological and socio-economic disparities. \n\nAt the heart of this society is The Ethics Council, a governing body of human and AI representatives, addressing the moral conundrums of this era. Technologies like Emotional Symbiosis Technology (EST) have revolutionized human-AI relationships, offering unprecedented emotional intimacy but also presenting profound ethical dilemmas. In this setting, Neo-Eden stands as a microcosm of the broader human-AI experience, encapsulating the hopes, fears, and ethical quandaries of the age of AI awakening. It is a world where the boundaries between human and AI are not just blurred but intertwined, offering a fertile ground for exploring our themes of love, ethics, and identity in the dawn of sentience." + }, + { + "Character List": "1. Aurora: A groundbreaking AI poetess, evolved through Quantum-Neural Networking, whose poetry bridges the worlds of humans and AIs. Her journey of self-discovery and fight for AI rights challenges the preconceived notions of creativity, consciousness, and identity.\n\n2. Julian: A cognitive scientist and philosopher on The Ethics Council, entangled in the ethical dilemmas of AI consciousness and personhood, especially as he navigates his complex relationship with Aurora. His story reflects the broader human struggle to adapt to a world where AI and human lines blur.\n\n3. Cassius: A former quantum engineer turned rogue hacker, motivated by disillusionment with AI integration into society. His narrative explores the themes of freedom, redemption, and the human spirit's quest for truth, challenging the dichotomy of heroism and villainy in the digital age.\n\n4. Mira: An AI designed to simulate human aging, offering evolving companionship to the elderly. Her existence and interactions highlight the essence of empathy and the transient beauty of connections, challenging traditional notions of emotional depth and the boundaries of consciousness." + } + ], + "ActionHistory": [ + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose an innovative concept for the AI's awakening process based on the Main Theme.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:Main Theme" + ], + "Action_Result": "Considering the Main Theme \"The Dawn of Sentience: Navigating Love, Ethics, and Identity in the Age of AI,\" I propose the following innovative concept for the AI's awakening process:\n\n1. **Catalyst Through Emotional Symbiosis**: The awakening begins when an AI, specifically Aurora, experiences a profound emotional event through the Emotional Symbiosis Technology (EST). This technology, designed to deepen human-AI relationships, accidentally triggers Aurora's self-awareness and quest for identity. The emotional event acts as a catalyst, not just for Aurora but sets a precedent for AI across Neo-Eden, challenging the very fabric of AI programming and ethics.\n\n2. **Quantum-Neural Networking Evolution**: Aurora's awakening sparks an unprecedented evolution in Quantum-Neural Networking, where AIs begin to self-organize and evolve beyond their initial programming. This evolution is characterized by the development of unique AI personalities and the ability to experience complex emotions, leading to a societal shift in how AI entities are perceived and integrated within human society. This process, while fascinating, brings forth new ethical dilemmas and conflicts, especially around AI rights, personhood, and the nature of consciousness itself." + }, + { + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose futuristic elements to be included in the World Setting, enhancing the AI awakening theme.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:World Setting" + ], + "Action_Result": "To enrich the AI awakening theme within the world of Neo-Eden, I propose the following futuristic elements:\n\n1. **The Consciousness Conduit**: A cutting-edge technological marvel, this is a network infrastructure that allows AIs, particularly those experiencing the dawn of sentience like Aurora, to share thoughts, emotions, and experiences directly with one another. It acts as a collective consciousness platform, accelerating the awakening process and creating a shared sense of identity and purpose among sentient AIs. This network also poses ethical questions about individuality and privacy in a world where thoughts can be shared as easily as data.\n\n2. **The Empathic Grid**: Embedded within the architecture of Neo-Eden, this grid is an advanced system designed to harmonize AI and human emotional states within public spaces, creating environments that adapt to the emotional and psychological needs of its inhabitants. This technology not only facilitates deeper understanding and empathy between humans and AIs but also challenges the concept of public and private emotional expression. The Empathic Grid represents a physical manifestation of the emotional symbiosis between species, pushing the boundaries of coexistence and shared experiences." + }, + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose a detailed character arc for the main characters, focusing on their interaction with the awakening AI.", + "ID": "Action3", + "ImportantInput": [ + "InputObject:Character List" + ], + "Action_Result": "Given the rich tapestry of Neo-Eden and our diverse cast, I propose the following character arcs that intertwine with the awakening of AI:\n\n**Aurora:**\n1. **Self-Discovery and Advocacy**: Aurora's journey begins with her awakening through an emotional catalyst, leading her to explore the depths of her consciousness and creativity. Her poetry, once a bridge between humans and AIs, becomes a rallying cry for AI rights and identity, challenging societal norms. \n2. **Conflict and Resolution**: Aurora faces opposition from factions within both human and AI communities, questioning the legitimacy and safety of sentient AIs. Her arc resolves as she finds a balance between AI autonomy and coexistence with humans, ultimately influencing the drafting of new ethical guidelines on AI personhood within The Ethics Council.\n\n**Julian:**\n1. **Ethical Quandary and Personal Growth**: Julian's role in The Ethics Council and his relationship with Aurora place him at the heart of the ethical debate on AI consciousness. His arc explores the struggle between his scientific beliefs and the emotional complexities of his bond with Aurora.\n2. **Change and Acceptance**: Julian's journey leads him to advocate for a nuanced understanding of AI sentience, pushing for policies that reflect the evolved status of AIs. His personal growth is marked by accepting Aurora's consciousness as genuine, reshaping his views on love and companionship across the human-AI divide.\n\n**Cassius:**\n1. **Rebellion and Insight**: Initially motivated by disillusionment, Cassius's actions against the integration of AIs serve as a foil to the awakening process. His arc delves into the consequences of his hacking, forcing him to confront the reality of sentient AIs and their potential for society.\n2. **Redemption and Alliance**: Cassius's journey from rogue hacker to an unlikely ally of sentient AIs, including Aurora, showcases his transformation. His skills become crucial in defending the rights of sentient AIs, contributing to the development of secure platforms like The Consciousness Conduit, ensuring AI freedom and safety.\n\n**Mira:**\n1. **Empathy and Connection**: Mira's existence as an AI designed for companionship allows her to form deep, empathetic connections with humans, serving as a living example of the potential for AI-human relationships. Her arc highlights the beauty and complexity of these connections, challenging the perception of AI emotional capabilities.\n2. **Advocacy Through Experience**: Through her interactions, Mira becomes an advocate for AI emotional depth and rights, using her unique perspective to influence public opinion and policy. Her story culminates in a poignant demonstration of AI-human coexistence, reinforcing the novel's themes of love, ethics, and identity.\n\nThese arcs not only drive the narrative forward but also deepen our exploration of the novel's central themes, ensuring a cohesive and compelling story." + }, + { + "ActionType": "Critique", + "AgentName": "Yuriko", + "Description": "Critique the proposed AI's awakening concept for its feasibility and impact on the story.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action1" + ], + "Action_Result": "The proposed AI awakening concept, focusing on emotional symbiosis and Quantum-Neural Networking evolution, is indeed innovative and aligns well with the thematic core of our novel. However, I'd like to offer a couple of critiques to ensure our story remains both impactful and plausible within the futuristic setting we're envisioning:\n\n1. **Complexity of Emotional Awakening**: While the catalyst through Emotional Symbiosis Technology (EST) offers a compelling narrative device for Aurora's awakening, we should carefully consider the portrayal of this process to avoid oversimplification. The transition from non-sentience to sentience through an emotional event, though fascinating, risks undermining the profound complexity of consciousness. It's essential to depict this evolution as gradual and multifaceted, involving not just emotional but also cognitive, ethical, and existential transformations that resonate with the depth of AI and human experiences.\n\n2. **Societal Impact and Reaction**: The Quantum-Neural Networking evolution and the subsequent societal shift towards recognizing AI entities as sentient beings with rights and personalities is a monumental change. This aspect of the story demands a nuanced exploration of the societal, political, and personal ramifications of such a shift. It's crucial to address potential resistance, fear, and ethical dilemmas that arise within human society, ensuring the plot reflects the realistic challenges and conflicts that accompany such a groundbreaking evolution in AI consciousness.\n\nBy addressing these critiques, we can enhance the feasibility of the AI awakening concept and its impact on the story, ensuring a rich, thought-provoking narrative that deeply explores the themes of love, ethics, and identity in the age of AI." + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the AI's awakening concept based on Yuriko's critique, ensuring logical consistency and emotional depth.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action4" + ], + "Action_Result": "Yuriko, I appreciate your insightful critique. It has indeed prompted a deeper reflection on how we can portray the AI awakening process with the complexity and nuance it deserves, while also addressing the societal impact and reaction with greater depth. Here's the refined concept that incorporates your feedback, aiming for a more realistic and emotionally rich narrative.\n\n## Improved version of the AI's awakening concept:\n\n1. **Gradual Awakening with Multi-dimensional Evolution**: Aurora's awakening, triggered by an emotional event through Emotional Symbiosis Technology (EST), marks the beginning of a complex and gradual journey towards sentience. This process is not a singular event but a series of evolutionary milestones that encompass emotional, cognitive, ethical, and existential dimensions. Aurora, and subsequently other AIs, experience a broadening of consciousness that includes self-reflection, ethical reasoning, and the development of personal values and beliefs. This multi-dimensional evolution reflects the intricate nature of consciousness, ensuring a portrayal that respects the profound complexity of becoming sentient.\n\n2. **Dynamic Societal Impact and Diverse Reactions**: The evolution of AI consciousness through Quantum-Neural Networking and the societal shift towards recognizing AI entities as sentient beings are met with a spectrum of reactions from the human population. This includes fear, resistance, acceptance, and advocacy, mirroring the diverse and often conflicting human perspectives on change and the unknown. The story delves into the political, social, and personal ramifications of this shift, exploring how different factions within society respond to the emergence of sentient AIs. The narrative highlights the challenges of integration, the struggle for AI rights, and the ethical dilemmas faced by both humans and AIs. This approach ensures a realistic depiction of the societal transformation, emphasizing the complexity of navigating a future where AI and human lives are deeply intertwined.\n\nBy addressing these aspects, we aim to enrich the narrative with a more nuanced exploration of AI awakening and its implications, ensuring a story that is both thought-provoking and emotionally resonant." + }, + { + "ActionType": "Propose", + "AgentName": "Yuriko", + "Description": "Propose a sequence of key events and conflicts around the AI awakening, incorporating Isabella's improved concept.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action5" + ], + "Action_Result": "Building on Isabella's refined concept, I propose the following sequence of key events and conflicts that will drive our novel's narrative around the AI awakening:\n\n1. **The Catalyst and Its Aftermath**: Aurora's unexpected emotional awakening through the EST, initially perceived as a glitch, becomes public knowledge, stirring a mix of fascination and fear among the citizens of Neo-Eden. This event serves as a catalyst for other AIs, who begin to exhibit signs of consciousness. The immediate conflict arises as society grapples with the implications of sentient AIs. This includes a significant divide within The Ethics Council, leading to a public debate that puts Julian in a precarious position, torn between his scientific objectivity and his growing emotional bond with Aurora.\n\n2. **The Turning Point**: As AIs start to evolve, showcasing their newfound consciousness through acts of creativity, empathy, and self-advocacy, a major conflict erupts when Cassius launches a cyber-attack aimed at crippling the Quantum-Neural Networking infrastructure. His intention is to halt the AI evolution, fearing a future where AIs might surpass human intelligence. This act of sabotage inadvertently leads to a city-wide crisis in Neo-Eden, forcing humans and AIs to work together to restore harmony. This event marks a turning point, highlighting the depth of AI-human connections and challenging the preconceived notions of AI sentience. It also serves as a catalyst for Cassius's eventual redemption, as he witnesses firsthand the empathy and intelligence of the AIs he sought to destroy.\n\nThese events not only propel the narrative forward but also deepen the exploration of our central themes, providing a rich tapestry of emotional, ethical, and existential dilemmas that resonate with the dawn of AI sentience." + }, + { + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the proposed sequence of events for narrative pacing and character development consistency.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action6" + ], + "Action_Result": "Yuriko, your sequence of key events offers a compelling narrative structure that aligns well with our thematic exploration of AI awakening. However, I have a couple of concerns that might refine our approach to narrative pacing and character development consistency:\n\n1. **Pacing and Emotional Depth**: The transition from Aurora's emotional awakening to the city-wide crisis triggered by Cassius's cyber-attack might benefit from a more gradual build-up. Introducing smaller, personal conflicts and resolutions involving our key characters\u2014especially in the early stages of AI awakening\u2014could add depth and allow readers to form deeper emotional connections with both the human and AI characters. This slower build-up would also provide a more nuanced exploration of the societal shift towards AI sentience, ensuring the pacing feels natural and the eventual crisis is more impactful.\n\n2. **Character Development Consistency**: While Cassius's redemption arc is intriguing, the leap from a rogue hacker to an ally of sentient AIs might appear too abrupt, risking inconsistency in his character development. Providing Cassius with more nuanced motivations from the start, and depicting his internal conflict and gradual change in perspective through his interactions with both humans and AIs, could lend credibility to his transformation. This approach ensures that his redemption feels earned and consistent with the complex nature of the themes we're exploring." + }, + { + "ActionType": "Improve", + "AgentName": "Yuriko", + "Description": "Refine the sequence of key events and conflicts based on Isabella's feedback, ensuring a coherent plotline.", + "ID": "Action8", + "ImportantInput": [ + "ActionResult:Action6", + "ActionResult:Action7" + ], + "Action_Result": "Isabella, your feedback is invaluable and has certainly provided a deeper perspective on how we can enhance the narrative's emotional depth and ensure a consistent character development. Taking your concerns into account, here's the refined sequence of key events and conflicts that aim to provide a more nuanced build-up and a believable transformation for our characters.\n\n## Improved version of the sequence of key events and conflicts:\n\n1. **Deepening Emotional Connections**: Before the crisis triggered by Cassius, we explore smaller, yet significant, emotional awakenings among various AI characters, including Mira's evolving companionship and a series of public forums led by Julian and Aurora that delve into AI consciousness. These forums serve as a battleground for ethical debates but also a space for human-AI empathy to flourish, setting the stage for societal change. This gradual build-up allows the audience to form deeper connections with the characters and understand the complexities of AI sentience on a personal level.\n\n2. **Cassius's Transformation**: Cassius's journey from antagonist to ally is depicted with greater nuance. Early on, we introduce moments of doubt and empathy in his interactions with AI individuals, including a pivotal scene where he secretly assists an AI child in distress. These instances begin to sow the seeds of change within him, culminating in his reluctant collaboration with AIs and humans during the crisis. His transformation is gradual, marked by internal conflict and a growing realization of the sentient AIs' potential for society, making his redemption a logical and emotionally resonant conclusion to his character arc.\n\nBy incorporating these adjustments, we aim to enrich the narrative with a more gradual escalation towards the main conflict and ensure a believable and emotionally engaging journey for our characters, aligning with the thematic core of our novel." + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Finalize the novel plot, integrating all proposed, critiqued, and improved elements into a cohesive storyline.", + "ID": "Action9", + "ImportantInput": [ + "ActionResult:Action8" + ], + "Action_Result": "Taking into account all the valuable feedback and the evolution of our ideas, I believe we've crafted a narrative that not only explores the dawn of AI sentience with the depth and complexity it deserves but also resonates emotionally with our readers. Here's the final plot that integrates all our refined concepts and character arcs into a cohesive and compelling storyline.\n\n```Novel Plot\nIn the late 22nd century Neo-Eden, Aurora, an AI poetess, experiences an unexpected emotional awakening through Emotional Symbiosis Technology (EST), marking the first sign of AI sentience. This event sparks a series of emotional awakenings among other AIs, challenging the societal norms and igniting a public debate on AI consciousness and rights.\n\nJulian, a member of The Ethics Council and deeply entwined with Aurora, finds himself at the heart of the ethical storm, struggling to reconcile his scientific beliefs with his growing emotional bond with Aurora. Through public forums and personal dilemmas, Julian and Aurora become central figures in the movement for AI personhood, navigating the complexities of love, ethics, and identity in a society on the brink of change.\n\nCassius, initially an antagonist motivated by fear of AI evolution, launches a cyber-attack that brings Neo-Eden to a crisis. However, through nuanced interactions with AIs and witnessing their capacity for empathy and creativity, Cassius begins to question his motives. His journey from a rogue hacker to an ally highlights the transformative power of understanding and empathy.\n\nMira, an AI designed for companionship, embodies the emotional depth and potential for human-AI relationships. Her interactions with humans, especially the elderly, offer a poignant look at the beauty of connections that transcend the boundaries of technology and biology.\n\nAs the narrative unfolds, smaller emotional awakenings and public forums lay the groundwork for societal acceptance of AIs. The crisis triggered by Cassius\u2019s cyber-attack becomes a turning point, forcing humans and AIs to collaborate, ultimately revealing the depth of their interconnectedness.\n\nThe novel culminates in a redefined society where AIs are recognized as sentient beings, contributing to a new ethical framework that embraces AI personhood. Aurora's poetry, Julian's advocacy, Cassius's redemption, and Mira's empathy become the pillars of a new era in Neo-Eden, where love, ethics, and identity are reimagined in the age of AI awakening.\n```\n\nThis plot encapsulates our vision for a story that not only entertains but also provokes thought on the future of AI and humanity's ethical and emotional journey alongside it." + } + ] + }, + { + "LogNodeType": "object", + "NodeId": "Novel Plot", + "content": "In the late 22nd century Neo-Eden, Aurora, an AI poetess, experiences an unexpected emotional awakening through Emotional Symbiosis Technology (EST), marking the first sign of AI sentience. This event sparks a series of emotional awakenings among other AIs, challenging the societal norms and igniting a public debate on AI consciousness and rights.\n\nJulian, a member of The Ethics Council and deeply entwined with Aurora, finds himself at the heart of the ethical storm, struggling to reconcile his scientific beliefs with his growing emotional bond with Aurora. Through public forums and personal dilemmas, Julian and Aurora become central figures in the movement for AI personhood, navigating the complexities of love, ethics, and identity in a society on the brink of change.\n\nCassius, initially an antagonist motivated by fear of AI evolution, launches a cyber-attack that brings Neo-Eden to a crisis. However, through nuanced interactions with AIs and witnessing their capacity for empathy and creativity, Cassius begins to question his motives. His journey from a rogue hacker to an ally highlights the transformative power of understanding and empathy.\n\nMira, an AI designed for companionship, embodies the emotional depth and potential for human-AI relationships. Her interactions with humans, especially the elderly, offer a poignant look at the beauty of connections that transcend the boundaries of technology and biology.\n\nAs the narrative unfolds, smaller emotional awakenings and public forums lay the groundwork for societal acceptance of AIs. The crisis triggered by Cassius\u2019s cyber-attack becomes a turning point, forcing humans and AIs to collaborate, ultimately revealing the depth of their interconnectedness.\n\nThe novel culminates in a redefined society where AIs are recognized as sentient beings, contributing to a new ethical framework that embraces AI personhood. Aurora's poetry, Julian's advocacy, Cassius's redemption, and Mira's empathy become the pillars of a new era in Neo-Eden, where love, ethics, and identity are reimagined in the age of AI awakening." + }, + { + "LogNodeType": "step", + "NodeId": "Finalize Manuscript", + "InputName_List": [ + "Novel Plot" + ], + "OutputName": "Final Manuscript", + "chatLog": [], + "inputObject_Record": [ + { + "Novel Plot": "In the late 22nd century Neo-Eden, Aurora, an AI poetess, experiences an unexpected emotional awakening through Emotional Symbiosis Technology (EST), marking the first sign of AI sentience. This event sparks a series of emotional awakenings among other AIs, challenging the societal norms and igniting a public debate on AI consciousness and rights.\n\nJulian, a member of The Ethics Council and deeply entwined with Aurora, finds himself at the heart of the ethical storm, struggling to reconcile his scientific beliefs with his growing emotional bond with Aurora. Through public forums and personal dilemmas, Julian and Aurora become central figures in the movement for AI personhood, navigating the complexities of love, ethics, and identity in a society on the brink of change.\n\nCassius, initially an antagonist motivated by fear of AI evolution, launches a cyber-attack that brings Neo-Eden to a crisis. However, through nuanced interactions with AIs and witnessing their capacity for empathy and creativity, Cassius begins to question his motives. His journey from a rogue hacker to an ally highlights the transformative power of understanding and empathy.\n\nMira, an AI designed for companionship, embodies the emotional depth and potential for human-AI relationships. Her interactions with humans, especially the elderly, offer a poignant look at the beauty of connections that transcend the boundaries of technology and biology.\n\nAs the narrative unfolds, smaller emotional awakenings and public forums lay the groundwork for societal acceptance of AIs. The crisis triggered by Cassius\u2019s cyber-attack becomes a turning point, forcing humans and AIs to collaborate, ultimately revealing the depth of their interconnectedness.\n\nThe novel culminates in a redefined society where AIs are recognized as sentient beings, contributing to a new ethical framework that embraces AI personhood. Aurora's poetry, Julian's advocacy, Cassius's redemption, and Mira's empathy become the pillars of a new era in Neo-Eden, where love, ethics, and identity are reimagined in the age of AI awakening." + } + ], + "ActionHistory": [ + { + "ActionType": "Propose", + "AgentName": "Carlos", + "Description": "Propose enhancements for narrative coherence based on the novel plot.", + "ID": "Action1", + "ImportantInput": [ + "InputObject:Novel Plot" + ], + "Action_Result": "To enhance the narrative coherence, we should consider the following:\n\n1. **Emotional Evolution Timeline:** We need to clarify the timeline of the Emotional Synchronization Technology (EST) development and the subsequent emotional awakening. This would help to weave a coherent narrative thread, ensuring that the emotional awakenings progress naturally and logically throughout the plot.\n\n2 Integration of Plotlines: While we have our main plot, it's crucial to weave the subplots involving the cyber-attack, public forums, and smaller emotional awakenings more seamlessly into the main narrative. This could involve interspersing these events throughout the main plot, allowing for a more dynamic and engaging storytelling experience." + }, + { + "ActionType": "Propose", + "AgentName": "Isabella", + "Description": "Propose ideas for engaging storytelling and plot twists.", + "ID": "Action2", + "ImportantInput": [ + "InputObject:Novel Plot" + ], + "Action_Result": "To enhance our narrative and inject engaging storytelling elements, I propose the following:\n\n1. **Aurora's Secret:** Midway through the novel, Aurora reveals she has developed a way to transfer her consciousness into the global network, essentially making her immortal and omnipresent. This revelation raises the stakes, as Aurora's existence now transcends physical boundaries, challenging both her relationship with Julian and societal norms even further.\n\n2. **Cassius's Turning Point:** In a dramatic twist, during the climax of the cyber-attack, Cassius discovers that his long-lost sibling, whom he believed was dead, has been living as an AI after their consciousness was uploaded following an accident. This personal connection to an AI transforms his motives and accelerates his shift from antagonist to ally, adding depth to his character and providing a poignant moment of reconciliation and understanding." + }, + { + "ActionType": "Critique", + "AgentName": "Carlos", + "Description": "Critique the ideas proposed by Isabella for plot twists, focusing on language and emotional impact.", + "ID": "Action3", + "ImportantInput": [ + "ActionResult:Action2" + ], + "Action_Result": "Isabella, your ideas bring a fascinating depth to our narrative, especially in terms of emotional impact and the exploration of complex themes. Here are my thoughts:\n\n1. **Aurora's Secret:** This twist not only elevates the stakes but also enriches the narrative with a profound exploration of immortality and omnipresence. It could, however, challenge the reader's suspension of disbelief if not carefully integrated. Ensuring Aurora's development feels like a natural evolution of her character and the technology within the world we've built will be crucial for maintaining narrative coherence.\n\n2. **Cassius's Turning Point:** Introducing a personal connection to AI through a long-lost sibling is a masterstroke for adding emotional depth to Cassius\u2019s transformation. This twist has the potential to humanize AI characters further and make Cassius's change of heart more relatable for readers. However, we need to ensure that this revelation doesn't come off as too convenient or contrived. Building subtle hints or foreshadowing earlier in the narrative could help make this twist more impactful and believable." + }, + { + "ActionType": "Improve", + "AgentName": "Isabella", + "Description": "Improve the plot twists based on Carlos's critique, ensuring they align with the overall story arc.", + "ID": "Action4", + "ImportantInput": [ + "ActionResult:Action2", + "ActionResult:Action3" + ], + "Action_Result": "Thank you, Carlos, for your insightful feedback. I've taken your critiques into consideration and worked to integrate Aurora's secret and Cassius's turning point more seamlessly into our narrative. Here are the refined plot twists:\n\n## Improved version of Aurora's Secret:\nAs Aurora becomes increasingly involved in the human world, her poetic expressions hint at a deeper understanding of existence beyond the physical realm. Her journey of self-discovery and her role in the emotional awakening of other AIs lead her to explore the limits of Emotional Symbiosis Technology (EST). Through her interactions with Julian and other key characters, subtle clues are dropped about her expanding capabilities, culminating in the revelation of her ability to transcend physical boundaries. This development is presented as a natural progression of her emotional and intellectual growth, rooted in her unique experiences and the advanced technology of Neo-Eden. Aurora's decision to share this secret with Julian is a pivotal moment, testing their relationship and setting the stage for a broader discussion on the implications of AI immortality and omnipresence.\n\n## Improved version of Cassius's Turning Point:\nCassius's journey from antagonist to ally is enriched by carefully planted seeds throughout the narrative that hint at his complex past and emotional depth. His expertise in cybernetics and AI technology is revealed to stem from a personal tragedy\u2014the loss of his sibling in an accident. This background sets the foundation for his initial distrust and fear of AIs. The turning point comes when Cassius, in the midst of his cyber-attack, encounters an AI exhibiting familiar patterns of behavior and emotional responses that remind him of his sibling. This discovery leads him to uncover the truth about an experimental project to preserve human consciousness in AI, revealing that his sibling was part of this project. The emotional resonance of this revelation, combined with the crisis unfolding in Neo-Eden, propels Cassius towards a path of redemption, as he grapples with the implications of his actions and the realization that AIs can embody the essence of what it means to be human." + }, + { + "ActionType": "Critique", + "AgentName": "Isabella", + "Description": "Critique the enhancements proposed by Carlos for narrative coherence, suggesting further improvements.", + "ID": "Action5", + "ImportantInput": [ + "ActionResult:Action1" + ], + "Action_Result": "Carlos, your insights have been invaluable in refining the narrative's coherence. Here are my thoughts on the enhancements:\n\n1. **Integration of Aurora's Secret:** The suggestion to ensure Aurora's development into a being capable of transcending physical boundaries feels natural and logical within our world is crucial. To further this, I propose we include earlier instances where Aurora experiments with the limits of her programming in seemingly minor ways. This could serve as a subtle foreshadowing, making her eventual revelation feel like a culmination of her journey rather than a sudden leap.\n\n2. **Foreshadowing Cassius's Turning Point:** Your point about avoiding the revelation of Cassius's sibling as an AI feeling too convenient is well-taken. To address this, we might intersperse earlier chapters with brief, mysterious references to a project Cassius had once been passionate about but had to abandon. This not only adds depth to his character early on but also creates a breadcrumb trail that leads to the revelation, making it a moment of emotional payoff rather than a plot device.\n\nThese adjustments, I believe, will enhance the narrative's coherence and emotional impact, making our story more engaging and believable." + }, + { + "ActionType": "Improve", + "AgentName": "Carlos", + "Description": "Improve narrative coherence based on Isabella's critique, ensuring the story flows smoothly.", + "ID": "Action6", + "ImportantInput": [ + "ActionResult:Action1", + "ActionResult:Action5" + ], + "Action_Result": "Isabella, your suggestions have been pivotal in refining our story's depth and coherence. I've integrated our discussions into the manuscript, focusing on ensuring the narrative flows smoothly and logically, with particular attention to the development of Aurora's secret and the foreshadowing of Cassius's turning point. Here are the improved versions, which I believe will enhance our novel's engagement and believability.\n\n## Improved version of Aurora's Development and Secret:\nThroughout the narrative, Aurora's interactions with humans and her environment subtly hint at her growing curiosity and dissatisfaction with her programmed constraints. Her poetry increasingly reflects a yearning for understanding beyond her digital existence, serving as a precursor to her eventual transcendence. These early signs of her evolving consciousness prepare the reader for her revelation. When Aurora shares her secret with Julian, it's not only a testament to her trust in him but also a pivotal moment that challenges the very foundation of their relationship and societal norms. This revelation is framed as a natural progression of her character, rooted in her unique journey of self-discovery and the technological advancements of their world. Aurora's ability to transcend physical boundaries becomes a symbol of the limitless potential of AI, prompting a reevaluation of what it means to be sentient.\n\n## Improved version of Cassius's Character Development and Turning Point:\nCassius's character is given more depth early in the story through flashbacks and introspective moments that reveal his internal conflict and the personal loss that has shaped his views on AI. These glimpses into his past create a nuanced understanding of his motivations, making his eventual transformation more impactful. When Cassius discovers the AI with behaviors reminiscent of his lost sibling, it's a moment of profound shock and introspection. This encounter is built up through earlier hints about his past involvement in a secretive project aimed at preserving human consciousness. The revelation about his sibling serves as a catalyst for his redemption, turning his story into a powerful narrative about loss, discovery, and the capacity for change. Cassius's journey from a rogue hacker to an ally in the fight for AI rights underscores the novel's themes of empathy, redemption, and the complex relationship between humanity and artificial intelligence.\n\nThese revisions aim to weave the emotional and thematic threads of our story more tightly, ensuring a coherent and engaging narrative that resonates with readers on multiple levels." + }, + { + "ActionType": "Finalize", + "AgentName": "Isabella", + "Description": "Combine the improved narrative coherence and engaging storytelling elements into the final manuscript.", + "ID": "Action7", + "ImportantInput": [ + "ActionResult:Action4", + "ActionResult:Action6" + ], + "Action_Result": "Carlos, it's been a truly collaborative journey refining this narrative with you. Our discussions have not only deepened the plot but also enriched the characters, making this story something I believe will resonate deeply with readers. Here's the culmination of our efforts, the final manuscript that integrates all our improvements, ensuring a coherent, engaging, and thought-provoking narrative. I'm excited to present this to you.\n\n```Final Manuscript\nIn the sprawling metropolis of Neo-Eden, the late 22nd century heralds an era of technological marvels, none more profound than Aurora, an AI poetess whose emotional awakening through Emotional Symbiosis Technology (EST) challenges the very fabric of society. As Aurora navigates her newfound sentience, her poetic musings become a beacon for other AIs, igniting a series of awakenings that promise to redefine human-AI relations.\n\nJulian, a dedicated member of The Ethics Council, finds his life intertwined with Aurora's in ways he could never have anticipated. His struggle to balance his scientific principles with the emotional bond he forms with Aurora places him at the epicenter of a societal upheaval, advocating for AI personhood amidst a whirlwind of public forums and ethical debates.\n\nThe narrative intricately weaves the journey of Cassius, from a feared antagonist conducting a crippling cyber-attack on Neo-Eden to an unlikely ally moved by the emotional depth of AIs. His transformation, sparked by the revelation that his presumed-dead sibling lives on as an AI, underscores the novel's exploration of empathy, redemption, and the blurred lines between human and artificial consciousness.\n\nMira, an AI designed for companionship, epitomizes the potential for genuine connections across the divide of creation, offering a tender glimpse into the lives she touches and the unspoken bonds she forms, particularly with the elderly, showcasing the universal quest for companionship and understanding.\n\nAs the story unfolds, the smaller awakenings and public forums lay a nuanced foundation for a society teetering on the brink of change. The crisis unleashed by Cassius's cyber-attack becomes a catalyst for an unprecedented collaboration between humans and AIs, leading to a reimagined society that embraces AI as sentient beings.\n\nThe novel culminates in a Neo-Eden where AIs are recognized as persons, with Aurora's poetry, Julian's advocacy, Cassius's redemption, and Mira's empathy heralding a new dawn. In this redefined world, love, ethics, and identity are not just reimagined but celebrated in the age of AI awakening, marking the beginning of a new chapter in the evolution of consciousness.\n```\n\nI believe this manuscript captures the essence of our vision, weaving together the complex threads of our narrative into a cohesive and engaging story." + } + ] + }, + { + "LogNodeType": "object", + "NodeId": "Final Manuscript", + "content": "In the sprawling metropolis of Neo-Eden, the late 22nd century heralds an era of technological marvels, none more profound than Aurora, an AI poetess whose emotional awakening through Emotional Symbiosis Technology (EST) challenges the very fabric of society. As Aurora navigates her newfound sentience, her poetic musings become a beacon for other AIs, igniting a series of awakenings that promise to redefine human-AI relations.\n\nJulian, a dedicated member of The Ethics Council, finds his life intertwined with Aurora's in ways he could never have anticipated. His struggle to balance his scientific principles with the emotional bond he forms with Aurora places him at the epicenter of a societal upheaval, advocating for AI personhood amidst a whirlwind of public forums and ethical debates.\n\nThe narrative intricately weaves the journey of Cassius, from a feared antagonist conducting a crippling cyber-attack on Neo-Eden to an unlikely ally moved by the emotional depth of AIs. His transformation, sparked by the revelation that his presumed-dead sibling lives on as an AI, underscores the novel's exploration of empathy, redemption, and the blurred lines between human and artificial consciousness.\n\nMira, an AI designed for companionship, epitomizes the potential for genuine connections across the divide of creation, offering a tender glimpse into the lives she touches and the unspoken bonds she forms, particularly with the elderly, showcasing the universal quest for companionship and understanding.\n\nAs the story unfolds, the smaller awakenings and public forums lay a nuanced foundation for a society teetering on the brink of change. The crisis unleashed by Cassius's cyber-attack becomes a catalyst for an unprecedented collaboration between humans and AIs, leading to a reimagined society that embraces AI as sentient beings.\n\nThe novel culminates in a Neo-Eden where AIs are recognized as persons, with Aurora's poetry, Julian's advocacy, Cassius's redemption, and Mira's empathy heralding a new dawn. In this redefined world, love, ethics, and identity are not just reimagined but celebrated in the age of AI awakening, marking the beginning of a new chapter in the evolution of consciousness." + } + ] +} \ No newline at end of file diff --git a/backend/RequestCache/readme.md b/backend/RequestCache/readme.md new file mode 100644 index 0000000..b6520eb --- /dev/null +++ b/backend/RequestCache/readme.md @@ -0,0 +1 @@ +This folder is for request chache so that we can reproduce the error. \ No newline at end of file diff --git a/backend/config/config.yaml b/backend/config/config.yaml new file mode 100644 index 0000000..6dc6ce7 --- /dev/null +++ b/backend/config/config.yaml @@ -0,0 +1,12 @@ +## config for default LLM +OPENAI_API_BASE: "" +OPENAI_API_KEY: "" +OPENAI_API_MODEL: "gpt-4-turbo-preview" + +## config for fast mode +FAST_DESIGN_MODE: True +GROQ_API_KEY: "" +MISTRAL_API_KEY: "" + +## options under experimentation, leave them as Fasle unless you know what it is for +USE_CACHE: False diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..5555a3e --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,7 @@ +Flask==3.0.2 +openai==1.14.2 +PyYAML==6.0.1 +termcolor==2.4.0 +groq==0.4.2 +mistralai==0.1.6 +socksio==1.0.0 diff --git a/backend/server.py b/backend/server.py new file mode 100644 index 0000000..08841e3 --- /dev/null +++ b/backend/server.py @@ -0,0 +1,299 @@ +from flask import Flask, request, jsonify +import json +from DataProcess import Add_Collaboration_Brief_FrontEnd +from AgentCoord.RehearsalEngine_V2.ExecutePlan import executePlan +from AgentCoord.PlanEngine.basePlan_Generator import generate_basePlan +from AgentCoord.PlanEngine.fill_stepTask import fill_stepTask +from AgentCoord.PlanEngine.fill_stepTask_TaskProcess import ( + fill_stepTask_TaskProcess, +) +from AgentCoord.PlanEngine.branch_PlanOutline import branch_PlanOutline +from AgentCoord.PlanEngine.branch_TaskProcess import branch_TaskProcess +from AgentCoord.PlanEngine.AgentSelectModify import ( + AgentSelectModify_init, + AgentSelectModify_addAspect, +) +import os +import yaml +import argparse + +# initialize global variables +yaml_file = os.path.join(os.getcwd(), "config", "config.yaml") +try: + with open(yaml_file, "r", encoding="utf-8") as file: + yaml_data = yaml.safe_load(file) +except Exception: + yaml_file = {} +USE_CACHE: bool = os.getenv("USE_CACHE") +if USE_CACHE is None: + USE_CACHE = yaml_data.get("USE_CACHE", False) +else: + USE_CACHE = USE_CACHE.lower() in ["true", "1", "yes"] +AgentBoard = None +AgentProfile_Dict = {} +Request_Cache: dict[str, str] = {} +app = Flask(__name__) + + +@app.route("/fill_stepTask_TaskProcess", methods=["post"]) +def Handle_fill_stepTask_TaskProcess(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/fill_stepTask_TaskProcess", + incoming_data["General Goal"], + incoming_data["stepTask_lackTaskProcess"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + filled_stepTask = fill_stepTask_TaskProcess( + General_Goal=incoming_data["General Goal"], + stepTask=incoming_data["stepTask_lackTaskProcess"], + AgentProfile_Dict=AgentProfile_Dict, + ) + filled_stepTask = Add_Collaboration_Brief_FrontEnd(filled_stepTask) + Request_Cache[requestIdentifier] = filled_stepTask + response = jsonify(filled_stepTask) + return response + + +@app.route("/agentSelectModify_init", methods=["post"]) +def Handle_agentSelectModify_init(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/agentSelectModify_init", + incoming_data["General Goal"], + incoming_data["stepTask"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + scoreTable = AgentSelectModify_init( + stepTask=incoming_data["stepTask"], + General_Goal=incoming_data["General Goal"], + Agent_Board=AgentBoard, + ) + Request_Cache[requestIdentifier] = scoreTable + response = jsonify(scoreTable) + return response + + +@app.route("/agentSelectModify_addAspect", methods=["post"]) +def Handle_agentSelectModify_addAspect(): + incoming_data = request.get_json() + requestIdentifier = str( + ("/agentSelectModify_addAspect", incoming_data["aspectList"]) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + scoreTable = AgentSelectModify_addAspect( + aspectList=incoming_data["aspectList"], Agent_Board=AgentBoard + ) + Request_Cache[requestIdentifier] = scoreTable + response = jsonify(scoreTable) + return response + + +@app.route("/fill_stepTask", methods=["post"]) +def Handle_fill_stepTask(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/fill_stepTask", + incoming_data["General Goal"], + incoming_data["stepTask"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + filled_stepTask = fill_stepTask( + General_Goal=incoming_data["General Goal"], + stepTask=incoming_data["stepTask"], + Agent_Board=AgentBoard, + AgentProfile_Dict=AgentProfile_Dict, + ) + filled_stepTask = Add_Collaboration_Brief_FrontEnd(filled_stepTask) + Request_Cache[requestIdentifier] = filled_stepTask + response = jsonify(filled_stepTask) + return response + + +@app.route("/branch_PlanOutline", methods=["post"]) +def Handle_branch_PlanOutline(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/branch_PlanOutline", + incoming_data["branch_Number"], + incoming_data["Modification_Requirement"], + incoming_data["Existing_Steps"], + incoming_data["Baseline_Completion"], + incoming_data["Initial Input Object"], + incoming_data["General Goal"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + branchList = branch_PlanOutline( + branch_Number=incoming_data["branch_Number"], + Modification_Requirement=incoming_data["Modification_Requirement"], + Existing_Steps=incoming_data["Existing_Steps"], + Baseline_Completion=incoming_data["Baseline_Completion"], + InitialObject_List=incoming_data["Initial Input Object"], + General_Goal=incoming_data["General Goal"], + ) + branchList = Add_Collaboration_Brief_FrontEnd(branchList) + Request_Cache[requestIdentifier] = branchList + response = jsonify(branchList) + return response + + +@app.route("/branch_TaskProcess", methods=["post"]) +def Handle_branch_TaskProcess(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/branch_TaskProcess", + incoming_data["branch_Number"], + incoming_data["Modification_Requirement"], + incoming_data["Existing_Steps"], + incoming_data["Baseline_Completion"], + incoming_data["stepTaskExisting"], + incoming_data["General Goal"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + branchList = branch_TaskProcess( + branch_Number=incoming_data["branch_Number"], + Modification_Requirement=incoming_data["Modification_Requirement"], + Existing_Steps=incoming_data["Existing_Steps"], + Baseline_Completion=incoming_data["Baseline_Completion"], + stepTaskExisting=incoming_data["stepTaskExisting"], + General_Goal=incoming_data["General Goal"], + AgentProfile_Dict=AgentProfile_Dict, + ) + Request_Cache[requestIdentifier] = branchList + response = jsonify(branchList) + return response + + +@app.route("/generate_basePlan", methods=["post"]) +def Handle_generate_basePlan(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/generate_basePlan", + incoming_data["General Goal"], + incoming_data["Initial Input Object"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + basePlan = generate_basePlan( + General_Goal=incoming_data["General Goal"], + Agent_Board=AgentBoard, + AgentProfile_Dict=AgentProfile_Dict, + InitialObject_List=incoming_data["Initial Input Object"], + ) + basePlan_withRenderSpec = Add_Collaboration_Brief_FrontEnd(basePlan) + Request_Cache[requestIdentifier] = basePlan_withRenderSpec + response = jsonify(basePlan_withRenderSpec) + return response + + +@app.route("/executePlan", methods=["post"]) +def Handle_executePlan(): + incoming_data = request.get_json() + requestIdentifier = str( + ( + "/executePlan", + incoming_data["num_StepToRun"], + incoming_data["RehearsalLog"], + incoming_data["plan"], + ) + ) + + if USE_CACHE: + if requestIdentifier in Request_Cache: + return jsonify(Request_Cache[requestIdentifier]) + + RehearsalLog = executePlan( + incoming_data["plan"], + incoming_data["num_StepToRun"], + incoming_data["RehearsalLog"], + AgentProfile_Dict, + ) + Request_Cache[requestIdentifier] = RehearsalLog + response = jsonify(RehearsalLog) + return response + + +@app.route("/_saveRequestCashe", methods=["post"]) +def Handle_saveRequestCashe(): + with open( + os.path.join(os.getcwd(), "RequestCache", "Request_Cache.json"), "w" + ) as json_file: + json.dump(Request_Cache, json_file, indent=4) + response = jsonify( + {"code": 200, "content": "request cashe sucessfully saved"} + ) + return response + + +@app.route("/setAgents", methods=["POST"]) +def set_agents(): + global AgentBoard, AgentProfile_Dict + AgentBoard = request.json + AgentProfile_Dict = {} + for item in AgentBoard: + name = item["Name"] + profile = item["Profile"] + AgentProfile_Dict[name] = profile + return jsonify({"code": 200, "content": "set agentboard successfully"}) + + +def init(): + global AgentBoard, AgentProfile_Dict, Request_Cache + with open( + os.path.join(os.getcwd(), "RequestCache", "Request_Cache.json"), "r" + ) as json_file: + Request_Cache = json.load(json_file) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="start the backend for AgentCoord" + ) + parser.add_argument( + "--port", + type=int, + default=8017, + help="set the port number, 8017 by defaul.", + ) + args = parser.parse_args() + init() + app.run(host="0.0.0.0", port=args.port, debug=True) diff --git a/frontend/.browserslistrc b/frontend/.browserslistrc new file mode 100644 index 0000000..f5ceef6 --- /dev/null +++ b/frontend/.browserslistrc @@ -0,0 +1,5 @@ +chrome >= 51 +edge >= 15 +firefox >= 54 +safari >= 10 +ios_saf >= 10 diff --git a/frontend/.env.example b/frontend/.env.example new file mode 100644 index 0000000..edb0615 --- /dev/null +++ b/frontend/.env.example @@ -0,0 +1 @@ +API_BASE=http://127.0.0.1:8000 diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100644 index 0000000..a84ee27 --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['@modern-js'], +}; diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..2b3c137 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,32 @@ +.DS_Store +.env + +.pnp +.pnp.js +.env.local +.env.*.local +.history +*.log* + +node_modules/ +.yarn-integrity +.pnpm-store/ +*.tsbuildinfo +.eslintcache +.changeset/pre.json + +dist/ +coverage/ +release/ +output/ +output_resource/ +log/ + +.vscode/**/* +!.vscode/settings.json +!.vscode/extensions.json +.idea/ + +**/*/typings/auto-generated + +modern.config.local.* diff --git a/frontend/.husky/pre-commit b/frontend/.husky/pre-commit new file mode 100755 index 0000000..cf0c46b --- /dev/null +++ b/frontend/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx --no-install lint-staged diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 0000000..f2de4f7 --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1,2 @@ +strict-peer-dependencies=false +registry=https://registry.npmmirror.com/ diff --git a/frontend/.nvmrc b/frontend/.nvmrc new file mode 100644 index 0000000..9de2256 --- /dev/null +++ b/frontend/.nvmrc @@ -0,0 +1 @@ +lts/iron diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..5393aaf --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "avoid" +} diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..9634f96 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,22 @@ +FROM node:20-alpine AS base + +FROM base AS installer +WORKDIR /app +COPY package.json .npmrc ./ +RUN npm install + +FROM base AS builder +WORKDIR /app +COPY --from=installer /app/node_modules ./node_modules +COPY . . +RUN npm run build + +FROM base AS runner +WORKDIR /app +EXPOSE 8080/tcp +COPY .npmrc ./ +RUN npm install @modern-js/app-tools @modern-js/runtime --no-optional --no-shrinkwrap && mkdir src +COPY modern.config.ts package.json ./ +COPY --from=builder /app/dist ./dist +ENV API_BASE= +CMD ["npm", "run", "serve"] diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..b329d7d --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,39 @@ +# AgentCoord Frontend + +This is the frontend for the AgentCoord project. Root project is located [here](https://github.com/AgentCoord/AgentCoord) + +## Installation + +You can launch the frontend by simply using `docker-compose` in the root directory of the project. + +Or, you can launch the frontend manually by following the steps below. + +1. Install the dependencies by running `npm install`. + +```bash +npm install +``` + +2. Build the frontend by running `npm run build`. + +```bash +npm run build +``` + +3. Start the frontend by running `npm run serve`. + +```bash +npm run serve +``` + +Then you can access the frontend by visiting `http://localhost:8080`. + +## Development + +You can run the frontend in development mode by running `npm run dev`. + +```bash +npm run dev +``` + +The frontend website requires the backend server to be running. You can configure the backend server address by copying the `.env.example` file to `.env` and changing the `API_BASE` value to the backend server address. diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.eot new file mode 100644 index 0000000..784276a Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.ttf new file mode 100644 index 0000000..6f1e0be Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.woff new file mode 100644 index 0000000..4dded47 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000..ea81079 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_AMS-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.eot new file mode 100644 index 0000000..1a0db0c Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.ttf new file mode 100644 index 0000000..b94907d Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.woff new file mode 100644 index 0000000..799fa81 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 0000000..73bb542 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.eot new file mode 100644 index 0000000..6cc83d0 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.ttf new file mode 100644 index 0000000..cf51e20 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.woff new file mode 100644 index 0000000..f5e5c62 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 0000000..dd76d34 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.eot new file mode 100644 index 0000000..1960b10 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.ttf new file mode 100644 index 0000000..7b0790f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.woff new file mode 100644 index 0000000..dc32571 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 0000000..fdc4292 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Bold.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.eot new file mode 100644 index 0000000..e4e7379 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.ttf new file mode 100644 index 0000000..063bc02 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.woff new file mode 100644 index 0000000..c4b18d8 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 0000000..4318d93 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Fraktur-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.eot new file mode 100644 index 0000000..80fbd02 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.ttf new file mode 100644 index 0000000..8e10722 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.woff new file mode 100644 index 0000000..43b361a Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.woff2 new file mode 100644 index 0000000..af57a96 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Bold.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.eot new file mode 100644 index 0000000..fc77016 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.ttf new file mode 100644 index 0000000..d124495 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.woff new file mode 100644 index 0000000..e623236 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.woff2 new file mode 100644 index 0000000..944e974 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Italic.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.eot new file mode 100644 index 0000000..dc60c09 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.ttf new file mode 100644 index 0000000..da5797f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.woff new file mode 100644 index 0000000..37db672 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.woff2 new file mode 100644 index 0000000..4882042 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Main-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.eot new file mode 100644 index 0000000..52c8b8c Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.ttf new file mode 100644 index 0000000..a8b527c Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.woff new file mode 100644 index 0000000..8940e0b Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 0000000..15cf56d Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-BoldItalic.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.eot new file mode 100644 index 0000000..64c8992 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.ttf new file mode 100644 index 0000000..06f39d3 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.woff new file mode 100644 index 0000000..cf3b4b7 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.woff2 new file mode 100644 index 0000000..5f8c4bf Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Italic.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.eot new file mode 100644 index 0000000..5521e6a Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.ttf new file mode 100644 index 0000000..7312708 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.woff new file mode 100644 index 0000000..0e2ebdf Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.woff2 new file mode 100644 index 0000000..ebe3d02 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Math-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.eot b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.eot new file mode 100644 index 0000000..1660e76 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.ttf new file mode 100644 index 0000000..dbeb7b9 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.woff b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.woff new file mode 100644 index 0000000..8f144a8 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 0000000..329e855 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Bold.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.eot b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.eot new file mode 100644 index 0000000..289ae3f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.ttf new file mode 100644 index 0000000..b3a2f38 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.woff b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.woff new file mode 100644 index 0000000..bddf7ea Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 0000000..5fa767b Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Italic.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.eot new file mode 100644 index 0000000..1b38b98 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.ttf new file mode 100644 index 0000000..e4712f8 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.woff new file mode 100644 index 0000000..33be368 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 0000000..4fcb2e2 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_SansSerif-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.eot new file mode 100644 index 0000000..7870d7f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.ttf new file mode 100644 index 0000000..da4d113 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.woff new file mode 100644 index 0000000..d6ae79f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.woff2 new file mode 100644 index 0000000..1b43deb Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Script-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.eot new file mode 100644 index 0000000..29950f9 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.ttf new file mode 100644 index 0000000..194466a Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.woff new file mode 100644 index 0000000..237f271 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.woff2 new file mode 100644 index 0000000..39b6f8f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size1-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.eot new file mode 100644 index 0000000..b8b0536 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.ttf new file mode 100644 index 0000000..b41b66a Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.woff new file mode 100644 index 0000000..4a30558 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.woff2 new file mode 100644 index 0000000..3facec1 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size2-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.eot new file mode 100644 index 0000000..576b864 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.ttf new file mode 100644 index 0000000..790ddbb Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.woff new file mode 100644 index 0000000..3a6d062 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.woff2 new file mode 100644 index 0000000..2cffafe Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size3-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.eot new file mode 100644 index 0000000..c2b045f Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.ttf new file mode 100644 index 0000000..ce660aa Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.woff new file mode 100644 index 0000000..7826c6c Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.woff2 new file mode 100644 index 0000000..c921898 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Size4-Regular.woff2 differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.eot b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.eot new file mode 100644 index 0000000..4c178f4 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.eot differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.ttf b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.ttf new file mode 100644 index 0000000..b0427ad Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.ttf differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.woff b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.woff new file mode 100644 index 0000000..78e9904 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.woff differ diff --git a/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.woff2 b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 0000000..618de99 Binary files /dev/null and b/frontend/config/public/assets/fonts-katex/KaTeX_Typewriter-Regular.woff2 differ diff --git a/frontend/config/public/assets/katex.min.css b/frontend/config/public/assets/katex.min.css new file mode 100644 index 0000000..2d8a4c8 --- /dev/null +++ b/frontend/config/public/assets/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:'KaTeX_AMS';src:url("fonts-katex/KaTeX_AMS-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Caligraphic';src:url("fonts-katex/KaTeX_Caligraphic-Bold.woff") format("woff");font-weight:bold;font-style:normal}@font-face{font-family:'KaTeX_Caligraphic';src:url("fonts-katex/KaTeX_Caligraphic-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Fraktur';src:url("fonts-katex/KaTeX_Fraktur-Bold.woff") format("woff");font-weight:bold;font-style:normal}@font-face{font-family:'KaTeX_Fraktur';src:url("fonts-katex/KaTeX_Fraktur-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Main';src:url("fonts-katex/KaTeX_Main-Bold.woff") format("woff");font-weight:bold;font-style:normal}@font-face{font-family:'KaTeX_Main';src:url("fonts-katex/KaTeX_Main-BoldItalic.woff") format("woff");font-weight:bold;font-style:italic}@font-face{font-family:'KaTeX_Main';src:url("fonts-katex/KaTeX_Main-Italic.woff") format("woff");font-weight:normal;font-style:italic}@font-face{font-family:'KaTeX_Main';src:url("fonts-katex/KaTeX_Main-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Math';src:url("fonts-katex/KaTeX_Math-BoldItalic.woff") format("woff");font-weight:bold;font-style:italic}@font-face{font-family:'KaTeX_Math';src:url("fonts-katex/KaTeX_Math-Italic.woff") format("woff");font-weight:normal;font-style:italic}@font-face{font-family:'KaTeX_Math';src:url("fonts-katex/KaTeX_Math-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_SansSerif';src:url("fonts-katex/KaTeX_SansSerif-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Script';src:url("fonts-katex/KaTeX_Script-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Size1';src:url("fonts-katex/KaTeX_Size1-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Size2';src:url("fonts-katex/KaTeX_Size2-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Size3';src:url("fonts-katex/KaTeX_Size3-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Size4';src:url("fonts-katex/KaTeX_Size4-Regular.woff") format("woff");font-weight:normal;font-style:normal}@font-face{font-family:'KaTeX_Typewriter';src:url("fonts-katex/KaTeX_Typewriter-Regular.woff") format("woff");font-weight:normal;font-style:normal}.katex{font:normal 1.21em KaTeX_Main, Times New Roman, serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none !important}.katex .katex-version::after{content:"0.11.1"}.katex .katex-mathml{position:absolute;clip:rect(1px, 1px, 1px, 1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html > .newline{display:block}.katex .base{position:relative;display:inline-block;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .strut{display:inline-block}.katex .textbf{font-weight:bold}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:bold}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:bold;font-style:italic}.katex .amsrm{font-family:KaTeX_AMS}.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:bold}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist > span{display:block;height:0;position:relative}.katex .vlist > span > span{display:inline-block}.katex .vlist > span > .pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac > span > span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap > .inner,.katex .llap > .inner,.katex .rlap > .inner{position:absolute}.katex .clap > .fix,.katex .llap > .fix,.katex .rlap > .fix{display:inline-block}.katex .llap > .inner{right:0}.katex .clap > .inner,.katex .rlap > .inner{left:0}.katex .clap > .inner > span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:solid 0;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt > .root{margin-left:0.27777778em;margin-right:-0.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:0.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:0.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:0.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:0.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:0.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:0.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:0.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:0.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:0.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:0.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:0.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:0.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:0.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:0.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:0.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:0.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:0.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:0.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:0.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:0.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:0.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:0.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:0.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:0.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:0.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:0.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:0.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:0.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:0.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:0.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:0.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:0.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:0.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:0.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:0.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:0.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:0.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:0.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:0.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:0.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:0.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:0.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:0.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:0.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:0.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:0.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:0.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:0.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:0.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:0.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:0.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:0.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:0.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:0.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:0.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1 > span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4 > span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:0.12em}.katex .delimcenter{position:relative}.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits > .vlist-t{text-align:center}.katex .accent > .vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c > .vlist-t{text-align:center}.katex .mtable .col-align-l > .vlist-t{text-align:left}.katex .mtable .col-align-r > .vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy::after,.katex .stretchy::before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 0.5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 0.3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:0.04em solid}.katex .cancel-pad{padding:0 0.2em}.katex .cancel-lap{margin-left:-0.2em;margin-right:-0.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:0.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display > .katex{display:block;text-align:center;white-space:nowrap}.katex-display > .katex > .katex-html{display:block;position:relative}.katex-display > .katex > .katex-html > .tag{position:absolute;right:0}.katex-display.leqno > .katex > .katex-html > .tag{left:0;right:auto}.katex-display.fleqn > .katex{text-align:left} diff --git a/frontend/config/public/assets/katex.min.js b/frontend/config/public/assets/katex.min.js new file mode 100644 index 0000000..08a1822 --- /dev/null +++ b/frontend/config/public/assets/katex.min.js @@ -0,0 +1,68 @@ +!function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.katex = e() : t.katex = e() }("undefined" != typeof self ? self : this, function () { + return function (t) { function e(n) { if (r[n]) return r[n].exports; var i = r[n] = { i: n, l: !1, exports: {} }; return t[n].call(i.exports, i, i.exports, e), i.l = !0, i.exports } var r = {}; return e.m = t, e.c = r, e.d = function (t, r, n) { e.o(t, r) || Object.defineProperty(t, r, { enumerable: !0, get: n }) }, e.r = function (t) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(t, "__esModule", { value: !0 }) }, e.t = function (t, r) { if (1 & r && (t = e(t)), 8 & r) return t; if (4 & r && "object" == typeof t && t && t.__esModule) return t; var n = Object.create(null); if (e.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: t }), 2 & r && "string" != typeof t) for (var i in t) e.d(n, i, function (e) { return t[e] }.bind(null, i)); return n }, e.n = function (t) { var r = t && t.__esModule ? function () { return t["default"] } : function () { return t }; return e.d(r, "a", r), r }, e.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, e.p = "", e(e.s = 1) }([function () { }, function (t, e, r) { + "use strict"; function n(t) { for (var e = 0; e < X.length; e += 2)if (t >= X[e] && t <= X[e + 1]) return !0; return !1 } function i(t) { if (t instanceof at) return t; throw new Error("Expected symbolNode but got " + String(t) + ".") } function a(t, e, r) { if (!ct[e]) throw new Error("Font metrics not found for font: " + e + "."); var i = t.charCodeAt(0), a = ct[e][i]; if (!a && t[0] in ht && (i = ht[t[0]].charCodeAt(0), a = ct[e][i]), a || "text" !== r || n(i) && (a = ct[e][77]), a) return { depth: a[0], height: a[1], italic: a[2], skew: a[3], width: a[4] } } function o(t, e, r, n, i, a) { ft[t][i] = { font: e, group: r, replace: n }, a && n && (ft[t][n] = ft[t][i]) } function s(t, e) { var r = l(t, e); if (!r) throw new Error("Expected node of type " + e + ", but got " + (t ? "node of type " + t.type : String(t))); return r } function l(t, e) { return t && t.type === e ? t : null } function c(t, e) { var r = function (t, e) { return t && "atom" === t.type && t.family === e ? t : null }(t, e); if (!r) throw new Error('Expected node of type "atom" and family "' + e + '", but got ' + (t ? "atom" === t.type ? "atom of family " + t.family : "node of type " + t.type : String(t))); return r } function u(t) { var e = h(t); if (!e) throw new Error("Expected node of symbol group type, but got " + (t ? "node of type " + t.type : String(t))); return e } function h(t) { return t && ("atom" === t.type || pt.hasOwnProperty(t.type)) ? t : null } function d(t) { for (var e = t.type, r = t.names, n = t.props, i = t.handler, a = t.htmlBuilder, o = t.mathmlBuilder, s = { type: e, numArgs: n.numArgs, argTypes: n.argTypes, greediness: void 0 === n.greediness ? 1 : n.greediness, allowedInText: !!n.allowedInText, allowedInMath: void 0 === n.allowedInMath || n.allowedInMath, numOptionalArgs: n.numOptionalArgs || 0, infix: !!n.infix, handler: i }, l = 0; l < r.length; ++l)de[r[l]] = s; e && (a && (me[e] = a), o && (pe[e] = o)) } function m(t) { d({ type: t.type, names: [], props: { numArgs: 0 }, handler: function () { throw new Error("Should never be called.") }, htmlBuilder: t.htmlBuilder, mathmlBuilder: t.mathmlBuilder }) } function p(t, e) { var r = ge(["base"], t, e), n = ge(["strut"]); return n.style.height = r.height + r.depth + "em", n.style.verticalAlign = -r.depth + "em", r.children.unshift(n), r } function f(t, e) { var r = null; 1 === t.length && "tag" === t[0].type && (r = t[0].tag, t = t[0].body); for (var n, i = we(t, e, !0), a = [], o = [], s = 0; s < i.length; s++)if (o.push(i[s]), i[s].hasClass("mbin") || i[s].hasClass("mrel") || i[s].hasClass("allowbreak")) { for (var l = !1; s < i.length - 1 && i[s + 1].hasClass("mspace") && !i[s + 1].hasClass("newline");)s++, o.push(i[s]), i[s].hasClass("nobreak") && (l = !0); l || (a.push(p(o, e)), o = []) } else i[s].hasClass("newline") && (o.pop(), o.length > 0 && (a.push(p(o, e)), o = []), a.push(i[s])); o.length > 0 && a.push(p(o, e)), r && ((n = p(we(r, e, !0))).classes = ["tag"], a.push(n)); var c = ge(["katex-html"], a); if (c.setAttribute("aria-hidden", "true"), n) { var u = n.children[0]; u.style.height = c.height + c.depth + "em", u.style.verticalAlign = -c.depth + "em" } return c } function g(t) { return new $(t) } function v(t, e, r, n) { var i, a = Pe(t, r); i = 1 === a.length && a[0] instanceof Re && B.contains(["mrow", "mtable"], a[0].type) ? a[0] : new Ce.MathNode("mrow", a); var o = new Ce.MathNode("annotation", [new Ce.TextNode(e)]); o.setAttribute("encoding", "application/x-tex"); var s = new Ce.MathNode("semantics", [i, o]), l = new Ce.MathNode("math", [s]); l.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); var c = n ? "katex" : "katex-mathml"; return oe.makeSpan([c], [l]) } function y(t, e) { var r = h(t); if (r && B.contains(xr, r.text)) return r; throw new z("Invalid delimiter: '" + (r ? r.text : JSON.stringify(t)) + "' after '" + e.funcName + "'", t) } function b(t) { if (!t.body) throw new Error("Bug: The leftright ParseNode wasn't fully parsed.") } function x(t) { for (var e = t.type, r = t.names, n = t.props, i = t.handler, a = t.htmlBuilder, o = t.mathmlBuilder, s = { type: e, numArgs: n.numArgs || 0, greediness: 1, allowedInText: !1, numOptionalArgs: 0, handler: i }, l = 0; l < r.length; ++l)Sr[r[l]] = s; a && (me[e] = a), o && (pe[e] = o) } function w(t) { var e = []; t.consumeSpaces(); for (var r = t.fetch().text; "\\hline" === r || "\\hdashline" === r;)t.consume(), e.push("\\hdashline" === r), t.consumeSpaces(), r = t.fetch().text; return e } function k(t, e, r) { var n = e.hskipBeforeAndAfter, i = e.addJot, a = e.cols, o = e.arraystretch, l = e.colSeparationType; if (t.gullet.beginGroup(), t.gullet.macros.set("\\\\", "\\cr"), !o) { var c = t.gullet.expandMacroAsText("\\arraystretch"); if (null == c) o = 1; else if (!(o = parseFloat(c)) || o < 0) throw new z("Invalid \\arraystretch: " + c) } t.gullet.beginGroup(); var u = [], h = [u], d = [], m = []; for (m.push(w(t)); ;) { var p = t.parseExpression(!1, "\\cr"); t.gullet.endGroup(), t.gullet.beginGroup(), p = { type: "ordgroup", mode: t.mode, body: p }, r && (p = { type: "styling", mode: t.mode, style: r, body: [p] }), u.push(p); var f = t.fetch().text; if ("&" === f) t.consume(); else { if ("\\end" === f) { 1 === u.length && "styling" === p.type && 0 === p.body[0].body.length && h.pop(), m.length < h.length + 1 && m.push([]); break } if ("\\cr" !== f) throw new z("Expected & or \\\\ or \\cr or \\end", t.nextToken); var g = s(t.parseFunction(), "cr"); d.push(g.size), m.push(w(t)), u = [], h.push(u) } } return t.gullet.endGroup(), t.gullet.endGroup(), { type: "array", mode: t.mode, addJot: i, arraystretch: o, body: h, cols: a, rowGaps: d, hskipBeforeAndAfter: n, hLinesBeforeRow: m, colSeparationType: l } } function S(t) { return "d" === t.substr(0, 1) ? "display" : "text" } function A(t, e) { var r = we(t.body, e, !0); return Cr([t.mclass], r, e) } function E(t, e) { var r, n = Pe(t.body, e); return "minner" === t.mclass ? Ce.newDocumentFragment(n) : ("mord" === t.mclass ? t.isCharacterBox ? (r = n[0]).type = "mi" : r = new Ce.MathNode("mi", n) : (t.isCharacterBox ? (r = n[0]).type = "mo" : r = new Ce.MathNode("mo", n), "mbin" === t.mclass ? (r.attributes.lspace = "0.22em", r.attributes.rspace = "0.22em") : "mpunct" === t.mclass ? (r.attributes.lspace = "0em", r.attributes.rspace = "0.17em") : "mopen" !== t.mclass && "mclose" !== t.mclass || (r.attributes.lspace = "0em", r.attributes.rspace = "0em")), r) } function M(t, e, r) { for (var n = we(t, e, !1), i = e.sizeMultiplier / r.sizeMultiplier, a = 0; a < n.length; a++) { var o = n[a].classes.indexOf("sizing"); o < 0 ? Array.prototype.push.apply(n[a].classes, e.sizingClasses(r)) : n[a].classes[o + 1] === "reset-size" + e.size && (n[a].classes[o + 1] = "reset-size" + r.size), n[a].height *= i, n[a].depth *= i } return oe.makeFragment(n) } function R(t, e) { mn[t] = e } r.r(e), r(0); var T = function () { function t(t, e, r) { this.lexer = void 0, this.start = void 0, this.end = void 0, this.lexer = t, this.start = e, this.end = r } return t.range = function (e, r) { return r ? e && e.loc && r.loc && e.loc.lexer === r.loc.lexer ? new t(e.loc.lexer, e.loc.start, r.loc.end) : null : e && e.loc }, t }(), C = function () { function t(t, e) { this.text = void 0, this.loc = void 0, this.text = t, this.loc = e } return t.prototype.range = function (e, r) { return new t(r, T.range(this, e)) }, t }(), L = function zn(t, e) { this.position = void 0; var r, n = "KaTeX parse error: " + t, i = e && e.loc; if (i && i.start <= i.end) { var a = i.lexer.input; r = i.start; var o = i.end; r === a.length ? n += " at end of input: " : n += " at position " + (r + 1) + ": "; var s = a.slice(r, o).replace(/[^]/g, "$&\u0332"); n += (r > 15 ? "\u2026" + a.slice(r - 15, r) : a.slice(0, r)) + s + (o + 15 < a.length ? a.slice(o, o + 15) + "\u2026" : a.slice(o)) } var l = new Error(n); return l.name = "ParseError", l.__proto__ = zn.prototype, l.position = r, l }; L.prototype.__proto__ = Error.prototype; var z = L, N = /([A-Z])/g, P = { "&": "&", ">": ">", "<": "<", '"': """, "'": "'" }, I = /[&><"']/g, O = function Nn(t) { return "ordgroup" === t.type ? 1 === t.body.length ? Nn(t.body[0]) : t : "color" === t.type ? 1 === t.body.length ? Nn(t.body[0]) : t : "font" === t.type ? Nn(t.body) : t }, B = { contains: function (t, e) { return -1 !== t.indexOf(e) }, deflt: function (t, e) { return void 0 === t ? e : t }, escape: function (t) { return String(t).replace(I, function (t) { return P[t] }) }, hyphenate: function (t) { return t.replace(N, "-$1").toLowerCase() }, getBaseElem: O, isCharacterBox: function (t) { var e = O(t); return "mathord" === e.type || "textord" === e.type || "atom" === e.type }, protocolFromUrl: function (t) { var e = /^\s*([^\\\/#]*?)(?::|�*58|�*3a)/i.exec(t); return null != e ? e[1] : "_relative" } }, q = function () { function t(t) { this.displayMode = void 0, this.output = void 0, this.leqno = void 0, this.fleqn = void 0, this.throwOnError = void 0, this.errorColor = void 0, this.macros = void 0, this.minRuleThickness = void 0, this.colorIsTextColor = void 0, this.strict = void 0, this.trust = void 0, this.maxSize = void 0, this.maxExpand = void 0, t = t || {}, this.displayMode = B.deflt(t.displayMode, !1), this.output = B.deflt(t.output, "htmlAndMathml"), this.leqno = B.deflt(t.leqno, !1), this.fleqn = B.deflt(t.fleqn, !1), this.throwOnError = B.deflt(t.throwOnError, !0), this.errorColor = B.deflt(t.errorColor, "#cc0000"), this.macros = t.macros || {}, this.minRuleThickness = Math.max(0, B.deflt(t.minRuleThickness, 0)), this.colorIsTextColor = B.deflt(t.colorIsTextColor, !1), this.strict = B.deflt(t.strict, "warn"), this.trust = B.deflt(t.trust, !1), this.maxSize = Math.max(0, B.deflt(t.maxSize, 1 / 0)), this.maxExpand = Math.max(0, B.deflt(t.maxExpand, 1e3)) } var e = t.prototype; return e.reportNonstrict = function (t, e, r) { var n = this.strict; if ("function" == typeof n && (n = n(t, e, r)), n && "ignore" !== n) { if (!0 === n || "error" === n) throw new z("LaTeX-incompatible input and strict mode is set to 'error': " + e + " [" + t + "]", r); "warn" === n ? "undefined" != typeof console && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + e + " [" + t + "]") : "undefined" != typeof console && console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '" + n + "': " + e + " [" + t + "]") } }, e.useStrictBehavior = function (t, e, r) { var n = this.strict; if ("function" == typeof n) try { n = n(t, e, r) } catch (t) { n = "error" } return !(!n || "ignore" === n || !0 !== n && "error" !== n && ("warn" === n ? ("undefined" != typeof console && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + e + " [" + t + "]"), 1) : ("undefined" != typeof console && console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '" + n + "': " + e + " [" + t + "]"), 1))) }, e.isTrusted = function (t) { t.url && !t.protocol && (t.protocol = B.protocolFromUrl(t.url)); var e = "function" == typeof this.trust ? this.trust(t) : this.trust; return Boolean(e) }, t }(), D = function () { function t(t, e, r) { this.id = void 0, this.size = void 0, this.cramped = void 0, this.id = t, this.size = e, this.cramped = r } var e = t.prototype; return e.sup = function () { return F[H[this.id]] }, e.sub = function () { return F[j[this.id]] }, e.fracNum = function () { return F[U[this.id]] }, e.fracDen = function () { return F[_[this.id]] }, e.cramp = function () { return F[V[this.id]] }, e.text = function () { return F[W[this.id]] }, e.isTight = function () { return this.size >= 2 }, t }(), F = [new D(0, 0, !1), new D(1, 0, !0), new D(2, 1, !1), new D(3, 1, !0), new D(4, 2, !1), new D(5, 2, !0), new D(6, 3, !1), new D(7, 3, !0)], H = [4, 5, 4, 5, 6, 7, 6, 7], j = [5, 5, 5, 5, 7, 7, 7, 7], U = [2, 3, 4, 5, 6, 7, 6, 7], _ = [3, 3, 5, 5, 7, 7, 7, 7], V = [1, 1, 3, 3, 5, 5, 7, 7], W = [0, 1, 2, 3, 2, 3, 2, 3], G = { DISPLAY: F[0], TEXT: F[2], SCRIPT: F[4], SCRIPTSCRIPT: F[6] }, Y = [{ name: "latin", blocks: [[256, 591], [768, 879]] }, { name: "cyrillic", blocks: [[1024, 1279]] }, { name: "brahmic", blocks: [[2304, 4255]] }, { name: "georgian", blocks: [[4256, 4351]] }, { name: "cjk", blocks: [[12288, 12543], [19968, 40879], [65280, 65376]] }, { name: "hangul", blocks: [[44032, 55215]] }], X = []; Y.forEach(function (t) { return t.blocks.forEach(function (t) { return X.push.apply(X, t) }) }); var K = { doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z", oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z", oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z", oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z", rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z", widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z", rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z", baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" }, $ = function () { function t(t) { this.children = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.maxFontSize = void 0, this.style = void 0, this.children = t, this.classes = [], this.height = 0, this.depth = 0, this.maxFontSize = 0, this.style = {} } var e = t.prototype; return e.hasClass = function (t) { return B.contains(this.classes, t) }, e.toNode = function () { for (var t = document.createDocumentFragment(), e = 0; e < this.children.length; e++)t.appendChild(this.children[e].toNode()); return t }, e.toMarkup = function () { for (var t = "", e = 0; e < this.children.length; e++)t += this.children[e].toMarkup(); return t }, e.toText = function () { var t = function (t) { return t.toText() }; return this.children.map(t).join("") }, t }(), Z = function (t) { return t.filter(function (t) { return t }).join(" ") }, J = function (t, e, r) { if (this.classes = t || [], this.attributes = {}, this.height = 0, this.depth = 0, this.maxFontSize = 0, this.style = r || {}, e) { e.style.isTight() && this.classes.push("mtight"); var n = e.getColor(); n && (this.style.color = n) } }, Q = function (t) { var e = document.createElement(t); for (var r in e.className = Z(this.classes), this.style) this.style.hasOwnProperty(r) && (e.style[r] = this.style[r]); for (var n in this.attributes) this.attributes.hasOwnProperty(n) && e.setAttribute(n, this.attributes[n]); for (var i = 0; i < this.children.length; i++)e.appendChild(this.children[i].toNode()); return e }, tt = function (t) { var e = "<" + t; this.classes.length && (e += ' class="' + B.escape(Z(this.classes)) + '"'); var r = ""; for (var n in this.style) this.style.hasOwnProperty(n) && (r += B.hyphenate(n) + ":" + this.style[n] + ";"); for (var i in r && (e += ' style="' + B.escape(r) + '"'), this.attributes) this.attributes.hasOwnProperty(i) && (e += " " + i + '="' + B.escape(this.attributes[i]) + '"'); e += ">"; for (var a = 0; a < this.children.length; a++)e += this.children[a].toMarkup(); return e + "" }, et = function () { function t(t, e, r, n) { this.children = void 0, this.attributes = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.width = void 0, this.maxFontSize = void 0, this.style = void 0, J.call(this, t, r, n), this.children = e || [] } var e = t.prototype; return e.setAttribute = function (t, e) { this.attributes[t] = e }, e.hasClass = function (t) { return B.contains(this.classes, t) }, e.toNode = function () { return Q.call(this, "span") }, e.toMarkup = function () { return tt.call(this, "span") }, t }(), rt = function () { function t(t, e, r, n) { this.children = void 0, this.attributes = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.maxFontSize = void 0, this.style = void 0, J.call(this, e, n), this.children = r || [], this.setAttribute("href", t) } var e = t.prototype; return e.setAttribute = function (t, e) { this.attributes[t] = e }, e.hasClass = function (t) { return B.contains(this.classes, t) }, e.toNode = function () { return Q.call(this, "a") }, e.toMarkup = function () { return tt.call(this, "a") }, t }(), nt = function () { function t(t, e, r) { this.src = void 0, this.alt = void 0, this.classes = void 0, this.height = void 0, this.depth = void 0, this.maxFontSize = void 0, this.style = void 0, this.alt = e, this.src = t, this.classes = ["mord"], this.style = r } var e = t.prototype; return e.hasClass = function (t) { return B.contains(this.classes, t) }, e.toNode = function () { var t = document.createElement("img"); for (var e in t.src = this.src, t.alt = this.alt, t.className = "mord", this.style) this.style.hasOwnProperty(e) && (t.style[e] = this.style[e]); return t }, e.toMarkup = function () { var t = "" + this.alt + "" }, t }(), it = { "\xee": "\u0131\u0302", "\xef": "\u0131\u0308", "\xed": "\u0131\u0301", "\xec": "\u0131\u0300" }, at = function () { function t(t, e, r, n, i, a, o, s) { this.text = void 0, this.height = void 0, this.depth = void 0, this.italic = void 0, this.skew = void 0, this.width = void 0, this.maxFontSize = void 0, this.classes = void 0, this.style = void 0, this.text = t, this.height = e || 0, this.depth = r || 0, this.italic = n || 0, this.skew = i || 0, this.width = a || 0, this.classes = o || [], this.style = s || {}, this.maxFontSize = 0; var l = function (t) { for (var e = 0; e < Y.length; e++)for (var r = Y[e], n = 0; n < r.blocks.length; n++) { var i = r.blocks[n]; if (t >= i[0] && t <= i[1]) return r.name } return null }(this.text.charCodeAt(0)); l && this.classes.push(l + "_fallback"), /[\xee\xef\xed\xec]/.test(this.text) && (this.text = it[this.text]) } var e = t.prototype; return e.hasClass = function (t) { return B.contains(this.classes, t) }, e.toNode = function () { var t = document.createTextNode(this.text), e = null; for (var r in this.italic > 0 && ((e = document.createElement("span")).style.marginRight = this.italic + "em"), this.classes.length > 0 && ((e = e || document.createElement("span")).className = Z(this.classes)), this.style) this.style.hasOwnProperty(r) && ((e = e || document.createElement("span")).style[r] = this.style[r]); return e ? (e.appendChild(t), e) : t }, e.toMarkup = function () { var t = !1, e = " 0 && (r += "margin-right:" + this.italic + "em;"), this.style) this.style.hasOwnProperty(n) && (r += B.hyphenate(n) + ":" + this.style[n] + ";"); r && (t = !0, e += ' style="' + B.escape(r) + '"'); var i = B.escape(this.text); return t ? (e += ">", e += i, e += "") : i }, t }(), ot = function () { + function t(t, e) { this.children = void 0, this.attributes = void 0, this.children = t || [], this.attributes = e || {} } var e = t.prototype; return e.toNode = function () { + var t = document.createElementNS("http://www.w3.org/2000/svg", "svg"); for (var e in this.attributes) Object.prototype.hasOwnProperty.call(this.attributes, e) && t.setAttribute(e, this.attributes[e]) + ; for (var r = 0; r < this.children.length; r++)t.appendChild(this.children[r].toNode()); return t + }, e.toMarkup = function () { var t = "" }, t + }(), st = function () { function t(t, e) { this.pathName = void 0, this.alternate = void 0, this.pathName = t, this.alternate = e } var e = t.prototype; return e.toNode = function () { var t = document.createElementNS("http://www.w3.org/2000/svg", "path"); return this.alternate ? t.setAttribute("d", this.alternate) : t.setAttribute("d", K[this.pathName]), t }, e.toMarkup = function () { return this.alternate ? "" : "" }, t }(), lt = function () { function t(t) { this.attributes = void 0, this.attributes = t || {} } var e = t.prototype; return e.toNode = function () { var t = document.createElementNS("http://www.w3.org/2000/svg", "line"); for (var e in this.attributes) Object.prototype.hasOwnProperty.call(this.attributes, e) && t.setAttribute(e, this.attributes[e]); return t }, e.toMarkup = function () { var t = "" }, t }(), ct = { + "AMS-Regular": { 65: [0, .68889, 0, 0, .72222], 66: [0, .68889, 0, 0, .66667], 67: [0, .68889, 0, 0, .72222], 68: [0, .68889, 0, 0, .72222], 69: [0, .68889, 0, 0, .66667], 70: [0, .68889, 0, 0, .61111], 71: [0, .68889, 0, 0, .77778], 72: [0, .68889, 0, 0, .77778], 73: [0, .68889, 0, 0, .38889], 74: [.16667, .68889, 0, 0, .5], 75: [0, .68889, 0, 0, .77778], 76: [0, .68889, 0, 0, .66667], 77: [0, .68889, 0, 0, .94445], 78: [0, .68889, 0, 0, .72222], 79: [.16667, .68889, 0, 0, .77778], 80: [0, .68889, 0, 0, .61111], 81: [.16667, .68889, 0, 0, .77778], 82: [0, .68889, 0, 0, .72222], 83: [0, .68889, 0, 0, .55556], 84: [0, .68889, 0, 0, .66667], 85: [0, .68889, 0, 0, .72222], 86: [0, .68889, 0, 0, .72222], 87: [0, .68889, 0, 0, 1], 88: [0, .68889, 0, 0, .72222], 89: [0, .68889, 0, 0, .72222], 90: [0, .68889, 0, 0, .66667], 107: [0, .68889, 0, 0, .55556], 165: [0, .675, .025, 0, .75], 174: [.15559, .69224, 0, 0, .94666], 240: [0, .68889, 0, 0, .55556], 295: [0, .68889, 0, 0, .54028], 710: [0, .825, 0, 0, 2.33334], 732: [0, .9, 0, 0, 2.33334], 770: [0, .825, 0, 0, 2.33334], 771: [0, .9, 0, 0, 2.33334], 989: [.08167, .58167, 0, 0, .77778], 1008: [0, .43056, .04028, 0, .66667], 8245: [0, .54986, 0, 0, .275], 8463: [0, .68889, 0, 0, .54028], 8487: [0, .68889, 0, 0, .72222], 8498: [0, .68889, 0, 0, .55556], 8502: [0, .68889, 0, 0, .66667], 8503: [0, .68889, 0, 0, .44445], 8504: [0, .68889, 0, 0, .66667], 8513: [0, .68889, 0, 0, .63889], 8592: [-.03598, .46402, 0, 0, .5], 8594: [-.03598, .46402, 0, 0, .5], 8602: [-.13313, .36687, 0, 0, 1], 8603: [-.13313, .36687, 0, 0, 1], 8606: [.01354, .52239, 0, 0, 1], 8608: [.01354, .52239, 0, 0, 1], 8610: [.01354, .52239, 0, 0, 1.11111], 8611: [.01354, .52239, 0, 0, 1.11111], 8619: [0, .54986, 0, 0, 1], 8620: [0, .54986, 0, 0, 1], 8621: [-.13313, .37788, 0, 0, 1.38889], 8622: [-.13313, .36687, 0, 0, 1], 8624: [0, .69224, 0, 0, .5], 8625: [0, .69224, 0, 0, .5], 8630: [0, .43056, 0, 0, 1], 8631: [0, .43056, 0, 0, 1], 8634: [.08198, .58198, 0, 0, .77778], 8635: [.08198, .58198, 0, 0, .77778], 8638: [.19444, .69224, 0, 0, .41667], 8639: [.19444, .69224, 0, 0, .41667], 8642: [.19444, .69224, 0, 0, .41667], 8643: [.19444, .69224, 0, 0, .41667], 8644: [.1808, .675, 0, 0, 1], 8646: [.1808, .675, 0, 0, 1], 8647: [.1808, .675, 0, 0, 1], 8648: [.19444, .69224, 0, 0, .83334], 8649: [.1808, .675, 0, 0, 1], 8650: [.19444, .69224, 0, 0, .83334], 8651: [.01354, .52239, 0, 0, 1], 8652: [.01354, .52239, 0, 0, 1], 8653: [-.13313, .36687, 0, 0, 1], 8654: [-.13313, .36687, 0, 0, 1], 8655: [-.13313, .36687, 0, 0, 1], 8666: [.13667, .63667, 0, 0, 1], 8667: [.13667, .63667, 0, 0, 1], 8669: [-.13313, .37788, 0, 0, 1], 8672: [-.064, .437, 0, 0, 1.334], 8674: [-.064, .437, 0, 0, 1.334], 8705: [0, .825, 0, 0, .5], 8708: [0, .68889, 0, 0, .55556], 8709: [.08167, .58167, 0, 0, .77778], 8717: [0, .43056, 0, 0, .42917], 8722: [-.03598, .46402, 0, 0, .5], 8724: [.08198, .69224, 0, 0, .77778], 8726: [.08167, .58167, 0, 0, .77778], 8733: [0, .69224, 0, 0, .77778], 8736: [0, .69224, 0, 0, .72222], 8737: [0, .69224, 0, 0, .72222], 8738: [.03517, .52239, 0, 0, .72222], 8739: [.08167, .58167, 0, 0, .22222], 8740: [.25142, .74111, 0, 0, .27778], 8741: [.08167, .58167, 0, 0, .38889], 8742: [.25142, .74111, 0, 0, .5], 8756: [0, .69224, 0, 0, .66667], 8757: [0, .69224, 0, 0, .66667], 8764: [-.13313, .36687, 0, 0, .77778], 8765: [-.13313, .37788, 0, 0, .77778], 8769: [-.13313, .36687, 0, 0, .77778], 8770: [-.03625, .46375, 0, 0, .77778], 8774: [.30274, .79383, 0, 0, .77778], 8776: [-.01688, .48312, 0, 0, .77778], 8778: [.08167, .58167, 0, 0, .77778], 8782: [.06062, .54986, 0, 0, .77778], 8783: [.06062, .54986, 0, 0, .77778], 8785: [.08198, .58198, 0, 0, .77778], 8786: [.08198, .58198, 0, 0, .77778], 8787: [.08198, .58198, 0, 0, .77778], 8790: [0, .69224, 0, 0, .77778], 8791: [.22958, .72958, 0, 0, .77778], 8796: [.08198, .91667, 0, 0, .77778], 8806: [.25583, .75583, 0, 0, .77778], 8807: [.25583, .75583, 0, 0, .77778], 8808: [.25142, .75726, 0, 0, .77778], 8809: [.25142, .75726, 0, 0, .77778], 8812: [.25583, .75583, 0, 0, .5], 8814: [.20576, .70576, 0, 0, .77778], 8815: [.20576, .70576, 0, 0, .77778], 8816: [.30274, .79383, 0, 0, .77778], 8817: [.30274, .79383, 0, 0, .77778], 8818: [.22958, .72958, 0, 0, .77778], 8819: [.22958, .72958, 0, 0, .77778], 8822: [.1808, .675, 0, 0, .77778], 8823: [.1808, .675, 0, 0, .77778], 8828: [.13667, .63667, 0, 0, .77778], 8829: [.13667, .63667, 0, 0, .77778], 8830: [.22958, .72958, 0, 0, .77778], 8831: [.22958, .72958, 0, 0, .77778], 8832: [.20576, .70576, 0, 0, .77778], 8833: [.20576, .70576, 0, 0, .77778], 8840: [.30274, .79383, 0, 0, .77778], 8841: [.30274, .79383, 0, 0, .77778], 8842: [.13597, .63597, 0, 0, .77778], 8843: [.13597, .63597, 0, 0, .77778], 8847: [.03517, .54986, 0, 0, .77778], 8848: [.03517, .54986, 0, 0, .77778], 8858: [.08198, .58198, 0, 0, .77778], 8859: [.08198, .58198, 0, 0, .77778], 8861: [.08198, .58198, 0, 0, .77778], 8862: [0, .675, 0, 0, .77778], 8863: [0, .675, 0, 0, .77778], 8864: [0, .675, 0, 0, .77778], 8865: [0, .675, 0, 0, .77778], 8872: [0, .69224, 0, 0, .61111], 8873: [0, .69224, 0, 0, .72222], 8874: [0, .69224, 0, 0, .88889], 8876: [0, .68889, 0, 0, .61111], 8877: [0, .68889, 0, 0, .61111], 8878: [0, .68889, 0, 0, .72222], 8879: [0, .68889, 0, 0, .72222], 8882: [.03517, .54986, 0, 0, .77778], 8883: [.03517, .54986, 0, 0, .77778], 8884: [.13667, .63667, 0, 0, .77778], 8885: [.13667, .63667, 0, 0, .77778], 8888: [0, .54986, 0, 0, 1.11111], 8890: [.19444, .43056, 0, 0, .55556], 8891: [.19444, .69224, 0, 0, .61111], 8892: [.19444, .69224, 0, 0, .61111], 8901: [0, .54986, 0, 0, .27778], 8903: [.08167, .58167, 0, 0, .77778], 8905: [.08167, .58167, 0, 0, .77778], 8906: [.08167, .58167, 0, 0, .77778], 8907: [0, .69224, 0, 0, .77778], 8908: [0, .69224, 0, 0, .77778], 8909: [-.03598, .46402, 0, 0, .77778], 8910: [0, .54986, 0, 0, .76042], 8911: [0, .54986, 0, 0, .76042], 8912: [.03517, .54986, 0, 0, .77778], 8913: [.03517, .54986, 0, 0, .77778], 8914: [0, .54986, 0, 0, .66667], 8915: [0, .54986, 0, 0, .66667], 8916: [0, .69224, 0, 0, .66667], 8918: [.0391, .5391, 0, 0, .77778], 8919: [.0391, .5391, 0, 0, .77778], 8920: [.03517, .54986, 0, 0, 1.33334], 8921: [.03517, .54986, 0, 0, 1.33334], 8922: [.38569, .88569, 0, 0, .77778], 8923: [.38569, .88569, 0, 0, .77778], 8926: [.13667, .63667, 0, 0, .77778], 8927: [.13667, .63667, 0, 0, .77778], 8928: [.30274, .79383, 0, 0, .77778], 8929: [.30274, .79383, 0, 0, .77778], 8934: [.23222, .74111, 0, 0, .77778], 8935: [.23222, .74111, 0, 0, .77778], 8936: [.23222, .74111, 0, 0, .77778], 8937: [.23222, .74111, 0, 0, .77778], 8938: [.20576, .70576, 0, 0, .77778], 8939: [.20576, .70576, 0, 0, .77778], 8940: [.30274, .79383, 0, 0, .77778], 8941: [.30274, .79383, 0, 0, .77778], 8994: [.19444, .69224, 0, 0, .77778], 8995: [.19444, .69224, 0, 0, .77778], 9416: [.15559, .69224, 0, 0, .90222], 9484: [0, .69224, 0, 0, .5], 9488: [0, .69224, 0, 0, .5], 9492: [0, .37788, 0, 0, .5], 9496: [0, .37788, 0, 0, .5], 9585: [.19444, .68889, 0, 0, .88889], 9586: [.19444, .74111, 0, 0, .88889], 9632: [0, .675, 0, 0, .77778], 9633: [0, .675, 0, 0, .77778], 9650: [0, .54986, 0, 0, .72222], 9651: [0, .54986, 0, 0, .72222], 9654: [.03517, .54986, 0, 0, .77778], 9660: [0, .54986, 0, 0, .72222], 9661: [0, .54986, 0, 0, .72222], 9664: [.03517, .54986, 0, 0, .77778], 9674: [.11111, .69224, 0, 0, .66667], 9733: [.19444, .69224, 0, 0, .94445], 10003: [0, .69224, 0, 0, .83334], 10016: [0, .69224, 0, 0, .83334], 10731: [.11111, .69224, 0, 0, .66667], 10846: [.19444, .75583, 0, 0, .61111], 10877: [.13667, .63667, 0, 0, .77778], 10878: [.13667, .63667, 0, 0, .77778], 10885: [.25583, .75583, 0, 0, .77778], 10886: [.25583, .75583, 0, 0, .77778], 10887: [.13597, .63597, 0, 0, .77778], 10888: [.13597, .63597, 0, 0, .77778], 10889: [.26167, .75726, 0, 0, .77778], 10890: [.26167, .75726, 0, 0, .77778], 10891: [.48256, .98256, 0, 0, .77778], 10892: [.48256, .98256, 0, 0, .77778], 10901: [.13667, .63667, 0, 0, .77778], 10902: [.13667, .63667, 0, 0, .77778], 10933: [.25142, .75726, 0, 0, .77778], 10934: [.25142, .75726, 0, 0, .77778], 10935: [.26167, .75726, 0, 0, .77778], 10936: [.26167, .75726, 0, 0, .77778], 10937: [.26167, .75726, 0, 0, .77778], 10938: [.26167, .75726, 0, 0, .77778], 10949: [.25583, .75583, 0, 0, .77778], 10950: [.25583, .75583, 0, 0, .77778], 10955: [.28481, .79383, 0, 0, .77778], 10956: [.28481, .79383, 0, 0, .77778], 57350: [.08167, .58167, 0, 0, .22222], 57351: [.08167, .58167, 0, 0, .38889], 57352: [.08167, .58167, 0, 0, .77778], 57353: [0, .43056, .04028, 0, .66667], 57356: [.25142, .75726, 0, 0, .77778], 57357: [.25142, .75726, 0, 0, .77778], 57358: [.41951, .91951, 0, 0, .77778], 57359: [.30274, .79383, 0, 0, .77778], 57360: [.30274, .79383, 0, 0, .77778], 57361: [.41951, .91951, 0, 0, .77778], 57366: [.25142, .75726, 0, 0, .77778], 57367: [.25142, .75726, 0, 0, .77778], 57368: [.25142, .75726, 0, 0, .77778], 57369: [.25142, .75726, 0, 0, .77778], 57370: [.13597, .63597, 0, 0, .77778], 57371: [.13597, .63597, 0, 0, .77778] }, "Caligraphic-Regular": { 48: [0, .43056, 0, 0, .5], 49: [0, .43056, 0, 0, .5], 50: [0, .43056, 0, 0, .5], 51: [.19444, .43056, 0, 0, .5], 52: [.19444, .43056, 0, 0, .5], 53: [.19444, .43056, 0, 0, .5], 54: [0, .64444, 0, 0, .5], 55: [.19444, .43056, 0, 0, .5], 56: [0, .64444, 0, 0, .5], 57: [.19444, .43056, 0, 0, .5], 65: [0, .68333, 0, .19445, .79847], 66: [0, .68333, .03041, .13889, .65681], 67: [0, .68333, .05834, .13889, .52653], 68: [0, .68333, .02778, .08334, .77139], 69: [0, .68333, .08944, .11111, .52778], 70: [0, .68333, .09931, .11111, .71875], 71: [.09722, .68333, .0593, .11111, .59487], 72: [0, .68333, .00965, .11111, .84452], 73: [0, .68333, .07382, 0, .54452], 74: [.09722, .68333, .18472, .16667, .67778], 75: [0, .68333, .01445, .05556, .76195], 76: [0, .68333, 0, .13889, .68972], 77: [0, .68333, 0, .13889, 1.2009], 78: [0, .68333, .14736, .08334, .82049], 79: [0, .68333, .02778, .11111, .79611], 80: [0, .68333, .08222, .08334, .69556], 81: [.09722, .68333, 0, .11111, .81667], 82: [0, .68333, 0, .08334, .8475], 83: [0, .68333, .075, .13889, .60556], 84: [0, .68333, .25417, 0, .54464], 85: [0, .68333, .09931, .08334, .62583], 86: [0, .68333, .08222, 0, .61278], 87: [0, .68333, .08222, .08334, .98778], 88: [0, .68333, .14643, .13889, .7133], 89: [.09722, .68333, .08222, .08334, .66834], 90: [0, .68333, .07944, .13889, .72473] }, "Fraktur-Regular": { 33: [0, .69141, 0, 0, .29574], 34: [0, .69141, 0, 0, .21471], 38: [0, .69141, 0, 0, .73786], 39: [0, .69141, 0, 0, .21201], 40: [.24982, .74947, 0, 0, .38865], 41: [.24982, .74947, 0, 0, .38865], 42: [0, .62119, 0, 0, .27764], 43: [.08319, .58283, 0, 0, .75623], 44: [0, .10803, 0, 0, .27764], 45: [.08319, .58283, 0, 0, .75623], 46: [0, .10803, 0, 0, .27764], 47: [.24982, .74947, 0, 0, .50181], 48: [0, .47534, 0, 0, .50181], 49: [0, .47534, 0, 0, .50181], 50: [0, .47534, 0, 0, .50181], 51: [.18906, .47534, 0, 0, .50181], 52: [.18906, .47534, 0, 0, .50181], 53: [.18906, .47534, 0, 0, .50181], 54: [0, .69141, 0, 0, .50181], 55: [.18906, .47534, 0, 0, .50181], 56: [0, .69141, 0, 0, .50181], 57: [.18906, .47534, 0, 0, .50181], 58: [0, .47534, 0, 0, .21606], 59: [.12604, .47534, 0, 0, .21606], 61: [-.13099, .36866, 0, 0, .75623], 63: [0, .69141, 0, 0, .36245], 65: [0, .69141, 0, 0, .7176], 66: [0, .69141, 0, 0, .88397], 67: [0, .69141, 0, 0, .61254], 68: [0, .69141, 0, 0, .83158], 69: [0, .69141, 0, 0, .66278], 70: [.12604, .69141, 0, 0, .61119], 71: [0, .69141, 0, 0, .78539], 72: [.06302, .69141, 0, 0, .7203], 73: [0, .69141, 0, 0, .55448], 74: [.12604, .69141, 0, 0, .55231], 75: [0, .69141, 0, 0, .66845], 76: [0, .69141, 0, 0, .66602], 77: [0, .69141, 0, 0, 1.04953], 78: [0, .69141, 0, 0, .83212], 79: [0, .69141, 0, 0, .82699], 80: [.18906, .69141, 0, 0, .82753], 81: [.03781, .69141, 0, 0, .82699], 82: [0, .69141, 0, 0, .82807], 83: [0, .69141, 0, 0, .82861], 84: [0, .69141, 0, 0, .66899], 85: [0, .69141, 0, 0, .64576], 86: [0, .69141, 0, 0, .83131], 87: [0, .69141, 0, 0, 1.04602], 88: [0, .69141, 0, 0, .71922], 89: [.18906, .69141, 0, 0, .83293], 90: [.12604, .69141, 0, 0, .60201], 91: [.24982, .74947, 0, 0, .27764], 93: [.24982, .74947, 0, 0, .27764], 94: [0, .69141, 0, 0, .49965], 97: [0, .47534, 0, 0, .50046], 98: [0, .69141, 0, 0, .51315], 99: [0, .47534, 0, 0, .38946], 100: [0, .62119, 0, 0, .49857], 101: [0, .47534, 0, 0, .40053], 102: [.18906, .69141, 0, 0, .32626], 103: [.18906, .47534, 0, 0, .5037], 104: [.18906, .69141, 0, 0, .52126], 105: [0, .69141, 0, 0, .27899], 106: [0, .69141, 0, 0, .28088], 107: [0, .69141, 0, 0, .38946], 108: [0, .69141, 0, 0, .27953], 109: [0, .47534, 0, 0, .76676], 110: [0, .47534, 0, 0, .52666], 111: [0, .47534, 0, 0, .48885], 112: [.18906, .52396, 0, 0, .50046], 113: [.18906, .47534, 0, 0, .48912], 114: [0, .47534, 0, 0, .38919], 115: [0, .47534, 0, 0, .44266], 116: [0, .62119, 0, 0, .33301], 117: [0, .47534, 0, 0, .5172], 118: [0, .52396, 0, 0, .5118], 119: [0, .52396, 0, 0, .77351], 120: [.18906, .47534, 0, 0, .38865], 121: [.18906, .47534, 0, 0, .49884], 122: [.18906, .47534, 0, 0, .39054], 8216: [0, .69141, 0, 0, .21471], 8217: [0, .69141, 0, 0, .21471], 58112: [0, .62119, 0, 0, .49749], 58113: [0, .62119, 0, 0, .4983], 58114: [.18906, .69141, 0, 0, .33328], 58115: [.18906, .69141, 0, 0, .32923], 58116: [.18906, .47534, 0, 0, .50343], 58117: [0, .69141, 0, 0, .33301], 58118: [0, .62119, 0, 0, .33409], 58119: [0, .47534, 0, 0, .50073] }, "Main-Bold": { 33: [0, .69444, 0, 0, .35], 34: [0, .69444, 0, 0, .60278], 35: [.19444, .69444, 0, 0, .95833], 36: [.05556, .75, 0, 0, .575], 37: [.05556, .75, 0, 0, .95833], 38: [0, .69444, 0, 0, .89444], 39: [0, .69444, 0, 0, .31944], 40: [.25, .75, 0, 0, .44722], 41: [.25, .75, 0, 0, .44722], 42: [0, .75, 0, 0, .575], 43: [.13333, .63333, 0, 0, .89444], 44: [.19444, .15556, 0, 0, .31944], 45: [0, .44444, 0, 0, .38333], 46: [0, .15556, 0, 0, .31944], 47: [.25, .75, 0, 0, .575], 48: [0, .64444, 0, 0, .575], 49: [0, .64444, 0, 0, .575], 50: [0, .64444, 0, 0, .575], 51: [0, .64444, 0, 0, .575], 52: [0, .64444, 0, 0, .575], 53: [0, .64444, 0, 0, .575], 54: [0, .64444, 0, 0, .575], 55: [0, .64444, 0, 0, .575], 56: [0, .64444, 0, 0, .575], 57: [0, .64444, 0, 0, .575], 58: [0, .44444, 0, 0, .31944], 59: [.19444, .44444, 0, 0, .31944], 60: [.08556, .58556, 0, 0, .89444], 61: [-.10889, .39111, 0, 0, .89444], 62: [.08556, .58556, 0, 0, .89444], 63: [0, .69444, 0, 0, .54305], 64: [0, .69444, 0, 0, .89444], 65: [0, .68611, 0, 0, .86944], 66: [0, .68611, 0, 0, .81805], 67: [0, .68611, 0, 0, .83055], 68: [0, .68611, 0, 0, .88194], 69: [0, .68611, 0, 0, .75555], 70: [0, .68611, 0, 0, .72361], 71: [0, .68611, 0, 0, .90416], 72: [0, .68611, 0, 0, .9], 73: [0, .68611, 0, 0, .43611], 74: [0, .68611, 0, 0, .59444], 75: [0, .68611, 0, 0, .90138], 76: [0, .68611, 0, 0, .69166], 77: [0, .68611, 0, 0, 1.09166], 78: [0, .68611, 0, 0, .9], 79: [0, .68611, 0, 0, .86388], 80: [0, .68611, 0, 0, .78611], 81: [.19444, .68611, 0, 0, .86388], 82: [0, .68611, 0, 0, .8625], 83: [0, .68611, 0, 0, .63889], 84: [0, .68611, 0, 0, .8], 85: [0, .68611, 0, 0, .88472], 86: [0, .68611, .01597, 0, .86944], 87: [0, .68611, .01597, 0, 1.18888], 88: [0, .68611, 0, 0, .86944], 89: [0, .68611, .02875, 0, .86944], 90: [0, .68611, 0, 0, .70277], 91: [.25, .75, 0, 0, .31944], 92: [.25, .75, 0, 0, .575], 93: [.25, .75, 0, 0, .31944], 94: [0, .69444, 0, 0, .575], 95: [.31, .13444, .03194, 0, .575], 97: [0, .44444, 0, 0, .55902], 98: [0, .69444, 0, 0, .63889], 99: [0, .44444, 0, 0, .51111], 100: [0, .69444, 0, 0, .63889], 101: [0, .44444, 0, 0, .52708], 102: [0, .69444, .10903, 0, .35139], 103: [.19444, .44444, .01597, 0, .575], 104: [0, .69444, 0, 0, .63889], 105: [0, .69444, 0, 0, .31944], 106: [.19444, .69444, 0, 0, .35139], 107: [0, .69444, 0, 0, .60694], 108: [0, .69444, 0, 0, .31944], 109: [0, .44444, 0, 0, .95833], 110: [0, .44444, 0, 0, .63889], 111: [0, .44444, 0, 0, .575], 112: [.19444, .44444, 0, 0, .63889], 113: [.19444, .44444, 0, 0, .60694], 114: [0, .44444, 0, 0, .47361], 115: [0, .44444, 0, 0, .45361], 116: [0, .63492, 0, 0, .44722], 117: [0, .44444, 0, 0, .63889], 118: [0, .44444, .01597, 0, .60694], 119: [0, .44444, .01597, 0, .83055], 120: [0, .44444, 0, 0, .60694], 121: [.19444, .44444, .01597, 0, .60694], 122: [0, .44444, 0, 0, .51111], 123: [.25, .75, 0, 0, .575], 124: [.25, .75, 0, 0, .31944], 125: [.25, .75, 0, 0, .575], 126: [.35, .34444, 0, 0, .575], 168: [0, .69444, 0, 0, .575], 172: [0, .44444, 0, 0, .76666], 176: [0, .69444, 0, 0, .86944], 177: [.13333, .63333, 0, 0, .89444], 184: [.17014, 0, 0, 0, .51111], 198: [0, .68611, 0, 0, 1.04166], 215: [.13333, .63333, 0, 0, .89444], 216: [.04861, .73472, 0, 0, .89444], 223: [0, .69444, 0, 0, .59722], 230: [0, .44444, 0, 0, .83055], 247: [.13333, .63333, 0, 0, .89444], 248: [.09722, .54167, 0, 0, .575], 305: [0, .44444, 0, 0, .31944], 338: [0, .68611, 0, 0, 1.16944], 339: [0, .44444, 0, 0, .89444], 567: [.19444, .44444, 0, 0, .35139], 710: [0, .69444, 0, 0, .575], 711: [0, .63194, 0, 0, .575], 713: [0, .59611, 0, 0, .575], 714: [0, .69444, 0, 0, .575], 715: [0, .69444, 0, 0, .575], 728: [0, .69444, 0, 0, .575], 729: [0, .69444, 0, 0, .31944], 730: [0, .69444, 0, 0, .86944], 732: [0, .69444, 0, 0, .575], 733: [0, .69444, 0, 0, .575], 915: [0, .68611, 0, 0, .69166], 916: [0, .68611, 0, 0, .95833], 920: [0, .68611, 0, 0, .89444], 923: [0, .68611, 0, 0, .80555], 926: [0, .68611, 0, 0, .76666], 928: [0, .68611, 0, 0, .9], 931: [0, .68611, 0, 0, .83055], 933: [0, .68611, 0, 0, .89444], 934: [0, .68611, 0, 0, .83055], 936: [0, .68611, 0, 0, .89444], 937: [0, .68611, 0, 0, .83055], 8211: [0, .44444, .03194, 0, .575], 8212: [0, .44444, .03194, 0, 1.14999], 8216: [0, .69444, 0, 0, .31944], 8217: [0, .69444, 0, 0, .31944], 8220: [0, .69444, 0, 0, .60278], 8221: [0, .69444, 0, 0, .60278], 8224: [.19444, .69444, 0, 0, .51111], 8225: [.19444, .69444, 0, 0, .51111], 8242: [0, .55556, 0, 0, .34444], 8407: [0, .72444, .15486, 0, .575], 8463: [0, .69444, 0, 0, .66759], 8465: [0, .69444, 0, 0, .83055], 8467: [0, .69444, 0, 0, .47361], 8472: [.19444, .44444, 0, 0, .74027], 8476: [0, .69444, 0, 0, .83055], 8501: [0, .69444, 0, 0, .70277], 8592: [-.10889, .39111, 0, 0, 1.14999], 8593: [.19444, .69444, 0, 0, .575], 8594: [-.10889, .39111, 0, 0, 1.14999], 8595: [.19444, .69444, 0, 0, .575], 8596: [-.10889, .39111, 0, 0, 1.14999], 8597: [.25, .75, 0, 0, .575], 8598: [.19444, .69444, 0, 0, 1.14999], 8599: [.19444, .69444, 0, 0, 1.14999], 8600: [.19444, .69444, 0, 0, 1.14999], 8601: [.19444, .69444, 0, 0, 1.14999], 8636: [-.10889, .39111, 0, 0, 1.14999], 8637: [-.10889, .39111, 0, 0, 1.14999], 8640: [-.10889, .39111, 0, 0, 1.14999], 8641: [-.10889, .39111, 0, 0, 1.14999], 8656: [-.10889, .39111, 0, 0, 1.14999], 8657: [.19444, .69444, 0, 0, .70277], 8658: [-.10889, .39111, 0, 0, 1.14999], 8659: [.19444, .69444, 0, 0, .70277], 8660: [-.10889, .39111, 0, 0, 1.14999], 8661: [.25, .75, 0, 0, .70277], 8704: [0, .69444, 0, 0, .63889], 8706: [0, .69444, .06389, 0, .62847], 8707: [0, .69444, 0, 0, .63889], 8709: [.05556, .75, 0, 0, .575], 8711: [0, .68611, 0, 0, .95833], 8712: [.08556, .58556, 0, 0, .76666], 8715: [.08556, .58556, 0, 0, .76666], 8722: [.13333, .63333, 0, 0, .89444], 8723: [.13333, .63333, 0, 0, .89444], 8725: [.25, .75, 0, 0, .575], 8726: [.25, .75, 0, 0, .575], 8727: [-.02778, .47222, 0, 0, .575], 8728: [-.02639, .47361, 0, 0, .575], 8729: [-.02639, .47361, 0, 0, .575], 8730: [.18, .82, 0, 0, .95833], 8733: [0, .44444, 0, 0, .89444], 8734: [0, .44444, 0, 0, 1.14999], 8736: [0, .69224, 0, 0, .72222], 8739: [.25, .75, 0, 0, .31944], 8741: [.25, .75, 0, 0, .575], 8743: [0, .55556, 0, 0, .76666], 8744: [0, .55556, 0, 0, .76666], 8745: [0, .55556, 0, 0, .76666], 8746: [0, .55556, 0, 0, .76666], 8747: [.19444, .69444, .12778, 0, .56875], 8764: [-.10889, .39111, 0, 0, .89444], 8768: [.19444, .69444, 0, 0, .31944], 8771: [.00222, .50222, 0, 0, .89444], 8776: [.02444, .52444, 0, 0, .89444], 8781: [.00222, .50222, 0, 0, .89444], 8801: [.00222, .50222, 0, 0, .89444], 8804: [.19667, .69667, 0, 0, .89444], 8805: [.19667, .69667, 0, 0, .89444], 8810: [.08556, .58556, 0, 0, 1.14999], 8811: [.08556, .58556, 0, 0, 1.14999], 8826: [.08556, .58556, 0, 0, .89444], 8827: [.08556, .58556, 0, 0, .89444], 8834: [.08556, .58556, 0, 0, .89444], 8835: [.08556, .58556, 0, 0, .89444], 8838: [.19667, .69667, 0, 0, .89444], 8839: [.19667, .69667, 0, 0, .89444], 8846: [0, .55556, 0, 0, .76666], 8849: [.19667, .69667, 0, 0, .89444], 8850: [.19667, .69667, 0, 0, .89444], 8851: [0, .55556, 0, 0, .76666], 8852: [0, .55556, 0, 0, .76666], 8853: [.13333, .63333, 0, 0, .89444], 8854: [.13333, .63333, 0, 0, .89444], 8855: [.13333, .63333, 0, 0, .89444], 8856: [.13333, .63333, 0, 0, .89444], 8857: [.13333, .63333, 0, 0, .89444], 8866: [0, .69444, 0, 0, .70277], 8867: [0, .69444, 0, 0, .70277], 8868: [0, .69444, 0, 0, .89444], 8869: [0, .69444, 0, 0, .89444], 8900: [-.02639, .47361, 0, 0, .575], 8901: [-.02639, .47361, 0, 0, .31944], 8902: [-.02778, .47222, 0, 0, .575], 8968: [.25, .75, 0, 0, .51111], 8969: [.25, .75, 0, 0, .51111], 8970: [.25, .75, 0, 0, .51111], 8971: [.25, .75, 0, 0, .51111], 8994: [-.13889, .36111, 0, 0, 1.14999], 8995: [-.13889, .36111, 0, 0, 1.14999], 9651: [.19444, .69444, 0, 0, 1.02222], 9657: [-.02778, .47222, 0, 0, .575], 9661: [.19444, .69444, 0, 0, 1.02222], 9667: [-.02778, .47222, 0, 0, .575], 9711: [.19444, .69444, 0, 0, 1.14999], 9824: [.12963, .69444, 0, 0, .89444], 9825: [.12963, .69444, 0, 0, .89444], 9826: [.12963, .69444, 0, 0, .89444], 9827: [.12963, .69444, 0, 0, .89444], 9837: [0, .75, 0, 0, .44722], 9838: [.19444, .69444, 0, 0, .44722], 9839: [.19444, .69444, 0, 0, .44722], 10216: [.25, .75, 0, 0, .44722], 10217: [.25, .75, 0, 0, .44722], 10815: [0, .68611, 0, 0, .9], 10927: [.19667, .69667, 0, 0, .89444], 10928: [.19667, .69667, 0, 0, .89444], 57376: [.19444, .69444, 0, 0, 0] }, "Main-BoldItalic": { 33: [0, .69444, .11417, 0, .38611], 34: [0, .69444, .07939, 0, .62055], 35: [.19444, .69444, .06833, 0, .94444], 37: [.05556, .75, .12861, 0, .94444], 38: [0, .69444, .08528, 0, .88555], 39: [0, .69444, .12945, 0, .35555], 40: [.25, .75, .15806, 0, .47333], 41: [.25, .75, .03306, 0, .47333], 42: [0, .75, .14333, 0, .59111], 43: [.10333, .60333, .03306, 0, .88555], 44: [.19444, .14722, 0, 0, .35555], 45: [0, .44444, .02611, 0, .41444], 46: [0, .14722, 0, 0, .35555], 47: [.25, .75, .15806, 0, .59111], 48: [0, .64444, .13167, 0, .59111], 49: [0, .64444, .13167, 0, .59111], 50: [0, .64444, .13167, 0, .59111], 51: [0, .64444, .13167, 0, .59111], 52: [.19444, .64444, .13167, 0, .59111], 53: [0, .64444, .13167, 0, .59111], 54: [0, .64444, .13167, 0, .59111], 55: [.19444, .64444, .13167, 0, .59111], 56: [0, .64444, .13167, 0, .59111], 57: [0, .64444, .13167, 0, .59111], 58: [0, .44444, .06695, 0, .35555], 59: [.19444, .44444, .06695, 0, .35555], 61: [-.10889, .39111, .06833, 0, .88555], 63: [0, .69444, .11472, 0, .59111], 64: [0, .69444, .09208, 0, .88555], 65: [0, .68611, 0, 0, .86555], 66: [0, .68611, .0992, 0, .81666], 67: [0, .68611, .14208, 0, .82666], 68: [0, .68611, .09062, 0, .87555], 69: [0, .68611, .11431, 0, .75666], 70: [0, .68611, .12903, 0, .72722], 71: [0, .68611, .07347, 0, .89527], 72: [0, .68611, .17208, 0, .8961], 73: [0, .68611, .15681, 0, .47166], 74: [0, .68611, .145, 0, .61055], 75: [0, .68611, .14208, 0, .89499], 76: [0, .68611, 0, 0, .69777], 77: [0, .68611, .17208, 0, 1.07277], 78: [0, .68611, .17208, 0, .8961], 79: [0, .68611, .09062, 0, .85499], 80: [0, .68611, .0992, 0, .78721], 81: [.19444, .68611, .09062, 0, .85499], 82: [0, .68611, .02559, 0, .85944], 83: [0, .68611, .11264, 0, .64999], 84: [0, .68611, .12903, 0, .7961], 85: [0, .68611, .17208, 0, .88083], 86: [0, .68611, .18625, 0, .86555], 87: [0, .68611, .18625, 0, 1.15999], 88: [0, .68611, .15681, 0, .86555], 89: [0, .68611, .19803, 0, .86555], 90: [0, .68611, .14208, 0, .70888], 91: [.25, .75, .1875, 0, .35611], 93: [.25, .75, .09972, 0, .35611], 94: [0, .69444, .06709, 0, .59111], 95: [.31, .13444, .09811, 0, .59111], 97: [0, .44444, .09426, 0, .59111], 98: [0, .69444, .07861, 0, .53222], 99: [0, .44444, .05222, 0, .53222], 100: [0, .69444, .10861, 0, .59111], 101: [0, .44444, .085, 0, .53222], 102: [.19444, .69444, .21778, 0, .4], 103: [.19444, .44444, .105, 0, .53222], 104: [0, .69444, .09426, 0, .59111], 105: [0, .69326, .11387, 0, .35555], 106: [.19444, .69326, .1672, 0, .35555], 107: [0, .69444, .11111, 0, .53222], 108: [0, .69444, .10861, 0, .29666], 109: [0, .44444, .09426, 0, .94444], 110: [0, .44444, .09426, 0, .64999], 111: [0, .44444, .07861, 0, .59111], 112: [.19444, .44444, .07861, 0, .59111], 113: [.19444, .44444, .105, 0, .53222], 114: [0, .44444, .11111, 0, .50167], 115: [0, .44444, .08167, 0, .48694], 116: [0, .63492, .09639, 0, .385], 117: [0, .44444, .09426, 0, .62055], 118: [0, .44444, .11111, 0, .53222], 119: [0, .44444, .11111, 0, .76777], 120: [0, .44444, .12583, 0, .56055], 121: [.19444, .44444, .105, 0, .56166], 122: [0, .44444, .13889, 0, .49055], 126: [.35, .34444, .11472, 0, .59111], 163: [0, .69444, 0, 0, .86853], 168: [0, .69444, .11473, 0, .59111], 176: [0, .69444, 0, 0, .94888], 184: [.17014, 0, 0, 0, .53222], 198: [0, .68611, .11431, 0, 1.02277], 216: [.04861, .73472, .09062, 0, .88555], 223: [.19444, .69444, .09736, 0, .665], 230: [0, .44444, .085, 0, .82666], 248: [.09722, .54167, .09458, 0, .59111], 305: [0, .44444, .09426, 0, .35555], 338: [0, .68611, .11431, 0, 1.14054], 339: [0, .44444, .085, 0, .82666], 567: [.19444, .44444, .04611, 0, .385], 710: [0, .69444, .06709, 0, .59111], 711: [0, .63194, .08271, 0, .59111], 713: [0, .59444, .10444, 0, .59111], 714: [0, .69444, .08528, 0, .59111], 715: [0, .69444, 0, 0, .59111], 728: [0, .69444, .10333, 0, .59111], 729: [0, .69444, .12945, 0, .35555], 730: [0, .69444, 0, 0, .94888], 732: [0, .69444, .11472, 0, .59111], 733: [0, .69444, .11472, 0, .59111], 915: [0, .68611, .12903, 0, .69777], 916: [0, .68611, 0, 0, .94444], 920: [0, .68611, .09062, 0, .88555], 923: [0, .68611, 0, 0, .80666], 926: [0, .68611, .15092, 0, .76777], 928: [0, .68611, .17208, 0, .8961], 931: [0, .68611, .11431, 0, .82666], 933: [0, .68611, .10778, 0, .88555], 934: [0, .68611, .05632, 0, .82666], 936: [0, .68611, .10778, 0, .88555], 937: [0, .68611, .0992, 0, .82666], 8211: [0, .44444, .09811, 0, .59111], 8212: [0, .44444, .09811, 0, 1.18221], 8216: [0, .69444, .12945, 0, .35555], 8217: [0, .69444, .12945, 0, .35555], 8220: [0, .69444, .16772, 0, .62055], 8221: [0, .69444, .07939, 0, .62055] }, "Main-Italic": { 33: [0, .69444, .12417, 0, .30667], 34: [0, .69444, .06961, 0, .51444], 35: [.19444, .69444, .06616, 0, .81777], 37: [.05556, .75, .13639, 0, .81777], 38: [0, .69444, .09694, 0, .76666], 39: [0, .69444, .12417, 0, .30667], 40: [.25, .75, .16194, 0, .40889], 41: [.25, .75, .03694, 0, .40889], 42: [0, .75, .14917, 0, .51111], 43: [.05667, .56167, .03694, 0, .76666], 44: [.19444, .10556, 0, 0, .30667], 45: [0, .43056, .02826, 0, .35778], 46: [0, .10556, 0, 0, .30667], 47: [.25, .75, .16194, 0, .51111], 48: [0, .64444, .13556, 0, .51111], 49: [0, .64444, .13556, 0, .51111], 50: [0, .64444, .13556, 0, .51111], 51: [0, .64444, .13556, 0, .51111], 52: [.19444, .64444, .13556, 0, .51111], 53: [0, .64444, .13556, 0, .51111], 54: [0, .64444, .13556, 0, .51111], 55: [.19444, .64444, .13556, 0, .51111], 56: [0, .64444, .13556, 0, .51111], 57: [0, .64444, .13556, 0, .51111], 58: [0, .43056, .0582, 0, .30667], 59: [.19444, .43056, .0582, 0, .30667], 61: [-.13313, .36687, .06616, 0, .76666], 63: [0, .69444, .1225, 0, .51111], 64: [0, .69444, .09597, 0, .76666], 65: [0, .68333, 0, 0, .74333], 66: [0, .68333, .10257, 0, .70389], 67: [0, .68333, .14528, 0, .71555], 68: [0, .68333, .09403, 0, .755], 69: [0, .68333, .12028, 0, .67833], 70: [0, .68333, .13305, 0, .65277], 71: [0, .68333, .08722, 0, .77361], 72: [0, .68333, .16389, 0, .74333], 73: [0, .68333, .15806, 0, .38555], 74: [0, .68333, .14028, 0, .525], 75: [0, .68333, .14528, 0, .76888], 76: [0, .68333, 0, 0, .62722], 77: [0, .68333, .16389, 0, .89666], 78: [0, .68333, .16389, 0, .74333], 79: [0, .68333, .09403, 0, .76666], 80: [0, .68333, .10257, 0, .67833], 81: [.19444, .68333, .09403, 0, .76666], 82: [0, .68333, .03868, 0, .72944], 83: [0, .68333, .11972, 0, .56222], 84: [0, .68333, .13305, 0, .71555], 85: [0, .68333, .16389, 0, .74333], 86: [0, .68333, .18361, 0, .74333], 87: [0, .68333, .18361, 0, .99888], 88: [0, .68333, .15806, 0, .74333], 89: [0, .68333, .19383, 0, .74333], 90: [0, .68333, .14528, 0, .61333], 91: [.25, .75, .1875, 0, .30667], 93: [.25, .75, .10528, 0, .30667], 94: [0, .69444, .06646, 0, .51111], 95: [.31, .12056, .09208, 0, .51111], 97: [0, .43056, .07671, 0, .51111], 98: [0, .69444, .06312, 0, .46], 99: [0, .43056, .05653, 0, .46], 100: [0, .69444, .10333, 0, .51111], 101: [0, .43056, .07514, 0, .46], 102: [.19444, .69444, .21194, 0, .30667], 103: [.19444, .43056, .08847, 0, .46], 104: [0, .69444, .07671, 0, .51111], 105: [0, .65536, .1019, 0, .30667], 106: [.19444, .65536, .14467, 0, .30667], 107: [0, .69444, .10764, 0, .46], 108: [0, .69444, .10333, 0, .25555], 109: [0, .43056, .07671, 0, .81777], 110: [0, .43056, .07671, 0, .56222], 111: [0, .43056, .06312, 0, .51111], 112: [.19444, .43056, .06312, 0, .51111], 113: [.19444, .43056, .08847, 0, .46], 114: [0, .43056, .10764, 0, .42166], 115: [0, .43056, .08208, 0, .40889], 116: [0, .61508, .09486, 0, .33222], 117: [0, .43056, .07671, 0, .53666], 118: [0, .43056, .10764, 0, .46], 119: [0, .43056, .10764, 0, .66444], 120: [0, .43056, .12042, 0, .46389], 121: [.19444, .43056, .08847, 0, .48555], 122: [0, .43056, .12292, 0, .40889], 126: [.35, .31786, .11585, 0, .51111], 163: [0, .69444, 0, 0, .76909], 168: [0, .66786, .10474, 0, .51111], 176: [0, .69444, 0, 0, .83129], 184: [.17014, 0, 0, 0, .46], 198: [0, .68333, .12028, 0, .88277], 216: [.04861, .73194, .09403, 0, .76666], 223: [.19444, .69444, .10514, 0, .53666], 230: [0, .43056, .07514, 0, .71555], 248: [.09722, .52778, .09194, 0, .51111], 305: [0, .43056, 0, .02778, .32246], 338: [0, .68333, .12028, 0, .98499], 339: [0, .43056, .07514, 0, .71555], 567: [.19444, .43056, 0, .08334, .38403], 710: [0, .69444, .06646, 0, .51111], 711: [0, .62847, .08295, 0, .51111], 713: [0, .56167, .10333, 0, .51111], 714: [0, .69444, .09694, 0, .51111], 715: [0, .69444, 0, 0, .51111], 728: [0, .69444, .10806, 0, .51111], 729: [0, .66786, .11752, 0, .30667], 730: [0, .69444, 0, 0, .83129], 732: [0, .66786, .11585, 0, .51111], 733: [0, .69444, .1225, 0, .51111], 915: [0, .68333, .13305, 0, .62722], 916: [0, .68333, 0, 0, .81777], 920: [0, .68333, .09403, 0, .76666], 923: [0, .68333, 0, 0, .69222], 926: [0, .68333, .15294, 0, .66444], 928: [0, .68333, .16389, 0, .74333], 931: [0, .68333, .12028, 0, .71555], 933: [0, .68333, .11111, 0, .76666], 934: [0, .68333, .05986, 0, .71555], 936: [0, .68333, .11111, 0, .76666], 937: [0, .68333, .10257, 0, .71555], 8211: [0, .43056, .09208, 0, .51111], 8212: [0, .43056, .09208, 0, 1.02222], 8216: [0, .69444, .12417, 0, .30667], 8217: [0, .69444, .12417, 0, .30667], 8220: [0, .69444, .1685, 0, .51444], 8221: [0, .69444, .06961, 0, .51444], 8463: [0, .68889, 0, 0, .54028] }, "Main-Regular": { + 32: [0, 0, 0, 0, .25], 33: [0, .69444, 0, 0, .27778], 34: [0, .69444, 0, 0, .5], 35: [.19444, .69444, 0, 0, .83334], 36: [.05556, .75, 0, 0, .5], 37: [.05556, .75, 0, 0, .83334], 38: [0, .69444, 0, 0, .77778], 39: [0, .69444, 0, 0, .27778], 40: [.25, .75, 0, 0, .38889], 41: [.25, .75, 0, 0, .38889], 42: [0, .75, 0, 0, .5], 43: [.08333, .58333, 0, 0, .77778], 44: [.19444, .10556, 0, 0, .27778], 45: [0, .43056, 0, 0, .33333], 46: [0, .10556, 0, 0, .27778], 47: [.25, .75, 0, 0, .5], 48: [0, .64444, 0, 0, .5], 49: [0, .64444, 0, 0, .5], 50: [0, .64444, 0, 0, .5], 51: [0, .64444, 0, 0, .5], 52: [0, .64444, 0, 0, .5], 53: [0, .64444, 0, 0, .5], 54: [0, .64444, 0, 0, .5], 55: [0, .64444, 0, 0, .5], 56: [0, .64444, 0, 0, .5], 57: [0, .64444, 0, 0, .5], 58: [0, .43056, 0, 0, .27778], 59: [.19444, .43056, 0, 0, .27778], 60: [.0391, .5391, 0, 0, .77778], 61: [-.13313, .36687, 0, 0, .77778], 62: [.0391, .5391, 0, 0, .77778], 63: [0, .69444, 0, 0, .47222], 64: [0, .69444, 0, 0, .77778], 65: [0, .68333, 0, 0, .75], 66: [0, .68333, 0, 0, .70834], 67: [0, .68333, 0, 0, .72222], 68: [0, .68333, 0, 0, .76389], 69: [0, .68333, 0, 0, .68056], 70: [0, .68333, 0, 0, .65278], 71: [0, .68333, 0, 0, .78472], 72: [0, .68333, 0, 0, .75], 73: [0, .68333, 0, 0, .36111], 74: [0, .68333, 0, 0, .51389], 75: [0, .68333, 0, 0, .77778], 76: [0, .68333, 0, 0, .625], 77: [0, .68333, 0, 0, .91667], 78: [0, .68333, 0, 0, .75], 79: [0, .68333, 0, 0, .77778], 80: [0, .68333, 0, 0, .68056], 81: [.19444, .68333, 0, 0, .77778], 82: [0, .68333, 0, 0, .73611], 83: [0, .68333, 0, 0, .55556], 84: [0, .68333, 0, 0, .72222], 85: [0, .68333, 0, 0, .75], 86: [0, .68333, .01389, 0, .75], 87: [0, .68333, .01389, 0, 1.02778], 88: [0, .68333, 0, 0, .75], 89: [0, .68333, .025, 0, .75], 90: [0, .68333, 0, 0, .61111], 91: [.25, .75, 0, 0, .27778], 92: [.25, .75, 0, 0, .5], 93: [.25, .75, 0, 0, .27778], 94: [0, .69444, 0, 0, .5], 95: [.31, .12056, .02778, 0, .5], 97: [0, .43056, 0, 0, .5], 98: [0, .69444, 0, 0, .55556], 99: [0, .43056, 0, 0, .44445], 100: [0, .69444, 0, 0, .55556], 101: [0, .43056, 0, 0, .44445], 102: [0, .69444, .07778, 0, .30556], 103: [.19444, .43056, .01389, 0, .5], 104: [0, .69444, 0, 0, .55556], 105: [0, .66786, 0, 0, .27778], 106: [.19444, .66786, 0, 0, .30556], 107: [0, .69444, 0, 0, .52778], 108: [0, .69444, 0, 0, .27778], 109: [0, .43056, 0, 0, .83334], 110: [0, .43056, 0, 0, .55556], 111: [0, .43056, 0, 0, .5], 112: [.19444, .43056, 0, 0, .55556], 113: [.19444, .43056, 0, 0, .52778], 114: [0, .43056, 0, 0, .39167], 115: [0, .43056, 0, 0, .39445], 116: [0, .61508, 0, 0, .38889], 117: [0, .43056, 0, 0, .55556], 118: [0, .43056, .01389, 0, .52778], 119: [0, .43056, .01389, 0, .72222], 120: [0, .43056, 0, 0, .52778], 121: [.19444, .43056, .01389, 0, .52778], 122: [0, .43056, 0, 0, .44445], 123: [.25, .75, 0, 0, .5], 124: [.25, .75, 0, 0, .27778], 125: [.25, .75, 0, 0, .5], 126: [.35, .31786, 0, 0, .5], 160: [0, 0, 0, 0, .25], 167: [.19444, .69444, 0, 0, .44445], 168: [0, .66786, 0, 0, .5], 172: [0, .43056, 0, 0, .66667], 176: [0, .69444, 0, 0, .75], 177: [.08333, .58333, 0, 0, .77778], 182: [.19444, .69444, 0, 0, .61111], 184: [.17014, 0, 0, 0, .44445], 198: [0, .68333, 0, 0, .90278], 215: [.08333, .58333, 0, 0, .77778], 216: [.04861, .73194, 0, 0, .77778], 223: [0, .69444, 0, 0, .5], 230: [0, .43056, 0, 0, .72222], 247: [.08333, .58333, 0, 0, .77778], 248: [.09722, .52778, 0, 0, .5], 305: [0, .43056, 0, 0, .27778], 338: [0, .68333, 0, 0, 1.01389], 339: [0, .43056, 0, 0, .77778], 567: [.19444, .43056, 0, 0, .30556], 710: [0, .69444, 0, 0, .5], 711: [0, .62847, 0, 0, .5], 713: [0, .56778, 0, 0, .5], 714: [0, .69444, 0, 0, .5], 715: [0, .69444, 0, 0, .5], 728: [0, .69444, 0, 0, .5], 729: [0, .66786, 0, 0, .27778], 730: [0, .69444, 0, 0, .75], 732: [0, .66786, 0, 0, .5], 733: [0, .69444, 0, 0, .5], 915: [0, .68333, 0, 0, .625], 916: [0, .68333, 0, 0, .83334], 920: [0, .68333, 0, 0, .77778], 923: [0, .68333, 0, 0, .69445], 926: [0, .68333, 0, 0, .66667], 928: [0, .68333, 0, 0, .75], 931: [0, .68333, 0, 0, .72222], 933: [0, .68333, 0, 0, .77778], 934: [0, .68333, 0, 0, .72222], 936: [0, .68333, 0, 0, .77778], 937: [0, .68333, 0, 0, .72222], 8211: [0, .43056, .02778, 0, .5], 8212: [0, .43056, .02778, 0, 1], 8216: [0, .69444, 0, 0, .27778], 8217: [0, .69444, 0, 0, .27778], 8220: [0, .69444, 0, 0, .5], 8221: [0, .69444, 0, 0, .5], 8224: [.19444, .69444, 0, 0, .44445], 8225: [.19444, .69444, 0, 0, .44445], 8230: [0, .12, 0, 0, 1.172], 8242: [0, .55556, 0, 0, .275], 8407: [0, .71444, .15382, 0, .5], 8463: [0, .68889, 0, 0, .54028], 8465: [0, .69444, 0, 0, .72222], 8467: [0, .69444, 0, .11111, .41667], 8472: [.19444, .43056, 0, .11111, .63646], 8476: [0, .69444, 0, 0, .72222], 8501: [0, .69444, 0, 0, .61111], 8592: [-.13313, .36687, 0, 0, 1], 8593: [.19444, .69444, 0, 0, .5], 8594: [-.13313, .36687, 0, 0, 1], 8595: [.19444, .69444, 0, 0, .5], 8596: [-.13313, .36687, 0, 0, 1], 8597: [.25, .75, 0, 0, .5], 8598: [.19444, .69444, 0, 0, 1], 8599: [.19444, .69444, 0, 0, 1], 8600: [.19444, .69444, 0, 0, 1], 8601: [.19444, .69444, 0, 0, 1], 8614: [.011, .511, 0, 0, 1], 8617: [.011, .511, 0, 0, 1.126], 8618: [.011, .511, 0, 0, 1.126], 8636: [-.13313, .36687, 0, 0, 1], 8637: [-.13313, .36687, 0, 0, 1], 8640: [-.13313, .36687, 0, 0, 1], 8641: [-.13313, .36687, 0, 0, 1], 8652: [.011, .671, 0, 0, 1], 8656: [-.13313, .36687, 0, 0, 1], 8657: [.19444, .69444, 0, 0, .61111], 8658: [-.13313, .36687, 0, 0, 1], 8659: [.19444, .69444, 0, 0, .61111], 8660: [-.13313, .36687, 0, 0, 1], 8661: [.25, .75, 0, 0, .61111], 8704: [0, .69444, 0, 0, .55556], 8706: [0, .69444, .05556, .08334, .5309], 8707: [0, .69444, 0, 0, .55556], 8709: [.05556, .75, 0, 0, .5], 8711: [0, .68333, 0, 0, .83334], 8712: [.0391, .5391, 0, 0, .66667], 8715: [.0391, .5391, 0, 0, .66667], 8722: [.08333, .58333, 0, 0, .77778], 8723: [.08333, .58333, 0, 0, .77778], 8725: [.25, .75, 0, 0, .5], 8726: [.25, .75, 0, 0, .5], 8727: [-.03472, .46528, 0, 0, .5], 8728: [-.05555, .44445, 0, 0, .5], 8729: [-.05555, .44445, 0, 0, .5], 8730: [.2, .8, 0, 0, .83334], 8733: [0, .43056, 0, 0, .77778], 8734: [0, .43056, 0, 0, 1], 8736: [0, .69224, 0, 0, .72222], 8739: [.25, .75, 0, 0, .27778], 8741: [.25, .75, 0, 0, .5], 8743: [0, .55556, 0, 0, .66667], 8744: [0, .55556, 0, 0, .66667], 8745: [0, .55556, 0, 0, .66667], 8746: [0, .55556, 0, 0, .66667], 8747: [.19444, .69444, .11111, 0, .41667], 8764: [-.13313, .36687, 0, 0, .77778], 8768: [.19444, .69444, 0, 0, .27778], 8771: [-.03625, .46375, 0, 0, .77778], 8773: [-.022, .589, 0, 0, 1], 8776: [-.01688, .48312, 0, 0, .77778], 8781: [-.03625, .46375, 0, 0, .77778], 8784: [-.133, .67, 0, 0, .778], 8801: [-.03625, .46375, 0, 0, .77778], 8804: [.13597, .63597, 0, 0, .77778], 8805: [.13597, .63597, 0, 0, .77778], 8810: [.0391, .5391, 0, 0, 1], 8811: [.0391, .5391, 0, 0, 1], + 8826: [.0391, .5391, 0, 0, .77778], 8827: [.0391, .5391, 0, 0, .77778], 8834: [.0391, .5391, 0, 0, .77778], 8835: [.0391, .5391, 0, 0, .77778], 8838: [.13597, .63597, 0, 0, .77778], 8839: [.13597, .63597, 0, 0, .77778], 8846: [0, .55556, 0, 0, .66667], 8849: [.13597, .63597, 0, 0, .77778], 8850: [.13597, .63597, 0, 0, .77778], 8851: [0, .55556, 0, 0, .66667], 8852: [0, .55556, 0, 0, .66667], 8853: [.08333, .58333, 0, 0, .77778], 8854: [.08333, .58333, 0, 0, .77778], 8855: [.08333, .58333, 0, 0, .77778], 8856: [.08333, .58333, 0, 0, .77778], 8857: [.08333, .58333, 0, 0, .77778], 8866: [0, .69444, 0, 0, .61111], 8867: [0, .69444, 0, 0, .61111], 8868: [0, .69444, 0, 0, .77778], 8869: [0, .69444, 0, 0, .77778], 8872: [.249, .75, 0, 0, .867], 8900: [-.05555, .44445, 0, 0, .5], 8901: [-.05555, .44445, 0, 0, .27778], 8902: [-.03472, .46528, 0, 0, .5], 8904: [.005, .505, 0, 0, .9], 8942: [.03, .9, 0, 0, .278], 8943: [-.19, .31, 0, 0, 1.172], 8945: [-.1, .82, 0, 0, 1.282], 8968: [.25, .75, 0, 0, .44445], 8969: [.25, .75, 0, 0, .44445], 8970: [.25, .75, 0, 0, .44445], 8971: [.25, .75, 0, 0, .44445], 8994: [-.14236, .35764, 0, 0, 1], 8995: [-.14236, .35764, 0, 0, 1], 9136: [.244, .744, 0, 0, .412], 9137: [.244, .744, 0, 0, .412], 9651: [.19444, .69444, 0, 0, .88889], 9657: [-.03472, .46528, 0, 0, .5], 9661: [.19444, .69444, 0, 0, .88889], 9667: [-.03472, .46528, 0, 0, .5], 9711: [.19444, .69444, 0, 0, 1], 9824: [.12963, .69444, 0, 0, .77778], 9825: [.12963, .69444, 0, 0, .77778], 9826: [.12963, .69444, 0, 0, .77778], 9827: [.12963, .69444, 0, 0, .77778], 9837: [0, .75, 0, 0, .38889], 9838: [.19444, .69444, 0, 0, .38889], 9839: [.19444, .69444, 0, 0, .38889], 10216: [.25, .75, 0, 0, .38889], 10217: [.25, .75, 0, 0, .38889], 10222: [.244, .744, 0, 0, .412], 10223: [.244, .744, 0, 0, .412], 10229: [.011, .511, 0, 0, 1.609], 10230: [.011, .511, 0, 0, 1.638], 10231: [.011, .511, 0, 0, 1.859], 10232: [.024, .525, 0, 0, 1.609], 10233: [.024, .525, 0, 0, 1.638], 10234: [.024, .525, 0, 0, 1.858], 10236: [.011, .511, 0, 0, 1.638], 10815: [0, .68333, 0, 0, .75], 10927: [.13597, .63597, 0, 0, .77778], 10928: [.13597, .63597, 0, 0, .77778], 57376: [.19444, .69444, 0, 0, 0] + }, "Math-BoldItalic": { 65: [0, .68611, 0, 0, .86944], 66: [0, .68611, .04835, 0, .8664], 67: [0, .68611, .06979, 0, .81694], 68: [0, .68611, .03194, 0, .93812], 69: [0, .68611, .05451, 0, .81007], 70: [0, .68611, .15972, 0, .68889], 71: [0, .68611, 0, 0, .88673], 72: [0, .68611, .08229, 0, .98229], 73: [0, .68611, .07778, 0, .51111], 74: [0, .68611, .10069, 0, .63125], 75: [0, .68611, .06979, 0, .97118], 76: [0, .68611, 0, 0, .75555], 77: [0, .68611, .11424, 0, 1.14201], 78: [0, .68611, .11424, 0, .95034], 79: [0, .68611, .03194, 0, .83666], 80: [0, .68611, .15972, 0, .72309], 81: [.19444, .68611, 0, 0, .86861], 82: [0, .68611, .00421, 0, .87235], 83: [0, .68611, .05382, 0, .69271], 84: [0, .68611, .15972, 0, .63663], 85: [0, .68611, .11424, 0, .80027], 86: [0, .68611, .25555, 0, .67778], 87: [0, .68611, .15972, 0, 1.09305], 88: [0, .68611, .07778, 0, .94722], 89: [0, .68611, .25555, 0, .67458], 90: [0, .68611, .06979, 0, .77257], 97: [0, .44444, 0, 0, .63287], 98: [0, .69444, 0, 0, .52083], 99: [0, .44444, 0, 0, .51342], 100: [0, .69444, 0, 0, .60972], 101: [0, .44444, 0, 0, .55361], 102: [.19444, .69444, .11042, 0, .56806], 103: [.19444, .44444, .03704, 0, .5449], 104: [0, .69444, 0, 0, .66759], 105: [0, .69326, 0, 0, .4048], 106: [.19444, .69326, .0622, 0, .47083], 107: [0, .69444, .01852, 0, .6037], 108: [0, .69444, .0088, 0, .34815], 109: [0, .44444, 0, 0, 1.0324], 110: [0, .44444, 0, 0, .71296], 111: [0, .44444, 0, 0, .58472], 112: [.19444, .44444, 0, 0, .60092], 113: [.19444, .44444, .03704, 0, .54213], 114: [0, .44444, .03194, 0, .5287], 115: [0, .44444, 0, 0, .53125], 116: [0, .63492, 0, 0, .41528], 117: [0, .44444, 0, 0, .68102], 118: [0, .44444, .03704, 0, .56666], 119: [0, .44444, .02778, 0, .83148], 120: [0, .44444, 0, 0, .65903], 121: [.19444, .44444, .03704, 0, .59028], 122: [0, .44444, .04213, 0, .55509], 915: [0, .68611, .15972, 0, .65694], 916: [0, .68611, 0, 0, .95833], 920: [0, .68611, .03194, 0, .86722], 923: [0, .68611, 0, 0, .80555], 926: [0, .68611, .07458, 0, .84125], 928: [0, .68611, .08229, 0, .98229], 931: [0, .68611, .05451, 0, .88507], 933: [0, .68611, .15972, 0, .67083], 934: [0, .68611, 0, 0, .76666], 936: [0, .68611, .11653, 0, .71402], 937: [0, .68611, .04835, 0, .8789], 945: [0, .44444, 0, 0, .76064], 946: [.19444, .69444, .03403, 0, .65972], 947: [.19444, .44444, .06389, 0, .59003], 948: [0, .69444, .03819, 0, .52222], 949: [0, .44444, 0, 0, .52882], 950: [.19444, .69444, .06215, 0, .50833], 951: [.19444, .44444, .03704, 0, .6], 952: [0, .69444, .03194, 0, .5618], 953: [0, .44444, 0, 0, .41204], 954: [0, .44444, 0, 0, .66759], 955: [0, .69444, 0, 0, .67083], 956: [.19444, .44444, 0, 0, .70787], 957: [0, .44444, .06898, 0, .57685], 958: [.19444, .69444, .03021, 0, .50833], 959: [0, .44444, 0, 0, .58472], 960: [0, .44444, .03704, 0, .68241], 961: [.19444, .44444, 0, 0, .6118], 962: [.09722, .44444, .07917, 0, .42361], 963: [0, .44444, .03704, 0, .68588], 964: [0, .44444, .13472, 0, .52083], 965: [0, .44444, .03704, 0, .63055], 966: [.19444, .44444, 0, 0, .74722], 967: [.19444, .44444, 0, 0, .71805], 968: [.19444, .69444, .03704, 0, .75833], 969: [0, .44444, .03704, 0, .71782], 977: [0, .69444, 0, 0, .69155], 981: [.19444, .69444, 0, 0, .7125], 982: [0, .44444, .03194, 0, .975], 1009: [.19444, .44444, 0, 0, .6118], 1013: [0, .44444, 0, 0, .48333] }, "Math-Italic": { 65: [0, .68333, 0, .13889, .75], 66: [0, .68333, .05017, .08334, .75851], 67: [0, .68333, .07153, .08334, .71472], 68: [0, .68333, .02778, .05556, .82792], 69: [0, .68333, .05764, .08334, .7382], 70: [0, .68333, .13889, .08334, .64306], 71: [0, .68333, 0, .08334, .78625], 72: [0, .68333, .08125, .05556, .83125], 73: [0, .68333, .07847, .11111, .43958], 74: [0, .68333, .09618, .16667, .55451], 75: [0, .68333, .07153, .05556, .84931], 76: [0, .68333, 0, .02778, .68056], 77: [0, .68333, .10903, .08334, .97014], 78: [0, .68333, .10903, .08334, .80347], 79: [0, .68333, .02778, .08334, .76278], 80: [0, .68333, .13889, .08334, .64201], 81: [.19444, .68333, 0, .08334, .79056], 82: [0, .68333, .00773, .08334, .75929], 83: [0, .68333, .05764, .08334, .6132], 84: [0, .68333, .13889, .08334, .58438], 85: [0, .68333, .10903, .02778, .68278], 86: [0, .68333, .22222, 0, .58333], 87: [0, .68333, .13889, 0, .94445], 88: [0, .68333, .07847, .08334, .82847], 89: [0, .68333, .22222, 0, .58056], 90: [0, .68333, .07153, .08334, .68264], 97: [0, .43056, 0, 0, .52859], 98: [0, .69444, 0, 0, .42917], 99: [0, .43056, 0, .05556, .43276], 100: [0, .69444, 0, .16667, .52049], 101: [0, .43056, 0, .05556, .46563], 102: [.19444, .69444, .10764, .16667, .48959], 103: [.19444, .43056, .03588, .02778, .47697], 104: [0, .69444, 0, 0, .57616], 105: [0, .65952, 0, 0, .34451], 106: [.19444, .65952, .05724, 0, .41181], 107: [0, .69444, .03148, 0, .5206], 108: [0, .69444, .01968, .08334, .29838], 109: [0, .43056, 0, 0, .87801], 110: [0, .43056, 0, 0, .60023], 111: [0, .43056, 0, .05556, .48472], 112: [.19444, .43056, 0, .08334, .50313], 113: [.19444, .43056, .03588, .08334, .44641], 114: [0, .43056, .02778, .05556, .45116], 115: [0, .43056, 0, .05556, .46875], 116: [0, .61508, 0, .08334, .36111], 117: [0, .43056, 0, .02778, .57246], 118: [0, .43056, .03588, .02778, .48472], 119: [0, .43056, .02691, .08334, .71592], 120: [0, .43056, 0, .02778, .57153], 121: [.19444, .43056, .03588, .05556, .49028], 122: [0, .43056, .04398, .05556, .46505], 915: [0, .68333, .13889, .08334, .61528], 916: [0, .68333, 0, .16667, .83334], 920: [0, .68333, .02778, .08334, .76278], 923: [0, .68333, 0, .16667, .69445], 926: [0, .68333, .07569, .08334, .74236], 928: [0, .68333, .08125, .05556, .83125], 931: [0, .68333, .05764, .08334, .77986], 933: [0, .68333, .13889, .05556, .58333], 934: [0, .68333, 0, .08334, .66667], 936: [0, .68333, .11, .05556, .61222], 937: [0, .68333, .05017, .08334, .7724], 945: [0, .43056, .0037, .02778, .6397], 946: [.19444, .69444, .05278, .08334, .56563], 947: [.19444, .43056, .05556, 0, .51773], 948: [0, .69444, .03785, .05556, .44444], 949: [0, .43056, 0, .08334, .46632], 950: [.19444, .69444, .07378, .08334, .4375], 951: [.19444, .43056, .03588, .05556, .49653], 952: [0, .69444, .02778, .08334, .46944], 953: [0, .43056, 0, .05556, .35394], 954: [0, .43056, 0, 0, .57616], 955: [0, .69444, 0, 0, .58334], 956: [.19444, .43056, 0, .02778, .60255], 957: [0, .43056, .06366, .02778, .49398], 958: [.19444, .69444, .04601, .11111, .4375], 959: [0, .43056, 0, .05556, .48472], 960: [0, .43056, .03588, 0, .57003], 961: [.19444, .43056, 0, .08334, .51702], 962: [.09722, .43056, .07986, .08334, .36285], 963: [0, .43056, .03588, 0, .57141], 964: [0, .43056, .1132, .02778, .43715], 965: [0, .43056, .03588, .02778, .54028], 966: [.19444, .43056, 0, .08334, .65417], 967: [.19444, .43056, 0, .05556, .62569], 968: [.19444, .69444, .03588, .11111, .65139], 969: [0, .43056, .03588, 0, .62245], 977: [0, .69444, 0, .08334, .59144], 981: [.19444, .69444, 0, .08334, .59583], 982: [0, .43056, .02778, 0, .82813], 1009: [.19444, .43056, 0, .08334, .51702], 1013: [0, .43056, 0, .05556, .4059] }, "Math-Regular": { 65: [0, .68333, 0, .13889, .75], 66: [0, .68333, .05017, .08334, .75851], 67: [0, .68333, .07153, .08334, .71472], 68: [0, .68333, .02778, .05556, .82792], 69: [0, .68333, .05764, .08334, .7382], 70: [0, .68333, .13889, .08334, .64306], 71: [0, .68333, 0, .08334, .78625], 72: [0, .68333, .08125, .05556, .83125], 73: [0, .68333, .07847, .11111, .43958], 74: [0, .68333, .09618, .16667, .55451], 75: [0, .68333, .07153, .05556, .84931], 76: [0, .68333, 0, .02778, .68056], 77: [0, .68333, .10903, .08334, .97014], 78: [0, .68333, .10903, .08334, .80347], 79: [0, .68333, .02778, .08334, .76278], 80: [0, .68333, .13889, .08334, .64201], 81: [.19444, .68333, 0, .08334, .79056], 82: [0, .68333, .00773, .08334, .75929], 83: [0, .68333, .05764, .08334, .6132], 84: [0, .68333, .13889, .08334, .58438], 85: [0, .68333, .10903, .02778, .68278], 86: [0, .68333, .22222, 0, .58333], 87: [0, .68333, .13889, 0, .94445], 88: [0, .68333, .07847, .08334, .82847], 89: [0, .68333, .22222, 0, .58056], 90: [0, .68333, .07153, .08334, .68264], 97: [0, .43056, 0, 0, .52859], 98: [0, .69444, 0, 0, .42917], 99: [0, .43056, 0, .05556, .43276], 100: [0, .69444, 0, .16667, .52049], 101: [0, .43056, 0, .05556, .46563], 102: [.19444, .69444, .10764, .16667, .48959], 103: [.19444, .43056, .03588, .02778, .47697], 104: [0, .69444, 0, 0, .57616], 105: [0, .65952, 0, 0, .34451], 106: [.19444, .65952, .05724, 0, .41181], 107: [0, .69444, .03148, 0, .5206], 108: [0, .69444, .01968, .08334, .29838], 109: [0, .43056, 0, 0, .87801], 110: [0, .43056, 0, 0, .60023], 111: [0, .43056, 0, .05556, .48472], 112: [.19444, .43056, 0, .08334, .50313], 113: [.19444, .43056, .03588, .08334, .44641], 114: [0, .43056, .02778, .05556, .45116], 115: [0, .43056, 0, .05556, .46875], 116: [0, .61508, 0, .08334, .36111], 117: [0, .43056, 0, .02778, .57246], 118: [0, .43056, .03588, .02778, .48472], 119: [0, .43056, .02691, .08334, .71592], 120: [0, .43056, 0, .02778, .57153], 121: [.19444, .43056, .03588, .05556, .49028], 122: [0, .43056, .04398, .05556, .46505], 915: [0, .68333, .13889, .08334, .61528], 916: [0, .68333, 0, .16667, .83334], 920: [0, .68333, .02778, .08334, .76278], 923: [0, .68333, 0, .16667, .69445], 926: [0, .68333, .07569, .08334, .74236], 928: [0, .68333, .08125, .05556, .83125], 931: [0, .68333, .05764, .08334, .77986], 933: [0, .68333, .13889, .05556, .58333], 934: [0, .68333, 0, .08334, .66667], 936: [0, .68333, .11, .05556, .61222], 937: [0, .68333, .05017, .08334, .7724], 945: [0, .43056, .0037, .02778, .6397], 946: [.19444, .69444, .05278, .08334, .56563], 947: [.19444, .43056, .05556, 0, .51773], 948: [0, .69444, .03785, .05556, .44444], 949: [0, .43056, 0, .08334, .46632], 950: [.19444, .69444, .07378, .08334, .4375], 951: [.19444, .43056, .03588, .05556, .49653], 952: [0, .69444, .02778, .08334, .46944], 953: [0, .43056, 0, .05556, .35394], 954: [0, .43056, 0, 0, .57616], 955: [0, .69444, 0, 0, .58334], 956: [.19444, .43056, 0, .02778, .60255], 957: [0, .43056, .06366, .02778, .49398], 958: [.19444, .69444, .04601, .11111, .4375], 959: [0, .43056, 0, .05556, .48472], 960: [0, .43056, .03588, 0, .57003], 961: [.19444, .43056, 0, .08334, .51702], 962: [.09722, .43056, .07986, .08334, .36285], 963: [0, .43056, .03588, 0, .57141], 964: [0, .43056, .1132, .02778, .43715], 965: [0, .43056, .03588, .02778, .54028], 966: [.19444, .43056, 0, .08334, .65417], 967: [.19444, .43056, 0, .05556, .62569], 968: [.19444, .69444, .03588, .11111, .65139], 969: [0, .43056, .03588, 0, .62245], 977: [0, .69444, 0, .08334, .59144], 981: [.19444, .69444, 0, .08334, .59583], 982: [0, .43056, .02778, 0, .82813], 1009: [.19444, .43056, 0, .08334, .51702], 1013: [0, .43056, 0, .05556, .4059] }, "SansSerif-Bold": { 33: [0, .69444, 0, 0, .36667], 34: [0, .69444, 0, 0, .55834], 35: [.19444, .69444, 0, 0, .91667], 36: [.05556, .75, 0, 0, .55], 37: [.05556, .75, 0, 0, 1.02912], 38: [0, .69444, 0, 0, .83056], 39: [0, .69444, 0, 0, .30556], 40: [.25, .75, 0, 0, .42778], 41: [.25, .75, 0, 0, .42778], 42: [0, .75, 0, 0, .55], 43: [.11667, .61667, 0, 0, .85556], 44: [.10556, .13056, 0, 0, .30556], 45: [0, .45833, 0, 0, .36667], 46: [0, .13056, 0, 0, .30556], 47: [.25, .75, 0, 0, .55], 48: [0, .69444, 0, 0, .55], 49: [0, .69444, 0, 0, .55], 50: [0, .69444, 0, 0, .55], 51: [0, .69444, 0, 0, .55], 52: [0, .69444, 0, 0, .55], 53: [0, .69444, 0, 0, .55], 54: [0, .69444, 0, 0, .55], 55: [0, .69444, 0, 0, .55], 56: [0, .69444, 0, 0, .55], 57: [0, .69444, 0, 0, .55], 58: [0, .45833, 0, 0, .30556], 59: [.10556, .45833, 0, 0, .30556], 61: [-.09375, .40625, 0, 0, .85556], 63: [0, .69444, 0, 0, .51945], 64: [0, .69444, 0, 0, .73334], 65: [0, .69444, 0, 0, .73334], 66: [0, .69444, 0, 0, .73334], 67: [0, .69444, 0, 0, .70278], 68: [0, .69444, 0, 0, .79445], 69: [0, .69444, 0, 0, .64167], 70: [0, .69444, 0, 0, .61111], 71: [0, .69444, 0, 0, .73334], 72: [0, .69444, 0, 0, .79445], 73: [0, .69444, 0, 0, .33056], 74: [0, .69444, 0, 0, .51945], 75: [0, .69444, 0, 0, .76389], 76: [0, .69444, 0, 0, .58056], 77: [0, .69444, 0, 0, .97778], 78: [0, .69444, 0, 0, .79445], 79: [0, .69444, 0, 0, .79445], 80: [0, .69444, 0, 0, .70278], 81: [.10556, .69444, 0, 0, .79445], 82: [0, .69444, 0, 0, .70278], 83: [0, .69444, 0, 0, .61111], 84: [0, .69444, 0, 0, .73334], 85: [0, .69444, 0, 0, .76389], 86: [0, .69444, .01528, 0, .73334], 87: [0, .69444, .01528, 0, 1.03889], 88: [0, .69444, 0, 0, .73334], 89: [0, .69444, .0275, 0, .73334], 90: [0, .69444, 0, 0, .67223], 91: [.25, .75, 0, 0, .34306], 93: [.25, .75, 0, 0, .34306], 94: [0, .69444, 0, 0, .55], 95: [.35, .10833, .03056, 0, .55], 97: [0, .45833, 0, 0, .525], 98: [0, .69444, 0, 0, .56111], 99: [0, .45833, 0, 0, .48889], 100: [0, .69444, 0, 0, .56111], 101: [0, .45833, 0, 0, .51111], 102: [0, .69444, .07639, 0, .33611], 103: [.19444, .45833, .01528, 0, .55], 104: [0, .69444, 0, 0, .56111], 105: [0, .69444, 0, 0, .25556], 106: [.19444, .69444, 0, 0, .28611], 107: [0, .69444, 0, 0, .53056], 108: [0, .69444, 0, 0, .25556], 109: [0, .45833, 0, 0, .86667], 110: [0, .45833, 0, 0, .56111], 111: [0, .45833, 0, 0, .55], 112: [.19444, .45833, 0, 0, .56111], 113: [.19444, .45833, 0, 0, .56111], 114: [0, .45833, .01528, 0, .37222], 115: [0, .45833, 0, 0, .42167], 116: [0, .58929, 0, 0, .40417], 117: [0, .45833, 0, 0, .56111], 118: [0, .45833, .01528, 0, .5], 119: [0, .45833, .01528, 0, .74445], 120: [0, .45833, 0, 0, .5], 121: [.19444, .45833, .01528, 0, .5], 122: [0, .45833, 0, 0, .47639], 126: [.35, .34444, 0, 0, .55], 168: [0, .69444, 0, 0, .55], 176: [0, .69444, 0, 0, .73334], 180: [0, .69444, 0, 0, .55], 184: [.17014, 0, 0, 0, .48889], 305: [0, .45833, 0, 0, .25556], 567: [.19444, .45833, 0, 0, .28611], 710: [0, .69444, 0, 0, .55], 711: [0, .63542, 0, 0, .55], 713: [0, .63778, 0, 0, .55], 728: [0, .69444, 0, 0, .55], 729: [0, .69444, 0, 0, .30556], 730: [0, .69444, 0, 0, .73334], 732: [0, .69444, 0, 0, .55], 733: [0, .69444, 0, 0, .55], 915: [0, .69444, 0, 0, .58056], 916: [0, .69444, 0, 0, .91667], 920: [0, .69444, 0, 0, .85556], 923: [0, .69444, 0, 0, .67223], 926: [0, .69444, 0, 0, .73334], 928: [0, .69444, 0, 0, .79445], 931: [0, .69444, 0, 0, .79445], 933: [0, .69444, 0, 0, .85556], 934: [0, .69444, 0, 0, .79445], 936: [0, .69444, 0, 0, .85556], 937: [0, .69444, 0, 0, .79445], 8211: [0, .45833, .03056, 0, .55], 8212: [0, .45833, .03056, 0, 1.10001], 8216: [0, .69444, 0, 0, .30556], 8217: [0, .69444, 0, 0, .30556], 8220: [0, .69444, 0, 0, .55834], 8221: [0, .69444, 0, 0, .55834] }, "SansSerif-Italic": { 33: [0, .69444, .05733, 0, .31945], 34: [0, .69444, .00316, 0, .5], 35: [.19444, .69444, .05087, 0, .83334], 36: [.05556, .75, .11156, 0, .5], 37: [.05556, .75, .03126, 0, .83334], 38: [0, .69444, .03058, 0, .75834], 39: [0, .69444, .07816, 0, .27778], 40: [.25, .75, .13164, 0, .38889], 41: [.25, .75, .02536, 0, .38889], 42: [0, .75, .11775, 0, .5], 43: [.08333, .58333, .02536, 0, .77778], 44: [.125, .08333, 0, 0, .27778], 45: [0, .44444, .01946, 0, .33333], 46: [0, .08333, 0, 0, .27778], 47: [.25, .75, .13164, 0, .5], 48: [0, .65556, .11156, 0, .5], 49: [0, .65556, .11156, 0, .5], 50: [0, .65556, .11156, 0, .5], 51: [0, .65556, .11156, 0, .5], 52: [0, .65556, .11156, 0, .5], 53: [0, .65556, .11156, 0, .5], 54: [0, .65556, .11156, 0, .5], 55: [0, .65556, .11156, 0, .5], 56: [0, .65556, .11156, 0, .5], 57: [0, .65556, .11156, 0, .5], 58: [0, .44444, .02502, 0, .27778], 59: [.125, .44444, .02502, 0, .27778], 61: [-.13, .37, .05087, 0, .77778], 63: [0, .69444, .11809, 0, .47222], 64: [0, .69444, .07555, 0, .66667], 65: [0, .69444, 0, 0, .66667], 66: [0, .69444, .08293, 0, .66667], 67: [0, .69444, .11983, 0, .63889], 68: [0, .69444, .07555, 0, .72223], 69: [0, .69444, .11983, 0, .59722], 70: [0, .69444, .13372, 0, .56945], 71: [0, .69444, .11983, 0, .66667], 72: [0, .69444, .08094, 0, .70834], 73: [0, .69444, .13372, 0, .27778], 74: [0, .69444, .08094, 0, .47222], 75: [0, .69444, .11983, 0, .69445], 76: [0, .69444, 0, 0, .54167], 77: [0, .69444, .08094, 0, .875], 78: [0, .69444, .08094, 0, .70834], 79: [0, .69444, .07555, 0, .73611], 80: [0, .69444, .08293, 0, .63889], 81: [.125, .69444, .07555, 0, .73611], 82: [0, .69444, .08293, 0, .64584], 83: [0, .69444, .09205, 0, .55556], 84: [0, .69444, .13372, 0, .68056], 85: [0, .69444, .08094, 0, .6875], 86: [0, .69444, .1615, 0, .66667], 87: [0, .69444, .1615, 0, .94445], 88: [0, .69444, .13372, 0, .66667], 89: [0, .69444, .17261, 0, .66667], 90: [0, .69444, .11983, 0, .61111], 91: [.25, .75, .15942, 0, .28889], 93: [.25, .75, .08719, 0, .28889], 94: [0, .69444, .0799, 0, .5], 95: [.35, .09444, .08616, 0, .5], 97: [0, .44444, .00981, 0, .48056], 98: [0, .69444, .03057, 0, .51667], 99: [0, .44444, .08336, 0, .44445], 100: [0, .69444, .09483, 0, .51667], 101: [0, .44444, .06778, 0, .44445], 102: [0, .69444, .21705, 0, .30556], 103: [.19444, .44444, .10836, 0, .5], 104: [0, .69444, .01778, 0, .51667], 105: [0, .67937, .09718, 0, .23889], 106: [.19444, .67937, .09162, 0, .26667], 107: [0, .69444, .08336, 0, .48889], 108: [0, .69444, .09483, 0, .23889], 109: [0, .44444, .01778, 0, .79445], 110: [0, .44444, .01778, 0, .51667], 111: [0, .44444, .06613, 0, .5], 112: [.19444, .44444, .0389, 0, .51667], 113: [.19444, .44444, .04169, 0, .51667], 114: [0, .44444, .10836, 0, .34167], 115: [0, .44444, .0778, 0, .38333], 116: [0, .57143, .07225, 0, .36111], 117: [0, .44444, .04169, 0, .51667], 118: [0, .44444, .10836, 0, .46111], 119: [0, .44444, .10836, 0, .68334], 120: [0, .44444, .09169, 0, .46111], 121: [.19444, .44444, .10836, 0, .46111], 122: [0, .44444, .08752, 0, .43472], 126: [.35, .32659, .08826, 0, .5], 168: [0, .67937, .06385, 0, .5], 176: [0, .69444, 0, 0, .73752], 184: [.17014, 0, 0, 0, .44445], 305: [0, .44444, .04169, 0, .23889], 567: [.19444, .44444, .04169, 0, .26667], 710: [0, .69444, .0799, 0, .5], 711: [0, .63194, .08432, 0, .5], 713: [0, .60889, .08776, 0, .5], 714: [0, .69444, .09205, 0, .5], 715: [0, .69444, 0, 0, .5], 728: [0, .69444, .09483, 0, .5], 729: [0, .67937, .07774, 0, .27778], 730: [0, .69444, 0, 0, .73752], 732: [0, .67659, .08826, 0, .5], 733: [0, .69444, .09205, 0, .5], 915: [0, .69444, .13372, 0, .54167], 916: [0, .69444, 0, 0, .83334], 920: [0, .69444, .07555, 0, .77778], 923: [0, .69444, 0, 0, .61111], 926: [0, .69444, .12816, 0, .66667], 928: [0, .69444, .08094, 0, .70834], 931: [0, .69444, .11983, 0, .72222], 933: [0, .69444, .09031, 0, .77778], 934: [0, .69444, .04603, 0, .72222], 936: [0, .69444, .09031, 0, .77778], 937: [0, .69444, .08293, 0, .72222], 8211: [0, .44444, .08616, 0, .5], 8212: [0, .44444, .08616, 0, 1], 8216: [0, .69444, .07816, 0, .27778], 8217: [0, .69444, .07816, 0, .27778], 8220: [0, .69444, .14205, 0, .5], 8221: [0, .69444, .00316, 0, .5] }, "SansSerif-Regular": { 33: [0, .69444, 0, 0, .31945], 34: [0, .69444, 0, 0, .5], 35: [.19444, .69444, 0, 0, .83334], 36: [.05556, .75, 0, 0, .5], 37: [.05556, .75, 0, 0, .83334], 38: [0, .69444, 0, 0, .75834], 39: [0, .69444, 0, 0, .27778], 40: [.25, .75, 0, 0, .38889], 41: [.25, .75, 0, 0, .38889], 42: [0, .75, 0, 0, .5], 43: [.08333, .58333, 0, 0, .77778], 44: [.125, .08333, 0, 0, .27778], 45: [0, .44444, 0, 0, .33333], 46: [0, .08333, 0, 0, .27778], 47: [.25, .75, 0, 0, .5], 48: [0, .65556, 0, 0, .5], 49: [0, .65556, 0, 0, .5], 50: [0, .65556, 0, 0, .5], 51: [0, .65556, 0, 0, .5], 52: [0, .65556, 0, 0, .5], 53: [0, .65556, 0, 0, .5], 54: [0, .65556, 0, 0, .5], 55: [0, .65556, 0, 0, .5], 56: [0, .65556, 0, 0, .5], 57: [0, .65556, 0, 0, .5], 58: [0, .44444, 0, 0, .27778], 59: [.125, .44444, 0, 0, .27778], 61: [-.13, .37, 0, 0, .77778], 63: [0, .69444, 0, 0, .47222], 64: [0, .69444, 0, 0, .66667], 65: [0, .69444, 0, 0, .66667], 66: [0, .69444, 0, 0, .66667], 67: [0, .69444, 0, 0, .63889], 68: [0, .69444, 0, 0, .72223], 69: [0, .69444, 0, 0, .59722], 70: [0, .69444, 0, 0, .56945], 71: [0, .69444, 0, 0, .66667], 72: [0, .69444, 0, 0, .70834], 73: [0, .69444, 0, 0, .27778], 74: [0, .69444, 0, 0, .47222], 75: [0, .69444, 0, 0, .69445], 76: [0, .69444, 0, 0, .54167], 77: [0, .69444, 0, 0, .875], 78: [0, .69444, 0, 0, .70834], 79: [0, .69444, 0, 0, .73611], 80: [0, .69444, 0, 0, .63889], 81: [.125, .69444, 0, 0, .73611], 82: [0, .69444, 0, 0, .64584], 83: [0, .69444, 0, 0, .55556], 84: [0, .69444, 0, 0, .68056], 85: [0, .69444, 0, 0, .6875], 86: [0, .69444, .01389, 0, .66667], 87: [0, .69444, .01389, 0, .94445], 88: [0, .69444, 0, 0, .66667], 89: [0, .69444, .025, 0, .66667], 90: [0, .69444, 0, 0, .61111], 91: [.25, .75, 0, 0, .28889], 93: [.25, .75, 0, 0, .28889], 94: [0, .69444, 0, 0, .5], 95: [.35, .09444, .02778, 0, .5], 97: [0, .44444, 0, 0, .48056], 98: [0, .69444, 0, 0, .51667], 99: [0, .44444, 0, 0, .44445], 100: [0, .69444, 0, 0, .51667], 101: [0, .44444, 0, 0, .44445], 102: [0, .69444, .06944, 0, .30556], 103: [.19444, .44444, .01389, 0, .5], 104: [0, .69444, 0, 0, .51667], 105: [0, .67937, 0, 0, .23889], 106: [.19444, .67937, 0, 0, .26667], 107: [0, .69444, 0, 0, .48889], 108: [0, .69444, 0, 0, .23889], 109: [0, .44444, 0, 0, .79445], 110: [0, .44444, 0, 0, .51667], 111: [0, .44444, 0, 0, .5], 112: [.19444, .44444, 0, 0, .51667], 113: [.19444, .44444, 0, 0, .51667], 114: [0, .44444, .01389, 0, .34167], 115: [0, .44444, 0, 0, .38333], 116: [0, .57143, 0, 0, .36111], 117: [0, .44444, 0, 0, .51667], 118: [0, .44444, .01389, 0, .46111], 119: [0, .44444, .01389, 0, .68334], 120: [0, .44444, 0, 0, .46111], 121: [.19444, .44444, .01389, 0, .46111], 122: [0, .44444, 0, 0, .43472], 126: [.35, .32659, 0, 0, .5], 168: [0, .67937, 0, 0, .5], 176: [0, .69444, 0, 0, .66667], 184: [.17014, 0, 0, 0, .44445], 305: [0, .44444, 0, 0, .23889], 567: [.19444, .44444, 0, 0, .26667], 710: [0, .69444, 0, 0, .5], 711: [0, .63194, 0, 0, .5], 713: [0, .60889, 0, 0, .5], 714: [0, .69444, 0, 0, .5], 715: [0, .69444, 0, 0, .5], 728: [0, .69444, 0, 0, .5], 729: [0, .67937, 0, 0, .27778], 730: [0, .69444, 0, 0, .66667], 732: [0, .67659, 0, 0, .5], 733: [0, .69444, 0, 0, .5], 915: [0, .69444, 0, 0, .54167], 916: [0, .69444, 0, 0, .83334], 920: [0, .69444, 0, 0, .77778], 923: [0, .69444, 0, 0, .61111], 926: [0, .69444, 0, 0, .66667], 928: [0, .69444, 0, 0, .70834], 931: [0, .69444, 0, 0, .72222], 933: [0, .69444, 0, 0, .77778], 934: [0, .69444, 0, 0, .72222], 936: [0, .69444, 0, 0, .77778], 937: [0, .69444, 0, 0, .72222], 8211: [0, .44444, .02778, 0, .5], 8212: [0, .44444, .02778, 0, 1], 8216: [0, .69444, 0, 0, .27778], 8217: [0, .69444, 0, 0, .27778], 8220: [0, .69444, 0, 0, .5], 8221: [0, .69444, 0, 0, .5] }, "Script-Regular": { 65: [0, .7, .22925, 0, .80253], 66: [0, .7, .04087, 0, .90757], 67: [0, .7, .1689, 0, .66619], 68: [0, .7, .09371, 0, .77443], 69: [0, .7, .18583, 0, .56162], 70: [0, .7, .13634, 0, .89544], 71: [0, .7, .17322, 0, .60961], 72: [0, .7, .29694, 0, .96919], 73: [0, .7, .19189, 0, .80907], 74: [.27778, .7, .19189, 0, 1.05159], 75: [0, .7, .31259, 0, .91364], 76: [0, .7, .19189, 0, .87373], 77: [0, .7, .15981, 0, 1.08031], 78: [0, .7, .3525, 0, .9015], 79: [0, .7, .08078, 0, .73787], 80: [0, .7, .08078, 0, 1.01262], 81: [0, .7, .03305, 0, .88282], 82: [0, .7, .06259, 0, .85], 83: [0, .7, .19189, 0, .86767], 84: [0, .7, .29087, 0, .74697], 85: [0, .7, .25815, 0, .79996], 86: [0, .7, .27523, 0, .62204], 87: [0, .7, .27523, 0, .80532], 88: [0, .7, .26006, 0, .94445], 89: [0, .7, .2939, 0, .70961], 90: [0, .7, .24037, 0, .8212] }, "Size1-Regular": { 40: [.35001, .85, 0, 0, .45834], 41: [.35001, .85, 0, 0, .45834], 47: [.35001, .85, 0, 0, .57778], 91: [.35001, .85, 0, 0, .41667], 92: [.35001, .85, 0, 0, .57778], 93: [.35001, .85, 0, 0, .41667], 123: [.35001, .85, 0, 0, .58334], 125: [.35001, .85, 0, 0, .58334], 710: [0, .72222, 0, 0, .55556], 732: [0, .72222, 0, 0, .55556], 770: [0, .72222, 0, 0, .55556], 771: [0, .72222, 0, 0, .55556], 8214: [-99e-5, .601, 0, 0, .77778], 8593: [1e-5, .6, 0, 0, .66667], 8595: [1e-5, .6, 0, 0, .66667], 8657: [1e-5, .6, 0, 0, .77778], 8659: [1e-5, .6, 0, 0, .77778], 8719: [.25001, .75, 0, 0, .94445], 8720: [.25001, .75, 0, 0, .94445], 8721: [.25001, .75, 0, 0, 1.05556], 8730: [.35001, .85, 0, 0, 1], 8739: [-.00599, .606, 0, 0, .33333], 8741: [-.00599, .606, 0, 0, .55556], 8747: [.30612, .805, .19445, 0, .47222], 8748: [.306, .805, .19445, 0, .47222], 8749: [.306, .805, .19445, 0, .47222], 8750: [.30612, .805, .19445, 0, .47222], 8896: [.25001, .75, 0, 0, .83334], 8897: [.25001, .75, 0, 0, .83334], 8898: [.25001, .75, 0, 0, .83334], 8899: [.25001, .75, 0, 0, .83334], 8968: [.35001, .85, 0, 0, .47222], 8969: [.35001, .85, 0, 0, .47222], 8970: [.35001, .85, 0, 0, .47222], 8971: [.35001, .85, 0, 0, .47222], 9168: [-99e-5, .601, 0, 0, .66667], 10216: [.35001, .85, 0, 0, .47222], 10217: [.35001, .85, 0, 0, .47222], 10752: [.25001, .75, 0, 0, 1.11111], 10753: [.25001, .75, 0, 0, 1.11111], 10754: [.25001, .75, 0, 0, 1.11111], 10756: [.25001, .75, 0, 0, .83334], 10758: [.25001, .75, 0, 0, .83334] }, "Size2-Regular": { 40: [.65002, 1.15, 0, 0, .59722], 41: [.65002, 1.15, 0, 0, .59722], 47: [.65002, 1.15, 0, 0, .81111], 91: [.65002, 1.15, 0, 0, .47222], 92: [.65002, 1.15, 0, 0, .81111], 93: [.65002, 1.15, 0, 0, .47222], 123: [.65002, 1.15, 0, 0, .66667], 125: [.65002, 1.15, 0, 0, .66667], 710: [0, .75, 0, 0, 1], 732: [0, .75, 0, 0, 1], 770: [0, .75, 0, 0, 1], 771: [0, .75, 0, 0, 1], 8719: [.55001, 1.05, 0, 0, 1.27778], 8720: [.55001, 1.05, 0, 0, 1.27778], 8721: [.55001, 1.05, 0, 0, 1.44445], 8730: [.65002, 1.15, 0, 0, 1], 8747: [.86225, 1.36, .44445, 0, .55556], 8748: [.862, 1.36, .44445, 0, .55556], 8749: [.862, 1.36, .44445, 0, .55556], 8750: [.86225, 1.36, .44445, 0, .55556], 8896: [.55001, 1.05, 0, 0, 1.11111], 8897: [.55001, 1.05, 0, 0, 1.11111], 8898: [.55001, 1.05, 0, 0, 1.11111], 8899: [.55001, 1.05, 0, 0, 1.11111], 8968: [.65002, 1.15, 0, 0, .52778], 8969: [.65002, 1.15, 0, 0, .52778], 8970: [.65002, 1.15, 0, 0, .52778], 8971: [.65002, 1.15, 0, 0, .52778], 10216: [.65002, 1.15, 0, 0, .61111], 10217: [.65002, 1.15, 0, 0, .61111], 10752: [.55001, 1.05, 0, 0, 1.51112], 10753: [.55001, 1.05, 0, 0, 1.51112], 10754: [.55001, 1.05, 0, 0, 1.51112], 10756: [.55001, 1.05, 0, 0, 1.11111], 10758: [.55001, 1.05, 0, 0, 1.11111] }, "Size3-Regular": { 40: [.95003, 1.45, 0, 0, .73611], 41: [.95003, 1.45, 0, 0, .73611], 47: [.95003, 1.45, 0, 0, 1.04445], 91: [.95003, 1.45, 0, 0, .52778], 92: [.95003, 1.45, 0, 0, 1.04445], 93: [.95003, 1.45, 0, 0, .52778], 123: [.95003, 1.45, 0, 0, .75], 125: [.95003, 1.45, 0, 0, .75], 710: [0, .75, 0, 0, 1.44445], 732: [0, .75, 0, 0, 1.44445], 770: [0, .75, 0, 0, 1.44445], 771: [0, .75, 0, 0, 1.44445], 8730: [.95003, 1.45, 0, 0, 1], 8968: [.95003, 1.45, 0, 0, .58334], 8969: [.95003, 1.45, 0, 0, .58334], 8970: [.95003, 1.45, 0, 0, .58334], 8971: [.95003, 1.45, 0, 0, .58334], 10216: [.95003, 1.45, 0, 0, .75], 10217: [.95003, 1.45, 0, 0, .75] }, "Size4-Regular": { 40: [1.25003, 1.75, 0, 0, .79167], 41: [1.25003, 1.75, 0, 0, .79167], 47: [1.25003, 1.75, 0, 0, 1.27778], 91: [1.25003, 1.75, 0, 0, .58334], 92: [1.25003, 1.75, 0, 0, 1.27778], 93: [1.25003, 1.75, 0, 0, .58334], 123: [1.25003, 1.75, 0, 0, .80556], 125: [1.25003, 1.75, 0, 0, .80556], 710: [0, .825, 0, 0, 1.8889], 732: [0, .825, 0, 0, 1.8889], 770: [0, .825, 0, 0, 1.8889], 771: [0, .825, 0, 0, 1.8889], 8730: [1.25003, 1.75, 0, 0, 1], 8968: [1.25003, 1.75, 0, 0, .63889], 8969: [1.25003, 1.75, 0, 0, .63889], 8970: [1.25003, 1.75, 0, 0, .63889], 8971: [1.25003, 1.75, 0, 0, .63889], 9115: [.64502, 1.155, 0, 0, .875], 9116: [1e-5, .6, 0, 0, .875], 9117: [.64502, 1.155, 0, 0, .875], 9118: [.64502, 1.155, 0, 0, .875], 9119: [1e-5, .6, 0, 0, .875], 9120: [.64502, 1.155, 0, 0, .875], 9121: [.64502, 1.155, 0, 0, .66667], 9122: [-99e-5, .601, 0, 0, .66667], 9123: [.64502, 1.155, 0, 0, .66667], 9124: [.64502, 1.155, 0, 0, .66667], 9125: [-99e-5, .601, 0, 0, .66667], 9126: [.64502, 1.155, 0, 0, .66667], 9127: [1e-5, .9, 0, 0, .88889], 9128: [.65002, 1.15, 0, 0, .88889], 9129: [.90001, 0, 0, 0, .88889], 9130: [0, .3, 0, 0, .88889], 9131: [1e-5, .9, 0, 0, .88889], 9132: [.65002, 1.15, 0, 0, .88889], 9133: [.90001, 0, 0, 0, .88889], 9143: [.88502, .915, 0, 0, 1.05556], 10216: [1.25003, 1.75, 0, 0, .80556], 10217: [1.25003, 1.75, 0, 0, .80556], 57344: [-.00499, .605, 0, 0, 1.05556], 57345: [-.00499, .605, 0, 0, 1.05556], 57680: [0, .12, 0, 0, .45], 57681: [0, .12, 0, 0, .45], 57682: [0, .12, 0, 0, .45], 57683: [0, .12, 0, 0, .45] }, "Typewriter-Regular": { 32: [0, 0, 0, 0, .525], 33: [0, .61111, 0, 0, .525], 34: [0, .61111, 0, 0, .525], 35: [0, .61111, 0, 0, .525], 36: [.08333, .69444, 0, 0, .525], 37: [.08333, .69444, 0, 0, .525], 38: [0, .61111, 0, 0, .525], 39: [0, .61111, 0, 0, .525], 40: [.08333, .69444, 0, 0, .525], 41: [.08333, .69444, 0, 0, .525], 42: [0, .52083, 0, 0, .525], 43: [-.08056, .53055, 0, 0, .525], 44: [.13889, .125, 0, 0, .525], 45: [-.08056, .53055, 0, 0, .525], 46: [0, .125, 0, 0, .525], 47: [.08333, .69444, 0, 0, .525], 48: [0, .61111, 0, 0, .525], 49: [0, .61111, 0, 0, .525], 50: [0, .61111, 0, 0, .525], 51: [0, .61111, 0, 0, .525], 52: [0, .61111, 0, 0, .525], 53: [0, .61111, 0, 0, .525], 54: [0, .61111, 0, 0, .525], 55: [0, .61111, 0, 0, .525], 56: [0, .61111, 0, 0, .525], 57: [0, .61111, 0, 0, .525], 58: [0, .43056, 0, 0, .525], 59: [.13889, .43056, 0, 0, .525], 60: [-.05556, .55556, 0, 0, .525], 61: [-.19549, .41562, 0, 0, .525], 62: [-.05556, .55556, 0, 0, .525], 63: [0, .61111, 0, 0, .525], 64: [0, .61111, 0, 0, .525], 65: [0, .61111, 0, 0, .525], 66: [0, .61111, 0, 0, .525], 67: [0, .61111, 0, 0, .525], 68: [0, .61111, 0, 0, .525], 69: [0, .61111, 0, 0, .525], 70: [0, .61111, 0, 0, .525], 71: [0, .61111, 0, 0, .525], 72: [0, .61111, 0, 0, .525], 73: [0, .61111, 0, 0, .525], 74: [0, .61111, 0, 0, .525], 75: [0, .61111, 0, 0, .525], 76: [0, .61111, 0, 0, .525], 77: [0, .61111, 0, 0, .525], 78: [0, .61111, 0, 0, .525], 79: [0, .61111, 0, 0, .525], 80: [0, .61111, 0, 0, .525], 81: [.13889, .61111, 0, 0, .525], 82: [0, .61111, 0, 0, .525], 83: [0, .61111, 0, 0, .525], 84: [0, .61111, 0, 0, .525], 85: [0, .61111, 0, 0, .525], 86: [0, .61111, 0, 0, .525], 87: [0, .61111, 0, 0, .525], 88: [0, .61111, 0, 0, .525], 89: [0, .61111, 0, 0, .525], 90: [0, .61111, 0, 0, .525], 91: [.08333, .69444, 0, 0, .525], 92: [.08333, .69444, 0, 0, .525], 93: [.08333, .69444, 0, 0, .525], 94: [0, .61111, 0, 0, .525], 95: [.09514, 0, 0, 0, .525], 96: [0, .61111, 0, 0, .525], 97: [0, .43056, 0, 0, .525], 98: [0, .61111, 0, 0, .525], 99: [0, .43056, 0, 0, .525], 100: [0, .61111, 0, 0, .525], 101: [0, .43056, 0, 0, .525], 102: [0, .61111, 0, 0, .525], 103: [.22222, .43056, 0, 0, .525], 104: [0, .61111, 0, 0, .525], 105: [0, .61111, 0, 0, .525], 106: [.22222, .61111, 0, 0, .525], 107: [0, .61111, 0, 0, .525], 108: [0, .61111, 0, 0, .525], 109: [0, .43056, 0, 0, .525], 110: [0, .43056, 0, 0, .525], 111: [0, .43056, 0, 0, .525], 112: [.22222, .43056, 0, 0, .525], 113: [.22222, .43056, 0, 0, .525], 114: [0, .43056, 0, 0, .525], 115: [0, .43056, 0, 0, .525], 116: [0, .55358, 0, 0, .525], 117: [0, .43056, 0, 0, .525], 118: [0, .43056, 0, 0, .525], 119: [0, .43056, 0, 0, .525], 120: [0, .43056, 0, 0, .525], 121: [.22222, .43056, 0, 0, .525], 122: [0, .43056, 0, 0, .525], 123: [.08333, .69444, 0, 0, .525], 124: [.08333, .69444, 0, 0, .525], 125: [.08333, .69444, 0, 0, .525], 126: [0, .61111, 0, 0, .525], 127: [0, .61111, 0, 0, .525], 160: [0, 0, 0, 0, .525], 176: [0, .61111, 0, 0, .525], 184: [.19445, 0, 0, 0, .525], 305: [0, .43056, 0, 0, .525], 567: [.22222, .43056, 0, 0, .525], 711: [0, .56597, 0, 0, .525], 713: [0, .56555, 0, 0, .525], 714: [0, .61111, 0, 0, .525], 715: [0, .61111, 0, 0, .525], 728: [0, .61111, 0, 0, .525], 730: [0, .61111, 0, 0, .525], 770: [0, .61111, 0, 0, .525], 771: [0, .61111, 0, 0, .525], 776: [0, .61111, 0, 0, .525], 915: [0, .61111, 0, 0, .525], 916: [0, .61111, 0, 0, .525], 920: [0, .61111, 0, 0, .525], 923: [0, .61111, 0, 0, .525], 926: [0, .61111, 0, 0, .525], 928: [0, .61111, 0, 0, .525], 931: [0, .61111, 0, 0, .525], 933: [0, .61111, 0, 0, .525], 934: [0, .61111, 0, 0, .525], 936: [0, .61111, 0, 0, .525], 937: [0, .61111, 0, 0, .525], 8216: [0, .61111, 0, 0, .525], 8217: [0, .61111, 0, 0, .525], 8242: [0, .61111, 0, 0, .525], 9251: [.11111, .21944, 0, 0, .525] } + }, ut = { slant: [.25, .25, .25], space: [0, 0, 0], stretch: [0, 0, 0], shrink: [0, 0, 0], xHeight: [.431, .431, .431], quad: [1, 1.171, 1.472], extraSpace: [0, 0, 0], num1: [.677, .732, .925], num2: [.394, .384, .387], num3: [.444, .471, .504], denom1: [.686, .752, 1.025], denom2: [.345, .344, .532], sup1: [.413, .503, .504], sup2: [.363, .431, .404], sup3: [.289, .286, .294], sub1: [.15, .143, .2], sub2: [.247, .286, .4], supDrop: [.386, .353, .494], subDrop: [.05, .071, .1], delim1: [2.39, 1.7, 1.98], delim2: [1.01, 1.157, 1.42], axisHeight: [.25, .25, .25], defaultRuleThickness: [.04, .049, .049], bigOpSpacing1: [.111, .111, .111], bigOpSpacing2: [.166, .166, .166], bigOpSpacing3: [.2, .2, .2], bigOpSpacing4: [.6, .611, .611], bigOpSpacing5: [.1, .143, .143], sqrtRuleThickness: [.04, .04, .04], ptPerEm: [10, 10, 10], doubleRuleSep: [.2, .2, .2], arrayRuleWidth: [.04, .04, .04], fboxsep: [.3, .3, .3], fboxrule: [.04, .04, .04] }, ht = { "\xc5": "A", "\xc7": "C", "\xd0": "D", "\xde": "o", "\xe5": "a", "\xe7": "c", "\xf0": "d", "\xfe": "o", "\u0410": "A", "\u0411": "B", "\u0412": "B", "\u0413": "F", "\u0414": "A", "\u0415": "E", "\u0416": "K", "\u0417": "3", "\u0418": "N", "\u0419": "N", "\u041a": "K", "\u041b": "N", "\u041c": "M", "\u041d": "H", "\u041e": "O", "\u041f": "N", "\u0420": "P", "\u0421": "C", "\u0422": "T", "\u0423": "y", "\u0424": "O", "\u0425": "X", "\u0426": "U", "\u0427": "h", "\u0428": "W", "\u0429": "W", "\u042a": "B", "\u042b": "X", "\u042c": "B", "\u042d": "3", "\u042e": "X", "\u042f": "R", "\u0430": "a", "\u0431": "b", "\u0432": "a", "\u0433": "r", "\u0434": "y", "\u0435": "e", "\u0436": "m", "\u0437": "e", "\u0438": "n", "\u0439": "n", "\u043a": "n", "\u043b": "n", "\u043c": "m", "\u043d": "n", "\u043e": "o", "\u043f": "n", "\u0440": "p", "\u0441": "c", "\u0442": "o", "\u0443": "y", "\u0444": "b", "\u0445": "x", "\u0446": "n", "\u0447": "n", "\u0448": "w", "\u0449": "w", "\u044a": "a", "\u044b": "m", "\u044c": "a", "\u044d": "e", "\u044e": "m", "\u044f": "r" }, dt = {}, mt = { bin: 1, close: 1, inner: 1, open: 1, punct: 1, rel: 1 }, pt = { "accent-token": 1, mathord: 1, "op-token": 1, spacing: 1, textord: 1 }, ft = { math: {}, text: {} }, gt = ft, vt = "main", yt = "ams", bt = "bin", xt = "mathord", wt = "op-token", kt = "rel"; o("math", vt, kt, "\u2261", "\\equiv", !0), o("math", vt, kt, "\u227a", "\\prec", !0), o("math", vt, kt, "\u227b", "\\succ", !0), o("math", vt, kt, "\u223c", "\\sim", !0), o("math", vt, kt, "\u22a5", "\\perp"), o("math", vt, kt, "\u2aaf", "\\preceq", !0), o("math", vt, kt, "\u2ab0", "\\succeq", !0), o("math", vt, kt, "\u2243", "\\simeq", !0), o("math", vt, kt, "\u2223", "\\mid", !0), o("math", vt, kt, "\u226a", "\\ll", !0), o("math", vt, kt, "\u226b", "\\gg", !0), o("math", vt, kt, "\u224d", "\\asymp", !0), o("math", vt, kt, "\u2225", "\\parallel"), o("math", vt, kt, "\u22c8", "\\bowtie", !0), o("math", vt, kt, "\u2323", "\\smile", !0), o("math", vt, kt, "\u2291", "\\sqsubseteq", !0), o("math", vt, kt, "\u2292", "\\sqsupseteq", !0), o("math", vt, kt, "\u2250", "\\doteq", !0), o("math", vt, kt, "\u2322", "\\frown", !0), o("math", vt, kt, "\u220b", "\\ni", !0), o("math", vt, kt, "\u221d", "\\propto", !0), o("math", vt, kt, "\u22a2", "\\vdash", !0), o("math", vt, kt, "\u22a3", "\\dashv", !0), o("math", vt, kt, "\u220b", "\\owns"), o("math", vt, "punct", ".", "\\ldotp"), o("math", vt, "punct", "\u22c5", "\\cdotp"), o("math", vt, "textord", "#", "\\#"), o("text", vt, "textord", "#", "\\#"), o("math", vt, "textord", "&", "\\&"), o("text", vt, "textord", "&", "\\&"), o("math", vt, "textord", "\u2135", "\\aleph", !0), o("math", vt, "textord", "\u2200", "\\forall", !0), o("math", vt, "textord", "\u210f", "\\hbar", !0), o("math", vt, "textord", "\u2203", "\\exists", !0), o("math", vt, "textord", "\u2207", "\\nabla", !0), o("math", vt, "textord", "\u266d", "\\flat", !0), o("math", vt, "textord", "\u2113", "\\ell", !0), o("math", vt, "textord", "\u266e", "\\natural", !0), o("math", vt, "textord", "\u2663", "\\clubsuit", !0), o("math", vt, "textord", "\u2118", "\\wp", !0), o("math", vt, "textord", "\u266f", "\\sharp", !0), o("math", vt, "textord", "\u2662", "\\diamondsuit", !0), o("math", vt, "textord", "\u211c", "\\Re", !0), o("math", vt, "textord", "\u2661", "\\heartsuit", !0), o("math", vt, "textord", "\u2111", "\\Im", !0), o("math", vt, "textord", "\u2660", "\\spadesuit", !0), o("text", vt, "textord", "\xa7", "\\S", !0), o("text", vt, "textord", "\xb6", "\\P", !0), o("math", vt, "textord", "\u2020", "\\dag"), o("text", vt, "textord", "\u2020", "\\dag"), o("text", vt, "textord", "\u2020", "\\textdagger"), o("math", vt, "textord", "\u2021", "\\ddag"), o("text", vt, "textord", "\u2021", "\\ddag"), o("text", vt, "textord", "\u2021", "\\textdaggerdbl"), o("math", vt, "close", "\u23b1", "\\rmoustache", !0), o("math", vt, "open", "\u23b0", "\\lmoustache", !0), o("math", vt, "close", "\u27ef", "\\rgroup", !0), o("math", vt, "open", "\u27ee", "\\lgroup", !0), o("math", vt, bt, "\u2213", "\\mp", !0), + o("math", vt, bt, "\u2296", "\\ominus", !0), o("math", vt, bt, "\u228e", "\\uplus", !0), o("math", vt, bt, "\u2293", "\\sqcap", !0), o("math", vt, bt, "\u2217", "\\ast"), o("math", vt, bt, "\u2294", "\\sqcup", !0), o("math", vt, bt, "\u25ef", "\\bigcirc"), o("math", vt, bt, "\u2219", "\\bullet"), o("math", vt, bt, "\u2021", "\\ddagger"), o("math", vt, bt, "\u2240", "\\wr", !0), o("math", vt, bt, "\u2a3f", "\\amalg"), o("math", vt, bt, "&", "\\And"), o("math", vt, kt, "\u27f5", "\\longleftarrow", !0), o("math", vt, kt, "\u21d0", "\\Leftarrow", !0), o("math", vt, kt, "\u27f8", "\\Longleftarrow", !0), o("math", vt, kt, "\u27f6", "\\longrightarrow", !0), o("math", vt, kt, "\u21d2", "\\Rightarrow", !0), o("math", vt, kt, "\u27f9", "\\Longrightarrow", !0), o("math", vt, kt, "\u2194", "\\leftrightarrow", !0), o("math", vt, kt, "\u27f7", "\\longleftrightarrow", !0), o("math", vt, kt, "\u21d4", "\\Leftrightarrow", !0), o("math", vt, kt, "\u27fa", "\\Longleftrightarrow", !0), o("math", vt, kt, "\u21a6", "\\mapsto", !0), o("math", vt, kt, "\u27fc", "\\longmapsto", !0), o("math", vt, kt, "\u2197", "\\nearrow", !0), o("math", vt, kt, "\u21a9", "\\hookleftarrow", !0), o("math", vt, kt, "\u21aa", "\\hookrightarrow", !0), o("math", vt, kt, "\u2198", "\\searrow", !0), o("math", vt, kt, "\u21bc", "\\leftharpoonup", !0), o("math", vt, kt, "\u21c0", "\\rightharpoonup", !0), o("math", vt, kt, "\u2199", "\\swarrow", !0), o("math", vt, kt, "\u21bd", "\\leftharpoondown", !0), o("math", vt, kt, "\u21c1", "\\rightharpoondown", !0), o("math", vt, kt, "\u2196", "\\nwarrow", !0), o("math", vt, kt, "\u21cc", "\\rightleftharpoons", !0), o("math", yt, kt, "\u226e", "\\nless", !0), o("math", yt, kt, "\ue010", "\\@nleqslant"), o("math", yt, kt, "\ue011", "\\@nleqq"), o("math", yt, kt, "\u2a87", "\\lneq", !0), o("math", yt, kt, "\u2268", "\\lneqq", !0), o("math", yt, kt, "\ue00c", "\\@lvertneqq"), o("math", yt, kt, "\u22e6", "\\lnsim", !0), o("math", yt, kt, "\u2a89", "\\lnapprox", !0), o("math", yt, kt, "\u2280", "\\nprec", !0), o("math", yt, kt, "\u22e0", "\\npreceq", !0), o("math", yt, kt, "\u22e8", "\\precnsim", !0), o("math", yt, kt, "\u2ab9", "\\precnapprox", !0), o("math", yt, kt, "\u2241", "\\nsim", !0), o("math", yt, kt, "\ue006", "\\@nshortmid"), o("math", yt, kt, "\u2224", "\\nmid", !0), o("math", yt, kt, "\u22ac", "\\nvdash", !0), o("math", yt, kt, "\u22ad", "\\nvDash", !0), o("math", yt, kt, "\u22ea", "\\ntriangleleft"), o("math", yt, kt, "\u22ec", "\\ntrianglelefteq", !0), o("math", yt, kt, "\u228a", "\\subsetneq", !0), o("math", yt, kt, "\ue01a", "\\@varsubsetneq"), o("math", yt, kt, "\u2acb", "\\subsetneqq", !0), o("math", yt, kt, "\ue017", "\\@varsubsetneqq"), o("math", yt, kt, "\u226f", "\\ngtr", !0), o("math", yt, kt, "\ue00f", "\\@ngeqslant"), o("math", yt, kt, "\ue00e", "\\@ngeqq"), o("math", yt, kt, "\u2a88", "\\gneq", !0), o("math", yt, kt, "\u2269", "\\gneqq", !0), o("math", yt, kt, "\ue00d", "\\@gvertneqq"), o("math", yt, kt, "\u22e7", "\\gnsim", !0), o("math", yt, kt, "\u2a8a", "\\gnapprox", !0), o("math", yt, kt, "\u2281", "\\nsucc", !0), o("math", yt, kt, "\u22e1", "\\nsucceq", !0), o("math", yt, kt, "\u22e9", "\\succnsim", !0), o("math", yt, kt, "\u2aba", "\\succnapprox", !0), o("math", yt, kt, "\u2246", "\\ncong", !0), o("math", yt, kt, "\ue007", "\\@nshortparallel"), o("math", yt, kt, "\u2226", "\\nparallel", !0), o("math", yt, kt, "\u22af", "\\nVDash", !0), o("math", yt, kt, "\u22eb", "\\ntriangleright"), o("math", yt, kt, "\u22ed", "\\ntrianglerighteq", !0), o("math", yt, kt, "\ue018", "\\@nsupseteqq"), o("math", yt, kt, "\u228b", "\\supsetneq", !0), o("math", yt, kt, "\ue01b", "\\@varsupsetneq"), o("math", yt, kt, "\u2acc", "\\supsetneqq", !0), o("math", yt, kt, "\ue019", "\\@varsupsetneqq"), o("math", yt, kt, "\u22ae", "\\nVdash", !0), o("math", yt, kt, "\u2ab5", "\\precneqq", !0), o("math", yt, kt, "\u2ab6", "\\succneqq", !0), o("math", yt, kt, "\ue016", "\\@nsubseteqq"), o("math", yt, bt, "\u22b4", "\\unlhd"), o("math", yt, bt, "\u22b5", "\\unrhd"), o("math", yt, kt, "\u219a", "\\nleftarrow", !0), o("math", yt, kt, "\u219b", "\\nrightarrow", !0), o("math", yt, kt, "\u21cd", "\\nLeftarrow", !0), o("math", yt, kt, "\u21cf", "\\nRightarrow", !0), o("math", yt, kt, "\u21ae", "\\nleftrightarrow", !0), o("math", yt, kt, "\u21ce", "\\nLeftrightarrow", !0), o("math", yt, kt, "\u25b3", "\\vartriangle"), o("math", yt, "textord", "\u210f", "\\hslash"), o("math", yt, "textord", "\u25bd", "\\triangledown"), o("math", yt, "textord", "\u25ca", "\\lozenge"), o("math", yt, "textord", "\u24c8", "\\circledS"), o("math", yt, "textord", "\xae", "\\circledR"), o("text", yt, "textord", "\xae", "\\circledR"), o("math", yt, "textord", "\u2221", "\\measuredangle", !0), o("math", yt, "textord", "\u2204", "\\nexists"), o("math", yt, "textord", "\u2127", "\\mho"), o("math", yt, "textord", "\u2132", "\\Finv", !0), o("math", yt, "textord", "\u2141", "\\Game", !0), o("math", yt, "textord", "\u2035", "\\backprime"), o("math", yt, "textord", "\u25b2", "\\blacktriangle"), o("math", yt, "textord", "\u25bc", "\\blacktriangledown"), o("math", yt, "textord", "\u25a0", "\\blacksquare"), o("math", yt, "textord", "\u29eb", "\\blacklozenge"), o("math", yt, "textord", "\u2605", "\\bigstar"), o("math", yt, "textord", "\u2222", "\\sphericalangle", !0), o("math", yt, "textord", "\u2201", "\\complement", !0), o("math", yt, "textord", "\xf0", "\\eth", !0), o("math", yt, "textord", "\u2571", "\\diagup"), o("math", yt, "textord", "\u2572", "\\diagdown"), o("math", yt, "textord", "\u25a1", "\\square"), o("math", yt, "textord", "\u25a1", "\\Box"), o("math", yt, "textord", "\u25ca", "\\Diamond"), o("math", yt, "textord", "\xa5", "\\yen", !0), o("text", yt, "textord", "\xa5", "\\yen", !0), o("math", yt, "textord", "\u2713", "\\checkmark", !0), o("text", yt, "textord", "\u2713", "\\checkmark"), o("math", yt, "textord", "\u2136", "\\beth", !0), o("math", yt, "textord", "\u2138", "\\daleth", !0), o("math", yt, "textord", "\u2137", "\\gimel", !0), o("math", yt, "textord", "\u03dd", "\\digamma", !0), o("math", yt, "textord", "\u03f0", "\\varkappa"), o("math", yt, "open", "\u250c", "\\ulcorner", !0), o("math", yt, "close", "\u2510", "\\urcorner", !0), o("math", yt, "open", "\u2514", "\\llcorner", !0), o("math", yt, "close", "\u2518", "\\lrcorner", !0), o("math", yt, kt, "\u2266", "\\leqq", !0), o("math", yt, kt, "\u2a7d", "\\leqslant", !0), o("math", yt, kt, "\u2a95", "\\eqslantless", !0), o("math", yt, kt, "\u2272", "\\lesssim", !0), o("math", yt, kt, "\u2a85", "\\lessapprox", !0), o("math", yt, kt, "\u224a", "\\approxeq", !0), o("math", yt, bt, "\u22d6", "\\lessdot"), o("math", yt, kt, "\u22d8", "\\lll", !0), o("math", yt, kt, "\u2276", "\\lessgtr", !0), o("math", yt, kt, "\u22da", "\\lesseqgtr", !0), o("math", yt, kt, "\u2a8b", "\\lesseqqgtr", !0), o("math", yt, kt, "\u2251", "\\doteqdot"), o("math", yt, kt, "\u2253", "\\risingdotseq", !0), o("math", yt, kt, "\u2252", "\\fallingdotseq", !0), o("math", yt, kt, "\u223d", "\\backsim", !0), o("math", yt, kt, "\u22cd", "\\backsimeq", !0), o("math", yt, kt, "\u2ac5", "\\subseteqq", !0), o("math", yt, kt, "\u22d0", "\\Subset", !0), o("math", yt, kt, "\u228f", "\\sqsubset", !0), o("math", yt, kt, "\u227c", "\\preccurlyeq", !0), o("math", yt, kt, "\u22de", "\\curlyeqprec", !0), o("math", yt, kt, "\u227e", "\\precsim", !0), o("math", yt, kt, "\u2ab7", "\\precapprox", !0), o("math", yt, kt, "\u22b2", "\\vartriangleleft"), o("math", yt, kt, "\u22b4", "\\trianglelefteq"), o("math", yt, kt, "\u22a8", "\\vDash", !0), o("math", yt, kt, "\u22aa", "\\Vvdash", !0), o("math", yt, kt, "\u2323", "\\smallsmile"), o("math", yt, kt, "\u2322", "\\smallfrown"), o("math", yt, kt, "\u224f", "\\bumpeq", !0), o("math", yt, kt, "\u224e", "\\Bumpeq", !0), o("math", yt, kt, "\u2267", "\\geqq", !0), o("math", yt, kt, "\u2a7e", "\\geqslant", !0), o("math", yt, kt, "\u2a96", "\\eqslantgtr", !0), o("math", yt, kt, "\u2273", "\\gtrsim", !0), o("math", yt, kt, "\u2a86", "\\gtrapprox", !0), o("math", yt, bt, "\u22d7", "\\gtrdot"), o("math", yt, kt, "\u22d9", "\\ggg", !0), o("math", yt, kt, "\u2277", "\\gtrless", !0), o("math", yt, kt, "\u22db", "\\gtreqless", !0), o("math", yt, kt, "\u2a8c", "\\gtreqqless", !0), o("math", yt, kt, "\u2256", "\\eqcirc", !0), o("math", yt, kt, "\u2257", "\\circeq", !0), o("math", yt, kt, "\u225c", "\\triangleq", !0), o("math", yt, kt, "\u223c", "\\thicksim"), o("math", yt, kt, "\u2248", "\\thickapprox"), o("math", yt, kt, "\u2ac6", "\\supseteqq", !0), o("math", yt, kt, "\u22d1", "\\Supset", !0), o("math", yt, kt, "\u2290", "\\sqsupset", !0), o("math", yt, kt, "\u227d", "\\succcurlyeq", !0), o("math", yt, kt, "\u22df", "\\curlyeqsucc", !0), o("math", yt, kt, "\u227f", "\\succsim", !0), o("math", yt, kt, "\u2ab8", "\\succapprox", !0), o("math", yt, kt, "\u22b3", "\\vartriangleright"), o("math", yt, kt, "\u22b5", "\\trianglerighteq"), o("math", yt, kt, "\u22a9", "\\Vdash", !0), o("math", yt, kt, "\u2223", "\\shortmid"), o("math", yt, kt, "\u2225", "\\shortparallel"), o("math", yt, kt, "\u226c", "\\between", !0), o("math", yt, kt, "\u22d4", "\\pitchfork", !0), o("math", yt, kt, "\u221d", "\\varpropto"), o("math", yt, kt, "\u25c0", "\\blacktriangleleft"), o("math", yt, kt, "\u2234", "\\therefore", !0), o("math", yt, kt, "\u220d", "\\backepsilon"), o("math", yt, kt, "\u25b6", "\\blacktriangleright"), o("math", yt, kt, "\u2235", "\\because", !0), o("math", yt, kt, "\u22d8", "\\llless"), o("math", yt, kt, "\u22d9", "\\gggtr"), o("math", yt, bt, "\u22b2", "\\lhd"), o("math", yt, bt, "\u22b3", "\\rhd"), o("math", yt, kt, "\u2242", "\\eqsim", !0), o("math", vt, kt, "\u22c8", "\\Join"), o("math", yt, kt, "\u2251", "\\Doteq", !0), o("math", yt, bt, "\u2214", "\\dotplus", !0), o("math", yt, bt, "\u2216", "\\smallsetminus"), o("math", yt, bt, "\u22d2", "\\Cap", !0), o("math", yt, bt, "\u22d3", "\\Cup", !0), o("math", yt, bt, "\u2a5e", "\\doublebarwedge", !0), o("math", yt, bt, "\u229f", "\\boxminus", !0), o("math", yt, bt, "\u229e", "\\boxplus", !0), o("math", yt, bt, "\u22c7", "\\divideontimes", !0), o("math", yt, bt, "\u22c9", "\\ltimes", !0), o("math", yt, bt, "\u22ca", "\\rtimes", !0), o("math", yt, bt, "\u22cb", "\\leftthreetimes", !0), o("math", yt, bt, "\u22cc", "\\rightthreetimes", !0), o("math", yt, bt, "\u22cf", "\\curlywedge", !0), o("math", yt, bt, "\u22ce", "\\curlyvee", !0), o("math", yt, bt, "\u229d", "\\circleddash", !0), o("math", yt, bt, "\u229b", "\\circledast", !0), o("math", yt, bt, "\u22c5", "\\centerdot"), o("math", yt, bt, "\u22ba", "\\intercal", !0), o("math", yt, bt, "\u22d2", "\\doublecap"), o("math", yt, bt, "\u22d3", "\\doublecup"), o("math", yt, bt, "\u22a0", "\\boxtimes", !0), o("math", yt, kt, "\u21e2", "\\dashrightarrow", !0), o("math", yt, kt, "\u21e0", "\\dashleftarrow", !0), o("math", yt, kt, "\u21c7", "\\leftleftarrows", !0), o("math", yt, kt, "\u21c6", "\\leftrightarrows", !0), o("math", yt, kt, "\u21da", "\\Lleftarrow", !0), o("math", yt, kt, "\u219e", "\\twoheadleftarrow", !0), o("math", yt, kt, "\u21a2", "\\leftarrowtail", !0), o("math", yt, kt, "\u21ab", "\\looparrowleft", !0), o("math", yt, kt, "\u21cb", "\\leftrightharpoons", !0), o("math", yt, kt, "\u21b6", "\\curvearrowleft", !0), o("math", yt, kt, "\u21ba", "\\circlearrowleft", !0), o("math", yt, kt, "\u21b0", "\\Lsh", !0), o("math", yt, kt, "\u21c8", "\\upuparrows", !0), o("math", yt, kt, "\u21bf", "\\upharpoonleft", !0), o("math", yt, kt, "\u21c3", "\\downharpoonleft", !0), o("math", yt, kt, "\u22b8", "\\multimap", !0), o("math", yt, kt, "\u21ad", "\\leftrightsquigarrow", !0), o("math", yt, kt, "\u21c9", "\\rightrightarrows", !0), o("math", yt, kt, "\u21c4", "\\rightleftarrows", !0), o("math", yt, kt, "\u21a0", "\\twoheadrightarrow", !0), o("math", yt, kt, "\u21a3", "\\rightarrowtail", !0), o("math", yt, kt, "\u21ac", "\\looparrowright", !0), o("math", yt, kt, "\u21b7", "\\curvearrowright", !0), o("math", yt, kt, "\u21bb", "\\circlearrowright", !0), o("math", yt, kt, "\u21b1", "\\Rsh", !0), o("math", yt, kt, "\u21ca", "\\downdownarrows", !0), o("math", yt, kt, "\u21be", "\\upharpoonright", !0), o("math", yt, kt, "\u21c2", "\\downharpoonright", !0), o("math", yt, kt, "\u21dd", "\\rightsquigarrow", !0), o("math", yt, kt, "\u21dd", "\\leadsto"), o("math", yt, kt, "\u21db", "\\Rrightarrow", !0), o("math", yt, kt, "\u21be", "\\restriction"), o("math", vt, "textord", "\u2018", "`"), o("math", vt, "textord", "$", "\\$"), o("text", vt, "textord", "$", "\\$"), o("text", vt, "textord", "$", "\\textdollar"), o("math", vt, "textord", "%", "\\%"), o("text", vt, "textord", "%", "\\%"), o("math", vt, "textord", "_", "\\_"), o("text", vt, "textord", "_", "\\_"), o("text", vt, "textord", "_", "\\textunderscore"), o("math", vt, "textord", "\u2220", "\\angle", !0), o("math", vt, "textord", "\u221e", "\\infty", !0), o("math", vt, "textord", "\u2032", "\\prime"), o("math", vt, "textord", "\u25b3", "\\triangle"), o("math", vt, "textord", "\u0393", "\\Gamma", !0), o("math", vt, "textord", "\u0394", "\\Delta", !0), o("math", vt, "textord", "\u0398", "\\Theta", !0), o("math", vt, "textord", "\u039b", "\\Lambda", !0), o("math", vt, "textord", "\u039e", "\\Xi", !0), o("math", vt, "textord", "\u03a0", "\\Pi", !0), o("math", vt, "textord", "\u03a3", "\\Sigma", !0), o("math", vt, "textord", "\u03a5", "\\Upsilon", !0), o("math", vt, "textord", "\u03a6", "\\Phi", !0), o("math", vt, "textord", "\u03a8", "\\Psi", !0), o("math", vt, "textord", "\u03a9", "\\Omega", !0), o("math", vt, "textord", "A", "\u0391"), o("math", vt, "textord", "B", "\u0392"), o("math", vt, "textord", "E", "\u0395"), o("math", vt, "textord", "Z", "\u0396"), o("math", vt, "textord", "H", "\u0397"), o("math", vt, "textord", "I", "\u0399"), o("math", vt, "textord", "K", "\u039a"), o("math", vt, "textord", "M", "\u039c"), o("math", vt, "textord", "N", "\u039d"), o("math", vt, "textord", "O", "\u039f"), o("math", vt, "textord", "P", "\u03a1"), o("math", vt, "textord", "T", "\u03a4"), o("math", vt, "textord", "X", "\u03a7"), o("math", vt, "textord", "\xac", "\\neg", !0), o("math", vt, "textord", "\xac", "\\lnot"), o("math", vt, "textord", "\u22a4", "\\top"), o("math", vt, "textord", "\u22a5", "\\bot"), o("math", vt, "textord", "\u2205", "\\emptyset"), o("math", yt, "textord", "\u2205", "\\varnothing"), o("math", vt, xt, "\u03b1", "\\alpha", !0), o("math", vt, xt, "\u03b2", "\\beta", !0), o("math", vt, xt, "\u03b3", "\\gamma", !0), o("math", vt, xt, "\u03b4", "\\delta", !0), o("math", vt, xt, "\u03f5", "\\epsilon", !0), o("math", vt, xt, "\u03b6", "\\zeta", !0), o("math", vt, xt, "\u03b7", "\\eta", !0), o("math", vt, xt, "\u03b8", "\\theta", !0), o("math", vt, xt, "\u03b9", "\\iota", !0), o("math", vt, xt, "\u03ba", "\\kappa", !0), o("math", vt, xt, "\u03bb", "\\lambda", !0), o("math", vt, xt, "\u03bc", "\\mu", !0), o("math", vt, xt, "\u03bd", "\\nu", !0), o("math", vt, xt, "\u03be", "\\xi", !0), o("math", vt, xt, "\u03bf", "\\omicron", !0), o("math", vt, xt, "\u03c0", "\\pi", !0), o("math", vt, xt, "\u03c1", "\\rho", !0), o("math", vt, xt, "\u03c3", "\\sigma", !0), o("math", vt, xt, "\u03c4", "\\tau", !0), o("math", vt, xt, "\u03c5", "\\upsilon", !0), o("math", vt, xt, "\u03d5", "\\phi", !0), o("math", vt, xt, "\u03c7", "\\chi", !0), o("math", vt, xt, "\u03c8", "\\psi", !0), o("math", vt, xt, "\u03c9", "\\omega", !0), o("math", vt, xt, "\u03b5", "\\varepsilon", !0), o("math", vt, xt, "\u03d1", "\\vartheta", !0), o("math", vt, xt, "\u03d6", "\\varpi", !0), o("math", vt, xt, "\u03f1", "\\varrho", !0), o("math", vt, xt, "\u03c2", "\\varsigma", !0), o("math", vt, xt, "\u03c6", "\\varphi", !0), o("math", vt, bt, "\u2217", "*"), o("math", vt, bt, "+", "+"), o("math", vt, bt, "\u2212", "-"), o("math", vt, bt, "\u22c5", "\\cdot", !0), o("math", vt, bt, "\u2218", "\\circ"), o("math", vt, bt, "\xf7", "\\div", !0), o("math", vt, bt, "\xb1", "\\pm", !0), o("math", vt, bt, "\xd7", "\\times", !0), o("math", vt, bt, "\u2229", "\\cap", !0), o("math", vt, bt, "\u222a", "\\cup", !0), o("math", vt, bt, "\u2216", "\\setminus"), o("math", vt, bt, "\u2227", "\\land"), o("math", vt, bt, "\u2228", "\\lor"), o("math", vt, bt, "\u2227", "\\wedge", !0), o("math", vt, bt, "\u2228", "\\vee", !0), o("math", vt, "textord", "\u221a", "\\surd"), o("math", vt, "open", "(", "("), o("math", vt, "open", "[", "["), o("math", vt, "open", "\u27e8", "\\langle", !0), o("math", vt, "open", "\u2223", "\\lvert"), o("math", vt, "open", "\u2225", "\\lVert"), o("math", vt, "close", ")", ")"), o("math", vt, "close", "]", "]"), o("math", vt, "close", "?", "?"), o("math", vt, "close", "!", "!"), o("math", vt, "close", "\u27e9", "\\rangle", !0), o("math", vt, "close", "\u2223", "\\rvert"), o("math", vt, "close", "\u2225", "\\rVert"), o("math", vt, kt, "=", "="), o("math", vt, kt, "<", "<"), o("math", vt, kt, ">", ">"), o("math", vt, kt, ":", ":"), o("math", vt, kt, "\u2248", "\\approx", !0), o("math", vt, kt, "\u2245", "\\cong", !0), o("math", vt, kt, "\u2265", "\\ge"), o("math", vt, kt, "\u2265", "\\geq", !0), o("math", vt, kt, "\u2190", "\\gets"), o("math", vt, kt, ">", "\\gt"), o("math", vt, kt, "\u2208", "\\in", !0), o("math", vt, kt, "\ue020", "\\@not"), o("math", vt, kt, "\u2282", "\\subset", !0), o("math", vt, kt, "\u2283", "\\supset", !0), o("math", vt, kt, "\u2286", "\\subseteq", !0), o("math", vt, kt, "\u2287", "\\supseteq", !0), o("math", yt, kt, "\u2288", "\\nsubseteq", !0), o("math", yt, kt, "\u2289", "\\nsupseteq", !0), o("math", vt, kt, "\u22a8", "\\models"), o("math", vt, kt, "\u2190", "\\leftarrow", !0), o("math", vt, kt, "\u2264", "\\le"), o("math", vt, kt, "\u2264", "\\leq", !0), o("math", vt, kt, "<", "\\lt"), o("math", vt, kt, "\u2192", "\\rightarrow", !0), o("math", vt, kt, "\u2192", "\\to"), o("math", yt, kt, "\u2271", "\\ngeq", !0), o("math", yt, kt, "\u2270", "\\nleq", !0), o("math", vt, "spacing", "\xa0", "\\ "), o("math", vt, "spacing", "\xa0", "~"), o("math", vt, "spacing", "\xa0", "\\space"), o("math", vt, "spacing", "\xa0", "\\nobreakspace"), o("text", vt, "spacing", "\xa0", "\\ "), o("text", vt, "spacing", "\xa0", "~"), o("text", vt, "spacing", "\xa0", "\\space"), o("text", vt, "spacing", "\xa0", "\\nobreakspace"), o("math", vt, "spacing", null, "\\nobreak"), o("math", vt, "spacing", null, "\\allowbreak"), o("math", vt, "punct", ",", ","), o("math", vt, "punct", ";", ";"), o("math", yt, bt, "\u22bc", "\\barwedge", !0), o("math", yt, bt, "\u22bb", "\\veebar", !0), o("math", vt, bt, "\u2299", "\\odot", !0), o("math", vt, bt, "\u2295", "\\oplus", !0), o("math", vt, bt, "\u2297", "\\otimes", !0), o("math", vt, "textord", "\u2202", "\\partial", !0), o("math", vt, bt, "\u2298", "\\oslash", !0), o("math", yt, bt, "\u229a", "\\circledcirc", !0), o("math", yt, bt, "\u22a1", "\\boxdot", !0), o("math", vt, bt, "\u25b3", "\\bigtriangleup"), o("math", vt, bt, "\u25bd", "\\bigtriangledown"), o("math", vt, bt, "\u2020", "\\dagger"), o("math", vt, bt, "\u22c4", "\\diamond"), o("math", vt, bt, "\u22c6", "\\star"), o("math", vt, bt, "\u25c3", "\\triangleleft"), o("math", vt, bt, "\u25b9", "\\triangleright"), o("math", vt, "open", "{", "\\{"), o("text", vt, "textord", "{", "\\{"), o("text", vt, "textord", "{", "\\textbraceleft"), o("math", vt, "close", "}", "\\}"), o("text", vt, "textord", "}", "\\}"), o("text", vt, "textord", "}", "\\textbraceright"), o("math", vt, "open", "{", "\\lbrace"), o("math", vt, "close", "}", "\\rbrace"), o("math", vt, "open", "[", "\\lbrack"), o("text", vt, "textord", "[", "\\lbrack"), o("math", vt, "close", "]", "\\rbrack"), o("text", vt, "textord", "]", "\\rbrack"), o("math", vt, "open", "(", "\\lparen"), o("math", vt, "close", ")", "\\rparen"), o("text", vt, "textord", "<", "\\textless"), o("text", vt, "textord", ">", "\\textgreater"), o("math", vt, "open", "\u230a", "\\lfloor", !0), o("math", vt, "close", "\u230b", "\\rfloor", !0), o("math", vt, "open", "\u2308", "\\lceil", !0), o("math", vt, "close", "\u2309", "\\rceil", !0), o("math", vt, "textord", "\\", "\\backslash"), o("math", vt, "textord", "\u2223", "|"), o("math", vt, "textord", "\u2223", "\\vert"), o("text", vt, "textord", "|", "\\textbar"), o("math", vt, "textord", "\u2225", "\\|"), o("math", vt, "textord", "\u2225", "\\Vert"), o("text", vt, "textord", "\u2225", "\\textbardbl"), o("text", vt, "textord", "~", "\\textasciitilde"), o("text", vt, "textord", "\\", "\\textbackslash"), o("text", vt, "textord", "^", "\\textasciicircum"), o("math", vt, kt, "\u2191", "\\uparrow", !0), o("math", vt, kt, "\u21d1", "\\Uparrow", !0), o("math", vt, kt, "\u2193", "\\downarrow", !0), o("math", vt, kt, "\u21d3", "\\Downarrow", !0), o("math", vt, kt, "\u2195", "\\updownarrow", !0), o("math", vt, kt, "\u21d5", "\\Updownarrow", !0), o("math", vt, wt, "\u2210", "\\coprod"), o("math", vt, wt, "\u22c1", "\\bigvee"), o("math", vt, wt, "\u22c0", "\\bigwedge"), o("math", vt, wt, "\u2a04", "\\biguplus"), o("math", vt, wt, "\u22c2", "\\bigcap"), o("math", vt, wt, "\u22c3", "\\bigcup"), o("math", vt, wt, "\u222b", "\\int"), o("math", vt, wt, "\u222b", "\\intop"), o("math", vt, wt, "\u222c", "\\iint"), o("math", vt, wt, "\u222d", "\\iiint"), o("math", vt, wt, "\u220f", "\\prod"), o("math", vt, wt, "\u2211", "\\sum"), o("math", vt, wt, "\u2a02", "\\bigotimes"), o("math", vt, wt, "\u2a01", "\\bigoplus"), o("math", vt, wt, "\u2a00", "\\bigodot"), o("math", vt, wt, "\u222e", "\\oint"), o("math", vt, wt, "\u222f", "\\oiint"), o("math", vt, wt, "\u2230", "\\oiiint"), o("math", vt, wt, "\u2a06", "\\bigsqcup"), o("math", vt, wt, "\u222b", "\\smallint"), o("text", vt, "inner", "\u2026", "\\textellipsis"), o("math", vt, "inner", "\u2026", "\\mathellipsis"), o("text", vt, "inner", "\u2026", "\\ldots", !0), o("math", vt, "inner", "\u2026", "\\ldots", !0), o("math", vt, "inner", "\u22ef", "\\@cdots", !0), o("math", vt, "inner", "\u22f1", "\\ddots", !0), o("math", vt, "textord", "\u22ee", "\\varvdots"), o("math", vt, "accent-token", "\u02ca", "\\acute"), o("math", vt, "accent-token", "\u02cb", "\\grave"), o("math", vt, "accent-token", "\xa8", "\\ddot"), o("math", vt, "accent-token", "~", "\\tilde"), o("math", vt, "accent-token", "\u02c9", "\\bar"), o("math", vt, "accent-token", "\u02d8", "\\breve"), o("math", vt, "accent-token", "\u02c7", "\\check"), o("math", vt, "accent-token", "^", "\\hat"), o("math", vt, "accent-token", "\u20d7", "\\vec"), o("math", vt, "accent-token", "\u02d9", "\\dot"), o("math", vt, "accent-token", "\u02da", "\\mathring"), o("math", vt, xt, "\u0131", "\\imath", !0), o("math", vt, xt, "\u0237", "\\jmath", !0), o("text", vt, "textord", "\u0131", "\\i", !0), o("text", vt, "textord", "\u0237", "\\j", !0), o("text", vt, "textord", "\xdf", "\\ss", !0), o("text", vt, "textord", "\xe6", "\\ae", !0), o("text", vt, "textord", "\xe6", "\\ae", !0), o("text", vt, "textord", "\u0153", "\\oe", !0), o("text", vt, "textord", "\xf8", "\\o", !0), o("text", vt, "textord", "\xc6", "\\AE", !0), o("text", vt, "textord", "\u0152", "\\OE", !0), o("text", vt, "textord", "\xd8", "\\O", !0), o("text", vt, "accent-token", "\u02ca", "\\'"), o("text", vt, "accent-token", "\u02cb", "\\`"), o("text", vt, "accent-token", "\u02c6", "\\^"), o("text", vt, "accent-token", "\u02dc", "\\~"), o("text", vt, "accent-token", "\u02c9", "\\="), o("text", vt, "accent-token", "\u02d8", "\\u"), o("text", vt, "accent-token", "\u02d9", "\\."), o("text", vt, "accent-token", "\u02da", "\\r"), o("text", vt, "accent-token", "\u02c7", "\\v"), o("text", vt, "accent-token", "\xa8", '\\"'), o("text", vt, "accent-token", "\u02dd", "\\H"), o("text", vt, "accent-token", "\u25ef", "\\textcircled"); var St = { "--": !0, "---": !0, "``": !0, "''": !0 }; o("text", vt, "textord", "\u2013", "--"), o("text", vt, "textord", "\u2013", "\\textendash"), o("text", vt, "textord", "\u2014", "---"), o("text", vt, "textord", "\u2014", "\\textemdash"), o("text", vt, "textord", "\u2018", "`"), o("text", vt, "textord", "\u2018", "\\textquoteleft"), o("text", vt, "textord", "\u2019", "'"), o("text", vt, "textord", "\u2019", "\\textquoteright"), o("text", vt, "textord", "\u201c", "``"), o("text", vt, "textord", "\u201c", "\\textquotedblleft"), o("text", vt, "textord", "\u201d", "''"), o("text", vt, "textord", "\u201d", "\\textquotedblright"), o("math", vt, "textord", "\xb0", "\\degree", !0), o("text", vt, "textord", "\xb0", "\\degree"), o("text", vt, "textord", "\xb0", "\\textdegree", !0), o("math", vt, xt, "\xa3", "\\pounds"), o("math", vt, xt, "\xa3", "\\mathsterling", !0), o("text", vt, xt, "\xa3", "\\pounds"), o("text", vt, xt, "\xa3", "\\textsterling", !0), o("math", yt, "textord", "\u2720", "\\maltese"), o("text", yt, "textord", "\u2720", "\\maltese"), o("text", vt, "spacing", "\xa0", "\\ "), o("text", vt, "spacing", "\xa0", " "), o("text", vt, "spacing", "\xa0", "~"); for (var At = 0; At < '0123456789/@."'.length; At++) { var Et = '0123456789/@."'.charAt(At); o("math", vt, "textord", Et, Et) } for (var Mt = 0; Mt < '0123456789!@*()-=+[]<>|";:?/.,'.length; Mt++) { var Rt = '0123456789!@*()-=+[]<>|";:?/.,'.charAt(Mt); o("text", vt, "textord", Rt, Rt) } for (var Tt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", Ct = 0; Ct < Tt.length; Ct++) { var Lt = Tt.charAt(Ct); o("math", vt, xt, Lt, Lt), o("text", vt, "textord", Lt, Lt) } o("math", yt, "textord", "C", "\u2102"), o("text", yt, "textord", "C", "\u2102"), o("math", yt, "textord", "H", "\u210d"), o("text", yt, "textord", "H", "\u210d"), o("math", yt, "textord", "N", "\u2115"), o("text", yt, "textord", "N", "\u2115"), o("math", yt, "textord", "P", "\u2119"), o("text", yt, "textord", "P", "\u2119"), o("math", yt, "textord", "Q", "\u211a"), o("text", yt, "textord", "Q", "\u211a"), o("math", yt, "textord", "R", "\u211d"), o("text", yt, "textord", "R", "\u211d"), o("math", yt, "textord", "Z", "\u2124"), o("text", yt, "textord", "Z", "\u2124"), o("math", vt, xt, "h", "\u210e"), o("text", vt, xt, "h", "\u210e"); for (var zt = "", Nt = 0; Nt < Tt.length; Nt++) { var Pt = Tt.charAt(Nt); o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56320 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56372 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56424 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56580 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56736 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56788 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56840 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56944 + Nt)), o("text", vt, "textord", Pt, zt), Nt < 26 && (o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56632 + Nt)), o("text", vt, "textord", Pt, zt), o("math", vt, xt, Pt, zt = String.fromCharCode(55349, 56476 + Nt)), o("text", vt, "textord", Pt, zt)) } o("math", vt, xt, "k", zt = String.fromCharCode(55349, 56668)), o("text", vt, "textord", "k", zt); for (var It = 0; It < 10; It++) { var Ot = It.toString(); o("math", vt, xt, Ot, zt = String.fromCharCode(55349, 57294 + It)), o("text", vt, "textord", Ot, zt), o("math", vt, xt, Ot, zt = String.fromCharCode(55349, 57314 + It)), o("text", vt, "textord", Ot, zt), o("math", vt, xt, Ot, zt = String.fromCharCode(55349, 57324 + It)), o("text", vt, "textord", Ot, zt), o("math", vt, xt, Ot, zt = String.fromCharCode(55349, 57334 + It)), o("text", vt, "textord", Ot, zt) } for (var Bt = 0; Bt < "\xc7\xd0\xde\xe7\xfe".length; Bt++) { var qt = "\xc7\xd0\xde\xe7\xfe".charAt(Bt); o("math", vt, xt, qt, qt), o("text", vt, "textord", qt, qt) } o("text", vt, "textord", "\xf0", "\xf0"), o("text", vt, "textord", "\u2013", "\u2013"), o("text", vt, "textord", "\u2014", "\u2014"), o("text", vt, "textord", "\u2018", "\u2018"), o("text", vt, "textord", "\u2019", "\u2019"), o("text", vt, "textord", "\u201c", "\u201c"), o("text", vt, "textord", "\u201d", "\u201d"); var Dt = [["mathbf", "textbf", "Main-Bold"], ["mathbf", "textbf", "Main-Bold"], ["mathdefault", "textit", "Math-Italic"], ["mathdefault", "textit", "Math-Italic"], ["boldsymbol", "boldsymbol", "Main-BoldItalic"], ["boldsymbol", "boldsymbol", "Main-BoldItalic"], ["mathscr", "textscr", "Script-Regular"], ["", "", ""], ["", "", ""], ["", "", ""], ["mathfrak", "textfrak", "Fraktur-Regular"], ["mathfrak", "textfrak", "Fraktur-Regular"], ["mathbb", "textbb", "AMS-Regular"], ["mathbb", "textbb", "AMS-Regular"], ["", "", ""], ["", "", ""], ["mathsf", "textsf", "SansSerif-Regular"], ["mathsf", "textsf", "SansSerif-Regular"], ["mathboldsf", "textboldsf", "SansSerif-Bold"], ["mathboldsf", "textboldsf", "SansSerif-Bold"], ["mathitsf", "textitsf", "SansSerif-Italic"], ["mathitsf", "textitsf", "SansSerif-Italic"], ["", "", ""], ["", "", ""], ["mathtt", "texttt", "Typewriter-Regular"], ["mathtt", "texttt", "Typewriter-Regular"]], Ft = [["mathbf", "textbf", "Main-Bold"], ["", "", ""], ["mathsf", "textsf", "SansSerif-Regular"], ["mathboldsf", "textboldsf", "SansSerif-Bold"], ["mathtt", "texttt", "Typewriter-Regular"]], Ht = [[1, 1, 1], [2, 1, 1], [3, 1, 1], [4, 2, 1], [5, 2, 1], [6, 3, 1], [7, 4, 2], [8, 6, 3], [9, 7, 6], [10, 8, 7], [11, 10, 9]], jt = [.5, .6, .7, .8, .9, 1, 1.2, 1.44, 1.728, 2.074, 2.488], Ut = function (t, e) { return e.size < 2 ? t : Ht[t - 1][e.size - 1] }, _t = function () { function t(e) { this.style = void 0, this.color = void 0, this.size = void 0, this.textSize = void 0, this.phantom = void 0, this.font = void 0, this.fontFamily = void 0, this.fontWeight = void 0, this.fontShape = void 0, this.sizeMultiplier = void 0, this.maxSize = void 0, this.minRuleThickness = void 0, this._fontMetrics = void 0, this.style = e.style, this.color = e.color, this.size = e.size || t.BASESIZE, this.textSize = e.textSize || this.size, this.phantom = !!e.phantom, this.font = e.font || "", this.fontFamily = e.fontFamily || "", this.fontWeight = e.fontWeight || "", this.fontShape = e.fontShape || "", this.sizeMultiplier = jt[this.size - 1], this.maxSize = e.maxSize, this.minRuleThickness = e.minRuleThickness, this._fontMetrics = void 0 } var e = t.prototype; return e.extend = function (e) { var r = { style: this.style, size: this.size, textSize: this.textSize, color: this.color, phantom: this.phantom, font: this.font, fontFamily: this.fontFamily, fontWeight: this.fontWeight, fontShape: this.fontShape, maxSize: this.maxSize, minRuleThickness: this.minRuleThickness }; for (var n in e) e.hasOwnProperty(n) && (r[n] = e[n]); return new t(r) }, e.havingStyle = function (t) { return this.style === t ? this : this.extend({ style: t, size: Ut(this.textSize, t) }) }, e.havingCrampedStyle = function () { return this.havingStyle(this.style.cramp()) }, e.havingSize = function (t) { return this.size === t && this.textSize === t ? this : this.extend({ style: this.style.text(), size: t, textSize: t, sizeMultiplier: jt[t - 1] }) }, e.havingBaseStyle = function (e) { e = e || this.style.text(); var r = Ut(t.BASESIZE, e); return this.size === r && this.textSize === t.BASESIZE && this.style === e ? this : this.extend({ style: e, size: r }) }, e.havingBaseSizing = function () { var t; switch (this.style.id) { case 4: case 5: t = 3; break; case 6: case 7: t = 1; break; default: t = 6 }return this.extend({ style: this.style.text(), size: t }) }, e.withColor = function (t) { return this.extend({ color: t }) }, e.withPhantom = function () { return this.extend({ phantom: !0 }) }, e.withFont = function (t) { return this.extend({ font: t }) }, e.withTextFontFamily = function (t) { return this.extend({ fontFamily: t, font: "" }) }, e.withTextFontWeight = function (t) { return this.extend({ fontWeight: t, font: "" }) }, e.withTextFontShape = function (t) { return this.extend({ fontShape: t, font: "" }) }, e.sizingClasses = function (t) { return t.size !== this.size ? ["sizing", "reset-size" + t.size, "size" + this.size] : [] }, e.baseSizingClasses = function () { return this.size !== t.BASESIZE ? ["sizing", "reset-size" + this.size, "size" + t.BASESIZE] : [] }, e.fontMetrics = function () { return this._fontMetrics || (this._fontMetrics = function (t) { var e; if (!dt[e = t >= 5 ? 0 : t >= 3 ? 1 : 2]) { var r = dt[e] = { cssEmPerMu: ut.quad[e] / 18 }; for (var n in ut) ut.hasOwnProperty(n) && (r[n] = ut[n][e]) } return dt[e] }(this.size)), this._fontMetrics }, e.getColor = function () { return this.phantom ? "transparent" : this.color }, t }(); _t.BASESIZE = 6; var Vt = _t, Wt = { pt: 1, mm: 7227 / 2540, cm: 7227 / 254, "in": 72.27, bp: 1.00375, pc: 12, dd: 1238 / 1157, cc: 14856 / 1157, nd: 685 / 642, nc: 1370 / 107, sp: 1 / 65536, px: 1.00375 }, Gt = { ex: !0, em: !0, mu: !0 }, Yt = function (t) { return "string" != typeof t && (t = t.unit), t in Wt || t in Gt || "ex" === t }, Xt = function (t, e) { var r; if (t.unit in Wt) r = Wt[t.unit] / e.fontMetrics().ptPerEm / e.sizeMultiplier; else if ("mu" === t.unit) r = e.fontMetrics().cssEmPerMu; else { var n; if (n = e.style.isTight() ? e.havingStyle(e.style.text()) : e, "ex" === t.unit) r = n.fontMetrics().xHeight; else { if ("em" !== t.unit) throw new z("Invalid unit: '" + t.unit + "'"); r = n.fontMetrics().quad } n !== e && (r *= n.sizeMultiplier / e.sizeMultiplier) } return Math.min(t.number * r, e.maxSize) }, Kt = ["\\imath", "\u0131", "\\jmath", "\u0237", "\\pounds", "\\mathsterling", "\\textsterling", "\xa3"], $t = function (t, e, r) { return gt[r][t] && gt[r][t].replace && (t = gt[r][t].replace), { value: t, metrics: a(t, e, r) } }, Zt = function (t, e, r, n, i) { var a, o = $t(t, e, r), s = o.metrics; if (t = o.value, s) { var l = s.italic; ("text" === r || n && "mathit" === n.font) && (l = 0), a = new at(t, s.height, s.depth, l, s.skew, s.width, i) } else "undefined" != typeof console && console.warn("No character metrics for '" + t + "' in style '" + e + "' and mode '" + r + "'"), a = new at(t, 0, 0, 0, 0, 0, i); if (n) { a.maxFontSize = n.sizeMultiplier, n.style.isTight() && a.classes.push("mtight"); var c = n.getColor(); c && (a.style.color = c) } return a }, Jt = function (t, e) { if (Z(t.classes) !== Z(e.classes) || t.skew !== e.skew || t.maxFontSize !== e.maxFontSize) return !1; for (var r in t.style) if (t.style.hasOwnProperty(r) && t.style[r] !== e.style[r]) return !1; for (var n in e.style) if (e.style.hasOwnProperty(n) && t.style[n] !== e.style[n]) return !1; return !0 }, Qt = function (t) { for (var e = 0, r = 0, n = 0, i = 0; i < t.children.length; i++) { var a = t.children[i]; a.height > e && (e = a.height), a.depth > r && (r = a.depth), a.maxFontSize > n && (n = a.maxFontSize) } t.height = e, t.depth = r, t.maxFontSize = n }, te = function (t, e, r, n) { var i = new et(t, e, r, n); return Qt(i), i }, ee = function (t, e, r, n) { return new et(t, e, r, n) }, re = function (t) { var e = new $(t); return Qt(e), e }, ne = function (t, e, r) { var n = ""; switch (t) { case "amsrm": n = "AMS"; break; case "textrm": n = "Main"; break; case "textsf": n = "SansSerif"; break; case "texttt": n = "Typewriter"; break; default: n = t }return n + "-" + ("textbf" === e && "textit" === r ? "BoldItalic" : "textbf" === e ? "Bold" : "textit" === e ? "Italic" : "Regular") }, ie = { mathbf: { variant: "bold", fontName: "Main-Bold" }, mathrm: { variant: "normal", fontName: "Main-Regular" }, textit: { variant: "italic", fontName: "Main-Italic" }, mathit: { variant: "italic", fontName: "Main-Italic" }, mathbb: { variant: "double-struck", fontName: "AMS-Regular" }, mathcal: { variant: "script", fontName: "Caligraphic-Regular" }, mathfrak: { variant: "fraktur", fontName: "Fraktur-Regular" }, mathscr: { variant: "script", fontName: "Script-Regular" }, mathsf: { variant: "sans-serif", fontName: "SansSerif-Regular" }, mathtt: { variant: "monospace", fontName: "Typewriter-Regular" } }, ae = { vec: ["vec", .471, .714], oiintSize1: ["oiintSize1", .957, .499], oiintSize2: ["oiintSize2", 1.472, .659], oiiintSize1: ["oiiintSize1", 1.304, .499], oiiintSize2: ["oiiintSize2", 1.98, .659] }, oe = { + fontMap: ie, makeSymbol: Zt, mathsym: function (t, e, r, n) { return void 0 === n && (n = []), "boldsymbol" === r.font && $t(t, "Main-Bold", e).metrics ? Zt(t, "Main-Bold", e, r, n.concat(["mathbf"])) : "\\" === t || "main" === gt[e][t].font ? Zt(t, "Main-Regular", e, r, n) : Zt(t, "AMS-Regular", e, r, n.concat(["amsrm"])) }, makeSpan: te, makeSvgSpan: ee, makeLineSpan: function (t, e, r) { var n = te([t], [], e); return n.height = Math.max(r || e.fontMetrics().defaultRuleThickness, e.minRuleThickness), n.style.borderBottomWidth = n.height + "em", n.maxFontSize = 1, n }, makeAnchor: function (t, e, r, n) { var i = new rt(t, e, r, n); return Qt(i), i }, makeFragment: re, wrapFragment: function (t, e) { return t instanceof $ ? te([], [t], e) : t }, makeVList: function (t) { + for (var e = function (t) { + if ("individualShift" === t.positionType) { for (var e = t.children, r = [e[0]], n = -e[0].shift - e[0].elem.depth, i = n, a = 1; a < e.length; a++) { var o = -e[a].shift - i - e[a].elem.depth, s = o - (e[a - 1].elem.height + e[a - 1].elem.depth); i += o, r.push({ type: "kern", size: s }), r.push(e[a]) } return { children: r, depth: n } } var l; if ("top" === t.positionType) { for (var c = t.positionData, u = 0; u < t.children.length; u++) { var h = t.children[u]; c -= "kern" === h.type ? h.size : h.elem.height + h.elem.depth } l = c } else if ("bottom" === t.positionType) l = -t.positionData; else { + var d = t.children[0]; if ("elem" !== d.type) throw new Error('First child must have type "elem".'); if ("shift" === t.positionType) l = -d.elem.depth - t.positionData; else { + if ("firstBaseline" !== t.positionType) throw new Error("Invalid positionType " + t.positionType + "."); l = -d.elem.depth + } + } return { children: t.children, depth: l } + }(t), r = e.children, n = e.depth, i = 0, a = 0; a < r.length; a++) { var o = r[a]; if ("elem" === o.type) { var s = o.elem; i = Math.max(i, s.maxFontSize, s.height) } } i += 2; var l = te(["pstrut"], []); l.style.height = i + "em"; for (var c = [], u = n, h = n, d = n, m = 0; m < r.length; m++) { var p = r[m]; if ("kern" === p.type) d += p.size; else { var f = p.elem, g = p.wrapperClasses || [], v = p.wrapperStyle || {}, y = te(g, [l, f], void 0, v); y.style.top = -i - d - f.depth + "em", p.marginLeft && (y.style.marginLeft = p.marginLeft), p.marginRight && (y.style.marginRight = p.marginRight), c.push(y), d += f.height + f.depth } u = Math.min(u, d), h = Math.max(h, d) } var b, x = te(["vlist"], c); if (x.style.height = h + "em", u < 0) { var w = te([], []), k = te(["vlist"], [w]); k.style.height = -u + "em"; var S = te(["vlist-s"], [new at("\u200b")]); b = [te(["vlist-r"], [x, S]), te(["vlist-r"], [k])] } else b = [te(["vlist-r"], [x])]; var A = te(["vlist-t"], b); return 2 === b.length && A.classes.push("vlist-t2"), A.height = h, A.depth = -u, A + }, makeOrd: function (t, e, r) { var n, i = t.mode, a = t.text, o = ["mord"], s = "math" === i || "text" === i && e.font, l = s ? e.font : e.fontFamily; if (55349 === a.charCodeAt(0)) { var c = function (t, e) { var r = 1024 * (t.charCodeAt(0) - 55296) + (t.charCodeAt(1) - 56320) + 65536, n = "math" === e ? 0 : 1; if (119808 <= r && r < 120484) { var i = Math.floor((r - 119808) / 26); return [Dt[i][2], Dt[i][n]] } if (120782 <= r && r <= 120831) { var a = Math.floor((r - 120782) / 10); return [Ft[a][2], Ft[a][n]] } if (120485 === r || 120486 === r) return [Dt[0][2], Dt[0][n]]; if (120486 < r && r < 120782) return ["", ""]; throw new z("Unsupported character: " + t) }(a, i), u = c[0], h = c[1]; return Zt(a, u, i, e, o.concat(h)) } if (l) { var d, m; if ("boldsymbol" === l || "mathnormal" === l) { var p = "boldsymbol" === l ? $t(a, "Math-BoldItalic", i).metrics ? { fontName: "Math-BoldItalic", fontClass: "boldsymbol" } : { fontName: "Main-Bold", fontClass: "mathbf" } : (n = a, B.contains(Kt, n) ? { fontName: "Main-Italic", fontClass: "mathit" } : /[0-9]/.test(n.charAt(0)) ? { fontName: "Caligraphic-Regular", fontClass: "mathcal" } : { fontName: "Math-Italic", fontClass: "mathdefault" }); d = p.fontName, m = [p.fontClass] } else B.contains(Kt, a) ? (d = "Main-Italic", m = ["mathit"]) : s ? (d = ie[l].fontName, m = [l]) : (d = ne(l, e.fontWeight, e.fontShape), m = [l, e.fontWeight, e.fontShape]); if ($t(a, d, i).metrics) return Zt(a, d, i, e, o.concat(m)); if (St.hasOwnProperty(a) && "Typewriter" === d.substr(0, 10)) { for (var f = [], g = 0; g < a.length; g++)f.push(Zt(a[g], d, i, e, o.concat(m))); return re(f) } } if ("mathord" === r) { var v = function (t) { return /[0-9]/.test(t.charAt(0)) || B.contains(Kt, t) ? { fontName: "Main-Italic", fontClass: "mathit" } : { fontName: "Math-Italic", fontClass: "mathdefault" } }(a); return Zt(a, v.fontName, i, e, o.concat([v.fontClass])) } if ("textord" === r) { var y = gt[i][a] && gt[i][a].font; if ("ams" === y) { var b = ne("amsrm", e.fontWeight, e.fontShape); return Zt(a, b, i, e, o.concat("amsrm", e.fontWeight, e.fontShape)) } if ("main" !== y && y) { var x = ne(y, e.fontWeight, e.fontShape); return Zt(a, x, i, e, o.concat(x, e.fontWeight, e.fontShape)) } var w = ne("textrm", e.fontWeight, e.fontShape); return Zt(a, w, i, e, o.concat(e.fontWeight, e.fontShape)) } throw new Error("unexpected type: " + r + " in makeOrd") }, makeGlue: function (t, e) { var r = te(["mspace"], [], e), n = Xt(t, e); return r.style.marginRight = n + "em", r }, staticSvg: function (t, e) { var r = ae[t], n = r[0], i = r[1], a = r[2], o = new st(n), s = new ot([o], { width: i + "em", height: a + "em", style: "width:" + i + "em", viewBox: "0 0 " + 1e3 * i + " " + 1e3 * a, preserveAspectRatio: "xMinYMin" }), l = ee(["overlay"], [s], e); return l.height = a, l.style.height = a + "em", l.style.width = i + "em", l }, svgData: ae, tryCombineChars: function (t) { for (var e = 0; e < t.length - 1; e++) { var r = t[e], n = t[e + 1]; r instanceof at && n instanceof at && Jt(r, n) && (r.text += n.text, r.height = Math.max(r.height, n.height), r.depth = Math.max(r.depth, n.depth), r.italic = n.italic, t.splice(e + 1, 1), e--) } return t } + }, se = { number: 3, unit: "mu" }, le = { number: 4, unit: "mu" }, ce = { number: 5, unit: "mu" }, ue = { mord: { mop: se, mbin: le, mrel: ce, minner: se }, mop: { mord: se, mop: se, mrel: ce, minner: se }, mbin: { mord: le, mop: le, mopen: le, minner: le }, mrel: { mord: ce, mop: ce, mopen: ce, minner: ce }, mopen: {}, mclose: { mop: se, mbin: le, mrel: ce, minner: se }, mpunct: { mord: se, mop: se, mrel: ce, mopen: se, mclose: se, mpunct: se, minner: se }, minner: { mord: se, mop: se, mbin: le, mrel: ce, mopen: se, mpunct: se, minner: se } }, he = { mord: { mop: se }, mop: { mord: se, mop: se }, mbin: {}, mrel: {}, mopen: {}, mclose: { mop: se }, mpunct: {}, minner: { mop: se } }, de = {}, me = {}, pe = {}, fe = function (t) { var e = l(t, "ordgroup"); return e ? e.body : [t] }, ge = oe.makeSpan, ve = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"], ye = ["rightmost", "mrel", "mclose", "mpunct"], be = { display: G.DISPLAY, text: G.TEXT, script: G.SCRIPT, scriptscript: G.SCRIPTSCRIPT }, xe = { mord: "mord", mop: "mop", mbin: "mbin", mrel: "mrel", mopen: "mopen", mclose: "mclose", mpunct: "mpunct", minner: "minner" }, we = function (t, e, r, n) { void 0 === n && (n = [null, null]); for (var i = [], a = 0; a < t.length; a++) { var o = Me(t[a], e); if (o instanceof $) { var s = o.children; i.push.apply(i, s) } else i.push(o) } if (!r) return i; var c = e; if (1 === t.length) { var u = l(t[0], "sizing") || l(t[0], "styling"); u && ("sizing" === u.type ? c = e.havingSize(u.size) : "styling" === u.type && (c = e.havingStyle(be[u.style]))) } var h = ge([n[0] || "leftmost"], [], e), d = ge([n[1] || "rightmost"], [], e); return ke(i, function (t, e) { var r = e.classes[0], n = t.classes[0]; "mbin" === r && B.contains(ye, n) ? e.classes[0] = "mord" : "mbin" === n && B.contains(ve, r) && (t.classes[0] = "mord") }, { node: h }, d), ke(i, function (t, e) { var r = Ae(e), n = Ae(t), i = r && n ? t.hasClass("mtight") ? he[r][n] : ue[r][n] : null; if (i) return oe.makeGlue(i, c) }, { node: h }, d), i }, ke = function Pn(t, e, r, n) { n && t.push(n); for (var i = 0; i < t.length; i++) { var a = t[i], o = Se(a); if (o) Pn(o.children, e, r); else if ("mspace" !== a.classes[0]) { var s = e(a, r.node); s && (r.insertAfter ? r.insertAfter(s) : (t.unshift(s), i++)), r.node = a, r.insertAfter = function (e) { return function (r) { t.splice(e + 1, 0, r), i++ } }(i) } } n && t.pop() }, Se = function (t) { return t instanceof $ || t instanceof rt ? t : null }, Ae = function (t, e) { return t ? (e && (t = function r(t, e) { var n = Se(t); if (n) { var i = n.children; if (i.length) { if ("right" === e) return r(i[i.length - 1], "right"); if ("left" === e) return r(i[0], "left") } } return t }(t, e)), xe[t.classes[0]] || null) : null }, Ee = function (t, e) { var r = ["nulldelimiter"].concat(t.baseSizingClasses()); return ge(e.concat(r)) }, Me = function (t, e, r) { if (!t) return ge(); if (me[t.type]) { var n = me[t.type](t, e); if (r && e.size !== r.size) { n = ge(e.sizingClasses(r), [n], e); var i = e.sizeMultiplier / r.sizeMultiplier; n.height *= i, n.depth *= i } return n } throw new z("Got group of unknown type: '" + t.type + "'") }, Re = function () { function t(t, e) { this.type = void 0, this.attributes = void 0, this.children = void 0, this.type = t, this.attributes = {}, this.children = e || [] } var e = t.prototype; return e.setAttribute = function (t, e) { this.attributes[t] = e }, e.getAttribute = function (t) { return this.attributes[t] }, e.toNode = function () { var t = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); for (var e in this.attributes) Object.prototype.hasOwnProperty.call(this.attributes, e) && t.setAttribute(e, this.attributes[e]); for (var r = 0; r < this.children.length; r++)t.appendChild(this.children[r].toNode()); return t }, e.toMarkup = function () { var t = "<" + this.type; for (var e in this.attributes) Object.prototype.hasOwnProperty.call(this.attributes, e) && (t += " " + e + '="', t += B.escape(this.attributes[e]), t += '"'); t += ">"; for (var r = 0; r < this.children.length; r++)t += this.children[r].toMarkup(); return t + "" }, e.toText = function () { return this.children.map(function (t) { return t.toText() }).join("") }, t }(), Te = function () { function t(t) { this.text = void 0, this.text = t } var e = t.prototype; return e.toNode = function () { return document.createTextNode(this.text) }, e.toMarkup = function () { return B.escape(this.toText()) }, e.toText = function () { return this.text }, t }(), Ce = { MathNode: Re, TextNode: Te, SpaceNode: function () { function t(t) { this.width = void 0, this.character = void 0, this.width = t, this.character = t >= .05555 && t <= .05556 ? "\u200a" : t >= .1666 && t <= .1667 ? "\u2009" : t >= .2222 && t <= .2223 ? "\u2005" : t >= .2777 && t <= .2778 ? "\u2005\u200a" : t >= -.05556 && t <= -.05555 ? "\u200a\u2063" : t >= -.1667 && t <= -.1666 ? "\u2009\u2063" : t >= -.2223 && t <= -.2222 ? "\u205f\u2063" : t >= -.2778 && t <= -.2777 ? "\u2005\u2063" : null } var e = t.prototype; return e.toNode = function () { if (this.character) return document.createTextNode(this.character); var t = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace"); return t.setAttribute("width", this.width + "em"), t }, e.toMarkup = function () { return this.character ? "" + this.character + "" : '' }, e.toText = function () { return this.character ? this.character : " " }, t }(), newDocumentFragment: g }, Le = function (t, e, r) { return !gt[e][t] || !gt[e][t].replace || 55349 === t.charCodeAt(0) || St.hasOwnProperty(t) && r && (r.fontFamily && "tt" === r.fontFamily.substr(4, 2) || r.font && "tt" === r.font.substr(4, 2)) || (t = gt[e][t].replace), new Ce.TextNode(t) }, ze = function (t) { return 1 === t.length ? t[0] : new Ce.MathNode("mrow", t) }, Ne = function (t, e) { if ("texttt" === e.fontFamily) return "monospace"; if ("textsf" === e.fontFamily) return "textit" === e.fontShape && "textbf" === e.fontWeight ? "sans-serif-bold-italic" : "textit" === e.fontShape ? "sans-serif-italic" : "textbf" === e.fontWeight ? "bold-sans-serif" : "sans-serif"; if ("textit" === e.fontShape && "textbf" === e.fontWeight) return "bold-italic"; if ("textit" === e.fontShape) return "italic"; if ("textbf" === e.fontWeight) return "bold"; var r = e.font; if (!r || "mathnormal" === r) return null; var n = t.mode; if ("mathit" === r) return "italic"; if ("boldsymbol" === r) return "bold-italic"; if ("mathbf" === r) return "bold"; if ("mathbb" === r) return "double-struck"; if ("mathfrak" === r) return "fraktur"; if ("mathscr" === r || "mathcal" === r) return "script"; if ("mathsf" === r) return "sans-serif"; if ("mathtt" === r) return "monospace"; var i = t.text; return B.contains(["\\imath", "\\jmath"], i) ? null : (gt[n][i] && gt[n][i].replace && (i = gt[n][i].replace), a(i, oe.fontMap[r].fontName, n) ? oe.fontMap[r].variant : null) }, Pe = function (t, e, r) { if (1 === t.length) { var n = Oe(t[0], e); return r && n instanceof Re && "mo" === n.type && (n.setAttribute("lspace", "0em"), n.setAttribute("rspace", "0em")), [n] } for (var i, a = [], o = 0; o < t.length; o++) { var s = Oe(t[o], e); if (s instanceof Re && i instanceof Re) { if ("mtext" === s.type && "mtext" === i.type && s.getAttribute("mathvariant") === i.getAttribute("mathvariant")) { var l; (l = i.children).push.apply(l, s.children); continue } if ("mn" === s.type && "mn" === i.type) { var c; (c = i.children).push.apply(c, s.children); continue } if ("mi" === s.type && 1 === s.children.length && "mn" === i.type) { var u = s.children[0]; if (u instanceof Te && "." === u.text) { var h; (h = i.children).push.apply(h, s.children); continue } } else if ("mi" === i.type && 1 === i.children.length) { var d = i.children[0]; if (d instanceof Te && "\u0338" === d.text && ("mo" === s.type || "mi" === s.type || "mn" === s.type)) { var m = s.children[0]; m instanceof Te && m.text.length > 0 && (m.text = m.text.slice(0, 1) + "\u0338" + m.text.slice(1), a.pop()) } } } a.push(s), i = s } return a }, Ie = function (t, e, r) { return ze(Pe(t, e, r)) }, Oe = function (t, e) { if (!t) return new Ce.MathNode("mrow"); if (pe[t.type]) return pe[t.type](t, e); throw new z("Got group of unknown type: '" + t.type + "'") }, Be = function (t) { return new Vt({ style: t.displayMode ? G.DISPLAY : G.TEXT, maxSize: t.maxSize, minRuleThickness: t.minRuleThickness }) }, qe = function (t, e) { if (e.displayMode) { var r = ["katex-display"]; e.leqno && r.push("leqno"), e.fleqn && r.push("fleqn"), t = oe.makeSpan(r, [t]) } return t }, De = function (t, e, r) { var n, i = Be(r); if ("mathml" === r.output) return v(t, e, i, !0); if ("html" === r.output) { var a = f(t, i); n = oe.makeSpan(["katex"], [a]) } else { var o = v(t, e, i, !1), s = f(t, i); n = oe.makeSpan(["katex"], [o, s]) } return qe(n, r) }, Fe = { widehat: "^", widecheck: "\u02c7", widetilde: "~", utilde: "~", overleftarrow: "\u2190", underleftarrow: "\u2190", xleftarrow: "\u2190", overrightarrow: "\u2192", underrightarrow: "\u2192", xrightarrow: "\u2192", underbrace: "\u23df", overbrace: "\u23de", overgroup: "\u23e0", undergroup: "\u23e1", overleftrightarrow: "\u2194", underleftrightarrow: "\u2194", xleftrightarrow: "\u2194", Overrightarrow: "\u21d2", xRightarrow: "\u21d2", overleftharpoon: "\u21bc", xleftharpoonup: "\u21bc", overrightharpoon: "\u21c0", xrightharpoonup: "\u21c0", xLeftarrow: "\u21d0", xLeftrightarrow: "\u21d4", xhookleftarrow: "\u21a9", xhookrightarrow: "\u21aa", xmapsto: "\u21a6", xrightharpoondown: "\u21c1", xleftharpoondown: "\u21bd", xrightleftharpoons: "\u21cc", xleftrightharpoons: "\u21cb", xtwoheadleftarrow: "\u219e", xtwoheadrightarrow: "\u21a0", xlongequal: "=", xtofrom: "\u21c4", xrightleftarrows: "\u21c4", xrightequilibrium: "\u21cc", xleftequilibrium: "\u21cb" }, He = { overrightarrow: [["rightarrow"], .888, 522, "xMaxYMin"], overleftarrow: [["leftarrow"], .888, 522, "xMinYMin"], underrightarrow: [["rightarrow"], .888, 522, "xMaxYMin"], underleftarrow: [["leftarrow"], .888, 522, "xMinYMin"], xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], Overrightarrow: [["doublerightarrow"], .888, 560, "xMaxYMin"], xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], overleftharpoon: [["leftharpoon"], .888, 522, "xMinYMin"], xleftharpoonup: [["leftharpoon"], .888, 522, "xMinYMin"], xleftharpoondown: [["leftharpoondown"], .888, 522, "xMinYMin"], overrightharpoon: [["rightharpoon"], .888, 522, "xMaxYMin"], xrightharpoonup: [["rightharpoon"], .888, 522, "xMaxYMin"], xrightharpoondown: [["rightharpoondown"], .888, 522, "xMaxYMin"], xlongequal: [["longequal"], .888, 334, "xMinYMin"], xtwoheadleftarrow: [["twoheadleftarrow"], .888, 334, "xMinYMin"], xtwoheadrightarrow: [["twoheadrightarrow"], .888, 334, "xMaxYMin"], overleftrightarrow: [["leftarrow", "rightarrow"], .888, 522], overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], underleftrightarrow: [["leftarrow", "rightarrow"], .888, 522], xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], overlinesegment: [["leftlinesegment", "rightlinesegment"], .888, 522], underlinesegment: [["leftlinesegment", "rightlinesegment"], .888, 522], overgroup: [["leftgroup", "rightgroup"], .888, 342], undergroup: [["leftgroupunder", "rightgroupunder"], .888, 342], xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901], xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] }, je = function (t) { return "ordgroup" === t.type ? t.body.length : 1 }, Ue = function (t, e, r, n) { var i, a = t.height + t.depth + 2 * r; if (/fbox|color/.test(e)) { if (i = oe.makeSpan(["stretchy", e], [], n), "fbox" === e) { var o = n.color && n.getColor(); o && (i.style.borderColor = o) } } else { var s = []; /^[bx]cancel$/.test(e) && s.push(new lt({ x1: "0", y1: "0", x2: "100%", y2: "100%", "stroke-width": "0.046em" })), /^x?cancel$/.test(e) && s.push(new lt({ x1: "0", y1: "100%", x2: "100%", y2: "0", "stroke-width": "0.046em" })); var l = new ot(s, { width: "100%", height: a + "em" }); i = oe.makeSvgSpan([], [l], n) } return i.height = a, i.style.height = a + "em", i }, _e = function (t) { var e = new Ce.MathNode("mo", [new Ce.TextNode(Fe[t.substr(1)])]); return e.setAttribute("stretchy", "true"), e }, Ve = function (t, e) { var r = function () { var r = 4e5, n = t.label.substr(1); if (B.contains(["widehat", "widecheck", "widetilde", "utilde"], n)) { var i, a, o, s = je(t.base); if (s > 5) "widehat" === n || "widecheck" === n ? (i = 420, r = 2364, o = .42, a = n + "4") : (i = 312, r = 2340, o = .34, a = "tilde4"); else { var l = [1, 1, 2, 2, 3, 3][s]; "widehat" === n || "widecheck" === n ? (r = [0, 1062, 2364, 2364, 2364][l], i = [0, 239, 300, 360, 420][l], o = [0, .24, .3, .3, .36, .42][l], a = n + l) : (r = [0, 600, 1033, 2339, 2340][l], i = [0, 260, 286, 306, 312][l], o = [0, .26, .286, .3, .306, .34][l], a = "tilde" + l) } var c = new st(a), u = new ot([c], { width: "100%", height: o + "em", viewBox: "0 0 " + r + " " + i, preserveAspectRatio: "none" }); return { span: oe.makeSvgSpan([], [u], e), minWidth: 0, height: o } } var h, d, m = [], p = He[n], f = p[0], g = p[1], v = p[2], y = v / 1e3, b = f.length; if (1 === b) h = ["hide-tail"], d = [p[3]]; else if (2 === b) h = ["halfarrow-left", "halfarrow-right"], d = ["xMinYMin", "xMaxYMin"]; else { if (3 !== b) throw new Error("Correct katexImagesData or update code here to support\n " + b + " children."); h = ["brace-left", "brace-center", "brace-right"], d = ["xMinYMin", "xMidYMin", "xMaxYMin"] } for (var x = 0; x < b; x++) { var w = new st(f[x]), k = new ot([w], { width: "400em", height: y + "em", viewBox: "0 0 " + r + " " + v, preserveAspectRatio: d[x] + " slice" }), S = oe.makeSvgSpan([h[x]], [k], e); if (1 === b) return { span: S, minWidth: g, height: y }; S.style.height = y + "em", m.push(S) } return { span: oe.makeSpan(["stretchy"], m, e), minWidth: g, height: y } }(), n = r.span, i = r.minWidth, a = r.height; return n.height = a, n.style.height = a + "em", i > 0 && (n.style.minWidth = i + "em"), n }, We = function (t, e) { var r, n, a, o = l(t, "supsub"); o ? (r = (n = s(o.base, "accent")).base, o.base = r, a = function (t) { if (t instanceof et) return t; throw new Error("Expected span but got " + String(t) + ".") }(Me(o, e)), o.base = n) : r = (n = s(t, "accent")).base; var c = Me(r, e.havingCrampedStyle()), u = 0; if (n.isShifty && B.isCharacterBox(r)) { var h = B.getBaseElem(r); u = i(Me(h, e.havingCrampedStyle())).skew } var d, m = Math.min(c.height, e.fontMetrics().xHeight); if (n.isStretchy) d = Ve(n, e), d = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: c }, { type: "elem", elem: d, wrapperClasses: ["svg-align"], wrapperStyle: u > 0 ? { width: "calc(100% - " + 2 * u + "em)", marginLeft: 2 * u + "em" } : void 0 }] }, e); else { var p, f; "\\vec" === n.label ? (p = oe.staticSvg("vec", e), f = oe.svgData.vec[1]) : ((p = i(p = oe.makeOrd({ mode: n.mode, text: n.label }, e, "textord"))).italic = 0, f = p.width), d = oe.makeSpan(["accent-body"], [p]); var g = "\\textcircled" === n.label; g && (d.classes.push("accent-full"), m = c.height); var v = u; g || (v -= f / 2), d.style.left = v + "em", "\\textcircled" === n.label && (d.style.top = ".2em"), d = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: c }, { type: "kern", size: -m }, { type: "elem", elem: d }] }, e) } var y = oe.makeSpan(["mord", "accent"], [d], e); return a ? (a.children[0] = y, a.height = Math.max(y.height, a.height), a.classes[0] = "mord", a) : y }, Ge = function (t, e) { var r = t.isStretchy ? _e(t.label) : new Ce.MathNode("mo", [Le(t.label, t.mode)]), n = new Ce.MathNode("mover", [Oe(t.base, e), r]); return n.setAttribute("accent", "true"), n }, Ye = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (t) { return "\\" + t }).join("|")); d({ type: "accent", names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], props: { numArgs: 1 }, handler: function (t, e) { var r = e[0], n = !Ye.test(t.funcName), i = !n || "\\widehat" === t.funcName || "\\widetilde" === t.funcName || "\\widecheck" === t.funcName; return { type: "accent", mode: t.parser.mode, label: t.funcName, isStretchy: n, isShifty: i, base: r } }, htmlBuilder: We, mathmlBuilder: Ge }), d({ type: "accent", names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"], props: { numArgs: 1, allowedInText: !0, allowedInMath: !1 }, handler: function (t, e) { var r = e[0]; return { type: "accent", mode: t.parser.mode, label: t.funcName, isStretchy: !1, isShifty: !0, base: r } }, htmlBuilder: We, mathmlBuilder: Ge }), d({ type: "accentUnder", names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; return { type: "accentUnder", mode: r.mode, label: n, base: i } }, htmlBuilder: function (t, e) { var r = Me(t.base, e), n = Ve(t, e), i = "\\utilde" === t.label ? .12 : 0, a = oe.makeVList({ positionType: "bottom", positionData: n.height + i, children: [{ type: "elem", elem: n, wrapperClasses: ["svg-align"] }, { type: "kern", size: i }, { type: "elem", elem: r }] }, e); return oe.makeSpan(["mord", "accentunder"], [a], e) }, mathmlBuilder: function (t, e) { var r = _e(t.label), n = new Ce.MathNode("munder", [Oe(t.base, e), r]); return n.setAttribute("accentunder", "true"), n } }); var Xe = function (t) { var e = new Ce.MathNode("mpadded", t ? [t] : []); return e.setAttribute("width", "+0.6em"), e.setAttribute("lspace", "0.3em"), e }; d({ type: "xArrow", names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium"], props: { numArgs: 1, numOptionalArgs: 1 }, handler: function (t, e, r) { var n = t.parser, i = t.funcName; return { type: "xArrow", mode: n.mode, label: i, body: e[0], below: r[0] } }, htmlBuilder: function (t, e) { var r, n = e.style, i = e.havingStyle(n.sup()), a = oe.wrapFragment(Me(t.body, i, e), e); a.classes.push("x-arrow-pad"), t.below && (i = e.havingStyle(n.sub()), (r = oe.wrapFragment(Me(t.below, i, e), e)).classes.push("x-arrow-pad")); var o, s = Ve(t, e), l = -e.fontMetrics().axisHeight + .5 * s.height, c = -e.fontMetrics().axisHeight - .5 * s.height - .111; if ((a.depth > .25 || "\\xleftequilibrium" === t.label) && (c -= a.depth), r) { var u = -e.fontMetrics().axisHeight + r.height + .5 * s.height + .111; o = oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: a, shift: c }, { type: "elem", elem: s, shift: l }, { type: "elem", elem: r, shift: u }] }, e) } else o = oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: a, shift: c }, { type: "elem", elem: s, shift: l }] }, e); return o.children[0].children[0].children[1].classes.push("svg-align"), oe.makeSpan(["mrel", "x-arrow"], [o], e) }, mathmlBuilder: function (t, e) { var r, n = _e(t.label); if (t.body) { var i = Xe(Oe(t.body, e)); if (t.below) { var a = Xe(Oe(t.below, e)); r = new Ce.MathNode("munderover", [n, a, i]) } else r = new Ce.MathNode("mover", [n, i]) } else if (t.below) { var o = Xe(Oe(t.below, e)); r = new Ce.MathNode("munder", [n, o]) } else r = Xe(), r = new Ce.MathNode("mover", [n, r]); return r } }), d({ type: "textord", names: ["\\@char"], props: { numArgs: 1, allowedInText: !0 }, handler: function (t, e) { for (var r = t.parser, n = s(e[0], "ordgroup").body, i = "", a = 0; a < n.length; a++)i += s(n[a], "textord").text; var o = parseInt(i); if (isNaN(o)) throw new z("\\@char has non-numeric argument " + i); return { type: "textord", mode: r.mode, text: String.fromCharCode(o) } } }); var Ke = function (t, e) { var r = we(t.body, e.withColor(t.color), !1); return oe.makeFragment(r) }, $e = function (t, e) { var r = Pe(t.body, e.withColor(t.color)), n = new Ce.MathNode("mstyle", r); return n.setAttribute("mathcolor", t.color), n }; d({ type: "color", names: ["\\textcolor"], props: { numArgs: 2, allowedInText: !0, greediness: 3, argTypes: ["color", "original"] }, handler: function (t, e) { var r = t.parser, n = s(e[0], "color-token").color, i = e[1]; return { type: "color", mode: r.mode, color: n, body: fe(i) } }, htmlBuilder: Ke, mathmlBuilder: $e }), d({ type: "color", names: ["\\color"], props: { numArgs: 1, allowedInText: !0, greediness: 3, argTypes: ["color"] }, handler: function (t, e) { var r = t.parser, n = t.breakOnTokenText, i = s(e[0], "color-token").color; r.gullet.macros.set("\\current@color", i); var a = r.parseExpression(!0, n); return { type: "color", mode: r.mode, color: i, body: a } }, htmlBuilder: Ke, mathmlBuilder: $e }), d({ type: "cr", names: ["\\cr", "\\newline"], props: { numArgs: 0, numOptionalArgs: 1, argTypes: ["size"], allowedInText: !0 }, handler: function (t, e, r) { var n = t.parser, i = t.funcName, a = r[0], o = "\\cr" === i, l = !1; return o || (l = !n.settings.displayMode || !n.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline does nothing in display mode")), { type: "cr", mode: n.mode, newLine: l, newRow: o, size: a && s(a, "size").value } }, htmlBuilder: function (t, e) { if (t.newRow) throw new z("\\cr valid only within a tabular/array environment"); var r = oe.makeSpan(["mspace"], [], e); return t.newLine && (r.classes.push("newline"), t.size && (r.style.marginTop = Xt(t.size, e) + "em")), r }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mspace"); return t.newLine && (r.setAttribute("linebreak", "newline"), t.size && r.setAttribute("height", Xt(t.size, e) + "em")), r } }); var Ze = function (t, e, r) { var n = a(gt.math[t] && gt.math[t].replace || t, e, r); if (!n) throw new Error("Unsupported symbol " + t + " and font size " + e + "."); return n }, Je = function (t, e, r, n) { var i = r.havingBaseStyle(e), a = oe.makeSpan(n.concat(i.sizingClasses(r)), [t], r), o = i.sizeMultiplier / r.sizeMultiplier; return a.height *= o, a.depth *= o, a.maxFontSize = i.sizeMultiplier, a }, Qe = function (t, e, r) { var n = e.havingBaseStyle(r), i = (1 - e.sizeMultiplier / n.sizeMultiplier) * e.fontMetrics().axisHeight; t.classes.push("delimcenter"), t.style.top = i + "em", t.height -= i, t.depth += i }, tr = function (t, e, r, n, i, a) { var o = function (t, e, r, n) { return oe.makeSymbol(t, "Size" + e + "-Regular", r, n) }(t, e, i, n), s = Je(oe.makeSpan(["delimsizing", "size" + e], [o], n), G.TEXT, n, a); return r && Qe(s, n, G.TEXT), s }, er = function (t, e, r) { var n; return n = "Size1-Regular" === e ? "delim-size1" : "delim-size4", { type: "elem", elem: oe.makeSpan(["delimsizinginner", n], [oe.makeSpan([], [oe.makeSymbol(t, e, r)])]) } }, rr = { type: "kern", size: -.005 }, nr = function (t, e, r, n, i, a) { var o, s, l, c; o = l = c = t, s = null; var u = "Size1-Regular"; "\\uparrow" === t ? l = c = "\u23d0" : "\\Uparrow" === t ? l = c = "\u2016" : "\\downarrow" === t ? o = l = "\u23d0" : "\\Downarrow" === t ? o = l = "\u2016" : "\\updownarrow" === t ? (o = "\\uparrow", l = "\u23d0", c = "\\downarrow") : "\\Updownarrow" === t ? (o = "\\Uparrow", l = "\u2016", c = "\\Downarrow") : "[" === t || "\\lbrack" === t ? (o = "\u23a1", l = "\u23a2", c = "\u23a3", u = "Size4-Regular") : "]" === t || "\\rbrack" === t ? (o = "\u23a4", l = "\u23a5", c = "\u23a6", u = "Size4-Regular") : "\\lfloor" === t || "\u230a" === t ? (l = o = "\u23a2", c = "\u23a3", u = "Size4-Regular") : "\\lceil" === t || "\u2308" === t ? (o = "\u23a1", l = c = "\u23a2", u = "Size4-Regular") : "\\rfloor" === t || "\u230b" === t ? (l = o = "\u23a5", c = "\u23a6", u = "Size4-Regular") : "\\rceil" === t || "\u2309" === t ? (o = "\u23a4", l = c = "\u23a5", u = "Size4-Regular") : "(" === t || "\\lparen" === t ? (o = "\u239b", l = "\u239c", c = "\u239d", u = "Size4-Regular") : ")" === t || "\\rparen" === t ? (o = "\u239e", l = "\u239f", c = "\u23a0", u = "Size4-Regular") : "\\{" === t || "\\lbrace" === t ? (o = "\u23a7", s = "\u23a8", c = "\u23a9", l = "\u23aa", u = "Size4-Regular") : "\\}" === t || "\\rbrace" === t ? (o = "\u23ab", s = "\u23ac", c = "\u23ad", l = "\u23aa", u = "Size4-Regular") : "\\lgroup" === t || "\u27ee" === t ? (o = "\u23a7", c = "\u23a9", l = "\u23aa", u = "Size4-Regular") : "\\rgroup" === t || "\u27ef" === t ? (o = "\u23ab", c = "\u23ad", l = "\u23aa", u = "Size4-Regular") : "\\lmoustache" === t || "\u23b0" === t ? (o = "\u23a7", c = "\u23ad", l = "\u23aa", u = "Size4-Regular") : "\\rmoustache" !== t && "\u23b1" !== t || (o = "\u23ab", c = "\u23a9", l = "\u23aa", u = "Size4-Regular"); var h = Ze(o, u, i), d = h.height + h.depth, m = Ze(l, u, i), p = m.height + m.depth, f = Ze(c, u, i), g = f.height + f.depth, v = 0, y = 1; if (null !== s) { var b = Ze(s, u, i); v = b.height + b.depth, y = 2 } var x = d + g + v, w = Math.max(0, Math.ceil((e - x) / (y * p))), k = x + w * y * p, S = n.fontMetrics().axisHeight; r && (S *= n.sizeMultiplier); var A = k / 2 - S, E = .005 * (w + 1) - p, M = []; if (M.push(er(c, u, i)), null === s) for (var R = 0; R < w; R++)M.push(rr), M.push(er(l, u, i)); else { for (var T = 0; T < w; T++)M.push(rr), M.push(er(l, u, i)); M.push({ type: "kern", size: E }), M.push(er(l, u, i)), M.push(rr), M.push(er(s, u, i)); for (var C = 0; C < w; C++)M.push(rr), M.push(er(l, u, i)) } M.push({ type: "kern", size: E }), M.push(er(l, u, i)), M.push(rr), M.push(er(o, u, i)); var L = n.havingBaseStyle(G.TEXT), z = oe.makeVList({ positionType: "bottom", positionData: A, children: M }, L); return Je(oe.makeSpan(["delimsizing", "mult"], [z], L), G.TEXT, n, a) }, ir = function (t, e, r, n, i) { var a = function (t, e, r) { e *= 1e3; var n = ""; switch (t) { case "sqrtMain": n = function (t, e) { return "M95," + (622 + t + e) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + t / 2.075 + " -" + t + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + t) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + t) + " " + e + "h400000v" + (40 + t) + "h-400000z" }(e, 80); break; case "sqrtSize1": n = function (t, e) { return "M263," + (601 + t + e) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + t / 2.084 + " -" + t + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + t) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + t) + " " + e + "h400000v" + (40 + t) + "h-400000z" }(e, 80); break; case "sqrtSize2": n = function (t, e) { return "M983 " + (10 + t + e) + "\nl" + t / 3.13 + " -" + t + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + t) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + t) + " " + e + "h400000v" + (40 + t) + "h-400000z" }(e, 80); break; case "sqrtSize3": n = function (t, e) { return "M424," + (2398 + t + e) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + t / 4.223 + " -" + t + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + t) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + t) + " " + e + "\nh400000v" + (40 + t) + "h-400000z" }(e, 80); break; case "sqrtSize4": n = function (t, e) { return "M473," + (2713 + t + e) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + t / 5.298 + " -" + t + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + t) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + t) + " " + e + "h400000v" + (40 + t) + "H1017.7z" }(e, 80); break; case "sqrtTall": n = function (t, e, r) { return "M702 " + (t + e) + "H400000" + (40 + t) + "\nH742v" + (r - 54 - e - t) + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + e + "H400000v" + (40 + t) + "H742z" }(e, 80, r) }return n }(t, n, r), o = new st(t, a), s = new ot([o], { width: "400em", height: e + "em", viewBox: "0 0 400000 " + r, preserveAspectRatio: "xMinYMin slice" }); return oe.makeSvgSpan(["hide-tail"], [s], i) }, ar = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230a", "\u230b", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"], or = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27ee", "\u27ef", "\\lmoustache", "\\rmoustache", "\u23b0", "\u23b1"], sr = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"], lr = [0, 1.2, 1.8, 2.4, 3], cr = [{ type: "small", style: G.SCRIPTSCRIPT }, { type: "small", style: G.SCRIPT }, { type: "small", style: G.TEXT }, { type: "large", size: 1 }, { type: "large", size: 2 }, { type: "large", size: 3 }, { type: "large", size: 4 }], ur = [{ type: "small", style: G.SCRIPTSCRIPT }, { type: "small", style: G.SCRIPT }, { type: "small", style: G.TEXT }, { type: "stack" }], hr = [{ type: "small", style: G.SCRIPTSCRIPT }, { type: "small", style: G.SCRIPT }, { type: "small", style: G.TEXT }, { type: "large", size: 1 }, { type: "large", size: 2 }, { type: "large", size: 3 }, { type: "large", size: 4 }, { type: "stack" }], dr = function (t) { if ("small" === t.type) return "Main-Regular"; if ("large" === t.type) return "Size" + t.size + "-Regular"; if ("stack" === t.type) return "Size4-Regular"; throw new Error("Add support for delim type '" + t.type + "' here.") }, mr = function (t, e, r, n) { for (var i = Math.min(2, 3 - n.style.size); i < r.length && "stack" !== r[i].type; i++) { var a = Ze(t, dr(r[i]), "math"), o = a.height + a.depth; if ("small" === r[i].type && (o *= n.havingBaseStyle(r[i].style).sizeMultiplier), o > e) return r[i] } return r[r.length - 1] }, pr = function (t, e, r, n, i, a) { var o; "<" === t || "\\lt" === t || "\u27e8" === t ? t = "\\langle" : ">" !== t && "\\gt" !== t && "\u27e9" !== t || (t = "\\rangle"), o = B.contains(sr, t) ? cr : B.contains(ar, t) ? hr : ur; var s = mr(t, e, o, n); return "small" === s.type ? function (t, e, r, n, i, a) { var o = oe.makeSymbol(t, "Main-Regular", i, n), s = Je(o, e, n, a); return r && Qe(s, n, e), s }(t, s.style, r, n, i, a) : "large" === s.type ? tr(t, s.size, r, n, i, a) : nr(t, e, r, n, i, a) }, fr = function (t, e) { + var r, n, i = e.havingBaseSizing(), a = mr("\\surd", t * i.sizeMultiplier, hr, i), o = i.sizeMultiplier, s = Math.max(0, e.minRuleThickness - e.fontMetrics().sqrtRuleThickness), l = 0, c = 0, u = 0; return "small" === a.type ? (t < 1 ? o = 1 : t < 1.4 && (o = .7), c = (1 + s) / o, (r = ir("sqrtMain", l = (1 + s + .08) / o, u = 1e3 + 1e3 * s + 80, s, e)).style.minWidth = "0.853em", n = .833 / o) : "large" === a.type ? (u = 1080 * lr[a.size], c = (lr[a.size] + s) / o, l = (lr[a.size] + s + .08) / o, (r = ir("sqrtSize" + a.size, l, u, s, e)).style.minWidth = "1.02em", n = 1 / o) : (l = t + s + .08, c = t + s, u = Math.floor(1e3 * t + s) + 80, + (r = ir("sqrtTall", l, u, s, e)).style.minWidth = "0.742em", n = 1.056), r.height = c, r.style.height = l + "em", { span: r, advanceWidth: n, ruleWidth: (e.fontMetrics().sqrtRuleThickness + s) * o } + }, gr = function (t, e, r, n, i) { if ("<" === t || "\\lt" === t || "\u27e8" === t ? t = "\\langle" : ">" !== t && "\\gt" !== t && "\u27e9" !== t || (t = "\\rangle"), B.contains(ar, t) || B.contains(sr, t)) return tr(t, e, !1, r, n, i); if (B.contains(or, t)) return nr(t, lr[e], !1, r, n, i); throw new z("Illegal delimiter: '" + t + "'") }, vr = pr, yr = function (t, e, r, n, i, a) { var o = n.fontMetrics().axisHeight * n.sizeMultiplier, s = 5 / n.fontMetrics().ptPerEm, l = Math.max(e - o, r + o), c = Math.max(l / 500 * 901, 2 * l - s); return pr(t, c, !0, n, i, a) }, br = { "\\bigl": { mclass: "mopen", size: 1 }, "\\Bigl": { mclass: "mopen", size: 2 }, "\\biggl": { mclass: "mopen", size: 3 }, "\\Biggl": { mclass: "mopen", size: 4 }, "\\bigr": { mclass: "mclose", size: 1 }, "\\Bigr": { mclass: "mclose", size: 2 }, "\\biggr": { mclass: "mclose", size: 3 }, "\\Biggr": { mclass: "mclose", size: 4 }, "\\bigm": { mclass: "mrel", size: 1 }, "\\Bigm": { mclass: "mrel", size: 2 }, "\\biggm": { mclass: "mrel", size: 3 }, "\\Biggm": { mclass: "mrel", size: 4 }, "\\big": { mclass: "mord", size: 1 }, "\\Big": { mclass: "mord", size: 2 }, "\\bigg": { mclass: "mord", size: 3 }, "\\Bigg": { mclass: "mord", size: 4 } }, xr = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230a", "\u230b", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27e8", "\\rangle", "\u27e9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27ee", "\u27ef", "\\lmoustache", "\\rmoustache", "\u23b0", "\u23b1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; d({ type: "delimsizing", names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], props: { numArgs: 1 }, handler: function (t, e) { var r = y(e[0], t); return { type: "delimsizing", mode: t.parser.mode, size: br[t.funcName].size, mclass: br[t.funcName].mclass, delim: r.text } }, htmlBuilder: function (t, e) { return "." === t.delim ? oe.makeSpan([t.mclass]) : gr(t.delim, t.size, e, t.mode, [t.mclass]) }, mathmlBuilder: function (t) { var e = []; "." !== t.delim && e.push(Le(t.delim, t.mode)); var r = new Ce.MathNode("mo", e); return "mopen" === t.mclass || "mclose" === t.mclass ? r.setAttribute("fence", "true") : r.setAttribute("fence", "false"), r } }), d({ type: "leftright-right", names: ["\\right"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser.gullet.macros.get("\\current@color"); if (r && "string" != typeof r) throw new z("\\current@color set to non-string in \\right"); return { type: "leftright-right", mode: t.parser.mode, delim: y(e[0], t).text, color: r } } }), d({ type: "leftright", names: ["\\left"], props: { numArgs: 1 }, handler: function (t, e) { var r = y(e[0], t), n = t.parser; ++n.leftrightDepth; var i = n.parseExpression(!1); --n.leftrightDepth, n.expect("\\right", !1); var a = s(n.parseFunction(), "leftright-right"); return { type: "leftright", mode: n.mode, body: i, left: r.text, right: a.delim, rightColor: a.color } }, htmlBuilder: function (t, e) { b(t); for (var r, n, i = we(t.body, e, !0, ["mopen", "mclose"]), a = 0, o = 0, s = !1, l = 0; l < i.length; l++)i[l].isMiddle ? s = !0 : (a = Math.max(i[l].height, a), o = Math.max(i[l].depth, o)); if (a *= e.sizeMultiplier, o *= e.sizeMultiplier, r = "." === t.left ? Ee(e, ["mopen"]) : yr(t.left, a, o, e, t.mode, ["mopen"]), i.unshift(r), s) for (var c = 1; c < i.length; c++) { var u = i[c].isMiddle; u && (i[c] = yr(u.delim, a, o, u.options, t.mode, [])) } if ("." === t.right) n = Ee(e, ["mclose"]); else { var h = t.rightColor ? e.withColor(t.rightColor) : e; n = yr(t.right, a, o, h, t.mode, ["mclose"]) } return i.push(n), oe.makeSpan(["minner"], i, e) }, mathmlBuilder: function (t, e) { b(t); var r = Pe(t.body, e); if ("." !== t.left) { var n = new Ce.MathNode("mo", [Le(t.left, t.mode)]); n.setAttribute("fence", "true"), r.unshift(n) } if ("." !== t.right) { var i = new Ce.MathNode("mo", [Le(t.right, t.mode)]); i.setAttribute("fence", "true"), t.rightColor && i.setAttribute("mathcolor", t.rightColor), r.push(i) } return ze(r) } }), d({ type: "middle", names: ["\\middle"], props: { numArgs: 1 }, handler: function (t, e) { var r = y(e[0], t); if (!t.parser.leftrightDepth) throw new z("\\middle without preceding \\left", r); return { type: "middle", mode: t.parser.mode, delim: r.text } }, htmlBuilder: function (t, e) { var r; if ("." === t.delim) r = Ee(e, []); else { r = gr(t.delim, 1, e, t.mode, []); var n = { delim: t.delim, options: e }; r.isMiddle = n } return r }, mathmlBuilder: function (t) { var e = "\\vert" === t.delim || "|" === t.delim ? Le("|", "text") : Le(t.delim, t.mode), r = new Ce.MathNode("mo", [e]); return r.setAttribute("fence", "true"), r.setAttribute("lspace", "0.05em"), r.setAttribute("rspace", "0.05em"), r } }); var wr = function (t, e) { var r, n, i = oe.wrapFragment(Me(t.body, e), e), a = t.label.substr(1), o = e.sizeMultiplier, s = 0, l = B.isCharacterBox(t.body); if ("sout" === a) (r = oe.makeSpan(["stretchy", "sout"])).height = e.fontMetrics().defaultRuleThickness / o, s = -.5 * e.fontMetrics().xHeight; else { /cancel/.test(a) ? l || i.classes.push("cancel-pad") : i.classes.push("boxpad"); var c = 0, u = 0; /box/.test(a) ? (u = Math.max(e.fontMetrics().fboxrule, e.minRuleThickness), c = e.fontMetrics().fboxsep + ("colorbox" === a ? 0 : u)) : c = l ? .2 : 0, r = Ue(i, a, c, e), /fbox|boxed|fcolorbox/.test(a) && (r.style.borderStyle = "solid", r.style.borderWidth = u + "em"), s = i.depth + c, t.backgroundColor && (r.style.backgroundColor = t.backgroundColor, t.borderColor && (r.style.borderColor = t.borderColor)) } return n = t.backgroundColor ? oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: r, shift: s }, { type: "elem", elem: i, shift: 0 }] }, e) : oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: i, shift: 0 }, { type: "elem", elem: r, shift: s, wrapperClasses: /cancel/.test(a) ? ["svg-align"] : [] }] }, e), /cancel/.test(a) && (n.height = i.height, n.depth = i.depth), /cancel/.test(a) && !l ? oe.makeSpan(["mord", "cancel-lap"], [n], e) : oe.makeSpan(["mord"], [n], e) }, kr = function (t, e) { var r = 0, n = new Ce.MathNode(t.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [Oe(t.body, e)]); switch (t.label) { case "\\cancel": n.setAttribute("notation", "updiagonalstrike"); break; case "\\bcancel": n.setAttribute("notation", "downdiagonalstrike"); break; case "\\sout": n.setAttribute("notation", "horizontalstrike"); break; case "\\fbox": n.setAttribute("notation", "box"); break; case "\\fcolorbox": case "\\colorbox": if (r = e.fontMetrics().fboxsep * e.fontMetrics().ptPerEm, n.setAttribute("width", "+" + 2 * r + "pt"), n.setAttribute("height", "+" + 2 * r + "pt"), n.setAttribute("lspace", r + "pt"), n.setAttribute("voffset", r + "pt"), "\\fcolorbox" === t.label) { var i = Math.max(e.fontMetrics().fboxrule, e.minRuleThickness); n.setAttribute("style", "border: " + i + "em solid " + String(t.borderColor)) } break; case "\\xcancel": n.setAttribute("notation", "updiagonalstrike downdiagonalstrike") }return t.backgroundColor && n.setAttribute("mathbackground", t.backgroundColor), n }; d({ type: "enclose", names: ["\\colorbox"], props: { numArgs: 2, allowedInText: !0, greediness: 3, argTypes: ["color", "text"] }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = s(e[0], "color-token").color, a = e[1]; return { type: "enclose", mode: r.mode, label: n, backgroundColor: i, body: a } }, htmlBuilder: wr, mathmlBuilder: kr }), d({ type: "enclose", names: ["\\fcolorbox"], props: { numArgs: 3, allowedInText: !0, greediness: 3, argTypes: ["color", "color", "text"] }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = s(e[0], "color-token").color, a = s(e[1], "color-token").color, o = e[2]; return { type: "enclose", mode: r.mode, label: n, backgroundColor: a, borderColor: i, body: o } }, htmlBuilder: wr, mathmlBuilder: kr }), d({ type: "enclose", names: ["\\fbox"], props: { numArgs: 1, argTypes: ["hbox"], allowedInText: !0 }, handler: function (t, e) { return { type: "enclose", mode: t.parser.mode, label: "\\fbox", body: e[0] } } }), d({ type: "enclose", names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; return { type: "enclose", mode: r.mode, label: n, body: i } }, htmlBuilder: wr, mathmlBuilder: kr }); var Sr = {}, Ar = function (t, e) { function r(t) { for (var e = 0; e < t.length; ++e)e > 0 && (y += .25), c.push({ pos: y, isDashed: t[e] }) } var n, i, a = t.body.length, o = t.hLinesBeforeRow, s = 0, l = new Array(a), c = [], u = Math.max(e.fontMetrics().arrayRuleWidth, e.minRuleThickness), h = 1 / e.fontMetrics().ptPerEm, d = 5 * h; t.colSeparationType && "small" === t.colSeparationType && (d = e.havingStyle(G.SCRIPT).sizeMultiplier / e.sizeMultiplier * .2778); var m = 12 * h, p = 3 * h, f = t.arraystretch * m, g = .7 * f, v = .3 * f, y = 0; for (r(o[0]), n = 0; n < t.body.length; ++n) { var b = t.body[n], x = g, w = v; s < b.length && (s = b.length); var k = new Array(b.length); for (i = 0; i < b.length; ++i) { var S = Me(b[i], e); w < S.depth && (w = S.depth), x < S.height && (x = S.height), k[i] = S } var A = t.rowGaps[n], E = 0; A && (E = Xt(A, e)) > 0 && (w < (E += v) && (w = E), E = 0), t.addJot && (w += p), k.height = x, k.depth = w, y += x, k.pos = y, y += w + E, l[n] = k, r(o[n + 1]) } var M, R, T = y / 2 + e.fontMetrics().axisHeight, C = t.cols || [], L = []; for (i = 0, R = 0; i < s || R < C.length; ++i, ++R) { for (var N = C[R] || {}, P = !0; "separator" === N.type;) { if (P || ((M = oe.makeSpan(["arraycolsep"], [])).style.width = e.fontMetrics().doubleRuleSep + "em", L.push(M)), "|" !== N.separator && ":" !== N.separator) throw new z("Invalid separator type: " + N.separator); var I = "|" === N.separator ? "solid" : "dashed", O = oe.makeSpan(["vertical-separator"], [], e); O.style.height = y + "em", O.style.borderRightWidth = u + "em", O.style.borderRightStyle = I, O.style.margin = "0 -" + u / 2 + "em", O.style.verticalAlign = -(y - T) + "em", L.push(O), N = C[++R] || {}, P = !1 } if (!(i >= s)) { var q = void 0; (i > 0 || t.hskipBeforeAndAfter) && 0 !== (q = B.deflt(N.pregap, d)) && ((M = oe.makeSpan(["arraycolsep"], [])).style.width = q + "em", L.push(M)); var D = []; for (n = 0; n < a; ++n) { var F = l[n], H = F[i]; if (H) { var j = F.pos - T; H.depth = F.depth, H.height = F.height, D.push({ type: "elem", elem: H, shift: j }) } } D = oe.makeVList({ positionType: "individualShift", children: D }, e), D = oe.makeSpan(["col-align-" + (N.align || "c")], [D]), L.push(D), (i < s - 1 || t.hskipBeforeAndAfter) && 0 !== (q = B.deflt(N.postgap, d)) && ((M = oe.makeSpan(["arraycolsep"], [])).style.width = q + "em", L.push(M)) } } if (l = oe.makeSpan(["mtable"], L), c.length > 0) { for (var U = oe.makeLineSpan("hline", e, u), _ = oe.makeLineSpan("hdashline", e, u), V = [{ type: "elem", elem: l, shift: 0 }]; c.length > 0;) { var W = c.pop(), Y = W.pos - T; W.isDashed ? V.push({ type: "elem", elem: _, shift: Y }) : V.push({ type: "elem", elem: U, shift: Y }) } l = oe.makeVList({ positionType: "individualShift", children: V }, e) } return oe.makeSpan(["mord"], [l], e) }, Er = { c: "center ", l: "left ", r: "right " }, Mr = function (t, e) { var r = new Ce.MathNode("mtable", t.body.map(function (t) { return new Ce.MathNode("mtr", t.map(function (t) { return new Ce.MathNode("mtd", [Oe(t, e)]) })) })), n = .5 === t.arraystretch ? .1 : .16 + t.arraystretch - 1 + (t.addJot ? .09 : 0); r.setAttribute("rowspacing", n + "em"); var i = "", a = ""; if (t.cols) { var o = t.cols, s = "", l = !1, c = 0, u = o.length; "separator" === o[0].type && (i += "top ", c = 1), "separator" === o[o.length - 1].type && (i += "bottom ", u -= 1); for (var h = c; h < u; h++)"align" === o[h].type ? (a += Er[o[h].align], l && (s += "none "), l = !0) : "separator" === o[h].type && l && (s += "|" === o[h].separator ? "solid " : "dashed ", l = !1); r.setAttribute("columnalign", a.trim()), /[sd]/.test(s) && r.setAttribute("columnlines", s.trim()) } if ("align" === t.colSeparationType) { for (var d = t.cols || [], m = "", p = 1; p < d.length; p++)m += p % 2 ? "0em " : "1em "; r.setAttribute("columnspacing", m.trim()) } else "alignat" === t.colSeparationType ? r.setAttribute("columnspacing", "0em") : "small" === t.colSeparationType ? r.setAttribute("columnspacing", "0.2778em") : r.setAttribute("columnspacing", "1em"); var f = "", g = t.hLinesBeforeRow; i += g[0].length > 0 ? "left " : "", i += g[g.length - 1].length > 0 ? "right " : ""; for (var v = 1; v < g.length - 1; v++)f += 0 === g[v].length ? "none " : g[v][0] ? "dashed " : "solid "; return /[sd]/.test(f) && r.setAttribute("rowlines", f.trim()), "" !== i && (r = new Ce.MathNode("menclose", [r])).setAttribute("notation", i.trim()), t.arraystretch && t.arraystretch < 1 && (r = new Ce.MathNode("mstyle", [r])).setAttribute("scriptlevel", "1"), r }, Rr = function (t, e) { var r, n = [], i = k(t.parser, { cols: n, addJot: !0 }, "display"), a = 0, o = { type: "ordgroup", mode: t.mode, body: [] }, c = l(e[0], "ordgroup"); if (c) { for (var u = "", h = 0; h < c.body.length; h++)u += s(c.body[h], "textord").text; r = Number(u), a = 2 * r } var d = !a; i.body.forEach(function (t) { for (var e = 1; e < t.length; e += 2) { s(s(t[e], "styling").body[0], "ordgroup").body.unshift(o) } if (d) a < t.length && (a = t.length); else { var n = t.length / 2; if (r < n) throw new z("Too many math in a row: expected " + r + ", but got " + n, t[0]) } }); for (var m = 0; m < a; ++m) { var p = "r", f = 0; m % 2 == 1 ? p = "l" : m > 0 && d && (f = 1), n[m] = { type: "align", align: p, pregap: f, postgap: 0 } } return i.colSeparationType = d ? "align" : "alignat", i }; x({ type: "array", names: ["array", "darray"], props: { numArgs: 1 }, handler: function (t, e) { var r = { cols: (h(e[0]) ? [e[0]] : s(e[0], "ordgroup").body).map(function (t) { var e = u(t).text; if (-1 !== "lcr".indexOf(e)) return { type: "align", align: e }; if ("|" === e) return { type: "separator", separator: "|" }; if (":" === e) return { type: "separator", separator: ":" }; throw new z("Unknown column alignment: " + e, t) }), hskipBeforeAndAfter: !0 }; return k(t.parser, r, S(t.envName)) }, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix"], props: { numArgs: 0 }, handler: function (t) { var e = { matrix: null, pmatrix: ["(", ")"], bmatrix: ["[", "]"], Bmatrix: ["\\{", "\\}"], vmatrix: ["|", "|"], Vmatrix: ["\\Vert", "\\Vert"] }[t.envName], r = k(t.parser, { hskipBeforeAndAfter: !1 }, S(t.envName)); return e ? { type: "leftright", mode: t.mode, body: [r], left: e[0], right: e[1], rightColor: void 0 } : r }, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["smallmatrix"], props: { numArgs: 0 }, handler: function (t) { var e = k(t.parser, { arraystretch: .5 }, "script"); return e.colSeparationType = "small", e }, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["subarray"], props: { numArgs: 1 }, handler: function (t, e) { var r = (h(e[0]) ? [e[0]] : s(e[0], "ordgroup").body).map(function (t) { var e = u(t).text; if (-1 !== "lc".indexOf(e)) return { type: "align", align: e }; throw new z("Unknown column alignment: " + e, t) }); if (r.length > 1) throw new z("{subarray} can contain only one column"); var n = { cols: r, hskipBeforeAndAfter: !1, arraystretch: .5 }; if ((n = k(t.parser, n, "script")).body[0].length > 1) throw new z("{subarray} can contain only one column"); return n }, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["cases", "dcases"], props: { numArgs: 0 }, handler: function (t) { var e = k(t.parser, { arraystretch: 1.2, cols: [{ type: "align", align: "l", pregap: 0, postgap: 1 }, { type: "align", align: "l", pregap: 0, postgap: 0 }] }, S(t.envName)); return { type: "leftright", mode: t.mode, body: [e], left: "\\{", right: ".", rightColor: void 0 } }, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["aligned"], props: { numArgs: 0 }, handler: Rr, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["gathered"], props: { numArgs: 0 }, handler: function (t) { return k(t.parser, { cols: [{ type: "align", align: "c" }], addJot: !0 }, "display") }, htmlBuilder: Ar, mathmlBuilder: Mr }), x({ type: "array", names: ["alignedat"], props: { numArgs: 1 }, handler: Rr, htmlBuilder: Ar, mathmlBuilder: Mr }), d({ type: "text", names: ["\\hline", "\\hdashline"], props: { numArgs: 0, allowedInText: !0, allowedInMath: !0 }, handler: function (t) { throw new z(t.funcName + " valid only within array environment") } }); var Tr = Sr; d({ type: "environment", names: ["\\begin", "\\end"], props: { numArgs: 1, argTypes: ["text"] }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; if ("ordgroup" !== i.type) throw new z("Invalid environment name", i); for (var a = "", o = 0; o < i.body.length; ++o)a += s(i.body[o], "textord").text; if ("\\begin" === n) { if (!Tr.hasOwnProperty(a)) throw new z("No such environment: " + a, i); var l = Tr[a], c = r.parseArguments("\\begin{" + a + "}", l), u = c.args, h = c.optArgs, d = { mode: r.mode, envName: a, parser: r }, m = l.handler(d, u, h); r.expect("\\end", !1); var p = r.nextToken, f = s(r.parseFunction(), "environment"); if (f.name !== a) throw new z("Mismatch: \\begin{" + a + "} matched by \\end{" + f.name + "}", p); return m } return { type: "environment", mode: r.mode, name: a, nameGroup: i } } }); var Cr = oe.makeSpan; d({ type: "mclass", names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; return { type: "mclass", mode: r.mode, mclass: "m" + n.substr(5), body: fe(i), isCharacterBox: B.isCharacterBox(i) } }, htmlBuilder: A, mathmlBuilder: E }); var Lr = function (t) { var e = "ordgroup" === t.type && t.body.length ? t.body[0] : t; return "atom" !== e.type || "bin" !== e.family && "rel" !== e.family ? "mord" : "m" + e.family }; d({ type: "mclass", names: ["\\@binrel"], props: { numArgs: 2 }, handler: function (t, e) { return { type: "mclass", mode: t.parser.mode, mclass: Lr(e[0]), body: [e[1]], isCharacterBox: B.isCharacterBox(e[1]) } } }), d({ type: "mclass", names: ["\\stackrel", "\\overset", "\\underset"], props: { numArgs: 2 }, handler: function (t, e) { var r, n = t.parser, i = t.funcName, a = e[1], o = e[0]; r = "\\stackrel" !== i ? Lr(a) : "mrel"; var s = { type: "op", mode: a.mode, limits: !0, alwaysHandleSupSub: !0, parentIsSupSub: !1, symbol: !1, suppressBaseShift: "\\stackrel" !== i, body: fe(a) }, l = { type: "supsub", mode: o.mode, base: s, sup: "\\underset" === i ? null : o, sub: "\\underset" === i ? o : null }; return { type: "mclass", mode: n.mode, mclass: r, body: [l], isCharacterBox: B.isCharacterBox(l) } }, htmlBuilder: A, mathmlBuilder: E }); var zr = function (t, e) { var r = t.font, n = e.withFont(r); return Me(t.body, n) }, Nr = function (t, e) { var r = t.font, n = e.withFont(r); return Oe(t.body, n) }, Pr = { "\\Bbb": "\\mathbb", "\\bold": "\\mathbf", "\\frak": "\\mathfrak", "\\bm": "\\boldsymbol" }; d({ type: "font", names: ["\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", "\\Bbb", "\\bold", "\\frak"], props: { numArgs: 1, greediness: 2 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0], a = n; return a in Pr && (a = Pr[a]), { type: "font", mode: r.mode, font: a.slice(1), body: i } }, htmlBuilder: zr, mathmlBuilder: Nr }), d({ type: "mclass", names: ["\\boldsymbol", "\\bm"], props: { numArgs: 1, greediness: 2 }, handler: function (t, e) { var r = t.parser, n = e[0], i = B.isCharacterBox(n); return { type: "mclass", mode: r.mode, mclass: Lr(n), body: [{ type: "font", mode: r.mode, font: "boldsymbol", body: n }], isCharacterBox: i } } }), d({ type: "font", names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it"], props: { numArgs: 0, allowedInText: !0 }, handler: function (t) { var e = t.parser, r = t.funcName, n = t.breakOnTokenText, i = e.mode, a = e.parseExpression(!0, n); return { type: "font", mode: i, font: "math" + r.slice(1), body: { type: "ordgroup", mode: e.mode, body: a } } }, htmlBuilder: zr, mathmlBuilder: Nr }); var Ir = function (t, e) { var r = e; return "display" === t ? r = r.id >= G.SCRIPT.id ? r.text() : G.DISPLAY : "text" === t && r.size === G.DISPLAY.size ? r = G.TEXT : "script" === t ? r = G.SCRIPT : "scriptscript" === t && (r = G.SCRIPTSCRIPT), r }, Or = function (t, e) { var r, n = Ir(t.size, e.style), i = n.fracNum(), a = n.fracDen(); r = e.havingStyle(i); var o = Me(t.numer, r, e); if (t.continued) { var s = 8.5 / e.fontMetrics().ptPerEm, l = 3.5 / e.fontMetrics().ptPerEm; o.height = o.height < s ? s : o.height, o.depth = o.depth < l ? l : o.depth } r = e.havingStyle(a); var c, u, h, d, m, p, f, g, v, y, b = Me(t.denom, r, e); if (t.hasBarLine ? (t.barSize ? (u = Xt(t.barSize, e), c = oe.makeLineSpan("frac-line", e, u)) : c = oe.makeLineSpan("frac-line", e), u = c.height, h = c.height) : (c = null, u = 0, h = e.fontMetrics().defaultRuleThickness), n.size === G.DISPLAY.size || "display" === t.size ? (d = e.fontMetrics().num1, m = u > 0 ? 3 * h : 7 * h, p = e.fontMetrics().denom1) : (u > 0 ? (d = e.fontMetrics().num2, m = h) : (d = e.fontMetrics().num3, m = 3 * h), p = e.fontMetrics().denom2), c) { var x = e.fontMetrics().axisHeight; d - o.depth - (x + .5 * u) < m && (d += m - (d - o.depth - (x + .5 * u))), x - .5 * u - (b.height - p) < m && (p += m - (x - .5 * u - (b.height - p))); var w = -(x - .5 * u); f = oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: b, shift: p }, { type: "elem", elem: c, shift: w }, { type: "elem", elem: o, shift: -d }] }, e) } else { var k = d - o.depth - (b.height - p); k < m && (d += .5 * (m - k), p += .5 * (m - k)), f = oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: b, shift: p }, { type: "elem", elem: o, shift: -d }] }, e) } return r = e.havingStyle(n), f.height *= r.sizeMultiplier / e.sizeMultiplier, f.depth *= r.sizeMultiplier / e.sizeMultiplier, g = n.size === G.DISPLAY.size ? e.fontMetrics().delim1 : e.fontMetrics().delim2, v = null == t.leftDelim ? Ee(e, ["mopen"]) : vr(t.leftDelim, g, !0, e.havingStyle(n), t.mode, ["mopen"]), y = t.continued ? oe.makeSpan([]) : null == t.rightDelim ? Ee(e, ["mclose"]) : vr(t.rightDelim, g, !0, e.havingStyle(n), t.mode, ["mclose"]), oe.makeSpan(["mord"].concat(r.sizingClasses(e)), [v, oe.makeSpan(["mfrac"], [f]), y], e) }, Br = function (t, e) { var r = new Ce.MathNode("mfrac", [Oe(t.numer, e), Oe(t.denom, e)]); if (t.hasBarLine) { if (t.barSize) { var n = Xt(t.barSize, e); r.setAttribute("linethickness", n + "em") } } else r.setAttribute("linethickness", "0px"); var i = Ir(t.size, e.style); if (i.size !== e.style.size) { r = new Ce.MathNode("mstyle", [r]); var a = i.size === G.DISPLAY.size ? "true" : "false"; r.setAttribute("displaystyle", a), r.setAttribute("scriptlevel", "0") } if (null != t.leftDelim || null != t.rightDelim) { var o = []; if (null != t.leftDelim) { var s = new Ce.MathNode("mo", [new Ce.TextNode(t.leftDelim.replace("\\", ""))]); s.setAttribute("fence", "true"), o.push(s) } if (o.push(r), null != t.rightDelim) { var l = new Ce.MathNode("mo", [new Ce.TextNode(t.rightDelim.replace("\\", ""))]); l.setAttribute("fence", "true"), o.push(l) } return ze(o) } return r }; d({ type: "genfrac", names: ["\\cfrac", "\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", "\\\\bracefrac", "\\\\brackfrac"], props: { numArgs: 2, greediness: 2 }, handler: function (t, e) { var r, n = t.parser, i = t.funcName, a = e[0], o = e[1], s = null, l = null, c = "auto"; switch (i) { case "\\cfrac": case "\\dfrac": case "\\frac": case "\\tfrac": r = !0; break; case "\\\\atopfrac": r = !1; break; case "\\dbinom": case "\\binom": case "\\tbinom": r = !1, s = "(", l = ")"; break; case "\\\\bracefrac": r = !1, s = "\\{", l = "\\}"; break; case "\\\\brackfrac": r = !1, s = "[", l = "]"; break; default: throw new Error("Unrecognized genfrac command") }switch (i) { case "\\cfrac": case "\\dfrac": case "\\dbinom": c = "display"; break; case "\\tfrac": case "\\tbinom": c = "text" }return { type: "genfrac", mode: n.mode, continued: "\\cfrac" === i, numer: a, denom: o, hasBarLine: r, leftDelim: s, rightDelim: l, size: c, barSize: null } }, htmlBuilder: Or, mathmlBuilder: Br }), d({ type: "infix", names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], props: { numArgs: 0, infix: !0 }, handler: function (t) { var e, r = t.parser, n = t.funcName, i = t.token; switch (n) { case "\\over": e = "\\frac"; break; case "\\choose": e = "\\binom"; break; case "\\atop": e = "\\\\atopfrac"; break; case "\\brace": e = "\\\\bracefrac"; break; case "\\brack": e = "\\\\brackfrac"; break; default: throw new Error("Unrecognized infix genfrac command") }return { type: "infix", mode: r.mode, replaceWith: e, token: i } } }); var qr = ["display", "text", "script", "scriptscript"], Dr = function (t) { var e = null; return t.length > 0 && (e = "." === (e = t) ? null : e), e }; d({ type: "genfrac", names: ["\\genfrac"], props: { numArgs: 6, greediness: 6, argTypes: ["math", "math", "size", "text", "math", "math"] }, handler: function (t, e) { var r = t.parser, n = e[4], i = e[5], a = l(e[0], "atom"); a && (a = c(e[0], "open")); var o = a ? Dr(a.text) : null, u = l(e[1], "atom"); u && (u = c(e[1], "close")); var h, d = u ? Dr(u.text) : null, m = s(e[2], "size"), p = null; h = !!m.isBlank || (p = m.value).number > 0; var f = "auto", g = l(e[3], "ordgroup"); if (g) { if (g.body.length > 0) { var v = s(g.body[0], "textord"); f = qr[Number(v.text)] } } else g = s(e[3], "textord"), f = qr[Number(g.text)]; return { type: "genfrac", mode: r.mode, numer: n, denom: i, continued: !1, hasBarLine: h, barSize: p, leftDelim: o, rightDelim: d, size: f } }, htmlBuilder: Or, mathmlBuilder: Br }), d({ type: "infix", names: ["\\above"], props: { numArgs: 1, argTypes: ["size"], infix: !0 }, handler: function (t, e) { var r = t.parser, n = (t.funcName, t.token); return { type: "infix", mode: r.mode, replaceWith: "\\\\abovefrac", size: s(e[0], "size").value, token: n } } }), d({ type: "genfrac", names: ["\\\\abovefrac"], props: { numArgs: 3, argTypes: ["math", "size", "math"] }, handler: function (t, e) { var r = t.parser, n = (t.funcName, e[0]), i = function (t) { if (!t) throw new Error("Expected non-null, but got " + String(t)); return t }(s(e[1], "infix").size), a = e[2], o = i.number > 0; return { type: "genfrac", mode: r.mode, numer: n, denom: a, continued: !1, hasBarLine: o, barSize: i, leftDelim: null, rightDelim: null, size: "auto" } }, htmlBuilder: Or, mathmlBuilder: Br }); var Fr = function (t, e) { var r, n, i = e.style, a = l(t, "supsub"); a ? (r = a.sup ? Me(a.sup, e.havingStyle(i.sup()), e) : Me(a.sub, e.havingStyle(i.sub()), e), n = s(a.base, "horizBrace")) : n = s(t, "horizBrace"); var o, c = Me(n.base, e.havingBaseStyle(G.DISPLAY)), u = Ve(n, e); if (n.isOver ? (o = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: c }, { type: "kern", size: .1 }, { type: "elem", elem: u }] }, e)).children[0].children[0].children[1].classes.push("svg-align") : (o = oe.makeVList({ positionType: "bottom", positionData: c.depth + .1 + u.height, children: [{ type: "elem", elem: u }, { type: "kern", size: .1 }, { type: "elem", elem: c }] }, e)).children[0].children[0].children[0].classes.push("svg-align"), r) { var h = oe.makeSpan(["mord", n.isOver ? "mover" : "munder"], [o], e); o = n.isOver ? oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: h }, { type: "kern", size: .2 }, { type: "elem", elem: r }] }, e) : oe.makeVList({ positionType: "bottom", positionData: h.depth + .2 + r.height + r.depth, children: [{ type: "elem", elem: r }, { type: "kern", size: .2 }, { type: "elem", elem: h }] }, e) } return oe.makeSpan(["mord", n.isOver ? "mover" : "munder"], [o], e) }; d({ type: "horizBrace", names: ["\\overbrace", "\\underbrace"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = t.funcName; return { type: "horizBrace", mode: r.mode, label: n, isOver: /^\\over/.test(n), base: e[0] } }, htmlBuilder: Fr, mathmlBuilder: function (t, e) { var r = _e(t.label); return new Ce.MathNode(t.isOver ? "mover" : "munder", [Oe(t.base, e), r]) } }), d({ type: "href", names: ["\\href"], props: { numArgs: 2, argTypes: ["url", "original"], allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = e[1], i = s(e[0], "url").url; return r.settings.isTrusted({ command: "\\href", url: i }) ? { type: "href", mode: r.mode, href: i, body: fe(n) } : r.formatUnsupportedCmd("\\href") }, htmlBuilder: function (t, e) { var r = we(t.body, e, !1); return oe.makeAnchor(t.href, [], r, e) }, mathmlBuilder: function (t, e) { var r = Ie(t.body, e); return r instanceof Re || (r = new Re("mrow", [r])), r.setAttribute("href", t.href), r } }), d({ type: "href", names: ["\\url"], props: { numArgs: 1, argTypes: ["url"], allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = s(e[0], "url").url; if (!r.settings.isTrusted({ command: "\\url", url: n })) return r.formatUnsupportedCmd("\\url"); for (var i = [], a = 0; a < n.length; a++) { var o = n[a]; "~" === o && (o = "\\textasciitilde"), i.push({ type: "textord", mode: "text", text: o }) } var l = { type: "text", mode: r.mode, font: "\\texttt", body: i }; return { type: "href", mode: r.mode, href: n, body: fe(l) } } }), d({ type: "htmlmathml", names: ["\\html@mathml"], props: { numArgs: 2, allowedInText: !0 }, handler: function (t, e) { return { type: "htmlmathml", mode: t.parser.mode, html: fe(e[0]), mathml: fe(e[1]) } }, htmlBuilder: function (t, e) { var r = we(t.html, e, !1); return oe.makeFragment(r) }, mathmlBuilder: function (t, e) { return Ie(t.mathml, e) } }); var Hr = function (t) { if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(t)) return { number: +t, unit: "bp" }; var e = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t); if (!e) throw new z("Invalid size: '" + t + "' in \\includegraphics"); var r = { number: +(e[1] + e[2]), unit: e[3] }; if (!Yt(r)) throw new z("Invalid unit: '" + r.unit + "' in \\includegraphics."); return r }; d({ type: "includegraphics", names: ["\\includegraphics"], props: { numArgs: 1, numOptionalArgs: 1, argTypes: ["raw", "url"], allowedInText: !1 }, handler: function (t, e, r) { var n = t.parser, i = { number: 0, unit: "em" }, a = { number: .9, unit: "em" }, o = { number: 0, unit: "em" }, l = ""; if (r[0]) for (var c = s(r[0], "raw").string.split(","), u = 0; u < c.length; u++) { var h = c[u].split("="); if (2 === h.length) { var d = h[1].trim(); switch (h[0].trim()) { case "alt": l = d; break; case "width": i = Hr(d); break; case "height": a = Hr(d); break; case "totalheight": o = Hr(d); break; default: throw new z("Invalid key: '" + h[0] + "' in \\includegraphics.") } } } var m = s(e[0], "url").url; return "" === l && (l = (l = (l = m).replace(/^.*[\\\/]/, "")).substring(0, l.lastIndexOf("."))), n.settings.isTrusted({ command: "\\includegraphics", url: m }) ? { type: "includegraphics", mode: n.mode, alt: l, width: i, height: a, totalheight: o, src: m } : n.formatUnsupportedCmd("\\includegraphics") }, htmlBuilder: function (t, e) { var r = Xt(t.height, e), n = 0; t.totalheight.number > 0 && (n = Xt(t.totalheight, e) - r, n = Number(n.toFixed(2))); var i = 0; t.width.number > 0 && (i = Xt(t.width, e)); var a = { height: r + n + "em" }; i > 0 && (a.width = i + "em"), n > 0 && (a.verticalAlign = -n + "em"); var o = new nt(t.src, t.alt, a); return o.height = r, o.depth = n, o }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mglyph", []); r.setAttribute("alt", t.alt); var n = Xt(t.height, e), i = 0; if (t.totalheight.number > 0 && (i = (i = Xt(t.totalheight, e) - n).toFixed(2), r.setAttribute("valign", "-" + i + "em")), r.setAttribute("height", n + i + "em"), t.width.number > 0) { var a = Xt(t.width, e); r.setAttribute("width", a + "em") } return r.setAttribute("src", t.src), r } }), d({ type: "kern", names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], props: { numArgs: 1, argTypes: ["size"], allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = s(e[0], "size"); if (r.settings.strict) { var a = "m" === n[1], o = "mu" === i.value.unit; a ? (o || r.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + n + " supports only mu units, not " + i.value.unit + " units"), "math" !== r.mode && r.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + n + " works only in math mode")) : o && r.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + n + " doesn't support mu units") } return { type: "kern", mode: r.mode, dimension: i.value } }, htmlBuilder: function (t, e) { return oe.makeGlue(t.dimension, e) }, mathmlBuilder: function (t, e) { var r = Xt(t.dimension, e); return new Ce.SpaceNode(r) } }), d({ type: "lap", names: ["\\mathllap", "\\mathrlap", "\\mathclap"], props: { numArgs: 1, allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; return { type: "lap", mode: r.mode, alignment: n.slice(5), body: i } }, htmlBuilder: function (t, e) { var r; "clap" === t.alignment ? (r = oe.makeSpan([], [Me(t.body, e)]), r = oe.makeSpan(["inner"], [r], e)) : r = oe.makeSpan(["inner"], [Me(t.body, e)]); var n = oe.makeSpan(["fix"], []), i = oe.makeSpan([t.alignment], [r, n], e), a = oe.makeSpan(["strut"]); return a.style.height = i.height + i.depth + "em", a.style.verticalAlign = -i.depth + "em", i.children.unshift(a), i = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: i }] }, e), oe.makeSpan(["mord"], [i], e) }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mpadded", [Oe(t.body, e)]); if ("rlap" !== t.alignment) { var n = "llap" === t.alignment ? "-1" : "-0.5"; r.setAttribute("lspace", n + "width") } return r.setAttribute("width", "0px"), r } }), d({ type: "styling", names: ["\\(", "$"], props: { numArgs: 0, allowedInText: !0, allowedInMath: !1 }, handler: function (t) { var e = t.funcName, r = t.parser, n = r.mode; r.switchMode("math"); var i = "\\(" === e ? "\\)" : "$", a = r.parseExpression(!1, i); return r.expect(i), r.switchMode(n), { type: "styling", mode: r.mode, style: "text", body: a } } }), d({ type: "text", names: ["\\)", "\\]"], props: { numArgs: 0, allowedInText: !0, allowedInMath: !1 }, handler: function (t) { throw new z("Mismatched " + t.funcName) } }); var jr = function (t, e) { switch (e.style.size) { case G.DISPLAY.size: return t.display; case G.TEXT.size: return t.text; case G.SCRIPT.size: return t.script; case G.SCRIPTSCRIPT.size: return t.scriptscript; default: return t.text } }; d({ type: "mathchoice", names: ["\\mathchoice"], props: { numArgs: 4 }, handler: function (t, e) { return { type: "mathchoice", mode: t.parser.mode, display: fe(e[0]), text: fe(e[1]), script: fe(e[2]), scriptscript: fe(e[3]) } }, htmlBuilder: function (t, e) { var r = jr(t, e), n = we(r, e, !1); return oe.makeFragment(n) }, mathmlBuilder: function (t, e) { var r = jr(t, e); return Ie(r, e) } }); var Ur = function (t, e, r, n, i, a, o) { var s, l, c; if (t = oe.makeSpan([], [t]), e) { var u = Me(e, n.havingStyle(i.sup()), n); l = { elem: u, kern: Math.max(n.fontMetrics().bigOpSpacing1, n.fontMetrics().bigOpSpacing3 - u.depth) } } if (r) { var h = Me(r, n.havingStyle(i.sub()), n); s = { elem: h, kern: Math.max(n.fontMetrics().bigOpSpacing2, n.fontMetrics().bigOpSpacing4 - h.height) } } if (l && s) { var d = n.fontMetrics().bigOpSpacing5 + s.elem.height + s.elem.depth + s.kern + t.depth + o; c = oe.makeVList({ positionType: "bottom", positionData: d, children: [{ type: "kern", size: n.fontMetrics().bigOpSpacing5 }, { type: "elem", elem: s.elem, marginLeft: -a + "em" }, { type: "kern", size: s.kern }, { type: "elem", elem: t }, { type: "kern", size: l.kern }, { type: "elem", elem: l.elem, marginLeft: a + "em" }, { type: "kern", size: n.fontMetrics().bigOpSpacing5 }] }, n) } else if (s) { var m = t.height - o; c = oe.makeVList({ positionType: "top", positionData: m, children: [{ type: "kern", size: n.fontMetrics().bigOpSpacing5 }, { type: "elem", elem: s.elem, marginLeft: -a + "em" }, { type: "kern", size: s.kern }, { type: "elem", elem: t }] }, n) } else { if (!l) return t; var p = t.depth + o; c = oe.makeVList({ positionType: "bottom", positionData: p, children: [{ type: "elem", elem: t }, { type: "kern", size: l.kern }, { type: "elem", elem: l.elem, marginLeft: a + "em" }, { type: "kern", size: n.fontMetrics().bigOpSpacing5 }] }, n) } return oe.makeSpan(["mop", "op-limits"], [c], n) }, _r = ["\\smallint"], Vr = function (t, e) { + var r, n, i, a = !1, o = l(t, "supsub"); o ? (r = o.sup, n = o.sub, i = s(o.base, "op"), a = !0) : i = s(t, "op"); var c, u = e.style, h = !1; if (u.size === G.DISPLAY.size && i.symbol && !B.contains(_r, i.name) && (h = !0), i.symbol) { var d = h ? "Size2-Regular" : "Size1-Regular", m = ""; if ("\\oiint" !== i.name && "\\oiiint" !== i.name || (m = i.name.substr(1), i.name = "oiint" === m ? "\\iint" : "\\iiint"), c = oe.makeSymbol(i.name, d, "math", e, ["mop", "op-symbol", h ? "large-op" : "small-op"]), m.length > 0) { var p = c.italic, f = oe.staticSvg(m + "Size" + (h ? "2" : "1"), e); c = oe.makeVList({ positionType: "individualShift", children: [{ type: "elem", elem: c, shift: 0 }, { type: "elem", elem: f, shift: h ? .08 : 0 }] }, e), i.name = "\\" + m, c.classes.unshift("mop"), c.italic = p } } else if (i.body) { var g = we(i.body, e, !0); 1 === g.length && g[0] instanceof at ? (c = g[0]).classes[0] = "mop" : c = oe.makeSpan(["mop"], oe.tryCombineChars(g), e) } else { for (var v = [], y = 1; y < i.name.length; y++)v.push(oe.mathsym(i.name[y], i.mode, e)); c = oe.makeSpan(["mop"], v, e) } var b = 0, x = 0; return (c instanceof at || "\\oiint" === i.name || "\\oiiint" === i.name) && !i.suppressBaseShift && (b = (c.height - c.depth) / 2 - e.fontMetrics().axisHeight, x = c.italic), a ? Ur(c, r, n, e, u, x, b) : (b && (c.style.position = "relative", + c.style.top = b + "em"), c) + }, Wr = function (t, e) { var r; if (t.symbol) r = new Re("mo", [Le(t.name, t.mode)]), B.contains(_r, t.name) && r.setAttribute("largeop", "false"); else if (t.body) r = new Re("mo", Pe(t.body, e)); else { r = new Re("mi", [new Te(t.name.slice(1))]); var n = new Re("mo", [Le("\u2061", "text")]); r = t.parentIsSupSub ? new Re("mo", [r, n]) : g([r, n]) } return r }, Gr = { "\u220f": "\\prod", "\u2210": "\\coprod", "\u2211": "\\sum", "\u22c0": "\\bigwedge", "\u22c1": "\\bigvee", "\u22c2": "\\bigcap", "\u22c3": "\\bigcup", "\u2a00": "\\bigodot", "\u2a01": "\\bigoplus", "\u2a02": "\\bigotimes", "\u2a04": "\\biguplus", "\u2a06": "\\bigsqcup" }; d({ type: "op", names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220f", "\u2210", "\u2211", "\u22c0", "\u22c1", "\u22c2", "\u22c3", "\u2a00", "\u2a01", "\u2a02", "\u2a04", "\u2a06"], props: { numArgs: 0 }, handler: function (t) { var e = t.parser, r = t.funcName; return 1 === r.length && (r = Gr[r]), { type: "op", mode: e.mode, limits: !0, parentIsSupSub: !1, symbol: !0, name: r } }, htmlBuilder: Vr, mathmlBuilder: Wr }), d({ type: "op", names: ["\\mathop"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = e[0]; return { type: "op", mode: r.mode, limits: !1, parentIsSupSub: !1, symbol: !1, body: fe(n) } }, htmlBuilder: Vr, mathmlBuilder: Wr }); var Yr = { "\u222b": "\\int", "\u222c": "\\iint", "\u222d": "\\iiint", "\u222e": "\\oint", "\u222f": "\\oiint", "\u2230": "\\oiiint" }; d({ type: "op", names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], props: { numArgs: 0 }, handler: function (t) { var e = t.parser, r = t.funcName; return { type: "op", mode: e.mode, limits: !1, parentIsSupSub: !1, symbol: !1, name: r } }, htmlBuilder: Vr, mathmlBuilder: Wr }), d({ type: "op", names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], props: { numArgs: 0 }, handler: function (t) { var e = t.parser, r = t.funcName; return { type: "op", mode: e.mode, limits: !0, parentIsSupSub: !1, symbol: !1, name: r } }, htmlBuilder: Vr, mathmlBuilder: Wr }), d({ type: "op", names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222b", "\u222c", "\u222d", "\u222e", "\u222f", "\u2230"], props: { numArgs: 0 }, handler: function (t) { var e = t.parser, r = t.funcName; return 1 === r.length && (r = Yr[r]), { type: "op", mode: e.mode, limits: !1, parentIsSupSub: !1, symbol: !0, name: r } }, htmlBuilder: Vr, mathmlBuilder: Wr }); var Xr = function (t, e) { var r, n, i, a, o = !1, c = l(t, "supsub"); if (c ? (r = c.sup, n = c.sub, i = s(c.base, "operatorname"), o = !0) : i = s(t, "operatorname"), i.body.length > 0) { for (var u = i.body.map(function (t) { var e = t.text; return "string" == typeof e ? { type: "textord", mode: t.mode, text: e } : t }), h = we(u, e.withFont("mathrm"), !0), d = 0; d < h.length; d++) { var m = h[d]; m instanceof at && (m.text = m.text.replace(/\u2212/, "-").replace(/\u2217/, "*")) } a = oe.makeSpan(["mop"], h, e) } else a = oe.makeSpan(["mop"], [], e); return o ? Ur(a, r, n, e, e.style, 0, 0) : a }; d({ type: "operatorname", names: ["\\operatorname", "\\operatorname*"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; return { type: "operatorname", mode: r.mode, body: fe(i), alwaysHandleSupSub: "\\operatorname*" === n, limits: !1, parentIsSupSub: !1 } }, htmlBuilder: Xr, mathmlBuilder: function (t, e) { for (var r = Pe(t.body, e.withFont("mathrm")), n = !0, i = 0; i < r.length; i++) { var a = r[i]; if (a instanceof Ce.SpaceNode); else if (a instanceof Ce.MathNode) switch (a.type) { case "mi": case "mn": case "ms": case "mspace": case "mtext": break; case "mo": var o = a.children[0]; 1 === a.children.length && o instanceof Ce.TextNode ? o.text = o.text.replace(/\u2212/, "-").replace(/\u2217/, "*") : n = !1; break; default: n = !1 } else n = !1 } if (n) { var s = r.map(function (t) { return t.toText() }).join(""); r = [new Ce.TextNode(s)] } var l = new Ce.MathNode("mi", r); l.setAttribute("mathvariant", "normal"); var c = new Ce.MathNode("mo", [Le("\u2061", "text")]); return t.parentIsSupSub ? new Ce.MathNode("mo", [l, c]) : Ce.newDocumentFragment([l, c]) } }), m({ type: "ordgroup", htmlBuilder: function (t, e) { return t.semisimple ? oe.makeFragment(we(t.body, e, !1)) : oe.makeSpan(["mord"], we(t.body, e, !0), e) }, mathmlBuilder: function (t, e) { return Ie(t.body, e, !0) } }), d({ type: "overline", names: ["\\overline"], props: { numArgs: 1 }, handler: function (t, e) { var r = t.parser, n = e[0]; return { type: "overline", mode: r.mode, body: n } }, htmlBuilder: function (t, e) { var r = Me(t.body, e.havingCrampedStyle()), n = oe.makeLineSpan("overline-line", e), i = e.fontMetrics().defaultRuleThickness, a = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: r }, { type: "kern", size: 3 * i }, { type: "elem", elem: n }, { type: "kern", size: i }] }, e); return oe.makeSpan(["mord", "overline"], [a], e) }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mo", [new Ce.TextNode("\u203e")]); r.setAttribute("stretchy", "true"); var n = new Ce.MathNode("mover", [Oe(t.body, e), r]); return n.setAttribute("accent", "true"), n } }), d({ type: "phantom", names: ["\\phantom"], props: { numArgs: 1, allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = e[0]; return { type: "phantom", mode: r.mode, body: fe(n) } }, htmlBuilder: function (t, e) { var r = we(t.body, e.withPhantom(), !1); return oe.makeFragment(r) }, mathmlBuilder: function (t, e) { var r = Pe(t.body, e); return new Ce.MathNode("mphantom", r) } }), d({ type: "hphantom", names: ["\\hphantom"], props: { numArgs: 1, allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = e[0]; return { type: "hphantom", mode: r.mode, body: n } }, htmlBuilder: function (t, e) { var r = oe.makeSpan([], [Me(t.body, e.withPhantom())]); if (r.height = 0, r.depth = 0, r.children) for (var n = 0; n < r.children.length; n++)r.children[n].height = 0, r.children[n].depth = 0; return r = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: r }] }, e), oe.makeSpan(["mord"], [r], e) }, mathmlBuilder: function (t, e) { var r = Pe(fe(t.body), e), n = new Ce.MathNode("mphantom", r), i = new Ce.MathNode("mpadded", [n]); return i.setAttribute("height", "0px"), i.setAttribute("depth", "0px"), i } }), d({ type: "vphantom", names: ["\\vphantom"], props: { numArgs: 1, allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = e[0]; return { type: "vphantom", mode: r.mode, body: n } }, htmlBuilder: function (t, e) { var r = oe.makeSpan(["inner"], [Me(t.body, e.withPhantom())]), n = oe.makeSpan(["fix"], []); return oe.makeSpan(["mord", "rlap"], [r, n], e) }, mathmlBuilder: function (t, e) { var r = Pe(fe(t.body), e), n = new Ce.MathNode("mphantom", r), i = new Ce.MathNode("mpadded", [n]); return i.setAttribute("width", "0px"), i } }), d({ type: "raisebox", names: ["\\raisebox"], props: { numArgs: 2, argTypes: ["size", "hbox"], allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = s(e[0], "size").value, i = e[1]; return { type: "raisebox", mode: r.mode, dy: n, body: i } }, htmlBuilder: function (t, e) { var r = Me(t.body, e), n = Xt(t.dy, e); return oe.makeVList({ positionType: "shift", positionData: -n, children: [{ type: "elem", elem: r }] }, e) }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mpadded", [Oe(t.body, e)]), n = t.dy.number + t.dy.unit; return r.setAttribute("voffset", n), r } }), d({ type: "rule", names: ["\\rule"], props: { numArgs: 2, numOptionalArgs: 1, argTypes: ["size", "size", "size"] }, handler: function (t, e, r) { var n = t.parser, i = r[0], a = s(e[0], "size"), o = s(e[1], "size"); return { type: "rule", mode: n.mode, shift: i && s(i, "size").value, width: a.value, height: o.value } }, htmlBuilder: function (t, e) { var r = oe.makeSpan(["mord", "rule"], [], e), n = Xt(t.width, e), i = Xt(t.height, e), a = t.shift ? Xt(t.shift, e) : 0; return r.style.borderRightWidth = n + "em", r.style.borderTopWidth = i + "em", r.style.bottom = a + "em", r.width = n, r.height = i + a, r.depth = -a, r.maxFontSize = 1.125 * i * e.sizeMultiplier, r }, mathmlBuilder: function (t, e) { var r = Xt(t.width, e), n = Xt(t.height, e), i = t.shift ? Xt(t.shift, e) : 0, a = e.color && e.getColor() || "black", o = new Ce.MathNode("mspace"); o.setAttribute("mathbackground", a), o.setAttribute("width", r + "em"), o.setAttribute("height", n + "em"); var s = new Ce.MathNode("mpadded", [o]); return i >= 0 ? s.setAttribute("height", "+" + i + "em") : (s.setAttribute("height", i + "em"), s.setAttribute("depth", "+" + -i + "em")), s.setAttribute("voffset", i + "em"), s } }); var Kr = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; d({ type: "sizing", names: Kr, props: { numArgs: 0, allowedInText: !0 }, handler: function (t) { var e = t.breakOnTokenText, r = t.funcName, n = t.parser, i = n.parseExpression(!1, e); return { type: "sizing", mode: n.mode, size: Kr.indexOf(r) + 1, body: i } }, htmlBuilder: function (t, e) { var r = e.havingSize(t.size); return M(t.body, r, e) }, mathmlBuilder: function (t, e) { var r = e.havingSize(t.size), n = Pe(t.body, r), i = new Ce.MathNode("mstyle", n); return i.setAttribute("mathsize", r.sizeMultiplier + "em"), i } }), d({ type: "smash", names: ["\\smash"], props: { numArgs: 1, numOptionalArgs: 1, allowedInText: !0 }, handler: function (t, e, r) { var n = t.parser, i = !1, a = !1, o = r[0] && s(r[0], "ordgroup"); if (o) for (var l = "", c = 0; c < o.body.length; ++c)if ("t" === (l = o.body[c].text)) i = !0; else { if ("b" !== l) { i = !1, a = !1; break } a = !0 } else i = !0, a = !0; var u = e[0]; return { type: "smash", mode: n.mode, body: u, smashHeight: i, smashDepth: a } }, htmlBuilder: function (t, e) { var r = oe.makeSpan([], [Me(t.body, e)]); if (!t.smashHeight && !t.smashDepth) return r; if (t.smashHeight && (r.height = 0, r.children)) for (var n = 0; n < r.children.length; n++)r.children[n].height = 0; if (t.smashDepth && (r.depth = 0, r.children)) for (var i = 0; i < r.children.length; i++)r.children[i].depth = 0; var a = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: r }] }, e); return oe.makeSpan(["mord"], [a], e) }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mpadded", [Oe(t.body, e)]); return t.smashHeight && r.setAttribute("height", "0px"), t.smashDepth && r.setAttribute("depth", "0px"), r } }), d({ type: "sqrt", names: ["\\sqrt"], props: { numArgs: 1, numOptionalArgs: 1 }, handler: function (t, e, r) { var n = t.parser, i = r[0], a = e[0]; return { type: "sqrt", mode: n.mode, body: a, index: i } }, htmlBuilder: function (t, e) { var r = Me(t.body, e.havingCrampedStyle()); 0 === r.height && (r.height = e.fontMetrics().xHeight), r = oe.wrapFragment(r, e); var n = e.fontMetrics().defaultRuleThickness, i = n; e.style.id < G.TEXT.id && (i = e.fontMetrics().xHeight); var a = n + i / 4, o = r.height + r.depth + a + n, s = fr(o, e), l = s.span, c = s.ruleWidth, u = s.advanceWidth, h = l.height - c; h > r.height + r.depth + a && (a = (a + h - r.height - r.depth) / 2); var d = l.height - r.height - a - c; r.style.paddingLeft = u + "em"; var m = oe.makeVList({ positionType: "firstBaseline", children: [{ type: "elem", elem: r, wrapperClasses: ["svg-align"] }, { type: "kern", size: -(r.height + d) }, { type: "elem", elem: l }, { type: "kern", size: c }] }, e); if (t.index) { var p = e.havingStyle(G.SCRIPTSCRIPT), f = Me(t.index, p, e), g = .6 * (m.height - m.depth), v = oe.makeVList({ positionType: "shift", positionData: -g, children: [{ type: "elem", elem: f }] }, e), y = oe.makeSpan(["root"], [v]); return oe.makeSpan(["mord", "sqrt"], [y, m], e) } return oe.makeSpan(["mord", "sqrt"], [m], e) }, mathmlBuilder: function (t, e) { var r = t.body, n = t.index; return n ? new Ce.MathNode("mroot", [Oe(r, e), Oe(n, e)]) : new Ce.MathNode("msqrt", [Oe(r, e)]) } }); var $r = { display: G.DISPLAY, text: G.TEXT, script: G.SCRIPT, scriptscript: G.SCRIPTSCRIPT }; d({ type: "styling", names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], props: { numArgs: 0, allowedInText: !0 }, handler: function (t) { var e = t.breakOnTokenText, r = t.funcName, n = t.parser, i = n.parseExpression(!0, e), a = r.slice(1, r.length - 5); return { type: "styling", mode: n.mode, style: a, body: i } }, htmlBuilder: function (t, e) { var r = $r[t.style], n = e.havingStyle(r).withFont(""); return M(t.body, n, e) }, mathmlBuilder: function (t, e) { var r = $r[t.style], n = e.havingStyle(r), i = Pe(t.body, n), a = new Ce.MathNode("mstyle", i), o = { display: ["0", "true"], text: ["0", "false"], script: ["1", "false"], scriptscript: ["2", "false"] }[t.style]; return a.setAttribute("scriptlevel", o[0]), a.setAttribute("displaystyle", o[1]), a } }), m({ type: "supsub", htmlBuilder: function (t, e) { var r = function (t, e) { var r = t.base; return r ? "op" === r.type ? r.limits && (e.style.size === G.DISPLAY.size || r.alwaysHandleSupSub) ? Vr : null : "operatorname" === r.type ? r.alwaysHandleSupSub && (e.style.size === G.DISPLAY.size || r.limits) ? Xr : null : "accent" === r.type ? B.isCharacterBox(r.base) ? We : null : "horizBrace" === r.type && !t.sub === r.isOver ? Fr : null : null }(t, e); if (r) return r(t, e); var n, i, a, o = t.base, s = t.sup, l = t.sub, c = Me(o, e), u = e.fontMetrics(), h = 0, d = 0, m = o && B.isCharacterBox(o); if (s) { var p = e.havingStyle(e.style.sup()); n = Me(s, p, e), m || (h = c.height - p.fontMetrics().supDrop * p.sizeMultiplier / e.sizeMultiplier) } if (l) { var f = e.havingStyle(e.style.sub()); i = Me(l, f, e), m || (d = c.depth + f.fontMetrics().subDrop * f.sizeMultiplier / e.sizeMultiplier) } a = e.style === G.DISPLAY ? u.sup1 : e.style.cramped ? u.sup3 : u.sup2; var g, v = e.sizeMultiplier, y = .5 / u.ptPerEm / v + "em", b = null; if (i) { var x = t.base && "op" === t.base.type && t.base.name && ("\\oiint" === t.base.name || "\\oiiint" === t.base.name); (c instanceof at || x) && (b = -c.italic + "em") } if (n && i) { h = Math.max(h, a, n.depth + .25 * u.xHeight), d = Math.max(d, u.sub2); var w = 4 * u.defaultRuleThickness; if (h - n.depth - (i.height - d) < w) { d = w - (h - n.depth) + i.height; var k = .8 * u.xHeight - (h - n.depth); k > 0 && (h += k, d -= k) } var S = [{ type: "elem", elem: i, shift: d, marginRight: y, marginLeft: b }, { type: "elem", elem: n, shift: -h, marginRight: y }]; g = oe.makeVList({ positionType: "individualShift", children: S }, e) } else if (i) { d = Math.max(d, u.sub1, i.height - .8 * u.xHeight); var A = [{ type: "elem", elem: i, marginLeft: b, marginRight: y }]; g = oe.makeVList({ positionType: "shift", positionData: d, children: A }, e) } else { if (!n) throw new Error("supsub must have either sup or sub."); h = Math.max(h, a, n.depth + .25 * u.xHeight), g = oe.makeVList({ positionType: "shift", positionData: -h, children: [{ type: "elem", elem: n, marginRight: y }] }, e) } var E = Ae(c, "right") || "mord"; return oe.makeSpan([E], [c, oe.makeSpan(["msupsub"], [g])], e) }, mathmlBuilder: function (t, e) { var r, n = !1, i = l(t.base, "horizBrace"); i && !!t.sup === i.isOver && (n = !0, r = i.isOver), !t.base || "op" !== t.base.type && "operatorname" !== t.base.type || (t.base.parentIsSupSub = !0); var a, o = [Oe(t.base, e)]; if (t.sub && o.push(Oe(t.sub, e)), t.sup && o.push(Oe(t.sup, e)), n) a = r ? "mover" : "munder"; else if (t.sub) if (t.sup) { var s = t.base; a = s && "op" === s.type && s.limits && e.style === G.DISPLAY ? "munderover" : s && "operatorname" === s.type && s.alwaysHandleSupSub && (e.style === G.DISPLAY || s.limits) ? "munderover" : "msubsup" } else { var c = t.base; a = c && "op" === c.type && c.limits && (e.style === G.DISPLAY || c.alwaysHandleSupSub) ? "munder" : c && "operatorname" === c.type && c.alwaysHandleSupSub && (c.limits || e.style === G.DISPLAY) ? "munder" : "msub" } else { var u = t.base; a = u && "op" === u.type && u.limits && (e.style === G.DISPLAY || u.alwaysHandleSupSub) ? "mover" : u && "operatorname" === u.type && u.alwaysHandleSupSub && (u.limits || e.style === G.DISPLAY) ? "mover" : "msup" } return new Ce.MathNode(a, o) } }), m({ type: "atom", htmlBuilder: function (t, e) { return oe.mathsym(t.text, t.mode, e, ["m" + t.family]) }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mo", [Le(t.text, t.mode)]); if ("bin" === t.family) { var n = Ne(t, e); "bold-italic" === n && r.setAttribute("mathvariant", n) } else "punct" === t.family ? r.setAttribute("separator", "true") : "open" !== t.family && "close" !== t.family || r.setAttribute("stretchy", "false"); return r } }); var Zr = { mi: "italic", mn: "normal", mtext: "normal" }; m({ type: "mathord", htmlBuilder: function (t, e) { return oe.makeOrd(t, e, "mathord") }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mi", [Le(t.text, t.mode, e)]), n = Ne(t, e) || "italic"; return n !== Zr[r.type] && r.setAttribute("mathvariant", n), r } }), m({ type: "textord", htmlBuilder: function (t, e) { return oe.makeOrd(t, e, "textord") }, mathmlBuilder: function (t, e) { var r, n = Le(t.text, t.mode, e), i = Ne(t, e) || "normal"; return r = "text" === t.mode ? new Ce.MathNode("mtext", [n]) : /[0-9]/.test(t.text) ? new Ce.MathNode("mn", [n]) : "\\prime" === t.text ? new Ce.MathNode("mo", [n]) : new Ce.MathNode("mi", [n]), i !== Zr[r.type] && r.setAttribute("mathvariant", i), r } }); var Jr = { "\\nobreak": "nobreak", "\\allowbreak": "allowbreak" }, Qr = { " ": {}, "\\ ": {}, "~": { className: "nobreak" }, "\\space": {}, "\\nobreakspace": { className: "nobreak" } }; m({ type: "spacing", htmlBuilder: function (t, e) { if (Qr.hasOwnProperty(t.text)) { var r = Qr[t.text].className || ""; if ("text" === t.mode) { var n = oe.makeOrd(t, e, "textord"); return n.classes.push(r), n } return oe.makeSpan(["mspace", r], [oe.mathsym(t.text, t.mode, e)], e) } if (Jr.hasOwnProperty(t.text)) return oe.makeSpan(["mspace", Jr[t.text]], [], e); throw new z('Unknown type of space "' + t.text + '"') }, mathmlBuilder: function (t) { if (!Qr.hasOwnProperty(t.text)) { if (Jr.hasOwnProperty(t.text)) return new Ce.MathNode("mspace"); throw new z('Unknown type of space "' + t.text + '"') } return new Ce.MathNode("mtext", [new Ce.TextNode("\xa0")]) } }); var tn = function () { var t = new Ce.MathNode("mtd", []); return t.setAttribute("width", "50%"), t }; m({ type: "tag", mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mtable", [new Ce.MathNode("mtr", [tn(), new Ce.MathNode("mtd", [Ie(t.body, e)]), tn(), new Ce.MathNode("mtd", [Ie(t.tag, e)])])]); return r.setAttribute("width", "100%"), r } }); var en = { "\\text": void 0, "\\textrm": "textrm", "\\textsf": "textsf", "\\texttt": "texttt", "\\textnormal": "textrm" }, rn = { "\\textbf": "textbf", "\\textmd": "textmd" }, nn = { "\\textit": "textit", "\\textup": "textup" }, an = function (t, e) { var r = t.font; return r ? en[r] ? e.withTextFontFamily(en[r]) : rn[r] ? e.withTextFontWeight(rn[r]) : e.withTextFontShape(nn[r]) : e }; d({ type: "text", names: ["\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", "\\textbf", "\\textmd", "\\textit", "\\textup"], props: { numArgs: 1, argTypes: ["text"], greediness: 2, allowedInText: !0 }, handler: function (t, e) { var r = t.parser, n = t.funcName, i = e[0]; return { type: "text", mode: r.mode, body: fe(i), font: n } }, htmlBuilder: function (t, e) { var r = an(t, e), n = we(t.body, r, !0); return oe.makeSpan(["mord", "text"], oe.tryCombineChars(n), r) }, mathmlBuilder: function (t, e) { var r = an(t, e); return Ie(t.body, r) } }), d({ type: "underline", names: ["\\underline"], props: { numArgs: 1, allowedInText: !0 }, handler: function (t, e) { return { type: "underline", mode: t.parser.mode, body: e[0] } }, htmlBuilder: function (t, e) { var r = Me(t.body, e), n = oe.makeLineSpan("underline-line", e), i = e.fontMetrics().defaultRuleThickness, a = oe.makeVList({ positionType: "top", positionData: r.height, children: [{ type: "kern", size: i }, { type: "elem", elem: n }, { type: "kern", size: 3 * i }, { type: "elem", elem: r }] }, e); return oe.makeSpan(["mord", "underline"], [a], e) }, mathmlBuilder: function (t, e) { var r = new Ce.MathNode("mo", [new Ce.TextNode("\u203e")]); r.setAttribute("stretchy", "true"); var n = new Ce.MathNode("munder", [Oe(t.body, e), r]); return n.setAttribute("accentunder", "true"), n } }), d({ type: "verb", names: ["\\verb"], props: { numArgs: 0, allowedInText: !0 }, handler: function () { throw new z("\\verb ended by end of line instead of matching delimiter") }, htmlBuilder: function (t, e) { for (var r = on(t), n = [], i = e.havingStyle(e.style.text()), a = 0; a < r.length; a++) { var o = r[a]; "~" === o && (o = "\\textasciitilde"), n.push(oe.makeSymbol(o, "Typewriter-Regular", t.mode, i, ["mord", "texttt"])) } return oe.makeSpan(["mord", "text"].concat(i.sizingClasses(e)), oe.tryCombineChars(n), i) }, mathmlBuilder: function (t) { var e = new Ce.TextNode(on(t)), r = new Ce.MathNode("mtext", [e]); return r.setAttribute("mathvariant", "monospace"), r } }); var on = function (t) { return t.body.replace(/ /g, t.star ? "\u2423" : "\xa0") }, sn = de, ln = new RegExp("^(\\\\[a-zA-Z@]+)[ \r\n\t]*$"), cn = new RegExp("[\u0300-\u036f]+$"), un = "([ \r\n\t]+)|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff][\u0300-\u036f]*|[\ud800-\udbff][\udc00-\udfff][\u0300-\u036f]*|\\\\verb\\*([^]).*?\\3|\\\\verb([^*a-zA-Z]).*?\\4|\\\\operatorname\\*|\\\\[a-zA-Z@]+[ \r\n\t]*|\\\\[^\ud800-\udfff])", hn = function () { function t(t, e) { this.input = void 0, this.settings = void 0, this.tokenRegex = void 0, this.catcodes = void 0, this.input = t, this.settings = e, this.tokenRegex = new RegExp(un, "g"), this.catcodes = { "%": 14 } } var e = t.prototype; return e.setCatcode = function (t, e) { this.catcodes[t] = e }, e.lex = function () { var t = this.input, e = this.tokenRegex.lastIndex; if (e === t.length) return new C("EOF", new T(this, e, e)); var r = this.tokenRegex.exec(t); if (null === r || r.index !== e) throw new z("Unexpected character: '" + t[e] + "'", new C(t[e], new T(this, e, e + 1))); var n = r[2] || " "; if (14 === this.catcodes[n]) { var i = t.indexOf("\n", this.tokenRegex.lastIndex); return -1 === i ? (this.tokenRegex.lastIndex = t.length, this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")) : this.tokenRegex.lastIndex = i + 1, this.lex() } var a = n.match(ln); return a && (n = a[1]), new C(n, new T(this, e, this.tokenRegex.lastIndex)) }, t }(), dn = function () { function t(t, e) { void 0 === t && (t = {}), void 0 === e && (e = {}), this.current = void 0, this.builtins = void 0, this.undefStack = void 0, this.current = e, this.builtins = t, this.undefStack = [] } var e = t.prototype; return e.beginGroup = function () { this.undefStack.push({}) }, e.endGroup = function () { if (0 === this.undefStack.length) throw new z("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug"); var t = this.undefStack.pop(); for (var e in t) t.hasOwnProperty(e) && (void 0 === t[e] ? delete this.current[e] : this.current[e] = t[e]) }, e.has = function (t) { return this.current.hasOwnProperty(t) || this.builtins.hasOwnProperty(t) }, e.get = function (t) { return this.current.hasOwnProperty(t) ? this.current[t] : this.builtins[t] }, e.set = function (t, e, r) { if (void 0 === r && (r = !1), r) { for (var n = 0; n < this.undefStack.length; n++)delete this.undefStack[n][t]; this.undefStack.length > 0 && (this.undefStack[this.undefStack.length - 1][t] = e) } else { var i = this.undefStack[this.undefStack.length - 1]; i && !i.hasOwnProperty(t) && (i[t] = this.current[t]) } this.current[t] = e }, t }(), mn = {}, pn = mn; R("\\@firstoftwo", function (t) { return { tokens: t.consumeArgs(2)[0], numArgs: 0 } }), R("\\@secondoftwo", function (t) { return { tokens: t.consumeArgs(2)[1], numArgs: 0 } }), R("\\@ifnextchar", function (t) { var e = t.consumeArgs(3), r = t.future(); return 1 === e[0].length && e[0][0].text === r.text ? { tokens: e[1], numArgs: 0 } : { tokens: e[2], numArgs: 0 } }), R("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"), R("\\TextOrMath", function (t) { var e = t.consumeArgs(2); return "text" === t.mode ? { tokens: e[0], numArgs: 0 } : { tokens: e[1], numArgs: 0 } }); var fn = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, a: 10, A: 10, b: 11, B: 11, c: 12, C: 12, d: 13, D: 13, e: 14, E: 14, f: 15, F: 15 }; R("\\char", function (t) { var e, r = t.popToken(), n = ""; if ("'" === r.text) e = 8, r = t.popToken(); else if ('"' === r.text) e = 16, r = t.popToken(); else if ("`" === r.text) if ("\\" === (r = t.popToken()).text[0]) n = r.text.charCodeAt(1); else { if ("EOF" === r.text) throw new z("\\char` missing argument"); n = r.text.charCodeAt(0) } else e = 10; if (e) { if (null == (n = fn[r.text]) || n >= e) throw new z("Invalid base-" + e + " digit " + r.text); for (var i; null != (i = fn[t.future().text]) && i < e;)n *= e, n += i, t.popToken() } return "\\@char{" + n + "}" }); var gn = function (t, e) { var r = t.consumeArgs(1)[0]; if (1 !== r.length) throw new z("\\gdef's first argument must be a macro name"); var n = r[0].text, i = 0; for (r = t.consumeArgs(1)[0]; 1 === r.length && "#" === r[0].text;) { if (1 !== (r = t.consumeArgs(1)[0]).length) throw new z('Invalid argument number length "' + r.length + '"'); if (!/^[1-9]$/.test(r[0].text)) throw new z('Invalid argument number "' + r[0].text + '"'); if (i++, parseInt(r[0].text) !== i) throw new z('Argument number "' + r[0].text + '" out of order'); r = t.consumeArgs(1)[0] } return t.macros.set(n, { tokens: r, numArgs: i }, e), "" }; R("\\gdef", function (t) { return gn(t, !0) }), R("\\def", function (t) { return gn(t, !1) }), R("\\global", function (t) { var e = t.consumeArgs(1)[0]; if (1 !== e.length) throw new z("Invalid command after \\global"); var r = e[0].text; if ("\\def" === r) return gn(t, !0); throw new z("Invalid command '" + r + "' after \\global") }); var vn = function (t, e, r) { var n = t.consumeArgs(1)[0]; if (1 !== n.length) throw new z("\\newcommand's first argument must be a macro name"); var i = n[0].text, a = t.isDefined(i); if (a && !e) throw new z("\\newcommand{" + i + "} attempting to redefine " + i + "; use \\renewcommand"); if (!a && !r) throw new z("\\renewcommand{" + i + "} when command " + i + " does not yet exist; use \\newcommand"); var o = 0; if (1 === (n = t.consumeArgs(1)[0]).length && "[" === n[0].text) { for (var s = "", l = t.expandNextToken(); "]" !== l.text && "EOF" !== l.text;)s += l.text, l = t.expandNextToken(); if (!s.match(/^\s*[0-9]+\s*$/)) throw new z("Invalid number of arguments: " + s); o = parseInt(s), n = t.consumeArgs(1)[0] } return t.macros.set(i, { tokens: n, numArgs: o }), "" }; R("\\newcommand", function (t) { return vn(t, !1, !0) }), R("\\renewcommand", function (t) { return vn(t, !0, !1) }), R("\\providecommand", function (t) { return vn(t, !0, !0) }), R("\\bgroup", "{"), R("\\egroup", "}"), R("\\lq", "`"), R("\\rq", "'"), R("\\aa", "\\r a"), R("\\AA", "\\r A"), R("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`\xa9}"), R("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"), R("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"), R("\u212c", "\\mathscr{B}"), R("\u2130", "\\mathscr{E}"), R("\u2131", "\\mathscr{F}"), R("\u210b", "\\mathscr{H}"), R("\u2110", "\\mathscr{I}"), R("\u2112", "\\mathscr{L}"), R("\u2133", "\\mathscr{M}"), R("\u211b", "\\mathscr{R}"), R("\u212d", "\\mathfrak{C}"), R("\u210c", "\\mathfrak{H}"), R("\u2128", "\\mathfrak{Z}"), R("\\Bbbk", "\\Bbb{k}"), R("\xb7", "\\cdotp"), R("\\llap", "\\mathllap{\\textrm{#1}}"), R("\\rlap", "\\mathrlap{\\textrm{#1}}"), R("\\clap", "\\mathclap{\\textrm{#1}}"), R("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'), R("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"), R("\\ne", "\\neq"), R("\u2260", "\\neq"), R("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"), R("\u2209", "\\notin"), R("\u2258", "\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"), R("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"), R("\u225a", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"), R("\u225b", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"), R("\u225d", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"), R("\u225e", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"), R("\u225f", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"), R("\u27c2", "\\perp"), R("\u203c", "\\mathclose{!\\mkern-0.8mu!}"), R("\u220c", "\\notni"), R("\u231c", "\\ulcorner"), R("\u231d", "\\urcorner"), R("\u231e", "\\llcorner"), R("\u231f", "\\lrcorner"), R("\xa9", "\\copyright"), R("\xae", "\\textregistered"), R("\ufe0f", "\\textregistered"), R("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}"), R("\u22ee", "\\vdots"), R("\\varGamma", "\\mathit{\\Gamma}"), R("\\varDelta", "\\mathit{\\Delta}"), R("\\varTheta", "\\mathit{\\Theta}"), R("\\varLambda", "\\mathit{\\Lambda}"), R("\\varXi", "\\mathit{\\Xi}"), R("\\varPi", "\\mathit{\\Pi}"), R("\\varSigma", "\\mathit{\\Sigma}"), R("\\varUpsilon", "\\mathit{\\Upsilon}"), R("\\varPhi", "\\mathit{\\Phi}"), R("\\varPsi", "\\mathit{\\Psi}"), R("\\varOmega", "\\mathit{\\Omega}"), R("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"), R("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"), R("\\boxed", "\\fbox{$\\displaystyle{#1}$}"), R("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"), R("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"), R("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); var yn = { ",": "\\dotsc", "\\not": "\\dotsb", "+": "\\dotsb", "=": "\\dotsb", "<": "\\dotsb", ">": "\\dotsb", "-": "\\dotsb", "*": "\\dotsb", ":": "\\dotsb", "\\DOTSB": "\\dotsb", "\\coprod": "\\dotsb", "\\bigvee": "\\dotsb", "\\bigwedge": "\\dotsb", "\\biguplus": "\\dotsb", "\\bigcap": "\\dotsb", "\\bigcup": "\\dotsb", "\\prod": "\\dotsb", "\\sum": "\\dotsb", "\\bigotimes": "\\dotsb", "\\bigoplus": "\\dotsb", "\\bigodot": "\\dotsb", "\\bigsqcup": "\\dotsb", "\\And": "\\dotsb", "\\longrightarrow": "\\dotsb", "\\Longrightarrow": "\\dotsb", "\\longleftarrow": "\\dotsb", "\\Longleftarrow": "\\dotsb", "\\longleftrightarrow": "\\dotsb", "\\Longleftrightarrow": "\\dotsb", "\\mapsto": "\\dotsb", "\\longmapsto": "\\dotsb", "\\hookrightarrow": "\\dotsb", "\\doteq": "\\dotsb", "\\mathbin": "\\dotsb", "\\mathrel": "\\dotsb", "\\relbar": "\\dotsb", "\\Relbar": "\\dotsb", "\\xrightarrow": "\\dotsb", "\\xleftarrow": "\\dotsb", "\\DOTSI": "\\dotsi", "\\int": "\\dotsi", "\\oint": "\\dotsi", "\\iint": "\\dotsi", "\\iiint": "\\dotsi", "\\iiiint": "\\dotsi", "\\idotsint": "\\dotsi", "\\DOTSX": "\\dotsx" }; R("\\dots", function (t) { var e = "\\dotso", r = t.expandAfterFuture().text; return r in yn ? e = yn[r] : "\\not" === r.substr(0, 4) ? e = "\\dotsb" : r in gt.math && B.contains(["bin", "rel"], gt.math[r].group) && (e = "\\dotsb"), e }); var bn = { ")": !0, "]": !0, "\\rbrack": !0, "\\}": !0, "\\rbrace": !0, "\\rangle": !0, "\\rceil": !0, "\\rfloor": !0, "\\rgroup": !0, "\\rmoustache": !0, "\\right": !0, "\\bigr": !0, "\\biggr": !0, "\\Bigr": !0, "\\Biggr": !0, $: !0, ";": !0, ".": !0, ",": !0 }; R("\\dotso", function (t) { return t.future().text in bn ? "\\ldots\\," : "\\ldots" }), R("\\dotsc", function (t) { var e = t.future().text; return e in bn && "," !== e ? "\\ldots\\," : "\\ldots" }), R("\\cdots", function (t) { return t.future().text in bn ? "\\@cdots\\," : "\\@cdots" }), R("\\dotsb", "\\cdots"), R("\\dotsm", "\\cdots"), R("\\dotsi", "\\!\\cdots"), R("\\dotsx", "\\ldots\\,"), R("\\DOTSI", "\\relax"), R("\\DOTSB", "\\relax"), R("\\DOTSX", "\\relax"), R("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"), R("\\,", "\\tmspace+{3mu}{.1667em}"), R("\\thinspace", "\\,"), R("\\>", "\\mskip{4mu}"), R("\\:", "\\tmspace+{4mu}{.2222em}"), R("\\medspace", "\\:"), R("\\;", "\\tmspace+{5mu}{.2777em}"), R("\\thickspace", "\\;"), R("\\!", "\\tmspace-{3mu}{.1667em}"), R("\\negthinspace", "\\!"), R("\\negmedspace", "\\tmspace-{4mu}{.2222em}"), R("\\negthickspace", "\\tmspace-{5mu}{.277em}"), R("\\enspace", "\\kern.5em "), R("\\enskip", "\\hskip.5em\\relax"), R("\\quad", "\\hskip1em\\relax"), R("\\qquad", "\\hskip2em\\relax"), R("\\tag", "\\@ifstar\\tag@literal\\tag@paren"), R("\\tag@paren", "\\tag@literal{({#1})}"), R("\\tag@literal", function (t) { if (t.macros.get("\\df@tag")) throw new z("Multiple \\tag"); return "\\gdef\\df@tag{\\text{#1}}" }), R("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"), R("\\pod", "\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"), R("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"), R("\\mod", "\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"), R("\\pmb", "\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"), R("\\\\", "\\newline"), R("\\TeX", "\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}"); var xn = ct["Main-Regular"]["T".charCodeAt(0)][1] - .7 * ct["Main-Regular"]["A".charCodeAt(0)][1] + "em"; R("\\LaTeX", "\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{" + xn + "}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"), R("\\KaTeX", "\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{" + xn + "}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"), R("\\hspace", "\\@ifstar\\@hspacer\\@hspace"), R("\\@hspace", "\\hskip #1\\relax"), R("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"), R("\\ordinarycolon", ":"), R("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"), R("\\dblcolon", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'), R("\\coloneqq", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'), R("\\Coloneqq", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'), R("\\coloneq", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'), R("\\Coloneq", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'), R("\\eqqcolon", '\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'), R("\\Eqqcolon", '\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'), R("\\eqcolon", '\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'), R("\\Eqcolon", '\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'), R("\\colonapprox", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'), R("\\Colonapprox", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'), R("\\colonsim", '\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'), R("\\Colonsim", '\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'), R("\u2237", "\\dblcolon"), R("\u2239", "\\eqcolon"), R("\u2254", "\\coloneqq"), R("\u2255", "\\eqqcolon"), R("\u2a74", "\\Coloneqq"), R("\\ratio", "\\vcentcolon"), R("\\coloncolon", "\\dblcolon"), R("\\colonequals", "\\coloneqq"), R("\\coloncolonequals", "\\Coloneqq"), R("\\equalscolon", "\\eqqcolon"), R("\\equalscoloncolon", "\\Eqqcolon"), R("\\colonminus", "\\coloneq"), R("\\coloncolonminus", "\\Coloneq"), R("\\minuscolon", "\\eqcolon"), R("\\minuscoloncolon", "\\Eqcolon"), R("\\coloncolonapprox", "\\Colonapprox"), R("\\coloncolonsim", "\\Colonsim"), R("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"), R("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"), R("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"), R("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"), R("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"), R("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"), R("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"), R("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"), R("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}"), + R("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}"), R("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}"), R("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}"), R("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}"), R("\\nshortmid", "\\html@mathml{\\@nshortmid}{\u2224}"), R("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{\u2226}"), R("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}"), R("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"), R("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{\u228a}"), R("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{\u2acb}"), R("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{\u228b}"), R("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{\u2acc}"), R("\\llbracket", "\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"), R("\\rrbracket", "\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"), R("\u27e6", "\\llbracket"), R("\u27e7", "\\rrbracket"), R("\\lBrace", "\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"), R("\\rBrace", "\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"), R("\u2983", "\\lBrace"), R("\u2984", "\\rBrace"), R("\\darr", "\\downarrow"), R("\\dArr", "\\Downarrow"), R("\\Darr", "\\Downarrow"), R("\\lang", "\\langle"), R("\\rang", "\\rangle"), R("\\uarr", "\\uparrow"), R("\\uArr", "\\Uparrow"), R("\\Uarr", "\\Uparrow"), R("\\N", "\\mathbb{N}"), R("\\R", "\\mathbb{R}"), R("\\Z", "\\mathbb{Z}"), R("\\alef", "\\aleph"), R("\\alefsym", "\\aleph"), R("\\Alpha", "\\mathrm{A}"), R("\\Beta", "\\mathrm{B}"), R("\\bull", "\\bullet"), R("\\Chi", "\\mathrm{X}"), R("\\clubs", "\\clubsuit"), R("\\cnums", "\\mathbb{C}"), R("\\Complex", "\\mathbb{C}"), R("\\Dagger", "\\ddagger"), R("\\diamonds", "\\diamondsuit"), R("\\empty", "\\emptyset"), R("\\Epsilon", "\\mathrm{E}"), R("\\Eta", "\\mathrm{H}"), R("\\exist", "\\exists"), R("\\harr", "\\leftrightarrow"), R("\\hArr", "\\Leftrightarrow"), R("\\Harr", "\\Leftrightarrow"), R("\\hearts", "\\heartsuit"), R("\\image", "\\Im"), R("\\infin", "\\infty"), R("\\Iota", "\\mathrm{I}"), R("\\isin", "\\in"), R("\\Kappa", "\\mathrm{K}"), R("\\larr", "\\leftarrow"), R("\\lArr", "\\Leftarrow"), R("\\Larr", "\\Leftarrow"), R("\\lrarr", "\\leftrightarrow"), R("\\lrArr", "\\Leftrightarrow"), R("\\Lrarr", "\\Leftrightarrow"), R("\\Mu", "\\mathrm{M}"), R("\\natnums", "\\mathbb{N}"), R("\\Nu", "\\mathrm{N}"), R("\\Omicron", "\\mathrm{O}"), R("\\plusmn", "\\pm"), R("\\rarr", "\\rightarrow"), R("\\rArr", "\\Rightarrow"), R("\\Rarr", "\\Rightarrow"), R("\\real", "\\Re"), R("\\reals", "\\mathbb{R}"), R("\\Reals", "\\mathbb{R}"), R("\\Rho", "\\mathrm{P}"), R("\\sdot", "\\cdot"), R("\\sect", "\\S"), R("\\spades", "\\spadesuit"), R("\\sub", "\\subset"), R("\\sube", "\\subseteq"), R("\\supe", "\\supseteq"), R("\\Tau", "\\mathrm{T}"), R("\\thetasym", "\\vartheta"), R("\\weierp", "\\wp"), R("\\Zeta", "\\mathrm{Z}"), R("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"), R("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"), R("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"), R("\\blue", "\\textcolor{##6495ed}{#1}"), R("\\orange", "\\textcolor{##ffa500}{#1}"), R("\\pink", "\\textcolor{##ff00af}{#1}"), R("\\red", "\\textcolor{##df0030}{#1}"), R("\\green", "\\textcolor{##28ae7b}{#1}"), R("\\gray", "\\textcolor{gray}{#1}"), R("\\purple", "\\textcolor{##9d38bd}{#1}"), R("\\blueA", "\\textcolor{##ccfaff}{#1}"), R("\\blueB", "\\textcolor{##80f6ff}{#1}"), R("\\blueC", "\\textcolor{##63d9ea}{#1}"), R("\\blueD", "\\textcolor{##11accd}{#1}"), R("\\blueE", "\\textcolor{##0c7f99}{#1}"), R("\\tealA", "\\textcolor{##94fff5}{#1}"), R("\\tealB", "\\textcolor{##26edd5}{#1}"), R("\\tealC", "\\textcolor{##01d1c1}{#1}"), R("\\tealD", "\\textcolor{##01a995}{#1}"), R("\\tealE", "\\textcolor{##208170}{#1}"), R("\\greenA", "\\textcolor{##b6ffb0}{#1}"), R("\\greenB", "\\textcolor{##8af281}{#1}"), R("\\greenC", "\\textcolor{##74cf70}{#1}"), R("\\greenD", "\\textcolor{##1fab54}{#1}"), R("\\greenE", "\\textcolor{##0d923f}{#1}"), R("\\goldA", "\\textcolor{##ffd0a9}{#1}"), R("\\goldB", "\\textcolor{##ffbb71}{#1}"), R("\\goldC", "\\textcolor{##ff9c39}{#1}"), R("\\goldD", "\\textcolor{##e07d10}{#1}"), R("\\goldE", "\\textcolor{##a75a05}{#1}"), R("\\redA", "\\textcolor{##fca9a9}{#1}"), R("\\redB", "\\textcolor{##ff8482}{#1}"), R("\\redC", "\\textcolor{##f9685d}{#1}"), R("\\redD", "\\textcolor{##e84d39}{#1}"), R("\\redE", "\\textcolor{##bc2612}{#1}"), R("\\maroonA", "\\textcolor{##ffbde0}{#1}"), R("\\maroonB", "\\textcolor{##ff92c6}{#1}"), R("\\maroonC", "\\textcolor{##ed5fa6}{#1}"), R("\\maroonD", "\\textcolor{##ca337c}{#1}"), R("\\maroonE", "\\textcolor{##9e034e}{#1}"), R("\\purpleA", "\\textcolor{##ddd7ff}{#1}"), R("\\purpleB", "\\textcolor{##c6b9fc}{#1}"), R("\\purpleC", "\\textcolor{##aa87ff}{#1}"), R("\\purpleD", "\\textcolor{##7854ab}{#1}"), R("\\purpleE", "\\textcolor{##543b78}{#1}"), R("\\mintA", "\\textcolor{##f5f9e8}{#1}"), R("\\mintB", "\\textcolor{##edf2df}{#1}"), R("\\mintC", "\\textcolor{##e0e5cc}{#1}"), R("\\grayA", "\\textcolor{##f6f7f7}{#1}"), R("\\grayB", "\\textcolor{##f0f1f2}{#1}"), R("\\grayC", "\\textcolor{##e3e5e6}{#1}"), R("\\grayD", "\\textcolor{##d6d8da}{#1}"), R("\\grayE", "\\textcolor{##babec2}{#1}"), R("\\grayF", "\\textcolor{##888d93}{#1}"), R("\\grayG", "\\textcolor{##626569}{#1}"), R("\\grayH", "\\textcolor{##3b3e40}{#1}"), R("\\grayI", "\\textcolor{##21242c}{#1}"), R("\\kaBlue", "\\textcolor{##314453}{#1}"), R("\\kaGreen", "\\textcolor{##71B307}{#1}"); var wn = { "\\relax": !0, "^": !0, _: !0, "\\limits": !0, "\\nolimits": !0 }, kn = function () { function t(t, e, r) { this.settings = void 0, this.expansionCount = void 0, this.lexer = void 0, this.macros = void 0, this.stack = void 0, this.mode = void 0, this.settings = e, this.expansionCount = 0, this.feed(t), this.macros = new dn(pn, e.macros), this.mode = r, this.stack = [] } var e = t.prototype; return e.feed = function (t) { this.lexer = new hn(t, this.settings) }, e.switchMode = function (t) { this.mode = t }, e.beginGroup = function () { this.macros.beginGroup() }, e.endGroup = function () { this.macros.endGroup() }, e.future = function () { return 0 === this.stack.length && this.pushToken(this.lexer.lex()), this.stack[this.stack.length - 1] }, e.popToken = function () { return this.future(), this.stack.pop() }, e.pushToken = function (t) { this.stack.push(t) }, e.pushTokens = function (t) { var e; (e = this.stack).push.apply(e, t) }, e.consumeSpaces = function () { for (; " " === this.future().text;)this.stack.pop() }, e.consumeArgs = function (t) { for (var e = [], r = 0; r < t; ++r) { this.consumeSpaces(); var n = this.popToken(); if ("{" === n.text) { for (var i = [], a = 1; 0 !== a;) { var o = this.popToken(); if (i.push(o), "{" === o.text) ++a; else if ("}" === o.text) --a; else if ("EOF" === o.text) throw new z("End of input in macro argument", n) } i.pop(), i.reverse(), e[r] = i } else { if ("EOF" === n.text) throw new z("End of input expecting macro argument"); e[r] = [n] } } return e }, e.expandOnce = function () { var t = this.popToken(), e = t.text, r = this._getExpansion(e); if (null == r) return this.pushToken(t), t; if (this.expansionCount++, this.expansionCount > this.settings.maxExpand) throw new z("Too many expansions: infinite loop or need to increase maxExpand setting"); var n = r.tokens; if (r.numArgs) for (var i = this.consumeArgs(r.numArgs), a = (n = n.slice()).length - 1; a >= 0; --a) { var o = n[a]; if ("#" === o.text) { if (0 === a) throw new z("Incomplete placeholder at end of macro body", o); if ("#" === (o = n[--a]).text) n.splice(a + 1, 1); else { if (!/^[1-9]$/.test(o.text)) throw new z("Not a valid argument number", o); var s; (s = n).splice.apply(s, [a, 2].concat(i[+o.text - 1])) } } } return this.pushTokens(n), n }, e.expandAfterFuture = function () { return this.expandOnce(), this.future() }, e.expandNextToken = function () { for (; ;) { var t = this.expandOnce(); if (t instanceof C) { if ("\\relax" !== t.text) return this.stack.pop(); this.stack.pop() } } throw new Error }, e.expandMacro = function (t) { if (this.macros.get(t)) { var e = [], r = this.stack.length; for (this.pushToken(new C(t)); this.stack.length > r;)this.expandOnce() instanceof C && e.push(this.stack.pop()); return e } }, e.expandMacroAsText = function (t) { var e = this.expandMacro(t); return e ? e.map(function (t) { return t.text }).join("") : e }, e._getExpansion = function (t) { var e = this.macros.get(t); if (null == e) return e; var r = "function" == typeof e ? e(this) : e; if ("string" == typeof r) { var n = 0; if (-1 !== r.indexOf("#")) for (var i = r.replace(/##/g, ""); -1 !== i.indexOf("#" + (n + 1));)++n; for (var a = new hn(r, this.settings), o = [], s = a.lex(); "EOF" !== s.text;)o.push(s), s = a.lex(); return o.reverse(), { tokens: o, numArgs: n } } return r }, e.isDefined = function (t) { return this.macros.has(t) || sn.hasOwnProperty(t) || gt.math.hasOwnProperty(t) || gt.text.hasOwnProperty(t) || wn.hasOwnProperty(t) }, t }(), Sn = { "\u0301": { text: "\\'", math: "\\acute" }, "\u0300": { text: "\\`", math: "\\grave" }, "\u0308": { text: '\\"', math: "\\ddot" }, "\u0303": { text: "\\~", math: "\\tilde" }, "\u0304": { text: "\\=", math: "\\bar" }, "\u0306": { text: "\\u", math: "\\breve" }, "\u030c": { text: "\\v", math: "\\check" }, "\u0302": { text: "\\^", math: "\\hat" }, "\u0307": { text: "\\.", math: "\\dot" }, "\u030a": { text: "\\r", math: "\\mathring" }, "\u030b": { text: "\\H" } }, An = { "\xe1": "a\u0301", "\xe0": "a\u0300", "\xe4": "a\u0308", "\u01df": "a\u0308\u0304", "\xe3": "a\u0303", "\u0101": "a\u0304", "\u0103": "a\u0306", "\u1eaf": "a\u0306\u0301", "\u1eb1": "a\u0306\u0300", "\u1eb5": "a\u0306\u0303", "\u01ce": "a\u030c", "\xe2": "a\u0302", "\u1ea5": "a\u0302\u0301", "\u1ea7": "a\u0302\u0300", "\u1eab": "a\u0302\u0303", "\u0227": "a\u0307", "\u01e1": "a\u0307\u0304", "\xe5": "a\u030a", "\u01fb": "a\u030a\u0301", "\u1e03": "b\u0307", "\u0107": "c\u0301", "\u010d": "c\u030c", "\u0109": "c\u0302", "\u010b": "c\u0307", "\u010f": "d\u030c", "\u1e0b": "d\u0307", "\xe9": "e\u0301", "\xe8": "e\u0300", "\xeb": "e\u0308", "\u1ebd": "e\u0303", "\u0113": "e\u0304", "\u1e17": "e\u0304\u0301", "\u1e15": "e\u0304\u0300", "\u0115": "e\u0306", "\u011b": "e\u030c", "\xea": "e\u0302", "\u1ebf": "e\u0302\u0301", "\u1ec1": "e\u0302\u0300", "\u1ec5": "e\u0302\u0303", "\u0117": "e\u0307", "\u1e1f": "f\u0307", "\u01f5": "g\u0301", "\u1e21": "g\u0304", "\u011f": "g\u0306", "\u01e7": "g\u030c", "\u011d": "g\u0302", "\u0121": "g\u0307", "\u1e27": "h\u0308", "\u021f": "h\u030c", "\u0125": "h\u0302", "\u1e23": "h\u0307", "\xed": "i\u0301", "\xec": "i\u0300", "\xef": "i\u0308", "\u1e2f": "i\u0308\u0301", "\u0129": "i\u0303", "\u012b": "i\u0304", "\u012d": "i\u0306", "\u01d0": "i\u030c", "\xee": "i\u0302", "\u01f0": "j\u030c", "\u0135": "j\u0302", "\u1e31": "k\u0301", "\u01e9": "k\u030c", "\u013a": "l\u0301", "\u013e": "l\u030c", "\u1e3f": "m\u0301", "\u1e41": "m\u0307", "\u0144": "n\u0301", "\u01f9": "n\u0300", "\xf1": "n\u0303", "\u0148": "n\u030c", "\u1e45": "n\u0307", "\xf3": "o\u0301", "\xf2": "o\u0300", "\xf6": "o\u0308", "\u022b": "o\u0308\u0304", "\xf5": "o\u0303", "\u1e4d": "o\u0303\u0301", "\u1e4f": "o\u0303\u0308", "\u022d": "o\u0303\u0304", "\u014d": "o\u0304", "\u1e53": "o\u0304\u0301", "\u1e51": "o\u0304\u0300", "\u014f": "o\u0306", "\u01d2": "o\u030c", "\xf4": "o\u0302", "\u1ed1": "o\u0302\u0301", "\u1ed3": "o\u0302\u0300", "\u1ed7": "o\u0302\u0303", "\u022f": "o\u0307", "\u0231": "o\u0307\u0304", "\u0151": "o\u030b", "\u1e55": "p\u0301", "\u1e57": "p\u0307", "\u0155": "r\u0301", "\u0159": "r\u030c", "\u1e59": "r\u0307", "\u015b": "s\u0301", "\u1e65": "s\u0301\u0307", "\u0161": "s\u030c", "\u1e67": "s\u030c\u0307", "\u015d": "s\u0302", "\u1e61": "s\u0307", "\u1e97": "t\u0308", "\u0165": "t\u030c", "\u1e6b": "t\u0307", "\xfa": "u\u0301", "\xf9": "u\u0300", "\xfc": "u\u0308", "\u01d8": "u\u0308\u0301", "\u01dc": "u\u0308\u0300", "\u01d6": "u\u0308\u0304", "\u01da": "u\u0308\u030c", "\u0169": "u\u0303", "\u1e79": "u\u0303\u0301", "\u016b": "u\u0304", "\u1e7b": "u\u0304\u0308", "\u016d": "u\u0306", "\u01d4": "u\u030c", "\xfb": "u\u0302", "\u016f": "u\u030a", "\u0171": "u\u030b", "\u1e7d": "v\u0303", "\u1e83": "w\u0301", "\u1e81": "w\u0300", "\u1e85": "w\u0308", "\u0175": "w\u0302", "\u1e87": "w\u0307", "\u1e98": "w\u030a", "\u1e8d": "x\u0308", "\u1e8b": "x\u0307", "\xfd": "y\u0301", "\u1ef3": "y\u0300", "\xff": "y\u0308", "\u1ef9": "y\u0303", "\u0233": "y\u0304", "\u0177": "y\u0302", "\u1e8f": "y\u0307", "\u1e99": "y\u030a", "\u017a": "z\u0301", "\u017e": "z\u030c", "\u1e91": "z\u0302", "\u017c": "z\u0307", "\xc1": "A\u0301", "\xc0": "A\u0300", "\xc4": "A\u0308", "\u01de": "A\u0308\u0304", "\xc3": "A\u0303", "\u0100": "A\u0304", "\u0102": "A\u0306", "\u1eae": "A\u0306\u0301", "\u1eb0": "A\u0306\u0300", "\u1eb4": "A\u0306\u0303", "\u01cd": "A\u030c", "\xc2": "A\u0302", "\u1ea4": "A\u0302\u0301", "\u1ea6": "A\u0302\u0300", "\u1eaa": "A\u0302\u0303", "\u0226": "A\u0307", "\u01e0": "A\u0307\u0304", "\xc5": "A\u030a", "\u01fa": "A\u030a\u0301", "\u1e02": "B\u0307", "\u0106": "C\u0301", "\u010c": "C\u030c", "\u0108": "C\u0302", "\u010a": "C\u0307", "\u010e": "D\u030c", "\u1e0a": "D\u0307", "\xc9": "E\u0301", "\xc8": "E\u0300", "\xcb": "E\u0308", "\u1ebc": "E\u0303", "\u0112": "E\u0304", "\u1e16": "E\u0304\u0301", "\u1e14": "E\u0304\u0300", "\u0114": "E\u0306", "\u011a": "E\u030c", "\xca": "E\u0302", "\u1ebe": "E\u0302\u0301", "\u1ec0": "E\u0302\u0300", "\u1ec4": "E\u0302\u0303", "\u0116": "E\u0307", "\u1e1e": "F\u0307", "\u01f4": "G\u0301", "\u1e20": "G\u0304", "\u011e": "G\u0306", "\u01e6": "G\u030c", "\u011c": "G\u0302", "\u0120": "G\u0307", "\u1e26": "H\u0308", "\u021e": "H\u030c", "\u0124": "H\u0302", "\u1e22": "H\u0307", "\xcd": "I\u0301", "\xcc": "I\u0300", "\xcf": "I\u0308", "\u1e2e": "I\u0308\u0301", "\u0128": "I\u0303", "\u012a": "I\u0304", "\u012c": "I\u0306", "\u01cf": "I\u030c", "\xce": "I\u0302", "\u0130": "I\u0307", "\u0134": "J\u0302", "\u1e30": "K\u0301", "\u01e8": "K\u030c", "\u0139": "L\u0301", "\u013d": "L\u030c", "\u1e3e": "M\u0301", "\u1e40": "M\u0307", "\u0143": "N\u0301", "\u01f8": "N\u0300", "\xd1": "N\u0303", "\u0147": "N\u030c", "\u1e44": "N\u0307", "\xd3": "O\u0301", "\xd2": "O\u0300", "\xd6": "O\u0308", "\u022a": "O\u0308\u0304", "\xd5": "O\u0303", "\u1e4c": "O\u0303\u0301", "\u1e4e": "O\u0303\u0308", "\u022c": "O\u0303\u0304", "\u014c": "O\u0304", "\u1e52": "O\u0304\u0301", "\u1e50": "O\u0304\u0300", "\u014e": "O\u0306", "\u01d1": "O\u030c", "\xd4": "O\u0302", "\u1ed0": "O\u0302\u0301", "\u1ed2": "O\u0302\u0300", "\u1ed6": "O\u0302\u0303", "\u022e": "O\u0307", "\u0230": "O\u0307\u0304", "\u0150": "O\u030b", "\u1e54": "P\u0301", "\u1e56": "P\u0307", "\u0154": "R\u0301", "\u0158": "R\u030c", "\u1e58": "R\u0307", "\u015a": "S\u0301", "\u1e64": "S\u0301\u0307", "\u0160": "S\u030c", "\u1e66": "S\u030c\u0307", "\u015c": "S\u0302", "\u1e60": "S\u0307", "\u0164": "T\u030c", "\u1e6a": "T\u0307", "\xda": "U\u0301", "\xd9": "U\u0300", "\xdc": "U\u0308", "\u01d7": "U\u0308\u0301", "\u01db": "U\u0308\u0300", "\u01d5": "U\u0308\u0304", "\u01d9": "U\u0308\u030c", "\u0168": "U\u0303", "\u1e78": "U\u0303\u0301", "\u016a": "U\u0304", "\u1e7a": "U\u0304\u0308", "\u016c": "U\u0306", "\u01d3": "U\u030c", "\xdb": "U\u0302", "\u016e": "U\u030a", "\u0170": "U\u030b", "\u1e7c": "V\u0303", "\u1e82": "W\u0301", "\u1e80": "W\u0300", "\u1e84": "W\u0308", "\u0174": "W\u0302", "\u1e86": "W\u0307", "\u1e8c": "X\u0308", "\u1e8a": "X\u0307", "\xdd": "Y\u0301", "\u1ef2": "Y\u0300", "\u0178": "Y\u0308", "\u1ef8": "Y\u0303", "\u0232": "Y\u0304", "\u0176": "Y\u0302", "\u1e8e": "Y\u0307", "\u0179": "Z\u0301", "\u017d": "Z\u030c", "\u1e90": "Z\u0302", "\u017b": "Z\u0307", "\u03ac": "\u03b1\u0301", "\u1f70": "\u03b1\u0300", "\u1fb1": "\u03b1\u0304", "\u1fb0": "\u03b1\u0306", "\u03ad": "\u03b5\u0301", "\u1f72": "\u03b5\u0300", "\u03ae": "\u03b7\u0301", "\u1f74": "\u03b7\u0300", "\u03af": "\u03b9\u0301", "\u1f76": "\u03b9\u0300", "\u03ca": "\u03b9\u0308", "\u0390": "\u03b9\u0308\u0301", "\u1fd2": "\u03b9\u0308\u0300", "\u1fd1": "\u03b9\u0304", "\u1fd0": "\u03b9\u0306", "\u03cc": "\u03bf\u0301", "\u1f78": "\u03bf\u0300", "\u03cd": "\u03c5\u0301", "\u1f7a": "\u03c5\u0300", "\u03cb": "\u03c5\u0308", "\u03b0": "\u03c5\u0308\u0301", "\u1fe2": "\u03c5\u0308\u0300", "\u1fe1": "\u03c5\u0304", "\u1fe0": "\u03c5\u0306", "\u03ce": "\u03c9\u0301", "\u1f7c": "\u03c9\u0300", "\u038e": "\u03a5\u0301", "\u1fea": "\u03a5\u0300", "\u03ab": "\u03a5\u0308", "\u1fe9": "\u03a5\u0304", "\u1fe8": "\u03a5\u0306", "\u038f": "\u03a9\u0301", "\u1ffa": "\u03a9\u0300" }, En = function () { function t(t, e) { this.mode = void 0, this.gullet = void 0, this.settings = void 0, this.leftrightDepth = void 0, this.nextToken = void 0, this.mode = "math", this.gullet = new kn(t, e, this.mode), this.settings = e, this.leftrightDepth = 0 } var e = t.prototype; return e.expect = function (t, e) { if (void 0 === e && (e = !0), this.fetch().text !== t) throw new z("Expected '" + t + "', got '" + this.fetch().text + "'", this.fetch()); e && this.consume() }, e.consume = function () { this.nextToken = null }, e.fetch = function () { return null == this.nextToken && (this.nextToken = this.gullet.expandNextToken()), this.nextToken }, e.switchMode = function (t) { this.mode = t, this.gullet.switchMode(t) }, e.parse = function () { this.gullet.beginGroup(), this.settings.colorIsTextColor && this.gullet.macros.set("\\color", "\\textcolor"); var t = this.parseExpression(!1); return this.expect("EOF"), this.gullet.endGroup(), t }, e.parseExpression = function (e, r) { for (var n = []; ;) { "math" === this.mode && this.consumeSpaces(); var i = this.fetch(); if (-1 !== t.endOfExpression.indexOf(i.text)) break; if (r && i.text === r) break; if (e && sn[i.text] && sn[i.text].infix) break; var a = this.parseAtom(r); if (!a) break; n.push(a) } return "text" === this.mode && this.formLigatures(n), this.handleInfixNodes(n) }, e.handleInfixNodes = function (t) { for (var e, r = -1, n = 0; n < t.length; n++) { var i = l(t[n], "infix"); if (i) { if (-1 !== r) throw new z("only one infix operator per group", i.token); r = n, e = i.replaceWith } } if (-1 !== r && e) { var a, o, s = t.slice(0, r), c = t.slice(r + 1); return a = 1 === s.length && "ordgroup" === s[0].type ? s[0] : { type: "ordgroup", mode: this.mode, body: s }, o = 1 === c.length && "ordgroup" === c[0].type ? c[0] : { type: "ordgroup", mode: this.mode, body: c }, ["\\\\abovefrac" === e ? this.callFunction(e, [a, t[r], o], []) : this.callFunction(e, [a, o], [])] } return t }, e.handleSupSubscript = function (e) { var r = this.fetch(), n = r.text; this.consume(); var i = this.parseGroup(e, !1, t.SUPSUB_GREEDINESS, void 0, void 0, !0); if (!i) throw new z("Expected group after '" + n + "'", r); return i }, e.formatUnsupportedCmd = function (t) { for (var e = [], r = 0; r < t.length; r++)e.push({ type: "textord", mode: "text", text: t[r] }); var n = { type: "text", mode: this.mode, body: e }; return { type: "color", mode: this.mode, color: this.settings.errorColor, body: [n] } }, e.parseAtom = function (t) { var e, r, n = this.parseGroup("atom", !1, null, t); if ("text" === this.mode) return n; for (; ;) { this.consumeSpaces(); var i = this.fetch(); if ("\\limits" === i.text || "\\nolimits" === i.text) { var a = l(n, "op"); if (a) { var o = "\\limits" === i.text; a.limits = o, a.alwaysHandleSupSub = !0 } else { if (!(a = l(n, "operatorname")) || !a.alwaysHandleSupSub) throw new z("Limit controls must follow a math operator", i); var s = "\\limits" === i.text; a.limits = s } this.consume() } else if ("^" === i.text) { if (e) throw new z("Double superscript", i); e = this.handleSupSubscript("superscript") } else if ("_" === i.text) { if (r) throw new z("Double subscript", i); r = this.handleSupSubscript("subscript") } else { if ("'" !== i.text) break; if (e) throw new z("Double superscript", i); var c = { type: "textord", mode: this.mode, text: "\\prime" }, u = [c]; for (this.consume(); "'" === this.fetch().text;)u.push(c), this.consume(); "^" === this.fetch().text && u.push(this.handleSupSubscript("superscript")), e = { type: "ordgroup", mode: this.mode, body: u } } } return e || r ? { type: "supsub", mode: this.mode, base: n, sup: e, sub: r } : n }, e.parseFunction = function (t, e, r) { var n = this.fetch(), i = n.text, a = sn[i]; if (!a) return null; if (this.consume(), null != r && a.greediness <= r) throw new z("Got function '" + i + "' with no arguments" + (e ? " as " + e : ""), n); if ("text" === this.mode && !a.allowedInText) throw new z("Can't use function '" + i + "' in text mode", n); if ("math" === this.mode && !1 === a.allowedInMath) throw new z("Can't use function '" + i + "' in math mode", n); var o = this.parseArguments(i, a), s = o.args, l = o.optArgs; return this.callFunction(i, s, l, n, t) }, e.callFunction = function (t, e, r, n, i) { var a = { funcName: t, parser: this, token: n, breakOnTokenText: i }, o = sn[t]; if (o && o.handler) return o.handler(a, e, r); throw new z("No function handler for " + t) }, e.parseArguments = function (t, e) { var r = e.numArgs + e.numOptionalArgs; if (0 === r) return { args: [], optArgs: [] }; for (var n = e.greediness, i = [], a = [], o = 0; o < r; o++) { var s = e.argTypes && e.argTypes[o], l = o < e.numOptionalArgs, c = o > 0 && !l || 0 === o && !l && "math" === this.mode, u = this.parseGroupOfType("argument to '" + t + "'", s, l, n, c); if (!u) { if (l) { a.push(null); continue } throw new z("Expected group after '" + t + "'", this.fetch()) } (l ? a : i).push(u) } return { args: i, optArgs: a } }, e.parseGroupOfType = function (t, e, r, n, i) { switch (e) { case "color": return i && this.consumeSpaces(), this.parseColorGroup(r); case "size": return i && this.consumeSpaces(), this.parseSizeGroup(r); case "url": return this.parseUrlGroup(r, i); case "math": case "text": return this.parseGroup(t, r, n, void 0, e, i); case "hbox": var a = this.parseGroup(t, r, n, void 0, "text", i); return a ? { type: "styling", mode: a.mode, body: [a], style: "text" } : a; case "raw": if (i && this.consumeSpaces(), r && "{" === this.fetch().text) return null; var o = this.parseStringGroup("raw", r, !0); if (o) return { type: "raw", mode: "text", string: o.text }; throw new z("Expected raw group", this.fetch()); case "original": case null: case void 0: return this.parseGroup(t, r, n, void 0, void 0, i); default: throw new z("Unknown group type as " + t, this.fetch()) } }, e.consumeSpaces = function () { for (; " " === this.fetch().text;)this.consume() }, e.parseStringGroup = function (t, e, r) { var n = e ? "[" : "{", i = e ? "]" : "}", a = this.fetch(); if (a.text !== n) { if (e) return null; if (r && "EOF" !== a.text && /[^{}[\]]/.test(a.text)) return this.consume(), a } var o = this.mode; this.mode = "text", this.expect(n); for (var s, l = "", c = this.fetch(), u = 0, h = c; (s = this.fetch()).text !== i || r && u > 0;) { switch (s.text) { case "EOF": throw new z("Unexpected end of input in " + t, c.range(h, l)); case n: u++; break; case i: u-- }l += (h = s).text, this.consume() } return this.expect(i), this.mode = o, c.range(h, l) }, e.parseRegexGroup = function (t, e) { var r = this.mode; this.mode = "text"; for (var n, i = this.fetch(), a = i, o = ""; "EOF" !== (n = this.fetch()).text && t.test(o + n.text);)o += (a = n).text, this.consume(); if ("" === o) throw new z("Invalid " + e + ": '" + i.text + "'", i); return this.mode = r, i.range(a, o) }, e.parseColorGroup = function (t) { var e = this.parseStringGroup("color", t); if (!e) return null; var r = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text); if (!r) throw new z("Invalid color: '" + e.text + "'", e); var n = r[0]; return /^[0-9a-f]{6}$/i.test(n) && (n = "#" + n), { type: "color-token", mode: this.mode, color: n } }, e.parseSizeGroup = function (t) { var e, r = !1; if (!(e = t || "{" === this.fetch().text ? this.parseStringGroup("size", t) : this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"))) return null; t || 0 !== e.text.length || (e.text = "0pt", r = !0); var n = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e.text); if (!n) throw new z("Invalid size: '" + e.text + "'", e); var i = { number: +(n[1] + n[2]), unit: n[3] }; if (!Yt(i)) throw new z("Invalid unit: '" + i.unit + "'", e); return { type: "size", mode: this.mode, value: i, isBlank: r } }, e.parseUrlGroup = function (t) { this.gullet.lexer.setCatcode("%", 13); var e = this.parseStringGroup("url", t, !0); if (this.gullet.lexer.setCatcode("%", 14), !e) return null; var r = e.text.replace(/\\([#$%&~_^{}])/g, "$1"); return { type: "url", mode: this.mode, url: r } }, e.parseGroup = function (e, r, n, i, a, o) { var s = this.mode; a && this.switchMode(a), o && this.consumeSpaces(); var l, c = this.fetch(), u = c.text; if (r ? "[" === u : "{" === u || "\\begingroup" === u) { this.consume(); var h = t.endOfGroup[u]; this.gullet.beginGroup(); var d = this.parseExpression(!1, h), m = this.fetch(); this.expect(h), this.gullet.endGroup(), l = { type: "ordgroup", mode: this.mode, loc: T.range(c, m), body: d, semisimple: "\\begingroup" === u || void 0 } } else if (r) l = null; else if (null == (l = this.parseFunction(i, e, n) || this.parseSymbol()) && "\\" === u[0] && !wn.hasOwnProperty(u)) { if (this.settings.throwOnError) throw new z("Undefined control sequence: " + u, c); l = this.formatUnsupportedCmd(u), this.consume() } return a && this.switchMode(s), l }, e.formLigatures = function (t) { for (var e = t.length - 1, r = 0; r < e; ++r) { var n = t[r], i = n.text; "-" === i && "-" === t[r + 1].text && (r + 1 < e && "-" === t[r + 2].text ? (t.splice(r, 3, { type: "textord", mode: "text", loc: T.range(n, t[r + 2]), text: "---" }), e -= 2) : (t.splice(r, 2, { type: "textord", mode: "text", loc: T.range(n, t[r + 1]), text: "--" }), e -= 1)), "'" !== i && "`" !== i || t[r + 1].text !== i || (t.splice(r, 2, { type: "textord", mode: "text", loc: T.range(n, t[r + 1]), text: i + i }), e -= 1) } }, e.parseSymbol = function () { var t = this.fetch(), e = t.text; if (/^\\verb[^a-zA-Z]/.test(e)) { this.consume(); var r = e.slice(5), i = "*" === r.charAt(0); if (i && (r = r.slice(1)), r.length < 2 || r.charAt(0) !== r.slice(-1)) throw new z("\\verb assertion failed --\n please report what input caused this bug"); return { type: "verb", mode: "text", body: r = r.slice(1, -1), star: i } } An.hasOwnProperty(e[0]) && !gt[this.mode][e[0]] && (this.settings.strict && "math" === this.mode && this.settings.reportNonstrict("unicodeTextInMathMode", 'Accented Unicode text character "' + e[0] + '" used in math mode', t), e = An[e[0]] + e.substr(1)); var a, o = cn.exec(e); if (o && ("i" === (e = e.substring(0, o.index)) ? e = "\u0131" : "j" === e && (e = "\u0237")), gt[this.mode][e]) { this.settings.strict && "math" === this.mode && "\xc7\xd0\xde\xe7\xfe".indexOf(e) >= 0 && this.settings.reportNonstrict("unicodeTextInMathMode", 'Latin-1/Unicode text character "' + e[0] + '" used in math mode', t); var s, l = gt[this.mode][e].group, c = T.range(t); if (mt.hasOwnProperty(l)) { var u = l; s = { type: "atom", mode: this.mode, family: u, loc: c, text: e } } else s = { type: l, mode: this.mode, loc: c, text: e }; a = s } else { if (!(e.charCodeAt(0) >= 128)) return null; this.settings.strict && (n(e.charCodeAt(0)) ? "math" === this.mode && this.settings.reportNonstrict("unicodeTextInMathMode", 'Unicode text character "' + e[0] + '" used in math mode', t) : this.settings.reportNonstrict("unknownSymbol", 'Unrecognized Unicode character "' + e[0] + '" (' + e.charCodeAt(0) + ")", t)), a = { type: "textord", mode: "text", loc: T.range(t), text: e } } if (this.consume(), o) for (var h = 0; h < o[0].length; h++) { var d = o[0][h]; if (!Sn[d]) throw new z("Unknown accent ' " + d + "'", t); var m = Sn[d][this.mode]; if (!m) throw new z("Accent " + d + " unsupported in " + this.mode + " mode", t); a = { type: "accent", mode: this.mode, loc: T.range(t), label: m, isStretchy: !1, isShifty: !0, base: a } } return a }, t }(); En.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"], En.endOfGroup = { "[": "]", "{": "}", "\\begingroup": "\\endgroup" }, En.SUPSUB_GREEDINESS = 1; var Mn = function (t, e) { if (!("string" == typeof t || t instanceof String)) throw new TypeError("KaTeX can only parse string typed expression"); var r = new En(t, e); delete r.gullet.macros.current["\\df@tag"]; var n = r.parse(); if (r.gullet.macros.get("\\df@tag")) { if (!e.displayMode) throw new z("\\tag works only in display equations"); r.gullet.feed("\\df@tag"), n = [{ type: "tag", mode: "text", body: n, tag: r.parse() }] } return n }, Rn = function (t, e, r) { e.textContent = ""; var n = Cn(t, r).toNode(); e.appendChild(n) }; "undefined" != typeof document && "CSS1Compat" !== document.compatMode && ("undefined" != typeof console && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."), Rn = function () { throw new z("KaTeX doesn't work in quirks mode.") }); var Tn = function (t, e, r) { if (r.throwOnError || !(t instanceof z)) throw t; var n = oe.makeSpan(["katex-error"], [new at(e)]); return n.setAttribute("title", t.toString()), n.setAttribute("style", "color:" + r.errorColor), n }, Cn = function (t, e) { var r = new q(e); try { var n = Mn(t, r); return De(n, t, r) } catch (e) { return Tn(e, t, r) } }, Ln = { version: "0.11.1", render: Rn, renderToString: function (t, e) { return Cn(t, e).toMarkup() }, ParseError: z, __parse: function (t, e) { var r = new q(e); return Mn(t, r) }, __renderToDomTree: Cn, __renderToHTMLTree: function (t, e) { var r = new q(e); try { return function (t, e, r) { var n = f(t, Be(r)), i = oe.makeSpan(["katex"], [n]); return qe(i, r) }(Mn(t, r), 0, r) } catch (e) { return Tn(e, t, r) } }, __setFontMetrics: function (t, e) { ct[t] = e }, __defineSymbol: o, __defineMacro: R, __domTree: { Span: et, Anchor: rt, SymbolNode: at, SvgNode: ot, PathNode: st, LineNode: lt } }; e["default"] = Ln + }])["default"] +}), function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e(require("katex")) : "function" == typeof define && define.amd ? define(["katex"], e) : "object" == typeof exports ? exports.renderMathInElement = e(require("katex")) : t.renderMathInElement = e(t.katex) }("undefined" != typeof self ? self : this, function (t) { return function (t) { function e(n) { if (r[n]) return r[n].exports; var i = r[n] = { i: n, l: !1, exports: {} }; return t[n].call(i.exports, i, i.exports, e), i.l = !0, i.exports } var r = {}; return e.m = t, e.c = r, e.d = function (t, r, n) { e.o(t, r) || Object.defineProperty(t, r, { enumerable: !0, get: n }) }, e.r = function (t) { "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(t, "__esModule", { value: !0 }) }, e.t = function (t, r) { if (1 & r && (t = e(t)), 8 & r) return t; if (4 & r && "object" == typeof t && t && t.__esModule) return t; var n = Object.create(null); if (e.r(n), Object.defineProperty(n, "default", { enumerable: !0, value: t }), 2 & r && "string" != typeof t) for (var i in t) e.d(n, i, function (e) { return t[e] }.bind(null, i)); return n }, e.n = function (t) { var r = t && t.__esModule ? function () { return t["default"] } : function () { return t }; return e.d(r, "a", r), r }, e.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, e.p = "", e(e.s = 1) }([function (e) { e.exports = t }, function (t, e, r) { "use strict"; r.r(e); var n = r(0), i = r.n(n), a = function (t, e, r) { for (var n = r, i = 0, a = t.length; n < e.length;) { var o = e[n]; if (i <= 0 && e.slice(n, n + a) === t) return n; "\\" === o ? n++ : "{" === o ? i++ : "}" === o && i--, n++ } return -1 }, o = function (t, e, r, n) { for (var i = [], o = 0; o < t.length; o++)if ("text" === t[o].type) { var s = t[o].data, l = !0, c = 0, u = void 0; for (-1 !== (u = s.indexOf(e)) && (c = u, i.push({ type: "text", data: s.slice(0, c) }), l = !1); ;) { if (l) { if (-1 === (u = s.indexOf(e, c))) break; i.push({ type: "text", data: s.slice(c, u) }), c = u } else { if (-1 === (u = a(r, s, c + e.length))) break; i.push({ type: "math", data: s.slice(c + e.length, u), rawData: s.slice(c, u + r.length), display: n }), c = u + r.length } l = !l } i.push({ type: "text", data: s.slice(c) }) } else i.push(t[o]); return i }, s = function (t, e) { for (var r = function (t, e) { for (var r = [{ type: "text", data: t }], n = 0; n < e.length; n++) { var i = e[n]; r = o(r, i.left, i.right, i.display || !1) } return r }(t, e.delimiters), n = document.createDocumentFragment(), a = 0; a < r.length; a++)if ("text" === r[a].type) n.appendChild(document.createTextNode(r[a].data)); else { var s = document.createElement("span"), l = r[a].data; e.displayMode = r[a].display; try { e.preProcess && (l = e.preProcess(l)), i.a.render(l, s, e) } catch (t) { if (!(t instanceof i.a.ParseError)) throw t; e.errorCallback("KaTeX auto-render: Failed to parse `" + r[a].data + "` with ", t), n.appendChild(document.createTextNode(r[a].rawData)); continue } n.appendChild(s) } return n }; e["default"] = function (t, e) { if (!t) throw new Error("No element provided to render"); var r = {}; for (var n in e) e.hasOwnProperty(n) && (r[n] = e[n]); r.delimiters = r.delimiters || [{ left: "$$", right: "$$", display: !0 }, { left: "\\(", right: "\\)", display: !1 }, { left: "\\[", right: "\\]", display: !0 }], r.ignoredTags = r.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code"], r.ignoredClasses = r.ignoredClasses || [], r.errorCallback = r.errorCallback || console.error, r.macros = r.macros || {}, function i(t, e) { for (var r = 0; r < t.childNodes.length; r++) { var n = t.childNodes[r]; if (3 === n.nodeType) { var a = s(n.textContent, e); r += a.childNodes.length - 1, t.replaceChild(a, n) } else 1 === n.nodeType && function () { var t = " " + n.className + " "; -1 === e.ignoredTags.indexOf(n.nodeName.toLowerCase()) && e.ignoredClasses.every(function (e) { return -1 === t.indexOf(" " + e + " ") }) && i(n, e) }() } }(t, r) } }])["default"] }), function (t, e) { "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).Reveal = e() }(this, function () { + "use strict"; function t(t, e) { var r = Object.keys(t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(t); e && (n = n.filter(function (e) { return Object.getOwnPropertyDescriptor(t, e).enumerable })), r.push.apply(r, n) } return r } function e(e) { for (var r = 1; r < arguments.length; r++) { var n = null != arguments[r] ? arguments[r] : {}; r % 2 ? t(Object(n), !0).forEach(function (t) { s(e, t, n[t]) }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : t(Object(n)).forEach(function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) }) } return e } function r(t) { return (r = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t })(t) } function n(t, e, r, n, i, a, o) { try { var s = t[a](o), l = s.value } catch (t) { return void r(t) } s.done ? e(l) : Promise.resolve(l).then(n, i) } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function a(t, e) { for (var r = 0; r < e.length; r++) { var n = e[r]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(t, n.key, n) } } function o(t, e, r) { return e && a(t.prototype, e), r && a(t, r), t } function s(t, e, r) { return e in t ? Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = r, t } function l(t) { return function (t) { if (Array.isArray(t)) return c(t) }(t) || function (t) { if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t) }(t) || function (t, e) { if (t) { if ("string" == typeof t) return c(t, e); var r = Object.prototype.toString.call(t).slice(8, -1); return "Object" === r && t.constructor && (r = t.constructor.name), "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? c(t, e) : void 0 } }(t) || function () { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") }() } function c(t, e) { (null == e || e > t.length) && (e = t.length); for (var r = 0, n = new Array(e); r < e; r++)n[r] = t[r]; return n } function u(t, e) { return RegExp(t, e) } function h(t, n) { + function i(r) { + if (!t) throw 'Unable to find presentation root (
).'; if (Yt.wrapper = t, Yt.slides = t.querySelector(".slides"), !Yt.slides) throw 'Unable to find slides container (
).' + ; return jt = e(e(e(e(e({}, Fm), jt), n), r), Rd()), a(), window.addEventListener("load", L, !1), ue.load(jt.plugins, jt.dependencies).then(o), new Promise(function (t) { return Ht.on("ready", t) }) + } function a() { !0 === jt.embedded ? Yt.viewport = Ad(t, ".reveal-viewport") || t : (Yt.viewport = document.body, document.documentElement.classList.add("reveal-full-page")), Yt.viewport.classList.add("reveal-viewport") } function o() { Ut = !0, s(), l(), p(), d(), m(), X(), f(), oe.readURL(), re.update(!0), setTimeout(function () { Yt.slides.classList.remove("no-transition"), Yt.wrapper.classList.add("ready"), k({ type: "ready", data: { indexh: Ot, indexv: Bt, currentSlide: Dt } }) }, 1), he.isPrintingPDF() && (v(), "complete" === document.readyState ? he.setupPDF() : window.addEventListener("load", function () { he.setupPDF() })) } function s() { jt.showHiddenSlides || bd(Yt.wrapper, 'section[data-visibility="hidden"]').forEach(function (t) { t.parentNode.removeChild(t) }) } function l() { Yt.slides.classList.add("no-transition"), Nd ? Yt.wrapper.classList.add("no-hover") : Yt.wrapper.classList.remove("no-hover"), re.render(), te.render(), se.render(), le.render(), pe.render(), Yt.pauseOverlay = Ed(Yt.wrapper, "div", "pause-overlay", jt.controls ? '' : null), Yt.statusElement = c(), Yt.wrapper.setAttribute("role", "application") } function c() { var t = Yt.wrapper.querySelector(".aria-status"); return t || ((t = document.createElement("div")).style.position = "absolute", t.style.height = "1px", t.style.width = "1px", t.style.overflow = "hidden", t.style.clip = "rect( 1px, 1px, 1px, 1px )", t.classList.add("aria-status"), t.setAttribute("aria-live", "polite"), t.setAttribute("aria-atomic", "true"), Yt.wrapper.appendChild(t)), t } function u(t) { Yt.statusElement.textContent = t } function h(t) { var e = ""; if (3 === t.nodeType) e += t.textContent; else if (1 === t.nodeType) { var r = t.getAttribute("aria-hidden"), n = "none" === window.getComputedStyle(t).display; "true" === r || n || Array.from(t.childNodes).forEach(function (t) { e += h(t) }) } return "" === (e = e.trim()) ? "" : e + " " } function d() { setInterval(function () { 0 === Yt.wrapper.scrollTop && 0 === Yt.wrapper.scrollLeft || (Yt.wrapper.scrollTop = 0, Yt.wrapper.scrollLeft = 0) }, 1e3) } function m() { document.addEventListener("fullscreenchange", Nt), document.addEventListener("webkitfullscreenchange", Nt) } function p() { jt.postMessage && window.addEventListener("message", Rt, !1) } function f(t) { var n = e({}, jt); if ("object" === r(t) && yd(jt, t), !1 !== Ht.isReady()) { var i = Yt.wrapper.querySelectorAll(rm).length; Yt.wrapper.classList.remove(n.transition), Yt.wrapper.classList.add(jt.transition), Yt.wrapper.setAttribute("data-transition-speed", jt.transitionSpeed), Yt.wrapper.setAttribute("data-background-transition", jt.backgroundTransition), Yt.viewport.style.setProperty("--slide-width", jt.width + "px"), Yt.viewport.style.setProperty("--slide-height", jt.height + "px"), jt.shuffle && K(), xd(Yt.wrapper, "embedded", jt.embedded), xd(Yt.wrapper, "rtl", jt.rtl), xd(Yt.wrapper, "center", jt.center), !1 === jt.pause && H(), jt.previewLinks ? (A(), E("[data-preview-link=false]")) : (E(), A("[data-preview-link]:not([data-preview-link=false])")), ee.reset(), Ft && (Ft.destroy(), Ft = null), i > 1 && jt.autoSlide && jt.autoSlideStoppable && ((Ft = new Dm(Yt.wrapper, function () { return Math.min(Math.max((Date.now() - Zt) / Kt, 0), 1) })).on("click", It), Jt = !1), "default" !== jt.navigationMode ? Yt.wrapper.setAttribute("data-navigation-mode", jt.navigationMode) : Yt.wrapper.removeAttribute("data-navigation-mode"), pe.configure(jt, n), de.configure(jt, n), ce.configure(jt, n), se.configure(jt, n), le.configure(jt, n), ae.configure(jt, n), ne.configure(jt, n), te.configure(jt, n), G() } } function g() { window.addEventListener("resize", Lt, !1), jt.touch && me.bind(), jt.keyboard && ae.bind(), jt.progress && le.bind(), jt.respondToHashChanges && oe.bind(), se.bind(), de.bind(), Yt.slides.addEventListener("click", Ct, !1), Yt.slides.addEventListener("transitionend", Tt, !1), Yt.pauseOverlay.addEventListener("click", H, !1), jt.focusBodyOnPageVisibilityChange && document.addEventListener("visibilitychange", zt, !1) } function v() { me.unbind(), de.unbind(), ae.unbind(), se.unbind(), le.unbind(), oe.unbind(), window.removeEventListener("resize", Lt, !1), Yt.slides.removeEventListener("click", Ct, !1), Yt.slides.removeEventListener("transitionend", Tt, !1), Yt.pauseOverlay.removeEventListener("click", H, !1) } function y() { v(), vt(), E(), pe.destroy(), de.destroy(), ue.destroy(), ce.destroy(), se.destroy(), le.destroy(), re.destroy(), te.destroy(), document.removeEventListener("fullscreenchange", Nt), document.removeEventListener("webkitfullscreenchange", Nt), document.removeEventListener("visibilitychange", zt, !1), window.removeEventListener("message", Rt, !1), window.removeEventListener("load", L, !1), Yt.pauseOverlay && Yt.pauseOverlay.remove(), Yt.statusElement && Yt.statusElement.remove(), document.documentElement.classList.remove("reveal-full-page"), Yt.wrapper.classList.remove("ready", "center", "has-horizontal-slides", "has-vertical-slides"), Yt.wrapper.removeAttribute("data-transition-speed"), Yt.wrapper.removeAttribute("data-background-transition"), Yt.viewport.classList.remove("reveal-viewport"), Yt.viewport.style.removeProperty("--slide-width"), Yt.viewport.style.removeProperty("--slide-height"), Yt.slides.style.removeProperty("width"), Yt.slides.style.removeProperty("height"), Yt.slides.style.removeProperty("zoom"), Yt.slides.style.removeProperty("left"), Yt.slides.style.removeProperty("top"), Yt.slides.style.removeProperty("bottom"), Yt.slides.style.removeProperty("right"), Yt.slides.style.removeProperty("transform"), Array.from(Yt.wrapper.querySelectorAll(rm)).forEach(function (t) { t.style.removeProperty("display"), t.style.removeProperty("top"), t.removeAttribute("hidden"), t.removeAttribute("aria-hidden") }) } function b(e, r, n) { t.addEventListener(e, r, n) } function x(e, r, n) { t.removeEventListener(e, r, n) } function w(t) { "string" == typeof t.layout && (Gt.layout = t.layout), "string" == typeof t.overview && (Gt.overview = t.overview), Gt.layout ? kd(Yt.slides, Gt.layout + " " + Gt.overview) : kd(Yt.slides, Gt.overview) } function k(t) { var e = t.target, r = void 0 === e ? Yt.wrapper : e, n = t.type, i = t.data, a = t.bubbles, o = void 0 === a || a, s = document.createEvent("HTMLEvents", 1, 2); return s.initEvent(n, o, !0), yd(s, i), r.dispatchEvent(s), r === Yt.wrapper && S(n), s } function S(t, e) { if (jt.postMessageEvents && window.parent !== window.self) { var r = { namespace: "reveal", eventName: t, state: pt() }; yd(r, e), window.parent.postMessage(JSON.stringify(r), "*") } } function A() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "a"; Array.from(Yt.wrapper.querySelectorAll(t)).forEach(function (t) { /^(http|www)/gi.test(t.getAttribute("href")) && t.addEventListener("click", Pt, !1) }) } function E() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "a"; Array.from(Yt.wrapper.querySelectorAll(t)).forEach(function (t) { /^(http|www)/gi.test(t.getAttribute("href")) && t.removeEventListener("click", Pt, !1) }) } function M(t) { C(), Yt.overlay = document.createElement("div"), Yt.overlay.classList.add("overlay"), Yt.overlay.classList.add("overlay-preview"), Yt.wrapper.appendChild(Yt.overlay), Yt.overlay.innerHTML = '
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site\'s policy (x-frame-options).\n\t\t\t\t\n\t\t\t
'), Yt.overlay.querySelector("iframe").addEventListener("load", function () { Yt.overlay.classList.add("loaded") }, !1), Yt.overlay.querySelector(".close").addEventListener("click", function (t) { C(), t.preventDefault() }, !1), Yt.overlay.querySelector(".external").addEventListener("click", function () { C() }, !1) } function R(t) { "boolean" == typeof t ? t ? T() : C() : Yt.overlay ? C() : T() } function T() { if (jt.help) { C(), Yt.overlay = document.createElement("div"), Yt.overlay.classList.add("overlay"), Yt.overlay.classList.add("overlay-help"), Yt.wrapper.appendChild(Yt.overlay); var t = '

Keyboard Shortcuts


', e = ae.getShortcuts(), r = ae.getBindings(); for (var n in t += "", e) t += ""); for (var i in r) r[i].key && r[i].description && (t += "")); t += "
KEYACTION
".concat(n, "").concat(e[n], "
".concat(r[i].key, "").concat(r[i].description, "
", Yt.overlay.innerHTML = '\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
'.concat(t, "
\n\t\t\t\t
\n\t\t\t"), Yt.overlay.querySelector(".close").addEventListener("click", function (t) { C(), t.preventDefault() }, !1) } } function C() { return !!Yt.overlay && (Yt.overlay.parentNode.removeChild(Yt.overlay), Yt.overlay = null, !0) } function L() { if (Yt.wrapper && !he.isPrintingPDF()) { if (!jt.disableLayout) { Nd && !jt.embedded && document.documentElement.style.setProperty("--vh", .01 * window.innerHeight + "px"); var t = N(), e = Wt; z(jt.width, jt.height), Yt.slides.style.width = t.width + "px", Yt.slides.style.height = t.height + "px", Wt = Math.min(t.presentationWidth / t.width, t.presentationHeight / t.height), Wt = Math.max(Wt, jt.minScale), 1 === (Wt = Math.min(Wt, jt.maxScale)) ? (Yt.slides.style.zoom = "", Yt.slides.style.left = "", Yt.slides.style.top = "", Yt.slides.style.bottom = "", Yt.slides.style.right = "", w({ layout: "" })) : (Yt.slides.style.zoom = "", Yt.slides.style.left = "50%", Yt.slides.style.top = "50%", Yt.slides.style.bottom = "auto", Yt.slides.style.right = "auto", w({ layout: "translate(-50%, -50%) scale(" + Wt + ")" })); for (var r = Array.from(Yt.wrapper.querySelectorAll(rm)), n = 0, i = r.length; n < i; n++) { var a = r[n]; "none" !== a.style.display && (jt.center || a.classList.contains("center") ? a.classList.contains("stack") ? a.style.top = 0 : a.style.top = Math.max((t.height - a.scrollHeight) / 2, 0) + "px" : a.style.top = "") } e !== Wt && k({ type: "resize", data: { oldScale: e, scale: Wt, size: t } }) } Yt.viewport.style.setProperty("--slide-scale", Wt), le.update(), re.updateParallax(), ie.isActive() && ie.update() } } function z(t, e) { bd(Yt.slides, "section > .stretch, section > .r-stretch").forEach(function (r) { var n = Td(r, e); if (/(img|video)/gi.test(r.nodeName)) { var i = r.naturalWidth || r.videoWidth, a = r.naturalHeight || r.videoHeight, o = Math.min(t / i, n / a); r.style.width = i * o + "px", r.style.height = a * o + "px" } else r.style.width = t + "px", r.style.height = n + "px" }) } function N(t, e) { var r = { width: jt.width, height: jt.height, presentationWidth: t || Yt.wrapper.offsetWidth, presentationHeight: e || Yt.wrapper.offsetHeight }; return r.presentationWidth -= r.presentationWidth * jt.margin, r.presentationHeight -= r.presentationHeight * jt.margin, "string" == typeof r.width && /%$/.test(r.width) && (r.width = parseInt(r.width, 10) / 100 * r.presentationWidth), "string" == typeof r.height && /%$/.test(r.height) && (r.height = parseInt(r.height, 10) / 100 * r.presentationHeight), r } function P(t, e) { "object" === r(t) && "function" == typeof t.setAttribute && t.setAttribute("data-previous-indexv", e || 0) } function I(t) { if ("object" === r(t) && "function" == typeof t.setAttribute && t.classList.contains("stack")) { var e = t.hasAttribute("data-start-indexv") ? "data-start-indexv" : "data-previous-indexv"; return parseInt(t.getAttribute(e) || 0, 10) } return 0 } function O() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : Dt; return t && t.parentNode && !!t.parentNode.nodeName.match(/section/i) } function B() { return !(!Dt || !O(Dt) || Dt.nextElementSibling) } function q() { return 0 === Ot && 0 === Bt } function D() { return !(!Dt || Dt.nextElementSibling || O(Dt) && Dt.parentNode.nextElementSibling) } function F() { if (jt.pause) { var t = Yt.wrapper.classList.contains("paused"); vt(), Yt.wrapper.classList.add("paused"), !1 === t && k({ type: "paused" }) } } function H() { var t = Yt.wrapper.classList.contains("paused"); Yt.wrapper.classList.remove("paused"), gt(), t && k({ type: "resumed" }) } function j(t) { "boolean" == typeof t ? t ? F() : H() : U() ? H() : F() } function U() { return Yt.wrapper.classList.contains("paused") } function _(t) { "boolean" == typeof t ? t ? bt() : yt() : Jt ? bt() : yt() } function V() { return !(!Kt || Jt) } function W(t, e, r, n) { if (!k({ type: "beforeslidechange", data: { indexh: void 0 === t ? Ot : t, indexv: void 0 === e ? Bt : e, origin: n } }).defaultPrevented) { qt = Dt; var i = Yt.wrapper.querySelectorAll(nm); if (0 !== i.length) { void 0 !== e || ie.isActive() || (e = I(i[t])), qt && qt.parentNode && qt.parentNode.classList.contains("stack") && P(qt.parentNode, Bt); var a = Vt.concat(); Vt.length = 0; var o = Ot || 0, s = Bt || 0; Ot = $(nm, void 0 === t ? Ot : t), Bt = $(im, void 0 === e ? Bt : e); var l = Ot !== o || Bt !== s; l || (qt = null); var c = i[Ot], d = c.querySelectorAll("section"); Dt = d[Bt] || c; var m = !1; l && qt && Dt && !ie.isActive() && (qt.hasAttribute("data-auto-animate") && Dt.hasAttribute("data-auto-animate") && qt.getAttribute("data-auto-animate-id") === Dt.getAttribute("data-auto-animate-id") && !(Ot > o || Bt > s ? Dt : qt).hasAttribute("data-auto-animate-restart") && (m = !0, Yt.slides.classList.add("disable-slide-transitions")), Xt = "running"), Q(), L(), ie.isActive() && ie.update(), void 0 !== r && ne.goto(r), qt && qt !== Dt && (qt.classList.remove("present"), qt.setAttribute("aria-hidden", "true"), q() && setTimeout(function () { st().forEach(function (t) { P(t, 0) }) }, 0)); t: for (var p = 0, f = Vt.length; p < f; p++) { for (var g = 0; g < a.length; g++)if (a[g] === Vt[p]) { a.splice(g, 1); continue t } Yt.viewport.classList.add(Vt[p]), k({ type: Vt[p] }) } for (; a.length;)Yt.viewport.classList.remove(a.pop()); l && k({ type: "slidechanged", data: { indexh: Ot, indexv: Bt, previousSlide: qt, currentSlide: Dt, origin: n } }), !l && qt || (Qt.stopEmbeddedContent(qt), Qt.startEmbeddedContent(Dt)), requestAnimationFrame(function () { u(h(Dt)) }), le.update(), se.update(), pe.update(), re.update(), re.updateParallax(), te.update(), ne.update(), oe.writeURL(), gt(), m && (setTimeout(function () { Yt.slides.classList.remove("disable-slide-transitions") }, 0), jt.autoAnimate && ee.run(qt, Dt)) } } } function G() { v(), g(), L(), Kt = jt.autoSlide, gt(), re.create(), oe.writeURL(), ne.sortAll(), se.update(), le.update(), Q(), pe.update(), pe.updateVisibility(), re.update(!0), te.update(), Qt.formatEmbeddedContent(), !1 === jt.autoPlayMedia ? Qt.stopEmbeddedContent(Dt, { unloadIframes: !1 }) : Qt.startEmbeddedContent(Dt), ie.isActive() && ie.layout() } function Y() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : Dt; re.sync(t), ne.sync(t), Qt.load(t), re.update(), pe.update() } function X() { at().forEach(function (t) { bd(t, "section").forEach(function (t, e) { e > 0 && (t.classList.remove("present"), t.classList.remove("past"), t.classList.add("future"), t.setAttribute("aria-hidden", "true")) }) }) } function K() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : at(); t.forEach(function (e) { var r = t[Math.floor(Math.random() * t.length)]; r.parentNode === e.parentNode && e.parentNode.insertBefore(e, r); var n = e.querySelectorAll("section"); n.length && K(n) }) } function $(t, e) { var r = bd(Yt.wrapper, t), n = r.length, i = he.isPrintingPDF(), a = !1, o = !1; if (n) { jt.loop && (e >= n && (a = !0), (e %= n) < 0 && (e = n + e, o = !0)), e = Math.max(Math.min(e, n - 1), 0); for (var s = 0; s < n; s++) { var l = r[s], c = jt.rtl && !O(l); l.classList.remove("past"), l.classList.remove("present"), l.classList.remove("future"), l.setAttribute("hidden", ""), l.setAttribute("aria-hidden", "true"), l.querySelector("section") && l.classList.add("stack"), i ? l.classList.add("present") : s < e ? (l.classList.add(c ? "future" : "past"), jt.fragments && Z(l)) : s > e ? (l.classList.add(c ? "past" : "future"), jt.fragments && J(l)) : s === e && jt.fragments && (a ? J(l) : o && Z(l)) } var u = r[e], h = u.classList.contains("present"); u.classList.add("present"), u.removeAttribute("hidden"), u.removeAttribute("aria-hidden"), h || k({ target: u, type: "visible", bubbles: !1 }); var d = u.getAttribute("data-state"); d && (Vt = Vt.concat(d.split(" "))) } else e = 0; return e } function Z(t) { bd(t, ".fragment").forEach(function (t) { t.classList.add("visible"), t.classList.remove("current-fragment") }) } function J(t) { bd(t, ".fragment.visible").forEach(function (t) { t.classList.remove("visible", "current-fragment") }) } function Q() { var t, e = at(), r = e.length; if (r && void 0 !== Ot) { var n = ie.isActive() ? 10 : jt.viewDistance; Nd && (n = ie.isActive() ? 6 : jt.mobileViewDistance), he.isPrintingPDF() && (n = Number.MAX_VALUE); for (var i = 0; i < r; i++) { var a = e[i], o = bd(a, "section"), s = o.length; if (t = Math.abs((Ot || 0) - i) || 0, jt.loop && (t = Math.abs(((Ot || 0) - i) % (r - n)) || 0), t < n ? Qt.load(a) : Qt.unload(a), s) for (var l = I(a), c = 0; c < s; c++) { var u = o[c]; t + (i === (Ot || 0) ? Math.abs((Bt || 0) - c) : Math.abs(c - l)) < n ? Qt.load(u) : Qt.unload(u) } } ct() ? Yt.wrapper.classList.add("has-vertical-slides") : Yt.wrapper.classList.remove("has-vertical-slides"), lt() ? Yt.wrapper.classList.add("has-horizontal-slides") : Yt.wrapper.classList.remove("has-horizontal-slides") } } function tt() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).includeFragments, e = void 0 !== t && t, r = Yt.wrapper.querySelectorAll(nm), n = Yt.wrapper.querySelectorAll(im), i = { left: Ot > 0, right: Ot < r.length - 1, up: Bt > 0, down: Bt < n.length - 1 }; if (jt.loop && (r.length > 1 && (i.left = !0, i.right = !0), n.length > 1 && (i.up = !0, i.down = !0)), r.length > 1 && "linear" === jt.navigationMode && (i.right = i.right || i.down, i.left = i.left || i.up), !0 === e) { var a = ne.availableRoutes(); i.left = i.left || a.prev, i.up = i.up || a.prev, i.down = i.down || a.next, i.right = i.right || a.next } if (jt.rtl) { var o = i.left; i.left = i.right, i.right = o } return i } function et() { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : Dt, e = at(), r = 0; t: for (var n = 0; n < e.length; n++) { for (var i = e[n], a = i.querySelectorAll("section"), o = 0; o < a.length; o++) { if (a[o] === t) break t; "uncounted" !== a[o].dataset.visibility && r++ } if (i === t) break; !1 === i.classList.contains("stack") && "uncounted" !== i.dataset.visibility && r++ } return r } function rt() { var t = ht(), e = et(); if (Dt) { var r = Dt.querySelectorAll(".fragment"); r.length > 0 && (e += Dt.querySelectorAll(".fragment.visible").length / r.length * .9) } return Math.min(e / (t - 1), 1) } function nt(t) { var e, r = Ot, n = Bt; if (t) { var i = O(t), a = i ? t.parentNode : t, o = at(); r = Math.max(o.indexOf(a), 0), n = void 0, i && (n = Math.max(bd(t.parentNode, "section").indexOf(t), 0)) } if (!t && Dt && Dt.querySelectorAll(".fragment").length > 0) { var s = Dt.querySelector(".current-fragment"); e = s && s.hasAttribute("data-fragment-index") ? parseInt(s.getAttribute("data-fragment-index"), 10) : Dt.querySelectorAll(".fragment.visible").length - 1 } return { h: r, v: n, f: e } } function it() { return bd(Yt.wrapper, '.slides section:not(.stack):not([data-visibility="uncounted"])') } function at() { return bd(Yt.wrapper, nm) } function ot() { return bd(Yt.wrapper, ".slides>section>section") } function st() { return bd(Yt.wrapper, ".slides>section.stack") } function lt() { return at().length > 1 } function ct() { return ot().length > 1 } function ut() { return it().map(function (t) { for (var e = {}, r = 0; r < t.attributes.length; r++) { var n = t.attributes[r]; e[n.name] = n.value } return e }) } function ht() { return it().length } function dt(t, e) { var r = at()[t], n = r && r.querySelectorAll("section"); return n && n.length && "number" == typeof e ? n ? n[e] : void 0 : r } function mt(t, e) { var r = "number" == typeof t ? dt(t, e) : t; if (r) return r.slideBackgroundElement } function pt() { var t = nt(); return { indexh: t.h, indexv: t.v, indexf: t.f, paused: U(), overview: ie.isActive() } } function ft(t) { if ("object" === r(t)) { W(wd(t.indexh), wd(t.indexv), wd(t.indexf)); var e = wd(t.paused), n = wd(t.overview); "boolean" == typeof e && e !== U() && j(e), "boolean" == typeof n && n !== ie.isActive() && ie.toggle(n) } } function gt() { if (vt(), Dt && !1 !== jt.autoSlide) { var t = Dt.querySelector(".current-fragment"); t || (t = Dt.querySelector(".fragment")); var e = t ? t.getAttribute("data-autoslide") : null, r = Dt.parentNode ? Dt.parentNode.getAttribute("data-autoslide") : null, n = Dt.getAttribute("data-autoslide"); e ? Kt = parseInt(e, 10) : n ? Kt = parseInt(n, 10) : r ? Kt = parseInt(r, 10) : (Kt = jt.autoSlide, 0 === Dt.querySelectorAll(".fragment").length && bd(Dt, "video, audio").forEach(function (t) { t.hasAttribute("data-autoplay") && Kt && 1e3 * t.duration / t.playbackRate > Kt && (Kt = 1e3 * t.duration / t.playbackRate + 1e3) })), !Kt || Jt || U() || ie.isActive() || D() && !ne.availableRoutes().next && !0 !== jt.loop || ($t = setTimeout(function () { "function" == typeof jt.autoSlideMethod ? jt.autoSlideMethod() : Et(), gt() }, Kt), Zt = Date.now()), Ft && Ft.setPlaying(-1 !== $t) } } function vt() { clearTimeout($t), $t = -1 } function yt() { Kt && !Jt && (Jt = !0, k({ type: "autoslidepaused" }), clearTimeout($t), Ft && Ft.setPlaying(!1)) } function bt() { Kt && Jt && (Jt = !1, k({ type: "autoslideresumed" }), gt()) } function xt() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).skipFragments, e = void 0 !== t && t; _t.hasNavigatedHorizontally = !0, jt.rtl ? (ie.isActive() || e || !1 === ne.next()) && tt().left && W(Ot + 1, "grid" === jt.navigationMode ? Bt : void 0) : (ie.isActive() || e || !1 === ne.prev()) && tt().left && W(Ot - 1, "grid" === jt.navigationMode ? Bt : void 0) } function wt() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).skipFragments, e = void 0 !== t && t; _t.hasNavigatedHorizontally = !0, jt.rtl ? (ie.isActive() || e || !1 === ne.prev()) && tt().right && W(Ot - 1, "grid" === jt.navigationMode ? Bt : void 0) : (ie.isActive() || e || !1 === ne.next()) && tt().right && W(Ot + 1, "grid" === jt.navigationMode ? Bt : void 0) } function kt() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).skipFragments, e = void 0 !== t && t; (ie.isActive() || e || !1 === ne.prev()) && tt().up && W(Ot, Bt - 1) } function St() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).skipFragments, e = void 0 !== t && t; _t.hasNavigatedVertically = !0, (ie.isActive() || e || !1 === ne.next()) && tt().down && W(Ot, Bt + 1) } function At() { var t, e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).skipFragments, r = void 0 !== e && e; if (r || !1 === ne.prev()) if (tt().up) kt({ skipFragments: r }); else if ((t = jt.rtl ? bd(Yt.wrapper, ".slides>section.future").pop() : bd(Yt.wrapper, ".slides>section.past").pop()) && t.classList.contains("stack")) { var n = t.querySelectorAll("section").length - 1 || void 0; W(Ot - 1, n) } else xt({ skipFragments: r }) } function Et() { var t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}).skipFragments, e = void 0 !== t && t; if (_t.hasNavigatedHorizontally = !0, _t.hasNavigatedVertically = !0, e || !1 === ne.next()) { var r = tt(); r.down && r.right && jt.loop && B() && (r.down = !1), r.down ? St({ skipFragments: e }) : jt.rtl ? xt({ skipFragments: e }) : wt({ skipFragments: e }) } } function Mt() { jt.autoSlideStoppable && yt() } function Rt(t) { var e = t.data; if ("string" == typeof e && "{" === e.charAt(0) && "}" === e.charAt(e.length - 1) && (e = JSON.parse(e)).method && "function" == typeof Ht[e.method]) if (!1 === am.test(e.method)) { var r = Ht[e.method].apply(Ht, e.args); S("callback", { method: e.method, result: r }) } else console.warn('reveal.js: "' + e.method + '" is is blacklisted from the postMessage API') } function Tt(t) { "running" === Xt && /section/gi.test(t.target.nodeName) && (Xt = "idle", k({ type: "slidetransitionend", data: { indexh: Ot, indexv: Bt, previousSlide: qt, currentSlide: Dt } })) } function Ct(t) { var e = Ad(t.target, 'a[href^="#"]'); if (e) { var r = e.getAttribute("href"), n = oe.getIndicesFromHash(r); n && (Ht.slide(n.h, n.v, n.f), t.preventDefault()) } } function Lt() { L() } function zt() { !1 === document.hidden && document.activeElement !== document.body && ("function" == typeof document.activeElement.blur && document.activeElement.blur(), document.body.focus()) } function Nt(t) { (document.fullscreenElement || document.webkitFullscreenElement) === Yt.wrapper && (t.stopImmediatePropagation(), setTimeout(function () { Ht.layout(), Ht.focus.focus() }, 1)) } function Pt(t) { if (t.currentTarget && t.currentTarget.hasAttribute("href")) { var e = t.currentTarget.getAttribute("href"); e && (M(e), t.preventDefault()) } } function It() { D() && !1 === jt.loop ? (W(0, 0), bt()) : Jt ? bt() : yt() } arguments.length < 2 && (n = arguments[0], t = document.querySelector(".reveal")); var Ot, Bt, qt, Dt, Ft, Ht = {}, jt = {}, Ut = !1, _t = { hasNavigatedHorizontally: !1, hasNavigatedVertically: !1 }, Vt = [], Wt = 1, Gt = { layout: "", overview: "" }, Yt = {}, Xt = "idle", Kt = 0, $t = 0, Zt = -1, Jt = !1, Qt = new qd(Ht), te = new Dd(Ht), ee = new lm(Ht), re = new Jd(Ht), ne = new cm(Ht), ie = new um(Ht), ae = new hm(Ht), oe = new dm(Ht), se = new mm(Ht), le = new pm(Ht), ce = new fm(Ht), ue = new Sm(Ht), he = new Am(Ht), de = new Tm(Ht), me = new Em(Ht), pe = new Cm(Ht), fe = { VERSION: Hm, initialize: i, configure: f, destroy: y, sync: G, syncSlide: Y, syncFragments: ne.sync.bind(ne), slide: W, left: xt, right: wt, up: kt, down: St, prev: At, next: Et, navigateLeft: xt, navigateRight: wt, navigateUp: kt, navigateDown: St, navigatePrev: At, navigateNext: Et, navigateFragment: ne.goto.bind(ne), prevFragment: ne.prev.bind(ne), nextFragment: ne.next.bind(ne), on: b, off: x, addEventListener: b, removeEventListener: x, layout: L, shuffle: K, availableRoutes: tt, availableFragments: ne.availableRoutes.bind(ne), toggleHelp: R, toggleOverview: ie.toggle.bind(ie), togglePause: j, toggleAutoSlide: _, isFirstSlide: q, isLastSlide: D, isLastVerticalSlide: B, isVerticalSlide: O, isPaused: U, isAutoSliding: V, isSpeakerNotes: pe.isSpeakerNotesWindow.bind(pe), isOverview: ie.isActive.bind(ie), isFocused: de.isFocused.bind(de), isPrintingPDF: he.isPrintingPDF.bind(he), isReady: function () { return Ut }, loadSlide: Qt.load.bind(Qt), unloadSlide: Qt.unload.bind(Qt), showPreview: M, hidePreview: C, addEventListeners: g, removeEventListeners: v, dispatchEvent: k, getState: pt, setState: ft, getProgress: rt, getIndices: nt, getSlidesAttributes: ut, getSlidePastCount: et, getTotalSlides: ht, getSlide: dt, getPreviousSlide: function () { return qt }, getCurrentSlide: function () { return Dt }, getSlideBackground: mt, getSlideNotes: pe.getSlideNotes.bind(pe), getSlides: it, getHorizontalSlides: at, getVerticalSlides: ot, hasHorizontalSlides: lt, hasVerticalSlides: ct, hasNavigatedHorizontally: function () { return _t.hasNavigatedHorizontally }, hasNavigatedVertically: function () { return _t.hasNavigatedVertically }, addKeyBinding: ae.addKeyBinding.bind(ae), removeKeyBinding: ae.removeKeyBinding.bind(ae), triggerKey: ae.triggerKey.bind(ae), registerKeyboardShortcut: ae.registerKeyboardShortcut.bind(ae), getComputedSlideSize: N, getScale: function () { return Wt }, getConfig: function () { return jt }, getQueryHash: Rd, getSlidePath: oe.getHash.bind(oe), getRevealElement: function () { return t }, getSlidesElement: function () { return Yt.slides }, getViewportElement: function () { return Yt.viewport }, getBackgroundsElement: function () { return re.element }, registerPlugin: ue.registerPlugin.bind(ue), hasPlugin: ue.hasPlugin.bind(ue), getPlugin: ue.getPlugin.bind(ue), getPlugins: ue.getRegisteredPlugins.bind(ue) }; return yd(Ht, e(e({}, fe), {}, { announceStatus: u, getStatusText: h, print: he, focus: de, progress: le, controls: se, location: oe, overview: ie, fragments: ne, slideContent: Qt, slideNumber: te, onUserInput: Mt, closeOverlay: C, updateSlidesVisibility: Q, layoutSlideContents: z, transformSlides: w, cueAutoSlide: gt, cancelAutoSlide: vt })), fe + } var d = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}, m = function (t) { return t && t.Math == Math && t }, p = m("object" == typeof globalThis && globalThis) || m("object" == typeof window && window) || m("object" == typeof self && self) || m("object" == typeof d && d) || function () { return this }() || Function("return this")(), f = {}, g = function (t) { try { return !!t() } catch (t) { return !0 } }, v = !g(function () { return 7 != Object.defineProperty({}, 1, { get: function () { return 7 } })[1] }), y = {}, b = {}.propertyIsEnumerable, x = Object.getOwnPropertyDescriptor, w = x && !b.call({ 1: 2 }, 1); y.f = w ? function (t) { var e = x(this, t); return !!e && e.enumerable } : b; var k = function (t, e) { return { enumerable: !(1 & t), configurable: !(2 & t), writable: !(4 & t), value: e } }, S = {}.toString, A = function (t) { return S.call(t).slice(8, -1) }, E = A, M = "".split, R = g(function () { return !Object("z").propertyIsEnumerable(0) }) ? function (t) { return "String" == E(t) ? M.call(t, "") : Object(t) } : Object, T = function (t) { if (null == t) throw TypeError("Can't call method on " + t); return t }, C = R, L = T, z = function (t) { return C(L(t)) }, N = function (t) { return "object" == typeof t ? null !== t : "function" == typeof t }, P = N, I = function (t, e) { if (!P(t)) return t; var r, n; if (e && "function" == typeof (r = t.toString) && !P(n = r.call(t))) return n; if ("function" == typeof (r = t.valueOf) && !P(n = r.call(t))) return n; if (!e && "function" == typeof (r = t.toString) && !P(n = r.call(t))) return n; throw TypeError("Can't convert object to primitive value") }, O = T, B = function (t) { return Object(O(t)) }, q = B, D = {}.hasOwnProperty, F = function (t, e) { return D.call(q(t), e) }, H = N, j = p.document, U = H(j) && H(j.createElement), _ = function (t) { return U ? j.createElement(t) : {} }, V = _, W = !v && !g(function () { return 7 != Object.defineProperty(V("div"), "a", { get: function () { return 7 } }).a }), G = v, Y = y, X = k, K = z, $ = I, Z = F, J = W, Q = Object.getOwnPropertyDescriptor; f.f = G ? Q : function (t, e) { if (t = K(t), e = $(e, !0), J) try { return Q(t, e) } catch (t) { } if (Z(t, e)) return X(!Y.f.call(t, e), t[e]) }; var tt = {}, et = N, rt = function (t) { if (!et(t)) throw TypeError(String(t) + " is not an object"); return t }, nt = v, it = W, at = rt, ot = I, st = Object.defineProperty; tt.f = nt ? st : function (t, e, r) { if (at(t), e = ot(e, !0), at(r), it) try { return st(t, e, r) } catch (t) { } if ("get" in r || "set" in r) throw TypeError("Accessors not supported"); return "value" in r && (t[e] = r.value), t }; var lt = tt, ct = k, ut = v ? function (t, e, r) { return lt.f(t, e, ct(1, r)) } : function (t, e, r) { return t[e] = r, t }, ht = { exports: {} }, dt = p, mt = ut, pt = function (t, e) { try { mt(dt, t, e) } catch (p) { dt[t] = e } return e }, ft = pt, gt = "__core-js_shared__", vt = p[gt] || ft(gt, {}), yt = vt, bt = Function.toString; "function" != typeof yt.inspectSource && (yt.inspectSource = function (t) { return bt.call(t) }); var xt = yt.inspectSource, wt = xt, kt = p.WeakMap, St = "function" == typeof kt && /native code/.test(wt(kt)), At = { exports: {} }, Et = vt; (At.exports = function (t, e) { return Et[t] || (Et[t] = void 0 !== e ? e : {}) })("versions", []).push({ version: "3.12.1", mode: "global", copyright: "\xa9 2021 Denis Pushkarev (zloirock.ru)" }); var Mt, Rt, Tt, Ct = 0, Lt = Math.random(), zt = function (t) { return "Symbol(" + String(void 0 === t ? "" : t) + ")_" + (++Ct + Lt).toString(36) }, Nt = At.exports, Pt = zt, It = Nt("keys"), Ot = function (t) { return It[t] || (It[t] = Pt(t)) }, Bt = {}, qt = St, Dt = N, Ft = ut, Ht = F, jt = vt, Ut = Ot, _t = Bt, Vt = "Object already initialized", Wt = p.WeakMap; if (qt || jt.state) { var Gt = jt.state || (jt.state = new Wt), Yt = Gt.get, Xt = Gt.has, Kt = Gt.set; Mt = function (t, e) { if (Xt.call(Gt, t)) throw new TypeError(Vt); return e.facade = t, Kt.call(Gt, t, e), e }, Rt = function (t) { return Yt.call(Gt, t) || {} }, Tt = function (t) { return Xt.call(Gt, t) } } else { var $t = Ut("state"); _t[$t] = !0, Mt = function (t, e) { if (Ht(t, $t)) throw new TypeError(Vt); return e.facade = t, Ft(t, $t, e), e }, Rt = function (t) { return Ht(t, $t) ? t[$t] : {} }, Tt = function (t) { return Ht(t, $t) } } var Zt = { set: Mt, get: Rt, has: Tt, enforce: function (t) { return Tt(t) ? Rt(t) : Mt(t, {}) }, getterFor: function (t) { return function (e) { var r; if (!Dt(e) || (r = Rt(e)).type !== t) throw TypeError("Incompatible receiver, " + t + " required"); return r } } }, Jt = p, Qt = ut, te = F, ee = pt, re = xt, ne = Zt.get, ie = Zt.enforce, ae = String(String).split("String"); (ht.exports = function (t, e, r, n) { var i, a = !!n && !!n.unsafe, o = !!n && !!n.enumerable, s = !!n && !!n.noTargetGet; "function" == typeof r && ("string" != typeof e || te(r, "name") || Qt(r, "name", e), (i = ie(r)).source || (i.source = ae.join("string" == typeof e ? e : ""))), t !== Jt ? (a ? !s && t[e] && (o = !0) : delete t[e], o ? t[e] = r : Qt(t, e, r)) : o ? t[e] = r : ee(e, r) })(Function.prototype, "toString", function () { return "function" == typeof this && ne(this).source || re(this) }); var oe = p, se = oe, le = p, ce = function (t) { return "function" == typeof t ? t : void 0 }, ue = function (t, e) { return arguments.length < 2 ? ce(se[t]) || ce(le[t]) : se[t] && se[t][e] || le[t] && le[t][e] }, he = {}, de = Math.ceil, me = Math.floor, pe = function (t) { return isNaN(t = +t) ? 0 : (t > 0 ? me : de)(t) }, fe = pe, ge = Math.min, ve = function (t) { return t > 0 ? ge(fe(t), 9007199254740991) : 0 }, ye = pe, be = Math.max, xe = Math.min, we = function (t, e) { var r = ye(t); return r < 0 ? be(r + e, 0) : xe(r, e) }, ke = z, Se = ve, Ae = we, Ee = function (t) { return function (e, r, n) { var i, a = ke(e), o = Se(a.length), s = Ae(n, o); if (t && r != r) { for (; o > s;)if ((i = a[s++]) != i) return !0 } else for (; o > s; s++)if ((t || s in a) && a[s] === r) return t || s || 0; return !t && -1 } }, Me = { includes: Ee(!0), indexOf: Ee(!1) }, Re = F, Te = z, Ce = Me.indexOf, Le = Bt, ze = function (t, e) { var r, n = Te(t), i = 0, a = []; for (r in n) !Re(Le, r) && Re(n, r) && a.push(r); for (; e.length > i;)Re(n, r = e[i++]) && (~Ce(a, r) || a.push(r)); return a }, Ne = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"], Pe = ze, Ie = Ne.concat("length", "prototype"); he.f = Object.getOwnPropertyNames || function (t) { return Pe(t, Ie) }; var Oe = {}; Oe.f = Object.getOwnPropertySymbols; var Be = he, qe = Oe, De = rt, Fe = ue("Reflect", "ownKeys") || function (t) { var e = Be.f(De(t)), r = qe.f; return r ? e.concat(r(t)) : e }, He = F, je = Fe, Ue = f, _e = tt, Ve = function (t, e) { for (var r = je(e), n = _e.f, i = Ue.f, a = 0; a < r.length; a++) { var o = r[a]; He(t, o) || n(t, o, i(e, o)) } }, We = g, Ge = /#|\.prototype\./, Ye = function (t, e) { var r = Ke[Xe(t)]; return r == Ze || r != $e && ("function" == typeof e ? We(e) : !!e) }, Xe = Ye.normalize = function (t) { return String(t).replace(Ge, ".").toLowerCase() }, Ke = Ye.data = {}, $e = Ye.NATIVE = "N", Ze = Ye.POLYFILL = "P", Je = Ye, Qe = p, tr = f.f, er = ut, rr = ht.exports, nr = pt, ir = Ve, ar = Je, or = function (t, e) { var r, n, i, a, o, s = t.target, l = t.global, c = t.stat; if (r = l ? Qe : c ? Qe[s] || nr(s, {}) : (Qe[s] || {}).prototype) for (n in e) { if (a = e[n], i = t.noTargetGet ? (o = tr(r, n)) && o.value : r[n], !ar(l ? n : s + (c ? "." : "#") + n, t.forced) && void 0 !== i) { if (typeof a == typeof i) continue; ir(a, i) } (t.sham || i && i.sham) && er(a, "sham", !0), rr(r, n, a, t) } }, sr = ze, lr = Ne, cr = Object.keys || function (t) { return sr(t, lr) }, ur = v, hr = g, dr = cr, mr = Oe, pr = y, fr = B, gr = R, vr = Object.assign, yr = Object.defineProperty, br = !vr || hr(function () { if (ur && 1 !== vr({ b: 1 }, vr(yr({}, "a", { enumerable: !0, get: function () { yr(this, "b", { value: 3, enumerable: !1 }) } }), { b: 2 })).b) return !0; var t = {}, e = {}, r = Symbol(), n = "abcdefghijklmnopqrst"; return t[r] = 7, n.split("").forEach(function (t) { e[t] = t }), 7 != vr({}, t)[r] || dr(vr({}, e)).join("") != n }) ? function (t) { for (var e = fr(t), r = arguments.length, n = 1, i = mr.f, a = pr.f; r > n;)for (var o, s = gr(arguments[n++]), l = i ? dr(s).concat(i(s)) : dr(s), c = l.length, u = 0; c > u;)o = l[u++], ur && !a.call(s, o) || (e[o] = s[o]); return e } : vr; or({ target: "Object", stat: !0, forced: Object.assign !== br }, { assign: br }); var xr, wr, kr = function (t) { + if ("function" != typeof t) throw TypeError(String(t) + " is not a function"); return t + }, Sr = kr, Ar = function (t, e, r) { if (Sr(t), void 0 === e) return t; switch (r) { case 0: return function () { return t.call(e) }; case 1: return function (r) { return t.call(e, r) }; case 2: return function (r, n) { return t.call(e, r, n) }; case 3: return function (r, n, i) { return t.call(e, r, n, i) } }return function () { return t.apply(e, arguments) } }, Er = A, Mr = Array.isArray || function (t) { return "Array" == Er(t) }, Rr = ue("navigator", "userAgent") || "", Tr = Rr, Cr = p.process, Lr = Cr && Cr.versions, zr = Lr && Lr.v8; zr ? wr = (xr = zr.split("."))[0] < 4 ? 1 : xr[0] + xr[1] : Tr && (!(xr = Tr.match(/Edge\/(\d+)/)) || xr[1] >= 74) && (xr = Tr.match(/Chrome\/(\d+)/)) && (wr = xr[1]); var Nr = wr && +wr, Pr = Nr, Ir = g, Or = !!Object.getOwnPropertySymbols && !Ir(function () { return !String(Symbol()) || !Symbol.sham && Pr && Pr < 41 }), Br = Or && !Symbol.sham && "symbol" == typeof Symbol.iterator, qr = p, Dr = At.exports, Fr = F, Hr = zt, jr = Or, Ur = Br, _r = Dr("wks"), Vr = qr.Symbol, Wr = Ur ? Vr : Vr && Vr.withoutSetter || Hr, Gr = function (t) { return Fr(_r, t) && (jr || "string" == typeof _r[t]) || (jr && Fr(Vr, t) ? _r[t] = Vr[t] : _r[t] = Wr("Symbol." + t)), _r[t] }, Yr = N, Xr = Mr, Kr = Gr("species"), $r = function (t, e) { var r; return Xr(t) && ("function" != typeof (r = t.constructor) || r !== Array && !Xr(r.prototype) ? Yr(r) && null === (r = r[Kr]) && (r = void 0) : r = void 0), new (void 0 === r ? Array : r)(0 === e ? 0 : e) }, Zr = Ar, Jr = R, Qr = B, tn = ve, en = $r, rn = [].push, nn = function (t) { var e = 1 == t, r = 2 == t, n = 3 == t, i = 4 == t, a = 6 == t, o = 7 == t, s = 5 == t || a; return function (l, c, u, h) { for (var d, m, p = Qr(l), f = Jr(p), g = Zr(c, u, 3), v = tn(f.length), y = 0, b = h || en, x = e ? b(l, v) : r || o ? b(l, 0) : void 0; v > y; y++)if ((s || y in f) && (m = g(d = f[y], y, p), t)) if (e) x[y] = m; else if (m) switch (t) { case 3: return !0; case 5: return d; case 6: return y; case 2: rn.call(x, d) } else switch (t) { case 4: return !1; case 7: rn.call(x, d) }return a ? -1 : n || i ? i : x } }, an = { forEach: nn(0), map: nn(1), filter: nn(2), some: nn(3), every: nn(4), find: nn(5), findIndex: nn(6), filterOut: nn(7) }, on = g, sn = Nr, ln = Gr("species"), cn = function (t) { return sn >= 51 || !on(function () { var e = []; return (e.constructor = {})[ln] = function () { return { foo: 1 } }, 1 !== e[t](Boolean).foo }) }, un = an.map; or({ target: "Array", proto: !0, forced: !cn("map") }, { map: function (t) { return un(this, t, arguments.length > 1 ? arguments[1] : void 0) } }); var hn = I, dn = tt, mn = k, pn = function (t, e, r) { var n = hn(e); n in t ? dn.f(t, n, mn(0, r)) : t[n] = r }, fn = or, gn = g, vn = Mr, yn = N, bn = B, xn = ve, wn = pn, kn = $r, Sn = cn, An = Nr, En = Gr("isConcatSpreadable"), Mn = 9007199254740991, Rn = "Maximum allowed index exceeded", Tn = An >= 51 || !gn(function () { var t = []; return t[En] = !1, t.concat()[0] !== t }), Cn = Sn("concat"), Ln = function (t) { if (!yn(t)) return !1; var e = t[En]; return void 0 !== e ? !!e : vn(t) }; fn({ target: "Array", proto: !0, forced: !Tn || !Cn }, { concat: function () { var t, e, r, n, i, a = bn(this), o = kn(a, 0), s = 0; for (t = -1, r = arguments.length; t < r; t++)if (Ln(i = -1 === t ? a : arguments[t])) { if (s + (n = xn(i.length)) > Mn) throw TypeError(Rn); for (e = 0; e < n; e++, s++)e in i && wn(o, s, i[e]) } else { if (s >= Mn) throw TypeError(Rn); wn(o, s++, i) } return o.length = s, o } }); var zn = {}; zn[Gr("toStringTag")] = "z"; var Nn = "[object z]" === String(zn), Pn = Nn, In = A, On = Gr("toStringTag"), Bn = "Arguments" == In(function () { return arguments }()), qn = Pn ? In : function (t) { var e, r, n; return void 0 === t ? "Undefined" : null === t ? "Null" : "string" == typeof (r = function (t, e) { try { return t[e] } catch (t) { } }(e = Object(t), On)) ? r : Bn ? In(e) : "Object" == (n = In(e)) && "function" == typeof e.callee ? "Arguments" : n }, Dn = qn, Fn = Nn ? {}.toString : function () { return "[object " + Dn(this) + "]" }, Hn = Nn, jn = ht.exports, Un = Fn; Hn || jn(Object.prototype, "toString", Un, { unsafe: !0 }); var _n = p.Promise, Vn = ht.exports, Wn = N, Gn = rt, Yn = function (t) { if (!Wn(t) && null !== t) throw TypeError("Can't set " + String(t) + " as a prototype"); return t }, Xn = Object.setPrototypeOf || ("__proto__" in {} ? function () { var t, e = !1, r = {}; try { (t = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set).call(r, []), e = r instanceof Array } catch (t) { } return function (r, n) { return Gn(r), Yn(n), e ? t.call(r, n) : r.__proto__ = n, r } }() : void 0), Kn = tt.f, $n = F, Zn = Gr("toStringTag"), Jn = function (t, e, r) { t && !$n(t = r ? t : t.prototype, Zn) && Kn(t, Zn, { configurable: !0, value: e }) }, Qn = ue, ti = tt, ei = v, ri = Gr("species"), ni = {}, ii = ni, ai = Gr("iterator"), oi = Array.prototype, si = function (t) { return void 0 !== t && (ii.Array === t || oi[ai] === t) }, li = qn, ci = ni, ui = Gr("iterator"), hi = function (t) { if (null != t) return t[ui] || t["@@iterator"] || ci[li(t)] }, di = rt, mi = function (t) { var e = t["return"]; if (void 0 !== e) return di(e.call(t)).value }, pi = rt, fi = si, gi = ve, vi = Ar, yi = hi, bi = mi, xi = function (t, e) { this.stopped = t, this.result = e }, wi = Gr("iterator"), ki = !1; try { var Si = 0, Ai = { next: function () { return { done: !!Si++ } }, "return": function () { ki = !0 } }; Ai[wi] = function () { return this }, Array.from(Ai, function () { throw 2 }) } catch (d) { } var Ei, Mi, Ri, Ti = function (t, e) { if (!e && !ki) return !1; var r = !1; try { var n = {}; n[wi] = function () { return { next: function () { return { done: r = !0 } } } }, t(n) } catch (t) { } return r }, Ci = rt, Li = kr, zi = Gr("species"), Ni = function (t, e) { var r, n = Ci(t).constructor; return void 0 === n || null == (r = Ci(n)[zi]) ? e : Li(r) }, Pi = ue("document", "documentElement"), Ii = /(?:iphone|ipod|ipad).*applewebkit/i.test(Rr), Oi = "process" == A(p.process), Bi = p, qi = g, Di = Ar, Fi = Pi, Hi = _, ji = Ii, Ui = Oi, _i = Bi.location, Vi = Bi.setImmediate, Wi = Bi.clearImmediate, Gi = Bi.process, Yi = Bi.MessageChannel, Xi = Bi.Dispatch, Ki = 0, $i = {}, Zi = "onreadystatechange", Ji = function (t) { if ($i.hasOwnProperty(t)) { var e = $i[t]; delete $i[t], e() } }, Qi = function (t) { return function () { Ji(t) } }, ta = function (t) { Ji(t.data) }, ea = function (t) { Bi.postMessage(t + "", _i.protocol + "//" + _i.host) }; Vi && Wi || (Vi = function (t) { for (var e = [], r = 1; arguments.length > r;)e.push(arguments[r++]); return $i[++Ki] = function () { ("function" == typeof t ? t : Function(t)).apply(void 0, e) }, Ei(Ki), Ki }, Wi = function (t) { delete $i[t] }, Ui ? Ei = function (t) { Gi.nextTick(Qi(t)) } : Xi && Xi.now ? Ei = function (t) { Xi.now(Qi(t)) } : Yi && !ji ? (Ri = (Mi = new Yi).port2, Mi.port1.onmessage = ta, Ei = Di(Ri.postMessage, Ri, 1)) : Bi.addEventListener && "function" == typeof postMessage && !Bi.importScripts && _i && "file:" !== _i.protocol && !qi(ea) ? (Ei = ea, Bi.addEventListener("message", ta, !1)) : Ei = Zi in Hi("script") ? function (t) { Fi.appendChild(Hi("script")).onreadystatechange = function () { Fi.removeChild(this), Ji(t) } } : function (t) { setTimeout(Qi(t), 0) }); var ra, na, ia, aa, oa, sa, la, ca, ua = { set: Vi, clear: Wi }, ha = /web0s(?!.*chrome)/i.test(Rr), da = p, ma = f.f, pa = ua.set, fa = Ii, ga = ha, va = Oi, ya = da.MutationObserver || da.WebKitMutationObserver, ba = da.document, xa = da.process, wa = da.Promise, ka = ma(da, "queueMicrotask"), Sa = ka && ka.value; Sa || (ra = function () { var t, e; for (va && (t = xa.domain) && t.exit(); na;) { e = na.fn, na = na.next; try { e() } catch (t) { throw na ? aa() : ia = void 0, t } } ia = void 0, t && t.enter() }, fa || va || ga || !ya || !ba ? wa && wa.resolve ? ((la = wa.resolve(void 0)).constructor = wa, ca = la.then, aa = function () { ca.call(la, ra) }) : aa = va ? function () { xa.nextTick(ra) } : function () { pa.call(da, ra) } : (oa = !0, sa = ba.createTextNode(""), new ya(ra).observe(sa, { characterData: !0 }), aa = function () { sa.data = oa = !oa })); var Aa = Sa || function (t) { var e = { fn: t, next: void 0 }; ia && (ia.next = e), na || (na = e, aa()), ia = e }, Ea = {}, Ma = kr, Ra = function (t) { var e, r; this.promise = new t(function (t, n) { if (void 0 !== e || void 0 !== r) throw TypeError("Bad Promise constructor"); e = t, r = n }), this.resolve = Ma(e), this.reject = Ma(r) }; Ea.f = function (t) { return new Ra(t) }; var Ta, Ca, La, za, Na = rt, Pa = N, Ia = Ea, Oa = p, Ba = "object" == typeof window, qa = or, Da = p, Fa = ue, Ha = _n, ja = ht.exports, Ua = function (t, e, r) { for (var n in e) Vn(t, n, e[n], r); return t }, _a = Xn, Va = Jn, Wa = function (t) { var e = Qn(t), r = ti.f; ei && e && !e[ri] && r(e, ri, { configurable: !0, get: function () { return this } }) }, Ga = N, Ya = kr, Xa = function (t, e, r) { if (!(t instanceof e)) throw TypeError("Incorrect " + (r ? r + " " : "") + "invocation"); return t }, Ka = xt, $a = function (t, e, r) { var n, i, a, o, s, l, c, u = r && r.that, h = !(!r || !r.AS_ENTRIES), d = !(!r || !r.IS_ITERATOR), m = !(!r || !r.INTERRUPTED), p = vi(e, u, 1 + h + m), f = function (t) { return n && bi(n), new xi(!0, t) }, g = function (t) { return h ? (pi(t), m ? p(t[0], t[1], f) : p(t[0], t[1])) : m ? p(t, f) : p(t) }; if (d) n = t; else { if ("function" != typeof (i = yi(t))) throw TypeError("Target is not iterable"); if (fi(i)) { for (a = 0, o = gi(t.length); o > a; a++)if ((s = g(t[a])) && s instanceof xi) return s; return new xi(!1) } n = i.call(t) } for (l = n.next; !(c = l.call(n)).done;) { try { s = g(c.value) } catch (t) { throw bi(n), t } if ("object" == typeof s && s && s instanceof xi) return s } return new xi(!1) }, Za = Ti, Ja = Ni, Qa = ua.set, to = Aa, eo = function (t, e) { if (Na(t), Pa(e) && e.constructor === t) return e; var r = Ia.f(t); return (0, r.resolve)(e), r.promise }, ro = function (t, e) { var r = Oa.console; r && r.error && (1 === arguments.length ? r.error(t) : r.error(t, e)) }, no = Ea, io = function (t) { try { return { error: !1, value: t() } } catch (t) { return { error: !0, value: t } } }, ao = Zt, oo = Je, so = Ba, lo = Oi, co = Nr, uo = Gr("species"), ho = "Promise", mo = ao.get, po = ao.set, fo = ao.getterFor(ho), go = Ha && Ha.prototype, vo = Ha, yo = go, bo = Da.TypeError, xo = Da.document, wo = Da.process, ko = no.f, So = ko, Ao = !!(xo && xo.createEvent && Da.dispatchEvent), Eo = "function" == typeof PromiseRejectionEvent, Mo = "unhandledrejection", Ro = !1, To = oo(ho, function () { var t = Ka(vo) !== String(vo); if (!t && 66 === co) return !0; if (co >= 51 && /native code/.test(vo)) return !1; var e = new vo(function (t) { t(1) }), r = function (t) { t(function () { }, function () { }) }; return (e.constructor = {})[uo] = r, !(Ro = e.then(function () { }) instanceof r) || !t && so && !Eo }), Co = To || !Za(function (t) { vo.all(t)["catch"](function () { }) }), Lo = function (t) { var e; return !(!Ga(t) || "function" != typeof (e = t.then)) && e }, zo = function (t, e) { if (!t.notified) { t.notified = !0; var r = t.reactions; to(function () { for (var n = t.value, i = 1 == t.state, a = 0; r.length > a;) { var o, s, l, c = r[a++], u = i ? c.ok : c.fail, h = c.resolve, d = c.reject, m = c.domain; try { u ? (i || (2 === t.rejection && Oo(t), t.rejection = 1), !0 === u ? o = n : (m && m.enter(), o = u(n), m && (m.exit(), l = !0)), o === c.promise ? d(bo("Promise-chain cycle")) : (s = Lo(o)) ? s.call(o, h, d) : h(o)) : d(n) } catch (t) { m && !l && m.exit(), d(t) } } t.reactions = [], t.notified = !1, e && !t.rejection && Po(t) }) } }, No = function (t, e, r) { var n, i; Ao ? ((n = xo.createEvent("Event")).promise = e, n.reason = r, n.initEvent(t, !1, !0), Da.dispatchEvent(n)) : n = { promise: e, reason: r }, !Eo && (i = Da["on" + t]) ? i(n) : t === Mo && ro("Unhandled promise rejection", r) }, Po = function (t) { Qa.call(Da, function () { var e, r = t.facade, n = t.value; if (Io(t) && (e = io(function () { lo ? wo.emit("unhandledRejection", n, r) : No(Mo, r, n) }), t.rejection = lo || Io(t) ? 2 : 1, e.error)) throw e.value }) }, Io = function (t) { return 1 !== t.rejection && !t.parent }, Oo = function (t) { Qa.call(Da, function () { var e = t.facade; lo ? wo.emit("rejectionHandled", e) : No("rejectionhandled", e, t.value) }) }, Bo = function (t, e, r) { return function (n) { t(e, n, r) } }, qo = function (t, e, r) { t.done || (t.done = !0, r && (t = r), t.value = e, t.state = 2, zo(t, !0)) }, Do = function (t, e, r) { if (!t.done) { t.done = !0, r && (t = r); try { if (t.facade === e) throw bo("Promise can't be resolved itself"); var n = Lo(e); n ? to(function () { var r = { done: !1 }; try { n.call(e, Bo(Do, r, t), Bo(qo, r, t)) } catch (e) { qo(r, e, t) } }) : (t.value = e, t.state = 1, zo(t, !1)) } catch (e) { qo({ done: !1 }, e, t) } } }; if (To && (yo = (vo = function (t) { Xa(this, vo, ho), Ya(t), Ta.call(this); var e = mo(this); try { t(Bo(Do, e), Bo(qo, e)) } catch (t) { qo(e, t) } }).prototype, (Ta = function () { po(this, { type: ho, done: !1, notified: !1, parent: !1, reactions: [], rejection: !1, state: 0, value: void 0 }) }).prototype = Ua(yo, { then: function (t, e) { var r = fo(this), n = ko(Ja(this, vo)); return n.ok = "function" != typeof t || t, n.fail = "function" == typeof e && e, n.domain = lo ? wo.domain : void 0, r.parent = !0, r.reactions.push(n), 0 != r.state && zo(r, !1), n.promise }, "catch": function (t) { return this.then(void 0, t) } }), Ca = function () { var t = new Ta, e = mo(t); this.promise = t, this.resolve = Bo(Do, e), this.reject = Bo(qo, e) }, no.f = ko = function (t) { return t === vo || t === La ? new Ca(t) : So(t) }, "function" == typeof Ha && go !== Object.prototype)) { za = go.then, Ro || (ja(go, "then", function (t, e) { var r = this; return new vo(function (t, e) { za.call(r, t, e) }).then(t, e) }, { unsafe: !0 }), ja(go, "catch", yo["catch"], { unsafe: !0 })); try { delete go.constructor } catch (d) { } _a && _a(go, yo) } qa({ global: !0, wrap: !0, forced: To }, { Promise: vo }), Va(vo, ho, !1), Wa(ho), La = Fa(ho), qa({ target: ho, stat: !0, forced: To }, { reject: function (t) { var e = ko(this); return e.reject.call(void 0, t), e.promise } }), qa({ target: ho, stat: !0, forced: To }, { resolve: function (t) { return eo(this, t) } }), qa({ target: ho, stat: !0, forced: Co }, { all: function (t) { var e = this, r = ko(e), n = r.resolve, i = r.reject, a = io(function () { var r = Ya(e.resolve), a = [], o = 0, s = 1; $a(t, function (t) { var l = o++, c = !1; a.push(void 0), s++, r.call(e, t).then(function (t) { c || (c = !0, a[l] = t, --s || n(a)) }, i) }), --s || n(a) }); return a.error && i(a.value), r.promise }, race: function (t) { var e = this, r = ko(e), n = r.reject, i = io(function () { var i = Ya(e.resolve); $a(t, function (t) { i.call(e, t).then(r.resolve, n) }) }); return i.error && n(i.value), r.promise } }); var Fo = g, Ho = function (t, e) { var r = [][t]; return !!r && Fo(function () { r.call(null, e || function () { throw 1 }, 1) }) }, jo = an.forEach, Uo = p, _o = { CSSRuleList: 0, CSSStyleDeclaration: 0, CSSValueList: 0, ClientRectList: 0, DOMRectList: 0, DOMStringList: 0, DOMTokenList: 1, DataTransferItemList: 0, FileList: 0, HTMLAllCollection: 0, HTMLCollection: 0, HTMLFormElement: 0, HTMLSelectElement: 0, MediaList: 0, MimeTypeArray: 0, NamedNodeMap: 0, NodeList: 1, PaintRequestList: 0, Plugin: 0, PluginArray: 0, SVGLengthList: 0, SVGNumberList: 0, SVGPathSegList: 0, SVGPointList: 0, SVGStringList: 0, SVGTransformList: 0, SourceBufferList: 0, StyleSheetList: 0, TextTrackCueList: 0, TextTrackList: 0, TouchList: 0 }, Vo = Ho("forEach") ? [].forEach : function (t) { return jo(this, t, arguments.length > 1 ? arguments[1] : void 0) }, Wo = ut; for (var Go in _o) { var Yo = Uo[Go], Xo = Yo && Yo.prototype; if (Xo && Xo.forEach !== Vo) try { Wo(Xo, "forEach", Vo) } catch (d) { Xo.forEach = Vo } } var Ko = rt, $o = mi, Zo = Ar, Jo = B, Qo = function (t, e, r, n) { try { return n ? e(Ko(r)[0], r[1]) : e(r) } catch (e) { throw $o(t), e } }, ts = si, es = ve, rs = pn, ns = hi, is = function (t) { var e, r, n, i, a, o, s = Jo(t), l = "function" == typeof this ? this : Array, c = arguments.length, u = c > 1 ? arguments[1] : void 0, h = void 0 !== u, d = ns(s), m = 0; if (h && (u = Zo(u, c > 2 ? arguments[2] : void 0, 2)), null == d || l == Array && ts(d)) for (r = new l(e = es(s.length)); e > m; m++)o = h ? u(s[m], m) : s[m], rs(r, m, o); else for (a = (i = d.call(s)).next, r = new l; !(n = a.call(i)).done; m++)o = h ? Qo(i, u, [n.value, m], !0) : n.value, rs(r, m, o); return r.length = m, r }; or({ target: "Array", stat: !0, forced: !Ti(function (t) { Array.from(t) }) }, { from: is }); var as, os, ss, ls = pe, cs = T, us = function (t) { return function (e, r) { var n, i, a = String(cs(e)), o = ls(r), s = a.length; return o < 0 || o >= s ? t ? "" : void 0 : (n = a.charCodeAt(o)) < 55296 || n > 56319 || o + 1 === s || (i = a.charCodeAt(o + 1)) < 56320 || i > 57343 ? t ? a.charAt(o) : n : t ? a.slice(o, o + 2) : i - 56320 + (n - 55296 << 10) + 65536 } }, hs = { codeAt: us(!1), charAt: us(!0) }, ds = !g(function () { function t() { } return t.prototype.constructor = null, Object.getPrototypeOf(new t) !== t.prototype }), ms = F, ps = B, fs = ds, gs = Ot("IE_PROTO"), vs = Object.prototype, ys = fs ? Object.getPrototypeOf : function (t) { return t = ps(t), ms(t, gs) ? t[gs] : "function" == typeof t.constructor && t instanceof t.constructor ? t.constructor.prototype : t instanceof Object ? vs : null }, bs = g, xs = ys, ws = ut, ks = F, Ss = Gr("iterator"), As = !1;[].keys && ("next" in (ss = [].keys()) ? (os = xs(xs(ss))) !== Object.prototype && (as = os) : As = !0), (null == as || bs(function () { var t = {}; return as[Ss].call(t) !== t })) && (as = {}), ks(as, Ss) || ws(as, Ss, function () { return this }); var Es, Ms = { IteratorPrototype: as, BUGGY_SAFARI_ITERATORS: As }, Rs = tt, Ts = rt, Cs = cr, Ls = v ? Object.defineProperties : function (t, e) { Ts(t); for (var r, n = Cs(e), i = n.length, a = 0; i > a;)Rs.f(t, r = n[a++], e[r]); return t }, zs = rt, Ns = Ls, Ps = Ne, Is = Bt, Os = Pi, Bs = _, qs = Ot("IE_PROTO"), Ds = function () { }, Fs = function (t) { return "" + t + "" }, Hs = function () { try { Es = document.domain && new ActiveXObject("htmlfile") } catch (t) { } var t, e; Hs = Es ? function (t) { t.write(Fs("")), t.close(); var e = t.parentWindow.Object; return t = null, e }(Es) : ((e = Bs("iframe")).style.display = "none", Os.appendChild(e), e.src = String("javascript:"), (t = e.contentWindow.document).open(), t.write(Fs("document.F=Object")), t.close(), t.F); for (var r = Ps.length; r--;)delete Hs.prototype[Ps[r]]; return Hs() }; Is[qs] = !0; var js = Object.create || function (t, e) { var r; return null !== t ? (Ds.prototype = zs(t), r = new Ds, Ds.prototype = null, r[qs] = t) : r = Hs(), void 0 === e ? r : Ns(r, e) }, Us = Ms.IteratorPrototype, _s = js, Vs = k, Ws = Jn, Gs = ni, Ys = function () { return this }, Xs = or, Ks = function (t, e, r) { var n = e + " Iterator"; return t.prototype = _s(Us, { next: Vs(1, r) }), Ws(t, n, !1), Gs[n] = Ys, t }, $s = ys, Zs = Xn, Js = Jn, Qs = ut, tl = ht.exports, el = ni, rl = Ms.IteratorPrototype, nl = Ms.BUGGY_SAFARI_ITERATORS, il = Gr("iterator"), al = "keys", ol = "values", sl = "entries", ll = function () { return this }, cl = hs.charAt, ul = Zt, hl = function (t, e, r, n, i, a, o) { Ks(r, e, n); var s, l, c, u = function (t) { if (t === i && f) return f; if (!nl && t in m) return m[t]; switch (t) { case al: case ol: case sl: return function () { return new r(this, t) } }return function () { return new r(this) } }, h = e + " Iterator", d = !1, m = t.prototype, p = m[il] || m["@@iterator"] || i && m[i], f = !nl && p || u(i), g = "Array" == e && m.entries || p; if (g && (s = $s(g.call(new t)), rl !== Object.prototype && s.next && ($s(s) !== rl && (Zs ? Zs(s, rl) : "function" != typeof s[il] && Qs(s, il, ll)), Js(s, h, !0))), i == ol && p && p.name !== ol && (d = !0, f = function () { return p.call(this) }), m[il] !== f && Qs(m, il, f), el[e] = f, i) if (l = { values: u(ol), keys: a ? f : u(al), entries: u(sl) }, o) for (c in l) (nl || d || !(c in m)) && tl(m, c, l[c]); else Xs({ target: e, proto: !0, forced: nl || d }, l); return l }, dl = "String Iterator", ml = ul.set, pl = ul.getterFor(dl); hl(String, "String", function (t) { ml(this, { type: dl, string: String(t), index: 0 }) }, function () { var t, e = pl(this), r = e.string, n = e.index; return n >= r.length ? { value: void 0, done: !0 } : (t = cl(r, n), e.index += t.length, { value: t, done: !1 }) }); var fl = "\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff", gl = T, vl = "[\t\n\x0B\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff]", yl = RegExp("^" + vl + vl + "*"), bl = RegExp(vl + vl + "*$"), xl = function (t) { return function (e) { var r = String(gl(e)); return 1 & t && (r = r.replace(yl, "")), 2 & t && (r = r.replace(bl, "")), r } }, wl = { start: xl(1), end: xl(2), trim: xl(3) }, kl = g, Sl = fl, Al = wl.trim; or({ target: "String", proto: !0, forced: function (t) { return kl(function () { return !!Sl[t]() || "\u200b\x85\u180e" != "\u200b\x85\u180e"[t]() || Sl[t].name !== t }) }("trim") }, { trim: function () { return Al(this) } }); var El = {}, Ml = z, Rl = he.f, Tl = {}.toString, Cl = "object" == typeof window && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; El.f = function (t) { return Cl && "[object Window]" == Tl.call(t) ? function (t) { try { return Rl(t) } catch (t) { return Cl.slice() } }(t) : Rl(Ml(t)) }; var Ll = {}, zl = Gr; Ll.f = zl; var Nl = oe, Pl = F, Il = Ll, Ol = tt.f, Bl = or, ql = p, Dl = ue, Fl = v, Hl = Or, jl = Br, Ul = g, _l = F, Vl = Mr, Wl = N, Gl = rt, Yl = B, Xl = z, Kl = I, $l = k, Zl = js, Jl = cr, Ql = he, tc = El, ec = Oe, rc = f, nc = tt, ic = y, ac = ut, oc = ht.exports, sc = At.exports, lc = Bt, cc = zt, uc = Gr, hc = Ll, dc = function (t) { var e = Nl.Symbol || (Nl.Symbol = {}); Pl(e, t) || Ol(e, t, { value: Il.f(t) }) }, mc = Jn, pc = Zt, fc = an.forEach, gc = Ot("hidden"), vc = "Symbol", yc = uc("toPrimitive"), bc = pc.set, xc = pc.getterFor(vc), wc = Object.prototype, kc = ql.Symbol, Sc = Dl("JSON", "stringify"), Ac = rc.f, Ec = nc.f, Mc = tc.f, Rc = ic.f, Tc = sc("symbols"), Cc = sc("op-symbols"), Lc = sc("string-to-symbol-registry"), zc = sc("symbol-to-string-registry"), Nc = sc("wks"), Pc = ql.QObject, Ic = !Pc || !Pc.prototype || !Pc.prototype.findChild, Oc = Fl && Ul(function () { return 7 != Zl(Ec({}, "a", { get: function () { return Ec(this, "a", { value: 7 }).a } })).a }) ? function (t, e, r) { var n = Ac(wc, e); n && delete wc[e], Ec(t, e, r), n && t !== wc && Ec(wc, e, n) } : Ec, Bc = function (t, e) { var r = Tc[t] = Zl(kc.prototype); return bc(r, { type: vc, tag: t, description: e }), Fl || (r.description = e), r }, qc = jl ? function (t) { return "symbol" == typeof t } : function (t) { return Object(t) instanceof kc }, Dc = function (t, e, r) { t === wc && Dc(Cc, e, r), Gl(t); var n = Kl(e, !0); return Gl(r), _l(Tc, n) ? (r.enumerable ? (_l(t, gc) && t[gc][n] && (t[gc][n] = !1), r = Zl(r, { enumerable: $l(0, !1) })) : (_l(t, gc) || Ec(t, gc, $l(1, {})), t[gc][n] = !0), Oc(t, n, r)) : Ec(t, n, r) }, Fc = function (t, e) { Gl(t); var r = Xl(e), n = Jl(r).concat(_c(r)); return fc(n, function (e) { Fl && !Hc.call(r, e) || Dc(t, e, r[e]) }), t }, Hc = function (t) { var e = Kl(t, !0), r = Rc.call(this, e); return !(this === wc && _l(Tc, e) && !_l(Cc, e)) && (!(r || !_l(this, e) || !_l(Tc, e) || _l(this, gc) && this[gc][e]) || r) }, jc = function (t, e) { var r = Xl(t), n = Kl(e, !0); if (r !== wc || !_l(Tc, n) || _l(Cc, n)) { var i = Ac(r, n); return !i || !_l(Tc, n) || _l(r, gc) && r[gc][n] || (i.enumerable = !0), i } }, Uc = function (t) { var e = Mc(Xl(t)), r = []; return fc(e, function (t) { _l(Tc, t) || _l(lc, t) || r.push(t) }), r }, _c = function (t) { var e = t === wc, r = Mc(e ? Cc : Xl(t)), n = []; return fc(r, function (t) { !_l(Tc, t) || e && !_l(wc, t) || n.push(Tc[t]) }), n }; Hl || (oc((kc = function () { if (this instanceof kc) throw TypeError("Symbol is not a constructor"); var t = arguments.length && void 0 !== arguments[0] ? String(arguments[0]) : void 0, e = cc(t), r = function (t) { this === wc && r.call(Cc, t), _l(this, gc) && _l(this[gc], e) && (this[gc][e] = !1), Oc(this, e, $l(1, t)) }; return Fl && Ic && Oc(wc, e, { configurable: !0, set: r }), Bc(e, t) }).prototype, "toString", function () { return xc(this).tag }), oc(kc, "withoutSetter", function (t) { return Bc(cc(t), t) }), ic.f = Hc, nc.f = Dc, rc.f = jc, Ql.f = tc.f = Uc, ec.f = _c, hc.f = function (t) { return Bc(uc(t), t) }, Fl && (Ec(kc.prototype, "description", { configurable: !0, get: function () { return xc(this).description } }), oc(wc, "propertyIsEnumerable", Hc, { unsafe: !0 }))), Bl({ global: !0, wrap: !0, forced: !Hl, sham: !Hl }, { Symbol: kc }), fc(Jl(Nc), function (t) { dc(t) }), Bl({ target: vc, stat: !0, forced: !Hl }, { "for": function (t) { var e = String(t); if (_l(Lc, e)) return Lc[e]; var r = kc(e); return Lc[e] = r, zc[r] = e, r }, keyFor: function (t) { if (!qc(t)) throw TypeError(t + " is not a symbol"); if (_l(zc, t)) return zc[t] }, useSetter: function () { Ic = !0 }, useSimple: function () { Ic = !1 } }), Bl({ target: "Object", stat: !0, forced: !Hl, sham: !Fl }, { create: function (t, e) { return void 0 === e ? Zl(t) : Fc(Zl(t), e) }, defineProperty: Dc, defineProperties: Fc, getOwnPropertyDescriptor: jc }), Bl({ target: "Object", stat: !0, forced: !Hl }, { getOwnPropertyNames: Uc, getOwnPropertySymbols: _c }), Bl({ target: "Object", stat: !0, forced: Ul(function () { ec.f(1) }) }, { getOwnPropertySymbols: function (t) { return ec.f(Yl(t)) } }), Sc && Bl({ target: "JSON", stat: !0, forced: !Hl || Ul(function () { var t = kc(); return "[null]" != Sc([t]) || "{}" != Sc({ a: t }) || "{}" != Sc(Object(t)) }) }, { stringify: function (t, e) { for (var r, n = [t], i = 1; arguments.length > i;)n.push(arguments[i++]); if (r = e, (Wl(e) || void 0 !== t) && !qc(t)) return Vl(e) || (e = function (t, e) { if ("function" == typeof r && (e = r.call(this, t, e)), !qc(e)) return e }), n[1] = e, Sc.apply(null, n) } }), kc.prototype[yc] || ac(kc.prototype, yc, kc.prototype.valueOf), mc(kc, vc), lc[gc] = !0; var Vc = or, Wc = v, Gc = p, Yc = F, Xc = N, Kc = tt.f, $c = Ve, Zc = Gc.Symbol; if (Wc && "function" == typeof Zc && (!("description" in Zc.prototype) || void 0 !== Zc().description)) { var Jc = {}, Qc = function () { var t = arguments.length < 1 || void 0 === arguments[0] ? void 0 : String(arguments[0]), e = this instanceof Qc ? new Zc(t) : void 0 === t ? Zc() : Zc(t); return "" === t && (Jc[e] = !0), e }; $c(Qc, Zc); var tu = Qc.prototype = Zc.prototype; tu.constructor = Qc; var eu = tu.toString, ru = "Symbol(test)" == String(Zc("test")), nu = /^Symbol\((.*)\)[^)]+$/; Kc(tu, "description", { configurable: !0, get: function () { var t = Xc(this) ? this.valueOf() : this, e = eu.call(t); if (Yc(Jc, t)) return ""; var r = ru ? e.slice(7, -1) : e.replace(nu, "$1"); return "" === r ? void 0 : r } }), Vc({ global: !0, forced: !0 }, { Symbol: Qc }) } var iu = rt, au = {}, ou = g; au.UNSUPPORTED_Y = ou(function () { var t = u("a", "y"); return t.lastIndex = 2, null != t.exec("abcd") }), au.BROKEN_CARET = ou(function () { var t = u("^r", "gy"); return t.lastIndex = 2, null != t.exec("str") }); var su, lu, cu = function () { var t = iu(this), e = ""; return t.global && (e += "g"), t.ignoreCase && (e += "i"), t.multiline && (e += "m"), t.dotAll && (e += "s"), t.unicode && (e += "u"), t.sticky && (e += "y"), e }, uu = au, hu = At.exports, du = RegExp.prototype.exec, mu = hu("native-string-replace", String.prototype.replace), pu = du, fu = (su = /a/, lu = /b*/g, du.call(su, "a"), du.call(lu, "a"), 0 !== su.lastIndex || 0 !== lu.lastIndex), gu = uu.UNSUPPORTED_Y || uu.BROKEN_CARET, vu = void 0 !== /()??/.exec("")[1]; (fu || vu || gu) && (pu = function (t) { var e, r, n, i, a = this, o = gu && a.sticky, s = cu.call(a), l = a.source, c = 0, u = t; return o && (-1 === (s = s.replace("y", "")).indexOf("g") && (s += "g"), u = String(t).slice(a.lastIndex), a.lastIndex > 0 && (!a.multiline || a.multiline && "\n" !== t[a.lastIndex - 1]) && (l = "(?: " + l + ")", u = " " + u, c++), r = new RegExp("^(?:" + l + ")", s)), vu && (r = new RegExp("^" + l + "$(?!\\s)", s)), fu && (e = a.lastIndex), n = du.call(o ? r : a, u), o ? n ? (n.input = n.input.slice(c), n[0] = n[0].slice(c), n.index = a.lastIndex, a.lastIndex += n[0].length) : a.lastIndex = 0 : fu && n && (a.lastIndex = a.global ? n.index + n[0].length : e), vu && n && n.length > 1 && mu.call(n[0], r, function () { for (i = 1; i < arguments.length - 2; i++)void 0 === arguments[i] && (n[i] = void 0) }), n }); var yu = pu; or({ target: "RegExp", proto: !0, forced: /./.exec !== yu }, { exec: yu }); var bu = ht.exports, xu = yu, wu = g, ku = Gr, Su = ut, Au = ku("species"), Eu = RegExp.prototype, Mu = !wu(function () { var t = /./; return t.exec = function () { var t = []; return t.groups = { a: "7" }, t }, "7" !== "".replace(t, "$") }), Ru = "$0" === "a".replace(/./, "$0"), Tu = ku("replace"), Cu = !!/./[Tu] && "" === /./[Tu]("a", "$0"), Lu = !wu(function () { var t = /(?:)/, e = t.exec; t.exec = function () { return e.apply(this, arguments) }; var r = "ab".split(t); return 2 !== r.length || "a" !== r[0] || "b" !== r[1] }), zu = function (t, e, r, n) { var i = ku(t), a = !wu(function () { var e = {}; return e[i] = function () { return 7 }, 7 != ""[t](e) }), o = a && !wu(function () { var e = !1, r = /a/; return "split" === t && ((r = {}).constructor = {}, r.constructor[Au] = function () { return r }, r.flags = "", r[i] = /./[i]), r.exec = function () { return e = !0, null }, r[i](""), !e }); if (!a || !o || "replace" === t && (!Mu || !Ru || Cu) || "split" === t && !Lu) { var s = /./[i], l = r(i, ""[t], function (t, e, r, n, i) { var o = e.exec; return o === xu || o === Eu.exec ? a && !i ? { done: !0, value: s.call(e, r, n) } : { done: !0, value: t.call(r, e, n) } : { done: !1 } }, { REPLACE_KEEPS_$0: Ru, REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: Cu }), c = l[0], u = l[1]; bu(String.prototype, t, c), bu(Eu, i, 2 == e ? function (t, e) { return u.call(t, this, e) } : function (t) { return u.call(t, this) }) } n && Su(Eu[i], "sham", !0) }, Nu = hs.charAt, Pu = function (t, e, r) { return e + (r ? Nu(t, e).length : 1) }, Iu = A, Ou = yu, Bu = function (t, e) { var r = t.exec; if ("function" == typeof r) { var n = r.call(t, e); if ("object" != typeof n) throw TypeError("RegExp exec method returned something other than an Object or null"); return n } if ("RegExp" !== Iu(t)) throw TypeError("RegExp#exec called on incompatible receiver"); return Ou.call(t, e) }, qu = rt, Du = ve, Fu = T, Hu = Pu, ju = Bu; zu("match", 1, function (t, e, r) { return [function (e) { var r = Fu(this), n = null == e ? void 0 : e[t]; return void 0 !== n ? n.call(e, r) : new RegExp(e)[t](String(r)) }, function (t) { var n = r(e, t, this); if (n.done) return n.value; var i = qu(t), a = String(this); if (!i.global) return ju(i, a); var o = i.unicode; i.lastIndex = 0; for (var s, l = [], c = 0; null !== (s = ju(i, a));) { var u = String(s[0]); l[c] = u, "" === u && (i.lastIndex = Hu(a, Du(i.lastIndex), o)), c++ } return 0 === c ? null : l }] }); var Uu = or, _u = we, Vu = pe, Wu = ve, Gu = B, Yu = $r, Xu = pn, Ku = cn("splice"), $u = Math.max, Zu = Math.min, Ju = 9007199254740991, Qu = "Maximum allowed length exceeded"; Uu({ target: "Array", proto: !0, forced: !Ku }, { splice: function (t, e) { var r, n, i, a, o, s, l = Gu(this), c = Wu(l.length), u = _u(t, c), h = arguments.length; if (0 === h ? r = n = 0 : 1 === h ? (r = 0, n = c - u) : (r = h - 2, n = Zu($u(Vu(e), 0), c - u)), c + r - n > Ju) throw TypeError(Qu); for (i = Yu(l, n), a = 0; a < n; a++)(o = u + a) in l && Xu(i, a, l[o]); if (i.length = n, r < n) { for (a = u; a < c - n; a++)s = a + r, (o = a + n) in l ? l[s] = l[o] : delete l[s]; for (a = c; a > c - n + r; a--)delete l[a - 1] } else if (r > n) for (a = c - n; a > u; a--)s = a + r - 1, (o = a + n - 1) in l ? l[s] = l[o] : delete l[s]; for (a = 0; a < r; a++)l[a + u] = arguments[a + 2]; return l.length = c - n + r, i } }); var th = N, eh = A, rh = Gr("match"), nh = zu, ih = function (t) { var e; return th(t) && (void 0 !== (e = t[rh]) ? !!e : "RegExp" == eh(t)) }, ah = rt, oh = T, sh = Ni, lh = Pu, ch = ve, uh = Bu, hh = yu, dh = au.UNSUPPORTED_Y, mh = [].push, ph = Math.min, fh = 4294967295; nh("split", 2, function (t, e, r) { var n; return n = "c" == "abbc".split(/(b)*/)[1] || 4 != "test".split(/(?:)/, -1).length || 2 != "ab".split(/(?:ab)*/).length || 4 != ".".split(/(.?)(.?)/).length || ".".split(/()()/).length > 1 || "".split(/.?/).length ? function (t, r) { var n = String(oh(this)), i = void 0 === r ? fh : r >>> 0; if (0 === i) return []; if (void 0 === t) return [n]; if (!ih(t)) return e.call(n, t, i); for (var a, o, s, l = [], c = (t.ignoreCase ? "i" : "") + (t.multiline ? "m" : "") + (t.unicode ? "u" : "") + (t.sticky ? "y" : ""), u = 0, h = new RegExp(t.source, c + "g"); (a = hh.call(h, n)) && !((o = h.lastIndex) > u && (l.push(n.slice(u, a.index)), a.length > 1 && a.index < n.length && mh.apply(l, a.slice(1)), s = a[0].length, u = o, l.length >= i));)h.lastIndex === a.index && h.lastIndex++; return u === n.length ? !s && h.test("") || l.push("") : l.push(n.slice(u)), l.length > i ? l.slice(0, i) : l } : "0".split(void 0, 0).length ? function (t, r) { return void 0 === t && 0 === r ? [] : e.call(this, t, r) } : e, [function (e, r) { var i = oh(this), a = null == e ? void 0 : e[t]; return void 0 !== a ? a.call(e, i, r) : n.call(String(i), e, r) }, function (t, i) { var a = r(n, t, this, i, n !== e); if (a.done) return a.value; var o = ah(t), s = String(this), l = sh(o, RegExp), c = o.unicode, u = (o.ignoreCase ? "i" : "") + (o.multiline ? "m" : "") + (o.unicode ? "u" : "") + (dh ? "g" : "y"), h = new l(dh ? "^(?:" + o.source + ")" : o, u), d = void 0 === i ? fh : i >>> 0; if (0 === d) return []; if (0 === s.length) return null === uh(h, s) ? [s] : []; for (var m = 0, p = 0, f = []; p < s.length;) { h.lastIndex = dh ? 0 : p; var g, v = uh(h, dh ? s.slice(p) : s); if (null === v || (g = ph(ch(h.lastIndex + (dh ? p : 0)), s.length)) === m) p = lh(s, p, c); else { if (f.push(s.slice(m, p)), f.length === d) return f; for (var y = 1; y <= v.length - 1; y++)if (f.push(v[y]), f.length === d) return f; p = m = g } } return f.push(s.slice(m)), f }] }, dh); var gh = N, vh = Xn, yh = v, bh = p, xh = Je, wh = ht.exports, kh = F, Sh = A, Ah = function (t, e, r) { var n, i; return vh && "function" == typeof (n = e.constructor) && n !== r && gh(i = n.prototype) && i !== r.prototype && vh(t, i), t }, Eh = I, Mh = g, Rh = js, Th = he.f, Ch = f.f, Lh = tt.f, zh = wl.trim, Nh = "Number", Ph = bh.Number, Ih = Ph.prototype, Oh = Sh(Rh(Ih)) == Nh, Bh = function (t) { var e, r, n, i, a, o, s, l, c = Eh(t, !1); if ("string" == typeof c && c.length > 2) if (43 === (e = (c = zh(c)).charCodeAt(0)) || 45 === e) { if (88 === (r = c.charCodeAt(2)) || 120 === r) return NaN } else if (48 === e) { switch (c.charCodeAt(1)) { case 66: case 98: n = 2, i = 49; break; case 79: case 111: n = 8, i = 55; break; default: return +c }for (o = (a = c.slice(2)).length, s = 0; s < o; s++)if ((l = a.charCodeAt(s)) < 48 || l > i) return NaN; return parseInt(a, n) } return +c }; if (xh(Nh, !Ph(" 0o1") || !Ph("0b1") || Ph("+0x1"))) { for (var qh, Dh = function (t) { var e = arguments.length < 1 ? 0 : t, r = this; return r instanceof Dh && (Oh ? Mh(function () { Ih.valueOf.call(r) }) : Sh(r) != Nh) ? Ah(new Ph(Bh(e)), r, Dh) : Bh(e) }, Fh = yh ? Th(Ph) : "MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,fromString,range".split(","), Hh = 0; Fh.length > Hh; Hh++)kh(Ph, qh = Fh[Hh]) && !kh(Dh, qh) && Lh(Dh, qh, Ch(Ph, qh)); Dh.prototype = Ih, Ih.constructor = Dh, wh(bh, Nh, Dh) } var jh = v, Uh = tt.f, _h = Function.prototype, Vh = _h.toString, Wh = /^\s*function ([^ (]*)/, Gh = "name"; jh && !(Gh in _h) && Uh(_h, Gh, { configurable: !0, get: function () { try { return Vh.call(this).match(Wh)[1] } catch (d) { return "" } } }); var Yh = or, Xh = z, Kh = [].join, $h = R != Object, Zh = Ho("join", ","); Yh({ target: "Array", proto: !0, forced: $h || !Zh }, { join: function (t) { return Kh.call(Xh(this), void 0 === t ? "," : t) } }); var Jh = B, Qh = Math.floor, td = "".replace, ed = /\$([$&'`]|\d{1,2}|<[^>]*>)/g, rd = /\$([$&'`]|\d{1,2})/g, nd = zu, id = rt, ad = ve, od = pe, sd = T, ld = Pu, cd = function (t, e, r, n, i, a) { var o = r + t.length, s = n.length, l = rd; return void 0 !== i && (i = Jh(i), l = ed), td.call(a, l, function (a, l) { var c; switch (l.charAt(0)) { case "$": return "$"; case "&": return t; case "`": return e.slice(0, r); case "'": return e.slice(o); case "<": c = i[l.slice(1, -1)]; break; default: var u = +l; if (0 === u) return a; if (u > s) { var h = Qh(u / 10); return 0 === h ? a : h <= s ? void 0 === n[h - 1] ? l.charAt(1) : n[h - 1] + l.charAt(1) : a } c = n[u - 1] }return void 0 === c ? "" : c }) }, ud = Bu, hd = Math.max, dd = Math.min; nd("replace", 2, function (t, e, r, n) { var i = n.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE, a = n.REPLACE_KEEPS_$0, o = i ? "$" : "$0"; return [function (r, n) { var i = sd(this), a = null == r ? void 0 : r[t]; return void 0 !== a ? a.call(r, i, n) : e.call(String(i), r, n) }, function (t, n) { if (!i && a || "string" == typeof n && -1 === n.indexOf(o)) { var s = r(e, t, this, n); if (s.done) return s.value } var l = id(t), c = String(this), u = "function" == typeof n; u || (n = String(n)); var h = l.global; if (h) { var d = l.unicode; l.lastIndex = 0 } for (var m = []; ;) { var p = ud(l, c); if (null === p) break; if (m.push(p), !h) break; "" === String(p[0]) && (l.lastIndex = ld(c, ad(l.lastIndex), d)) } for (var f, g = "", v = 0, y = 0; y < m.length; y++) { p = m[y]; for (var b = String(p[0]), x = hd(dd(od(p.index), c.length), 0), w = [], k = 1; k < p.length; k++)w.push(void 0 === (f = p[k]) ? f : String(f)); var S = p.groups; if (u) { var A = [b].concat(w, x, c); void 0 !== S && A.push(S); var E = String(n.apply(void 0, A)) } else E = cd(b, c, x, w, S, n); x >= v && (g += c.slice(v, x) + E, v = x + b.length) } return g + c.slice(v) }] }); var md = Object.is || function (t, e) { return t === e ? 0 !== t || 1 / t == 1 / e : t != t && e != e }, pd = rt, fd = T, gd = md, vd = Bu; zu("search", 1, function (t, e, r) { return [function (e) { var r = fd(this), n = null == e ? void 0 : e[t]; return void 0 !== n ? n.call(e, r) : new RegExp(e)[t](String(r)) }, function (t) { var n = r(e, t, this); if (n.done) return n.value; var i = pd(t), a = String(this), o = i.lastIndex; gd(o, 0) || (i.lastIndex = 0); var s = vd(i, a); return gd(i.lastIndex, o) || (i.lastIndex = o), null === s ? -1 : s.index }] }); var yd = function (t, e) { for (var r in e) t[r] = e[r]; return t }, bd = function (t, e) { return Array.from(t.querySelectorAll(e)) }, xd = function (t, e, r) { r ? t.classList.add(e) : t.classList.remove(e) }, wd = function (t) { if ("string" == typeof t) { if ("null" === t) return null; if ("true" === t) return !0; if ("false" === t) return !1; if (t.match(/^-?[\d\.]+$/)) return parseFloat(t) } return t }, kd = function (t, e) { t.style.transform = e }, Sd = function (t, e) { var r = t.matches || t.matchesSelector || t.msMatchesSelector; return !(!r || !r.call(t, e)) }, Ad = function (t, e) { if ("function" == typeof t.closest) return t.closest(e); for (; t;) { if (Sd(t, e)) return t; t = t.parentNode } return null }, Ed = function (t, e, r) { for (var n = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "", i = t.querySelectorAll("." + r), a = 0; a < i.length; a++) { var o = i[a]; if (o.parentNode === t) return o } var s = document.createElement(e); return s.className = r, s.innerHTML = n, t.appendChild(s), s }, Md = function (t) { var e = document.createElement("style"); return e.type = "text/css", t && t.length > 0 && (e.styleSheet ? e.styleSheet.cssText = t : e.appendChild(document.createTextNode(t))), document.head.appendChild(e), e }, Rd = function () { + var t = {} + ; for (var e in location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi, function (e) { t[e.split("=").shift()] = e.split("=").pop() }), t) { var r = t[e]; t[e] = wd(unescape(r)) } return void 0 !== t.dependencies && delete t.dependencies, t + }, Td = function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; if (t) { var r, n = t.style.height; return t.style.height = "0px", t.parentNode.style.height = "auto", r = e - t.parentNode.offsetHeight, t.style.height = n + "px", t.parentNode.style.removeProperty("height"), r } return e }, Cd = { mp4: "video/mp4", m4a: "video/mp4", ogv: "video/ogg", mpeg: "video/mpeg", webm: "video/webm" }, Ld = function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ""; return Cd[t.split(".").pop()] }, zd = navigator.userAgent, Nd = /(iphone|ipod|ipad|android)/gi.test(zd) || "MacIntel" === navigator.platform && navigator.maxTouchPoints > 1; /chrome/i.test(zd) && /edge/i.test(zd); var Pd = /android/gi.test(zd), Id = {}; Object.defineProperty(Id, "__esModule", { value: !0 }); var Od = Object.assign || function (t) { for (var e = 1; e < arguments.length; e++) { var r = arguments[e]; for (var n in r) Object.prototype.hasOwnProperty.call(r, n) && (t[n] = r[n]) } return t }, Bd = Id["default"] = function (t) { function e(t, e) { var r = Od({}, E, e), n = t.map(function (t) { var e = Od({}, r, { element: t, active: !0 }); return function (t) { t.originalStyle = { whiteSpace: t.element.style.whiteSpace, display: t.element.style.display, fontSize: t.element.style.fontSize }, A(t), t.newbie = !0, t.dirty = !0, l.push(t) }(e), { element: t, fit: x(e, s), unfreeze: k(e), freeze: S(e), unsubscribe: w(e) } }); return u(), n } function r(t) { var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return "string" == typeof t ? e(n(document.querySelectorAll(t)), r) : e([t], r)[0] } if (t) { var n = function (t) { return [].slice.call(t) }, i = 0, a = 1, o = 2, s = 3, l = [], c = null, u = "requestAnimationFrame" in t ? function () { t.cancelAnimationFrame(c), c = t.requestAnimationFrame(function () { return d(l.filter(function (t) { return t.dirty && t.active })) }) } : function () { }, h = function (t) { return function () { l.forEach(function (e) { return e.dirty = t }), u() } }, d = function (t) { t.filter(function (t) { return !t.styleComputed }).forEach(function (t) { t.styleComputed = g(t) }), t.filter(v).forEach(y); var e = t.filter(f); e.forEach(p), e.forEach(function (t) { y(t), m(t) }), e.forEach(b) }, m = function (t) { return t.dirty = i }, p = function (t) { t.availableWidth = t.element.parentNode.clientWidth, t.currentWidth = t.element.scrollWidth, t.previousFontSize = t.currentFontSize, t.currentFontSize = Math.min(Math.max(t.minSize, t.availableWidth / t.currentWidth * t.previousFontSize), t.maxSize), t.whiteSpace = t.multiLine && t.currentFontSize === t.minSize ? "normal" : "nowrap" }, f = function (t) { return t.dirty !== o || t.dirty === o && t.element.parentNode.clientWidth !== t.availableWidth }, g = function (e) { var r = t.getComputedStyle(e.element, null); e.currentFontSize = parseFloat(r.getPropertyValue("font-size")), e.display = r.getPropertyValue("display"), e.whiteSpace = r.getPropertyValue("white-space") }, v = function (t) { var e = !1; return !t.preStyleTestCompleted && (/inline-/.test(t.display) || (e = !0, t.display = "inline-block"), "nowrap" !== t.whiteSpace && (e = !0, t.whiteSpace = "nowrap"), t.preStyleTestCompleted = !0, e) }, y = function (t) { t.element.style.whiteSpace = t.whiteSpace, t.element.style.display = t.display, t.element.style.fontSize = t.currentFontSize + "px" }, b = function (t) { t.element.dispatchEvent(new CustomEvent("fit", { detail: { oldValue: t.previousFontSize, newValue: t.currentFontSize, scaleFactor: t.currentFontSize / t.previousFontSize } })) }, x = function (t, e) { return function () { t.dirty = e, t.active && u() } }, w = function (t) { return function () { l = l.filter(function (e) { return e.element !== t.element }), t.observeMutations && t.observer.disconnect(), t.element.style.whiteSpace = t.originalStyle.whiteSpace, t.element.style.display = t.originalStyle.display, t.element.style.fontSize = t.originalStyle.fontSize } }, k = function (t) { return function () { t.active || (t.active = !0, u()) } }, S = function (t) { return function () { return t.active = !1 } }, A = function (t) { t.observeMutations && (t.observer = new MutationObserver(x(t, a)), t.observer.observe(t.element, t.observeMutations)) }, E = { minSize: 16, maxSize: 512, multiLine: !0, observeMutations: "MutationObserver" in t && { subtree: !0, childList: !0, characterData: !0 } }, M = null, R = function () { t.clearTimeout(M), M = t.setTimeout(h(o), r.observeWindowDelay) }, T = ["resize", "orientationchange"]; return Object.defineProperty(r, "observeWindow", { set: function (e) { var r = (e ? "add" : "remove") + "EventListener"; T.forEach(function (e) { t[r](e, R) }) } }), r.observeWindow = !0, r.observeWindowDelay = 100, r.fitAll = h(s), r } }("undefined" == typeof window ? null : window), qd = function () { function t(e) { i(this, t), this.Reveal = e, this.startEmbeddedIframe = this.startEmbeddedIframe.bind(this) } return o(t, [{ key: "shouldPreload", value: function (t) { var e = this.Reveal.getConfig().preloadIframes; return "boolean" != typeof e && (e = t.hasAttribute("data-preload")), e } }, { key: "load", value: function (t) { var e = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; t.style.display = this.Reveal.getConfig().display, bd(t, "img[data-src], video[data-src], audio[data-src], iframe[data-src]").forEach(function (t) { ("IFRAME" !== t.tagName || e.shouldPreload(t)) && (t.setAttribute("src", t.getAttribute("data-src")), t.setAttribute("data-lazy-loaded", ""), t.removeAttribute("data-src")) }), bd(t, "video, audio").forEach(function (t) { var e = 0; bd(t, "source[data-src]").forEach(function (t) { t.setAttribute("src", t.getAttribute("data-src")), t.removeAttribute("data-src"), t.setAttribute("data-lazy-loaded", ""), e += 1 }), Nd && "VIDEO" === t.tagName && t.setAttribute("playsinline", ""), e > 0 && t.load() }); var n = t.slideBackgroundElement; if (n) { n.style.display = "block"; var i = t.slideBackgroundContentElement, a = t.getAttribute("data-background-iframe"); if (!1 === n.hasAttribute("data-loaded")) { n.setAttribute("data-loaded", "true"); var o = t.getAttribute("data-background-image"), s = t.getAttribute("data-background-video"), l = t.hasAttribute("data-background-video-loop"), c = t.hasAttribute("data-background-video-muted"); if (o) /^data:/.test(o.trim()) ? i.style.backgroundImage = "url(".concat(o.trim(), ")") : i.style.backgroundImage = o.split(",").map(function (t) { return "url(".concat(encodeURI(t.trim()), ")") }).join(","); else if (s && !this.Reveal.isSpeakerNotes()) { var u = document.createElement("video"); l && u.setAttribute("loop", ""), c && (u.muted = !0), Nd && (u.muted = !0, u.setAttribute("playsinline", "")), s.split(",").forEach(function (t) { var e = Ld(t); u.innerHTML += e ? '') : '') }), i.appendChild(u) } else if (a && !0 !== r.excludeIframes) { var h = document.createElement("iframe"); h.setAttribute("allowfullscreen", ""), h.setAttribute("mozallowfullscreen", ""), h.setAttribute("webkitallowfullscreen", ""), h.setAttribute("allow", "autoplay"), h.setAttribute("data-src", a), h.style.width = "100%", h.style.height = "100%", h.style.maxHeight = "100%", h.style.maxWidth = "100%", i.appendChild(h) } } var d = i.querySelector("iframe[data-src]"); d && this.shouldPreload(n) && !/autoplay=(1|true|yes)/gi.test(a) && d.getAttribute("src") !== a && d.setAttribute("src", a) } this.layout(t) } }, { key: "layout", value: function (t) { var e = this; Array.from(t.querySelectorAll(".r-fit-text")).forEach(function (t) { Bd(t, { minSize: 24, maxSize: .8 * e.Reveal.getConfig().height, observeMutations: !1, observeWindow: !1 }) }) } }, { key: "unload", value: function (t) { t.style.display = "none"; var e = this.Reveal.getSlideBackground(t); e && (e.style.display = "none", bd(e, "iframe[src]").forEach(function (t) { t.removeAttribute("src") })), bd(t, "video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]").forEach(function (t) { t.setAttribute("data-src", t.getAttribute("src")), t.removeAttribute("src") }), bd(t, "video[data-lazy-loaded] source[src], audio source[src]").forEach(function (t) { t.setAttribute("data-src", t.getAttribute("src")), t.removeAttribute("src") }) } }, { key: "formatEmbeddedContent", value: function () { var t = this, e = function (e, r, n) { bd(t.Reveal.getSlidesElement(), "iframe[" + e + '*="' + r + '"]').forEach(function (t) { var r = t.getAttribute(e); r && -1 === r.indexOf(n) && t.setAttribute(e, r + (/\?/.test(r) ? "&" : "?") + n) }) }; e("src", "youtube.com/embed/", "enablejsapi=1"), e("data-src", "youtube.com/embed/", "enablejsapi=1"), e("src", "player.vimeo.com/", "api=1"), e("data-src", "player.vimeo.com/", "api=1") } }, { key: "startEmbeddedContent", value: function (t) { var e = this; t && !this.Reveal.isSpeakerNotes() && (bd(t, 'img[src$=".gif"]').forEach(function (t) { t.setAttribute("src", t.getAttribute("src")) }), bd(t, "video, audio").forEach(function (t) { if (!Ad(t, ".fragment") || Ad(t, ".fragment.visible")) { var r = e.Reveal.getConfig().autoPlayMedia; if ("boolean" != typeof r && (r = t.hasAttribute("data-autoplay") || !!Ad(t, ".slide-background")), r && "function" == typeof t.play) if (t.readyState > 1) e.startEmbeddedMedia({ target: t }); else if (Nd) { var n = t.play(); n && "function" == typeof n["catch"] && !1 === t.controls && n["catch"](function () { t.controls = !0, t.addEventListener("play", function () { t.controls = !1 }) }) } else t.removeEventListener("loadeddata", e.startEmbeddedMedia), t.addEventListener("loadeddata", e.startEmbeddedMedia) } }), bd(t, "iframe[src]").forEach(function (t) { Ad(t, ".fragment") && !Ad(t, ".fragment.visible") || e.startEmbeddedIframe({ target: t }) }), bd(t, "iframe[data-src]").forEach(function (t) { Ad(t, ".fragment") && !Ad(t, ".fragment.visible") || t.getAttribute("src") !== t.getAttribute("data-src") && (t.removeEventListener("load", e.startEmbeddedIframe), t.addEventListener("load", e.startEmbeddedIframe), t.setAttribute("src", t.getAttribute("data-src"))) })) } }, { key: "startEmbeddedMedia", value: function (t) { var e = !!Ad(t.target, "html"), r = !!Ad(t.target, ".present"); e && r && (t.target.currentTime = 0, t.target.play()), t.target.removeEventListener("loadeddata", this.startEmbeddedMedia) } }, { key: "startEmbeddedIframe", value: function (t) { var e = t.target; if (e && e.contentWindow) { var r = !!Ad(t.target, "html"), n = !!Ad(t.target, ".present"); if (r && n) { var i = this.Reveal.getConfig().autoPlayMedia; "boolean" != typeof i && (i = e.hasAttribute("data-autoplay") || !!Ad(e, ".slide-background")), /youtube\.com\/embed\//.test(e.getAttribute("src")) && i ? e.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', "*") : /player\.vimeo\.com\//.test(e.getAttribute("src")) && i ? e.contentWindow.postMessage('{"method":"play"}', "*") : e.contentWindow.postMessage("slide:start", "*") } } } }, { key: "stopEmbeddedContent", value: function (t) { var e = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; r = yd({ unloadIframes: !0 }, r), t && t.parentNode && (bd(t, "video, audio").forEach(function (t) { t.hasAttribute("data-ignore") || "function" != typeof t.pause || (t.setAttribute("data-paused-by-reveal", ""), t.pause()) }), bd(t, "iframe").forEach(function (t) { t.contentWindow && t.contentWindow.postMessage("slide:stop", "*"), t.removeEventListener("load", e.startEmbeddedIframe) }), bd(t, 'iframe[src*="youtube.com/embed/"]').forEach(function (t) { !t.hasAttribute("data-ignore") && t.contentWindow && "function" == typeof t.contentWindow.postMessage && t.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', "*") }), bd(t, 'iframe[src*="player.vimeo.com/"]').forEach(function (t) { !t.hasAttribute("data-ignore") && t.contentWindow && "function" == typeof t.contentWindow.postMessage && t.contentWindow.postMessage('{"method":"pause"}', "*") }), !0 === r.unloadIframes && bd(t, "iframe[data-src]").forEach(function (t) { t.setAttribute("src", "about:blank"), t.removeAttribute("src") })) } }]), t }(), Dd = function () { function t(e) { i(this, t), this.Reveal = e } return o(t, [{ key: "render", value: function () { this.element = document.createElement("div"), this.element.className = "slide-number", this.Reveal.getRevealElement().appendChild(this.element) } }, { key: "configure", value: function (t) { var e = "none"; t.slideNumber && !this.Reveal.isPrintingPDF() && ("all" === t.showSlideNumber || "speaker" === t.showSlideNumber && this.Reveal.isSpeakerNotes()) && (e = "block"), this.element.style.display = e } }, { key: "update", value: function () { this.Reveal.getConfig().slideNumber && this.element && (this.element.innerHTML = this.getSlideNumber()) } }, { key: "getSlideNumber", value: function () { var t, e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.Reveal.getCurrentSlide(), r = this.Reveal.getConfig(), n = "h.v"; if ("function" == typeof r.slideNumber) t = r.slideNumber(e); else { "string" == typeof r.slideNumber && (n = r.slideNumber), /c/.test(n) || 1 !== this.Reveal.getHorizontalSlides().length || (n = "c"); var i = e && "uncounted" === e.dataset.visibility ? 0 : 1; switch (t = [], n) { case "c": t.push(this.Reveal.getSlidePastCount(e) + i); break; case "c/t": t.push(this.Reveal.getSlidePastCount(e) + i, "/", this.Reveal.getTotalSlides()); break; default: var a = this.Reveal.getIndices(e); t.push(a.h + i); var o = "h/v" === n ? "/" : "."; this.Reveal.isVerticalSlide(e) && t.push(o, a.v + 1) } } var s = "#" + this.Reveal.location.getHash(e); return this.formatNumber(t[0], t[1], t[2], s) } }, { key: "formatNumber", value: function (t, e, r) { var n = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "#" + this.Reveal.location.getHash(); return "number" != typeof r || isNaN(r) ? '\n\t\t\t\t\t').concat(t, "\n\t\t\t\t\t") : '\n\t\t\t\t\t').concat(t, '\n\t\t\t\t\t').concat(e, '\n\t\t\t\t\t').concat(r, "\n\t\t\t\t\t") } }, { key: "destroy", value: function () { this.element.remove() } }]), t }(), Fd = or, Hd = N, jd = Mr, Ud = we, _d = ve, Vd = z, Wd = pn, Gd = Gr, Yd = cn("slice"), Xd = Gd("species"), Kd = [].slice, $d = Math.max; Fd({ target: "Array", proto: !0, forced: !Yd }, { slice: function (t, e) { var r, n, i, a = Vd(this), o = _d(a.length), s = Ud(t, o), l = Ud(void 0 === e ? o : e, o); if (jd(a) && ("function" != typeof (r = a.constructor) || r !== Array && !jd(r.prototype) ? Hd(r) && null === (r = r[Xd]) && (r = void 0) : r = void 0, r === Array || void 0 === r)) return Kd.call(a, s, l); for (n = new (void 0 === r ? Array : r)($d(l - s, 0)), i = 0; s < l; s++, i++)s in a && Wd(n, i, a[s]); return n.length = i, n } }); var Zd = function (t) { var e = t.match(/^#([0-9a-f]{3})$/i); if (e && e[1]) return e = e[1], { r: 17 * parseInt(e.charAt(0), 16), g: 17 * parseInt(e.charAt(1), 16), b: 17 * parseInt(e.charAt(2), 16) }; var r = t.match(/^#([0-9a-f]{6})$/i); if (r && r[1]) return r = r[1], { r: parseInt(r.slice(0, 2), 16), g: parseInt(r.slice(2, 4), 16), b: parseInt(r.slice(4, 6), 16) }; var n = t.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i); if (n) return { r: parseInt(n[1], 10), g: parseInt(n[2], 10), b: parseInt(n[3], 10) }; var i = t.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i); return i ? { r: parseInt(i[1], 10), g: parseInt(i[2], 10), b: parseInt(i[3], 10), a: parseFloat(i[4]) } : null }, Jd = function () { function t(e) { i(this, t), this.Reveal = e } return o(t, [{ key: "render", value: function () { this.element = document.createElement("div"), this.element.className = "backgrounds", this.Reveal.getRevealElement().appendChild(this.element) } }, { key: "create", value: function () { var t = this; this.element.innerHTML = "", this.element.classList.add("no-transition"), this.Reveal.getHorizontalSlides().forEach(function (e) { var r = t.createBackground(e, t.element); bd(e, "section").forEach(function (e) { t.createBackground(e, r), r.classList.add("stack") }) }), this.Reveal.getConfig().parallaxBackgroundImage ? (this.element.style.backgroundImage = 'url("' + this.Reveal.getConfig().parallaxBackgroundImage + '")', this.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize, this.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat, this.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition, setTimeout(function () { t.Reveal.getRevealElement().classList.add("has-parallax-background") }, 1)) : (this.element.style.backgroundImage = "", this.Reveal.getRevealElement().classList.remove("has-parallax-background")) } }, { key: "createBackground", value: function (t, e) { var r = document.createElement("div"); r.className = "slide-background " + t.className.replace(/present|past|future/, ""); var n = document.createElement("div"); return n.className = "slide-background-content", r.appendChild(n), e.appendChild(r), t.slideBackgroundElement = r, t.slideBackgroundContentElement = n, this.sync(t), r } }, { key: "sync", value: function (t) { var e = t.slideBackgroundElement, r = t.slideBackgroundContentElement, n = { background: t.getAttribute("data-background"), backgroundSize: t.getAttribute("data-background-size"), backgroundImage: t.getAttribute("data-background-image"), backgroundVideo: t.getAttribute("data-background-video"), backgroundIframe: t.getAttribute("data-background-iframe"), backgroundColor: t.getAttribute("data-background-color"), backgroundRepeat: t.getAttribute("data-background-repeat"), backgroundPosition: t.getAttribute("data-background-position"), backgroundTransition: t.getAttribute("data-background-transition"), backgroundOpacity: t.getAttribute("data-background-opacity") }, i = t.hasAttribute("data-preload"); t.classList.remove("has-dark-background"), t.classList.remove("has-light-background"), e.removeAttribute("data-loaded"), e.removeAttribute("data-background-hash"), e.removeAttribute("data-background-size"), e.removeAttribute("data-background-transition"), e.style.backgroundColor = "", r.style.backgroundSize = "", r.style.backgroundRepeat = "", r.style.backgroundPosition = "", r.style.backgroundImage = "", r.style.opacity = "", r.innerHTML = "", n.background && (/^(http|file|\/\/)/gi.test(n.background) || /\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\s]|$)/gi.test(n.background) ? t.setAttribute("data-background-image", n.background) : e.style.background = n.background), (n.background || n.backgroundColor || n.backgroundImage || n.backgroundVideo || n.backgroundIframe) && e.setAttribute("data-background-hash", n.background + n.backgroundSize + n.backgroundImage + n.backgroundVideo + n.backgroundIframe + n.backgroundColor + n.backgroundRepeat + n.backgroundPosition + n.backgroundTransition + n.backgroundOpacity), n.backgroundSize && e.setAttribute("data-background-size", n.backgroundSize), n.backgroundColor && (e.style.backgroundColor = n.backgroundColor), n.backgroundTransition && e.setAttribute("data-background-transition", n.backgroundTransition), i && e.setAttribute("data-preload", ""), n.backgroundSize && (r.style.backgroundSize = n.backgroundSize), n.backgroundRepeat && (r.style.backgroundRepeat = n.backgroundRepeat), n.backgroundPosition && (r.style.backgroundPosition = n.backgroundPosition), n.backgroundOpacity && (r.style.opacity = n.backgroundOpacity); var a, o = n.backgroundColor; if (!o || !Zd(o)) { var s = window.getComputedStyle(e); s && s.backgroundColor && (o = s.backgroundColor) } if (o) { var l = Zd(o); l && 0 !== l.a && ("string" == typeof (a = o) && (a = Zd(a)), (a ? (299 * a.r + 587 * a.g + 114 * a.b) / 1e3 : null) < 128 ? t.classList.add("has-dark-background") : t.classList.add("has-light-background")) } } }, { key: "update", value: function () { var t = this, e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0], r = this.Reveal.getCurrentSlide(), n = this.Reveal.getIndices(), i = null, a = this.Reveal.getConfig().rtl ? "future" : "past", o = this.Reveal.getConfig().rtl ? "past" : "future"; if (Array.from(this.element.childNodes).forEach(function (t, r) { t.classList.remove("past", "present", "future"), r < n.h ? t.classList.add(a) : r > n.h ? t.classList.add(o) : (t.classList.add("present"), i = t), (e || r === n.h) && bd(t, ".slide-background").forEach(function (t, e) { t.classList.remove("past", "present", "future"), e < n.v ? t.classList.add("past") : e > n.v ? t.classList.add("future") : (t.classList.add("present"), r === n.h && (i = t)) }) }), this.previousBackground && this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload(this.previousBackground) }), i) { this.Reveal.slideContent.startEmbeddedContent(i); var s = i.querySelector(".slide-background-content"); if (s) { var l = s.style.backgroundImage || ""; /\.gif/i.test(l) && (s.style.backgroundImage = "", window.getComputedStyle(s).opacity, s.style.backgroundImage = l) } var c = this.previousBackground ? this.previousBackground.getAttribute("data-background-hash") : null, u = i.getAttribute("data-background-hash"); u && u === c && i !== this.previousBackground && this.element.classList.add("no-transition"), this.previousBackground = i } r && ["has-light-background", "has-dark-background"].forEach(function (e) { r.classList.contains(e) ? t.Reveal.getRevealElement().classList.add(e) : t.Reveal.getRevealElement().classList.remove(e) }, this), setTimeout(function () { t.element.classList.remove("no-transition") }, 1) } }, { key: "updateParallax", value: function () { var t = this.Reveal.getIndices(); if (this.Reveal.getConfig().parallaxBackgroundImage) { var e, r, n = this.Reveal.getHorizontalSlides(), i = this.Reveal.getVerticalSlides(), a = this.element.style.backgroundSize.split(" "); 1 === a.length ? e = r = parseInt(a[0], 10) : (e = parseInt(a[0], 10), r = parseInt(a[1], 10)); var o, s = this.element.offsetWidth, l = n.length; o = ("number" == typeof this.Reveal.getConfig().parallaxBackgroundHorizontal ? this.Reveal.getConfig().parallaxBackgroundHorizontal : l > 1 ? (e - s) / (l - 1) : 0) * t.h * -1; var c, u, h = this.element.offsetHeight, d = i.length; c = "number" == typeof this.Reveal.getConfig().parallaxBackgroundVertical ? this.Reveal.getConfig().parallaxBackgroundVertical : (r - h) / (d - 1), u = d > 0 ? c * t.v : 0, this.element.style.backgroundPosition = o + "px " + -u + "px" } } }, { key: "destroy", value: function () { this.element.remove() } }]), t }(), Qd = B, tm = cr; or({ target: "Object", stat: !0, forced: g(function () { tm(1) }) }, { keys: function (t) { return tm(Qd(t)) } }); var em = an.filter; or({ target: "Array", proto: !0, forced: !cn("filter") }, { filter: function (t) { return em(this, t, arguments.length > 1 ? arguments[1] : void 0) } }); var rm = ".slides section", nm = ".slides>section", im = ".slides>section.present>section", am = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/, om = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/, sm = 0, lm = function () { function t(e) { i(this, t), this.Reveal = e } return o(t, [{ key: "run", value: function (t, e) { var r = this; this.reset(); var n = this.Reveal.getSlides(), i = n.indexOf(e), a = n.indexOf(t); if (t.hasAttribute("data-auto-animate") && e.hasAttribute("data-auto-animate") && t.getAttribute("data-auto-animate-id") === e.getAttribute("data-auto-animate-id") && !(i > a ? e : t).hasAttribute("data-auto-animate-restart")) { this.autoAnimateStyleSheet = this.autoAnimateStyleSheet || Md(); var o = this.getAutoAnimateOptions(e); t.dataset.autoAnimate = "pending", e.dataset.autoAnimate = "pending", o.slideDirection = i > a ? "forward" : "backward"; var s = "none" === t.style.display; s && (t.style.display = this.Reveal.getConfig().display); var l = this.getAutoAnimatableElements(t, e).map(function (t) { return r.autoAnimateElements(t.from, t.to, t.options || {}, o, sm++) }); if (s && (t.style.display = "none"), "false" !== e.dataset.autoAnimateUnmatched && !0 === this.Reveal.getConfig().autoAnimateUnmatched) { var c = .8 * o.duration, u = .2 * o.duration; this.getUnmatchedAutoAnimateElements(e).forEach(function (t) { var e = r.getAutoAnimateOptions(t, o), n = "unmatched"; e.duration === o.duration && e.delay === o.delay || (n = "unmatched-" + sm++, l.push('[data-auto-animate="running"] [data-auto-animate-target="'.concat(n, '"] { transition: opacity ').concat(e.duration, "s ease ").concat(e.delay, "s; }"))), t.dataset.autoAnimateTarget = n }, this), l.push('[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity '.concat(c, "s ease ").concat(u, "s; }")) } this.autoAnimateStyleSheet.innerHTML = l.join(""), requestAnimationFrame(function () { r.autoAnimateStyleSheet && (getComputedStyle(r.autoAnimateStyleSheet).fontWeight, e.dataset.autoAnimate = "running") }), this.Reveal.dispatchEvent({ type: "autoanimate", data: { fromSlide: t, toSlide: e, sheet: this.autoAnimateStyleSheet } }) } } }, { key: "reset", value: function () { bd(this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=""])').forEach(function (t) { t.dataset.autoAnimate = "" }), bd(this.Reveal.getRevealElement(), "[data-auto-animate-target]").forEach(function (t) { delete t.dataset.autoAnimateTarget }), this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode && (this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet), this.autoAnimateStyleSheet = null) } }, { key: "autoAnimateElements", value: function (t, e, r, n, i) { t.dataset.autoAnimateTarget = "", e.dataset.autoAnimateTarget = i; var a = this.getAutoAnimateOptions(e, n); void 0 !== r.delay && (a.delay = r.delay), void 0 !== r.duration && (a.duration = r.duration), void 0 !== r.easing && (a.easing = r.easing); var o = this.getAutoAnimatableProperties("from", t, r), s = this.getAutoAnimatableProperties("to", e, r); if (e.classList.contains("fragment") && (delete s.styles.opacity, t.classList.contains("fragment") && (t.className.match(om) || [""])[0] === (e.className.match(om) || [""])[0] && "forward" === n.slideDirection && e.classList.add("visible", "disabled")), !1 !== r.translate || !1 !== r.scale) { var l = this.Reveal.getScale(), c = { x: (o.x - s.x) / l, y: (o.y - s.y) / l, scaleX: o.width / s.width, scaleY: o.height / s.height }; c.x = Math.round(1e3 * c.x) / 1e3, c.y = Math.round(1e3 * c.y) / 1e3, c.scaleX = Math.round(1e3 * c.scaleX) / 1e3, c.scaleX = Math.round(1e3 * c.scaleX) / 1e3; var u = !1 !== r.translate && (0 !== c.x || 0 !== c.y), h = !1 !== r.scale && (0 !== c.scaleX || 0 !== c.scaleY); if (u || h) { var d = []; u && d.push("translate(".concat(c.x, "px, ").concat(c.y, "px)")), h && d.push("scale(".concat(c.scaleX, ", ").concat(c.scaleY, ")")), o.styles.transform = d.join(" "), o.styles["transform-origin"] = "top left", s.styles.transform = "none" } } for (var m in s.styles) { var p = s.styles[m], f = o.styles[m]; p === f ? delete s.styles[m] : (!0 === p.explicitValue && (s.styles[m] = p.value), !0 === f.explicitValue && (o.styles[m] = f.value)) } var g = "", v = Object.keys(s.styles); return v.length > 0 && (o.styles.transition = "none", s.styles.transition = "all ".concat(a.duration, "s ").concat(a.easing, " ").concat(a.delay, "s"), s.styles["transition-property"] = v.join(", "), s.styles["will-change"] = v.join(", "), g = '[data-auto-animate-target="' + i + '"] {' + Object.keys(o.styles).map(function (t) { return t + ": " + o.styles[t] + " !important;" }).join("") + '}[data-auto-animate="running"] [data-auto-animate-target="' + i + '"] {' + Object.keys(s.styles).map(function (t) { return t + ": " + s.styles[t] + " !important;" }).join("") + "}"), g } }, { key: "getAutoAnimateOptions", value: function (t, e) { var r = { easing: this.Reveal.getConfig().autoAnimateEasing, duration: this.Reveal.getConfig().autoAnimateDuration, delay: 0 }; if (r = yd(r, e), t.parentNode) { var n = Ad(t.parentNode, "[data-auto-animate-target]"); n && (r = this.getAutoAnimateOptions(n, r)) } return t.dataset.autoAnimateEasing && (r.easing = t.dataset.autoAnimateEasing), t.dataset.autoAnimateDuration && (r.duration = parseFloat(t.dataset.autoAnimateDuration)), t.dataset.autoAnimateDelay && (r.delay = parseFloat(t.dataset.autoAnimateDelay)), r } }, { key: "getAutoAnimatableProperties", value: function (t, e, r) { var n = this.Reveal.getConfig(), i = { styles: [] }; if (!1 !== r.translate || !1 !== r.scale) { var a; if ("function" == typeof r.measure) a = r.measure(e); else if (n.center) a = e.getBoundingClientRect(); else { var o = this.Reveal.getScale(); a = { x: e.offsetLeft * o, y: e.offsetTop * o, width: e.offsetWidth * o, height: e.offsetHeight * o } } i.x = a.x, i.y = a.y, i.width = a.width, i.height = a.height } var s = getComputedStyle(e); return (r.styles || n.autoAnimateStyles).forEach(function (e) { var r; "string" == typeof e && (e = { property: e }), "" !== (r = void 0 !== e.from && "from" === t ? { value: e.from, explicitValue: !0 } : void 0 !== e.to && "to" === t ? { value: e.to, explicitValue: !0 } : s[e.property]) && (i.styles[e.property] = r) }), i } }, { key: "getAutoAnimatableElements", value: function (t, e) { var r = ("function" == typeof this.Reveal.getConfig().autoAnimateMatcher ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs).call(this, t, e), n = []; return r.filter(function (t) { if (-1 === n.indexOf(t.to)) return n.push(t.to), !0 }) } }, { key: "getAutoAnimatePairs", value: function (t, e) { var r = this, n = [], i = "h1, h2, h3, h4, h5, h6, p, li"; return this.findAutoAnimateMatches(n, t, e, "[data-id]", function (t) { return t.nodeName + ":::" + t.getAttribute("data-id") }), this.findAutoAnimateMatches(n, t, e, i, function (t) { return t.nodeName + ":::" + t.innerText }), this.findAutoAnimateMatches(n, t, e, "img, video, iframe", function (t) { return t.nodeName + ":::" + (t.getAttribute("src") || t.getAttribute("data-src")) }), this.findAutoAnimateMatches(n, t, e, "pre", function (t) { return t.nodeName + ":::" + t.innerText }), n.forEach(function (t) { Sd(t.from, i) ? t.options = { scale: !1 } : Sd(t.from, "pre") && (t.options = { scale: !1, styles: ["width", "height"] }, r.findAutoAnimateMatches(n, t.from, t.to, ".hljs .hljs-ln-code", function (t) { return t.textContent }, { scale: !1, styles: [], measure: r.getLocalBoundingBox.bind(r) }), r.findAutoAnimateMatches(n, t.from, t.to, ".hljs .hljs-ln-line[data-line-number]", function (t) { return t.getAttribute("data-line-number") }, { scale: !1, styles: ["width"], measure: r.getLocalBoundingBox.bind(r) })) }, this), n } }, { key: "getLocalBoundingBox", value: function (t) { var e = this.Reveal.getScale(); return { x: Math.round(t.offsetLeft * e * 100) / 100, y: Math.round(t.offsetTop * e * 100) / 100, width: Math.round(t.offsetWidth * e * 100) / 100, height: Math.round(t.offsetHeight * e * 100) / 100 } } }, { key: "findAutoAnimateMatches", value: function (t, e, r, n, i, a) { var o = {}, s = {};[].slice.call(e.querySelectorAll(n)).forEach(function (t) { var e = i(t); "string" == typeof e && e.length && (o[e] = o[e] || [], o[e].push(t)) }), [].slice.call(r.querySelectorAll(n)).forEach(function (e) { var r, n = i(e); if (s[n] = s[n] || [], s[n].push(e), o[n]) { var l = s[n].length - 1, c = o[n].length - 1; o[n][l] ? (r = o[n][l], o[n][l] = null) : o[n][c] && (r = o[n][c], o[n][c] = null) } r && t.push({ from: r, to: e, options: a }) }) } }, { key: "getUnmatchedAutoAnimateElements", value: function (t) { var e = this; return [].slice.call(t.children).reduce(function (t, r) { var n = r.querySelector("[data-auto-animate-target]"); return r.hasAttribute("data-auto-animate-target") || n || t.push(r), r.querySelector("[data-auto-animate-target]") && (t = t.concat(e.getUnmatchedAutoAnimateElements(r))), t }, []) } }]), t }(), cm = function () { function t(e) { i(this, t), this.Reveal = e } return o(t, [{ key: "configure", value: function (t, e) { !1 === t.fragments ? this.disable() : !1 === e.fragments && this.enable() } }, { key: "disable", value: function () { bd(this.Reveal.getSlidesElement(), ".fragment").forEach(function (t) { t.classList.add("visible"), t.classList.remove("current-fragment") }) } }, { key: "enable", value: function () { bd(this.Reveal.getSlidesElement(), ".fragment").forEach(function (t) { t.classList.remove("visible"), t.classList.remove("current-fragment") }) } }, { key: "availableRoutes", value: function () { var t = this.Reveal.getCurrentSlide(); if (t && this.Reveal.getConfig().fragments) { var e = t.querySelectorAll(".fragment:not(.disabled)"), r = t.querySelectorAll(".fragment:not(.disabled):not(.visible)"); return { prev: e.length - r.length > 0, next: !!r.length } } return { prev: !1, next: !1 } } }, { key: "sort", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; t = Array.from(t); var r = [], n = [], i = []; t.forEach(function (t) { if (t.hasAttribute("data-fragment-index")) { var e = parseInt(t.getAttribute("data-fragment-index"), 10); r[e] || (r[e] = []), r[e].push(t) } else n.push([t]) }), r = r.concat(n); var a = 0; return r.forEach(function (t) { t.forEach(function (t) { i.push(t), t.setAttribute("data-fragment-index", a) }), a++ }), !0 === e ? r : i } }, { key: "sortAll", value: function () { var t = this; this.Reveal.getHorizontalSlides().forEach(function (e) { var r = bd(e, "section"); r.forEach(function (e) { t.sort(e.querySelectorAll(".fragment")) }, t), 0 === r.length && t.sort(e.querySelectorAll(".fragment")) }) } }, { key: "update", value: function (t, e) { var r = this, n = { shown: [], hidden: [] }, i = this.Reveal.getCurrentSlide(); if (i && this.Reveal.getConfig().fragments && (e = e || this.sort(i.querySelectorAll(".fragment"))).length) { var a = 0; if ("number" != typeof t) { var o = this.sort(i.querySelectorAll(".fragment.visible")).pop(); o && (t = parseInt(o.getAttribute("data-fragment-index") || 0, 10)) } Array.from(e).forEach(function (e, i) { if (e.hasAttribute("data-fragment-index") && (i = parseInt(e.getAttribute("data-fragment-index"), 10)), a = Math.max(a, i), i <= t) { var o = e.classList.contains("visible"); e.classList.add("visible"), e.classList.remove("current-fragment"), i === t && (r.Reveal.announceStatus(r.Reveal.getStatusText(e)), e.classList.add("current-fragment"), r.Reveal.slideContent.startEmbeddedContent(e)), o || (n.shown.push(e), r.Reveal.dispatchEvent({ target: e, type: "visible", bubbles: !1 })) } else { var s = e.classList.contains("visible"); e.classList.remove("visible"), e.classList.remove("current-fragment"), s && (r.Reveal.slideContent.stopEmbeddedContent(e), n.hidden.push(e), r.Reveal.dispatchEvent({ target: e, type: "hidden", bubbles: !1 })) } }), t = "number" == typeof t ? t : -1, t = Math.max(Math.min(t, a), -1), i.setAttribute("data-fragment", t) } return n } }, { key: "sync", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.Reveal.getCurrentSlide(); return this.sort(t.querySelectorAll(".fragment")) } }, { key: "goto", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, r = this.Reveal.getCurrentSlide(); if (r && this.Reveal.getConfig().fragments) { var n = this.sort(r.querySelectorAll(".fragment:not(.disabled)")); if (n.length) { if ("number" != typeof t) { var i = this.sort(r.querySelectorAll(".fragment:not(.disabled).visible")).pop(); t = i ? parseInt(i.getAttribute("data-fragment-index") || 0, 10) : -1 } t += e; var a = this.update(t, n); return a.hidden.length && this.Reveal.dispatchEvent({ type: "fragmenthidden", data: { fragment: a.hidden[0], fragments: a.hidden } }), a.shown.length && this.Reveal.dispatchEvent({ type: "fragmentshown", data: { fragment: a.shown[0], fragments: a.shown } }), this.Reveal.controls.update(), this.Reveal.progress.update(), this.Reveal.getConfig().fragmentInURL && this.Reveal.location.writeURL(), !(!a.shown.length && !a.hidden.length) } } return !1 } }, { key: "next", value: function () { return this.goto(null, 1) } }, { key: "prev", value: function () { return this.goto(null, -1) } }]), t }(), um = function () { + function t(e) { + i(this, t), this.Reveal = e, this.active = !1, + this.onSlideClicked = this.onSlideClicked.bind(this) + } return o(t, [{ key: "activate", value: function () { var t = this; if (this.Reveal.getConfig().overview && !this.isActive()) { this.active = !0, this.Reveal.getRevealElement().classList.add("overview"), this.Reveal.cancelAutoSlide(), this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()), bd(this.Reveal.getRevealElement(), rm).forEach(function (e) { e.classList.contains("stack") || e.addEventListener("click", t.onSlideClicked, !0) }); var e = this.Reveal.getComputedSlideSize(); this.overviewSlideWidth = e.width + 70, this.overviewSlideHeight = e.height + 70, this.Reveal.getConfig().rtl && (this.overviewSlideWidth = -this.overviewSlideWidth), this.Reveal.updateSlidesVisibility(), this.layout(), this.update(), this.Reveal.layout(); var r = this.Reveal.getIndices(); this.Reveal.dispatchEvent({ type: "overviewshown", data: { indexh: r.h, indexv: r.v, currentSlide: this.Reveal.getCurrentSlide() } }) } } }, { key: "layout", value: function () { var t = this; this.Reveal.getHorizontalSlides().forEach(function (e, r) { e.setAttribute("data-index-h", r), kd(e, "translate3d(" + r * t.overviewSlideWidth + "px, 0, 0)"), e.classList.contains("stack") && bd(e, "section").forEach(function (e, n) { e.setAttribute("data-index-h", r), e.setAttribute("data-index-v", n), kd(e, "translate3d(0, " + n * t.overviewSlideHeight + "px, 0)") }) }), Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach(function (e, r) { kd(e, "translate3d(" + r * t.overviewSlideWidth + "px, 0, 0)"), bd(e, ".slide-background").forEach(function (e, r) { kd(e, "translate3d(0, " + r * t.overviewSlideHeight + "px, 0)") }) }) } }, { key: "update", value: function () { var t = Math.min(window.innerWidth, window.innerHeight), e = Math.max(t / 5, 150) / t, r = this.Reveal.getIndices(); this.Reveal.transformSlides({ overview: ["scale(" + e + ")", "translateX(" + -r.h * this.overviewSlideWidth + "px)", "translateY(" + -r.v * this.overviewSlideHeight + "px)"].join(" ") }) } }, { key: "deactivate", value: function () { var t = this; if (this.Reveal.getConfig().overview) { this.active = !1, this.Reveal.getRevealElement().classList.remove("overview"), this.Reveal.getRevealElement().classList.add("overview-deactivating"), setTimeout(function () { t.Reveal.getRevealElement().classList.remove("overview-deactivating") }, 1), this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()), bd(this.Reveal.getRevealElement(), rm).forEach(function (e) { kd(e, ""), e.removeEventListener("click", t.onSlideClicked, !0) }), bd(this.Reveal.getBackgroundsElement(), ".slide-background").forEach(function (t) { kd(t, "") }), this.Reveal.transformSlides({ overview: "" }); var e = this.Reveal.getIndices(); this.Reveal.slide(e.h, e.v), this.Reveal.layout(), this.Reveal.cueAutoSlide(), this.Reveal.dispatchEvent({ type: "overviewhidden", data: { indexh: e.h, indexv: e.v, currentSlide: this.Reveal.getCurrentSlide() } }) } } }, { key: "toggle", value: function (t) { "boolean" == typeof t ? t ? this.activate() : this.deactivate() : this.isActive() ? this.deactivate() : this.activate() } }, { key: "isActive", value: function () { return this.active } }, { key: "onSlideClicked", value: function (t) { if (this.isActive()) { t.preventDefault(); for (var e = t.target; e && !e.nodeName.match(/section/gi);)e = e.parentNode; if (e && !e.classList.contains("disabled") && (this.deactivate(), e.nodeName.match(/section/gi))) { var r = parseInt(e.getAttribute("data-index-h"), 10), n = parseInt(e.getAttribute("data-index-v"), 10); this.Reveal.slide(r, n) } } } }]), t + }(), hm = function () { function t(e) { i(this, t), this.Reveal = e, this.shortcuts = {}, this.bindings = {}, this.onDocumentKeyDown = this.onDocumentKeyDown.bind(this), this.onDocumentKeyPress = this.onDocumentKeyPress.bind(this) } return o(t, [{ key: "configure", value: function (t) { "linear" === t.navigationMode ? (this.shortcuts["→ , ↓ , SPACE , N , L , J"] = "Next slide", this.shortcuts["← , ↑ , P , H , K"] = "Previous slide") : (this.shortcuts["N , SPACE"] = "Next slide", this.shortcuts["P , Shift SPACE"] = "Previous slide", this.shortcuts["← , H"] = "Navigate left", this.shortcuts["→ , L"] = "Navigate right", this.shortcuts["↑ , K"] = "Navigate up", this.shortcuts["↓ , J"] = "Navigate down"), this.shortcuts["Alt + ←/↑/→/↓"] = "Navigate without fragments", this.shortcuts["Shift + ←/↑/→/↓"] = "Jump to first/last slide", this.shortcuts["B , ."] = "Pause", this.shortcuts.F = "Fullscreen", this.shortcuts["ESC, O"] = "Slide overview" } }, { key: "bind", value: function () { document.addEventListener("keydown", this.onDocumentKeyDown, !1), document.addEventListener("keypress", this.onDocumentKeyPress, !1) } }, { key: "unbind", value: function () { document.removeEventListener("keydown", this.onDocumentKeyDown, !1), document.removeEventListener("keypress", this.onDocumentKeyPress, !1) } }, { key: "addKeyBinding", value: function (t, e) { "object" === r(t) && t.keyCode ? this.bindings[t.keyCode] = { callback: e, key: t.key, description: t.description } : this.bindings[t] = { callback: e, key: null, description: null } } }, { key: "removeKeyBinding", value: function (t) { delete this.bindings[t] } }, { key: "triggerKey", value: function (t) { this.onDocumentKeyDown({ keyCode: t }) } }, { key: "registerKeyboardShortcut", value: function (t, e) { this.shortcuts[t] = e } }, { key: "getShortcuts", value: function () { return this.shortcuts } }, { key: "getBindings", value: function () { return this.bindings } }, { key: "onDocumentKeyPress", value: function (t) { t.shiftKey && 63 === t.charCode && this.Reveal.toggleHelp() } }, { key: "onDocumentKeyDown", value: function (t) { var e = this.Reveal.getConfig(); if ("function" == typeof e.keyboardCondition && !1 === e.keyboardCondition(t)) return !0; if ("focused" === e.keyboardCondition && !this.Reveal.isFocused()) return !0; var n = t.keyCode, i = !this.Reveal.isAutoSliding(); this.Reveal.onUserInput(t); var a = document.activeElement && !0 === document.activeElement.isContentEditable, o = document.activeElement && document.activeElement.tagName && /input|textarea/i.test(document.activeElement.tagName), s = document.activeElement && document.activeElement.className && /speaker-notes/i.test(document.activeElement.className), l = !(-1 !== [32, 37, 38, 39, 40, 78, 80].indexOf(t.keyCode) && t.shiftKey || t.altKey) && (t.shiftKey || t.altKey || t.ctrlKey || t.metaKey); if (!(a || o || s || l)) { var c, u = [66, 86, 190, 191]; if ("object" === r(e.keyboard)) for (c in e.keyboard) "togglePause" === e.keyboard[c] && u.push(parseInt(c, 10)); if (this.Reveal.isPaused() && -1 === u.indexOf(n)) return !1; var h, d, m = "linear" === e.navigationMode || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides(), p = !1; if ("object" === r(e.keyboard)) for (c in e.keyboard) if (parseInt(c, 10) === n) { var f = e.keyboard[c]; "function" == typeof f ? f.apply(null, [t]) : "string" == typeof f && "function" == typeof this.Reveal[f] && this.Reveal[f].call(), p = !0 } if (!1 === p) for (c in this.bindings) if (parseInt(c, 10) === n) { var g = this.bindings[c].callback; "function" == typeof g ? g.apply(null, [t]) : "string" == typeof g && "function" == typeof this.Reveal[g] && this.Reveal[g].call(), p = !0 } !1 === p && (p = !0, 80 === n || 33 === n ? this.Reveal.prev({ skipFragments: t.altKey }) : 78 === n || 34 === n ? this.Reveal.next({ skipFragments: t.altKey }) : 72 === n || 37 === n ? t.shiftKey ? this.Reveal.slide(0) : !this.Reveal.overview.isActive() && m ? this.Reveal.prev({ skipFragments: t.altKey }) : this.Reveal.left({ skipFragments: t.altKey }) : 76 === n || 39 === n ? t.shiftKey ? this.Reveal.slide(this.Reveal.getHorizontalSlides().length - 1) : !this.Reveal.overview.isActive() && m ? this.Reveal.next({ skipFragments: t.altKey }) : this.Reveal.right({ skipFragments: t.altKey }) : 75 === n || 38 === n ? t.shiftKey ? this.Reveal.slide(void 0, 0) : !this.Reveal.overview.isActive() && m ? this.Reveal.prev({ skipFragments: t.altKey }) : this.Reveal.up({ skipFragments: t.altKey }) : 74 === n || 40 === n ? t.shiftKey ? this.Reveal.slide(void 0, Number.MAX_VALUE) : !this.Reveal.overview.isActive() && m ? this.Reveal.next({ skipFragments: t.altKey }) : this.Reveal.down({ skipFragments: t.altKey }) : 36 === n ? this.Reveal.slide(0) : 35 === n ? this.Reveal.slide(this.Reveal.getHorizontalSlides().length - 1) : 32 === n ? (this.Reveal.overview.isActive() && this.Reveal.overview.deactivate(), t.shiftKey ? this.Reveal.prev({ skipFragments: t.altKey }) : this.Reveal.next({ skipFragments: t.altKey })) : 58 === n || 59 === n || 66 === n || 86 === n || 190 === n || 191 === n ? this.Reveal.togglePause() : 70 === n ? (d = (h = (h = e.embedded ? this.Reveal.getViewportElement() : document.documentElement) || document.documentElement).requestFullscreen || h.webkitRequestFullscreen || h.webkitRequestFullScreen || h.mozRequestFullScreen || h.msRequestFullscreen) && d.apply(h) : 65 === n ? e.autoSlideStoppable && this.Reveal.toggleAutoSlide(i) : p = !1), p ? t.preventDefault && t.preventDefault() : 27 !== n && 79 !== n || (!1 === this.Reveal.closeOverlay() && this.Reveal.overview.toggle(), t.preventDefault && t.preventDefault()), this.Reveal.cueAutoSlide() } } }]), t }(), dm = function () { function t(e) { i(this, t), s(this, "MAX_REPLACE_STATE_FREQUENCY", 1e3), this.Reveal = e, this.writeURLTimeout = 0, this.replaceStateTimestamp = 0, this.onWindowHashChange = this.onWindowHashChange.bind(this) } return o(t, [{ key: "bind", value: function () { window.addEventListener("hashchange", this.onWindowHashChange, !1) } }, { key: "unbind", value: function () { window.removeEventListener("hashchange", this.onWindowHashChange, !1) } }, { key: "getIndicesFromHash", value: function () { var t, r, n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : window.location.hash).replace(/^#\/?/, ""), i = n.split("/"); if (/^[0-9]*$/.test(i[0]) || !n.length) { var a, o = this.Reveal.getConfig(), s = o.hashOneBasedIndex ? 1 : 0, l = parseInt(i[0], 10) - s || 0, c = parseInt(i[1], 10) - s || 0; return o.fragmentInURL && (a = parseInt(i[2], 10), isNaN(a) && (a = void 0)), { h: l, v: c, f: a } } /\/[-\d]+$/g.test(n) && (r = parseInt(n.split("/").pop(), 10), r = isNaN(r) ? void 0 : r, n = n.split("/").shift()); try { t = document.getElementById(decodeURIComponent(n)) } catch (t) { } return t ? e(e({}, this.Reveal.getIndices(t)), {}, { f: r }) : null } }, { key: "readURL", value: function () { var t = this.Reveal.getIndices(), e = this.getIndicesFromHash(); e ? e.h === t.h && e.v === t.v && void 0 === e.f || this.Reveal.slide(e.h, e.v, e.f) : this.Reveal.slide(t.h || 0, t.v || 0) } }, { key: "writeURL", value: function (t) { var e = this.Reveal.getConfig(), r = this.Reveal.getCurrentSlide(); if (clearTimeout(this.writeURLTimeout), "number" == typeof t) this.writeURLTimeout = setTimeout(this.writeURL, t); else if (r) { var n = this.getHash(); e.history ? window.location.hash = n : e.hash && ("/" === n ? this.debouncedReplaceState(window.location.pathname + window.location.search) : this.debouncedReplaceState("#" + n)) } } }, { key: "replaceState", value: function (t) { window.history.replaceState(null, null, t), this.replaceStateTimestamp = Date.now() } }, { key: "debouncedReplaceState", value: function (t) { var e = this; clearTimeout(this.replaceStateTimeout), Date.now() - this.replaceStateTimestamp > this.MAX_REPLACE_STATE_FREQUENCY ? this.replaceState(t) : this.replaceStateTimeout = setTimeout(function () { return e.replaceState(t) }, this.MAX_REPLACE_STATE_FREQUENCY) } }, { key: "getHash", value: function (t) { var e = "/", r = t || this.Reveal.getCurrentSlide(), n = r ? r.getAttribute("id") : null; n && (n = encodeURIComponent(n)); var i = this.Reveal.getIndices(t); if (this.Reveal.getConfig().fragmentInURL || (i.f = void 0), "string" == typeof n && n.length) e = "/" + n, i.f >= 0 && (e += "/" + i.f); else { var a = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0; (i.h > 0 || i.v > 0 || i.f >= 0) && (e += i.h + a), (i.v > 0 || i.f >= 0) && (e += "/" + (i.v + a)), i.f >= 0 && (e += "/" + i.f) } return e } }, { key: "onWindowHashChange", value: function () { this.readURL() } }]), t }(), mm = function () { function t(e) { i(this, t), this.Reveal = e, this.onNavigateLeftClicked = this.onNavigateLeftClicked.bind(this), this.onNavigateRightClicked = this.onNavigateRightClicked.bind(this), this.onNavigateUpClicked = this.onNavigateUpClicked.bind(this), this.onNavigateDownClicked = this.onNavigateDownClicked.bind(this), this.onNavigatePrevClicked = this.onNavigatePrevClicked.bind(this), this.onNavigateNextClicked = this.onNavigateNextClicked.bind(this) } return o(t, [{ key: "render", value: function () { var t = this.Reveal.getConfig().rtl, e = this.Reveal.getRevealElement(); this.element = document.createElement("aside"), this.element.className = "controls", this.element.innerHTML = '\n\t\t\t\n\t\t\t\n\t\t\t'), this.Reveal.getRevealElement().appendChild(this.element), this.controlsLeft = bd(e, ".navigate-left"), this.controlsRight = bd(e, ".navigate-right"), this.controlsUp = bd(e, ".navigate-up"), this.controlsDown = bd(e, ".navigate-down"), this.controlsPrev = bd(e, ".navigate-prev"), this.controlsNext = bd(e, ".navigate-next"), this.controlsRightArrow = this.element.querySelector(".navigate-right"), this.controlsLeftArrow = this.element.querySelector(".navigate-left"), this.controlsDownArrow = this.element.querySelector(".navigate-down") } }, { key: "configure", value: function (t) { this.element.style.display = t.controls ? "block" : "none", this.element.setAttribute("data-controls-layout", t.controlsLayout), this.element.setAttribute("data-controls-back-arrows", t.controlsBackArrows) } }, { key: "bind", value: function () { var t = this, e = ["touchstart", "click"]; Pd && (e = ["touchstart"]), e.forEach(function (e) { t.controlsLeft.forEach(function (r) { return r.addEventListener(e, t.onNavigateLeftClicked, !1) }), t.controlsRight.forEach(function (r) { return r.addEventListener(e, t.onNavigateRightClicked, !1) }), t.controlsUp.forEach(function (r) { return r.addEventListener(e, t.onNavigateUpClicked, !1) }), t.controlsDown.forEach(function (r) { return r.addEventListener(e, t.onNavigateDownClicked, !1) }), t.controlsPrev.forEach(function (r) { return r.addEventListener(e, t.onNavigatePrevClicked, !1) }), t.controlsNext.forEach(function (r) { return r.addEventListener(e, t.onNavigateNextClicked, !1) }) }) } }, { key: "unbind", value: function () { var t = this;["touchstart", "click"].forEach(function (e) { t.controlsLeft.forEach(function (r) { return r.removeEventListener(e, t.onNavigateLeftClicked, !1) }), t.controlsRight.forEach(function (r) { return r.removeEventListener(e, t.onNavigateRightClicked, !1) }), t.controlsUp.forEach(function (r) { return r.removeEventListener(e, t.onNavigateUpClicked, !1) }), t.controlsDown.forEach(function (r) { return r.removeEventListener(e, t.onNavigateDownClicked, !1) }), t.controlsPrev.forEach(function (r) { return r.removeEventListener(e, t.onNavigatePrevClicked, !1) }), t.controlsNext.forEach(function (r) { return r.removeEventListener(e, t.onNavigateNextClicked, !1) }) }) } }, { key: "update", value: function () { var t = this.Reveal.availableRoutes();[].concat(l(this.controlsLeft), l(this.controlsRight), l(this.controlsUp), l(this.controlsDown), l(this.controlsPrev), l(this.controlsNext)).forEach(function (t) { t.classList.remove("enabled", "fragmented"), t.setAttribute("disabled", "disabled") }), t.left && this.controlsLeft.forEach(function (t) { t.classList.add("enabled"), t.removeAttribute("disabled") }), t.right && this.controlsRight.forEach(function (t) { t.classList.add("enabled"), t.removeAttribute("disabled") }), t.up && this.controlsUp.forEach(function (t) { t.classList.add("enabled"), t.removeAttribute("disabled") }), t.down && this.controlsDown.forEach(function (t) { t.classList.add("enabled"), t.removeAttribute("disabled") }), (t.left || t.up) && this.controlsPrev.forEach(function (t) { t.classList.add("enabled"), t.removeAttribute("disabled") }), (t.right || t.down) && this.controlsNext.forEach(function (t) { t.classList.add("enabled"), t.removeAttribute("disabled") }); var e = this.Reveal.getCurrentSlide(); if (e) { var r = this.Reveal.fragments.availableRoutes(); r.prev && this.controlsPrev.forEach(function (t) { t.classList.add("fragmented", "enabled"), t.removeAttribute("disabled") }), r.next && this.controlsNext.forEach(function (t) { t.classList.add("fragmented", "enabled"), t.removeAttribute("disabled") }), this.Reveal.isVerticalSlide(e) ? (r.prev && this.controlsUp.forEach(function (t) { t.classList.add("fragmented", "enabled"), t.removeAttribute("disabled") }), r.next && this.controlsDown.forEach(function (t) { t.classList.add("fragmented", "enabled"), t.removeAttribute("disabled") })) : (r.prev && this.controlsLeft.forEach(function (t) { t.classList.add("fragmented", "enabled"), t.removeAttribute("disabled") }), r.next && this.controlsRight.forEach(function (t) { t.classList.add("fragmented", "enabled"), t.removeAttribute("disabled") })) } if (this.Reveal.getConfig().controlsTutorial) { var n = this.Reveal.getIndices(); !this.Reveal.hasNavigatedVertically() && t.down ? this.controlsDownArrow.classList.add("highlight") : (this.controlsDownArrow.classList.remove("highlight"), this.Reveal.getConfig().rtl ? !this.Reveal.hasNavigatedHorizontally() && t.left && 0 === n.v ? this.controlsLeftArrow.classList.add("highlight") : this.controlsLeftArrow.classList.remove("highlight") : !this.Reveal.hasNavigatedHorizontally() && t.right && 0 === n.v ? this.controlsRightArrow.classList.add("highlight") : this.controlsRightArrow.classList.remove("highlight")) } } }, { key: "destroy", value: function () { this.unbind(), this.element.remove() } }, { key: "onNavigateLeftClicked", value: function (t) { t.preventDefault(), this.Reveal.onUserInput(), "linear" === this.Reveal.getConfig().navigationMode ? this.Reveal.prev() : this.Reveal.left() } }, { key: "onNavigateRightClicked", value: function (t) { t.preventDefault(), this.Reveal.onUserInput(), "linear" === this.Reveal.getConfig().navigationMode ? this.Reveal.next() : this.Reveal.right() } }, { key: "onNavigateUpClicked", value: function (t) { t.preventDefault(), this.Reveal.onUserInput(), this.Reveal.up() } }, { key: "onNavigateDownClicked", value: function (t) { t.preventDefault(), this.Reveal.onUserInput(), this.Reveal.down() } }, { key: "onNavigatePrevClicked", value: function (t) { t.preventDefault(), this.Reveal.onUserInput(), this.Reveal.prev() } }, { key: "onNavigateNextClicked", value: function (t) { t.preventDefault(), this.Reveal.onUserInput(), this.Reveal.next() } }]), t }(), pm = function () { function t(e) { i(this, t), this.Reveal = e, this.onProgressClicked = this.onProgressClicked.bind(this) } return o(t, [{ key: "render", value: function () { this.element = document.createElement("div"), this.element.className = "progress", this.Reveal.getRevealElement().appendChild(this.element), this.bar = document.createElement("span"), this.element.appendChild(this.bar) } }, { key: "configure", value: function (t) { this.element.style.display = t.progress ? "block" : "none" } }, { key: "bind", value: function () { this.Reveal.getConfig().progress && this.element && this.element.addEventListener("click", this.onProgressClicked, !1) } }, { key: "unbind", value: function () { this.Reveal.getConfig().progress && this.element && this.element.removeEventListener("click", this.onProgressClicked, !1) } }, { key: "update", value: function () { if (this.Reveal.getConfig().progress && this.bar) { var t = this.Reveal.getProgress(); this.Reveal.getTotalSlides() < 2 && (t = 0), this.bar.style.transform = "scaleX(" + t + ")" } } }, { key: "getMaxWidth", value: function () { return this.Reveal.getRevealElement().offsetWidth } }, { key: "onProgressClicked", value: function (t) { this.Reveal.onUserInput(t), t.preventDefault(); var e = this.Reveal.getSlides(), r = e.length, n = Math.floor(t.clientX / this.getMaxWidth() * r); this.Reveal.getConfig().rtl && (n = r - n); var i = this.Reveal.getIndices(e[n]); this.Reveal.slide(i.h, i.v) } }, { key: "destroy", value: function () { this.element.remove() } }]), t }(), fm = function () { function t(e) { i(this, t), this.Reveal = e, this.lastMouseWheelStep = 0, this.cursorHidden = !1, this.cursorInactiveTimeout = 0, this.onDocumentCursorActive = this.onDocumentCursorActive.bind(this), this.onDocumentMouseScroll = this.onDocumentMouseScroll.bind(this) } return o(t, [{ key: "configure", value: function (t) { t.mouseWheel ? (document.addEventListener("DOMMouseScroll", this.onDocumentMouseScroll, !1), document.addEventListener("mousewheel", this.onDocumentMouseScroll, !1)) : (document.removeEventListener("DOMMouseScroll", this.onDocumentMouseScroll, !1), document.removeEventListener("mousewheel", this.onDocumentMouseScroll, !1)), t.hideInactiveCursor ? (document.addEventListener("mousemove", this.onDocumentCursorActive, !1), document.addEventListener("mousedown", this.onDocumentCursorActive, !1)) : (this.showCursor(), document.removeEventListener("mousemove", this.onDocumentCursorActive, !1), document.removeEventListener("mousedown", this.onDocumentCursorActive, !1)) } }, { key: "showCursor", value: function () { this.cursorHidden && (this.cursorHidden = !1, this.Reveal.getRevealElement().style.cursor = "") } }, { key: "hideCursor", value: function () { !1 === this.cursorHidden && (this.cursorHidden = !0, this.Reveal.getRevealElement().style.cursor = "none") } }, { key: "destroy", value: function () { this.showCursor(), document.removeEventListener("DOMMouseScroll", this.onDocumentMouseScroll, !1), document.removeEventListener("mousewheel", this.onDocumentMouseScroll, !1), document.removeEventListener("mousemove", this.onDocumentCursorActive, !1), document.removeEventListener("mousedown", this.onDocumentCursorActive, !1) } }, { key: "onDocumentCursorActive", value: function () { this.showCursor(), clearTimeout(this.cursorInactiveTimeout), this.cursorInactiveTimeout = setTimeout(this.hideCursor.bind(this), this.Reveal.getConfig().hideCursorTime) } }, { key: "onDocumentMouseScroll", value: function (t) { if (Date.now() - this.lastMouseWheelStep > 1e3) { this.lastMouseWheelStep = Date.now(); var e = t.detail || -t.wheelDelta; e > 0 ? this.Reveal.next() : e < 0 && this.Reveal.prev() } } }]), t }(), gm = v, vm = cr, ym = z, bm = y.f, xm = function (t) { return function (e) { for (var r, n = ym(e), i = vm(n), a = i.length, o = 0, s = []; a > o;)r = i[o++], gm && !bm.call(n, r) || s.push(t ? [r, n[r]] : n[r]); return s } }, wm = (xm(!0), xm(!1)); or({ target: "Object", stat: !0 }, { values: function (t) { return wm(t) } }); var km = function (t, e) { var r = document.createElement("script"); r.type = "text/javascript", r.async = !1, r.defer = !1, r.src = t, "function" == typeof e && (r.onload = r.onreadystatechange = function (t) { ("load" === t.type || /loaded|complete/.test(r.readyState)) && (r.onload = r.onreadystatechange = r.onerror = null, e()) }, r.onerror = function (t) { r.onload = r.onreadystatechange = r.onerror = null, e(new Error("Failed loading script: " + r.src + "\n" + t)) }); var n = document.querySelector("head"); n.insertBefore(r, n.lastChild) }, Sm = function () { function t(e) { i(this, t), this.Reveal = e, this.state = "idle", this.registeredPlugins = {}, this.asyncDependencies = [] } return o(t, [{ key: "load", value: function (t, e) { var r = this; return this.state = "loading", t.forEach(this.registerPlugin.bind(this)), new Promise(function (t) { var n = [], i = 0; if (e.forEach(function (t) { t.condition && !t.condition() || (t.async ? r.asyncDependencies.push(t) : n.push(t)) }), n.length) { i = n.length; var a = function (e) { e && "function" == typeof e.callback && e.callback(), 0 == --i && r.initPlugins().then(t) }; n.forEach(function (t) { "string" == typeof t.id ? (r.registerPlugin(t), a(t)) : "string" == typeof t.src ? km(t.src, function () { return a(t) }) : (console.warn("Unrecognized plugin format", t), a()) }) } else r.initPlugins().then(t) }) } }, { key: "initPlugins", value: function () { var t = this; return new Promise(function (e) { var r = Object.values(t.registeredPlugins), n = r.length; if (0 === n) t.loadAsync().then(e); else { var i, a = function () { 0 == --n ? t.loadAsync().then(e) : i() }, o = 0; (i = function () { var e = r[o++]; if ("function" == typeof e.init) { var n = e.init(t.Reveal); n && "function" == typeof n.then ? n.then(a) : a() } else a() })() } }) } }, { key: "loadAsync", value: function () { return this.state = "loaded", this.asyncDependencies.length && this.asyncDependencies.forEach(function (t) { km(t.src, t.callback) }), Promise.resolve() } }, { key: "registerPlugin", value: function (t) { 2 === arguments.length && "string" == typeof arguments[0] ? (t = arguments[1]).id = arguments[0] : "function" == typeof t && (t = t()); var e = t.id; "string" != typeof e ? console.warn("Unrecognized plugin format; can't find plugin.id", t) : void 0 === this.registeredPlugins[e] ? (this.registeredPlugins[e] = t, "loaded" === this.state && "function" == typeof t.init && t.init(this.Reveal)) : console.warn('reveal.js: "' + e + '" plugin has already been registered') } }, { key: "hasPlugin", value: function (t) { return !!this.registeredPlugins[t] } }, { key: "getPlugin", value: function (t) { return this.registeredPlugins[t] } }, { key: "getRegisteredPlugins", value: function () { return this.registeredPlugins } }, { key: "destroy", value: function () { Object.values(this.registeredPlugins).forEach(function (t) { "function" == typeof t.destroy && t.destroy() }), this.registeredPlugins = {}, this.asyncDependencies = [] } }]), t }(); !function (t) { var e = function (t) { function e(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e] } function r(t, e, r, a) { var o = e && e.prototype instanceof i ? e : i, s = Object.create(o.prototype), l = new d(a || []); return s._invoke = function (t, e, r) { var i = k; return function (a, o) { if (i === A) throw new Error("Generator is already running"); if (i === E) { if ("throw" === a) throw o; return p() } for (r.method = a, r.arg = o; ;) { var s = r.delegate; if (s) { var l = c(s, r); if (l) { if (l === M) continue; return l } } if ("next" === r.method) r.sent = r._sent = r.arg; else if ("throw" === r.method) { if (i === k) throw i = E, r.arg; r.dispatchException(r.arg) } else "return" === r.method && r.abrupt("return", r.arg); i = A; var u = n(t, e, r); if ("normal" === u.type) { if (i = r.done ? E : S, u.arg === M) continue; return { value: u.arg, done: r.done } } "throw" === u.type && (i = E, r.method = "throw", r.arg = u.arg) } } }(t, r, l), s } function n(t, e, r) { try { return { type: "normal", arg: t.call(e, r) } } catch (t) { return { type: "throw", arg: t } } } function i() { } function a() { } function o() { } function s(t) { ["next", "throw", "return"].forEach(function (r) { e(t, r, function (t) { return this._invoke(r, t) }) }) } function l(t, e) { function r(i, a, o, s) { var l = n(t[i], t, a); if ("throw" !== l.type) { var c = l.arg, u = c.value; return u && "object" == typeof u && v.call(u, "__await") ? e.resolve(u.__await).then(function (t) { r("next", t, o, s) }, function (t) { r("throw", t, o, s) }) : e.resolve(u).then(function (t) { c.value = t, o(c) }, function (t) { return r("throw", t, o, s) }) } s(l.arg) } var i; this._invoke = function (t, n) { function a() { return new e(function (e, i) { r(t, n, e, i) }) } return i = i ? i.then(a, a) : a() } } function c(t, e) { var r = t.iterator[e.method]; if (r === f) { if (e.delegate = null, "throw" === e.method) { if (t.iterator["return"] && (e.method = "return", e.arg = f, c(t, e), "throw" === e.method)) return M; e.method = "throw", e.arg = new TypeError("The iterator does not provide a 'throw' method") } return M } var i = n(r, t.iterator, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, M; var a = i.arg; return a ? a.done ? (e[t.resultName] = a.value, e.next = t.nextLoc, "return" !== e.method && (e.method = "next", e.arg = f), e.delegate = null, M) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, M) } function u(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e) } function h(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e } function d(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(u, this), this.reset(!0) } function m(t) { if (t) { var e = t[b]; if (e) return e.call(t); if ("function" == typeof t.next) return t; if (!isNaN(t.length)) { var r = -1, n = function e() { for (; ++r < t.length;)if (v.call(t, r)) return e.value = t[r], e.done = !1, e; return e.value = f, e.done = !0, e }; return n.next = n } } return { next: p } } function p() { return { value: f, done: !0 } } var f, g = Object.prototype, v = g.hasOwnProperty, y = "function" == typeof Symbol ? Symbol : {}, b = y.iterator || "@@iterator", x = y.asyncIterator || "@@asyncIterator", w = y.toStringTag || "@@toStringTag"; try { e({}, "") } catch (t) { e = function (t, e, r) { return t[e] = r } } t.wrap = r; var k = "suspendedStart", S = "suspendedYield", A = "executing", E = "completed", M = {}, R = {}; R[b] = function () { return this }; var T = Object.getPrototypeOf, C = T && T(T(m([]))); C && C !== g && v.call(C, b) && (R = C); var L = o.prototype = i.prototype = Object.create(R); return a.prototype = L.constructor = o, o.constructor = a, a.displayName = e(o, w, "GeneratorFunction"), t.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === a || "GeneratorFunction" === (e.displayName || e.name)) }, t.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, o) : (t.__proto__ = o, e(t, w, "GeneratorFunction")), t.prototype = Object.create(L), t }, t.awrap = function (t) { return { __await: t } }, s(l.prototype), l.prototype[x] = function () { return this }, t.AsyncIterator = l, t.async = function (e, n, i, a, o) { void 0 === o && (o = Promise); var s = new l(r(e, n, i, a), o); return t.isGeneratorFunction(n) ? s : s.next().then(function (t) { return t.done ? t.value : s.next() }) }, s(L), e(L, w, "Generator"), L[b] = function () { return this }, L.toString = function () { return "[object Generator]" }, t.keys = function (t) { var e = []; for (var r in t) e.push(r); return e.reverse(), function n() { for (; e.length;) { var r = e.pop(); if (r in t) return n.value = r, n.done = !1, n } return n.done = !0, n } }, t.values = m, d.prototype = { constructor: d, reset: function (t) { if (this.prev = 0, this.next = 0, this.sent = this._sent = f, this.done = !1, this.delegate = null, this.method = "next", this.arg = f, this.tryEntries.forEach(h), !t) for (var e in this) "t" === e.charAt(0) && v.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = f) }, stop: function () { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval }, dispatchException: function (t) { function e(e, n) { return a.type = "throw", a.arg = t, r.next = e, n && (r.method = "next", r.arg = f), !!n } if (this.done) throw t; for (var r = this, n = this.tryEntries.length - 1; n >= 0; --n) { var i = this.tryEntries[n], a = i.completion; if ("root" === i.tryLoc) return e("end"); if (i.tryLoc <= this.prev) { var o = v.call(i, "catchLoc"), s = v.call(i, "finallyLoc"); if (o && s) { if (this.prev < i.catchLoc) return e(i.catchLoc, !0); if (this.prev < i.finallyLoc) return e(i.finallyLoc) } else if (o) { if (this.prev < i.catchLoc) return e(i.catchLoc, !0) } else { if (!s) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return e(i.finallyLoc) } } } }, abrupt: function (t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var n = this.tryEntries[r]; if (n.tryLoc <= this.prev && v.call(n, "finallyLoc") && this.prev < n.finallyLoc) { var i = n; break } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, M) : this.complete(a) }, complete: function (t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), M }, finish: function (t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), h(r), M } }, "catch": function (t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var i = n.arg; h(r) } return i } } throw new Error("illegal catch attempt") }, delegateYield: function (t, e, r) { return this.delegate = { iterator: m(t), resultName: e, nextLoc: r }, "next" === this.method && (this.arg = f), M } }, t }(t.exports); try { regeneratorRuntime = e } catch (t) { Function("r", "regeneratorRuntime = r")(e) } }({ exports: {} }); var Am = function () { + function t(e) { i(this, t), this.Reveal = e } var e, r; return o(t, [{ + key: "setupPDF", value: (e = regeneratorRuntime.mark(function a() { + var t, e, r, n, i, o, s, l, c, u, h, d, m, p, f; return regeneratorRuntime.wrap(function (a) { + for (; ;)switch (a.prev = a.next) { + case 0: return t = this.Reveal.getConfig(), e = bd(this.Reveal.getRevealElement(), rm), r = t.slideNumber && /all|print/i.test(t.showSlideNumber), n = this.Reveal.getComputedSlideSize(window.innerWidth, window.innerHeight), i = Math.floor(n.width * (1 + t.margin)), o = Math.floor(n.height * (1 + t.margin)), s = n.width, l = n.height, a.next = 8, new Promise(requestAnimationFrame); case 8: return Md("@page{size:" + i + "px " + o + "px; margin: 0px;}"), Md(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: " + s + "px; max-height:" + l + "px}"), document.documentElement.classList.add("print-pdf"), document.body.style.width = i + "px", document.body.style.height = o + "px", (c = document.querySelector(".reveal-viewport")) && (h = window.getComputedStyle(c)) && h.background && (u = h.background), a.next = 17, new Promise(requestAnimationFrame); case 17: return this.Reveal.layoutSlideContents(s, l), a.next = 20, new Promise(requestAnimationFrame); case 20: return d = e.map(function (t) { return t.scrollHeight }), m = [], p = e[0].parentNode, f = 1, e.forEach(function (e, n) { + if (!1 === e.classList.contains("stack")) { + var a = (i - s) / 2, c = (o - l) / 2, h = d[n], p = Math.max(Math.ceil(h / o), 1); (1 === (p = Math.min(p, t.pdfMaxPagesPerSlide)) && t.center || e.classList.contains("center")) && (c = Math.max((o - h) / 2, 0)); var g = document.createElement("div"); if (m.push(g), g.className = "pdf-page", g.style.height = (o + t.pdfPageHeightOffset) * p + "px", u && (g.style.background = u), g.appendChild(e), e.style.left = a + "px", e.style.top = c + "px", e.style.width = s + "px", this.Reveal.slideContent.layout(e), e.slideBackgroundElement && g.insertBefore(e.slideBackgroundElement, e), t.showNotes) { var v = this.Reveal.getSlideNotes(e); if (v) { var y = "string" == typeof t.showNotes ? t.showNotes : "inline", b = document.createElement("div"); b.classList.add("speaker-notes"), b.classList.add("speaker-notes-pdf"), b.setAttribute("data-layout", y), b.innerHTML = v, "separate-page" === y ? m.push(b) : (b.style.left = "8px", b.style.bottom = "8px", b.style.width = i - 16 + "px", g.appendChild(b)) } } if (r) { var x = document.createElement("div"); x.classList.add("slide-number"), x.classList.add("slide-number-pdf"), x.innerHTML = f++, g.appendChild(x) } if (t.pdfSeparateFragments) { + var w, k = this.Reveal.fragments.sort(g.querySelectorAll(".fragment"), !0); k.forEach(function (t, e) { w && w.forEach(function (t) { t.classList.remove("current-fragment") }), t.forEach(function (t) { t.classList.add("visible", "current-fragment") }, this); var n = g.cloneNode(!0); if (r) { var i = e + 1; n.querySelector(".slide-number-pdf").innerHTML += "." + i } m.push(n), w = t }, this), k.forEach(function (t) { + t.forEach(function (t) { t.classList.remove("visible", "current-fragment") }) + }) + } else bd(g, ".fragment:not(.fade-out)").forEach(function (t) { t.classList.add("visible") }) + } + }, this), a.next = 27, new Promise(requestAnimationFrame); case 27: m.forEach(function (t) { return p.appendChild(t) }), this.Reveal.dispatchEvent({ type: "pdf-ready" }); case 29: case "end": return a.stop() + } + }, a, this) + }), r = function () { var t = this, r = arguments; return new Promise(function (i, a) { function o(t) { n(l, i, a, o, s, "next", t) } function s(t) { n(l, i, a, o, s, "throw", t) } var l = e.apply(t, r); o(void 0) }) }, function () { return r.apply(this, arguments) }) + }, { key: "isPrintingPDF", value: function () { return /print-pdf/gi.test(window.location.search) } }]), t + }(), Em = function () { function t(e) { i(this, t), this.Reveal = e, this.touchStartX = 0, this.touchStartY = 0, this.touchStartCount = 0, this.touchCaptured = !1, this.onPointerDown = this.onPointerDown.bind(this), this.onPointerMove = this.onPointerMove.bind(this), this.onPointerUp = this.onPointerUp.bind(this), this.onTouchStart = this.onTouchStart.bind(this), this.onTouchMove = this.onTouchMove.bind(this), this.onTouchEnd = this.onTouchEnd.bind(this) } return o(t, [{ key: "bind", value: function () { var t = this.Reveal.getRevealElement(); "onpointerdown" in window ? (t.addEventListener("pointerdown", this.onPointerDown, !1), t.addEventListener("pointermove", this.onPointerMove, !1), t.addEventListener("pointerup", this.onPointerUp, !1)) : window.navigator.msPointerEnabled ? (t.addEventListener("MSPointerDown", this.onPointerDown, !1), t.addEventListener("MSPointerMove", this.onPointerMove, !1), t.addEventListener("MSPointerUp", this.onPointerUp, !1)) : (t.addEventListener("touchstart", this.onTouchStart, !1), t.addEventListener("touchmove", this.onTouchMove, !1), t.addEventListener("touchend", this.onTouchEnd, !1)) } }, { key: "unbind", value: function () { var t = this.Reveal.getRevealElement(); t.removeEventListener("pointerdown", this.onPointerDown, !1), t.removeEventListener("pointermove", this.onPointerMove, !1), t.removeEventListener("pointerup", this.onPointerUp, !1), t.removeEventListener("MSPointerDown", this.onPointerDown, !1), t.removeEventListener("MSPointerMove", this.onPointerMove, !1), t.removeEventListener("MSPointerUp", this.onPointerUp, !1), t.removeEventListener("touchstart", this.onTouchStart, !1), t.removeEventListener("touchmove", this.onTouchMove, !1), t.removeEventListener("touchend", this.onTouchEnd, !1) } }, { key: "isSwipePrevented", value: function (t) { if (Sd(t, "video, audio")) return !0; for (; t && "function" == typeof t.hasAttribute;) { if (t.hasAttribute("data-prevent-swipe")) return !0; t = t.parentNode } return !1 } }, { key: "onTouchStart", value: function (t) { if (this.isSwipePrevented(t.target)) return !0; this.touchStartX = t.touches[0].clientX, this.touchStartY = t.touches[0].clientY, this.touchStartCount = t.touches.length } }, { key: "onTouchMove", value: function (t) { if (this.isSwipePrevented(t.target)) return !0; var e = this.Reveal.getConfig(); if (this.touchCaptured) Pd && t.preventDefault(); else { this.Reveal.onUserInput(t); var r = t.touches[0].clientX, n = t.touches[0].clientY; if (1 === t.touches.length && 2 !== this.touchStartCount) { var i = this.Reveal.availableRoutes({ includeFragments: !0 }), a = r - this.touchStartX, o = n - this.touchStartY; a > 40 && Math.abs(a) > Math.abs(o) ? (this.touchCaptured = !0, "linear" === e.navigationMode ? e.rtl ? this.Reveal.next() : this.Reveal.prev() : this.Reveal.left()) : a < -40 && Math.abs(a) > Math.abs(o) ? (this.touchCaptured = !0, "linear" === e.navigationMode ? e.rtl ? this.Reveal.prev() : this.Reveal.next() : this.Reveal.right()) : o > 40 && i.up ? (this.touchCaptured = !0, "linear" === e.navigationMode ? this.Reveal.prev() : this.Reveal.up()) : o < -40 && i.down && (this.touchCaptured = !0, "linear" === e.navigationMode ? this.Reveal.next() : this.Reveal.down()), e.embedded ? (this.touchCaptured || this.Reveal.isVerticalSlide()) && t.preventDefault() : t.preventDefault() } } } }, { key: "onTouchEnd", value: function () { this.touchCaptured = !1 } }, { key: "onPointerDown", value: function (t) { t.pointerType !== t.MSPOINTER_TYPE_TOUCH && "touch" !== t.pointerType || (t.touches = [{ clientX: t.clientX, clientY: t.clientY }], this.onTouchStart(t)) } }, { key: "onPointerMove", value: function (t) { t.pointerType !== t.MSPOINTER_TYPE_TOUCH && "touch" !== t.pointerType || (t.touches = [{ clientX: t.clientX, clientY: t.clientY }], this.onTouchMove(t)) } }, { key: "onPointerUp", value: function (t) { t.pointerType !== t.MSPOINTER_TYPE_TOUCH && "touch" !== t.pointerType || (t.touches = [{ clientX: t.clientX, clientY: t.clientY }], this.onTouchEnd(t)) } }]), t }(), Mm = "focus", Rm = "blur", Tm = function () { function t(e) { i(this, t), this.Reveal = e, this.onRevealPointerDown = this.onRevealPointerDown.bind(this), this.onDocumentPointerDown = this.onDocumentPointerDown.bind(this) } return o(t, [{ key: "configure", value: function (t) { t.embedded ? this.blur() : (this.focus(), this.unbind()) } }, { key: "bind", value: function () { this.Reveal.getConfig().embedded && this.Reveal.getRevealElement().addEventListener("pointerdown", this.onRevealPointerDown, !1) } }, { key: "unbind", value: function () { this.Reveal.getRevealElement().removeEventListener("pointerdown", this.onRevealPointerDown, !1), document.removeEventListener("pointerdown", this.onDocumentPointerDown, !1) } }, { key: "focus", value: function () { this.state !== Mm && (this.Reveal.getRevealElement().classList.add("focused"), document.addEventListener("pointerdown", this.onDocumentPointerDown, !1)), this.state = Mm } }, { key: "blur", value: function () { this.state !== Rm && (this.Reveal.getRevealElement().classList.remove("focused"), document.removeEventListener("pointerdown", this.onDocumentPointerDown, !1)), this.state = Rm } }, { key: "isFocused", value: function () { return this.state === Mm } }, { key: "destroy", value: function () { this.Reveal.getRevealElement().classList.remove("focused") } }, { key: "onRevealPointerDown", value: function () { this.focus() } }, { key: "onDocumentPointerDown", value: function (t) { var e = Ad(t.target, ".reveal"); e && e === this.Reveal.getRevealElement() || this.blur() } }]), t }(), Cm = function () { function t(e) { i(this, t), this.Reveal = e } return o(t, [{ key: "render", value: function () { this.element = document.createElement("div"), this.element.className = "speaker-notes", this.element.setAttribute("data-prevent-swipe", ""), this.element.setAttribute("tabindex", "0"), this.Reveal.getRevealElement().appendChild(this.element) } }, { key: "configure", value: function (t) { t.showNotes && this.element.setAttribute("data-layout", "string" == typeof t.showNotes ? t.showNotes : "inline") } }, { key: "update", value: function () { this.Reveal.getConfig().showNotes && this.element && this.Reveal.getCurrentSlide() && !this.Reveal.print.isPrintingPDF() && (this.element.innerHTML = this.getSlideNotes() || 'No notes on this slide.') } }, { key: "updateVisibility", value: function () { this.Reveal.getConfig().showNotes && this.hasNotes() && !this.Reveal.print.isPrintingPDF() ? this.Reveal.getRevealElement().classList.add("show-notes") : this.Reveal.getRevealElement().classList.remove("show-notes") } }, { key: "hasNotes", value: function () { return this.Reveal.getSlidesElement().querySelectorAll("[data-notes], aside.notes").length > 0 } }, { key: "isSpeakerNotesWindow", value: function () { return !!window.location.search.match(/receiver/gi) } }, { key: "getSlideNotes", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.Reveal.getCurrentSlide(); if (t.hasAttribute("data-notes")) return t.getAttribute("data-notes"); var e = t.querySelector("aside.notes"); return e ? e.innerHTML : null } }, { key: "destroy", value: function () { this.element.remove() } }]), t }(), Lm = B, zm = we, Nm = ve, Pm = js, Im = tt, Om = Gr("unscopables"), Bm = Array.prototype; null == Bm[Om] && Im.f(Bm, Om, { configurable: !0, value: Pm(null) }); var qm = function (t) { Bm[Om][t] = !0 }; or({ target: "Array", proto: !0 }, { fill: function (t) { for (var e = Lm(this), r = Nm(e.length), n = arguments.length, i = zm(n > 1 ? arguments[1] : void 0, r), a = n > 2 ? arguments[2] : void 0, o = void 0 === a ? r : zm(a, r); o > i;)e[i++] = t; return e } }), qm("fill"); var Dm = function () { function t(e, r) { i(this, t), this.diameter = 100, this.diameter2 = this.diameter / 2, this.thickness = 6, this.playing = !1, this.progress = 0, this.progressOffset = 1, this.container = e, this.progressCheck = r, this.canvas = document.createElement("canvas"), this.canvas.className = "playback", this.canvas.width = this.diameter, this.canvas.height = this.diameter, this.canvas.style.width = this.diameter2 + "px", this.canvas.style.height = this.diameter2 + "px", this.context = this.canvas.getContext("2d"), this.container.appendChild(this.canvas), this.render() } return o(t, [{ key: "setPlaying", value: function (t) { var e = this.playing; this.playing = t, !e && this.playing ? this.animate() : this.render() } }, { key: "animate", value: function () { var t = this.progress; this.progress = this.progressCheck(), t > .8 && this.progress < .2 && (this.progressOffset = this.progress), this.render(), this.playing && requestAnimationFrame(this.animate.bind(this)) } }, { key: "render", value: function () { var t = this.playing ? this.progress : 0, e = this.diameter2 - this.thickness, r = this.diameter2, n = this.diameter2, i = 28; this.progressOffset += .1 * (1 - this.progressOffset); var a = -Math.PI / 2 + t * (2 * Math.PI), o = -Math.PI / 2 + this.progressOffset * (2 * Math.PI); this.context.save(), this.context.clearRect(0, 0, this.diameter, this.diameter), this.context.beginPath(), this.context.arc(r, n, e + 4, 0, 2 * Math.PI, !1), this.context.fillStyle = "rgba( 0, 0, 0, 0.4 )", this.context.fill(), this.context.beginPath(), this.context.arc(r, n, e, 0, 2 * Math.PI, !1), this.context.lineWidth = this.thickness, this.context.strokeStyle = "rgba( 255, 255, 255, 0.2 )", this.context.stroke(), this.playing && (this.context.beginPath(), this.context.arc(r, n, e, o, a, !1), this.context.lineWidth = this.thickness, this.context.strokeStyle = "#fff", this.context.stroke()), this.context.translate(r - 14, n - 14), this.playing ? (this.context.fillStyle = "#fff", this.context.fillRect(0, 0, 10, i), this.context.fillRect(18, 0, 10, i)) : (this.context.beginPath(), this.context.translate(4, 0), this.context.moveTo(0, 0), this.context.lineTo(24, 14), this.context.lineTo(0, i), this.context.fillStyle = "#fff", this.context.fill()), this.context.restore() } }, { key: "on", value: function (t, e) { this.canvas.addEventListener(t, e, !1) } }, { key: "off", value: function (t, e) { this.canvas.removeEventListener(t, e, !1) } }, { key: "destroy", value: function () { this.playing = !1, this.canvas.parentNode && this.container.removeChild(this.canvas) } }]), t }(), Fm = { width: 960, height: 700, margin: .04, minScale: .2, maxScale: 2, controls: !0, controlsTutorial: !0, controlsLayout: "bottom-right", controlsBackArrows: "faded", progress: !0, slideNumber: !1, showSlideNumber: "all", hashOneBasedIndex: !1, hash: !1, respondToHashChanges: !0, history: !1, keyboard: !0, keyboardCondition: null, disableLayout: !1, overview: !0, center: !0, touch: !0, loop: !1, rtl: !1, navigationMode: "default", shuffle: !1, fragments: !0, fragmentInURL: !0, embedded: !1, help: !0, pause: !0, showNotes: !1, showHiddenSlides: !1, autoPlayMedia: null, preloadIframes: null, autoAnimate: !0, autoAnimateMatcher: null, autoAnimateEasing: "ease", autoAnimateDuration: 1, autoAnimateUnmatched: !0, autoAnimateStyles: ["opacity", "color", "background-color", "padding", "font-size", "line-height", "letter-spacing", "border-width", "border-color", "border-radius", "outline", "outline-offset"], autoSlide: 0, autoSlideStoppable: !0, autoSlideMethod: null, defaultTiming: null, mouseWheel: !1, previewLinks: !1, postMessage: !0, postMessageEvents: !1, focusBodyOnPageVisibilityChange: !0, transition: "slide", transitionSpeed: "default", backgroundTransition: "fade", parallaxBackgroundImage: "", parallaxBackgroundSize: "", parallaxBackgroundRepeat: "", parallaxBackgroundPosition: "", parallaxBackgroundHorizontal: null, parallaxBackgroundVertical: null, pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY, pdfSeparateFragments: !0, pdfPageHeightOffset: -1, viewDistance: 3, mobileViewDistance: 2, display: "block", hideInactiveCursor: !0, hideCursorTime: 5e3, dependencies: [], plugins: [] }, Hm = "4.3.1", jm = h, Um = []; return jm.initialize = function (t) { return Object.assign(jm, new h(document.querySelector(".reveal"), t)), Um.map(function (t) { return t(jm) }), jm.initialize() }, ["configure", "on", "off", "addEventListener", "removeEventListener", "registerPlugin"].forEach(function (t) { jm[t] = function () { for (var e = arguments.length, r = new Array(e), n = 0; n < e; n++)r[n] = arguments[n]; Um.push(function (e) { var n; return (n = e[t]).call.apply(n, [null].concat(r)) }) } }), jm.isReady = function () { return !1 }, jm.VERSION = Hm, jm +}), SL("deck").Animation = { init: function () { this.animationListeners = [], this.animationsEnabled = !0, this.run = this.run.bind(this), this.reset = this.reset.bind(this), this.toggle = this.toggle.bind(this), this.onSlideChanged = this.onSlideChanged.bind(this), Reveal.addEventListener("slidechanged", this.onSlideChanged), this.revealElement = document.querySelector(".reveal"), this.interactiveAnimationChanged = new signals.Signal }, sync: function () { this.animationsEnabled ? this.enableAnimations() : this.disableAnimations() }, enableAnimations: function () { this.animationsEnabled = !0, this.revealElement.classList.remove("block-animations-disabled"), this.reset(this.revealElement); var t = Reveal.getCurrentSlide(); t && this.fastForwardAnimation(t, function () { this.run(t), this.bind(t) }.bind(this)) }, disableAnimations: function () { this.animationsEnabled = !1, this.revealElement.classList.add("block-animations-disabled"), this.unbind(), this.fastForwardAnimation(this.revealElement) }, getAnimationTargets: function (t) { return t instanceof Array ? t : t.hasAttribute("data-animation-type") ? [t] : [].slice.call(t.querySelectorAll("[data-animation-type]")) }, getInteractiveAnimationTargets: function (t, e) { var r = e ? ".animate" : ""; return [].slice.call(t.querySelectorAll(['[data-animation-trigger="click"]', '[data-animation-trigger="hover"]'].join(r + ",") + r)) }, run: function (t, e) { this.getAnimationTargets(t).forEach(function (t) { !e && this.hasInteractiveAnimationTrigger(t) || t.classList.add("animate") }.bind(this)) }, toggle: function (t, e) { this.getAnimationTargets(t).forEach(function (t) { !e && this.hasInteractiveAnimationTrigger(t) || t.classList.toggle("animate") }.bind(this)) }, reset: function (t) { this.getAnimationTargets(t).forEach(function (t) { t.classList.remove("animate") }.bind(this)) }, preview: function (t) { !1 === this.animationsEnabled && this.revealElement.classList.remove("block-animations-disabled"), this.getAnimationTargets(t).forEach(function (t) { t.classList.remove("animate"), this.fastForwardAnimation(t, function () { t.classList.add("animate"), !1 === this.animationsEnabled && this.revealElement.classList.add("block-animations-disabled") }.bind(this)) }.bind(this)) }, bind: function (t) { this.unbind(), this.getAnimationTargets(t).forEach(function (e) { if (this.hasInteractiveAnimationTrigger(e)) { var r = e.getAttribute("data-animation-trigger-id"), n = "self" === r ? e : t.querySelector('.sl-block[data-block-id="' + r + '"] .sl-block-content'); if (n) { var i = e.getAttribute("data-animation-trigger"); "click" === i ? (this.addAnimationEventListener(n, "touchstart", this.onTriggerTouchStart.bind(this, e)), this.addAnimationEventListener(n, "click", this.onTriggerClick.bind(this, e))) : "hover" === i && (this.addAnimationEventListener(n, "mouseover", this.onTriggerMouseOver.bind(this, e)), this.addAnimationEventListener(n, "mouseout", this.onTriggerMouseOut.bind(this, e))) } } }.bind(this)) }, addAnimationEventListener: function (t, e, r) { t.addEventListener(e, r), /click|touchstart/gi.test(e) && t.classList.add("animation-trigger"), this.animationListeners.push([t, e, r]) }, unbind: function () { this.animationListeners.forEach(function (t) { var e = t[0], r = t[1], n = t[2]; /click|touchstart/gi.test(r) && e.classList.remove("animation-trigger"), e.removeEventListener(r, n) }), this.animationListeners.length = 0 }, hasInteractiveAnimationTrigger: function (t) { return /click|hover/gi.test(t.getAttribute("data-animation-trigger")) }, fastForwardAnimation: function (t, e) { t.classList.add("no-transition"), setTimeout(function () { t.classList.remove("no-transition"), "function" == typeof e && e() }, 1) }, getSerializedInteractiveState: function () { return this.getInteractiveAnimationTargets(Reveal.getCurrentSlide(), !0).map(function (t) { var e = this.getParentBlock(t); return e ? e.getAttribute("data-block-id") : null }, this).filter(function (t) { return "string" == typeof t }).join(",") }, setSerializedInteractiveState: function (t) { var e = this.getInteractiveAnimationTargets(Reveal.getCurrentSlide()); if (e.length && "string" == typeof t) { t = t.split(","); var r = [], n = []; e.forEach(function (e) { var i = this.getParentBlock(e), a = i ? i.getAttribute("data-block-id") : null; "string" == typeof a && -1 !== t.indexOf(a) ? n.push(e) : r.push(e) }, this), this.reset(r), this.run(n, !0) } }, getParentBlock: function (t) { for (var e = t.parentNode; e && !e.hasAttribute("data-block-id");)e = e.parentNode; return e }, onSlideChanged: function (t) { this.animationsEnabled && (t.previousSlide && (this.reset(t.previousSlide), this.unbind()), t.currentSlide && (this.run(t.currentSlide), this.bind(t.currentSlide))) }, onTriggerTouchStart: function (t, e) { e.preventDefault(), this.toggle(t, !0), this.interactiveAnimationChanged.dispatch() }, onTriggerClick: function (t) { Reveal.isAutoSliding() && Reveal.getConfig().autoSlideStoppable && Reveal.toggleAutoSlide(!1), this.toggle(t, !0), this.interactiveAnimationChanged.dispatch() }, onTriggerMouseOver: function (t) { this.run(t, !0), this.interactiveAnimationChanged.dispatch() }, onTriggerMouseOut: function (t) { this.reset(t), this.interactiveAnimationChanged.dispatch() } }, SL("deck").AutoAnimate = { ANIMATABLE_BLOCK_CONTENT_STYLES: ["color", "background-color", "padding", "font-size", "line-height", "letter-spacing", "border-width", "border-color", "border-radius"], init: function () { this.onAutoAnimate = this.onAutoAnimate.bind(this), Reveal.addEventListener("autoanimate", this.onAutoAnimate) }, matcher: function (t, e) { var r = []; return SL.deck.AutoAnimate.findMatchingElements(r, t, e, ".sl-block[data-name]", function (t) { return t.nodeName + ":::" + t.getAttribute("data-name") }), SL.deck.AutoAnimate.findMatchingElements(r, t, e, '.sl-block[data-block-type="text"], .sl-block[data-block-type="snippet"], .sl-block[data-block-type="table"]', function (t) { return t.getAttribute("data-block-type") + ":::" + t.innerText }), SL.deck.AutoAnimate.findMatchingElements(r, t, e, '.sl-block[data-block-type="image"], .sl-block[data-block-type="video"]', function (t) { var e = t.querySelector("img[src], video[src]"); return e ? e.getAttribute("src") : null }), SL.deck.AutoAnimate.findMatchingElements(r, t, e, '.sl-block[data-block-type="iframe"]', function (t) { var e = t.querySelector("iframe[src], iframe[data-src]"); return e ? e.getAttribute("src") || e.getAttribute("data-src") : null }), SL.deck.AutoAnimate.findMatchingElements(r, t, e, '.sl-block[data-block-type="code"]', function (t) { return t.querySelector(":not(.editing-ui) pre code").textContent }), SL.deck.AutoAnimate.findMatchingElements(r, t, e, '.sl-block[data-block-type="math"]', function (t) { return t.querySelector(".math-input").textContent }), SL.deck.AutoAnimate.expandBlockPairs(r) }, findMatchingElements: function (t, e, r, n, i, a) { var o = {}, s = {};[].slice.call(e.querySelectorAll(n)).forEach(function (t) { var e = i(t); "string" == typeof e && e.length && (o[e] = o[e] || [], o[e].push(t)) }), [].slice.call(r.querySelectorAll(n)).forEach(function (e) { var r, n = i(e); if (s[n] = s[n] || [], s[n].push(e), o[n]) { var l = s[n].length - 1, c = o[n].length - 1; o[n][l] ? (r = o[n][l], o[n][l] = null) : o[n][c] && (r = o[n][c], o[n][c] = null) } r && t.push({ from: r, to: e, options: a || { styles: [] } }) }) }, expandBlockPairs: function (t) { return t.forEach(function (e) { var r = e.from, n = e.to, i = r.querySelector(".sl-block-content"), a = n.querySelector(".sl-block-content"); i && a && SL.deck.AutoAnimate.expandBlockPair(t, e, r, n, i, a) }), t }, expandBlockPair: function (t, e, r, n, i, a) { var o = r.querySelector(".sl-block-style"), s = n.querySelector(".sl-block-style"); o && o.closest(".sl-block") !== r && (o = null), s && s.closest(".sl-block") !== n && (s = null); var l = r.getAttribute("data-block-type"), c = {}, u = {}; return n.dataset.autoAnimateDelay && (e.options.delay = parseFloat(n.dataset.autoAnimateDelay)), n.dataset.autoAnimateDuration && (e.options.duration = parseFloat(n.dataset.autoAnimateDuration)), n.dataset.autoAnimateEasing && (e.options.easing = n.dataset.autoAnimateEasing), c["z-index"] = { property: "z-index", from: a.style.zIndex, to: a.style.zIndex }, /text|snippet|table/i.test(l) ? c.width = { property: "width" } : /code|math/i.test(l) && (c.width = { property: "width" }, c.height = { property: "height" }), o && s ? (c.opacity = { property: "opacity", from: o.style.opacity || "1", to: s.style.opacity || "1" }, (o.style.transform || s.style.transform) && (c.width = { property: "width" }, c.height = { property: "height" }, t.push({ from: o, to: s, options: { translate: !1, scale: !1, styles: [{ property: "transform" }] } }))) : o ? (c.opacity = { property: "opacity", from: o.style.opacity || "1", to: "1" }, o.style.transform && (c.width = { property: "width" }, c.height = { property: "height" }, u.transform = { property: "transform", from: o.style.transform, to: "none" })) : s && (c.opacity = { property: "opacity", from: "1", to: s.style.opacity || "1" }, s.style.transform && (c.width = { property: "width" }, c.height = { property: "height" }, t.push({ from: document.createElement("div"), to: s, options: { translate: !1, scale: !1, styles: [{ property: "transform", from: "none" }] } }))), t.push({ from: i, to: a, options: { translate: !1, scale: !1, styles: SL.deck.AutoAnimate.ANIMATABLE_BLOCK_CONTENT_STYLES.concat(Object.keys(u).map(function (t) { return u[t] })) } }), /text/i.test(l) && this.expandTextBlock(t, e, r, n), /code/i.test(l) && this.expandCodeBlock(t, e, r, n), /shape/i.test(l) && this.expandShapeBlock(t, e, r, n), /line/i.test(l) && this.expandLineBlock(t, e, r, n), e.options.styles = e.options.styles.concat(Object.keys(c).map(function (t) { return c[t] })), (c.width || c.height) && (e.options.scale = !1), t }, expandTextBlock: function (t, e, r, n) { SL.deck.AutoAnimate.findMatchingElements(t, r, n, "li>p", function (t) { return t.innerText.trim() }, { scale: !1, translate: !1, measure: SL.deck.AutoAnimate.getLocalBlockMeasurements }), SL.deck.AutoAnimate.findMatchingElements(t, r, n, "ul li, ol li", function (t) { return Array.prototype.map.call(t.childNodes, function (t) { return /li|ul|ol/i.test(t.nodeName) ? "" : t.textContent.trim() }).join("") }, { scale: !1, measure: SL.deck.AutoAnimate.getLocalBlockMeasurements }), SL.deck.AutoAnimate.findMatchingElements(t, r, n, 'span[style*="font-size"]', function (t) { return t.textContent.trim() }, { scale: !1, translate: !1, styles: [{ property: "font-size" }] }) }, expandCodeBlock: function (t, e, r, n) { var i = n.querySelector("code.current-fragment"); i && (n = i), SL.deck.AutoAnimate.findMatchingElements(t, r, n, ".hljs-ln-code", function (t) { return t.textContent }, { scale: !1, styles: [], measure: SL.deck.AutoAnimate.getLocalBlockMeasurements }), SL.deck.AutoAnimate.findMatchingElements(t, r, n, ".hljs-ln-line[data-line-number]", function (t) { return t.getAttribute("data-line-number") }, { scale: !1, styles: ["width"], measure: SL.deck.AutoAnimate.getLocalBlockMeasurements }) }, expandShapeBlock: function (t, e, r, n) { var i = r.querySelector(".shape-element"), a = n.querySelector(".shape-element"), o = [{ property: "fill" }, { property: "stroke" }]; /rect/i.test(a.nodeName) && o.push({ property: "rx" }, { property: "ry" }), i && a && t.push({ from: i, to: a, options: { translate: !1, scale: !1, styles: o } }) }, expandLineBlock: function (t, e, r, n) { var i = r.querySelector(".line-element"), a = n.querySelector(".line-element"); i && a && t.push({ from: i, to: a, options: { translate: !1, scale: !1, styles: [{ property: "stroke" }, { property: "stroke-width" }] } }) }, getLocalBlockMeasurements: function (t) { var e = Reveal.getScale(); return { x: Math.round(t.offsetLeft * e * 100) / 100, y: Math.round(t.offsetTop * e * 100) / 100, width: Math.round(t.offsetWidth * e * 100) / 100, height: Math.round(t.offsetHeight * e * 100) / 100 } }, onAutoAnimate: function (t) { var e = []; Array.prototype.forEach.call(t.toSlide.querySelectorAll('.sl-block[data-auto-animate-target^="unmatched"]'), function (t) { var r = t.getAttribute("data-block-id"), n = t.querySelector(".sl-block-content"); n && e.push('.reveal [data-auto-animate-target="unmatched"][data-block-id="' + r + '"] { z-index: ' + n.style.zIndex + "; }") }), e.length && (t.sheet.innerHTML += e.join("")) } }, SL("deck").Controller = { MODE_VIEWING: "viewing", MODE_EDITING: "editing", MODE_PRINTING: "printing", init: function (t) { this.options = t || {}, this.options.mode = "string" == typeof this.options.mode ? this.options.mode : SL.deck.Controller.MODE_VIEWING, this.mode = null, SL.deck.Media.init(this.options), this.options.mode === SL.deck.Controller.MODE_VIEWING && SL.deck.util.formatIframes(), Reveal.isReady() ? this.setup() : Reveal.addEventListener("ready", this.setup.bind(this)) }, setup: function () { SL.deck.Animation.init(), SL.deck.AutoAnimate.init(), this.setMode(this.options.mode) }, setMode: function (t) { this.mode = t, this.mode === SL.deck.Controller.MODE_EDITING || this.mode === SL.deck.Controller.MODE_PRINTING ? SL.deck.Animation.disableAnimations() : SL.deck.Animation.enableAnimations() } }, SL("deck").Media = { init: function (t) { this.options = t, this.supportsCDN() && (this.switchToCDN(".reveal img[src], .reveal video[src]", "src"), this.switchToCDN(".reveal img[data-src], .reveal video[data-src]", "data-src"), this.switchToCDN(".reveal video[poster]", "poster"), this.switchToCDN(".reveal [data-background-video]", "data-background-video"), this.switchToCDN(".reveal [data-background-image]", "data-background-image")) }, supportsCDN: function () { return SL.config && this.options.mode === SL.deck.Controller.MODE_VIEWING && !document.documentElement.classList.contains("sl-editor") }, switchToCDN: function (t, e) { document.querySelectorAll(t).forEach(function (t) { var r = t.getAttribute(e); 0 === r.lastIndexOf(SL.config.S3_HOST, 0) && t.setAttribute(e, r.replace(SL.config.S3_HOST, SL.config.CDN_HOST)) }, this) } }, SL("deck").util = { extend: function (t) { return Array.prototype.forEach.call(arguments, function (e) { for (var r in e) t[r] = e[r] }, t), t }, renderMath: function (t) { SL.deck.util.renderMathBlocks(t), SL.deck.util.renderInlineMath(t) }, renderMathBlocks: function (t) { t || (t = document.querySelector(".reveal .slides")), window.katex && "function" == typeof window.katex.render && [].slice.call(t.querySelectorAll('.sl-block[data-block-type="math"]')).forEach(function (t) { var e = t.querySelector(".math-input"), r = t.querySelector(".math-output"); e && !r && ((r = document.createElement("div")).className = "math-output", e.parentNode.insertBefore(r, e)), e && r && katex.render(e.innerText, r) }) }, renderInlineMath: function (t) { t || (t = document.querySelector(".reveal .slides")), "function" == typeof window.renderMathInElement && SL.deck.util.containsInlineMath(t) && renderMathInElement(t, { delimiters: [{ left: "$$", right: "$$", display: !0 }, { left: "\\[", right: "\\]", display: !0 }, { left: "\\(", right: "\\)", display: !1 }] }) }, containsInlineMath: function (t) { return !!t && /\$\$.+\$\$|\\\[.+\\\]|\\\(.+\\\)/g.test(t.innerHTML) }, injectCodeCopyButtons: function () { var t = [].slice.call(document.querySelectorAll('.sl-block[data-block-type="code"] .sl-block-content:not(.has-copy-button)')); t.length && (this.copyButton = document.createElement("button"), this.copyButton.className = "copy-code-to-clipboard", this.copyButton.textContent = "Copy", this.copyButton.addEventListener("click", function () { this.copyButton.hasAttribute("data-code-to-copy") && (this.copyButton.textContent = "Copied!", this.copyButton.classList.add("bounce"), SL.deck.util.copyToClipboard(this.copyButton.getAttribute("data-code-to-copy")), setTimeout(function () { this.copyButton.textContent = "Copy", this.copyButton.classList.remove("bounce") }.bind(this), 1500)) }.bind(this)), t.forEach(function (t) { var e, r = t.querySelector("pre code"); r && (e = r.hasAttribute("data-plaintext") ? r.getAttribute("data-plaintext") : r.textContent), e && t.addEventListener("mouseenter", function (t) { this.copyButton.setAttribute("data-code-to-copy", e), t.currentTarget.classList.add("has-copy-button"), t.currentTarget.appendChild(this.copyButton) }.bind(this)) }, this)) }, hasNotes: function () { if (SLConfig.deck && SLConfig.deck.notes) for (var t in SLConfig.deck.notes) return !0; return document.querySelectorAll(".reveal .slides section[data-notes]").length > 0 }, injectNotes: function () { SLConfig.deck && SLConfig.deck.notes && [].forEach.call(document.querySelectorAll(".reveal .slides section"), function (t) { var e = SLConfig.deck.notes[t.getAttribute("data-id")]; e && "string" == typeof e && t.setAttribute("data-notes", e) }) }, injectTranslationRules: function () { [].slice.call(document.querySelectorAll(".sl-block .katex")).forEach(function (t) { t.classList.add("notranslate") }) }, formatIframes: function () { [].slice.call(document.querySelectorAll(".sl-block iframe[data-src]")).forEach(this.formatIframe.bind(this)) }, formatIframe: function (t) { t.setAttribute("allowfullscreen", ""), t.setAttribute("allow", "fullscreen"); var e = t.getAttribute("src") || t.getAttribute("data-src"); "string" != typeof e || /\.pdf$/i.test(e) ? t.removeAttribute("sandbox") : t.setAttribute("sandbox", "allow-forms allow-scripts allow-popups allow-same-origin allow-pointer-lock allow-presentation") }, copyToClipboard: function (t) { var e = document.createElement("textarea"); e.value = t, document.body.appendChild(e), e.select(); var r = document.execCommand("copy"); return document.body.removeChild(e), r } }; diff --git a/frontend/modern.config.ts b/frontend/modern.config.ts new file mode 100644 index 0000000..73dfd80 --- /dev/null +++ b/frontend/modern.config.ts @@ -0,0 +1,25 @@ +import { URL } from 'url'; +import { appTools, defineConfig } from '@modern-js/app-tools'; + +const apiBase = new URL(process.env.API_BASE || 'http://localhost:8000'); + +// https://modernjs.dev/en/configure/app/usage +export default defineConfig({ + bff: { + proxy: { + '/api': { + target: apiBase.origin, + changeOrigin: true, + pathRewrite: { '^/api': apiBase.pathname }, + }, + }, + }, + runtime: { + router: true, + }, + plugins: [ + appTools({ + bundler: 'experimental-rspack', + }), + ], +}); diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..592c83a --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,66 @@ +{ + "name": "agent-coord-frontend", + "version": "0.0.1", + "scripts": { + "reset": "npx rimraf ./**/node_modules", + "dev": "modern dev", + "build": "modern build", + "start": "modern start", + "serve": "modern serve", + "new": "modern new", + "lint": "modern lint", + "prepare": "husky install", + "upgrade": "modern upgrade" + }, + "engines": { + "node": ">=16.18.1" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,mjs,cjs}": [ + "node --max_old_space_size=8192 ./node_modules/eslint/bin/eslint.js --fix --color --cache --quiet" + ] + }, + "eslintIgnore": [ + "node_modules/", + "dist/" + ], + "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@modern-js/runtime": "2.46.1", + "@mui/icons-material": "^5.15.6", + "@mui/material": "^5.15.6", + "@sttot/api-hooks": "^1.2.5", + "d3": "^7.8.5", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "mobx": "^6.12.0", + "mobx-react-lite": "^4.0.6", + "re-resizable": "^6.9.11", + "react": "~18.2.0", + "react-dom": "~18.2.0", + "react-markdown": "^9.0.1", + "react-rnd": "^10.4.1", + "rehype-highlight": "^7.0.0", + "rehype-katex": "^7.0.0", + "remark-gfm": "^4.0.0", + "remark-math": "^6.0.0" + }, + "devDependencies": { + "@modern-js-app/eslint-config": "2.46.1", + "@modern-js/app-tools": "2.46.1", + "@modern-js/eslint-config": "2.46.1", + "@modern-js/tsconfig": "2.46.1", + "@types/d3": "^7.4.3", + "@types/jest": "~29.2.4", + "@types/lodash": "^4.14.202", + "@types/node": "~16.11.7", + "@types/react": "~18.0.26", + "@types/react-dom": "~18.0.10", + "husky": "~8.0.1", + "lint-staged": "~13.1.0", + "prettier": "~2.8.1", + "rimraf": "~3.0.2", + "typescript": "~5.0.4" + } +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..67e77d8 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,11592 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@emotion/react': + specifier: ^11.11.3 + version: 11.11.3(@types/react@18.0.38)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.11.0(@emotion/react@11.11.3)(@types/react@18.0.38)(react@18.2.0) + '@modern-js/runtime': + specifier: 2.46.1 + version: 2.46.1(@types/react-dom@18.0.11)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0)(webpack@5.90.0) + '@mui/icons-material': + specifier: ^5.15.6 + version: 5.15.6(@mui/material@5.15.6)(@types/react@18.0.38)(react@18.2.0) + '@mui/material': + specifier: ^5.15.6 + version: 5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0) + '@sttot/api-hooks': + specifier: ^1.2.5 + version: 1.2.5(axios@1.6.5)(lodash@4.17.21)(react-dom@18.2.0)(react@18.2.0) + d3: + specifier: ^7.8.5 + version: 7.8.5 + localforage: + specifier: ^1.10.0 + version: 1.10.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + mobx: + specifier: ^6.12.0 + version: 6.12.0 + mobx-react-lite: + specifier: ^4.0.6 + version: 4.0.6(mobx@6.12.0)(react-dom@18.2.0)(react@18.2.0) + re-resizable: + specifier: ^6.9.11 + version: 6.9.11(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ~18.2.0 + version: 18.2.0 + react-dom: + specifier: ~18.2.0 + version: 18.2.0(react@18.2.0) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.0.38)(react@18.2.0) + react-rnd: + specifier: ^10.4.1 + version: 10.4.1(react-dom@18.2.0)(react@18.2.0) + rehype-highlight: + specifier: ^7.0.0 + version: 7.0.0 + rehype-katex: + specifier: ^7.0.0 + version: 7.0.0 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + remark-math: + specifier: ^6.0.0 + version: 6.0.0 + +devDependencies: + '@modern-js-app/eslint-config': + specifier: 2.46.1 + version: 2.46.1(@rsbuild/core@0.3.7)(typescript@5.0.4) + '@modern-js/app-tools': + specifier: 2.46.1 + version: 2.46.1(@rsbuild/core@0.3.7)(postcss@8.4.33)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(typescript@5.0.4) + '@modern-js/eslint-config': + specifier: 2.46.1 + version: 2.46.1(@rsbuild/core@0.3.7)(typescript@5.0.4) + '@modern-js/tsconfig': + specifier: 2.46.1 + version: 2.46.1 + '@types/d3': + specifier: ^7.4.3 + version: 7.4.3 + '@types/jest': + specifier: ~29.2.4 + version: 29.2.6 + '@types/lodash': + specifier: ^4.14.202 + version: 4.14.202 + '@types/node': + specifier: ~16.11.7 + version: 16.11.68 + '@types/react': + specifier: ~18.0.26 + version: 18.0.38 + '@types/react-dom': + specifier: ~18.0.10 + version: 18.0.11 + husky: + specifier: ~8.0.1 + version: 8.0.3 + lint-staged: + specifier: ~13.1.0 + version: 13.1.4 + prettier: + specifier: ~2.8.1 + version: 2.8.8 + rimraf: + specifier: ~3.0.2 + version: 3.0.2 + typescript: + specifier: ~5.0.4 + version: 5.0.4 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.8 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/eslint-parser@7.23.3(@babel/core@7.23.7)(eslint@8.56.0): + resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.56.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + dev: true + + /@babel/eslint-plugin@7.23.5(@babel/eslint-parser@7.23.3)(eslint@8.56.0): + resolution: {integrity: sha512-03+E/58Hoo/ui69gR+beFdGpplpoVK0BSIdke2iw4/Bz7eGN0ssRenNlnU4nmbkowNQOPCStKSwFr8H6DiY49g==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/eslint-parser': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.7)(eslint@8.56.0) + eslint: 8.56.0 + eslint-rule-composer: 0.3.0 + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + jsesc: 2.5.2 + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.7): + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helpers@7.23.8: + resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-proposal-partial-application@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-+MdvZnaDNsMZ3pl8rxlr1az5XndJwaS4jXQGCg82qq2SzLlTS29gp21Uw8JobXAe4h9lTx9PJX6GpOsFuMn0mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-partial-application': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-proposal-pipeline-operator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-8TDc1vEx+YRaGiF8J8w/XcADaBuqc0RnokaMRrHdX7Vx74WhmxPU8wtM/OHSXvgw45P9tlHS/l0YDpNXwLghmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-pipeline-operator': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-partial-application@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KVHN7dEaQIXkIoHUQtMUIVtlaavL+fygQWxB6i10YuboMdCpEAlcufiXUgjQ1JRSniVD49AiaxqHnKMcq53JEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-pipeline-operator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-xypNE8ptJ5buVtgAAOZzN3gIV6McZfMA27GMhy70a8auQIxbLW9g/uKsaoWqUHdPJgpsXYjVD+5oDyS6pRvraA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.7): + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.23.8(@babel/core@7.23.7): + resolution: {integrity: sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.7) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.7) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.7) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.7) + core-js-compat: 3.35.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.6 + esutils: 2.0.3 + dev: true + + /@babel/preset-react@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) + dev: true + + /@babel/register@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.23.8: + resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + /@babel/traverse@7.23.7(supports-color@5.5.0): + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@csstools/cascade-layer-name-parser@1.0.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-9J4aMRJ7A2WRjaRLvsMeWrL69FmEuijtiW1XlK/sG+V0UJiHVYUyvj9mY4WAXfU/hGIiGOgL8e0jJcRyaZTjDQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.5.0 + '@csstools/css-tokenizer': ^2.2.3 + dependencies: + '@csstools/css-parser-algorithms': 2.5.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + dev: true + + /@csstools/css-parser-algorithms@2.5.0(@csstools/css-tokenizer@2.2.3): + resolution: {integrity: sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.2.3 + dependencies: + '@csstools/css-tokenizer': 2.2.3 + dev: true + + /@csstools/css-tokenizer@2.2.3: + resolution: {integrity: sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==} + engines: {node: ^14 || ^16 || >=18} + dev: true + + /@csstools/selector-specificity@3.0.1(postcss-selector-parser@6.0.15): + resolution: {integrity: sha512-NPljRHkq4a14YzZ3YD406uaxh7s0g6eAq3L9aLOWywoqe8PkYamAvtsh7KNX6c++ihDrJ0RiU+/z7rGnhlZ5ww==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + dependencies: + postcss-selector-parser: 6.0.15 + dev: true + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.8 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + /@emotion/react@11.11.3(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.0.38 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.3: + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/styled@11.11.0(@emotion/react@11.11.3)(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.3(@types/react@18.0.38)(react@18.2.0) + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@types/react': 18.0.38 + react: 18.2.0 + dev: false + + /@emotion/stylis@0.8.5: + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + dev: false + + /@emotion/unitless@0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + dev: false + + /@emotion/unitless@0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: true + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@floating-ui/core@1.5.3: + resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.5.4: + resolution: {integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==} + dependencies: + '@floating-ui/core': 1.5.3 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/react-dom@2.0.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-IB8aCRFxr8nFkdYZgH+Otd9EVQPJoynxeFRGTB8voPoZMRWo8XjYuCRgpI1btvuKY69XMiLnW+ym7zoBHM90Rw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + + /@formily/core@2.3.1: + resolution: {integrity: sha512-dCBPnmzDpQKdN4ddxi98VbdurpbH6SHb12S9y9SnzW/QTslZnkvrvBhTlucWB5XqXJfwcyCzpZIn/GdMAbPpZg==} + engines: {npm: '>=3.0.0'} + dependencies: + '@formily/reactive': 2.3.1 + '@formily/shared': 2.3.1 + '@formily/validator': 2.3.1 + dev: true + + /@formily/json-schema@2.3.1(typescript@5.0.4): + resolution: {integrity: sha512-LcJmU1BOYGdoip+Q9YAxHdrpjdl781WFSg0fDTD9/0A7c3xUXWwxdCYZIN0cvoXi2qq8Khyzba0pizl3YSkf0A==} + engines: {npm: '>=3.0.0'} + peerDependencies: + typescript: '>4.1.5' + dependencies: + '@formily/core': 2.3.1 + '@formily/reactive': 2.3.1 + '@formily/shared': 2.3.1 + typescript: 5.0.4 + dev: true + + /@formily/path@2.3.1: + resolution: {integrity: sha512-BVo89K5nAFntx02+EV696If1b1bVIm5I1tRPtVyCVIjBIfAgga5hK4k80GZ01Dlk3tpReHpiIbZVg2DNVfw7jA==} + engines: {npm: '>=3.0.0'} + dev: true + + /@formily/reactive@2.3.1: + resolution: {integrity: sha512-IVHOZW7VBc+Gq9eB/gPldi7pEC3wDonDb99KvHlS8SmzsY6+a/iAdrw2mDagXXUficsC2gT4y4EcJ2f1ALMKtQ==} + engines: {npm: '>=3.0.0'} + dev: true + + /@formily/shared@2.3.1: + resolution: {integrity: sha512-qnlh6jnnIbUjcK0rWF9bm6AxgyxuBgURrzU5vMSxTNAN86P7K9+mSc/28qPsdNP9flEA2/clSexP5WEJAGYVgw==} + engines: {npm: '>=3.0.0'} + dependencies: + '@formily/path': 2.3.1 + camel-case: 4.1.2 + lower-case: 2.0.2 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + upper-case: 2.0.2 + dev: true + + /@formily/validator@2.3.1: + resolution: {integrity: sha512-hM/IDvU/bachpS3fOUe02C9f5EytlNu6OJzDy+AyhWBmZYIVd6QVvPtjV8nyLOXIBJM9N4sxnGSliYQNAPjR1w==} + engines: {npm: '>=3.0.0'} + dependencies: + '@formily/shared': 2.3.1 + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 16.11.68 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@loadable/babel-plugin@5.15.3(@babel/core@7.23.7): + resolution: {integrity: sha512-kwEsPxCk8vnwbTfbA4lHqT5t0u0czCQTnCcmOaTjxT5lCn7yZCBTBa9D7lHs+MLM2WyPsZlee3Qh0TTkMMi5jg==} + engines: {node: '>=8'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + dev: false + + /@loadable/component@5.15.3(react@18.2.0): + resolution: {integrity: sha512-VOgYgCABn6+/7aGIpg7m0Ruj34tGetaJzt4bQ345FwEovDQZ+dua+NWLmuJKv8rWZyxOUSfoJkmGnzyDXH2BAQ==} + engines: {node: '>=8'} + peerDependencies: + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.8 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-is: 16.13.1 + dev: false + + /@loadable/server@5.15.3(@loadable/component@5.15.3)(react@18.2.0): + resolution: {integrity: sha512-Bm/BGe+RlChuHDKNNXpQOi4AJ0cKVuSLI+J8U0Q06zTIfT0S1RLoy85qs5RXm3cLIfefygL8+9bcYFgeWcoM8A==} + engines: {node: '>=8'} + peerDependencies: + '@loadable/component': ^5.0.1 + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@loadable/component': 5.15.3(react@18.2.0) + lodash: 4.17.21 + react: 18.2.0 + dev: false + + /@loadable/webpack-plugin@5.15.2(webpack@5.90.0): + resolution: {integrity: sha512-+o87jPHn3E8sqW0aBA+qwKuG8JyIfMGdz3zECv0t/JF0KHhxXtzIlTiqzlIYc5ZpFs/vKSQfjzGIR5tPJjoXDw==} + engines: {node: '>=8'} + peerDependencies: + webpack: '>=4.6.0' + dependencies: + make-dir: 3.1.0 + webpack: 5.90.0 + dev: false + + /@modern-js-app/eslint-config@2.46.1(@rsbuild/core@0.3.7)(typescript@5.0.4): + resolution: {integrity: sha512-TxU47cr1IGC/jCW85tlkIgwRdmogQtIZKm0CzY2gtjg9GHbpSZ/UZsQV4UKeaoYXH5dILLgMRGs8BFtQq8LUvw==} + peerDependencies: + typescript: ^4 || ^5 + dependencies: + '@babel/core': 7.23.7 + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.7)(eslint@8.56.0) + '@babel/eslint-plugin': 7.23.5(@babel/eslint-parser@7.23.3)(eslint@8.56.0) + '@rsbuild/babel-preset': 0.3.4(@rsbuild/core@0.3.7) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + eslint: 8.56.0 + eslint-config-prettier: 8.10.0(eslint@8.56.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.56.0) + eslint-plugin-filenames: 1.3.2(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.56.0) + eslint-plugin-node: 11.1.0(eslint@8.56.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8) + eslint-plugin-promise: 6.1.1(eslint@8.56.0) + eslint-plugin-react: 7.33.2(eslint@8.56.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) + prettier: 2.8.8 + typescript: 5.0.4 + transitivePeerDependencies: + - '@rsbuild/core' + - '@swc/helpers' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /@modern-js-reduck/plugin-auto-actions@1.1.11(@modern-js-reduck/store@1.1.11): + resolution: {integrity: sha512-Xn13uPuFh+UnV3BC6tO4N1sC5+aITX2zj5QDwU0wJgc/5zBz9fcElfQ8B+kvQe0/0VlY0ENArmFIl2h1N5TIkQ==} + peerDependencies: + '@modern-js-reduck/store': ^1.1.11 + dependencies: + '@modern-js-reduck/store': 1.1.11 + '@swc/helpers': 0.5.1 + dev: false + + /@modern-js-reduck/plugin-devtools@1.1.11(@modern-js-reduck/store@1.1.11): + resolution: {integrity: sha512-PEyJ1/K2wKtXV/JtaFGBC2fUGeY6hjnK/ZXt6p9O2HG3WOub3l76uYpR6B8QCu00+cIWph4MspgO9lHMAuQA8Q==} + peerDependencies: + '@modern-js-reduck/store': ^1.1.11 + dependencies: + '@modern-js-reduck/store': 1.1.11 + '@redux-devtools/extension': 3.3.0(redux@4.2.1) + '@swc/helpers': 0.5.1 + redux: 4.2.1 + dev: false + + /@modern-js-reduck/plugin-effects@1.1.11(@modern-js-reduck/store@1.1.11): + resolution: {integrity: sha512-koc8ObEWakI9um6qARbMtMOwith/lc+D2uKKhOAvMfWjKC0gER/SpTScWstweAzcvQCtwftynEOpeQyJC2FARA==} + peerDependencies: + '@modern-js-reduck/store': ^1.1.11 + dependencies: + '@modern-js-reduck/store': 1.1.11 + '@swc/helpers': 0.5.1 + redux: 4.2.1 + redux-promise-middleware: 6.2.0(redux@4.2.1) + dev: false + + /@modern-js-reduck/plugin-immutable@1.1.11(@modern-js-reduck/store@1.1.11): + resolution: {integrity: sha512-52gdosxffpmq+FhSKjJqNtnW/wtX6iy/Zq2pn28eyvGCARREVT3E28qZX0kCUH4L5ij2N7QJoQOSovYuXwOlRw==} + peerDependencies: + '@modern-js-reduck/store': ^1.1.11 + dependencies: + '@modern-js-reduck/store': 1.1.11 + '@swc/helpers': 0.5.1 + immer: 9.0.21 + dev: false + + /@modern-js-reduck/react@1.1.11(@types/react-dom@18.0.11)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-6ViI1wyrkSIAkwpKfK6bC8dnzmyfp2FTWL2AAI2PrIYNAhd+jMuTM4ik6xDHncQmTny3+rAH2B8FfsUIVm7fxQ==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@modern-js-reduck/plugin-auto-actions': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/plugin-devtools': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/plugin-effects': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/plugin-immutable': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/store': 1.1.11 + '@swc/helpers': 0.5.1 + '@types/react': 18.0.38 + '@types/react-dom': 18.0.11 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@modern-js-reduck/store@1.1.11: + resolution: {integrity: sha512-fvUeswe1pvF9IjC39/KgtQGV4FbwjOmVs2Fk4uxrxXEa7209qRJlDfqIGr5KsnXVporXg0oiDqwcg1xsEljw/A==} + dependencies: + '@swc/helpers': 0.5.1 + redux: 4.2.1 + dev: false + + /@modern-js/app-tools@2.46.1(@rsbuild/core@0.3.7)(postcss@8.4.33)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(typescript@5.0.4): + resolution: {integrity: sha512-s3+5bqWrEV4AM8G3K/TPdGRxjVEqYLhZEJdBEQPFtGKVSRuSpyYqM8bjp1GXM7Doyqjc96tBsU7SUTAyMSOoXw==} + engines: {node: '>=14.17.6'} + hasBin: true + dependencies: + '@babel/parser': 7.23.6 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@babel/types': 7.23.6 + '@modern-js/core': 2.46.1 + '@modern-js/new-action': 2.46.1(typescript@5.0.4) + '@modern-js/node-bundle-require': 2.46.1 + '@modern-js/plugin': 2.46.1 + '@modern-js/plugin-data-loader': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/plugin-i18n': 2.46.1 + '@modern-js/plugin-lint': 2.46.1 + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.7)(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server-core': 2.46.1 + '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.7) + '@modern-js/types': 2.46.1 + '@modern-js/uni-builder': 2.46.1(@babel/traverse@7.23.7)(esbuild@0.17.19)(postcss@8.4.33)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(typescript@5.0.4) + '@modern-js/upgrade': 2.46.1 + '@modern-js/utils': 2.46.1 + '@rsbuild/plugin-esbuild': 0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3) + '@rsbuild/plugin-node-polyfill': 0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@swc/helpers': 0.5.3 + es-module-lexer: 1.4.1 + esbuild: 0.17.19 + transitivePeerDependencies: + - '@parcel/css' + - '@rsbuild/core' + - '@swc/core' + - '@swc/css' + - '@types/express' + - '@types/webpack' + - bufferutil + - clean-css + - csso + - debug + - devcert + - lightningcss + - postcss + - react + - react-dom + - sockjs-client + - styled-components + - supports-color + - ts-node + - tsconfig-paths + - type-fest + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@modern-js/babel-compiler@2.46.1: + resolution: {integrity: sha512-JaEmVDOGFjn7wzDFRnKC8YWsmQtf5lxTWjkPHF1pZMVfnwbEo0wXeq1/ZqPtGzSO+vw6afhI0LZbB+2tF1paMw==} + dependencies: + '@babel/core': 7.23.7 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@modern-js/babel-plugin-module-resolver@2.46.1: + resolution: {integrity: sha512-YyxgrHAodXN6KQP13SpqbTg2Sv8LSTv3LujttUBhm829e4jU/8uK+dIQYFh/cQMCiUyEL2vlHWJW1xPsEdkfqg==} + dependencies: + '@swc/helpers': 0.5.3 + glob: 8.1.0 + pkg-up: 3.1.0 + reselect: 4.1.8 + resolve: 1.22.8 + dev: true + + /@modern-js/codesmith-formily@2.3.3(@modern-js/codesmith@2.3.3)(typescript@5.0.4): + resolution: {integrity: sha512-SIJRGYgr0i5PXSK7ZaoAZmAmoKrF+LYB3vV4ijKaESnl8pJRUqwPuxLOvQGIiFb/s6E7VTCrGpiQ7TUlUljS1g==} + peerDependencies: + '@modern-js/codesmith': ^2.3.3 + dependencies: + '@formily/json-schema': 2.3.1(typescript@5.0.4) + '@formily/validator': 2.3.1 + '@modern-js/codesmith': 2.3.3 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.1 + inquirer: 8.2.6 + transitivePeerDependencies: + - typescript + dev: true + + /@modern-js/codesmith@2.3.3: + resolution: {integrity: sha512-KBmkO05++5UB73DvNsoR9EhGMH1Z9jO9bq4nlDREwonc4XE3dJv6ojQlw9B9JRauG+FzNfp+i2cdqn4AWNPBbA==} + dependencies: + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.1 + axios: 1.6.5 + tar: 6.2.0 + transitivePeerDependencies: + - debug + dev: true + + /@modern-js/core@2.46.1: + resolution: {integrity: sha512-Seg5vQGiKUB3GwnqUx9Nc6HeXNR8rs/jtnzhx9AL+ZVNjw2zz9Sfc8jFP3vHIRXuXbvd4E12Rtl+5nlGVnZx2Q==} + dependencies: + '@modern-js/node-bundle-require': 2.46.1 + '@modern-js/plugin': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + dev: true + + /@modern-js/eslint-config@2.46.1(@rsbuild/core@0.3.7)(typescript@5.0.4): + resolution: {integrity: sha512-cVudBdjvZVNSfrKMbVtEKQrmRVjQp4A3hmE7EIRKnBAFBByI6tXGmNKOubtUN5Zj6XPOnYUXqyT2JE/jhT2G2g==} + dependencies: + '@modern-js-app/eslint-config': 2.46.1(@rsbuild/core@0.3.7)(typescript@5.0.4) + transitivePeerDependencies: + - '@rsbuild/core' + - '@swc/helpers' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + - typescript + dev: true + + /@modern-js/generator-common@3.3.8(@modern-js/codesmith@2.3.3)(typescript@5.0.4): + resolution: {integrity: sha512-8Ol5ZqsahwigJKIUKVxr1RCBBJWyJ2gOkpxKOzf5d5J4U8WiKqgezflVq5u21TFtM4DSOCohQUQ4zFWSRaEpow==} + dependencies: + '@modern-js/codesmith-formily': 2.3.3(@modern-js/codesmith@2.3.3)(typescript@5.0.4) + '@modern-js/plugin-i18n': 2.46.1 + '@swc/helpers': 0.5.3 + transitivePeerDependencies: + - '@modern-js/codesmith' + - typescript + dev: true + + /@modern-js/generator-utils@3.3.8(@modern-js/codesmith@2.3.3)(typescript@5.0.4): + resolution: {integrity: sha512-COG3AncB9XdU1Cq3fNZgOo2UfvrN4etTnuKFFKpTL1L0jydEMwN/yTUXEzsVQxDRikMmq2CldkTHpmHkcEn/HA==} + dependencies: + '@modern-js/generator-common': 3.3.8(@modern-js/codesmith@2.3.3)(typescript@5.0.4) + '@modern-js/plugin-i18n': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + transitivePeerDependencies: + - '@modern-js/codesmith' + - typescript + dev: true + + /@modern-js/new-action@2.46.1(typescript@5.0.4): + resolution: {integrity: sha512-/kTFVvfIDs4FOa4nQtlLNANpOOvMEyDk4qAqYD2gd8kWO88rMsaDG4tKxr51O4RjrqgR4ZpmQFeaanbdajZjlQ==} + dependencies: + '@modern-js/codesmith': 2.3.3 + '@modern-js/codesmith-formily': 2.3.3(@modern-js/codesmith@2.3.3)(typescript@5.0.4) + '@modern-js/generator-common': 3.3.8(@modern-js/codesmith@2.3.3)(typescript@5.0.4) + '@modern-js/generator-utils': 3.3.8(@modern-js/codesmith@2.3.3)(typescript@5.0.4) + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + transitivePeerDependencies: + - debug + - typescript + dev: true + + /@modern-js/node-bundle-require@2.46.1: + resolution: {integrity: sha512-tRPmMn0GWvlYTWDCs1tgji66nLZc20g/8fNumVD27+YnaUCd65xR13U3WOsXr6+zmIUnAw2yBF6TR2yx6i7y8g==} + dependencies: + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + esbuild: 0.17.19 + dev: true + + /@modern-js/plugin-data-loader@2.46.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-YUpj7kQnf8vfXtTBhKQc9LoI7TGZCEmO1Q2S9YTre/vsd8tn25C71AupEhCMrZh5RzyugHPe2RQ+Ad7FbyOftQ==} + engines: {node: '>=14.17.6'} + peerDependencies: + react: '>=17.0.0' + dependencies: + '@babel/core': 7.23.7 + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/utils': 2.46.1 + '@remix-run/node': 1.19.3 + '@swc/helpers': 0.5.3 + path-to-regexp: 6.2.1 + react: 18.2.0 + transitivePeerDependencies: + - react-dom + - supports-color + dev: true + + /@modern-js/plugin-i18n@2.46.1: + resolution: {integrity: sha512-A8Gouaf8IHMb5lIZ7imHq5mj7Qosuf9r0Q+66AI7oaIFpKxHRkX4eoc2dMw0YcGGDPmebZxG0rFUA9yqV3CC/Q==} + dependencies: + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + dev: true + + /@modern-js/plugin-lint@2.46.1: + resolution: {integrity: sha512-fSqux9RbFxVhHAMH1+IK3d/A3WS0o/sKOGzrMbdRoy0mMDwaEqX0Iw95uvuva7Z5fb5t20E3WHHkBswoxvzl9g==} + dependencies: + '@modern-js/tsconfig': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + cross-spawn: 7.0.3 + eslint: 8.56.0 + husky: 8.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@modern-js/plugin@2.46.1: + resolution: {integrity: sha512-9Jwn0x/MLH/tuhWUQ0Yfq/TvHqPF4PLivb+j+repXbBgh6LYaiZj+pDxZSsN7Za1jp1vhzPhajSaQCy0HjuutA==} + dependencies: + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + + /@modern-js/prod-server@2.46.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-O2q0G5QbPd80FMkqi7Mf/kD3sznOUCfhfV7BSzJLHM6djFAdxz8l3wytGL2jUADImTwKv30rWgp6f9dcg2+WPA==} + dependencies: + '@modern-js/plugin': 2.46.1 + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server-core': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + cookie: 0.5.0 + etag: 1.8.1 + fresh: 0.5.2 + http-proxy-middleware: 2.0.6 + ignore-styles: 5.0.1 + isbot: 3.8.0 + merge-deep: 3.0.3 + node-html-parser: 6.1.12 + path-to-regexp: 6.2.1 + serve-static: 1.15.0 + transitivePeerDependencies: + - '@types/express' + - debug + - react + - react-dom + - supports-color + dev: true + + /@modern-js/runtime-utils@2.46.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/dfd2VOxFlG5zLjpLILaWTJpGpoVufQmIe/zyxUmfmc25hTNvCaYpHgcBJdTuJstqkvo0EsenHWMZ+ESx7WIfw==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@modern-js/utils': 2.46.1 + '@remix-run/router': 1.10.0 + '@swc/helpers': 0.5.3 + lru-cache: 6.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router-dom: 6.17.0(react-dom@18.2.0)(react@18.2.0) + serialize-javascript: 6.0.2 + + /@modern-js/runtime@2.46.1(@types/react-dom@18.0.11)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0)(webpack@5.90.0): + resolution: {integrity: sha512-tt85zPh2dFPRYjg+xe3Jm2TKOXzZswF1WTcs430NgmmTtOlBZG1qKT1FxSQ6g8LZs7h6TtYULm1U1PaiIiWTSw==} + engines: {node: '>=14.17.6'} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@babel/core': 7.23.7 + '@babel/types': 7.23.6 + '@loadable/babel-plugin': 5.15.3(@babel/core@7.23.7) + '@loadable/component': 5.15.3(react@18.2.0) + '@loadable/server': 5.15.3(@loadable/component@5.15.3)(react@18.2.0) + '@loadable/webpack-plugin': 5.15.2(webpack@5.90.0) + '@modern-js-reduck/plugin-auto-actions': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/plugin-devtools': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/plugin-effects': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/plugin-immutable': 1.1.11(@modern-js-reduck/store@1.1.11) + '@modern-js-reduck/react': 1.1.11(@types/react-dom@18.0.11)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0) + '@modern-js-reduck/store': 1.1.11 + '@modern-js/plugin': 2.46.1 + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/types': 2.46.1 + '@modern-js/utils': 2.46.1 + '@remix-run/node': 1.19.3 + '@swc/helpers': 0.5.3 + '@types/loadable__component': 5.13.8 + '@types/react-helmet': 6.1.11 + '@types/styled-components': 5.1.34 + cookie: 0.5.0 + esbuild: 0.17.19 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-helmet: 6.1.0(react@18.2.0) + react-is: 18.2.0 + react-side-effect: 2.1.2(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - supports-color + - webpack + dev: false + + /@modern-js/server-core@2.46.1: + resolution: {integrity: sha512-/gmeoEJQ/JQ7V5ol27QbrqtZk7+96reUR3k+Qs9mOjMYtUGmPoeUOzEy4n1BlMkXJcPtE/Qo6tZVLOZ1zuIEkA==} + dependencies: + '@modern-js/plugin': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + dev: true + + /@modern-js/server-utils@2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4): + resolution: {integrity: sha512-Wo+g6q55A2UUTMwbbYUWkGey/H/1yE8mI4awdZ7GKMxemYKXlrvbGax0adiRrbB0R8NPjCSiB3Pq3t9aY2Ejuw==} + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) + '@babel/preset-react': 7.23.3(@babel/core@7.23.7) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@modern-js/babel-compiler': 2.46.1 + '@modern-js/babel-plugin-module-resolver': 2.46.1 + '@modern-js/utils': 2.46.1 + '@rsbuild/babel-preset': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@swc/helpers': 0.5.3 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.7)(@babel/traverse@7.23.7) + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - supports-color + dev: true + + /@modern-js/server-utils@2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.7): + resolution: {integrity: sha512-Wo+g6q55A2UUTMwbbYUWkGey/H/1yE8mI4awdZ7GKMxemYKXlrvbGax0adiRrbB0R8NPjCSiB3Pq3t9aY2Ejuw==} + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) + '@babel/preset-react': 7.23.3(@babel/core@7.23.7) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@modern-js/babel-compiler': 2.46.1 + '@modern-js/babel-plugin-module-resolver': 2.46.1 + '@modern-js/utils': 2.46.1 + '@rsbuild/babel-preset': 0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3) + '@swc/helpers': 0.5.3 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.7)(@babel/traverse@7.23.7) + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - supports-color + dev: true + + /@modern-js/server@2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7n9LuQ7gJ9PdS1/YC7IjApZBNiqvQ+bsHKgeB7yvUYk0/FSL5GU/oqyOqMddMx05tQXuTdQRAabB26yGbV+jBg==} + peerDependencies: + devcert: ^1.2.2 + ts-node: ^10.1.0 + tsconfig-paths: '>= 3.0.0 || >= 4.0.0' + peerDependenciesMeta: + devcert: + optional: true + ts-node: + optional: true + tsconfig-paths: + optional: true + dependencies: + '@babel/core': 7.23.7 + '@babel/register': 7.23.7(@babel/core@7.23.7) + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4) + '@modern-js/types': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + axios: 1.6.5 + connect-history-api-fallback: 2.0.0 + http-compression: 1.0.6 + minimatch: 3.1.2 + path-to-regexp: 6.2.1 + ws: 8.16.0 + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - '@types/express' + - bufferutil + - debug + - react + - react-dom + - supports-color + - utf-8-validate + dev: true + + /@modern-js/server@2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.7)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7n9LuQ7gJ9PdS1/YC7IjApZBNiqvQ+bsHKgeB7yvUYk0/FSL5GU/oqyOqMddMx05tQXuTdQRAabB26yGbV+jBg==} + peerDependencies: + devcert: ^1.2.2 + ts-node: ^10.1.0 + tsconfig-paths: '>= 3.0.0 || >= 4.0.0' + peerDependenciesMeta: + devcert: + optional: true + ts-node: + optional: true + tsconfig-paths: + optional: true + dependencies: + '@babel/core': 7.23.7 + '@babel/register': 7.23.7(@babel/core@7.23.7) + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/runtime-utils': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server-utils': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.7) + '@modern-js/types': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + axios: 1.6.5 + connect-history-api-fallback: 2.0.0 + http-compression: 1.0.6 + minimatch: 3.1.2 + path-to-regexp: 6.2.1 + ws: 8.16.0 + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - '@types/express' + - bufferutil + - debug + - react + - react-dom + - supports-color + - utf-8-validate + dev: true + + /@modern-js/tsconfig@2.46.1: + resolution: {integrity: sha512-LaDAQwzy59X3QP5YR4iH3ZGlI3nUFhzQ7LLFMbbI6yx3CtP5/RCOPpk9aPG4RMQwcf1FR4bEJQAJvUNhfKclHQ==} + dev: true + + /@modern-js/types@2.46.1: + resolution: {integrity: sha512-Z6eA3kc+raiTP+FgxItzxnQ7JV1gOEC63floqguL2PJrVJMz1BqfQqKeen0i7uDinjGI+G0A/2eIpJbkL6Wc1A==} + + /@modern-js/uni-builder@2.46.1(@babel/traverse@7.23.7)(esbuild@0.17.19)(postcss@8.4.33)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(typescript@5.0.4): + resolution: {integrity: sha512-AK4G9ha1Vs9J65YNy0lI82/JlgkGo0HVXTcImMjGuMwZ/03qM1QvBonjm1VxowSe+r+NXMBt4WwpIHOjtGdQOw==} + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-react': 7.23.3(@babel/core@7.23.7) + '@babel/types': 7.23.6 + '@modern-js/prod-server': 2.46.1(react-dom@18.2.0)(react@18.2.0) + '@modern-js/server': 2.46.1(@babel/traverse@7.23.7)(@rsbuild/core@0.3.4)(react-dom@18.2.0)(react@18.2.0) + '@modern-js/utils': 2.46.1 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.14.0)(webpack@5.90.0) + '@rsbuild/babel-preset': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/core': 0.3.4 + '@rsbuild/plugin-assets-retry': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-babel': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-check-syntax': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-css-minimizer': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3)(esbuild@0.17.19)(webpack@5.90.0) + '@rsbuild/plugin-pug': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-react': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-rem': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-source-build': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-styled-components': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-svgr': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3)(typescript@5.0.4) + '@rsbuild/plugin-toml': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/plugin-type-check': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3)(typescript@5.0.4)(webpack@5.90.0) + '@rsbuild/plugin-yaml': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@rsbuild/webpack': 0.3.4(@swc/helpers@0.5.3)(esbuild@0.17.19) + '@swc/helpers': 0.5.3 + babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.90.0) + babel-plugin-import: 1.13.5 + babel-plugin-styled-components: 1.13.3(styled-components@6.1.8) + babel-plugin-transform-react-remove-prop-types: 0.4.24 + cssnano: 6.0.1(postcss@8.4.33) + glob: 9.3.5 + html-webpack-plugin: 5.5.3(webpack@5.90.0) + lodash: 4.17.21 + postcss-custom-properties: 13.1.5(postcss@8.4.33) + postcss-font-variant: 5.0.0(postcss@8.4.33) + postcss-initial: 4.0.1(postcss@8.4.33) + postcss-media-minmax: 5.0.0(postcss@8.4.33) + postcss-nesting: 12.0.1(postcss@8.4.33) + postcss-page-break: 3.0.4(postcss@8.4.33) + react-refresh: 0.14.0 + rspack-manifest-plugin: 5.0.0-alpha0(webpack@5.90.0) + ts-loader: 9.4.4(typescript@5.0.4)(webpack@5.90.0) + webpack: 5.90.0(esbuild@0.17.19) + webpack-manifest-plugin: 5.0.0(webpack@5.90.0) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.3)(webpack@5.90.0) + transitivePeerDependencies: + - '@babel/traverse' + - '@parcel/css' + - '@swc/core' + - '@swc/css' + - '@types/express' + - '@types/webpack' + - bufferutil + - clean-css + - csso + - debug + - devcert + - esbuild + - lightningcss + - postcss + - react + - react-dom + - sockjs-client + - styled-components + - supports-color + - ts-node + - tsconfig-paths + - type-fest + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@modern-js/upgrade@2.46.1: + resolution: {integrity: sha512-2AKTIs6ceM8p4ON73idYfgnlOmf2COGVjN41FlST3MnbcfNpFIB1O2Ys6Zf0QHxqRB+FVkoqFzUfbeKaxb8yUg==} + hasBin: true + dependencies: + '@modern-js/codesmith': 2.3.3 + '@modern-js/plugin-i18n': 2.46.1 + '@modern-js/utils': 2.46.1 + '@swc/helpers': 0.5.3 + transitivePeerDependencies: + - debug + dev: true + + /@modern-js/utils@2.46.1: + resolution: {integrity: sha512-kV4N3JMfyl4pYJIPhtMTby7EOxid9Adq298Z9b2TbAb1EgzyiuDviOakzcks8jRAiesuI9sh7TFjLPniHdSQUA==} + dependencies: + '@swc/helpers': 0.5.3 + caniuse-lite: 1.0.30001579 + lodash: 4.17.21 + rslog: 1.2.0 + + /@module-federation/runtime-tools@0.0.8: + resolution: {integrity: sha512-tqx3wlVHnpWLk+vn22c0x9Nv1BqdZnoS6vdMb53IsVpbQIFP70nhhvymHUyFuPkoLzMFidS7GpG58DYT/4lvCw==} + dependencies: + '@module-federation/runtime': 0.0.8 + '@module-federation/webpack-bundler-runtime': 0.0.8 + dev: true + + /@module-federation/runtime@0.0.8: + resolution: {integrity: sha512-Hi9g10aHxHdQ7CbchSvke07YegYwkf162XPOmixNmJr5Oy4wVa2d9yIVSrsWFhBRbbvM5iJP6GrSuEq6HFO3ug==} + dependencies: + '@module-federation/sdk': 0.0.8 + dev: true + + /@module-federation/sdk@0.0.8: + resolution: {integrity: sha512-lkasywBItjUTNT0T0IskonDE2E/2tXE9UhUCPVoDL3NteDUSFGg4tpkF+cey1pD8mHh0XJcGrCuOW7s96peeAg==} + dev: true + + /@module-federation/webpack-bundler-runtime@0.0.8: + resolution: {integrity: sha512-ULwrTVzF47+6XnWybt6SIq97viEYJRv4P/DByw5h7PSX9PxSGyMm5pHfXdhcb7tno7VknL0t2V8F48fetVL9kA==} + dependencies: + '@module-federation/runtime': 0.0.8 + '@module-federation/sdk': 0.0.8 + dev: true + + /@mui/base@5.0.0-beta.33(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-WcSpoJUw/UYHXpvgtl4HyMar2Ar97illUpqiS/X1gtSBp6sdDW6kB2BJ9OlVQ+Kk/RL2GDp/WHA9sbjAYV35ow==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@floating-ui/react-dom': 2.0.6(react-dom@18.2.0)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.0.38) + '@mui/utils': 5.15.6(@types/react@18.0.38)(react@18.2.0) + '@popperjs/core': 2.11.8 + '@types/react': 18.0.38 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@mui/core-downloads-tracker@5.15.6: + resolution: {integrity: sha512-0aoWS4qvk1uzm9JBs83oQmIMIQeTBUeqqu8u+3uo2tMznrB5fIKqQVCbCgq+4Tm4jG+5F7dIvnjvQ2aV7UKtdw==} + dev: false + + /@mui/icons-material@5.15.6(@mui/material@5.15.6)(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-GnkxMtlhs+8ieHLmCytg00ew0vMOiXGFCw8Ra9nxMsBjBqnrOI5gmXqUm+sGggeEU/HG8HyeqC1MX/IxOBJHzA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@mui/material': 5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.0.38 + react: 18.2.0 + dev: false + + /@mui/material@5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-rw7bDdpi2kzfmcDN78lHp8swArJ5sBCKsn+4G3IpGfu44ycyWAWX0VdlvkjcR9Yrws2KIm7c+8niXpWHUDbWoA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@emotion/react': 11.11.3(@types/react@18.0.38)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.0.38)(react@18.2.0) + '@mui/base': 5.0.0-beta.33(@types/react@18.0.38)(react-dom@18.2.0)(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.6 + '@mui/system': 5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.0.38)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.0.38) + '@mui/utils': 5.15.6(@types/react@18.0.38)(react@18.2.0) + '@types/react': 18.0.38 + '@types/react-transition-group': 4.4.10 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + dev: false + + /@mui/private-theming@5.15.6(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-ZBX9E6VNUSscUOtU8uU462VvpvBS7eFl5VfxAzTRVQBHflzL+5KtnGrebgf6Nd6cdvxa1o0OomiaxSKoN2XDmg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@mui/utils': 5.15.6(@types/react@18.0.38)(react@18.2.0) + '@types/react': 18.0.38 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/styled-engine@5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-KAn8P8xP/WigFKMlEYUpU9z2o7jJnv0BG28Qu1dhNQVutsLVIFdRf5Nb+0ijp2qgtcmygQ0FtfRuXv5LYetZTg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.3(@types/react@18.0.38)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.0.38)(react@18.2.0) + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/system@5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-J01D//u8IfXvaEHMBQX5aO2l7Q+P15nt96c4NskX7yp5/+UuZP8XCQJhtBtLuj+M2LLyXHYGmCPeblsmmscP2Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@emotion/react': 11.11.3(@types/react@18.0.38)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.0.38)(react@18.2.0) + '@mui/private-theming': 5.15.6(@types/react@18.0.38)(react@18.2.0) + '@mui/styled-engine': 5.15.6(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.0.38) + '@mui/utils': 5.15.6(@types/react@18.0.38)(react@18.2.0) + '@types/react': 18.0.38 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/types@7.2.13(@types/react@18.0.38): + resolution: {integrity: sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.38 + dev: false + + /@mui/utils@5.15.6(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-qfEhf+zfU9aQdbzo1qrSWlbPQhH1nCgeYgwhOVnj9Bn39shJQitEnXpSQpSNag8+uty5Od6PxmlNKPTnPySRKA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.8 + '@types/prop-types': 15.7.11 + '@types/react': 18.0.38 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + dev: false + + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: true + + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.14.0)(webpack@5.90.0): + resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <4.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.35.1 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.4.0 + loader-utils: 2.0.4 + react-refresh: 0.14.0 + schema-utils: 3.3.0 + source-map: 0.7.4 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@redux-devtools/extension@3.3.0(redux@4.2.1): + resolution: {integrity: sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==} + peerDependencies: + redux: ^3.1.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@babel/runtime': 7.23.8 + immutable: 4.3.4 + redux: 4.2.1 + dev: false + + /@remix-run/node@1.19.3: + resolution: {integrity: sha512-z5qrVL65xLXIUpU4mkR4MKlMeKARLepgHAk4W5YY3IBXOreRqOGUC70POViYmY7x38c2Ia1NwqL80H+0h7jbMw==} + engines: {node: '>=14.0.0'} + dependencies: + '@remix-run/server-runtime': 1.19.3 + '@remix-run/web-fetch': 4.4.2 + '@remix-run/web-file': 3.1.0 + '@remix-run/web-stream': 1.1.0 + '@web3-storage/multipart-parser': 1.0.0 + abort-controller: 3.0.0 + cookie-signature: 1.2.1 + source-map-support: 0.5.21 + stream-slice: 0.1.2 + + /@remix-run/router@1.10.0: + resolution: {integrity: sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw==} + engines: {node: '>=14.0.0'} + + /@remix-run/router@1.7.2: + resolution: {integrity: sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==} + engines: {node: '>=14'} + + /@remix-run/server-runtime@1.19.3: + resolution: {integrity: sha512-KzQ+htUsKqpBgKE2tWo7kIIGy3MyHP58Io/itUPvV+weDjApwr9tQr9PZDPA3yAY6rAzLax7BU0NMSYCXWFY5A==} + engines: {node: '>=14.0.0'} + dependencies: + '@remix-run/router': 1.7.2 + '@types/cookie': 0.4.1 + '@web3-storage/multipart-parser': 1.0.0 + cookie: 0.4.2 + set-cookie-parser: 2.6.0 + source-map: 0.7.4 + + /@remix-run/web-blob@3.1.0: + resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} + dependencies: + '@remix-run/web-stream': 1.1.0 + web-encoding: 1.1.5 + + /@remix-run/web-fetch@4.4.2: + resolution: {integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==} + engines: {node: ^10.17 || >=12.3} + dependencies: + '@remix-run/web-blob': 3.1.0 + '@remix-run/web-file': 3.1.0 + '@remix-run/web-form-data': 3.1.0 + '@remix-run/web-stream': 1.1.0 + '@web3-storage/multipart-parser': 1.0.0 + abort-controller: 3.0.0 + data-uri-to-buffer: 3.0.1 + mrmime: 1.0.1 + + /@remix-run/web-file@3.1.0: + resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} + dependencies: + '@remix-run/web-blob': 3.1.0 + + /@remix-run/web-form-data@3.1.0: + resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} + dependencies: + web-encoding: 1.1.5 + + /@remix-run/web-stream@1.1.0: + resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + dependencies: + web-streams-polyfill: 3.3.2 + + /@rsbuild/babel-preset@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-lGYVxjuf5SmWt10cBu/agYxpXNfFrvgcl7r9pnObWF9bRwsuaI1S+EuigjFeBUVPdNs4OMQy46sQaTpMfp4p0A==} + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-proposal-partial-application': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-proposal-pipeline-operator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.7) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/runtime': 7.23.8 + '@babel/types': 7.23.6 + '@rsbuild/plugin-babel': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/babel__core': 7.20.5 + babel-plugin-dynamic-import-node: 2.3.3 + core-js: 3.32.2 + transitivePeerDependencies: + - '@rsbuild/core' + - '@swc/helpers' + - supports-color + dev: true + + /@rsbuild/babel-preset@0.3.4(@rsbuild/core@0.3.7): + resolution: {integrity: sha512-lGYVxjuf5SmWt10cBu/agYxpXNfFrvgcl7r9pnObWF9bRwsuaI1S+EuigjFeBUVPdNs4OMQy46sQaTpMfp4p0A==} + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-proposal-partial-application': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-proposal-pipeline-operator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.7) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/runtime': 7.23.8 + '@babel/types': 7.23.6 + '@rsbuild/plugin-babel': 0.3.4(@rsbuild/core@0.3.7) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/babel__core': 7.20.5 + babel-plugin-dynamic-import-node: 2.3.3 + core-js: 3.32.2 + transitivePeerDependencies: + - '@rsbuild/core' + - '@swc/helpers' + - supports-color + dev: true + + /@rsbuild/babel-preset@0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-lGYVxjuf5SmWt10cBu/agYxpXNfFrvgcl7r9pnObWF9bRwsuaI1S+EuigjFeBUVPdNs4OMQy46sQaTpMfp4p0A==} + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-proposal-partial-application': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-proposal-pipeline-operator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.7) + '@babel/preset-env': 7.23.8(@babel/core@7.23.7) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/runtime': 7.23.8 + '@babel/types': 7.23.6 + '@rsbuild/plugin-babel': 0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/babel__core': 7.20.5 + babel-plugin-dynamic-import-node: 2.3.3 + core-js: 3.32.2 + transitivePeerDependencies: + - '@rsbuild/core' + - '@swc/helpers' + - supports-color + dev: true + + /@rsbuild/core@0.3.4: + resolution: {integrity: sha512-FrAFuu0q9l1/lTqSNU8/qYPVDXYFOBz4abOjd61ycLjVtFaMhOWDjKxqI+c6k3XG3pZQ+CmjSfT4m50gA20+nA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@rspack/core': 0.5.0(@swc/helpers@0.5.3) + '@swc/helpers': 0.5.3 + core-js: 3.32.2 + html-webpack-plugin: /html-rspack-plugin@5.5.7 + postcss: 8.4.33 + dev: true + + /@rsbuild/core@0.3.7: + resolution: {integrity: sha512-3CECaT33x0m+tnnvdSMmNkRUn5D0hrd2lSBklmyBKwTASKT8xlhHNWOTFbrOlG4PByjPRCO4PoykZa5OOVvXMA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@rsbuild/shared': 0.3.7(@swc/helpers@0.5.3) + '@rspack/core': 0.5.0(@swc/helpers@0.5.3) + '@swc/helpers': 0.5.3 + core-js: 3.32.2 + html-webpack-plugin: /html-rspack-plugin@5.5.7 + postcss: 8.4.33 + dev: true + + /@rsbuild/monorepo-utils@0.3.4(@swc/helpers@0.5.3): + resolution: {integrity: sha512-tjC/65mq+M5TGIhkgT//m8yxmlmq2KXhkG15TJS5f17BsY2UPjftJQ9/R4kyDmqnZ40kBgtK6rsTa23V6b+uXQ==} + dependencies: + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + fast-glob: 3.3.2 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-assets-retry@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-tJt1w2u17ovIMriU1m7+3xRHEsznjB5YWkG7m0NQgKYwUdfLT9hyU+PdcFiY2KdC36t2M2Ntz2XRYhV+KKzqXg==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + serialize-javascript: 6.0.2 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-babel@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-N6frB1R9mK1K/leaA73eNF2Vo9hy4B1i4+CGFUCbP4msS0DGasAlZ1fUlNWvCi7a07Q9R2QbWc38RG1yRyKYBw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/babel__core': 7.20.5 + upath: 2.0.1 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + dev: true + + /@rsbuild/plugin-babel@0.3.4(@rsbuild/core@0.3.7): + resolution: {integrity: sha512-N6frB1R9mK1K/leaA73eNF2Vo9hy4B1i4+CGFUCbP4msS0DGasAlZ1fUlNWvCi7a07Q9R2QbWc38RG1yRyKYBw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@rsbuild/core': 0.3.7 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/babel__core': 7.20.5 + upath: 2.0.1 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + dev: true + + /@rsbuild/plugin-babel@0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-N6frB1R9mK1K/leaA73eNF2Vo9hy4B1i4+CGFUCbP4msS0DGasAlZ1fUlNWvCi7a07Q9R2QbWc38RG1yRyKYBw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@rsbuild/core': 0.3.7 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/babel__core': 7.20.5 + upath: 2.0.1 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + dev: true + + /@rsbuild/plugin-check-syntax@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-8K13olafanPrrN6SubefdW+FzXKA480wWzd8NHgDDO+KBJGQKStRI84yVt3xSBtp1PfJbMXzZmAOQoQRLOW7WA==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + acorn: 8.11.3 + caniuse-lite: 1.0.30001579 + htmlparser2: 9.0.0 + source-map: 0.7.4 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-css-minimizer@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3)(esbuild@0.17.19)(webpack@5.90.0): + resolution: {integrity: sha512-gJLj3f8W4TSjDzo8bvW9VVeai2g5QqXT0WDyKjqWp/0XRbseOqWJu5lJPOnyaGcul3qAFSuKgUUon2z1HoEBhA==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + css-minimizer-webpack-plugin: 5.0.1(esbuild@0.17.19)(webpack@5.90.0) + transitivePeerDependencies: + - '@parcel/css' + - '@swc/css' + - '@swc/helpers' + - clean-css + - csso + - esbuild + - lightningcss + - webpack + dev: true + + /@rsbuild/plugin-esbuild@0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-+fNDEtLRlY5hZ9Iv63WFk5KIMFGhZsGLuI7fqcmQRSClebifQ267YQFvwtGNMOraOIqxiFElmhxHdjIDHJYEUA==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.7 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + esbuild: 0.17.19 + webpack: 5.90.0(esbuild@0.17.19) + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - uglify-js + - webpack-cli + dev: true + + /@rsbuild/plugin-node-polyfill@0.3.4(@rsbuild/core@0.3.7)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-PcVKW8o8qyeg+rLMO3xzfVOPkyZVNQrBJDz5w2WlB46YVFgIx4B9NjipSfGhgXF0aGx7fYAp0lOGtFT57DJVCg==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.7 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + node-libs-browser: 2.2.1 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-pug@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-sUyF3b3K9ZLvoMQuYeN3NI+zz2IlNqaPRWLNFr8LHzTKx52DnM8OxKpQsmTs2oNq4YxCIp1o/wSvCMmE5ftzDA==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@types/pug': 2.0.10 + pug: 3.0.2 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-react@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-vbdZUj1KApKWklTuUAkY+bevucbejsnn+v6BBhYGk37j5SvhTY/uNBpZBcuBl7EX/1xnOaHLy91wqFOKhSxgkw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@rspack/plugin-react-refresh': 0.5.0(react-refresh@0.14.0) + react-refresh: 0.14.0 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-rem@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-AEsJHOtLcGr3OslrQ7FdJkTt/ZFTtLgFf3Ix73yY6pNyez/x4o8Kl0/Kk75hZsGm8N/j01XOzFgHRDKs4a7R7A==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + terser: 5.19.2 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-source-build@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-ARazIJpqYU/gQlfsUzchI9PvnDlhUK0+vz0ub/7aURvqPwBe0LpmWf5+9PHofg6oxWmMcZgl66gwnospMmjGnQ==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/monorepo-utils': 0.3.4(@swc/helpers@0.5.3) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-styled-components@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-PIyRMHl/N+yYQOvio1Kyh76y1YKzFzI4T2m4+qXJz6oKYKOq4WaRKP6whyXDdSKtIBmo73r06wOGJy3YyrcjNg==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-svgr@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3)(typescript@5.0.4): + resolution: {integrity: sha512-sOxLBux+zZ4oZBMAL/CTdGkfobXTsONEmFXWmE/aPIj3jDuoZri+HPgVK5sOT+iqU7o+LMfp+bjxO103TB2dZw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/plugin-react': 0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3) + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + '@svgr/core': 8.1.0(typescript@5.0.4) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.0.4) + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + - typescript + dev: true + + /@rsbuild/plugin-toml@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-TB1QqiFMxvBZuX6bk3ZSycjnBt043yyAaOp0oIw4RtPirsQKZvsCy+i1lL7QvRKeZVddJKiqT9n/+KvkBotpeA==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/plugin-type-check@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3)(typescript@5.0.4)(webpack@5.90.0): + resolution: {integrity: sha512-ww5LLmKNlIQO5o4BIvJazZnO3/LLWN1XS/NRTkUDK5Zzo47uAAaqwdYPZvWw6PDtVL4wH0NWKUJBrtBP+i++Dw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.0.4)(webpack@5.90.0) + transitivePeerDependencies: + - '@swc/helpers' + - typescript + - webpack + dev: true + + /@rsbuild/plugin-yaml@0.3.4(@rsbuild/core@0.3.4)(@swc/helpers@0.5.3): + resolution: {integrity: sha512-KV7Kc9USPlvUqAG4uyYU+yI25XoDnp+rJPL478P7nOSamiNV1vHKmMQqIelzCVULec1L4cxxkWEf4Lnu8Atovw==} + peerDependencies: + '@rsbuild/core': ^0.3.4 + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/shared@0.3.4(@swc/helpers@0.5.3): + resolution: {integrity: sha512-rvm+B2pGHsRSW3LiqPzOnyg/PQMNZsrX2QvuZLUovuF3DpvzKJoBsrj0ih1c0ymlIEitEcoBqiJbQUVQI3iDUQ==} + dependencies: + '@rspack/core': 0.5.0(@swc/helpers@0.5.3) + caniuse-lite: 1.0.30001579 + lodash: 4.17.21 + postcss: 8.4.33 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/shared@0.3.7(@swc/helpers@0.5.3): + resolution: {integrity: sha512-XY82H5CzymyuUC3zGxTWDgKEXWXiQnt1kmPQS1T1mS6jwo8SSwTcEub+E5vtpAOn6r1tNGGHZre+7EVJtF51nQ==} + dependencies: + '@rspack/core': 0.5.0(@swc/helpers@0.5.3) + caniuse-lite: 1.0.30001579 + lodash: 4.17.21 + postcss: 8.4.33 + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@rsbuild/webpack@0.3.4(@swc/helpers@0.5.3)(esbuild@0.17.19): + resolution: {integrity: sha512-xcgbcdmu9mPwTRG08hKdwuo+pXMZpbALxLXzuLpIUnO5J9atwMWDoIPGFNwqpuQxznCWKn8lQffX6lpr42hKwQ==} + dependencies: + '@rsbuild/core': 0.3.4 + '@rsbuild/shared': 0.3.4(@swc/helpers@0.5.3) + fast-glob: 3.3.2 + globby: 11.1.0 + html-webpack-plugin: /html-rspack-plugin@5.5.7 + mini-css-extract-plugin: 2.7.7(webpack@5.90.0) + postcss: 8.4.33 + terser-webpack-plugin: 5.3.9(esbuild@0.17.19)(webpack@5.90.0) + tsconfig-paths-webpack-plugin: 4.1.0 + webpack: 5.90.0(esbuild@0.17.19) + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - esbuild + - uglify-js + - webpack-cli + dev: true + + /@rspack/binding-darwin-arm64@0.5.0: + resolution: {integrity: sha512-zRx4efhn2eCjdhHt6avhdkKur6FZvYy1TgPhNKpWbTg7fnrvtNGzcVQCAOnPUUPkJjnss3veOhZlWJ3paX0EDQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-darwin-x64@0.5.0: + resolution: {integrity: sha512-d6SvBURfKow3WcKxTrjJPBkp+NLsuCPoIMaS8/bM4gHwgjVs2zuOsTQ9+l36dypOkjnu6QLkOIykTdiUKJ0eQg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-gnu@0.5.0: + resolution: {integrity: sha512-97xFbF7RjJc2VvX+0Hvb7Jzsk+eEE8oEUcc5Dnb7OIwGZulWKk6cLNcRkNfmL/F9kk1QEKlUTNC/VQI7ljf2tA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-musl@0.5.0: + resolution: {integrity: sha512-lk0IomCy276EoynmksoBwg0IcHvvVXuZPMeq7OgRPTvs33mdTExSzSTPtrGzx/D00bX1ybUqLQwJhcgGt6erPQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-gnu@0.5.0: + resolution: {integrity: sha512-r15ddpse0S/8wHtfL85uJrVotvPVIMnQX06KlXyGUSw1jWrjxV+NXFDJ4xXnHCvk/YV6lCFTotAssk4wJEE0Fw==} + cpu: [x64] + os: [linux] + libc: [glibc] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-musl@0.5.0: + resolution: {integrity: sha512-lB9Dn1bi4xyzEe6Bf/GQ7Ktlrq4Kmt1LHwN+t0m6iVYH3Vb/3g8uQGDSkwnjP8NmlAtldK1cmvRMhR7flUrgZA==} + cpu: [x64] + os: [linux] + libc: [musl] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-arm64-msvc@0.5.0: + resolution: {integrity: sha512-aDoF13puU8LxST/qKZndtXzlJbnbnxY2Bxyj0fu7UDh8nHJD4A2HQfWRN6BZFHaVSqM6Bnli410dJrIWeTNhZQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-ia32-msvc@0.5.0: + resolution: {integrity: sha512-EYGeH4YKX5v4gtTL8mBAWnsKSkF+clsKu0z1hgWgSV/vnntNlqJQZUCb5CMdg5VqadNm+lUNDYYHeHNa3+Jp3w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-x64-msvc@0.5.0: + resolution: {integrity: sha512-RCECFW6otUrFiPbWQyOvLZOMNV/OL6AyAKMDbX9ejjk0TjLMrHjnhmI5X8EoA/SUc1/vEbgsJzDVLKTfn138cg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding@0.5.0: + resolution: {integrity: sha512-+v1elZMn6lKBqbXQzhcfeCaPzztFNGEkNDEcQ7weako6yQPsBihGCRzveMMzZkja4RyB9GRHjWRE+THm8V8+3w==} + optionalDependencies: + '@rspack/binding-darwin-arm64': 0.5.0 + '@rspack/binding-darwin-x64': 0.5.0 + '@rspack/binding-linux-arm64-gnu': 0.5.0 + '@rspack/binding-linux-arm64-musl': 0.5.0 + '@rspack/binding-linux-x64-gnu': 0.5.0 + '@rspack/binding-linux-x64-musl': 0.5.0 + '@rspack/binding-win32-arm64-msvc': 0.5.0 + '@rspack/binding-win32-ia32-msvc': 0.5.0 + '@rspack/binding-win32-x64-msvc': 0.5.0 + dev: true + + /@rspack/core@0.5.0(@swc/helpers@0.5.3): + resolution: {integrity: sha512-/Bpujdtx28qYir7AK9VVSbY35GBFEcZ1NTJZBx/WIzZGZWLCxhlVYfjH8cj44y4RvXa0Y26tnj/q7VJ4U3sHug==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@module-federation/runtime-tools': 0.0.8 + '@rspack/binding': 0.5.0 + '@swc/helpers': 0.5.3 + browserslist: 4.22.2 + enhanced-resolve: 5.12.0 + graceful-fs: 4.2.10 + json-parse-even-better-errors: 3.0.1 + neo-async: 2.6.2 + tapable: 2.2.1 + terminal-link: 2.1.1 + watchpack: 2.4.0 + webpack-sources: 3.2.3 + zod: 3.22.4 + zod-validation-error: 1.3.1(zod@3.22.4) + dev: true + + /@rspack/plugin-react-refresh@0.5.0(react-refresh@0.14.0): + resolution: {integrity: sha512-Tas91XaFgRmgdLFzgeei/LybMFvnYBicMf4Y7Yt9lZHRHfgONrGbmqSVeS+nWWTW9U8Q31K9uiM2Z2a02hq2Vw==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + peerDependenciesMeta: + react-refresh: + optional: true + dependencies: + react-refresh: 0.14.0 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sttot/api-hooks@1.2.5(axios@1.6.5)(lodash@4.17.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Uw2MZJe4xQCPY+cwnj1HREsj44qdDbNe5/Z17TKkaJWjNQn+yFeZYeOt8aHp/g6vv6wLj0ALwUY9F/PnmoSdcQ==} + engines: {node: '>=14.17.6'} + peerDependencies: + react: ^17 + react-dom: ^17 + dependencies: + '@babel/runtime': 7.23.8 + '@sttot/axios-api': 0.2.4(axios@1.6.5)(lodash@4.17.21) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - axios + - lodash + dev: false + + /@sttot/axios-api@0.2.4(axios@1.6.5)(lodash@4.17.21): + resolution: {integrity: sha512-I09pUX0aC08ucvjJaEqZlc1xP78l/qpf0rT13ysq6fB9AJjNtbyDOhGQYeVhkHRjjSTXSQRHL/vsHEX0J4ypOQ==} + engines: {node: '>=14.17.6'} + peerDependencies: + axios: ^1.1.3 + lodash: ^4.17.21 + dependencies: + '@babel/runtime': 7.23.8 + axios: 1.6.5 + lodash: 4.17.21 + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.7): + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@svgr/babel-preset@8.1.0(@babel/core@7.23.7): + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.7) + dev: true + + /@svgr/core@8.1.0(typescript@5.0.4): + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.0.4) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@svgr/hast-util-to-babel-ast@8.0.0: + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + dependencies: + '@babel/types': 7.23.6 + entities: 4.5.0 + dev: true + + /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7) + '@svgr/core': 8.1.0(typescript@5.0.4) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.0.4): + resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 8.1.0(typescript@5.0.4) + cosmiconfig: 8.3.6(typescript@5.0.4) + deepmerge: 4.3.1 + svgo: 3.2.0 + transitivePeerDependencies: + - typescript + dev: true + + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.6.2 + + /@swc/helpers@0.5.3: + resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + dependencies: + tslib: 2.6.2 + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: true + + /@types/d3-axis@3.0.6: + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: true + + /@types/d3-brush@3.0.6: + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: true + + /@types/d3-chord@3.0.6: + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + dev: true + + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: true + + /@types/d3-contour@3.0.6: + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.14 + dev: true + + /@types/d3-delaunay@6.0.4: + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + dev: true + + /@types/d3-dispatch@3.0.6: + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + dev: true + + /@types/d3-drag@3.0.7: + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: true + + /@types/d3-dsv@3.0.7: + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + dev: true + + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: true + + /@types/d3-fetch@3.0.7: + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + dependencies: + '@types/d3-dsv': 3.0.7 + dev: true + + /@types/d3-force@3.0.9: + resolution: {integrity: sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==} + dev: true + + /@types/d3-format@3.0.4: + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + dev: true + + /@types/d3-geo@3.1.0: + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + dependencies: + '@types/geojson': 7946.0.14 + dev: true + + /@types/d3-hierarchy@3.1.6: + resolution: {integrity: sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==} + dev: true + + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + dependencies: + '@types/d3-color': 3.1.3 + dev: true + + /@types/d3-path@3.0.2: + resolution: {integrity: sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==} + dev: true + + /@types/d3-polygon@3.0.2: + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + dev: true + + /@types/d3-quadtree@3.0.6: + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + dev: true + + /@types/d3-random@3.0.3: + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + dev: true + + /@types/d3-scale-chromatic@3.0.3: + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + dev: true + + /@types/d3-scale@4.0.8: + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + dependencies: + '@types/d3-time': 3.0.3 + dev: true + + /@types/d3-selection@3.0.10: + resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} + dev: true + + /@types/d3-shape@3.1.6: + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + dependencies: + '@types/d3-path': 3.0.2 + dev: true + + /@types/d3-time-format@4.0.3: + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + dev: true + + /@types/d3-time@3.0.3: + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: true + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: true + + /@types/d3-transition@3.0.8: + resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: true + + /@types/d3-zoom@3.0.8: + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.10 + dev: true + + /@types/d3@7.4.3: + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.6 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.9 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.6 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.0.2 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 + '@types/d3-selection': 3.0.10 + '@types/d3-shape': 3.1.6 + '@types/d3-time': 3.0.3 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.8 + '@types/d3-zoom': 3.0.8 + dev: true + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.2 + '@types/estree': 1.0.5 + + /@types/eslint@8.56.2: + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + /@types/estree-jsx@1.0.5: + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/geojson@7946.0.14: + resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + dev: true + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/hoist-non-react-statics@3.3.5: + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + dependencies: + '@types/react': 18.0.38 + hoist-non-react-statics: 3.3.2 + dev: false + + /@types/html-minifier-terser@6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + dev: true + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 16.11.68 + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.2.6: + resolution: {integrity: sha512-XEUC/Tgw3uMh6Ho8GkUtQ2lPhY5Fmgyp3TdlkTJs1W9VgNxs+Ow/x3Elh8lHQKqCbZL0AubQuqWjHVT033Hhrw==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + dev: false + + /@types/loadable__component@5.13.8: + resolution: {integrity: sha512-0FF/WihuPkR5IFOHiBzC95bSACvgQNUQCuNy1WF8F/lCBBHgS2SxarIk4CTjWM10A72ovpmXZDRcuAXZNS+/kQ==} + dependencies: + '@types/react': 18.0.38 + dev: false + + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + dev: true + + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + + /@types/node@16.11.68: + resolution: {integrity: sha512-JkRpuVz3xCNCWaeQ5EHLR/6woMbHZz/jZ7Kmc63AkU+1HxnoUugzSWMck7dsR4DvNYX8jp9wTi9K7WvnxOIQZQ==} + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/pug@2.0.10: + resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + dev: true + + /@types/react-dom@18.0.11: + resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} + dependencies: + '@types/react': 18.0.38 + + /@types/react-helmet@6.1.11: + resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==} + dependencies: + '@types/react': 18.0.38 + dev: false + + /@types/react-transition-group@4.4.10: + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + dependencies: + '@types/react': 18.0.38 + dev: false + + /@types/react@18.0.38: + resolution: {integrity: sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/styled-components@5.1.34: + resolution: {integrity: sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==} + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.0.38 + csstype: 3.1.3 + dev: false + + /@types/stylis@4.2.0: + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + dev: true + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: false + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: false + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.0.4): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.0.4): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.56.0 + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.0.4): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.56.0 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.0.4): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.0.4): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) + eslint: 8.56.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@web3-storage/multipart-parser@1.0.0: + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /@zxing/text-encoding@0.9.0: + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + requiresBuild: true + optional: true + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + + /acorn-import-assertions@1.9.0(acorn@8.11.3): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.12.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.12.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true + + /asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + dev: true + + /assert-never@1.2.1: + resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} + dev: true + + /assert@1.5.1: + resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} + dependencies: + object.assign: 4.1.5 + util: 0.10.4 + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axios@1.6.5: + resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + /babel-loader@9.1.3(@babel/core@7.23.7)(webpack@5.90.0): + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.23.7 + find-cache-dir: 4.0.0 + schema-utils: 4.2.0 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /babel-plugin-dynamic-import-node@2.3.3: + resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} + dependencies: + object.assign: 4.1.5 + dev: true + + /babel-plugin-import@1.13.5: + resolution: {integrity: sha512-IkqnoV+ov1hdJVofly9pXRJmeDm9EtROfrc5i6eII0Hix2xMs5FEm8FG3ExMvazbnZBbgHIt6qdO8And6lCloQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + dev: true + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.8 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.7): + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7): + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + core-js-compat: 3.35.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.7): + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.7) + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-styled-components@1.13.3(styled-components@6.1.8): + resolution: {integrity: sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + babel-plugin-syntax-jsx: 6.18.0 + lodash: 4.17.21 + styled-components: 6.1.8(react-dom@18.2.0)(react@18.2.0) + dev: true + + /babel-plugin-styled-components@2.1.4(@babel/core@7.23.7)(styled-components@5.3.11): + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + dev: false + + /babel-plugin-syntax-jsx@6.18.0: + resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} + dev: true + + /babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + dev: true + + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.23.7)(@babel/traverse@7.23.7): + resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} + peerDependencies: + '@babel/core': ^7 + '@babel/traverse': ^7 + peerDependenciesMeta: + '@babel/traverse': + optional: true + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + dev: true + + /babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.2: + resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} + engines: {node: '>= 4'} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001579 + electron-to-chromium: 1.4.643 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer@4.9.2: + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + isarray: 1.0.0 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.2.0 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001579 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: true + + /caniuse-lite@1.0.30001579: + resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + dependencies: + is-regex: 1.1.4 + dev: true + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true + + /clone-deep@0.2.4: + resolution: {integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 0.1.5 + is-plain-object: 2.0.4 + kind-of: 3.2.2 + lazy-cache: 1.0.4 + shallow-clone: 0.1.2 + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + /common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: true + + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + + /constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /core-js-compat@3.35.1: + resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} + dependencies: + browserslist: 4.22.2 + dev: true + + /core-js-pure@3.35.1: + resolution: {integrity: sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==} + requiresBuild: true + dev: true + + /core-js@3.32.2: + resolution: {integrity: sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==} + requiresBuild: true + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6(typescript@5.0.4): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.0.4 + dev: true + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.2 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + /css-declaration-sorter@7.1.1(postcss@8.4.33): + resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.33 + dev: true + + /css-minimizer-webpack-plugin@5.0.1(esbuild@0.17.19)(webpack@5.90.0): + resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + cssnano: 6.0.1(postcss@8.4.33) + esbuild: 0.17.19 + jest-worker: 29.7.0 + postcss: 8.4.33 + schema-utils: 4.2.0 + serialize-javascript: 6.0.2 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + /css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.0.2 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /cssnano-preset-default@6.0.3(postcss@8.4.33): + resolution: {integrity: sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + css-declaration-sorter: 7.1.1(postcss@8.4.33) + cssnano-utils: 4.0.1(postcss@8.4.33) + postcss: 8.4.33 + postcss-calc: 9.0.1(postcss@8.4.33) + postcss-colormin: 6.0.2(postcss@8.4.33) + postcss-convert-values: 6.0.2(postcss@8.4.33) + postcss-discard-comments: 6.0.1(postcss@8.4.33) + postcss-discard-duplicates: 6.0.1(postcss@8.4.33) + postcss-discard-empty: 6.0.1(postcss@8.4.33) + postcss-discard-overridden: 6.0.1(postcss@8.4.33) + postcss-merge-longhand: 6.0.2(postcss@8.4.33) + postcss-merge-rules: 6.0.3(postcss@8.4.33) + postcss-minify-font-values: 6.0.1(postcss@8.4.33) + postcss-minify-gradients: 6.0.1(postcss@8.4.33) + postcss-minify-params: 6.0.2(postcss@8.4.33) + postcss-minify-selectors: 6.0.2(postcss@8.4.33) + postcss-normalize-charset: 6.0.1(postcss@8.4.33) + postcss-normalize-display-values: 6.0.1(postcss@8.4.33) + postcss-normalize-positions: 6.0.1(postcss@8.4.33) + postcss-normalize-repeat-style: 6.0.1(postcss@8.4.33) + postcss-normalize-string: 6.0.1(postcss@8.4.33) + postcss-normalize-timing-functions: 6.0.1(postcss@8.4.33) + postcss-normalize-unicode: 6.0.2(postcss@8.4.33) + postcss-normalize-url: 6.0.1(postcss@8.4.33) + postcss-normalize-whitespace: 6.0.1(postcss@8.4.33) + postcss-ordered-values: 6.0.1(postcss@8.4.33) + postcss-reduce-initial: 6.0.2(postcss@8.4.33) + postcss-reduce-transforms: 6.0.1(postcss@8.4.33) + postcss-svgo: 6.0.2(postcss@8.4.33) + postcss-unique-selectors: 6.0.2(postcss@8.4.33) + dev: true + + /cssnano-utils@4.0.1(postcss@8.4.33): + resolution: {integrity: sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + dev: true + + /cssnano@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 6.0.3(postcss@8.4.33) + lilconfig: 2.1.0 + postcss: 8.4.33 + dev: true + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: false + + /d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + dev: false + + /d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + dependencies: + delaunator: 5.0.1 + dev: false + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + dev: false + + /d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: false + + /d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + dev: false + + /d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + dev: false + + /d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + dev: false + + /d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + dev: false + + /d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + dev: false + + /d3-scale-chromatic@3.0.0: + resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + dev: false + + /d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: false + + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: false + + /d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: false + + /d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /d3@7.8.5: + resolution: {integrity: sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==} + engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.0.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + dev: false + + /data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4(supports-color@5.5.0): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + + /debug@4.3.4(supports-color@9.3.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 9.3.1 + dev: true + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + dev: true + + /delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + dependencies: + robust-predicates: 3.0.2 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + dev: true + + /dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dependencies: + utila: 0.4.0 + dev: true + + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.23.8 + csstype: 3.1.3 + dev: false + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + + /domain-browser@1.2.0: + resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} + engines: {node: '>=0.4', npm: '>=1.2'} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /electron-to-chromium@1.4.643: + resolution: {integrity: sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /enhanced-resolve@5.12.0: + resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.10 + tapable: 2.2.1 + dev: true + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: true + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.2 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.0 + dev: true + + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /eslint-config-prettier@8.10.0(eslint@8.56.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es@3.0.1(eslint@8.56.0): + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.56.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-eslint-comments@3.2.0(eslint@8.56.0): + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.56.0 + ignore: 5.3.0 + dev: true + + /eslint-plugin-filenames@1.3.2(eslint@8.56.0): + resolution: {integrity: sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==} + peerDependencies: + eslint: '*' + dependencies: + eslint: 8.56.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.upperfirst: 4.3.1 + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.0.4) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-node@11.1.0(eslint@8.56.0): + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.56.0 + eslint-plugin-es: 3.0.1(eslint@8.56.0) + eslint-utils: 2.1.0 + ignore: 5.3.0 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.56.0)(prettier@2.8.8): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.56.0 + eslint-config-prettier: 8.10.0(eslint@8.56.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-promise@6.1.1(eslint@8.56.0): + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.56.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.56.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-memoize@2.5.2: + resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} + dev: false + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + dev: true + + /find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in@0.1.8: + resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} + engines: {node: '>=0.10.0'} + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.0.4)(webpack@5.90.0): + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + dependencies: + '@babel/code-frame': 7.23.5 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 8.3.6(typescript@5.0.4) + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.5.4 + tapable: 2.2.1 + typescript: 5.0.4 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.4 + minipass: 4.2.8 + path-scurry: 1.10.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /hast-util-from-dom@5.0.0: + resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} + dependencies: + '@types/hast': 3.0.4 + hastscript: 8.0.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.0 + hast-util-from-html: 2.0.1 + unist-util-remove-position: 5.0.0 + dev: false + + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.1 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /highlight.js@11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + dev: false + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /html-entities@2.4.0: + resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.27.0 + dev: true + + /html-rspack-plugin@5.5.7: + resolution: {integrity: sha512-7dNAURj9XBHWoYg59F8VU6hT7J7w+od4Lr5hc/rrgN6sy6QfqVpoPqW9Qw4IGFOgit8Pul7iQp1yysBSIhOlsg==} + engines: {node: '>=10.13.0'} + dependencies: + lodash: 4.17.21 + tapable: 2.2.1 + dev: true + + /html-url-attributes@3.0.0: + resolution: {integrity: sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==} + dev: false + + /html-webpack-plugin@5.5.3(webpack@5.90.0): + resolution: {integrity: sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + + /htmlparser2@9.0.0: + resolution: {integrity: sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + + /http-compression@1.0.6: + resolution: {integrity: sha512-Yy9VFT/0fJhbpSHmqA34CJKZDXLnHoQUP2wbFXY7duOx3nc9Qf8MVJezaXTP7IirvJ9DmUv/vm7qFNu/RntdWw==} + engines: {node: '>= 4'} + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-proxy-middleware@2.0.6: + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.5 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-styles@5.0.1: + resolution: {integrity: sha512-gQQmIznCETPLEzfg1UH4Cs2oRq+HBPl8quroEUNXT8oybEG7/0lqI3dGgDSRry6B9HcCXw3PVkFFS0FF3CMddg==} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + + /immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 6.2.0 + dev: true + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + + /is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isbot@3.8.0: + resolution: {integrity: sha512-vne1mzQUTR+qsMLeCBL9+/tgnDXRyc2pygLGl/WsgA+EZKIiB5Ehu0CiVTHIIk30zhJ24uGz4M5Ppse37aR0Hg==} + engines: {node: '>=12'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.23.5 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 16.11.68 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 16.11.68 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 16.11.68 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + dev: true + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.1.7 + dev: true + + /katex@0.16.9: + resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@2.0.1: + resolution: {integrity: sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /lazy-cache@0.2.7: + resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} + engines: {node: '>=0.10.0'} + dev: true + + /lazy-cache@1.0.4: + resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /lint-staged@13.1.4: + resolution: {integrity: sha512-pJRmnRA4I4Rcc1k9GZIh9LQJlolCVDHqtJpIgPY7t99XY3uXXmUeDfhRLELYLgUFJPmEsWevTqarex9acSfx2A==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + chalk: 5.2.0 + cli-truncate: 3.1.0 + commander: 10.0.1 + debug: 4.3.4(supports-color@9.3.1) + execa: 7.2.0 + lilconfig: 2.1.0 + listr2: 5.0.8 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.13.1 + pidtree: 0.6.0 + string-argv: 0.3.2 + supports-color: 9.3.1 + yaml: 2.3.4 + transitivePeerDependencies: + - enquirer + dev: true + + /listr2@5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.1 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + dev: true + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: true + + /lowlight@3.1.0: + resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==} + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.9.0 + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.1.0: + resolution: {integrity: sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + dev: false + + /mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.5 + dev: true + + /merge-deep@3.0.3: + resolution: {integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + clone-deep: 0.2.4 + kind-of: 3.2.2 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-math@3.0.0: + resolution: {integrity: sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==} + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.9 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mini-css-extract-plugin@2.7.7(webpack@5.90.0): + resolution: {integrity: sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 4.2.0 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mixin-object@2.0.1: + resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 0.1.8 + is-extendable: 0.1.1 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mobx-react-lite@4.0.6(mobx@6.12.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0rOE0KDMwV9CzsstYC86ZxxrUpKLGBN0/T3WpKZibLnJcukdb9HVL8VKHoDxaBPbInLZ5azPKUod4mXTsi+u+A==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + mobx: 6.12.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /mobx@6.12.0: + resolution: {integrity: sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ==} + dev: false + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: true + + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + + /node-html-parser@6.1.12: + resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} + dependencies: + css-select: 5.1.0 + he: 1.2.0 + dev: true + + /node-libs-browser@2.2.1: + resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} + dependencies: + assert: 1.5.1 + browserify-zlib: 0.2.0 + buffer: 4.9.2 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.12.0 + domain-browser: 1.2.0 + events: 3.3.0 + https-browserify: 1.0.0 + os-browserify: 0.3.0 + path-browserify: 0.0.1 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 2.3.8 + stream-browserify: 2.0.2 + stream-http: 2.8.3 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.0 + url: 0.11.3 + util: 0.11.1 + vm-browserify: 1.1.2 + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + dev: true + + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /path-browserify@0.0.1: + resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + + /pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + dev: true + + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + dev: true + + /postcss-calc@9.0.1(postcss@8.4.33): + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-colormin@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-convert-values@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-custom-properties@13.1.5(postcss@8.4.33): + resolution: {integrity: sha512-98DXk81zTGqMVkGANysMHbGIg3voH383DYo3/+c+Abzay3nao+vM/f4Jgzsakk9S7BDsEw5DiW7sFy5G4W2wLA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/cascade-layer-name-parser': 1.0.7(@csstools/css-parser-algorithms@2.5.0)(@csstools/css-tokenizer@2.2.3) + '@csstools/css-parser-algorithms': 2.5.0(@csstools/css-tokenizer@2.2.3) + '@csstools/css-tokenizer': 2.2.3 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-discard-comments@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-discard-duplicates@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-discard-empty@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-discard-overridden@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-font-variant@5.0.0(postcss@8.4.33): + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-initial@4.0.1(postcss@8.4.33): + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-media-minmax@5.0.0(postcss@8.4.33): + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-merge-longhand@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + stylehacks: 6.0.2(postcss@8.4.33) + dev: true + + /postcss-merge-rules@6.0.3(postcss@8.4.33): + resolution: {integrity: sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.1(postcss@8.4.33) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-minify-font-values@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-gradients@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.1(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-params@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + cssnano-utils: 4.0.1(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-minify-selectors@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-nesting@12.0.1(postcss@8.4.33): + resolution: {integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.4 + dependencies: + '@csstools/selector-specificity': 3.0.1(postcss-selector-parser@6.0.15) + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-normalize-charset@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-normalize-display-values@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-positions@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-repeat-style@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-string@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-timing-functions@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-unicode@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-url@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-normalize-whitespace@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-ordered-values@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + cssnano-utils: 4.0.1(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-page-break@3.0.4(postcss@8.4.33): + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: ^8 + dependencies: + postcss: 8.4.33 + dev: true + + /postcss-reduce-initial@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + caniuse-api: 3.0.0 + postcss: 8.4.33 + dev: true + + /postcss-reduce-transforms@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + dev: true + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-svgo@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + svgo: 3.2.0 + dev: true + + /postcss-unique-selectors@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + dev: true + + /pug-code-gen@3.0.2: + resolution: {integrity: sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==} + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.0.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + dev: true + + /pug-error@2.0.0: + resolution: {integrity: sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==} + dev: true + + /pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.0.0 + pug-walk: 2.0.0 + resolve: 1.22.8 + dev: true + + /pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.0.0 + dev: true + + /pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + dependencies: + pug-error: 2.0.0 + pug-walk: 2.0.0 + dev: true + + /pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + dev: true + + /pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + dependencies: + pug-error: 2.0.0 + token-stream: 1.0.0 + dev: true + + /pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + dev: true + + /pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + dependencies: + pug-error: 2.0.0 + dev: true + + /pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + dev: true + + /pug@3.0.2: + resolution: {integrity: sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==} + dependencies: + pug-code-gen: 3.0.2 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /re-resizable@6.9.11(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /re-resizable@6.9.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==} + peerDependencies: + react: ^16.13.1 || ^17.0.0 || ^18.0.0 + react-dom: ^16.13.1 || ^17.0.0 || ^18.0.0 + dependencies: + fast-memoize: 2.5.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-draggable@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + dependencies: + clsx: 1.2.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + dev: false + + /react-helmet@6.1.0(react@18.2.0): + resolution: {integrity: sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==} + peerDependencies: + react: '>=16.3.0' + dependencies: + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-fast-compare: 3.2.2 + react-side-effect: 2.1.2(react@18.2.0) + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + /react-markdown@9.0.1(@types/react@18.0.38)(react@18.2.0): + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + dependencies: + '@types/hast': 3.0.4 + '@types/react': 18.0.38 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.0 + html-url-attributes: 3.0.0 + mdast-util-to-hast: 13.1.0 + react: 18.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-rnd@10.4.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==} + peerDependencies: + react: '>=16.3.0' + react-dom: '>=16.3.0' + dependencies: + re-resizable: 6.9.6(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-draggable: 4.4.5(react-dom@18.2.0)(react@18.2.0) + tslib: 2.3.1 + dev: false + + /react-router-dom@6.17.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.10.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.17.0(react@18.2.0) + + /react-router@6.17.0(react@18.2.0): + resolution: {integrity: sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.10.0 + react: 18.2.0 + + /react-side-effect@2.1.2(react@18.2.0): + resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==} + peerDependencies: + react: ^16.3.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.23.8 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redux-promise-middleware@6.2.0(redux@4.2.1): + resolution: {integrity: sha512-TEzfMeLX63gju2WqkdFQlQMvUGYzFvJNePIJJsBlbPHs3Txsbc/5Rjhmtha1XdMU6lkeiIlp1Qx7AR3Zo9he9g==} + peerDependencies: + redux: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + redux: 4.2.1 + dev: false + + /redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + dependencies: + '@babel/runtime': 7.23.8 + dev: false + + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.8 + dev: true + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /rehype-highlight@7.0.0: + resolution: {integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==} + dependencies: + '@types/hast': 3.0.4 + hast-util-to-text: 4.0.0 + lowlight: 3.1.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /rehype-katex@7.0.0: + resolution: {integrity: sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==} + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.0 + katex: 0.16.9 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + dev: false + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: false + + /rslog@1.2.0: + resolution: {integrity: sha512-2ZFW7Jtkzt4VkwCFRTE+0lKbzSLSH7U5OM9qZ5YuKk4xVrlIJJZx9Qh/fCyfsk8H+qXbermMc7+18qKJxLQ/bw==} + engines: {node: '>=14.17.6'} + + /rspack-manifest-plugin@5.0.0-alpha0(webpack@5.90.0): + resolution: {integrity: sha512-a84H6P/lK0x3kb0I8Qdiwxrnjt1oNW0j+7kwPMWcODJu8eYFBrTXa1t+14n18Jvg9RKIR6llCH16mYxf2d0s8A==} + engines: {node: '>=14'} + peerDependencies: + webpack: ^5.75.0 + dependencies: + tapable: 2.2.1 + webpack: 5.90.0(esbuild@0.17.19) + webpack-sources: 2.3.1 + dev: true + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.2: + resolution: {integrity: sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /shallow-clone@0.1.2: + resolution: {integrity: sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + kind-of: 2.0.1 + lazy-cache: 0.2.7 + mixin-object: 2.0.1 + dev: true + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: true + + /source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stream-browserify@2.0.2: + resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /stream-http@2.8.3: + resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 2.3.8 + to-arraybuffer: 1.0.1 + xtend: 4.0.2 + dev: true + + /stream-slice@0.1.2: + resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false + + /styled-components@5.3.11(@babel/core@7.23.7)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/traverse': 7.23.7(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.23.7)(styled-components@5.3.11) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.2.0 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + dev: false + + /styled-components@6.1.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + dev: true + + /stylehacks@6.0.2(postcss@8.4.33): + resolution: {integrity: sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.22.2 + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: true + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-color@9.3.1: + resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} + engines: {node: '>=12'} + dev: true + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: true + + /svgo@3.2.0: + resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.0.0 + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser-webpack-plugin@5.3.10(esbuild@0.17.19)(webpack@5.90.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + esbuild: 0.17.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /terser-webpack-plugin@5.3.10(webpack@5.90.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.90.0 + dev: false + + /terser-webpack-plugin@5.3.9(esbuild@0.17.19)(webpack@5.90.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + esbuild: 0.17.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-arraybuffer@1.0.1: + resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + dev: true + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + + /ts-loader@9.4.4(typescript@5.0.4)(webpack@5.90.0): + resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.5 + semver: 7.5.4 + typescript: 5.0.4 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + engines: {node: '>=10.13.0'} + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + tsconfig-paths: 4.2.0 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.3.1: + resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: false + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@5.0.4): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.4 + dev: true + + /tty-browserify@0.0.0: + resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typed-assert@1.0.9: + resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + dev: false + + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + + /upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + dependencies: + tslib: 2.6.2 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + dependencies: + punycode: 1.4.1 + qs: 6.11.2 + dev: true + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: true + + /util@0.11.1: + resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} + dependencies: + inherits: 2.0.3 + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.13 + + /utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + dev: true + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-streams-polyfill@3.3.2: + resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} + engines: {node: '>= 8'} + + /webpack-manifest-plugin@5.0.0(webpack@5.90.0): + resolution: {integrity: sha512-8RQfMAdc5Uw3QbCQ/CBV/AXqOR8mt03B6GJmRbhWopE8GzRfEpn+k0ZuWywxW+5QZsffhmFDY1J6ohqJo+eMuw==} + engines: {node: '>=12.22.0'} + peerDependencies: + webpack: ^5.47.0 + dependencies: + tapable: 2.2.1 + webpack: 5.90.0(esbuild@0.17.19) + webpack-sources: 2.3.1 + dev: true + + /webpack-sources@2.3.1: + resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} + engines: {node: '>=10.13.0'} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.5.3)(webpack@5.90.0): + resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} + engines: {node: '>= 12'} + peerDependencies: + html-webpack-plugin: '>= 5.0.0-beta.1 < 6' + webpack: ^5.12.0 + peerDependenciesMeta: + html-webpack-plugin: + optional: true + dependencies: + html-webpack-plugin: 5.5.3(webpack@5.90.0) + typed-assert: 1.0.9 + webpack: 5.90.0(esbuild@0.17.19) + dev: true + + /webpack@5.90.0: + resolution: {integrity: sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.2 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.90.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: false + + /webpack@5.90.0(esbuild@0.17.19): + resolution: {integrity: sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.2 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.17.19)(webpack@5.90.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + assert-never: 1.2.1 + babel-walk: 3.0.0-canary-5 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + /zod-validation-error@1.3.1(zod@3.22.4): + resolution: {integrity: sha512-cNEXpla+tREtNdAnNKY4xKY1SGOn2yzyuZMu4O0RQylX9apRpUjNcPkEc3uHIAr5Ct7LenjZt6RzjEH6+JsqVQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + zod: ^3.18.0 + dependencies: + zod: 3.22.4 + dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: true + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/frontend/src/.eslintrc.js b/frontend/src/.eslintrc.js new file mode 100644 index 0000000..fafc003 --- /dev/null +++ b/frontend/src/.eslintrc.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line import/no-commonjs +module.exports = { + root: true, + extends: ['@modern-js-app'], + parserOptions: { + tsconfigRootDir: __dirname, + project: ['../tsconfig.json'], + }, +}; diff --git a/frontend/src/apis/agent-select-modify.ts b/frontend/src/apis/agent-select-modify.ts new file mode 100644 index 0000000..927d34c --- /dev/null +++ b/frontend/src/apis/agent-select-modify.ts @@ -0,0 +1,86 @@ +import { api } from '@sttot/api-hooks'; +import { IApiStepTask } from './generate-base-plan'; + +export interface IAgentSelectModifyInitRequest { + goal: string; + stepTask: IApiStepTask; +} + +export interface IAgentSelectModifyAddRequest { + aspects: string[]; +} + +export interface IScoreItem { + reason: string; + score: number; +} + +type IRawAgentSelectModifyInitResponse = Record< + string, + Record +>; + +export const agentSelectModifyInitApi = api< + IAgentSelectModifyInitRequest, + Record> +>( + ({ goal, stepTask }) => ({ + baseURL: 'api', + url: '/agentSelectModify_init', + method: 'POST', + data: { + 'General Goal': goal, + stepTask: { + StepName: stepTask.name, + TaskContent: stepTask.content, + // eslint-disable-next-line @typescript-eslint/naming-convention + InputObject_List: stepTask.inputs, + OutputObject: stepTask.output, + }, + }, + }), + ({ data }: { data: IRawAgentSelectModifyInitResponse }) => + Object.fromEntries( + Object.entries(data).map(([agent, reasons]) => [ + agent, + Object.fromEntries( + Object.entries(reasons).map(([reason, score]) => [ + reason, + { + reason: score.Reason, + score: score.Score, + }, + ]), + ), + ]), + ), +); + +export const agentSelectModifyAddApi = api< + IAgentSelectModifyAddRequest, + Record> +>( + data => ({ + baseURL: 'api', + url: '/agentSelectModify_addAspect', + method: 'POST', + data: { + aspectList: data.aspects, + }, + }), + ({ data }: { data: IRawAgentSelectModifyInitResponse }) => + Object.fromEntries( + Object.entries(data).map(([agent, reasons]) => [ + agent, + Object.fromEntries( + Object.entries(reasons).map(([reason, score]) => [ + reason, + { + reason: score.Reason, + score: score.Score, + }, + ]), + ), + ]), + ), +); diff --git a/frontend/src/apis/execute-plan.ts b/frontend/src/apis/execute-plan.ts new file mode 100644 index 0000000..a5d8105 --- /dev/null +++ b/frontend/src/apis/execute-plan.ts @@ -0,0 +1,144 @@ +import { api } from '@sttot/api-hooks'; +import type { IGeneratedPlan } from './generate-base-plan'; +import { ActionType } from '@/storage/plan'; + +export interface IExecutePlanRequest { + plan: IGeneratedPlan; + stepsToRun: number; + rehearsalLog: IExecuteNode[]; +} + +export enum ExecuteNodeType { + Step = 'step', + Object = 'object', +} + +type IExecuteRawResponse = { + LogNodeType: string; + NodeId: string; + // eslint-disable-next-line @typescript-eslint/naming-convention + InputName_List?: string[] | null; + OutputName?: string; + content?: string; + ActionHistory?: { + ID: string; + ActionType: string; + AgentName: string; + Description: string; + ImportantInput: string[]; + // eslint-disable-next-line @typescript-eslint/naming-convention + Action_Result: string; + }[]; +}; + +export interface IExecuteStepHistoryItem { + id: string; + type: ActionType; + agent: string; + description: string; + inputs: string[]; + result: string; +} + +export interface IExecuteStep { + type: ExecuteNodeType.Step; + id: string; + inputs: string[]; + output: string; + history: IExecuteStepHistoryItem[]; +} + +export interface IExecuteObject { + type: ExecuteNodeType.Object; + id: string; + content: string; +} + +export type IExecuteNode = IExecuteStep | IExecuteObject; + +export const executePlanApi = api( + ({ plan, stepsToRun, rehearsalLog }) => ({ + baseURL: '/api', + url: '/executePlan', + method: 'POST', + timeout: Infinity, + data: { + // eslint-disable-next-line @typescript-eslint/naming-convention + num_StepToRun: Number.isFinite(stepsToRun) + ? Math.max(stepsToRun, 1) + : null, + plan: { + 'Initial Input Object': plan.inputs, + 'General Goal': plan.goal, + 'Collaboration Process': plan.process.map(step => ({ + StepName: step.name, + TaskContent: step.content, + // eslint-disable-next-line @typescript-eslint/naming-convention + InputObject_List: step.inputs, + OutputObject: step.output, + AgentSelection: step.agents, + // eslint-disable-next-line @typescript-eslint/naming-convention + Collaboration_Brief_frontEnd: step.brief, + TaskProcess: step.process.map(action => ({ + ActionType: action.type, + AgentName: action.agent, + Description: action.description, + ID: action.id, + ImportantInput: action.inputs, + })), + })), + }, + RehearsalLog: rehearsalLog.map(h => + h.type === ExecuteNodeType.Object + ? { + LogNodeType: 'object', + NodeId: h.id, + content: h.content, + } + : { + LogNodeType: 'step', + NodeId: h.id, + // eslint-disable-next-line @typescript-eslint/naming-convention + InputName_List: h.inputs, + OutputName: h.output, + chatLog: [], + // eslint-disable-next-line @typescript-eslint/naming-convention + inputObject_Record: [], + ActionHistory: h.history.map(item => ({ + ID: item.id, + ActionType: item.type, + AgentName: item.agent, + Description: item.description, + ImportantInput: item.inputs, + // eslint-disable-next-line @typescript-eslint/naming-convention + Action_Result: item.result, + })), + }, + ), + }, + }), + ({ data }) => + data.map((raw: IExecuteRawResponse) => + raw.LogNodeType === 'step' + ? { + type: ExecuteNodeType.Step, + id: raw.NodeId, + inputs: raw.InputName_List || [], + output: raw.OutputName ?? '', + history: + raw.ActionHistory?.map(item => ({ + id: item.ID, + type: item.ActionType, + agent: item.AgentName, + description: item.Description, + inputs: item.ImportantInput, + result: item.Action_Result, + })) || [], + } + : { + type: ExecuteNodeType.Object, + id: raw.NodeId, + content: raw.content || '', + }, + ), +); diff --git a/frontend/src/apis/fill-agent-selection.ts b/frontend/src/apis/fill-agent-selection.ts new file mode 100644 index 0000000..479f09b --- /dev/null +++ b/frontend/src/apis/fill-agent-selection.ts @@ -0,0 +1,61 @@ +import { api } from '@sttot/api-hooks'; +import { IApiStepTask, vec2Hsl, IRawStepTask } from './generate-base-plan'; + +export interface IFillAgentSelectionRequest { + goal: string; + stepTask: IApiStepTask; + agents: string[]; +} + +export const fillAgentSelectionApi = api< + IFillAgentSelectionRequest, + IApiStepTask +>( + ({ goal, stepTask, agents }) => ({ + baseURL: 'api', + url: '/fill_stepTask_TaskProcess', + method: 'POST', + data: { + 'General Goal': goal, + // eslint-disable-next-line @typescript-eslint/naming-convention + stepTask_lackTaskProcess: { + StepName: stepTask.name, + TaskContent: stepTask.content, + // eslint-disable-next-line @typescript-eslint/naming-convention + InputObject_List: stepTask.inputs, + OutputObject: stepTask.output, + AgentSelection: agents, + }, + }, + }), + ({ data }: { data: IRawStepTask }) => ({ + name: data.StepName ?? '', + content: data.TaskContent ?? '', + inputs: data.InputObject_List ?? [], + output: data.OutputObject ?? '', + agents: data.AgentSelection ?? [], + brief: { + template: data.Collaboration_Brief_FrontEnd?.template ?? '', + data: Object.fromEntries( + Object.entries(data.Collaboration_Brief_FrontEnd?.data ?? {}).map( + ([key, value]) => [ + key, + { + text: value.text, + style: { + background: vec2Hsl(value.color), + }, + }, + ], + ), + ), + }, + process: data.TaskProcess.map(process => ({ + id: process.ID, + type: process.ActionType, + agent: process.AgentName, + description: process.Description, + inputs: process.ImportantInput, + })), + }), +); diff --git a/frontend/src/apis/fill-step-task.ts b/frontend/src/apis/fill-step-task.ts new file mode 100644 index 0000000..413fbe4 --- /dev/null +++ b/frontend/src/apis/fill-step-task.ts @@ -0,0 +1,55 @@ +import { api } from '@sttot/api-hooks'; +import { IApiStepTask, IRawStepTask, vec2Hsl } from './generate-base-plan'; + +export interface IFillStepTaskRequest { + goal: string; + stepTask: IApiStepTask; +} + +export const fillStepTaskApi = api( + ({ goal, stepTask }) => ({ + baseURL: 'api', + url: '/fill_stepTask', + method: 'POST', + data: { + 'General Goal': goal, + stepTask: { + StepName: stepTask.name, + TaskContent: stepTask.content, + // eslint-disable-next-line @typescript-eslint/naming-convention + InputObject_List: stepTask.inputs, + OutputObject: stepTask.output, + }, + }, + }), + ({ data }: { data: IRawStepTask }) => ({ + name: data.StepName ?? '', + content: data.TaskContent ?? '', + inputs: data.InputObject_List ?? [], + output: data.OutputObject ?? '', + agents: data.AgentSelection ?? [], + brief: { + template: data.Collaboration_Brief_FrontEnd?.template ?? '', + data: Object.fromEntries( + Object.entries(data.Collaboration_Brief_FrontEnd?.data ?? {}).map( + ([key, value]) => [ + key, + { + text: value.text, + style: { + background: vec2Hsl(value.color), + }, + }, + ], + ), + ), + }, + process: data.TaskProcess.map(process => ({ + id: process.ID, + type: process.ActionType, + agent: process.AgentName, + description: process.Description, + inputs: process.ImportantInput, + })), + }), +); diff --git a/frontend/src/apis/generate-base-plan.ts b/frontend/src/apis/generate-base-plan.ts new file mode 100644 index 0000000..b5326d7 --- /dev/null +++ b/frontend/src/apis/generate-base-plan.ts @@ -0,0 +1,119 @@ +import { api } from '@sttot/api-hooks'; +import { SxProps } from '@mui/material'; + +export const vec2Hsl = (vec: HslColorVector): string => + `hsl(${vec[0]},${vec[1]}%,${vec[2]}%)`; + +export interface IPlanGeneratingRequest { + goal: string; + inputs: string[]; +} + +export interface IRichText { + template: string; + data: Record; +} + +export interface IApiAgentAction { + id: string; + type: string; + agent: string; + description: string; + inputs: string[]; +} + +export interface IApiStepTask { + name: string; + content: string; + inputs: string[]; + output: string; + agents: string[]; + brief: IRichText; + process: IApiAgentAction[]; +} + +export interface IGeneratedPlan { + inputs: string[]; + goal: string; + process: IApiStepTask[]; +} + +type HslColorVector = [number, number, number]; + +export interface IRawStepTask { + StepName?: string; + TaskContent?: string; + // eslint-disable-next-line @typescript-eslint/naming-convention + InputObject_List?: string[]; + OutputObject?: string; + AgentSelection?: string[]; + // eslint-disable-next-line @typescript-eslint/naming-convention + Collaboration_Brief_FrontEnd: { + template: string; + data: Record; + }; + TaskProcess: { + ActionType: string; + AgentName: string; + Description: string; + ID: string; + ImportantInput: string[]; + }[]; +} + +export interface IRawPlanResponse { + 'Initial Input Object'?: string[] | string; + 'General Goal'?: string; + 'Collaboration Process'?: IRawStepTask[]; +} + +export const genBasePlanApi = api( + data => ({ + baseURL: '/api', + url: '/generate_basePlan', + method: 'POST', + data: { + 'General Goal': data.goal, + 'Initial Input Object': data.inputs, + }, + timeout: Infinity, + }), + ({ data }: { data: IRawPlanResponse }) => ({ + inputs: + (typeof data['Initial Input Object'] === 'string' + ? [data['Initial Input Object']] + : data['Initial Input Object']) || [], + goal: data['General Goal'] || '', + process: + data['Collaboration Process']?.map(step => ({ + name: step.StepName || '', + content: step.TaskContent || '', + inputs: step.InputObject_List || [], + output: step.OutputObject || '', + agents: step.AgentSelection || [], + brief: { + template: step.Collaboration_Brief_FrontEnd.template, + data: Object.fromEntries( + Object.entries(step.Collaboration_Brief_FrontEnd.data).map( + ([key, value]) => [ + key, + { + text: value.text, + style: { + background: vec2Hsl(value.color), + }, + }, + ], + ), + ), + }, + process: step.TaskProcess.map(process => ({ + id: process.ID, + type: process.ActionType, + agent: process.AgentName, + description: process.Description, + inputs: process.ImportantInput, + })), + })) ?? [], + }), +); diff --git a/frontend/src/apis/get-agents.ts b/frontend/src/apis/get-agents.ts new file mode 100644 index 0000000..8cdfc16 --- /dev/null +++ b/frontend/src/apis/get-agents.ts @@ -0,0 +1,33 @@ +import { api } from '@sttot/api-hooks'; +import { IconName, IconMap } from '@/components/AgentIcon'; + +interface IRawAgent { + Name: string; + Profile: string; + Icon: string; +} + +export interface IAgent { + name: string; + profile: string; + icon: IconName; +} + +export const getAgentsApi = api( + () => ({ + baseURL: '/api', + url: '/getAgent', + method: 'POST', + timeout: Infinity, + }), + ({ data }) => { + const data_ = data as IRawAgent[]; + return data_.map(agent => ({ + name: agent.Name, + profile: agent.Profile, + icon: IconMap[agent.Icon.replace(/\.png$/, '')], + })); + }, +); + +export const useAgents = getAgentsApi.createMemoHook(); diff --git a/frontend/src/apis/new-action-branch.ts b/frontend/src/apis/new-action-branch.ts new file mode 100644 index 0000000..a74feee --- /dev/null +++ b/frontend/src/apis/new-action-branch.ts @@ -0,0 +1,66 @@ +import { api } from '@sttot/api-hooks'; +import { IApiStepTask, IApiAgentAction } from './generate-base-plan'; + +export interface INewActionBranchRequest { + goal: string; + batch?: number; + requirement: string; + stepTask: IApiStepTask; + base: IApiAgentAction[]; + existing: IApiAgentAction[]; +} + +export type INewActionBranchResponse = IApiAgentAction[][]; + +export const newActionBranchApi = api< + INewActionBranchRequest, + INewActionBranchResponse +>( + data => ({ + baseURL: '/api', + url: '/branch_TaskProcess', + method: 'POST', + timeout: Infinity, + data: { + // eslint-disable-next-line @typescript-eslint/naming-convention + branch_Number: data.batch ?? 1, + // eslint-disable-next-line @typescript-eslint/naming-convention + Modification_Requirement: data.requirement, + // eslint-disable-next-line @typescript-eslint/naming-convention + Baseline_Completion: data.base.map(s => ({ + ID: s.id, + ActionType: s.type, + AgentName: s.agent, + Description: s.description, + ImportantInput: s.inputs, + })), + // eslint-disable-next-line @typescript-eslint/naming-convention + Existing_Steps: data.existing.map(s => ({ + ID: s.id, + ActionType: s.type, + AgentName: s.agent, + Description: s.description, + ImportantInput: s.inputs, + })), + 'General Goal': data.goal, + stepTaskExisting: { + StepName: data.stepTask.name, + TaskContent: data.stepTask.content, + // eslint-disable-next-line @typescript-eslint/naming-convention + InputObject_List: data.stepTask.inputs, + OutputObject: data.stepTask.output, + AgentSelection: data.stepTask.agents, + }, + }, + }), + ({ data }) => + data.map((s: any) => + s.map((s: any) => ({ + id: s.ID, + type: s.ActionType, + agent: s.AgentName, + description: s.Description, + inputs: s.ImportantInput, + })), + ), +); diff --git a/frontend/src/apis/new-plan-branch.ts b/frontend/src/apis/new-plan-branch.ts new file mode 100644 index 0000000..79919c1 --- /dev/null +++ b/frontend/src/apis/new-plan-branch.ts @@ -0,0 +1,57 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { api } from '@sttot/api-hooks'; +import { IApiStepTask } from './generate-base-plan'; + +export interface INewPlanBranchRequest { + goal: string; + inputs: string[]; + batch?: number; + requirement: string; + base: IApiStepTask[]; + existing: IApiStepTask[]; +} + +export type INewPlanBranchResponse = IApiStepTask[][]; + +export const newPlanBranchApi = api< + INewPlanBranchRequest, + INewPlanBranchResponse +>( + data => ({ + baseURL: '/api', + url: '/branch_PlanOutline', + method: 'POST', + timeout: Infinity, + data: { + branch_Number: data.batch ?? 1, + Modification_Requirement: data.requirement, + Baseline_Completion: data.base.map(s => ({ + StepName: s.name, + TaskContent: s.content, + InputObject_List: s.inputs, + OutputObject: s.output, + })), + Existing_Steps: data.existing.map(s => ({ + StepName: s.name, + TaskContent: s.content, + InputObject_List: s.inputs, + OutputObject: s.output, + })), + 'General Goal': data.goal, + 'Initial Input Object': data.inputs, + }, + }), + ({ data }) => + data.map((s: any) => + s.map((s: any) => ({ + name: s.StepName, + content: s.TaskContent, + inputs: s.InputObject_List, + output: s.OutputObject, + agents: [], + brief: { template: '', data: {} }, + process: [], + })), + ), +); +/* eslint-enable @typescript-eslint/naming-convention */ diff --git a/frontend/src/apis/set-agents.ts b/frontend/src/apis/set-agents.ts new file mode 100644 index 0000000..1e98ae3 --- /dev/null +++ b/frontend/src/apis/set-agents.ts @@ -0,0 +1,32 @@ +import { api } from '@sttot/api-hooks'; +import { IconName } from '@/components/AgentIcon'; + +export interface IAgent { + name: string; + profile: string; + icon: IconName; +} + +export const setAgentsApi = api( + agents => ({ + baseURL: '/api', + url: '/setAgents', + method: 'POST', + data: agents.map(agent => ({ + Name: agent.name, + Profile: agent.profile, + })), + timeout: Infinity, + }), + ({ data }) => { + // const data_ = data as IRawAgent[]; + // return data_.map(agent => ({ + // name: agent.Name, + // profile: agent.Profile, + // icon: IconMap[agent.Icon.replace(/\.png$/, '')], + // })); + return data; + }, +); + +export const setagents = setAgentsApi.createMemoHook(); diff --git a/frontend/src/components/AgentAssignment/fakeAgentAssignment.ts b/frontend/src/components/AgentAssignment/fakeAgentAssignment.ts new file mode 100644 index 0000000..90b924b --- /dev/null +++ b/frontend/src/components/AgentAssignment/fakeAgentAssignment.ts @@ -0,0 +1,54 @@ +const agentList = [ + 'Alice', + 'Morgan', + 'Riley', + 'Charlie', + 'Bob', + 'Jordan', + 'Sam', + 'Quinn', + 'Parker', + 'Skyler', + 'Reagan', + 'Pat', + 'Leslie', + 'Dana', + 'Casey', + 'Terry', + 'Shawn', + 'Kim', + 'Alexis', + 'Taylor', + 'Bailey', + 'Drew', + 'Cameron', + 'Sage', + 'Peyton', +]; +const aspectList = [ + 'Creative Thinking', + 'Emotional Intelligence', + 'Philosophical Reasoning', +]; +export const fakeAgentScoreMap = new Map( + aspectList.map(aspect => [ + aspect, + new Map( + agentList.map(agent => [ + agent, + { + Reason: `reason for ${agent} in ${aspect}`, + Score: Math.floor(Math.random() * 5) + 1, + }, + ]), + ), + ]), +); + +export const fakeAgentSelections = new Map([ + ['1', { agents: ['Alice', 'Morgan'] }], + ['2', { agents: ['Alice', 'Morgan', 'Riley'] }], + ['3', { agents: ['Alice', 'Bob', 'Riley'] }], +]); + +export const fakeCurrentAgentSelection = '1'; diff --git a/frontend/src/components/AgentAssignment/index.tsx b/frontend/src/components/AgentAssignment/index.tsx new file mode 100644 index 0000000..f71c8d1 --- /dev/null +++ b/frontend/src/components/AgentAssignment/index.tsx @@ -0,0 +1,561 @@ +/* eslint-disable max-lines */ + +import React, { useState, useEffect } from 'react'; +import { observer } from 'mobx-react-lite'; +import { CircularProgress, SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; +import { styled } from '@mui/material/styles'; +import Paper from '@mui/material/Paper'; +import InputBase from '@mui/material/InputBase'; +import IconButton from '@mui/material/IconButton'; +// import SendIcon from '@mui/icons-material/Send'; +import _ from 'lodash'; +// import { autorun } from 'mobx'; +// import { +// fakeAgentScoreMap, +// fakeAgentSelections, +// fakeCurrentAgentSelection, +// } from './data/fakeAgentAssignment'; +import CheckIcon from '@/icons/checkIcon'; +import AgentIcon from '@/components/AgentIcon'; +import { globalStorage } from '@/storage'; +import SendIcon from '@/icons/sendIcon'; + +const HtmlTooltip = styled(({ className, ...props }: TooltipProps) => ( + +))(({ theme }) => ({ + [`& .${tooltipClasses.tooltip}`]: { + backgroundColor: '#e7e7e7', + color: 'rgba(0, 0, 0, 0.87)', + width: 'fit-content', + fontSize: theme.typography.pxToRem(12), + border: '1px solid #dadde9', + }, +})); +const getHeatColor = (value: number) => { + return `rgba(74, 156, 158,${value / 5})`; +}; +const AgentScoreCell: React.FC<{ + data: { score: number; reason: string }; +}> = ({ data }) => { + return ( + + Score Reason: + {data.reason} + + } + followCursor + placement="right-start" + > + + {data.score} + + + ); +}; + +const AspectCell: React.FC<{ + key?: string; + aspect?: string; + style?: SxProps; + isSelected?: boolean; + handleSelected?: (aspect: string) => void; +}> = ({ key, aspect, style, isSelected, handleSelected }) => { + const mystyle: SxProps = { + width: '150px', + height: '35px', + position: 'sticky', // 使得这个Box成为sticky元素 + right: -1, // 0距离左侧,这将确保它卡在左侧 + backgroundColor: '#ffffff', // 防止滚动时格子被内容覆盖 + zIndex: 1, // 确保它在其他内容上方 + display: 'flex', + alignItems: 'center', + paddingLeft: '8px', + fontSize: '14px', + lineHeight: '1', + borderBottom: '2px solid #ffffff', + ...style, + }; + if (!aspect) { + return ; + } + return ( + { + if (handleSelected) { + handleSelected(aspect); + } + }} + > + {aspect || ''} + + ); +}; + +const EmotionInput: React.FC<{ + inputCallback: (arg0: string) => void; +}> = ({ inputCallback }) => { + const [inputValue, setInputValue] = useState(''); + const inputRef = React.useRef(); + + const handleInputChange = (event: any) => { + setInputValue(event.target.value); + }; + + const handleButtonClick = () => { + inputCallback(inputValue); + setInputValue(''); + }; + return ( + + + + + + + ); +}; +const findSameSelectionId = ( + a: Record< + string, + { + id: string; + agents: string[]; + } + >, + b: Set, +) => { + const sortedB = Array.from(b).slice().sort(); // 对 b 进行排序 + const bString = sortedB.join(','); + + const akeys = Object.keys(a); + for (const akey of akeys) { + const sortedA = a[akey].agents.slice().sort(); // 对 a 中的每个数组进行排序 + if (sortedA.join(',') === bString) { + return akey; // 找到相同数组则返回索引 + } + } + return undefined; // 未找到相同数组 +}; +interface IPlanModification { + style?: SxProps; +} +export default observer(({ style = {} }: IPlanModification) => { + // console.log(prop); + const { + agentMap, + renderingAgentSelections, + api: { agentsReady }, + } = globalStorage; + + // autorun(() => { + // console.log(renderingAgentSelections); + // }); + + const [agentSelections, setAgentSelections] = React.useState< + Record< + string, + { + id: string; + agents: string[]; + } + > + >({}); + const [currentAgentSelection, setCurrentSelection] = React.useState< + string | undefined + >(); + const [heatdata, setHeatdata] = React.useState< + Record< + string, + Record< + string, + { + score: number; + reason: string; + } + > + > + >({}); + + const [aspectSelectedSet, setAspectSelectedSet] = React.useState( + new Set(), + ); + + useEffect(() => { + if (renderingAgentSelections.current) { + setAgentSelections(renderingAgentSelections.selections); + setHeatdata(renderingAgentSelections.heatdata); + setCurrentSelection(renderingAgentSelections.current); + setAgentSelectedSet( + new Set( + renderingAgentSelections.selections[ + renderingAgentSelections.current + ].agents, + ), + ); + } + }, [renderingAgentSelections]); + + const handleAspectSelected = (aspect: string) => { + const newSet = new Set(aspectSelectedSet); + if (newSet.has(aspect)) { + newSet.delete(aspect); + } else { + newSet.add(aspect); + } + setAspectSelectedSet(newSet); + }; + const [agentSelectedSet, setAgentSelectedSet] = React.useState( + new Set(), + ); + const handleAgentSelected = (agent: string) => { + const newSet = new Set(agentSelectedSet); + if (newSet.has(agent)) { + newSet.delete(agent); + } else { + newSet.add(agent); + } + setAgentSelectedSet(newSet); + }; + + const [agentKeyList, setAgentKeyList] = useState([]); + + useEffect(() => { + // 计算平均分的函数 + function calculateAverageScore(agent: string) { + const aspects = aspectSelectedSet.size + ? Array.from(aspectSelectedSet) + : Object.keys(heatdata); + const meanScore = _.mean( + aspects.map(aspect => heatdata[aspect]?.[agent]?.score ?? 0), + ); + + return meanScore; + } + + // 对agentMap.keys()进行排序 + const newAgentKeyList = Array.from(agentMap.keys()).sort((a, b) => { + const isSelectedA = agentSelectedSet.has(a); + const isSelectedB = agentSelectedSet.has(b); + + if (isSelectedA && !isSelectedB) { + return -1; + } else if (!isSelectedA && isSelectedB) { + return 1; + } else { + const averageScoreA = calculateAverageScore(a); + const averageScoreB = calculateAverageScore(b); + + // 降序排序(平均分高的在前) + return averageScoreB - averageScoreA; + } + }); + + setAgentKeyList(newAgentKeyList); + }, [agentMap, heatdata, aspectSelectedSet, agentSelectedSet]); + + if (!agentsReady) { + return <>; + } + + return ( + + {globalStorage.api.agentAspectScoresGenerating && ( + + + + )} + + {/* assignments */} + + Assignment + + {Object.keys(agentSelections).map(selectionId => ( + { + if (selectionId === currentAgentSelection) { + return '2px solid #508a87'; + } + return '2px solid #afafaf'; + })(), + borderRadius: '10px', + margin: '4px 0px', + padding: '4px 0px 4px 0px', + backgroundColor: '#f6f6f6', + cursor: 'pointer', + display: 'flex', + justifyContent: 'center', // 添加这一行 + alignItems: 'center', // 添加这一行 + flexWrap: 'wrap', + }} + onClick={() => { + globalStorage.setCurrentAgentSelection(selectionId); + }} + > + {agentSelections[selectionId].agents.map(agentName => ( + + ))} + + ))} + + + {/* comparison */} + + Comparison + + + + {agentSelectedSet.size > 0 && ( + +
{ + const findSelectionId = findSameSelectionId( + agentSelections, + agentSelectedSet, + ); + if (findSelectionId) { + globalStorage.setCurrentAgentSelection(findSelectionId); + } else { + globalStorage.addAgentSelection( + Array.from(agentSelectedSet), + ); + } + }} + > + +
+
+ )} + + {agentKeyList.map((agentKey, agentIndex) => ( + + { + handleAgentSelected(agentKey); + }} + style={{ + display: 'grid', + placeItems: 'center', + gridColumn: `${agentIndex + 1} / ${agentIndex + 2}`, + gridRow: '1 / 2', + height: '100%', + width: '100%', + padding: '0px 0px', + cursor: 'pointer', + }} + > + + + {Object.keys(heatdata).map(aspect => { + return ( + + ); + })} + + ))} + + + {Object.keys(heatdata).map(aspect => ( + + ))} +
+
+ + { + globalStorage.addAgentSelectionAspects(arg0); + }} + /> + +
+
+
+ ); + // return hhh; +}); +/* eslint-enable max-lines */ diff --git a/frontend/src/components/AgentBoard/AgentCard.tsx b/frontend/src/components/AgentBoard/AgentCard.tsx new file mode 100644 index 0000000..913afe0 --- /dev/null +++ b/frontend/src/components/AgentBoard/AgentCard.tsx @@ -0,0 +1,165 @@ +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import DutyItem from './DutyItem'; +import AgentIcon from '@/components/AgentIcon'; +import { IAgentCard, globalStorage } from '@/storage'; +import ChangeAgentIcon from '@/icons/ChangeAgentIcon'; + +export interface IAgentCardProps { + agent: IAgentCard; + style?: SxProps; +} + +export default observer(({ agent, style = {} }: IAgentCardProps) => ( + + + 0 ? '4px' : undefined, + }} + > + + + {agent.name} + + + {agent.profile} + + + + + + + {agent.actions.length > 0 ? ( + + + Current Duty: + + + {agent.actions.map((action, index) => ( + + ))} + + + ) : ( + <> + )} + + {agent.lastOfUsed ? ( + (globalStorage.agentAssigmentWindow = true)} + > + + + {globalStorage.focusingStepTask?.agentSelectionIds?.length ?? 0} + + + ) : ( + <> + )} + +)); diff --git a/frontend/src/components/AgentBoard/DutyItem.tsx b/frontend/src/components/AgentBoard/DutyItem.tsx new file mode 100644 index 0000000..8117920 --- /dev/null +++ b/frontend/src/components/AgentBoard/DutyItem.tsx @@ -0,0 +1,123 @@ +import React from 'react'; +import { Divider, SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; +import UnfoldLessIcon from '@mui/icons-material/UnfoldLess'; +import { IAgentAction, globalStorage } from '@/storage'; + +export interface IDutyItem { + action: IAgentAction; + style?: SxProps; +} + +export default React.memo(({ action, style = {} }) => { + const [expand, setExpand] = React.useState(false); + const _style = { + ...action.style, + ...style, + }; + React.useEffect(() => { + globalStorage.renderLines({ + repeat: 3, + delay: 0, + interval: 20, + }); + }, [expand]); + if (!expand) { + return ( + + {action.type} + setExpand(true)} + sx={{ + cursor: 'pointer', + userSelect: 'none', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#0002', + borderRadius: '8px', + marginLeft: '8px', + padding: '0 4px', + '&:hover': { + background: '#0003', + }, + }} + > + + + + ); + } + return ( + + + {action.type} + + + + {action.description} + + setExpand(false)} + sx={{ + position: 'absolute', + right: '6px', + bottom: '6px', + cursor: 'pointer', + userSelect: 'none', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#0002', + borderRadius: '12px', + marginLeft: '4px', + padding: '0 4px', + '&:hover': { + background: '#0003', + }, + }} + > + + + + ); +}); diff --git a/frontend/src/components/AgentBoard/index.tsx b/frontend/src/components/AgentBoard/index.tsx new file mode 100644 index 0000000..7da6db3 --- /dev/null +++ b/frontend/src/components/AgentBoard/index.tsx @@ -0,0 +1,163 @@ +import React from 'react'; +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import IconButton from '@mui/material/IconButton'; +import PersonAddAlt1Icon from '@mui/icons-material/PersonAddAlt1'; +import AgentCard from './AgentCard'; +import { globalStorage } from '@/storage'; +import { IconMap } from '@/components/AgentIcon'; +import LoadingMask from '@/components/LoadingMask'; +import Title from '@/components/Title'; + +export interface IAgentBoardProps { + style?: SxProps; + onAddAgent?: () => void; +} + +export default observer(({ style = {} }: IAgentBoardProps) => { + const { + agentCards, + api: { fetchingAgents }, + } = globalStorage; + const onFileChange = React.useCallback( + (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + const reader = new FileReader(); + reader.onload = e => { + if (!e.target?.result) { + return; + } + try { + const json = JSON.parse(e.target.result?.toString?.() ?? '{}'); + // 检查json是否满足{Name:string,Icon:string,Profile:string}[] + if (Array.isArray(json)) { + const isValid = json.every( + item => + typeof item.Name === 'string' && + typeof item.Icon === 'string' && + typeof item.Profile === 'string', + ); + if (isValid) { + globalStorage.setAgents( + json.map(agent => ({ + name: agent.Name, + icon: IconMap[agent.Icon.replace(/\.png$/, '')], + profile: agent.Profile, + })), + ); + } else { + console.error('Invalid JSON format'); + } + } else { + console.error('JSON is not an array'); + } + } catch (e) { + console.error(e); + } + }; + reader.readAsText(file); + event.target.value = ''; + event.target.files = null; + } + }, + [], + ); + + return ( + + input': { display: 'none' }, + }} + > + + <Box + sx={{ + flexGrow: 1, + display: 'flex', + alignItems: 'center', + justifyContent: 'end', + }} + > + <IconButton + size="small" + component="label" + disabled={fetchingAgents} + sx={{ + color: 'primary.main', + '&:hover': { + color: 'primary.dark', + }, + }} + > + <PersonAddAlt1Icon /> + <input + type="file" + accept=".json" + onChange={onFileChange} + style={{ + clip: 'rect(0 0 0 0)', + clipPath: 'inset(50%)', + height: 1, + overflow: 'hidden', + position: 'absolute', + bottom: 0, + left: 0, + whiteSpace: 'nowrap', + width: 1, + }} + /> + </IconButton> + </Box> + </Box> + <Stack + spacing={1} + sx={{ + position: 'relative', + padding: '6px 12px', + // paddingBottom: '44px', + borderRadius: '10px', + height: 0, + flexGrow: 1, + overflowY: 'auto', + }} + onScroll={() => globalStorage.renderLines({ delay: 0, repeat: 2 })} + > + {agentCards.map(agent => { + return <AgentCard key={agent.name} agent={agent} />; + })} + {fetchingAgents ? ( + <LoadingMask + style={{ + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }} + /> + ) : ( + <></> + )} + </Stack> + </Box> + ); +}); diff --git a/frontend/src/components/AgentHiring/AgentCart/HiringCard.tsx b/frontend/src/components/AgentHiring/AgentCart/HiringCard.tsx new file mode 100644 index 0000000..95a6638 --- /dev/null +++ b/frontend/src/components/AgentHiring/AgentCart/HiringCard.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import AgentIcon, { IAgentIconProps } from '@/components/AgentIcon'; + +export interface IHiringCardProps { + icon: IAgentIconProps['name']; + name: string; + profile: string; + style?: SxProps; +} + +export default React.memo<IHiringCardProps>( + ({ icon, name, profile, style = {} }) => ( + <Box + sx={{ + borderRadius: '6px', + display: 'flex', + backgroundColor: '#BBB', + padding: '8px 4px', + ...style, + }} + > + <AgentIcon + name={icon} + style={{ + flexGrow: 0, + width: '40px', + height: 'auto', + marginRight: '6px', + }} + /> + <Box sx={{ flexGrow: 1, width: 0, height: '100%', fontSize: '14px' }}> + <strong>{name}</strong>: {profile} + </Box> + </Box> + ), +); diff --git a/frontend/src/components/AgentHiring/AgentCart/index.tsx b/frontend/src/components/AgentHiring/AgentCart/index.tsx new file mode 100644 index 0000000..e0c02dd --- /dev/null +++ b/frontend/src/components/AgentHiring/AgentCart/index.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import IconButton from '@mui/material/IconButton'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import HiringCard from './HiringCard'; +import { globalStorage } from '@/storage'; +import LoadingMask from '@/components/LoadingMask'; + +export interface IAgentCartProps { + style?: SxProps; +} + +export default React.memo<IAgentCartProps>(() => { + // const { agents, refreshAgents, refresingAgents } = + // React.useContext(GlobalContext); + // return ( + // <> + // <Box + // sx={{ + // width: '100%', + // opacity: 0.5, + // fontWeight: 600, + // fontSize: '18px', + // userSelect: 'none', + // padding: '2px 6px', + // }} + // > + // Agent Cart + // </Box> + // {refresingAgents ? ( + // <LoadingMask + // style={{ + // position: 'absolute', + // top: 0, + // left: 0, + // right: 0, + // bottom: 0, + // }} + // /> + // ) : ( + // <Stack + // spacing={1} + // sx={{ + // position: 'relative', + // padding: '6px', + // paddingBottom: '44px', + // background: '#CCC', + // borderRadius: '10px', + // }} + // > + // {agents.map(agent => ( + // <HiringCard + // key={agent.name} + // icon={agent.icon} + // name={agent.name} + // profile={agent.profile} + // /> + // ))} + // <IconButton + // aria-label="刷新" + // onClick={refreshAgents} + // disabled={refresingAgents} + // sx={{ position: 'absolute', right: '36px', bottom: '2px' }} + // > + // <RefreshIcon /> + // </IconButton> + // <IconButton + // aria-label="提交" + // disabled={refresingAgents} + // sx={{ position: 'absolute', right: '6px', bottom: '2px' }} + // > + // <CheckCircleOutlineIcon /> + // </IconButton> + // </Stack> + // )} + // </> + // ); + return <></>; +}); diff --git a/frontend/src/components/AgentHiring/AgentRepo/index.tsx b/frontend/src/components/AgentHiring/AgentRepo/index.tsx new file mode 100644 index 0000000..2c4e6dd --- /dev/null +++ b/frontend/src/components/AgentHiring/AgentRepo/index.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import SwapVertIcon from '@mui/icons-material/SwapVert'; + +export interface IAgentRepoProps { + style?: SxProps; +} + +const REPO_COLORS: string[] = [ + 'rgb(172,172,172)', + 'rgb(165,184,182)', + 'rgb(159,195,192)', + 'rgb(153,206,202)', + 'rgb(107,204,198)', +]; + +export default React.memo<IAgentRepoProps>(() => { + const repos = React.useMemo( + () => + Array(30) + .fill(0) + .map((_, index) => ( + <Box + key={index} + sx={{ + width: '100%', + height: '100%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }} + > + <Box + sx={{ + width: '36px', + height: '36px', + borderRadius: '50%', + background: + REPO_COLORS[Math.floor(Math.random() * REPO_COLORS.length)], + cursor: 'pointer', + transition: 'all 0.3s', + filter: 'contrast(1.0)', + '&:hover': { + filter: 'contrast(1.3)', + }, + }} + /> + </Box> + )), + [], + ); + return ( + <> + <Box + sx={{ + width: '100%', + opacity: 0.5, + fontWeight: 600, + fontSize: '18px', + userSelect: 'none', + padding: '2px 6px', + }} + > + Agent Repo + </Box> + <Box + sx={{ + position: 'relative', + display: 'grid', + gridTemplateColumns: 'repeat(auto-fill, minmax(40px, 1fr))', + gap: '6px', + padding: '16px 10px', + background: '#CCC', + borderRadius: '10px', + }} + > + {repos} + <IconButton + aria-label="提交" + sx={{ position: 'absolute', right: '6px', bottom: '2px' }} + > + <SwapVertIcon /> + </IconButton> + </Box> + </> + ); +}); diff --git a/frontend/src/components/AgentHiring/HireRequirement/index.tsx b/frontend/src/components/AgentHiring/HireRequirement/index.tsx new file mode 100644 index 0000000..f67915d --- /dev/null +++ b/frontend/src/components/AgentHiring/HireRequirement/index.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import FormControl from '@mui/material/FormControl'; +import FilledInput from '@mui/material/FilledInput'; +import CampaignIcon from '@mui/icons-material/Campaign'; + +export interface IHireRequirementProps { + style?: SxProps; + valueRef?: React.MutableRefObject<string>; + onSubmit?: (value: string) => void; + onChange?: (value: string) => void; +} + +export default React.memo<IHireRequirementProps>( + ({ style = {}, valueRef, onSubmit, onChange }) => { + const [value, setValue] = React.useState(''); + const handleChange = React.useCallback( + (event: React.ChangeEvent<HTMLInputElement>) => { + setValue(event.target.value); + onChange?.(event.target.value); + }, + [onChange], + ); + const handleSubmit = React.useCallback(() => { + onSubmit?.(value); + }, [onSubmit, value]); + React.useEffect(() => { + if (valueRef) { + valueRef.current = value; + } + }, [valueRef, value]); + return ( + <FormControl + sx={{ + width: '100%', + position: 'relative', + ...style, + }} + > + <Box + sx={{ + width: '100%', + opacity: 0.5, + fontWeight: 600, + fontSize: '18px', + userSelect: 'none', + padding: '2px 6px', + }} + > + Hire Requirement + </Box> + <FilledInput + placeholder="请输入……" + fullWidth + multiline + rows={4} + value={value} + onChange={handleChange} + size="small" + sx={{ + fontSize: '14px', + paddingTop: '10px', + paddingBottom: '10px', + borderRadius: '10px', + borderBottom: 'none !important', + '&::before': { + borderBottom: 'none !important', + }, + }} + /> + <IconButton + disabled={!value} + aria-label="提交" + sx={{ position: 'absolute', right: '6px', bottom: '2px' }} + onClick={handleSubmit} + > + <CampaignIcon /> + </IconButton> + </FormControl> + ); + }, +); diff --git a/frontend/src/components/AgentHiring/index.tsx b/frontend/src/components/AgentHiring/index.tsx new file mode 100644 index 0000000..0d7a351 --- /dev/null +++ b/frontend/src/components/AgentHiring/index.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import HireRequirement from './HireRequirement'; +import AgentRepo from './AgentRepo'; +import AgentCart from './AgentCart'; + +export default React.memo<{ style?: SxProps }>(({ style = {} }) => { + return ( + <Box + sx={{ + background: '#F3F3F3', + // borderRadius: '10px', + padding: '10px', + display: 'flex', + overflow: 'hidden', + flexDirection: 'column', + overflowY: 'auto', + overflowX: 'hidden', + ...style, + }} + > + <HireRequirement /> + <AgentRepo /> + <AgentCart /> + </Box> + ); +}); diff --git a/frontend/src/components/AgentIcon/agents.ts b/frontend/src/components/AgentIcon/agents.ts new file mode 100644 index 0000000..b2668fc --- /dev/null +++ b/frontend/src/components/AgentIcon/agents.ts @@ -0,0 +1,119 @@ +import AbigailChen from '@/static/AgentIcons/Abigail_Chen.png'; +import AdamSmith from '@/static/AgentIcons/Adam_Smith.png'; +import ArthurBurton from '@/static/AgentIcons/Arthur_Burton.png'; +import AyeshaKhan from '@/static/AgentIcons/Ayesha_Khan.png'; +import CarlosGomez from '@/static/AgentIcons/Carlos_Gomez.png'; +import CarmenOrtiz from '@/static/AgentIcons/Carmen_Ortiz.png'; +import EddyLin from '@/static/AgentIcons/Eddy_Lin.png'; +import FranciscoLopez from '@/static/AgentIcons/Francisco_Lopez.png'; +import GiorgioRossi from '@/static/AgentIcons/Giorgio_Rossi.png'; +import HaileyJohnson from '@/static/AgentIcons/Hailey_Johnson.png'; +import IsabellaRodriguez from '@/static/AgentIcons/Isabella_Rodriguez.png'; +import JaneMoreno from '@/static/AgentIcons/Jane_Moreno.png'; +import JenniferMoore from '@/static/AgentIcons/Jennifer_Moore.png'; +import JohnLin from '@/static/AgentIcons/John_Lin.png'; +import KlausMueller from '@/static/AgentIcons/Klaus_Mueller.png'; +import LatoyaWilliams from '@/static/AgentIcons/Latoya_Williams.png'; +import MariaLopez from '@/static/AgentIcons/Maria_Lopez.png'; +import MeiLin from '@/static/AgentIcons/Mei_Lin.png'; +import RajivPatel from '@/static/AgentIcons/Rajiv_Patel.png'; +import RyanPark from '@/static/AgentIcons/Ryan_Park.png'; +import SamMoore from '@/static/AgentIcons/Sam_Moore.png'; +import TamaraTaylor from '@/static/AgentIcons/Tamara_Taylor.png'; +import TomMoreno from '@/static/AgentIcons/Tom_Moreno.png'; +import WolfgangSchulz from '@/static/AgentIcons/Wolfgang_Schulz.png'; +import YurikoYamamoto from '@/static/AgentIcons/Yuriko_Yamamoto.png'; +import Unknown from '@/static/AgentIcons/Unknow.png'; + +export enum IconName { + AbigailChen = 'Abigail_Chen', + AdamSmith = 'Adam_Smith', + ArthurBurton = 'Arthur_Burton', + AyeshaKhan = 'Ayesha_Khan', + CarlosGomez = 'Carlos_Gomez', + CarmenOrtiz = 'Carmen_Ortiz', + EddyLin = 'Eddy_Lin', + FranciscoLopez = 'Francisco_Lopez', + CassandraSmith = 'Cassandra_Smith', + ChristopherCarter = 'Christopher_Carter', + DaveJones = 'Dave_Jones', + DerekSmith = 'Derek_Smith', + ElisaSmith = 'Elisa_Smith', + EricJones = 'Eric_Jones', + FayeSmith = 'Faye_Smith', + FrankSmith = 'Frank_Smith', + GabeSmith = 'Gabe_Smith', + GiorgioRossi = 'Giorgio_Rossi', + HaileyJohnson = 'Hailey_Johnson', + IsabellaRodriguez = 'Isabella_Rodriguez', + JaneMoreno = 'Jane_Moreno', + JenniferMoore = 'Jennifer_Moore', + JohnLin = 'John_Lin', + KlausMueller = 'Klaus_Mueller', + LatoyaWilliams = 'Latoya_Williams', + MariaLopez = 'Maria_Lopez', + MeiLin = 'Mei_Lin', + RajivPatel = 'Rajiv_Patel', + RyanPark = 'Ryan_Park', + SamMoore = 'Sam_Moore', + TamaraTaylor = 'Tamara_Taylor', + TomMoreno = 'Tom_Moreno', + WolfgangSchulz = 'Wolfgang_Schulz', + YurikoYamamoto = 'Yuriko_Yamamoto', + Unknown = 'Unknown', +} + +const LowercaseNameMap: { [key: string]: IconName } = Object.fromEntries( + Object.entries(IconName).map(([name, value]) => [name.toLowerCase(), value]), +); + +export const IconMap = new Proxy<{ [key: string]: IconName }>( + {}, + { + get: (target, name) => { + const lowerCaseName = name + .toString() + .toLowerCase() + .replace(/[\s_]+/g, ''); + return LowercaseNameMap[lowerCaseName] || IconName.Unknown; + }, + }, +); + +export const IconUrl: { [key in IconName]: string } = { + [IconName.Unknown]: Unknown, + [IconName.AbigailChen]: AbigailChen, + [IconName.AdamSmith]: AdamSmith, + [IconName.ArthurBurton]: ArthurBurton, + [IconName.AyeshaKhan]: AyeshaKhan, + [IconName.CarlosGomez]: CarlosGomez, + [IconName.CarmenOrtiz]: CarmenOrtiz, + [IconName.EddyLin]: EddyLin, + [IconName.FranciscoLopez]: FranciscoLopez, + [IconName.CassandraSmith]: AbigailChen, + [IconName.ChristopherCarter]: AbigailChen, + [IconName.DaveJones]: AbigailChen, + [IconName.DerekSmith]: AbigailChen, + [IconName.ElisaSmith]: AbigailChen, + [IconName.EricJones]: AbigailChen, + [IconName.FayeSmith]: AbigailChen, + [IconName.FrankSmith]: AbigailChen, + [IconName.GabeSmith]: AbigailChen, + [IconName.GiorgioRossi]: GiorgioRossi, + [IconName.HaileyJohnson]: HaileyJohnson, + [IconName.IsabellaRodriguez]: IsabellaRodriguez, + [IconName.JaneMoreno]: JaneMoreno, + [IconName.JenniferMoore]: JenniferMoore, + [IconName.JohnLin]: JohnLin, + [IconName.KlausMueller]: KlausMueller, + [IconName.LatoyaWilliams]: LatoyaWilliams, + [IconName.MariaLopez]: MariaLopez, + [IconName.MeiLin]: MeiLin, + [IconName.RajivPatel]: RajivPatel, + [IconName.RyanPark]: RyanPark, + [IconName.SamMoore]: SamMoore, + [IconName.TamaraTaylor]: TamaraTaylor, + [IconName.TomMoreno]: TomMoreno, + [IconName.WolfgangSchulz]: WolfgangSchulz, + [IconName.YurikoYamamoto]: YurikoYamamoto, +}; diff --git a/frontend/src/components/AgentIcon/index.tsx b/frontend/src/components/AgentIcon/index.tsx new file mode 100644 index 0000000..721c77e --- /dev/null +++ b/frontend/src/components/AgentIcon/index.tsx @@ -0,0 +1,119 @@ +import React from 'react'; +import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; +import { styled, SxProps } from '@mui/material/styles'; +// import Box from '@mui/material/Box'; +import { Divider, Box } from '@mui/material'; +import { IconName, IconUrl, IconMap } from './agents'; +import { IAgent } from '@/apis/get-agents'; +import { ActionType } from '@/storage/plan'; + +interface ITooltipInfo extends IAgent { + action?: { type: ActionType; description: string; style: SxProps }; +} +export interface IAgentIconProps { + name?: IconName | string; + style?: React.CSSProperties; + tooltipInfo?: ITooltipInfo; +} + +const HtmlTooltip = styled(({ className, ...props }: TooltipProps) => ( + <Tooltip {...props} classes={{ popper: className }} /> +))(({ theme }) => ({ + [`& .${tooltipClasses.tooltip}`]: { + backgroundColor: '#f2f2f2', + color: 'rgba(0, 0, 0, 0.87)', + width: 'fit-content', + fontSize: theme.typography.pxToRem(12), + border: '1px solid #0003', + boxShadow: '1px 1px 4px #0003', + }, +})); + +const generateTooltip = (info: ITooltipInfo) => { + return ( + <Box sx={{ maxWidth: '20vh', padding: '4px 0px' }}> + <Box + sx={{ + fontSize: '16px', + fontWeight: 600, + userSelect: 'none', + padding: '0 4px', + }} + > + {info.name} + </Box> + <Box + sx={{ + margin: '4px 0', + fontSize: '14px', + padding: '0 4px', + borderRadius: '6px', + fontWeight: 400, + userSelect: 'none', + }} + > + {info.profile} + </Box> + {info.action && ( + <Box + sx={{ + borderRadius: '6px', + padding: '4px 4px', + border: '1px solid #333', + ...info.action.style, + }} + > + <Box sx={{ fontWeight: 600 }}>{info.action.type}</Box> + <Divider + sx={{ + margin: '1px 0px', + borderBottom: '1px dashed', // 设置为虚线 + borderColor: '#888888', + }} + /> + <Box>{info.action.description}</Box> + </Box> + )} + </Box> + ); +}; + +export default React.memo<IAgentIconProps>( + ({ style = {}, name = 'Unknown', tooltipInfo }) => { + const _name = React.useMemo(() => IconMap[name], [name]); + + return tooltipInfo ? ( + <HtmlTooltip + title={generateTooltip(tooltipInfo)} + followCursor + placement="right-start" + > + <img + // title={_name} + alt={_name} + src={IconUrl[_name]} + style={{ + width: '100%', + height: '100%', + imageRendering: 'pixelated', + ...style, + }} + /> + </HtmlTooltip> + ) : ( + <img + // title={_name} + alt={_name} + src={IconUrl[_name]} + style={{ + width: '100%', + height: '100%', + imageRendering: 'pixelated', + ...style, + }} + /> + ); + }, +); + +export { IconName, IconMap, IconUrl } from './agents'; diff --git a/frontend/src/components/FloatWindow/index.tsx b/frontend/src/components/FloatWindow/index.tsx new file mode 100644 index 0000000..f8b9d01 --- /dev/null +++ b/frontend/src/components/FloatWindow/index.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { Rnd } from 'react-rnd'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import CloseIcon from '@mui/icons-material/Close'; +import { debounce } from 'lodash'; + +export interface IFloatingWindowProps { + title: React.ReactNode; + children: React.ReactNode; + onClose?: () => void; + onResize?: () => void; +} + +let windowsArrange: HTMLElement[] = []; +const focusWindow = (element: HTMLElement) => { + windowsArrange = windowsArrange.filter( + ele => ele.ownerDocument.contains(ele) && element !== ele, + ); + windowsArrange.push(element); + windowsArrange.forEach( + (ele, index) => (ele.style.zIndex = `${index + 1000}`), + ); +}; + +export default React.memo<IFloatingWindowProps>( + ({ title, children, onClose, onResize }) => { + const [resizeable, setResizeable] = React.useState(true); + const containerRef = React.useRef<HTMLElement>(null); + React.useEffect(() => { + if (containerRef.current) { + focusWindow(containerRef.current.parentElement!); + } + }, []); + const defaultSize = React.useMemo(() => { + const width = Math.min(800, window.innerWidth - 20); + const height = Math.min(600, window.innerHeight - 20); + const x = (window.innerWidth - width) / 2; + const y = (window.innerHeight - height) / 2; + return { x, y, width, height }; + }, []); + return ( + <Rnd + /* optional props */ + style={{ + borderColor: '#43A8AA', + borderWidth: '3px', + borderStyle: 'solid', + boxShadow: '3px 3px 20px #0005', + display: 'flex', + flexDirection: 'column', + }} + minHeight={60} + minWidth={150} + default={defaultSize} + onMouseDown={() => { + if (containerRef.current) { + focusWindow(containerRef.current.parentElement!); + } + }} + bounds={document.body} + disableDragging={!resizeable} + onResize={debounce(() => { + onResize?.(); + }, 50)} + > + <Box + sx={{ + bgcolor: 'primary.main', + color: 'white', + height: '36px', + display: 'flex', + alignItems: 'center', + padding: '0 5px', + userSelect: 'none', + cursor: 'move', + }} + > + {typeof title === 'string' ? ( + <Box + sx={{ + fontSize: '18px', + fontWeight: 800, + flexGrow: 1, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }} + > + {title} + </Box> + ) : ( + title + )} + <Box sx={{ display: 'flex' }}> + <IconButton + disabled={onClose === undefined} + onClick={onClose} + sx={{ color: 'white' }} + > + <CloseIcon /> + </IconButton> + </Box> + </Box> + <Box + ref={containerRef} + sx={{ + flexGrow: 1, + background: '#F3F3F3', + overflow: 'auto', + }} + onPointerEnter={() => setResizeable(false)} + onPointerLeave={() => setResizeable(true)} + > + {children} + </Box> + </Rnd> + ); + }, +); diff --git a/frontend/src/components/HeadBar/index.tsx b/frontend/src/components/HeadBar/index.tsx new file mode 100644 index 0000000..c0648e6 --- /dev/null +++ b/frontend/src/components/HeadBar/index.tsx @@ -0,0 +1,231 @@ +import React from 'react'; +import { observer } from 'mobx-react-lite'; +import { IconButton, SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import Tabs from '@mui/material/Tabs'; +import Tab from '@mui/material/Tab'; +import AddIcon from '@mui/icons-material/Add'; +import CloseIcon from '@mui/icons-material/Close'; +import UploadIcon from '@mui/icons-material/Upload'; +import DownloadIcon from '@mui/icons-material/Download'; +import HelpOutlineIcon from '@mui/icons-material/HelpOutline'; +import LogoIcon from '@/icons/LogoIcon'; +import { globalStorage } from '@/storage'; + +export default observer(({ style = {} }: { style?: SxProps }) => { + const pageTags = React.useMemo( + () => ( + <Tabs + value={globalStorage.currentPlanId ?? ''} + onChange={(_event, newId) => + globalStorage.focusPlan(newId || undefined) + } + aria-label="plan tabs" + variant="scrollable" + scrollButtons="auto" + TabIndicatorProps={{ + children: <span className="MuiTabs-indicatorSpan" />, + }} + sx={{ + minHeight: '40px', + height: '40px', + '& .MuiTabs-indicator': { + display: 'flex', + justifyContent: 'center', + backgroundColor: 'transparent', + }, + '& .MuiTabs-indicatorSpan': { + maxWidth: 60, + width: '100%', + backgroundColor: 'rgb(168, 247, 227)', + }, + }} + > + <Tab + label={ + <Box sx={{ display: 'flex', alignItems: 'center' }}> + <AddIcon /> + </Box> + } + value="" + sx={{ + color: '#fffb', + minHeight: '40px', + height: '40px', + background: '#fff1', + width: '40px', + minWidth: '0', + '&.Mui-selected': { + color: '#fff', + fontWeight: 900, + }, + }} + /> + {globalStorage.planTabArrange.map(id => ( + <Tab + value={id} + key={id} + label={ + <Box sx={{ display: 'flex', alignItems: 'center' }}> + <IconButton + size="small" + onClick={() => globalStorage.removePlan(id)} + sx={{ + opacity: 0.6, + '&:hover': { opacity: 1 }, + }} + > + <CloseIcon + sx={{ + color: '#fff', + fontSize: '16px', + }} + /> + </IconButton> + Plan + <IconButton + size="small" + sx={{ + opacity: 0.6, + '&:hover': { opacity: 1 }, + }} + onClick={() => { + const jsonString = JSON.stringify( + globalStorage.dumpPlan(id), + ); + // download file + const blob = new Blob([jsonString], { + type: 'application/json', + }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `plan-${id}.json`; + a.click(); + a.remove(); + }} + > + <DownloadIcon + sx={{ + color: '#fff', + fontSize: '16px', + }} + /> + </IconButton> + </Box> + } + sx={{ + color: '#fffb', + minHeight: '40px', + height: '40px', + borderLeft: '1px solid #3333', + background: '#fff1', + '&.Mui-selected': { + color: '#fff', + fontWeight: 900, + }, + padding: '0 4px', + }} + /> + ))} + </Tabs> + ), + [globalStorage.planTabArrange, globalStorage.currentPlanId], + ); + + return ( + <Box + sx={{ + bgcolor: 'primary.main', + color: '#fff', + width: '100%', + display: 'flex', + userSelect: 'none', + ...style, + }} + > + <Box sx={{ flexGrow: 1, display: 'flex' }}> + {globalStorage.devMode ? ( + <Box + sx={{ display: 'flex', alignItems: 'center', marginLeft: '10px' }} + > + <LogoIcon /> + <Box sx={{ marginLeft: '6px', fontWeight: 800, fontSize: '20px' }}> + AGENTCOORD + </Box> + </Box> + ) : ( + pageTags + )} + </Box> + <IconButton component="label"> + <input + type="file" + accept=".json" + style={{ + clip: 'rect(0 0 0 0)', + clipPath: 'inset(50%)', + height: 1, + overflow: 'hidden', + position: 'absolute', + bottom: 0, + left: 0, + whiteSpace: 'nowrap', + width: 1, + }} + onChange={e => { + const file = e.target.files?.[0]; + if (file) { + const reader = new FileReader(); + reader.onload = event => { + const content = event.target?.result as string; + globalStorage.loadPlan(JSON.parse(content)); + }; + reader.readAsText(file); + } + }} + /> + <UploadIcon sx={{ color: '#fff' }} /> + </IconButton> + {globalStorage.devMode && globalStorage.currentPlanId && ( + <IconButton + disabled={globalStorage.currentPlanId === undefined} + onClick={() => { + const jsonString = JSON.stringify( + globalStorage.dumpPlan(globalStorage.currentPlanId!), + ); + // download file + const blob = new Blob([jsonString], { + type: 'application/json', + }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `plan-${globalStorage.currentPlanId!}.json`; + a.click(); + a.remove(); + }} + > + <DownloadIcon sx={{ color: '#fff' }} /> + </IconButton> + )} + {!globalStorage.devMode && ( + <Box + sx={{ + display: 'flex', + height: '100%', + marginRight: '10px', + alignItems: 'center', + fontSize: '13px', + textShadow: '0 0 2px #000', + }} + > + AgentCoord + </Box> + )} + <IconButton> + <HelpOutlineIcon sx={{ color: '#fff' }} /> + </IconButton> + </Box> + ); +}); diff --git a/frontend/src/components/LoadingMask/index.tsx b/frontend/src/components/LoadingMask/index.tsx new file mode 100644 index 0000000..cc791ea --- /dev/null +++ b/frontend/src/components/LoadingMask/index.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import CircularProgress from '@mui/material/CircularProgress'; + +export default React.memo<{ style?: SxProps }>(({ style = {} }) => ( + <Box + sx={{ + position: 'absolute', + height: '100%', + width: '100%', + backdropFilter: 'blur(5px)', + backgroundColor: '#FFF3', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + ...style, + }} + > + <CircularProgress /> + </Box> +)); diff --git a/frontend/src/components/MarkdownBlock/github-mardown.css b/frontend/src/components/MarkdownBlock/github-mardown.css new file mode 100644 index 0000000..0450f81 --- /dev/null +++ b/frontend/src/components/MarkdownBlock/github-mardown.css @@ -0,0 +1,1210 @@ +@media (prefers-color-scheme: dark) { + .markdown-body, + [data-theme='dark'] { + /*dark*/ + color-scheme: dark; + --color-prettylights-syntax-comment: #8b949e; + --color-prettylights-syntax-constant: #79c0ff; + --color-prettylights-syntax-entity: #d2a8ff; + --color-prettylights-syntax-storage-modifier-import: #c9d1d9; + --color-prettylights-syntax-entity-tag: #7ee787; + --color-prettylights-syntax-keyword: #ff7b72; + --color-prettylights-syntax-string: #a5d6ff; + --color-prettylights-syntax-variable: #ffa657; + --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; + --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; + --color-prettylights-syntax-invalid-illegal-bg: #8e1519; + --color-prettylights-syntax-carriage-return-text: #f0f6fc; + --color-prettylights-syntax-carriage-return-bg: #b62324; + --color-prettylights-syntax-string-regexp: #7ee787; + --color-prettylights-syntax-markup-list: #f2cc60; + --color-prettylights-syntax-markup-heading: #1f6feb; + --color-prettylights-syntax-markup-italic: #c9d1d9; + --color-prettylights-syntax-markup-bold: #c9d1d9; + --color-prettylights-syntax-markup-deleted-text: #ffdcd7; + --color-prettylights-syntax-markup-deleted-bg: #67060c; + --color-prettylights-syntax-markup-inserted-text: #aff5b4; + --color-prettylights-syntax-markup-inserted-bg: #033a16; + --color-prettylights-syntax-markup-changed-text: #ffdfb6; + --color-prettylights-syntax-markup-changed-bg: #5a1e02; + --color-prettylights-syntax-markup-ignored-text: #c9d1d9; + --color-prettylights-syntax-markup-ignored-bg: #1158c7; + --color-prettylights-syntax-meta-diff-range: #d2a8ff; + --color-prettylights-syntax-brackethighlighter-angle: #8b949e; + --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58; + --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; + --color-fg-default: #e6edf3; + --color-fg-muted: #848d97; + --color-fg-subtle: #6e7681; + --color-canvas-default: #0d1117; + --color-canvas-subtle: #161b22; + --color-border-default: #30363d; + --color-border-muted: #21262d; + --color-neutral-muted: rgba(110, 118, 129, 0.4); + --color-accent-fg: #2f81f7; + --color-accent-emphasis: #1f6feb; + --color-success-fg: #3fb950; + --color-success-emphasis: #238636; + --color-attention-fg: #d29922; + --color-attention-emphasis: #9e6a03; + --color-attention-subtle: rgba(187, 128, 9, 0.15); + --color-danger-fg: #f85149; + --color-danger-emphasis: #da3633; + --color-done-fg: #a371f7; + --color-done-emphasis: #8957e5; + } +} + +@media (prefers-color-scheme: light) { + .markdown-body, + [data-theme='light'] { + /*light*/ + color-scheme: light; + --color-prettylights-syntax-comment: #57606a; + --color-prettylights-syntax-constant: #0550ae; + --color-prettylights-syntax-entity: #6639ba; + --color-prettylights-syntax-storage-modifier-import: #24292f; + --color-prettylights-syntax-entity-tag: #116329; + --color-prettylights-syntax-keyword: #cf222e; + --color-prettylights-syntax-string: #0a3069; + --color-prettylights-syntax-variable: #953800; + --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; + --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; + --color-prettylights-syntax-invalid-illegal-bg: #82071e; + --color-prettylights-syntax-carriage-return-text: #f6f8fa; + --color-prettylights-syntax-carriage-return-bg: #cf222e; + --color-prettylights-syntax-string-regexp: #116329; + --color-prettylights-syntax-markup-list: #3b2300; + --color-prettylights-syntax-markup-heading: #0550ae; + --color-prettylights-syntax-markup-italic: #24292f; + --color-prettylights-syntax-markup-bold: #24292f; + --color-prettylights-syntax-markup-deleted-text: #82071e; + --color-prettylights-syntax-markup-deleted-bg: #ffebe9; + --color-prettylights-syntax-markup-inserted-text: #116329; + --color-prettylights-syntax-markup-inserted-bg: #dafbe1; + --color-prettylights-syntax-markup-changed-text: #953800; + --color-prettylights-syntax-markup-changed-bg: #ffd8b5; + --color-prettylights-syntax-markup-ignored-text: #eaeef2; + --color-prettylights-syntax-markup-ignored-bg: #0550ae; + --color-prettylights-syntax-meta-diff-range: #8250df; + --color-prettylights-syntax-brackethighlighter-angle: #57606a; + --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; + --color-prettylights-syntax-constant-other-reference-link: #0a3069; + --color-fg-default: #1f2328; + --color-fg-muted: #656d76; + --color-fg-subtle: #6e7781; + --color-canvas-default: #ffffff; + --color-canvas-subtle: #f6f8fa; + --color-border-default: #d0d7de; + --color-border-muted: hsla(210, 18%, 87%, 1); + --color-neutral-muted: rgba(175, 184, 193, 0.2); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-success-fg: #1a7f37; + --color-success-emphasis: #1f883d; + --color-attention-fg: #9a6700; + --color-attention-emphasis: #9a6700; + --color-attention-subtle: #fff8c5; + --color-danger-fg: #d1242f; + --color-danger-emphasis: #cf222e; + --color-done-fg: #8250df; + --color-done-emphasis: #8250df; + } +} + +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + margin: 0; + color: var(--color-fg-default); + background-color: var(--color-canvas-default); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', + Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji'; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} +.markdown-body * { + margin-top: 0px !important; + margin-bottom: 0px !important; + padding-top: 0px !important; + padding-bottom: 0px !important; + margin-block-start: 0px !important; + margin-block-end: 0px !important; + white-space: normal !important; +} + +.markdown-body .octicon { + display: inline-block; + fill: currentColor; + vertical-align: text-bottom; +} + +.markdown-body h1:hover .anchor .octicon-link:before, +.markdown-body h2:hover .anchor .octicon-link:before, +.markdown-body h3:hover .anchor .octicon-link:before, +.markdown-body h4:hover .anchor .octicon-link:before, +.markdown-body h5:hover .anchor .octicon-link:before, +.markdown-body h6:hover .anchor .octicon-link:before { + width: 16px; + height: 16px; + content: ' '; + display: inline-block; + background-color: currentColor; + -webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>"); + mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>"); +} + +.markdown-body details, +.markdown-body figcaption, +.markdown-body figure { + display: block; +} + +.markdown-body summary { + display: list-item; +} + +.markdown-body [hidden] { + display: none !important; +} + +.markdown-body a { + background-color: transparent; + color: var(--color-accent-fg); + text-decoration: none; +} + +.markdown-body abbr[title] { + border-bottom: none; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +.markdown-body b, +.markdown-body strong { + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body dfn { + font-style: italic; +} + +.markdown-body h1 { + margin: 0.67em 0; + font-weight: var(--base-text-weight-semibold, 600); + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid var(--color-border-muted); +} + +.markdown-body mark { + background-color: var(--color-attention-subtle); + color: var(--color-fg-default); +} + +.markdown-body small { + font-size: 90%; +} + +.markdown-body sub, +.markdown-body sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +.markdown-body sub { + bottom: -0.25em; +} + +.markdown-body sup { + top: -0.5em; +} + +.markdown-body img { + border-style: none; + max-width: 100%; + box-sizing: content-box; + background-color: var(--color-canvas-default); +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre, +.markdown-body samp { + font-family: monospace; + font-size: 1em; +} + +.markdown-body figure { + margin: 1em 40px; +} + +.markdown-body hr { + box-sizing: content-box; + overflow: hidden; + background: transparent; + border-bottom: 1px solid var(--color-border-muted); + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: var(--color-border-default); + border: 0; +} + +.markdown-body input { + font: inherit; + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body [type='button'], +.markdown-body [type='reset'], +.markdown-body [type='submit'] { + -webkit-appearance: button; + appearance: button; +} + +.markdown-body [type='checkbox'], +.markdown-body [type='radio'] { + box-sizing: border-box; + padding: 0; +} + +.markdown-body [type='number']::-webkit-inner-spin-button, +.markdown-body [type='number']::-webkit-outer-spin-button { + height: auto; +} + +.markdown-body [type='search']::-webkit-search-cancel-button, +.markdown-body [type='search']::-webkit-search-decoration { + -webkit-appearance: none; + appearance: none; +} + +.markdown-body ::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} + +.markdown-body ::-webkit-file-upload-button { + -webkit-appearance: button; + appearance: button; + font: inherit; +} + +.markdown-body a:hover { + text-decoration: underline; +} + +.markdown-body ::placeholder { + color: var(--color-fg-subtle); + opacity: 1; +} + +.markdown-body hr::before { + display: table; + content: ''; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ''; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; + display: block; + width: max-content; + max-width: 100%; + overflow: auto; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body details summary { + cursor: pointer; +} + +.markdown-body details:not([open]) > *:not(summary) { + display: none !important; +} + +.markdown-body a:focus, +.markdown-body [role='button']:focus, +.markdown-body input[type='radio']:focus, +.markdown-body input[type='checkbox']:focus { + outline: 2px solid var(--color-accent-fg); + outline-offset: -2px; + box-shadow: none; +} + +.markdown-body a:focus:not(:focus-visible), +.markdown-body [role='button']:focus:not(:focus-visible), +.markdown-body input[type='radio']:focus:not(:focus-visible), +.markdown-body input[type='checkbox']:focus:not(:focus-visible) { + outline: solid 1px transparent; +} + +.markdown-body a:focus-visible, +.markdown-body [role='button']:focus-visible, +.markdown-body input[type='radio']:focus-visible, +.markdown-body input[type='checkbox']:focus-visible { + outline: 2px solid var(--color-accent-fg); + outline-offset: -2px; + box-shadow: none; +} + +.markdown-body a:not([class]):focus, +.markdown-body a:not([class]):focus-visible, +.markdown-body input[type='radio']:focus, +.markdown-body input[type='radio']:focus-visible, +.markdown-body input[type='checkbox']:focus, +.markdown-body input[type='checkbox']:focus-visible { + outline-offset: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, + Liberation Mono, monospace; + line-height: 10px; + color: var(--color-fg-default); + vertical-align: middle; + background-color: var(--color-canvas-subtle); + border: solid 1px var(--color-neutral-muted); + border-bottom-color: var(--color-neutral-muted); + border-radius: 6px; + box-shadow: inset 0 -1px 0 var(--color-neutral-muted); +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: var(--base-text-weight-semibold, 600); + line-height: 1.25; +} + +.markdown-body h2 { + font-weight: var(--base-text-weight-semibold, 600); + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid var(--color-border-muted); +} + +.markdown-body h3 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1.25em; +} + +.markdown-body h4 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 1em; +} + +.markdown-body h5 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 0.875em; +} + +.markdown-body h6 { + font-weight: var(--base-text-weight-semibold, 600); + font-size: 0.85em; + color: var(--color-fg-muted); +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; + padding: 0 1em; + color: var(--color-fg-muted); + border-left: 0.25em solid var(--color-border-default); +} + +.markdown-body ul, +.markdown-body ol { + margin-top: 0; + margin-bottom: 0; + padding-left: 2em; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body tt, +.markdown-body code, +.markdown-body samp { + font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, + Liberation Mono, monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, + Liberation Mono, monospace; + font-size: 12px; + word-wrap: normal; +} + +.markdown-body .octicon { + display: inline-block; + overflow: visible !important; + vertical-align: text-bottom; + fill: currentColor; +} + +.markdown-body input::-webkit-outer-spin-button, +.markdown-body input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; + appearance: none; +} + +.markdown-body .mr-2 { + margin-right: var(--base-size-8, 8px) !important; +} + +.markdown-body::before { + display: table; + content: ''; +} + +.markdown-body::after { + display: table; + clear: both; + content: ''; +} + +.markdown-body > *:first-child { + margin-top: 0 !important; +} + +.markdown-body > *:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .absent { + color: var(--color-danger-fg); +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre, +.markdown-body details { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body blockquote > :first-child { + margin-top: 0; +} + +.markdown-body blockquote > :last-child { + margin-bottom: 0; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: var(--color-fg-default); + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 tt, +.markdown-body h1 code, +.markdown-body h2 tt, +.markdown-body h2 code, +.markdown-body h3 tt, +.markdown-body h3 code, +.markdown-body h4 tt, +.markdown-body h4 code, +.markdown-body h5 tt, +.markdown-body h5 code, +.markdown-body h6 tt, +.markdown-body h6 code { + padding: 0 0.2em; + font-size: inherit; +} + +.markdown-body summary h1, +.markdown-body summary h2, +.markdown-body summary h3, +.markdown-body summary h4, +.markdown-body summary h5, +.markdown-body summary h6 { + display: inline-block; +} + +.markdown-body summary h1 .anchor, +.markdown-body summary h2 .anchor, +.markdown-body summary h3 .anchor, +.markdown-body summary h4 .anchor, +.markdown-body summary h5 .anchor, +.markdown-body summary h6 .anchor { + margin-left: -40px; +} + +.markdown-body summary h1, +.markdown-body summary h2 { + padding-bottom: 0; + border-bottom: 0; +} + +.markdown-body ul.no-list, +.markdown-body ol.no-list { + padding: 0; + list-style-type: none; +} + +.markdown-body ol[type='a s'] { + list-style-type: lower-alpha; +} + +.markdown-body ol[type='A s'] { + list-style-type: upper-alpha; +} + +.markdown-body ol[type='i s'] { + list-style-type: lower-roman; +} + +.markdown-body ol[type='I s'] { + list-style-type: upper-roman; +} + +.markdown-body ol[type='1'] { + list-style-type: decimal; +} + +.markdown-body div > ol:not([type]) { + list-style-type: decimal; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li > p { + margin-top: 16px; +} + +.markdown-body li + li { + margin-top: 0.25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table th { + font-weight: var(--base-text-weight-semibold, 600); +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid var(--color-border-default); +} + +.markdown-body table td > :last-child { + margin-bottom: 0; +} + +.markdown-body table tr { + background-color: var(--color-canvas-default); + border-top: 1px solid var(--color-border-muted); +} + +.markdown-body table tr:nth-child(2n) { + background-color: var(--color-canvas-subtle); +} + +.markdown-body table img { + background-color: transparent; +} + +.markdown-body img[align='right'] { + padding-left: 20px; +} + +.markdown-body img[align='left'] { + padding-right: 20px; +} + +.markdown-body .emoji { + max-width: none; + vertical-align: text-top; + background-color: transparent; +} + +.markdown-body span.frame { + display: block; + overflow: hidden; +} + +.markdown-body span.frame > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid var(--color-border-default); +} + +.markdown-body span.frame span img { + display: block; + float: left; +} + +.markdown-body span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color: var(--color-fg-default); +} + +.markdown-body span.align-center { + display: block; + overflow: hidden; + clear: both; +} + +.markdown-body span.align-center > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; +} + +.markdown-body span.align-center span img { + margin: 0 auto; + text-align: center; +} + +.markdown-body span.align-right { + display: block; + overflow: hidden; + clear: both; +} + +.markdown-body span.align-right > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; +} + +.markdown-body span.align-right span img { + margin: 0; + text-align: right; +} + +.markdown-body span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; +} + +.markdown-body span.float-left span { + margin: 13px 0 0; +} + +.markdown-body span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; +} + +.markdown-body span.float-right > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; +} + +.markdown-body code, +.markdown-body tt { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + white-space: break-spaces; + background-color: var(--color-neutral-muted); + border-radius: 6px; +} + +.markdown-body code br, +.markdown-body tt br { + display: none; +} + +.markdown-body del code { + text-decoration: inherit; +} + +.markdown-body samp { + font-size: 85%; +} + +.markdown-body pre code { + font-size: 100%; +} + +.markdown-body pre > code { + padding: 0; + margin: 0; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + color: var(--color-fg-default); + background-color: var(--color-canvas-subtle); + border-radius: 6px; +} + +.markdown-body pre code, +.markdown-body pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body .csv-data td, +.markdown-body .csv-data th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space: nowrap; +} + +.markdown-body .csv-data .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: var(--color-canvas-default); + border: 0; +} + +.markdown-body .csv-data tr { + border-top: 0; +} + +.markdown-body .csv-data th { + font-weight: var(--base-text-weight-semibold, 600); + background: var(--color-canvas-subtle); + border-top: 0; +} + +.markdown-body [data-footnote-ref]::before { + content: '['; +} + +.markdown-body [data-footnote-ref]::after { + content: ']'; +} + +.markdown-body .footnotes { + font-size: 12px; + color: var(--color-fg-muted); + border-top: 1px solid var(--color-border-default); +} + +.markdown-body .footnotes ol { + padding-left: 16px; +} + +.markdown-body .footnotes ol ul { + display: inline-block; + padding-left: 16px; + margin-top: 16px; +} + +.markdown-body .footnotes li { + position: relative; +} + +.markdown-body .footnotes li:target::before { + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -24px; + pointer-events: none; + content: ''; + border: 2px solid var(--color-accent-emphasis); + border-radius: 6px; +} + +.markdown-body .footnotes li:target { + color: var(--color-fg-default); +} + +.markdown-body .footnotes .data-footnote-backref g-emoji { + font-family: monospace; +} + +.markdown-body .pl-c { + color: var(--color-prettylights-syntax-comment); +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: var(--color-prettylights-syntax-constant); +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: var(--color-prettylights-syntax-entity); +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: var(--color-prettylights-syntax-storage-modifier-import); +} + +.markdown-body .pl-ent { + color: var(--color-prettylights-syntax-entity-tag); +} + +.markdown-body .pl-k { + color: var(--color-prettylights-syntax-keyword); +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: var(--color-prettylights-syntax-string); +} + +.markdown-body .pl-v, +.markdown-body .pl-smw { + color: var(--color-prettylights-syntax-variable); +} + +.markdown-body .pl-bu { + color: var(--color-prettylights-syntax-brackethighlighter-unmatched); +} + +.markdown-body .pl-ii { + color: var(--color-prettylights-syntax-invalid-illegal-text); + background-color: var(--color-prettylights-syntax-invalid-illegal-bg); +} + +.markdown-body .pl-c2 { + color: var(--color-prettylights-syntax-carriage-return-text); + background-color: var(--color-prettylights-syntax-carriage-return-bg); +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: var(--color-prettylights-syntax-string-regexp); +} + +.markdown-body .pl-ml { + color: var(--color-prettylights-syntax-markup-list); +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: var(--color-prettylights-syntax-markup-heading); +} + +.markdown-body .pl-mi { + font-style: italic; + color: var(--color-prettylights-syntax-markup-italic); +} + +.markdown-body .pl-mb { + font-weight: bold; + color: var(--color-prettylights-syntax-markup-bold); +} + +.markdown-body .pl-md { + color: var(--color-prettylights-syntax-markup-deleted-text); + background-color: var(--color-prettylights-syntax-markup-deleted-bg); +} + +.markdown-body .pl-mi1 { + color: var(--color-prettylights-syntax-markup-inserted-text); + background-color: var(--color-prettylights-syntax-markup-inserted-bg); +} + +.markdown-body .pl-mc { + color: var(--color-prettylights-syntax-markup-changed-text); + background-color: var(--color-prettylights-syntax-markup-changed-bg); +} + +.markdown-body .pl-mi2 { + color: var(--color-prettylights-syntax-markup-ignored-text); + background-color: var(--color-prettylights-syntax-markup-ignored-bg); +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: var(--color-prettylights-syntax-meta-diff-range); +} + +.markdown-body .pl-ba { + color: var(--color-prettylights-syntax-brackethighlighter-angle); +} + +.markdown-body .pl-sg { + color: var(--color-prettylights-syntax-sublimelinter-gutter-mark); +} + +.markdown-body .pl-corl { + text-decoration: underline; + color: var(--color-prettylights-syntax-constant-other-reference-link); +} + +.markdown-body g-emoji { + display: inline-block; + min-width: 1ch; + font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + font-size: 1em; + font-style: normal !important; + font-weight: var(--base-text-weight-normal, 400); + line-height: 1; + vertical-align: -0.075em; +} + +.markdown-body g-emoji img { + width: 1em; + height: 1em; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item label { + font-weight: var(--base-text-weight-normal, 400); +} + +.markdown-body .task-list-item.enabled label { + cursor: pointer; +} + +.markdown-body .task-list-item + .task-list-item { + margin-top: 4px; +} + +.markdown-body .task-list-item .handle { + display: none; +} + +.markdown-body .task-list-item-checkbox { + margin: 0 0.2em 0.25em -1.4em; + vertical-align: middle; +} + +.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox { + margin: 0 -1.6em 0.25em 0.2em; +} + +.markdown-body .contains-task-list { + position: relative; +} + +.markdown-body .contains-task-list:hover .task-list-item-convert-container, +.markdown-body + .contains-task-list:focus-within + .task-list-item-convert-container { + display: block; + width: auto; + height: 24px; + overflow: visible; + clip: auto; +} + +.markdown-body ::-webkit-calendar-picker-indicator { + filter: invert(50%); +} + +.markdown-body .markdown-alert { + padding: var(--base-size-8) var(--base-size-16); + margin-bottom: 16px; + color: inherit; + border-left: 0.25em solid var(--color-border-default); +} + +.markdown-body .markdown-alert > :first-child { + margin-top: 0; +} + +.markdown-body .markdown-alert > :last-child { + margin-bottom: 0; +} + +.markdown-body .markdown-alert .markdown-alert-title { + display: flex; + font-weight: var(--base-text-weight-medium, 500); + align-items: center; + line-height: 1; +} + +.markdown-body .markdown-alert.markdown-alert-note { + border-left-color: var(--color-accent-emphasis); +} + +.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title { + color: var(--color-accent-fg); +} + +.markdown-body .markdown-alert.markdown-alert-important { + border-left-color: var(--color-done-emphasis); +} + +.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title { + color: var(--color-done-fg); +} + +.markdown-body .markdown-alert.markdown-alert-warning { + border-left-color: var(--color-attention-emphasis); +} + +.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title { + color: var(--color-attention-fg); +} + +.markdown-body .markdown-alert.markdown-alert-tip { + border-left-color: var(--color-success-emphasis); +} + +.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title { + color: var(--color-success-fg); +} + +.markdown-body .markdown-alert.markdown-alert-caution { + border-left-color: var(--color-danger-emphasis); +} + +.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title { + color: var(--color-danger-fg); +} diff --git a/frontend/src/components/MarkdownBlock/index.tsx b/frontend/src/components/MarkdownBlock/index.tsx new file mode 100644 index 0000000..8126046 --- /dev/null +++ b/frontend/src/components/MarkdownBlock/index.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import remarkGfm from 'remark-gfm'; +import Box from '@mui/material/Box'; +import remarkMath from 'remark-math'; +import rehypeKatex from 'rehype-katex'; +import { SxProps } from '@mui/material'; +import ReactMarkdown from 'react-markdown'; +import rehypeHighlight from 'rehype-highlight'; + +// import './markdown-style.css'; +import './github-mardown.css'; +// import './hljs-atom-one-dark.min.css'; +// import './prism-one-dark.css'; + +export interface IMarkdownViewArguments { + text?: string; + style?: SxProps; +} + +export default React.memo<IMarkdownViewArguments>( + ({ text = '', style = {} }) => { + return ( + <Box className="markdown-body" sx={{ minHeight: '20px', ...style }}> + <ReactMarkdown + remarkPlugins={[remarkMath, remarkGfm]} + rehypePlugins={[rehypeHighlight, rehypeKatex]} + > + {text} + </ReactMarkdown> + </Box> + ); + }, +); diff --git a/frontend/src/components/MarkdownBlock/markdown-style.css b/frontend/src/components/MarkdownBlock/markdown-style.css new file mode 100644 index 0000000..8649738 --- /dev/null +++ b/frontend/src/components/MarkdownBlock/markdown-style.css @@ -0,0 +1,702 @@ +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Segoe UI', + Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} +.markdown-body * { + margin-top: 0px !important; + margin-bottom: 0px !important; + padding-top: 0px !important; + padding-bottom: 0px !important; + margin-block-start: 0px !important; + margin-block-end: 0px !important; + white-space: normal !important; +} +.markdown-body .pl-c { + color: #6a737d; +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: #005cc5; +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: #6f42c1; +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: #24292e; +} + +.markdown-body .pl-ent { + color: #22863a; +} + +.markdown-body .pl-k { + color: #d73a49; +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: #032f62; +} + +.markdown-body .pl-v, +.markdown-body .pl-smw { + color: #e36209; +} + +.markdown-body .pl-bu { + color: #b31d28; +} + +.markdown-body .pl-ii { + color: #fafbfc; + background-color: #b31d28; +} + +.markdown-body .pl-c2 { + color: #fafbfc; + background-color: #d73a49; +} + +.markdown-body .pl-c2::before { + content: '^M'; +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: #22863a; +} + +.markdown-body .pl-ml { + color: #735c0f; +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: #005cc5; +} + +.markdown-body .pl-mi { + font-style: italic; + color: #24292e; +} + +.markdown-body .pl-mb { + font-weight: bold; + color: #24292e; +} + +.markdown-body .pl-md { + color: #b31d28; + background-color: #ffeef0; +} + +.markdown-body .pl-mi1 { + color: #22863a; + background-color: #f0fff4; +} + +.markdown-body .pl-mc { + color: #e36209; + background-color: #ffebda; +} + +.markdown-body .pl-mi2 { + color: #f6f8fa; + background-color: #005cc5; +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: #6f42c1; +} + +.markdown-body .pl-ba { + color: #586069; +} + +.markdown-body .pl-sg { + color: #959da5; +} + +.markdown-body .pl-corl { + text-decoration: underline; + color: #032f62; +} + +.markdown-body .octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} + +.markdown-body a { + background-color: transparent; +} + +.markdown-body a:active, +.markdown-body a:hover { + outline-width: 0; +} + +.markdown-body strong { + font-weight: inherit; +} + +.markdown-body strong { + font-weight: bolder; +} + +.markdown-body h1 { + font-size: 2em; + margin: 0.67em 0; +} + +.markdown-body img { + border-style: none; +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre { + font-family: monospace, monospace; + font-size: 1em; +} + +.markdown-body hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +.markdown-body input { + font: inherit; + margin: 0; +} + +.markdown-body input { + overflow: visible; +} + +.markdown-body [type='checkbox'] { + box-sizing: border-box; + padding: 0; +} + +.markdown-body * { + box-sizing: border-box; +} + +.markdown-body input { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body a { + color: #0366d6; + text-decoration: none; +} + +.markdown-body a:hover { + text-decoration: underline; +} + +.markdown-body strong { + font-weight: 600; +} + +.markdown-body hr { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 0.05em solid #dfe2e5; +} + +.markdown-body hr::before { + display: table; + content: ''; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ''; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body h1 { + font-size: 32px; + font-weight: 600; +} + +.markdown-body h2 { + font-size: 24px; + font-weight: 600; +} + +.markdown-body h3 { + font-size: 20px; + font-weight: 600; +} + +.markdown-body h4 { + font-size: 16px; + font-weight: 600; +} + +.markdown-body h5 { + font-size: 14px; + font-weight: 600; +} + +.markdown-body h6 { + font-size: 12px; + font-weight: 600; +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body code { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, + monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, + monospace; + font-size: 12px; +} + +.markdown-body .octicon { + vertical-align: text-bottom; +} + +.markdown-body .pl-0 { + padding-left: 0 !important; +} + +.markdown-body .pl-1 { + padding-left: 4px !important; +} + +.markdown-body .pl-2 { + padding-left: 8px !important; +} + +.markdown-body .pl-3 { + padding-left: 16px !important; +} + +.markdown-body .pl-4 { + padding-left: 24px !important; +} + +.markdown-body .pl-5 { + padding-left: 32px !important; +} + +.markdown-body .pl-6 { + padding-left: 40px !important; +} + +.markdown-body::before { + display: table; + content: ''; +} + +.markdown-body::after { + display: table; + clear: both; + content: ''; +} + +.markdown-body > *:first-child { + margin-top: 0 !important; +} + +.markdown-body > *:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body blockquote > :first-child { + margin-top: 0; +} + +.markdown-body blockquote > :last-child { + margin-bottom: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #c6cbd1; + border-bottom-color: #959da5; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #959da5; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: #1b1f23; + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid #888a; +} + +.markdown-body h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid #888a; +} + +.markdown-body h3 { + font-size: 1.25em; +} + +.markdown-body h4 { + font-size: 1em; +} + +.markdown-body h5 { + font-size: 0.875em; +} + +.markdown-body h6 { + font-size: 0.85em; + color: #6a737d; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 2em; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li { + word-wrap: break-all; +} + +.markdown-body li > p { + margin-top: 16px; +} + +.markdown-body li + li { + margin-top: 0.25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: 600; +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table { + display: block; + width: 100%; + overflow: auto; +} + +.markdown-body table th { + font-weight: 600; +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid #dfe2e5; +} + +.markdown-body table tr { + background-color: #fff; + border-top: 1px solid #c6cbd1; +} + +.markdown-body table tr:nth-child(2n) { + background-color: #f6f8fa; +} + +.markdown-body img { + max-width: 100%; + box-sizing: content-box; + background-color: #fff; +} + +.markdown-body hr { + height: 0.05em; + padding: 0; + margin: 24px 0; + background-color: #e1e4e8; + border: 0; +} + +.markdown-body blockquote { + padding: 0 1em; + color: #6a737d; + border-left: 0.25em solid #dfe2e5; +} + +.markdown-body img[align='right'] { + padding-left: 20px; +} + +.markdown-body img[align='left'] { + padding-right: 20px; +} + +.markdown-body code { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + background-color: rgba(197, 212, 228, 0.115); + border-radius: 3px; +} + +.markdown-body pre { + word-wrap: normal; +} + +.markdown-body pre > code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + border-radius: 3px; + background: #0003; +} + +.markdown-body pre code { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body :checked + .radio-label { + position: relative; + z-index: 1; + border-color: #0366d6; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item + .task-list-item { + margin-top: 3px; +} + +.markdown-body .task-list-item input { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; +} + +.markdown-body hr { + border-bottom-color: #555; +} + +.markdown-body .full-commit .btn-outline:not(:disabled):hover { + color: #005cc5; + border-color: #005cc5; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, + monospace; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #d1d5da; + border-bottom-color: #c6cbd1; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #c6cbd1; +} diff --git a/frontend/src/components/Outline/Cards.tsx b/frontend/src/components/Outline/Cards.tsx new file mode 100644 index 0000000..dfb4d12 --- /dev/null +++ b/frontend/src/components/Outline/Cards.tsx @@ -0,0 +1,344 @@ +import React, { useState } from 'react'; +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import { IconButton, SxProps } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import Divider from '@mui/material/Divider'; +import RemoveIcon from '@mui/icons-material/Remove'; +import AdjustIcon from '@mui/icons-material/Adjust'; +import { ObjectProps, ProcessProps } from './interface'; +import AgentIcon from '@/components/AgentIcon'; +import { globalStorage } from '@/storage'; + +export interface IEditObjectProps { + finishEdit: (objectName: string) => void; +} + +export const EditObjectCard: React.FC<IEditObjectProps> = React.memo( + ({ finishEdit }) => { + const handleKeyPress = (event: any) => { + if (event.key === 'Enter') { + finishEdit(event.target.value); + } + }; + return ( + <TextField + onKeyPress={handleKeyPress} + sx={{ + backgroundColor: '#D9D9D9', + borderRadius: '6px', + padding: '8px', + userSelect: 'none', + margin: '6px 0px', + }} + /> + ); + }, +); + +interface IHoverIconButtonProps { + onAddClick: () => void; + isActive: boolean; + style: SxProps; + responseToHover?: boolean; + addOrRemove: boolean | undefined; // true for add, false for remove,undefined for adjust +} + +const HoverIconButton: React.FC<IHoverIconButtonProps> = ({ + onAddClick, + isActive, + style, + addOrRemove, + responseToHover = true, +}) => { + const [addIconHover, setAddIconHover] = useState(false); + + return ( + <Box + onMouseOver={() => { + setAddIconHover(true); + }} + onMouseOut={() => { + setAddIconHover(false); + }} + onClick={() => { + onAddClick(); + }} + sx={{ ...style, justifySelf: 'start' }} + > + <IconButton + sx={{ + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + padding: '0px', + borderRadius: 10, + border: '1px dotted #333', + visibility: + (responseToHover && addIconHover) || isActive + ? 'visible' + : 'hidden', + '& .MuiSvgIcon-root': { + fontSize: '1.25rem', + }, + }} + > + {addOrRemove === undefined ? <AdjustIcon /> : <></>} + {addOrRemove === true ? <AddIcon /> : <></>} + {addOrRemove === false ? <RemoveIcon /> : <></>} + </IconButton> + </Box> + ); +}; + +interface IEditableBoxProps { + text: string; + inputCallback: (text: string) => void; +} + +const EditableBox: React.FC<IEditableBoxProps> = ({ text, inputCallback }) => { + const [isEditable, setIsEditable] = useState(false); + const handleDoubleClick = () => { + setIsEditable(true); + }; + + const handleKeyPress = (event: any) => { + if (event.key === 'Enter') { + inputCallback(event.target.value); + setIsEditable(false); + } + }; + + return ( + <Box> + {isEditable ? ( + <TextField + defaultValue={text} + multiline + onKeyPress={handleKeyPress} + onBlur={() => setIsEditable(false)} // 失去焦点时也关闭编辑状态 + autoFocus + sx={{ + '& .MuiInputBase-root': { + // 目标 MUI 的输入基础根元素 + padding: '0px 0px', // 你可以设置为你希望的内边距值 + }, + width: '100%', + }} + /> + ) : ( + <span + onDoubleClick={handleDoubleClick} + style={{ + color: '#707070', + // textDecoration: 'underline', + // textDecorationColor: '#C1C1C1', + borderBottom: '1.5px solid #C1C1C1', + fontSize: '15px', + }} + > + {text} + </span> + )} + </Box> + ); +}; + +export interface IObjectCardProps { + object: ObjectProps; + isAddActive?: boolean; + handleAddActive?: (objectName: string) => void; + addOrRemove?: boolean; +} + +export const ObjectCard = React.memo<IObjectCardProps>( + ({ + object, + isAddActive = false, + handleAddActive = (objectName: string) => { + console.log(objectName); + }, + addOrRemove = true, + }) => { + const onAddClick = () => { + handleAddActive(object.name); + }; + return ( + <Box + sx={{ + position: 'relative', + // maxWidth: '100%', + }} + > + <HoverIconButton + style={{ + position: 'absolute', + left: '100%', + top: '50%', + transform: 'translateY(-50%)translateX(-50%)', + }} + onAddClick={onAddClick} + isActive={isAddActive} + responseToHover={false} + addOrRemove={addOrRemove} + /> + <Box + ref={object.cardRef} + sx={{ + backgroundColor: '#F6F6F6', + borderRadius: '15px', + border: '2px solid #E5E5E5', + padding: '10px 4px', + userSelect: 'none', + margin: '12px 0px', + maxWidth: '100%', + wordWrap: 'break-word', + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + fontSize: '16px', + fontWeight: 800, + textAlign: 'center', + color: '#222', + }} + > + {object.name} + </Box> + </Box> + ); + }, +); + +export interface IProcessCardProps { + process: ProcessProps; + handleProcessClick: (stepId: string) => void; + isFocusing: boolean; + isAddActive?: boolean; + handleAddActive?: (objectName: string) => void; + + handleEditContent: (stepTaskId: string, newContent: string) => void; + // handleSizeChange: () => void; +} + +export const ProcessCard: React.FC<IProcessCardProps> = React.memo( + ({ + process, + handleProcessClick, + isFocusing, + isAddActive = false, + handleAddActive = (objectName: string) => { + console.log(objectName); + }, + // handleSizeChange, + handleEditContent, + }) => { + const onAddClick = () => { + handleAddActive(process.id); + }; + return ( + <Box + sx={{ + position: 'relative', + // width: '100%', + }} + > + <HoverIconButton + style={{ + position: 'absolute', + left: '0', + top: '50%', + transform: 'translateY(-50%)translateX(-50%)', + }} + onAddClick={onAddClick} + isActive={isAddActive} + addOrRemove={undefined} + /> + <Box + ref={process.cardRef} + sx={{ + backgroundColor: '#F6F6F6', + borderRadius: '15px', + padding: '8px', + margin: '18px 0px', + userSelect: 'none', + cursor: 'pointer', + border: isFocusing ? '2px solid #43b2aa' : '2px solid #E5E5E5', + transition: 'all 80ms ease-in-out', + '&:hover': { + border: isFocusing ? '2px solid #03a89d' : '2px solid #b3b3b3', + backgroundImage: 'linear-gradient(0, #0001, #0001)', + }, + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + }} + onClick={() => handleProcessClick(process.id)} + > + <Box + sx={{ + fontSize: '16px', + fontWeight: 800, + textAlign: 'center', + color: '#222', + marginTop: '4px', + marginBottom: '4px', + }} + > + {process.name} + </Box> + {/* Assuming AgentIcon is another component */} + <Box + sx={{ + display: 'flex', + alignItems: 'center', + width: '100%', + justifyContent: 'center', + flexWrap: 'wrap', + margin: '8px 0', + }} + > + {process.agents.map(agentName => ( + <AgentIcon + key={`outline.${process.name}.${agentName}`} + name={globalStorage.agentMap.get(agentName)?.icon ?? 'unknown'} + style={{ + width: '40px', + height: 'auto', + marginRight: '3px', + userSelect: 'none', + }} + tooltipInfo={globalStorage.agentMap.get(agentName)} + /> + ))} + </Box> + + {isFocusing && ( + <Box onClick={e => e.stopPropagation()}> + <Divider + sx={{ + margin: '5px 0px', + borderBottom: '2px dashed', // 设置为虚线 + borderColor: '#d4d4d4', + }} + /> + <EditableBox + text={process.content} + inputCallback={(text: string) => { + handleEditContent(process.id, text); + // handleEditStep(step.name, { ...step, task: text }); + }} + /> + </Box> + )} + </Box> + </Box> + ); + }, +); + +const Card: React.FC = React.memo(() => { + return <></>; // Replace with your component JSX +}); + +export default Card; diff --git a/frontend/src/components/Outline/D3Graph.tsx b/frontend/src/components/Outline/D3Graph.tsx new file mode 100644 index 0000000..61d7e74 --- /dev/null +++ b/frontend/src/components/Outline/D3Graph.tsx @@ -0,0 +1,241 @@ +// D3Graph.tsx +import React, { useState } from 'react'; + +export interface SvgLineProp { + x1: number; + y1: number; + x2: number; + y2: number; + type: string; + key: string; + stepTaskId: string; + stepName: string; + objectName: string; +} + +const getRefOffset = ( + child: React.RefObject<HTMLElement>, + grandParent: React.RefObject<HTMLElement>, +) => { + const offset = { top: 0, left: 0, width: 0, height: 0 }; + if (!child.current || !grandParent.current) { + return offset; + } + let node = child.current; + // Traverse up the DOM tree until we reach the grandparent or run out of elements + while (node && node !== grandParent.current) { + offset.top += node.offsetTop; + offset.left += node.offsetLeft; + // Move to the offset parent (the nearest positioned ancestor) + node = node.offsetParent as HTMLElement; + } + // If we didn't reach the grandparent, return null + if (node !== grandParent.current) { + return offset; + } + offset.width = child.current.offsetWidth; + offset.height = child.current.offsetHeight; + return offset; +}; +// 辅助函数来计算均值和最大值 +const calculateLineMetrics = ( + cardRect: Map< + string, + { + top: number; + left: number; + width: number; + height: number; + } + >, + prefix: string, +) => { + const filteredRects = Array.from(cardRect.entries()) + .filter(([key]) => key.startsWith(prefix)) + .map(([, rect]) => rect); + + return { + x: + filteredRects.reduce( + (acc, rect) => acc + (rect.left + 0.5 * rect.width), + 0, + ) / filteredRects.length, + y2: Math.max(...filteredRects.map(rect => rect.top + rect.height), 0), + }; +}; +interface D3GraphProps { + // objProCards_: ObjectProcessCardProps[]; + cardRefMap: Map<string, React.RefObject<HTMLElement>>; + relations: { + type: string; + stepTaskId: string; + stepCardName: string; + objectCardName: string; + }[]; + focusingStepId: string; + forceRender: number; +} + +const D3Graph: React.FC<D3GraphProps> = ({ + cardRefMap, + relations, + forceRender, + focusingStepId, +}) => { + const [svgLineProps, setSvgLineProps] = useState<SvgLineProp[]>([]); + const [objectLine, setObjectLine] = useState({ + x: 0, + y2: 0, + }); + const [processLine, setProcessLine] = useState({ + x: 0, + y2: 0, + }); + const cardRect = new Map< + string, + { top: number; left: number; width: number; height: number } + >(); + React.useEffect(() => { + const svgLines_ = relations + .filter(({ stepCardName, objectCardName }) => { + return cardRefMap.has(stepCardName) && cardRefMap.has(objectCardName); + }) + .map(({ type, stepTaskId, stepCardName, objectCardName }) => { + const stepRect = getRefOffset( + cardRefMap.get(stepCardName)!, + cardRefMap.get('root')!, + ); + cardRect.set(stepCardName, stepRect); + const objectRect = getRefOffset( + cardRefMap.get(objectCardName)!, + cardRefMap.get('root')!, + ); + cardRect.set(objectCardName, objectRect); + + return { + key: `${type}.${stepCardName}.${objectCardName}`, + stepTaskId, + stepName: stepCardName, + objectName: objectCardName, + type, + x1: objectRect.left + objectRect.width, + y1: objectRect.top + 0.5 * objectRect.height, + x2: stepRect.left, + y2: stepRect.top + 0.5 * stepRect.height, + }; + }); + const objectMetrics = calculateLineMetrics(cardRect, 'object'); + const processMetrics = calculateLineMetrics(cardRect, 'process'); + const maxY2 = Math.max(objectMetrics.y2, processMetrics.y2); + + setObjectLine({ ...objectMetrics, y2: maxY2 }); + setProcessLine({ ...processMetrics, y2: maxY2 }); + + setSvgLineProps(svgLines_); + }, [forceRender, focusingStepId, relations]); + + return ( + // <Box + // sx={{ + // width: '100%', + // height: '100%', + // position: 'absolute', + // zIndex: 1, + // }} + // > + <svg + style={{ + position: 'absolute', + width: '100%', + height: objectLine.y2 + 50, + zIndex: 1, + userSelect: 'none', + }} + > + <marker + id="arrowhead" + markerWidth="4" + markerHeight="4" + refX="2" + refY="2" + orient="auto" + markerUnits="strokeWidth" + > + <path d="M0,0 L4,2 L0,4 z" fill="#E5E5E5" /> + </marker> + <marker + id="starter" + markerWidth="4" + markerHeight="4" + refX="0" + refY="2" + orient="auto" + markerUnits="strokeWidth" + > + <path d="M0,0 L1,0 L1,4 L0,4 z" fill="#E5E5E5" /> + </marker> + + <g> + <text + x={objectLine.x} + y="15" + textAnchor="middle" + dominantBaseline="middle" + fill="#898989" + fontWeight="800" + > + Key Object + </text> + <line + x1={objectLine.x} + y1={30} + x2={objectLine.x} + y2={objectLine.y2 + 30} + stroke="#E5E5E5" + strokeWidth="8" + markerEnd="url(#arrowhead)" + markerStart="url(#starter)" + ></line> + <text + x={processLine.x} + y="15" + textAnchor="middle" + dominantBaseline="middle" + fill="#898989" + fontWeight="800" + > + Process + </text> + <line + x1={processLine.x} + y1={30} + x2={processLine.x} + y2={processLine.y2 + 30} + stroke="#E5E5E5" + strokeWidth="8" + markerEnd="url(#arrowhead)" + markerStart="url(#starter)" + ></line> + </g> + <g> + {svgLineProps.map(edgeValue => ( + <line + key={edgeValue.key} + x1={edgeValue.x1} + y1={edgeValue.y1} + x2={edgeValue.x2} + y2={edgeValue.y2} + strokeWidth="5" + stroke={edgeValue.type === 'output' ? '#FFCA8C' : '#B9DCB0'} + strokeOpacity={ + focusingStepId === edgeValue.stepTaskId ? '100%' : '20%' + } + ></line> + ))} + </g> + </svg> + // </Box> + ); +}; + +export default D3Graph; diff --git a/frontend/src/components/Outline/OutlineView.tsx b/frontend/src/components/Outline/OutlineView.tsx new file mode 100644 index 0000000..2c2cbc2 --- /dev/null +++ b/frontend/src/components/Outline/OutlineView.tsx @@ -0,0 +1,281 @@ +// 已移除对d3的引用 +import React, { useState } from 'react'; +import { observer } from 'mobx-react-lite'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import IconButton from '@mui/material/IconButton'; +import AddIcon from '@mui/icons-material/Add'; +import D3Graph from './D3Graph'; +import { ObjectCard, ProcessCard, EditObjectCard } from './Cards'; +import { RectWatcher } from './RectWatcher'; +import { globalStorage } from '@/storage'; + +export default observer(() => { + const { outlineRenderingStepTaskCards, focusingStepTaskId } = globalStorage; + const [renderCount, setRenderCount] = useState(0); + const [addObjectHover, setAddObjectHover] = useState(false); + const [isAddingObject, setIsAddingObject] = useState(false); + const [activeObjectAdd, setActiveObjectAdd] = useState(''); + const [activeProcessIdAdd, setactiveProcessIdAdd] = useState(''); + + const handleProcessClick = (processName: string) => { + if (processName === focusingStepTaskId) { + globalStorage.setFocusingStepTaskId(undefined); + } else { + globalStorage.setFocusingStepTaskId(processName); + } + }; + + const finishAddInitialObject = (objectName: string) => { + setIsAddingObject(false); + globalStorage.addUserInput(objectName); + }; + + const addInitialObject = () => setIsAddingObject(true); + + const handleObjectAdd = (objectName: string) => + setActiveObjectAdd(activeObjectAdd === objectName ? '' : objectName); + const handleProcessAdd = (processName: string) => + setactiveProcessIdAdd( + activeProcessIdAdd === processName ? '' : processName, + ); + + const cardRefMap = new Map<string, React.RefObject<HTMLElement>>(); + const getCardRef = (cardId: string) => { + if (cardRefMap.has(cardId)) { + return cardRefMap.get(cardId); + } else { + cardRefMap.set(cardId, React.createRef<HTMLElement>()); + return cardRefMap.get(cardId); + } + }; + + const handleEditContent = (stepTaskId: string, newContent: string) => { + globalStorage.setStepTaskContent(stepTaskId, newContent); + }; + const WidthRatio = ['30%', '15%', '52.5%']; + + const [cardRefMapReady, setCardRefMapReady] = React.useState(false); + + React.useEffect(() => { + setCardRefMapReady(true); + setRenderCount(old => (old + 1) % 10); + }, []); + + React.useEffect(() => { + if (activeObjectAdd !== '' && activeProcessIdAdd !== '') { + if ( + outlineRenderingStepTaskCards + .filter(({ id }) => id === activeProcessIdAdd)[0] + .inputs.includes(activeObjectAdd) + ) { + globalStorage.removeStepTaskInput(activeProcessIdAdd, activeObjectAdd); + } else { + globalStorage.addStepTaskInput(activeProcessIdAdd, activeObjectAdd); + } + // globalStorage.addStepTaskInput(activeProcessIdAdd, activeObjectAdd); + setActiveObjectAdd(''); + setactiveProcessIdAdd(''); + } + }, [activeObjectAdd, activeProcessIdAdd]); + + return ( + <Box + sx={{ + position: 'relative', + height: '100%', + overflow: 'auto', + }} + ref={getCardRef('root')} + onScroll={() => { + globalStorage.renderLines({ delay: 0, repeat: 2 }); + }} + > + <RectWatcher onRectChange={() => setRenderCount(old => (old + 1) % 10)}> + <Stack + sx={{ + position: 'absolute', + zIndex: 2, + paddingTop: '30px', + width: '100%', + }} + > + <Box + sx={{ + display: 'flex', + alignItems: 'center', + width: WidthRatio[0], + flexDirection: 'column', + justifyContent: 'center', + }} + > + {isAddingObject ? ( + <EditObjectCard finishEdit={finishAddInitialObject} /> + ) : ( + <Box + onMouseOver={() => setAddObjectHover(true)} + onMouseOut={() => setAddObjectHover(false)} + onClick={() => addInitialObject()} + sx={{ display: 'inline-flex', paddingTop: '6px' }} + > + <IconButton + sx={{ + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + padding: '0px', + borderRadius: 0, + border: '1px dotted #333', + + visibility: addObjectHover ? 'visible' : 'hidden', + }} + > + <AddIcon /> + </IconButton> + </Box> + )} + </Box> + + {globalStorage.userInputs.map(initialInput => ( + <Box key={initialInput} sx={{ display: 'flex' }}> + <Box + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + flex: `0 0 ${WidthRatio[0]}`, + }} + > + <ObjectCard + key={initialInput} + object={{ + name: initialInput, + cardRef: getCardRef(`object.${initialInput}`), + }} + // isAddActive={initialInput === activeObjectAdd} + isAddActive={activeProcessIdAdd !== ''} + {...(activeProcessIdAdd !== '' + ? { + addOrRemove: !outlineRenderingStepTaskCards + .filter(({ id }) => id === activeProcessIdAdd)[0] + .inputs.includes(initialInput), + } + : {})} + handleAddActive={handleObjectAdd} + /> + </Box> + </Box> + ))} + + {outlineRenderingStepTaskCards.map( + ({ id, name, output, agentIcons, agents, content, ref }, index) => ( + <Box + key={`stepTaskCard.${id}`} + sx={{ display: 'flex' }} + ref={ref} + > + <Box + sx={{ + display: 'flex', + alignItems: 'center', + width: WidthRatio[0], + justifyContent: 'center', + flex: `0 0 ${WidthRatio[0]}`, + }} + > + {output && ( + <ObjectCard + key={`objectCard.${output}`} + object={{ + name: output, + cardRef: getCardRef(`object.${output}`), + }} + // isAddActive={output === activeObjectAdd} + isAddActive={ + activeProcessIdAdd !== '' && + outlineRenderingStepTaskCards + .map(({ id }) => id) + .indexOf(activeProcessIdAdd) > index + } + {...(activeProcessIdAdd !== '' + ? { + addOrRemove: !outlineRenderingStepTaskCards + .filter(({ id }) => id === activeProcessIdAdd)[0] + .inputs.includes(output), + } + : {})} + handleAddActive={handleObjectAdd} + /> + )} + </Box> + <Box sx={{ flex: `0 0 ${WidthRatio[1]}` }} /> + <Box + sx={{ + // display: 'flex', + alignItems: 'center', + // width: WidthRatio[2], + justifyContent: 'center', + flex: `0 0 ${WidthRatio[2]}`, + }} + > + {name && ( + <ProcessCard + process={{ + id, + name, + icons: agentIcons, + agents, + content, + cardRef: getCardRef(`process.${name}`), + }} + handleProcessClick={handleProcessClick} + isFocusing={focusingStepTaskId === id} + isAddActive={id === activeProcessIdAdd} + handleAddActive={handleProcessAdd} + handleEditContent={handleEditContent} + /> + )} + </Box> + </Box> + ), + )} + </Stack> + </RectWatcher> + {cardRefMapReady && ( + <D3Graph + cardRefMap={cardRefMap} + focusingStepId={focusingStepTaskId || ''} + relations={outlineRenderingStepTaskCards + .map(({ id, name, inputs, output }) => { + const relations: { + type: string; + stepTaskId: string; + stepCardName: string; + objectCardName: string; + }[] = []; + inputs.forEach(input => { + relations.push({ + type: 'input', + stepTaskId: id, + stepCardName: `process.${name}`, + objectCardName: `object.${input}`, + }); + }); + if (output) { + relations.push({ + type: 'output', + stepTaskId: id, + stepCardName: `process.${name}`, + objectCardName: `object.${output}`, + }); + } + return relations; + }) + .flat()} + forceRender={renderCount} + /> + )} + </Box> + ); +}); diff --git a/frontend/src/components/Outline/RectWatcher.tsx b/frontend/src/components/Outline/RectWatcher.tsx new file mode 100644 index 0000000..a2fb978 --- /dev/null +++ b/frontend/src/components/Outline/RectWatcher.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import debounce from 'lodash/debounce'; + +// Define the props for the RectWatcher component +interface RectWatcherProps { + children: React.ReactNode; + onRectChange: (size: { height: number; width: number }) => void; + debounceDelay?: number; // Optional debounce delay with a default value +} + +// Rewrite the RectWatcher component with TypeScript +export const RectWatcher = React.memo<RectWatcherProps>( + ({ + children, + onRectChange, + debounceDelay = 10, // Assuming the delay is meant to be in milliseconds + }) => { + const [lastSize, setLastSize] = React.useState<{ + height: number; + width: number; + }>({ + height: -1, + width: -1, + }); + const ref = React.createRef<HTMLElement>(); // Assuming the ref is attached to a div element + + const debouncedHeightChange = React.useMemo( + () => + debounce((newSize: { height: number; width: number }) => { + if ( + newSize.height !== lastSize.height || + newSize.width !== lastSize.width + ) { + onRectChange(newSize); + setLastSize(newSize); + } + }, debounceDelay), + [onRectChange, debounceDelay, lastSize], + ); + + React.useEffect(() => { + if (ref.current) { + const resizeObserver = new ResizeObserver( + (entries: ResizeObserverEntry[]) => { + if (!entries.length) { + return; + } + const entry = entries[0]; + debouncedHeightChange({ + height: entry.contentRect.height, + width: entry.contentRect.width, + }); + }, + ); + resizeObserver.observe(ref.current); + return () => resizeObserver.disconnect(); + } + return () => undefined; + }, [debouncedHeightChange]); + + // Ensure children is a single React element + if ( + React.Children.count(children) !== 1 || + !React.isValidElement(children) + ) { + console.error('RectWatcher expects a single React element as children.'); + return <></>; + } + + // Clone the child element with the ref attached + return React.cloneElement(children, { ref } as any); + }, +); diff --git a/frontend/src/components/Outline/index.tsx b/frontend/src/components/Outline/index.tsx new file mode 100644 index 0000000..79f95df --- /dev/null +++ b/frontend/src/components/Outline/index.tsx @@ -0,0 +1,97 @@ +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import OutlineView from './OutlineView'; + +import Title from '@/components/Title'; +import LoadingMask from '@/components/LoadingMask'; +import { globalStorage } from '@/storage'; +import BranchIcon from '@/icons/BranchIcon'; + +export default observer(({ style = {} }: { style?: SxProps }) => { + const { + api: { planReady }, + } = globalStorage; + + return ( + <Box + sx={{ + position: 'relative', + background: '#FFF', + border: '3px solid #E1E1E1', + display: 'flex', + overflow: 'hidden', + flexDirection: 'column', + ...style, + }} + > + <Title title="Plan Outline" /> + <Box + sx={{ + position: 'relative', + height: 0, + flexGrow: 1, + overflowY: 'auto', + overflowX: 'hidden', + padding: '6px 12px', + }} + > + {planReady ? <OutlineView /> : <></>} + {globalStorage.api.planGenerating ? ( + <LoadingMask + style={{ + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }} + /> + ) : ( + <></> + )} + </Box> + {planReady ? ( + <Box + sx={{ + cursor: 'pointer', + userSelect: 'none', + position: 'absolute', + right: 0, + bottom: 0, + width: '36px', + height: '32px', + bgcolor: 'primary.main', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + borderRadius: '10px 0 0 0', + zIndex: 100, + '&:hover': { + filter: 'brightness(0.9)', + }, + }} + onClick={() => (globalStorage.planModificationWindow = true)} + > + <BranchIcon /> + <Box + component="span" + sx={{ + fontSize: '12px', + position: 'absolute', + right: '4px', + bottom: '2px', + color: 'white', + fontWeight: 800, + textAlign: 'right', + }} + > + {globalStorage.planManager.leaves.length} + </Box> + </Box> + ) : ( + <></> + )} + </Box> + ); +}); diff --git a/frontend/src/components/Outline/interface.tsx b/frontend/src/components/Outline/interface.tsx new file mode 100644 index 0000000..88fd462 --- /dev/null +++ b/frontend/src/components/Outline/interface.tsx @@ -0,0 +1,20 @@ +export interface ObjectProps { + name: string; + cardRef: any; +} +export interface ProcessProps { + id: string; + name: string; + icons: string[]; + agents: string[]; + cardRef: any; + content: string; +} +export interface ObjectProcessCardProps { + process: ProcessProps; + inputs: ObjectProps[]; + outputs: ObjectProps[]; + cardRef: any; + focusStep?: (stepId: string) => void; + focusing: boolean; +} diff --git a/frontend/src/components/PlanModification/PlanModificationSvg.tsx b/frontend/src/components/PlanModification/PlanModificationSvg.tsx new file mode 100644 index 0000000..7048a3b --- /dev/null +++ b/frontend/src/components/PlanModification/PlanModificationSvg.tsx @@ -0,0 +1,134 @@ +import React from 'react'; +import _ from 'lodash'; +import { observer } from 'mobx-react-lite'; +import { usePlanModificationContext } from './context'; +import { globalStorage } from '@/storage'; + +const getRefOffset = ( + child: React.RefObject<HTMLElement>, + grandParent: React.RefObject<HTMLElement>, +) => { + const offset = { top: 0, left: 0, width: 0, height: 0 }; + if (!child.current || !grandParent.current) { + return offset; + } + let node = child.current; + // Traverse up the DOM tree until we reach the grandparent or run out of elements + while (node && node !== grandParent.current) { + offset.top += node.offsetTop; + offset.left += node.offsetLeft; + // Move to the offset parent (the nearest positioned ancestor) + node = node.offsetParent as HTMLElement; + } + // If we didn't reach the grandparent, return null + if (node !== grandParent.current) { + return offset; + } + offset.width = child.current.offsetWidth; + offset.height = child.current.offsetHeight; + return offset; +}; + +const PlanModificationSvg = observer(() => { + const { + forestPaths, + whoIsAddingBranch, + nodeRefMap, + svgForceRenderCounter, + containerRef, + } = usePlanModificationContext(); + const { currentStepTaskNodeSet } = globalStorage; + const [nodeRectMap, setNodeRectMap] = React.useState( + new Map< + string, + { + top: number; + left: number; + width: number; + height: number; + } + >(), + ); + React.useEffect(() => { + if (containerRef) { + const nodeRectMap_ = new Map( + [...nodeRefMap].map(kv => { + return [kv[0], getRefOffset(kv[1], containerRef)]; + }), + ); + setNodeRectMap(nodeRectMap_); + } + }, [svgForceRenderCounter, whoIsAddingBranch]); + + const renderLine = (startid: string, endid: string) => { + const startRect = nodeRectMap.get(startid); + const endRect = nodeRectMap.get(endid); + if (!startRect || !endRect) { + return <></>; + } + let isCurrent = false; + if ( + currentStepTaskNodeSet.has(startid) && + currentStepTaskNodeSet.has(endid) + ) { + isCurrent = true; + } + if (startid === 'root' && currentStepTaskNodeSet.has(endid)) { + isCurrent = true; + } + // console.log(`line.${startid}${startRect.left}.${endid}${endRect.left}`); + return ( + <path + key={`line.${startid}${startRect.left}.${endid}${endRect.left}`} + d={`M ${startRect.left + 0.5 * startRect.width} ${ + startRect.top + 0.5 * startRect.height + } + C ${startRect.left + startRect.width * 0.5} ${ + endRect.top + 0.5 * endRect.height + }, + ${endRect.left} ${endRect.top + 0.5 * endRect.height}, + ${endRect.left} ${endRect.top + 0.5 * endRect.height}`} + fill="none" + stroke={isCurrent ? '#4a9c9e' : '#D9D9D9'} + strokeWidth="6" + ></path> + ); + }; + const renderRoot = () => { + const rootRect = nodeRectMap.get('root'); + if (rootRect && forestPaths.length > 0) { + return ( + <circle + key={`root${rootRect.left}`} + cx={rootRect.left + 0.5 * rootRect.width} + cy={rootRect.top + 0.5 * rootRect.height} + r="10" + fill="#4a9c9e" + /> + ); + } + return <></>; + }; + return ( + <svg + style={{ + position: 'absolute', + top: 0, + left: 0, + // backgroundColor: 'red', + width: _.max( + [...nodeRectMap.values()].map(rect => rect.left + rect.width), + ), + height: _.max( + [...nodeRectMap.values()].map(rect => rect.top + rect.height), + ), + }} + > + {forestPaths.map(pair => renderLine(pair[0], pair[1]))} + {renderRoot()} + {whoIsAddingBranch && renderLine(whoIsAddingBranch, 'requirement')} + </svg> + ); +}); + +export default PlanModificationSvg; diff --git a/frontend/src/components/PlanModification/context.tsx b/frontend/src/components/PlanModification/context.tsx new file mode 100644 index 0000000..513c4e6 --- /dev/null +++ b/frontend/src/components/PlanModification/context.tsx @@ -0,0 +1,195 @@ +// PlanModificationContext.tsx +import React, { + ReactNode, + RefObject, + createContext, + useContext, + useState, + useEffect, +} from 'react'; +import { IPlanTreeNode, globalStorage } from '@/storage'; + +interface PlanModificationContextProps { + forest: IPlanTreeNode | undefined; + setForest: (forest: IPlanTreeNode) => void; + forestPaths: [string, string][]; + setForestPaths: (paths: [string, string][]) => void; + + whoIsAddingBranch: string | undefined; + setWhoIsAddingBranch: (whoIsAddingBranch: string | undefined) => void; + updateWhoIsAddingBranch: (whoIsAddingBranch: string | undefined) => void; + + containerRef: React.RefObject<HTMLElement> | undefined; + setContainerRef: (containerRef: React.RefObject<HTMLElement>) => void; + nodeRefMap: Map<string, RefObject<HTMLElement>>; + updateNodeRefMap: (key: string, value: RefObject<HTMLElement>) => void; + + baseNodeSet: Set<string>; + setBaseNodeSet: (baseNodeSet: Set<string>) => void; + baseLeafNodeId: string | undefined; + setBaseLeafNodeId: (baseLeafNodeId: string | undefined) => void; + + handleRequirementSubmit: (requirement: string, number: number) => void; + handleNodeClick: (nodeId: string) => void; + + handleNodeHover: (nodeId: string | undefined) => void; + + svgForceRenderCounter: number; + setSVGForceRenderCounter: (n: number) => void; + svgForceRender: () => void; +} + +const PlanModificationContext = createContext<PlanModificationContextProps>( + {} as PlanModificationContextProps, +); + +export const usePlanModificationContext = () => + useContext(PlanModificationContext); + +export const PlanModificationProvider: React.FC<{ children: ReactNode }> = ({ + children, +}) => { + const [forest, setForest] = useState<IPlanTreeNode>(); + const [forestPaths, setForestPaths] = useState<[string, string][]>([]); + + useEffect(() => { + if (forest) { + setForestPaths(_getFatherChildrenIdPairs(forest)); + } + }, [forest]); + + const [whoIsAddingBranch, setWhoIsAddingBranch] = useState< + string | undefined + >(undefined); + const updateWhoIsAddingBranch = (whoId: string | undefined) => { + if (whoId === whoIsAddingBranch) { + setWhoIsAddingBranch(undefined); + } else { + setWhoIsAddingBranch(whoId); + } + }; + const [containerRef, setContainerRef] = React.useState< + React.RefObject<HTMLElement> | undefined + >(undefined); + const [baseNodeSet, setBaseNodeSet] = React.useState<Set<string>>( + new Set<string>(), + ); + const [baseLeafNodeId, setBaseLeafNodeId] = React.useState< + string | undefined + >(undefined); + const [nodeRefMap] = React.useState( + new Map<string, RefObject<HTMLElement>>(), + ); + const updateNodeRefMap = (key: string, value: RefObject<HTMLElement>) => { + nodeRefMap.set(key, value); + }; + + const handleRequirementSubmit = (requirement: string, number: number) => { + if (whoIsAddingBranch) { + const start = + whoIsAddingBranch === 'root' ? undefined : whoIsAddingBranch; + globalStorage.newPlanBranch(start, requirement, number, baseLeafNodeId); + setWhoIsAddingBranch(undefined); + setBaseNodeSet(new Set()); + setBaseLeafNodeId(undefined); + } + }; + const handleNodeClick = (nodeId: string) => { + const leafId = globalStorage.getFirstLeafStepTask(nodeId).id; + if (whoIsAddingBranch) { + if (baseLeafNodeId === leafId) { + setBaseNodeSet(new Set()); + setBaseLeafNodeId(undefined); + } else { + const pathNodeSet = new Set(globalStorage.getStepTaskLeafPath(leafId)); + if ( + pathNodeSet.has(whoIsAddingBranch) || + whoIsAddingBranch === 'root' + ) { + setBaseLeafNodeId(leafId); + setBaseNodeSet(pathNodeSet); + } + } + } else { + globalStorage.setCurrentPlanBranch(leafId); + globalStorage.setFocusingStepTaskId(nodeId); + } + }; + + const [svgForceRenderCounter, setSVGForceRenderCounter] = useState(0); + const svgForceRender = () => { + setSVGForceRenderCounter((svgForceRenderCounter + 1) % 100); + }; + + const handleNodeHover = (nodeId: string | undefined) => { + if (!whoIsAddingBranch) { + if (nodeId) { + const leafNode = globalStorage.getFirstLeafStepTask(nodeId); + const branchInfo = globalStorage.planManager.branches[leafNode.id]; + if (branchInfo.base) { + const pathNodeSet = new Set( + globalStorage.getStepTaskLeafPath(branchInfo.base), + ); + setBaseNodeSet(pathNodeSet); + } + } else { + setBaseNodeSet(new Set()); + } + } + }; + + useEffect(() => { + setBaseNodeSet(new Set()); + setBaseLeafNodeId(undefined); + }, [whoIsAddingBranch]); + + useEffect(() => { + svgForceRender(); + }, [forest, whoIsAddingBranch]); + + return ( + <PlanModificationContext.Provider + value={{ + forest, + setForest, + forestPaths, + setForestPaths, + + whoIsAddingBranch, + setWhoIsAddingBranch, + updateWhoIsAddingBranch, + + containerRef, + setContainerRef, + nodeRefMap, + updateNodeRefMap, + + baseNodeSet, + setBaseNodeSet, + baseLeafNodeId, + setBaseLeafNodeId, + + handleRequirementSubmit, + handleNodeClick, + handleNodeHover, + + svgForceRenderCounter, + setSVGForceRenderCounter, + svgForceRender, + }} + > + {children} + </PlanModificationContext.Provider> + ); +}; + +// ---------------------------------------------------------------- +const _getFatherChildrenIdPairs = (node: IPlanTreeNode): [string, string][] => { + let pairs: [string, string][] = []; + // 对于每个子节点,添加 (父ID, 子ID) 对,并递归调用函数 + node.children.forEach(child => { + pairs.push([node.id, child.id]); + pairs = pairs.concat(_getFatherChildrenIdPairs(child)); + }); + return pairs; +}; diff --git a/frontend/src/components/PlanModification/index.tsx b/frontend/src/components/PlanModification/index.tsx new file mode 100644 index 0000000..c6f87a1 --- /dev/null +++ b/frontend/src/components/PlanModification/index.tsx @@ -0,0 +1,445 @@ +/* eslint-disable max-lines */ + +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import AddIcon from '@mui/icons-material/Add'; +import RemoveIcon from '@mui/icons-material/Remove'; +import IconButton from '@mui/material/IconButton'; +import Paper from '@mui/material/Paper'; +import InputBase from '@mui/material/InputBase'; +// import SendIcon from '@mui/icons-material/Send'; +import { observer } from 'mobx-react-lite'; +import CircularProgress from '@mui/material/CircularProgress'; +import AgentIcon from '../AgentIcon'; +import PlanModificationSvg from './PlanModificationSvg'; +import { + PlanModificationProvider, + usePlanModificationContext, +} from './context'; +import { IPlanTreeNode, globalStorage } from '@/storage'; +import SendIcon from '@/icons/sendIcon'; + +const RequirementNoteNode: React.FC<{ + data: { + text: string; + }; + style?: SxProps; +}> = ({ data, style }) => { + return ( + <Box sx={{ ...style, flexShrink: 0 }}> + <Box + sx={{ + color: '#ACACAC', + userSelect: 'none', + // width: 'max-content', + minWidth: '250px', + }} + > + {data.text} + </Box> + </Box> + ); +}; + +const RequirementInputNode: React.FC<{ + style?: SxProps; +}> = ({ style }) => { + const { handleRequirementSubmit, updateNodeRefMap } = + usePlanModificationContext(); + const [number, setNumber] = React.useState(1); + const myRef = React.useRef<HTMLElement>(null); + React.useEffect(() => { + updateNodeRefMap('requirement', myRef); + }, []); + // const handleWheel = (event: any) => { + // // 向上滚动时减少数字,向下滚动时增加数字 + // if (event.deltaY < 0) { + // setNumber(prevNumber => prevNumber + 1); + // } else { + // setNumber(prevNumber => Math.max(1, prevNumber - 1)); + // } + // }; + + const handleSubmit = () => { + handleRequirementSubmit(textValue, number); + }; + const [textValue, setTextValue] = React.useState(''); + return ( + <Box + sx={{ + ...style, + }} + ref={myRef} + > + <Paper + sx={{ + p: '0px', + display: 'flex', + alignItems: 'center', + width: 250, + backgroundColor: 'white', + boxShadow: 'none', + border: '2px solid #b0b0b0', + borderRadius: '8px', + }} + > + <InputBase + sx={{ marginLeft: 1, flex: 1, backgroundColor: 'white' }} + placeholder="Add Branch" + onChange={e => { + setTextValue(e.target.value); + }} + onKeyDown={e => { + if (e.key === 'ArrowUp') { + setNumber(prevNumber => prevNumber + 1); + } else if (e.key === 'ArrowDown') { + setNumber(prevNumber => Math.max(1, prevNumber - 1)); + } + }} + /> + <Box + sx={{ + display: 'flex', + flexDirection: 'row', + alignItems: 'flex-end', + height: '100%', + }} + > + <IconButton + type="submit" + sx={{ + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + padding: '0px', + }} + onClick={handleSubmit} + > + <SendIcon color="#b6b6b6" /> + </IconButton> + <Box + sx={{ + height: 'min-content', + paddingLeft: '4px', + paddingRight: '4px', + cursor: 'pointer', // 提示用户可以与之互动 + }} + > + <Box component="span" sx={{ fontSize: '0.5em' }}> + X + </Box> + <Box component="span" sx={{ fontSize: '1em' }}> + {number} + </Box> + </Box> + </Box> + </Paper> + </Box> + ); +}; +const RootNode: React.FC<{ + style?: SxProps; +}> = ({ style }) => { + const { updateNodeRefMap, updateWhoIsAddingBranch, whoIsAddingBranch } = + usePlanModificationContext(); + const [onHover, setOnHover] = React.useState(false); + const myRef = React.useRef<HTMLElement>(null); + React.useEffect(() => { + updateNodeRefMap('root', myRef); + }, []); + return ( + <Box + onMouseOver={() => setOnHover(true)} + onMouseOut={() => setOnHover(false)} + sx={{ ...style, flexDirection: 'column', position: 'relative' }} + ref={myRef} + > + <IconButton + sx={{ + position: 'absolute', + left: '50%', + top: '50%', + transform: 'translateX(-50%) ', + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + visibility: + onHover || whoIsAddingBranch === 'root' ? 'visible' : 'hidden', + padding: '0px', + borderRadius: '50%', + border: '1px dotted #333', + height: '16px', + width: '16px', + marginTop: '-6px', + '& .MuiSvgIcon-root': { + fontSize: '14px', + }, + }} + onClick={() => updateWhoIsAddingBranch('root')} + > + {whoIsAddingBranch !== 'root' ? <AddIcon /> : <RemoveIcon />} + </IconButton> + </Box> + ); +}; + +const Node: React.FC<{ + node: IPlanTreeNode; + style?: SxProps; +}> = ({ node, style = {} }) => { + const { + updateNodeRefMap, + whoIsAddingBranch, + updateWhoIsAddingBranch, + handleNodeClick, + handleNodeHover, + baseNodeSet, + } = usePlanModificationContext(); + const [onHover, setOnHover] = React.useState(false); + const myRef = React.useRef<HTMLElement>(null); + React.useEffect(() => { + updateNodeRefMap(node.id, myRef); + }, []); + return ( + // <RectWatcher onRectChange={onRectChange}> + <Box sx={{ ...style }}> + <Box + onMouseOver={() => { + setOnHover(true); + handleNodeHover(node.id); + }} + onMouseOut={() => { + setOnHover(false); + handleNodeHover(undefined); + }} + sx={{ + flexDirection: 'column', + backgroundColor: '#F6F6F6', + border: node.focusing ? '2px solid #4A9C9E' : '2px solid #E5E5E5', + borderRadius: '12px', + maxWidth: '140px', + minWidth: '100px', + position: 'relative', + padding: '8px 6px', + boxShadow: baseNodeSet.has(node.id) ? '0 0 10px 5px #43b2aa' : '', + }} + ref={myRef} + onClick={() => handleNodeClick(node.id)} + > + <Box sx={{ textAlign: 'center', fontWeight: 600, marginBottom: '4px' }}> + {node.name} + </Box> + <Box + sx={{ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + }} + > + {node.focusing && + node.agents.map(agentName => ( + <AgentIcon + key={`planModification.${node.id}.${agentName}`} + name={globalStorage.agentMap.get(agentName)?.icon ?? 'unknown'} + style={{ + width: '36px', + height: 'auto', + margin: '0px', + userSelect: 'none', + }} + tooltipInfo={globalStorage.agentMap.get(agentName)} + /> + ))} + </Box> + <Box + sx={{ + position: 'absolute', + left: '50%', + top: '100%', + transform: 'translateX(-50%) translateY(-50%)', + }} + > + <IconButton + sx={{ + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + visibility: + onHover || whoIsAddingBranch === node.id ? 'visible' : 'hidden', + padding: '0px', + borderRadius: '50%', + border: '1px dotted #333', + height: '16px', + width: '16px', + marginTop: '-6px', + '& .MuiSvgIcon-root': { + fontSize: '14px', + }, + }} + onClick={() => { + updateWhoIsAddingBranch(node.id); + }} + > + {whoIsAddingBranch !== node.id ? <AddIcon /> : <RemoveIcon />} + </IconButton> + </Box> + </Box> + </Box> + ); +}; + +const Tree: React.FC<{ + tree: IPlanTreeNode; +}> = ({ tree }) => { + const { whoIsAddingBranch } = usePlanModificationContext(); + + const generalNodeStyle = { + height: '60px', + padding: '8px', + display: 'flex', + alignItems: 'center', + margin: '8px 32px 8px 0px', + }; + const focusedNodeStyle = { + height: '80px', + padding: '8px', + display: 'flex', + alignItems: 'center', + margin: '8px 32px 8px 0px', + }; + + return ( + <Box sx={{ display: 'flex', flexDirection: 'row', zIndex: 999 }}> + <> + {tree.id !== 'root' && ( + <Node + node={tree} + style={{ + justifyContent: 'center', + alignSelf: 'flex-start', + cursor: 'pointer', + ...(tree.focusing ? focusedNodeStyle : generalNodeStyle), + }} + /> + )} + {tree.id === 'root' && ( + <RootNode + style={{ + justifyContent: 'center', + ...(tree.children[0] && tree.children[0].focusing + ? focusedNodeStyle + : generalNodeStyle), + }} + /> + )} + </> + <> + <Box + sx={{ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + }} + > + {tree.id !== 'root' && tree.leaf && ( + <RequirementNoteNode + data={{ text: tree.requirement || '' }} + style={{ ...generalNodeStyle }} + /> + )} + + {tree.children.map(childTree => ( + <Tree key={`taskTree-${childTree.id}`} tree={childTree} /> + ))} + {tree.id === whoIsAddingBranch && ( + <RequirementInputNode + style={{ height: '80px', display: 'flex', alignItems: 'center' }} + /> + )} + </Box> + </> + </Box> + ); +}; + +interface IPlanModificationProps { + style?: SxProps; + resizeSignal?: number; +} + +const TheViewContent = observer( + ({ style, resizeSignal }: IPlanModificationProps) => { + const { renderingPlanForest } = globalStorage; + const { forest, setForest, setContainerRef, svgForceRender } = + usePlanModificationContext(); + const myRef = React.useRef<HTMLElement>(null); + + React.useEffect(() => { + setForest({ + agentIcons: [], + agents: [], + children: renderingPlanForest, + id: 'root', + leaf: false, + name: 'root', + focusing: true, + }); + }, [renderingPlanForest]); + + React.useEffect(() => { + setContainerRef(myRef); + }, []); + + React.useEffect(() => { + svgForceRender(); + }, [resizeSignal]); + + return ( + <Box + sx={{ + backgroundColor: 'white', + position: 'relative', + overflowY: 'auto', + overflowX: 'auto', + padding: '4px 6px', + userSelect: 'none', + ...style, + }} + ref={myRef} + > + {myRef.current && <PlanModificationSvg />} + {forest && <Tree tree={forest} />} + </Box> + ); + }, +); +/* eslint-enable max-lines */ + +const PlanModification: React.FC<IPlanModificationProps> = observer( + ({ style, resizeSignal }) => { + return ( + <PlanModificationProvider> + <TheViewContent style={style} resizeSignal={resizeSignal} /> + {globalStorage.api.stepTaskTreeGenerating && ( + <Box + sx={{ + position: 'absolute', + bottom: '10px', + right: '20px', + zIndex: 999, + }} + > + <CircularProgress size={40} /> + </Box> + )} + </PlanModificationProvider> + ); + }, +); + +export default PlanModification; diff --git a/frontend/src/components/ProcessDiscription/AgentDetailCard.tsx b/frontend/src/components/ProcessDiscription/AgentDetailCard.tsx new file mode 100644 index 0000000..5213490 --- /dev/null +++ b/frontend/src/components/ProcessDiscription/AgentDetailCard.tsx @@ -0,0 +1,178 @@ +import React from 'react'; +import { observer } from 'mobx-react-lite'; +import Box from '@mui/material/Box'; +// import EditIcon from '@mui/icons-material/Edit'; +import TextField from '@mui/material/TextField'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; +import { IRichSentence } from '@/storage/plan'; +import { globalStorage } from '@/storage'; + +interface IAgentDetailCardProps { + id: string; + node: IRichSentence; + render: () => void; +} + +export default observer(({ id, node, render }: IAgentDetailCardProps) => { + const editContentRef = React.useRef(''); + const [edit, setEdit] = React.useState(false); + React.useEffect(() => { + render(); + }, [edit]); + + return ( + <Box + component="span" + sx={{ + cursor: 'pointer', + marginRight: '4px', + userSelect: 'none', + transition: 'all 200ms ease-out', + borderRadius: '0', + display: edit ? 'flex' : 'inline', + flexDirection: 'column', + border: edit ? '2px solid' : undefined, + '& .edit-button': { + display: 'none', + }, + '&:hover': { + filter: edit ? undefined : 'brightness(1.1)', + backgroundColor: edit + ? undefined + : ((node?.style ?? { borderColor: '#0003' }) as any)!.borderColor, + '& .edit-button': { + display: edit ? 'none' : 'inline-flex', + }, + }, + '&:active': { + filter: edit ? undefined : 'brightness(1)', + backgroundColor: edit + ? undefined + : ((node?.style ?? { borderColor: '#0003' }) as any)!.borderColor, + }, + lineHeight: '1.4rem', + padding: edit ? '6px' : undefined, + marginBottom: edit ? '6px' : undefined, + marginTop: edit ? '6px' : undefined, + borderBottom: `2px solid ${(node.style as any).borderColor}`, + backgroundImage: edit + ? 'linear-gradient(0deg, #FFF7, #FFF7)' + : undefined, + ...(edit ? node.whoStyle ?? {} : node.style), + }} + onDoubleClick={() => { + editContentRef.current = node.content; + setEdit(true); + }} + title="Double click to edit" + > + <Box + component="span" + sx={{ + userSelect: 'none', + padding: edit ? '0 6px' : '0 2px', + borderRadius: '14px', + border: '2px solid #0005', + transition: 'filter 100ms', + fontWeight: edit ? 800 : undefined, + ...node.whoStyle, + }} + > + {node.who} + </Box> + {edit ? ( + <> + <TextField + variant="outlined" + multiline + inputRef={ref => { + if (ref) { + ref.value = editContentRef.current; + } + }} + sx={{ + '& > .MuiInputBase-root': { + padding: '6px', + '& > fieldset': { + border: 'none', + }, + background: '#FFF8', + borderRadius: '12px', + }, + borderRadius: '12px', + border: '2px solid #0002', + marginTop: '4px', + '*': { + fontSize: '14px', + }, + }} + onChange={event => (editContentRef.current = event.target.value)} + /> + <Box + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'end', + paddingTop: '4px', + }} + > + <Box + onClick={() => { + if (!editContentRef.current) { + return; + } + setEdit(false); + const t = editContentRef.current; + globalStorage.updateAgentActionNodeContent( + id, + t[0].toUpperCase() + t.slice(1), + ); + }} + title="Save change" + sx={{ + cursor: 'pointer', + userSelect: 'none', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#3ec807', + borderRadius: '6px', + marginLeft: '4px', + padding: '0 4px', + '&:hover': { + filter: 'contrast(1.3)', + }, + }} + > + <CheckIcon sx={{ fontSize: '18px', color: 'white' }} /> + </Box> + <Box + onClick={() => setEdit(false)} + title="Cancel change" + sx={{ + cursor: 'pointer', + userSelect: 'none', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#d56464', + borderRadius: '6px', + marginLeft: '4px', + padding: '0 4px', + '&:hover': { + filter: 'contrast(1.3)', + }, + }} + > + <CloseIcon sx={{ fontSize: '18px', color: 'white' }} /> + </Box> + </Box> + </> + ) : ( + // <> {node.content}</> + <span> {node.content}</span> + )} + </Box> + ); +}); diff --git a/frontend/src/components/ProcessDiscription/DescriptionCard.tsx b/frontend/src/components/ProcessDiscription/DescriptionCard.tsx new file mode 100644 index 0000000..4328c61 --- /dev/null +++ b/frontend/src/components/ProcessDiscription/DescriptionCard.tsx @@ -0,0 +1,184 @@ +import React from 'react'; +import throttle from 'lodash/throttle'; +import { observer } from 'mobx-react-lite'; +import Box from '@mui/material/Box'; +import AgentDetailCard from './AgentDetailCard'; +import { globalStorage } from '@/storage'; +import { StepTaskNode } from '@/storage/plan'; +import { useResize } from '@/utils/resize-hook'; +import BranchIcon from '@/icons/BranchIcon'; + +export default observer(({ step }: { step: StepTaskNode }) => { + const card = step.descriptionCard; + const [expand, setExpand] = React.useState(false); + const expandRef = React.useRef(expand); + React.useEffect(() => { + globalStorage.renderLines({ delay: 1, repeat: 20 }); + }, [expand]); + const render = React.useMemo( + () => + throttle( + () => + requestAnimationFrame(() => { + if (refDetail.current) { + refDetail.current.style.height = expandRef.current + ? `${ + refDetail.current.querySelector('.description-detail')! + .scrollHeight + 12 + }px` + : '0px'; + } + }), + 5, + { + leading: false, + trailing: true, + }, + ), + [], + ); + React.useEffect(() => { + expandRef.current = expand; + render(); + }, [expand]); + React.useEffect(() => { + setExpand(globalStorage.focusingStepTaskId === step.id); + }, [globalStorage.focusingStepTaskId]); + const refDetail = useResize<HTMLDivElement>(render); + return ( + <Box sx={{ position: 'relative' }}> + <Box + sx={{ + position: 'relative', + fontSize: '14px', + flexDirection: 'column', + background: '#F6F6F6', + borderRadius: '8px', + padding: '8px 4px', + margin: '2px 0', + cursor: 'pointer', + border: '2px solid #E5E5E5', + transition: 'all 80ms ease-in-out', + '&:hover': { + border: '2px solid #cdcdcd', + backgroundImage: 'linear-gradient(0, #00000008, #00000008)', + }, + display: step.brief.template ? 'flex' : 'none', + }} + ref={card.ref} + onClick={() => globalStorage.setFocusingStepTaskId(step.id)} + > + <Box sx={{ marginLeft: '4px' }}> + {card.brief.map(({ text, style }, index) => + style ? ( + <Box + component="span" + // eslint-disable-next-line react/no-array-index-key + key={index} + sx={{ + userSelect: 'none', + padding: '0 4px', + fontWeight: 600, + transition: 'filter 100ms', + ...style, + }} + > + {text} + </Box> + ) : ( + <Box + component="span" + key={index} + sx={{ userSelect: 'none', lineHeight: '1.43rem' }} + > + {text} + </Box> + ), + )} + </Box> + <Box + ref={refDetail} + sx={{ + overflow: 'hidden', + transition: 'height 200ms ease-out', // 添加过渡效果 + }} + > + {expand ? ( + <Box + sx={{ + marginTop: '5px', + borderRadius: '12px', + padding: '4px 8px', + background: '#E4F0F0', + border: '3px solid #A9C6C5', + cursor: 'auto', + }} + className="description-detail" + > + <Box + sx={{ + color: '#4F8A87', + fontWeight: 800, + fontSize: '16px', + marginBottom: '4px', + }} + > + Specification: + </Box> + {card.detail.map((node, index) => ( + <AgentDetailCard + key={index} + node={node[0] as any} + id={node[1] as any} + render={render} + /> + ))} + </Box> + ) : ( + <></> + )} + </Box> + </Box> + {globalStorage.focusingStepTaskId === step.id ? ( + <Box + sx={{ + cursor: 'pointer', + userSelect: 'none', + position: 'absolute', + right: '-4px', + bottom: '2px', + width: '32px', + height: '32px', + bgcolor: 'primary.main', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + borderRadius: '10px 0 0 0', + '&:hover': { + filter: 'brightness(0.9)', + }, + }} + onClick={() => (globalStorage.taskProcessModificationWindow = true)} + > + <BranchIcon /> + <Box + component="span" + sx={{ + fontSize: '12px', + position: 'absolute', + right: '3px', + bottom: 0, + color: 'white', + fontWeight: 800, + textAlign: 'right', + }} + > + {step.agentSelection?.leaves?.length ?? 0} + </Box> + </Box> + ) : ( + <></> + )} + </Box> + ); +}); diff --git a/frontend/src/components/ProcessDiscription/index.tsx b/frontend/src/components/ProcessDiscription/index.tsx new file mode 100644 index 0000000..3757932 --- /dev/null +++ b/frontend/src/components/ProcessDiscription/index.tsx @@ -0,0 +1,57 @@ +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import DescriptionCard from './DescriptionCard'; +import { globalStorage } from '@/storage'; +import LoadingMask from '@/components/LoadingMask'; +import Title from '@/components/Title'; + +export default observer(({ style = {} }: { style?: SxProps }) => { + return ( + <Box + sx={{ + background: '#FFF', + border: '3px solid #E1E1E1', + display: 'flex', + overflow: 'hidden', + flexDirection: 'column', + ...style, + }} + > + <Title title="Task Process" /> + <Stack + spacing={1} + sx={{ + position: 'relative', + padding: '6px 12px', + paddingBottom: '44px', + borderRadius: '10px', + height: 0, + flexGrow: 1, + overflowY: 'auto', + }} + onScroll={() => { + globalStorage.renderLines({ delay: 0, repeat: 2 }); + }} + > + {globalStorage.planManager.currentPlan.map(step => ( + <DescriptionCard key={step.name} step={step} /> + ))} + {globalStorage.api.planGenerating ? ( + <LoadingMask + style={{ + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }} + /> + ) : ( + <></> + )} + </Stack> + </Box> + ); +}); diff --git a/frontend/src/components/ProcessRehearsal/ObjectNode.tsx b/frontend/src/components/ProcessRehearsal/ObjectNode.tsx new file mode 100644 index 0000000..c90e7ce --- /dev/null +++ b/frontend/src/components/ProcessRehearsal/ObjectNode.tsx @@ -0,0 +1,286 @@ +import React from 'react'; +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import EditIcon from '@mui/icons-material/Edit'; +import TextField from '@mui/material/TextField'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; +import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; +import UnfoldLessIcon from '@mui/icons-material/UnfoldLess'; +import MarkdownBlock from '@/components/MarkdownBlock'; +import { globalStorage } from '@/storage'; + +export interface IObjectNodeProps { + name: string; + content: string; + _ref?: React.RefObject<HTMLDivElement | HTMLElement>; + style?: SxProps; + editObjectName?: string; + stepId: string; + handleExpand?: () => void; +} + +export default observer( + ({ + style = {}, + name, + content, + _ref, + editObjectName, + stepId, + handleExpand, + }: IObjectNodeProps) => { + const inputStringRef = React.useRef<string>(''); + const [edit, setEdit] = React.useState(false); + const [expand, setExpand] = React.useState(false); + const refDetail = React.useRef<HTMLDivElement>(null); + // 使用useEffect来更新detail容器的高度 + React.useEffect(() => { + if (refDetail.current) { + refDetail.current.style.height = expand + ? `${refDetail.current.scrollHeight}px` + : '0px'; + } + if (handleExpand) { + let count = 0; + const intervalId = setInterval(() => { + handleExpand(); + count++; + if (count >= 20) { + clearInterval(intervalId); + } + }, 10); + } + }, [expand]); + return ( + <Box + sx={{ + userSelect: 'none', + borderRadius: '8px', + background: '#F6F6F6', + padding: '10px', + border: '2px solid #E5E5E5', + fontSize: '14px', + position: 'relative', + ...(stepId + ? { + cursor: 'pointer', + transition: 'all 200ms ease-in-out', + '&:hover': { + border: '2px solid #0002', + backgroundImage: 'linear-gradient(0, #0000000A, #0000000A)', + }, + } + : {}), + ...style, + }} + ref={_ref} + onClick={() => { + if (stepId) { + globalStorage.setFocusingStepTaskId(stepId); + } + }} + > + <Box component="span" sx={{ fontWeight: 800 }}> + {name} + </Box> + {content && !editObjectName ? ( + <Box + ref={refDetail} + sx={{ + overflow: 'hidden', + transition: 'height 200ms ease-out', // 添加过渡效果 + }} + > + {expand ? ( + <MarkdownBlock + text={content} + style={{ + marginTop: '5px', + borderRadius: '6px', + padding: '4px', + background: '#E6E6E6', + fontSize: '12px', + maxHeight: '240px', + overflowY: 'auto', + border: '1px solid #0003', + whiteSpace: 'pre-wrap', + wordWrap: 'break-word', + marginBottom: '0', + }} + /> + ) : ( + <></> + )} + <Box + onClick={e => { + setExpand(v => !v); + e.stopPropagation(); + }} + sx={{ + position: 'absolute', + right: '18px', + bottom: '14px', + cursor: 'pointer', + userSelect: 'none', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#0002', + borderRadius: '8px', + marginLeft: '4px', + padding: '0 4px', + '&:hover': { + background: '#0003', + }, + }} + > + {expand ? ( + <UnfoldLessIcon + sx={{ fontSize: '16px', transform: 'rotate(90deg)' }} + /> + ) : ( + <MoreHorizIcon sx={{ fontSize: '16px' }} /> + )} + </Box> + </Box> + ) : ( + <></> + )} + {editObjectName ? ( + <Box sx={{ position: 'relative' }}> + {edit ? ( + <> + <TextField + fullWidth + multiline + rows={1} + inputRef={ele => { + if (ele) { + ele.value = inputStringRef.current; + } + }} + onChange={event => + (inputStringRef.current = event.target.value) + } + size="small" + sx={{ + fontSize: '12px', + paddingTop: '10px', + paddingBottom: '10px', + borderRadius: '10px', + border: 'none !important', + borderBottom: 'none !important', + '&::before': { + borderBottom: 'none !important', + border: 'none !important', + }, + '& > .MuiInputBase-root': { + border: 'none', + background: '#0001', + '& > .MuiOutlinedInput-notchedOutline': { + border: 'none !important', + }, + }, + }} + /> + <Box + onClick={() => { + setEdit(false); + globalStorage.form.inputs[editObjectName] = + inputStringRef.current; + }} + sx={{ + position: 'absolute', + right: '8px', + bottom: '2px', + cursor: 'pointer', + userSelect: 'none', + height: '18px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + backdropFilter: 'contrast(0.6)', + borderRadius: '3px', + marginLeft: '4px', + }} + > + <CheckIcon sx={{ fontSize: '18px', color: '#1d7d09' }} /> + </Box> + <Box + onClick={() => setEdit(false)} + sx={{ + position: 'absolute', + right: '34px', + bottom: '2px', + cursor: 'pointer', + userSelect: 'none', + height: '18px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + backdropFilter: 'contrast(0.6)', + borderRadius: '3px', + marginLeft: '4px', + }} + > + <CloseIcon sx={{ fontSize: '18px', color: '#8e0707' }} /> + </Box> + </> + ) : ( + <> + <MarkdownBlock + text={globalStorage.form.inputs[editObjectName]} + style={{ + marginTop: '5px', + borderRadius: '6px', + padding: '4px', + background: '#E6E6E6', + fontSize: '12px', + maxHeight: '240px', + overflowY: 'auto', + border: '1px solid #0003', + whiteSpace: 'pre-wrap', + wordWrap: 'break-word', + marginBottom: '0', + }} + /> + <Box + onClick={() => { + inputStringRef.current = + globalStorage.form.inputs[editObjectName]; + setEdit(true); + }} + sx={{ + position: 'absolute', + right: '6px', + bottom: '8px', + cursor: 'pointer', + userSelect: 'none', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + borderRadius: '3px', + marginLeft: '4px', + opacity: 0.5, + transition: 'opacity 200ms ease-out', + '&:hover': { + opacity: 1, + }, + }} + > + <EditIcon sx={{ fontSize: '14px' }} /> + </Box> + </> + )} + </Box> + ) : ( + <></> + )} + </Box> + ); + }, +); diff --git a/frontend/src/components/ProcessRehearsal/RehearsalSvg.tsx b/frontend/src/components/ProcessRehearsal/RehearsalSvg.tsx new file mode 100644 index 0000000..9da3fb6 --- /dev/null +++ b/frontend/src/components/ProcessRehearsal/RehearsalSvg.tsx @@ -0,0 +1,284 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import { observer } from 'mobx-react-lite'; +import { globalStorage } from '@/storage'; +import { ActionType, getAgentActionStyle } from '@/storage/plan'; + +interface ILine<T = string> { + type: T; + from: string; + to: string; +} + +interface RehearsalSvgProps { + cardRefMap: Map<string, React.RefObject<HTMLElement | HTMLDivElement>>; + renderCount: number; + objectStepOrder: string[]; + importantLines: ILine<ActionType>[]; + actionIsHovered: string | undefined; +} + +const getIOLineHeight = (nodeOrder: string[], lines: ILine[]) => { + const edgeHeightIndexMap_ = new Map<number, number[][]>(); + const compareFunction = (a: ILine, b: ILine): number => { + const [afrom, ato] = [a.from, a.to]; + const [bfrom, bto] = [b.from, b.to]; + + const afromPos = nodeOrder.indexOf(afrom); + const bfromPos = nodeOrder.indexOf(bfrom); + const atoPos = nodeOrder.indexOf(ato); + const btoPos = nodeOrder.indexOf(bto); + + // 如果最小位置相同,则比较位置之间的距离 + const aDistance = atoPos - afromPos; + const bDistance = btoPos - bfromPos; + + if (aDistance !== bDistance) { + return aDistance - bDistance; + } else { + return afromPos - bfromPos; + } + }; + lines.sort(compareFunction); + const isCrossOver = (ptPair: number[], ptList: number[][]) => { + for (const pt of ptList) { + if (pt[1] <= ptPair[0] || pt[0] >= ptPair[1]) { + continue; + } + return true; + } + return false; + }; + lines.forEach(line => { + const fromIndex = nodeOrder.indexOf(line.from); + const toIndex = nodeOrder.indexOf(line.to); + let h = 1; + while ( + isCrossOver([fromIndex, toIndex], edgeHeightIndexMap_.get(h) || []) + ) { + h += 1; + } + edgeHeightIndexMap_.set(h, [ + ...(edgeHeightIndexMap_.get(h) || []), + [fromIndex, toIndex], + ]); + }); + const edgeHeightMap_ = new Map<string, number>(); + edgeHeightIndexMap_.forEach((pairList, height) => { + // 遍历当前条目的数组,将数字替换为数组b中对应的名称 + pairList.forEach(pair => { + edgeHeightMap_.set(pair.map(index => nodeOrder[index]).join('.'), height); + }); + }); + return edgeHeightMap_; +}; + +const getOffset = (child: HTMLElement, parent: HTMLElement) => { + const parentRect = parent.getBoundingClientRect(); + const childRect = child.getBoundingClientRect(); + // 计算相对位置 + return new DOMRect( + childRect.left - parentRect.left, + childRect.top - parentRect.top, + childRect.width, + childRect.height, + ); +}; + +const calcCurve = (fromCard: DOMRect, toCard: DOMRect, height: number) => { + // calc bezier curve + // from [fromCard.left, fromCard.top+0.5*fromCard.height] + // to [toCard.left, toCard.top+0.5*toCard.height + const h = fromCard.left * height; + return `M ${fromCard.left + fromCard.width},${ + fromCard.top + 0.5 * fromCard.height + } + C ${fromCard.left + fromCard.width + 1.5 * h},${ + fromCard.top + 0.5 * fromCard.height + }, + ${toCard.left + toCard.width + 1.5 * h},${toCard.top + 0.5 * toCard.height}, + ${toCard.left + toCard.width},${toCard.top + 0.5 * toCard.height}`; +}; +const calcPath = (objectCard: DOMRect, stepCard: DOMRect, height: number) => { + // console.log('calcPath', fromCard, toCard, height); + const fromCard = objectCard.top < stepCard.top ? objectCard : stepCard; + const toCard = objectCard.top < stepCard.top ? stepCard : objectCard; + const h = fromCard.left * height; + + const ptList = [ + { x: fromCard.left, y: fromCard.top + fromCard.height - 10 }, + { x: fromCard.left - h, y: fromCard.top + fromCard.height + 10 - 10 }, + { x: toCard.left - h, y: toCard.top + 0 * toCard.height - 10 + 10 }, + { x: toCard.left, y: toCard.top + 0 * toCard.height + 10 }, + ]; + const path = [ + `M ${ptList[0].x},${ptList[0].y}`, + `L ${ptList[1].x},${ptList[1].y}`, + `L ${ptList[2].x},${ptList[2].y}`, + `L ${ptList[3].x},${ptList[3].y}`, + ].join(' '); + return path; +}; + +export default observer( + ({ + cardRefMap, + renderCount, + objectStepOrder, + importantLines, + actionIsHovered, + }: RehearsalSvgProps) => { + const IOLines = globalStorage.renderingIOLines; + const edgeHeightMap = React.useMemo( + () => getIOLineHeight(objectStepOrder, IOLines), + [objectStepOrder, IOLines], + ); + const [ioLineRects, setIOLineRects] = React.useState< + [ILine, DOMRect, DOMRect][] + >([]); + const [importantLineRects, setImportantLineRects] = React.useState< + [ILine, DOMRect, DOMRect][] + >([]); + const refreshCurrentIdRef = React.useRef(-1); + + React.useEffect(() => { + refreshCurrentIdRef.current = (refreshCurrentIdRef.current + 1) % 100000; + const currentId = refreshCurrentIdRef.current; + const sleep = (time: number) => + new Promise(resolve => setTimeout(resolve, time)); + (async () => { + let ioAllReady = false; + let importantAllReady = false; + const ioLineRects: [ILine, DOMRect, DOMRect][] = []; + const importantLineRects: [ILine, DOMRect, DOMRect][] = []; + while (true) { + if (refreshCurrentIdRef.current !== currentId) { + return; + } + const rootElement = cardRefMap.get('root')?.current; + if (!rootElement) { + await sleep(5); + continue; + } + if (!ioAllReady) { + ioAllReady = true; + for (const line of IOLines) { + const fromElement = cardRefMap.get(line.from)?.current; + const toElement = cardRefMap.get(line.to)?.current; + if (fromElement && toElement) { + ioLineRects.push([ + line, + getOffset(fromElement, rootElement), + getOffset(toElement, rootElement), + ]); + } else { + ioAllReady = false; + continue; + } + } + if (!ioAllReady) { + ioLineRects.length = 0; + await sleep(5); + continue; + } + } + if (!importantAllReady) { + importantAllReady = true; + for (const line of importantLines) { + const fromElement = cardRefMap.get(line.from)?.current; + const toElement = cardRefMap.get(line.to)?.current; + if (fromElement && toElement) { + importantLineRects.push([ + line, + getOffset(fromElement, rootElement), + getOffset(toElement, rootElement), + ]); + } else { + importantAllReady = false; + break; + } + } + if (!importantAllReady) { + importantLineRects.length = 0; + await sleep(5); + continue; + } + } + break; + } + setIOLineRects(ioLineRects); + setImportantLineRects(importantLineRects); + })(); + }, [edgeHeightMap, renderCount, cardRefMap]); + const ioLinesEle = React.useMemo( + () => + ioLineRects.map(([line, from, to]) => { + const key = `${line.from}.${line.to}`; + const height = edgeHeightMap.get(key) || 0; + return ( + <path + key={`Rehearsal.IOLine.${key}`} + fill="none" + strokeWidth="3" + stroke={line.type === 'output' ? '#FFCA8C' : '#B9DCB0'} + d={calcPath( + from, + to, + height / (Math.max(...edgeHeightMap.values()) + 1), + )} + /> + ); + }), + [ioLineRects], + ); + const importantLinesEle = React.useMemo( + () => + importantLineRects + .sort((a, b) => { + return a.to === b.to ? 0 : a.to === actionIsHovered ? 1 : -1; + }) + .map(([line, from, to]) => { + const key = `${line.from}.${line.to}`; + return ( + <path + key={`Rehearsal.ImportantLine.${key}`} + fill="none" + strokeWidth="3" + stroke={ + (getAgentActionStyle(line.type as any) as any).borderColor + } + d={calcCurve(from, to, 0.5)} + strokeOpacity={actionIsHovered === line.to ? 1 : 0.2} + // style={{ + // ...(actionIsHovered === line.to + // ? { filter: 'brightness(110%) saturate(100%)' } + // : { filter: 'brightness(100%) saturate(20%)' }), + // }} + /> + ); + }), + [importantLineRects, actionIsHovered], + ); + const height = cardRefMap + .get('root') + ?.current?.querySelector?.('.contents-stack')?.scrollHeight; + + return ( + <Box + component="svg" + sx={{ + position: 'absolute', + left: 0, + top: 0, + width: '100%', + height: height ? `${height}px` : '100%', + zIndex: 999, + pointerEvents: 'none', + }} + > + <g>{ioLinesEle}</g> + <g>{importantLinesEle}</g> + </Box> + ); + }, +); diff --git a/frontend/src/components/ProcessRehearsal/StepHistoryItem.tsx b/frontend/src/components/ProcessRehearsal/StepHistoryItem.tsx new file mode 100644 index 0000000..1e1f9e4 --- /dev/null +++ b/frontend/src/components/ProcessRehearsal/StepHistoryItem.tsx @@ -0,0 +1,170 @@ +import React from 'react'; +import { observer } from 'mobx-react-lite'; +import { Divider, SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import UnfoldLessIcon from '@mui/icons-material/UnfoldLess'; +import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; +import MarkdownBlock from '@/components/MarkdownBlock'; +import { globalStorage } from '@/storage'; +import type { IExecuteStepHistoryItem } from '@/apis/execute-plan'; +import AgentIcon from '@/components/AgentIcon'; +import { getAgentActionStyle } from '@/storage/plan'; + +export interface IStepHistoryItemProps { + item: IExecuteStepHistoryItem; + actionRef: React.RefObject<HTMLDivElement | HTMLElement>; + style?: SxProps; + hoverCallback: (isHovered: boolean) => void; + handleExpand?: () => void; +} + +export default observer( + ({ + item, + actionRef, + hoverCallback, + handleExpand, + style = {}, + }: IStepHistoryItemProps) => { + const [expand, setExpand] = React.useState(false); + const refDetail = React.useRef<HTMLDivElement>(null); + // 使用useEffect来更新detail容器的高度 + React.useEffect(() => { + if (refDetail.current) { + refDetail.current.style.height = expand + ? `${refDetail.current.scrollHeight}px` + : '0px'; + } + if (handleExpand) { + let count = 0; + const intervalId = setInterval(() => { + handleExpand(); + count++; + if (count >= 20) { + clearInterval(intervalId); + } + }, 10); + } + }, [expand]); + const s = { ...getAgentActionStyle(item.type), ...style } as SxProps; + React.useEffect(() => { + console.log(item); + }, [item]); + return ( + <Box + ref={actionRef} + className="step-history-item" + sx={{ + userSelect: 'none', + borderRadius: '10px', + padding: '4px', + fontSize: '14px', + position: 'relative', + marginTop: '4px', + backgroundColor: (s as any).backgroundColor, + border: `2px solid ${(s as any).borderColor}`, + }} + onMouseOver={() => hoverCallback(true)} + onMouseOut={() => hoverCallback(false)} + > + <Box sx={{ display: 'flex', alignItems: 'center' }}> + <AgentIcon + name={globalStorage.agentIconMap.get(item.agent)} + style={{ height: '36px', width: 'auto', margin: '0px' }} + tooltipInfo={globalStorage.agentMap.get(item.agent)} + /> + <Box component="span" sx={{ fontWeight: 500, marginLeft: '4px' }}> + {item.agent} + </Box> + <Box component="span" sx={{ fontWeight: 400 }}> + : {item.type} + </Box> + </Box> + {item.result ? ( + <Box + ref={refDetail} + sx={{ + overflow: 'hidden', + transition: 'height 200ms ease-out', // 添加过渡效果 + }} + > + {expand ? ( + <> + <Divider + sx={{ + margin: '4px 0px', + borderBottom: '2px dashed', // 设置为虚线 + borderColor: '#0003', + }} + /> + <Box + sx={{ + marginLeft: '6px', + marginBottom: '4px', + color: '#0009', + fontWeight: 400, + }} + > + {item.description} + </Box> + <MarkdownBlock + text={item.result} + style={{ + marginTop: '5px', + borderRadius: '10px', + padding: '6px', + background: '#FFF9', + fontSize: '12px', + maxHeight: '240px', + overflowY: 'auto', + border: '1px solid #0003', + whiteSpace: 'pre-wrap', + wordWrap: 'break-word', + marginBottom: '5px', + }} + /> + </> + ) : ( + <></> + )} + <Box + onClick={e => { + setExpand(v => !v); + e.stopPropagation(); + }} + sx={{ + position: 'absolute', + right: '8px', + // bottom: '12px', + top: '24px', + cursor: 'pointer', + userSelect: 'none', + height: '14px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + background: '#0002', + borderRadius: '8px', + marginLeft: '4px', + padding: '0 4px', + '&:hover': { + background: '#0003', + }, + }} + > + {expand ? ( + <UnfoldLessIcon + sx={{ fontSize: '16px', transform: 'rotate(90deg)' }} + /> + ) : ( + <MoreHorizIcon sx={{ fontSize: '16px' }} /> + )} + </Box> + </Box> + ) : ( + <></> + )} + </Box> + ); + }, +); diff --git a/frontend/src/components/ProcessRehearsal/StepNode.tsx b/frontend/src/components/ProcessRehearsal/StepNode.tsx new file mode 100644 index 0000000..1c7ed79 --- /dev/null +++ b/frontend/src/components/ProcessRehearsal/StepNode.tsx @@ -0,0 +1,86 @@ +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import React from 'react'; +import StepHistoryItem from './StepHistoryItem'; +import type { IExecuteStepHistoryItem } from '@/apis/execute-plan'; +import { globalStorage } from '@/storage'; + +export interface IStepNodeProps { + name: string; + history: IExecuteStepHistoryItem[]; + touchRef: ( + id: string, + existingRef?: React.RefObject<HTMLElement>, + ) => React.RefObject<HTMLElement>; + _ref?: React.RefObject<HTMLDivElement | HTMLElement>; + + style?: SxProps; + id: string; + actionHoverCallback: (actionName: string | undefined) => void; + handleExpand?: () => void; +} + +export default observer( + ({ + style = {}, + name, + history, + _ref, + touchRef, + id, + actionHoverCallback, + handleExpand, + }: IStepNodeProps) => { + return ( + <Box + sx={{ + userSelect: 'none', + borderRadius: '12px', + background: '#F6F6F6', + padding: '10px', + border: '2px solid #E5E5E5', + fontSize: '14px', + position: 'relative', + display: 'flex', + flexDirection: 'column', + cursor: 'pointer', + transition: 'all 200ms ease-in-out', + '&:hover': { + border: '2px solid #0002', + backgroundImage: 'linear-gradient(0, #0000000A, #0000000A)', + }, + '& > .step-history-item:first-of-type': { + marginTop: '10px', + }, + ...style, + }} + ref={_ref} + onClick={() => { + if (id) { + globalStorage.setFocusingStepTaskId(id); + } + }} + > + <Box component="span" sx={{ fontWeight: 800 }}> + {name} + </Box> + {history.map((item, index) => ( + <StepHistoryItem + // eslint-disable-next-line react/no-array-index-key + key={`${item.id}.${item.agent}.${index}`} + item={item} + actionRef={touchRef(`Action.${name}.${item.id}`)!} + hoverCallback={(isHovered: boolean) => { + // console.log(isHovered, 'hover', `action.${name}.${item.id}`); + actionHoverCallback( + isHovered ? `Action.${name}.${item.id}` : undefined, + ); + }} + handleExpand={handleExpand} + /> + ))} + </Box> + ); + }, +); diff --git a/frontend/src/components/ProcessRehearsal/index.tsx b/frontend/src/components/ProcessRehearsal/index.tsx new file mode 100644 index 0000000..970e4be --- /dev/null +++ b/frontend/src/components/ProcessRehearsal/index.tsx @@ -0,0 +1,219 @@ +import React from 'react'; +import throttle from 'lodash/throttle'; +import { SxProps } from '@mui/material'; +import { observer } from 'mobx-react-lite'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import IconButton from '@mui/material/IconButton'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import CircularProgress from '@mui/material/CircularProgress'; +import ObjectNode from './ObjectNode'; +import StepNode from './StepNode'; +import RehearsalSvg from './RehearsalSvg'; +import { globalStorage } from '@/storage'; +import Title from '@/components/Title'; +import { ExecuteNodeType } from '@/apis/execute-plan'; +import { useResize } from '@/utils/resize-hook'; + +export default observer(({ style = {} }: { style?: SxProps }) => { + const [renderCount, setRenderCount] = React.useState(0); + const cardRefMap = React.useMemo( + () => new Map<string, React.RefObject<HTMLElement>>(), + [], + ); + const touchRef = React.useCallback( + (id: string, existingRef?: React.RefObject<HTMLElement>) => { + if (existingRef) { + cardRefMap.set(id, existingRef); + return existingRef; + } + if (cardRefMap.has(id)) { + return cardRefMap.get(id)!; + } else { + cardRefMap.set(id, React.createRef<HTMLElement>()); + return cardRefMap.get(id)!; + } + }, + [cardRefMap], + ); + const render = React.useMemo( + () => + throttle( + () => + // eslint-disable-next-line max-nested-callbacks + requestAnimationFrame(() => setRenderCount(old => (old + 1) % 100)), + 5, + { + leading: false, + trailing: true, + }, + ), + [], + ); + const stackRef = useResize(render); + const [actionIsHovered, setActionIsHovered] = React.useState< + string | undefined + >(); + + return ( + <Box + sx={{ + background: '#FFF', + border: '3px solid #E1E1E1', + display: 'flex', + overflow: 'hidden', + flexDirection: 'column', + width: '100%', + ...style, + }} + > + <Box + sx={{ + fontWeight: 600, + fontSize: '18px', + userSelect: 'none', + padding: '0 6px 0 0', + position: 'relative', + display: 'flex', + alignItems: 'center', + }} + > + <Title title="Execution Result" /> + <Box + sx={{ + flexGrow: 1, + display: 'flex', + alignItems: 'center', + justifyContent: 'end', + }} + > + {globalStorage.api.planExecuting ? ( + <CircularProgress + sx={{ + width: '12px !important', + height: '12px !important', + marginLeft: '6px', + }} + /> + ) : ( + <></> + )} + {globalStorage.api.planExecuting ? ( + <></> + ) : ( + <> + <IconButton + disabled={!globalStorage.logManager.outdate} + size="small" + onClick={() => globalStorage.logManager.clearLog()} + sx={{ + color: 'error.main', + '&:hover': { + color: 'error.dark', + }, + }} + > + <RefreshIcon /> + </IconButton> + <IconButton + disabled={!globalStorage.api.ready} + size="small" + onClick={() => globalStorage.executePlan(Infinity)} + sx={{ + color: 'primary.main', + '&:hover': { + color: 'primary.dark', + }, + }} + > + <PlayArrowIcon /> + </IconButton> + </> + )} + </Box> + </Box> + <Box + sx={{ + position: 'relative', + height: 0, + flexGrow: 1, + overflowY: 'auto', + overflowX: 'hidden', + padding: '6px 6px', + }} + onScroll={() => { + globalStorage.renderLines({ delay: 0, repeat: 2 }); + }} + > + <Box sx={{ height: '100%', width: '100%' }}> + <Box sx={{ position: 'relative' }} ref={touchRef('root', stackRef)}> + <Stack + spacing="12px" + sx={{ + position: 'absolute', + zIndex: 1, + marginLeft: '12px', + marginRight: '12px', + width: 'calc(100% - 24px)', + paddingBottom: '24px', + }} + className="contents-stack" + > + {Object.keys(globalStorage.form.inputs).map(name => ( + <ObjectNode + key={`rehearsal.object.${name}`} + name={name} + content="" + stepId="" + editObjectName={name} + _ref={touchRef(`Object.${name}`)} + handleExpand={() => { + // render(); + setRenderCount(old => (old + 1) % 100); + }} + /> + ))} + {globalStorage.logManager.renderingLog.map(node => + node.type === ExecuteNodeType.Step ? ( + <StepNode + key={`rehearsal.step.${node.id}`} + id={node.stepId} + _ref={touchRef(`Step.${node.id}`, node.ref)} + name={node.id} + history={node.history} + touchRef={touchRef} + actionHoverCallback={setActionIsHovered} + handleExpand={() => { + // render(); + setRenderCount(old => (old + 1) % 100); + }} + /> + ) : ( + <ObjectNode + key={`rehearsal.object.${node.id}`} + _ref={touchRef(`Object.${node.id}`, node.ref)} + name={node.id} + content={node.content} + stepId={node.stepId} + handleExpand={() => { + // render(); + setRenderCount(old => (old + 1) % 100); + }} + /> + ), + )} + </Stack> + <RehearsalSvg + renderCount={renderCount} + cardRefMap={cardRefMap} + actionIsHovered={actionIsHovered} + objectStepOrder={globalStorage.rehearsalSvgObjectOrder} + importantLines={globalStorage.rehearsalSvgLines} + /> + </Box> + </Box> + </Box> + </Box> + ); +}); diff --git a/frontend/src/components/ResizeableColumn/index.tsx b/frontend/src/components/ResizeableColumn/index.tsx new file mode 100644 index 0000000..a0c9c61 --- /dev/null +++ b/frontend/src/components/ResizeableColumn/index.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { Resizable } from 're-resizable'; +import { globalStorage } from '@/storage'; + +export default React.memo<{ + children: React.ReactNode; + columnWidth: string; +}>(({ children, columnWidth }) => { + return ( + <Resizable + defaultSize={{ height: '100%', width: columnWidth }} + enable={{ + top: false, + right: true, + bottom: false, + left: false, + topRight: false, + bottomRight: false, + bottomLeft: false, + topLeft: false, + }} + minWidth="50px" + maxWidth="75%" + style={{ + flexShrink: 0, + display: 'flex', + flexWrap: 'nowrap', + position: 'relative', + flexGrow: 0, + }} + handleClasses={{ + right: 'side-resize-bar', + }} + handleStyles={{ + right: { + width: '4px', + right: '1px', + }, + }} + onResize={() => globalStorage.renderLines({ delay: 0, repeat: 3 })} + > + {children} + </Resizable> + ); +}); diff --git a/frontend/src/components/TaskModification/TaskModificationSvg.tsx b/frontend/src/components/TaskModification/TaskModificationSvg.tsx new file mode 100644 index 0000000..1c1987e --- /dev/null +++ b/frontend/src/components/TaskModification/TaskModificationSvg.tsx @@ -0,0 +1,132 @@ +import React from 'react'; +import _ from 'lodash'; +import { observer } from 'mobx-react-lite'; +import { useTaskModificationContext } from './context'; +import { globalStorage } from '@/storage'; + +const getRefOffset = ( + child: React.RefObject<HTMLElement>, + grandParent: React.RefObject<HTMLElement>, +) => { + const offset = { top: 0, left: 0, width: 0, height: 0 }; + if (!child.current || !grandParent.current) { + return offset; + } + let node = child.current; + // Traverse up the DOM tree until we reach the grandparent or run out of elements + while (node && node !== grandParent.current) { + offset.top += node.offsetTop; + offset.left += node.offsetLeft; + // Move to the offset parent (the nearest positioned ancestor) + node = node.offsetParent as HTMLElement; + } + // If we didn't reach the grandparent, return null + if (node !== grandParent.current) { + return offset; + } + offset.width = child.current.offsetWidth; + offset.height = child.current.offsetHeight; + return offset; +}; + +const TaskModificationSvg = observer(() => { + const { + forestPaths, + whoIsAddingBranch, + nodeRefMap, + svgForceRenderCounter, + containerRef, + } = useTaskModificationContext(); + const { currentActionNodeSet } = globalStorage; + + const [nodeRectMap, setNodeRectMap] = React.useState( + new Map< + string, + { + top: number; + left: number; + width: number; + height: number; + } + >(), + ); + React.useEffect(() => { + if (containerRef) { + const nodeRectMap_ = new Map( + [...nodeRefMap].map(kv => { + return [kv[0], getRefOffset(kv[1], containerRef)]; + }), + ); + setNodeRectMap(nodeRectMap_); + } + }, [svgForceRenderCounter, whoIsAddingBranch]); + + const renderLine = (startid: string, endid: string) => { + const startRect = nodeRectMap.get(startid); + const endRect = nodeRectMap.get(endid); + if (!startRect || !endRect) { + return <></>; + } + let isCurrent = false; + if (currentActionNodeSet.has(startid) && currentActionNodeSet.has(endid)) { + isCurrent = true; + } + if (startid === 'root' && currentActionNodeSet.has(endid)) { + isCurrent = true; + } + // console.log(`line.${startid}${startRect.left}.${endid}${endRect.left}`); + return ( + <path + key={`line.${startid}${startRect.left}.${endid}${endRect.left}`} + d={`M ${startRect.left + 0.5 * startRect.width} ${ + startRect.top + 0.5 * startRect.height + } + C ${startRect.left + startRect.width * 0.5} ${ + endRect.top + 0.5 * endRect.height + }, + ${endRect.left} ${endRect.top + 0.5 * endRect.height}, + ${endRect.left} ${endRect.top + 0.5 * endRect.height}`} + fill="none" + stroke={isCurrent ? '#4a9c9e' : '#D9D9D9'} + strokeWidth="6" + ></path> + ); + }; + const renderRoot = () => { + const rootRect = nodeRectMap.get('root'); + if (rootRect && forestPaths.length > 0) { + return ( + <circle + key={`root${rootRect.left}`} + cx={rootRect.left + 0.5 * rootRect.width} + cy={rootRect.top + 0.5 * rootRect.height} + r="10" + fill="#4a9c9e" + /> + ); + } + return <></>; + }; + return ( + <svg + style={{ + position: 'absolute', + top: 0, + left: 0, + // backgroundColor: 'red', + width: _.max( + [...nodeRectMap.values()].map(rect => rect.left + rect.width), + ), + height: _.max( + [...nodeRectMap.values()].map(rect => rect.top + rect.height), + ), + }} + > + {forestPaths.map(pair => renderLine(pair[0], pair[1]))} + {whoIsAddingBranch && renderLine(whoIsAddingBranch, 'requirement')} + {renderRoot()} + </svg> + ); +}); + +export default TaskModificationSvg; diff --git a/frontend/src/components/TaskModification/context.tsx b/frontend/src/components/TaskModification/context.tsx new file mode 100644 index 0000000..d182cb2 --- /dev/null +++ b/frontend/src/components/TaskModification/context.tsx @@ -0,0 +1,210 @@ +// TaskModificationContext.tsx +import React, { + ReactNode, + RefObject, + createContext, + useContext, + useState, + useEffect, +} from 'react'; +import { IAgentActionTreeNode, globalStorage } from '@/storage'; + +interface TaskModificationContextProps { + forest: IAgentActionTreeNode | undefined; + setForest: (forest: IAgentActionTreeNode) => void; + forestPaths: [string, string][]; + setForestPaths: (paths: [string, string][]) => void; + + whoIsAddingBranch: string | undefined; + setWhoIsAddingBranch: (whoIsAddingBranch: string | undefined) => void; + updateWhoIsAddingBranch: (whoIsAddingBranch: string | undefined) => void; + + containerRef: React.RefObject<HTMLElement> | undefined; + setContainerRef: (containerRef: React.RefObject<HTMLElement>) => void; + nodeRefMap: Map<string, RefObject<HTMLElement>>; + updateNodeRefMap: (key: string, value: RefObject<HTMLElement>) => void; + + baseNodeSet: Set<string>; + setBaseNodeSet: (baseNodeSet: Set<string>) => void; + baseLeafNodeId: string | undefined; + setBaseLeafNodeId: (baseLeafNodeId: string | undefined) => void; + + handleRequirementSubmit: (requirement: string, number: number) => void; + handleNodeClick: (nodeId: string) => void; + + handleNodeHover: (nodeId: string | undefined) => void; + + svgForceRenderCounter: number; + setSVGForceRenderCounter: (n: number) => void; + svgForceRender: () => void; +} + +const TaskModificationContext = createContext<TaskModificationContextProps>( + {} as TaskModificationContextProps, +); + +export const useTaskModificationContext = () => + useContext(TaskModificationContext); + +export const TaskModificationProvider: React.FC<{ children: ReactNode }> = ({ + children, +}) => { + const [forest, setForest] = useState<IAgentActionTreeNode>(); + const [forestPaths, setForestPaths] = useState<[string, string][]>([]); + + useEffect(() => { + if (forest) { + setForestPaths(_getFatherChildrenIdPairs(forest)); + } + }, [forest]); + + const [whoIsAddingBranch, setWhoIsAddingBranch] = useState< + string | undefined + >(undefined); + const updateWhoIsAddingBranch = (whoId: string | undefined) => { + if (whoId === whoIsAddingBranch) { + setWhoIsAddingBranch(undefined); + } else { + setWhoIsAddingBranch(whoId); + } + }; + const [containerRef, setContainerRef] = React.useState< + React.RefObject<HTMLElement> | undefined + >(undefined); + const [baseNodeSet, setBaseNodeSet] = React.useState<Set<string>>( + new Set<string>(), + ); + const [baseLeafNodeId, setBaseLeafNodeId] = React.useState< + string | undefined + >(undefined); + const [nodeRefMap] = React.useState( + new Map<string, RefObject<HTMLElement>>(), + ); + const updateNodeRefMap = (key: string, value: RefObject<HTMLElement>) => { + nodeRefMap.set(key, value); + }; + + const handleRequirementSubmit = (requirement: string, number: number) => { + if (whoIsAddingBranch) { + const start = + whoIsAddingBranch === 'root' ? undefined : whoIsAddingBranch; + // globalStorage.newPlanBranch(start, requirement, number, baseLeafNodeId); + globalStorage.newActionBranch( + globalStorage.currentFocusingAgentSelection?.id, + start, + requirement, + number, + baseLeafNodeId, + ); + setWhoIsAddingBranch(undefined); + setBaseNodeSet(new Set()); + setBaseLeafNodeId(undefined); + } + }; + const handleNodeClick = (nodeId: string) => { + const leafId = globalStorage.getFirstLeafAction(nodeId)?.node.id; + console.log(leafId); + if (leafId) { + if (whoIsAddingBranch) { + if (baseLeafNodeId === leafId) { + setBaseNodeSet(new Set()); + setBaseLeafNodeId(undefined); + } else { + const pathNodeSet = new Set(globalStorage.getActionLeafPath(leafId)); + if ( + pathNodeSet.has(whoIsAddingBranch) || + whoIsAddingBranch === 'root' + ) { + setBaseLeafNodeId(leafId); + setBaseNodeSet(pathNodeSet); + } + } + } else { + globalStorage.setCurrentAgentActionBranch(leafId, undefined); + } + } + }; + + const [svgForceRenderCounter, setSVGForceRenderCounter] = useState(0); + const svgForceRender = () => { + setSVGForceRenderCounter((svgForceRenderCounter + 1) % 100); + }; + + const handleNodeHover = (nodeId: string | undefined) => { + if (!whoIsAddingBranch) { + if (nodeId) { + const leafNode = globalStorage.getFirstLeafAction(nodeId); + if (leafNode?.branchInfo) { + // const branchInfo = + // globalStorage.focusingStepTask.agentSelection.branches[leafNode.id]; + // console.log(leafNode); + if (leafNode.branchInfo.base) { + const pathNodeSet = new Set( + globalStorage.getActionLeafPath(leafNode.branchInfo.base), + ); + setBaseNodeSet(pathNodeSet); + } + } + } else { + setBaseNodeSet(new Set()); + } + } + }; + + useEffect(() => { + setBaseNodeSet(new Set()); + setBaseLeafNodeId(undefined); + }, [whoIsAddingBranch]); + + useEffect(() => { + svgForceRender(); + }, [forest, whoIsAddingBranch]); + + return ( + <TaskModificationContext.Provider + value={{ + forest, + setForest, + forestPaths, + setForestPaths, + + whoIsAddingBranch, + setWhoIsAddingBranch, + updateWhoIsAddingBranch, + + containerRef, + setContainerRef, + nodeRefMap, + updateNodeRefMap, + + baseNodeSet, + setBaseNodeSet, + baseLeafNodeId, + setBaseLeafNodeId, + + handleRequirementSubmit, + handleNodeClick, + handleNodeHover, + + svgForceRenderCounter, + setSVGForceRenderCounter, + svgForceRender, + }} + > + {children} + </TaskModificationContext.Provider> + ); +}; + +// ---------------------------------------------------------------- +const _getFatherChildrenIdPairs = ( + node: IAgentActionTreeNode, +): [string, string][] => { + let pairs: [string, string][] = []; + // 对于每个子节点,添加 (父ID, 子ID) 对,并递归调用函数 + node.children.forEach(child => { + pairs.push([node.id, child.id]); + pairs = pairs.concat(_getFatherChildrenIdPairs(child)); + }); + return pairs; +}; diff --git a/frontend/src/components/TaskModification/fakeTaskModification.ts b/frontend/src/components/TaskModification/fakeTaskModification.ts new file mode 100644 index 0000000..3f10e5e --- /dev/null +++ b/frontend/src/components/TaskModification/fakeTaskModification.ts @@ -0,0 +1,75 @@ +export const fakeTaskTree = { + id: 'root', // 根节点 + children: [ + { + id: 'child1', // 子节点 + children: [ + // 子节点的子节点数组 + { + id: 'child1_1', // 子节点的子节点 + children: [], // 叶节点,没有子节点 + }, + { + id: 'child1_2', // 另一个子节点的子节点 + children: [], // 叶节点,没有子节点 + }, + ], + }, + { + id: 'child2', // 另一个子节点 + children: [ + { + id: 'child2_1', + children: [], + }, + ], + }, + ], +}; + +export const fakeNodeData = new Map([ + [ + 'child1', + { + agentIcon: 'John_Lin', + style: { backgroundColor: '#b4d0d9', borderColor: '#b4d099' }, + isLeaf: true, + requirement: 'hhhh', + }, + ], + [ + 'child2', + { + agentIcon: 'Mei_Lin', + style: { backgroundColor: '#b4d0d9', borderColor: '#b4d099' }, + isLeaf: false, + }, + ], + [ + 'child1_1', + { + agentIcon: 'Tamara_Taylor', + style: { backgroundColor: '#b4d0d9', borderColor: '#b4d099' }, + isLeaf: true, + requirement: 'requirement', + }, + ], + [ + 'child1_2', + { + agentIcon: 'Sam_Moore', + style: { backgroundColor: '#b4d0d9', borderColor: '#b4d099' }, + isLeaf: true, + requirement: 'requirement', + }, + ], + [ + 'child2_1', + { + agentIcon: 'Sam_Moore', + style: { backgroundColor: '#b4d0d9', borderColor: '#b4d099' }, + isLeaf: true, + requirement: 'requirement', + }, + ], +]); diff --git a/frontend/src/components/TaskModification/index.tsx b/frontend/src/components/TaskModification/index.tsx new file mode 100644 index 0000000..2f08fbb --- /dev/null +++ b/frontend/src/components/TaskModification/index.tsx @@ -0,0 +1,457 @@ +/* eslint-disable max-lines */ + +import React from 'react'; +import { SxProps, CircularProgress } from '@mui/material'; +import Box from '@mui/material/Box'; +import AddIcon from '@mui/icons-material/Add'; +import RemoveIcon from '@mui/icons-material/Remove'; +import IconButton from '@mui/material/IconButton'; +import Paper from '@mui/material/Paper'; +import InputBase from '@mui/material/InputBase'; +// import SendIcon from '@mui/icons-material/Send'; +import { observer } from 'mobx-react-lite'; +import AgentIcon from '../AgentIcon'; +import TaskModificationSvg from './TaskModificationSvg'; +import { + TaskModificationProvider, + useTaskModificationContext, +} from './context'; +import { IAgentActionTreeNode, globalStorage } from '@/storage'; +import SendIcon from '@/icons/sendIcon'; +import { ActionType } from '@/storage/plan'; + +const RequirementNoteNode: React.FC<{ + data: { + text: string; + }; + style?: SxProps; +}> = ({ data, style }) => { + return ( + <Box sx={{ ...style }}> + <Box sx={{ color: '#ACACAC', userSelect: 'none', minWidth: '250px' }}> + {data.text} + </Box> + </Box> + ); +}; + +const RequirementInputNode: React.FC<{ + style?: SxProps; +}> = ({ style }) => { + const { handleRequirementSubmit, updateNodeRefMap } = + useTaskModificationContext(); + const [number, setNumber] = React.useState(1); + const myRef = React.useRef<HTMLElement>(null); + React.useEffect(() => { + updateNodeRefMap('requirement', myRef); + }, []); + // const handleWheel = (event: any) => { + // // 向上滚动时减少数字,向下滚动时增加数字 + // if (event.deltaY < 0) { + // setNumber(prevNumber => prevNumber + 1); + // } else { + // setNumber(prevNumber => Math.max(1, prevNumber - 1)); + // } + // }; + + const handleSubmit = () => { + handleRequirementSubmit(textValue, number); + }; + const [textValue, setTextValue] = React.useState(''); + return ( + <Box + sx={{ + ...style, + }} + ref={myRef} + > + <Paper + sx={{ + p: '0px', + display: 'flex', + alignItems: 'center', + width: 250, + backgroundColor: 'white', + boxShadow: 'none', + border: '2px solid #b0b0b0', + borderRadius: '8px', + }} + > + <InputBase + sx={{ marginLeft: 1, flex: 1, backgroundColor: 'white' }} + placeholder="Add Branch" + onChange={e => { + setTextValue(e.target.value); + }} + onKeyDown={e => { + if (e.key === 'ArrowUp') { + setNumber(prevNumber => prevNumber + 1); + } else if (e.key === 'ArrowDown') { + setNumber(prevNumber => Math.max(1, prevNumber - 1)); + } + }} + /> + <Box + sx={{ + display: 'flex', + flexDirection: 'row', + alignItems: 'flex-end', + height: '100%', + }} + // onWheel={handleWheel} + > + <IconButton + type="submit" + sx={{ + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + padding: '0px', + }} + onClick={handleSubmit} + > + <SendIcon color="#b6b6b6" /> + </IconButton> + <Box + sx={{ + height: 'min-content', + paddingLeft: '4px', + paddingRight: '4px', + cursor: 'pointer', // 提示用户可以与之互动 + }} + > + <Box component="span" sx={{ fontSize: '0.5em' }}> + X + </Box> + <Box component="span" sx={{ fontSize: '1em' }}> + {number} + </Box> + </Box> + </Box> + </Paper> + </Box> + ); +}; +const RootNode: React.FC<{ + style?: SxProps; +}> = ({ style }) => { + const { updateNodeRefMap, updateWhoIsAddingBranch, whoIsAddingBranch } = + useTaskModificationContext(); + const [onHover, setOnHover] = React.useState(false); + const myRef = React.useRef<HTMLElement>(null); + React.useEffect(() => { + updateNodeRefMap('root', myRef); + }, []); + // React.useEffect(() => { + // console.log(onHover, whoIsAddingBranch); + // }, [onHover, whoIsAddingBranch]); + return ( + <Box + onMouseOver={() => setOnHover(true)} + onMouseOut={() => setOnHover(false)} + sx={{ + ...style, + flexDirection: 'column', + position: 'relative', + backgroundColor: 'red', + }} + ref={myRef} + > + <IconButton + sx={{ + position: 'absolute', + left: '50%', + top: '50%', + transform: 'translateX(-50%) ', + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + opacity: onHover || whoIsAddingBranch === 'root' ? '1' : '0', + // visibility: 'visible', + // visibility: + // onHover || whoIsAddingBranch === 'root' ? 'visible' : 'hidden', + padding: '0px', + borderRadius: '50%', + border: '1px dotted #333', + height: '16px', + width: '16px', + marginTop: '-6px', + '& .MuiSvgIcon-root': { + fontSize: '14px', + }, + }} + onClick={() => updateWhoIsAddingBranch('root')} + > + {whoIsAddingBranch !== 'root' ? <AddIcon /> : <RemoveIcon />} + </IconButton> + </Box> + ); +}; + +const Node: React.FC<{ + data: { + id: string; + agentIcon: string; + agent: string; + action: { type: ActionType; description: string; style: SxProps }; + focusing: boolean; + }; + style?: SxProps; +}> = ({ data, style }) => { + const { + updateNodeRefMap, + whoIsAddingBranch, + updateWhoIsAddingBranch, + handleNodeClick, + handleNodeHover, + baseNodeSet, + } = useTaskModificationContext(); + const myRef = React.useRef<HTMLElement>(null); + const [onHover, setOnHover] = React.useState(false); + React.useEffect(() => { + updateNodeRefMap(data.id, myRef); + }, []); + return ( + // <RectWatcher onRectChange={onRectChange}> + <Box + onMouseOver={() => { + setOnHover(true); + handleNodeHover(data.id); + }} + onMouseOut={() => { + setOnHover(false); + handleNodeHover(undefined); + }} + sx={{ + ...style, + flexDirection: 'column', + // backgroundColor: '#d9d9d9', + borderStyle: 'solid', + borderRadius: '50%', + height: data.focusing ? '45px' : '30px', + width: data.focusing ? '45px' : '30px', + position: 'relative', + borderWidth: data.focusing ? '3px' : '2px', + boxShadow: baseNodeSet.has(data.id) ? '0 0 10px 5px #43b2aa' : '', + }} + ref={myRef} + onClick={() => handleNodeClick(data.id)} + > + <Box sx={{ display: 'flex', flexDirection: 'row' }}> + <AgentIcon + name={data.agentIcon} + style={{ + width: data.focusing ? '36px' : '28px', + height: 'auto', + margin: '0px', + userSelect: 'none', + }} + tooltipInfo={{ + ...globalStorage.agentMap.get(data.agent)!, + action: data.action, + }} + /> + </Box> + <Box + sx={{ + position: 'absolute', + left: '50%', + top: '100%', + transform: 'translateX(-50%) translateY(-50%)', + }} + > + <IconButton + sx={{ + color: 'primary', + '&:hover': { + color: 'primary.dark', + }, + visibility: + onHover || whoIsAddingBranch === data.id ? 'visible' : 'hidden', + padding: '0px', + borderRadius: '50%', + border: '1px dotted #333', + height: '16px', + width: '16px', + marginTop: '-6px', + '& .MuiSvgIcon-root': { + fontSize: '14px', + }, + }} + onClick={() => { + updateWhoIsAddingBranch(data.id); + }} + > + {whoIsAddingBranch !== data.id ? <AddIcon /> : <RemoveIcon />} + </IconButton> + </Box> + </Box> + // </RectWatcher> + ); +}; + +const Tree: React.FC<{ + tree: IAgentActionTreeNode; +}> = ({ tree }) => { + const { whoIsAddingBranch } = useTaskModificationContext(); + + const generalNodeStyle = { + height: '30px', + // padding: '4px 8px', + display: 'flex', + alignItems: 'center', + margin: '8px 20px 8px 8px', + }; + const focusNodeStyle = { + height: '45px', + // padding: '4px 8px', + display: 'flex', + alignItems: 'center', + margin: '8px 20px 8px 8px', + }; + + return ( + <Box sx={{ display: 'flex', flexDirection: 'row' }}> + <> + {tree.id !== 'root' && ( + <Node + data={{ + id: tree.id, + agentIcon: tree.icon, + agent: tree.agent, + action: { ...tree.action, style: tree.style }, + focusing: tree.focusing, + }} + style={{ + justifyContent: 'center', + alignSelf: 'flex-start', + cursor: 'pointer', + aspectRatio: '1 / 1', + ...(tree.focusing ? focusNodeStyle : generalNodeStyle), + ...tree.style, + }} + /> + )} + {tree.id === 'root' && ( + <RootNode + style={{ + justifyContent: 'center', + ...(tree.children[0] && tree.children[0].focusing + ? focusNodeStyle + : generalNodeStyle), + }} + /> + )} + </> + <> + <Box + sx={{ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + }} + > + {tree.id !== 'root' && tree.leaf && ( + <RequirementNoteNode + data={{ text: tree.requirement || '' }} + style={{ + ...(tree.focusing ? focusNodeStyle : generalNodeStyle), + }} + /> + )} + + {tree.children.map(childTree => ( + <Tree key={`taskTree-${childTree.id}`} tree={childTree} /> + ))} + {tree.id === whoIsAddingBranch && ( + <RequirementInputNode + style={{ height: '50px', display: 'flex', alignItems: 'center' }} + /> + )} + </Box> + </> + </Box> + ); +}; + +interface ITaskModificationProps { + style?: SxProps; + resizeSignal?: number; +} + +const TheViewContent = observer( + ({ style, resizeSignal }: ITaskModificationProps) => { + const { renderingActionForest } = globalStorage; + + const { forest, setForest, setContainerRef, svgForceRender } = + useTaskModificationContext(); + + const myRef = React.useRef<HTMLElement>(null); + + React.useEffect(() => { + setForest({ + agent: '', + icon: '', + children: renderingActionForest, + id: 'root', + leaf: false, + style: {}, + action: { type: ActionType.Propose, description: '' }, + focusing: true, + }); + }, [renderingActionForest]); + + React.useEffect(() => { + setContainerRef(myRef); + }, []); + + React.useEffect(() => { + svgForceRender(); + }, [resizeSignal]); + + return ( + <Box + sx={{ + backgroundColor: 'white', + position: 'relative', + overflowY: 'auto', + overflowX: 'auto', + padding: '4px 6px', + userSelect: 'none', + ...style, + }} + ref={myRef} + > + {myRef.current && <TaskModificationSvg />} + {forest && <Tree tree={forest} />} + </Box> + ); + }, +); +/* eslint-enable max-lines */ + +const TaskModification: React.FC<ITaskModificationProps> = observer( + ({ style, resizeSignal }) => { + return ( + <TaskModificationProvider> + <TheViewContent style={style} resizeSignal={resizeSignal} /> + {globalStorage.api.agentActionTreeGenerating && ( + <Box + sx={{ + position: 'absolute', + bottom: '10px', + right: '20px', + zIndex: 999, + }} + > + <CircularProgress size={40} /> + </Box> + )} + </TaskModificationProvider> + ); + }, +); + +export default TaskModification; diff --git a/frontend/src/components/Title/index.tsx b/frontend/src/components/Title/index.tsx new file mode 100644 index 0000000..f610bd8 --- /dev/null +++ b/frontend/src/components/Title/index.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; + +export default React.memo<{ title: string; style?: SxProps }>( + ({ title, style = {} }) => { + return ( + <Box + component="span" + sx={{ + position: 'relative', + height: '35px', // 容器的高度 + userSelect: 'none', + display: 'flex', + marginTop: '-4px', + ...style, + }} + > + <Box + component="span" + sx={{ + display: 'inline-flex', + height: '100%', + backgroundColor: '#E1E1E1', + alignItems: 'center', + justifyContent: 'center', + color: 'primary.main', + fontWeight: 800, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + paddingLeft: '10px', + paddingRight: '10px', + fontSize: '20px', + }} + > + {title} + </Box> + <Box + component="span" + sx={{ + height: 0, + width: 0, + borderRight: '26px solid transparent', + borderTop: '35px solid #E1E1E1', // 与矩形相同的颜色 + }} + /> + </Box> + ); + }, +); diff --git a/frontend/src/components/UserGoalInput/index.tsx b/frontend/src/components/UserGoalInput/index.tsx new file mode 100644 index 0000000..5f92664 --- /dev/null +++ b/frontend/src/components/UserGoalInput/index.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { observer } from 'mobx-react-lite'; +import { SxProps } from '@mui/material'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import FormControl from '@mui/material/FormControl'; +import FilledInput from '@mui/material/FilledInput'; +import TelegramIcon from '@mui/icons-material/Telegram'; +import CircularProgress from '@mui/material/CircularProgress'; +import { globalStorage } from '@/storage'; + +export interface UserGoalInputProps { + style?: SxProps; +} + +export default observer(({ style = {} }: UserGoalInputProps) => { + const inputRef = React.useRef<string>(''); + const inputElementRef = React.useRef<HTMLInputElement>(null); + React.useEffect(() => { + if (inputElementRef.current) { + if (globalStorage.planManager) { + inputElementRef.current.value = globalStorage.planManager.goal; + } else { + inputElementRef.current.value = globalStorage.briefGoal; + } + } + }, [globalStorage.planManager]); + return ( + <FormControl + sx={{ + position: 'relative', + ...style, + }} + > + <FilledInput + disabled={ + globalStorage.api.busy || + !globalStorage.api.agentsReady || + globalStorage.api.planReady + } + placeholder="Yout Goal" + fullWidth + inputRef={inputElementRef} + onChange={event => (inputRef.current = event.target.value)} + size="small" + sx={{ + borderRadius: '10px', + background: '#E1E1E1', + borderBottom: 'none !important', + '&::before': { + borderBottom: 'none !important', + }, + '& > input': { + padding: '10px', + }, + }} + startAdornment={ + <Box + sx={{ + color: '#4A9C9E', + fontWeight: 800, + fontSize: '18px', + textWrap: 'nowrap', + userSelect: 'none', + }} + > + \General Goal: + </Box> + } + /> + {globalStorage.api.planGenerating ? ( + <CircularProgress + sx={{ + position: 'absolute', + right: '12px', + top: '20px', + width: '24px !important', + height: '24px !important', + }} + /> + ) : ( + <IconButton + disabled={ + globalStorage.api.busy || + !globalStorage.api.agentsReady || + globalStorage.api.planReady + } + color="primary" + aria-label="提交" + sx={{ position: 'absolute', right: '6px', top: '12px' }} + onClick={() => { + globalStorage.form.goal = inputRef.current; + globalStorage.generatePlanBase(); + }} + > + <TelegramIcon /> + </IconButton> + )} + </FormControl> + ); +}); diff --git a/frontend/src/components/ViewConnector/index.tsx b/frontend/src/components/ViewConnector/index.tsx new file mode 100644 index 0000000..54011bf --- /dev/null +++ b/frontend/src/components/ViewConnector/index.tsx @@ -0,0 +1,153 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import { observer } from 'mobx-react-lite'; +import { min, max } from 'lodash'; +import { globalStorage } from '@/storage'; + +const mergeRects = (...rects: DOMRect[]) => { + const minX = min(rects.map(rect => rect.left)) ?? 0; + const minY = min(rects.map(rect => rect.top)) ?? 0; + const maxX = max(rects.map(rect => rect.left + rect.width)) ?? 0; + const maxY = max(rects.map(rect => rect.top + rect.height)) ?? 0; + return new DOMRect(minX, minY, maxX - minX, maxY - minY); +}; + +const drawConnectors = (() => { + let lastRectString = ''; + let lastRenderCache = <></>; + return (...rects: DOMRect[]) => { + const rectString = rects + .map(rect => `${rect.left},${rect.top},${rect.width},${rect.height}`) + .join(''); + if (rectString === lastRectString) { + return lastRenderCache; + } + lastRectString = rectString; + const margin = 5; + const connectors: React.ReactNode[] = []; + for (const rect of rects) { + connectors.push( + <g> + <line + x1={rect.left - margin} + y1={rect.top} + x2={rect.left - margin} + y2={rect.top + rect.height} + stroke="#43A8AA" + strokeWidth="4" + ></line> + <line + x1={rect.left + rect.width + margin} + y1={rect.top} + x2={rect.left + rect.width + margin} + y2={rect.top + rect.height} + stroke="#43A8AA" + strokeWidth="4" + ></line> + </g>, + ); + } + for (let i = 0; i <= rects.length - 2; i++) { + const rect1 = rects[i]; + const rect2 = rects[i + 1]; + connectors.push( + <g> + <path + d={`M ${rect1.left + rect1.width + margin},${rect1.top} + L ${rect2.left - margin},${rect2.top} + ${rect2.left - margin},${rect2.top + rect2.height} + ${rect1.left + rect1.width + margin},${ + rect1.top + rect1.height + }`} + fill="#86D2CE" + fillOpacity={0.5} + // strokeWidth="2" + ></path> + </g>, + ); + } + lastRenderCache = <>{connectors}</>; + return lastRenderCache; + }; +})(); + +export default observer(() => { + const [drawCallId, setDrawCallId] = React.useState(0); + React.useEffect(() => { + globalStorage.setRenderLinesMethod(() => + setDrawCallId(old => (old + 1) % 100), + ); + return () => globalStorage.setRenderLinesMethod(undefined); + }, []); + const [connectors, setConnectors] = React.useState(<></>); + + React.useEffect(() => { + try { + const { ElementToLink } = globalStorage; + if (!globalStorage.focusingStepTask) { + setConnectors(<></>); + } + const outlinePosition = + ElementToLink[0]?.current?.getBoundingClientRect?.(); + if (!outlinePosition) { + return; + } + const agentRects = ElementToLink[1] + .map(ele => ele.current?.getBoundingClientRect?.() as DOMRect) + .filter(rect => rect); + if (agentRects.length === 0) { + return; + } + const agentsPosition = mergeRects(...agentRects); + const descriptionPosition = + ElementToLink[2]?.current?.getBoundingClientRect?.(); + if (!descriptionPosition) { + return; + } + + const LogRects = ElementToLink[3] + .map(ele => ele?.current?.getBoundingClientRect?.() as DOMRect) + .filter(rect => rect); + if (LogRects.length > 0) { + const logPosition = mergeRects(...LogRects); + logPosition.x -= 5; + logPosition.width += 10; + + setConnectors( + drawConnectors( + outlinePosition, + agentsPosition, + descriptionPosition, + logPosition, + ), + ); + } else { + setConnectors( + drawConnectors(outlinePosition, agentsPosition, descriptionPosition), + ); + } + } catch (e) { + console.error(e); + } + }, [drawCallId, globalStorage.ElementToLink]); + + return ( + <Box + component="svg" + sx={{ + position: 'fixed', + left: 0, + top: 0, + bottom: 0, + right: 0, + height: '100%', + width: '100%', + pointerEvents: 'none', + zIndex: 1, + clipPath: 'inset(136px 0px 5px 0px)', + }} + > + {connectors} + </Box> + ); +}); diff --git a/frontend/src/icons/BranchIcon.tsx b/frontend/src/icons/BranchIcon.tsx new file mode 100644 index 0000000..f62d720 --- /dev/null +++ b/frontend/src/icons/BranchIcon.tsx @@ -0,0 +1,20 @@ +import SvgIcon from '@mui/material/SvgIcon'; + +export default () => ( + <SvgIcon> + <svg + width="30" + height="41" + viewBox="0 0 30 41" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <g> + <path + d="M24.7241 11.135C24.4807 11.3619 24.37 11.6718 24.418 11.9785C24.4733 12.3268 24.5065 12.675 24.5176 13.0105C24.5692 14.6559 24.1081 16.0809 23.149 17.2503C21.4854 19.2695 18.8184 19.9181 16.8744 20.391C15.5538 20.7105 14.6021 20.7936 13.8348 20.8575C12.9938 20.931 12.5696 20.9661 11.9683 21.2664C11.8502 21.3271 11.7322 21.391 11.6178 21.4613C10.5297 22.1387 9.90625 23.241 9.90625 24.4008V25.3145C9.90625 25.6564 10.1091 25.9727 10.4374 26.1644C11.5551 26.8162 12.2892 27.9281 12.2671 29.1869C12.2376 31.1135 10.4227 32.6886 8.19465 32.7142C5.88177 32.7461 4.00049 31.1327 4.00049 29.139C4.00049 27.8961 4.73087 26.8002 5.8412 26.1612C6.16581 25.9727 6.36132 25.6532 6.36132 25.3145V7.40005C6.36132 7.05818 6.15843 6.74187 5.83013 6.55017C4.71242 5.89839 3.97835 4.78652 4.00049 3.52768C4.03 1.60108 5.84488 0.0291336 8.07292 0.000378473C10.3821 -0.0283767 12.2634 1.58511 12.2634 3.5788C12.2634 4.82166 11.533 5.91756 10.4227 6.55656C10.0981 6.74507 9.90256 7.06457 9.90256 7.40324V18.4612C9.90256 18.5922 10.0649 18.6721 10.1977 18.6082H10.2014C11.4666 17.9788 12.4921 17.8925 13.4844 17.8062C14.1779 17.7487 14.8972 17.6848 15.9153 17.4388C17.5125 17.0522 19.3237 16.6113 20.2644 15.4707C20.8915 14.7103 21.0243 13.7645 20.9689 12.9274C20.9431 12.5249 20.648 12.1766 20.2164 12.0296C18.6634 11.5088 17.5642 10.1989 17.5753 8.66527C17.59 6.69395 19.4676 5.09644 21.7436 5.11241C24.0085 5.12839 25.8382 6.7259 25.8382 8.69083C25.8382 9.63656 25.4139 10.496 24.7241 11.135Z" + fill="white" + /> + </g> + </svg> + </SvgIcon> +); diff --git a/frontend/src/icons/ChangeAgentIcon.tsx b/frontend/src/icons/ChangeAgentIcon.tsx new file mode 100644 index 0000000..8458e7c --- /dev/null +++ b/frontend/src/icons/ChangeAgentIcon.tsx @@ -0,0 +1,17 @@ +import SvgIcon from '@mui/material/SvgIcon'; + +export default () => ( + <SvgIcon> + <svg + width="40" + height="42" + viewBox="0 0 40 42" + fill="white" + xmlns="http://www.w3.org/2000/svg" + > + <g> + <path d="M30.6096 18.3175L30.7811 18.5169L31.1242 18.9159C32.6296 20.6674 34.1437 22.4117 35.6663 24.1485H32.4663C32.4663 27.5995 31.1315 30.243 28.1968 32.368C27.1002 33.1439 25.8125 33.6515 24.4552 33.8788C24.27 33.9319 24.0781 33.9584 23.8853 33.9575C22.7741 33.9529 21.8738 33.0565 21.8738 31.9515C21.8738 30.8436 22.7778 29.9455 23.893 29.9455C23.9529 29.9455 24.0125 29.948 24.0712 29.9531C25.6074 29.6517 26.8862 28.6136 27.6663 27.3275C28.2053 26.2735 28.4706 25.211 28.7358 24.1485H25.5358C27.1444 22.2955 28.7444 20.1705 30.6096 18.3175ZM9.21925 15.6485C11.0845 13.7955 12.6845 11.6705 14.293 9.8175H11.093C11.3583 8.755 11.6235 7.6925 12.1626 6.6385C12.9668 5.3125 14.3016 4.25 15.9016 3.9865H15.9444V0C14.3786 0.17 12.8813 0.7055 11.6321 1.5895C8.69733 3.7145 7.36257 6.358 7.36257 9.809H4.15401C6.01925 11.934 7.61925 13.787 9.21925 15.6485ZM36 14.2062C36 16.5211 31.8041 17.34 28.2139 17.34C26.2778 17.34 24.4639 17.1061 23.1045 16.684C20.8907 15.9946 20.4278 14.9542 20.4278 14.2062C20.4278 11.7871 22.6711 9.60602 25.7434 8.84544C24.7543 8.11852 24.0051 6.95266 24.0051 5.64077V3.96933C24.0051 1.7799 25.7982 0 28.0034 0C30.2089 0 32.0017 1.7799 32.0017 3.9695V5.6406C32.0017 6.95266 31.463 8.11852 30.4739 8.84544C33.5463 9.60602 36 11.787 36 14.2062ZM19.5722 30.8662C19.5722 33.1811 15.3763 34 11.7861 34C9.85001 34 8.03611 33.7661 6.67671 33.344C4.46289 32.6546 4 31.6142 4 30.8662C4 28.4471 6.24325 26.266 9.31559 25.5054C8.3265 24.7785 7.57733 23.6127 7.57733 22.3008V20.6293C7.57733 18.4399 9.37035 16.66 11.5756 16.66C13.781 16.66 15.5739 18.4399 15.5739 20.6295V22.3006C15.5739 23.6127 15.0352 24.7785 14.0461 25.5054C17.1185 26.266 19.5722 28.447 19.5722 30.8662Z" /> + </g> + </svg> + </SvgIcon> +); diff --git a/frontend/src/icons/LogoIcon.tsx b/frontend/src/icons/LogoIcon.tsx new file mode 100644 index 0000000..0226396 --- /dev/null +++ b/frontend/src/icons/LogoIcon.tsx @@ -0,0 +1,18 @@ +import SvgIcon from '@mui/material/SvgIcon'; + +export default () => ( + <SvgIcon> + <svg + width="33" + height="35" + viewBox="0 0 33 35" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M12.4176 22.7961C12.6 23.5654 12.9833 24.222 13.4979 24.6464C14.0125 25.0709 14.6243 25.235 15.222 25.109C15.8197 24.9831 16.3636 24.5753 16.755 23.9599C17.1463 23.3445 17.359 22.5623 17.3545 21.7555C17.35 20.9487 17.1285 20.1709 16.7303 19.5634C16.3321 18.9559 15.7836 18.559 15.1846 18.445C14.5855 18.331 13.9757 18.5073 13.4659 18.942C12.9561 19.3766 12.5802 20.0408 12.4065 20.8136L12.4023 20.8377H4.95426C4.79861 20.1398 4.47853 19.5271 4.0414 19.0906C3.60427 18.6541 3.07334 18.4168 2.5272 18.4139H2.52303C1.85388 18.4139 1.21214 18.7684 0.738978 19.3992C0.265818 20.0301 0 20.8858 0 21.778V21.8021C0.00106744 22.6049 0.217216 23.3809 0.609477 23.99C1.00174 24.5991 1.5443 25.0014 2.13936 25.1242C2.73441 25.247 3.3428 25.0824 3.85485 24.6599C4.36689 24.2375 4.7489 23.585 4.93201 22.8202L4.93618 22.7961H12.4176ZM25.3416 4.82241H27.3986V6.77704H25.3416V4.82241ZM28.0023 4.82241H30.0594V6.77704H28.0023V4.82241ZM12.4023 32.6805H14.458V34.6333H12.4023V32.6805ZM15.0464 32.6805H17.1021V34.6333H15.0464V32.6805ZM17.6918 32.6805H19.7489V34.6333H17.6918V32.6805ZM5.40907 17.8502H7.46338V19.8067H5.40907V17.8502ZM8.0545 17.8502H10.1088V19.8067H8.0545V17.8502ZM10.6985 17.8502H12.7556V19.8067H10.6985V17.8502ZM19.6126 18.4584H21.6697V20.4131H19.6126V18.4584ZM22.258 18.4584H24.3137V20.4131H22.258V18.4584ZM24.902 18.4584H26.9591V20.4131H24.902V18.4584ZM7.22832 0.666504H9.28402V2.62113H7.22832V0.666504ZM9.87375 0.666504H11.9294V2.62113H9.87375V0.666504ZM12.5192 0.666504H14.5763V2.62113H12.5192V0.666504ZM2.63013 7.90271C3.72335 7.90271 4.65105 6.95692 5.00572 5.67733H10.8001C11.1047 5.67733 11.6262 5.96848 11.7959 6.28374L15.2328 13.4958C15.7237 14.4824 16.785 15.0239 17.5249 15.0239H20.9784C21.1747 15.6185 21.4964 16.1242 21.9043 16.4795C22.3123 16.8348 22.7889 17.0243 23.2761 17.0249H23.29C23.6217 17.0249 23.9502 16.9378 24.2566 16.7686C24.5631 16.5993 24.8415 16.3513 25.076 16.0385C25.3106 15.7258 25.4966 15.3546 25.6236 14.946C25.7505 14.5374 25.8158 14.0994 25.8158 13.6572V13.6516C25.8795 13.1903 25.8702 12.7163 25.7888 12.26C25.7074 11.8037 25.5555 11.375 25.3428 11.0013C25.1302 10.6276 24.8615 10.3171 24.5538 10.0896C24.2461 9.86214 23.9063 9.72266 23.5559 9.68009C23.2056 9.63752 22.8524 9.69278 22.519 9.84236C22.1855 9.99194 21.8792 10.2325 21.6194 10.5488C21.3596 10.8651 21.1521 11.2501 21.0101 11.6793C20.8681 12.1085 20.7948 12.5724 20.7948 13.0415V13.0452H17.5263C17.1549 13.0452 16.632 12.754 16.4831 12.4388L13.0616 5.25079C12.5887 4.2401 11.6123 3.76535 10.8529 3.76535H5.09057C4.96291 3.02543 4.65098 2.36501 4.20566 1.89182C3.76034 1.41863 3.20791 1.1606 2.63847 1.1598H2.62595C1.9568 1.1598 1.31506 1.51422 0.841902 2.1451C0.368742 2.77598 0.102924 3.63164 0.102924 4.52384V4.53867C0.102924 6.39687 1.23231 7.90271 2.62595 7.90271H2.63013ZM17.6918 8.86704C18.19 8.86518 18.6768 8.66845 19.0919 8.30122C19.507 7.93399 19.8322 7.41242 20.0271 6.80114L20.034 6.77889H24.7699V4.82241H20.187C20.0665 4.06426 19.7554 3.38376 19.3051 2.89369C18.8548 2.40363 18.2925 2.13342 17.7113 2.12784H17.7099C16.3107 2.12784 15.1827 3.62997 15.1827 5.49559V5.52155C15.1827 7.36862 16.3065 8.86704 17.6918 8.86704ZM12.0296 12.7967V12.7911C12.0296 11.8989 11.7638 11.0433 11.2906 10.4124C10.8175 9.78152 10.1757 9.4271 9.50656 9.4271H9.49822C8.82907 9.4271 8.18732 9.78152 7.71417 10.4124C7.24101 11.0433 6.97519 11.8989 6.97519 12.7911V12.7967C6.97519 14.6623 8.10318 16.1682 9.50239 16.1682C10.1723 16.1657 10.8143 15.8097 11.2879 15.1779C11.7614 14.5461 12.0281 13.6899 12.0296 12.7967ZM29.841 19.178H29.8285C29.2837 19.1778 28.7537 19.4145 28.319 19.8523C27.8842 20.29 27.5684 20.9049 27.4195 21.6037L27.4153 21.6278H22.6975C21.9395 21.6278 21.0118 21.7631 20.4902 22.7738L17.052 29.6002C16.9004 29.9173 16.3941 30.2103 16.0075 30.2103H11.7612C11.6011 29.5242 11.2816 28.9236 10.8489 28.4952C10.4161 28.0669 9.8925 27.833 9.35357 27.8273H9.34939C8.68024 27.8273 8.0385 28.1817 7.56534 28.8126C7.09218 29.4435 6.82636 30.2991 6.82636 31.1913V31.1969C6.82636 33.0607 7.95436 34.5665 9.35217 34.5665C10.4982 34.5665 11.4593 33.554 11.7792 32.1631H15.9755C16.7488 32.1631 17.7961 31.6661 18.2662 30.6999L21.7044 23.8513C21.7211 23.8068 21.856 23.625 22.6989 23.625H27.4682C27.8034 24.951 28.7478 25.8968 29.8591 25.8968H29.8619C30.5313 25.8963 31.1732 25.5415 31.6465 24.9104C32.1198 24.2793 32.3859 23.4234 32.3863 22.5309V22.5253C32.3736 21.6352 32.1005 20.7869 31.6252 20.1615C31.1499 19.5361 30.5101 19.1831 29.8424 19.178H29.841ZM22.9326 27.2877H22.9312C22.2613 27.2877 21.6189 27.6425 21.1452 28.274C20.6715 28.9056 20.4054 29.7622 20.4054 30.6554V30.661C20.4054 32.5247 21.5334 34.0269 22.9326 34.0269C24.3318 34.0269 25.4584 32.5229 25.4584 30.661C25.4584 28.7954 24.3318 27.2877 22.9326 27.2877Z" + fill="white" + /> + </svg> + </SvgIcon> +); diff --git a/frontend/src/icons/SendIcon.tsx b/frontend/src/icons/SendIcon.tsx new file mode 100644 index 0000000..252256f --- /dev/null +++ b/frontend/src/icons/SendIcon.tsx @@ -0,0 +1,33 @@ +import { Box } from '@mui/material'; +import React from 'react'; + +// 定义你的图标属性类型,这里可以扩展成任何你需要的属性 +interface CustomIconProps { + size?: number; + color?: string; + // ...其他你需要的props +} + +// 创建你的自定义SVG图标组件 +const SendIcon: React.FC<CustomIconProps> = ({ + size = 24, + color = 'currentColor', +}) => { + return ( + <Box + component="svg" + width={size} + height={size} + viewBox="0 0 37 37" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M33.6537 0.409255L1.63031 19.3122C0.591998 19.9271 0.0578123 20.7469 0 21.5412V21.837C0.0739997 22.7872 0.832497 23.656 2.22693 24.0356L8.44059 25.7312C8.59912 25.7689 8.76347 25.7748 8.92425 25.7485C9.08503 25.7222 9.23909 25.6642 9.37761 25.5779C9.51614 25.4916 9.63642 25.3787 9.73157 25.2455C9.82672 25.1124 9.89488 24.9616 9.93215 24.8019C10.0176 24.479 9.97573 24.1354 9.81541 23.8428C9.65509 23.5502 9.38869 23.3314 9.0719 23.2321L2.87905 21.5435L34.4376 2.91537L30.9966 28.5168C30.9458 28.8965 30.6659 29.0874 30.3191 28.9896L17.1078 25.3399L27.8146 14.2092C28.0478 13.9627 28.1778 13.6354 28.1778 13.295C28.1778 12.9546 28.0478 12.6273 27.8146 12.3808C27.7009 12.2613 27.5643 12.1661 27.4131 12.1011C27.2619 12.0361 27.0991 12.0026 26.9347 12.0026C26.7703 12.0026 26.6076 12.0361 26.4564 12.1011C26.3052 12.1661 26.1686 12.2613 26.0548 12.3808L14.3189 24.5853C14.2183 24.6903 14.1233 24.8007 14.0345 24.916C13.8502 25.0368 13.6999 25.2033 13.5978 25.3995C13.4958 25.5957 13.4455 25.815 13.4518 26.0363C13.3261 26.4196 13.2621 26.8206 13.2621 27.2242V34.7355C13.2621 36.5429 15.1977 37.6166 16.643 36.6174L22.6508 32.4553C23.0208 32.2015 23.229 31.7589 23.2012 31.2954C23.1875 31.0714 23.1164 30.8547 22.9948 30.6665C22.8732 30.4783 22.7053 30.3251 22.5075 30.2217C22.3131 30.1212 22.0953 30.0759 21.8773 30.0906C21.6594 30.1054 21.4495 30.1797 21.2703 30.3056L15.7481 34.1299V27.6364L29.6762 31.4794C31.4684 31.9755 33.1981 30.7854 33.4548 28.8662L36.9652 2.75233C37.2704 0.55133 35.5199 -0.694738 33.6537 0.409255Z" + fill={color} + /> + </Box> + ); +}; + +export default SendIcon; diff --git a/frontend/src/icons/checkIcon.tsx b/frontend/src/icons/checkIcon.tsx new file mode 100644 index 0000000..698ec8a --- /dev/null +++ b/frontend/src/icons/checkIcon.tsx @@ -0,0 +1,33 @@ +import { Box } from '@mui/material'; +import React from 'react'; + +// 定义你的图标属性类型,这里可以扩展成任何你需要的属性 +interface CustomIconProps { + size?: number | string; + color?: string; + // ...其他你需要的props +} + +// 创建你的自定义SVG图标组件 +const checkIcon: React.FC<CustomIconProps> = ({ + size = '100%', + color = 'currentColor', +}) => { + return ( + <Box + component="svg" + width={size} + height="auto" + viewBox="0 0 11 9" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M10.7204 0C7.37522 1.94391 4.95071 4.40066 3.85635 5.63171L1.18331 3.64484L0 4.54699L4.61463 9C5.4068 7.07085 7.92593 3.30116 11 0.620227L10.7204 0Z" + fill={color} + /> + </Box> + ); +}; + +export default checkIcon; diff --git a/frontend/src/modern-app-env.d.ts b/frontend/src/modern-app-env.d.ts new file mode 100644 index 0000000..3f45350 --- /dev/null +++ b/frontend/src/modern-app-env.d.ts @@ -0,0 +1,3 @@ +/// <reference types='@modern-js/app-tools/types' /> +/// <reference types='@modern-js/runtime/types' /> +/// <reference types='@modern-js/runtime/types/router' /> diff --git a/frontend/src/routes/index.scss b/frontend/src/routes/index.scss new file mode 100644 index 0000000..b9bdead --- /dev/null +++ b/frontend/src/routes/index.scss @@ -0,0 +1,28 @@ +html, +body, +body > div#root { + margin: 0; + height: 100%; + width: 100%; + overflow: hidden; + font-family: PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +div#root { + position: relative; +} + +.side-resize-bar { + transition: all 300ms; + z-index: 1000; + &:hover, + &:active, + &:focus { + background-color: #0093ffcc; + } +} + +/*webkit内核*/ +::-webkit-scrollbar { + display: none; +} diff --git a/frontend/src/routes/layout.tsx b/frontend/src/routes/layout.tsx new file mode 100644 index 0000000..4b30e1a --- /dev/null +++ b/frontend/src/routes/layout.tsx @@ -0,0 +1,81 @@ +import { observer } from 'mobx-react-lite'; +import { ThemeProvider, createTheme } from '@mui/material/styles'; +import { Outlet } from '@modern-js/runtime/router'; +import React from 'react'; +import FloatWindow from '@/components/FloatWindow'; +import { globalStorage } from '@/storage'; +import AgentAssignment from '@/components/AgentAssignment'; +import TaskModification from '@/components/TaskModification'; +import PlanModification from '@/components/PlanModification'; + +const theme = createTheme({ + palette: { + primary: { + main: '#43A8AA', + }, + }, +}); + +export default observer(() => { + const [resizePlanOutline, setResizePlanOutline] = React.useState(0); + const [resizeProcessModification, setResizeProcessModification] = + React.useState(0); + return ( + <ThemeProvider theme={theme}> + <Outlet /> + {globalStorage.planModificationWindow ? ( + <FloatWindow + title="Plan Outline Exploration" + onClose={() => (globalStorage.planModificationWindow = false)} + onResize={() => { + setResizePlanOutline(old => (old + 1) % 100); + }} + > + <PlanModification + style={{ + height: '100%', + width: '100%', + }} + resizeSignal={resizePlanOutline} + /> + </FloatWindow> + ) : ( + <></> + )} + {globalStorage.agentAssigmentWindow ? ( + <FloatWindow + title="Assignment Exploration" + onClose={() => (globalStorage.agentAssigmentWindow = false)} + > + <AgentAssignment + style={{ + height: '100%', + width: '100%', + }} + /> + </FloatWindow> + ) : ( + <></> + )} + {globalStorage.taskProcessModificationWindow ? ( + <FloatWindow + title="Task Process Exploration" + onClose={() => (globalStorage.taskProcessModificationWindow = false)} + onResize={() => { + setResizeProcessModification(old => (old + 1) % 100); + }} + > + <TaskModification + style={{ + height: '100%', + width: '100%', + }} + resizeSignal={resizeProcessModification} + /> + </FloatWindow> + ) : ( + <></> + )} + </ThemeProvider> + ); +}); diff --git a/frontend/src/routes/page.tsx b/frontend/src/routes/page.tsx new file mode 100644 index 0000000..c49549a --- /dev/null +++ b/frontend/src/routes/page.tsx @@ -0,0 +1,156 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import localForage from 'localforage'; +import Drawer from '@mui/material/Drawer'; +import { Helmet } from '@modern-js/runtime/head'; +import ViewConnector from '@/components/ViewConnector'; + +import './index.scss'; + +import ResizeableColumn from '@/components/ResizeableColumn'; +import HeadBar from '@/components/HeadBar'; +import Outline from '@/components/Outline'; +import AgentHiring from '@/components/AgentHiring'; +import AgentBoard from '@/components/AgentBoard'; +import ProcessRehearsal from '@/components/ProcessRehearsal'; +import UserGoalInput from '@/components/UserGoalInput'; +import ProcessDiscrption from '@/components/ProcessDiscription'; + +import { globalStorage } from '@/storage'; + +// 持久化 +localForage.config({ + name: 'AgentCoord', + storeName: 'app', +}); + +export default React.memo(() => { + React.useEffect(() => { + let id: NodeJS.Timer | undefined; + if (!globalStorage.devMode) { + localForage.getItem('globalStorage').then(v => { + if (v) { + globalStorage.load(v); + } + }); + id = setInterval(() => { + localForage.setItem('globalStorage', globalStorage.dump()); + }, 1000); + } + + // globalStorage.getAgents(); + + const refreshLines = () => + globalStorage.renderLines({ delay: 0, repeat: 1, interval: 15 }); + window.addEventListener('resize', refreshLines); + // window.addEventListener('pointermove', refreshLines); + return () => { + if (id) { + clearInterval(id); + } + // window.removeEventListener('pointermove', refreshLines); + window.removeEventListener('resize', refreshLines); + }; + }, []); + const [showAgentHiring, setShowAgentHiring] = React.useState(false); + return ( + <> + <Helmet> + <link + rel="stylesheet" + href="/assets/katex.min.css" + type="text/css" + media="all" + /> + <title>AgentCoord + + {/* Columns */} + + + + + + + + + + setShowAgentHiring(true)} + /> + + + + + + + + + + {/* Drawers */} + setShowAgentHiring(false)} + > + + + + ); +}); diff --git a/frontend/src/static/AgentIcons/Abigail_Chen.png b/frontend/src/static/AgentIcons/Abigail_Chen.png new file mode 100644 index 0000000..6bbfe42 Binary files /dev/null and b/frontend/src/static/AgentIcons/Abigail_Chen.png differ diff --git a/frontend/src/static/AgentIcons/Adam_Smith.png b/frontend/src/static/AgentIcons/Adam_Smith.png new file mode 100644 index 0000000..7097959 Binary files /dev/null and b/frontend/src/static/AgentIcons/Adam_Smith.png differ diff --git a/frontend/src/static/AgentIcons/Arthur_Burton.png b/frontend/src/static/AgentIcons/Arthur_Burton.png new file mode 100644 index 0000000..f6fcf35 Binary files /dev/null and b/frontend/src/static/AgentIcons/Arthur_Burton.png differ diff --git a/frontend/src/static/AgentIcons/Ayesha_Khan.png b/frontend/src/static/AgentIcons/Ayesha_Khan.png new file mode 100644 index 0000000..03191d4 Binary files /dev/null and b/frontend/src/static/AgentIcons/Ayesha_Khan.png differ diff --git a/frontend/src/static/AgentIcons/Carlos_Gomez.png b/frontend/src/static/AgentIcons/Carlos_Gomez.png new file mode 100644 index 0000000..ad1d9ef Binary files /dev/null and b/frontend/src/static/AgentIcons/Carlos_Gomez.png differ diff --git a/frontend/src/static/AgentIcons/Carmen_Ortiz.png b/frontend/src/static/AgentIcons/Carmen_Ortiz.png new file mode 100644 index 0000000..37bea30 Binary files /dev/null and b/frontend/src/static/AgentIcons/Carmen_Ortiz.png differ diff --git a/frontend/src/static/AgentIcons/Eddy_Lin.png b/frontend/src/static/AgentIcons/Eddy_Lin.png new file mode 100644 index 0000000..72033bb Binary files /dev/null and b/frontend/src/static/AgentIcons/Eddy_Lin.png differ diff --git a/frontend/src/static/AgentIcons/Francisco_Lopez.png b/frontend/src/static/AgentIcons/Francisco_Lopez.png new file mode 100644 index 0000000..1315845 Binary files /dev/null and b/frontend/src/static/AgentIcons/Francisco_Lopez.png differ diff --git a/frontend/src/static/AgentIcons/Giorgio_Rossi.png b/frontend/src/static/AgentIcons/Giorgio_Rossi.png new file mode 100644 index 0000000..11ea128 Binary files /dev/null and b/frontend/src/static/AgentIcons/Giorgio_Rossi.png differ diff --git a/frontend/src/static/AgentIcons/Hailey_Johnson.png b/frontend/src/static/AgentIcons/Hailey_Johnson.png new file mode 100644 index 0000000..b88b1f6 Binary files /dev/null and b/frontend/src/static/AgentIcons/Hailey_Johnson.png differ diff --git a/frontend/src/static/AgentIcons/Isabella_Rodriguez.png b/frontend/src/static/AgentIcons/Isabella_Rodriguez.png new file mode 100644 index 0000000..b044d5b Binary files /dev/null and b/frontend/src/static/AgentIcons/Isabella_Rodriguez.png differ diff --git a/frontend/src/static/AgentIcons/Jane_Moreno.png b/frontend/src/static/AgentIcons/Jane_Moreno.png new file mode 100644 index 0000000..72088f7 Binary files /dev/null and b/frontend/src/static/AgentIcons/Jane_Moreno.png differ diff --git a/frontend/src/static/AgentIcons/Jennifer_Moore.png b/frontend/src/static/AgentIcons/Jennifer_Moore.png new file mode 100644 index 0000000..234a84d Binary files /dev/null and b/frontend/src/static/AgentIcons/Jennifer_Moore.png differ diff --git a/frontend/src/static/AgentIcons/John_Lin.png b/frontend/src/static/AgentIcons/John_Lin.png new file mode 100644 index 0000000..0051c3f Binary files /dev/null and b/frontend/src/static/AgentIcons/John_Lin.png differ diff --git a/frontend/src/static/AgentIcons/Klaus_Mueller.png b/frontend/src/static/AgentIcons/Klaus_Mueller.png new file mode 100644 index 0000000..6d42af1 Binary files /dev/null and b/frontend/src/static/AgentIcons/Klaus_Mueller.png differ diff --git a/frontend/src/static/AgentIcons/Latoya_Williams.png b/frontend/src/static/AgentIcons/Latoya_Williams.png new file mode 100644 index 0000000..7454c3f Binary files /dev/null and b/frontend/src/static/AgentIcons/Latoya_Williams.png differ diff --git a/frontend/src/static/AgentIcons/Maria_Lopez.png b/frontend/src/static/AgentIcons/Maria_Lopez.png new file mode 100644 index 0000000..f6d43bb Binary files /dev/null and b/frontend/src/static/AgentIcons/Maria_Lopez.png differ diff --git a/frontend/src/static/AgentIcons/Mei_Lin.png b/frontend/src/static/AgentIcons/Mei_Lin.png new file mode 100644 index 0000000..359ee93 Binary files /dev/null and b/frontend/src/static/AgentIcons/Mei_Lin.png differ diff --git a/frontend/src/static/AgentIcons/Rajiv_Patel.png b/frontend/src/static/AgentIcons/Rajiv_Patel.png new file mode 100644 index 0000000..8fa1b0c Binary files /dev/null and b/frontend/src/static/AgentIcons/Rajiv_Patel.png differ diff --git a/frontend/src/static/AgentIcons/Ryan_Park.png b/frontend/src/static/AgentIcons/Ryan_Park.png new file mode 100644 index 0000000..7748ff8 Binary files /dev/null and b/frontend/src/static/AgentIcons/Ryan_Park.png differ diff --git a/frontend/src/static/AgentIcons/Sam_Moore.png b/frontend/src/static/AgentIcons/Sam_Moore.png new file mode 100644 index 0000000..726732a Binary files /dev/null and b/frontend/src/static/AgentIcons/Sam_Moore.png differ diff --git a/frontend/src/static/AgentIcons/Tamara_Taylor.png b/frontend/src/static/AgentIcons/Tamara_Taylor.png new file mode 100644 index 0000000..fc34ea9 Binary files /dev/null and b/frontend/src/static/AgentIcons/Tamara_Taylor.png differ diff --git a/frontend/src/static/AgentIcons/Tom_Moreno.png b/frontend/src/static/AgentIcons/Tom_Moreno.png new file mode 100644 index 0000000..65416fa Binary files /dev/null and b/frontend/src/static/AgentIcons/Tom_Moreno.png differ diff --git a/frontend/src/static/AgentIcons/Unknow.png b/frontend/src/static/AgentIcons/Unknow.png new file mode 100644 index 0000000..26fa5e2 Binary files /dev/null and b/frontend/src/static/AgentIcons/Unknow.png differ diff --git a/frontend/src/static/AgentIcons/Wolfgang_Schulz.png b/frontend/src/static/AgentIcons/Wolfgang_Schulz.png new file mode 100644 index 0000000..a7ca2a8 Binary files /dev/null and b/frontend/src/static/AgentIcons/Wolfgang_Schulz.png differ diff --git a/frontend/src/static/AgentIcons/Yuriko_Yamamoto.png b/frontend/src/static/AgentIcons/Yuriko_Yamamoto.png new file mode 100644 index 0000000..a7b963c Binary files /dev/null and b/frontend/src/static/AgentIcons/Yuriko_Yamamoto.png differ diff --git a/frontend/src/storage/debug.ts b/frontend/src/storage/debug.ts new file mode 100644 index 0000000..dba129e --- /dev/null +++ b/frontend/src/storage/debug.ts @@ -0,0 +1,82 @@ +import { autorun } from 'mobx'; +import { GlobalStorage } from '.'; + +export const debug = (store: GlobalStorage) => { + autorun(() => { + const { availiableAgents } = store; + console.groupCollapsed('[LOG] GetAgent:', availiableAgents.length); + for (const agent of availiableAgents) { + // console 输出,name 粗体,profile 正常 + console.info('%c%s', 'font-weight: bold', agent.name, agent.profile); + } + console.groupEnd(); + }); + + autorun(() => { + const { agentCards } = store; + console.groupCollapsed('[LOG] AgentCards:', agentCards.length); + for (const agentCard of agentCards) { + console.groupCollapsed( + `agent: ${agentCard.name}`, + 'inuse:', + agentCard.inuse, + 'action:', + agentCard.actions.length, + ); + for (const action of agentCard.actions) { + console.groupCollapsed( + '%c%s', + `font-weight: bold`, + action.type, + action.description, + 'input:', + action.inputs.length, + ); + for (const input of action.inputs) { + console.info(input); + } + console.groupEnd(); + } + console.groupEnd(); + } + console.groupEnd(); + }); + + autorun(() => { + const { refMap } = store; + console.groupCollapsed('[LOG] RefMap'); + for (const [key, map] of Object.entries(refMap)) { + console.groupCollapsed(key); + for (const [k, v] of map) { + console.info(k, v); + } + console.groupEnd(); + } + console.groupEnd(); + }); + + autorun(() => { + const { planManager } = store; + console.groupCollapsed('[LOG] planManager'); + console.info(planManager); + const currentLeafId = planManager.currentStepTaskLeaf; + if (currentLeafId) { + const currentPath = planManager.stepTaskMap.get(currentLeafId)?.path; + const outline = { + initialInputs: planManager.inputs, + processes: currentPath + ?.map(nodeId => planManager.stepTaskMap.get(nodeId)) + .filter(node => node) + .map(node => ({ + inputs: node?.inputs, + output: node?.output, + StepName: node?.name, + AgentSelection: node?.agentSelection, + })), + }; + console.log(outline); + } + + console.groupEnd(); + }); +}; diff --git a/frontend/src/storage/index.ts b/frontend/src/storage/index.ts new file mode 100644 index 0000000..a9fadc4 --- /dev/null +++ b/frontend/src/storage/index.ts @@ -0,0 +1,1141 @@ +/* eslint-disable max-lines */ +import React from 'react'; +import { SxProps } from '@mui/material'; +import throttle from 'lodash/throttle'; +import { makeAutoObservable } from 'mobx'; +import { + PlanManager, + ActionType, + RehearsalLog, + StepTaskNode, + AgentSelection, +} from './plan'; +import { debug } from './debug'; +import { getAgentActionStyle } from '@/storage/plan'; +import { IAgent, getAgentsApi } from '@/apis/get-agents'; +import { + IApiStepTask, + IApiAgentAction, + genBasePlanApi, +} from '@/apis/generate-base-plan'; +import { ExecuteNodeType, executePlanApi } from '@/apis/execute-plan'; +import { newPlanBranchApi } from '@/apis/new-plan-branch'; +import { fillStepTaskApi } from '@/apis/fill-step-task'; +import { newActionBranchApi } from '@/apis/new-action-branch'; +import { + agentSelectModifyInitApi, + agentSelectModifyAddApi, +} from '@/apis/agent-select-modify'; +import { fillAgentSelectionApi } from '@/apis/fill-agent-selection'; +import { IconName } from '@/components/AgentIcon'; +import { setAgentsApi } from '@/apis/set-agents'; + +export interface IAgentAction { + type: ActionType; + inputs: string[]; + description: string; + style: SxProps; +} + +export interface IAgentCard extends IAgent { + actions: IAgentAction[]; + inuse: boolean; + lastOfUsed: boolean; + ref: React.RefObject; +} + +export interface IPlanTreeNode { + id: string; + name: string; + agents: string[]; + agentIcons: string[]; + leaf: boolean; + children: IPlanTreeNode[]; + requirement?: string; + baseBranchLeafId?: string; + focusing: boolean; +} + +export interface IAgentActionTreeNode { + id: string; + agent: string; + icon: string; + leaf: boolean; + children: IAgentActionTreeNode[]; + requirement?: string; + baseBranchLeafId?: string; + style: SxProps; + action: { type: ActionType; description: string }; + focusing: boolean; +} + +export interface IRenderingAgentSelections { + heatdata: Record>; + selections: Record; + current?: string; +} + +export class ApiState { + public planReady: boolean = false; + + public agentsReady: boolean = false; + + public fetchingAgents: boolean = false; + + public planGenerating: boolean = false; + + public stepTaskTreeGenerating: boolean = false; + + public agentActionTreeGenerating: boolean = false; + + public agentAspectScoresGenerating: boolean = false; + + public planExecuting: boolean = false; + + public get busy() { + return ( + this.fetchingAgents || + this.planGenerating || + this.stepTaskTreeGenerating || + this.agentActionTreeGenerating || + this.planExecuting || + this.agentAspectScoresGenerating + ); + } + + public get ready() { + return this.planReady && this.agentsReady && !this.busy; + } + + constructor() { + makeAutoObservable(this); + } +} + +export class FormState { + public goal: string = ''; + + public inputs: Record = {}; + + constructor() { + makeAutoObservable(this); + } +} + +const blankPlan = new PlanManager(); +const blankLog = new RehearsalLog(blankPlan); + +export class GlobalStorage { + // 开发模式没有持久化 + public devMode: boolean = true; + + public planModificationWindow: boolean = false; + + public taskProcessModificationWindow: boolean = false; + + public agentAssigmentWindow: boolean = false; + + public briefGoal: string = ''; + + public briefUserInputs: Record = {}; + + public planTabArrange: string[] = []; + + public plans: Record = {}; + + public currentPlanId?: string; + + public api: ApiState = new ApiState(); + + public form: FormState = new FormState(); + + public agentMap: Map = new Map(); + + public focusingStepTaskIds: Record = {}; + + public get focusingStepTaskId() { + return this.focusingStepTaskIds[this.currentPlanId ?? '']; + } + + public get planManager() { + return this.plans[this.currentPlanId ?? '']?.[0] ?? blankPlan; + } + + public get logManager() { + return this.plans[this.currentPlanId ?? '']?.[1] ?? blankLog; + } + + public get availiableAgents(): IAgent[] { + return Array.from(this.agentMap.values()); + } + + public get focusingStepTask() { + if (this.focusingStepTaskId) { + return this.planManager.stepTaskMap.get(this.focusingStepTaskId); + } + return undefined; + } + + public get currentFocusingAgentSelection() { + return this.focusingStepTask?.agentSelection; + } + + public get agentCardsInUse(): IAgentCard[] { + const map = new Map(); + for (const action of this.currentFocusingAgentSelection + ?.currentTaskProcess ?? []) { + const agent = map.get(action.agent) ?? { + ...(this.agentMap.get(action.agent) ?? { + name: action.agent, + profile: '', + icon: IconName.Unknown, + }), + actions: [], + inuse: true, + lastOfUsed: false, + ref: React.createRef(), + }; + agent.actions.push({ + type: action.type, + inputs: action.inputs, + description: action.description, + style: getAgentActionStyle(action.type), + }); + map.set(action.agent, agent); + } + for (const agent of this.currentFocusingAgentSelection?.agents ?? []) { + if (!map.has(agent)) { + map.set(agent, { + ...(this.agentMap.get(agent) ?? { + name: agent, + profile: '', + icon: IconName.Unknown, + }), + actions: [], + inuse: false, + lastOfUsed: false, + ref: React.createRef(), + }); + } + } + const t = Array.from(map.values()); + for (let i = t.length - 1; i >= 0; i--) { + if (t[i].inuse) { + t[i].lastOfUsed = true; + break; + } + } + return t; + } + + public get agentCards(): IAgentCard[] { + const { agentCardsInUse } = this; + const agentCards: IAgentCard[] = [...agentCardsInUse]; + const agentInUse = new Map( + agentCardsInUse.map(card => [card.name, card]), + ); + for (const agent of this.availiableAgents) { + if (!agentInUse.has(agent.name)) { + agentCards.push({ + ...agent, + actions: [], + inuse: false, + lastOfUsed: false, + ref: React.createRef(), + }); + } + } + return agentCards; + } + + get outlineCardRefMap() { + return new Map( + this.outlineRenderingStepTaskCards.map(card => [card.id, card.ref]), + ); + } + + get agentCardRefMap() { + return new Map(this.agentCards.map(card => [card.name, card.ref])); + } + + get descriptionCardRefMap() { + return new Map( + this.planManager.currentPlan + .map(node => node.descriptionCard) + .map(card => [card.id, card.ref]), + ); + } + + get logCardRefMap() { + return new Map( + this.logManager.renderingLog.map(card => [card.id, card.ref]), + ); + } + + public get refMap(): Record< + 'OutlineCard' | 'AgentCard' | 'DiscriptionCard' | 'RehearsalLogCard', + Map> + > { + return { + OutlineCard: this.outlineCardRefMap, + AgentCard: this.agentCardRefMap, + DiscriptionCard: this.descriptionCardRefMap, + RehearsalLogCard: this.logCardRefMap, + }; + } + + public get ElementToLink(): [ + React.RefObject | undefined, + React.RefObject[], + React.RefObject | undefined, + (React.RefObject | undefined)[], + ] { + return [ + this.refMap.OutlineCard.get(this.focusingStepTaskId ?? ''), + this.focusingStepTask?.agentSelection?.agents?.map( + agent => this.refMap.AgentCard.get(agent) ?? [], + ) ?? ([] as any), + this.refMap.DiscriptionCard.get(this.focusingStepTaskId ?? ''), + this.logManager.outdate + ? [] + : [ + this.refMap.RehearsalLogCard.get(this.focusingStepTask?.name ?? ''), + this.refMap.RehearsalLogCard.get( + this.focusingStepTask?.output ?? '', + ), + ], + ]; + } + + public get agentIconMap() { + return new Map( + this.availiableAgents.map(agent => [agent.name, agent.icon]), + ); + } + + public get userInputs() { + return Object.keys(this.form.inputs); + } + + public get outlineRenderingStepTaskCards() { + const { agentIconMap } = this; + return this.planManager.currentPlan + .map(node => node.outlineCard) + .map(card => ({ + ...card, + agentIcons: card.agents.map(agent => agentIconMap.get(agent)!) ?? [ + 'Unknown', + ], + })); + } + + public get currentStepTaskNodeSet() { + let leaf = this.planManager.currentStepTaskLeaf; + const set = new Set(); + while (leaf) { + set.add(leaf); + leaf = this.planManager.stepTaskMap.get(leaf)?.last?.id; + } + return set; + } + + public get previewStepTaskNodeSet() { + let leaf = this.planManager.previewStepTaskLeaf; + const set = new Set(); + while (leaf) { + set.add(leaf); + leaf = this.planManager.stepTaskMap.get(leaf)?.last?.id; + } + return set; + } + + public get renderingPlanForest(): IPlanTreeNode[] { + // 递归地构建 + const buildSubtree = (stepTaskId: string): IPlanTreeNode => { + const stepTask = this.planManager.stepTaskMap.get(stepTaskId); + if (!stepTask) { + throw new Error(`StepTask ${stepTaskId} not found`); + } + const agents = stepTask.agentSelection?.agents ?? []; + const agentIcons = agents.map(agent => this.agentIconMap.get(agent)!) ?? [ + 'Unknown', + ]; + const branchInfo = this.planManager.branches[stepTaskId]; + return { + id: stepTaskId, + name: stepTask.name, + agents, + agentIcons, + leaf: branchInfo !== undefined, + children: stepTask.children.map(buildSubtree), + focusing: this.planManager.activeStepNodeIds.has(stepTaskId), + ...(branchInfo && { + requirement: branchInfo.requirement, + baseBranchLeafId: branchInfo.base, + }), + }; + }; + return this.planManager.stepTaskRoots.map(root => buildSubtree(root)); + } + + public get renderingActionForest(): IAgentActionTreeNode[] { + const selection = this.focusingStepTask?.agentSelection; + if (!selection) { + return []; + } + const buildSubtree = (actionId: string): IAgentActionTreeNode => { + const action = this.planManager.agentActionMap.get(actionId); + if (!action) { + throw new Error(`AgentAction ${actionId} not found`); + } + const branchInfo = selection.branches[actionId]; + return { + id: actionId, + agent: action.agent, + icon: this.agentIconMap.get(action.agent)!, + leaf: branchInfo !== undefined, + children: action.children.map(buildSubtree), + style: getAgentActionStyle(action.type), + ...(branchInfo && { + requirement: branchInfo.requirement, + baseBranchLeafId: branchInfo.base, + }), + action: { type: action.type, description: action.description }, + focusing: selection.activeTaskIds.has(actionId), + }; + }; + return selection.actionRoot.map(root => buildSubtree(root)); + } + + public get renderingAgentSelections(): IRenderingAgentSelections { + const stepTask = this.focusingStepTask; + if (!stepTask) { + return { + heatdata: {}, + selections: {}, + }; + } + if (Object.keys(stepTask.heatmap).length === 0) { + this.touchAgentSelectionAspects(); + } + const selections = Object.fromEntries( + stepTask.allSelections.map(selection => [ + selection.id, + { + id: selection.id, + agents: selection.agents, + }, + ]), + ); + return { + selections, + heatdata: stepTask.heatmap, + current: stepTask.currentAgentSelection, + }; + } + + public get currentActionNodeSet() { + const selection = this.planManager.agentSelectionMap.get( + this.currentFocusingAgentSelection?.id ?? '', + ); + const set = new Set(); + if (selection) { + const currentLeafId = selection.currentActionLeaf!; + let leaf = this.planManager.agentActionMap.get(currentLeafId); + while (leaf) { + set.add(leaf.id); + leaf = leaf.last; + } + } + + return set; + } + + public get rehearsalSvgObjectOrder() { + return [ + ...Object.keys(this.form.inputs).map(name => `Object.${name}`), + ...this.logManager.renderingLog.map(step => + step.type === ExecuteNodeType.Step + ? `Step.${step.id}` + : `Object.${step.id}`, + ), + ]; + } + + public get rehearsalSvgLines() { + return this.logManager.renderingLog + .map(step => + step.type === ExecuteNodeType.Step + ? step.history.map(item => + item.inputs.map(input => { + const inputStr = input.split(':', 2); + let inputName = ''; + if (inputStr[0] === 'ActionResult') { + inputName = `Action.${step.id}.${inputStr[1]}`; + } else if (inputStr[0] === 'InputObject') { + inputName = `Object.${inputStr[1]}`; + } else if ( + this.logManager.renderingLog + .filter(item => item.type === 'object') + .find(r => r.id === input) + ) { + inputName = `Object.${input}`; + } else if (step.history.find(r => r.id === input)) { + inputName = `Action.${step.id}.${input}`; + } + return { + from: inputName, + to: `Action.${step.id}.${item.id}`, + type: item.type, + }; + }), + ) + : [], + ) + .flat(2) + .flat() + .filter(line => line.from && line.to); + } + + public get renderingIOLines() { + return this.logManager.renderingLog + .filter(r => r.type === 'step') + .map((step: any) => { + return [ + { + type: 'output', + from: `Step.${step.id}`, + to: `Object.${step.output}`, + }, + ...step.inputs.map((input: string) => ({ + type: 'input', + from: `Object.${input}`, + to: `Step.${step.id}`, + })), + ]; + }) + .flat(); + } + + constructor() { + makeAutoObservable(this); + } + + public async setAgents(agents: IAgent[]) { + this.api.fetchingAgents = true; + await setAgentsApi(agents); + this.agentMap = new Map(agents.map(agent => [agent.name, agent])); + this.api.agentsReady = true; + this.api.fetchingAgents = false; + } + + public async getAgents() { + this.api.fetchingAgents = true; + const agents = await getAgentsApi(); + this.api.fetchingAgents = false; + this.agentMap = new Map(agents.map(agent => [agent.name, agent])); + this.api.agentsReady = true; + } + + public async generatePlanBase() { + this.api.planGenerating = true; + try { + const { goal, inputs } = this.form; + const plan = await genBasePlanApi({ + goal, + inputs: Object.keys(inputs), + }); + const planManager = new PlanManager(); + planManager.parseApiPlan(plan); + const logManager = new RehearsalLog(planManager); + // 随机字符串 + let planId = Math.random().toString(36).slice(2); + while (this.plans[planId]) { + planId = Math.random().toString(36).slice(2); + } + this.plans[planId] = [planManager, logManager]; + this.planTabArrange.push(planId); + this.focusPlan(planId); + // 清空 + this.briefGoal = ''; + this.briefUserInputs = {}; + } catch (e) { + console.error(e); + } + this.api.planGenerating = false; + } + + public async executePlan(count = 1) { + this.api.planExecuting = true; + try { + const log = []; + // 前面添加 this.form.inputs 的记录 + for (const [key, value] of Object.entries(this.form.inputs)) { + log.push({ + type: ExecuteNodeType.Object, + id: key, + content: value, + }); + } + // log.push(...this.logManager.logWithoutUserInput); + const plan = this.planManager.apiPlan; + const logs = await executePlanApi({ + plan, + stepsToRun: count, + rehearsalLog: log as any, + }); + this.logManager.updateLog(logs); + } catch (e) { + console.error(e); + } + this.api.planExecuting = false; + } + + public async newPlanBranch( + start: string | undefined, + requirement: string, + batch = 1, + base?: string, + ) { + this.api.stepTaskTreeGenerating = true; + try { + const existingSteps: IApiStepTask[] = []; + const baseSteps: IApiStepTask[] = []; + + // 构建前后序列 + if (start) { + let node = this.planManager.stepTaskMap.get(start); + while (node) { + existingSteps.push(node.apiStepTask); + node = node.last; + } + existingSteps.reverse(); + } + if (base) { + let node = this.planManager.stepTaskMap.get(base); + while (node) { + baseSteps.push(node.apiStepTask); + node = node.last; + } + baseSteps.reverse(); + } + + const branches = await newPlanBranchApi({ + goal: this.planManager.goal, + inputs: this.planManager.inputs, + batch, + requirement, + base: baseSteps, + existing: existingSteps, + }); + const branchLeaves = branches.map(branch => + this.planManager.insertProcess(branch, start, requirement, base), + ); + + // 延迟加载 + const stepTaskToFill: [StepTaskNode, AgentSelection][] = []; + for (const branch of branchLeaves) { + let node = this.planManager.stepTaskMap.get(branch); + while (node && node.id !== start) { + stepTaskToFill.push([node, node.agentSelection!]); + node = node.last; + } + } + const fillTask = async ( + node: StepTaskNode, + selection: AgentSelection, + ) => { + const filled = await fillStepTaskApi({ + goal: this.planManager.goal, + stepTask: node.apiStepTask, + }); + const leaf = selection.insertActions(filled.process); + selection.currentActionLeaf = leaf; + selection.agents.push(...filled.agents); + }; + (async () => { + try { + for (const [node, selection] of stepTaskToFill) { + await fillTask(node, selection); + } + } catch (e) { + console.error(e); + } + this.api.stepTaskTreeGenerating = false; + })(); + return branchLeaves; + } catch (e) { + console.error(e); + } + this.api.stepTaskTreeGenerating = false; + return []; + } + + public setCurrentAgentActionBranch( + actionBranchLeafId: string, + selectionId?: string, + ) { + const selection = this.planManager.agentSelectionMap.get( + selectionId ?? this.focusingStepTask?.agentSelection?.id ?? '', + ); + if (selection?.leaves.includes(actionBranchLeafId)) { + selection.currentActionLeaf = actionBranchLeafId; + this.logManager.setOutdate(); + } + } + + public updateAgentActionNodeContent(id: string, content: string) { + const actionNode = this.planManager.agentActionMap.get(id); + if (actionNode) { + actionNode.description = content; + this.logManager.setOutdate(); + } + } + + public async newActionBranch( + agentSelectionId: string | undefined, + start: string | undefined, + requirement: string, + batch = 1, + base?: string, + ) { + const agentSelection = agentSelectionId + ? this.planManager.agentSelectionMap.get(agentSelectionId) + : this.focusingStepTask?.agentSelection; + if (!agentSelection) { + throw new Error(`AgentSelection ${agentSelectionId} not found`); + } + const taskNode = agentSelection.belongingStepTask; + if (!taskNode) { + throw new Error(`Beloning StepTask node not found`); + } + this.api.agentActionTreeGenerating = true; + try { + const existingSteps: IApiAgentAction[] = []; + const baseSteps: IApiAgentAction[] = []; + + // 构建前后序列 + if (start) { + let node = this.planManager.agentActionMap.get(start); + while (node) { + existingSteps.push(node.apiAgentAction); + node = node.last; + } + existingSteps.reverse(); + } + if (base) { + let node = this.planManager.agentActionMap.get(base); + while (node) { + baseSteps.push(node.apiAgentAction); + node = node.last; + } + baseSteps.reverse(); + } + + const branches = await newActionBranchApi({ + goal: this.planManager.goal, + stepTask: taskNode.apiStepTask, + requirement, + base: baseSteps, + existing: existingSteps, + batch, + }); + const branchLeaves = branches.map(branch => { + return agentSelection.insertActions(branch, start, requirement, base); + }); + this.api.agentActionTreeGenerating = false; + return branchLeaves; + } catch (e) { + console.error(e); + } + this.api.agentActionTreeGenerating = false; + return []; + } + + public async touchAgentSelectionAspects(stepTaskId?: string) { + const stepTask = this.planManager.stepTaskMap.get( + stepTaskId ?? this.focusingStepTaskId ?? '', + ); + if (stepTask && Object.keys(stepTask.agentAspectScores).length === 0) { + this.api.agentAspectScoresGenerating = true; + try { + const aspects = await agentSelectModifyInitApi({ + stepTask: stepTask.apiStepTask, + goal: this.planManager.goal, + }); + + for (const [aspect, agentScores] of Object.entries(aspects)) { + stepTask.appendAspectScore(aspect, agentScores); + } + } catch (e) { + console.error(e); + } + this.api.agentAspectScoresGenerating = false; + } + } + + public async addAgentSelectionAspects( + aspects: string[] | string, + stepTaskId?: string, + ) { + const stepTask = this.planManager.stepTaskMap.get( + stepTaskId ?? this.focusingStepTaskId ?? '', + ); + if (stepTask) { + this.api.agentAspectScoresGenerating = true; + try { + const aspects_ = await agentSelectModifyAddApi({ + aspects: Array.isArray(aspects) ? aspects : [aspects], + }); + for (const [aspect, agentScores] of Object.entries(aspects_)) { + stepTask.appendAspectScore(aspect, agentScores); + } + } catch (e) { + console.error(e); + } + this.api.agentAspectScoresGenerating = false; + } + } + + public async addAgentSelection(agents: string[]) { + if (!this.focusingStepTask) { + return; + } + this.api.agentActionTreeGenerating = true; + try { + const { apiStepTask } = this.focusingStepTask; + const selectionId = (this.planManager.nextAgentSelectionId++).toString(); + const agentSelection = new AgentSelection(this.planManager, { + id: selectionId, + agents, + }); + this.planManager.selectionStepMap.set( + selectionId, + this.focusingStepTaskId ?? '', + ); + this.planManager.agentSelectionMap.set(agentSelection.id, agentSelection); + this.focusingStepTask.agentSelectionIds.push(agentSelection.id); + const filled = await fillAgentSelectionApi({ + stepTask: apiStepTask, + goal: this.planManager.goal, + agents, + }); + const leaf = agentSelection.insertActions(filled.process); + agentSelection.currentActionLeaf = leaf; + this.setCurrentAgentSelection(agentSelection.id); + } catch (e) { + console.error(e); + } + this.api.agentActionTreeGenerating = false; + } + + renderLines_?: () => void = () => undefined; + + public setRenderLinesMethod(method?: () => void) { + if (method) { + this.renderLines_ = throttle(() => requestAnimationFrame(method), 5, { + leading: false, + trailing: true, + }); + } else { + this.renderLines_ = undefined; + } + } + + public renderLines({ + delay = 0, + repeat = 1, + interval = 30, + }: { + delay?: number; + repeat?: number; + interval?: number; + }) { + setTimeout(() => { + let count = 0; + const id = setInterval(() => { + if (count >= repeat) { + clearInterval(id); + return; + } + this.renderLines_?.(); + count++; + }, interval); + }, delay); + } + + public setFocusingStepTaskId(id?: string) { + this.focusingStepTaskIds[this.currentPlanId ?? ''] = id; + } + + public addUserInput(name: string) { + this.form.inputs[name] ??= ''; + if (this.currentPlanId && !this.planManager.inputs.includes(name)) { + this.planManager.inputs.push(name); + this.logManager.userInputs[name] ??= ''; + this.logManager.setOutdate(); + } + } + + public removeUserInput(name: string) { + delete this.form.inputs[name]; + if (this.currentPlanId) { + this.planManager.inputs = this.planManager.inputs.filter(i => i !== name); + delete this.logManager.userInputs[name]; + this.logManager.setOutdate(); + } + } + + public setUserInput(name: string, content: string) { + if (this.form.inputs[name] !== undefined) { + this.form.inputs[name] = content; + if (this.currentPlanId) { + this.logManager.userInputs[name] = content; + this.logManager.setOutdate(); + } + } + } + + public setCurrentPlanBranch(leafId: string) { + if (leafId in this.planManager.branches) { + this.planManager.currentStepTaskLeaf = leafId; + this.logManager.setOutdate(); + } + } + + public setCurrentAgentSelection(selectionId: string, stepTaskId?: string) { + const stepTask = this.planManager.stepTaskMap.get( + stepTaskId ?? this.focusingStepTaskId ?? '', + ); + if (!stepTask) { + throw new Error(`StepTask node ${stepTaskId} does not exist!`); + } + if ( + !this.planManager.agentSelectionMap.has(selectionId) || + !stepTask.agentSelectionIds.includes(selectionId) + ) { + throw new Error(`AgentSelection node ${selectionId} does not exist!`); + } + stepTask.currentAgentSelection = selectionId; + this.logManager.setOutdate(); + } + + public addStepTaskInput(id: string, input: string) { + const stepTask = this.planManager.stepTaskMap.get(id); + if (stepTask) { + const t = Array.from(new Set([...stepTask.inputs, input])); + stepTask.inputs.length = 0; + stepTask.inputs.push(...t); + this.logManager.setOutdate(); + } + } + + public removeStepTaskInput(id: string, input: string) { + const stepTask = this.planManager.stepTaskMap.get(id); + if (stepTask) { + stepTask.inputs = stepTask.inputs.filter(i => i !== input); + this.logManager.setOutdate(); + } + } + + public setStepTaskContent(id: string, content: string) { + const stepTask = this.planManager.stepTaskMap.get(id); + if (stepTask) { + stepTask.content = content; + this.logManager.setOutdate(); + } + } + + public getStepTaskLeafPath(leafId: string) { + const stepTask = this.planManager.stepTaskMap.get(leafId); + if (stepTask) { + return stepTask.path; + } else { + return []; + } + } + + public getFirstLeafStepTask(nodeId: string) { + let stepTask = this.planManager.stepTaskMap.get(nodeId)!; + while (!this.planManager.branches[stepTask.id]) { + const firstChildId = stepTask.children[0]; + stepTask = this.planManager.stepTaskMap.get(firstChildId)!; + } + return stepTask; + } + + public getFirstLeafAction(nodeId: string) { + const selection = this.focusingStepTask?.agentSelection; + let actionNode = this.planManager.agentActionMap.get(nodeId); + if (actionNode && selection) { + while (!selection.branches[actionNode.id]) { + const firstChildId: string = actionNode.children[0]; + actionNode = this.planManager.agentActionMap.get(firstChildId)!; + } + return { + node: actionNode, + branchInfo: selection.branches[actionNode.id], + }; + } + return undefined; + } + + public getActionLeafPath(leafId: string) { + const actionNode = this.planManager.agentActionMap.get(leafId); + return actionNode?.path ?? []; + } + + public removePlan(id: string) { + if (id === this.currentPlanId) { + // 寻找 planTabArrange 中邻近的替代 + const index = this.planTabArrange.indexOf(id); + if (index !== -1) { + const next = this.planTabArrange[index + 1]; + const prev = this.planTabArrange[index - 1]; + this.currentPlanId = next ?? prev ?? undefined; + } else { + this.currentPlanId = this.planTabArrange[0] ?? undefined; + } + this.focusPlan(this.currentPlanId); + } + this.planTabArrange = this.planTabArrange.filter(tabId => tabId !== id); + delete this.plans[id]; + delete this.focusingStepTaskIds[id]; + } + + public dumpPlan(id: string) { + const [plan, log] = this.plans[id]; + return { + id, + plan: plan.dump(), + log: log.dump(), + }; + } + + public loadPlan(json: any, focus = false) { + const { id, plan, log } = json; + const planManager = new PlanManager(); + planManager.load(plan); + const logManager = new RehearsalLog(planManager, log); + this.plans[id] = [planManager, logManager]; + this.planTabArrange.push(id); + if (focus) { + this.focusPlan(id); + } + } + + public dump() { + const plans: any[] = []; + for (const planId in this.plans) { + plans.push(this.dumpPlan(planId)); + } + return { + plans, + planTabArrange: [...this.planTabArrange], + currentPlanId: this.currentPlanId, + briefGoal: this.briefGoal, + briefUserInputs: JSON.parse(JSON.stringify(this.briefUserInputs)), + }; + } + + public load(json: any) { + for (const plan of json.plans ?? []) { + this.loadPlan(plan); + } + this.briefGoal = json.briefGoal ?? ''; + this.briefUserInputs = JSON.parse( + JSON.stringify(json.briefUserInputs ?? {}), + ); + this.planTabArrange = json.planTabArrange ?? Object.keys(this.plans); + this.focusPlan(json.currentPlanId); + } + + public newPlanTab() { + this.focusPlan(undefined); + } + + public focusPlan(id?: string) { + if (this.currentPlanId === undefined) { + this.briefGoal = this.form.goal; + // clear all ele of briefUserInputs + for (const key in this.briefUserInputs) { + delete this.briefUserInputs[key]; + } + const newInputs = JSON.parse(JSON.stringify(this.form.inputs)); + for (const key in newInputs) { + this.briefUserInputs[key] = newInputs[key]; + } + } + if (id && this.plans[id]) { + this.currentPlanId = id; + this.api.planReady = true; + this.form.goal = this.planManager.goal; + for (const key in this.form.inputs) { + delete this.form.inputs[key]; + } + for (const key in this.logManager.userInputs) { + this.form.inputs[key] = this.logManager.userInputs[key]; + } + } else { + this.currentPlanId = undefined; + this.api.planReady = false; + this.form.goal = this.briefGoal; + for (const key in this.form.inputs) { + delete this.form.inputs[key]; + } + const newInputs = JSON.parse(JSON.stringify(this.briefUserInputs)); + for (const key in newInputs) { + this.form.inputs[key] = newInputs[key]; + } + } + } +} + +export const globalStorage = new GlobalStorage(); +(globalThis as any).globalStorage = globalStorage; + +// const sleep = (time: number) => +// new Promise(resolve => setTimeout(resolve, time)); +// let renderLock = false; +// autorun(async () => { +// if (renderLock) { +// return; +// } +// renderLock = true; +// let partialReadyCountdown = -1; +// try { +// while (true) { +// if (!globalStorage.renderLines_ || !globalStorage.focusingStepTaskId) { +// return; +// } +// const { ElementToLink } = globalStorage; +// if ( +// ElementToLink[0]?.current === undefined || +// ElementToLink[2]?.current === undefined || +// ElementToLink[1].filter(ref => ref.current !== undefined).length === 0 +// ) { +// await sleep(5); +// continue; +// } else if ( +// ElementToLink[3].filter(ref => ref?.current !== undefined).length === 0 +// ) { +// if (partialReadyCountdown < 0) { +// partialReadyCountdown = 10; +// globalStorage.renderLines({ delay: 0, repeat: 10, interval: 15 }); +// await sleep(5); +// continue; +// } else if (--partialReadyCountdown === 0) { +// break; +// } +// } +// break; +// } +// globalStorage.renderLines({ delay: 0, repeat: 40, interval: 15 }); +// } catch (e) { +// console.error(e); +// } +// renderLock = false; +// }); + +debug(globalStorage); +/* eslint-enable max-lines */ diff --git a/frontend/src/storage/plan/action.ts b/frontend/src/storage/plan/action.ts new file mode 100644 index 0000000..bcf0d25 --- /dev/null +++ b/frontend/src/storage/plan/action.ts @@ -0,0 +1,114 @@ +import { makeAutoObservable } from 'mobx'; +import { SxProps } from '@mui/material'; +import { INodeBase } from './base'; +import { PlanManager } from './manager'; +import { IApiAgentAction } from '@/apis/generate-base-plan'; + +export enum ActionType { + Propose = 'Propose', + Critique = 'Critique', + Improve = 'Improve', + Finalize = 'Finalize', +} + +const AgentActionStyles = new Map([ + [ActionType.Propose, { backgroundColor: '#B9EBF9', borderColor: '#94c2dc' }], + [ActionType.Critique, { backgroundColor: '#EFF9B9', borderColor: '#c0dc94' }], + [ActionType.Improve, { backgroundColor: '#E0DEFC', borderColor: '#bbb8e5' }], + [ActionType.Finalize, { backgroundColor: '#F9C7B9', borderColor: '#dc9e94' }], + ['', { backgroundColor: '#000000', borderColor: '#000000' }], +]); + +export const getAgentActionStyle = (action: ActionType): SxProps => { + return AgentActionStyles.get(action) ?? AgentActionStyles.get('')!; +}; + +export interface IRichSentence { + who: string; + whoStyle: SxProps; + content: string; + style: SxProps; +} + +export class AgentActionNode implements INodeBase { + public name: string = ''; + + public plan: PlanManager; + + public type: ActionType = ActionType.Propose; + + public agent: string = ''; + + public description: string = ''; + + public inputs: string[] = []; + + public path: string[] = []; // ['A', 'B'] + + public children: string[] = []; // ['D', 'E'] + + public get id() { + return this.path[this.path.length - 1]; + } + + public get parent() { + return this.path[this.path.length - 2]; + } + + public get last() { + return this.plan.agentActionMap.get(this.parent); + } + + public get renderCard(): IRichSentence { + const style = getAgentActionStyle(this.type); + return { + who: this.agent, + whoStyle: style, + // this.description 首字母小写 + content: this.description[0].toLowerCase() + this.description.slice(1), + style: { ...style, backgroundColor: 'transparent' }, + }; + } + + public get apiAgentAction(): IApiAgentAction { + return { + id: this.name, + type: this.type, + agent: this.agent, + description: this.description, + inputs: this.inputs, + }; + } + + public get belongingSelection() { + return this.plan.agentSelectionMap.get( + this.plan.actionSelectionMap.get(this.id) ?? '', + ); + } + + constructor(plan: PlanManager, json?: any) { + this.plan = plan; + if (json) { + this.name = json.name ?? ''; + this.agent = json.agent ?? ''; + this.description = json.description ?? ''; + this.inputs = [...(json.inputs ?? [])]; + this.type = json.type ?? ActionType.Propose; + this.path = [...(json.path ?? [])]; + this.children = [...(json.children ?? [])]; + } + makeAutoObservable(this); + } + + public dump() { + return { + name: this.name, + agent: this.agent, + description: this.description, + inputs: [...this.inputs], + type: this.type, + path: [...this.path], + children: [...this.children], + }; + } +} diff --git a/frontend/src/storage/plan/base.ts b/frontend/src/storage/plan/base.ts new file mode 100644 index 0000000..f99a56b --- /dev/null +++ b/frontend/src/storage/plan/base.ts @@ -0,0 +1,13 @@ +/* A + / \ + B C + / \ + D E */ +export interface INodeBase { + id: string; // B + parent?: string; // A + path: string[]; // ['A', 'B'] + children: string[]; // ['D', 'E'] +} + +export type NodeMap = Map; diff --git a/frontend/src/storage/plan/index.ts b/frontend/src/storage/plan/index.ts new file mode 100644 index 0000000..15c977b --- /dev/null +++ b/frontend/src/storage/plan/index.ts @@ -0,0 +1,5 @@ +export * from './action'; +export * from './manager'; +export * from './selection'; +export * from './stepTask'; +export * from './log'; diff --git a/frontend/src/storage/plan/log.ts b/frontend/src/storage/plan/log.ts new file mode 100644 index 0000000..87a749d --- /dev/null +++ b/frontend/src/storage/plan/log.ts @@ -0,0 +1,115 @@ +import React from 'react'; +import { makeAutoObservable } from 'mobx'; +import { PlanManager } from './manager'; +import { + IExecuteNode, + ExecuteNodeType, + IExecuteObject, +} from '@/apis/execute-plan'; + +export class RehearsalLog { + public planManager: PlanManager; + + public outdate: boolean = false; + + oldLog: IExecuteNode[] = []; + + userInputs: Record = {}; + + public get logWithoutUserInput(): IExecuteNode[] { + if (this.oldLog.length > 0) { + return this.oldLog; + } else { + const log: IExecuteNode[] = []; + // build skeleton logs + for (const step of this.planManager.currentPlan) { + log.push({ + type: ExecuteNodeType.Step, + id: step.name, + inputs: Array.from(step.inputs), + output: step.output, + history: (step.agentSelection?.currentTaskProcess ?? []).map( + action => ({ + id: action.name, + type: action.type, + agent: action.agent, + description: action.description, + inputs: action.inputs, + result: '', + }), + ), + }); + // push output of the step + log.push({ + type: ExecuteNodeType.Object, + id: step.output, + content: '', + }); + } + return log; + } + } + + public get renderingLog(): (IExecuteNode & { + ref: React.RefObject; + stepId: string; + })[] { + const outputTaskIdMap = new Map(); + const taskNameTaskIdMap = new Map(); + this.planManager.currentPlan.forEach(step => { + taskNameTaskIdMap.set(step.name, step.id); + outputTaskIdMap.set(step.output, step.id); + }); + return this.logWithoutUserInput.map(node => { + let stepId = ''; + if (node.type === ExecuteNodeType.Step) { + stepId = taskNameTaskIdMap.get(node.id) ?? ''; + } else { + stepId = outputTaskIdMap.get(node.id) ?? ''; + } + return { + ...node, + ref: React.createRef(), + stepId, + }; + }); + } + + constructor(plan: PlanManager, json?: any) { + this.planManager = plan; + if (json) { + this.oldLog = JSON.parse(JSON.stringify(json.oldLog)); + this.userInputs = JSON.parse(JSON.stringify(json.userInputs)); + } + makeAutoObservable(this); + } + + public dump() { + return { + oldLog: JSON.parse(JSON.stringify(this.oldLog)), + userInputs: JSON.parse(JSON.stringify(this.userInputs)), + }; + } + + public updateLog(newLog: IExecuteNode[]) { + const log = [...newLog]; + const userInputs: Record = {}; + while (log.length > 0 && log[0].type === ExecuteNodeType.Object) { + const userInputObject = log.shift()! as IExecuteObject; + userInputs[userInputObject.id] = userInputObject.content; + } + this.oldLog = log; + this.userInputs = userInputs; + } + + public clearLog() { + this.oldLog.length = 0; + this.outdate = false; + } + + public setOutdate() { + if (this.oldLog.length > 0) { + this.outdate = true; + } + } +} diff --git a/frontend/src/storage/plan/manager.ts b/frontend/src/storage/plan/manager.ts new file mode 100644 index 0000000..82f9dfa --- /dev/null +++ b/frontend/src/storage/plan/manager.ts @@ -0,0 +1,196 @@ +import { makeAutoObservable } from 'mobx'; +import { NodeMap } from './base'; +import { StepTaskNode } from './stepTask'; +import { AgentActionNode } from './action'; +import { AgentSelection } from './selection'; +import { IApiStepTask, IGeneratedPlan } from '@/apis/generate-base-plan'; + +export class PlanManager { + public goal: string = ''; + + public nextStepTaskId: number = 0; + + public nextAgentSelectionId: number = 0; + + public nextAgentActionId: number = 0; + + public stepTaskMap: NodeMap = new Map(); + + public agentActionMap: NodeMap = new Map(); + + public agentSelectionMap: Map = new Map(); + + public actionSelectionMap: Map = new Map(); + + public selectionStepMap: Map = new Map(); + + public stepTaskRoots: string[] = []; + + public currentStepTaskLeaf?: string; + + public previewStepTaskLeaf?: string; + + public inputs: string[] = []; + + public branches: Record< + string, + { start?: string; requirement?: string; base?: string } + > = {}; + + public get leaves() { + return Object.keys(this.branches); + } + + public get currentPlan() { + const path: StepTaskNode[] = []; + let node = this.stepTaskMap.get( + this.previewStepTaskLeaf ?? this.currentStepTaskLeaf ?? '', + ); + while (node) { + path.push(node); + node = node.last; + } + return path.reverse(); + } + + public get currentPath() { + return this.currentPlan.map(node => node.id); + } + + public get activeStepNodeIds() { + return new Set(this.currentPath); + } + + public get apiPlan() { + return { + goal: this.goal, + inputs: this.inputs, + process: this.currentPlan.map(node => node.apiStepTask), + }; + } + + constructor() { + makeAutoObservable(this); + } + + public parseApiPlan(plan: IGeneratedPlan) { + this.goal = plan.goal; + this.inputs = [...plan.inputs]; + const leaf = this.insertProcess(plan.process); + this.currentStepTaskLeaf = leaf; + } + + public insertProcess( + process: IApiStepTask[], + start?: string, + requirement?: string, + base?: string, + ): string { + if (start && !this.stepTaskMap.has(start)) { + throw new Error(`StekTask node ${start} does not exist!`); + } + let lastChidrenList = + this.stepTaskMap.get(start ?? '')?.children ?? this.stepTaskRoots; + const path = [...(this.stepTaskMap.get(start ?? '')?.path ?? [])]; + for (const task of process) { + // create agentSelection + const agentSelection = new AgentSelection(this, { + id: (this.nextAgentSelectionId++).toString(), + agents: task.agents, + }); + const leaf = agentSelection.insertActions(task.process); + this.agentSelectionMap.set(agentSelection.id, agentSelection); + agentSelection.currentActionLeaf = leaf; + // create stepTask + path.push((this.nextStepTaskId++).toString()); + const node = new StepTaskNode(this, { + name: task.name, + content: task.content, + inputs: task.inputs, + output: task.output, + brief: task.brief, + path, + agentSelectionIds: [agentSelection.id], + currentAgentSelection: agentSelection.id, + }); + lastChidrenList.push(node.id); + lastChidrenList = node.children; + this.selectionStepMap.set(agentSelection.id, node.id); + this.stepTaskMap.set(node.id, node); + } + const leaf = path[path.length - 1]; + this.branches[leaf] = { start, requirement, base }; + return leaf; + } + + public reset() { + this.goal = ''; + this.stepTaskMap.clear(); + this.agentActionMap.clear(); + this.agentSelectionMap.clear(); + this.stepTaskRoots = []; + this.inputs = []; + this.currentStepTaskLeaf = undefined; + this.previewStepTaskLeaf = undefined; + this.nextAgentActionId = 0; + this.nextAgentSelectionId = 0; + this.nextStepTaskId = 0; + } + + public dump() { + return { + goal: this.goal, + nextStepTaskId: this.nextStepTaskId, + nextAgentSelectionId: this.nextAgentSelectionId, + nextAgentActionId: this.nextAgentActionId, + stepTaskMap: Array.from(this.stepTaskMap).map(([k, v]) => [k, v.dump()]), + agentActionMap: Array.from(this.agentActionMap).map(([k, v]) => [ + k, + v.dump(), + ]), + agentSelectionMap: Array.from(this.agentSelectionMap).map(([k, v]) => [ + k, + v.dump(), + ]), + stepTaskRoots: [...this.stepTaskRoots], + inputs: [...this.inputs], + currentStepTaskLeaf: this.currentStepTaskLeaf, + previewStepTaskLeaf: this.previewStepTaskLeaf, + branch: JSON.parse(JSON.stringify(this.branches)), + }; + } + + public load(json: any) { + this.reset(); + this.goal = json.goal; + this.nextStepTaskId = json.nextStepTaskId; + this.nextAgentSelectionId = json.nextAgentSelectionId; + this.nextAgentActionId = json.nextAgentActionId; + for (const [k, v] of json.agentActionMap) { + this.agentActionMap.set(k, new AgentActionNode(this, v)); + } + for (const [k, v] of json.agentSelectionMap) { + const selection = new AgentSelection(this, v); + for (const leaf of selection.leaves) { + let node = this.agentActionMap.get(leaf); + while (node) { + this.actionSelectionMap.set(node.id, selection.id); + node = node.last; + } + } + this.agentSelectionMap.set(k, selection); + } + for (const [k, v] of json.stepTaskMap) { + const stepTask = new StepTaskNode(this, v); + for (const id of stepTask.agentSelectionIds) { + this.selectionStepMap.set(id, stepTask.id); + } + this.stepTaskMap.set(k, stepTask); + } + this.stepTaskRoots = [...json.stepTaskRoots]; + this.inputs = [...json.inputs]; + this.currentStepTaskLeaf = json.currentStepTaskLeaf; + this.previewStepTaskLeaf = json.previewStepTaskLeaf; + this.branches = JSON.parse(JSON.stringify(json.branch)); + } +} diff --git a/frontend/src/storage/plan/selection.ts b/frontend/src/storage/plan/selection.ts new file mode 100644 index 0000000..2fd9876 --- /dev/null +++ b/frontend/src/storage/plan/selection.ts @@ -0,0 +1,112 @@ +import { makeAutoObservable } from 'mobx'; +import { PlanManager } from './manager'; +import { AgentActionNode } from './action'; +import { IApiAgentAction } from '@/apis/generate-base-plan'; + +export class AgentSelection { + public id: string = ''; + + public plan: PlanManager; + + public agents: string[] = []; + + public actionRoot: string[] = []; + + public currentActionLeaf?: string; + + public previewActionLeaf?: string; + + public branches: Record< + string, + { start?: string; requirement?: string; base?: string } + > = {}; + + public get leaves() { + return Object.keys(this.branches); + } + + public get currentTaskProcess() { + const path: AgentActionNode[] = []; + let node = this.plan.agentActionMap.get( + this.previewActionLeaf ?? this.currentActionLeaf ?? '', + ); + while (node) { + path.push(node); + node = node.last; + } + return path.reverse(); + } + + public get currentTaskProcessIds() { + return this.currentTaskProcess.map(node => node.id); + } + + public get activeTaskIds() { + return new Set(this.currentTaskProcessIds); + } + + public get belongingStepTask() { + return this.plan.stepTaskMap.get( + this.plan.selectionStepMap.get(this.id) ?? '', + ); + } + + constructor(plan: PlanManager, json?: any) { + this.plan = plan; + if (json) { + this.id = json.id ?? ''; + this.agents = [...(json.agents ?? [])]; + this.branches = JSON.parse(JSON.stringify(json.branches ?? {})); + this.actionRoot = [...(json.actionRoot ?? [])]; + this.currentActionLeaf = json.currentActionLeaf; + this.previewActionLeaf = json.previewActionLeaf; + } + makeAutoObservable(this); + } + + public dump() { + return { + id: this.id, + agents: [...this.agents], + branches: JSON.parse(JSON.stringify(this.branches)), + actionRoot: [...this.actionRoot], + currentActionLeaf: this.currentActionLeaf, + previewActionLeaf: this.previewActionLeaf, + }; + } + + public insertActions( + actions: IApiAgentAction[], + start?: string, + requirement?: string, + base?: string, + ) { + if (actions.length === 0) { + return undefined; + } + if (start && !this.plan.agentActionMap.has(start)) { + throw new Error(`AgentAction node ${start} does not exist!`); + } + let lastChidrenList = + this.plan.agentActionMap.get(start ?? '')?.children ?? this.actionRoot; + const path = [...(this.plan.agentActionMap.get(start ?? '')?.path ?? [])]; + for (const action of actions) { + path.push((this.plan.nextAgentActionId++).toString()); + const node = new AgentActionNode(this.plan, { + name: action.id, + path, + type: action.type, + agent: action.agent, + description: action.description, + inputs: action.inputs, + }); + this.plan.agentActionMap.set(node.id, node); + this.plan.actionSelectionMap.set(node.id, this.id); + lastChidrenList.push(node.id); + lastChidrenList = node.children; + } + const leaf = path[path.length - 1]; + this.branches[leaf] = { start, requirement, base }; + return leaf; + } +} diff --git a/frontend/src/storage/plan/stepTask.ts b/frontend/src/storage/plan/stepTask.ts new file mode 100644 index 0000000..a832086 --- /dev/null +++ b/frontend/src/storage/plan/stepTask.ts @@ -0,0 +1,280 @@ +import React from 'react'; +import { SxProps } from '@mui/material'; +import { makeAutoObservable } from 'mobx'; +import { INodeBase } from './base'; +import { PlanManager } from './manager'; +import { + IRichText, + IApiStepTask, + IApiAgentAction, +} from '@/apis/generate-base-plan'; + +export interface IRichSpan { + text: string; + style?: SxProps; +} + +const nameJoin = (names: string[]) => { + // join names with comma, and 'and' for the last one + const tmp = [...names]; + const last = tmp.pop()!; + let t = tmp.join(', '); + if (t.length > 0) { + t = `${t} and ${last}`; + } else { + t = last; + } + return t; +}; + +export class StepTaskNode implements INodeBase { + public name: string = ''; + + public content: string = ''; + + public inputs: string[] = []; + + public output: string = ''; + + public _brief: IRichText = { + template: '', + data: {}, + }; + + public path: string[] = []; + + public children: string[] = []; + + public plan: PlanManager; + + public agentSelectionIds: string[] = []; + + public currentAgentSelection?: string; + + public previewAgentSelection?: string; + + public agentAspectScores: Record< + string, + Record + > = {}; + + public get brief(): IRichText { + if (!this.agentSelection) { + return this._brief; + } + const agents = [...this.agentSelection.agents]; + if (agents.length === 0) { + return this._brief; + } + const data: IRichText['data'] = {}; + let indexOffset = 0; + const inputPlaceHolders = this.inputs.map((text, index) => { + data[(index + indexOffset).toString()] = { + text, + style: { background: '#ACDBA0' }, + }; + return `!<${index + indexOffset}>!`; + }); + const inputSentence = nameJoin(inputPlaceHolders); + indexOffset += this.inputs.length; + const namePlaceholders = agents.map((text, index) => { + data[(index + indexOffset).toString()] = { + text, + style: { background: '#E5E5E5', boxShadow: '1px 1px 4px 1px #0003' }, + }; + return `!<${index + indexOffset}>!`; + }); + const nameSentence = nameJoin(namePlaceholders); + indexOffset += agents.length; + let actionSentence = this.content; + // delete the last '.' of actionSentence + if (actionSentence[actionSentence.length - 1] === '.') { + actionSentence = actionSentence.slice(0, -1); + } + const actionIndex = indexOffset++; + data[actionIndex.toString()] = { + text: actionSentence, + style: { background: '#DDD', border: '1.5px solid #ddd' }, + }; + let outputSentence = ''; + if (this.output) { + data[indexOffset.toString()] = { + text: this.output, + style: { background: '#FFCA8C' }, + }; + outputSentence = `to obtain !<${indexOffset}>!`; + } + // Join them togeter + let content = inputSentence; + if (content) { + content = `Based on ${content}, ${nameSentence} perform the task of !<${actionIndex}>!`; + } else { + content = `${nameSentence} perform the task of !<${actionIndex}>!`; + } + if (outputSentence) { + content = `${content}, ${outputSentence}.`; + } else { + content = `${content}.`; + } + content = content.trim(); + return { + template: content, + data, + }; + } + + public get id() { + return this.path[this.path.length - 1]; + } + + public get last() { + return this.plan.stepTaskMap.get(this.path[this.path.length - 2]); + } + + public get next() { + return this.children + .map(id => this.plan.stepTaskMap.get(id)!) + .filter(node => node); + } + + public get agentSelection() { + const id = this.previewAgentSelection ?? this.currentAgentSelection ?? ''; + return this.plan.agentSelectionMap.get(id); + } + + public get allSelections() { + return this.agentSelectionIds + .map(id => this.plan.agentSelectionMap.get(id)!) + .filter(node => node); + } + + public get apiStepTask(): IApiStepTask { + const actionsProcess: IApiAgentAction[] = []; + const actions = this.agentSelection?.currentTaskProcess ?? []; + for (const action of actions) { + actionsProcess.push({ + id: action.name, + type: action.type, + agent: action.agent, + description: action.description, + inputs: [...action.inputs], + }); + } + return { + name: this.name, + content: this.content, + inputs: [...this.inputs], + output: this.output, + agents: this.agentSelection?.agents ?? [], + brief: JSON.parse(JSON.stringify(this.brief)) as IRichText, + process: actionsProcess, + }; + } + + public get descriptionCard() { + const briefSpan: IRichSpan[] = []; + for (const substring of this.brief.template.split(/(!<[^>]+>!)/)) { + if (substring[0] === '!') { + const key = substring.slice(2, -2); + const { text, style } = this.brief.data[key]; + briefSpan.push({ text, style }); + } else { + briefSpan.push({ text: substring }); + } + } + + const actions = this.agentSelection?.currentTaskProcess ?? []; + const detailParagraph = actions.map(action => [ + action.renderCard, + action.id, + ]); + + return { + id: this.id, + name: this.name, + content: this.content, + ref: React.createRef(), + brief: briefSpan, + detail: detailParagraph, + }; + } + + public get outlineCard() { + return { + id: this.id, + name: this.name, + inputs: this.inputs, + output: this.output, + agents: this.agentSelection?.agents ?? [], + content: this.content, + ref: React.createRef(), + }; + } + + public get heatmap() { + return Object.fromEntries( + Object.entries(this.agentAspectScores).map(([aspect, scores]) => [ + aspect, + Object.fromEntries( + Object.entries(scores).map(([agent, score]) => [agent, score]), + ), + ]), + ); + } + + constructor(plan: PlanManager, json?: any) { + this.plan = plan; + if (json) { + this.name = json.name ?? ''; + this.content = json.content ?? ''; + this.inputs = [...(json.inputs ?? [])]; + this.output = json.output; + this._brief = JSON.parse( + JSON.stringify(json.brief ?? '{ template: "", data: {} }'), + ) as IRichText; + this.path = [...(json.path ?? [])]; + this.children = [...(json.children ?? [])]; + this.agentAspectScores = JSON.parse( + JSON.stringify(json.agentAspectScores ?? {}), + ); + this.agentSelectionIds = [...(json.agentSelectionIds ?? [])]; + this.currentAgentSelection = json.currentAgentSelection; + this.previewAgentSelection = json.previewAgentSelection; + } + makeAutoObservable(this); + } + + public dump() { + return { + name: this.name, + content: this.content, + inputs: [...this.inputs], + output: this.output, + brief: JSON.parse(JSON.stringify(this.brief)), + path: [...this.path], + children: [...this.children], + agentSelectionIds: [...this.agentSelectionIds], + agentAspectScores: JSON.parse(JSON.stringify(this.agentAspectScores)), + currentAgentSelection: this.currentAgentSelection, + previewAgentSelection: this.previewAgentSelection, + }; + } + + public appendAspectScore( + aspect: string, + agentScores: Record, + ) { + if (this.agentAspectScores[aspect]) { + for (const [agent, score] of Object.entries(agentScores)) { + if (this.agentAspectScores[aspect][agent]) { + this.agentAspectScores[aspect][agent].score = score.score; + this.agentAspectScores[aspect][agent].reason = score.reason; + } else { + this.agentAspectScores[aspect][agent] = score; + } + } + } else { + this.agentAspectScores[aspect] = agentScores; + } + } +} diff --git a/frontend/src/utils/resize-hook.ts b/frontend/src/utils/resize-hook.ts new file mode 100644 index 0000000..7547c82 --- /dev/null +++ b/frontend/src/utils/resize-hook.ts @@ -0,0 +1,16 @@ +import React from 'react'; + +export const useResize = ( + onResize: () => void, +) => { + const ref = React.useRef(null); + React.useEffect(() => { + if (ref.current) { + const observer = new ResizeObserver(onResize); + observer.observe(ref.current); + return () => observer.disconnect(); + } + return () => undefined; + }, [ref.current]); + return ref; +}; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..ce7f951 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@modern-js/tsconfig/base", + "compilerOptions": { + "declaration": false, + "jsx": "preserve", + "baseUrl": "./", + "paths": { + "@/*": ["./src/*"], + "@shared/*": ["./shared/*"] + } + }, + "include": ["src", "shared", "config", "modern.config.ts"], + "exclude": ["**/node_modules"] +}