"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Fine-tuning complete! Model saved to ./t5-custom-response\n"
+ ]
+ }
+ ],
+ "source": [
+ "import torch\n",
+ "import pandas as pd\n",
+ "from transformers import T5Tokenizer, T5ForConditionalGeneration, Trainer, TrainingArguments\n",
+ "from datasets import Dataset\n",
+ "\n",
+ "csv_filename = \"explain_dataset.csv\"\n",
+ "\n",
+ "df = pd.read_csv(csv_filename)\n",
+ "dataset = Dataset.from_pandas(df)\n",
+ "\n",
+ "def preprocess_function(examples):\n",
+ " inputs = examples[\"Input\"]\n",
+ " targets = examples[\"Response\"]\n",
+ " \n",
+ " model_inputs = tokenizer(inputs, max_length=64, truncation=True, padding=\"max_length\")\n",
+ " \n",
+ " labels = tokenizer(targets, max_length=64, truncation=True, padding=\"max_length\").input_ids\n",
+ "\n",
+ " model_inputs[\"labels\"] = labels\n",
+ " \n",
+ " return model_inputs\n",
+ "\n",
+ "tokenized_dataset = dataset.map(preprocess_function, batched=True)\n",
+ "\n",
+ "dataset_split = tokenized_dataset.train_test_split(test_size=0.2)\n",
+ "\n",
+ "train_dataset = dataset_split[\"train\"]\n",
+ "eval_dataset = dataset_split[\"test\"]\n",
+ "\n",
+ "training_args = TrainingArguments(\n",
+ " output_dir=\"./t5-fine-tuned\",\n",
+ " evaluation_strategy=\"epoch\",\n",
+ " learning_rate=3e-4,\n",
+ " per_device_train_batch_size=4,\n",
+ " num_train_epochs=3,\n",
+ " save_strategy=\"epoch\",\n",
+ " save_total_limit=2,\n",
+ ")\n",
+ "\n",
+ "trainer = Trainer(\n",
+ " model=model,\n",
+ " args=training_args,\n",
+ " train_dataset=train_dataset,\n",
+ " eval_dataset=eval_dataset,\n",
+ ")\n",
+ "\n",
+ "trainer.train()\n",
+ "\n",
+ "# Save the fine-tuned model\n",
+ "model.save_pretrained(\"./t5-custom-response\")\n",
+ "tokenizer.save_pretrained(\"./t5-custom-response\")\n",
+ "\n",
+ "print(\"Fine-tuning complete! Model saved to ./t5-custom-response\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "94b21356-cd22-457f-ac52-4240973e9bce",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Original Model Output:\n",
+ "Warum ist die Frage, wie machmach learning?\n",
+ "\n",
+ "\n",
+ "\n",
+ "Fine-Tuned Model Output:\n",
+ "Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.\n"
+ ]
+ }
+ ],
+ "source": [
+ "original_model = T5ForConditionalGeneration.from_pretrained(\"t5-small\")\n",
+ "fine_tuned_model = T5ForConditionalGeneration.from_pretrained(\"./t5-custom-response\")\n",
+ "\n",
+ "def generate_response(model, input_text):\n",
+ " input_ids = tokenizer(input_text, return_tensors=\"pt\").input_ids\n",
+ " output_ids = model.generate(input_ids, max_length=64)\n",
+ " return tokenizer.decode(output_ids[0], skip_special_tokens=True)\n",
+ "\n",
+ "test_question = \"explain: What is machine learning?\"\n",
+ "\n",
+ "original_output = generate_response(original_model, test_question)\n",
+ "fine_tuned_output = generate_response(fine_tuned_model, test_question)\n",
+ "\n",
+ "print(\"Original Model Output:\")\n",
+ "print(original_output)\n",
+ "print(\"\\n\\n\\nFine-Tuned Model Output:\")\n",
+ "print(fine_tuned_output)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/Anul 3/Semestrul 2/LLM/L2.ipynb b/Anul 3/Semestrul 2/LLM/L2.ipynb
new file mode 100644
index 0000000..77103f0
--- /dev/null
+++ b/Anul 3/Semestrul 2/LLM/L2.ipynb
@@ -0,0 +1,598 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "c3ab171c-90f3-4481-afb8-d7420ae8f042",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: transformers in ./.venv/lib/python3.9/site-packages (4.50.0)\n",
+ "Collecting langchain\n",
+ " Downloading langchain-0.3.21-py3-none-any.whl.metadata (7.8 kB)\n",
+ "Requirement already satisfied: torch in ./.venv/lib/python3.9/site-packages (2.6.0)\n",
+ "Collecting langchain-community\n",
+ " Downloading langchain_community-0.3.20-py3-none-any.whl.metadata (2.4 kB)\n",
+ "Collecting langchain-huggingface\n",
+ " Downloading langchain_huggingface-0.1.2-py3-none-any.whl.metadata (1.3 kB)\n",
+ "Requirement already satisfied: filelock in ./.venv/lib/python3.9/site-packages (from transformers) (3.18.0)\n",
+ "Requirement already satisfied: huggingface-hub<1.0,>=0.26.0 in ./.venv/lib/python3.9/site-packages (from transformers) (0.29.3)\n",
+ "Requirement already satisfied: numpy>=1.17 in ./.venv/lib/python3.9/site-packages (from transformers) (2.0.2)\n",
+ "Requirement already satisfied: packaging>=20.0 in ./.venv/lib/python3.9/site-packages (from transformers) (24.2)\n",
+ "Requirement already satisfied: pyyaml>=5.1 in ./.venv/lib/python3.9/site-packages (from transformers) (6.0.2)\n",
+ "Requirement already satisfied: regex!=2019.12.17 in ./.venv/lib/python3.9/site-packages (from transformers) (2024.11.6)\n",
+ "Requirement already satisfied: requests in ./.venv/lib/python3.9/site-packages (from transformers) (2.32.3)\n",
+ "Requirement already satisfied: tokenizers<0.22,>=0.21 in ./.venv/lib/python3.9/site-packages (from transformers) (0.21.1)\n",
+ "Requirement already satisfied: safetensors>=0.4.3 in ./.venv/lib/python3.9/site-packages (from transformers) (0.5.3)\n",
+ "Requirement already satisfied: tqdm>=4.27 in ./.venv/lib/python3.9/site-packages (from transformers) (4.67.1)\n",
+ "Collecting langchain-core<1.0.0,>=0.3.45 (from langchain)\n",
+ " Downloading langchain_core-0.3.47-py3-none-any.whl.metadata (5.9 kB)\n",
+ "Collecting langchain-text-splitters<1.0.0,>=0.3.7 (from langchain)\n",
+ " Downloading langchain_text_splitters-0.3.7-py3-none-any.whl.metadata (1.9 kB)\n",
+ "Collecting langsmith<0.4,>=0.1.17 (from langchain)\n",
+ " Downloading langsmith-0.3.18-py3-none-any.whl.metadata (15 kB)\n",
+ "Collecting pydantic<3.0.0,>=2.7.4 (from langchain)\n",
+ " Downloading pydantic-2.10.6-py3-none-any.whl.metadata (30 kB)\n",
+ "Collecting SQLAlchemy<3,>=1.4 (from langchain)\n",
+ " Downloading sqlalchemy-2.0.39-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.6 kB)\n",
+ "Collecting async-timeout<5.0.0,>=4.0.0 (from langchain)\n",
+ " Downloading async_timeout-4.0.3-py3-none-any.whl.metadata (4.2 kB)\n",
+ "Requirement already satisfied: typing-extensions>=4.10.0 in ./.venv/lib/python3.9/site-packages (from torch) (4.12.2)\n",
+ "Requirement already satisfied: networkx in ./.venv/lib/python3.9/site-packages (from torch) (3.2.1)\n",
+ "Requirement already satisfied: jinja2 in ./.venv/lib/python3.9/site-packages (from torch) (3.1.6)\n",
+ "Requirement already satisfied: fsspec in ./.venv/lib/python3.9/site-packages (from torch) (2024.12.0)\n",
+ "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n",
+ "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n",
+ "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n",
+ "Requirement already satisfied: nvidia-cudnn-cu12==9.1.0.70 in ./.venv/lib/python3.9/site-packages (from torch) (9.1.0.70)\n",
+ "Requirement already satisfied: nvidia-cublas-cu12==12.4.5.8 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.5.8)\n",
+ "Requirement already satisfied: nvidia-cufft-cu12==11.2.1.3 in ./.venv/lib/python3.9/site-packages (from torch) (11.2.1.3)\n",
+ "Requirement already satisfied: nvidia-curand-cu12==10.3.5.147 in ./.venv/lib/python3.9/site-packages (from torch) (10.3.5.147)\n",
+ "Requirement already satisfied: nvidia-cusolver-cu12==11.6.1.9 in ./.venv/lib/python3.9/site-packages (from torch) (11.6.1.9)\n",
+ "Requirement already satisfied: nvidia-cusparse-cu12==12.3.1.170 in ./.venv/lib/python3.9/site-packages (from torch) (12.3.1.170)\n",
+ "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.2 in ./.venv/lib/python3.9/site-packages (from torch) (0.6.2)\n",
+ "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in ./.venv/lib/python3.9/site-packages (from torch) (2.21.5)\n",
+ "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n",
+ "Requirement already satisfied: nvidia-nvjitlink-cu12==12.4.127 in ./.venv/lib/python3.9/site-packages (from torch) (12.4.127)\n",
+ "Requirement already satisfied: triton==3.2.0 in ./.venv/lib/python3.9/site-packages (from torch) (3.2.0)\n",
+ "Requirement already satisfied: sympy==1.13.1 in ./.venv/lib/python3.9/site-packages (from torch) (1.13.1)\n",
+ "Requirement already satisfied: mpmath<1.4,>=1.1.0 in ./.venv/lib/python3.9/site-packages (from sympy==1.13.1->torch) (1.3.0)\n",
+ "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in ./.venv/lib/python3.9/site-packages (from langchain-community) (3.11.14)\n",
+ "Collecting tenacity!=8.4.0,<10,>=8.1.0 (from langchain-community)\n",
+ " Downloading tenacity-9.0.0-py3-none-any.whl.metadata (1.2 kB)\n",
+ "Collecting dataclasses-json<0.7,>=0.5.7 (from langchain-community)\n",
+ " Downloading dataclasses_json-0.6.7-py3-none-any.whl.metadata (25 kB)\n",
+ "Collecting pydantic-settings<3.0.0,>=2.4.0 (from langchain-community)\n",
+ " Downloading pydantic_settings-2.8.1-py3-none-any.whl.metadata (3.5 kB)\n",
+ "Collecting httpx-sse<1.0.0,>=0.4.0 (from langchain-community)\n",
+ " Downloading httpx_sse-0.4.0-py3-none-any.whl.metadata (9.0 kB)\n",
+ "Collecting sentence-transformers>=2.6.0 (from langchain-huggingface)\n",
+ " Downloading sentence_transformers-3.4.1-py3-none-any.whl.metadata (10 kB)\n",
+ "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (2.6.1)\n",
+ "Requirement already satisfied: aiosignal>=1.1.2 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.3.2)\n",
+ "Requirement already satisfied: attrs>=17.3.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (25.3.0)\n",
+ "Requirement already satisfied: frozenlist>=1.1.1 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.5.0)\n",
+ "Requirement already satisfied: multidict<7.0,>=4.5 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (6.2.0)\n",
+ "Requirement already satisfied: propcache>=0.2.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (0.3.0)\n",
+ "Requirement already satisfied: yarl<2.0,>=1.17.0 in ./.venv/lib/python3.9/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain-community) (1.18.3)\n",
+ "Collecting marshmallow<4.0.0,>=3.18.0 (from dataclasses-json<0.7,>=0.5.7->langchain-community)\n",
+ " Downloading marshmallow-3.26.1-py3-none-any.whl.metadata (7.3 kB)\n",
+ "Collecting typing-inspect<1,>=0.4.0 (from dataclasses-json<0.7,>=0.5.7->langchain-community)\n",
+ " Downloading typing_inspect-0.9.0-py3-none-any.whl.metadata (1.5 kB)\n",
+ "Collecting jsonpatch<2.0,>=1.33 (from langchain-core<1.0.0,>=0.3.45->langchain)\n",
+ " Downloading jsonpatch-1.33-py2.py3-none-any.whl.metadata (3.0 kB)\n",
+ "Collecting httpx<1,>=0.23.0 (from langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading httpx-0.28.1-py3-none-any.whl.metadata (7.1 kB)\n",
+ "Collecting orjson<4.0.0,>=3.9.14 (from langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (41 kB)\n",
+ "Collecting requests-toolbelt<2.0.0,>=1.0.0 (from langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading requests_toolbelt-1.0.0-py2.py3-none-any.whl.metadata (14 kB)\n",
+ "Collecting zstandard<0.24.0,>=0.23.0 (from langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.0 kB)\n",
+ "Collecting annotated-types>=0.6.0 (from pydantic<3.0.0,>=2.7.4->langchain)\n",
+ " Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB)\n",
+ "Collecting pydantic-core==2.27.2 (from pydantic<3.0.0,>=2.7.4->langchain)\n",
+ " Downloading pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.6 kB)\n",
+ "Collecting python-dotenv>=0.21.0 (from pydantic-settings<3.0.0,>=2.4.0->langchain-community)\n",
+ " Downloading python_dotenv-1.0.1-py3-none-any.whl.metadata (23 kB)\n",
+ "Requirement already satisfied: charset-normalizer<4,>=2 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (3.4.1)\n",
+ "Requirement already satisfied: idna<4,>=2.5 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (3.10)\n",
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (2.3.0)\n",
+ "Requirement already satisfied: certifi>=2017.4.17 in ./.venv/lib/python3.9/site-packages (from requests->transformers) (2025.1.31)\n",
+ "Collecting scikit-learn (from sentence-transformers>=2.6.0->langchain-huggingface)\n",
+ " Downloading scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)\n",
+ "Collecting scipy (from sentence-transformers>=2.6.0->langchain-huggingface)\n",
+ " Downloading scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)\n",
+ "Collecting Pillow (from sentence-transformers>=2.6.0->langchain-huggingface)\n",
+ " Downloading pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl.metadata (9.1 kB)\n",
+ "Collecting greenlet!=0.4.17 (from SQLAlchemy<3,>=1.4->langchain)\n",
+ " Downloading greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (3.8 kB)\n",
+ "Requirement already satisfied: MarkupSafe>=2.0 in ./.venv/lib/python3.9/site-packages (from jinja2->torch) (3.0.2)\n",
+ "Collecting anyio (from httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading anyio-4.9.0-py3-none-any.whl.metadata (4.7 kB)\n",
+ "Collecting httpcore==1.* (from httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading httpcore-1.0.7-py3-none-any.whl.metadata (21 kB)\n",
+ "Collecting h11<0.15,>=0.13 (from httpcore==1.*->httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading h11-0.14.0-py3-none-any.whl.metadata (8.2 kB)\n",
+ "Collecting jsonpointer>=1.9 (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.45->langchain)\n",
+ " Downloading jsonpointer-3.0.0-py2.py3-none-any.whl.metadata (2.3 kB)\n",
+ "Collecting mypy-extensions>=0.3.0 (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain-community)\n",
+ " Downloading mypy_extensions-1.0.0-py3-none-any.whl.metadata (1.1 kB)\n",
+ "Collecting joblib>=1.2.0 (from scikit-learn->sentence-transformers>=2.6.0->langchain-huggingface)\n",
+ " Downloading joblib-1.4.2-py3-none-any.whl.metadata (5.4 kB)\n",
+ "Collecting threadpoolctl>=3.1.0 (from scikit-learn->sentence-transformers>=2.6.0->langchain-huggingface)\n",
+ " Downloading threadpoolctl-3.6.0-py3-none-any.whl.metadata (13 kB)\n",
+ "Requirement already satisfied: exceptiongroup>=1.0.2 in ./.venv/lib/python3.9/site-packages (from anyio->httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain) (1.2.2)\n",
+ "Collecting sniffio>=1.1 (from anyio->httpx<1,>=0.23.0->langsmith<0.4,>=0.1.17->langchain)\n",
+ " Downloading sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB)\n",
+ "Downloading langchain-0.3.21-py3-none-any.whl (1.0 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m2.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading langchain_community-0.3.20-py3-none-any.whl (2.5 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.5/2.5 MB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading langchain_huggingface-0.1.2-py3-none-any.whl (21 kB)\n",
+ "Downloading async_timeout-4.0.3-py3-none-any.whl (5.7 kB)\n",
+ "Downloading dataclasses_json-0.6.7-py3-none-any.whl (28 kB)\n",
+ "Downloading httpx_sse-0.4.0-py3-none-any.whl (7.8 kB)\n",
+ "Downloading langchain_core-0.3.47-py3-none-any.whl (417 kB)\n",
+ "Downloading langchain_text_splitters-0.3.7-py3-none-any.whl (32 kB)\n",
+ "Downloading langsmith-0.3.18-py3-none-any.whl (351 kB)\n",
+ "Downloading pydantic-2.10.6-py3-none-any.whl (431 kB)\n",
+ "Downloading pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.0 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading pydantic_settings-2.8.1-py3-none-any.whl (30 kB)\n",
+ "Downloading sentence_transformers-3.4.1-py3-none-any.whl (275 kB)\n",
+ "Downloading sqlalchemy-2.0.39-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n",
+ "\u001b[?25hDownloading tenacity-9.0.0-py3-none-any.whl (28 kB)\n",
+ "Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB)\n",
+ "Downloading greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (597 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m597.4/597.4 kB\u001b[0m \u001b[31m4.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[?25hDownloading httpx-0.28.1-py3-none-any.whl (73 kB)\n",
+ "Downloading httpcore-1.0.7-py3-none-any.whl (78 kB)\n",
+ "Downloading jsonpatch-1.33-py2.py3-none-any.whl (12 kB)\n",
+ "Downloading marshmallow-3.26.1-py3-none-any.whl (50 kB)\n",
+ "Downloading orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (130 kB)\n",
+ "Downloading python_dotenv-1.0.1-py3-none-any.whl (19 kB)\n",
+ "Downloading requests_toolbelt-1.0.0-py2.py3-none-any.whl (54 kB)\n",
+ "Downloading typing_inspect-0.9.0-py3-none-any.whl (8.8 kB)\n",
+ "Downloading zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.4 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.4/5.4 MB\u001b[0m \u001b[31m8.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n",
+ "\u001b[?25hDownloading pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl (4.5 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m4.5/4.5 MB\u001b[0m \u001b[31m10.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading scikit_learn-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.5 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.5/13.5 MB\u001b[0m \u001b[31m9.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mta \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hDownloading scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (38.6 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m38.6/38.6 MB\u001b[0m \u001b[31m13.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hDownloading joblib-1.4.2-py3-none-any.whl (301 kB)\n",
+ "Downloading jsonpointer-3.0.0-py2.py3-none-any.whl (7.6 kB)\n",
+ "Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n",
+ "Downloading threadpoolctl-3.6.0-py3-none-any.whl (18 kB)\n",
+ "Downloading anyio-4.9.0-py3-none-any.whl (100 kB)\n",
+ "Downloading h11-0.14.0-py3-none-any.whl (58 kB)\n",
+ "Downloading sniffio-1.3.1-py3-none-any.whl (10 kB)\n",
+ "Installing collected packages: zstandard, threadpoolctl, tenacity, sniffio, scipy, python-dotenv, pydantic-core, Pillow, orjson, mypy-extensions, marshmallow, jsonpointer, joblib, httpx-sse, h11, greenlet, async-timeout, annotated-types, typing-inspect, SQLAlchemy, scikit-learn, requests-toolbelt, pydantic, jsonpatch, httpcore, anyio, pydantic-settings, httpx, dataclasses-json, langsmith, sentence-transformers, langchain-core, langchain-text-splitters, langchain-huggingface, langchain, langchain-community\n",
+ " Attempting uninstall: async-timeout\n",
+ " Found existing installation: async-timeout 5.0.1\n",
+ " Uninstalling async-timeout-5.0.1:\n",
+ " Successfully uninstalled async-timeout-5.0.1\n",
+ "Successfully installed Pillow-11.1.0 SQLAlchemy-2.0.39 annotated-types-0.7.0 anyio-4.9.0 async-timeout-4.0.3 dataclasses-json-0.6.7 greenlet-3.1.1 h11-0.14.0 httpcore-1.0.7 httpx-0.28.1 httpx-sse-0.4.0 joblib-1.4.2 jsonpatch-1.33 jsonpointer-3.0.0 langchain-0.3.21 langchain-community-0.3.20 langchain-core-0.3.47 langchain-huggingface-0.1.2 langchain-text-splitters-0.3.7 langsmith-0.3.18 marshmallow-3.26.1 mypy-extensions-1.0.0 orjson-3.10.15 pydantic-2.10.6 pydantic-core-2.27.2 pydantic-settings-2.8.1 python-dotenv-1.0.1 requests-toolbelt-1.0.0 scikit-learn-1.6.1 scipy-1.13.1 sentence-transformers-3.4.1 sniffio-1.3.1 tenacity-9.0.0 threadpoolctl-3.6.0 typing-inspect-0.9.0 zstandard-0.23.0\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install transformers langchain torch langchain-community langchain-huggingface"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "4156b8a6-585a-4a16-aa00-270270a33f44",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Device set to use cuda:0\n"
+ ]
+ }
+ ],
+ "source": [
+ "from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline\n",
+ "from transformers import T5Tokenizer, T5ForConditionalGeneration\n",
+ "from langchain_huggingface import HuggingFacePipeline\n",
+ "\n",
+ "model_name = \"gpt2\"\n",
+ "\n",
+ "if model_name.startswith(\"t5\"):\n",
+ " tokenizer = T5Tokenizer.from_pretrained(model_name)\n",
+ " model = T5ForConditionalGeneration.from_pretrained(model_name)\n",
+ "\n",
+ " hf_pipeline = pipeline(\n",
+ " \"text2text-generation\",\n",
+ " model=model,\n",
+ " tokenizer=tokenizer,\n",
+ " max_length=1024,\n",
+ " max_new_tokens=50,\n",
+ " truncation=True\n",
+ " )\n",
+ "else:\n",
+ " tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
+ " model = AutoModelForCausalLM.from_pretrained(model_name)\n",
+ "\n",
+ " tokenizer.pad_token = tokenizer.eos_token\n",
+ "\n",
+ " hf_pipeline = pipeline(\n",
+ " \"text-generation\",\n",
+ " model=model,\n",
+ " tokenizer=tokenizer,\n",
+ " max_length=512,\n",
+ " max_new_tokens=50,\n",
+ " truncation=True\n",
+ " )\n",
+ "\n",
+ "llm = HuggingFacePipeline(pipeline=hf_pipeline)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "bb2f39eb-228a-4296-a13d-a644ecc1e92f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/tmp/ipykernel_93712/2625397836.py:4: LangChainDeprecationWarning: The method `BaseLLM.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.\n",
+ " output = llm(prompt)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "\"How are you? Where are you from? What are you doing? Why do you work here? How else can you tell us? When or where are you staying? If you are not sure, and you come here before 10pm, please call 0845 2138 (please allow 2-5 business hours to be used as this is all private). Please note this is a small place, of small-sized population, so if you have any trouble coming to our place of worship, it will be welcomed with open arms. You never have to worry about that – we are not here to do any work for you, you may go and stay here as you please. And if you find that you aren't well, please call us, we will fix it! Don't forget to pay the staff when they are available.\\n\\nIt is really nice to welcome some of the best local restaurants and cafes in Newcastle. We are very sorry that you are not enjoying these wonderful places or services the way you do.\""
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "### Try this for gpt2 and t5-small\n",
+ "prompt = \"How are you?\"\n",
+ "\n",
+ "output = llm(prompt)\n",
+ "\n",
+ "output"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "a2ca590c-5615-4936-a60c-306935f0e0be",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "\"translate English to French: How are you?\\n\\n(It appears, however, that this wasn't quite the answer)\\n\\nWhy is my French so much better?\""
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from langchain.prompts import PromptTemplate, ChatPromptTemplate\n",
+ "\n",
+ "template = PromptTemplate(\n",
+ " input_variables=[\"text\"],\n",
+ " template=\"translate English to French: {text}\"\n",
+ ")\n",
+ "\n",
+ "### Try this for gpt2 and t5-small\n",
+ "prompt_text = template.format(text=\"How are you?\")\n",
+ "\n",
+ "response = llm(prompt_text)\n",
+ "\n",
+ "response"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "90fbf82e-9f50-41b3-b4d2-83b41f2ed33e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "template_string = \"\"\"You be tasked with takin' the followin' text \\\n",
+ "and transformin' it into a joke in the style of {style}. \\\n",
+ "Make sure it stays true to the humor and tone of the given style. \\\n",
+ "If the text ain't naturally a joke, twist it into somethin' funny! \n",
+ "\n",
+ "text: ```{text}```\n",
+ "\"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "7e318633-7238-4f1b-bae6-8e346ad48cb3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "PromptTemplate(input_variables=['style', 'text'], input_types={}, partial_variables={}, template=\"You be tasked with takin' the followin' text and transformin' it into a joke in the style of {style}. Make sure it stays true to the humor and tone of the given style. If the text ain't naturally a joke, twist it into somethin' funny! \\n\\ntext: ```{text}```\\n\")"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "prompt_template = PromptTemplate.from_template(template_string)\n",
+ "\n",
+ "prompt_template"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "9c5f95c9-f205-4bd1-b5d6-1cb29b66f93d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['style', 'text']"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "prompt_template.input_variables"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "d8875a55-bf80-4132-b6ac-b53fd8f61c7b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "prompt_style = \"\"\"pirate\"\"\"\n",
+ "\n",
+ "prompt_input = \"\"\"Why do programmers prefer dark mode?\"\"\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "189f60ca-f228-4d7f-8bba-9951e56a90f7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'You be tasked with takin\\' the followin\\' text and transformin\\' it into a joke in the style of pirate. Make sure it stays true to the humor and tone of the given style. If the text ain\\'t naturally a joke, twist it into somethin\\' funny! \\n\\ntext: ```Why do programmers prefer dark mode?```\\n\\nIf the text you create needs to be a joke rather than a joke in the style of a pirate you\\'ve set up some parameters to control the output. If you decide the result of a certain method is too hard to follow then just add it (the name of the method to be used) to the end of the text.\\n\\nThe easiest way to start converting this is to run: python c.py convertrtext.py \"text: \"``\"\\n\\nThat will bring up a terminal window to start formatting you text.\\n\\n\\nNote The font will be highlighted and changed if you change the font, and also change the text of the message in your text window.\\n\\nCancellations\\n\\nIf you make any changes to a text object during its rendering, your file will be removed, or there will be no output.\\n\\nIf the text object fails to receive an event from the terminal, you can tell it to call a function from the terminal and then use the callback to get back the event and perform the formatting.\\n\\nThe callback, called when the specified text is replaced by another text, creates a callback in your function that tells the terminal it needs to show the text instead of the callback.\\n\\nAs long as it has done so it doesn\\'t need to do anything, because the terminal will keep adding a new button and returning the same text.\\n\\nThis approach works really well for small files, but for large files, it\\'s not particularly good.\\n\\nCustomization\\n\\nSo what\\'s the use?\\n\\nIt takes long enough to do all the formatting stuff for every text that you want, but a few lines of code in your function should let you easily generate different styles to fit your needs. So use this for your own code.\\n\\nThe syntax for the function to be used changes (add, remove) to your variable name. But don\\'t go and do everything yourself, be aware sometimes text is going to be corrupted.\\n\\nYour main argument(s) for the format is where it belongs. It\\'s always important to know what your local variables are, so that if something'"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "message = prompt_template.format(\n",
+ " style=prompt_style,\n",
+ " text=prompt_input)\n",
+ "\n",
+ "response = llm(message)\n",
+ "\n",
+ "response"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "0e332795-ec3f-4a1b-9026-209c990096c6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/tmp/ipykernel_93712/3882055530.py:7: LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 1.0. Use :meth:`~RunnableSequence, e.g., `prompt | llm`` instead.\n",
+ " chain = LLMChain(llm=llm, prompt=prompt)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'topic': 'why pirates love gold',\n",
+ " 'style': 'pirate',\n",
+ " 'text': 'Human: Tell a joke about why pirates love gold in the style of pirate.\\n\\nAthletic: A slang for getting \"up next to a woman for the first time.\"\\n\\nAstros: The original English abbreviation for the \"Astros league.\" Originally a slang term used to describe amateur sailors from coast-to-coast. Also known as \"The Astroglios.\"\\n\\nAlaska: A Native American word for \"the land in which cattle and human beings and fish breed.\" Its name was derived from the Indian name which is derived from the Hawaiian word for \"meadow.\"'}"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from langchain.chains import LLMChain\n",
+ "\n",
+ "prompt = ChatPromptTemplate.from_template(\n",
+ " \"Tell a joke about {topic} in the style of {style}.\"\n",
+ ")\n",
+ "\n",
+ "chain = LLMChain(llm=llm, prompt=prompt)\n",
+ "\n",
+ "# Example Input\n",
+ "topic = \"why pirates love gold\"\n",
+ "style = \"pirate\"\n",
+ "\n",
+ "chain.invoke({\"topic\": topic, \"style\": style})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "cc8f4433-219c-4b42-a317-b93545bc5b20",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "\u001b[1m> Entering new SequentialChain chain...\u001b[0m\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n",
+ "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n",
+ "Both `max_new_tokens` (=50) and `max_length`(=512) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\u001b[1m> Finished chain.\u001b[0m\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "{'Review': \"Je trouve le goût médiocre. La mousse ne tient pas, c'est bizarre. J'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !?\",\n",
+ " 'English_Review': 'Human: Translate the following review to english:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !? (If we can get two, we want an extra.) And the \"fairy tales\" are, of course, very much a part of what I love about this story. They\\'re not that difficult to write. They\\'re not that hard to',\n",
+ " 'summary': 'Human: Can you summarize the following review in 1 sentence:\\n\\nHuman: Translate the following review to english:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !? (If we can get two, we want an extra.) And the \"fairy tales\" are, of course, very much a part of what I love about this story. They\\'re not that difficult to write. They\\'re not that hard to translate. I know people like to write these, but it isn\\'t like I can\\'t imagine some sort of magic. (And I know it\\'s not just that we don\\'t have time to take the time to translate the stories.)\\n\\nI',\n",
+ " 'followup_message': 'Human: Write a follow up response to the following summary in the specified language:\\n\\nSummary: Human: Can you summarize the following review in 1 sentence:\\n\\nHuman: Translate the following review to english:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !? (If we can get two, we want an extra.) And the \"fairy tales\" are, of course, very much a part of what I love about this story. They\\'re not that difficult to write. They\\'re not that hard to translate. I know people like to write these, but it isn\\'t like I can\\'t imagine some sort of magic. (And I know it\\'s not just that we don\\'t have time to take the time to translate the stories.)\\n\\nI\\n\\nLanguage: Human: What language is the following review:\\n\\nJe trouve le goût médiocre. La mousse ne tient pas, c\\'est bizarre. J\\'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !?\\n\\nThe following conversation takes place in Paris (the first time I\\'ve been here, in fact, I had been here, my French life was mostly a miserable situation, but my French language was far from perfect, so I had no problems finding words and words that went across the top of me when writing it; sometimes I couldn\\'t even hear how it sounded – at least not very bad) and the French man is a really nice conversationalist. The entire conversation begins like this:\\n'}"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## SequentialChain\n",
+ "\n",
+ "from langchain.chains import SequentialChain,LLMChain\n",
+ "\n",
+ "first_prompt = ChatPromptTemplate.from_template(\n",
+ " \"Translate the following review to english:\"\n",
+ " \"\\n\\n{Review}\"\n",
+ ")\n",
+ "\n",
+ "chain_one = LLMChain(llm=llm, prompt=first_prompt, \n",
+ " output_key=\"English_Review\"\n",
+ " )\n",
+ "second_prompt = ChatPromptTemplate.from_template(\n",
+ " \"Can you summarize the following review in 1 sentence:\"\n",
+ " \"\\n\\n{English_Review}\"\n",
+ ")\n",
+ "\n",
+ "chain_two = LLMChain(llm=llm, prompt=second_prompt, \n",
+ " output_key=\"summary\"\n",
+ " )\n",
+ "\n",
+ "third_prompt = ChatPromptTemplate.from_template(\n",
+ " \"What language is the following review:\\n\\n{Review}\"\n",
+ ")\n",
+ "\n",
+ "chain_three = LLMChain(llm=llm, prompt=third_prompt,\n",
+ " output_key=\"language\"\n",
+ " )\n",
+ "\n",
+ "fourth_prompt = ChatPromptTemplate.from_template(\n",
+ " \"Write a follow up response to the following \"\n",
+ " \"summary in the specified language:\"\n",
+ " \"\\n\\nSummary: {summary}\\n\\nLanguage: {language}\"\n",
+ ")\n",
+ "\n",
+ "chain_four = LLMChain(llm=llm, prompt=fourth_prompt,\n",
+ " output_key=\"followup_message\"\n",
+ " )\n",
+ "\n",
+ "overall_chain = SequentialChain(\n",
+ " chains=[chain_one, chain_two, chain_three, chain_four],\n",
+ " input_variables=[\"Review\"],\n",
+ " output_variables=[\"English_Review\", \"summary\",\"followup_message\"],\n",
+ " verbose=True\n",
+ ")\n",
+ "\n",
+ "review = \"Je trouve le goût médiocre. La mousse ne tient pas, c'est bizarre. J'achète les mêmes dans le commerce et le goût est bien meilleur...\\nVieux lot ou contrefaçon !?\"\n",
+ "\n",
+ "overall_chain(review)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "379e9e00-5fae-46a2-ad79-376abeb21f08",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Router Chain\n",
+ "from langchain.chains.router import MultiPromptChain\n",
+ "from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser\n",
+ "\n",
+ "## .... "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "610eebe2-8b6f-493e-a248-6e7b43e28157",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.21"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/Anul 3/Semestrul 2/LLM/L4.ipynb b/Anul 3/Semestrul 2/LLM/L4.ipynb
new file mode 100644
index 0000000..3393e6b
--- /dev/null
+++ b/Anul 3/Semestrul 2/LLM/L4.ipynb
@@ -0,0 +1,544 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "4ed7feed",
+ "metadata": {},
+ "source": [
+ "# L4 - Working RAG"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bef480fe",
+ "metadata": {},
+ "source": [
+ "## Overview\n",
+ "\n",
+ "Recall the overall workflow for retrieval augmented generation (RAG):"
+ ]
+ },
+ {
+ "attachments": {
+ "overview.jpeg": {
+ "image/jpeg": "/9j/4AAQSkZJRgABAQAASABIAAD/4QBkRXhpZgAATU0AKgAAAAgABAEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEoAAMAAAABAAIAAIdpAAQAAAABAAAAPgAAAAAAAqACAAQAAAABAAAJpKADAAQAAAABAAACwwAAAAD/4QkhaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiLz4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+AP/tADhQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAADhCSU0EJQAAAAAAENQdjNmPALIE6YAJmOz4Qn7/4g/QSUNDX1BST0ZJTEUAAQEAAA/AYXBwbAIQAABtbnRyUkdCIFhZWiAH5wACAAwAAAASABhhY3NwQVBQTAAAAABBUFBMAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFkZXNjAAABUAAAAGJkc2NtAAABtAAABJxjcHJ0AAAGUAAAACN3dHB0AAAGdAAAABRyWFlaAAAGiAAAABRnWFlaAAAGnAAAABRiWFlaAAAGsAAAABRyVFJDAAAGxAAACAxhYXJnAAAO0AAAACB2Y2d0AAAO8AAAADBuZGluAAAPIAAAAD5tbW9kAAAPYAAAACh2Y2dwAAAPiAAAADhiVFJDAAAGxAAACAxnVFJDAAAGxAAACAxhYWJnAAAO0AAAACBhYWdnAAAO0AAAACBkZXNjAAAAAAAAAAhEaXNwbGF5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1YwAAAAAAAAAmAAAADGhySFIAAAAUAAAB2GtvS1IAAAAMAAAB7G5iTk8AAAASAAAB+GlkAAAAAAASAAACCmh1SFUAAAAUAAACHGNzQ1oAAAAWAAACMGRhREsAAAAcAAACRm5sTkwAAAAWAAACYmZpRkkAAAAQAAACeGl0SVQAAAAYAAACiGVzRVMAAAAWAAACoHJvUk8AAAASAAACtmZyQ0EAAAAWAAACyGFyAAAAAAAUAAAC3nVrVUEAAAAcAAAC8mhlSUwAAAAWAAADDnpoVFcAAAAKAAADJHZpVk4AAAAOAAADLnNrU0sAAAAWAAADPHpoQ04AAAAKAAADJHJ1UlUAAAAkAAADUmVuR0IAAAAUAAADdmZyRlIAAAAWAAADim1zAAAAAAASAAADoGhpSU4AAAASAAADsnRoVEgAAAAMAAADxGNhRVMAAAAYAAAD0GVuQVUAAAAUAAADdmVzWEwAAAASAAACtmRlREUAAAAQAAAD6GVuVVMAAAASAAAD+HB0QlIAAAAYAAAECnBsUEwAAAASAAAEImVsR1IAAAAiAAAENHN2U0UAAAAQAAAEVnRyVFIAAAAUAAAEZnB0UFQAAAAWAAAEemphSlAAAAAMAAAEkABMAEMARAAgAHUAIABiAG8AagBpzuy37AAgAEwAQwBEAEYAYQByAGcAZQAtAEwAQwBEAEwAQwBEACAAVwBhAHIAbgBhAFMAegDtAG4AZQBzACAATABDAEQAQgBhAHIAZQB2AG4A/QAgAEwAQwBEAEwAQwBEAC0AZgBhAHIAdgBlAHMAawDmAHIAbQBLAGwAZQB1AHIAZQBuAC0ATABDAEQAVgDkAHIAaQAtAEwAQwBEAEwAQwBEACAAYQAgAGMAbwBsAG8AcgBpAEwAQwBEACAAYQAgAGMAbwBsAG8AcgBMAEMARAAgAGMAbwBsAG8AcgBBAEMATAAgAGMAbwB1AGwAZQB1AHIgDwBMAEMARAAgBkUGRAZIBkYGKQQaBD4EOwRMBD4EQAQ+BDIEOAQ5ACAATABDAEQgDwBMAEMARAAgBeYF0QXiBdUF4AXZX2mCcgBMAEMARABMAEMARAAgAE0A4AB1AEYAYQByAGUAYgBuAP0AIABMAEMARAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEEPwQ7BDUEOQBDAG8AbABvAHUAcgAgAEwAQwBEAEwAQwBEACAAYwBvAHUAbABlAHUAcgBXAGEAcgBuAGEAIABMAEMARAkwCQIJFwlACSgAIABMAEMARABMAEMARAAgDioONQBMAEMARAAgAGUAbgAgAGMAbwBsAG8AcgBGAGEAcgBiAC0ATABDAEQAQwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8AbABvAHIAaQBkAG8ASwBvAGwAbwByACAATABDAEQDiAOzA8cDwQPJA7wDtwAgA78DuAPMA70DtwAgAEwAQwBEAEYA5AByAGcALQBMAEMARABSAGUAbgBrAGwAaQAgAEwAQwBEAEwAQwBEACAAYQAgAGMAbwByAGUAczCrMOkw/ABMAEMARHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMjMAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAIPfAAA9v////7tYWVogAAAAAAAASr8AALE3AAAKuVhZWiAAAAAAAAAoOAAAEQsAAMi5Y3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA2ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKMAqACtALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC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KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9D+/iiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK/no/4Kz/8HEv7Pf8AwSO/aL0X9nH4s+AfEXinUdb8OW/iSO70iS2SBILm6urURsJpEbeGtWY4GMMO+aAP6F6K/jB8P/8AB7P+wTd6nFB4n+FHj2xtGYB5rcafcOoPfY13FnH+9X9Qv7E/7dH7Mf8AwUL+B9r+0H+yp4kj8ReH55mtZwUaG6sruMBnt7mBwHilUMpwRhlZXUsjKxAPrmiiigAooooAKKKKACiiigAooooAKKKKACiiigAoor4a8V/8FIP2OvCn7ZvhL/gn6/jC21H4teLzd+ToOn/6TLZR2dlNfu96yZS23QwnYkhEjllKoUJYAH3LRRX5V/8ABV3/AIK1/A3/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tpfBL/hI/Cur/DmC1h0vQ7C6tBo0jW0DwebcLJZvdzSyh2kmkN1ueQ5zjivS/wDgrH/wQh/Y/wD+Cu+r+G/G/wAbtQ1zwx4r8LWr2Fpq+gzQpJLZO5k+zzx3EMyOiOzuhUIyszfMQSK/a+igD+D/AP4OLv2BvhH/AME0v+CAHw//AGTfghqmsax4e0f4qWd3Fca7NDPdmS9s9UlkBaCGCMLvJKgRjGeSetdD+xf/AMGwX/BO/wD4KGf8E+PgH+0t4lvvEngTxTrfhHTpdbfw1c26W2pSDIaaSK6t7gJOygAvGVU43MjMSx/s0+PH7N37P/7UngyH4dftI+C9F8d6Db3aX8Wn67ZRX9sl1GrokojmVlDqsjqGxkBiO5rt/h18OPAPwh8D6X8MvhZo1l4d8O6JAtrp+m6dCtva2sCfdjiiQBUUdgABQB8tfsD/APBPf9l//gmt8B7f9nv9lfRH0zSBMbu9u7qTz7/UbxlVGuLqbC75CqgAKqogAVFVRivxs/bI/wCDUX/gmn+2F+0Xqn7SFzf+KvAmoeIr1r/WdO8NXVpDYXVxJzLLHHPaTtDJK/zyFG2FixCAnNf02UUAfzteG/8Ag2F/4Jn/AA//AGifhF+0j8Kf+En8J6n8GzpMumWGm3lp9i1G60m8kvludRM1nLc3E80sm2Z1nj/dqiII1Va+qv8AgrD/AMEWP2T/APgr54b8M2Xx+u9Y0DXfBrXP9k61oU0UVwkV3s82GVJopo5YmaNGAKh1YfI6hnDfr3RQB+dX/BML/gmh8E/+CU37ONx+zP8AAfWdc13R7zWLjXZrnX5oJrj7VdRQwuqfZ4IEWLEClV2kgliWOeP0VoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//T/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/U/v4ooooAKKKKACiiigAoor57/aL/AGqfgL+yj4N/4Tf46+IrfRLV9y28LZkubl1GdkMKAu547DA/iIHNAH0JXmfxR+M/wl+CWgN4p+L3iTTfDenqDibUblIAxHZA5Bc/7Kgk+lfyg/th/wDBf/4t/EX7V4N/ZP04+DdIfdH/AGveBJtUlXkZRfmit8j/AK6OOoYGvw98j49/tMeNZL9xrfjnX7lv3kzma/uDuOfmc7yB9SAKBpNuyP6/vi9/wcBfsV+AL6fSfh/Z6340miYqJ7K3W1tGI44kuHSTHoREQe1fnj8SP+DkP4sX7PH8IvhtpOlKDhJNXu5r8kepSEWuPpuP1r4A+FP/AASE/af8dwJqHjd7DwjbOM7LyXz7nn/pnDuUcdmdT7V9y+B/+CJnwrsAknxF8Z6pqjDBZNPhislz6Zk+0HH5H6VlKvBdTupZZiZ6qFvXQ8C1j/g4D/b11PP2KPwzp2f+ffTnbH/f2eSvPZv+C53/AAUZlkMieKtPjB/hXSbTA/OMn9a/T/TP+CR/7G1hj7Vp2p3uP+e1+4z/AN+wldtF/wAEuf2GY4wj+CTIR/E2p3+T+VwB+lZ/WoHSskxHdfe/8j8hf+H5f/BRz/obrH/wU2f/AMao/wCH5f8AwUc/6G6x/wDBTZ//ABqv1+/4defsLf8AQjf+VPUP/kmj/h15+wt/0I3/AJU9Q/8Akmj61Dsyv7Dr/wA0fvf+R+QP/D8v/go5/wBDdY/+Cmz/APjVH/D8v/go5/0N1j/4KbP/AONV+v3/AA68/YW/6Eb/AMqeof8AyTR/w68/YW/6Eb/yp6h/8k0fWodmH9h1/wCaP3v/ACPyB/4fl/8ABRz/AKG6x/8ABTZ//GqP+H5f/BRz/obrH/wU2f8A8ar9fv8Ah15+wt/0I3/lT1D/AOSaP+HXn7C3/Qjf+VPUP/kmj61Dsw/sOv8AzR+9/wCR+QP/AA/L/wCCjn/Q3WP/AIKbP/41R/w/L/4KOf8AQ3WP/gps/wD41X6/f8OvP2Fv+hG/8qeof/JNH/Drz9hb/oRv/KnqH/yTR9ah2Yf2HX/mj97/AMj8gf8Ah+X/AMFHP+husf8AwU2f/wAao/4fl/8ABRz/AKG6x/8ABTZ//Gq/X7/h15+wt/0I3/lT1D/5Jo/4defsLf8AQjf+VPUP/kmj61Dsw/sOv/NH73/kfkD/AMPy/wDgo5/0N1j/AOCmz/8AjVH/AA/L/wCCjn/Q3WP/AIKbP/41X6/f8OvP2Fv+hG/8qeof/JNH/Drz9hb/AKEb/wAqeof/ACTR9ah2Yf2HX/mj97/yPyB/4fl/8FHP+husf/BTZ/8Axqj/AIfl/wDBRz/obrH/AMFNn/8AGq/X7/h15+wt/wBCN/5U9Q/+SaP+HXn7C3/Qjf8AlT1D/wCSaPrUOzD+w6/80fvf+R+QP/D8v/go5/0N1j/4KbP/AONUf8Py/wDgo5/0N1j/AOCmz/8AjVfr9/w68/YW/wChG/8AKnqH/wAk0f8ADrz9hb/oRv8Ayp6h/wDJNH1qHZh/Ydf+aP3v/I/IH/h+X/wUc/6G6x/8FNn/APGqP+H5f/BRz/obrH/wU2f/AMar9fv+HXn7C3/Qjf8AlT1D/wCSaP8Ah15+wt/0I3/lT1D/AOSaPrUOzD+w6/8ANH73/kfkD/w/L/4KOf8AQ3WP/gps/wD41R/w/L/4KOf9DdY/+Cmz/wDjVfr9/wAOvP2Fv+hG/wDKnqH/AMk0f8OvP2Fv+hG/8qeof/JNH1qHZh/Ydf8Amj97/wAj8gf+H5f/AAUc/wChusf/AAU2f/xqj/h+X/wUc/6G6x/8FNn/APGq/X7/AIdefsLf9CN/5U9Q/wDkmj/h15+wt/0I3/lT1D/5Jo+tQ7MP7Dr/AM0fvf8AkfkD/wAPy/8Ago5/0N1j/wCCmz/+NUf8Py/+Cjn/AEN1j/4KbP8A+NV+v3/Drz9hb/oRv/KnqH/yTR/w68/YW/6Eb/yp6h/8k0fWodmH9h1/5o/e/wDI/IH/AIfl/wDBRz/obrH/AMFNn/8AGqP+H5f/AAUc/wChusf/AAU2f/xqv1+/4defsLf9CN/5U9Q/+SaP+HXn7C3/AEI3/lT1D/5Jo+tQ7MP7Dr/zR+9/5H5A/wDD8v8A4KOf9DdY/wDgps//AI1R/wAPy/8Ago5/0N1j/wCCmz/+NV+v3/Drz9hb/oRv/KnqH/yTR/w68/YW/wChG/8AKnqH/wAk0fWodmH9h1/5o/e/8j8gf+H5f/BRz/obrH/wU2f/AMao/wCH5f8AwUc/6G6x/wDBTZ//ABqv1+/4defsLf8AQjf+VPUP/kmj/h15+wt/0I3/AJU9Q/8Akmj61Dsw/sOv/NH73/kfkD/w/L/4KOf9DdY/+Cmz/wDjVH/D8v8A4KOf9DdY/wDgps//AI1X6/f8OvP2Fv8AoRv/ACp6h/8AJNH/AA68/YW/6Eb/AMqeof8AyTR9ah2Yf2HX/mj97/yPyB/4fl/8FHP+husf/BTZ/wDxqj/h+X/wUc/6G6x/8FNn/wDGq/X7/h15+wt/0I3/AJU9Q/8Akmj/AIdefsLf9CN/5U9Q/wDkmj61Dsw/sOv/ADR+9/5H5A/8Py/+Cjn/AEN1j/4KbP8A+NUf8Py/+Cjn/Q3WP/gps/8A41X6/f8ADrz9hb/oRv8Ayp6h/wDJNH/Drz9hb/oRv/KnqH/yTR9ah2Yf2HX/AJo/e/8AI/IH/h+X/wAFHP8AobrH/wAFNn/8ao/4fl/8FHP+husf/BTZ/wDxqv1+/wCHXn7C3/Qjf+VPUP8A5Jo/4defsLf9CN/5U9Q/+SaPrUOzD+w6/wDNH73/AJH5A/8AD8v/AIKOf9DdY/8Agps//jVH/D8v/go5/wBDdY/+Cmz/APjVfr9/w68/YW/6Eb/yp6h/8k0f8OvP2Fv+hG/8qeof/JNH1qHZh/Ydf+aP3v8AyPyB/wCH5f8AwUc/6G6x/wDBTZ//ABqj/h+X/wAFHP8AobrH/wAFNn/8ar9fv+HXn7C3/Qjf+VPUP/kmj/h15+wt/wBCN/5U9Q/+SaPrUOzD+w6/80fvf+R+TWlf8F3/APgodpzbrvXNJvx6T6XCB/5CEdeueG/+DiD9tPS7mP8A4SDw/wCE9Utwf3im0uoZGH+yyXW0H3KH6V96al/wSr/Yivl22vhWezPrDqN2T/5ElevLvEX/AARw/ZT1W2dNGvNd0uU8q0V1HIoPuskTZH4g+9NYmBLyTELZr7/+Ad78NP8Ag5F+Ht4I4PjD8NNQ04ggPNo97HeA+4jmW3x9PMP1r9UvgF/wVY/YY/aJaGw8K+N7bR9UmO0afro/s6fdjOFMpETn2jkav5v/AB3/AMER/EcAkuPhn46t7rglINTtGgOewMsTSZ+vlivzZ+MX7C/7UfwP8258Y+FLqewj632nj7ZbY9S0WSg/3wtaRqwlszirYDEUtZwdvv8AyP8AR1hmhuYUuLdxJHIAyspyGB5BBHUGpK/zlP2aP29/2rP2TNUiuvg/4suodPjwH0m8Y3WnSKM8GByVXr96PY3oa/p9/Y+/4L1fs/8AxmltPBv7Rdp/wr7X5iIxeFjNpEznPPmn54M8f6wFBnmStDkP3uoqtZXtnqNnFqGnSpPbzoskUsbBkdGGVZWGQQQcgjgirNABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVWvb2z02zm1HUZkt7e3RpJZZGCIiIMszMcAAAZJPAFfx5/8FO/+C0Piv4xajqPwK/ZOv5tH8HxM9tfa3CTFd6pj5WELDDRWx7EYkkHXapKkA/dL9rz/grn+yN+yPey+FdS1KTxZ4niJSTSdEKTNAwxxcSlhFEefu7i/wDs1+InxU/4ONvj/rN80fwa8C6HoNnkgNqsk2ozkdjmNrZFPqCrY6ZPWvyO/ZY/YZ/aM/bB1nyPhRozf2XHKI7rWLzMNhAe4MhBLsByUjDPzyMc1/QX8Gf+CBHwF8N20V58bvFGqeJ73b88FiF0+0DHt0klbHYh0z3HYcOJzKhQdpy17LVm1OhOeqWh+YGsf8F3f+CiGp3HnWWvaVp6/wDPO30uBl/8iiRv1rI/4fl/8FHP+husf/BTZ/8Axqv6CdN/4I2f8E77GHyrrwNNeN/fm1bUA3/kO4QfpWj/AMOev+Cc3/RO/wDyr6n/APJdcP8ArBh/5Zfcv8zb6lU7o/nl/wCH5f8AwUc/6G6x/wDBTZ//ABqj/h+X/wAFHP8AobrH/wAFNn/8ar+hr/hz1/wTm/6J3/5V9T/+S6P+HPX/AATm/wCid/8AlX1P/wCS6P8AWDD/AMsvuX+YfUqndH88v/D8v/go5/0N1j/4KbP/AONUf8Py/wDgo5/0N1j/AOCmz/8AjVf0Nf8ADnr/AIJzf9E7/wDKvqf/AMl0f8Oev+Cc3/RO/wDyr6n/APJdH+sGH/ll9y/zD6lU7o/nl/4fl/8ABRz/AKG6x/8ABTZ//GqP+H5f/BRz/obrH/wU2f8A8ar+hr/hz1/wTm/6J3/5V9T/APkuj/hz1/wTm/6J3/5V9T/+S6P9YMP/ACy+5f5h9Sqd0fzy/wDD8v8A4KOf9DdY/wDgps//AI1R/wAPy/8Ago5/0N1j/wCCmz/+NV/Q1/w56/4Jzf8ARO//ACr6n/8AJdH/AA56/wCCc3/RO/8Ayr6n/wDJdH+sGH/ll9y/zD6lU7o/nl/4fl/8FHP+husf/BTZ/wDxqj/h+X/wUc/6G6x/8FNn/wDGq/oa/wCHPX/BOb/onf8A5V9T/wDkuj/hz1/wTm/6J3/5V9T/APkuj/WDD/yy+5f5h9Sqd0fzy/8AD8v/AIKOf9DdY/8Agps//jVH/D8v/go5/wBDdY/+Cmz/APjVf0Nf8Oev+Cc3/RO//Kvqf/yXR/w56/4Jzf8ARO//ACr6n/8AJdH+sGH/AJZfcv8AMPqVTuj+eX/h+X/wUc/6G6x/8FNn/wDGqP8Ah+X/AMFHP+husf8AwU2f/wAar+hr/hz1/wAE5v8Aonf/AJV9T/8Akuj/AIc9f8E5v+id/wDlX1P/AOS6P9YMP/LL7l/mH1Kp3R/PL/w/L/4KOf8AQ3WP/gps/wD41R/w/L/4KOf9DdY/+Cmz/wDjVf0Nf8Oev+Cc3/RO/wDyr6n/APJdH/Dnr/gnN/0Tv/yr6n/8l0f6wYf+WX3L/MPqVTuj+fzR/wDgu7/wUQ0y486917StQX/nncaXAq/+QhG3619S/Cv/AIONvj/o18sfxl8C6Hr1nkAtpUk2nTgdzmRrlGPoAq56ZHWv1N1L/gjZ/wAE776HyrXwNNZt/fh1bUC3/kS4cfpXyZ8Zv+CBHwF8SW0t58EfFGqeGL3b8kF8F1C0LDt0jlXPcl3x2HY3DPcNJ2d16r/K4ng6iP0h/ZD/AOCuf7I37XF7F4V03UpPCfieUhI9J1spC07HPFvKGMUp4+7uD/7NfqHX+ch+1P8AsM/tGfsfaz5HxX0Zv7LklMdrrFnmawnPYCQAFGI5CSBX44GOa/Vr/gmJ/wAFofFfwd1HTvgV+1jfzax4PlZLax1uYmW70vPyqJmOWlth3JzJGOm5QFHrU6kZxUoO6OWUWnZn9itFVrK9s9Ss4dR06ZLi3uEWSKWNg6OjjKsrDIIIOQRwRVmrEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFcd8QfiD4J+FPgvUfiL8R9Ut9G0PSITPd3l0+yKJBxye5JIVVGWZiAASQK/j3/AG/v+C4nxW+ONzqHww/Zekn8IeD2LwPqS5j1S/jPBIYHNvG3OFT94QfmYcqAD+jX9qX/AIKefsefslfadK8f+Jo9T8QW+VOiaPi8vQ4z8sgUiOE5GP3roa/D34rf8HIXju88y1+CPw2sdPGMJc63dyXZPuYYBAB9PNavwR+Cf7N3xy/aW8Rtpfws0S51ZzJ/pN4/yW0JbkmWd8KDznGSx7A1+yPwh/4IfKRFf/HfxieQC9locfQ9x9onU/T/AFP41cYSexnOrGO7PFdX/wCC93/BQTUs/Y77QtPz/wA++mKcf9/Wkrkv+H5f/BRz/obrH/wU2f8A8ar9aNF/4JDfsU6Vj7dpGo6lj/n51CVc/wDfkx12n/Dq/wDYN/6ET/yqaj/8k1fsZf1/wxl9agfjH/w/L/4KOf8AQ3WP/gps/wD41R/w/L/4KOf9DdY/+Cmz/wDjVfs5/wAOr/2Df+hE/wDKpqP/AMk0f8Or/wBg3/oRP/KpqP8A8k0exl/X/DB9ah2Z+Mf/AA/L/wCCjn/Q3WP/AIKbP/41R/w/L/4KOf8AQ3WP/gps/wD41X7Of8Or/wBg3/oRP/KpqP8A8k0f8Or/ANg3/oRP/KpqP/yTR7GX9f8ADB9ah2Z+Mf8Aw/L/AOCjn/Q3WP8A4KbP/wCNUf8AD8v/AIKOf9DdY/8Agps//jVfs5/w6v8A2Df+hE/8qmo//JNH/Dq/9g3/AKET/wAqmo//ACTR7GX9f8MH1qHZn4x/8Py/+Cjn/Q3WP/gps/8A41R/w/L/AOCjn/Q3WP8A4KbP/wCNV+zn/Dq/9g3/AKET/wAqmo//ACTR/wAOr/2Df+hE/wDKpqP/AMk0exl/X/DB9ah2Z+Mf/D8v/go5/wBDdY/+Cmz/APjVH/D8v/go5/0N1j/4KbP/AONV+zn/AA6v/YN/6ET/AMqmo/8AyTR/w6v/AGDf+hE/8qmo/wDyTR7GX9f8MH1qHZn4x/8AD8v/AIKOf9DdY/8Agps//jVH/D8v/go5/wBDdY/+Cmz/APjVfs5/w6v/AGDf+hE/8qmo/wDyTR/w6v8A2Df+hE/8qmo//JNHsZf1/wAMH1qHZn4x/wDD8v8A4KOf9DdY/wDgps//AI1R/wAPy/8Ago5/0N1j/wCCmz/+NV+zn/Dq/wDYN/6ET/yqaj/8k0f8Or/2Df8AoRP/ACqaj/8AJNHsZf1/wwfWodmfjH/w/L/4KOf9DdY/+Cmz/wDjVH/D8v8A4KOf9DdY/wDgps//AI1X7Of8Or/2Df8AoRP/ACqaj/8AJNH/AA6v/YN/6ET/AMqmo/8AyTR7GX9f8MH1qHZn4x/8Py/+Cjn/AEN1j/4KbP8A+NUf8Py/+Cjn/Q3WP/gps/8A41X7Of8ADq/9g3/oRP8Ayqaj/wDJNH/Dq/8AYN/6ET/yqaj/APJNHsZf1/wwfWodmfjH/wAPy/8Ago5/0N1j/wCCmz/+NUf8Py/+Cjn/AEN1j/4KbP8A+NV+zn/Dq/8AYN/6ET/yqaj/APJNH/Dq/wDYN/6ET/yqaj/8k0exl/X/AAwfWodmfjH/AMPy/wDgo5/0N1j/AOCmz/8AjVH/AA/L/wCCjn/Q3WP/AIKbP/41X7Of8Or/ANg3/oRP/KpqP/yTR/w6v/YN/wChE/8AKpqP/wAk0exl/X/DB9ah2Z+OFj/wXV/4KK2k3mT+JdNuV/uS6VbAf+OIp/WvavAf/Bw3+2RoGoK/jnQvDfiCz43xi3mtJv8AgMiSlR+MbV+i+of8EpP2FbyHyrfwdLaN/fi1O9Lf+PzuP0rw7x1/wRZ/Zl17T3XwRqutaBefwOZUu4R/vRuisfwkWj2MhrFQPqD9nz/g4P8A2ZfiNqEOhfHHQr/wBcS7VF2H/tKxDHg7njRJUGe/lEAdSMV+4nw7+Jvw7+LnheDxt8LtcsfEGk3H+ru9PnS4iJwDtLISAwBGVOCO4r+FT4+/8Ekv2lvg9YTeIfBvkeNtLhBZjpqst4qjOSbZsk/SN5D7V8l/s5/tV/tDfscePm8VfBvWrjRbxH8u9sZQWtbgIeY7i3bCtjGMkB1/hINZOLW5tGalqmf6TFFflP8A8E5f+Cp/ws/bp0k+ENYji8NfEGyjMlxpDPmO6jUZaa0ZuXUdWQ/OnfK/Mf1YpFBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXx7+2P+3F8Cf2IvAH/CZfFy+L310rDTdItSrXt9IvaNCRtQEjfI2FX1JIBAPsB3SNDJIQqqMkngACvzO/aX/wCCuP7Ev7Mks+jaz4l/4SfXIcg6Z4eC3sqsB0kl3LBGeeQ0gYf3eK/lC/bd/wCCr/7S37Zt1ceHJrs+FPBZc+VoemyMokTt9qmGGnPsQsY7JnmvnH4FfsRftJftDCK+8BeHpYdLl5Gp3/8AotpjjlXYZkHP/LNXNVGLk7RQH7mfFX/g5F8RTeZa/BD4aW1tgfu7rXLxp8n3gt1ix+E5r4717/g4B/b31fd/Z6+GtKz0+y6c7Y+nnzS/rXrXw2/4IneF7ZY7n4u+NLm7fgvb6TAsCj282bzC318ta+sdM/4JPfsXWCqLrQ769x1M2oTjP18tk/SumOBqvfQfKz8sW/4Ll/8ABRskkeLbEew0mz/+NUn/AA/L/wCCjn/Q3WP/AIKbP/41X67j/gl9+wwBj/hB8/8AcT1D/wCSaX/h1/8AsMf9CN/5U9Q/+Sav6hU7r8R8rPyH/wCH5f8AwUc/6G6x/wDBTZ//ABqj/h+X/wAFHP8AobrH/wAFNn/8ar9eP+HX/wCwx/0I3/lT1D/5Jo/4df8A7DH/AEI3/lT1D/5Jo+oVO6/EOVn5D/8AD8v/AIKOf9DdY/8Agps//jVH/D8v/go5/wBDdY/+Cmz/APjVfrx/w6//AGGP+hG/8qeof/JNH/Dr/wDYY/6Eb/yp6h/8k0fUKndfiHKz8h/+H5f/AAUc/wChusf/AAU2f/xqj/h+X/wUc/6G6x/8FNn/APGq/Xj/AIdf/sMf9CN/5U9Q/wDkmj/h1/8AsMf9CN/5U9Q/+SaPqFTuvxDlZ+Q//D8v/go5/wBDdY/+Cmz/APjVH/D8v/go5/0N1j/4KbP/AONV+vH/AA6//YY/6Eb/AMqeof8AyTR/w6//AGGP+hG/8qeof/JNH1Cp3X4hys/If/h+X/wUc/6G6x/8FNn/APGqP+H5f/BRz/obrH/wU2f/AMar9eP+HX/7DH/Qjf8AlT1D/wCSaP8Ah1/+wx/0I3/lT1D/AOSaPqFTuvxDlZ+Q/wDw/L/4KOf9DdY/+Cmz/wDjVH/D8v8A4KOf9DdY/wDgps//AI1X68f8Ov8A9hj/AKEb/wAqeof/ACTR/wAOv/2GP+hG/wDKnqH/AMk0fUKndfiHKz8h/wDh+X/wUc/6G6x/8FNn/wDGqP8Ah+X/AMFHP+husf8AwU2f/wAar9eP+HX/AOwx/wBCN/5U9Q/+SaP+HX/7DH/Qjf8AlT1D/wCSaPqFTuvxDlZ+Q/8Aw/L/AOCjn/Q3WP8A4KbP/wCNUf8AD8v/AIKOf9DdY/8Agps//jVfrx/w6/8A2GP+hG/8qeof/JNH/Dr/APYY/wChG/8AKnqH/wAk0fUKndfiHKz8h/8Ah+X/AMFHP+husf8AwU2f/wAao/4fl/8ABRz/AKG6x/8ABTZ//Gq/Xj/h1/8AsMf9CN/5U9Q/+SaP+HX/AOwx/wBCN/5U9Q/+SaPqFTuvxDlZ+Q//AA/L/wCCjn/Q3WP/AIKbP/41R/w/L/4KOf8AQ3WP/gps/wD41X68f8Ov/wBhj/oRv/KnqH/yTR/w6/8A2GP+hG/8qeof/JNH1Cp3X4hys/If/h+X/wAFHP8AobrH/wAFNn/8ao/4fl/8FHP+husf/BTZ/wDxqv14/wCHX/7DH/Qjf+VPUP8A5Jo/4df/ALDH/Qjf+VPUP/kmj6hU7r8Q5WfkP/w/L/4KOf8AQ3WP/gps/wD41R/w/L/4KOf9DdY/+Cmz/wDjVfrx/wAOv/2GP+hG/wDKnqH/AMk0f8Ov/wBhj/oRv/KnqH/yTR9Qqd1+IcrPyH/4fl/8FHP+husf/BTZ/wDxqlX/AILl/wDBRsEE+LbE+x0mz/8AjVfrv/w6/wD2GP8AoRv/ACp6h/8AJNIf+CX37DBGP+EHx/3E9Q/+SaPqFTuvxDlZ+Zmg/wDBwD+3vpG3+0F8Narjr9q051z9fImi/SvsT4Vf8HIviKHy7X43/DS2ucj95daHeNBg+0FwsufxnFej6n/wSe/Yuv1ZbXQ76yz0MOoTkj6eYz/rmvkn4mf8ETvD1wkl18HvGc9s/JS21eFZlPsZodhH/fpqiWCqrbUXKz97v2aP+CuP7Ev7TcsGjaN4l/4RjXJsAaZ4hC2UrMR0jl3NBIeOAshY/wB3mv0xR0kQSRkMrDII5BBr/N4+Of7F37R37PJlu/iH4dm/syM4/tKz/wBJsyOxMifcz6SBT7V9M/sRf8FX/wBpb9jK6t/DkN2fFfgsOPN0PUpGYRp3+yzHLQH2AaM90zzXNKLi7NCP78KK+Pf2OP24vgT+274A/wCEy+Ed8UvrVVGpaRdFVvbGRu0iAnchIOyRcq3qCCB9hVIBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRX5S/t1/8Fcf2d/2LpZvBVnnxl42XcraPYSqqWjAZH2ubDCLJx8gDydyoHNfyj/taf8ABVH9rv8Aa5kuNI8Ua6fD/hqYkLomjFra2KdhM4PmTcdfMYrnkKKAP7Mfj1/wUh/Yr/ZvWa2+JPj3Tm1GEc6dpzG/vN391o7feYyf+mhQe9fkn8Sf+DkH4QaY0sPwk+G+r6yRkJLqt3Dp6/722Jbokd8ZBPtX82fwO/ZA/aI/aIuEPwy8N3NxZMcNqFwPs9mv/baTCtj0Tc3tX6XfD/8A4Ii/EnUBHP8AE/xpp+lqeXi06CS8f6bpDAAffDAe9OxrChUnrFHeeLf+Dir9rzVLt/8AhDvCnhXSbY/dWaG6uph9X+0Rqf8Av2K8V1j/AILy/wDBQrUyTZavo2nZ/wCffS4m/wDRvmV93eHf+CLv7L+mwJ/b+seINTnA+c/aIIYyfZVg3Af8DNet6R/wSe/Yk00AXnhy71DH/PxqNyuf+/UkdHKzdYGp5H5K/wDD8v8A4KOf9DdY/wDgps//AI1R/wAPy/8Ago5/0N1j/wCCmz/+NV+xX/Drf9hP/oRv/KnqH/yTR/w63/YT/wChG/8AKnqH/wAk0+VlfUKndfifjr/w/L/4KOf9DdY/+Cmz/wDjVH/D8v8A4KOf9DdY/wDgps//AI1X7Ff8Ot/2E/8AoRv/ACp6h/8AJNH/AA63/YT/AOhG/wDKnqH/AMk0crD6hU7r8T8df+H5f/BRz/obrH/wU2f/AMao/wCH5f8AwUc/6G6x/wDBTZ//ABqv2K/4db/sJ/8AQjf+VPUP/kmj/h1v+wn/ANCN/wCVPUP/AJJo5WH1Cp3X4n46/wDD8v8A4KOf9DdY/wDgps//AI1R/wAPy/8Ago5/0N1j/wCCmz/+NV+xX/Drf9hP/oRv/KnqH/yTR/w63/YT/wChG/8AKnqH/wAk0crD6hU7r8T8df8Ah+X/AMFHP+husf8AwU2f/wAao/4fl/8ABRz/AKG6x/8ABTZ//Gq/Yr/h1v8AsJ/9CN/5U9Q/+SaP+HW/7Cf/AEI3/lT1D/5Jo5WH1Cp3X4n46/8AD8v/AIKOf9DdY/8Agps//jVH/D8v/go5/wBDdY/+Cmz/APjVfsV/w63/AGE/+hG/8qeof/JNH/Drf9hP/oRv/KnqH/yTRysPqFTuvxPx1/4fl/8ABRz/AKG6x/8ABTZ//GqP+H5f/BRz/obrH/wU2f8A8ar9iv8Ah1v+wn/0I3/lT1D/AOSaP+HW/wCwn/0I3/lT1D/5Jo5WH1Cp3X4n46/8Py/+Cjn/AEN1j/4KbP8A+NUf8Py/+Cjn/Q3WP/gps/8A41X7Ff8ADrf9hP8A6Eb/AMqeof8AyTR/w63/AGE/+hG/8qeof/JNHKw+oVO6/E/HX/h+X/wUc/6G6x/8FNn/APGqP+H5f/BRz/obrH/wU2f/AMar9iv+HW/7Cf8A0I3/AJU9Q/8Akmj/AIdb/sJ/9CN/5U9Q/wDkmjlYfUKndfifjr/w/L/4KOf9DdY/+Cmz/wDjVH/D8v8A4KOf9DdY/wDgps//AI1X7Ff8Ot/2E/8AoRv/ACp6h/8AJNH/AA63/YT/AOhG/wDKnqH/AMk0crD6hU7r8T8df+H5f/BRz/obrH/wU2f/AMao/wCH5f8AwUc/6G6x/wDBTZ//ABqv2K/4db/sJ/8AQjf+VPUP/kmj/h1v+wn/ANCN/wCVPUP/AJJo5WH1Cp3X4n46/wDD8v8A4KOf9DdY/wDgps//AI1R/wAPy/8Ago5/0N1j/wCCmz/+NV+xX/Drf9hP/oRv/KnqH/yTR/w63/YT/wChG/8AKnqH/wAk0crD6hU7r8T8df8Ah+X/AMFHP+husf8AwU2f/wAao/4fl/8ABRz/AKG6x/8ABTZ//Gq/Yr/h1v8AsJ/9CN/5U9Q/+SaP+HW/7Cf/AEI3/lT1D/5Jo5WH1Cp3X4n46/8AD8v/AIKOf9DdY/8Agps//jVH/D8v/go5/wBDdY/+Cmz/APjVfsV/w63/AGE/+hG/8qeof/JNH/Drf9hP/oRv/KnqH/yTRysPqFTuvxPx1/4fl/8ABRz/AKG6x/8ABTZ//GqP+H5f/BRz/obrH/wU2f8A8ar9iv8Ah1v+wn/0I3/lT1D/AOSaP+HW/wCwn/0I3/lT1D/5Jo5WH1Cp3X4n46/8Py/+Cjn/AEN1j/4KbP8A+NUf8Py/+Cjn/Q3WP/gps/8A41X7Ff8ADrf9hP8A6Eb/AMqeof8AyTR/w63/AGE/+hG/8qeof/JNHKw+oVO6/E/HX/h+X/wUc/6G6x/8FNn/APGqP+H5f/BRz/obrH/wU2f/AMar9iv+HW/7Cf8A0I3/AJU9Q/8Akmj/AIdb/sJ/9CN/5U9Q/wDkmjlYfUKndfifjr/w/L/4KOf9DdY/+Cmz/wDjVH/D8v8A4KOf9DdY/wDgps//AI1X7Ff8Ot/2E/8AoRv/ACp6h/8AJNH/AA63/YT/AOhG/wDKnqH/AMk0crD6hU7r8T8df+H5f/BRz/obrH/wU2f/AMao/wCH5f8AwUc/6G6x/wDBTZ//ABqv2K/4db/sJ/8AQjf+VPUP/kmj/h1v+wn/ANCN/wCVPUP/AJJo5WH1Cp3X4n46/wDD8v8A4KOf9DdY/wDgps//AI1Sr/wXM/4KNhgT4tsSB2Ok2fP/AJCr9if+HW/7Cf8A0I3/AJU9Q/8Akmkb/glt+wmVIHgbBPcanqHH/kzRysPqFTuvxPy00X/gv3+33pePtz+HNSx/z86aVz/35ljr6P8Ah5/wcgfG7TnVfiv8OtE1hM/M2lXM+nNj6TfawT+WfavoPWP+CRX7GWp5+xabqenZ/wCfe/kbH/f0SV4f41/4IlfBPUbdj8P/ABdrOkzkHBvUhvowf91Et2x/wM0uVkvA1UffPwe/4ODP2O/HeoRaT8TNL1vwVJKVBuZ4lvbNSeOXgJl49fJxiv2H+Evx6+C3x40UeIfg14p0zxLabdzNYXKTNH2xIgO9D7OAa/ik+I//AARm/aS8LQy3vgPVNJ8TRRglYlka0uWx2CSjy8n/AK61+cmr+H/jl+zT48hfVINX8F+IbNt8Eo8yznXaQd0cilcjpypIPrSsc86U4fEj/TQor+Ov9kL/AIL/APxl+G32Xwh+1Rpv/Ca6OmE/tS1CwapEvqw+WKfA9fLY9S5Nf1Mfs6/tPfA/9qzwHH8RPgbr0Gs2PyrcRqdtxaysN3lzxH543HoRg4ypI5oMz3yiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/1f7+KKKKACiiigAoor+Yj/grt/wV/wBS8I6lqn7Kn7KGpiLUId1rr/iK0ky9u/IktbR1+7Kv3ZZgcxnKrhwSoB9Qf8FJv+Czngz9ljUrz4LfAGK18T+O4VeK8uXbfYaVJ02vtP76dT1iBCoeHOcpX8kPjDxv+0J+2L8Xv7a8VXepeNPFusOEQYMr47JGigLHGvooVFHPArd/Zn/ZZ+K/7V/jr/hGvAduRawuralqk4P2e0Ryfmdv4nbB2Rj5nIPQBmH9YH7NX7Jvwf8A2WvC66J8O7BW1CaNUvtUnAa7umXk7m/hXPIRcKPc81jVrKGnU9LA5bPEe89I9/8AI/Ln9mj/AII4aPZRW3in9pvUDd3Bw50XT32xL/szTj5m9xHtHo5Fftb4F+Hvgb4Y+HofCfw90m10bToB8kFpGI0z6nHVj3Y5J7muxorgnUlLdn1OHwlKirU4/PqFFFFQdIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8TftEf8E//ANnH9o1JtS17SRo+uSAkappgEE5bsZFxsl5671LY4DCv58P2sv8AgnN8aP2Yo5fFFqP+Em8LJuZtSs4yrW6g4H2iLkx5/vAsn+0DxX9dFRTwQXUD21yiyRyKVdGGVZTwQQeCCK2p15R9Dz8VltGsm7Wl3R/K5+wf/wAFXP2gv2Kb238LSTN4q8CmRfO0S9kOYE7m0lOTC3fbgxk9VzyP7VP2V/2sfgx+2J8L4Pil8GdSF1bkiO8tJMLdWU+MmKePJKt6HlWHKkjmv5j/ANuj/glloviSxvfix+zJZLZ6rHunu9Ci4huR1ZrYdEk7+WPlb+HB4b8b/wBmL9qX44/sVfF6P4j/AAovH0/ULV/s+oafdK32a7iRvnt7mLKkjII6h0blSrDNd9Oopq6PlcVhKmHlyzXo+5/pKUV8g/sT/tnfC/8Abh+C1p8WPh6fsd5Hi31fSZZA8+nXgGWjYgDejfeilCqJE5IVgyL9fVZyhRRRQAUUUUAFFFFABRRRQAUUUUAFFFebfGT4l6N8GfhL4m+LfiAgWXhrS7rUpQTjcttG0m0e7Y2gdSSAKAP5o/8AgvH/AMFA/EVrrr/sS/CXUTa2i28c3im4t2AeUzDdHZFgchNhWSYcFtyqfl3A/mX/AMEyv+CcWsftn+MpPGfj0T6f8PNEl2XlxEdkt9cAAi2hYg4wCDK4+6pAGGYEfBBm+Iv7Tvx2V7+ZtR8U+OtaVWkfJ8y71CYD3IXc/QdFHHSv79/2d/gh4U/Zw+C3h74LeDUAs9CtFhMm0K08x+aWZsfxSSFnPua8jN8e6FNRh8UvwR1YWjzyu9kd34D8BeDfhf4P0/wB8PtNg0jRtKhEFraWy7I40X07kk5LMcsxJJJJJrrqKK+Lbbd2esFFFFIAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDkfHngLwb8UPB+oeAPiDpsGr6NqsJgurS5XfHIjevcEHBVhhlIBBBANfxif8ABTX/AIJxax+xh4yj8Z+AhPqHw81uXZZ3Ep3y2NwQSbaZgBnIBMTn7ygg5ZST/bTXi37RHwQ8KftH/BbxD8FvGSA2eu2jQiTaGaCYfNFMuf4o5Arj3Fehl2Olhqif2Xuv19TCvRVSPmfhn/wQc/4KB+IrrXU/Yl+LWom6tGt5JvC1xcMC8RhG6SyDE5KbA0kI5K7WUfLtA/qlr/MvE3xF/Zi+OzPYTNp3inwLrTKsiZHl3enzEexK7k6Hqp561/pD/Bv4l6N8ZvhL4Z+Lfh8g2XiXS7XUogDnatzGsm0+652kdQQQa+7TTV0eMek0UUUwCiiigAooooAKKKKACiiigArJ1/XtF8LaHeeJvEd1HY6fp0Elzc3EzBI4oYlLO7MeAqqCSfStav5m/wDgv3+3DdeFtAtP2K/h9cNHd6zDFqHiKaNirLabiYLbIx/rWXzJB/cCjoxoA/Jr/gqr/wAFJNc/bh+Jq+FPA09xZfDbw5M40y0YlPt04ypvZ04yxGVhVuY4yejO+eo/YD/4Jf618cYbD4yfHeOXTfB0wE9lYqdl1qS/wse8UDdQ3DyLyuFZXrxb/gmp+xun7UXxabxD4yh3eD/C7xz36MDi7mbJjtgfRsbpOchBjgsCP67Le3t7S3S0tEWKKJQiIgCqqqMAADgADoK3pU76s5a9bl92O5h+FPCPhfwJoFt4V8Gafb6XptmgjhtrWNYokUcYCqAP8a6Kiiuk4QooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK+Af20P8Agn98Lv2sdAm1a1ji0PxlBGfsmqxIAJWHIjugozJGegb76ZyMjKn7+opNJqzKjJxd0fwseNfBPxq/ZJ+My6Rrf2nw34r8O3Ed1a3NtJtZWU7op4JV+8pxlWHuDgggf21/8Euv+CkXhv8Abq+GjaH4o8vT/iJ4egT+17NcKl1GMKLyAf8APN2IDp/yzc4+6VJ+Pf8AgoJ+xlpH7WXwqaXRY47fxjoSPNpV0Rgyjq1tIRzskx8p/gfBHBYH+Xj9l39oLx5+x7+0Rofxj8NJJHfaBdmO9s3ynn25Oy4t5Bx95cjn7rAHqBXJUhys9GlV515n+k7RXC/DD4j+FPjB8OtE+KfgW4+1aP4gsob+0k6ExTqGAYAnDDOGGeCCK7qszUKKKKACiiigAooooAKKKKACiivI/jx8bPAn7Onwi1340fEm6FrpGg2rXEp/ikfpHEg7vI5CIO7EUAfL3/BQ39vXwF+wh8GpPFupmHUPFeqq8GgaQzc3M4AzJIFIYQRZBkYYzkICGYV/CF8T/il8cf2vvjRL4z8c3V34o8WeIJ1iijjUu3JOyGCJeEjXOFRQAOvXJrq/2l/2i/i9+2/+0Bd/E3xpvu9V1mdLTTdOgyyW0BciC1gXrhS2PVmJY8k1/Rl+wL+wvoH7LXg9PFXi2KK88c6rEDd3GA4s425+zwnsB/y0Yffb/ZArehQdSVug0rnz9+xx/wAEpfBvw9tLP4gftHQx634hBEselbhJY2h7CTGRO475zGD0Dfer9kYIILWBLW1RY4o1CoijCqo4AAHAAHQVLRXs06UYK0UWFFFFaAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQXVrbX1tJZXsazQzKUkjcBlZWGCCDwQRwQa/Fv9sj/AIJQeFfGNld/ED9mWCPSdbB8yTRiwSzufXyS3EL9wM+Weny9a/auis6lKM1aSCx/EX8Lfip8b/2RPjND418B3V34Y8V6BO0MsciFGGDiSCeJuHRsYdGBB+oBr+7/AP4J5ft6+Av27/g1H4t0ww6f4r0pUg1/SFbm2nIOJIwxLGCXBMbHOMFCSymvyU/4KC/sOaL+074Jk8ZeDLeO28c6PEWtZVAX7dEoz9nlPGT/AM8mP3W44VjX86f7L37SfxW/Ys+PVh8VvApe21HSpjbahYTZRLq33AT20y9QG246ZRgGHIFeNXoOnKz2Iasf6SlFeWfBH4xeCf2gPhNoPxl+Hdx9p0fxDaJdwN/Eu7ho3HZ43BRx2YEV6nWAgooooAKKKKACiiigAooooAKKKKACiiigAooqvd3drp9rLf30qQwQI0kkkjBURFGSzE8AAcknpQBFqWpado2nXGsaxcR2lpaRvNPPM4jjijjBZndmICqoBJJIAHJr+TD/AIKTf8FwfEfjC/1H4I/sY3z6bokZa3vPE8eUubsjhls88xRdvNwJG6rtHLeB/wDBXL/gqrrn7Tvim9/Z9+A2pPa/DTTJPLu7iAlW1y4jPLuw5+yoR+6j6OR5j7v3ax/In7DH/BPnxt+1VrEPjHxUs2jeBLeUia+xtlvChw0VtuBB5BVpCCqHI+ZhtoLhBzfLE+a/gT+zT8cf2p/FsmmfDbTZdQcyFrzUblittCz/ADFppiD8x64G527A1/R3+zF/wSz+AfwQsoNa+IdtF408Rja7T3sebSFxg4igOVIB/ik3Meo29K/QP4cfDbwP8I/Btl4A+HWnRaXpNgm2KCEYHPVmJ5ZmPLMxJJ5JruatI9ajhIw1lqyG3t7e0gS1tUWKKJQiIg2qqjgAAcAAdBU1FFM6wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4/wAcfD3wL8S9Ck8M/ELSLTWtPlBDQXkKzJz3AYHB9CMEdq7CigGr7n4Hfta/8EfLS5W58cfsrSiCQBpJNAupCVY5zi2mc/L7JIcejjpX46/Dj4o/tEfsY/F8eIPBN5qHg7xRpEuyeF1Me8KeY54XG2WNv7rqynqOxr+3uvjj9sH9i/4bftc+Df7O11V03xDZIf7O1eNA0sJPOyQceZET1QkY6qQalxOGvglLWGjPa/8Agmh/wVn+H37aGlwfDP4nNbeHPiXAnNmCUttUVBkyWhYk7wBl4CSwHzKWUNt/Yyv80n4zfBL4x/sofFIeFvG8M2k6vp8q3Nhf2rsscojbMdxbTDaSAQCCMOjDDBWBA/rj/wCCQf8AwVLj/au0BPgD8dbxU+JGkws9tdOAi6zaRDlxjAFzGP8AWoAN6/vFzhwknlNNOzP3TooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/9b+/iiiigAoor5D/bk/a08LfsXfs6618atfVLm9iAtdJsnJH2zUJgfKjyMkKMF3PZFbHOKAPyu/4LQf8FO779n3SZ/2VvgVdtB4z1i1DatqULbX0u0nHypEw5FxKvIYEGNCGHzMpX+YL9kb9lfxp+1j8UovBHh4m00y1Cz6rqJXclrbk/k0j4Kxp/Eck4VWI4KGL4sftXfHVjJJJrXi7xpqTSSSSt9+edizMxOdqIMk9kReOBX9gX7Mf7Ongv8AZi+E9h8NvCMSmVFEuoXeMSXd2wG+Rj1xxhB/CoArGtV5FpuenluB+sTvL4Vv5+R3Hwh+D/w++BXgOz+HHwz09NP0yzGcLzJLIQA0srdXkbA3MfYDAAA9Noorzm76s+wjFJWS0CiiikMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK5/xZp+s6t4V1PSvDl5/Z2oXVpNFa3W3d5EzoQkm3vsYhsd8V+ZFz4b/AOCrvwjiOs6X4j8OfEu2t4zmxubdbSdwNn3TGlvl/vYLSnPcEkCrjG/Uxq1nD7La8v6ufqvRXxN+zN+274F+Put3Pwy8R6fc+D/Huljbe6FqWEkaRQS/2cnDSKoGSCquBzt2/NX2zUyi07MqnVjUjzQd0FFFFI0CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/J7/gon/wT40n4+6HcfFz4RWcdr45skLzwxgImrRKPuP2FwoH7uTjcPkfI2Mn6w0VUJuLujGvQhWg4TWh/Gb+x7+118X/ANhf44Q/EbwM0iiOQWus6RcbkivbZW+eGVTyrqclHxujf1G5T/oF/s+fHj4fftMfB/Q/jX8MboXOk63AJVBI8yGQcSQyAE7ZI3BVh6jjIwa/ks/4K5/sfwQxj9qT4d2QT5lh8QQwpgEscR3RA7k4SQ45O1j/ABGuU/4Imft9yfs3fGUfAD4kXrL4K8b3KRwtIwEdhqj4SOXJ+6k3EcnYHYx4U16dOakro+KxWGlQqOnL/hz+2WiiirOYKKKKACiiigAooooAKKKKACvyW/4Le+LLjwx/wTm8ZWtrKYpNXutMsAVOCVa7ikdfoyRsD6gkV+tNfh1/wcEyOn7B1sqEgP4o04NjuPKuD/MCgD+eT/gjP8P9P8d/t6+GrrU4vPh8P2l7qu09PMiiMcbH/dkkVh/tAV/bhX8gn/BASOOT9sjxGzqCU8G3pUnsfttiMj8CRX9fdfG59JvE27JHq4NfuwooorxTrCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/iH/AOCyPgjTPBf7fPiuXSYvIi1q3sdSZR082aBVkYf7zozH/aJr+n//AIIheLLjxP8A8E5vBtrdSmWTSLrU7AljkhVu5ZEX6KkigegAFfzsf8F3kVf23LYqMFvDVgT7nzbgV+5X/BvtI7/sHXSuSQninUAuew8q3P8AM1+g4CTeGpt9keJXX7yR+41FFFdZkFFFFABRRRQAUUUUAFFFFAFLUtRsdI06fVtTlWG2tY3mlkbhURAWZj7ADNf5sf7U/wAcNc/af/aQ8W/GrUg7y+I9SkltouSyWwPl28QHJ+SJUT8K/u8/4KcfEfUvhT+wP8UfGGkNsuToz2CODgodSdLPcD6qJsj3Ffw9fsD/AA9034o/theAvCOsJ5lqdR+2SoRkOthG91tI/ut5WD7Gmld2E3ZNn9XP7HP7Puk/s0fs/aF8NrOMC+8oXepy4w0t9OAZSeT93hF/2VFfUNFFdyVtDyW7u7CiiimIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+VP/AIK//s96Z8Jvj/a/Ezw1D5On+OYpbqVFXCJfQFRPg/7YZJCP7zNX9Vlfkz/wWU+H9l4o/ZNTxkyf6V4Z1a2uEcDnyrkm3dfoWdD9VFZ1VeJtQlaaPaP+Den9o3UfiB+z/wCI/wBnvxBMZZ/Al5HcWBYkn7BqJdtgyTxHMkh46CQCv6Fq/iY/4N+viHd+FP25LjwarZtvFHh+9tWQnjzLZo7lG+oWNx9GNf2z1xnpBRRRQAUUUUAFFFFABRRRQAV/I1/wcMftTapr/wAUdB/ZN8N3jppegW0eraxChwst9cg+Qj4PPlQ/OARj97nqBX9bOoahZaTYT6pqUiw29tG0ssjcKiIMsT7ADNf5qHx9+KHiH9pL9ojxP8UrsvcXvizWJriFCMEJNJthjA9ETYgHoKAP1O/4JA/ssR+JPEFz+054wgD2ekyPZ6NG+CHusfvZsEdI1bah/vEnqtf0S147+z98I9K+BPwZ8O/CjSApXR7NIpXUY8y4b5ppOg+/IWb8a9ir3qFL2cFEtIKKKK2GFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV/N1/wV2/ZYi8C+Nbf9o7wfBs03xJMLfVEXOIr/aSsmOgEyqc/wC2pPVq/pFrwb9p34NWXx++BHiT4V3Kr52pWjG0dhny7qL54W9sSKM4xxkVjiKXPBrqJo/Pf/g3j/aqvtL8aeIv2RfFF4zWOqQtrOhxyEkR3MOBcxJ6eZHiTA4zGx6k1/WTX+aF+zn8Wdc/Z2/aE8J/F3Tne2ufDOrQXMox8xiR9s8ZHo8ZdGHoTX+lta3Nve20d5aOJIplDo6nIZWGQQfQivBIJ6KKKACiiigAooooAKKKKACiiigAooooAK/lV/4Lqf8ABRfUpNVuf2JfgzqDQ20SD/hK7u3fBldsMtiGU5CgYM4/iJCHgOD+1X/BSz9saD9ir9lzVviPpTxN4m1JhpmgwyYYNezA/vCuQSkKBpD2JAU/er+Eb4MfCvx9+1R8c7HwNp00l1qviG8ee9vZcuUViZJ7iU8k4BLEn7zEDqRQNJt2R9Tf8E+P2F9U/as8aHxR4xSS28D6LKv22VSUa8lHItomHIyOZHHKqeCGYEf1o6No+k+HdItPD+g20VlY2MKW9tbwKEiiiiUKiIowFVVAAAGABXH/AAp+F/g/4MfD3S/hn4DtVtNM0mBYYlA+ZyPvO5/id2yzHuSa9Cq0j3KFBU426hRRRTNwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+cP2o/2ZfAX7VPwtuvh340QQ3ChpdOv0UGWzucYV19VPSRMgOvGQcMP5A/Gng34zfsi/G7+yNRkn8P+KvDN0lxaXdq5U7kO6KeCTjcjYypx04YA5A/uLr84/wDgpP8Asjw/tKfBmXxD4WtQ/i7wwj3NgUUeZcwgZltiep3D5kGfvgDjcaTRx4vD865o7o/Sz/gmL+3Xpn7cv7P0HiPWZIYfGegFLLxBaxjYPOx8lwi9o5wCwxwrBl7V+kFf51H7An7X3in9ib9pHSfilp7yNpErix12yBIFxYSMPMG3u8ePMj44ZcdCc/6IWha3pPibRLPxJoFwl3YahBHc208ZyksMqhkdT6MpBFQeOatFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/9f+/iiiigAr+Jj/AILrfte/8L2/aYX4H+FLrzfDnw632r7DlJtUkx9objr5WBCPRlfHWv64v2sfjdZ/s4fs2eNfjddkBvD2lT3FuCAQ90w2W6HPHzzMi/jX+eT8Cfhrrn7R/wAftC+H1zPJLc+JNRzeXJ+aQRkmW4lJ7sEDtz3pN21KhFykordn7q/8Egv2YLXwh8Pp/wBo7xVaj+1vEG+30vzF5hsUOGdcjIMzg8/3FGOGNftNWN4c8P6P4S8P2Phbw9AtrYadBHbW8KcKkUShVUfQACtmvLnPmk2fd4agqNONNdAoooqDcKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD4e/bM/ZMi+O/h2Dx38MxBo/xK8OSR3ejawg8qVmgbcIJJB1Q/wAG7IRuRwWB6j9ij9o2X9pb4I23ivXEMHiHSp20zW4Gh8jZfQqpYhCzEKysp7c5GBggfXNflp+yJav8PP25/j38JtPVBp1xcWGuIiE7Y5bxPOcKD03faOew2gAAVqvei0+hxTj7OvGcdpaP1tdP8D9S6KKKyO0KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAxvEfh3Q/F2gXvhbxNax3unajC9vcwSjKSRSAqykehBr+Lf9q34Eap+zT8etb+GExc21rN9o06c9ZbOX5oXznqB8rf7Smv7Ya/Hb/gsP8AAK18a/Biz+OWlQk6n4SlWG5ZRkvY3LhTnn/lnKVYccBmrow8+WVu55Ob4X2lHnW8dfl1/wAz9pP+CVX7XSfte/sk6L4k1u5E3ifw6Bo+tgn52uIFGyY/9d49rk9N+4DpX6S1/Eb/AMEFf2hJPhR+2V/wqvVLnytK+INjJY7GJ2fbrYGa3b0yQJIxkdZK/tyr0D5EKKKKACiiigAooooAKKKKACvw3/4OC/8Akw+0/wCxp0//ANE3NfuRX4b/APBwX/yYfaf9jTp//om5oA/F/wD4IBf8nj+Jf+xMvP8A0usa/r4r+Qf/AIIBf8nj+Jf+xMvP/S6xr+vivi88/wB6foj1sH/DCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/gu/8A8nt2n/Ys2H/o24r9xf8Ag3z/AOTELz/satQ/9E21fh1/wXf/AOT27T/sWbD/ANG3FfuL/wAG+f8AyYhef9jVqH/om2r7/Lv91p+h4tf+JI/cmiiiu0xCiiigAooooAKKKKACiiigD8mv+C3uoS2f/BNvxzbx9Lq40iJvoL+3f+aiv5av+CRWnRX37bGi3MnWz0/UJk+phaP+Tmv6hf8AguV/yjj8Xf8AX9pP/pZFX8xf/BHz/k8+x/7BN/8A+gCrh8SIq/Az+tGiiiu08oKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK+I/8Ago9pEGt/sSfEGzuPupYxXA/3reeKVf1QV9uV8df8FA/+TMPiJ/2CX/8AQ1qZbMun8SP55v8AgjZq8+jf8FJPhpNDyJ5tRt2Hqs1hcr+hIP4V/ftX+fl/wSG/5SOfC/8A6/rv/wBI7iv9A2uE9UKKKKACiiigAooooAKKKKAPiL/gpL4+1D4afsIfFPxZpT+VcDQbizjfoVa+xbbh7jzcj3r+Fn9hvwVa/EH9rfwF4bvQGh/tWO7dTyGWyDXBU+x8vBr+yb/gtrq8ulf8E2vHsMOc3s2k25I7A6hbufzC4/Gv5N/+CWNkl3+274Tmf/l2h1GQfX7HMv8A7NWlFXqRXmho/rdooor6AsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP4vf22/Adp8Nv2sfHfhPTwFt01SS6iUcBEvALhVHsokCj6V/el+wP44vfiN+xV8LfGGpP5l1c+GtPSd+peWCJYnY+5ZCT71/El/wVOsktP23fFkyf8vMOnSH6/Y4V/wDZa/ry/wCCOWry63/wTa+GN7NnKW+oW/Ppb6hcxD9EFfP1lacl5shn6Z0UUVmIKKKKACiiigAooooAKKKKACiivBf2o/jVp/7On7O/jH43algjw5pc91Ep6SXG3bAnP9+VkX8aAP43v+C3P7W0/wC0R+1td/DbQbgv4a+HBl0i3VWykl/kfbJcAkZ8xRED/djB7mvu/wD4JB/s42Hw7+Cb/HHWrbGt+MCwgd+senRNhFA7eY6lz6jZ6V/Or8NfBvib4/8Axq0nwZ57T6n4q1RI5rh+W33EmZZW+gLOfpX9w/hXwzo3gvwxp3g/w7EILDSraK0tox0WKFQij8ABVRO/AU7yc30N+iiiqPVCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5Rf+CrX7Nll8Efj6vjnwrbfZ9C8aJJeqqLiOK9Rv9IRcAAA7lkA/2yBwK/f7/ggf+1pN8Yf2db39nnxVOZNZ+HbItozH5pdKuSxiHT/li4aPrwhQV5//AMFK/gTH8cP2VtbNlGG1Xwwp1qybHzf6MpMyD/fh34HdgtfiB/wR2/aC/wCFAft2+FJdQn8jSfFpbw7fbn2Ji+IEBbPHy3CxEk9BnkVDR4uLp8lTTZn99dFFFI5QooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9D+/iiiigD+dn/g4q+Ndz4V/Z/8H/A3TZQj+LtUkvbpQfmNtpiqQpHo0syNz3TjvX5V/wDBFn4SR638SvE3xm1BA0ehWiafak/897wlnYe6xpt+j1uf8HBHxS/4TP8AbatPh9bSZg8HaDaWzpnpc3ha6c/jHJF+VfZ3/BH7wR/wjP7JQ8TSR4k8R6vd3Yc9Wjh22wH0DRP+JNY4iVoM9PKKXPiVfpqfqhRRRXmn2IUUUUAFFFFABRRRQAUUUUAFFFFAHNf8Jn4P/wCEk/4Q3+1rP+19u/7D56faduN2fKzvxt5zjpzS+JPGPhHwbbx3ni/VbPSopm2RveTpArNjOAXIBOOcCv5L/wDnbi/7lz/3X62f+Duj/k1b4U/9jXcf+kb1sqXvRjfdHBLGtUqlTl+FtetrH9V3iTx/4E8GtCvi/W7DSjcgtCLy5jg8wLjJXewzjIzj1qjofxS+GXie9XTfDfiPS9QuX+7FbXkUrn6KjE1/HZ/wc1aD4I8VftHfsleGPiZdJY+G9Slu7XVrmSYW6Q2M11pyTu0rfLGFjLEueFxk9K+Tf+Clv7Cf/BC/4A/so658Uv2OPjPb6h8S9Kms5NDsdJ8TWutvcymeNXV4rfc6KsReQSh02MoOT91nGimlrv5GdXHzhOaUVaPd2e19ND++/VNY0jQ7X7drV1DZw5C+ZO6xrk9BliBmrdvcQXcCXVq6yxSqHR0O5WVuQQRwQR0Nfxbf8FI/iD8avip/wbNfCTx/+0K11N4s1LUtHe6nvSzXFzCr3aWtxIzfMzz2yxSljksXySc5P9Sf/BPr/kwn4If9iB4a/wDTdBUSp2V/M6aWJ9pU5LdE/vPryivzC/4KL/8ABUH4d/8ABPu48G+Bj4V1j4g+P/iHdPaeHfDOhqPtF00bIjM7kNsBaRUQKju7HAXAZl8N/ZD/AOCxV98df2pYf2Nf2jPgr4q+DPjvULJr/TodW/0u0uIUV25mEUJj3iN/LYoY2ZGTeHwpShK17FvE0lP2blqftfRRRUG4UUUUAFFFFABRRRQAUUUUAFFFFABX5ifAv/lJ38cP+wVon/pLbV+ndfmJ8C/+Unfxw/7BWif+kttWlPaXocuJ+Kl/i/8AbZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVw3xO8B6R8Ufh3rnw514A2muWM9lJkZ2iZCu4e6k5HuK7mihCaTVmfwy+G9c8Y/s7/G2z8QWBNvr3gnWklXaSNtzp82SMjnG5MH2r/Sw8C+LdO8feCdH8d6P/wAemtWNvfwc5/d3MayLz34YV/nsf8FHPBB8CftmeNrJF2xahdR6lGcYDfbY0lc/9/GYfUV/Zr/wST+Jf/C0v+Cevw11eaXzLjTNPfR5QTkp/Zsr2yA/9so0I9iK9eLukz4CtT5Kkodm0fo5RRRTMwooooAKKKKACiiigAr8N/8Ag4L/AOTD7T/sadP/APRNzX7kV+G//BwX/wAmH2n/AGNOn/8Aom5oA/F//ggF/wAnj+Jf+xMvP/S6xr+viv5B/wDggF/yeP4l/wCxMvP/AEusa/r4r4vPP96foj1sH/DCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/gu/wD8nt2n/Ys2H/o24r9xf+DfP/kxC8/7GrUP/RNtX4df8F3/APk9u0/7Fmw/9G3FfuL/AMG+f/JiF5/2NWof+ibavv8ALv8AdafoeLX/AIkj9yaKKK7TEKKKKACiiigAooooAKKKKAPyK/4Llf8AKOPxd/1/aT/6WRV/MX/wR8/5PPsf+wTf/wDoAr+nT/guV/yjj8Xf9f2k/wDpZFX8xf8AwR8/5PPsf+wTf/8AoAq4fEiKvwM/rRooortPKCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvjr/goH/yZh8RP+wS//oa19i18df8ABQP/AJMw+In/AGCX/wDQ1pS2ZcPiR/Of/wAEhv8AlI58L/8Ar+u//SO4r/QNr/Py/wCCQ3/KRz4X/wDX9d/+kdxX+gbXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8Fyv+Ucfi7/r+0n/ANLIq/ld/wCCU3/J63hz/r11H/0mkr+qL/guV/yjj8Xf9f2k/wDpZFX8rv8AwSm/5PW8Of8AXrqP/pNJWtD+JH1Q1uf1n0UUV75YUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfyYf8FWf+T1vEf/AF66d/6TR1/WX/wRV/5RmfDT/uM/+nW8r+TT/gqz/wAnreI/+vXTv/SaOv6y/wDgir/yjM+Gn/cZ/wDTreV4Ff8AiS9SHufqZRRRWQgooooAKKKKACiiigAooooAK/DX/g4F+Iy+Ev2G7bwZE+JvFfiGytGQd4bZZLpj9A8UY+pFfuVX8sX/AAco+JbjzvhF4PikIi261eSp2Lf6IkZP0G8D60Afl1/wSA+HP/CZftax+KriMNB4W0y6vtzDKiaUC3QfXErMP93Nf1ZV+Cf/AAQ40KKPRfiL4mdAXln021V8cgRrO7AH33rn6Cv3sq1se1g42pLzCiiimdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBT1HT7PVtPn0rUYxLb3MbRSoejI4IYH6g1/Cr468O618Gfi/q3heJ2hv8Awtq89ukncSWcxVWH4qCDX921fx2f8FMdHi0T9uDx3awIESWazuOBgEz2kEjH8WY596mRwY+PuqR/oB/Cbx5ZfFT4V+Gvidpu37P4j0qz1OLacjZdwrKMfg1egV+cn/BI/wASXvir/gnP8LtTv5DK8Wn3FmCeyWd3PboP+ArGB+Ffo3UnlBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//0f7+KKKKAP8APv8A+Cu2sf25/wAFG/ije5zsv7W3/wDAezgi/wDZK/oP/YB0saP+xt8PrQDG/S1n/wC/7vJ+u6v5qf8AgpFdTXn7enxbmnOWHia/QfSOQqP0Ar+pH9ke2itP2VvhtFCMA+GNJf8AF7WNj+prlxXwo93Il+9m/L9T6GooorhPpwooooAKKKKACiiigAooooAKKKKAP4v/APgoJ8UNO/4Jz/8ABxZ4M/bc+O1heRfDvxPoccLanbQtMsYNhJp0pAUEu1u4jkkjUF/LYEAkgHxT/gux+3l+zv8A8FWtU+C/7Hv7BeqXHjzXrzxC0sk0Flc20Mct3GsEMf8ApMUTMcO7yMF2Rqh3Ec4/tg+K/wAGPhD8ePCb+A/jb4W0nxdokjiU2Os2cV7b+YoIDiOZWUOoJwwGRng15n8Ff2Mf2R/2cNUfXvgJ8MvDHg/UZUaJ73SdKt7W6aNzkoZkQSFSQPlLY9q3jVSs2tUeXUwNSXPTjJcknd6a+dj+Xv8A4OTvBnhvxh+2h+x98PPFNsL3R9V1afTru3clRLbT32mxSISpBAZCQSCDzwa8f/4K+/8ABKXwV/wTJ8U+E/8Ago/+wn4L0298J+GLyKPxN4U1u3/tvTYDIwWK58u985vJlZvKkO4NDIY3iKkkp/Y78Rf2fPgJ8YPEOi+Lfi14I0DxTqvhuTztIvdX0y3vriwk3K++2kmjd4W3ojZjKncqnqBXoHinwr4X8c+G7/wb420211jR9Vgktb2xvoUuLa5glBV45YpAyOjKSGVgQQcEUKs1ZFVMvU5VJPd2afVWR/J//wAFv/2sfhj+27/wQl8MftJfCdwum+IPEmjtLaFg0tjdxrOk9rJjHzwyArnADDDD5WBr6w/Y5/4Lt/8ABKX4Xfsi/Cv4Z+O/ixHYa54d8IaHpmo2x0fVZDDd2llDFNHvjs2RtrqRlWKnGQSOa/ZS3/Yp/Y1tPhxcfBy1+EngyLwhdXq6lPoaaDYrpsl6qhBcPbCHyWmCgKJCu4AYziuC/wCHan/BOb/ogPw3/wDCV0z/AOR6XPC3K0yvYV1U9pGSu0k7p9D8Df8AgtV8Vf8Aglx+114R+BXjv4s+IPGHh6HxW00/gn4k+HtO/wCJZaRyTJHOL5Lp4J9kTxpKVSMTIAGQ4Lg/HX7Dn7WH7Xf7NH/BTb4Z/sZ/CH9o+L9qX4deL5ETUGQy332CzYP5jmWVp3ge2jXztsVy8YUbXA4Ff2Q6t+zR+znr3wnt/gLrXgHw7deB7RQtv4el0u2bS4QpJHl2pj8lMFiRtQYJJHNYnwR/ZF/ZZ/ZquLq8/Z9+HXhzwXcXy+Xcz6NplvZzTIDkK8kaK7KDyFJIHamqqUeWxM8FUlVVTmSel2rp6dN7P5n0RRRRWB6QUUUUAFFFFABRRRQAUUUUAFFFFABX5ifAv/lJ38cP+wVon/pLbV+ndfmJ8C/+Unfxw/7BWif+kttWlPaXocuJ+Kl/i/8AbZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzB/wDBZ7SRZftR6PqSLhb3w3bMT6ulxcqf0C1++f8Awb56x/af7CF5ZZz/AGd4q1C3+m6G2l/9qV+JP/BbW2iX4ueC7wD55NHmQn2SYkf+hGv1t/4NyruZ/wBlDxrYsf3cfiySQD3eztgf/QRXp0fgR8TmStiZ+p/QlRRRWpwhRRRQAUUUUAFFFFABX4b/APBwX/yYfaf9jTp//om5r9yK/Df/AIOC/wDkw+0/7GnT/wD0Tc0Afi//AMEAv+Tx/Ev/AGJl5/6XWNf18V/IP/wQC/5PH8S/9iZef+l1jX9fFfF55/vT9Eetg/4YUUUV451BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfxw/8ABd//AJPbtP8AsWbD/wBG3FfuL/wb5/8AJiF5/wBjVqH/AKJtq/Dr/gu//wAnt2n/AGLNh/6NuK/cX/g3z/5MQvP+xq1D/wBE21ff5d/utP0PFr/xJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkV/wXK/5Rx+Lv8Ar+0n/wBLIq/mL/4I+f8AJ59j/wBgm/8A/QBX9On/AAXK/wCUcfi7/r+0n/0sir+Yv/gj5/yefY/9gm//APQBVw+JEVfgZ/WjRRRXaeUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfHX/AAUD/wCTMPiJ/wBgl/8A0Na+xa+Ov+Cgf/JmHxE/7BL/APoa0pbMuHxI/nP/AOCQ3/KRz4X/APX9d/8ApHcV/oG1/n5f8Ehv+Ujnwv8A+v67/wDSO4r/AEDa4D1QooooAKKKKACiiigAooooA/Ir/guV/wAo4/F3/X9pP/pZFX8rv/BKb/k9bw5/166j/wCk0lf1Rf8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK1ofxI+qGtz+s+iiivfLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+TD/gqz/yet4j/AOvXTv8A0mjr+sv/AIIq/wDKMz4af9xn/wBOt5X8mn/BVn/k9bxH/wBeunf+k0df1l/8EVf+UZnw0/7jP/p1vK8Gv/El6kPc/UyiiisRBRRRQAUUUUAFFFFABRRRQAV/IH/wcfaq837QXw80M/dt/D004+s1y6n/ANFiv6/K/jr/AODjj/k6LwN/2Kw/9K7igD03/giZpaQ/s7+KNaH3rjxG8B+kNtbsP/RlfsvX4/8A/BFL/k1jX/8Asa7r/wBI7Ov2Aq0e7hv4UQooopm4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV/Jb/wAFbbBbP9tPWbhet3YafKfqIVT/ANkr+tKv5P8A/gr1/wAnlXv/AGCrD/0E0pHHjv4fzP6jP+CIV+13/wAE2vAtu3S1uNXiH0OoXD/+zV+slfkV/wAENf8AlHH4R/6/tW/9LJa/XWoPHCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/S/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfmJ8C/+Unfxw/7BWif+kttX6d1+YnwL/wCUnfxw/wCwVon/AKS21aU9pehy4n4qX+L/ANtkfp3RRRWZ1BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/OR/wW3/5Kl4I/wCwVcf+jhX6t/8ABuP/AMmu+Of+xpP/AKSW9flJ/wAFt/8AkqXgj/sFXH/o4V+rf/BuP/ya745/7Gk/+klvXp0PgR8Vmf8AvU/66I/ocooorU4AooooAKKKKACiiigAr8N/+Dgv/kw+0/7GnT//AETc1+5Ffhv/AMHBf/Jh9p/2NOn/APom5oA/F/8A4IBf8nj+Jf8AsTLz/wBLrGv6+K/kH/4IBf8AJ4/iX/sTLz/0usa/r4r4vPP96foj1sH/AAwooorxzqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/jh/wCC7/8Aye3af9izYf8Ao24r9xf+DfP/AJMQvP8AsatQ/wDRNtX4df8ABd//AJPbtP8AsWbD/wBG3FfuL/wb5/8AJiF5/wBjVqH/AKJtq+/y7/dafoeLX/iSP3JooortMQooooAKKKKACiiigAooooA/Ir/guV/yjj8Xf9f2k/8ApZFX8xf/AAR8/wCTz7H/ALBN/wD+gCv6dP8AguV/yjj8Xf8AX9pP/pZFX8xf/BHz/k8+x/7BN/8A+gCrh8SIq/Az+tGiiiu08oKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK+Ov8AgoH/AMmYfET/ALBL/wDoa19i18df8FA/+TMPiJ/2CX/9DWlLZlw+JH85/wDwSG/5SOfC/wD6/rv/ANI7iv8AQNr/AD8v+CQ3/KRz4X/9f13/AOkdxX+gbXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK/qi/wCC5X/KOPxd/wBf2k/+lkVfyu/8Epv+T1vDn/XrqP8A6TSVrQ/iR9UNbn9Z9FFFe+WFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8mH/BVn/k9bxH/166d/6TR1/WX/AMEVf+UZnw0/7jP/AKdbyv5NP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV4Nf+JL1Ie5+plFFFYiCiiigAooooAKKKKACiiigAr+Or/g43/5Oj8DD/qVR/wCldxX9itfx1f8ABxv/AMnR+Bv+xVH/AKV3FAHsv/BFL/k1jX/+xruv/SOzr9gK/H//AIIpf8msa/8A9jXdf+kdnX7AVoj3sN/CiFFFFBsFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfyf/APBXr/k8q9/7BVh/6Ca/rAr+T/8A4K9f8nlXv/YKsP8A0E0nsceO/h/M/p7/AOCGv/KOPwj/ANf2rf8ApZLX661+RX/BDX/lHH4R/wCv7Vv/AEslr9dag8cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9P+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV+YnwL/5Sd/HD/sFaJ/6S21fp3X5ifAv/AJSd/HD/ALBWif8ApLbVpT2l6HLifipf4v8A22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/Bbf/kqXgj/ALBVx/6OFfq3/wAG4/8Aya745/7Gk/8ApJb1+Un/AAW3/wCSpeCP+wVcf+jhX6t/8G4//Jrvjn/saT/6SW9enQ+BHxWZ/wC9T/rof0OUUUVqcAUUUUAFFFFABRRRQAV+G/8AwcF/8mH2n/Y06f8A+ibmv3Ir8N/+Dgv/AJMPtP8AsadP/wDRNzQB+L//AAQC/wCTx/Ev/YmXn/pdY1/XxX8g/wDwQC/5PH8S/wDYmXn/AKXWNf18V8Xnn+9P0R62D/hhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/wXf/5PbtP+xZsP/RtxX7i/8G+f/JiF5/2NWof+ibavw6/4Lv8A/J7dp/2LNh/6NuK/cX/g3z/5MQvP+xq1D/0TbV9/l3+60/Q8Wv8AxJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkV/wAFyv8AlHH4u/6/tJ/9LIq/mL/4I+f8nn2P/YJv/wD0AV/Tp/wXK/5Rx+Lv+v7Sf/SyKv5i/wDgj5/yefY/9gm//wDQBVw+JEVfgZ/WjRRRXaeUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfHX/BQP/kzD4if9gl//AENa+xa+Ov8AgoH/AMmYfET/ALBL/wDoa0pbMuHxI/nP/wCCQ3/KRz4X/wDX9d/+kdxX+gbX+fl/wSG/5SOfC/8A6/rv/wBI7iv9A2uA9UKKKKACiiigAooooAKKKKAPyK/4Llf8o4/F3/X9pP8A6WRV/K7/AMEpv+T1vDn/AF66j/6TSV/VF/wXK/5Rx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/AK9dR/8ASaStaH8SPqhrc/rPooor3ywooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/kw/4Ks/8nreI/8Ar107/wBJo6/rL/4Iq/8AKMz4af8AcZ/9Ot5X8mn/AAVZ/wCT1vEf/Xrp3/pNHX9Zf/BFX/lGZ8NP+4z/AOnW8rwa/wDEl6kPc/UyiiisRBRRRQAUUUUAFFFFABRRRQAV/HV/wcb/APJ0fgb/ALFUf+ldxX9itfx1f8HG/wDydH4G/wCxVH/pXcUDPZf+CKX/ACaxr/8A2Nd1/wCkdnX7AV+P/wDwRS/5NY1//sa7r/0js6/YCtEe7hv4UQooooNgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+T/AP4K9f8AJ5V7/wBgqw/9BNf1gV/J/wD8Fev+Tyr3/sFWH/oJpPY48d/D+Z/T3/wQ1/5Rx+Ef+v7Vv/SyWv11r8iv+CGv/KOPwj/1/at/6WS1+utQeOFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/1P7+KKKKAP8AOf8A+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf+xV0b/0kir+V3/gox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/ALFXRv8A0kirlxWyPeyH45+h79RRRXCfTBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX5ifAv/lJ38cP+wVon/pLbV+ndfmJ8C/8AlJ38cP8AsFaJ/wCkttWlPaXocuJ+Kl/i/wDbZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzkf8Ft/+SpeCP8AsFXH/o4V+rf/AAbj/wDJrvjn/saT/wCklvX5Sf8ABbf/AJKl4I/7BVx/6OFfq3/wbj/8mu+Of+xpP/pJb16dD4EfFZn/AL1P+uh/Q5RRRWpwBRRRQAUUUUAFFFFABX4b/wDBwX/yYfaf9jTp/wD6Jua/civw3/4OC/8Akw+0/wCxp0//ANE3NAH4v/8ABAL/AJPH8S/9iZef+l1jX9fFfyD/APBAL/k8fxL/ANiZef8ApdY1/XxXxeef70/RHrYP+GFFFFeOdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8cP/Bd//k9u0/7Fmw/9G3FfuL/wb5/8mIXn/Y1ah/6Jtq/Dr/gu/wD8nt2n/Ys2H/o24r9xf+DfP/kxC8/7GrUP/RNtX3+Xf7rT9Dxa/wDEkfuTRRRXaYhRRRQAUUUUAFFFFABRRRQB+RX/AAXK/wCUcfi7/r+0n/0sir+Yv/gj5/yefY/9gm//APQBX9On/Bcr/lHH4u/6/tJ/9LIq/mL/AOCPn/J59j/2Cb//ANAFXD4kRV+Bn9aNFFFdp5QUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV8df8FA/+TMPiJ/2CX/8AQ1r7Fr46/wCCgf8AyZh8RP8AsEv/AOhrSlsy4fEj+c//AIJDf8pHPhf/ANf13/6R3Ff6Btf5+X/BIb/lI58L/wDr+u//AEjuK/0Da4D1QooooAKKKKACiiigAooooA/Ir/guV/yjj8Xf9f2k/wDpZFX8rv8AwSm/5PW8Of8AXrqP/pNJX9UX/Bcr/lHH4u/6/tJ/9LIq/ld/4JTf8nreHP8Ar11H/wBJpK1ofxI+qGtz+s+iiivfLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+TD/gqz/yet4j/wCvXTv/AEmjr+sv/gir/wAozPhp/wBxn/063lfyaf8ABVn/AJPW8R/9eunf+k0df1l/8EVf+UZnw0/7jP8A6dbyvBr/AMSXqQ9z9TKKKKxEFFFFABRRRQAUUUUAFFFFABX8dX/Bxv8A8nR+Bv8AsVR/6V3Ff2K1/HV/wcb/APJ0fgb/ALFUf+ldxQM9l/4Ipf8AJrGv/wDY13X/AKR2dfsBX4//APBFL/k1jX/+xruv/SOzr9gK0R7uG/hRCiiig2CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACv5P8A/gr1/wAnlXv/AGCrD/0E1/WBX8n/APwV6/5PKvf+wVYf+gmk9jjx38P5n9Pf/BDX/lHH4R/6/tW/9LJa/XWvyK/4Ia/8o4/CP/X9q3/pZLX661B44UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//V/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABRRRQAUUUUAFFFFABRRRQAUV4L+0L+0j8L/ANmHwjaeNvirPPDZX14tjELeIzSGVkeT7oIO0KhyexwO9fH3/D3X9jj/AJ/dV/8AABv/AIqrVOTV0jCpiqMHyzmkz9O6K/MT/h7r+xx/z+6r/wCADf8AxVH/AA91/Y4/5/dV/wDABv8A4qn7KfYj69h/+fi+8/TuivzE/wCHuv7HH/P7qv8A4AN/8VR/w91/Y4/5/dV/8AG/+Ko9lPsH17D/APPxfefp3RX5if8AD3X9jj/n91X/AMAG/wDiqP8Ah7r+xx/z+6r/AOADf/FUeyn2D69h/wDn4vvP07or8xP+Huv7HH/P7qv/AIAN/wDFUf8AD3X9jj/n91X/AMAG/wDiqPZT7B9ew/8Az8X3n6d0V+Yn/D3X9jj/AJ/dV/8AABv/AIqj/h7r+xx/z+6r/wCADf8AxVHsp9g+vYf/AJ+L7z9O6K/MT/h7r+xx/wA/uq/+ADf/ABVd/wDC7/gpd+yp8XPHmm/DnwxqV7FqWrSi3tRc2bxxvK33U3DIBY8DOBnvQ6U+w1jaDdlNfefflFFFZnSFFFFABRRRQAV+YnwL/wCUnfxw/wCwVon/AKS21fp3X5ifAv8A5Sd/HD/sFaJ/6S21aU9pehy4n4qX+L/22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/Bbf/kqXgj/sFXH/AKOFfq3/AMG4/wDya745/wCxpP8A6SW9flJ/wW3/AOSpeCP+wVcf+jhX6t/8G4//ACa745/7Gk/+klvXp0PgR8Vmf+9T/rof0OUUUVqcAUUUUAFFFFABRRRQAV+G/wDwcF/8mH2n/Y06f/6Jua/civw3/wCDgv8A5MPtP+xp0/8A9E3NAH4v/wDBAL/k8fxL/wBiZef+l1jX9fFfyD/8EAv+Tx/Ev/YmXn/pdY1/XxXxeef70/RHrYP+GFFFFeOdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8cP/AAXf/wCT27T/ALFmw/8ARtxX7i/8G+f/ACYhef8AY1ah/wCibavw6/4Lv/8AJ7dp/wBizYf+jbiv3F/4N8/+TELz/satQ/8ARNtX3+Xf7rT9Dxa/8SR+5NFFFdpiFFFFABRRRQAUUUUAFFFFAH5Ff8Fyv+Ucfi7/AK/tJ/8ASyKv5i/+CPn/ACefY/8AYJv/AP0AV/Tp/wAFyv8AlHH4u/6/tJ/9LIq/mL/4I+f8nn2P/YJv/wD0AVcPiRFX4Gf1o0UUV2nlBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXx1/wAFA/8AkzD4if8AYJf/ANDWvsWvjr/goH/yZh8RP+wS/wD6GtKWzLh8SP5z/wDgkN/ykc+F/wD1/Xf/AKR3Ff6Btf5+X/BIbj/go58L/wDr+u//AEjnr/QNrgPVCiiigAooooAKKKKACiiigD8iv+C5X/KOPxd/1/aT/wClkVfyu/8ABKb/AJPW8Of9euo/+k0lf1Rf8Fyv+Ucfi7/r+0n/ANLIq/ld/wCCU3/J63hz/r11H/0mkrWh/Ej6oa3P6z6KKK98sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5MP8Agqz/AMnreI/+vXTv/SaOv6y/+CKv/KMz4af9xn/063lfyaf8FWf+T1vEf/Xrp3/pNHX9Zf8AwRV/5RmfDT/uM/8Ap1vK8Gv/ABJepD3P1MooorEQUUUUAFFFFABRRRQAUUUUAFfx1f8ABxv/AMnR+Bv+xVH/AKV3Ff2K1/HV/wAHG/8AydH4G/7FUf8ApXcUDPZf+CKX/JrGv/8AY13X/pHZ1+wFfj//AMEUv+TWNf8A+xruv/SOzr9gK0R7uG/hRCiiig2CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACv5P/APgr1/yeVe/9gqw/9BNf1gV/J/8A8Fev+Tyr3/sFWH/oJpPY48d/D+Z/T3/wQ1/5Rx+Ef+v7Vv8A0slr9da/Ir/ghr/yjj8I/wDX9q3/AKWS1+utQeOFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/9b+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAUUUUAFFFfhh+wb+xEv7cfw+8WfGH4kfEfxZpmo23iq/03y9PvQInRI4J95Dq53FpmBwQMAcVtSpc99Tgx2PWGUbxvc9//AOCpH/IF+FH/AGPFh/6C9f0EV+Iuqf8ABDz4R64sS638TPGd4LdxLEJ7qGTY46Mu6I4I9RzXQf8ADmjwb/0V7x9/4ME/+N13U4ckbHyuNxKr1XUSsfs1RX4y/wDDmjwb/wBFe8ff+DBP/jdH/Dmjwb/0V7x9/wCDBP8A43WhyH7NUV+Mv/Dmjwb/ANFe8ff+DBP/AI3R/wAOaPBv/RXvH3/gwT/43QB+zVFfjL/w5o8G/wDRXvH3/gwT/wCN0f8ADmjwb/0V7x9/4ME/+N0Afs1RX4y/8OaPBv8A0V7x9/4ME/8AjdH/AA5o8G/9Fe8ff+DBP/jdAH7NUV+Mv/Dmjwb/ANFe8ff+DBP/AI3XK+O/+CRPhPwl4I1nxXbfFrx5NJpljcXaxtqCBWaGNnAJEfQ4xQB+4lfiR/wVJ/5O1/Za/wCxg1L/ANG6dX0T/wAEiPFnifxl+wd4T1XxbqFxqd2lxqMInupGllMaXcu1S7EsQo4XJOAABwAK+dv+CpP/ACdr+y1/2MGpf+jdOpS2Zth/4sPVfmff9FFFeQffBRRRQAUUUUAFfmJ8C/8AlJ38cP8AsFaJ/wCkttX6d1+YnwL/AOUnfxw/7BWif+kttWlPaXocuJ+Kl/i/9tkfp3RRRWZ1BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/OR/wW3/5Kl4I/7BVx/wCjhX6t/wDBuP8A8mu+Of8AsaT/AOklvX5Sf8Ft/wDkqXgj/sFXH/o4V+rf/BuP/wAmu+Of+xpP/pJb16dD4EfFZn/vU/66H9DlFFFanAFFFFABRRRQAUUUUAFfhv8A8HBf/Jh9p/2NOn/+ibmv3Ir8N/8Ag4L/AOTD7T/sadP/APRNzQB+L/8AwQC/5PH8S/8AYmXn/pdY1/XxX8g//BAL/k8fxL/2Jl5/6XWNf18V8Xnn+9P0R62D/hhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/wAF3/8Ak9u0/wCxZsP/AEbcV+4v/Bvn/wAmIXn/AGNWof8Aom2r8Ov+C7//ACe3af8AYs2H/o24r9xf+DfP/kxC8/7GrUP/AETbV9/l3+60/Q8Wv/EkfuTRRRXaYhRRRQAUUUUAFFFFABRRRQB+RP8AwXL/AOUcfi7/AK/tJ/8ASyKv5jP+CPn/ACefY/8AYJv/AP0AV/Tn/wAFy/8AlHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/wD0AVcPiRFX4Gf1o0UUV2nlBRRRQAUUUUAFFFFABRRRQAUUVn3+r6VpWz+07qK28zO3zXVN2OuMkZxmgDQorx3Vf2iP2f8AQvM/tvx14es/Kxv8/U7aPbuxjO6QYzkYz615rqn7c37H2kZ+1fEfQX2vsPkXaT8jP/PMtkcdenvyKV0VyvsfVlFfGV1/wUN/Yss4GuJviHphVcZCeZI3PHCqhJ/AVj/8PKP2H/8AooFp/wCA91/8Zo5l3H7OXZn3LRXwV/w88/YW+3/2b/wnsXmf3vsN75fTP+s+z7P168da0P8Ah5R+w/8A9FAtP/Ae6/8AjNLmXcPZz7M+5aK+Ov8Ah4J+xh/0UTSf++2/+Jrd0f8Abh/ZA11gtl8SNAQklf8ASL2O3GQM9ZSnHv0J460+Zdxckux9UUV5Tpfx3+B2uRfaNF8Z6FeR4Vt0Go28gw3IOVc8Ht616VY6jp+pxGfTZ47iMHaWiYOAfTIJ55piaa3LlFFFAgooooAKKKKACiiigAooooAK+Ov+Cgf/ACZh8RP+wS//AKGtfYtfHX/BQP8A5Mw+In/YJf8A9DWlLZlw+JH853/BIf8A5SOfC7/r+uv/AEjnr/QOr/Px/wCCQ/8Aykc+F3/X9df+kc9f6B1cB6oUUUUAFFFFABRRRQAUUUUAfkV/wXK/5Rx+Lv8Ar+0n/wBLIq/ld/4JTf8AJ63hz/r11H/0mkr+qL/guV/yjj8Xf9f2k/8ApZFX8rv/AASm/wCT1vDn/XrqP/pNJWtD+JH1Q1uf1n0UUV75YUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfyYf8ABVn/AJPW8R/9eunf+k0df1l/8EVf+UZnw0/7jP8A6dbyv5NP+CrP/J63iP8A69dO/wDSaOv6y/8Agir/AMozPhp/3Gf/AE63leDX/iS9SHufqZRRRWIgooooAKKKKACiiigAooooAK/jq/4ON/8Ak6PwN/2Ko/8ASu4r+xWv46v+Djf/AJOj8Df9iqP/AEruKBnsv/BFL/k1jX/+xruv/SOzr9gK/H//AIIpf8msa/8A9jXdf+kdnX7AVoj3cN/CiFFFFBsFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfyf/APBXr/k8q9/7BVh/6Ca/rAr+T/8A4K9f8nlXv/YKsP8A0E0nsceO/h/M/p7/AOCGv/KOPwj/ANf2rf8ApZLX661+RX/BDX/lHH4R/wCv7Vv/AEslr9dag8cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9f+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAV8UfHb9vX4J/s+fEL/hWHi+11e/1cWyXbx6Zai5CRScKWO9cZ9MfzGftevgn4Af8AKYnxj/2Thf8A0rsq2owUpWZ5+ZYmdClzw3uef/8AD1r9nr/oAeLP/BWP/jtfM/8AwTU/b/8AhJ+yX8GvEngL4paF4lkvtV8T3msQGx07zo/s88FtGoYtIhDbomyMEYxzX9Q1Fd0KUYbHy+KxtTEW9pbQ/Ir/AIfR/ss/9C94y/8ABSv/AMfo/wCH0f7LP/QveMv/AAUr/wDH6/XWitDjPyK/4fR/ss/9C94y/wDBSv8A8fo/4fR/ss/9C94y/wDBSv8A8fr9daKAPyK/4fR/ss/9C94y/wDBSv8A8fo/4fR/ss/9C94y/wDBSv8A8fr9daKAPyK/4fR/ss/9C94y/wDBSv8A8fo/4fR/ss/9C94y/wDBSv8A8fr9daKAPyK/4fR/ss/9C94y/wDBSv8A8fo/4fR/ss/9C94y/wDBSv8A8fr9daKAPjL9lT9ur4L/ALYOq6/onwwttWsrvw2ltJdxarai2bbdb9hUK75xsOc46jGecfQXxo/5I74s/wCwNf8A/oh6/Nb9j/8A5SYftMf9wH/0nNfpT8aP+SO+LP8AsDX/AP6IegD8+/8AgjJ/yYB4W/6/NU/9K5a8X/4Kk/8AJ2v7LX/Ywal/6N06vaP+CMn/ACYB4W/6/NU/9K5a8X/4Kk/8na/stf8AYwal/wCjdOpS2Zth/wCLD1X5n3/RRRXkH3wUUUUAFFFFABX5ifAv/lJ38cP+wVon/pLbV+ndfmJ8C/8AlJ38cP8AsFaJ/wCkttWlPaXocuJ+Kl/i/wDbZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzkf8Ft/+SpeCP8AsFXH/o4V+rf/AAbj/wDJrvjn/saT/wCklvX5Sf8ABbf/AJKl4I/7BVx/6OFfq3/wbj/8mu+Of+xpP/pJb16dD4EfFZn/AL1P+uh/Q5RRRWpwBRRRQAUUUUAFFFFABX4b/wDBwX/yYfaf9jTp/wD6Jua/civw3/4OC/8Akw+0/wCxp0//ANE3NAH4v/8ABAL/AJPH8S/9iZef+l1jX9fFfyD/APBAL/k8fxL/ANiZef8ApdY1/XxXxeef70/RHrYP+GFFFFeOdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8cP/Bd//k9u0/7Fmw/9G3FfuL/wb5/8mIXn/Y1ah/6Jtq/Dr/gu/wD8nt2n/Ys2H/o24r9xf+DfP/kxC8/7GrUP/RNtX3+Xf7rT9Dxa/wDEkfuTRRRXaYhRRRQAUUUUAFFFFABRRRQB+RP/AAXL/wCUcfi7/r+0n/0sir+Yz/gj5/yefY/9gm//APQBX9Of/Bcv/lHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/8A0AVcPiRFX4Gf1o0UUV2nlBRRXjPxn/aE+DX7Pmgf8JH8XdftdHhYExRSNuuJyO0UK5kc/wC6pA74oGlfRHs1RzTRW8TTzsEjQFmZjgADqST0Ar8vtB/aF/bs/a8vRB+xp8PI/DPhW5iJi8WeMUeCGVGyFlt413BhkcbFuR/eC169on/BIzxN8WbiLXP25Pi3rvjx98U7aNpjDTdJSVfvLsGdynpvijt2rGVZLY6I4aT30On+If7fX7H3wwZ4fE3jzTZZkBPk2DNfvnCkDFssmCdwxkgdfQ4+brb/AIKef8LHlNt+zL8JfGHj9g7Is0Vqbe1cqrMcSILgj7vRkU9eOAD+rfwh/YF/Y5+BsMQ+Hvw80eK5iaN1vLu3F7dh49uGE9x5kinKhsKwG7nGea+uYIIbaFLa2RY441CoqjCqo4AAHQAVm60uhusNBbn4Q6XN/wAFgvi4yyeGfh94V+HVjOu5JtevDczqMKvKwO7Kclmw1uDhcHtv24f2Ev8Agp946s2t/iT+0BpugiTapj0HSlk2qQN5WXZaSZBHHPPqucV+5FFQ5yfU0VKC2R+K0P8AwR1vPFTz/wDC6fjx498RRTgI0dtdCzQxgfdKym5U/Nz0A68ZOa6fRP8Aghv+wdp0ss+s2Ot608pZi17qbg5bHOYBFk8Hrnqc9sfsFRUtlpW2PzW0f/gkF/wTs0WHyofh1FOxVQz3GoX8zMV7/NckAnvtAB9Oler6f/wTn/YW0yEwW3wr8OspbdmWzWZs/V9xxx0zivtKikM+Y/8Ahif9jP8A6JH4L/8ABBY//Ga2NP8A2SP2U9IhNtpXwx8J2sbNuKxaLZopY8ZwsQGeBX0JRQB4V/wy7+zN/wBE68Mf+Ci1/wDjVZmpfshfsm6zs/tf4X+Erry87PO0SzfbnGcbojjOBmvoiigD5en/AGIf2MbiF7eT4SeDQrqVJXQrJWweOCIQQfcHIritS/4JxfsKars+0/Cvw+vl5x5NqIeuOvl7c9OM5xX2tRQB+Zmu/wDBHj/gnZrqHd8PltJNoUSWupX8RABz90XGwk9CSpOPwryLWP8AghZ+wtqAZtHj8QaPLvLxy2epZeI842+dHKPlOCCQTkDJPOf2QooA/FSX/gkB4s8Ky+Z8Gf2gvHOgBCWjjvJvt0WfmI3xo9ujgFhwRg8+vGJJ+xN/wVR8DLJB8PfjnofiSGOXMUev6YIC6EgkvIkNzIp4wFDsMHqK/caiqUn0ZLhF7o/BO58U/wDBXD4SW8X/AAnvwm0Px7bRvte48PX4gmZckco7u2W67lg2gdQDXLv/AMFSvCfgaUWn7RXw18ZfD2VtoVtR05vKLMpYLl/KfJwduIzkAniv6FKq31jZanZTabqUKXFvcI0UsUqh0dHGGVlOQQQcEHgiqVWSM3h4Pofkz8Of23v2TPivLHbeCfHmlyzyhmSC6kNlMwXOcR3IickBScYzt+bpzX1RWZ8YP+Ccf7E/xvhnPjT4eaVBd3Ctm90yL+zrneejl7Yxl2B5HmbgcYII4r4g1X/glP8AGX4KM2pfsOfGXVfD0MZkkj0DxGBqGmFmGAoYKRGoHy7jbyvjB3ZXJ0VfujGWF/lZ95UV+V2u/tg/tY/sl3dnYft4fDKSHQpUjjPirw032qyErHA81NzKjMSAVMkbZVjHGykAff8A8Jfjb8J/jr4bHi34R69aa7Y8B2t3/eRM3IWWJsSRMRztkVWxzitozT2OedOUd0epUUUVRmFfHX/BQP8A5Mw+In/YJf8A9DWvsWvjr/goH/yZh8RP+wS//oa0pbMuHxI/nO/4JD/8pHPhd/1/XX/pHPX+gdX+fj/wSH/5SOfC7/r+uv8A0jnr/QOrgPVCiiigAooooAKKKKACiiigD8iv+C5X/KOPxd/1/aT/AOlkVfyu/wDBKb/k9bw5/wBeuo/+k0lf1Rf8Fyv+Ucfi7/r+0n/0sir+V3/glN/yet4c/wCvXUf/AEmkrWh/Ej6oa3P6z6KKK98sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5MP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV/Jp/wAFWf8Ak9bxH/166d/6TR1/WX/wRV/5RmfDT/uM/wDp1vK8Gv8AxJepD3P1MooorEQUUUUAFFFFABRRRQAUUUUAFfx1f8HG/wDydH4G/wCxVH/pXcV/YrX8dX/Bxv8A8nR+Bv8AsVR/6V3FAz2X/gil/wAmsa//ANjXdf8ApHZ1+wFfj/8A8EUv+TWNf/7Gu6/9I7Ov2ArRHu4b+FEKKKKDYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/k/wD+CvX/ACeVe/8AYKsP/QTX9YFfyf8A/BXr/k8q9/7BVh/6CaT2OPHfw/mf09/8ENf+UcfhH/r+1b/0slr9da/In/ghp/yjj8I/9f2rf+lktfrtUHjhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/9D+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAV8E/AD/lMT4x/7Jwv/pXZV97V8E/AD/lMT4x/7Jwv/pXZV04X4zyM7/3deq/U/a6iiiu8+SPwc/4Kcf8ABeb4Rf8ABMr9pbw/+y94v+HPiXxvrviPQLfXrVtCMLApc3NzbLEI3YO0ga1ZvlBGGHvXzN8Ef+Dqb9inx78atG+CXxx8C+M/hPda9NFb2+oeIbWFbKJ522RmcrL5scbN8vmeUyL1YqoJH5bf8F+/jvJ+zF/wcOfs6/H6Hw7f+LW8K+DNIvho+lruvLzZqesDy4hhssc8cHpXjn/BST4w/ti/8HE3j/4Wfs7/AAI/Zm8TfD+x8PanNcXfijxLbSpHbRXgSOQyzmCOKGCNV8xkDvJKwUIu5QGAP6RP+CnH/Bef4Rf8Eyv2mPD/AOy74u+HPiXxvrviPQLfX7VtCMLAx3NzdWyxCN2DtIGtWY7QRhh7186/Af8A4Onf2HviH8X9N+Dfx88IeL/g5dauypbah4mtIxYB3bagmeNzLErNwJDEY15LsoGa+Ff+CmOlRaF/wdI/se6JBI8qWfhPQYFeQ7nYR6hrKgse5OOT61+i3/B1R8JPhz45/wCCRviv4i+KbCCbXPBOq6Ne6Ldso86GW7vobOZUbrteCd9y52kqpIyoIAPv7/gqt/wVL+GP/BKP4K+HvjZ8T/DWp+KbLxFrS6JDb6U8SSJI0Es4djMyqV2wkcHOSK/IOH/g6p8DXESzwfsyfFN0cBlZbOMgg9CDnkGvyj/4LUeOvFXxI/4Nwv2OPGHjV5pdTuLvRYppbhi8swt9IvIUldiSWMiIHLE5O7J5r9WfgV/wVu/4LR3Vt4N8HXf7D2qQ6HIunWT6obu42paEIhuMeRjAT58ZxQB/UL8KfHkXxT+F3hv4nQ2M+mJ4j0qz1RbO6G2e3F5CsoikHZ03bWHqDXfV/HR/wcR/t/8A7T37PP7a/wAJv2c5fiN4l+B/wN8R6K+o6v4w8Kaf9r1Ke/EtxG8SPvicrbhLffHFKrKs5kZZMRpX0j/wQ0+LHxc8b/HXxbpvhL9sXRv2lvhI2nLPYabrYurfxrYT/u/381vdxLMkKsXibMskb5Rx5bEqQD+oaiiigD8i/wBj/wD5SYftMf8AcB/9JzX6U/Gj/kjviz/sDX//AKIevzW/Y/8A+UmH7TH/AHAf/Sc1+lPxo/5I74s/7A1//wCiHoA/Pv8A4Iyf8mAeFv8Ar81T/wBK5a8X/wCCpP8Aydr+y1/2MGpf+jdOr2j/AIIyf8mAeFv+vzVP/SuWvF/+CpP/ACdr+y1/2MGpf+jdOpS2Zth/4sPVfmff9FFFeQffBRRRQAUUUUAFfmJ8C/8AlJ38cP8AsFaJ/wCkttX6d1+YnwL/AOUnfxw/7BWif+kttWlPaXocuJ+Kl/i/9tkfp3RRRWZ1BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/OR/wW3/5Kl4I/7BVx/wCjhX6t/wDBuP8A8mu+Of8AsaT/AOklvX5Sf8Ft/wDkqXgj/sFXH/o4V+rf/BuP/wAmu+Of+xpP/pJb16dD4EfFZn/vU/66H9DlFFFanAFFFFABRRRQAUUUUAFfhv8A8HBf/Jh9p/2NOn/+ibmv3Ir8N/8Ag4L/AOTD7T/sadP/APRNzQB+L/8AwQC/5PH8S/8AYmXn/pdY1/XxX8g//BAL/k8fxL/2Jl5/6XWNf18V8Xnn+9P0R62D/hhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/wAF3/8Ak9u0/wCxZsP/AEbcV+4v/Bvn/wAmIXn/AGNWof8Aom2r8Ov+C7//ACe3af8AYs2H/o24r9xf+DfP/kxC8/7GrUP/AETbV9/l3+60/Q8Wv/EkfuTRRRXaYhRRRQAUUUUAFFFFABRRRQB+RP8AwXL/AOUcfi7/AK/tJ/8ASyKv5jP+CPn/ACefY/8AYJv/AP0AV/Tn/wAFy/8AlHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/wD0AVcPiRFX4Gf1o0UUV2nlHyv+1t+0nH+zd8PrXUNF0/8AtrxR4ivI9J8P6ZnatzfznCb24wi5y3IzwoILZF79lj/gmf4a0HWI/wBoT9sRo/iF8UtS/f3DX4W407TWJ3JDbQMPLzD0VyMKf9WFHJ+JP2vviX4Y+HP/AAUd/Z6174jXRg0DTpbl2YnCQS3bCFZWORhQ4iLnOAq5weh/o9rkrSblY9DDwSjzdWFFFFZHQFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBVvrGy1Oym03UoUuLe4RopYpVDo6OMMrKcggg4IPBFfjD+1V/wTp1j4VXM37Sn/BOaBfCfjCxPn6l4dtCV0zWrdCGMS2+7y43GPljjCI2Tt2vhq/aiqt9fWWmWU2palMlvb26NLLLKwRERBlmZjgAADJJ4AoTsJq+jPy7/Zb/AGhNB/ab+DenfFHR4hZ3MjPa6jY7972V7DgSwvwDkZDLkAlGU4Ga+hq/If8A4Jf+N9H8d/Ev4/a94PldvD2o+MZtS01H7Q3ktyyt1PLRrHnk9OtfrxXdB3imeZVjyyaQV8df8FA/+TMPiJ/2CX/9DWvsWvjr/goH/wAmYfET/sEv/wChrTlsxQ+JH853/BIf/lI58Lv+v66/9I56/wBA6v8APx/4JD/8pHPhd/1/XX/pHPX+gdXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8Fyv+Ucfi7/r+0n/0sir+V3/glN/yet4c/wCvXUf/AEmkr+qL/guV/wAo4/F3/X9pP/pZFX8rv/BKb/k9bw5/166j/wCk0la0P4kfVDW5/WfRRRXvlhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/Jh/wVZ/5PW8R/wDXrp3/AKTR1/WX/wAEVf8AlGZ8NP8AuM/+nW8r+TT/AIKs/wDJ63iP/r107/0mjr+sv/gir/yjM+Gn/cZ/9Ot5Xg1/4kvUh7n6mUUUViIKKKKACiiigAooooAKKKKACv46v+Djf/k6PwN/2Ko/9K7iv7Fa/jq/4ON/+To/A3/Yqj/0ruKBnsv/AARS/wCTWNf/AOxruv8A0js6/YCvx/8A+CKX/JrGv/8AY13X/pHZ1+wFaI93DfwohRRRQbBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX8n//AAV6/wCTyr3/ALBVh/6Ca/rAr+T/AP4K9f8AJ5V7/wBgqw/9BNJ7HHjv4fzP6ev+CGn/ACjj8I/9f2rf+lktfrtX5E/8ENP+UcfhH/r+1b/0slr9dqg8cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//R/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABRRRQAUUUUAFfBPwA/5TE+Mf+ycL/6V2Vfe1fBPwA/5TE+Mf+ycL/6V2VdOF+M8jO/93Xqv1P2uooorvPkj+Yz9vz/gnn+2D8bP+C/n7Ov7bPwx8If2n8MfAmiaXZ65rP8AaFlD9lmt77U5pF+zy3CXMm2O4ibMcTg7sAkhgP6c6KKAP5C/+C0n7C//AAVJ8ef8Fd/hJ/wUA/YA+GFj48g+HHhTTreN9S1SwtLQ6lbX+pStDLDcX1ncMoiuY23IQp3YDZBA8v8A2hv2OP8Ag4i/4LJWvh79nn9vHw/4M+BfwqtNTh1LV/7Duo7m4u/IyF+SG+1FpXUOxijaSGHdhnyyrX9olFAH8wH/AAcC/wDBLj49ftJf8E8vhD+yT/wT68EjXovh1rlikGm/2haWX2bSrHTri0jJlvp4FcgtGpwxck5I6mv6SfhppGo+H/hz4f0HV4/Ju7HTbS3njyG2yRRKrDKkg4IIyCR6V21FAH8/3/BWr4a/8FZr74veGfHP7J3hnwr8dPgwLcJ4l+FfiSz0sfarhRInmi4vowzRlXV1CTB0kTlJEYqPzc/4JY/8Ek/2q7L/AIKtW/8AwUh+Jfwa0P8AZg8FaBp15BZeCtG1OPUGv7m8tZLUsywSPHFGBMZHBEI3xoEh5Zx/ZJRQAUUUUAfkX+x//wApMP2mP+4D/wCk5r9KfjR/yR3xZ/2Br/8A9EPX5rfsf/8AKTD9pj/uA/8ApOa/Sn40f8kd8Wf9ga//APRD0Afn3/wRk/5MA8Lf9fmqf+lcteL/APBUn/k7X9lr/sYNS/8ARunV7R/wRk/5MA8Lf9fmqf8ApXLXi/8AwVJ/5O1/Za/7GDUv/RunUpbM2w/8WHqvzPv+iiivIPvgooooAKKKKACvzE+Bf/KTv44f9grRP/SW2r9O6/MT4F/8pO/jh/2CtE/9JbatKe0vQ5cT8VL/ABf+2yP07ooorM6gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/nI/wCC2/8AyVLwR/2Crj/0cK/Vv/g3H/5Nd8c/9jSf/SS3r8pP+C2//JUvBH/YKuP/AEcK/Vv/AINx/wDk13xz/wBjSf8A0kt69Oh8CPisz/3qf9dD+hyiiitTgCiiigAooooAKKKKACvw3/4OC/8Akw+0/wCxp0//ANE3NfuRX4b/APBwX/yYfaf9jTp//om5oA/F/wD4IBf8nj+Jf+xMvP8A0usa/r4r+Qf/AIIBf8nj+Jf+xMvP/S6xr+vivi88/wB6foj1sH/DCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/gu/8A8nt2n/Ys2H/o24r9xf8Ag3z/AOTELz/satQ/9E21fh1/wXf/AOT27T/sWbD/ANG3FfuL/wAG+f8AyYhef9jVqH/om2r7/Lv91p+h4tf+JI/cmiiiu0xCiiigAooooAKKKKACiiigD8if+C5f/KOPxd/1/aT/AOlkVfzGf8EfP+Tz7H/sE3//AKAK/pz/AOC5f/KOPxd/1/aT/wClkVfzGf8ABHz/AJPPsf8AsE3/AP6AKuHxIir8DP60aKKK7Tyj8df20PgZ4N/aV/4KCfCD4IePzMmla9oeuRySW77JY3itriWKRDyMpKiOAQVbGGBBIr2nwd+1n+0V/wAEzrWx+DH7aOi6h458BWmyHS/HukI0pggY7I4LuOQAb1P96USBRhRNwaZ8S/8AlLT8Av8AsE6//wCkV1X7V3tlZ6lZzadqMKXFvcI0csUih0dHGGVlOQQQcEHgiuOr8TPTofAjN+E3xv8AhF8dvDx8VfB7xHYeIrBW2vJZTCQxtllw6/eQkqcbgMgZGRzXqdfkH8Tf+CUXwE1bxHc/En9nrUdT+Efi98NBf+G5mitkcHJ3WoZV8s/LmOJ4VJUdPm3cCvif/gsR+zIz2t3Z6D8dvD1usYSdCunasI1BByAYgW4Ab5bhmyp3Z34zNT9uqK/GzT/+Cznwo8G6i3hn9qL4f+Lfhlq0T+XKLyz+1WgcBCVSVdkj/eLKRBtaMBgfmC19ofDX/goH+xT8W/LTwR8TNCkmm2eXb3lyLC4cvnAWG6EMjH5TkBcjjOMjIB9h0VVsb6y1Oyh1LTZkuLe4RZYpYmDo6OMqysMggg5BHBFWqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoqhqeqaZolhLqus3MVpawLukmmcRxovqzMQAPqa+M/il/wAFH/2Hvg9Cz+L/AIk6PNKFz5GmSnU5snoCloJipPbdgYOScc0AfbdFfjNff8Fh9B+Is0ujfsg/Crxd8Sr5GdTcJaG0sEX51SRpR5rqrMv/AC0jj47hgVrGuNO/4LAftPu0fiDV9B+A3hydpI2h09RqesmFxlSXDOgYdN0c1s4P8NAH6cfHv9p74D/sx+Gv+Ep+N/iW00KBlJhhkbfc3BHaGBA0sh9dqkDvgV+Rvjf4j/tOf8FW7X/hXfwf0zUPhd8ErrB1TxDqcZj1HXLck/ubSMHaYX/iwxQgHe/WF/of4M/8Eq/2Y/h3qFt4z+J0N38S/FsTCSTV/Es73W5/a3ZjDtB5USCRgf4q/SiGGG2hS3t0WOONQqqowqqOAAB0AoA/Av8A4JufDzwz8JfjV8f/AIY+DI3i0rQPElvY2iyOZHEUH2hV3MeScDk+tfrTX5nfsT/8nV/tM/8AY4L/AOhXNfpjXbS+FHm4j+Iwr46/4KB/8mYfET/sEv8A+hrX2LXx1/wUD/5Mw+In/YJf/wBDWqlsyIfEj+c7/gkP/wApHPhd/wBf11/6Rz1/oHV/n4/8Eh/+Ujnwu/6/rr/0jnr/AEDq4D1QooooAKKKKACiiigAooooA/Ir/guV/wAo4/F3/X9pP/pZFX8rv/BKb/k9bw5/166j/wCk0lf1Rf8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK1ofxI+qGtz+s+iiivfLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+TD/gqz/yet4j/AOvXTv8A0mjr+sv/AIIq/wDKMz4af9xn/wBOt5X8mn/BVn/k9bxH/wBeunf+k0df1l/8EVf+UZnw0/7jP/p1vK8Gv/El6kPc/UyiiisRBRRRQAUUUUAFFFFABRRRQAV/HV/wcb/8nR+Bv+xVH/pXcV/YrX8dX/Bxv/ydH4G/7FUf+ldxQM9l/wCCKX/JrGv/APY13X/pHZ1+wFfj/wD8EUv+TWNf/wCxruv/AEjs6/YCtEe7hv4UQooooNgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+T//AIK9f8nlXv8A2CrD/wBBNf1gV/J//wAFev8Ak8q9/wCwVYf+gmk9jjx38P5n9PX/AAQ0/wCUcfhH/r+1b/0slr9dq/In/ghp/wAo4/CP/X9q3/pZLX67VB44UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9L+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAV8E/AD/lMT4x/7Jwv/pXZV97V8E/AD/lMT4x/7Jwv/pXZV04X4zyM7/3deq/U/a6vDf2ifjLffAT4XXXxI07w1qXi6W2mhiGmaRGZbyXzXCkxoAxbZnc3ooJ7V7lRXefJH49/8PW/GX/RvPxF/wDBc/8A8bo/4et+Mv8Ao3n4i/8Aguf/AON1+wlFAH49/wDD1vxl/wBG8/EX/wAFz/8Axuj/AIet+Mv+jefiL/4Ln/8AjdfsJRQB+Pf/AA9b8Zf9G8/EX/wXP/8AG6P+HrfjL/o3n4i/+C5//jdfsJRQB+Pf/D1vxl/0bz8Rf/Bc/wD8bo/4et+Mv+jefiL/AOC5/wD43X7CUUAc34M8QTeLPB+leKbmzl0+TU7OC7a1mGJYGmQOY3yB8yZ2ngciukoooA/Iv9j/AP5SYftMf9wH/wBJzX6U/Gj/AJI74s/7A1//AOiHr81v2P8A/lJh+0x/3Af/AEnNfpT8aP8Akjviz/sDX/8A6IegD8+/+CMn/JgHhb/r81T/ANK5a8X/AOCpP/J2v7LX/Ywal/6N06vaP+CMn/JgHhb/AK/NU/8ASuWvF/8AgqT/AMna/stf9jBqX/o3TqUtmbYf+LD1X5n3/RRRXkH3wUUUUAFFFFABX5ifAv8A5Sd/HD/sFaJ/6S21fp3X5ifAv/lJ38cP+wVon/pLbVpT2l6HLifipf4v/bZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzkf8ABbf/AJKl4I/7BVx/6OFfq3/wbj/8mu+Of+xpP/pJb1+Un/Bbf/kqXgj/ALBVx/6OFfq3/wAG4/8Aya745/7Gk/8ApJb16dD4EfFZn/vU/wCuh/Q5RRRWpwBRRRQAUUUUAFFFFABX4b/8HBf/ACYfaf8AY06f/wCibmv3Ir8N/wDg4L/5MPtP+xp0/wD9E3NAH4v/APBAL/k8fxL/ANiZef8ApdY1/XxX8g//AAQC/wCTx/Ev/YmXn/pdY1/XxXxeef70/RHrYP8AhhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/AMF3/wDk9u0/7Fmw/wDRtxX7i/8ABvn/AMmIXn/Y1ah/6Jtq/Dr/AILv/wDJ7dp/2LNh/wCjbiv3F/4N8/8AkxC8/wCxq1D/ANE21ff5d/utP0PFr/xJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkT/wXL/5Rx+Lv+v7Sf8A0sir+Yz/AII+f8nn2P8A2Cb/AP8AQBX9Of8AwXL/AOUcfi7/AK/tJ/8ASyKv5jP+CPn/ACefY/8AYJv/AP0AVcPiRFX4Gf1o0UUV2nlH5t/Ev/lLT8Av+wTr/wD6RXVftpX4l/Ev/lLT8Av+wTr/AP6RXVftpXHV+Jnp0PgQUUUVmalHUtM03WrCXS9Yt4ru1nXbJDMgkjdfRlYEEfUV8d/Ej/gnX+xH8V7qS+8Y/DbSPPmO6SWwR9NkdtxYszWbQlmYsSzEkt3JwK+0qKAPx7l/4I8+APBUpvP2bfid42+HMzbiyadqLGEsyhS2E8mTJwN2ZTkADitJf2S/+CnXgG88/wCGP7Sh1eEpjytf0iOT7h+VCX+1E5HDSLtY+lfrlRQB+QX/AAlP/BcP4dbkl034f+PlhRWJjZ7d5emVQs9kofg8soXJPXgC+/7bX/BUPwxckeL/ANmiO9jDoMadrMTHBGT80ZuByP4sYU9cniv1uooA/Jo/8FRv2kNDQt47/Zb8b2YRZC7WHmX8amM93W1jG3HO48emRzRD/wAFpPh1pkcq+OPhD8RtKmgRXkRdKikCcbm3GSeEgAYIJHI54r9ZaKAPyc03/guR+yzfb/tXhHx1Z7cY87SoTuznp5d0/TvnHWlH/Bdf9iWDUv7M1a28T6e4++bjTUGzjIyFmZueMfL39Oa/WKigD8sf+H5v7BP/AEEda/8ABa//AMVWNp//AAXZ/Yw1WY2+l6Z4suZFXcVi02N2CjjOBcHjmv1nooA/JzUv+C5H7LNjs+y+EfHV5uznydKhG3GOvmXSde2M9Knm/wCCyXhPUvN/4Qr4L/EnU/KTJ3aSiYc5wG8uaXAOOvXrxxX6uUUAfk1P/wAFPf2pdScDwb+yr40uFaVYwdRkk088gZJDWb4AJxnO3HORjFZs37aH/BVjxLbRL4L/AGbrWwml3YbUtXi2/Ke6tJbFeAcZbnIx6H9d6KAPyPXUv+C3HxGSRi/w++H8ckuQCJbqeONSBgcXkbFhzzjOP4eBUB/Y1/4KR+PWt7j4q/tN3lgVBeSLQNMjtR5mNoAeFrYFcc5Kdf4cnNfrvRQB+RNj/wAEdPgn4lvIda/aE8beMfiRqCKPMbV9TbyWba2SAAZlG92cDzjgnGT82763+G/7AX7GHwnaObwV8N9FSaFt0c95B9vnRsAZWW6Mrg4UdG9T1Jz9f0UAVrOys9Ptls9PiSCFM7UjUKoycnAGB1Oas0UUAFFFFAH4ffsT/wDJ1f7TP/Y4L/6Fc1+mNfmd+xP/AMnV/tM/9jgv/oVzX6Y120vhR5uI/iMK+Ov+Cgf/ACZh8RP+wS//AKGtfYtfHX/BQP8A5Mw+In/YJf8A9DWqlsyIfEj+c7/gkP8A8pHPhd/1/XX/AKRz1/oHV/n4/wDBIf8A5SOfC7/r+uv/AEjnr/QOrgPVCiiigAooooAKKKKACiiigD8iv+C5X/KOPxd/1/aT/wClkVfyu/8ABKb/AJPW8Of9euo/+k0lf1Rf8Fyv+Ucfi7/r+0n/ANLIq/ld/wCCU3/J63hz/r11H/0mkrWh/Ej6oa3P6z6KKK98sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5MP8Agqz/AMnreI/+vXTv/SaOv6y/+CKv/KMz4af9xn/063lfyaf8FWf+T1vEf/Xrp3/pNHX9Zf8AwRV/5RmfDT/uM/8Ap1vK8Gv/ABJepD3P1MooorEQUUUUAFFFFABRRRQAUUUUAFfx1f8ABxv/AMnR+Bv+xVH/AKV3Ff2K1/HV/wAHG/8AydH4G/7FUf8ApXcUDPZf+CKX/JrGv/8AY13X/pHZ1+wFfj//AMEUv+TWNf8A+xruv/SOzr9gK0R7uG/hRCiiql9f2OmWkl/qU0dvBENzySsERR6knAA+tDdtWbpNuy3LdFeVf8L2+CH/AEOWh/8Agxt//jlH/C9vgh/0OWh/+DG3/wDjlYfWqH/Pxfejv/snHf8APif/AIDL/I9Voryr/he3wQ/6HLQ//Bjb/wDxyj/he3wQ/wChy0P/AMGNv/8AHKPrVD/n4vvQf2Tjv+fE/wDwGX+R6rRXlX/C9vgh/wBDlof/AIMbf/45R/wvb4If9Dlof/gxt/8A45R9aof8/F96D+ycd/z4n/4DL/I9Voryr/he3wQ/6HLQ/wDwY2//AMco/wCF7fBD/octD/8ABjb/APxyj61Q/wCfi+9B/ZOO/wCfE/8AwGX+R6rRXlX/AAvb4If9Dlof/gxt/wD45R/wvb4If9Dlof8A4Mbf/wCOUfWqH/Pxfeg/snHf8+J/+Ay/yPVaK8q/4Xt8EP8AoctD/wDBjb//AByj/he3wQ/6HLQ//Bjb/wDxyj61Q/5+L70H9k47/nxP/wABl/keq0V5dF8cfgrPKsMPjDRHdyFVV1CAkk9ABvr1GrhVhP4JJ+hz18JXoW9tTcb7XTX5hRRRWhzhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXP+K/FfhvwN4bvfF/i+9i07TNOiae5uZ22xxxr1JP8h1J4HNAHQUV+VHhf4s/tl/t/6hNbfsq2Q+Hnw5jnltn8X6inm3N15ZPzW0Lbe67GC7tpPLqQVHtVl/wRg+E/iuP+0v2ifiD4t8e6s0iSyTz3gghJVQpCxsJnUHBH+tOEwoxjJXMcNTHQi7RVz7tor4du/wDgi98CvDxk1D4HeN/GPgXUCrbJbDUQYwxAwWXYkjAMqsQJRnGMjgjwbVfif+2D/wAE99Vs9O/a+aPx78NrqZbO38W6dGTd2jsQE+1pwxG3JIYMzH7sjkbSuYKeOjJ2krH6h+IPEOgeE9GuPEfim+t9M060TzJ7q7lWGGJP7zu5CqPckV+dF/8A8FGx421658OfsqfDbxF8UntJGgkvLCJoLBZVfaQZ/LlCqVw4ZlAIZR344nwT4Zu/+Csfxk1q11S/vLL4E+BbuOFFst0DeINQUBiHkYZWNFIYgDcqOmNruHX94/BPgfwf8N/DFn4L8B6bb6TpVhEkNvbWyBI0RAFHA6nAGSck9zQ5GVfGu/LT+8/Fa4/aX/4KFaFp3/CR+If2bL+XT4lV5UstTSe72NgfJDHHJKzDOSoQn1xyR6V8Bv8AgoB8C/jl4sk+G0v23wn4rikMP9j67ELW4eQE5RPmKlwBkoSH54Bwa/Ymviz9tH9jb4P/ALVXw8upPGEdvo3iTSrdpdJ8TAeXcabJDl1ZpFZC0KkktG7bRksNrgMFzGMMbUT11NPxB4h0Dwno1x4j8U31vpmnWieZPdXcqwwxJ/ed3IVR7kivzd8S/wDBTHw74i8T3Xgv9lLwJr/xbv7FVNzJpMEqWke5wgJkEUsgX73zmIRkgYYgkjwf9jL4SftC/wDBTPw5pWv/ALVmrs/wo8Ky/ZktrQSWkviS8t/+WksgKuY0yFeRdmWG1AJPMdf6Ivh38M/h78I/CsHgj4YaLZ6BpNtzHa2MKwx7jgFiFA3O2Pmdssx5JJpuRrVxzelM/FaX9qj/AIKBaMtrqXiD9mrVJbO4cqVs77zpwB1JRInZfUb1Absec16L8If+CiXwG+IWuj4e/EBrn4e+MYn8m40XxFG1nJHMMfIJXCx5JICq+yRuyV+zlfOf7Sn7KnwU/av8CT+BPjBpKXIdCttfwqiX9k+QQ9vMVYocjkEFG6MrAkUuYyhjaieruYdFfml8FfHXxW/ZO+Ptp+wx+0jqn/CQW+p2xufBniLbtNxaR+YBbXJbpKojwBlmDELuYNGa/S2rPVpVVUjzRCiiig0CiiigAr+T/wD4K9f8nlXv/YKsP/QTX9YFfyf/APBXr/k8q9/7BVh/6CaT2OPHfw/mf09f8ENP+UcfhH/r+1b/ANLJa/XavyJ/4Iaf8o4/CP8A1/at/wClktfrtUHjhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//T/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABRRRQAUUUUAFfBPwA/5TE+Mf+ycL/6V2Vfe1fBPwA/5TE+Mf+ycL/6V2VdOF+M8jO/93Xqv1P2uoorxD9of4Z+P/i58LbzwR8MfGNz4D1m4lheHWbSEzyQrG4Z1EYkiyHUFT84xnPOK7z5I9vor8e/+HfH7cn/R12u/+Cg//J1H/Dvj9uT/AKOu13/wUH/5OoA/YSivx7/4d8ftyf8AR12u/wDgoP8A8nUf8O+P25P+jrtd/wDBQf8A5OoA/YSivx7/AOHfH7cn/R12u/8AgoP/AMnUf8O+P25P+jrtd/8ABQf/AJOoA/YSivx7/wCHfH7cn/R12u/+Cg//ACdR/wAO+P25P+jrtd/8FB/+TqAP2Eorm/Bmi6l4a8H6V4d1i/k1W70+zgtp72UESXMkSBWlYFmO5yCxyxOT1PWukoA/Iv8AY/8A+UmH7TH/AHAf/Sc1+lPxo/5I74s/7A1//wCiHr81v2P/APlJh+0x/wBwH/0nNfpT8aP+SO+LP+wNf/8Aoh6APz7/AOCMn/JgHhb/AK/NU/8ASuWvF/8AgqT/AMna/stf9jBqX/o3Tq9o/wCCMn/JgHhb/r81T/0rlrxf/gqT/wAna/stf9jBqX/o3TqUtmbYf+LD1X5n3/RRRXkH3wUUUUAFFFFABX5ifAv/AJSd/HD/ALBWif8ApLbV+ndfmJ8C/wDlJ38cP+wVon/pLbVpT2l6HLifipf4v/bZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzkf8Ft/+SpeCP+wVcf8Ao4V+rf8Awbj/APJrvjn/ALGk/wDpJb1+Un/Bbf8A5Kl4I/7BVx/6OFfq3/wbj/8AJrvjn/saT/6SW9enQ+BHxWZ/71P+uh/Q5RRRWpwBRRRQAUUUUAFFFFABX4b/APBwX/yYfaf9jTp//om5r9yK/Df/AIOC/wDkw+0/7GnT/wD0Tc0Afi//AMEAv+Tx/Ev/AGJl5/6XWNf18V/IP/wQC/5PH8S/9iZef+l1jX9fFfF55/vT9Eetg/4YUUUV451BRRRQAUUV4v8AHj9of4N/sy+CE+I3xy1tNB0eS5jsknaKWcvPKGZUWOFJJGJVGbhTgKSeBVRi5NRirsTaSuzofip8X/hh8D/CT+O/i3rlp4f0hJUg+03kgRTLIflRe7McE4UE4BPQEj5i/wCHlv7CH/RT9G/77f8A+Ir8ev8AgrR/wUA/ZH/aZ/Zbt/hz8EPFv9t6ymuWl41v9gvbbEEUcys2+4giTguvG7PPAr6S/wCGr/8AghT/ANAvwb/4Rk3/AMrq9/A5KqtPmrXi77bfmcVbF8srRs0fef8Aw8t/YQ/6Kfo3/fb/APxFH/Dy39hD/op+jf8Afb//ABFfBn/DV/8AwQp/6Bfg3/wjJv8A5XUf8NX/APBCn/oF+Df/AAjJv/ldXZ/q9R/nf4GX16fZH3n/AMPLf2EP+in6N/32/wD8RR/w8t/YQ/6Kfo3/AH2//wARXwZ/w1f/AMEKf+gX4N/8Iyb/AOV1H/DV/wDwQp/6Bfg3/wAIyb/5XUf6vUf53+AfXp9kfef/AA8t/YQ/6Kfo3/fb/wDxFH/Dy39hD/op+jf99v8A/EV8Gf8ADV//AAQp/wCgX4N/8Iyb/wCV1H/DV/8AwQp/6Bfg3/wjJv8A5XUf6vUf53+AfXp9kfef/Dy39hD/AKKfo3/fb/8AxFH/AA8t/YQ/6Kfo3/fb/wDxFfBn/DV//BCn/oF+Df8AwjJv/ldR/wANX/8ABCn/AKBfg3/wjJv/AJXUf6vUf53+AfXp9kfef/Dy39hD/op+jf8Afb//ABFH/Dy39hD/AKKfo3/fb/8AxFfBn/DV/wDwQp/6Bfg3/wAIyb/5XUf8NX/8EKf+gX4N/wDCMm/+V1H+r1H+d/gH16fZH3n/AMPLf2EP+in6N/32/wD8RR/w8t/YQ/6Kfo3/AH2//wARXwZ/w1f/AMEKf+gX4N/8Iyb/AOV1fa3wa+Dv/BOv9oPwJb/Ev4PfD7wVrWiXLvHHcp4etYvnjOGUpLbo6kHqGUGj/V6j/O/wD69Psj6i+D/x++DPx/0q51z4M+I7LxHa2TrHcSWb7xE7ZwrcAqSBnB5xz0Ir1+vxo/4Je+H9B8KftFftNeGvC1jb6bptj4tghtrS1iWGCGJDdBUSNAFVQOAAABX7L187jsOqFeVKLul/kd9GbnBSYUUUVyGh/HD/AMF3/wDk9u0/7Fmw/wDRtxX7i/8ABvn/AMmIXn/Y1ah/6Jtq/Dr/AILv/wDJ7dp/2LNh/wCjbiv3F/4N8/8AkxC8/wCxq1D/ANE21ff5d/utP0PFr/xJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkT/wXL/5Rx+Lv+v7Sf8A0sir+Yz/AII+f8nn2P8A2Cb/AP8AQBX9Of8AwXL/AOUcfi7/AK/tJ/8ASyKv5jP+CPn/ACefY/8AYJv/AP0AVcPiRFX4Gf1o0UUV2nlH5t/Ev/lLT8Av+wTr/wD6RXVftpX4l/Ev/lLT8Av+wTr/AP6RXVftpXHV+Jnp0PgQUUUVmahRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH4ffsT/wDJ1f7TP/Y4L/6Fc1+mNfmd+xP/AMnV/tM/9jgv/oVzX6Y120vhR5uI/iMK+Ov+Cgf/ACZh8RP+wS//AKGtfYtfHX/BQP8A5Mw+In/YJf8A9DWqlsyIfEj+c7/gkP8A8pHPhd/1/XX/AKRz1/oHV/n4/wDBIf8A5SOfC7/r+uv/AEjnr/QOrgPVCiiigAooooAKKKKACiiigD8iv+C5X/KOPxd/1/aT/wClkVfyu/8ABKb/AJPW8Of9euo/+k0lf1Rf8Fyv+Ucfi7/r+0n/ANLIq/ld/wCCU3/J63hz/r11H/0mkrWh/Ej6oa3P6z6KKK98sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPLvjhreq+Gvgt4v8R6FM1tfafomoXNvMuN0csUDsjDORkMAa/jD/4Jk23/AAW//wCCm/wL1j47fD39qN/DVpo+vTaC9rqNqksjywW9vcGQGOArtIuAMHnINf2UftGf8m9+O/8AsXdU/wDSaSv4Df8Agk9/wTx/bZ/al/4J+ePfjZ+xx8efE/gDVtB8R31nb+D9Lvruw0/Vrq3srOcu01vdRLHPKsoiDPC4/doGYLyvJXb54pX67OwmfuD/AMEwf28/2+/AX/BTbxj/AMEqf2/PEun/ABA1HTLGS80/XbKBEeKVLeG8RS8UUAaKW2lLHzo/MSUBd2OK/aj9oj/gpz+wR+yh48i+F/7QPxP0fw74hkVHbT3MlxPCsgyhmWBJPJDDkGXbkEHoRX88/wDwbIj9kzxL4v8AH/iDxHaa3/w01pyyw+JbjxPem7uZbN5gs0lorJG8f75US6WXzJkfaDIVfbX5k/8ABLPwv+0L+0d8Vv2gviG3wC8G/HvxTqerhfET+N9Tgtp9KN5JdM4gSeNivmurhpU2svlKo245iFaSjFLW9/OwXP7NP24P2iY7f/gmr8Tf2l/2aPFMFwbfwfqOraFrulSx3EXmRws0csTjejbWHfOCMEZ4r5//AOCOP7VPiz4n/wDBKDwV+1B+1j4wS5viutz6xr+ryxW0aw2mpXUKvK+EjVUiRVyccAd6/Ev9iv4K/Gr9n7/gh5+1j8OPiJrOhax4dbSdU1DQP7A16z1+3t1ubNhcRma0kkVOY422nAJZmAyWr88P2kPGnjvw/wD8Gxn7PPhbw9LNBouv+NdYh1YxkhZVgvtUmghkx1UyJ5gB/iiU9RTdZp87X2dvmB/aj8Av+CpH/BPz9qH4h/8ACp/gV8VNG17xG2/yrBWkt5bjyxlvIE6RifA5/dF+AT0Br2bwr+2F+zR42/aD1r9lPwx4vs7n4ieHYGutR0LEiXUMKiMliHRVYYmjYbWOVYEcc1/GB+1n+xp+1V4h+H/wX174ZfBn4V/AHWPC11aXvhfxRYeLtMs7vVhDGs0eWl8g3Um/ZcByXcEsf4zX6Hf8FhtH1L9hD/gpT+z3/wAFadFtzY6Rqd5B4V8b+XygRkaMs5HDu9lJMq54BtUPXmrVeVm2trfcwP6NPEH7X37Nfhb9ojSf2TNd8XWcPxH123+12OggSPdSw7ZH34RCqgJDIx3MMKuTxg181/Gv/gr/AP8ABNb9nj4jXfwl+Lnxb0jTfEOnSmC7s4UuL020w4aOZ7WGVI3U8MjsGU8ECvxm/wCCL1l/w2p+3/8AtD/8FgfH4xoUV9P4a8JzXAwkNnCib5Bn7rQ2MdsjEcEzSd818JeB7n4f/tV/BH4++Ov+CbX7LPgfS/hoo1Zde8efErU59Sv2aO1aeaS1ikM1zazLE4nQRysiSurFg3AHXly3XW9vQD+xzxJ+19+zL4S/Z3/4a01vxrpi/DYwwTjxDFL59kY7mZbeMhog5OZnWMjGVY4IBBx83+Mv+Cvf/BNL4f6xoegeL/jFoFndeIrO01CyUySOPs19Gs0EkzJGy24kjdXHnmM7WBPBr+TT4LXl5df8GnHxdguZC6W3jG2jiUnIRDq+kOQPQbmY/U19KfGr9iP9lrwh/wAGxNh8YdG8EaPH4zfQdB8Qt4g+yRnVDe3+o2yyk3RHmlTFM8QQtsCYAAwKn6xNq8Utrhc/Wr/guB/wV0u/+CevwG0KP9nq90bU/iF40lifT0uw1zHBpMscxbUIlQiOUCRERAz7cuGKsowf1k/ZZ/aQ+FH7VfwX0r4ufB3xFb+J9MnUW019aqyobuFV85MMqYKsecDHpX8T3/BU3wt4X1r/AIN+P2Tvi1qml2k/iiGbSNFTV3hQ3q6clhfsLYTkeYId0aN5e7buUHGQK/t0/Zr+FHws+DXwX0Hwh8H/AA5pnhfSHtYbo2ekWkVnbmeeNTJJ5cKqu9zyzYyT1q6U5SqO+1kB7rRRRXSMKKKKAP5MP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV/Jp/wAFWf8Ak9bxH/166d/6TR1/WX/wRV/5RmfDT/uM/wDp1vK8Gv8AxJepD3P1MooorEQUUUUAFFFFABRRRQAUUUUAFfx1f8HG/wDydH4G/wCxVH/pXcV/YrX8dX/Bxv8A8nR+Bv8AsVR/6V3FAz2X/gil/wAmsa//ANjXdf8ApHZ1+wFfj/8A8EUv+TWNf/7Gu6/9I7Ov2ArRHu4b+FEK+Of+CgP/ACZ743/69oP/AEoir7Gr45/4KA/8me+N/wDr2g/9KIq87OP9wxH+Cf8A6Sz6vgz/AJKDLv8Ar/S/9ORNv9m7/gnr+xv41/Z28A+MvFHga1u9T1bw5pV7dztcXAMs89tG8jkLKACzEnAAHPFe0/8ADs/9hr/on1p/4E3X/wAer2T9kX/k1D4Yf9ilov8A6RxV8pa5/wAFmf8Agld4Z1288MeIPjv4Rs9Q0+eS1uYJb5VeKaJijowxwVYEH3FceDynAuhTboQvyr7Me3ocee8a8QwzLFQhmVdJVJpJValklJ6L3j0n/h2f+w1/0T60/wDAm6/+PUf8Oz/2Gv8Aon1p/wCBN1/8er274A/tU/s1/tVaBdeKP2bPHmheOrCxdYrqXRL6G8+zu4JVZRGxaNmAJAcAkDIr3yuj+yMB/wBA8P8AwGP+R5f+vHEf/Qzr/wDg6p/8kfCv/Ds/9hr/AKJ9af8AgTdf/HqP+HZ/7DX/AET60/8AAm6/+PV91UUf2RgP+geH/gMf8g/144j/AOhnX/8AB1T/AOSPhX/h2f8AsNf9E+tP/Am6/wDj1H/Ds/8AYa/6J9af+BN1/wDHq+6qKP7IwH/QPD/wGP8AkH+vHEf/AEM6/wD4Oqf/ACR8K/8ADs/9hr/on1p/4E3X/wAeo/4dn/sNf9E+tP8AwJuv/j1fdVFH9kYD/oHh/wCAx/yD/XjiP/oZ1/8AwdU/+SPhX/h2f+w1/wBE+tP/AAJuv/j1H/Ds/wDYa/6J9af+BN1/8er7luLiC0ge6unWKKNS7u5wqqOSSTwAB1NZ2ga/oXivQrLxR4XvYNS0zUoI7q0u7WRZoLiCZQ8ckciEq6OpDKykhgQQcUf2RgP+geH/AIDH/IP9eOI/+hnX/wDB1T/5I/Cf/gpp+xj+zH8Df2Wbzx18KvCVvo+rLqNnALmOWaRhHIx3ACSRhzjrjNfpV4Y/5FrT/wDr2i/9AFfOn/BYz/kyy+/7C1h/6Ea+i/DH/Itaf/17Rf8AoArhy7D0qOZ4iFGCiuSnokkt59j7fNMzxmP4Sy6vjq0qs/b4hc05OTso0NLybdvI3KKKK+jPgwooooAKKKKACiiigAooooAKKKKACiiigAooooAK/Ov4yf8ABQnwxofjIfBr9mvQLv4p+OJgwW00f95a25VijGaWMOf3Z5YKu0D7zp1rkPjh8Vvif+1d8eZP2GP2YrqfS4LQ/wDFaeJYVBFjaEbZIIiSMuSwU7WDF/lGFEhH6yfs0fst/B39kv4dx/Df4O6e1tbFhJdXU7CS7vJgMebPIAu5vQKqovRVUcVLZ5+JxnK+WB+YGkfsuf8ABVv4021tqfxR+JOifDK2mYTHT9Ethd3UG4tlJGHynYCAqrdSKwOWO5QT0l1/wTG/aphskl0j9pzxH9tiw2Z7NnhdlHTb9s4BbHUtgcYNftFRSuzz3Vm9XJn4V698P/8AgrL+zZHc61a3eifGrQoCrtAsP2PVPKyxfykjEeW6cZnbkBVODj5x8H/EuT/gqD+1n4d+BHjOwuPCPgrwlbPq3iDw9qc/kXepXsBA+z7F2yMqMV4wpWMSMdrFBX9MVfA37XH7Afw//aV1S3+KPhTUJ/BPxL0kI2m+JtN3LMrRkbROqMnmqFyoO4OoPBK5UlynXqOPK3ofdemaZpuiabb6No1vFaWdpEkMEEKCOKKKMBVRFUAKqgAAAAAcCr1YfhnTtW0jw9ZaXr2ovq19bwolxeyRpC08gHzOUjCou487VGB0rcpGIV85fteeBfGfxO/Zj8cfDz4eWFtqet61pM9nZ292yJE0kw25JkVkDKDuXcANwHzL94fRtFAHyv8AsUfs/wAf7MX7MHhH4PTxomo2FmJtTKENu1C5JluPnAG8LIxRGPOxVHQCvqiiigAryL49fB3R/wBoD4Pa/wDBrxBf3mmWPiG2NrPc6e6x3CIWDEKWVlw2NrgghkJHevXaKAPNfg58KvCvwO+Fmg/CPwVH5emeH7OKzhyAGfYPmkbHV5Gy7nuxJr0qiigAooooA/Mb/grd8Dh8XP2O9b8VaOhXXvAZXxDp86OyPEtqQbkhl5/1G9hx95V6dR1v7PnxZ0j44/Bbw38UdHuI7gatYQy3HlkER3O0CeM46NHIGUj1HHFfcHj7w2/jLwLrXhCN1jbVbC5swzjcqmeNkyR3AzyK/CTwJ/wRx+Jnwb+GGmeMvg946/sD4t6OZXlmtJpX0fVEEzSRRzpIgdfkKo3ytGdvKEktTTsdOGxHsm7rRn6v0V8S/sxftSeIPH/iTVfgH+0DpaeE/il4aYpe6bnEV5CACLm2JyGRgc4VmG0hgSp4+2qs9mE1Nc0dgooooKCv5P8A/gr1/wAnlXv/AGCrD/0E1/WBX8n/APwV6/5PKvf+wVYf+gmk9jjx38P5n9PX/BDT/lHH4R/6/tW/9LJa/XavyJ/4Iaf8o4/CP/X9q3/pZLX67VB44UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//U/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABRRRQAUUUUAFfBPwA/5TE+Mf+ycL/6V2Vfe1fBPwA/5TE+Mf+ycL/6V2VdOF+M8jO/93Xqv1P2uoorzT4ufGH4bfAjwPc/En4s6omjaJaPHHNdSI8io0zBEBEau3LEDp3rvPkj0uivz3/4erf8ABP7/AKKRaf8AgLef/GKP+Hq3/BP7/opFp/4C3n/xigD9CKK/Pf8A4erf8E/v+ikWn/gLef8Axij/AIerf8E/v+ikWn/gLef/ABigD9CKK/Pf/h6t/wAE/v8AopFp/wCAt5/8Yo/4erf8E/v+ikWn/gLef/GKAP0Ior89/wDh6t/wT+/6KRaf+At5/wDGKP8Ah6t/wT+/6KRaf+At5/8AGKAP0IorG8OeINI8W+HrDxV4fm+0WGp28V3bS7WTfDModG2sAwypBwQCO4rZoA/Iv9j/AP5SYftMf9wH/wBJzX6U/Gj/AJI74s/7A1//AOiHr81v2P8A/lJh+0x/3Af/AEnNfpT8aP8Akjviz/sDX/8A6IegD8+/+CMn/JgHhb/r81T/ANK5a8X/AOCpP/J2v7LX/Ywal/6N06vaP+CMn/JgHhb/AK/NU/8ASuWvF/8AgqT/AMna/stf9jBqX/o3TqUtmbYf+LD1X5n3/RRRXkH3wUUUUAFFFFABX5ifAv8A5Sd/HD/sFaJ/6S21fp3X5ifAv/lJ38cP+wVon/pLbVpT2l6HLifipf4v/bZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzkf8ABbf/AJKl4I/7BVx/6OFfq3/wbj/8mu+Of+xpP/pJb1+Un/Bbf/kqXgj/ALBVx/6OFfq3/wAG4/8Aya745/7Gk/8ApJb16dD4EfFZn/vU/wCuh/Q5RRRWpwBRRRQAUV+KPw0/4LBeEn/bq8b/ALIXx4s7Pw3Y6frUuk+HtXR2EckkDeWY7xnYqrSuCY3UKgyEYZ+c/tdQAUUUUAFfhv8A8HBf/Jh9p/2NOn/+ibmv3Ir8N/8Ag4L/AOTD7T/sadP/APRNzQB+L/8AwQC/5PH8S/8AYmXn/pdY1/XxX8g//BAL/k8fxL/2Jl5/6XWNf18V8Xnn+9P0R62D/hhRRRXjnUFFFFAHy9+0x+2R+z7+yJZ6RefHbWX0v+3nmSxSK2muXl+zhDKcRI2AnmICTjlhjPOPw1/4KT/8FF/2Rf2l/hn4G8I/DLXJtQm0jxrpmr3yT2FxEi2NvFcJKx8yMBsGRRtGSQeAa+wP+CmcMNz+2j+yfb3CLJHJ4k1FWVhlWUy6cCCD1Br9bv8AhDPB/wD0CbP/AL8J/wDE19VlGXUnThiW3za+m7R52JryUnT6H5Ff8PM/+CT39yy/8JyT/wCMUf8ADzP/AIJPf3LL/wAJyT/4xX66/wDCGeD/APoE2f8A34T/AOJo/wCEM8H/APQJs/8Avwn/AMTX0RwH5Ff8PM/+CT39yy/8JyT/AOMUf8PM/wDgk9/csv8AwnJP/jFfrr/whng//oE2f/fhP/iaP+EM8H/9Amz/AO/Cf/E0AfkV/wAPM/8Agk9/csv/AAnJP/jFH/DzP/gk9/csv/Cck/8AjFfrr/whng//AKBNn/34T/4mj/hDPB//AECbP/vwn/xNAH5Ff8PM/wDgk9/csv8AwnJP/jFH/DzP/gk9/csv/Cck/wDjFfrr/wAIZ4P/AOgTZ/8AfhP/AImj/hDPB/8A0CbP/vwn/wATQB+RX/DzP/gk9/csv/Cck/8AjFH/AA8z/wCCT39yy/8ACck/+MV+uv8Awhng/wD6BNn/AN+E/wDiaP8AhDPB/wD0CbP/AL8J/wDE0AfkV/w8z/4JPf3LL/wnJP8A4xR/w8z/AOCT39yy/wDCck/+MV+uv/CGeD/+gTZ/9+E/+JrmvGfgzwf/AMIfq3/Eps/+POf/AJYJ/cP+zQB5N8EJf2V/2ifhpp/xb+FGgaRf6HqbTLBK+mRwvugkaJwyPGGUhkPUDIwRwRXxb/wRG/5MUsP+wzqP/oa103/BGT/kwDwt/wBfmqf+lctcz/wRG/5MUsP+wzqP/oa0AXf+Cbv/ACdL+1J/2OUX/oV1X7AV+P8A/wAE3f8Ak6X9qT/scov/AEK6r9gK+Fzf/e6ny/JHs4X+EgooorzTc/jh/wCC7/8Aye3af9izYf8Ao24r9xf+DfP/AJMQvP8AsatQ/wDRNtX4df8ABd//AJPbtP8AsWbD/wBG3FfuL/wb5/8AJiF5/wBjVqH/AKJtq+/y7/dafoeLX/iSP3JooortMQooooAKKK/ErxV/wWJ8MfCT9v7xJ+yp8cNIg0Xwdps9rYW3iNJHbyLu4hSUG7B+VYXLFQy48vblsruZAD9taKignguoEurV1kikUMjqcqynkEEcEEdDUtABRRRQB+RP/Bcv/lHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/8A0AV/Tn/wXL/5Rx+Lv+v7Sf8A0sir+Yz/AII+f8nn2P8A2Cb/AP8AQBVw+JEVfgZ/WjRRRXaeUfm38S/+UtPwC/7BOv8A/pFdV+2lfiX8S/8AlLT8Av8AsE6//wCkV1X7aVx1fiZ6dD4EFFFFZmoUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB+H37E/wDydX+0z/2OC/8AoVzX6Y1+Z37E/wDydX+0z/2OC/8AoVzX6Y120vhR5uI/iMK+Ov8AgoH/AMmYfET/ALBL/wDoa19i18df8FA/+TMPiJ/2CX/9DWqlsyIfEj+c7/gkP/ykc+F3/X9df+kc9f6B1f5+P/BIf/lI58Lv+v66/wDSOev9A6uA9UKKKKACiiigAor8dP2Uf+Ctngr41ftO+MP2Xfi5p8HhTVrLX77S/DVyJGa21FbOQxeQ7vgLdEjeoGFkDBAA4USfsXQAUUUUAfkV/wAFyv8AlHH4u/6/tJ/9LIq/ld/4JTf8nreHP+vXUf8A0mkr+qL/AILlf8o4/F3/AF/aT/6WRV/K7/wSm/5PW8Of9euo/wDpNJWtD+JH1Q1uf1n0UUV75YUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcz418K6f478Hat4I1d5I7TWbKexmeEgSLHcIY2KlgwDAMcEgjPUGvjH/gnj/wTv8Agr/wTS+DWq/A74FapreraTq+tTa7NNr08E9wtxNBBbsqtb29sgjCW6EAoW3FvmIwB96UUuVXv1A/Km+/4JAfs0Q/t+w/8FHfAeteJfCHjozrcX1no1zaxaTqDshjn+0wS2krsLlDifZKm5v3g2yZevD/ANpf/ggX+yL+0B8Z/EHx68H+JfGHwu17xf5g8QL4Q1FLO11Pz2LTtNFJDL80xOZArCNm+ZkLEk/uNXI+MfiB4D+Hem/2z8QdbsNCs+nn6hcx2sXH+1Iyj9ah0oNWaA+Ffht/wS2/ZU+D37EHiT9gb4Y2t/o3g/xdZXlpq19DOj6rdSX0YiluXnkjeMzFAqqTFsUKAECjFZ/g3/glJ+yZ4a/YGtf+CcPiS11DxV8PbP7U8MmrzxtqMc1zcy3YmWe3igVJYpZW8tljHyjawYFt36FeGvFXhfxnpMev+D9StdWsJchLmzmSeFsdcOhKn8DW9T9nHt5AfgR8Hv8Ag3U/Yx+GfxQ8NfELxt4q8bfEXT/BUiyeH9B8UanFdaXY7CrqBFHbxEorqCIwVjbADq4r9S/21P2OPhB+3n+zzrH7NXxv+2RaJrElvP8AadOeOK9tprWVZUkgeWOVFfKlSTGwKMy45r6srktN8feBNa0+81bR9asLu004M13NDcxyRwBQWJkZWITABJ3EYApKnBJpLcDwL9jr9jn4OfsP/s4aP+y98HUubjw7o/2kmXU2jmu7p7uV5ZXuHjjiR2Yvt4jUBAFAwK/Kbw5/wbhfsPeFvHWs3+j+JfHVv4H166F5f+BbfWzb6DcspJWOZYo0nkiTPyBpi69N5HFfvXoXiHQPFGnLrHhm+t9RtHJVZ7WVZoyVOCAyEg4PB5rYodKDSTWwH43eCP8AgiH+y74D/YJ8Z/8ABOjTfFPjC48B+N9Wg1m6uLi7sm1K2ngltZttvKtisSxs1pHuV4ZDy2CCcj6S8b/8E4vgh49/4J9Q/wDBNzWNV1yPwNBpOn6Ot9DPbrq3kabNFPExla3aDeWhUOfIwQTgA4I+/wCimqcV08gPyz+MP/BIj9l742/sEeF/+CenjO91x/Cfgv7LJo+prcQjVYJ7RZESUuIPIZik0iOPIClWOADgj6J/Ya/Yx8FfsHfAmH4C+AvEWu+J7GK8lvTe+IbiO5u98yopRWjjiVYlCDYm0leeTX2HRQoRTulqAUUUVYBRRRQB/Jh/wVZ/5PW8R/8AXrp3/pNHX9Zf/BFX/lGZ8NP+4z/6dbyv5NP+CrP/ACet4j/69dO/9Jo6/rL/AOCKv/KMz4af9xn/ANOt5Xg1/wCJL1Ie5+plFFFYiCiiigAooooAKKKKACiiigAr+Or/AION/wDk6PwN/wBiqP8A0ruK/sVr+Or/AION/wDk6PwN/wBiqP8A0ruKAPZf+CKX/JrGv/8AY13X/pHZ1+wFfj//AMEUv+TWNf8A+xruv/SOzr9gK0R72G/hRCvjn/goD/yZ743/AOvaD/0oir7Gr45/4KA/8me+N/8Ar2g/9KIq87OP9wxH+Cf/AKSz6vgz/koMu/6/0v8A05E+6P2Rf+TUPhh/2KWi/wDpHFX+el/wSdi/4JCSftQ/tTH/AIKtnw5sHieL/hGP7fM4P/H3qf23yfIOf+fffn/ZxX+hb+yL/wAmofDD/sUtF/8ASOKv4mP+Deb9h/8AZJ/bL/aq/bCH7UvgHSfHP/CN+J9POmDVYfNFqbu81jztnIx5nkx7vXaK0wX+70/8K/I+O4h/5GmL/wCvk/8A0pmF/wAETLD4LN/wcT+P7n/gl+1//wAM+waHei6Zhcm1Nq1vDhc3GZNn9pjNt53zmNTjjNfbng3/AIOHv+CmP7RXxc+JX7Pv7HH7OOmePPFPw/128jnlhuZVtYtHsp5LctKHmizczMo8tVcYw2Ek6L/Vt8Af2Xf2cf2VvDE3gz9m3wNongfTLpxLcQaLZRWgnkXIDymNQ0jAEgM5JA4ziv5U/wDg1qs4P+GtP25r8qDL/wAJjpsYbHIX7ZrZIH1OM/QV0njn3P8Aty/8Fpv2ifh1+1FoP/BOP9gH4W2XxX+Pz6dDe+Jbaa5aLRtGkeBJzEZGeDzMI4dpHmhSNWjBLSOUTof+Cef/AAWi+MnxZ/bI1D/gm1/wUY+F0fwg+NMVq97pcdnci503VI44vPZIm3y4fyleWNkmljdUcblddrflT8c/Fvir/giR/wAF9/H/APwUD/aH8J6vrXwV+NejT6fD4i0m3+1nT5bj7DLIsi5G14ri02eWzKXgcOm4qUFr9mvxj4j/AOC1v/Bf7wb/AMFFvgB4W1jQ/gr8F9CGlt4g1S3Np/aVxAl4Ujj2llMrz33Me8lbePc+0sqEA+ifhd/wXi/4KR/tR/HL40/st/sdfs96P408Y/DbXb20tryXUvsWlwaZY3FxbGW8a4mi8y5mdIxDDE6bv3jZ2occb+zp/wAHDn/BRj9uP4Na1pf7Gf7M1rr/AMTvAKzXPjKW81EQ6HZ2w3eQtukk0NxLdTmOUfZ/M3L5RKmTJ2Vf+DZtEP8AwUC/b4kIG4eNLUA98HUtbz/Ks7/g09iiH/DWz7RlvF9qp+g+3YH6mgD7i+AP/BerV/2h/wDgjf8AE3/go74a8FWmn+M/hdLLYaloVxM8mny3aG3ZHikXbJ5MkVwpwcMrqy/MAGb42s/+C+v/AAVg+Jv7IFr+3n8CP2XdMv8A4V+HrRpvE+sX2olWne1LLeyafbLOLgWtuw2tOY5wNrsQoVwn5F/8Ewv+VZj9sv8A7DS/+idOr2b9lv8A4Le/Bv8AZr/4IRD9hf4peC/Elv8AEfWfCmvaH4VjXTydN1u11ya7jhvYpyQrRwvO8cygMzPEwXLMQoB9jf8ABc//AIKO/Eb9tb/gh/4N/aG/ZW8PSQ/Db4i3Jt/G15LerDe6DdWd1BFFYlFkja4S4nE0blY2Vo1VyFDDP7df8EFfiD+1h47/AOCcvw9tf2nvAtn4LstE8O6Bp/g+a0u47o6x4eh0y1FrfyiOaUxSTLy0biNl7oK/nT+Kf7DH7QP7On/BpXqPgD4g6De23iefW7XxlqOkvG5utPsbjUIsebERujKQBJZlIzFlt+NrY/oj/wCCCX7bfwV/a9/4J4eAPCPwl+3i9+E3hrw94P10XsAhX+0bDTYI5PJIZvMiJQ7X4z6CgD1v/gsZ/wAmWX3/AGFrD/0I19F+GP8AkWtP/wCvaL/0AV86f8FjP+TLL7/sLWH/AKEa+i/DH/Itaf8A9e0X/oArxsL/AMjXEf4Kf5zP1Kp/yRuXf9f8T/6TQNyiiivdPkQooooAKKKKACiiigAooooAKKKKACiiigAr5f8A2yPj4n7Nf7O3iH4oWxQ6nFELXTEfB33tydkR2nhhGSZWXuiNX1BX5k/to2cXxU/as/Z8/Z3vSk2m6j4hk1vUbWYjypo9NCuqsNrE7o/PTHAO7Ge6pmNefJTckfen/BPP9lS1/ZV/Z40/Q9Zh3eL/ABBt1XxHdyHfPLezDd5bOckrADsAzt3bn6uxP3VRRUHghRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH5Gf8FVv2cLrWvAlj+2H8JY4bDx78LZF1Y3exi11ptrmSSGQRglwhw43/KE8xSQHJHu/wQ+Lfh747fCfQvi54VUpZa5bCdY2YM0TglJI2K8Fo3VkOO4r7zvbKz1Kzm07UYUuLe4Ro5YpFDo6OMMrKcggg4IPBFfg/wD8ExmufB2h/E79n2aZpYfh/wCMtR061R8Fo7feVC5BOcyRyNk55JwSOlRO7A1GpuPc/UGiiiqPWCv5P/8Agr1/yeVe/wDYKsP/AEE1/WBX8n//AAV6/wCTyr3/ALBVh/6CaT2OPHfw/mf09f8ABDT/AJRx+Ef+v7Vv/SyWv12r8if+CGn/ACjj8I/9f2rf+lktfrtUHjhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/1f7+KKKKAP8AOf8A+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf+xV0b/0kir+V3/gox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/ALFXRv8A0kirlxWyPeyH45+h79RRRXCfTBRRRQAUUUUAFFFFABXwT8AP+UxPjH/snC/+ldlX3tXwT8AP+UxPjH/snC/+ldlXThfjPIzv/d16r9T9rq5vxZ4O8IePNFk8NeOdKs9a06Uqz2t/AlzAxQ5UlJAykgjIyODXSUV3nyR4F/wyl+y5/wBE18K/+Ce0/wDjVH/DKX7Ln/RNfCv/AIJ7T/41XvtFAHgX/DKX7Ln/AETXwr/4J7T/AONUf8Mpfsuf9E18K/8AgntP/jVe+0UAeBf8Mpfsuf8ARNfCv/gntP8A41R/wyl+y5/0TXwr/wCCe0/+NV77RQB4F/wyl+y5/wBE18K/+Ce0/wDjVH/DKX7Ln/RNfCv/AIJ7T/41XvtFAFLTtO0/R9Pg0jSII7W0tY1hhhhUJHHGgCqqqoAVVAAAAwB0q7RRQB+Rf7H/APykw/aY/wC4D/6Tmv0p+NH/ACR3xZ/2Br//ANEPX5rfsf8A/KTD9pj/ALgP/pOa/Sn40f8AJHfFn/YGv/8A0Q9AH59/8EZP+TAPC3/X5qn/AKVy14v/AMFSf+Ttf2Wv+xg1L/0bp1bH/BIv44fBbwV+wx4Z8PeMvF+iaRqEV3qTPbXuoQW8yh7qQqSjurDIORkcivL/APgot8Tvht8Rv2tf2Y/+Fe+IdM177H4gv/tH9nXcV15XmS2Gzf5TNt3bWxnGcHHSlLZm2H/iw9V+Z+m9FFFeQffBRRRQAUUUUAFfl58JLqDRP+CqXxX0e6bEut+HdMvYNw25W2itomC9m5Oc5HQ8HBI/UOvys/bisNc+Afx08E/t0eHrP7ZYaGn9ieIoxlVFjdMyJK7KWb5Xm+XbETuCgkjArSlu13RyYzSManSLTfpqn+Z+qdFYHhXxV4c8ceHLLxf4QvYtR0zUYlntrmBt0ckbdCD/ADHUHg81v1mdSd9UFFFFAwooooAKKKKACiivye/a+/4LUfsG/sNfGWb4DftBa3qdj4jt7SC9eK102a6j8m5BKHegK5IHI7U1FvREVKsKa5puy8z9YaK/J/8AZY/4Lbf8E3f2wfiHbfCX4S+P1g8S3xCWWn6xazaa925OBHA86LFJISfliVzI3ZTg1+sFDi1ugp1YTV4NNeQUUUUiwooooAKKKKACiiigAooooAKKK8f0r9oD4Ka78Zr79njQvE1hfeNtL0/+1L7R7eUS3Npab0jDzqmRFuaRdquVZgcgEAmgTaW57BRRRQMKKKKAP5yP+C2//JUvBH/YKuP/AEcK/Vv/AINx/wDk13xz/wBjSf8A0kt6/KT/AILb/wDJUvBH/YKuP/Rwr9W/+Dcf/k13xz/2NJ/9JLevTofAj4rM/wDep/10P6HKK/Fr/guTea7F+zh8PtJ0LVb3Rzq3xD0mwnn0+drebyZ7W9DAMv4HBBGQCQcV5h/w5/8AhT/0VX4m/wDg8h/+RK1OA/fSivwL/wCHP/wp/wCiq/E3/wAHkP8A8iUf8Of/AIU/9FV+Jv8A4PIf/kSgD5l+Cf7M3ws/av8A2nP2x/hT8VrPzrabxTZSWt1HgXNlciXUgk0LkHa655HKspKsCpIr6e/Y/wD2v/in+xv8U7H9gv8Ab0vvOtpsReC/GkpItr+2BCxwTyMTtdchQWYsjEI5KlHb6h/ZM/Yi+Fv7HcniW98Aarret33iyW2l1C81y6S6nf7IJBGA0cUQwPNckkFjnk4AA9F/aZ/Zm+Fn7V/wsvPhT8VrPzrab95a3UeBc2VyAQk0LkHa655HKspKsCpIoA/QqivwP/Y//a/+Kf7G/wAU7H9gv9vS+862mxF4L8aSki2v7YELHBPIxO11yFBZiyMQjkqUdv3woAK/Df8A4OC/+TD7T/sadP8A/RNzX7kV+G//AAcF/wDJh9p/2NOn/wDom5oA/F//AIIBf8nj+Jf+xMvP/S6xr+viv5B/+CAX/J4/iX/sTLz/ANLrGv6+K+Lzz/en6I9bB/wwooorxzqCiiigD8Wf+Clv/J6/7Jn/AGMuof8Ao3Tq/Y6vxx/4KW/8nr/smf8AYy6h/wCjdOr9jq+5yf8A3OHz/Nnj4r+K/wCugUUV8t/tdftpfsy/sJfCaX41/tT+K7bwroKyrbwvKrzT3Vw/SK3giV5ZpMAkqiHaoLNhQSPTOc+pKK/A74Bf8HLX/BJn9oL4pWXwk0Xxrf8Ah7UdUuVtLG417TZbKyuJnIVF8/50i3k4BmMYzwSCQD++NABRRXwn8U/+Cjn7Lvwc/bU8F/sA+OdSvYfiT4/09NT0e0js5JLaS3ka5QF51GxDm0m4JzwPUUAfdlFfCfw2/wCCjn7LnxX/AG2fGH/BPrwbqV7N8S/AuntqerWklnJHbR26/ZslJyNjn/S4uAc8n0NfQPw9/aO+BPxZ+JXi74P/AAx8V6dr/iTwF9jHiGxsJhO+mvfmYQRzsmUSVvs8uY929AuWADLkA9rooooAK5rxn/yJ+rf9ec//AKAa6Wua8Z/8ifq3/XnP/wCgGgD81f8AgjJ/yYB4W/6/NU/9K5a5n/giN/yYpYf9hnUf/Q1rpv8AgjJ/yYB4W/6/NU/9K5a5n/giN/yYpYf9hnUf/Q1oAu/8E3f+Tpf2pP8Ascov/Qrqv2Ar8f8A/gm7/wAnS/tSf9jlF/6FdV+wFfC5v/vdT5fkj2cL/CQUUUV5pufxw/8ABd//AJPbtP8AsWbD/wBG3FfuL/wb5/8AJiF5/wBjVqH/AKJtq/Dr/gu//wAnt2n/AGLNh/6NuK/cX/g3z/5MQvP+xq1D/wBE21ff5d/utP0PFr/xJH7k0UV+Lf8AwXk8ZeL/AAT+w1Ff+DNVvNInuPEmnwSyWU727yRGOd9jFCpK7kVtp4yoPUCu0xP2kor8C/8Ahz/8Kf8AoqvxN/8AB5D/APIlH/Dn/wCFP/RVfib/AODyH/5EoA/fSv5zPB3wW+HH7QX/AAUF/ay+FXxV05NS0fUhoCujcPG4tjtkjbqkiHlWHIPtkHv/APhz/wDCn/oqvxN/8HkP/wAiV9MfspfsLfDD9kXX/EvirwZrniDxDqXilLSO8udfu47qULZ7wgVo4YTyHwd+7hVAwM5APjT9nf8AaJ+J3/BLf4naf+yR+1vqEur/AAk1eUw+DvGMwONPGfltLtv4Y1yBz/qeo/cn91/RFBPBdQJdWrrJFIoZHU5VlPIII4II6Gvij40/Bb4cftBfDjUfhV8VdOTUtH1JNro3DxuPuyRt1SRDyrDkH2yD+Wn7O/7RPxO/4Jb/ABO0/wDZI/a31CXV/hJq8ph8HeMZgcaeM/LaXbfwxrkDn/U9R+5P7oA/onoqKCeC6gS6tXWSKRQyOpyrKeQQRwQR0NS0AfkT/wAFy/8AlHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/wD0AV/Tn/wXL/5Rx+Lv+v7Sf/SyKv5jP+CPn/J59j/2Cb//ANAFXD4kRV+Bn9aNFFFdp5R+bfxL/wCUtPwC/wCwTr//AKRXVftpX4l/Ev8A5S0/AL/sE6//AOkV1X7aVx1fiZ6dD4EFFFFZmoUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB+H37E//J1f7TP/AGOC/wDoVzX6Y1+Z37E//J1f7TP/AGOC/wDoVzX6Y120vhR5uI/iMK+Ov+Cgf/JmHxE/7BL/APoa19i18df8FA/+TMPiJ/2CX/8AQ1qpbMiHxI/nO/4JD/8AKRz4Xf8AX9df+kc9f6B1f5+P/BIf/lI58Lv+v66/9I56/wBA6uA9UKK/B3/gtM3iXxD48/Z4+EmneINW0LS/GPi86bqJ0m7a1kaOeS1h3jGVLxrK/ll1YKWPBBIOb/w5/wDhT/0VX4m/+DyH/wCRKAP30or8C/8Ahz/8Kf8AoqvxN/8AB5D/APIlH/Dn/wCFP/RVfib/AODyH/5EoA+c/wBlD9lz4Z/tY+Av2gvh38RIWjlj+KGtT6dqMHF1p90Cu2aFuoIONy9GHB7Efev7G37ZPxM+GfxMt/2FP267hY/GkahPC/ihyRa+JbUfKgLtwLsDA55kPyt+9wZfYf2U/wBkr4c/sheDdU8HfDy/1XVRrWoyape3msXC3F1NcSqqksyRxLjC5+7kkkkmtL9qP9lz4Z/tY/DOb4d/ESFo5Y28/TtRg4utPuh92aFuoIONy9GHB7EAH6MUV+On7G37ZPxM+GfxMt/2FP267hY/GkahPC/ihyRa+JbUfKgLtwLsDA55kPyt+9wZf2LoA/Ir/guV/wAo4/F3/X9pP/pZFX8rv/BKb/k9bw5/166j/wCk0lf1Rf8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK1ofxI+qGtz+s+iiivfLCiiui8P+Gb/xI8qWLxoYgCfMJHX0wD6VMpKKu9gOdor0j/hV2v8A/Pa3/wC+m/8AiaP+FXa//wA9rf8A76b/AOJrP6zS/mC6PN6K9I/4Vdr/APz2t/8Avpv/AImj/hV2v/8APa3/AO+m/wDiaPrNL+YLo83or0j/AIVdr/8Az2t/++m/+Jo/4Vdr/wDz2t/++m/+Jo+s0v5gujzeivSP+FXa/wD89rf/AL6b/wCJo/4Vdr//AD2t/wDvpv8A4mj6zS/mC6PN6K9Qg+FmqN/x9XMSf7uW/mBWonwpiA+e+JPtHj/2apeLpL7Qro8bor2b/hVNv/z+t/3wP/iqP+FU2/8Az+t/3wP/AIql9cpd/wAwujmPB3hS18QQNczsf3MoDLnAZCOfoR1FY3ibwzd+HLvy5Pnhf/Vyevsfevc/DHhlPDUEsCTGbzWDZK7cY/E1tajp1pqto9jfJvjfqPT3HvXI8a1UbWsRcx8mUV03ibwzd+HLvy5Pnhf/AFcnr7H3rma9KMlJXWxQUUUVQBRRRQAV/n0/ta+If2ZvFX/Bar4raH/wWvuvFVr4P0+WS38HrYNObG304yA2jMsKtOLeSDLk2y8zl9+Tmv8AQWr+SXx1/wAFO/2aviD+2J8Tf2Iv+C5Hw08J6JpnhW6eHwjrEukXNz5lv5jkSNPuuJovtcBhlhkgESgb1c5Kgc2JSaSb69dvmJnd/wDBHv8AYl+Hnwc/bM8Q/Hf/AIJ0fHnRfGXwB1W1MOpeExeSXOqwSSwAwtcRFEEciXKExSSKkhgLJyc5+h/E/wDwcD+CdO/aF+Jf7KngL4N+LvGvj7wLrVzo2n6ToC/bZdWNnLLHcXH7uMm3giEalmYO37xQFIDEfiP+wto/7OcX/Bfzwpc/8Eel1e6+FNtps3/CUSMbs6dHFJBcC5Aa5xMbYP8AZ/J+0E5ugNmVCGvQf2B/2zP2cf2OP+C6f7VOr/tJ6rD4a03xPrmvadZ63dRsbeC5TU2m8iSRQfLEyIxDNhS0YBOSKwhUsko6ateXyA/ot/4Jrf8ABWv4Tf8ABRTUvFHw4Tw3qnw9+Ivgpv8Aic+F9ax9pijD+WzxttRmEcn7uVXjjeNyoZfmBP8APf8A8EQ7vwTYf8E8P25r74lWd1qHhyG31iTVbWxlWC6nsl029M8cMrK6pI8e5UcqwViCQQMV7p/wTA8V6H+2D/wcGfHv9s/9nZZJvhlb6ENPbVEiaKC6uJIrG2QAMFb/AEiS0nuFyASqZYAnB+Xf+CQX/KLT/goD/wBgjxD/AOmi+p87k4t/3vmB2nxB/bUsP2cv+DfjRr3/AIJ6eF/GvhHRvFus6jYR6414Lu68PiLUY/Pe5vIII1jF5ueCBh5bBnAVi1ff37Df/BXvwt+zl/wSK0T43ftP+BPFXh+y8DWWjeHdMmvIWMviy7uLcsk9i8yxI8ThHkaQuwChjljhT+Y3g+xvL7/g0a8SizjaUxa0srhRkhF8R2+48dgOSew5r6X8T/tJ/wDBOD4z/wDBADwH4A/aAfxF4t0TwVp/h3SdZfwVbpLqXh3XFt5Fgkk+1NFCinZJCWYvG3mBeC6GlGUk73+yB97eDP8AgvF4s0f4o+C/Bf7V/wCzd43+FOheP7hLbRtcu83kTtIVAaWL7PCyqoYNJtLuiHdtIr+hqv8AOt1/9on40/8ABNw+APFP/BOf9r5vjjo/iK+trW18A3MU9zcwRSg7IZrCSS5SLcQISImgn3suxf4l/wBETS57y60y3utRg+zXEkSNLDu3eW5ALLkcHB4z3row9RyupPX5foCL1FFFdAwooooAKKKKAP5MP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV/Jp/wAFWf8Ak9bxH/166d/6TR1/WX/wRV/5RmfDT/uM/wDp1vK8Gv8AxJepD3P1MooorEQUUUUAFFFfyYf8E1f+Cnvxz+CGkaTJ+2ddX+t/DLxxqVzBp3iy8ka5k03Ug5MsU8hJbyWJ37W5QEsmVDhQD+s+iqtjfWOqWMOp6ZMlxbXCLLFLEwdJEcZVlYZBBByCDgirVABRRRQAV/HV/wAHG/8AydH4G/7FUf8ApXcV/YrX8dX/AAcb/wDJ0fgb/sVR/wCldxQB7L/wRS/5NY1//sa7r/0js6/YCvx//wCCKX/JrGv/APY13X/pHZ1+wFaI97DfwohXxz/wUB/5M98b/wDXtB/6URV9jV8c/wDBQH/kz3xv/wBe0H/pRFXnZx/uGI/wT/8ASWfV8Gf8lBl3/X+l/wCnIn3R+yL/AMmofDD/ALFLRf8A0jir6Gr55/ZF/wCTUPhh/wBilov/AKRxV9DVpgv93p/4V+R8dxD/AMjTF/8AXyf/AKUwor5v8V/tgfsweBfEV54R8ZeOtI0vVLCQxXFrc3CxyxOOzK2COOR6jkcVz/8Aw3Z+x1/0UnQP/AxP8amWYYVNp1Y3/wAS/wAzSnwxnFSKnDBVXFq6apzaaezTtsfVc8EF1A9tcoskcilXRhlWU8EEHgg0ltbW9nbpaWkaxRRqFREAVVUdAAOABXyr/wAN2fsdf9FJ0D/wMT/Gj/huz9jr/opOgf8AgYn+NL+0cJ/z+j/4Ev8AMv8A1Uzv/oBrf+C5/wCR9YUV8n/8N2fsdf8ARSdA/wDAxP8AGj/huz9jr/opOgf+Bif40f2jhP8An9H/AMCX+Yf6qZ3/ANANb/wXP/I4v/gpX+y74x/bU/YW+JH7LXw+1Cy0vWfGemLZWt3qBcWsTiaOTMhjR3xhCPlUnNYP/BMb9kDxP+xN+wl8NP2W/ihdadrWveBbS5hlvbAO9uZJ7meYNCZUSQfJKFJKqevavUv+G7P2Ov8AopOgf+Bif40f8N2fsdf9FJ0D/wADE/xo/tHCf8/o/wDgS/zD/VTO/wDoBrf+C5/5H1eQGBVhkHqKqWGn2GlWiWGlwR20EedscShEGeeAAAOa8l+Gf7RHwO+M2pXGj/CrxTp3iC5tIhNPHYzCUxxkhQWx0BJwM9a9mrop1YVI81OSa7p3PJxeDxGFqOjiacoTXSScX9z1Pyw/4LGf8mWX3/YWsP8A0I19F+GP+Ra0/wD69ov/AEAV86f8FjP+TLL7/sLWH/oRr6L8Mf8AItaf/wBe0X/oArysL/yNcR/gp/nM/San/JG5d/1/xP8A6TQNyiiux03wRq2qWUd/byRBJASAxIPBx2U17p8fOcYq8mcdRXf/APCuNc/56wf99N/8TR/wrjXP+esH/fTf/E0XRn9ZpfzHAUV3/wDwrjXP+esH/fTf/E0f8K41z/nrB/303/xNF0H1ml/McBV/S7eO71O2tZvuSyojY9GIBrsP+Fca5/z1g/76b/4mrum+AdYs9Rt7yWSErFIjkBmzhSDx8tK6JliadnaRyniHw9daBdbH+eF/uP6+x9656vpy/sLXUrVrO8Xej9R6e4968E8Q+HrrQLrY/wA8L/cf19j70JmeGxSmuWW5z1FFFM7Aoori/iL8QfCXwp8D6n8RfHd2LHSNIga4uZiC21RwAFGSzMSFVRySQBQDdtWdpX5aeIvGHg/xH/wV2+CF54e12z1GOHSdYgljtrhJRDI1neFd21jtaTcAAQCcDr25DwJ8K/2q/wDgqXNB428c6hcfDT4ITvJHDp1lK0ep6vAB99iUaN0ZuNzjylwNkchBc/T8n/BJP4X/AAw+LPwu+Jf7MQi0CXwdrTX+tTajcTXU2oWjFP3aqQyh1UMiFTGqhiSHbmpbPKxOLU04RWnc/YOiiipOAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/B7/gn1dr4t+K37QPxSsnNxY6348vY7WcFTHJFBJI6bSmQcRzJkgkEEHJ6n9DP2/v2nbL9lX9mvWvG1u7nX9URtJ0GKHBlbUbpGETgHORFgytwchcdSK/Nj/glP4m0vw58J9Y/Zo17TJ9D8a+BtQn/ALatLlVR5GupXKSrjBYKqiNic4wpztZacTrwVvaq5+qlFFFWeyFfyf8A/BXr/k8q9/7BVh/6Ca/rAr+T/wD4K9f8nlXv/YKsP/QTSexx47+H8z+nr/ghp/yjj8I/9f2rf+lktfrtX5E/8ENP+UcfhH/r+1b/ANLJa/XaoPHCiiigAoor4B/4KleMfFfgH9gP4leK/BGo3Ok6nbafCsN3aSNDNGJbmGN9jqQykozLkEHBoA+/qK/DL/gnJ/wUK+ID3/h/9kv9uIHTfGupadaXvhfXrhv3HiGyuYw8KtL0N1g7Q3WVgVbEwIf9zaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/9b+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAV8E/AD/lMT4x/7Jwv/pXZV97V8E/AD/lMT4x/7Jwv/pXZV04X4zyM7/3deq/U/a6vEf2h9Y+PWh/C281H9mrStO1nxcskItbXVXKWrRlx5pciSI5CZK4cc4617dRXefJH49/8LQ/4LX/9E38Af+BMv/yfR/wtD/gtf/0TfwB/4Ey//J9fsJRQB+Pf/C0P+C1//RN/AH/gTL/8n0f8LQ/4LX/9E38Af+BMv/yfX7CUUAfj3/wtD/gtf/0TfwB/4Ey//J9H/C0P+C1//RN/AH/gTL/8n1+wlFAH49/8LQ/4LX/9E38Af+BMv/yfR/wtD/gtf/0TfwB/4Ey//J9fsJRQBzPgu68UX3g7Sb3xvbR2etTWUD6hbwnMcV0yAyohDPlVfIHzNwOp6101FFAH5F/sf/8AKTD9pj/uA/8ApOa/Sn40f8kd8Wf9ga//APRD1+AlxbftZXP/AAUe+PQ/ZW8UaV4ZuBLpP9otqlsLgTJ9mXywmYpcFTuz0zkV7f4g8H/8FbfE2gX3hvVfip4VNrqFvLbTBdNVWMcqlWwfsvBwetQ6kU7NnVSwVepHnhC6PmP/AIJ3/sZfsyfGP9lfRPHvxL8Jwarq91cXqS3Mk06MyxTuijCSKvCgDpX6E+CP2GP2Tvhz4os/Gng3wVZ2eqafIs1tOZJpTFIpyGUSSMoYEcHGRWh+xv8AATWv2aPgBpHwj8RX8GpXtjJcyyzWyssWZ5Wkwu7DEAMBkgZ9K+oq8+pUbk7PQ+twuFpxpQ5oLmSXRbhRRRWR2hRRRQAUUUUAFYfibw1oPjLw9e+E/FNrHfabqUD21zbyjKSRSAqykehBrcryz40fGHwR8BvhtqfxQ+IF0LbT9Ojzjq80rcJFGOpd2wB6dTgAkNXvoTNpRblsfmJqHwu/aF/4JwHU/GvwNuI/Gnwn8z7VfaBqEvl32nh2AZraTox6YIBLZw0TMPMrv/B//BYD9knxBbeZ4iOraDKASUubTzhnJAAaBpOcYPIArkPh3+z78Wf29JbP45/tfXU2k+EbgeZo3g3T5HgiktH2uklzIrCQl9qt2dsBh5a4Sv0U8H/s3/ADwDpf9j+EPBmjWUBJZgtnEzOSScs7KWYjOBuJwOBxW8nH7Wr8jzKNOte9B8sOiev3LovK569p9/barYQanZEtDcxrLGWUoSrjIyrAMDg9CAR3q5RRXOeqFFFFABRRRQAV/Hf8f/C3hjxr/wAHYXw68M+MtOtdW0258OSedaXsKTwSbNC1F13RuCrYYBhkcEA9RX9iFfxn/wDBRez/AGvP2d/+C+Ogft2/B34EeMvizoPhfQIYVj0PTL1rW5kutOurJkF5BaXMatEZw7Dax42nGcjahu/Q8/Mfhg3spJv0PWf+DmH9jL9nv4afsmeHv2tPg14Z03wV458LeJrC3j1LQ7aPT5ZoLhZCFfyFTc8cqRyROfmTBAOCa+ov20/+CxPxS/Z9/Y1/Z6tfglocfib44/tC6Fos2i293GPs8E9/Ba+ZLLGpj3SSTXKxwxgqhYszHam1/wA/v2rLv/gqp/wXavPBv7M2rfs/6v8AAH4Y2Gswatr2p+I3lEzCINFvX7TbWbuY45ZDHBHExeQqWZVGR9rf8FlP+Cb/AMdru3+AX7Uv7CWjjxDr/wCzfLZR23hxzvuLyx06W2ltfKA2+Y0TQYkjBDOjkpyu1tFb3Yz3OWTm3Vq0E0ml037tLyR4X8Uf2/P+Cx//AASb8Z+BfiD/AMFL7nwn8R/hZ401BdO1C58OQeVd6TK48xlVkt7UNKkau6IUlSUIyh1OGH1n/wAFFv8AgpV+1jL+2v4E/wCCZv8AwTci0WPx74t09dXv/Eetp51nY2skck6hFw6/LBE00jtHJlWRUQsePzk/bU8V/t8/8F5Lv4ffsiaF+z74o+DPhHRNdi1nxRr/AIqglhhtpoo3t2EJmhtxL5Mc8pWNcySsy5WNVLV9Af8ABQ/9mL9qH9iP/gp78Ov+CpP7K3w51H4p+E9L0SHQNd0HRkebUIUhtZLHIjiWSUobdkdJFjZVkiIk2gqSWjdXSvr/AMATqVOWXJKTheOut7fat1PvT9gL4pf8FjPCH7Uuufsz/wDBQjwzp3jDwnFZ/adP+IegQJa2Yn2B1iddsHmK4yhC26vHKMHcjBhyX/BED/goF+0l+3N4k+O+m/tBX9nexeAvENtp2kC0tI7UxwSNdhg+z75xCnJ/rUX7A/7X3/BUb9tj9s7U/iF4z+HF58Iv2eNOsCkWmeJtP8nVb278sqhhlkjilO6VvNdgjQoieWGLnJ/LL9hXVv23/wDgkf8AtdfH74Ln9nTxj8TLf4j66t94a1PRIGGnSiGa5MDzXpja3jhkjuUMrlw0DKQ65PyrlupKyvoaqs4unJOTheW9+2nnbtc+uv2Jv+CqP7X3xw+B/wC3F468f6pp8+ofAvTtTuPCbRWMUSwSWtvqskZlVRiYBrSLIbrg+pr488D/APBST/guV8dv+Cb2oft/+BNX8GeH/DXw+N1/ajz2Qk1LxB9nuMyyRwmF7eGGCORItoaOR2ikbdyopf8AgmN+yn+2F8O/2S/+ChHhb42fDvXtJ8UeMtA1GDTIDpd0iaxevZ6yjrpu+MG7VpZUEZh37g6Y+8M/Sn7JH7On7QXhr/g2n8d/AjxF4E8Q2Hji803xGkHh650u5i1WV57p2jCWjRidi64KAIdw5GapqKb0W6OeDrTjG8pL3ZP5p6Hhfj3/AIKjf8FqviX+wTD/AMFUPhbF4I8EfDTQTb2tzorQvfX+rPHcLYXN4PNjIS3N4xVIkmjkREbLPtDv96ftpf8ABcLxN8Ev+CZfwk/aj+GPhq1f4j/G22ii0jTbktNZ2U6xj7XKcFGlWKQqkSFl3F1LcBgfnfQP2cv2g4P+DWGT9nqXwH4hTx8bC5T/AIRk6XcjWNzeJnuAPsXl+fkwnzQNnMfzfd5r5y/a8/4Jf/tQ/tD/APBFn9me/wDAPg+9uPH/AMHLK4l1DwjqNtJbX81pfMDOgt5dkhmRoIj5GA7ozbcttVi0G9e43LERi3FttwT+d9bfLoe/aD/wU0/4KU/sGftLfCvwX/wUQ8VeBfiV4G+LF4NOku/CZjNzoNy7xJ+8aCKFSIjMpIKSeYgfY+5efWP2xv8AgpL/AMFFPB//AAWGh/4J7fslW+garD4i0GBtKt9bi8q2s7ya1eeW8uJ41aZordI3kMS8vgKMk7T8A/BP4H+BP2j/ANpn4feBP2fv+Cfcnw+0e1njl8Z6149i1azj05kdGZrOX7RArNEA5RXRpJmKDZGoZj+gnin4BfHS5/4OdPDfx9g8Fa9J4Ft/C0lvJ4jXTbg6Skx0q5j2NebPID72CbS+dxA6mhqN9ujHGVVxSUnbmS63t11aRU/Y/wD2/wD/AIKT/C//AIKsz/8ABMT9vXVPDni668RaTc6jo2saNai1SF0tJL2IrtjiLRFIpI3SSIuHUEOVBL/lR/wS98Lf8FJW/wCC4XxVsdP8SeE18YafqMcnxNuGjk+yX2kpqNr9uj04fZsrM4x5RZYh6stfrF8VPgF8ddR/4Oc/hr8fdP8ABWvT+BbDwrPb3PiOPTbhtJhmOlalGEkvAnkK5eREClwdzKOpFfNvwitf2pP2F/8Agvx8WvHuo/BbxZ4x8K/GK9h0+y1vR7KeWwtbTUbu0le8knSKSMx2yB/OQsrKV5wDmhNWdktUKUZXjzt2jNq+u1tDjvEf/BXr9uz9pv8Aa9+Kfwe+E/xp+HP7O9h4C1i50fRtJ8ZwIlxq7Ws0sJMl1dQTRJIzR/OqshXeqqjYZz/SP/wTm+In7Z3xM/ZrsNf/AG6/D2j6F42E7osuhXsF7Z39kVVorkG3lmjR2JZXVJGQ7dy4DbV/mL/bV8M33jX9o74gaP8A8FLP2I9U8XXs8wTwx41+EFlfRS36LuVJLydJpIp5HTy8eapkiAKtE2Fx+mv/AAbefso/tV/sufsw+MIv2i9N1PwvpHiXW0vvDXhrWHJvbC2VCJZJYiF8lpyUBQojExFii7hmakY8l0a4SpU9vyybe/fT1TVl5WZ/RfRRRXMewfzkf8Ft/wDkqXgj/sFXH/o4V+rf/BuP/wAmu+Of+xpP/pJb1+Un/Bbf/kqXgj/sFXH/AKOFfq3/AMG4/wDya745/wCxpP8A6SW9enQ+BHxWZ/71P+uh7p/wXF/5IP8ACv8A7Khof/pPe1+kFfm//wAFxf8Akg/wr/7Khof/AKT3tfpBWpwBRRRQAUUUUAfPv7TP7M3ws/av+Fl58KfitZ+dbTfvLW6jwLmyuQCEmhcg7XXPI5VlJVgVJFfFP7Dn7VPxp/Zo+Otj/wAE3P2xpJdbvZ4s+CvE8KNN9vslDbIpwNzqVWNgHbJjKlXJXa5+gf2w/wBsPTP2btN07wR4I05vFnxL8WN9m8OeHLbLyzyudommCnKQIc5OQXIKqQA7p1/7Cv7CupfBPUr/APaO/aOv18WfGbxYu/U9TfDxadE4GLOzGAERBhWZQAQAq4QAEA/TCvw3/wCDgv8A5MPtP+xp0/8A9E3NfuRX4b/8HBf/ACYfaf8AY06f/wCibmgD8X/+CAX/ACeP4l/7Ey8/9LrGv6+K/kH/AOCAX/J4/iX/ALEy8/8AS6xr+vivi88/3p+iPWwf8MKKKK8c6gooooA/Fn/gpb/yev8Asmf9jLqH/o3Tq/Y6vxx/4KW/8nr/ALJn/Yy6h/6N06v2Or7nJ/8Ac4fP82ePiv4r/roFfy5/8HMn7AX7V/7V/g74QfH/APZY8PJ4/ufhBq17faj4QljFwNQhumtZFkFsSv2lUNqY5YFJkdJfkHDV/UZX86n/AAXQ+G//AAVT8NeKvhh+2N/wTW1jX9bt/AF2H8T+AtLu5lh1aCGVZ45Hs4nT7YjAPBPEgaUo6FFO1ivpnOfzyfF7/gph/wAEw/257vwl+zF/wV0/Zs1z9n7WvD17EseteGIUsmtFKtEyXMMtrDdw2eW3NEqXDKyKR0Nft9/wW/8A+CnH7Q//AATJ8L/sv2/7F99beJtC8YzT2tzHcpFfS63YWCaeLZY7oq217hJmHnIpyXDAHAr8uv8Agop+1X/wUU/4Lh/BjQv2L/h/+xR4n8D6rNrNpcXviXxPBcC20qSL76xXNxZWqW4bP712fcYwUEbFgRS/4OMPgj8Sf2a/2f8A9gD9nfw3qUeteL/A8cmg2l65IhuNR0+HR4I3BfBEZlQbd2CExmgD62/ar/4KP/8ABcv/AIJPfEP4fftH/wDBQb/hBvFXwg8darHp2qaF4Wt2EuiPIpmaBLh445WuFhWRoy0txFIYnUlcq5T/AIKB6hZav/wda/sk6tpsgmt7rwNZSxSL0ZHm18qR7EHNeCf8FK/G/wDwUm/4Lm3Pw0/4J5Wf7Mviz4QrofiSDV/GHiDX4ZG0i0uIIZbUyW92Y44JreOOeeRCsjPcfKI1PVvs/wDbM/ZW+OMn/ByT+yt8Ufh34D8Ral8OvB3gex0u98Q2mmXM+k2LW8mtKI7i8SMwROFkiJV3Bw68fMMgG58H/wBrP9pX4lf8F4f2qP2Q/hTY+D9K1Lw/8PtSufC+ry6JbQXo1cw6ULRr6/iha5nt1muMyI28FVX5TtUV+WH/AAbOeGv+CgU3/BQz493fhXxB4Yi8M6Z4qtl+LEMyP9p1G4aTWFtzpZFuQqrdCdn3tD8hXg9B+p37FP7Ov7QPhT/g58/aN+P3ijwL4h03wJrnhGW203xJdaZcw6ReTH+xcRwXjxiCV/3Unyo5PyNx8px8rf8ABH2y/a9/4J9f8FX/ANon9n74gfAzxffaT8avGQms/GMGn3DaHp9nZXGqTQ3ks6xGKWCdbyMAiVCrAq2GyAAeJ+CP+C2P/BS39uj4pfES5+Cvx2+FnwAl8Nalc2fh7wF4vhht7/VFhz5cbXl/C8Jmcjy22zR/vQf3caYav6/v2AvHv7XnxI/Ze8P+J/25PDOleFviLIrrfQaJeRXthcRcGG4iaGWZF8xCNyCVwGBIO0gV/Fx+1x4GuPid8TviPoP/AAU4/wCCffiHUPiZeXsx8P8Ai/4JWOoQ2WplwQJZ5VkuILiWRgZTM8UkuGCyQqwOf6BP+Dan9lD9rz9kT/gni/gb9r2G80i+1XX7rVNE0G/kL3OlaZLDCqxupJ8gyTJLL5H8G/LAOzqAD+hCua8Z/wDIn6t/15z/APoBrpa5rxn/AMifq3/XnP8A+gGgD81f+CMn/JgHhb/r81T/ANK5a5n/AIIjf8mKWH/YZ1H/ANDWum/4Iyf8mAeFv+vzVP8A0rlrmf8AgiN/yYpYf9hnUf8A0NaALv8AwTd/5Ol/ak/7HKL/ANCuq/YCvx//AOCbv/J0v7Un/Y5Rf+hXVfsBXwub/wC91Pl+SPZwv8JBRRRXmm5/HD/wXf8A+T27T/sWbD/0bcV+4v8Awb5/8mIXn/Y1ah/6Jtq/Dr/gu/8A8nt2n/Ys2H/o24r9xf8Ag3z/AOTELz/satQ/9E21ff5d/utP0PFr/wASR+5Nfhv/AMHBf/Jh9p/2NOn/APom5r9yK/Df/g4L/wCTD7T/ALGnT/8A0Tc12mJ+oFFFFABRRRQAV5X8afgt8OP2gvhxqPwq+KunJqWj6km10bh43H3ZI26pIh5VhyD7ZB9Ur4l/bV/bV8G/sieDLZEtm1/xrr7fZvD/AIftsvcXlw5CKSqZYRhiASBlm+VcseAD5M/ZG+OXxd/4J7/tHaD/AME8f2gr2TxT4K8UyCPwHroYPdWqu2xLW4TO4RBsIP8Anm2NuYjiL+hWvx6/YD/YD8ZeGfGc37aX7aU66/8AGDX18yCCTD2+gW7jCwQKMqJgp2sy8RrlEJy7v+wtAH5E/wDBcv8A5Rx+Lv8Ar+0n/wBLIq/mM/4I+f8AJ59j/wBgm/8A/QBX9Of/AAXL/wCUcfi7/r+0n/0sir+Yz/gj5/yefY/9gm//APQBVw+JEVfgZ/WjRRRXaeUfm38S/wDlLT8Av+wTr/8A6RXVftpX4l/Ev/lLT8Av+wTr/wD6RXVftpXHV+Jnp0PgQUUUVmahRRRQAV/Jr/wSu/bn/a6+H/8AwWf+Ov8AwS7/AG1/HN/4vhgW4vPBc+qLEsqwWbfaYFQxohJudOuFmfO4AwcHrn+sqv4sf+DjXwzrP7Cf/BRL9m3/AILDeAbZ1t9O1SDQfEvkDHmizZpVQkdXu7CS7gJ/uRAUAfTn/BY39t79rfXv+CqP7PP/AATC/Ye8b33g3UfEjJf+LbvS1ieUWV7LkhvMSTabWztbi4IAGRIpPav2S+Pn/BXf/gmp+y58U2+CHx1+MOhaD4phKpcaezy3ElqzDIW5aCOVIGxziZkOCD3Ffzff8EY28Q/t7f8ABTL9rH/gsfaWr6naaIl54f8AAYmQ4kdotlvsBHyyR2FtAjjH/L0eCTX5A/8ABHb4V/HT9pD9m/44eO9P/Z68BfHa68RapdR+J/FfjfXLaw1TS/PgE7yRNcxs0GXaS4N0rKTIvJ/d0Af6Vuk/Eb4f694Dh+Keia5p934YuLP+0YtXhuY3sXs9u/zxOGMZi2fNv3bcc5xX5yeCv+C23/BKP4ifFe3+Cfg/44+HLvxDd3C2lvGZJYrWedztVI7uSNbV2duECyncSAMkjP8AIb468I/tefsmf8GvXjr4O+L/ABFpOsadJ8QrWytr3wxrlrrVnD4d1D7PPLbi4spJUVXvtxeMsCVnOflbB/YAf8E/f+CFb/8ABHb4FfEP9rHStA8IeFbjR/Dt6/i6xVbPVL3Vr+1DTRz3tvG9zL50plM0TEqmz+ARDaAem/8ABXT/AILtxfsQ/tyfB39j/wCG2s6JZWN74k0eT4mapexST3Oi6LNc2kkkapjy08+yleRpQJGVPuBXww/cnxl+3B+yT8PP2cNO/a68d+PtJ0j4b6xbwXVhrt3KYre6jul3QiFWAkkeRQSsaoXIBwvBr+PT/gtZ8HP2YfEf/BUf9gHUfA+iaVr/AIZ+ImqeG7fUb+4gS7bxHpQv9Mtrc380ql71WsyEzcFy0bYPBNdn/wAFbPhx8LvGn/Ben9k39hX41WNron7PlholgdL8OQKLLRWuZZ71FhWKPZEomlt7W1ZFA/d4UY3cgH9Sn7KP/BTj9gj9uDWrrwx+yz8T9H8WatZxmeXTojJbXvlKcGRbe5SKZkU/edUKjIyRkZk+M3/BTL9gz9nf4ka78Ifjd8T9H8M+JPDWmrq+pWN80kckFnIEKSE7CrF/MQIikuzMFVSTiv5Tv+C8XwG+AX7Dv/BRD9kH4mfsC+GtI8A/E7VfEJgn0rwvbRadHd2yXNnDbGW2t1VFExmnt2bZ++QsjbgmBF+05+zN8I/2s/8Ag7e034T/AB10eDxD4WXw9a6leaZdLvt7prLRnlhSVejRiYIzKeGC7SCCRQB/UrrX/BV7/gnV4c/Z00X9rLX/AItaJZeAPEc01tpWpztIjXs1u2yaOC3MYuJHibiRViJT+LFdH+yX/wAFMP2Ef26dSvdC/ZS+Jek+LtS06H7RcWEXm216kGQpl+zXMcUxjDMoLhCoJAJyRX87f/Ba3/gmJpt58WfgB/wwDrnw28P+K/htHcweHvhN4murG3h1RL26e6DWNheMYZzJN5okjdVVtuVcMmK8A/4J6/tPWvwj/wCCvfg34Tf8FFP2R9B+D/x78X2b2ejeK/CZlsbWRJIp4ld7CK4nspVuAkkL3ULsd4AYEDKAH25+zr/wcVfD341/8FgvFX7M/iTxZ4f0b4IWWjvpnhPUYYpnn17xHc3enxwbpmUsp2yXKRxqkacEuWIUj91f2tv+Cjv7D/7CkunWn7WHxI0rwdd6shmtLOcyXF5LECVMi21uks3l7gV8woEyCM5Ffyh/8E7v2W/2Z73/AIOh/wBo74W6h8PvDcvhvwh4cn1bQdJk0u2ay0y/gutEaK5tYDH5cEyGSQrJGqspdiDyaf8A8ErvhD8F/wBuP/guv+15rf7fujad458XeEtUvrTw5ofiWFL+1h0+31Ca1LRWtwGR1tYEto4iUIVZdw5YNQB/Yh+zf+1b+zh+1/4C/wCFnfsy+M9L8aaGspgkudNmEhhlHPlzRnEkT452yKrEEHGCDXxZff8ABcD/AIJP6d4as/F158cPD6WF/qcukQPmcs13CsbyKUERdVRZYy0jKI13AFs1/Pn/AME9/Cngv9mH/g6Q+Mf7N37GEcen/DG+8OyTa9o+nN/xLrK4itbWdlRFyi+RfStGijHk+c8S4AK186/8Gqf7AP7J/wC0z4T+Mnxo/aI8E6Z4z1TRfEen6fpJ1WETrY+SHuWkhB4WR3Me5+uEAHBYEA/sB/aq/wCCmf7Bn7Eerad4e/ak+J2keEtT1WJZ7awnMk940LHaJGgt0llSMnIDuqqcHng4+kfgj8d/g1+0n8OLH4u/ATxNp/i3wzqW77PqOmTrPCzIcMpKn5XU8MjAMp4IBr/Pz/Z70v8AaK/aJ/4LiftY+IrT4HeEf2gvF+k61rNiui+PNQgt7fTtKtr9rKKSCK6jkSXy4I4LdWC/JGwx9+v2m/4NvP2b/wBoH9mj4xftDaJ4ubwrpvgbxFq0eo2Phvwx4msvEEWg6jHPcRy2rrayPJCUiKQkyKrN5ADDctAH9X9FFFABRRRQB+H37E//ACdX+0z/ANjgv/oVzX6Y1+Z37E//ACdX+0z/ANjgv/oVzX6Y120vhR5uI/iMK+Ov+Cgf/JmHxE/7BL/+hrX2LXx1/wAFA/8AkzD4if8AYJf/ANDWqlsyIfEj+c7/AIJD/wDKRz4Xf9f11/6Rz1/oHV/n4/8ABIf/AJSOfC7/AK/rr/0jnr/QOrgPVPwm/wCCwH/Jxn7J3/ZQIf8A0qsK/VGvyu/4LAf8nGfsnf8AZQIf/Sqwr9UaACiiigAooooA+b/2o/2XPhn+1j8M5vh38RIWjljbz9O1GDi60+6H3ZoW6gg43L0YcHsR4n+wj+2B8UtF+MF5/wAE9/2v50vviFoFqbnRtfgbzI9c01F3K03JZLlYxuJYZdQS3zjdJz/7bv7bt98E77Tv2f8A9n/Tj4t+MHi0iDSdJgAlFqJQcXFwMgAAAsqsQCAWYiME17l/wT7/AOCfdj+yvY3/AMXfi5fjxb8XvFoM2u67MTKYjKQzW1szAERggbmwDIQOAoRFAPPP+C5X/KOPxd/1/aT/AOlkVfyu/wDBKb/k9bw5/wBeuo/+k0lf1Rf8Fyv+Ucfi7/r+0n/0sir+V3/glN/yet4c/wCvXUf/AEmkrWh/Ej6oa3P6z6KKK98sK9a+FX/Hxe/7qfzNeS1618Kv+Pi9/wB1P5mufF/wpf11E9j2aiiivDICiiigAooooAKKKKACiiigAooooAKKKKAKWo6daaraPY3yb436j09x7181eI9Ebw/qj2BkEg+8pB5wemR2Ne0eMfGMWgxGysyHu3HA6hAe59/QV8/TTS3ErTzsXdzlmJySTXqYGE0uZ7FRIqKKK9AoKKKKACvA/jd+yt+zP+0pDbQ/tB/D/wAPeNfsSsls+tadBeyQK3JETyozR577CM175Xxp8ZP2z/DXwl+Kg+D9h4X1zxTrAskvpI9HtxOURyRgrkMcAAkgFRuAznIHHjsdh8JT9riZqMb217vp1PWybIsdm1d4bL6TnNJyaVlaK3bbaSSuup7f8IfgB8Cv2ftGm8PfAnwZofgyxuSrTQaHp8FhHKyAhWcQIgdhk8tk8n1r8Gf2IP8Aglv8TfDf/BQf9qf4oftc+AtH1n4ZfFfU7q60eHUms9TgvEfUZLmNpLUmQoQjKw8xAVPTBFfqD/w3dq3/AER7x7/4Km/xo/4bu1b/AKI949/8FTf415EuJMqdv323lL/5E+j/AOIa8R/9Av8A5PT/APkz61+E3wX+EPwG8IR+APgj4X0rwjocTtKtho9pFZW/mNgM5SJVUu2BuYgscck1y/g/9l79mj4e+FvEHgbwD8O/DGh6J4tSSPXNP0/SLW2tdTSZGjkW7ijjVJw6OyMJAwKsQeCa+cv+G7tW/wCiPePf/BU3+NH/AA3dq3/RHvHv/gqb/Gr/ANZ8q/5/f+Sy/wAh/wDENeI/+gX/AMnp/wDyZ9S+G/gB8CPB3wwn+CPhDwToOleDLpJo5tAs9Nt4NLkS5JMqtaoiwsJCSXBTDZ5zXMfDL9kv9lz4L+ENW8AfCX4deG/Dmia/xqljp2l29vb3wwQBcIkYWYAMQA+4AHA44rwH/hu7Vv8Aoj3j3/wVN/jR/wAN3at/0R7x7/4Km/xpf6z5V/z+/wDJZf5B/wAQ14j/AOgX/wAnp/8AyZ6f8Mf2DP2JPgr4yX4ifCL4R+EPDWvREtFqGm6NaW1zCWGD5UiRhowR1CEA19ZV+f3/AA3dq3/RHvHv/gqb/Gum+GX7bvh74gfFrS/g3rXg7xH4X1XWYppbT+17UW6uIEeRuC27G1GwQpGRitKPEeWTnGlCsryaS0au3olstzLEeHfENGjUxFTCvkhFyk1KDtGKvJ2Um7JK702PtuiiivdPigooooAKKKKAP5MP+CrP/J63iP8A69dO/wDSaOv6y/8Agir/AMozPhp/3Gf/AE63lfyaf8FWf+T1vEf/AF66d/6TR1/WX/wRV/5RmfDT/uM/+nW8rwa/8SXqQ9z9TK+bv2gf2vf2bf2WP7MX4/eLLXw2+s+b9iSZZJXlEO3eQsSOwC7gCSAMnFfSNfgF/wAFD/D+geKv+Cqn7Ovh/wAUWNvqVhdadqizW11Es0MihJjhkcFWGQDyOtYiPtv/AIe8f8E4/wDoqFj/AOAt5/8AGKP+HvH/AATj/wCioWP/AIC3n/xiuq/4Zk/Zt/6J74a/8FNr/wDGqP8AhmT9m3/onvhr/wAFNr/8aoA5X/h7x/wTj/6KhY/+At5/8Yr83v8Agk/8Jvh98cf+Caj/AAu+KOmxaromq6pqUU8Ev++pV0Yco6HDI6kMrAEHNfqX/wAMyfs2/wDRPfDX/gptf/jVeqeHfDHhrwhpUeheE9PttLsYvuW9pEkES/REAUfgKAPxw+B3xx+J3/BJj4nWP7Nf7Sl9ca98D9euDF4V8VSgu+kO5J+zXOBwg6kDgDMkY270T+imxvrHVLGHU9MmS4trhFliliYOkiOMqysMggg5BBwRXx38WfhN8Pvjj8PtS+F3xR02LVdE1WLyp4JfzV0Yco6HDI6kMrAEHNfk18Dvjj8Tv+CTHxOsf2a/2lL64174H69cGLwr4qlBd9IdyT9mucDhB1IHAGZIxt3ogB/RnRVWxvrHVLGHU9MmS4trhFliliYOkiOMqysMggg5BBwRVqgAr+Or/g43/wCTo/A3/Yqj/wBK7iv7Fa/jq/4ON/8Ak6PwN/2Ko/8ASu4oA9l/4Ipf8msa/wD9jXdf+kdnX7AV+P8A/wAEUv8Ak1jX/wDsa7r/ANI7Ov2ArRHvYb+FEK+Of+CgP/Jnvjf/AK9oP/SiKvsavjn/AIKA/wDJnvjf/r2g/wDSiKvOzj/cMR/gn/6Sz6vgz/koMu/6/wBL/wBORPuj9kX/AJNQ+GH/AGKWi/8ApHFX0NXzz+yL/wAmofDD/sUtF/8ASOKvoatMF/u9P/CvyPjuIf8AkaYv/r5P/wBKZ85eKv2Qv2YfHPiK78XeMvAuj6pql/IZbi6ubZZZZXPdmYEnjgeg4HFc/wD8ML/sd/8ARNvD/wD4BR/4V9W0VMsvwrbbpRv/AIV/kXT4mzinFQhjaqitElUmkktklc+Uv+GF/wBjv/om3h//AMAo/wDCj/hhf9jv/om3h/8A8Ao/8K+raKX9nYT/AJ8x/wDAV/kX/rTnX/QdV/8ABk//AJI+Uv8Ahhf9jv8A6Jt4f/8AAKP/AAo/4YX/AGO/+ibeH/8AwCj/AMK+raKP7Own/PmP/gK/yD/WnOv+g6r/AODJ/wDyR8pf8ML/ALHf/RNvD/8A4BR/4Uf8ML/sd/8ARNvD/wD4BR/4V9W0Uf2dhP8AnzH/AMBX+Qf6051/0HVf/Bk//kjxv4afs8/A/wCDepXGsfCrwtp3h+5u4hDPJYwrCZIwQwVtuMgEZGeleyUUV0U6UKceWnFJdkrHlYvGYjFVHWxNSU5vrJuT+93Z+WH/AAWM/wCTLL7/ALC1h/6Ea+i/DH/Itaf/ANe0X/oAr50/4LGf8mWX3/YWsP8A0I19F+GP+Ra0/wD69ov/AEAV5WF/5GuI/wAFP85n6TU/5I3Lv+v+J/8ASaBuV9B+D/8AkW7X/dP/AKEa+fK+g/B//It2v+6f/QjXuSPg8f8AAvU6WiiioPJCiiigAooooAKp39ha6latZ3i70fqPT3HvVyqOo6jaaVaNe3jbUX8yfQe9A43uuXc8G8Q+HrrQLrY/zwv9x/X2PvXPVu6/r93r13503yxrwiDoo/x9TWFWh9BT5uVc+4V+Uf7VemXn7V/7a3w5/Ybdpv8AhFYYj4k8T/Z2ZfMhh3lIZCpBUERhAwPDTqRyor9XK/OX9ja1utU/4KxfHHX9SG2Wx0LT7OJSpyIpEtGG0k5AIiDEDhic0mc+Nk1Tsup+1+i6NpXhzR7Tw/oVulpY2EMdvbwRjakcUShURR2CqAAPStOiioPGCiiigAooooAKKKKAPxE/4OFf2ovj1+x7/wAEz/EXxv8A2bfEU3hbxVZ6xpFtDqEEUUzpFcXASRdsySJ8ynHK59K+6/8AgnH8TPHPxo/YA+Cvxd+J2oPq3iPxP4J0LVNTvZFVGuLu6s4pJZCqBUBd2JIVQBngCvyX/wCDqr/lDz4r/wCw/oX/AKVLX6W/8Ek/+UXH7O//AGTnw1/6QQ0Afj9/wc3ft3ftZ/sOeBvgrqv7KnjO48H3HibXr+01N7eC3nNxDDHAUU+fFKAAWb7uDzX9Rlfxd/8AB49/yTb9nj/sZ9T/APRVtX9olAH8L3/Byx/wUZ/4KHfsr/8ABQrwx8Gf2P8A4iar4W0a5+HMPiC60+wSBkaaC61Rrmc+ZG5yLe1GecYTpX6M/wDBQD/grb4+8Hf8G+Hgr9tj4Q682kfET4m2Hh/SbDULcIzwazKQ2pbFZWUlBa3aD5eDg44xXxx/wVY+GPh742f8HPHwA+DXi5d+leLfhbdaNerjObe/i8RwScHr8rmvwV/Yd1v4pftQ/G39mL/gi78RLKX7L8I/i1r+pazAfmiks7WSK7nhweQYjb6kCSMYnHfIoA/qH/4Nfv2zP2z/ANrPRvjtpH7ZvjLUPFur+CtX0nT7Zb9Ylazd1vFuEHlIg5eJc5z93iv6sq/j2/4NVf8AkqX7Y/8A2PVp/wCjtSr+wmgAooooAKKKKACiiigD8y9S/Y++J3xx/bVm+OP7Td5bXvgnwQ8L+CNFs5n8kz8SG5uoyP8AWIwGefnZVB/dqA3z3+2Ro8P7O3/BQ/4ZftF6UiW2l/EmNvCuvMJWQSXShUtpXQDk4MShjuTbDghDhz+3Ffjp/wAFvLGeD9knR/HGn7FvPDPirTtQgZgD8wSaPHQ5BLqSMjOOvGCFQlyyUj7joqOGaK4iWeBg6OAyspyCD0IPcGpK0Pogr+T/AP4K9f8AJ5V7/wBgqw/9BNf1gV/J/wD8Fev+Tyr3/sFWH/oJpPY48d/D+Z/T1/wQ0/5Rx+Ef+v7Vv/SyWv12r8if+CGn/KOPwj/1/at/6WS1+u1QeOfEvxb/AOCjn7E3wK8e33wv+KvxAsdJ17Tdn2q0MU8zRGRQ6hjFE6glWBxnIzzXm/8Aw94/4Jx/9FQsf/AW8/8AjFfnT8Ifhx8PPiJ/wV4/aLt/iBoOna7Ha22mtCuoWsV0sbNDACVEittJwM461+oH/DMn7Nv/AET3w1/4KbX/AONUAcr/AMPeP+Ccf/RULH/wFvP/AIxXw3/wUo/4KUfsQfGn9iDx/wDC/wCF/j+11fXtXtbaKzs4ra6VpWW6hcgF4VUYVSeSOlfod/wzJ+zb/wBE98Nf+Cm1/wDjVSw/s1fs520yXFv4A8NxyRsGVl0q1DKw5BBEfBFAHyxrH7Jnwz/a9/Yh8AeAvHqNa31r4b0q40nVrcf6Vp119kixJGeCVJAEkZIDgdmCssf7Ev7bXxM8AfEyL9gz9vOVbXx7aqqeHPEbsfsviS1+7H+8bANwQMKTgykFXAmBD/ojDDDbQpb26LHHGoVVUYVVHAAA6AV8xftZ/smfDP8Aa9+Gb+AvHqNa31qxuNJ1a3H+laddcYkjPBKkgCSMkBwOzBWUA/Sqivxh/Yl/ba+JngD4mRfsGft5yra+PbVVTw54jdj9l8SWv3Y/3jYBuCBhScGUgq4EwIf9nqACiiigAor5yv8A9rf9nSx+Melfs/w+KrK98YaxLJDDplm32mWNoY3lfzjGGWHCoTiQqT2Br6NrOnWp1L+zknZ2dnez7PzOvFYDE4ZQeJpShzrmjzJrmjdrmV91dNXWmjCivir/AIKBftF61+zL+zNq/jfwWw/4SnUpYNH0BCiyFtRvW2oQjAqxjQPIFYEHZggg1wH/AAT1/aH+KfxV0Txr8IP2iLuG7+Inw31ybTNUlhiSFbi3kLNbzqkaooVwrqpCjKqGPLGuOWZUY4tYN352r+XXS/dpN27I9ulwnjqmSzz6PL7GMuVq75/spzStbkUpxi3f4pJW3t+ilFZ9xq2lWl/BpV1dRRXV1uMELuFkk2DLbVJy20cnAOBWJonjzwN4m1K40bw5rNjqF5af6+C2uY5ZYv8AfVWJXqOoruc4p2bPnlQqOLkouy1vbptf7zq6Kxdf8R+HvCmmPrXim/ttNs4yA891KsMSk9Ms5AH51Bovi3wp4l0k6/4d1O0v7BQSbm2mSWEADJ+dSV4HPWjnjflvqJUajh7RRfLe17aX7X7nQ0VR03VNN1myTUtIuIru2lzslhcOjYJBwykg4II+tRaTrWja/afb9Cu4b2DJXzIJFkTI6jKkjIp3QnCSvdbb+Rp0VnabrGkayksuj3UN2sMjRSGF1kCSL1VtpOGGRkHkVgab8Q/AGs67J4X0jXNPu9Thz5lpDcxvOmOuY1YsOncUueOmu5SoVHzWi9N9Hp69jsKKz73VtK02WCDUbqK3e6fy4VkcIZHP8Kgkbj7DmqOheKvDHihZ38M6la6iLWQwzG1mSYRyL1VthO1h3B5p8yva+ovZT5efldu/Q3qK8b+N/wAfvhR+zl4VtfHHxk1QaNpF3exaet00byIk0ysyb/LViqnYcsRgd8Dmu68GeOfBfxG8PQeLPh/q1nrel3IzFd2M6XEL/R0JXI7jORUKtTc3SUlzLW19behvLAYmOHji5UpKlJtKVnytrdKVrXXVXudVRRRWhyBRRRQB/9f+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAV+Yfg74vfC74Lf8Fa/Fnin4ta/Y+HNNuPAEdrHc6hMsETzvc2jhAzEAsVRiB6A+lfp5XgvxK/Zd/Z6+MOvL4p+JnhHTtX1JYxF9pmi/elF6BmUgsB2znHataNRQldnDmGFliKXJF2d7nvH/DfX7FH/RU/DX/gxi/+Ko/4b6/Yo/6Kn4a/8GMX/wAVXyJ/wwL+xx/0T7Sv++G/+Ko/4YF/Y4/6J9pX/fDf/FV1fWo9jxf7CrfzL8f8j67/AOG+v2KP+ip+Gv8AwYxf/FUf8N9fsUf9FT8Nf+DGL/4qvkT/AIYF/Y4/6J9pX/fDf/FUf8MC/scf9E+0r/vhv/iqPrUewf2FW/mX4/5H13/w31+xR/0VPw1/4MYv/iqP+G+v2KP+ip+Gv/BjF/8AFV8if8MC/scf9E+0r/vhv/iqP+GBf2OP+ifaV/3w3/xVH1qPYP7CrfzL8f8AI+u/+G+v2KP+ip+Gv/BjF/8AFUf8N9fsUf8ARU/DX/gxi/8Aiq+RP+GBf2OP+ifaV/3w3/xVH/DAv7HH/RPtK/74b/4qj61HsH9hVv5l+P8AkfXf/DfX7FH/AEVPw1/4MYv/AIqj/hvr9ij/AKKn4a/8GMX/AMVXyJ/wwL+xx/0T7Sv++G/+Ko/4YF/Y4/6J9pX/AHw3/wAVR9aj2D+wq38y/H/I+u/+G+v2KP8Aoqfhr/wYxf8AxVH/AA31+xR/0VPw1/4MYv8A4qvkT/hgX9jj/on2lf8AfDf/ABVH/DAv7HH/AET7Sv8Avhv/AIqj61HsH9hVv5l+P+R8/wD7Lfjjwf8AEn/goD+0D428A6lb6vpF/wD2M1teWriSGVUhKEqw4IDKRx3Ffp7XkHws+APwY+CP2w/Cfw5ZaE2obPtLWseHkEedoZjkkDJwM45Nev1yVZqUro93BYd0aMacnqr/AJhRRRWZ1hRRRQAUUUUAFFFFABX5KftGWaftL/8ABQLwL+zlfF7nw14Ksm8S6xbKo2PPn92JMt8ynMKY25AlYdGJH611+YHwUja8/wCCo/xmvJ3Jaz0PSLeIcABJbe1c54yTuHH1+laU9LvyOTFrmUIPZyV/ld/ofp/RRRWZ1hRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/OR/wW3/5Kl4I/wCwVcf+jhX6t/8ABuP/AMmu+Of+xpP/AKSW9flJ/wAFt/8AkqXgj/sFXH/o4V+rf/BuP/ya745/7Gk/+klvXp0PgR8Vmf8AvU/66H3D/wAFWv2a/jX+0z8CPC2h/ASxtdT13wx4v07xCbS7uFtlmhtYbiMqrvhd26ZSQSvyhsHOAfmT/hM/+C13/RHvBn/g1X/5Mr91qK1OA/Cn/hM/+C13/RHvBn/g1X/5Mo/4TP8A4LXf9Ee8Gf8Ag1X/AOTK/daigD8WP2Dv2u/jV+0R43+J/wAKvj54a07w54i+G1/aWNwmmzNLEz3BuFdTl5ASjW5wyuQwboMZPpH7Yf7Yemfs3abp3gjwRpzeLPiX4sb7N4c8OW2Xlnlc7RNMFOUgQ5ycguQVUgB3T8ifAP7WH/DNP7Zf7UmheDdFn8U/EDxn4wtbDwvocCM32q6SW/3vIVxiKLehfBDHIAwNzp+0v7Cv7CupfBPUr/8AaO/aOv18WfGbxYu/U9TfDxadE4GLOzGAERBhWZQAQAq4QAEAP2Ff2FdS+CepX/7R37R1+viz4zeLF36nqb4eLTonAxZ2YwAiIMKzKACAFXCAA/phRRQAV+G//BwX/wAmH2n/AGNOn/8Aom5r9yK/Df8A4OC/+TD7T/sadP8A/RNzQB+L/wDwQC/5PH8S/wDYmXn/AKXWNf18V/IP/wAEAv8Ak8fxL/2Jl5/6XWNf18V8Xnn+9P0R62D/AIYUUUV451BRRRQB+LP/AAUt/wCT1/2TP+xl1D/0bp1fsdX44/8ABS3/AJPX/ZM/7GXUP/RunV+x1fc5P/ucPn+bPHxX8V/10CiiivTOcK/If/gqJ/wSd0T/AIKY+N/g34z1fxvP4Qb4Q6zcavFFDYLei/M8lpJ5bFpovKA+ygZAbO7pxz+vFFABRRRQAUUUUAFFFFABXNeM/wDkT9W/685//QDXS1zXjP8A5E/Vv+vOf/0A0Afmr/wRk/5MA8Lf9fmqf+lctfml/wAE0PhF/wAFF/HX7Ndjq37OfxR0bwX4PGoXka2dxp8N5cmZWy8hMtrJ95iAAJQAozjOc9F/wTi/Z1/br+JP7LGg+Jfgz8aovBPhWSW+S200aXFdSRSpcyCQlmUFg7bmyWJGduMAV+2n7Df7K3/DG37P1j8E5Na/4SCaC5uLuW8EH2ZS9w24qse+QgKABktk9cDOB4mZZrGnFxoy99Pt952YfDOTvNaHmX7B/wCyB8UP2Y9Q+IHjL4x+Lbbxb4h8f6nDqN3PaWv2VA8Qk3MQNq5dpD8qoqqAMZzgfoXRRXydatOrN1JvVnpQgorlWwUUUVkUfxw/8F3/APk9u0/7Fmw/9G3FfuL/AMG+f/JiF5/2NWof+ibavw6/4Lv/APJ7dp/2LNh/6NuK/cX/AIN8/wDkxC8/7GrUP/RNtX3+Xf7rT9Dxa/8AEkfuTX5kf8Fa/wBlf4q/te/slSfDL4MwwXWu2msWWpR208qwCdIg8bqruQikCXf8xAIUgckA/pvRXaYn4U/8Jn/wWu/6I94M/wDBqv8A8mUf8Jn/AMFrv+iPeDP/AAar/wDJlfutRQB+FP8Awmf/AAWu/wCiPeDP/Bqv/wAmV1v7F/7VX7Q3xf8AjT8SPgP+0l4a0nw7r3gFNOMkelSvKu69V3KszSSK2FCEFSMcg57ftTX8qnj39sLw/wDsh/8ABQf9pbVhp0+veKfEVxoNh4d0a3Rne9vTbAAHYCQqllyBlmJCqCTQB+pP7av7avg39kTwZbIls2v+Ndfb7N4f8P22XuLy4chFJVMsIwxAJAyzfKuWPHOfsB/sB+MvDPjOb9tL9tKddf8AjBr6+ZBBJh7fQLdxhYIFGVEwU7WZeI1yiE5d3P2A/wBgPxl4Z8ZzftpftpTrr/xg19fMggkw9voFu4wsECjKiYKdrMvEa5RCcu7/ALC0AFFFFAH5E/8ABcv/AJRx+Lv+v7Sf/SyKv5jP+CPn/J59j/2Cb/8A9AFf05/8Fy/+Ucfi7/r+0n/0sir+Yz/gj5/yefY/9gm//wDQBVw+JEVfgZ/WjRRRXaeUfm38S/8AlLT8Av8AsE6//wCkV1X7aV+JfxL/AOUtPwC/7BOv/wDpFdV+2lcdX4menQ+BBRRRWZqFFFFABXxf+33+wh8Ef+Cj37Nmp/svfH19QttD1G6tL1LzSZIob+1uLOQSJJA80U8asy7o23RNmN2AwSCPtCigD4h/4J8fsAfAv/gmp+zla/sy/s+yald6NBf3WpTXusSxTX91dXbAs8zwQwRkqipEu2JcIig5IJP5cftAf8G0X7Dvxk+Knin4n/DzxZ46+FUfjt2bxJovg/VYrTSdRWQlpA1vLbzYDuxYpuMQJO2MA1/RLRQB8IfC7/gmn+xn8Jf2Lbj/AIJ/eHPB8Nx8ML+1mttQ067keSW+a4IaWeecFZDOzgOJVKtGyr5ewIoH47eD/wDg1B/4J1+HfG+m6n4k8U+PvE/hHRrxr2z8I6pq0LaSsjtudWEVtHL5bcZCSI7AfM7c5/p4ooA/JT/gpT/wRq/ZZ/4Kb6J4Gsvidfa14P1H4ctKNC1DwvNDaS28E3lboNskMsflr5MZj2qrRsvykAsDV+PP/BE79in9pr9kfwN+yJ8cI9a161+HNqlroXiea7jHiS3CjDE3awhH8wY8xGiMbFVYpuVSP11ooA/DD9iL/g34/Yn/AGK/jtB+062q+Kfib4805dml6r4zv4746cApRWgSKGFfMCNtDyeYU6x7DX1K3/BLL9n1/wDgpUv/AAVNOseIf+Fgrpf9kjT/ALRbf2N5P2U2m7yvs32jf5Zzn7RjdzjHFfpVRQB+Xn/BRn/gkX+yb/wUzXw/rvxrGraB4t8Jn/iTeJ/Dd0tlqtom8SeWHeOWN0Eg3qHjJRslCpZifD/2Lf8AghH+yv8AshftCQ/taeIfFXjH4t/Eqyt2ttP1zxzqa6jJYI6sjG3VYo8MUdlDSNJtDHZtya/bOigD8Nf2iP8AggT+yV+0J+3an/BQM+KfGPhDxhPc2N5qVt4fv4LeyvptOEQjaRZLaV1DiGMTIrhZNucKxLHof28/+CD37Fn7eXxfj/aM1m68Q/Dv4jLCIZfEPg28j0+5ugg2K1wHilWR1T5PMAWQphSxVVA/amigD80f+Cc3/BJz9kT/AIJg+HNY0/8AZ4sb++1zxIytrHiLXbhbzVb0ISyI8iJFGkalidsUaBjy+5gDUn/BNX/gll+z7/wSy8E+KvAX7PuseIdYs/F+qJq14/iG4triVJkj8sLEba2tgEx2YMc96/SqigD8R/22P+CDP7I37ZPx7m/ap0zxB4t+FXxGvrcW2oa34I1FdOk1BNojzcK8UoLeWoQtGYywA378Cvq//gnZ/wAEyf2XP+CYvwu1D4a/s32d7LPrtwl3rOtatMtzqepTxgqjTyKkabYwzbEjREUsxxuZif0JooAKKKKACiiigD8Pv2J/+Tq/2mf+xwX/ANCua/TGvzO/Yn/5Or/aZ/7HBf8A0K5r9Ma7aXwo83EfxGFfHX/BQP8A5Mw+In/YJf8A9DWvsWvjr/goH/yZh8RP+wS//oa1UtmRD4kfznf8Eh/+Ujnwu/6/rr/0jnr/AEDq/wA/H/gkP/ykc+F3/X9df+kc9f6B1cB6p+RH/BVH9mL9o3466z8IPiT+zVpVnresfDjxEdYezvbhLaJ9jQyx7md0yu+AKwU7sNxjFeQf8Jn/AMFrv+iPeDP/AAar/wDJlfutRQB+FP8Awmf/AAWu/wCiPeDP/Bqv/wAmUf8ACZ/8Frv+iPeDP/Bqv/yZX7rUUAfj/wDsCftSfFH9p3wn4yk+MOjafomu+D/EdzoM8Omu7QlrZE3cuz5IcsNwbBGMAdTzf7bv7bt98E77Tv2f/wBn/Tj4t+MHi0iDSdJgAlFqJQcXFwMgAAAsqsQCAWYiME1+UvwU/bK8Q/AfU/jH8DvgVo0vif4s+OPidrUWg6bHGXSJWYKbmXOFKoQxAJA+Us5VFY1+5n/BPv8A4J92P7K9jf8Axd+Ll+PFvxe8Wgza7rsxMpiMpDNbWzMARGCBubAMhA4ChEUAP+Cff/BPux/ZXsb/AOLvxcvx4t+L3i0GbXddmJlMRlIZra2ZgCIwQNzYBkIHAUIi/plRRQB+RX/Bcr/lHH4u/wCv7Sf/AEsir+V3/glN/wAnreHP+vXUf/SaSv6ov+C5X/KOPxd/1/aT/wClkVfyu/8ABKb/AJPW8Of9euo/+k0la0P4kfVDW5/WfRRRXvlhW/oXiTUPDryPYBCZQA28Z6VgUUpRUlZgehf8LM8Rf3Yf++T/AI0f8LM8Rf3Yf++T/jXntFZfV6f8qCyPQv8AhZniL+7D/wB8n/Gj/hZniL+7D/3yf8a89oo+r0/5UFkehf8ACzPEX92H/vk/417Vos95daVBdX+PNlQO23p83I/SvliCPzp0h/vsB+dfXQAAwOAK4cbCEVFRViZC013SNDJIQqqMkngACnV5/wDEfUpLLQRbQnDXL7D/ALoGT/QVxU4c8lFdSTmNY+J10LoxaLGnlLkbpASW9xgjArI/4WZ4i/uw/wDfJ/xrz2ivaWGppW5S7I9C/wCFmeIv7sP/AHyf8aP+FmeIv7sP/fJ/xrz2in9Xp/yodkfRPgjxFf8AiG0nmvwgaNwo2DHBH1pnjHxjFoMRsrMh7txwOoQHuff0FeUaF4suPD2lz2tiv7+ZwQzDIUAenr+lcrNNLcStPOxd3OWYnJJNcywadRya93sK2oTTS3ErTzsXdzlmJySTUVFFd4wooooAKKKKAPyM/a9/4KBfCzUPhNrXg/4H+J7u38UrcwxRTW0M0BCxTKZdspUAAqpGQeQcdDXzboniT9mqx8Wr8UYP2lPFVl4mms1tZb1NEuDciI4YxGUPllBA/L0r9JP+CQHgXwR4n/Z+8XX/AIk0ax1GdPGd/GslzbxyuEFtaEKC6k4yScdMk1+r3/CovhR/0K+k/wDgFD/8RX5M8Hjs4UMdXqR1StG00lZvXSotdd/Q/ovGcWZFwfXxHD2Cw1b93OXNU56DlPmjC6fPh5+4uXSK6t3b0t/ON/wvj4X/APR2/jj/AMFN3/8AHKP+F8fC/wD6O38cf+Cm7/8Ajlf0c/8ACovhR/0K+k/+AUP/AMRR/wAKi+FH/Qr6T/4BQ/8AxFV/q3iv+fsf/Kv/AMtPL/4itlH/AECVf/LP/wCYj+cb/hfHwv8A+jt/HH/gpu//AI5R/wAL4+F//R2/jj/wU3f/AMcr+jn/AIVF8KP+hX0n/wAAof8A4ij/AIVF8KP+hX0n/wAAof8A4ij/AFbxX/P2P/lX/wCWh/xFbKP+gSr/AOWf/wAxH843/C+Phf8A9Hb+OP8AwU3f/wAco/4Xx8L/APo7fxx/4Kbv/wCOV/Rz/wAKi+FH/Qr6T/4BQ/8AxFH/AAqL4Uf9CvpP/gFD/wDEUf6t4r/n7H/yr/8ALQ/4itlH/QJV/wDLP/5iP53/AIgeKfHth+zPrv7SnwI/aS8VeLU8O31pZz2lzBNZ7ZbiRFG8Sucja24YVlPQnIIH1V+0bd3F/wD8FLfgjfXbb5ZvCt3I7YAyzQXpJwOOtfCviSGK3/ZA/aYggUJGnxCt1VVGAALzgADoBX3D+0D/AMpIfgZ/2KVz/wCk97Xl5dNupSv1nQdryav7aabXM21dJdT7rOKEKft0rNxpZhFS5KcZcrwVCajJ04U4vlc5WfL1P0Cooor9rP5OCiiigAooooA/kw/4Ks/8nreI/wDr107/ANJo6/rL/wCCKv8AyjM+Gn/cZ/8ATreV/Jp/wVZ/5PW8R/8AXrp3/pNHX9Zf/BFX/lGZ8NP+4z/6dbyvBr/xJepD3P1Mr8Gf28P+Utn7N3/Xhqn/AKBNX7zV+DP7eH/KWz9m7/rw1T/0CasRH6vUUUUAFFFFABXmHxm+Gfwy+L/wy1j4f/GKyt77w5fW7fbFuSESNEG7zA+QY2jxvWQEFCMgjFejXt7Z6bZzajqMyW9vbo0kssjBEREGWZmOAAAMkngCvxF8YeMPir/wVy+Kt7+zx+zze3Hh/wCB/h+4WPxV4qjUq+qupB+y2uRhgw5AIxgiSQbdiOAdr/wRg+KnxUb4jePv2cvA+o3Hjn4IeDpJF0DxReoYXgmLpts4iciVWVmfAwFCBwEWREP9C1eY/Bv4N/Df4A/DfS/hL8JdLi0fQtHiEVvbxD8Wd2PzPI7ZZ3YlmYkkk16dQAV/HV/wcb/8nR+Bv+xVH/pXcV/YrX8dX/Bxv/ydH4G/7FUf+ldxQB7L/wAEUv8Ak1jX/wDsa7r/ANI7Ov2Ar8f/APgil/yaxr//AGNd1/6R2dfsBWiPew38KIV8c/8ABQH/AJM98b/9e0H/AKURV9jV8c/8FAf+TPfG/wD17Qf+lEVednH+4Yj/AAT/APSWfV8Gf8lBl3/X+l/6cifdH7Iv/JqHww/7FLRf/SOKvoavnn9kX/k1D4Yf9ilov/pHFX0NWmC/3en/AIV+R8dxD/yNMX/18n/6Uz85Piv8c/8AgoN4a+Iur6F8Lvg9Y+IvD9tOVsdRfUobdriLAO4xvMGUg5HIGcZxg157/wANIf8ABUT/AKILp/8A4OLf/wCP1+rtFcM8srSk5LFVFfouSy8tYNnv4fi7A06UKcsmw0mkk5P293Zbu1dK73dklfZJH5Rf8NIf8FRP+iC6f/4OLf8A+P0f8NIf8FRP+iC6f/4OLf8A+P1+rtFT/ZVb/oMqf+U//kDb/XPAf9CPC/8Alx/80H5Rf8NIf8FRP+iC6f8A+Di3/wDj9H/DSH/BUT/ogun/APg4t/8A4/X6u0Uf2VW/6DKn/lP/AOQD/XPAf9CPC/8Alx/80H5Rf8NIf8FRP+iC6f8A+Di3/wDj9H/DSH/BUT/ogun/APg4t/8A4/X6u0Uf2VW/6DKn/lP/AOQD/XPAf9CPC/8Alx/80Hxr+zR8Uf2vPH3iTUbP9ov4d2vgnTre2D2s0F5HdtPMWAK/JK+0Bcnkc+vHP2VRRXpYajKlBQlNzfd2v+CS/A+UzXH08ZiXXpYeFGLt7kOblVu3PKctd3eT8rLQ/LD/AILGf8mWX3/YWsP/AEI19F+GP+Ra0/8A69ov/QBXzp/wWM/5Msvv+wtYf+hGvovwx/yLWn/9e0X/AKAK83C/8jXEf4Kf5zP0Cp/yRuXf9f8AE/8ApNA3K63T/Gmr6ZZx2NsI9kYwMgk88+tclRXunx84RkrSVzuv+Fha9/di/wC+T/jR/wALC17+7F/3yf8AGuFoosjP6vT/AJUd1/wsLXv7sX/fJ/xo/wCFha9/di/75P8AjXC0UWQfV6f8qO6/4WFr392L/vk/41e0zx1rV5qVvaSiLbLKiHCnOGIHrXm9XtMuI7PUre7lztilRzjrhSDSshSw9OztE+jNR1G00q0a9vG2ov5k+g968C1/X7vXrvzpvljXhEHRR/j6mjX9fu9eu/Om+WNeEQdFH+PqawqEjPDYZU1zS3CiiimdYV+Xt/4i0z9mP/grJ4f+I3ie9h07w98WNAl0e4uZ8xRJeWojCB3b5CS0VugYEFfMwQB8x/UKvlv9r79mDwz+1f8ABy8+HWrNHaalGRcaXqDJua1uU78EEo65Rxz8pyBuCkJmGJpe0g0tz9TKK/Gf9kP/AIKOyeHdaP7LP7dssXhLx9oKx20OrXkmyy1eMfKkplbCJI6gHcWCSHJBVvkH7JwzQ3MKXFu6yRyKGVlOVZTyCCOoNQeG007MlooooEFFFFABRRRQB8Vf8FAP2EfhF/wUe/Zt1D9lz436jrGleH9Su7S9luNDmhgvBJZyCRAr3EFxGFJHzZjJI6EV+DCf8Gev/BNqNBHH8QvioqqMADVtLAA/8FNf1eUUAfgz8av+DeH9i/47/sd/Cr9iXxl4q8cQ+FvhBPqU+j3lrfWK6lO2qStNL9qkeweJwrMQnlxR4GM5PNfFf/EHx/wTd/6KJ8Vf/Bvpf/ypr+rqigD8p9T/AOCQH7Nerftl/CH9uO613xP/AMJb8FvC9n4T0S1F1a/2fcWVlHdRJJdobQyvMRdyFmjmiUkLhRgg43wN/wCCLX7If7P3/BQzxZ/wUr8EXevy+OvF0mpTz2F3cWz6TbXGrMGuZreJLVJ1kch+XncYkfjkY/XGigD83P8Agn//AMEuvgB/wTh1/wCJfiL4Iax4g1Wf4qatHrGrLrlxbTpDPG07BbcW9tblUzcPkOZDwOeuf0joooAKKKKAPIvjb8d/hV+zp4I/4WN8YtWTRtHFzBaee6NJmW4baoCoGY45ZsA4VSTwDXeeFPFnhjx34cs/GHgvULfVdK1GITW13ayCWGWNujKykgj+tHivwn4Y8d+HLzwf400+31XStRiMNzaXUYlhljbqrKwII/rX4i+Pfh38Qv8Agk98SY/jZ8Hbq51P4Ca1fxJ4l8PzyNN/YbXcqx/abUHJwCyquMs+BHIWyjqAfu3RWH4Y8S6F4z8Naf4w8LXSXumatbRXlpcR8pNBOgeN19mUgj2NblABX47/APBbCS51j9mHw38M9LZvt/izxdpunQIAMMWSZuSxAADBf4hz7ZI/Yivwx+P2tyftVf8ABTnwx8MdPgW48MfA23bVdSmDfI2q3ipJEoKkgtG6wkKeQY5QaEXThzSUe5+k1FFFaH0IV/J//wAFev8Ak8q9/wCwVYf+gmv6wK/k/wD+CvX/ACeVe/8AYKsP/QTSexx47+H8z+nr/ghp/wAo4/CP/X9q3/pZLX67V+RP/BDT/lHH4R/6/tW/9LJa/XaoPHP5+v2cP+Uv37SX/Xppf/oqCv19r8gv2cP+Uv37SX/Xppf/AKKgr9faACiiigAooryv40/Gn4cfs+/DjUfir8VdRTTdH01Nzu3LyOfuxxr1eRzwqjkn2yQAfLv/AAUc+Gv7Nnjv9mzVNY/aRvhoVroQNzpmswgG9sr0j939mGQZGkICmEECQDqpUOvZf8Eg/jn+0p8fP2RrHxZ+0jYOLi2nNrpOrz5W41axjVds8qEckNlPNz+927iM5Z/gD9n79n74q/8ABWT4q2X7U/7U9lPonwZ0Sdn8K+FXYr/aW0486bGN0bY+d/8Alp9xMICT/SDY2NjpdjDpmmQpb21uixRRRKESNEGFVVGAAAMAAYAoAtV/O3+1v4m/aeT4667p37bN94u8OfAz7ZOum3HgSCNrWWy8xhEdSnjZ50DRhfMR1OWzsUDBr+iSmuiyKUcBlYYIPIINedmeXvF01BVHGzv5PyktLryuj6rhLiaOS4mdeWGjV5la7spw/vUpNSUJ/wB5xlp0Phn9ifwZ+wZpHg8at+xhFoVxD5YW4u7NhPqOG7XDyk3Kk9dkm3HYCvuivkmD9hv9mXSvjfpX7RHhHw3D4e8VaVJK/n6UTaRXImjaNxPAmInyHLFtocsAS1fV91LJBbSTwxNO6KWWNCAzkDhQWIXJ6DJA9TV4ClUpUvZ1IRjbbk2a72tp6a+pzcSYvDYzGfWcNXq1edXk61nNSu9HNSamrWalaO9uVW1/n+/b6/am+CMP/BRL4bfDj41awdP8HfC5T4g1LZBLcmXV5kElpEY4Uc/uwIpMkY2u4PUV55pn7c/7NkH/AAVN8N/GT4E6+17oPxJ0+Lw74mSS1ntBHeBhHaznz0QHJWFSwztVXJI3V+jv/BOr9nn4vfDVviL8cf2jtMXS/HnxH1+W9uLUTxXX2exiz9niEkLyJgF3wA33QgPIr0T/AIKNfsy6r+1V+yxrXgDwjAJvE1hJFquhgusR+22pOFDuVVTJG0kYZmVQWBJAFfMTwOPqUZ42LSm5e0UXF83u6Rjfm0vFWty9WvM/XaHEXDmFx9Dh+rGUqMaP1WdaNaHsf3vvVKvJ7J3UasuZSVXVQi9lY+Mf+Ck/gBvip+25+zl8OWv7rTrfWX161u5rKUwTtZvHCLmJZFwy+dDviJHO1jXn/wC3r+yz8FP2OZvhL+0F+zHoy+D9esPGumaTK1jLKEubS5WVnSVWZt+fK2kn7yuwbPGPoTVfgz+1T8U/jd+zD8ZviF4YNpe+C7PVE8Xsby0f7LdTQJCrgJM3mCd0LgRb9oYBsGvYP+ClPwJ+Kvx/+Fngrw58JNK/ta90nxpperXcfnwweXZ2yTiSTMzxq20uvyqSxzwDzVYnA+2p4zEKi+dyi4Xi+bSENuqad07dVZ7EZVxF9RxWRZW8dFYeFOrCso1F7N3rYhNTs+VpxcXHm05ZKS+K7+TP+CkHhPWNJ/ao8F/Gz40eAdW+J3wd0jRZrabS9KU3AsdUeRy1zNbhgHBjMaguUQ4ALZUBr/7CsX7AXj39oPVfHX7IniW40D+1dGez1nwDcRPbwXHzEtP5UpKsyAhSIWZUGegdgfqH9pa0/bj+G3x60r44/s52w8f+En05rDVfBk17FYFZt24XUEso27iAoPVhggAhzt8b+HXwM+Pnx/8A22/C/wC2B8V/h/a/CrT/AAbYXUEVsL6G91PV5ruOSIGdrYBUjiEh4f5u3Ib5XUw8o49zhTcm5ptSg9tE5RqLSyX2ZX7W2IwuZ06nDSo18VGnCOHnFOnXjZyTlKNKphJ3k5ylZe1pqNrqfM7NnzZ8Evi9d/sg/sUftFfA2/uGj1L4R6rqFhpBY/MLbXCV06QDr80ztJ9DVb9hPxvrH7Avwp+O/wAEfiLLm/8Ah5p1l4ttUl4E0upWCFo0/wBkTrFH/vP65r2L9r39hX4z/FX9uPw94++H1is3w98VSaLL42Yzwx5bRJyybo3dZH3whEXYj4I54pv/AAUM/YU+Nn7QP7T3hXxb8KLUt4W8U2FpoHjiVLiGHy9Ps7+K7DlJHV5GIA2+UrN+6AOAeeOWGxtF+0pU23R9yCt8UZcyv6JOnd9OVnu0c24fx8fquMxNOMceliK7bX7upS9k3F9pSccTyxdnL2sOrV/lz4maj44/ZO/4Ja/DL4eaTe32ma98XdahuNev7JXbUPI1XdczeWEIYzmLyYSvVgGXqa5r4sWv/BPcfBK50L9n74aeOPDHjfRrU3Hh/XbbRr2G+XUYF3RNLcBtzB3ADkg7QSVAIGP2g/bq/ZS1X9pz4J2Phf4c38Wh+KfCmpWut+HbmQYgivLPIRH2qxCFWIGFO1gpwQMH5j8YfGH/AIKofErwK3wh8OfB+08FeJdQhFrd+K31y2lsbQNw9xBDHulDEZKjLtGcHDGrxmWypVJUpRbhyRjD9257JppNP3ZN63dr6O+mmORcWU8bhqWMo1IwrPEValZPExw696ScZSjKLdamoe4ox5mrOPJ76v8AIn7ZPiP4j/tHfs5fssXfi2S70HxT4s8S2em3syIbW5hup/8ARJJVVgDGxOXXjjIxxiv2Y/Zy/Y3/AGdv2Thqh+BOgf2M+tJbJeu1xNcvN9lDhDmZ3K/fYkLgEnOK+T/2nf2Yvjp4wH7OdhoUk/jO6+H/AIv0nU/EerXE0FvI0Ns8bT3JSR0LZIYiOPewGAAe/wCp1ezlmAti6tavC80oJSa1+BKVn57Oz8j4Li3iXnyXB5fl1dRoSlXc6cJPls67lTU46NpKzgpxTS1SV2c94r0rwprfhy803xxbWl3pEkTfaor5EktmiHJ8xZAUKjqd3Ffzl/HeL9kHwP8AEW5h/wCCaet+J7b4pSkn+z/h2raho8jg8G8jc/ZvJB6iJyidWSv3h/aD/Z1+Gf7T3giD4cfFyG4u9Eivob6S2gne3E7QBgqSNGQ5j+bJCspyBzxXX/DH4RfC74L+G08IfCfQLHw9pqY/cWMKwhiP4nIGXb1ZiWPc10Zll9TFzULRjFfa1c1/h25fW79DzOE+J8LklCVbnq1KknrRTUaEl09rfn9on/JyR2Xv9vLf2Rb79pXUfgVpN1+1pa2ln41Jk+1R2nl48vd+7L+UzRiQr94IduegFfS9FFerQpezpxp8zdla71b835nxmYYtYrE1cSqcYc8m+WCtGN3e0Vd2S2SvsFFFFanGf//Q/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfmJ8C/+Unfxw/7BWif+kttX6d1+YnwL/wCUnfxw/wCwVon/AKS21aU9pehy4n4qX+L/ANtkfp3RRRWZ1BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/OR/wW3/5Kl4I/wCwVcf+jhX6t/8ABuP/AMmu+Of+xpP/AKSW9flJ/wAFt/8AkqXgj/sFXH/o4V+rf/BuP/ya745/7Gk/+klvXp0PgR8Vmf8AvU/66H9DlFFFanAFFFFAHx18IP2Ff2fvgt8ffGX7TPhmxnu/GHjW6luri8vnWb7J55zLHagIvlpI3LZLOem7bha+xaKKACiiigAr8N/+Dgv/AJMPtP8AsadP/wDRNzX7kV+G/wDwcF/8mH2n/Y06f/6JuaAPxf8A+CAX/J4/iX/sTLz/ANLrGv6+K/kH/wCCAX/J4/iX/sTLz/0usa/r4r4vPP8Aen6I9bB/wwooorxzqCiiigD8Wf8Agpb/AMnr/smf9jLqH/o3Tq/Y6vxz/wCCq2g/FDTfjX+z/wDHTwN4N1nxjpngPWb++1WLRbV7qaKIvZSDKoDt3LDJtZsJlcFhkV0Phf8A4LR/sa396NL+Ig1/wRdBN0kesaZIdrAkFcWpnc8ggEqPfByB9vk0k8JBJ66/mzyMUn7Rv+tj9a6K+LfDf/BRb9hvxUqvpnxP0KIMwUfbLj7Gckkci4EeBxyTwByeCK9dh/ai/ZnuYUuLf4i+GJI5FDKy6vaFWU8ggiXkGvVOY91orxTUv2lf2c9GaVNY8f8Ahu0aBd0gm1W1jKLjOW3SDAxzz2rwbx9/wUq/YW+HMMsutfErSLxo1B2aVI2pli3QL9kWUE+vOB3IoA+5KK/Hq9/4K3WHxFkXSP2RPhT4s+JF9IjFZhbGzsUIKqS0oEzALuO4siDO1d3zZDIfCH/BYD9pVdvirWNA+B2iTeU3l6eg1DVNokOQSHkUHb8zbZYs4RMDMmOeti6NL+JNL+uxpGlOXwo/VXxx8R/h58MdI/4SD4la9p3h6w3BftOp3UVpDuJAA3ysq5JIHXqa/N74j/8ABYf9kHwnqknhj4dzap8QNZMW6C10CzaVZJCpbaJJPLBCgZdkD7QehIKhngL/AII3fs02mrQ+MPj5quvfFLxAG3zXeu30nlO+8v8A6uNg5XcSSsksgYk5yCRX6W/Df4S/C/4PaDH4Y+Ffh/T/AA9YRosfk2FukAYJkjcVALnLMSzEkliSckmvIrcQUo6U4t/gv6+R0wwUn8TsflW/7XH/AAU0+KM003wQ/Z4Gh2PlL5U/iy+W3l3NuIZ4He1kwQMGNclTglgGFWbX4f8A/BaT4heZca3408D+AYZnLBLC0a9ni29FVZoZ4yjerSlhX7G0V5tTPsRL4UkdEcFTW5+Nf/Dvz9vvW9Oz4i/ap1a1uZ/mmjs9IwiNnOEdbuFsfRV44xip5v8Agl/+0Bq8z/8ACTftP+PbiF4jGY7eeW2BB/vAXTKRgkHK5PrgYr9jaK5nm+Lf2/wX+Rf1Wl2Pmz9kn9mvQP2SfgZpfwN8Nalcata6ZLcyi6uVVJHa5laU/KvAA3YHXpmvpOiivPnOU5OUnqzdJJWQUUUVIwooooA/jh/4Lv8A/J7dp/2LNh/6NuK/cX/g3z/5MQvP+xq1D/0TbV+HX/Bd/wD5PbtP+xZsP/RtxX7i/wDBvn/yYhef9jVqH/om2r7/AC7/AHWn6Hi1/wCJI/cmiiiu0xCiiigAr4v8OfsD/s6eHP2s9c/bRGnz33jXW0iVWvJFltrJ0iWFpbaPYCkkiKAzMzEDITYGYH7QooAKKKKACiiigD8if+C5f/KOPxd/1/aT/wClkVfzGf8ABHz/AJPPsf8AsE3/AP6AK/pz/wCC5f8Ayjj8Xf8AX9pP/pZFX8xn/BHz/k8+x/7BN/8A+gCrh8SIq/Az+tGiiiu08o/Nv4l/8pafgF/2Cdf/APSK6r9tK/Ev4l/8pafgF/2Cdf8A/SK6r9tK46vxM9Oh8CCiiiszUKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/D79if/AJOr/aZ/7HBf/Qrmv0xr8zv2J/8Ak6v9pn/scF/9Cua/TGu2l8KPNxH8RhXx1/wUD/5Mw+In/YJf/wBDWvsWvjr/AIKB/wDJmHxE/wCwS/8A6GtVLZkQ+JH853/BIf8A5SOfC7/r+uv/AEjnr/QOr/Px/wCCQ/8Aykc+F3/X9df+kc9f6B1cB6oUUUUAFFFFAHxV+zr+wH+zv+zH8VPGXxr8AWdzd+JvG1/c3tzfajIk8lrHdyGZ7a1KonlwbznB3SNgb3bauPtWiigAooooA/Ir/guV/wAo4/F3/X9pP/pZFX8rv/BKb/k9bw5/166j/wCk0lf1Rf8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK1ofxI+qGtz+s+iiivfLCiiigAooooAKKKKANLRv+Qxaf9do/wD0IV9XV8o6N/yGLT/rtH/6EK+rq8zMN4kyCvJfir/x72X+8/8AIV61XkvxV/497L/ef+Qrnwn8WP8AXQS3PGaKKK9ssKKKKACiiigAooooAKKKKACiiigD5I/4Iyf8m5+MP+x21D/0ls6/XevyI/4Iyf8AJufjD/sdtQ/9JbOv13r4Hh3/AJFtD0/Vn3vip/yVmY/4/wD21BRRRXtH58FFFFABRRRQB/LB4q/5NF/aa/7KHB/6W19u/tA/8pIfgZ/2KVz/AOk97XxF4q/5NF/aa/7KHB/6W19u/tA/8pIfgZ/2KVz/AOk97X5tlv8AEpf46H/p+of13nm+I/694/8A9V+FP0Cooor9tP5ICiiigAooooA/kw/4Ks/8nreI/wDr107/ANJo6/rL/wCCKv8AyjM+Gn/cZ/8ATreV/Jp/wVZ/5PW8R/8AXrp3/pNHX9Zf/BFX/lGZ8NP+4z/6dbyvBr/xJepD3P1Mr84/20/+CdPh/wDbC+IXhb4sW/jjXvA3iLwnBNbWd5orrG4jmJLEMNsiPyRuV8FSRiv0corER+J//Dov4rf9HQ/E3/wZTf8Ax6j/AIdF/Fb/AKOh+Jv/AIMpv/j1fthRQB+J/wDw6L+K3/R0PxN/8GU3/wAerl/+CRXxO8Y+O/2Jbfx18WfEN5rN3Fqeo+dqGr3b3EiwwkH5pZmYhEGepwBX7sV/FV/wTt+GX7Sv7cnwVsP2PPBMs/hP4U6RqE974w8QRDEt4Z3DrYwE8MxQAleVGd8mQERwD9CvGHjD4q/8Fcvire/s8fs83tx4f+B/h+4WPxV4qjUq+qupB+y2uRhgw5AIxgiSQbdiP+/vwb+Dfw3+APw30v4S/CXS4tH0LR4hFb28Q/Fndj8zyO2Wd2JZmJJJNHwb+Dfw3+APw30v4S/CXS4tH0LR4hFb28Q/Fndj8zyO2Wd2JZmJJJNenUAFFFFABX8dX/Bxv/ydH4G/7FUf+ldxX9itfx1f8HG//J0fgb/sVR/6V3FAHsv/AARS/wCTWNf/AOxruv8A0js6/YCvx/8A+CKX/JrGv/8AY13X/pHZ1+wFaI97DfwohXxz/wAFAf8Akz3xv/17Qf8ApRFX2NXxz/wUB/5M98b/APXtB/6URV52cf7hiP8ABP8A9JZ9XwZ/yUGXf9f6X/pyJ90fsi/8mofDD/sUtF/9I4q+hq+ef2Rf+TUPhh/2KWi/+kcVfQ1aYL/d6f8AhX5Hx3EP/I0xf/Xyf/pTCivzm+LP/BM34P8Axg+I2rfEzXPFfi7T7vWJvPlt9P1CKG2RsAERobdiAcZOWPJNed/8OhPgV/0PHjr/AMGsP/yLXDPFY9Sajhk10fPa/wD5Ke/h8m4ZnShKtm04zaV19Xbs7aq/tFez0vZXP1dor8ov+HQnwK/6Hjx1/wCDWH/5Fo/4dCfAr/oePHX/AINYf/kWp+uZj/0Cr/wYv/kTb+w+Ff8AocT/APCaX/y0/V2ivyi/4dCfAr/oePHX/g1h/wDkWj/h0J8Cv+h48df+DWH/AORaPrmY/wDQKv8AwYv/AJEP7D4V/wChxP8A8Jpf/LT9XaK/KL/h0J8Cv+h48df+DWH/AORaP+HQnwK/6Hjx1/4NYf8A5Fo+uZj/ANAq/wDBi/8AkQ/sPhX/AKHE/wDwml/8tP1dor42/Zo/Yk+HP7LniPUfE/g3XvEGs3GpWwtXXWruO5SNAwfKBIYypJAzyQRX2TXpYadWdNSrQ5Zdr3/GyPk81w+Do4h08BXdWnpaThyN6a+7eVrbb6n5Yf8ABYz/AJMsvv8AsLWH/oRr6L8Mf8i1p/8A17Rf+gCvnT/gsZ/yZZff9haw/wDQjX0X4Y/5FrT/APr2i/8AQBXm4X/ka4j/AAU/zmfoNT/kjcu/6/4n/wBJoG5RRRXunyIUUUUAFFFFABRRRQAUUUUAFFFFABXP+LPFGjeCPCup+NPEcvkadpFpNe3UmM7IbdDI7Y74VSa6Cvkf9vO6ns/2OfiJNbNtY6PMhOM/LIQrDn1BIoJk7Js+V/2GP2SvAv7d2i+N/wBsD9q3Rv7Zi8eXc1j4ftJZpF+wabZyFN0LRspRxInlhhgjy37SMD7nbf8ABHfRfB7C1+Dnxl8eeFbBZfOS1gvxtRgFClfKEGCu0AEgnAAzxk/dP7Cuh6b4e/Yw+FdhpMaxRSeFdKuWVQFBlurdJpDgADLO7EnqScnJya+rKzPnm23dlHTLWax023sriZriSGJEaVvvOygAsck8nr1NXqKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVzXjLwb4V+IXhW/8ABHjewh1TSNUha3urW4XfHLG/UEH9D1B5HNdLRQB+RX/BMTxF4g+Fvir4l/sI+Mr2a+n+GGph9HnuFl8ybSbwl4iS7FV2qUYIqogEnybxkj9da/CT47fGT4a/shf8Fe7f4pfEvVF0jQfFfgAR6hdPA8oR1ndUUCJWkYk2cX3VZucYx03/ABd/wVJ+K/x+uz4I/wCCe3w+vNcmdQs/iXXovs2m2m7rtXcAzAZI8yRTuUgRSDqDUW3ZH2D+3n+2hpn7LvgaPwp4JU6v8TPFKm28N6PBH58zTSHYs8kYOREjdM/6xxtAIDlfBf2IP2aNV/Zw+FlzH45uV1Hxj4nvH1XXrwHeXuZeQm88sEycnoXZiODWP+zB+xw3wl8RXfxp+NeuTeO/ibqoK3Ot3jPJ9njYBfKtxISVUKNu7Cnb8qhU+WvuWrSPWwuG5PeluFFFFM7Qr+T/AP4K9f8AJ5V7/wBgqw/9BNf1gV/J/wD8Fev+Tyr3/sFWH/oJpPY48d/D+Z/T1/wQ0/5Rx+Ef+v7Vv/SyWv12r8if+CGn/KOPwj/1/at/6WS1+u1QeOfkP8cf+CTdl8UP2ivE/wC0f8PPiz4s+HuqeLRb/b4NCn8hWNvEkQ+dGRyrbA+1iQGJxgYA4f8A4dF/Fb/o6H4m/wDgym/+PV+2FFAH4n/8Oi/it/0dD8Tf/BlN/wDHq+Wf21/2Cfjj+y5+y94t+Pfhz9pL4japeeHIIJo7W51S4WKXzJ44iGKzhhw5II7+tf0rV+bv/BXj/lHH8Uf+vG1/9LIKAMjRv2gvBvwg/Y+8M/HX45az9ntY/Dum3V3dTHfNc3E1sjbUHWSWVycKOST6ZI/O39n79n74q/8ABWT4q2X7U/7U9lPonwZ0Sdn8K+FXYr/aW0486bGN0bY+d/8Alp9xMICT59+xH+yb8Yf+CkI8GfGj9ri3fS/hD4IsLSy8NeGgWVNVe0iSI3EucExOUyzkAyfcTCAk/wBQVjY2Ol2MOmaZClvbW6LFFFEoRI0QYVVUYAAAwABgCgAsbGx0uxh0zTIUt7a3RYooolCJGiDCqqjAAAGAAMAVaoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9H+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV+YnwL/5Sd/HD/sFaJ/6S21fp3X5ifAv/AJSd/HD/ALBWif8ApLbVpT2l6HLifipf4v8A22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/Bbf/kqXgj/ALBVx/6OFfq3/wAG5H/Jrvjk/wDU0n/0kt6/KT/gtv8A8lS8Ef8AYKuP/Rwr9XP+Dcj/AJNc8c/9jUf/AEkt69Oh8CPisz/3qf8AXQ/obooorU4AooooAKKKKACiiigAr8N/+Dgv/kxCz/7GnT//AETc1+5Ffht/wcGf8mIWf/Y1af8A+ibmgD8YP+CAX/J4/iX/ALEy8/8AS6xr+viv5B/+CAX/ACeP4l/7Ey8/9LrGv6+K+Lzz/en6I9bB/wAMKKKK8c6gooooAK57xJ4R8J+MrBtK8X6XaaraupVobyFJ4yrYyCrgjBwM8dq6GimnbVAfI3in9gb9irxkk6638LvDYa4UiR7bT4rSQ5JJO+BY2DEnlgQ3vXkGof8ABJX/AIJ56lCILn4b26qG3Ziv76Js890uFOOemcV+jFFbRxVaO02vmyHTg90j84tO/wCCSH/BPHS9/wBm+HELb8Z87UL+bp6eZctjr2xmvd/A37D/AOx/8Nrv+0fBvw18PWt0GLLO9hFPMhKlTsklDugKkghSAQea+pqKJYqtL4pt/NgqcFskRQQQ20KW1sixxxqFVVGFVRwAAOgFS0UVgWFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfxw/8ABd//AJPbtP8AsWbD/wBG3FfuL/wb5/8AJiF5/wBjVqH/AKJtq/Dr/gu//wAnt2n/AGLNh/6NuK/cX/g3z/5MQvP+xq1D/wBE21ff5d/utP0PFr/xJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkT/AMFy/wDlHH4u/wCv7Sf/AEsir+Yz/gj5/wAnn2P/AGCb/wD9AFf05/8ABcv/AJRx+Lv+v7Sf/SyKv5jP+CPn/J59j/2Cb/8A9AFXD4kRV+Bn9aNFFFdp5R+bfxL/AOUtPwC/7BOv/wDpFdV+2lfiX8S/+UtPwC/7BOv/APpFdV+2lcdX4menQ+BBRRRWZqFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfh9+xP/wAnV/tM/wDY4L/6Fc1+mNfmd+xP/wAnV/tM/wDY4L/6Fc1+mNdtL4UebiP4jCvjr/goH/yZh8RP+wS//oa19i18df8ABQP/AJMw+In/AGCX/wDQ1qpbMiHxI/nO/wCCQ/8Aykc+F3/X9df+kc9f6B1f5+P/AASH/wCUjnwu/wCv66/9I56/0Dq4D1QooooAKKKKACiiigAooooA/Ir/AILlf8o4/F3/AF/aT/6WRV/K7/wSm/5PW8Of9euo/wDpNJX9UX/Bcr/lHH4u/wCv7Sf/AEsir+V3/glN/wAnreHP+vXUf/SaStaH8SPqhrc/rPooor3ywooooAKKKKACiiigDS0b/kMWn/XaP/0IV9XV8o6N/wAhi0/67R/+hCvq6vMzDeJMgryX4q/8e9l/vP8AyFetV5L8Vf8Aj3sv95/5CufCfxY/10EtzxmiiivbLCiiigAooooAKKKKACiiigAooooA+SP+CMn/ACbn4w/7HbUP/SWzr9d6/Ij/AIIyf8m5+MP+x21D/wBJbOv13r4Hh3/kW0PT9Wfe+Kn/ACVmY/4//bUFFFRzTQ28LXFwwSNAWZmOAAOSST0Ar2j8+SJKK+OvjD+33+yR8DpZNP8AGnjOym1CMsjWWmk39wrp1R1gDiJvaUpXx/qf/BTj4qfElC/7K3wc1nX7GSNjFqusMLK2ZxkfKq7kkUHB/wBerEcYBOR5lbOMHTn7Pn5p/wAsU5S+6N2fY5dwBn2MpLExwrhRf/Lyq40qfynUcYv5Nn7C0V+Ll146/wCCsPxCV5kvvB/gOMuwVIomupgpBA++t1GcHB5I5PTHy1mv8Gf+CgWuypP4i+P01qxLs4stMiUAt6BGhBHTggBe3u1jMVP+Fg6j9VGP/pUk/wADt/1JwlL/AHvOcLDyjKrVf/lOlKP3SPzA8a/Fiyh8BfHT9nHTtG1bUte8WeOXu7KSztxNbhbS7LOrkN5m8gfKFjb3Ir9T/gz+wz8Ofhr8QtH+NU2ueItZ1/T7VkiGr3aTpF58bI4wIUfgSOApbAJJxnmvQP2W/wBmqX9nHRtdh1TxDN4m1PxFqDaheXssIg3SMP7m+Q7iSxZi5yT0Hf6lrPh3hRUVHE5hFOorcsWl7lpSktU2m7u9+h9hx54m/WHUy3IJuOHlzc803++5qVOnL3ZRjKEbQtbrdt72Ciiivuj8VCiiigAooooA/kw/4Ks/8nreI/8Ar107/wBJo6/rL/4Iq/8AKMz4af8AcZ/9Ot5X8mn/AAVZ/wCT1vEf/Xrp3/pNHX9Zf/BFX/lGZ8NP+4z/AOnW8rwa/wDEl6kPc/UyiiisRBRRRQAVi6B4b8O+FdPGkeF7C2020DFhDaxLDGGbqdqADJ7nFbVFABRRRQAUUUUAFfx1f8HG/wDydH4G/wCxVH/pXcV/YrX8dX/Bxv8A8nR+Bv8AsVR/6V3FAHsv/BFL/k1jX/8Asa7r/wBI7Ov2Ar8f/wDgil/yaxr/AP2Nd1/6R2dfsBWiPew38KIV8c/8FAf+TPfG/wD17Qf+lEVfY1fHP/BQH/kz3xv/ANe0H/pRFXnZx/uGI/wT/wDSWfV8Gf8AJQZd/wBf6X/pyJ90fsi/8mofDD/sUtF/9I4q+hq+ef2Rf+TUPhh/2KWi/wDpHFX0NWmC/wB3p/4V+R8dxD/yNMX/ANfJ/wDpTCivzm+LP/BTr4DfBz4jat8MfE2ieJbm/wBGm8iaWzsY5YGbAOUczKSOfQc153/w+G/Zp/6F3xd/4LY//kiuGefZfCThKsk1oz38P4b8T16UK9HL6jhJJppaNNXT36o/V2ivyi/4fDfs0/8AQu+Lv/BbH/8AJFH/AA+G/Zp/6F3xd/4LY/8A5Iqf9Yct/wCf8Tb/AIhfxX/0Lqn3L/M/V2ivyi/4fDfs0/8AQu+Lv/BbH/8AJFH/AA+G/Zp/6F3xd/4LY/8A5Io/1hy3/n/EP+IX8V/9C6p9y/zP1dor8ov+Hw37NP8A0Lvi7/wWx/8AyRR/w+G/Zp/6F3xd/wCC2P8A+SKP9Yct/wCf8Q/4hfxX/wBC6p9y/wAz9XaK+Nv2aP24fhR+1T4j1Hwx8PtM1qwuNMthdStqlqlujIzBMIVlck5PPGMV9k16WGxNLEU1Voy5o90fJ5rlGMyzEPCY+k6dVWbi99Vdfej8sP8AgsZ/yZZff9haw/8AQjX0X4Y/5FrT/wDr2i/9AFfOn/BYz/kyy+/7C1h/6Ea+i/DH/Itaf/17Rf8AoArzcL/yNcR/gp/nM/Qan/JG5d/1/wAT/wCk0Dcooor3T5EKKKKACiiigAooooAKKKKACiiigArxf9ov4ZyfGT4FeLPhhbyPHPrOmT28DJtyJtuY/vELjeFyCRkZ5HUe0UUCaurM8T/4JX/GFPiz+xf4V0++Bi1bwfEfDd/buU8yF9OxHEGVcMuYRGcOobOc7vvH9FK/nz+IDeNP+CbP7QeqftV/DfSZtX+Fni8LH4p0PTwsf2C5AAjuo1Py/M5Zs/Ku52QlQyEftp8GPjl8Kf2hPA9t8RPhBrVvrWl3IB3wtiSJj1SWM4eNx3VwD+HNZs8CrTcJOLPWKKKKDMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiuH+JfxH8G/CHwDq/xO+IV6mnaLods93dzv/CiDoo6s7HCogyzsQqgkgUAfi38ZPC3hP46/8FepfD3jSwh1rTfBHgeJza30CzWyXMswdTsdWRm23QYEjORwflFfpZaWlrp9rFYWMSQwQIscccahURFGAqgcAAcADpX5r/8ABOjwlrfjGw8X/tlePTI+u/FPU57qETZDQabBI6QoB2BIO3HHlrHjiv0wq1se1hIctNX6hRRRTOoKKKKACv5P/wDgr1/yeVe/9gqw/wDQTX9YFfyf/wDBXr/k8q9/7BVh/wCgmk9jjx38P5n9PX/BDT/lHH4R/wCv7Vv/AEslr9dq/In/AIIaf8o4/CP/AF/at/6WS1+u1QeOFFFFABWVrmhaJ4m0i48P+JLODULC8QxT21zGssMqN1V0YFWB7ggitWigCrY2NjpdjDpmmQpb21uixRRRKESNEGFVVGAAAMAAYAq1RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9L+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFFFFABRXEePfiX8PfhZow8Q/EjW7LQ7JnEazX06woznoqliMn2FfBmr/APBSzwT4o1dvC37MPgzxF8VNWAfCaTZypbgowU7pDGzhcEMXERUAjJ54uMJS2RhWxNKl/EkkfpVRX5/aV4O/4LD/ABiUmw8P+EfhfZSP8smpTm7u1Te3aM3CEhVA5iUNuyMfwdTZ/wDBKb9pT4kFbv8AaO/aF1u6SXDT2Hh+3FhCGKMCFcOEI3MR/wAe4yo6An5dlhZdTzamd0F8Kb/D+vuPrzXvE/hvwrZtqPifULbTbdQWMt1KsKADGSWcgYGRmvn3xL+2p+yZ4S3jWPiHoRaPO5ba8S6cEZyCsBc5GDxjP5itXwz/AMEQP2EdIPm+J7DW/E8xZC02p6pKHYIAME232cYbHPGfQivp7wh/wTc/YR8EOz6N8LNAnLNuP2+2/tAZxjgXRlAGOw4zz1rRYVdWcc8+n9mC+/8A4Y/OrV/+Cof7EOksY18Ym7cEArb2F4/BGc7jCFI+jE5/HHBT/wDBXH9kxr5dP0Qa5qsrlgotNPJJC85Ad0YgjJ6ZwOcV+6Gj/s//AAG8OzfafD/gjQLGTcrbrfTbeJtycqcrGDkdvSvTtP0vTNIhNtpVtFaxs24rEgRSx4zgAc4Aq1hYGDzvEPZL7n/mfzup/wAFXPgtc6h/Zuk+CfHF9I33PI0uJt+Bk4U3IbjnPHb0qW//AOCn3hWPZ/Znws8fzZzu83Skjx6YxM+f0r+iyin9WgQ85xPdfcfzp2H/AAU+8Kyb/wC0/hZ4/hxjb5WlJJn1zmZMfrUd3/wVY+D2m3aWWseBPHdk74P7/SoUwpON2PtOccHoD0r+jCij6tAFnOJ7r7j+dNv+Ctv7KlnMbbXYNf0yTaGVbrT9rMpyMgLI3GR3xXeaR/wVD/Yh1ZhG3jE2jkkBbiwvE4AzncISoH1YHP4Z/ea9sbLUbZrPUIUnhfG6ORQynByMg5HUZrzHV/gL8DPEG7+3vBehX25zKftGnW8uXOfmO5DzyeevNJ4WBazvELdL7v8Agn5i+Gf22P2SvF0og0b4haGHYKVW5ultS2/oAJ9mW/2RyPSvfvD/AIx8IeLIvP8ACuq2epoRu3Wk6TDHHOUJ45H5ivR/FP8AwTt/YZ8YY/tb4VeG4dqNH/oNjHY8N1/49hFk+jdR2NfKniv/AIIf/sE69LJP4e0rWPDbsqiNtN1SVjC6/wAaG6+0fN/vZHoKh4VdGbwz6f2oL77f5n0RRXxfqX/BJv44/DrN1+zJ+0B4j0tY5PMjsPECDUbdvmUjJDJGpADFv9HYScKQBkng9R8Af8Fj/grBLc6hpnhL4rWUEXmObCT7LeMq7/uqwtF3/dZlWOTIwqfMTWbwsuh1087ov401+P8AX3H6GUV+Zg/4KUaP8PNbTw3+1Z8O/E3wvupMCOW/tJJ7VyHKMUkEcbyIMEq8cbBgGx0Ab7s+Gnxf+F3xk0Z/EHws16y120ify5Xs5RIYn5+V1HzITjIDAZHI4waxlTlHdHpUcVRq/wAOSf8AXY9HoooqDoCiiigAooooAK/MT4F/8pO/jh/2CtE/9Jbav07r8xPgX/yk7+OH/YK0T/0ltq0p7S9DlxPxUv8AF/7bI/TuiiiszqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+cj/AILb/wDJUvBH/YKuP/Rwr9XP+Dcj/k1zxz/2NR/9JLevyj/4Lb/8lS8Ef9gq4/8ARwr9XP8Ag3I/5Nc8c/8AY1H/ANJLevTofAj4rM/96n/XQ/obooorU4AooooAKKKKACiiigAr8Nv+Dgz/AJMQs/8AsatP/wDRNzX7k1+G3/BwZ/yYhZ/9jVp//om5oGj8YP8AggF/yeP4l/7Ey8/9LrGv6+K/kH/4IBf8nj+Jf+xMvP8A0usa/r4r4vPP96foj1cH/DCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/gu//wAnt2n/AGLNh/6NuK/cX/g3z/5MQvP+xq1D/wBE21fh1/wXf/5PbtP+xZsP/RtxX7i/8G+f/JiF5/2NWof+ibavv8u/3Wn6Hi1/4kj9yaKKK7TEKKKKACiiigAooooAKKKKAPyJ/wCC5f8Ayjj8Xf8AX9pP/pZFX8xn/BHz/k8+x/7BN/8A+gCv6c/+C5f/ACjj8Xf9f2k/+lkVfzGf8EfP+Tz7H/sE3/8A6AKuHxIir8DP60aKKK7Tyj82/iX/AMpafgF/2Cdf/wDSK6r9tK/Ev4l/8pafgF/2Cdf/APSK6r9tK46vxM9Oh8CCiiiszUKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/D79if/k6v9pn/ALHBf/Qrmv0xr8zv2J/+Tq/2mf8AscF/9Cua/TGu2l8KPNxH8RhXx1/wUD/5Mw+In/YJf/0Na+xa+Ov+Cgf/ACZh8RP+wS//AKGtVLZkQ+JH853/AASH/wCUjnwu/wCv66/9I56/0Dq/z8f+CQ//ACkc+F3/AF/XX/pHPX+gdXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK/qi/wCC5X/KOPxd/wBf2k/+lkVfyu/8Epv+T1vDn/XrqP8A6TSVrQ/iR9UNbn9Z9FFFe+WFFFFABRRRQAUUUUAaWjf8hi0/67R/+hCvq6vlHRv+Qxaf9do//QhX1dXmZhvEmQV5L8Vf+Pey/wB5/wCQr1qvJfir/wAe9l/vP/IVz4T+LH+uglueM0UUV7ZYUUUUAFFFFABRRRQAUUUUAFFFFAH56t/wT50XwprM/iD4HfEDxT4IuLiZ5zHY3hMAdwAcKojc5IG7c7ZHHTGNaz+En/BRDwiRb+Efj0b2LG3dqWlwyvjC/wDPUXBzx1znv3NfelFfPS4Wy696cHB/3Jzj+EZJfgfdrxIz2aUcXOnXVrfvqNGq/wDwKcJS/E+D5/BH/BTjUyLfUvjfYxQiQENBpFsj7ccn5bdD3Py7sHAOfTmr39hPxr8So0T9o34ueJ/F8C5b7IkxtrZWcMGxGzTL/FgEBeBjocD9FaKlcK5e3+9Up+Upzkvucrfeil4kZzTX+xqjQfelh6FOX/gUaakvk0fO3w2/ZM/Z0+Evly+CfCdjFcR5IubhTdXGTjJEkxdh0HAIA7AZr6Joor3MPhaOHhyUIKMeySS/A+QzDNMZj6vt8dXlVn3nJyf3tthRRRW5whRRRQAUUUUAFFFFABRRRQB/Jh/wVZ/5PW8R/wDXrp3/AKTR1/WX/wAEVf8AlGZ8NP8AuM/+nW8r+TT/AIKs/wDJ63iP/r107/0mjr+sv/gir/yjM+Gn/cZ/9Ot5Xg1/4kvUh7n6mUUUViIKKKKACiiigAooooAKKKKACv46v+Djf/k6PwN/2Ko/9K7iv7Fa/jq/4ON/+To/A3/Yqj/0ruKAPZf+CKX/ACaxr/8A2Nd1/wCkdnX7AV+P/wDwRS/5NY1//sa7r/0js6/YCtEe9hv4UQr45/4KA/8AJnvjf/r2g/8ASiKvsavjn/goD/yZ743/AOvaD/0oirzs4/3DEf4J/wDpLPq+DP8AkoMu/wCv9L/05E+6P2Rf+TUPhh/2KWi/+kcVfQ1fPP7Iv/JqHww/7FLRf/SOKvoatMF/u9P/AAr8j47iH/kaYv8A6+T/APSmFFFFdJ44UUUUAFFFFABRRRQAUUUUAflh/wAFjP8Akyy+/wCwtYf+hGvovwx/yLWn/wDXtF/6AK+dP+Cxn/Jll9/2FrD/ANCNfRfhj/kWtP8A+vaL/wBAFeNhf+RriP8ABT/OZ+pVP+SNy7/r/if/AEmgblFFFe6fIhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFe7tLXULWWwvokmgnRo5I5FDI6MMFWB4II4IPWvzS8ef8EwfhfJ4t/4WL+zz4i1b4W68rebHJo8hNqswPDiHcjAYLDYkqLg9MZB/TWiixE6cZq0kfiD+0v8Jf8AgpH8FPg9qfjrRvjjrfivTtKXff29tu0+8TT4wWknWYSSOGQKC2CWCljk4IP7M/sAaD4B0X9lfw1d/DDxZq3jPRNUR72G/wBYmE06ySHbPCvyIUSOZZBsYMytuBY1u3dpa6hay2F9Ek0E6NHJHIoZHRhgqwPBBHBB61+VT3HxE/4JZfEe6+I3gO3udf8AgT4jvPN1rRovnm0G4mIHn246CPoByFYARuQwjkqWjzsVhVFc0Fof0C0V5P8ABj45fCn9oTwPbfET4Qa1b61pdyAd8LYkiY9UljOHjcd1cA/hzXrFSeeFFFFABRX5e+N/2mvjB8CP+CjOg/B34s38U3wz+JenCDw0/wBnjiNpq8bKGieYKHkZ3IjC8gCeHoQ5b9QqACiiigAooooAK/H/APbU+Kupx/8ABQr9nv4NWniObQNP8281fU1W4+yw3KAgwRysXVJA72zoEPUvgAsVFfrve3tnptnNqOozJb29ujSSyyMEREQZZmY4AAAySeAK/mx8EfCT4d/8FNf2ivi1+0J8TLO6u/Bolg8PeF5kuHiZEs1AeaEAcbsLLhsqDMwKnnAkaU6bnLlif0r0V+Bulfsrft+fA6yj0j9mz47yz6TaOBaab4jtVnSKEBsR+Y6XPyjgfJGgwcgAqM9DLpv/AAWZ11bW0ufiV4N0OOJyJrizshPO6jjJSaxaM5xuABTrzjpTszR4WqtOU/Zn4ifEz4e/CPwrP43+J+tWegaTbcSXV9MsMe45IUFiNztj5UXLMeACa/BLxv4++IH/AAVz8b2Ph/RdOu/C/wACPDN/LLd3by7LnX7iI4jAXaCgUdFGRHuZmYybFT0Xw9/wTftPHHiq0+Iv7ZPjjVvitrFpGqw215I8GnwdCVWMOWKhgDgNGjnJdCWOP0g8P+HtA8J6Nb+HPC1jb6Zp1onlwWtpEsMMSf3URAFUewApqJ00ME73qfcWNJ0rTdB0q20PRoUtrOyiSCCGMYSOOMBVVR2AAAFaFFFUemFFFFABRRRQAV/J/wD8Fev+Tyr3/sFWH/oJr+sCv5P/APgr1/yeVe/9gqw/9BNKRx47+H8z+nr/AIIaf8o4/CP/AF/at/6WS1+u1fkT/wAENP8AlHH4R/6/tW/9LJa/XaoPHCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/T/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABXwT8Zf2hfjJ48+Ksv7K/7E+lQ6542t4hLrGq3RA07RImxgysQVaUg/d5wcAK7ZVfvavgn/AIIPeLfh94z+F/xJ8UxyRnx1rPieW/1oO++4a1mQPbHJ5aMSPcYY/NvL56iujD01JtvoeRm+LnRhGNPRy6+h7x8If+CSPwmF6nxC/bB1a6+L/jNnWU3GpSSw6fbYwfKhtUk2NGDkESZRhyI06V+pnhbwh4S8DaOnh3wTpdpo+nxszJa2MCW8Ks5yxCRhVBJ5PHJroqK9A+Tbbd29QooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGZrOiaN4j02TRvENpDf2c2PMguI1ljfaQwyrAg4IBGRwRmvyo+NX/AASM+CGua5cfE/8AZgvbr4TeNPmkhudEkeKxd9j4ja2B2RxO5TzFiCqVTGzJJP61UUDTad0fz6fC/wDaS+Onwb+N9h+yF+3BpkEHifUFP9j+JbA40/VwfugDy4wrk5XIVfmwpjQ4Lfo3XyB/wXf1LwRpX7Hun3WsNHH4iHiCzOhSqdtzFMgZ5WjIBYKIlO4gqN2zJztB+p/D11PfaBY31026Wa3id2xjLMoJOBx1rgxFNRaaPq8nxc60ZRqO7VtTYooormPYCiiigAr8xPgX/wApO/jh/wBgrRP/AEltq/TuvzE+Bf8Ayk7+OH/YK0T/ANJbatKe0vQ5cT8VL/F/7bI/TuiiiszqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+cj/gtv/yVLwR/2Crj/wBHCv1c/wCDcj/k1zxz/wBjUf8A0kt6/KP/AILb/wDJUvBH/YKuP/Rwr9XP+Dcj/k1zxz/2NR/9JLevTofAj4rM/wDep/10P6G6KKK1OAKKKKACiiigAooooAK/Db/g4M/5MQs/+xq0/wD9E3NfuTX4bf8ABwZ/yYhZ/wDY1af/AOibmgaPxg/4IBf8nj+Jf+xMvP8A0usa/r4r+Qf/AIIBf8nj+Jf+xMvP/S6xr+vivi88/wB6foj1cH/DCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/gu/8A8nt2n/Ys2H/o24r9xf8Ag3z/AOTELz/satQ/9E21fh1/wXf/AOT27T/sWbD/ANG3FfuL/wAG+f8AyYhef9jVqH/om2r7/Lv91p+h4tf+JI/cmiiiu0xCiiigAooooAKKKKACiiigD8if+C5f/KOPxd/1/aT/AOlkVfzGf8EfP+Tz7H/sE3//AKAK/pz/AOC5f/KOPxd/1/aT/wClkVfzGf8ABHz/AJPPsf8AsE3/AP6AKuHxIir8DP60aKKK7Tyj82/iX/ylp+AX/YJ1/wD9Irqv20r8S/iX/wApafgF/wBgnX//AEiuq/bSuOr8TPTofAgooorM1CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPw+/Yn/AOTq/wBpn/scF/8AQrmv0xr8zv2J/wDk6v8AaZ/7HBf/AEK5r9Ma7aXwo83EfxGFfHX/AAUD/wCTMPiJ/wBgl/8A0Na+xa+Ov+Cgf/JmHxE/7BL/APoa1UtmRD4kfznf8Eh/+Ujnwu/6/rr/ANI56/0Dq/z8f+CQ/wDykc+F3/X9df8ApHPX+gdXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8Fyv+Ucfi7/r+0n/ANLIq/ld/wCCU3/J63hz/r11H/0mkr+qL/guV/yjj8Xf9f2k/wDpZFX8rv8AwSm/5PW8Of8AXrqP/pNJWtD+JH1Q1uf1n0UUV75YUUUUAFFFFABRRRQBpaN/yGLT/rtH/wChCvq6vlHRv+Qxaf8AXaP/ANCFfV1eZmG8SZBXkvxV/wCPey/3n/kK9aryX4q/8e9l/vP/ACFc+E/ix/roJbnjNFFFe2WFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8mH/BVn/k9bxH/166d/6TR1/WX/AMEVf+UZnw0/7jP/AKdbyv5NP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV4Nf+JL1Ie5+plFFFYiCiiigAooooAKKKKACiiigAr+Or/g43/5Oj8Df9iqP/Su4r+xWv46v+Djf/k6PwN/2Ko/9K7igD2X/AIIpf8msa/8A9jXdf+kdnX7AV+P/APwRS/5NY1//ALGu6/8ASOzr9gK0R72G/hRCvNfjD8LtB+NPw01f4XeJpZoLLWIRFJJbkCRNrB1ZSwI4ZQeQQa9KoqKtONSEqc1eLVmvJnbhcTVw9aGIoS5ZwalFrdNO6fyZ+dGkfsL/ABQ8P6Ta6DoPx38dWNjYwpb21tb380UUMUQCoiIsoVVVQAqgAADArR/4Yv8AjN/0cD4//wDBnP8A/Hq/QaivIXD+ASsoP/wKX/yR9bLxBz2TcpVotv8A6dUv/kD8+f8Ahi/4zf8ARwPj/wD8Gc//AMeo/wCGL/jN/wBHA+P/APwZz/8Ax6v0Gop/2Bgf5H/4FP8A+SF/r/nn/P2P/gqj/wDIH58/8MX/ABm/6OB8f/8Agzn/APj1H/DF/wAZv+jgfH//AIM5/wD49X6DUUf2Bgf5H/4FP/5IP9f88/5+x/8ABVH/AOQPz5/4Yv8AjN/0cD4//wDBnP8A/HqP+GL/AIzf9HA+P/8AwZz/APx6v0Goo/sDA/yP/wACn/8AJB/r/nn/AD9j/wCCqP8A8gfnz/wxf8Zv+jgfH/8A4M5//j1H/DF/xm/6OB8f/wDgzn/+PV+g1FH9gYH+R/8AgU//AJIP9f8APP8An7H/AMFUf/kD8+f+GL/jN/0cD4//APBnP/8AHqP+GL/jN/0cD4//APBnP/8AHq/Qaij+wMD/ACP/AMCn/wDJB/r/AJ5/z9j/AOCqP/yB+Z/jH/gnp4v+Iuit4a+IPxo8Y67pzOsjWuoXb3UBdPusUkkZcjscZFfpNYWcWn2MNhCSUgRY1LdcKMDPSrVFdeDy3DYWUpUI2crX1b2vbdvuzys44mzLNKdOljqvNGDbilGMUnK13aKW/Kt+wUUUV3HghRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVHNDFcRNBOodHBVlYZBB6gjuDUlFAH5v8AxI/YBk0bxdefFz9jrxbffCvxVdkSTw2Dsul3jKdwWWBeApbkjDx9/LJrUsf2p/8AgqX8HHubD4j/AAu0f4lWNnjZqWh3q2Ms6IoLHyiXcswUnC26jccKCMCv0MopWOWpg6cnfY+Df+HqHxxkkisrb9mnxsbkl1lDpKkSlem2U2u1gR3OB6ZzXMa5+1D/AMFTfjsJrH4OfDzSPhZp0pKJqHiGcXV4mVXDBCpAIJLHdauvIXkq2f0Zoo5UZrAQ6tn4+eJP+CVd5498M6p41+KHxF1nxL8VLqNZbPXLmZ0t7W4iO+NET55BGG+XIb5VwY0QjB+8P2DP24LX4oWbfs2/HyT+wvi14OC6bqFreygNqjQKF+1QMcCRpAN7hc53b1yhBH0nXyb+07+x98Nf2mdOtb3U3l0HxPpcqT6br+nAJe20sZynzjBdAQCF3AgjKlTzQ0FfBxa/d6NH6tUV+E+h/tIf8FFf2OFt/DXxi8Lj41eEbfcset6MJP7YVOq+egDltoHJaP6zE16va/8ABbT9kO2LWXjjTfE/hrUYuJbPUNNAlRwSrD5JX6FSOcH2zkCDzJwlF2kj9gaK/HHUP+C1P7P2t3Mei/BDwh4s8d6pJg/Z9PsAoUE45y7SZ9AsZB9RXjniNf8AgpJ+29dTWXju/T4GeAJHZG03TpPO1i7izgrJMpV8H5kY7oEIIJhkHJLDhSnN2ijT/bY/ak8V/tgeObn9gr9kCdLqyuf3XjHxLGC9vZ2yvtkgRvlVumHKtiTPlqfvkfeXwm+Fvg/4KfDnSPhZ4BgNvpOjQeTArHc7Eks7ucAF5HZncgAFieB0rm/gV+z78Kf2cfBMfgT4T6WlhajDTzMd9xdSgcyTSHl2PPoqjhQqgAe0VaVj18Nh1TV3uFFFFM6QooooAKKKKACiiigAooooAK/k/wD+CvX/ACeVe/8AYKsP/QTX9YFfyf8A/BXr/k8q9/7BVh/6CaUjjx38P5n9PX/BDT/lHH4R/wCv7Vv/AEslr9dq/In/AIIaf8o4/CP/AF/at/6WS1+u1QeOFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf//U/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABX8+/8AwTm/Y1+J3jn9nq3/AGs/2V/FL+F/ib4e1m+tFhnLNYataxrbyC2nG7CKSWzlWRuAwUgOv9BFfDv/AAQp/wCTKLv/ALGW/wD/AEVb12YT7R87n/8Ay7+f6HafDP8A4K0P8P8AxVb/AAf/AOChngu8+FHih/lj1JY3uNFuyMAvG6mRkTcQoZGniHJaVelfq18Nfi78LfjJoEfij4U+IdP8RWEiJJ52n3CThQ+QNwQkocqwKsAQVIIBBFY3izwX4O8e6O/h3x1pNnrWnyZ32t/AlzC2VKnKSBlOVYg8dCR0Nfmt8QP+CRv7NWqaz/wmfwOvNZ+FniFfK2Xvhu9khUeUwP8Aq2JxnCn92yfOit13buw+dP2Gor8QLT4B/wDBXT4F2pg+FHxm0j4i6fbquy18U2ZiuJMKgz5uJ5S3ylcNchSCXJ3txtJ+3H/wUn+FM+z47fs5tr1qnyvd+ELz7SWw+3zI7dDdyENkEI5RgPmOADgA/aWivxotP+C2/wCzno0MSfFzwZ418F3DExv/AGjpa+SJVzuVXEu9iMYOY1OT06ke+eFv+Ctn/BPTxdlLD4kWtrIiK7rfWl3aYz23TQIrEdwrN+VAH6N0V8vaF+25+xx4lcRaN8VPCcsjMVEZ1e1SQkDJwjSBiMdwMdfQ167pHxf+E3iDb/YPijSL7cglH2e9hlyhxhhtc8cjnpzQB6JRVWyvrLUbZbzT5knhfO2SNgynBwcEZHUYq1QAUUVVvb6y062a81CZIIUxukkYKoycDJOB1OKALVFcBrHxY+Fnh2H7T4g8S6VYx7WbdcXkMS7U5Y5ZxwB19K8n139tD9kHw0hbXPil4Tt2Chth1i0MhUnAIQSliM+g7H0oA+l6K/PPxp/wVb/4J+eBHeHVfiTYXciqCF06G4vwxIJADW8UiZOMcsAD1Ir55vv+C3f7LeoXLad8L/DXjDxlctMIIF0zSwVmbGTt8yVX4HbZu6cY5AB+yVFfijN+3/8A8FCfi1bCH9nf9m+80rzMFL7xbdfZotrltreTILQkYXJ2zHqAOqlqZ+D3/BYj4yFk+I3xa0D4d6fcZWS38PWIuZ41aNVyrsiSA5LHi5GG5BxtwAfsT44+IfgP4ZaBP4p+Ims2Wh6bbIZJbm+nSCNVXAJ3OQOpA+pA6kV+UXxW/wCCufhTX/EbfCf9hjwtffF3xdIuBLbRPFpdtnjfLKQrMqnqcJH/ANNRVDwb/wAEff2eP7dHjL4/654h+KetOrGafX7+QxySOiKX2oRJkbfl3TNgEA52g1+nfgvwN4M+HHhy28H/AA/0q00XSrRdsNpZQrBCg9lQAZPc9SetAH81n7d37Knxyk/ZS8W/tdftr6//AG38RZprG10zS7RwNM0Oznuog0cKKNpkK/KxBIwSWaRyXr9pfCf/ACKumf8AXpD/AOgCvCP+Czf/ACYB4p/6/NL/APSuKvd/Cf8AyKumf9ekP/oArkxfQ+hyHep8v1OgoooriPowooooAK/MT4F/8pO/jh/2CtE/9Jbav07r8xPgX/yk7+OH/YK0T/0ltq0p7S9DlxPxUv8AF/7bI/TuiiiszqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+cj/AILb/wDJUvBH/YKuP/Rwr9XP+Dcj/k1zxz/2NR/9JLevyj/4Lb/8lS8Ef9gq4/8ARwr9XP8Ag3I/5Nc8c/8AY1H/ANJLevTofAj4rM/96n/XQ/obooorU4AooooAKKKKACiiigAr8Nv+Dgz/AJMQs/8AsatP/wDRNzX7k1+G3/BwZ/yYhZ/9jVp//om5oGj8YP8AggF/yeP4l/7Ey8/9LrGv6+K/kH/4IBf8nj+Jf+xMvP8A0usa/r4r4vPP96foj1cH/DCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/gu//wAnt2n/AGLNh/6NuK/cX/g3z/5MQvP+xq1D/wBE21fh1/wXf/5PbtP+xZsP/RtxX7i/8G+f/JiF5/2NWof+ibavv8u/3Wn6Hi1/4kj9yaKKK7TEKKKKACiiigAooooAKKKKAPyJ/wCC5f8Ayjj8Xf8AX9pP/pZFX8xn/BHz/k8+x/7BN/8A+gCv6c/+C5f/ACjj8Xf9f2k/+lkVfzGf8EfP+Tz7H/sE3/8A6AKuHxIir8DP60aKKK7Tyj8uv2qNfg+D3/BQH9n/AOO/ig/Z/Dyz3+hXN5JgQW81/E8CGRyyhVxOWLNgKqM3OCK/dWvgX9oL4CeAf2lPhdf/AAp+IsLvZXeJIpojtmt7hM+XNGeQGQnoQQQSCCCRXw78Nv2t/jr/AME9ILP4M/tlabeeLfA1omzTPHWnJJKYYQpEVtdRlTl9w2qWkDAYx5ijcOWrB3ud+HqJx5ep+7lFeafC34yfCz42eHV8WfCfXrPX9PbP720kD7cMyfMv3lyyMBuAzg44r0usTpCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKrXt7Z6bZzajqMyW9vbo0kssjBEREGWZmOAAAMkngCvFPjr+0v8DP2avDn/AAk/xq8R2miQspMMMjb7m4I7QwJmSQ+u1SB3IFfjz8QfjX+0J/wVGtm+HXwV0+9+Hnwbnk8vVtevlCahq0QzmGCMNjyn4DBWIP8AG+MxM0m3ZClJRV2dL/wTi1P/AIWL40+N/wAfNMhkXRvGHjO5k0yZwFE1vA0jKwGSc7ZV3MCVLZAPBr9Ra89+FPwu8F/Bb4eaV8Lvh7a/Y9H0eLyreMsWb5mLuzE9Wd2Z2PdiTXoVdsVZWPLqS5pNhXx1/wAFA/8AkzD4if8AYJf/ANDWvsWvjr/goH/yZh8RP+wS/wD6GtOWzCHxI/nO/wCCQ/8Aykc+F3/X9df+kc9f6B1f5+P/AASH/wCUjnwu/wCv66/9I56/0Dq4D1QooooAKKKKACiiigAooooA/Ir/AILlf8o4/F3/AF/aT/6WRV/K7/wSm/5PW8Of9euo/wDpNJX9UX/Bcr/lHH4u/wCv7Sf/AEsir+V3/glN/wAnreHP+vXUf/SaStaH8SPqhrc/rPooor3ywooooAKKKKACiiigDS0b/kMWn/XaP/0IV9XV8o6N/wAhi0/67R/+hCvq6vMzDeJMgryX4q/8e9l/vP8AyFetV5L8Vf8Aj3sv95/5CufCfxY/10EtzxmiiivbLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+TD/gqz/yet4j/wCvXTv/AEmjr+sv/gir/wAozPhp/wBxn/063lfyaf8ABVn/AJPW8R/9eunf+k0df1l/8EVf+UZnw0/7jP8A6dbyvBr/AMSXqQ9z9TKKKKxEFFFFABRRRQAUUUUAFFFFABX8dX/Bxv8A8nR+Bv8AsVR/6V3Ff2K1/HV/wcb/APJ0fgb/ALFUf+ldxQB7L/wRS/5NY1//ALGu6/8ASOzr9gK/H/8A4Ipf8msa/wD9jXdf+kdnX7AVoj3sN/CiFFFFBsFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVO907T9TiEGpQR3CA7gsihwD64PfmrlFAEcMMVvEsEChEQBVVRgADoAOwFSUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfyf/APBXr/k8q9/7BVh/6Ca/rAr+T/8A4K9f8nlXv/YKsP8A0E0pHHjv4fzP6ev+CGn/ACjj8I/9f2rf+lktfrtX5E/8ENP+UcfhH/r+1b/0slr9dqg8cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//V/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABXw7/wQp/5Mou/+xlv/AP0Vb19xV8O/8EKf+TKLv/sZb/8A9FW9dmE+0fO5/wD8u/n+h+zVFFFdh86FFFFAEU0MNzC9vcIskcilWVhlWU8EEHqDXg3iz9lL9mLx2qr4x+HnhvUWRdqPPpdu0iLnOFfy9ygnrgjNe/UUAfC2rf8ABM39g/Wt32z4Z6Sm5zIfI8235OenlSLgc/d6e3FeO65/wRo/4J+6shWw8J3emEqBm21S8Ygg5z++llGT0PbHQZ5r9S6KAPyK/wCHI37Cn/PhrP8A4MX/APiazbX/AIIg/sc6deSX2jah4psXkyP9H1JEwpOdoPkFscDqT05r9h6KAPx01D/gh7+x3q8wudV1TxVdSKu0NLqMbsFHOMm3PGSa1v8AhyN+wp/z4az/AODF/wD4mv11ooA/LTQ/+CNH/BP3SUC3/hO71MhSM3OqXikknOf3MsQyOg7Y6jPNeu6R/wAEyP2DNEm8+y+Gmlu25WxcNNcLlenEsjjHqMYPfNfd1FAHgPhD9lP9mLwBNHdeCvh54b0yeJgyz2+l26TBhnB8wR78jJxzwOBxXutnZWen2y2enxJBCmdqRqFUZOTgDA6nNWaKACiiigAooooA/LD/AILN/wDJgHin/r80v/0rir3fwn/yKumf9ekP/oArwj/gs3/yYB4p/wCvzS//AErir3fwn/yKumf9ekP/AKAK5MX0Poch3qfL9ToKKKK4j6MKKKKACvzE+Bf/ACk7+OH/AGCtE/8ASW2r9O6/MT4F/wDKTv44f9grRP8A0ltq0p7S9DlxPxUv8X/tsj9O6KKKzOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5yP+C2//JUvBH/YKuP/AEcK/Vz/AINyP+TXPHP/AGNR/wDSS3r8o/8Agtv/AMlS8Ef9gq4/9HCv1c/4NyP+TXPHP/Y1H/0kt69Oh8CPisz/AN6n/XQ/obooorU4AooooAKKKKACiiigAr8Nv+Dgz/kxCz/7GrT/AP0Tc1+5Nfht/wAHBn/JiFn/ANjVp/8A6JuaBo/GD/ggF/yeP4l/7Ey8/wDS6xr+viv5B/8AggF/yeP4l/7Ey8/9LrGv6+K+Lzz/AHp+iPVwf8MKKKK8c6gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP44f+C7/wDye3af9izYf+jbiv3F/wCDfP8A5MQvP+xq1D/0TbV+HX/Bd/8A5PbtP+xZsP8A0bcV+4v/AAb5/wDJiF5/2NWof+ibavv8u/3Wn6Hi1/4kj9yaKKK7TEKKKKACiiigAooooAKKKKAPyJ/4Ll/8o4/F3/X9pP8A6WRV/MZ/wR8/5PPsf+wTf/8AoAr+nP8A4Ll/8o4/F3/X9pP/AKWRV/MZ/wAEfP8Ak8+x/wCwTf8A/oAq4fEiKvwM/rRooortPKCq93aWmoWkthfxJPBOjRyRyKGR0YYKsDwQRwQetWKKAPzn8cf8E2fhP/wmJ+Kf7Our6l8J/Fa5Md54fkKW2T1DW25V8tuN0UbRowGCOTXP6f8AEf8A4K2/s5R/ZtWstC+NWiwJEBKhFjqaqoII48oMRjBJSZ2yrZzvx+nFFZypRZtGvOPU+CvD3/BZT4M6Ffx+HP2mPBvib4Y6sXVHS/s3uLcZCbyroqyuE3ZJEHKbWGS22vs/4Z/t4/sc/F5kg8CfEbRZ55FDJb3VwLK4cEMflhuRFISApLALlRycAitbVdI0nXbCTStctYry1lxvhnQSRttIIyrAg4IBGR1FfJ/j/wDYD/Y6+JKyHxB4A0u3kkGDLp0Z0985J3ZtjFlsk5JzngHIAFZOh2ZusUuqP1LhmhuYUuLd1kjkUMrKcqynkEEdQalr8H/+HWHg/wAFSm7/AGePiR4x+H0rbiy6fqDeUWZQpbCeU+TgbsyHIAHFadr+z5/wU48BTeb8P/2hl1hQqKU1vTEcMq44PmC6IJ5ywIY+vPEOlI1WIg+p+5tFfidH8Uv+CyXgJ50u9G8B+N4wA4MDy20jcfcjLyWqjnk71x6GrkH7e3/BRDw/cCHxf+zeb753B/s/V0Awox95UuB15z0YdPWp5Jdi1Ui+p+0tFfjLbf8ABVH44afbM/jT9mnxtZSKnmH7Gkt5EFBOSZPssQGAAeR+mCbQ/wCCz3wq0izZ/HHwt+IOlXEW3zU/syFkTcBjLSXER5J4yoyMHvilZlJo/ZCivx9s/wDgtf8Ass3Nss83hrxnbs2cxyaVGWGD32XLLz14NRad/wAFx/2Hr3f9pbX7PbjHnaeDuznp5cr9PfHWkM/YeivyK/4fc/sKf8/+s/8Aguf/AOKrHm/4Lk/sUC++w2MHiS8LFVRodPTDlscKGmVs5OPu9aAP2Nor8fbz/gtf+yzbWzTw+GvGdwy4xHHpUYY5PbfcqvHXk1QH/BZn4a63biXwD8KPiDq7lHYD+zIlX5eBzHPNxngnHHvTswP2Ror8X3/4Kn/H7U4pJ/CH7M3jG7jARomu2ltA4bvk2j8dcbd3bOM024/bl/4KR+IYSPB37OsNjJMz+UdR1mIqqjOA4Y2/PA5JXd2HIp8r7EucerP2ior8TLnx3/wWU+IKokMfgPwJG8mCyCW5mjRSTk7jdxsWHHAHTovJrnz+zP8A8FI/HvlzfFH9o240xkfcY9C09YQQMDG6E2nUZ6qQDzg5JpqnLsQ60F1P3KvL2z0+2a81CVIIUxueRgqjJwMk4HU4r5A+If8AwUJ/Yo+FzeV4t+JWi+Zt3GOxmOoyKMZ+ZLQTMpI6AgE8Y6ivzus/+CVPwr8TXMWsftAeNPFfxE1BPvvqmouIm+90HzSjDOzf648/U5+nfA37Df7Inw5QL4Y+HujblziS8g+3SjICnD3JlccD17n1ObVGXUzeKj0PJtf/AOCxfgvxfNNo37KPw58T/Em+iLI00VsbWyU7GZcuBLLklfutEmVzg5GK5XUNT/4Kw/tJM0WsaronwQ8PTGRGh09RqOrmFx8pL7nUMOm6OW3cH+Gv0ntLS0sLdbWxiSGJM7UjUKoycnAGB1qxWiorqZSxUnsj8/vhn/wTh+A/hfXY/iB8WJL/AOJfi35Gl1bxNcPeFnXPIhdihHTAk8wrgYbrX37DDFbxLBAoSNAFVVGAAOgAHQCpKK1SS2OeUnLVsKKKKZIV8df8FA/+TMPiJ/2CX/8AQ1r7Fr46/wCCgf8AyZh8RP8AsEv/AOhrSlsy4fEj+c7/AIJD/wDKRz4Xf9f11/6Rz1/oHV/n4/8ABIf/AJSOfC7/AK/rr/0jnr/QOrgPVCiiigAooooAKKKKACiiigD8iv8AguV/yjj8Xf8AX9pP/pZFX8rv/BKb/k9bw5/166j/AOk0lf1Rf8Fyv+Ucfi7/AK/tJ/8ASyKv5Xf+CU3/ACet4c/69dR/9JpK1ofxI+qGtz+s+iiivfLCiiigAooooAKKKKANLRv+Qxaf9do//QhX1dXyjo3/ACGLT/rtH/6EK+rq8zMN4kyCvJfir/x72X+8/wDIV61XkvxV/wCPey/3n/kK58J/Fj/XQS3PGaKKK9ssKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5MP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV/Jp/wAFWf8Ak9bxH/166d/6TR1/WX/wRV/5RmfDT/uM/wDp1vK8Gv8AxJepD3P1MooorEQUUUUAFFFFABRRRQAUUUUAFfx1f8HG/wDydH4G/wCxVH/pXcV/YrX8dX/Bxv8A8nR+Bv8AsVR/6V3FAHsv/BFL/k1jX/8Asa7r/wBI7Ov2Ar8f/wDgil/yaxr/AP2Nd1/6R2dfsBWiPew38KIUUUUGwUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV/J/wD8Fev+Tyr3/sFWH/oJr+sCv5P/APgr1/yeVe/9gqw/9BNKRx47+H8z+nr/AIIaf8o4/CP/AF/at/6WS1+u1fkT/wAENP8AlHH4R/6/tW/9LJa/XaoPHCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/W/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABXw7/wQp/5Mou/+xlv/AP0Vb19xV8O/8EKf+TKLv/sZb/8A9FW9dmE+0fO5/wD8u/n+h+zVFFFdh86FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAflh/wWb/5MA8U/wDX5pf/AKVxV7v4T/5FXTP+vSH/ANAFeEf8Fm/+TAPFP/X5pf8A6VxV7v4T/wCRV0z/AK9If/QBXJi+h9DkO9T5fqdBRRRXEfRhRRRQAV+YnwL/AOUnfxw/7BWif+kttX6d1+YnwL/5Sd/HD/sFaJ/6S21aU9pehy4n4qX+L/22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/AAW3/wCSpeCP+wVcf+jhX6uf8G5H/Jrnjn/saj/6SW9flH/wW3/5Kl4I/wCwVcf+jhX6uf8ABuR/ya545/7Go/8ApJb16dD4EfFZn/vU/wCuh/Q3RRRWpwBRRRQAUUUUAFFFFABX4bf8HBn/ACYhZ/8AY1af/wCibmv3Jr8Nv+Dgz/kxCz/7GrT/AP0Tc0DR+MH/AAQC/wCTx/Ev/YmXn/pdY1/XxX8g/wDwQC/5PH8S/wDYmXn/AKXWNf18V8Xnn+9P0R6uD/hhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/wXf/5PbtP+xZsP/RtxX7i/8G+f/JiF5/2NWof+ibavw6/4Lv8A/J7dp/2LNh/6NuK/cX/g3z/5MQvP+xq1D/0TbV9/l3+60/Q8Wv8AxJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkT/wAFy/8AlHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/wD0AV/Tn/wXL/5Rx+Lv+v7Sf/SyKv5jP+CPn/J59j/2Cb//ANAFXD4kRV+Bn9aNFFFdp5QUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARiGJZWnCgSMApbHJC5wCfQZOPqakoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvjr/goH/yZh8RP+wS//oa19i18df8ABQP/AJMw+In/AGCX/wDQ1pS2ZcPiR/Od/wAEh/8AlI58Lv8Ar+uv/SOev9A6v8/H/gkP/wApHPhd/wBf11/6Rz1/oHVwHqhRRRQAUUUUAFFFFABRRRQB+RX/AAXK/wCUcfi7/r+0n/0sir+V3/glN/yet4c/69dR/wDSaSv6ov8AguV/yjj8Xf8AX9pP/pZFX8rv/BKb/k9bw5/166j/AOk0la0P4kfVDW5/WfRRRXvlhRRRQAUUUUAFFFFAGlo3/IYtP+u0f/oQr6ur5R0b/kMWn/XaP/0IV9XV5mYbxJkFeS/FX/j3sv8Aef8AkK9aryX4q/8AHvZf7z/yFc+E/ix/roJbnjNFFFe2WFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8mH/BVn/k9bxH/wBeunf+k0df1l/8EVf+UZnw0/7jP/p1vK/k0/4Ks/8AJ63iP/r107/0mjr+sv8A4Iq/8ozPhp/3Gf8A063leDX/AIkvUh7n6mUUUViIKKKKACiiigAooooAKKKKACv46v8Ag43/AOTo/A3/AGKo/wDSu4r+xWv46v8Ag43/AOTo/A3/AGKo/wDSu4oA9l/4Ipf8msa//wBjXdf+kdnX7AV+P/8AwRS/5NY1/wD7Gu6/9I7Ov2ArRHvYb+FEKKKKDYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/k/8A+CvX/J5V7/2CrD/0E1/WBX8n/wDwV6/5PKvf+wVYf+gmlI48d/D+Z/T1/wAENP8AlHH4R/6/tW/9LJa/XavyJ/4Iaf8AKOPwj/1/at/6WS1+u1QeOFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/X/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABXw7/wQp/5Mou/+xlv/AP0Vb19xV8O/8EKf+TKLv/sZb/8A9FW9dmE+0fO5/wD8u/n+h+zVFFFdh86FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAflh/wWb/5MA8U/wDX5pf/AKVxV7v4T/5FXTP+vSH/ANAFeEf8Fm/+TAPFP/X5pf8A6VxV7v4T/wCRV0z/AK9If/QBXJi+h9DkO9T5fqdBRRRXEfRhRRRQAV+YnwL/AOUnfxw/7BWif+kttX6d1+YnwL/5Sd/HD/sFaJ/6S21aU9pehy4n4qX+L/22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/AAW3/wCSpeCP+wVcf+jhX6uf8G5H/Jrnjn/saj/6SW9flH/wW3/5Kl4I/wCwVcf+jhX6uf8ABuR/ya545/7Go/8ApJb16dD4EfFZn/vU/wCuh/Q3RRRWpwBRRRQAUUUUAFFFFABX4bf8HBn/ACYhZ/8AY1af/wCibmv3Jr8Nv+Dgz/kxCz/7GrT/AP0Tc0DR+MH/AAQC/wCTx/Ev/YmXn/pdY1/XxX8g/wDwQC/5PH8S/wDYmXn/AKXWNf18V8Xnn+9P0R6uD/hhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/wXf/5PbtP+xZsP/RtxX7i/8G+f/JiF5/2NWof+ibavw6/4Lv8A/J7dp/2LNh/6NuK/cX/g3z/5MQvP+xq1D/0TbV9/l3+60/Q8Wv8AxJH7k0UUV2mIUUUUAFFFFABRRRQAUUUUAfkT/wAFy/8AlHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/wD0AV/Tn/wXL/5Rx+Lv+v7Sf/SyKv5jP+CPn/J59j/2Cb//ANAFXD4kRV+Bn9aNFFFdp5QUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV8df8FA/+TMPiJ/2CX/8AQ1r7Fr46/wCCgf8AyZh8RP8AsEv/AOhrSlsy4fEj+c7/AIJD/wDKRz4Xf9f11/6Rz1/oHV/n4/8ABIf/AJSOfC7/AK/rr/0jnr/QOrgPVCiiigAooooAKKKKACiiigD8iv8AguV/yjj8Xf8AX9pP/pZFX8rv/BKb/k9bw5/166j/AOk0lf1Rf8Fyv+Ucfi7/AK/tJ/8ASyKv5Xf+CU3/ACet4c/69dR/9JpK1ofxI+qGtz+s+iiivfLCiiigAooooAKKKKANLRv+Qxaf9do//QhX1dXyjo3/ACGLT/rtH/6EK+rq8zMN4kyCvJfir/x72X+8/wDIV61XkvxV/wCPey/3n/kK58J/Fj/XQS3PGaKKK9ssKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5MP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV/Jp/wAFWf8Ak9bxH/166d/6TR1/WX/wRV/5RmfDT/uM/wDp1vK8Gv8AxJepD3P1MooorEQUUUUAFFFFABRRRQAUUUUAFfx1/wDBxx/ydF4G/wCxWH/pXcV/YpX8df8Awccf8nReBv8AsVh/6V3FAHsn/BFL/k1jX/8Asa7r/wBI7Ov2Ar8f/wDgil/yaxr/AP2Nd1/6R2dfsBWiPew38KIUUUUGwUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV/J/wD8Fev+Tyr3/sFWH/oJr+sCv5P/APgr1/yeVe/9gqw/9BNKRx47+H8z+nr/AIIaf8o4/CP/AF/at/6WS1+u1fkT/wAENP8AlHH4R/6/tW/9LJa/XaoPHCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Q/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABXw7/wQp/5Mou/+xlv/AP0Vb19xV8O/8EKf+TKLv/sZb/8A9FW9dmE+0fO5/wD8u/n+h+zVFFFdh86Fcj4q+IHgPwL5H/Cba3YaP9q3eT9uuY7fzNmN23zGXdt3DOOmR6111fxLf8HeXhTSfHnxl/Y68D6+HNhrOteI7G5EbbXMNxPokb7T2O1jg9qAP7MvDXxM+G/jO6ax8H+INN1aZBuaOzu4p2AHchGJxXb1/FH/AMFJf+DbP9mn9jv9lLxX+2f+wH4q8W+C/iD8KbGXxLbSvqm9JLewHm3GyRI0nhmSFXaN0kALDawIbK/pT+yp/wAFwfBXhL/gh94P/wCCj/7Xgub/AFi13+HNQttLRXutU1m0nktkKBikaPcRxC5lJKogL4zhVIB/RnRX8u/gb/g5Un0P4s/D/wAGftl/s2+Nfgr4Z+J1wlvoHiPVnMsE3mmNVkMUlrbHy1MsZkMbSMiOrbSCK/Nf/gr3/wAFQ/2qfh//AMFxPhZ8N/D3gnxzeeD/AIaXVtc23g3TxMq+MbsNOwvrOFIv9JXDCFDtlVHgfbg7qAP7sKK/Bb9sf/guhon7MHin4ZfAjwD8GfF3xH+MvxL8PWviJPBGmRtDd6bDcxGQw3TmKRxPHsk3xrASixs8nljbu7P/AIJnf8FqvBX/AAUA+OPjH9k/4gfDfXvhB8WPBNq1/feHNcbzSbWOSOKRlk8uFg8bTRbkeJSVdWQsN20A/ZDw5418G+MftA8I6vZar9kcRz/Y7hJ/KY5wH2Mdp4PB9K6av86n/ghp/wAFGfEv7FWrftHeCPhH8G/F/wAbvGviDxUupRaN4XtndLawsmuklnuZ1jmMYLyIkaiJy5JHHGf65v8AgnP/AMFkv2Yv+Ch/wB8Y/GrQoL3wXe/DZJJPF2i6uA1zpcUaSS+dmPPmQskUmGCq26NlKAgZAP1wor+TPWf+DpG+n8Far+0T8O/2V/H2ufBLR777HceOJJRbWy/vFi3FBbyQqd7Ku03Qw7KrEMcV+m37UP8AwW+/ZR/Zz/Yn+Hv7aWj2GseMbX4ttDB4P0HToQmo39zKpLROrErF5LDy5SN5DkKgckZAP2Wor+ev9nz/AILv+J/Ff7VfhH9kv9sL9nHxt8Dta8fkJ4fvNTzfWtw7EKvmkQQNGpZlRmVZBG7qJNi5Yeo/8FC/+C3nw8/Yu/aE0n9jf4N/DjxF8bvjBqlsl6/hrwyvzWkEil08+RY5nEjIPM2LE22LDuVUqWAP3Dor8pP+CZX/AAVr+DP/AAUqg8WeEdG8O6x8PviJ4BnWDxH4R8QxeVfWe9mRXXhS6BkKPlEeNxh0UMhb9W6ACiiigD8sP+Czf/JgHin/AK/NL/8ASuKvd/Cf/Iq6Z/16Q/8AoArwj/gs3/yYB4p/6/NL/wDSuKvd/Cf/ACKumf8AXpD/AOgCuTF9D6HId6ny/U6CiiiuI+jCiiigAr8xPgX/AMpO/jh/2CtE/wDSW2r9O6/MT4F/8pO/jh/2CtE/9JbatKe0vQ5cT8VL/F/7bI/TuiiiszqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+cj/gtv/wAlS8Ef9gq4/wDRwr9XP+Dcj/k1zxz/ANjUf/SS3r8o/wDgtv8A8lS8Ef8AYKuP/Rwr9XP+Dcj/AJNc8c/9jUf/AEkt69Oh8CPisz/3qf8AXQ/obooorU4AooooAKKKKACiiigAr8Nv+Dgz/kxCz/7GrT//AETc1+5Nfht/wcGf8mIWf/Y1af8A+ibmgaPxg/4IBf8AJ4/iX/sTLz/0usa/r4r+Qf8A4IBf8nj+Jf8AsTLz/wBLrGv6+K+Lzz/en6I9XB/wwooorxzqCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/jh/4Lv8A/J7dp/2LNh/6NuK/cb/g30/5MQu/+xp1D/0TbV+HP/Bd/wD5PbtP+xZsP/RtxX7jf8G+n/Jh93/2NOof+ibavv8ALv8AdafoeLX/AIkj9yKKKK7TEKKKKACiiigAooooAKKKKAPyJ/4Ll/8AKOPxd/1/aT/6WRV/MZ/wR8/5PPsf+wTf/wDoAr+nP/guX/yjj8Xf9f2k/wDpZFX8xn/BHz/k8+x/7BN//wCgCrh8SIq/Az+tGiiiu08oKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK+Ov+Cgf/JmHxE/7BL/+hrX2LXx1/wAFA/8AkzD4if8AYJf/ANDWlLZlw+JH853/AASH/wCUjnwu/wCv66/9I56/0Dq/z8f+CQ//ACkc+F3/AF/XX/pHPX+gdXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8ABcr/AJRx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/r11H/ANJpK/qi/wCC5X/KOPxd/wBf2k/+lkVfyu/8Epv+T1vDn/XrqP8A6TSVrQ/iR9UNbn9Z9FFFe+WFFFFABRRRQAUVy3i3xx4K8AaWdc8d6xY6JZL1uL+4jtohj/bkZV/WrPhnxZ4V8aaUmu+DtTtNWsZPuXFlMk8TfR0LKfzoA7DSXSPVbaSQhVWVCSeAACK+mP8AhIdA/wCf63/7+r/jXyvRXPXwyqtNsTVz6o/4SHQP+f63/wC/q/415h8S9S06/gtBYzxzFWfPluGxnHXBryais6WDjCSkmFgooorsGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8mH/BVn/k9bxH/wBeunf+k0df1l/8EVf+UZnw0/7jP/p1vK/k0/4Ks/8AJ63iP/r107/0mjr+sv8A4Iq/8ozPhp/3Gf8A063leBX/AIkvVkPc/UyiiishBRRRQAUUUUAFFFFABRRRQAV/HX/wccf8nReBv+xWH/pXcV/YpX8df/Bxx/ydF4G/7FYf+ldxQB7J/wAEUv8Ak1jX/wDsa7r/ANI7Ov2Ar8f/APgil/yaxr//AGNd1/6R2dfsBWiPew38KIUUUUGwUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV/J//wAFev8Ak8q9/wCwVYf+gmv6wK/k/wD+CvX/ACeVe/8AYKsP/QTSkceO/h/M/p6/4Iaf8o4/CP8A1/at/wClktfrtX5E/wDBDT/lHH4R/wCv7Vv/AEslr9dqg8cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//9H+/iiiigD/ADn/APgox/yfh8XP+xp1L/0c1f1Rfsof8mtfDX/sVdG/9JIq/ld/4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/wCxV0b/ANJIq5cVsj3sh+Ofoe/UUUVwn0wUUUUAFfDv/BCn/kyi7/7GW/8A/RVvX3FXw7/wQp/5Mou/+xlv/wD0Vb12YT7R87n/APy7+f6H7NUUUV2HzoV/E/8A8Hc3iTRfBvxw/Y18X+JJ/s2naVrviG8uptrP5cEFxobu21QWOFBOACT2Ga/tgrwj42fstfsyftLf2Z/w0b8OfC/j/wDsXzv7P/4STSLTVfsn2nZ5vk/aopPL8zy49+zG7Yuc7RgA/mJ/4Kxf8HE//BOb4q/sI/ET9n39kfxbdfEXx18R9HuPC9jYWek6harGuqr9nllkku7aEHbE77Ej3u8m1cAEsPnH4h/Er9sP/ggf/wAG7Pwu0XwDpMGmfEnxxr0g1i7vLRbtNDGsrc3iq8MoaM3SwxwwFZUeNX8wEEhc/wBa/wAMf2G/2Kfgl4hh8XfBn4P+CPCOrW7For3RfD9hYXCMRglZIIUcHBI4PSvbPiP8Mvhx8YvBd98OPi1oGneJ/D2poI7zTNVto7y0nUHIEkMqsjAEAjIOCM9aAP8AMr/4Kw+PPhh4gu/gR4gf9rjWv2mfFtzqsOpa3ukSHw/oUMnkMPJtIkCW08rbwylxIEiw6JgV+2P/AAW0+KHgP9n3/g4l/ZO+PHxj1FNB8IaPoNo97qlwrGCFY77UA5YqGOE81C2AcBgTxX9SOnf8E6f2ANK+HH/Cn7T4IeAz4VN6mpNpMnh6wls3vY0eNLhonhZGmWOR0WVgXCsVBwSK9D+Nn7I37LH7SelaTof7Qfw58NeNbPQW3abDrel298lpkKCIRKjeWrBVDKuAwABBAoA/lR/4KK/8FY/i18S/+Cnngr9i7wN8crP9nX4Ia34YsfEcfxBFhDJPqsGq2RvIJIbm7AFvFJlYI3DQ7XDly52x18ff8EONd+F9/wD8HGnxSu/hZ8SNc+K+g3Xgy/gsfF3ia4NzqOsywnTFmlMrJGXjEkcqwYXAgRACQM1/af8AFH9hn9i/43aN4e8OfF/4TeEPE2n+EreOz0S21LRrS4i061hAVILdHjIihVVUCJAEwAMYFdXoP7KX7LvhX4h6b8XfC/w28Lab4s0eyXTbDWrXR7SHUbWySMwrbw3KRCWOFYyYxGrBQhK4xxQB/DL/AMG5v/BQ79kT9h/4x/tI+Gv2rfEEHghfF2vJdaXrN9DJ9kujpct359r5yIwEqC4jkRDywc45wD6b/wAEfPjT4w0T4sf8FEP+CtP7Pvhm41PwQseuar4atJYWih1K8FxdalCrIMOPLi2POqHcizYHJFf2G6l/wT8/YQ1fwTqPw2v/AIL+Bm8P6vff2ne6evh+xS2uL7aVFy8awhWnCsQJT84BIzX0D8PPhd8M/hF4JtPhp8KfD2meGfDmno0drpelWkVnZQo5JYJDEqxqCSScLySSetAH+bf8a/2z9Y/bU/4JY+Mv2gP2vP2wdVuviBrk1zbab8GvDMUGlWvmJdjYL6CCPdcW3lA3JdwFwADK0oIr7j+Idx/wT+13/g3S/ZT0T9uez8aQabd3GoxaF4q8GWsF2dE1KO9uUkF358qJ5UiliYgGdxC2zDoK/sl8J/8ABPP9gvwJrOueIfBvwW8D6Ze+Jba5stVmt9Aska7tbxSlxBLiH5op1JEsZ+SQE7gc16hpX7L/AOzToXwfl/Z60P4eeGbLwDOJBJ4at9JtYtHfzXMj5s1jEB3uSzfJy3J5oA/gV+FH7Vv7WX/BPL9tP4K/BP8AYo/a7j/aw8G/EHWrXT7jw1+/vntbOSaFDFJHPJdfZGaORmRoLhGQxs0kYTIbr/2s/Dnir9nj/g5O+JPiP4yfGfUf2ddP+IelLdaD48jsobqCW2ktbRVgZrgeXHFut5IGkyCskYUnaxJ/t++CH7B/7FH7NPiWXxp+z78JvCPgzWZleNtQ0fR7W0u/Lf7yCaONZAh7oGC+1eg/HL9mj9nb9pvQIPC37RfgXQPHWn2rM9vBr2nQagsDuAGaLzkfy2IAyyYPHWgD+Vj/AIIR+B/2aviB/wAFRfjN+0v8FfjL4y+Mnim00WbRfEmv6r4dttN0XURcXFr5U0F1b3D73Y2YMYaCMyIjv05b+xavKvg58Cvgp+zx4OT4e/AXwjo/gvQo5GlGn6JZQ2Ft5jY3OY4VRS7YGWIJPc16rQAUUUUAflh/wWb/AOTAPFP/AF+aX/6VxV7v4T/5FXTP+vSH/wBAFeEf8Fm/+TAPFP8A1+aX/wClcVe7+E/+RV0z/r0h/wDQBXJi+h9DkO9T5fqdBRRRXEfRhRRRQAV+YnwL/wCUnfxw/wCwVon/AKS21fp3X5ifAv8A5Sd/HD/sFaJ/6S21aU9pehy4n4qX+L/22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/Bbf/kqXgj/sFXH/AKOFfq5/wbkf8mueOf8Asaj/AOklvX5R/wDBbf8A5Kl4I/7BVx/6OFfq5/wbkf8AJrnjn/saj/6SW9enQ+BHxWZ/71P+uh/Q3RRRWpwBRRRQAUUUUAFFFFABX4bf8HBn/JiFn/2NWn/+ibmv3Jr8N/8Ag4L/AOTD7T/sadP/APRNzQB+L/8AwQC/5PH8S/8AYmXn/pdY1/XxX8g//BAL/k8fxL/2Jl5/6XWNf18V8Xnn+9P0R62D/hhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/wAF3/8Ak9u0/wCxZsP/AEbcV+43/Bvp/wAmH3f/AGNOof8Aom2r8Of+C7//ACe3af8AYs2H/o24r9xv+DfT/kw+7/7GnUP/AETbV9/l3+60/Q8Wv/EkfuRRRRXaYhRRRQAUUUUAFFFFABRRRQB+RP8AwXL/AOUcfi7/AK/tJ/8ASyKv5jP+CPn/ACefY/8AYJv/AP0AV/Tn/wAFy/8AlHH4u/6/tJ/9LIq/mM/4I+f8nn2P/YJv/wD0AVcPiRFX4Gf1o0UUV2nlBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXx1/wAFA/8AkzD4if8AYJf/ANDWvsWvjr/goH/yZh8RP+wS/wD6GtKWzLh8SP5zv+CQ/wDykc+F3/X9df8ApHPX+gdX+fj/AMEh/wDlI58Lv+v66/8ASOev9A6uA9UKKKKACiiigAooooAKKKKAPyK/4Llf8o4/F3/X9pP/AKWRV/K7/wAEpv8Ak9bw5/166j/6TSV/VF/wXK/5Rx+Lv+v7Sf8A0sir+V3/AIJTf8nreHP+vXUf/SaStaH8SPqhrc/rPooor3ywooooAK5vxl4p0zwN4Q1XxrrR22ej2c99OfSK3QyN+imukrkPiF4N074i+Adc+H2r8Wmu6fc6dPxn93dRtG3HfhjQwP4oP+CcX7Gd3/wcAfE/4ift5f8ABQHxDq974X0rWpNG8P8AhvT7xore1JRLh7dHIJjt4IpYVAiCvK7F3bIO9n7YfwC1H/g3U/bI+F37SP7IniTVn+Ffjy+ex8ReG9QujLG6Wpj86N2CqrhoZme3d1aSGRGOSpwYP+CUP7dVh/wRij+NH/BPL9tO3/4RXxLZapd654Zvr+G4/sq/vzbrbqkksUUkkdtc/Z4HhuFjZChcsVIUN8d/tm/8FK9S/wCC4fxT+AX7KmtaJpnw/ksNflh16/uNTQ6XNLctFGZoJpPLKxrDHIURtzu8gRCzYLeW3BU1/P8Aje5J/Y38Yf8Agp34O+EH/BST4e/8E4r3wreX2q/EHSU1WDW47lFtrdH+2YRoipZj/obchh98elL8eP8Agpz4Q+BX/BRb4a/8E8NS8KXmoar8SNNi1KDWYrhEt7VZZLuPa8RUsxH2QnIYfeHpX4ef8FVfH3g/9l//AIOEf2bf2kvi/crongaDwxBZyam6MbeFkm1OF8lQfli+1Qs+M7VYE8V5T8c/2q/gv+15/wAHJH7PPjz9n/V18Q+G9E02DQ/7VgRhaXN3AdSuJfs8jACVEFwiFlyu8EA10us02r63S+Q7n7G/tdf8Fu/CfwL/AGl7/wDZC/Zt+FXib45+PdAg+067Z+G0Jj09Aquylo4p3d0VxvAjCKzKhfeSq+6fs0f8FbvgN+1R+xz8RP2rvh7pWo2t78LNO1G78R+F9QCwajaT6fbSXPkk/Mu2URMI5OmQwZVZWUfyoeAdK1/9nH/gsT+0n4M+Nvx81D9mu/8AEWraprVhr5sYJ4dWsru+e7gjMlwNqCSGVZE2naWRk+8qrX2N/wAE+vAfwA1H9lT9ub9oT4BePfFnj3/hIfCHiG11zUvEGhQaRa3moC0v5/tFs8FxKJC/mNIylI2RZULKpYLUxrTcvv006fiFz7z/AGf/APg4mtP2qfFnhDwd+z78AvFviKbX7sWGp3UcyrY6RdSySLDHNc+SYjuiQTOSUCo2BvYEV+h3/BNP/gqL8MP+Cj/wr8X/ABE0fQ7rwTeeB9TbT9W0zVJ0klgQRCRZ3ZQoVGIlXDAEGJs18Qf8GwGi6dpf/BLPTr+yiWOXUvE2sXFwyjBkkV0iBb1ISNR9AK/CT/gpj478ef8ABIf9uH9pfwR8N7WWLwz+074Oe50zyfkjt7vUp9lzLkcBoS2oCNV5UTRngc0e1nGEakndMLn9YH/BMv8A4KXaB/wU08J+MviN4C8G3/hvw34X1ZdItL++nSX+0ZQhkkKIqqY9kbQsQST+9A7Gv06r84v+CSv7Jo/Yu/4J+/Dn4KajbfZtc/s5dV1wEYf+09S/0idH9TCXEAP92MV+jtdVPm5VzbjCiiirAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+TD/AIKs/wDJ63iP/r107/0mjr+sv/gir/yjM+Gn/cZ/9Ot5X8mn/BVn/k9bxH/166d/6TR1/WX/AMEVf+UZnw0/7jP/AKdbyvAr/wASXqyHufqZRRRWQgooooAKKKKACiiigAooooAK/jr/AODjj/k6LwN/2Kw/9K7iv7FK/jr/AODjj/k6LwN/2Kw/9K7igD2T/gil/wAmsa//ANjXdf8ApHZ1+wFfj/8A8EUv+TWNf/7Gu6/9I7Ov2ArRHvYb+FEKKKKDYKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK/k/wD+CvX/ACeVe/8AYKsP/QTX9YFfyf8A/BXr/k8q9/7BVh/6CaUjjx38P5n9PX/BDT/lHH4R/wCv7Vv/AEslr9dq/In/AIIaf8o4/CP/AF/at/6WS1+u1QeOFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf//S/v4ooooA/wA5/wD4KMf8n4fFz/sadS/9HNX9UX7KH/JrXw1/7FXRv/SSKv5Xf+CjH/J+Hxc/7GnUv/RzV/VF+yh/ya18Nf8AsVdG/wDSSKuXFbI97Ifjn6Hv1FFFcJ9MFFFFABXw7/wQp/5Mou/+xlv/AP0Vb19xV8O/8EKf+TKLv/sZb/8A9FW9dmE+0fO5/wD8u/n+h+zVFFFdh86FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAflh/wWb/5MA8U/wDX5pf/AKVxV7v4T/5FXTP+vSH/ANAFeEf8Fm/+TAPFP/X5pf8A6VxV7v4T/wCRV0z/AK9If/QBXJi+h9DkO9T5fqdBRRRXEfRhRRRQAV+YnwL/AOUnfxw/7BWif+kttX6d1+YnwL/5Sd/HD/sFaJ/6S21aU9pehy4n4qX+L/22R+ndFFFZnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH85H/AAW3/wCSpeCP+wVcf+jhX6uf8G5H/Jrnjn/saj/6SW9flH/wW3/5Kl4I/wCwVcf+jhX6uf8ABuR/ya545/7Go/8ApJb16dD4EfFZn/vU/wCuh/Q3RRRWpwBRRRQAUUUUAFFFFABX4b/8HBf/ACYfaf8AY06f/wCibmv3Ir8N/wDg4L/5MPtP+xp0/wD9E3NAH4v/APBAL/k8fxL/ANiZef8ApdY1/XxX8g//AAQC/wCTx/Ev/YmXn/pdY1/XxXxeef70/RHrYP8AhhRRRXjnUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/HD/AMF3/wDk9u0/7Fmw/wDRtxX7jf8ABvp/yYfd/wDY06h/6Jtq/Dn/AILv/wDJ7dp/2LNh/wCjbiv3G/4N9P8Akw+7/wCxp1D/ANE21ff5d/utP0PFr/xJH7kUUUV2mIUUUUAFFFFABRRRQAUUUUAfkT/wXL/5Rx+Lv+v7Sf8A0sir+Yz/AII+f8nn2P8A2Cb/AP8AQBX9Of8AwXL/AOUcfi7/AK/tJ/8ASyKv5jP+CPn/ACefY/8AYJv/AP0AVcPiRFX4Gf1o0UUV2nlBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXx1/wUD/AOTMPiJ/2CX/APQ1r7Fr46/4KB/8mYfET/sEv/6GtKWzLh8SP5zv+CQ//KRz4Xf9f11/6Rz1/oHV/n4/8Eh/+Ujnwu/6/rr/ANI56/0Dq4D1QooooAKKKKACiiigAooooA/Ir/guV/yjj8Xf9f2k/wDpZFX8rv8AwSm/5PW8Of8AXrqP/pNJX9UX/Bcr/lHH4u/6/tJ/9LIq/ld/4JTf8nreHP8Ar11H/wBJpK1ofxI+qGtz+s+iiivfLCiiigAooooA8Q+M37M/7On7RllBp/x98CeH/GkVqrLbjW9OgvjAHxu8ppkYxk4GShB4r5B+Of8AwR8/4Ju/H/4Z2/wq8T/CbQNG0+xk820n8PWkej3du5wGKzWixsQwA3q+5WwCQSAR+ltFS4Re6A8K+I/7MH7OHxi8B6b8L/i14E0HxP4d0ZI49P0/VdPhvLe1WJQieSsqMIyqAKCuDjjpVfS/2Uf2W9E1zw54m0X4a+FbPUvB0Jt9Bu4dHtI59LhZnYpZyLEGt1LSOSsRUZZj1Jr32inyrsB4J8bP2V/2Z/2k47VP2gvh/wCHvGpsQVtX1rTYL2SAE5IjeVGZASOQpGe9dd4e+Cnwc8JfDJ/gr4W8J6Pp3g6W1lspNCtrGGLTXtp1KyxNbKgiMcisQ6lSGBIOcmvTaKLLcDz74Y/CX4VfBPwpH4D+DXhnSfCOhwyPKmnaLZQ2Foskhy7CGBEQMx5YgZJ61/LNrv7B3/BUn/gp3/wUB+G/xe/4KNeAfD/w7+GnwpuftENlp99b3h1IRypO0YWK5upG+0yRRLIZDEiQghQXzu/raoqJ0lKyewBRRRWgBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH8mH/BVn/k9bxH/166d/6TR1/WX/AMEVf+UZnw0/7jP/AKdbyv5NP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV4Ff+JL1ZD3P1MooorIQUUUUAFFFFABRRRQAUUUUAFfx1/8ABxx/ydF4G/7FYf8ApXcV/YpX8df/AAccf8nReBv+xWH/AKV3FAHsn/BFL/k1jX/+xruv/SOzr9gK/H//AIIpf8msa/8A9jXdf+kdnX7AVoj3sN/CiFFFFBsFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFfyf/APBXr/k8q9/7BVh/6Ca/rAr+T/8A4K9f8nlXv/YKsP8A0E0pHHjv4fzP6ev+CGn/ACjj8I/9f2rf+lktfrtX5E/8ENP+UcfhH/r+1b/0slr9dqg8cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//T/v4ooooA/wA7T/gphpkmkft9/Fm1k6v4iu5vwnIkH6NX9Pf7HeoJqf7KPw3uU6L4b0yL8YYEjP6rX87H/BZHQZvD/wDwUh+JUMkZRLmbT7pCRgMJ7G3ckevzEj6g1+73/BObXYPEP7FngO8hff5NnNat6hreeSIg/wDfP5Vy4r4Ue5kUv3sl5fqfbNFFFcJ9QFFFFABXw7/wQp/5Mou/+xlv/wD0Vb19xV8O/wDBCn/kyi7/AOxlv/8A0Vb12YT7R87n/wDy7+f6H7NUUUV2HzoUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB+WH/BZv8A5MA8U/8AX5pf/pXFXu/hP/kVdM/69If/AEAV4R/wWb/5MA8U/wDX5pf/AKVxV7v4T/5FXTP+vSH/ANAFcmL6H0OQ71Pl+p0FFFFcR9GFFFFABX5ifAv/AJSd/HD/ALBWif8ApLbV+ndfmJ8C/wDlJ38cP+wVon/pLbVpT2l6HLifipf4v/bZH6d0UUVmdQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAfzbf8FstQST41eD9KH3odEeU/SWdwP/QDX7B/8G52mSQfsheMNXb7tx4vniA/65WVoc/+P/pX4Z/8Fj9dg1b9rO006F9x0vw/Z27gfwu0s82P++ZFNf0Qf8EBdCl0j9gSPUJEKjVPEWpXSkjG4KIocj15iI/CvUor3EfEZi74mb8z9sqKKK0OIKKKKACiiigAooooAK/Df/g4L/5MPtP+xp0//wBE3NfuRX4b/wDBwX/yYfaf9jTp/wD6JuaAPxf/AOCAX/J4/iX/ALEy8/8AS6xr+viv5B/+CAX/ACeP4l/7Ey8/9LrGv6+K+Lzz/en6I9bB/wAMKKKK8c6gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP44f8Agu//AMnt2n/Ys2H/AKNuK/cb/g30/wCTD7v/ALGnUP8A0TbV+HP/AAXf/wCT27T/ALFmw/8ARtxX7jf8G+n/ACYfd/8AY06h/wCibavv8u/3Wn6Hi1/4kj9yKKKK7TEKKKKACiiigAooooAKKKKAPyJ/4Ll/8o4/F3/X9pP/AKWRV/MZ/wAEfP8Ak8+x/wCwTf8A/oAr+nP/AILl/wDKOPxd/wBf2k/+lkVfzGf8EfP+Tz7H/sE3/wD6AKuHxIir8DP60aKKK7TygooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr46/wCCgf8AyZh8RP8AsEv/AOhrX2LXx1/wUD/5Mw+In/YJf/0NaUtmXD4kfznf8Eh/+Ujnwu/6/rr/ANI56/0Dq/z8f+CQ/wDykc+F3/X9df8ApHPX+gdXAeqFFFFABRRRQAUUUUAFFFFAH5Ff8Fyv+Ucfi7/r+0n/ANLIq/ld/wCCU3/J63hz/r11H/0mkr+qL/guV/yjj8Xf9f2k/wDpZFX8rv8AwSm/5PW8Of8AXrqP/pNJWtD+JH1Q1uf1n1HLLFBE087BEQFmZjgADqSewFeBftM/Er4l/Cf4U3PjD4UeHG8T6tHKiC1VXk8uNgS0pSP53C4GVUg85yAK+A/hDoHhT9syVbj48fFWTxBc53SeENPLaTbwsvVHibZNOF6bwAR/eNXjs6VHExwVKHNVkrpNqMfve/pFSfdH3OR8GTxmXTznFVvZ4WD5ZOMZVZ33+COkfKVSdOL6Nn6ueGfF3hfxpp7av4R1G31O0SV4TPayLLH5kZwyhlJBKng4PBrM+InxA8LfCzwTqPxA8aXItdM0uEzTP1OOgVR3ZmIVR3YgVL4F8A+DPhn4ag8H+AdNh0rTLbJjggXCgtySe5YnqxJJ7mvgX/gp5cTS/CTwp4dnkMWnar4osre9YHgxbJW2n2yN31Wtczx1bB5dUxMknUjHZXtzbetr/gc3DWSYTN+IaGW05SVCpO13bn5Fq9Fdczina11fuXPDXxr/AG5PjlYL43+DvhLQPDnhq5/eWLeI5JmurqLqr7YSNquORlcejEYJ9A+EH7U/jG4+KK/AH9o/w9H4V8WzxGawmtpPMsNRRQSfJYklTgHClmzggkMNtfa1ra21jax2VlGsMMKhI0QbVVVGAABwABwBX5tf8FGYk03/AIVd4v0YY1+x8W2sdkV++UkBZwD6F448ivKx9LFZdh/rv1mU5Ra5lK3LJNpNJJLlet42fk7n1GR4rK+IMw/sX+zqdGnUU1SnDn9pTkouUHKTk/aJ2tPmWzbjytI/SyivgjxNrmtx/wDBR/w74ejvJ10+TwZJM1sJGELSfaJxuKZ2lsADOM8Un7W+ua3pXx0+CNlpd5PbQ3viCWO4jikZFlQeT8rgEBhyeDmvRqZ1GFGtW5PgqKG+93FX/wDJvwPnqHBtSri8JhPbJOvQlWTtsoxqS5d9X+7tfz20PviivyS/aH+NXhTxx+1HffBD4qeNZ/BngjwvZwy3SWczQTanezosgRpI1LCNUkGV9VPcgrzPgb4x/C74M/tDeDvDP7Pvjq48TeE/F1z/AGZqOj3dxJciynkKrBNC8q7lDMwDDvg5zkbeCpxVh415U7LkU+RvnXNe/LdQ3cU9G733aTWp7tDwux1TBQrpy9rOl7aK9lN0+Tlc0nW+FTlBXUbON2ouSk7H7J0V+MXxU8VfD/Uf2o/Fvhb9svXtc0LS4jAPC8VtLPBpxtyDul3Qg5kJ25YjaG3BjwAPr39n/wCFh1T4deJ/B3/CwpPGvgrVpguj3NteGS+s4jkvE10hzuGVwBjbg8DdgdGEz54nETo0qa0cl8a5k43+KO8VK2j13TaOHNeBIZdgaWMxOJa5o05fwpezlGpZtU6t+Wc4J+9F8iupJSbR6t8Dfjy/x9+HmteOfCumNaNZX95YWkE7hmla2VdrPjAXex5AY4H8Vd58G9W+KWufDjTtU+NOl22jeJZfO+2Wdo4khj2yuI9rCSUHdGFY/OeSenSvzS/4J/8Aw10fSvgf4t+J9neX41CObWNPWM3Tm3EaKjB/Kzt8zIHz9ax/Cfxz+JPgz/gnh4FfwlfyS+K/GGrTaHa3ty5klia4vLkeZltxJVUCLn7uQR0xXl4DP6kaFHE4293SnNpNWdpQS0sveblZa2Wt73uvps84CoVMdjMvyfl5Y4qlSTmpKUOanWk/e5muRKDlO8XJtJq1mn+ydFfm741/Ypk8DfDu+8b/AA58a+I4/HOlWr3qanPfvIt3PCpcpLE2VKOQQBzjPO4ZB8e+P/x88e/Er9in4afF7wvdNpuv6l4jsopGgYojXMAuYmDKMZjeSPdsORggc16WIz+eGjU+tUOWUY86SkpXSaT1srNNq6tbXRs+dwHAVHMqlD+y8ap0p1VRlKUHBwm4ylFuN3eElGVndP3XeK0v+wdFfk9+0z+zTqXwY+Duo/Hvwf448Ry+NNA8m7lvri9Z47ktKiyKYsbFT5iVQfKANpBFfpf8OfEdz4x+HuheLrxVSbVdOtbx1X7oaeNXIHsCa7sFmNSriJ4avS5JpKS1Uk02102aa1X3NnhZzw7h8NgKOZYHFe2pTnKm/ccHGcFGT0bd4tSTjLR73imXNY8Z+EfD+s6f4d17U7WyvtW8z7FBPKsb3Bi27xGGI3Fd65Ayea6avIfjB8CPhP8AHfRYtE+KejxanHbbzbyktHNAXxuMciEMudq5AODgZBxX5deNviV4n/ZT8SweEP2dviU/xDdpREvhG/hfVbiMZwVjubcEoVHSMlMejVz5lnE8BJ1MRBOi7Wakub0cXa+u3K2/7p6HDnCVDPqUaGX1pLFpNyjOD9m1d2aqQ5uTS1/aRjFO757bftHRXJeAtb13xJ4J0nxB4o05tH1K9tIZ7qxdtzW8rqC0ZOBkqTjoK62vchNTiprZ6nxVejKlUlSnvFtOzTV1po1dP1WjCiiiqMgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP5MP+CrP/J63iP/AK9dO/8ASaOv6y/+CKv/ACjM+Gn/AHGf/TreV/Jp/wAFWf8Ak9bxH/166d/6TR1/WX/wRV/5RmfDT/uM/wDp1vK8Cv8AxJerIe5+plFFFZCCiiigAooooAKKKKACiiigAr+Ov/g44/5Oi8Df9isP/Su4r+xSv5FP+DkPRfI+Nnw28Q4/4+tDu7fP/XCcN/7VoA7v/gil/wAmsa//ANjXdf8ApHZ1+wFfiv8A8ER9Y8/4GeL9Az/x7a6LjH/Xe3jX/wBpV+1FWj3cN/CiFFFFM3CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACv5P8A/gr1/wAnlXv/AGCrD/0E1/WBX8kP/BWPUvt37bXiK1zn7FaadD9M20cn/s9KRx47+H8z+pj/AIIaf8o4/CP/AF/at/6WS1+u1flL/wAES9O+w/8ABNb4fzEYN1Lq8x/8GNyo/RRX6tVB44UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//1P7+KKKKAP45/wDg4t+F6+Hf2mfBvxWto9kXibQWtJDjhrjTZjuOfXy54h9AK9a/4Ix+Nv7c/Zx1rwXO+6XQtakKL/dguo0df/H1kr7u/wCC/fwIn+Jn7HVp8VdKjaS88AanHdybRk/Yr3EE3vw5hYnsFNfgX/wR3+Lo8EftG3vw1v5Qlp4xsGjRScA3dlmWL/yGZlHqWFY143gz0cqq8mJjfrp9/wDwT+oSiiivNPswooooAK+Hf+CFP/JlF3/2Mt//AOirevuKvhb/AIIm32neFvgX4y+A+rTeT4n8JeKrxdQsZMLNHHIkSJJtBPyM0bqCCeVPbBPZhOp89n60pv1/Q/aGiiiuw+cCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPyw/4LN/8mAeKf+vzS/8A0rir3fwn/wAirpn/AF6Q/wDoAr5h/wCC2HivTNK/Yrn8FO3man4o1jT7Kwtky000kcgnbYiglsCPB6DLAZyQD9VaHZS6Zotnps5Be3gjjYr0JRQDj24rjxfQ+hyHep8v1NSiiiuM+jCiiigAr8xPgX/yk7+OH/YK0T/0ltq/TuvzE+Bf/KTv44f9grRP/SW2rSntL0OXE/FS/wAX/tsj9O6KKKzOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK8m+O/wATrP4M/BvxL8Ur3BGiafNcxqejzBcRJ/wOQqv400r6ClJRTk9kfyQ/t5eNv+Fgftf+PteV96Q6pJYIe22wC2wx7Hys+/Wv7kf+CaHw2Pwn/YM+FvhF4vJlfQ4dRlTuJdSJu3B9w0xBr+Cj4CfCrxJ+0x+0J4a+E9nI8t/4u1eK3mn6sqzPmaY/7ibnP0r/AEqNC0XTvDeh2fh3SE8q0sII7aBP7scShVH4ACvWirJI/P6s3Ocpvq7mrRRRTICiiigAooooAKKKKACvw3/4OC/+TD7T/sadP/8ARNzX7kV+G/8AwcF/8mH2n/Y06f8A+ibmgD8X/wDggF/yeP4l/wCxMvP/AEusa/r4r+Qf/ggF/wAnj+Jf+xMvP/S6xr+vivi88/3p+iPWwf8ADCiiivHOoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+OH/AILv/wDJ7dp/2LNh/wCjbiv3G/4N9P8Akw+7/wCxp1D/ANE21fhz/wAF3/8Ak9u0/wCxZsP/AEbcV+43/Bvp/wAmH3f/AGNOof8Aom2r7/Lv91p+h4tf+JI/ciiiiu0xCiiigAooooAKKKKACiiigD8if+C5f/KOPxd/1/aT/wClkVfzGf8ABHz/AJPPsf8AsE3/AP6AK/pz/wCC5f8Ayjj8Xf8AX9pP/pZFX8xn/BHz/k8+x/7BN/8A+gCrh8SIq/A/Q/rRooortPKCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvjr/AIKB/wDJmHxE/wCwS/8A6GtfYtfHX/BQP/kzD4if9gl//Q1pS2ZcPiR/Od/wSH/5SOfC7/r+uv8A0jnr/QOr/Px/4JD/APKRz4Xf9f11/wCkc9f6B1cB6wUUUUCCiiigAooooAKKKKAPyK/4Llf8o4/F3/X9pP8A6WRV/K7/AMEpv+T1vDn/AF66j/6TSV/VF/wXK/5Rx+Lv+v7Sf/SyKv5Xf+CU3/J63hz/AK9dR/8ASaStaH8SPqhrc/rPr58+L/7LfwP+OGbrx1ocR1EYMepWv+j3qMPukSpgtt7B9yj0r6Dor2MThaOIg6VeClF9Gro9HL8zxeArrE4KtKnUW0otxf3r8jy/4P8Aw5v/AIVeCovBd9r1/wCIxbSyGG71J/MuRExysbP/ABbBwDgcdhXJftM/AvTv2ifg/qXw2u5ha3Mu24sbkjIhuouY2OOdp5Vsc7WOOa99orOeBozwzwko3ptcttdrW33OijneNpZjHNqdS1eM1NSSS95O97JJb7q1n2Pywuf2l/2jfAfw3ufhV8XPBXiW08VQW32S18R6BYrqtvO6gKk+GdE3tjLLuPJztXO0fPVp8Q/i54u+L/w+8f8A7c2k3/h7wvoLtJpkyWEkUM+ph18qS7RWZoWOFONoGUwFCljX7qVFPBBcxGC5RZEbqrDIP4Gvnq/DeIq8vNjJSjG1oySafK01zpNc1rb6N9Wz7/A+IuAwyqOllNOE6nNzThJqceeLjJ0XJT9ndPZ88V9lR3Pzs/aS074hfC39qXwp+1B4f8N3/ijQ7XSJdF1K30qPzruBS8siyLGDkgmTr90bSCRkGvM/iR4h+L37QXx6+FPjzSPAmt6N4U0DXAPM1G1aO7dpSjPNJEu/yYEVFCu7AMWPpx+slFdWIyB1JVEqzVOc1NxsviTi997PlTt3620PNy/j1Yanh5TwUJ16VKdGNRykv3clNfCny8yU5JS7dL+8fml8VvBHiv4I/tR6j+0JZ+D7jxx4U8WWUFtqttYW63V5ZXNuqosqQnl1KIMkYHzNkjAzu+CPHfj34y/GTRG+F3w+fwl4M0tmn1TUde0uO2uLlhgxpbJ94EEffBOMknBUBv0Qoq1kfLVk6dVxpuXO4pK927tKW6i3q15tJpMwlxv7TCwhiMJGdeFL2UZuUrcqjyRbp35XOEdIy20TcW1c/Onx78WPiJ4I+I/iLwX+0b8P7vxv4KvZxLod3pOlpfxxQtnMdwhz84yFycEkEgFSMVP2MPhTrGg/Fvxz8V9C8M3vgbwdrq28Om6Lfr5M7PEBvmaDJMQzu2qT/GQOAK/SGinHI/8AaYYirVcuSTlG6XMrpqzlu4q7svS97BV43tltbAYbCxputCMKjUpcjUXF8ypX5Izk4LmlrvKyi5M/K/8AZJPj74ceFvGv7OPjHwfrdpem41e/ttS+ys2nzxyKqoqTDhncglQAQR3zxXJ+Ff2cvin4x/4J9eC/DukafNpfjTwlqk2tWVjqERtpGlhvLgiN1l2lN6Sb1zgEheQDmv18ornp8M0lTVGpUcoqEoLZNRk4tarrHlVn9534jxLxLxM8XhsPGFSdalWlq5JzpwqQas/szVR3V9Oj1Pze8Z/tXfE34gfD+7+HHgn4XeKbPxprFs9kyXtkYbC0eddjStcsQCi5JQlVDY5xXCfGr9nPxf8ADr9kz4Y/B3wvZ3Ov3uheJ7C5vTYQST7d5uJZpMKpYRK8mNzAADGcZxX6uUVpVyB11N4qs5SceROyVldN6LdtpXfkrJHPhOPI4GdBZZg40qUKntZR5pS55qMoRvJ6qMYylypa+823J2t8v/to+H9e8U/sv+MPD/hiyuNSv7q0RYba1jaaaRhKhwqICzHAJ4FerfBiwvtL+D3hPTNThktrm20awililUo8bpAgZWU4IYEYIIyDXpVFeqsFFYuWLvq4qNvRt3/E+VlnM5ZVDKuVcsakql+t5RjG3p7t/mfPnx3/AGf7P4+nStK8Q6/qmmaJZeeb3T9Nm8hdQ8zZsWZhnKJtb5cc7uoxXZ/DD4K/Cr4M6X/ZHwx0K10iJgA7wpmaTH/PSVsyP/wJjXqFFVHAYdV3ifZr2j+1u9rWTey8lZddyJ59mEsDDLXXl9XjdqCdo3bbu0rczu9HK7S0WiSCiiius8kKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/kw/4Ks/8nreI/wDr107/ANJo6/rL/wCCKv8AyjM+Gn/cZ/8ATreV/Jp/wVZ/5PW8R/8AXrp3/pNHX9Zf/BFX/lGZ8NP+4z/6dbyvAr/xJerIe5+plFFFZCCiiigAooooAKKKKACiiigAr+Yb/g5N8FXdz4W+FHxFhX9xZXWq6bMcfx3SW8sQz9IJK/p5r8df+C6vwxn+IX/BP3Wdas4PPn8J6pYawuBllQObaRh7KlwxPsCe1AH4l/8ABDnxZaRal8Q/A0z4nni0+/hX1SIzRyH8C8f51/QdX8if/BLD4jD4fftleH7ad9lv4igudIlOf+ey+ZGPfM0cYr+uyrWx7OClelbsFFFFM6wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAr+M3/AIKHeKbLxj+2j8QNXsH8yOLUFsif9uxhjtnH4NERX9h3jLxPYeCfB+q+M9V4tdIs572bnH7u3QyNz9FNfwy6VYeJfjT8V7bS4czax4s1ZIlwMl7m/mAHHU5d6mR5+YS92MT+/L/glp4Iv/h9/wAE+fhX4f1NdssujLqGMYwuoyPdrkeu2YZr78rn/CXhrTfBnhXTPB+jLss9KtIbOBemI4ECKPyAroKk8sKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//1f7+KKKKAPOPjD8M9C+M3wp8R/CXxMoaw8Sabc6dNkZ2rcRlNw91J3D0Ir/ODlg+JH7KX7QLWt/EbHxP4F1grJG44E9nJgjB6o+PoynPQ1/ph1/Jr/wcHfseDQPFWkftj+C7XFrrBj0rxB5a8LdRr/o07YH/AC0jUxMT3RO7UDTad0fqB8Hfil4c+NXwx0T4p+E33WOtWqXCrnJjY8PG3+1G4KN7ivSq/nI/4JEftY23g7xJN+zP42n2WOuTG40aRj8sd4w+eEnsJQAV/wBsY6tX9G9eXVhySsfcYLEqvSU+vX1CiiiszrCvgz47/szfFLTvib/w1B+x3rsXhX4hCHyNQgnAaw1m3GP3dwpVlD7VAVipyQvKMA6/edFVCbi7oxr0IVoclRaHx78Pf+Cr3hrwpr0Xw4/bc8L33ws8Ru+yOeSN7nS7jLON0U0YfMagRq0gLJuY5IVSR+pfgz4g+AviPpQ134e63p+vWJxi4065juouenzxMy8/Wvkvxp4E8E/EfQZPC3xA0iz1vTZSGa2voUniLL0ba4IDDsRyO1fAPiT/AIJf/BO28Sjxx8Cdb174Z6yC37/Qb2RFw5DMAGJdBkZASRVH93gY7IYpfaPnq+R1E70ndee/9fcfvDRX4VWOkf8ABWf4LykeCPiH4f8AiTp4kDLB4htDbz45zzGA2055BuMjA245z1dh/wAFFP22PhvHJF8ff2fby+WBFMl7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Ud/4JB/DL9ss3XxT+GssPhX4ibAXutmLPUiowBdKoyHwABMuWAwGDADAOMmndHj/AOyn+238G/2rdAibwxdrp3iGNN13oty4FxGR94x9PNj7h16D7wU8V9i1/D18Yvgj8ef2RPim3g74mabe+FvEOmyeZbzIxQOFPE1vOhw6Hs6N7HByK/Un9mL/AILG+KfCdlB4S/aU0+XXrePaiavZBVu1QYH72M7UlI67gVb1DHmqUj1KOOT0qaM/o8orwT4L/tP/AAH/AGgrJbn4UeJbTU5tgd7Td5V3GCM/NC+2QY9cFeOCa97qjuUk1dBRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKazKil3ICgZJPAAr4N+Pf8AwUh/Zc+Axm0y71oeItYiBH2DR8XLBh2eUERJz1BfcP7poJlOMVeTPvGSRIkaWVgqqCSScAAdzX4yftz/APBUvwv8NtOuvhl+zdfQav4lk3w3Gqx4ltbDHB8snKzTenWNT13H5a/K79rL/gpF8bf2mGuPDOmSN4X8KSZQ6bZyEvcJnj7RLgGT/dAVPUE81f8A2E/+CY37QP7cesxaroFudA8FxSlLvxBeRnyfk+8lunBnkHTCkKp+8y1LkedXxt/dp/efN3wJ+APx7/bT+MyeBvhtaXHiDxBq0xuL69uXZo4Edv3lzdztu2oCcsxyzH5VDOQp/uq/YB/YB+F/7BnwuPhfwyy6r4l1QJJrWtvGElupF6IgySkEeTsTJ5JYksTXp/7In7HnwZ/Yt+FkPww+ENkV3lZdQ1GcBry/uAMeZM4A6chEGFQcAckn6oqTzgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Q/v4ooooAKKKKACiiigArP1bSdK17TZ9G1y2ivbO5QxzQToJI5EPVWVgQQfQitCigD8LP2t/+CD/7M3xtFz4o+BEh+HXiCTL+TbJ5ulSv6Nb5Biz6wsqjrsNfzo/tE/8ABI39uX9nP7RqOreEpPEujwZP9o+Hib+LaD95olAnQY5JeIAetf6ANFAH+aZ8NP2l/wBon4EySab8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TwlY6L4dyP8AXQW73E2frO7x/wDkOv1n0b/g21+GEGP+Eh+KWqXXr9n06KDP/fUstfQ/w/8A+DfL9iHwtItx4wv/ABH4ncHLR3N5HbwkemLeKOQf9/KLsl4qq/tH8kfxI/ar/aP+LqSW/wAQ/Gmq6jbygh7b7Q0VsQ3XMMWyP/x2vXf2fP8AgnL+2X+01Jb3Hwx8D340ydgP7U1BfsNiF6lhLNtDgDtGHPoK/uI+EX/BPP8AYo+BV9Fqvwz+G+jWd7AMR3VxEb24T3WW5aV1PHUEGvsukYuTerZ/P7+yH/wQJ+A/wp+zeLP2m77/AIT7W0w/9nxboNJibngrxLPjg5cop6GM1+92iaHovhrSLfQPDlnBp9hZxiKC2to1ihiReioigKqjsAAK1KKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//R/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/S/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/T/v4ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z"
+ }
+ },
+ "cell_type": "markdown",
+ "id": "07fa2dab",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "45cca85e-8f1a-47d3-bf2c-980aa7c320d6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: pypdf in ./.venv/lib/python3.9/site-packages (5.4.0)\n",
+ "Requirement already satisfied: chromadb in ./.venv/lib/python3.9/site-packages (0.6.3)\n",
+ "Requirement already satisfied: langchain_openai in ./.venv/lib/python3.9/site-packages (0.3.11)\n",
+ "Requirement already satisfied: typing_extensions>=4.0 in ./.venv/lib/python3.9/site-packages (from pypdf) (4.12.2)\n",
+ "Requirement already satisfied: build>=1.0.3 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.2.2.post1)\n",
+ "Requirement already satisfied: pydantic>=1.9 in ./.venv/lib/python3.9/site-packages (from chromadb) (2.10.6)\n",
+ "Requirement already satisfied: chroma-hnswlib==0.7.6 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.7.6)\n",
+ "Requirement already satisfied: fastapi>=0.95.2 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.115.12)\n",
+ "Requirement already satisfied: uvicorn>=0.18.3 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.34.0)\n",
+ "Requirement already satisfied: numpy>=1.22.5 in ./.venv/lib/python3.9/site-packages (from chromadb) (2.0.2)\n",
+ "Requirement already satisfied: posthog>=2.4.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (3.23.0)\n",
+ "Requirement already satisfied: onnxruntime>=1.14.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.19.2)\n",
+ "Requirement already satisfied: opentelemetry-api>=1.2.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.31.1)\n",
+ "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.31.1)\n",
+ "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.52b1)\n",
+ "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.31.1)\n",
+ "Requirement already satisfied: tokenizers>=0.13.2 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.21.1)\n",
+ "Requirement already satisfied: pypika>=0.48.9 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.48.9)\n",
+ "Requirement already satisfied: tqdm>=4.65.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (4.67.1)\n",
+ "Requirement already satisfied: overrides>=7.3.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (7.7.0)\n",
+ "Requirement already satisfied: importlib-resources in ./.venv/lib/python3.9/site-packages (from chromadb) (6.5.2)\n",
+ "Requirement already satisfied: grpcio>=1.58.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (1.71.0)\n",
+ "Requirement already satisfied: bcrypt>=4.0.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (4.3.0)\n",
+ "Requirement already satisfied: typer>=0.9.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.15.2)\n",
+ "Requirement already satisfied: kubernetes>=28.1.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (32.0.1)\n",
+ "Requirement already satisfied: tenacity>=8.2.3 in ./.venv/lib/python3.9/site-packages (from chromadb) (9.0.0)\n",
+ "Requirement already satisfied: PyYAML>=6.0.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (6.0.2)\n",
+ "Requirement already satisfied: mmh3>=4.0.1 in ./.venv/lib/python3.9/site-packages (from chromadb) (5.1.0)\n",
+ "Requirement already satisfied: orjson>=3.9.12 in ./.venv/lib/python3.9/site-packages (from chromadb) (3.10.15)\n",
+ "Requirement already satisfied: httpx>=0.27.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (0.28.1)\n",
+ "Requirement already satisfied: rich>=10.11.0 in ./.venv/lib/python3.9/site-packages (from chromadb) (14.0.0)\n",
+ "Requirement already satisfied: langchain-core<1.0.0,>=0.3.49 in ./.venv/lib/python3.9/site-packages (from langchain_openai) (0.3.49)\n",
+ "Requirement already satisfied: openai<2.0.0,>=1.68.2 in ./.venv/lib/python3.9/site-packages (from langchain_openai) (1.70.0)\n",
+ "Requirement already satisfied: tiktoken<1,>=0.7 in ./.venv/lib/python3.9/site-packages (from langchain_openai) (0.9.0)\n",
+ "Requirement already satisfied: packaging>=19.1 in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (24.2)\n",
+ "Requirement already satisfied: pyproject_hooks in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (1.2.0)\n",
+ "Requirement already satisfied: importlib-metadata>=4.6 in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (8.6.1)\n",
+ "Requirement already satisfied: tomli>=1.1.0 in ./.venv/lib/python3.9/site-packages (from build>=1.0.3->chromadb) (2.2.1)\n",
+ "Requirement already satisfied: starlette<0.47.0,>=0.40.0 in ./.venv/lib/python3.9/site-packages (from fastapi>=0.95.2->chromadb) (0.46.1)\n",
+ "Requirement already satisfied: anyio in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (4.9.0)\n",
+ "Requirement already satisfied: certifi in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (2025.1.31)\n",
+ "Requirement already satisfied: httpcore==1.* in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (1.0.7)\n",
+ "Requirement already satisfied: idna in ./.venv/lib/python3.9/site-packages (from httpx>=0.27.0->chromadb) (3.10)\n",
+ "Requirement already satisfied: h11<0.15,>=0.13 in ./.venv/lib/python3.9/site-packages (from httpcore==1.*->httpx>=0.27.0->chromadb) (0.14.0)\n",
+ "Requirement already satisfied: six>=1.9.0 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (1.17.0)\n",
+ "Requirement already satisfied: python-dateutil>=2.5.3 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.9.0.post0)\n",
+ "Requirement already satisfied: google-auth>=1.0.1 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.38.0)\n",
+ "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (1.8.0)\n",
+ "Requirement already satisfied: requests in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.32.3)\n",
+ "Requirement already satisfied: requests-oauthlib in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.0.0)\n",
+ "Requirement already satisfied: oauthlib>=3.2.2 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n",
+ "Requirement already satisfied: urllib3>=1.24.2 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (2.3.0)\n",
+ "Requirement already satisfied: durationpy>=0.7 in ./.venv/lib/python3.9/site-packages (from kubernetes>=28.1.0->chromadb) (0.9)\n",
+ "Requirement already satisfied: langsmith<0.4,>=0.1.125 in ./.venv/lib/python3.9/site-packages (from langchain-core<1.0.0,>=0.3.49->langchain_openai) (0.3.18)\n",
+ "Requirement already satisfied: jsonpatch<2.0,>=1.33 in ./.venv/lib/python3.9/site-packages (from langchain-core<1.0.0,>=0.3.49->langchain_openai) (1.33)\n",
+ "Requirement already satisfied: coloredlogs in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n",
+ "Requirement already satisfied: flatbuffers in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (25.2.10)\n",
+ "Requirement already satisfied: protobuf in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (5.29.4)\n",
+ "Requirement already satisfied: sympy in ./.venv/lib/python3.9/site-packages (from onnxruntime>=1.14.1->chromadb) (1.13.1)\n",
+ "Requirement already satisfied: distro<2,>=1.7.0 in ./.venv/lib/python3.9/site-packages (from openai<2.0.0,>=1.68.2->langchain_openai) (1.9.0)\n",
+ "Requirement already satisfied: jiter<1,>=0.4.0 in ./.venv/lib/python3.9/site-packages (from openai<2.0.0,>=1.68.2->langchain_openai) (0.9.0)\n",
+ "Requirement already satisfied: sniffio in ./.venv/lib/python3.9/site-packages (from openai<2.0.0,>=1.68.2->langchain_openai) (1.3.1)\n",
+ "Requirement already satisfied: deprecated>=1.2.6 in ./.venv/lib/python3.9/site-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.18)\n",
+ "Requirement already satisfied: googleapis-common-protos~=1.52 in ./.venv/lib/python3.9/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.69.2)\n",
+ "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.31.1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.31.1)\n",
+ "Requirement already satisfied: opentelemetry-proto==1.31.1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.31.1)\n",
+ "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n",
+ "Requirement already satisfied: opentelemetry-instrumentation==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n",
+ "Requirement already satisfied: opentelemetry-semantic-conventions==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n",
+ "Requirement already satisfied: opentelemetry-util-http==0.52b1 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.52b1)\n",
+ "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation==0.52b1->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.17.2)\n",
+ "Requirement already satisfied: asgiref~=3.0 in ./.venv/lib/python3.9/site-packages (from opentelemetry-instrumentation-asgi==0.52b1->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.8.1)\n",
+ "Requirement already satisfied: monotonic>=1.5 in ./.venv/lib/python3.9/site-packages (from posthog>=2.4.0->chromadb) (1.6)\n",
+ "Requirement already satisfied: backoff>=1.10.0 in ./.venv/lib/python3.9/site-packages (from posthog>=2.4.0->chromadb) (2.2.1)\n",
+ "Requirement already satisfied: annotated-types>=0.6.0 in ./.venv/lib/python3.9/site-packages (from pydantic>=1.9->chromadb) (0.7.0)\n",
+ "Requirement already satisfied: pydantic-core==2.27.2 in ./.venv/lib/python3.9/site-packages (from pydantic>=1.9->chromadb) (2.27.2)\n",
+ "Requirement already satisfied: markdown-it-py>=2.2.0 in ./.venv/lib/python3.9/site-packages (from rich>=10.11.0->chromadb) (3.0.0)\n",
+ "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in ./.venv/lib/python3.9/site-packages (from rich>=10.11.0->chromadb) (2.19.1)\n",
+ "Requirement already satisfied: regex>=2022.1.18 in ./.venv/lib/python3.9/site-packages (from tiktoken<1,>=0.7->langchain_openai) (2024.11.6)\n",
+ "Requirement already satisfied: huggingface-hub<1.0,>=0.16.4 in ./.venv/lib/python3.9/site-packages (from tokenizers>=0.13.2->chromadb) (0.29.3)\n",
+ "Requirement already satisfied: click>=8.0.0 in ./.venv/lib/python3.9/site-packages (from typer>=0.9.0->chromadb) (8.1.8)\n",
+ "Requirement already satisfied: shellingham>=1.3.0 in ./.venv/lib/python3.9/site-packages (from typer>=0.9.0->chromadb) (1.5.4)\n",
+ "Requirement already satisfied: httptools>=0.6.3 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.4)\n",
+ "Requirement already satisfied: python-dotenv>=0.13 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.1)\n",
+ "Requirement already satisfied: uvloop!=0.15.0,!=0.15.1,>=0.14.0 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.21.0)\n",
+ "Requirement already satisfied: watchfiles>=0.13 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.4)\n",
+ "Requirement already satisfied: websockets>=10.4 in ./.venv/lib/python3.9/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (15.0.1)\n",
+ "Requirement already satisfied: zipp>=3.1.0 in ./.venv/lib/python3.9/site-packages (from importlib-resources->chromadb) (3.21.0)\n",
+ "Requirement already satisfied: exceptiongroup>=1.0.2 in ./.venv/lib/python3.9/site-packages (from anyio->httpx>=0.27.0->chromadb) (1.2.2)\n",
+ "Requirement already satisfied: cachetools<6.0,>=2.0.0 in ./.venv/lib/python3.9/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.5.2)\n",
+ "Requirement already satisfied: pyasn1-modules>=0.2.1 in ./.venv/lib/python3.9/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.4.2)\n",
+ "Requirement already satisfied: rsa<5,>=3.1.4 in ./.venv/lib/python3.9/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n",
+ "Requirement already satisfied: filelock in ./.venv/lib/python3.9/site-packages (from huggingface-hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (3.18.0)\n",
+ "Requirement already satisfied: fsspec>=2023.5.0 in ./.venv/lib/python3.9/site-packages (from huggingface-hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (2024.12.0)\n",
+ "Requirement already satisfied: jsonpointer>=1.9 in ./.venv/lib/python3.9/site-packages (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.49->langchain_openai) (3.0.0)\n",
+ "Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in ./.venv/lib/python3.9/site-packages (from langsmith<0.4,>=0.1.125->langchain-core<1.0.0,>=0.3.49->langchain_openai) (1.0.0)\n",
+ "Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in ./.venv/lib/python3.9/site-packages (from langsmith<0.4,>=0.1.125->langchain-core<1.0.0,>=0.3.49->langchain_openai) (0.23.0)\n",
+ "Requirement already satisfied: mdurl~=0.1 in ./.venv/lib/python3.9/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->chromadb) (0.1.2)\n",
+ "Requirement already satisfied: charset-normalizer<4,>=2 in ./.venv/lib/python3.9/site-packages (from requests->kubernetes>=28.1.0->chromadb) (3.4.1)\n",
+ "Requirement already satisfied: humanfriendly>=9.1 in ./.venv/lib/python3.9/site-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n",
+ "Requirement already satisfied: mpmath<1.4,>=1.1.0 in ./.venv/lib/python3.9/site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n",
+ "Requirement already satisfied: pyasn1<0.7.0,>=0.6.1 in ./.venv/lib/python3.9/site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.6.1)\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install pypdf chromadb langchain_openai"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "f23bc8ca-0e5d-4a8c-9992-8f028cd5ae84",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from langchain.document_loaders import PyPDFLoader\n",
+ "\n",
+ "# Load PDF\n",
+ "loaders = [\n",
+ " # Duplicate documents on purpose - messy data\n",
+ " PyPDFLoader(\"docs/MachineLearning-Lecture01.pdf\"),\n",
+ " PyPDFLoader(\"docs/MachineLearning-Lecture01.pdf\"),\n",
+ " PyPDFLoader(\"docs/MachineLearning-Lecture02.pdf\"),\n",
+ " PyPDFLoader(\"docs/MachineLearning-Lecture03.pdf\")\n",
+ "]\n",
+ "docs = []\n",
+ "for loader in loaders:\n",
+ " docs.extend(loader.load())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "57596b23-fcc3-45a7-ae42-1762803344ed",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
+ "\n",
+ "text_splitter = RecursiveCharacterTextSplitter(\n",
+ " chunk_size = 1500,\n",
+ " chunk_overlap = 150\n",
+ ")\n",
+ "\n",
+ "splits = text_splitter.split_documents(docs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "0d2fa836-82a1-48db-98c2-b0845d3c62ad",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import requests\n",
+ "from typing import List\n",
+ "from langchain.embeddings.base import Embeddings\n",
+ "\n",
+ "class LocalServerEmbeddings(Embeddings):\n",
+ " def __init__(self, base_url: str):\n",
+ " self.base_url = base_url\n",
+ " self.model = \"text-embedding-nomic-embed-text-v1.5\"\n",
+ "\n",
+ " def embed_documents(self, texts: List[str]) -> List[List[float]]:\n",
+ " response = requests.post(f\"{self.base_url}/embeddings\", json={\"input\": texts})\n",
+ " data = response.json()\n",
+ "\n",
+ " return [item[\"embedding\"] for item in data[\"data\"]]\n",
+ "\n",
+ " def embed_query(self, text: str) -> List[float]:\n",
+ " response = requests.post(f\"{self.base_url}/embeddings\", json={\"input\": [text]})\n",
+ " data = response.json()\n",
+ " return data[\"data\"][0][\"embedding\"]\n",
+ "\n",
+ "embedding = LocalServerEmbeddings(base_url=\"http://localhost:1234/v1\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "96da5a05-c33e-4fbb-9a30-b5ece260ff94",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from langchain.vectorstores import Chroma\n",
+ "\n",
+ "!rm -rf ./docs/chroma\n",
+ "\n",
+ "persist_directory = 'chroma/'\n",
+ "\n",
+ "\n",
+ "vectordb = Chroma.from_documents(\n",
+ " documents=splits,\n",
+ " embedding=embedding,\n",
+ " persist_directory=persist_directory\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "ee60ebc6-b47c-4c04-af4e-620f161d5c00",
+ "metadata": {
+ "height": 132,
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "from langchain_openai import ChatOpenAI\n",
+ "\n",
+ "base_url = \"http://localhost:1234/v1\"\n",
+ "api_key = \"lm-studio\"\n",
+ "llm_model = \"phi-4@q8_0\"\n",
+ "\n",
+ "llm = ChatOpenAI(\n",
+ " base_url=base_url,\n",
+ " api_key=api_key,\n",
+ " temperature=0.9,\n",
+ " model=llm_model\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "e63e5f31",
+ "metadata": {
+ "height": 98,
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from langchain.vectorstores import Chroma\n",
+ "from langchain.embeddings.openai import OpenAIEmbeddings\n",
+ "\n",
+ "persist_directory = 'chroma/'\n",
+ "\n",
+ "vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "15fd1341",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "416\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(vectordb._collection.count())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "3a689f25",
+ "metadata": {
+ "height": 64,
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "question = \"What are the most important topics discussed in this course?\"\n",
+ "docs = vectordb.similarity_search(question,k=3)\n",
+ "len(docs)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "37ba2ad8",
+ "metadata": {},
+ "source": [
+ "### RetrievalQA chain"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "5b3ebcdd",
+ "metadata": {
+ "height": 30,
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from langchain.chains import RetrievalQA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "41f0003f",
+ "metadata": {
+ "height": 81
+ },
+ "outputs": [],
+ "source": [
+ "qa_chain = RetrievalQA.from_chain_type(\n",
+ " llm,\n",
+ " retriever=vectordb.as_retriever()\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "aac0334e",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [],
+ "source": [
+ "result = qa_chain({\"query\": question})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "10227125",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'Based on the provided context, some of the important topics that will be discussed in the course include:\\n\\n1. **Convex Optimization**: This topic is likely to be covered as part of the discussion sections.\\n\\n2. **Hidden Markov Models (HMMs)**: These are a type of machine learning algorithm for modeling time series data and will also be addressed in the discussions.\\n\\n3. **Extensions to Main Lecture Materials**: In addition to convex optimization and HMMs, there will be other topics that extend beyond what is covered in the main lectures.\\n\\nThe course appears to focus on various aspects of machine learning and possibly includes practical implementations or exercises using programming languages like MATLAB or R.'"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result[\"result\"]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5fae8e55",
+ "metadata": {},
+ "source": [
+ "### Prompt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "2b37519f",
+ "metadata": {
+ "height": 166,
+ "scrolled": true,
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "from langchain.prompts import PromptTemplate\n",
+ "\n",
+ "template = \"\"\"Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. Use three sentences maximum. Keep the answer as concise as possible. Always say \"thanks for asking!\" at the end of the answer. \n",
+ "{context}\n",
+ "Question: {question}\n",
+ "Helpful Answer:\"\"\"\n",
+ "QA_CHAIN_PROMPT = PromptTemplate.from_template(template)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "fcb5817c",
+ "metadata": {
+ "height": 132
+ },
+ "outputs": [],
+ "source": [
+ "qa_chain = RetrievalQA.from_chain_type(\n",
+ " llm,\n",
+ " retriever=vectordb.as_retriever(),\n",
+ " return_source_documents=True,\n",
+ " chain_type_kwargs={\"prompt\": QA_CHAIN_PROMPT}\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "e0fd6824",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [],
+ "source": [
+ "question = \"Will we learn about LLMs at this course?\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "f3a21b52",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [],
+ "source": [
+ "result = qa_chain({\"query\": question})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "74e2f6cc",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'The provided context does not mention learning about Large Language Models (LLMs) in this machine learning course. The focus appears to be on topics like locally weighted regression, logistic regression, and the perceptron algorithm. Thanks for asking!'"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result[\"result\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "4a2531ba",
+ "metadata": {
+ "height": 30
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:03-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:03-07:00', 'page': 0, 'page_label': '1', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture03.pdf', 'title': '', 'total_pages': 16}, page_content='MachineLearning-Lecture03 \\nInstructor (Andrew Ng):Okay. Good morning and welcome back to the third lecture of \\nthis class. So here’s what I want to do today, and some of the topics I do today may seem \\na little bit like I’m jumping, sort of, from topic to topic, but here’s, sort of, the outline for \\ntoday and the illogical flow of ideas. In the last lecture, we talked about linear regression \\nand today I want to talk about sort of an adaptation of that called locally weighted \\nregression. It’s very a popular algorithm that’s actually one of my former mentors \\nprobably favorite machine learning algorithm. \\nWe’ll then talk about a probable second interpretation of linear regression and use that to \\nmove onto our first classification algorithm, which is logistic regression; take a brief \\ndigression to tell you about something called the perceptron algorithm, which is \\nsomething we’ll come back to, again, later this quarter; and time allowing I hope to get to \\nNewton’s method, which is an algorithm for fitting logistic regression models. \\nSo this is recap where we’re talking about in the previous lecture, remember the notation \\nI defined was that I used this X superscript I, Y superscript I to denote the I training \\nexample. And when we’re talking about linear regression or linear least squares, we use \\nthis to denote the predicted value of “by my hypothesis H” on the input XI. And my \\nhypothesis was franchised by the vector of grams as theta and so we said that this was'),\n",
+ " Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:03-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:03-07:00', 'page': 0, 'page_label': '1', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture03.pdf', 'title': '', 'total_pages': 16}, page_content='MachineLearning-Lecture03 \\nInstructor (Andrew Ng):Okay. Good morning and welcome back to the third lecture of \\nthis class. So here’s what I want to do today, and some of the topics I do today may seem \\na little bit like I’m jumping, sort of, from topic to topic, but here’s, sort of, the outline for \\ntoday and the illogical flow of ideas. In the last lecture, we talked about linear regression \\nand today I want to talk about sort of an adaptation of that called locally weighted \\nregression. It’s very a popular algorithm that’s actually one of my former mentors \\nprobably favorite machine learning algorithm. \\nWe’ll then talk about a probable second interpretation of linear regression and use that to \\nmove onto our first classification algorithm, which is logistic regression; take a brief \\ndigression to tell you about something called the perceptron algorithm, which is \\nsomething we’ll come back to, again, later this quarter; and time allowing I hope to get to \\nNewton’s method, which is an algorithm for fitting logistic regression models. \\nSo this is recap where we’re talking about in the previous lecture, remember the notation \\nI defined was that I used this X superscript I, Y superscript I to denote the I training \\nexample. And when we’re talking about linear regression or linear least squares, we use \\nthis to denote the predicted value of “by my hypothesis H” on the input XI. And my \\nhypothesis was franchised by the vector of grams as theta and so we said that this was'),\n",
+ " Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:23-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:23-07:00', 'page': 8, 'page_label': '9', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture01.pdf', 'title': '', 'total_pages': 22}, page_content=\"statistics for a while or maybe algebra, we'll go over those in the discussion sections as a \\nrefresher for those of you that want one. \\nLater in this quarter, we'll also use the discussion sections to go over extensions for the \\nmaterial that I'm teaching in the main lectures. So machine learning is a huge field, and \\nthere are a few extensions that we really want to teach but didn't have time in the main \\nlectures for.\"),\n",
+ " Document(metadata={'author': '', 'creationdate': '2008-07-11T11:25:23-07:00', 'creator': 'PScript5.dll Version 5.2.2', 'moddate': '2008-07-11T11:25:23-07:00', 'page': 8, 'page_label': '9', 'producer': 'Acrobat Distiller 8.1.0 (Windows)', 'source': 'docs/MachineLearning-Lecture01.pdf', 'title': '', 'total_pages': 22}, page_content=\"statistics for a while or maybe algebra, we'll go over those in the discussion sections as a \\nrefresher for those of you that want one. \\nLater in this quarter, we'll also use the discussion sections to go over extensions for the \\nmaterial that I'm teaching in the main lectures. So machine learning is a huge field, and \\nthere are a few extensions that we really want to teach but didn't have time in the main \\nlectures for.\")]"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result[\"source_documents\"]"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": ".venv",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.21"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/Anul 3/Semestrul 2/LLM/explain_dataset.csv b/Anul 3/Semestrul 2/LLM/explain_dataset.csv
new file mode 100644
index 0000000..e8397a2
--- /dev/null
+++ b/Anul 3/Semestrul 2/LLM/explain_dataset.csv
@@ -0,0 +1,1001 @@
+Input,Response
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give a brief explanation of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the purpose of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Can you explain cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Define the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: How does the internet work?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is the purpose of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give a brief explanation of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give a brief explanation of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does the internet work?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Define data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Why is blockchain important?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Define nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Can you explain data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does general relativity work?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Can you explain the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is the purpose of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Can you explain the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: How does nanotechnology work?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Define genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Define photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is blockchain important?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Define biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is the purpose of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What are the key features of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What is the purpose of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Define genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give a brief explanation of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give a brief explanation of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is the purpose of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is nanotechnology important?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What are the key features of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the purpose of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Define genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the purpose of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give a brief explanation of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give a brief explanation of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Can you explain biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: How does nanotechnology work?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does machine learning work?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is general relativity important?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Why is machine learning important?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What are the key features of nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What are the key features of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Define data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Define quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the internet?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give a brief explanation of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What are the key features of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is dark matter important?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Why is climate change important?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Why is robotics important?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give a brief explanation of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is the purpose of the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is black holes important?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is the purpose of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give a brief explanation of machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give me an overview of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Can you explain biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What are the key features of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What are the key features of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What is the purpose of dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is the purpose of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Define evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give a brief explanation of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: What is data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: What is the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Define nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does artificial intelligence work?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: How does the stock market work?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does nanotechnology work?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Why is biotechnology important?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is the purpose of blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Give me an overview of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of quantum computing.,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Why is the human brain important?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is neural networks important?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give me an overview of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Can you explain quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: How does biotechnology work?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Can you explain nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Define climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define nanotechnology.,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: Give a brief explanation of evolution.,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Why is the internet important?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is climate change?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is the purpose of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Can you explain robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give a brief explanation of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What are the key features of quantum computing?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What is machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Why is photosynthesis important?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is the stock market important?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Give a brief explanation of data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Define artificial intelligence.,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Give me an overview of dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of the stock market.,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Why is robotics important?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: How does evolution work?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: What is robotics?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Can you explain nanotechnology?,Nanotechnology involves manipulating matter at the atomic and molecular scale for innovative applications.
+explain: How does data science work?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: How does the internet work?,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Can you explain dark matter?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: How does cryptography work?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Define robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: How does general relativity work?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does robotics work?,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: Give a brief explanation of climate change.,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does blockchain work?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is quantum computing important?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define machine learning.,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is cryptography important?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of genetic engineering.,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: Define dark matter.,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: What is the human brain?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: How does climate change work?,"Climate change refers to long-term alterations in temperature, precipitation, and weather patterns due to human activity."
+explain: Can you explain black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: What are the key features of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does quantum computing work?,Quantum computing uses quantum bits (qubits) to perform calculations exponentially faster than classical computers.
+explain: What is the purpose of neural networks?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: What are the key features of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Can you explain general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: How does genetic engineering work?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give a brief explanation of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: How does dark matter work?,Dark matter is an invisible substance that makes up most of the universe’s mass but does not emit light.
+explain: Give me an overview of biotechnology.,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Define data science.,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What is the purpose of machine learning?,Machine learning is a subset of AI that enables systems to learn from data and improve without explicit programming.
+explain: What is black holes?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give a brief explanation of the human brain.,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What are the key features of cryptography?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Define the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: What is the purpose of the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Can you explain evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: What is evolution?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: What is biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: What is the purpose of data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: How does neural networks work?,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: How does the human brain work?,"The human brain is the central organ of the nervous system, responsible for thought, memory, and emotions."
+explain: What are the key features of genetic engineering?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: Give me an overview of photosynthesis.,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Can you explain blockchain?,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Why is artificial intelligence important?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain artificial intelligence?,AI refers to computer systems capable of performing tasks that typically require human intelligence.
+explain: Can you explain the stock market?,"The stock market is a platform for buying and selling financial securities, influencing global economies."
+explain: Give me an overview of general relativity.,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Why is evolution important?,Evolution is the process by which species change over time through natural selection and genetic variation.
+explain: Why is genetic engineering important?,Genetic engineering involves modifying an organism's DNA to achieve desirable traits.
+explain: What is general relativity?,"Einstein's general relativity theory describes how massive objects warp space-time, affecting gravity."
+explain: Give a brief explanation of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: Give a brief explanation of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: How does black holes work?,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Give me an overview of the internet.,The internet is a global network of interconnected computers that enables communication and information sharing.
+explain: How does cryptography work?,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give a brief explanation of robotics.,"Robotics is the field of designing, building, and operating robots for various applications."
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Can you explain data science?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: What are the key features of photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: What is the purpose of biotechnology?,Biotechnology applies biological processes and organisms to develop new medical and industrial technologies.
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: How does photosynthesis work?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Why is data science important?,Data science involves analyzing and interpreting complex data to extract valuable insights.
+explain: Define neural networks.,"Neural networks are computing systems inspired by the human brain, used in deep learning for pattern recognition."
+explain: Give me an overview of blockchain.,Blockchain is a decentralized digital ledger that records transactions across multiple computers securely.
+explain: Can you explain photosynthesis?,Photosynthesis is the process by which plants convert sunlight into chemical energy.
+explain: Define black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
+explain: Define cryptography.,Cryptography is the science of securing information through encoding and encryption techniques.
+explain: Give me an overview of black holes.,"A black hole is a region in space where gravity is so strong that nothing, not even light, can escape."
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/DBCreate.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/DBCreate.sql
new file mode 100644
index 0000000..ef543c8
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/DBCreate.sql
@@ -0,0 +1 @@
+CREATE DATABASE StoreDB;
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryCreate.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryCreate.sql
new file mode 100644
index 0000000..f0c45f7
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryCreate.sql
@@ -0,0 +1,9 @@
+CREATE TABLE Inventory
+(
+ hmy INT PRIMARY KEY,
+ sName VARCHAR(100) NOT NULL,
+ iQuantity INT NOT NULL,
+ dPrice DECIMAL(10, 2) NOT NULL,
+ sDescription VARCHAR(255),
+ sPhotoURL VARCHAR(255)
+);
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryInsert.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryInsert.sql
new file mode 100644
index 0000000..6114a4b
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/InventoryInsert.sql
@@ -0,0 +1,7 @@
+INSERT INTO Inventory
+ (hmy, sName, iQuantity, dPrice, sDescription, sPhotoURL)
+VALUES
+ (1, 'Widget A', 100, 19.99, 'High-quality widget for various uses', 'https://i5.walmartimages.com/seo/Apple-iPhone-X-64GB-Unlocked-GSM-Phone-w-Dual-12MP-Camera-Space-Gray-B-Grade-Used_15c2b968-bb85-41a4-9292-b017f78fe797.a66ebbf32b6d53b6d6eb14c47434ac04.jpeg'),
+ (2, 'Gadget B', 50, 29.99, 'Versatile gadget with multiple features', 'https://www.zdnet.com/a/img/resize/9f3fcf92f17d47c88823e7f2c0f1454ecd3e5140/2024/09/19/8da68e24-08b1-467a-9062-a90a96c1d879/dsc02198.jpg?auto=webp&fit=crop&height=900&width=1200'),
+ (3, 'Tool C', 75, 15.49, 'Essential tool for DIY projects', 'https://www.adobe.com/uk/creativecloud/photography/discover/media_1b97e856d56c65e2461329a892f7d6a7eb5176e22.jpeg?width=1200&format=pjpg&optimize=medium'),
+ (4, 'Accessory D', 200, 9.99, 'Useful accessory for everyday tasks', 'https://cdn.thewirecutter.com/wp-content/media/2025/02/BEST-ANDROID-PHONES-2048px-samsung25ultra-hero.jpg?auto=webp&quality=75&width=1024');
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/OrderTableCreate.sql b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/OrderTableCreate.sql
new file mode 100644
index 0000000..e894da2
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/SqlScripts/OrderTableCreate.sql
@@ -0,0 +1,18 @@
+CREATE TABLE [dbo].[Orders]
+(
+ [hmy] INT IDENTITY (1, 1) NOT NULL,
+ [hCustomer] NVARCHAR (MAX) NOT NULL,
+ [sStatus] INT NOT NULL DEFAULT 0,
+ CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED ([hmy] ASC)
+);
+
+CREATE TABLE [dbo].[OrderItems]
+(
+ [hmy] INT IDENTITY (1, 1) NOT NULL,
+ [hOrder] INT NOT NULL,
+ [hProduct] INT NOT NULL,
+ [iQuantity] INT NOT NULL DEFAULT 1,
+ [dPrice] DECIMAL (18, 2) NOT NULL,
+ [sProductName] NVARCHAR (MAX) NOT NULL,
+ CONSTRAINT [PK_OrderItems] PRIMARY KEY CLUSTERED ([hmy] ASC)
+);
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/apigateway.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/apigateway.yaml
new file mode 100644
index 0000000..ea3ef9f
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/apigateway.yaml
@@ -0,0 +1,43 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: apigateway
+spec:
+ replicas: 1
+ template:
+ metadata:
+ labels:
+ app: apigateway
+ spec:
+ containers:
+ - name: apigateway
+ image: apigateway:latest
+ ports:
+ - containerPort: 80
+ env:
+ - name: ASPNETCORE_URLS
+ value: http://*:80
+ resources:
+ requests:
+ memory: "128Mi"
+ cpu: "100m"
+ limits:
+ memory: "256Mi"
+ cpu: "200m"
+ selector:
+ matchLabels:
+ app: apigateway
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: apigateway
+spec:
+ type: LoadBalancer
+ ports:
+ - port: 80
+ targetPort: 80
+ nodePort: 32003
+ selector:
+ app: apigateway
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontend.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontend.yaml
new file mode 100644
index 0000000..2c0d626
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontend.yaml
@@ -0,0 +1,57 @@
+# kubernetes-deployment-service.yaml
+
+# ---- Deployment ----
+# This object defines how to run and manage your application pods.
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: frontend # Name of the Deployment
+ labels:
+ app: react-app # Label to identify resources related to this app
+spec:
+ replicas: 1 # Number of desired pods (you can adjust this)
+ selector:
+ matchLabels:
+ app: frontend # This must match the labels in the Pod template
+ template: # Defines the Pod that will be created
+ metadata:
+ labels:
+ app: frontend # Labels applied to each Pod
+ spec:
+ containers:
+ - name: frontend # Name of the container within the Pod
+ image: frontend:latest # <<< IMPORTANT: Replace with your actual image name and tag
+ # Ensure this image is accessible by your Kubernetes cluster.
+ imagePullPolicy: Always # Or "IfNotPresent" if you prefer, especially for "latest" tags
+ ports:
+ - containerPort: 80 # The port your Nginx server is listening on inside the container
+ resources:
+ requests:
+ cpu: "100m"
+ memory: "128Mi"
+ limits:
+ cpu: "200m"
+ memory: "256Mi"
+
+---
+
+# ---- Service ----
+# This object defines how to access your application.
+apiVersion: v1
+kind: Service
+metadata:
+ name: react-app-service # Name of the Service
+ labels:
+ app: frontend # Label to identify resources related to this app
+spec:
+ type: LoadBalancer # Exposes the Service externally using a cloud provider's load balancer.
+ # Alternatives:
+ # - NodePort: Exposes the Service on each Node's IP at a static port.
+ # - ClusterIP: Exposes the Service on a cluster-internal IP (default).
+ # - Ingress: For more advanced HTTP/HTTPS routing (requires an Ingress controller).
+ selector:
+ app: frontend # This must match the labels of the Pods you want to target (from the Deployment)
+ ports:
+ - protocol: TCP
+ port: 3000 # The port the Service will be available on (externally or within the cluster)
+ targetPort: 80 # The port on the Pods (containerPort) that the Service will forward traffic to
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontendadmin.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontendadmin.yaml
new file mode 100644
index 0000000..84df0e6
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/frontendadmin.yaml
@@ -0,0 +1,57 @@
+# kubernetes-deployment-service.yaml
+
+# ---- Deployment ----
+# This object defines how to run and manage your application pods.
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: frontendadmin # Name of the Deployment
+ labels:
+ app: react-app # Label to identify resources related to this app
+spec:
+ replicas: 1 # Number of desired pods (you can adjust this)
+ selector:
+ matchLabels:
+ app: frontendadmin # This must match the labels in the Pod template
+ template: # Defines the Pod that will be created
+ metadata:
+ labels:
+ app: frontendadmin # Labels applied to each Pod
+ spec:
+ containers:
+ - name: frontendadmin # Name of the container within the Pod
+ image: frontendadmin:latest # <<< IMPORTANT: Replace with your actual image name and tag
+ # Ensure this image is accessible by your Kubernetes cluster.
+ imagePullPolicy: Always # Or "IfNotPresent" if you prefer, especially for "latest" tags
+ ports:
+ - containerPort: 80 # The port your Nginx server is listening on inside the container
+ resources:
+ requests:
+ cpu: "100m"
+ memory: "128Mi"
+ limits:
+ cpu: "200m"
+ memory: "256Mi"
+
+---
+
+# ---- Service ----
+# This object defines how to access your application.
+apiVersion: v1
+kind: Service
+metadata:
+ name: frontendadmin-service # Name of the Service
+ labels:
+ app: frontendadmin # Label to identify resources related to this app
+spec:
+ type: LoadBalancer # Exposes the Service externally using a cloud provider's load balancer.
+ # Alternatives:
+ # - NodePort: Exposes the Service on each Node's IP at a static port.
+ # - ClusterIP: Exposes the Service on a cluster-internal IP (default).
+ # - Ingress: For more advanced HTTP/HTTPS routing (requires an Ingress controller).
+ selector:
+ app: frontendadmin # This must match the labels of the Pods you want to target (from the Deployment)
+ ports:
+ - protocol: TCP
+ port: 3001 # The port the Service will be available on (externally or within the cluster)
+ targetPort: 80 # The port on the Pods (containerPort) that the Service will forward traffic to
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/inventoryservice.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/inventoryservice.yaml
new file mode 100644
index 0000000..6706b1e
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/inventoryservice.yaml
@@ -0,0 +1,70 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: inventoryservice
+spec:
+ replicas: 1
+ template:
+ metadata:
+ labels:
+ app: inventoryservice
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/path: "/metrics"
+ prometheus.io/port: "80"
+ spec:
+ containers:
+ - name: inventoryservice
+ image: inventoryservice:latest
+ ports:
+ - containerPort: 80
+ env:
+ - name: ASPNETCORE_URLS
+ value: http://*:80
+ resources:
+ requests:
+ memory: "128Mi"
+ cpu: "150m"
+ limits:
+ memory: "256Mi"
+ cpu: "200m"
+ selector:
+ matchLabels:
+ app: inventoryservice
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: inventoryservice
+ labels:
+ app: inventoryservice
+spec:
+ type: LoadBalancer
+ ports:
+ - port: 8081
+ targetPort: 80
+ nodePort: 32002
+ name: inventoryport
+ selector:
+ app: inventoryservice
+
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: inventoryservice-hpa
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: inventoryservice
+ minReplicas: 1
+ maxReplicas: 3
+ metrics:
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: 80
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/orderservice.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/orderservice.yaml
new file mode 100644
index 0000000..2e542f8
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/orderservice.yaml
@@ -0,0 +1,70 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: orderservice
+spec:
+ replicas: 1
+ template:
+ metadata:
+ labels:
+ app: orderservice
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/path: "/metrics"
+ prometheus.io/port: "80"
+ spec:
+ containers:
+ - name: orderservice
+ image: orderservice:latest
+ ports:
+ - containerPort: 80
+ env:
+ - name: ASPNETCORE_URLS
+ value: http://*:80
+ resources:
+ requests:
+ memory: "128Mi"
+ cpu: "150m"
+ limits:
+ memory: "256Mi"
+ cpu: "200m"
+ selector:
+ matchLabels:
+ app: orderservice
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: orderservice
+ labels:
+ app: orderservice
+spec:
+ type: LoadBalancer
+ ports:
+ - port: 8080
+ targetPort: 80
+ nodePort: 32001
+ name: orderport
+ selector:
+ app: orderservice
+
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: orderservice-hpa
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: orderservice
+ minReplicas: 1
+ maxReplicas: 3
+ metrics:
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: 80
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/paymentservice.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/paymentservice.yaml
new file mode 100644
index 0000000..49618fb
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/paymentservice.yaml
@@ -0,0 +1,70 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: paymentservice
+spec:
+ replicas: 1
+ template:
+ metadata:
+ labels:
+ app: paymentservice
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/path: "/metrics"
+ prometheus.io/port: "80"
+ spec:
+ containers:
+ - name: paymentservice
+ image: paymentservice:latest
+ ports:
+ - containerPort: 80
+ env:
+ - name: ASPNETCORE_URLS
+ value: http://*:80
+ resources:
+ requests:
+ memory: "128Mi"
+ cpu: "150m"
+ limits:
+ memory: "256Mi"
+ cpu: "200m"
+ selector:
+ matchLabels:
+ app: paymentservice
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: paymentservice
+ labels:
+ app: paymentservice
+spec:
+ type: LoadBalancer
+ ports:
+ - port: 8082
+ targetPort: 80
+ nodePort: 32005
+ name: paymentport
+ selector:
+ app: paymentservice
+
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: paymentservice-hpa
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: paymentservice
+ minReplicas: 1
+ maxReplicas: 3
+ metrics:
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: 80
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/prometheus.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/prometheus.yaml
new file mode 100644
index 0000000..64411df
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/prometheus.yaml
@@ -0,0 +1,57 @@
+apiVersion: v1
+kind: Service
+metadata:
+ # Creating a new service to expose the existing one.
+ # This avoids modifying the original service managed by a package manager like Helm.
+ name: prometheus-grafana-external
+ namespace: monitoring
+ labels:
+ app.kubernetes.io/name: grafana-external
+spec:
+ # Exposes the Service externally using a cloud provider's load balancer.
+ type: LoadBalancer
+ ports:
+ - name: http
+ # The port the service is exposed on externally and internally.
+ # The load balancer will forward traffic from this port.
+ port: 9000
+ # The port on the pod that the service forwards traffic to.
+ # Based on your original command, this is likely 3000 for Grafana.
+ targetPort: 3000
+ protocol: TCP
+ # This selector is crucial. It must match the labels of the pods you want to target.
+ # The 'prometheus-grafana' service likely targets pods with a label like this.
+ # Please verify the correct labels for your Grafana pods.
+ selector:
+ app.kubernetes.io/instance: prometheus
+ app.kubernetes.io/name: grafana
+
+---
+
+
+apiVersion: v1
+kind: Service
+metadata:
+ # Creating a new service to avoid modifying the original one.
+ name: prometheus-external
+ namespace: monitoring
+ labels:
+ app.kubernetes.io/name: prometheus-external
+spec:
+ # This type will provision an external load balancer.
+ type: LoadBalancer
+ ports:
+ - name: http-prometheus
+ protocol: TCP
+ # The external port the load balancer will listen on.
+ port: 9090
+ # The port on the Prometheus pods to forward traffic to.
+ targetPort: 9090
+ # This selector is crucial. It tells the service which pods to send traffic to.
+ # For the kube-prometheus stack, the pods are typically labeled like this.
+ # Please verify this matches your setup.
+ selector:
+ app.kubernetes.io/name: prometheus
+ # It's possible an instance label is also required, such as:
+ # app.kubernetes.io/instance: prometheus-kube-prometheus-prometheus
+ # Add it to the selector if your pods have it.
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/rabbitmq.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/rabbitmq.yaml
new file mode 100644
index 0000000..0756361
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/rabbitmq.yaml
@@ -0,0 +1,38 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: rabbitmq-service
+spec:
+ selector:
+ app: rabbitmq
+ ports:
+ - protocol: TCP
+ port: 5672
+ targetPort: 5672
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: rabbitmq
+spec:
+ serviceName: "rabbitmq-service"
+ replicas: 1
+ selector:
+ matchLabels:
+ app: rabbitmq
+ template:
+ metadata:
+ labels:
+ app: rabbitmq
+ spec:
+ containers:
+ - name: rabbitmq
+ image: rabbitmq:3-management
+ ports:
+ - containerPort: 5672
+ - containerPort: 15672
+ env:
+ - name: RABBITMQ_DEFAULT_USER
+ value: "user"
+ - name: RABBITMQ_DEFAULT_PASS
+ value: "password"
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/servicemonitor.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/servicemonitor.yaml
new file mode 100644
index 0000000..e2a0ea7
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/servicemonitor.yaml
@@ -0,0 +1,43 @@
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: inventoryservice-servicemonitor
+ labels:
+ release: prometheus # Ensure this label matches your Prometheus Operator release
+spec:
+ selector:
+ matchLabels:
+ app: inventoryservice
+ endpoints:
+ - port: inventoryport
+ path: /metrics
+
+---
+
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: orderservice-servicemonitor
+ labels:
+ release: prometheus # Ensure this label matches your Prometheus Operator release
+spec:
+ selector:
+ matchLabels:
+ app: orderservice
+ endpoints:
+ - port: orderport
+ path: /metrics
+---
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: paymentservice-servicemonitor
+ labels:
+ release: prometheus # Ensure this label matches your Prometheus Operator release
+spec:
+ selector:
+ matchLabels:
+ app: paymentservice
+ endpoints:
+ - port: paymentport
+ path: /metrics
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/k8s/sqldata.yaml b/Anul 3/Semestrul 2/Licenta/Practical/k8s/sqldata.yaml
new file mode 100644
index 0000000..788096b
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/k8s/sqldata.yaml
@@ -0,0 +1,70 @@
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: mssql-data
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 8Gi
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: mssql-deployment
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: mssql
+ template:
+ metadata:
+ labels:
+ app: mssql
+ spec:
+ terminationGracePeriodSeconds: 30
+ hostname: mssqlinst
+ securityContext:
+ fsGroup: 10001
+ containers:
+ - name: mssql
+ image: mcr.microsoft.com/mssql/server:2022-latest
+ resources:
+ requests:
+ memory: "2G"
+ cpu: "2000m"
+ limits:
+ memory: "2G"
+ cpu: "2000m"
+ ports:
+ - containerPort: 1433
+ env:
+ - name: MSSQL_PID
+ value: "Developer"
+ - name: ACCEPT_EULA
+ value: "Y"
+ - name: MSSQL_SA_PASSWORD
+ value: "TestPass123!"
+ volumeMounts:
+ - name: mssqldb
+ mountPath: /var/opt/mssql
+
+ volumes:
+ - name: mssqldb
+ persistentVolumeClaim:
+ claimName: mssql-data
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: mssql-deployment
+spec:
+ selector:
+ app: mssql
+ ports:
+ - protocol: TCP
+ port: 1433
+ targetPort: 1433
+ type: LoadBalancer
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/.dockerignore
new file mode 100644
index 0000000..9395e06
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/.dockerignore
@@ -0,0 +1,7 @@
+**/.vs
+**/.vscode
+**/bin
+**/obj
+Dockerfile
+.dockerignore
+README.md
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.csproj b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.csproj
new file mode 100644
index 0000000..b823f80
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.csproj
@@ -0,0 +1,15 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.http b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.http
new file mode 100644
index 0000000..89e4334
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/ApiGateway.http
@@ -0,0 +1,6 @@
+@ApiGateway_HostAddress = http://localhost:5221
+
+GET {{ApiGateway_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyForwarderHttpClientFactory.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyForwarderHttpClientFactory.cs
new file mode 100644
index 0000000..8177c21
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyForwarderHttpClientFactory.cs
@@ -0,0 +1,50 @@
+using System.Diagnostics;
+using System.Net.Http;
+using Microsoft.Extensions.Http;
+using Microsoft.Extensions.Logging;
+using Polly;
+using Yarp.ReverseProxy.Forwarder;
+
+namespace ApiGateway;
+
+// Corrected: Implements the interface directly
+public class PollyForwarderHttpClientFactory : IForwarderHttpClientFactory
+{
+ private readonly ILogger _logger;
+
+ public PollyForwarderHttpClientFactory(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ // This is the method we need to implement from the IForwarderHttpClientFactory interface
+ public HttpMessageInvoker CreateClient(ForwarderHttpClientContext context)
+ {
+ // Get the policies, passing in the logger
+ var retryPolicy = PollyPolicies.GetRetryPolicy(_logger);
+ var circuitBreakerPolicy = PollyPolicies.GetCircuitBreakerPolicy(_logger);
+ var policy = Policy.WrapAsync(circuitBreakerPolicy, retryPolicy);
+
+ // Create a Polly PolicyHttpMessageHandler
+ var policyHandler = new PolicyHttpMessageHandler(policy);
+
+ // This is the standard handler that YARP would use.
+ // It's important to configure it similarly for proper operation.
+ var innerHandler = new SocketsHttpHandler
+ {
+ UseProxy = false,
+ AllowAutoRedirect = false,
+ AutomaticDecompression = System.Net.DecompressionMethods.None,
+ UseCookies = false,
+ EnableMultipleHttp2Connections = true,
+ ActivityHeadersPropagator = new ReverseProxyPropagator(DistributedContextPropagator.Current),
+ ConnectTimeout = System.TimeSpan.FromSeconds(15),
+ };
+
+ // Chain the Polly handler with the inner handler
+ policyHandler.InnerHandler = innerHandler;
+
+ // Return a new HttpMessageInvoker with our chained handler
+ return new HttpMessageInvoker(policyHandler, disposeHandler: true);
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyPolicies.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyPolicies.cs
new file mode 100644
index 0000000..e4896a9
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/PollyPolicies.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Net;
+using System.Net.Http;
+using Microsoft.Extensions.Logging;
+using Polly;
+using Polly.Extensions.Http;
+
+namespace ApiGateway;
+
+public static class PollyPolicies
+{
+ public static IAsyncPolicy GetRetryPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(3,
+ retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
+ onRetry: (outcome, timespan, retryAttempt, context) =>
+ {
+ // Log the retry attempt
+ logger.LogWarning(
+ "Retrying request. Attempt {RetryAttempt}. Waiting {SleepDuration}ms. " +
+ "Reason: {StatusCode} - {ExceptionMessage} - {Namespace}",
+ retryAttempt,
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ });
+ }
+
+ public static IAsyncPolicy GetCircuitBreakerPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30),
+ onBreak: (outcome, timespan, context) =>
+ {
+ // Log when the circuit breaks
+ logger.LogError(
+ "Circuit broken for {BreakDuration}ms due to {StatusCode} - {ExceptionMessage} - {Namespace}",
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ },
+ onReset: (context) =>
+ {
+ // Log when the circuit resets
+ logger.LogInformation("Circuit has been reset.");
+ },
+ onHalfOpen: () =>
+ {
+ // Log when the circuit is half-open
+ logger.LogWarning("Circuit is now half-open. The next request will test the service.");
+ });
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Program.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Program.cs
new file mode 100644
index 0000000..596d690
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Program.cs
@@ -0,0 +1,39 @@
+using ApiGateway;
+using Yarp.ReverseProxy.Forwarder;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services.AddReverseProxy()
+ .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
+
+builder.Services.AddSingleton();
+
+
+builder.Services.AddCors(options =>
+{
+ options.AddPolicy("AllowFrontend",
+ policy =>
+ {
+ policy.WithOrigins("http://localhost:3000") // The origin of your frontend app
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials(); // <-- THIS IS CRITICAL
+ });
+ options.AddPolicy("AllowFrontendAdmin",
+ policy =>
+ {
+ policy.WithOrigins("http://localhost:3001") // The origin of your frontend app
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials(); // <-- THIS IS CRITICAL
+ });
+
+});
+var app = builder.Build();
+
+app.UseCors("AllowFrontend");
+app.UseCors("AllowFrontendAdmin");
+
+app.MapReverseProxy();
+
+app.Run();
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Properties/launchSettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Properties/launchSettings.json
new file mode 100644
index 0000000..c816c5d
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/Properties/launchSettings.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "http://localhost:5221",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "https://localhost:7121;http://localhost:5221",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.Development.json b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.Development.json
new file mode 100644
index 0000000..ff66ba6
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.json
new file mode 100644
index 0000000..d76645a
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/ApiGateway/appsettings.json
@@ -0,0 +1,51 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*",
+ "ReverseProxy": {
+ "Routes": {
+ "order-route": {
+ "ClusterId": "order-cluster",
+ "Match": {
+ "Path": "order/{**catch-all}"
+ },
+ "Transforms": [{ "PathPrefix": "/api" }]
+ },
+ "inventory-route": {
+ "ClusterId": "inventory-cluster",
+ "Match": {
+ "Path": "inventory/{**catch-all}"
+ },
+ "Transforms": [{ "PathPrefix": "/api" }]
+ },
+ "payment-route": {
+ "ClusterId": "payment-cluster",
+ "Match": {
+ "Path": "payment/{**catch-all}"
+ },
+ "Transforms": [{ "PathPrefix": "/api" }]
+ }
+ },
+ "Clusters": {
+ "order-cluster": {
+ "Destinations": {
+ "destination1": { "Address": "http://orderservice:8080" }
+ }
+ },
+ "inventory-cluster": {
+ "Destinations": {
+ "destination1": { "Address": "http://inventoryservice:8081" }
+ }
+ },
+ "payment-cluster": {
+ "Destinations": {
+ "destination1": { "Address": "http://paymentservice:8082" }
+ }
+ }
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.dockerignore
new file mode 100644
index 0000000..175f95f
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.dockerignore
@@ -0,0 +1,7 @@
+node_modules
+npm-debug.log
+Dockerfile
+.dockerignore
+.git
+.gitignore
+.env
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.gitignore b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/README.md b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/README.md
new file mode 100644
index 0000000..da98444
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/README.md
@@ -0,0 +1,54 @@
+# React + TypeScript + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
+
+```js
+export default tseslint.config({
+ extends: [
+ // Remove ...tseslint.configs.recommended and replace with this
+ ...tseslint.configs.recommendedTypeChecked,
+ // Alternatively, use this for stricter rules
+ ...tseslint.configs.strictTypeChecked,
+ // Optionally, add this for stylistic rules
+ ...tseslint.configs.stylisticTypeChecked,
+ ],
+ languageOptions: {
+ // other options...
+ parserOptions: {
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+})
+```
+
+You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
+
+```js
+// eslint.config.js
+import reactX from 'eslint-plugin-react-x'
+import reactDom from 'eslint-plugin-react-dom'
+
+export default tseslint.config({
+ plugins: {
+ // Add the react-x and react-dom plugins
+ 'react-x': reactX,
+ 'react-dom': reactDom,
+ },
+ rules: {
+ // other rules...
+ // Enable its recommended typescript rules
+ ...reactX.configs['recommended-typescript'].rules,
+ ...reactDom.configs.recommended.rules,
+ },
+})
+```
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/eslint.config.js b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/eslint.config.js
new file mode 100644
index 0000000..092408a
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/eslint.config.js
@@ -0,0 +1,28 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import tseslint from 'typescript-eslint'
+
+export default tseslint.config(
+ { ignores: ['dist'] },
+ {
+ extends: [js.configs.recommended, ...tseslint.configs.recommended],
+ files: ['**/*.{ts,tsx}'],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ },
+ plugins: {
+ 'react-hooks': reactHooks,
+ 'react-refresh': reactRefresh,
+ },
+ rules: {
+ ...reactHooks.configs.recommended.rules,
+ 'react-refresh/only-export-components': [
+ 'warn',
+ { allowConstantExport: true },
+ ],
+ },
+ },
+)
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/index.html b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/index.html
new file mode 100644
index 0000000..e4b78ea
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + React + TS
+
+
+
+
+
+
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package-lock.json b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package-lock.json
new file mode 100644
index 0000000..55e37f0
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package-lock.json
@@ -0,0 +1,3187 @@
+{
+ "name": "frontendadmin",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "frontendadmin",
+ "version": "0.0.0",
+ "dependencies": {
+ "bootstrap": "^5.3.6",
+ "bootstrap-icons": "^1.13.1",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.25.0",
+ "@types/react": "^19.1.2",
+ "@types/react-dom": "^19.1.2",
+ "@vitejs/plugin-react": "^4.4.1",
+ "eslint": "^9.25.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.19",
+ "globals": "^16.0.0",
+ "typescript": "~5.8.3",
+ "typescript-eslint": "^8.30.1",
+ "vite": "^6.3.5"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz",
+ "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.27.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz",
+ "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.27.3",
+ "@babel/helpers": "^7.27.4",
+ "@babel/parser": "^7.27.4",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.27.4",
+ "@babel/types": "^7.27.3",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz",
+ "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.27.5",
+ "@babel/types": "^7.27.3",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz",
+ "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
+ "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.27.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
+ "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.27.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz",
+ "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.27.3",
+ "@babel/parser": "^7.27.4",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.27.3",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
+ "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
+ "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
+ "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
+ "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
+ "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
+ "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
+ "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
+ "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
+ "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
+ "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
+ "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
+ "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
+ "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
+ "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
+ "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
+ "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
+ "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
+ "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
+ "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
+ "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
+ "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
+ "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
+ "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
+ "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
+ "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
+ "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+ "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
+ "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
+ "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.28.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz",
+ "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
+ "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/core": "^0.14.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "peer": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.9",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz",
+ "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==",
+ "dev": true
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz",
+ "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz",
+ "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz",
+ "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz",
+ "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz",
+ "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz",
+ "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz",
+ "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz",
+ "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz",
+ "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz",
+ "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz",
+ "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz",
+ "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz",
+ "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz",
+ "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz",
+ "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz",
+ "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz",
+ "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz",
+ "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz",
+ "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz",
+ "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.6.tgz",
+ "integrity": "sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==",
+ "dev": true,
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz",
+ "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==",
+ "dev": true,
+ "peerDependencies": {
+ "@types/react": "^19.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz",
+ "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.33.1",
+ "@typescript-eslint/type-utils": "8.33.1",
+ "@typescript-eslint/utils": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1",
+ "graphemer": "^1.4.0",
+ "ignore": "^7.0.0",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.33.1",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz",
+ "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.33.1",
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/typescript-estree": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz",
+ "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.33.1",
+ "@typescript-eslint/types": "^8.33.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz",
+ "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz",
+ "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz",
+ "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.33.1",
+ "@typescript-eslint/utils": "8.33.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz",
+ "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz",
+ "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.33.1",
+ "@typescript-eslint/tsconfig-utils": "8.33.1",
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/visitor-keys": "8.33.1",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz",
+ "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.33.1",
+ "@typescript-eslint/types": "8.33.1",
+ "@typescript-eslint/typescript-estree": "8.33.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz",
+ "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "8.33.1",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz",
+ "integrity": "sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.26.10",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@rolldown/pluginutils": "1.0.0-beta.9",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/bootstrap": {
+ "version": "5.3.6",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz",
+ "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.8"
+ }
+ },
+ "node_modules/bootstrap-icons": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.13.1.tgz",
+ "integrity": "sha512-ijombt4v6bv5CLeXvRWKy7CuM3TRTuPEuGaGKvTV5cz65rQSY8RQ2JcHt6b90cBBAC7s8fsf2EkQDldzCoXUjw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ]
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.25.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz",
+ "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001718",
+ "electron-to-chromium": "^1.5.160",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001721",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz",
+ "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.165",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz",
+ "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
+ "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.5",
+ "@esbuild/android-arm": "0.25.5",
+ "@esbuild/android-arm64": "0.25.5",
+ "@esbuild/android-x64": "0.25.5",
+ "@esbuild/darwin-arm64": "0.25.5",
+ "@esbuild/darwin-x64": "0.25.5",
+ "@esbuild/freebsd-arm64": "0.25.5",
+ "@esbuild/freebsd-x64": "0.25.5",
+ "@esbuild/linux-arm": "0.25.5",
+ "@esbuild/linux-arm64": "0.25.5",
+ "@esbuild/linux-ia32": "0.25.5",
+ "@esbuild/linux-loong64": "0.25.5",
+ "@esbuild/linux-mips64el": "0.25.5",
+ "@esbuild/linux-ppc64": "0.25.5",
+ "@esbuild/linux-riscv64": "0.25.5",
+ "@esbuild/linux-s390x": "0.25.5",
+ "@esbuild/linux-x64": "0.25.5",
+ "@esbuild/netbsd-arm64": "0.25.5",
+ "@esbuild/netbsd-x64": "0.25.5",
+ "@esbuild/openbsd-arm64": "0.25.5",
+ "@esbuild/openbsd-x64": "0.25.5",
+ "@esbuild/sunos-x64": "0.25.5",
+ "@esbuild/win32-arm64": "0.25.5",
+ "@esbuild/win32-ia32": "0.25.5",
+ "@esbuild/win32-x64": "0.25.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.28.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz",
+ "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.20.0",
+ "@eslint/config-helpers": "^0.2.1",
+ "@eslint/core": "^0.14.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.28.0",
+ "@eslint/plugin-kit": "^0.3.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.3.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.20",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
+ "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
+ "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz",
+ "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.4",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz",
+ "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/react": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.41.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz",
+ "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.7"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.41.1",
+ "@rollup/rollup-android-arm64": "4.41.1",
+ "@rollup/rollup-darwin-arm64": "4.41.1",
+ "@rollup/rollup-darwin-x64": "4.41.1",
+ "@rollup/rollup-freebsd-arm64": "4.41.1",
+ "@rollup/rollup-freebsd-x64": "4.41.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.41.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.41.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.41.1",
+ "@rollup/rollup-linux-arm64-musl": "4.41.1",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.41.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.41.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.41.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.41.1",
+ "@rollup/rollup-linux-x64-gnu": "4.41.1",
+ "@rollup/rollup-linux-x64-musl": "4.41.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.41.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.41.1",
+ "@rollup/rollup-win32-x64-msvc": "4.41.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup/node_modules/@types/estree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "dev": true
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+ "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+ "dev": true,
+ "dependencies": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.5",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz",
+ "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==",
+ "dev": true,
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+ "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.33.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.1.tgz",
+ "integrity": "sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.33.1",
+ "@typescript-eslint/parser": "8.33.1",
+ "@typescript-eslint/utils": "8.33.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0",
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.3.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
+ "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/fdir": {
+ "version": "6.4.5",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz",
+ "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==",
+ "dev": true,
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package.json b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package.json
new file mode 100644
index 0000000..3949908
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "frontendadmin",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "bootstrap": "^5.3.6",
+ "bootstrap-icons": "^1.13.1",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.25.0",
+ "@types/react": "^19.1.2",
+ "@types/react-dom": "^19.1.2",
+ "@vitejs/plugin-react": "^4.4.1",
+ "eslint": "^9.25.0",
+ "eslint-plugin-react-hooks": "^5.2.0",
+ "eslint-plugin-react-refresh": "^0.4.19",
+ "globals": "^16.0.0",
+ "typescript": "~5.8.3",
+ "typescript-eslint": "^8.30.1",
+ "vite": "^6.3.5"
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public copy/vite.svg b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public copy/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public copy/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public/vite.svg b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.css b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.css
new file mode 100644
index 0000000..2339378
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.css
@@ -0,0 +1,64 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+ width: 100%;
+}
+
+#root, html, body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+}
+#root {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ width: 100%;
+}
+
+html, body {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ color: #333;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.tsx b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.tsx
new file mode 100644
index 0000000..dcb1dc3
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/FrontEndAdmin/src/App.tsx
@@ -0,0 +1,107 @@
+import { useState, useEffect, useCallback } from "react";
+import type { Product } from "./models/Product";
+import * as api from "./services/api";
+import { ProductList } from "./components/ProductList";
+import { ProductForm } from "./components/ProductForm";
+import { LoadingSpinner } from "./components/LoadingSpinner";
+import { ErrorMessage } from "./components/ErrorMessage";
+
+// These imports assume you've run: npm install bootstrap bootstrap-icons
+import "bootstrap/dist/css/bootstrap.min.css";
+import "bootstrap-icons/font/bootstrap-icons.css";
+
+// Inject global styles for a better look
+const GlobalStyleInjector = () => (
+
+);
+
+type View = "list" | "add" | "edit";
+
+function App() {
+ const [products, setProducts] = useState([]);
+ const [productToEdit, setProductToEdit] = useState(null);
+ const [currentView, setCurrentView] = useState("list");
+ const [isLoading, setIsLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ const fetchProducts = useCallback(async () => {
+ try {
+ setIsLoading(true);
+ setError(null);
+ const data = await api.getProducts();
+ setProducts(data);
+ } catch (e) {
+ setError(e instanceof Error ? e.message : "An unknown error occurred.");
+ } finally {
+ setIsLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ if (currentView === "list") {
+ fetchProducts();
+ }
+ }, [currentView, fetchProducts]);
+
+ const handleGoToAdd = () => setCurrentView("add");
+ const handleGoToEdit = (product: Product) => {
+ setProductToEdit(product);
+ setCurrentView("edit");
+ };
+ const handleReturnToList = () => {
+ setProductToEdit(null);
+ setCurrentView("list");
+ };
+
+ const handleDelete = async (id: number) => {
+ if (window.confirm("Are you sure you want to delete this product?")) {
+ try {
+ await api.deleteProduct(id);
+ await fetchProducts(); // Refresh list
+ } catch (e) {
+ alert(
+ e instanceof Error
+ ? e.message
+ : "An unknown error occurred while deleting."
+ );
+ }
+ }
+ };
+
+ const renderContent = () => {
+ if (isLoading) return ;
+ if (error) return ;
+
+ return (
+
+ );
+ };
+
+ return (
+ <>
+
+
+ );
+};
+
+export default ProductList;
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/index.css b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/index.css
new file mode 100644
index 0000000..432549d
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/index.css
@@ -0,0 +1,124 @@
+:root {
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+
+#root{
+ width: 80%;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
+
+/* The Modal Overlay */
+.modal-overlay {
+ position: fixed; /* Stay in place even when scrolling */
+ top: 0;
+ left: 0;
+ width: 100vw; /* Full viewport width */
+ height: 100vh; /* Full viewport height */
+ background-color: rgba(0, 0, 0, 0.6); /* Black background with opacity */
+ display: flex; /* Use flexbox for easy centering */
+ justify-content: center;
+ align-items: center;
+ z-index: 1000; /* Make sure it's on top of other content */
+}
+
+/* The Modal Content Box */
+.modal-content {
+ background: white;
+ padding: 25px 30px;
+ border-radius: 8px;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
+ text-align: center;
+ max-width: 400px;
+ width: 90%;
+}
+
+.modal-content h2 {
+ margin-top: 0;
+ color: #333;
+}
+
+.modal-content p {
+ color: #666;
+ line-height: 1.5;
+}
+
+/* The Close Button */
+.modal-close-btn {
+ margin-top: 15px;
+ padding: 10px 20px;
+ border: none;
+ background-color: #007bff;
+ color: white;
+ border-radius: 5px;
+ cursor: pointer;
+ font-size: 16px;
+ transition: background-color 0.2s ease-in-out;
+}
+
+.modal-close-btn:hover {
+ background-color: #0056b3;
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/main.tsx b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/main.tsx
new file mode 100644
index 0000000..bef5202
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.tsx'
+
+createRoot(document.getElementById('root')!).render(
+
+
+ ,
+)
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/types/Product.ts b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/types/Product.ts
new file mode 100644
index 0000000..4a22926
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/types/Product.ts
@@ -0,0 +1,18 @@
+export type Product = {
+ id: number;
+ name: string;
+ description: string;
+ price: number;
+ photoUrl: string;
+ quantity: number;
+}
+
+export type ProductCardProps = {
+ product: Product;
+ onAddToCart: (product: Product) => void;
+}
+
+export type ProductListProps = {
+ products: Product[];
+ onAddToCart: (product: Product) => void;
+};
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/vite-env.d.ts b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.app.json b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.app.json
new file mode 100644
index 0000000..c9ccbd4
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.app.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2020",
+ "useDefineForClassFields": true,
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["src"]
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.json b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.json
new file mode 100644
index 0000000..1ffef60
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "files": [],
+ "references": [
+ { "path": "./tsconfig.app.json" },
+ { "path": "./tsconfig.node.json" }
+ ]
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.node.json b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.node.json
new file mode 100644
index 0000000..9728af2
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/tsconfig.node.json
@@ -0,0 +1,25 @@
+{
+ "compilerOptions": {
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "erasableSyntaxOnly": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/vite.config.ts b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/vite.config.ts
new file mode 100644
index 0000000..8b0f57b
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/Frontend/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/.dockerignore
new file mode 100644
index 0000000..9395e06
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/.dockerignore
@@ -0,0 +1,7 @@
+**/.vs
+**/.vscode
+**/bin
+**/obj
+Dockerfile
+.dockerignore
+README.md
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Controllers/InventoryController.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Controllers/InventoryController.cs
new file mode 100644
index 0000000..2da82f1
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Controllers/InventoryController.cs
@@ -0,0 +1,111 @@
+using InventoryService.Models;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace InventoryService.Controllers
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class InventoryController : ControllerBase
+ {
+ private readonly StoreContext _storeContext;
+
+ public InventoryController(StoreContext storeContext)
+ {
+ _storeContext = storeContext;
+ }
+
+ [HttpGet]
+ public IActionResult Get()
+ {
+ return Ok(_storeContext.Products.ToList());
+ }
+
+ [HttpGet("{id}")]
+ public IActionResult Get(int id)
+ {
+ return Ok(_storeContext.Products.FirstOrDefault(p => p.Id == id));
+ }
+
+ [HttpPost]
+ public IActionResult Post([FromBody] Product product)
+ {
+ if (product == null)
+ {
+ return BadRequest("Product cannot be null");
+ }
+
+ product.Id = default;
+
+ _storeContext.Products.Add(product);
+ _storeContext.SaveChanges();
+ return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
+ }
+
+ [HttpPut("{id}")]
+ public IActionResult Put(int id, [FromBody] Product product)
+ {
+ if (product == null || product.Id != id)
+ {
+ return BadRequest("Product data is invalid");
+ }
+
+ var existingProduct = _storeContext.Products.FirstOrDefault(p => p.Id == id);
+ if (existingProduct == null)
+ {
+ return NotFound();
+ }
+
+ existingProduct.Name = product.Name;
+ existingProduct.Price = product.Price;
+ existingProduct.Quantity = product.Quantity;
+
+ _storeContext.SaveChanges();
+ return NoContent();
+ }
+ [HttpDelete("{id}")]
+ public IActionResult Delete(int id)
+ {
+ var product = _storeContext.Products.FirstOrDefault(p => p.Id == id);
+ if (product == null)
+ {
+ return NotFound();
+ }
+
+ _storeContext.Products.Remove(product);
+ _storeContext.SaveChanges();
+ return NoContent();
+ }
+ [HttpPost("{id}/update-stock")]
+ public IActionResult UpdateStock([FromQuery] int newStock, int id)
+ {
+ var product = _storeContext.Products.FirstOrDefault(p => p.Id == id);
+ if (product == null)
+ {
+ return NotFound();
+ }
+
+ if (newStock < 0)
+ {
+ return BadRequest("Stock cannot be negative");
+ }
+
+ product.Quantity = newStock;
+ _storeContext.SaveChanges();
+ return Ok(product);
+ }
+ [HttpGet("check-availability/{id}")]
+ public IActionResult CheckAvailability(int id)
+ {
+ var product = _storeContext.Products.FirstOrDefault(p => p.Id == id);
+ if (product == null)
+ {
+ return NotFound();
+ }
+
+ return Ok(new { product.Id, product.Name, IsAvailable = product.Quantity > 0 });
+ }
+
+
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/InventoryService.csproj b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/InventoryService.csproj
new file mode 100644
index 0000000..227a4db
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/InventoryService.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/InventoryService.http b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/InventoryService.http
new file mode 100644
index 0000000..3706936
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/InventoryService.http
@@ -0,0 +1,6 @@
+@InventoryService_HostAddress = http://localhost:5125
+
+GET {{InventoryService_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/Order.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/Order.cs
new file mode 100644
index 0000000..6d589b5
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/Order.cs
@@ -0,0 +1,31 @@
+namespace InventoryService.Models;
+
+
+public enum OrderStatus
+{
+ Pending,
+ Processing,
+ PaymentReceived
+}
+
+public class Order
+{
+
+ public int Id { get; set; }
+ public required string CustomerId { get; set; }
+ public OrderStatus Status { get; set; } = OrderStatus.Pending;
+
+ public ICollection OrderItems { get; set; } = new List();
+
+}
+
+public class OrderItem
+{
+
+ public int Id { get; set; }
+ public int OrderId { get; set; }
+ public int ProductId { get; set; }
+ public int Quantity { get; set; } = 1;
+ public decimal Price { get; set; }
+ public required string ProductName { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/Product.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/Product.cs
new file mode 100644
index 0000000..988c7a7
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/Product.cs
@@ -0,0 +1,22 @@
+using System;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace InventoryService.Models;
+
+[Table("Inventory")]
+public class Product
+{
+ [Column("hmy")]
+ public int Id { get; set; }
+ [Column("sName")]
+ public required string Name { get; set; }
+ [Column("sDescription")]
+ public required string Description { get; set; }
+ [Column("dPrice")]
+ public decimal Price { get; set; }
+ [Column("iQuantity")]
+ public int Quantity { get; set; }
+ [Column("sPhotoUrl")]
+ public required string PhotoUrl { get; set; }
+
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/PurchaseMessage.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/PurchaseMessage.cs
new file mode 100644
index 0000000..75efbfa
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/PurchaseMessage.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace InventoryService.Models;
+
+public class PurchaseMessage
+{
+ public int OrderId { get; set; }
+ public bool IsSuccess { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/StoreContext.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/StoreContext.cs
new file mode 100644
index 0000000..5e31e7e
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Models/StoreContext.cs
@@ -0,0 +1,22 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+
+namespace InventoryService.Models;
+
+public class StoreContext : DbContext
+{
+ public DbSet Products { get; set; }
+
+ public StoreContext(DbContextOptions options) : base(options)
+ {
+ }
+
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ var productEntity = modelBuilder.Entity();
+ productEntity.HasKey(p => p.Id);
+ productEntity.Property(p => p.Id)
+ .ValueGeneratedOnAdd();
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Program.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Program.cs
new file mode 100644
index 0000000..61a50ba
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Program.cs
@@ -0,0 +1,54 @@
+using InventoryService.Models;
+using InventoryService.Services;
+using Microsoft.EntityFrameworkCore;
+using Polly.Registry;
+using Prometheus;
+
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen(c =>
+{
+ c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "InventoryService", Version = "v1" });
+});
+
+builder.Services.AddDbContext(
+ o => o.UseSqlServer(builder.Configuration.GetConnectionString("InventoryDatabase")));
+builder.Services.AddHostedService();
+
+var registry = new PolicyRegistry
+{
+ { "CircuitBreakerPolicy", PollyPolicies.GetCircuitBreakerPolicy(builder.Services.BuildServiceProvider().GetRequiredService>()) }
+};
+builder.Services.AddSingleton>(registry);
+
+builder.Services.AddHttpClient("InventoryServiceClient")
+ .AddPolicyHandler((serviceProvider, request) =>
+ {
+ // Get a logger from the service provider
+ var logger = serviceProvider.GetRequiredService>();
+ // Pass the logger to the policy
+ return PollyPolicies.GetRetryPolicy(logger);
+ })
+ .AddPolicyHandlerFromRegistry("CircuitBreakerPolicy");
+
+var app = builder.Build();
+
+app.UseSwagger();
+app.UseSwaggerUI();
+
+
+app.UseHttpsRedirection();
+app.UseRouting();
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.UseHttpMetrics();
+app.MapMetrics();
+
+app.Run();
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Properties/launchSettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Properties/launchSettings.json
new file mode 100644
index 0000000..b77aa1b
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Properties/launchSettings.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "http://localhost:5125",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "https://localhost:7193;http://localhost:5125",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Services/PollyPolicies.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Services/PollyPolicies.cs
new file mode 100644
index 0000000..76abc5c
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Services/PollyPolicies.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Net;
+using System.Net.Http;
+using Microsoft.Extensions.Logging;
+using Polly;
+using Polly.Extensions.Http;
+using Polly.Timeout;
+
+namespace InventoryService.Services;
+
+public static class PollyPolicies
+{
+ public static IAsyncPolicy GetRetryPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(3,
+ retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
+ onRetry: (outcome, timespan, retryAttempt, context) =>
+ {
+ // Log the retry attempt
+ logger.LogWarning(
+ "Retrying request. Attempt {RetryAttempt}. Waiting {SleepDuration}ms. " +
+ "Reason: {StatusCode} - {ExceptionMessage} - {Namespace}",
+ retryAttempt,
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ });
+ }
+
+ public static IAsyncPolicy GetCircuitBreakerPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .CircuitBreakerAsync(10, TimeSpan.FromSeconds(30),
+ onBreak: (outcome, timespan, context) =>
+ {
+ // Log when the circuit breaks
+ logger.LogError(
+ "Circuit broken for {BreakDuration}ms due to {StatusCode} - {ExceptionMessage} - {Namespace}",
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ },
+ onReset: (context) =>
+ {
+ // Log when the circuit resets
+ logger.LogInformation("Circuit has been reset.");
+ },
+ onHalfOpen: () =>
+ {
+ // Log when the circuit is half-open
+ logger.LogWarning("Circuit is now half-open. The next request will test the service.");
+ });
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Services/RabbitMqConsumerService.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Services/RabbitMqConsumerService.cs
new file mode 100644
index 0000000..97a9aa1
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/Services/RabbitMqConsumerService.cs
@@ -0,0 +1,111 @@
+using System;
+using System.Text;
+using System.Text.Json;
+using InventoryService.Models;
+using RabbitMQ.Client;
+using RabbitMQ.Client.Events;
+
+namespace InventoryService.Services;
+
+public class RabbitMqConsumerService : BackgroundService
+{
+ private readonly string user;
+ private readonly string password;
+ private readonly string host;
+ private readonly int port;
+ private readonly IConnectionFactory _factory;
+ private readonly StoreContext _storeContext;
+ private readonly IHttpClientFactory _httpClientFactory;
+ public RabbitMqConsumerService(IConfiguration configuration, StoreContext storeContext, IHttpClientFactory httpClientFactory)
+ {
+ _storeContext = storeContext ?? throw new ArgumentNullException(nameof(storeContext));
+ _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+ user = configuration["RabbitMq:User"] ?? throw new ArgumentNullException("RabbitMq:User is not configured");
+ password = configuration["RabbitMq:Password"] ?? throw new ArgumentNullException("RabbitMq:Password is not configured");
+ host = configuration["RabbitMq:Host"] ?? throw new ArgumentNullException("RabbitMq:Host is not configured");
+ port = int.Parse(configuration["RabbitMq:Port"] ?? throw new ArgumentNullException("RabbitMq:Port is not configured")); ;
+ _factory = new ConnectionFactory
+ {
+ UserName = user,
+ Password = password,
+ HostName = host,
+ Port = port
+ };
+ }
+
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+ {
+ stoppingToken.ThrowIfCancellationRequested();
+
+ var connection = await _factory.CreateConnectionAsync();
+ var channel = await connection.CreateChannelAsync();
+
+ await channel.QueueDeclareAsync(queue: "inventory_queue",
+ durable: false,
+ exclusive: false,
+ autoDelete: false,
+ arguments: null);
+ var consumer = new AsyncEventingBasicConsumer(channel);
+ consumer.ReceivedAsync += async (model, ea) =>
+ {
+ var body = ea.Body.ToArray();
+ var message = Encoding.UTF8.GetString(body);
+ Console.WriteLine($"Received message: {message}");
+ var purchaseMessage = JsonSerializer.Deserialize(message);
+ if (purchaseMessage == null)
+ {
+ Console.WriteLine("Failed to deserialize message.");
+ return;
+ }
+ var order = await GetOrderFromMessage(purchaseMessage);
+ foreach (var item in order.OrderItems)
+ {
+ var product = await _storeContext.Products.FindAsync(item.ProductId);
+ if (product == null)
+ {
+ Console.WriteLine($"Product with ID {item.ProductId} not found.");
+ continue;
+ }
+ if (product.Quantity < item.Quantity)
+ {
+ Console.WriteLine($"Insufficient stock for product {product.Name}. Available: {product.Quantity}, Requested: {item.Quantity}");
+ continue;
+ }
+ product.Quantity -= item.Quantity;
+ }
+ await _storeContext.SaveChangesAsync();
+ Console.WriteLine($"Processed order {order.Id} for customer {order.CustomerId} with {order.OrderItems.Count} items.");
+ await channel.BasicAckAsync(ea.DeliveryTag, false);
+ };
+ await channel.BasicConsumeAsync(queue: "inventory_queue",
+ autoAck: false,
+ consumer: consumer);
+ Console.WriteLine("RabbitMQ consumer started. Waiting for messages...");
+ while (!stoppingToken.IsCancellationRequested)
+ {
+ await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
+ }
+
+ }
+
+ private async Task GetOrderFromMessage(PurchaseMessage purchaseMessage)
+ {
+ string orderServiceUrl = $"http://orderservice:8080/api/order/{purchaseMessage.OrderId}";
+ Order order;
+ var client = _httpClientFactory.CreateClient("InventoryServiceClient");
+ var response = await client.GetAsync(orderServiceUrl);
+
+ if (!response.IsSuccessStatusCode)
+ {
+ throw new HttpRequestException($"Order with ID {purchaseMessage.OrderId} not found.");
+ }
+
+ var contentStream = await response.Content.ReadAsStreamAsync();
+ // Use JsonSerializer to convert the JSON response into your Order object.
+ order = await JsonSerializer.DeserializeAsync(contentStream, new JsonSerializerOptions { PropertyNameCaseInsensitive = true })
+ ?? throw new InvalidOperationException("Order could not be parsed or is empty.");
+
+ return order;
+ }
+
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/appsettings.Development.json b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/appsettings.Development.json
new file mode 100644
index 0000000..ff66ba6
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/appsettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/appsettings.json
new file mode 100644
index 0000000..54c72c7
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/InventoryService/appsettings.json
@@ -0,0 +1,18 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*",
+ "ConnectionStrings": {
+ "InventoryDatabase": "Server=mssql-deployment,1433;Database=StoreDB;User Id=sa;Password=TestPass123!;TrustServerCertificate=True;"
+ },
+ "RabbitMQ": {
+ "Host": "rabbitmq-service",
+ "User": "user",
+ "Password": "password",
+ "Port": 5672
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/.dockerignore
new file mode 100644
index 0000000..9395e06
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/.dockerignore
@@ -0,0 +1,7 @@
+**/.vs
+**/.vscode
+**/bin
+**/obj
+Dockerfile
+.dockerignore
+README.md
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Controllers/OrderController.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Controllers/OrderController.cs
new file mode 100644
index 0000000..11bae30
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Controllers/OrderController.cs
@@ -0,0 +1,133 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using OrderService.Models;
+
+namespace OrderService.Controllers;
+
+[ApiController]
+[Route("api/[controller]")]
+public class OrderController : ControllerBase
+{
+
+ private readonly ILogger _logger;
+ public StoreContext _storeContext { get; }
+
+ public OrderController(ILogger logger, StoreContext storeContext)
+ {
+ _logger = logger;
+ _storeContext = storeContext;
+ }
+
+
+ [HttpGet]
+ public IActionResult Get()
+ {
+ _logger.LogInformation("Getting all orders");
+ var sessionId = HttpContext.Session.Id;
+ var orders = _storeContext.Orders.Include(o => o.OrderItems).Where(o => o.CustomerId == sessionId).ToList();
+ if (orders == null || !orders.Any())
+ {
+ _logger.LogInformation("No orders found for session {SessionId}", sessionId);
+ return NotFound("No orders found for the current session.");
+ }
+ return Ok(orders);
+ }
+
+ [HttpGet("{id}")]
+ public IActionResult Get(int id)
+ {
+ var order = _storeContext.Orders.Include(o => o.OrderItems).Where(o => o.Id == id).FirstOrDefault();
+ if (order == null)
+ {
+ return NotFound("No orders found for the given id.");
+ }
+ return Ok(order);
+ }
+
+ [HttpGet("getCurrentOrder")]
+ public IActionResult GetCurrentOrder()
+ {
+ var sessionId = HttpContext.Session.Id;
+ var orders = _storeContext.Orders.Include(o => o.OrderItems).Where(o => o.CustomerId == sessionId && o.Status == OrderStatus.Pending).FirstOrDefault();
+ if (orders == null)
+ {
+ HttpContext.Session.SetString("SessionEstablished", DateTime.UtcNow.ToString());
+ var newOrder = new Order
+ {
+ CustomerId = sessionId,
+ Status = OrderStatus.Pending
+ };
+ _storeContext.Orders.Add(newOrder);
+ _storeContext.SaveChanges();
+ _logger.LogInformation("Created a new order for session {SessionId}", sessionId);
+ return Ok(newOrder);
+ }
+ return Ok(orders);
+ }
+
+ [HttpPost("addProduct")]
+ public IActionResult AddOrderItem([FromBody] ProductDto productDto)
+ {
+ if (productDto == null)
+ {
+ _logger.LogError("ProductDto is null");
+ return BadRequest("Product data is required.");
+ }
+
+ var sessionId = HttpContext.Session.Id;
+ var order = _storeContext.Orders.Include(o => o.OrderItems).FirstOrDefault(o => o.CustomerId == sessionId && o.Status == OrderStatus.Pending);
+
+ if (order == null)
+ {
+ return NotFound("No pending order found for the current session. Please create a new order first.");
+ }
+
+ var orderItem = order.OrderItems.FirstOrDefault(oi => oi.ProductId == productDto.Id);
+ if (orderItem != null)
+ {
+ orderItem.Quantity += productDto.Quantity;
+ _logger.LogInformation("Updated quantity for product {ProductName} in order for session {SessionId}", productDto.Name, sessionId);
+ }
+ else
+ {
+ orderItem = new OrderItem
+ {
+ ProductId = productDto.Id,
+ Quantity = productDto.Quantity,
+ Price = productDto.Price,
+ OrderId = order.Id,
+ ProductName = productDto.Name
+ };
+ order.OrderItems.Add(orderItem);
+ }
+
+ _storeContext.SaveChanges();
+
+ _logger.LogInformation("Added product {ProductName} to order for session {SessionId}", productDto.Name, sessionId);
+ return Ok(order);
+ }
+
+ [HttpPost("checkout/{id}")]
+ public async Task Checkout(int id)
+ {
+ var sessionId = HttpContext.Session.Id;
+ var order = _storeContext.Orders.Include(o => o.OrderItems).FirstOrDefault(o => o.Id == id);
+
+ if (order == null)
+ {
+ return NotFound("No pending order found for the current session.");
+ }
+
+ if (!order.OrderItems.Any())
+ {
+ return BadRequest("Cannot checkout an empty order.");
+ }
+
+ order.Status = OrderStatus.Processing;
+ _storeContext.Orders.Update(order);
+ await _storeContext.SaveChangesAsync();
+
+ _logger.LogInformation("Checkout initiated for order {OrderId} in session {SessionId}", order.Id, sessionId);
+ return Ok(order);
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/Order.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/Order.cs
new file mode 100644
index 0000000..ef1fab7
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/Order.cs
@@ -0,0 +1,46 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace OrderService.Models;
+
+public enum OrderStatus
+{
+ Pending,
+ Processing,
+ PaymentReceived
+}
+
+[Table("Orders")]
+public class Order
+{
+ [Key]
+ [Column("hmy")]
+ public int Id { get; set; }
+ [Column("hCustomer")]
+ public required string CustomerId { get; set; }
+ [Column("sStatus")]
+ public OrderStatus Status { get; set; } = OrderStatus.Pending;
+
+ public virtual ICollection OrderItems { get; set; } = new List();
+
+}
+
+[Table("OrderItems")]
+public class OrderItem
+{
+ [Key]
+ [Column("hmy")]
+ public int Id { get; set; }
+ [ForeignKey("Orders")]
+ [Column("hOrder")]
+ public int OrderId { get; set; }
+ [Column("hProduct")]
+ public int ProductId { get; set; }
+ [Column("iQuantity")]
+ public int Quantity { get; set; } = 1;
+ [Column("dPrice")]
+ public decimal Price { get; set; }
+ [Column("sProductName")]
+ public required string ProductName { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/ProductDto.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/ProductDto.cs
new file mode 100644
index 0000000..7c89944
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/ProductDto.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace OrderService.Models;
+
+public class ProductDto
+{
+ public int Id { get; set; }
+ public required string Name { get; set; }
+ public decimal Price { get; set; }
+ public int Quantity { get; set; }
+
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/PurchaseMessage.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/PurchaseMessage.cs
new file mode 100644
index 0000000..3ea63a2
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/PurchaseMessage.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace OrderService.Models;
+
+public class PurchaseMessage
+{
+ public int OrderId { get; set; }
+ public bool IsSuccess { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/StoreContext.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/StoreContext.cs
new file mode 100644
index 0000000..ccdda2f
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Models/StoreContext.cs
@@ -0,0 +1,45 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+
+namespace OrderService.Models;
+
+public class StoreContext : DbContext
+{
+ public DbSet Orders { get; set; }
+ public DbSet OrderItems { get; set; }
+
+ public StoreContext(DbContextOptions options) : base(options)
+ {
+ }
+
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+ modelBuilder.Entity(orderEntity =>
+ {
+ // Define the one-to-many relationship from the Order side.
+ // This single block is enough to configure the entire relationship.
+ orderEntity.HasMany(p => p.OrderItems)
+ .WithOne()
+ .HasForeignKey(p => p.OrderId);
+
+ orderEntity.Property(p => p.CustomerId)
+ .IsRequired();
+
+ // Store the enum as a string in the database (e.g., "Pending")
+ // This is generally more readable than storing it as an integer.
+ orderEntity.Property(p => p.Status);
+ });
+
+ // Configure the OrderItem entity
+ modelBuilder.Entity(orderItemEntity =>
+ {
+ // The relationship is already configured above, so we don't need to repeat it.
+ // We only need to configure properties specific to OrderItem here.
+ orderItemEntity.HasKey(p => p.Id);
+ orderItemEntity.Property(p => p.Id)
+ .ValueGeneratedOnAdd();
+ });
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/OrderService.csproj b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/OrderService.csproj
new file mode 100644
index 0000000..227a4db
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/OrderService.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Program.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Program.cs
new file mode 100644
index 0000000..8654b16
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Program.cs
@@ -0,0 +1,80 @@
+using Microsoft.EntityFrameworkCore;
+using OrderService.Models;
+using OrderService.Services;
+using Prometheus;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services.AddDistributedMemoryCache();
+
+builder.Services.AddSession(options =>
+{
+ options.IdleTimeout = TimeSpan.FromDays(1);
+ options.Cookie.HttpOnly = true;
+ options.Cookie.IsEssential = true;
+});
+builder.Services.AddCors(options =>
+{
+ options.AddPolicy("AllowBackend",
+ policy =>
+ {
+ policy.WithOrigins("http://localhost:8080") // The origin of your backend app
+ .AllowAnyHeader()
+ .AllowAnyMethod()
+ .AllowCredentials(); // <-- THIS IS CRITICAL
+ });
+});
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen(c =>
+{
+ c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "OrderService", Version = "v1" });
+});
+
+builder.Services.AddDbContext(
+ o => o.UseSqlServer(builder.Configuration.GetConnectionString("OrderDatabase")));
+
+builder.Services.AddHostedService();
+
+builder.Services.AddHttpClient("OrderServiceClient")
+ .AddPolicyHandler((serviceProvider, request) =>
+ {
+ // Get a logger from the service provider
+ var logger = serviceProvider.GetRequiredService>();
+ // Pass the logger to the policy
+ return PollyPolicies.GetRetryPolicy(logger);
+ })
+ .AddPolicyHandler((serviceProvider, request) =>
+ {
+ var logger = serviceProvider.GetRequiredService>();
+ return PollyPolicies.GetCircuitBreakerPolicy(logger);
+ });
+
+var app = builder.Build();
+
+app.UseSwagger();
+app.UseSwaggerUI(options =>
+{
+ options.UseRequestInterceptor("(request) => { request.credentials = 'include'; return request; }");
+});
+
+
+app.UseHttpsRedirection();
+app.UseRouting();
+
+app.UseCors("AllowBackend");
+
+app.UseSession();
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.UseHttpMetrics();
+app.MapMetrics();
+
+
+app.Run();
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Properties/launchSettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Properties/launchSettings.json
new file mode 100644
index 0000000..b2651af
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Properties/launchSettings.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "http://localhost:5224",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "https://localhost:7146;http://localhost:5224",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Services/PollyPolicies.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Services/PollyPolicies.cs
new file mode 100644
index 0000000..68c5a96
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Services/PollyPolicies.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Net;
+using System.Net.Http;
+using Microsoft.Extensions.Logging;
+using Polly;
+using Polly.Extensions.Http;
+
+namespace OrderService.Services;
+
+public static class PollyPolicies
+{
+ public static IAsyncPolicy GetRetryPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(3,
+ retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
+ onRetry: (outcome, timespan, retryAttempt, context) =>
+ {
+ // Log the retry attempt
+ logger.LogWarning(
+ "Retrying request. Attempt {RetryAttempt}. Waiting {SleepDuration}ms. " +
+ "Reason: {StatusCode} - {ExceptionMessage} - {Namespace}",
+ retryAttempt,
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ });
+ }
+
+ public static IAsyncPolicy GetCircuitBreakerPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30),
+ onBreak: (outcome, timespan, context) =>
+ {
+ // Log when the circuit breaks
+ logger.LogError(
+ "Circuit broken for {BreakDuration}ms due to {StatusCode} - {ExceptionMessage} - {Namespace}",
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ },
+ onReset: (context) =>
+ {
+ // Log when the circuit resets
+ logger.LogInformation("Circuit has been reset.");
+ },
+ onHalfOpen: () =>
+ {
+ // Log when the circuit is half-open
+ logger.LogWarning("Circuit is now half-open. The next request will test the service.");
+ });
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Services/RabbitMqConsumerService.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Services/RabbitMqConsumerService.cs
new file mode 100644
index 0000000..cda2e52
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/Services/RabbitMqConsumerService.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Text;
+using System.Text.Json;
+using OrderService.Models;
+using RabbitMQ.Client;
+using RabbitMQ.Client.Events;
+
+namespace OrderService.Services;
+
+public class RabbitMqConsumerService : BackgroundService
+{
+ private readonly string user;
+ private readonly string password;
+ private readonly string host;
+ private readonly int port;
+ private readonly IConnectionFactory _factory;
+ private readonly StoreContext _storeContext;
+ public RabbitMqConsumerService(IConfiguration configuration, StoreContext storeContext)
+ {
+ _storeContext = storeContext ?? throw new ArgumentNullException(nameof(storeContext));
+ user = configuration["RabbitMq:User"] ?? throw new ArgumentNullException("RabbitMq:User is not configured");
+ password = configuration["RabbitMq:Password"] ?? throw new ArgumentNullException("RabbitMq:Password is not configured");
+ host = configuration["RabbitMq:Host"] ?? throw new ArgumentNullException("RabbitMq:Host is not configured");
+ port = int.Parse(configuration["RabbitMq:Port"] ?? throw new ArgumentNullException("RabbitMq:Port is not configured")); ;
+ _factory = new ConnectionFactory
+ {
+ UserName = user,
+ Password = password,
+ HostName = host,
+ Port = port
+ };
+ }
+
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+ {
+ stoppingToken.ThrowIfCancellationRequested();
+
+ var connection = await _factory.CreateConnectionAsync();
+ var channel = await connection.CreateChannelAsync();
+
+ await channel.QueueDeclareAsync(queue: "purchase_queue",
+ durable: false,
+ exclusive: false,
+ autoDelete: false,
+ arguments: null);
+ var consumer = new AsyncEventingBasicConsumer(channel);
+ consumer.ReceivedAsync += async (model, ea) =>
+ {
+ var body = ea.Body.ToArray();
+ var message = Encoding.UTF8.GetString(body);
+ Console.WriteLine($"Received message: {message}");
+ var purchaseMessage = JsonSerializer.Deserialize(message);
+ if (purchaseMessage == null)
+ {
+ Console.WriteLine("Failed to deserialize message.");
+ return;
+ }
+ var order = await _storeContext.Orders.FindAsync(purchaseMessage.OrderId);
+ if (order == null)
+ {
+ Console.WriteLine($"Order with ID {purchaseMessage.OrderId} not found.");
+ return;
+ }
+ order.Status = purchaseMessage.IsSuccess ? OrderStatus.PaymentReceived : OrderStatus.Pending;
+ _storeContext.Orders.Update(order);
+ _storeContext.SaveChanges();
+ Console.WriteLine($"Order {order.Id} status updated to {order.Status}.");
+ await channel.BasicAckAsync(ea.DeliveryTag, false);
+ };
+ await channel.BasicConsumeAsync(queue: "purchase_queue",
+ autoAck: false,
+ consumer: consumer);
+ Console.WriteLine("RabbitMQ consumer started. Waiting for messages...");
+ while (!stoppingToken.IsCancellationRequested)
+ {
+ await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
+ }
+
+ }
+
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/appsettings.Development.json b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/appsettings.Development.json
new file mode 100644
index 0000000..ff66ba6
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/appsettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/appsettings.json
new file mode 100644
index 0000000..e283cb5
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/OrderService/appsettings.json
@@ -0,0 +1,18 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*",
+ "ConnectionStrings": {
+ "OrderDatabase": "Server=mssql-deployment,1433;Database=StoreDB;User Id=sa;Password=TestPass123!;TrustServerCertificate=True;"
+ },
+ "RabbitMQ": {
+ "Host": "rabbitmq-service",
+ "User": "user",
+ "Password": "password",
+ "Port": 5672
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/.dockerignore b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/.dockerignore
new file mode 100644
index 0000000..9395e06
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/.dockerignore
@@ -0,0 +1,7 @@
+**/.vs
+**/.vscode
+**/bin
+**/obj
+Dockerfile
+.dockerignore
+README.md
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Controllers/PaymentController.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Controllers/PaymentController.cs
new file mode 100644
index 0000000..7359fa3
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Controllers/PaymentController.cs
@@ -0,0 +1,168 @@
+using System.Text.Json;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using PaymentService.Models;
+using PaymentService.Services;
+using Stripe;
+using Stripe.Checkout; // <-- Important: Add this using statement
+
+// A new class to model the incoming request from your React cart
+public class CreateCheckoutSessionRequest
+{
+ public int OrderId { get; set; }
+}
+
+public class CartItemDto
+{
+ public string Name { get; set; }
+ public long Price { get; set; } // Price in the smallest currency unit (e.g., cents)
+ public int QuantityInCart { get; set; }
+}
+
+
+[ApiController]
+[Route("api/payment")] // A more standard route
+public class PaymentController : ControllerBase
+{
+ private readonly string _secretKey;
+ private readonly IHttpClientFactory _httpClientFactory;
+
+ private readonly RabbitMqService _rabbitMqService;
+
+ public PaymentController(IOptions stripeSettings, IHttpClientFactory httpClientFactory, RabbitMqService rabbitMqService)
+ {
+ _secretKey = stripeSettings.Value.SecretKey ?? throw new ArgumentException("Stripe Secret Key is not set");
+ _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
+ _rabbitMqService = rabbitMqService ?? throw new ArgumentNullException(nameof(rabbitMqService));
+ }
+
+ [HttpPost("create-checkout-session")]
+ public async Task CreateCheckoutSession([FromBody] CreateCheckoutSessionRequest req)
+ {
+ StripeConfiguration.ApiKey = _secretKey;
+
+ var orderId = req.OrderId;
+
+ string orderServiceUrl = $"http://orderservice:8080/api/order/{orderId}"; // Adjust port if needed
+
+ // 1. Fetch the order directly from your Order service endpoint.
+ Order order;
+ try
+ {
+ var client = _httpClientFactory.CreateClient("PaymentServiceClient");
+ var response = await client.GetAsync(orderServiceUrl);
+
+ if (!response.IsSuccessStatusCode)
+ {
+ // If the order service returns a 404 or other error, fail gracefully.
+ return NotFound(new { error = new { message = $"Order with ID {orderId} not found." } });
+ }
+
+ var contentStream = await response.Content.ReadAsStreamAsync();
+ // Use JsonSerializer to convert the JSON response into your Order object.
+ order = await JsonSerializer.DeserializeAsync(contentStream, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
+
+ if (order == null || !order.OrderItems.Any())
+ {
+ return BadRequest(new { error = new { message = "Order is empty or could not be parsed." } });
+ }
+ await _httpClientFactory.CreateClient("PaymentServiceClient").PostAsync($"http://orderservice:8080/api/order/checkout/{orderId}", null);
+ }
+ catch (HttpRequestException ex)
+ {
+ // Log the exception (using a proper logging framework is recommended).
+ return StatusCode(503, new { error = new { message = "The order service is currently unavailable.", details = ex.Message } });
+ }
+
+ var lineItems = new List();
+
+ // Create a line item for each product in the cart
+ foreach (var item in order.OrderItems)
+ {
+ lineItems.Add(new SessionLineItemOptions
+ {
+ PriceData = new SessionLineItemPriceDataOptions
+ {
+ // Price must be in the smallest currency unit (e.g., cents)
+ UnitAmount = (long)(item.Price * 100), // Convert dollars to cents
+ Currency = "usd",
+ ProductData = new SessionLineItemPriceDataProductDataOptions
+ {
+ Name = item.ProductName,
+ },
+ },
+ Quantity = item.Quantity,
+ });
+ }
+
+ // Add a line item for the tax
+ // NOTE: For production, use Stripe Tax for automatic tax calculation.
+ // https://stripe.com/docs/tax
+ var subtotal = order.OrderItems.Sum(item => item.Price * item.Quantity);
+ var taxAmount = (long)(subtotal * 0.07m * 100); // 7% tax, converted to cents
+
+ lineItems.Add(new SessionLineItemOptions
+ {
+ PriceData = new SessionLineItemPriceDataOptions
+ {
+ UnitAmount = taxAmount,
+ Currency = "usd",
+ ProductData = new SessionLineItemPriceDataProductDataOptions
+ {
+ Name = "Sales Tax",
+ },
+ },
+ Quantity = 1,
+ });
+
+ var options = new SessionCreateOptions
+ {
+ PaymentMethodTypes = new List { "card" },
+ LineItems = lineItems,
+ Mode = "payment",
+ // IMPORTANT: Replace these with your actual frontend URLs
+ SuccessUrl = "http://localhost/payment/payment-success?orderId=" + orderId,
+ CancelUrl = "http://localhost/payment/payment-failed?orderId=" + orderId,
+ };
+
+ try
+ {
+ var service = new SessionService();
+ Session session = service.Create(options);
+ // Return the Session ID to the client
+ return Ok(new { sessionId = session.Id });
+ }
+ catch (StripeException e)
+ {
+ return BadRequest(new { error = new { message = e.StripeError.Message } });
+ }
+ }
+
+ [HttpGet("payment-success")]
+ public IActionResult PaymentSuccess(int orderId)
+ {
+ var purchaseMessage = new PurchaseMessage
+ {
+ OrderId = orderId,
+ IsSuccess = true
+ };
+
+ _rabbitMqService.PublishMessageAsync("purchase_queue", purchaseMessage).GetAwaiter().GetResult();
+ _rabbitMqService.PublishMessageAsync("inventory_queue", purchaseMessage).GetAwaiter().GetResult();
+ Task.Delay(5000).GetAwaiter().GetResult();
+ return Redirect("http://localhost:3000/?status=success");
+ }
+
+ [HttpGet("payment-failed")]
+ public IActionResult PaymentFailed(int orderId)
+ {
+ var purchaseMessage = new PurchaseMessage
+ {
+ OrderId = orderId,
+ IsSuccess = false
+ };
+ _rabbitMqService.PublishMessageAsync("purchase_queue", purchaseMessage).GetAwaiter().GetResult();
+ Task.Delay(5000).GetAwaiter().GetResult();
+ return Redirect("http://localhost:3000/?status=failure");
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/Order.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/Order.cs
new file mode 100644
index 0000000..0e03bd3
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/Order.cs
@@ -0,0 +1,31 @@
+namespace PaymentService.Models;
+
+
+public enum OrderStatus
+{
+ Pending,
+ Processing,
+ PaymentReceived
+}
+
+public class Order
+{
+
+ public int Id { get; set; }
+ public required string CustomerId { get; set; }
+ public OrderStatus Status { get; set; } = OrderStatus.Pending;
+
+ public ICollection OrderItems { get; set; } = new List();
+
+}
+
+public class OrderItem
+{
+
+ public int Id { get; set; }
+ public int OrderId { get; set; }
+ public int ProductId { get; set; }
+ public int Quantity { get; set; } = 1;
+ public decimal Price { get; set; }
+ public required string ProductName { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/PurchaseMessage.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/PurchaseMessage.cs
new file mode 100644
index 0000000..a02da53
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/PurchaseMessage.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace PaymentService.Models;
+
+public class PurchaseMessage
+{
+ public int OrderId { get; set; }
+ public bool IsSuccess { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/StripeModel.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/StripeModel.cs
new file mode 100644
index 0000000..5481aed
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Models/StripeModel.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace PaymentService.Models;
+
+public class StripeSettings
+{
+ public string SecretKey { get; set; }
+}
+
+public class PaymentIntentRequest
+{
+ public long Amount { get; set; }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/PaymentService.csproj b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/PaymentService.csproj
new file mode 100644
index 0000000..1f35f53
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/PaymentService.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/PaymentService.http b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/PaymentService.http
new file mode 100644
index 0000000..ef9df95
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/PaymentService.http
@@ -0,0 +1,6 @@
+@PaymentService_HostAddress = http://localhost:5124
+
+GET {{PaymentService_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Program.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Program.cs
new file mode 100644
index 0000000..70bd388
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Program.cs
@@ -0,0 +1,54 @@
+using PaymentService.Models;
+using Prometheus;
+using PaymentService.Services;
+using Polly.Registry;
+
+var builder = WebApplication.CreateBuilder(args);
+
+// Add services to the container.
+
+builder.Services.AddControllers();
+// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
+builder.Services.Configure(builder.Configuration.GetSection("Stripe"));
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen(c =>
+{
+ c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "InventoryService", Version = "v1" });
+});
+
+builder.Services.AddSingleton();
+
+var registry = new PolicyRegistry
+{
+ { "CircuitBreakerPolicy", PollyPolicies.GetCircuitBreakerPolicy(builder.Services.BuildServiceProvider().GetRequiredService>()) }
+};
+builder.Services.AddSingleton>(registry);
+
+builder.Services.AddHttpClient("PaymentServiceClient")
+ .AddPolicyHandler((serviceProvider, request) =>
+ {
+ // Get a logger from the service provider
+ var logger = serviceProvider.GetRequiredService>();
+ // Pass the logger to the policy
+ return PollyPolicies.GetRetryPolicy(logger);
+ })
+ .AddPolicyHandlerFromRegistry("CircuitBreakerPolicy");
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+app.UseSwagger();
+app.UseSwaggerUI();
+app.UseHttpsRedirection();
+app.UseRouting();
+
+
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.UseHttpMetrics();
+app.MapMetrics();
+
+
+app.Run();
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Properties/launchSettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Properties/launchSettings.json
new file mode 100644
index 0000000..4e57368
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Properties/launchSettings.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "http://localhost:5124",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "https://localhost:7220;http://localhost:5124",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Services/PollyPolicies.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Services/PollyPolicies.cs
new file mode 100644
index 0000000..81dda83
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Services/PollyPolicies.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Net;
+using System.Net.Http;
+using Microsoft.Extensions.Logging;
+using Polly;
+using Polly.Extensions.Http;
+
+namespace PaymentService.Services;
+
+public static class PollyPolicies
+{
+ public static IAsyncPolicy GetRetryPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .OrResult(msg => msg.StatusCode == HttpStatusCode.NotFound)
+ .WaitAndRetryAsync(3,
+ retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
+ onRetry: (outcome, timespan, retryAttempt, context) =>
+ {
+ // Log the retry attempt
+ logger.LogWarning(
+ "Retrying request. Attempt {RetryAttempt}. Waiting {SleepDuration}ms. " +
+ "Reason: {StatusCode} - {ExceptionMessage} - {Namespace}",
+ retryAttempt,
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ });
+ }
+
+ public static IAsyncPolicy GetCircuitBreakerPolicy(ILogger logger)
+ {
+ return HttpPolicyExtensions
+ .HandleTransientHttpError()
+ .CircuitBreakerAsync(10, TimeSpan.FromSeconds(30),
+ onBreak: (outcome, timespan, context) =>
+ {
+ // Log when the circuit breaks
+ logger.LogError(
+ "Circuit broken for {BreakDuration}ms due to {StatusCode} - {ExceptionMessage} - {Namespace}",
+ timespan.TotalMilliseconds,
+ outcome.Result?.StatusCode,
+ outcome.Exception?.Message,
+ typeof(PollyPolicies).Namespace
+ );
+ },
+ onReset: (context) =>
+ {
+ // Log when the circuit resets
+ logger.LogInformation("Circuit has been reset.");
+ },
+ onHalfOpen: () =>
+ {
+ // Log when the circuit is half-open
+ logger.LogWarning("Circuit is now half-open. The next request will test the service.");
+ });
+ }
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Services/RabbitMqService.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Services/RabbitMqService.cs
new file mode 100644
index 0000000..e78565d
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/Services/RabbitMqService.cs
@@ -0,0 +1,52 @@
+using Microsoft.Extensions.Options;
+using RabbitMQ.Client;
+using System.Configuration;
+using System.Text;
+using System.Text.Json;
+
+namespace PaymentService.Services;
+
+public class RabbitMqService
+{
+ private readonly string user;
+ private readonly string password;
+ private readonly string host;
+ private readonly int port;
+ private readonly IConnectionFactory _factory;
+
+ public RabbitMqService(IConfiguration configuration)
+ {
+ user = configuration["RabbitMq:User"] ?? throw new ArgumentNullException("RabbitMq:User is not configured");
+ password = configuration["RabbitMq:Password"] ?? throw new ArgumentNullException("RabbitMq:Password is not configured");
+ host = configuration["RabbitMq:Host"] ?? throw new ArgumentNullException("RabbitMq:Host is not configured");
+ port = int.Parse(configuration["RabbitMq:Port"] ?? throw new ArgumentNullException("RabbitMq:Port is not configured")); ;
+ _factory = new ConnectionFactory
+ {
+ UserName = user,
+ Password = password,
+ HostName = host,
+ Port = port
+ };
+
+ }
+
+
+ public async Task PublishMessageAsync(string queueName, T message)
+ {
+ using var connection = await _factory.CreateConnectionAsync();
+ using var channel = await connection.CreateChannelAsync();
+
+ await channel.QueueDeclareAsync(queue: queueName,
+ durable: false,
+ exclusive: false,
+ autoDelete: false,
+ arguments: null);
+
+ var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));
+ await channel.BasicPublishAsync(exchange: "",
+ routingKey: queueName,
+ body: body);
+ }
+
+
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/WeatherForecast.cs b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/WeatherForecast.cs
new file mode 100644
index 0000000..ac4c19a
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/WeatherForecast.cs
@@ -0,0 +1,12 @@
+namespace PaymentService;
+
+public class WeatherForecast
+{
+ public DateOnly Date { get; set; }
+
+ public int TemperatureC { get; set; }
+
+ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+
+ public string? Summary { get; set; }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/appsettings.Development.json b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/appsettings.Development.json
new file mode 100644
index 0000000..ff66ba6
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/appsettings.json b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/appsettings.json
new file mode 100644
index 0000000..461e05d
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/src/PaymentService/appsettings.json
@@ -0,0 +1,18 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*",
+ "Stripe": {
+ "SecretKey": "sk_test_51RWw9r4FbqRY5YQYvNHP2Ik65EXO0vsXpeK2tHhtmsL2iwYdfJa3Jv1dmBi3dCPvka7W0kNxr2XLUeLDhYelLQbF00H8nnl6gZ"
+ },
+ "RabbitMQ": {
+ "Host": "rabbitmq-service",
+ "User": "user",
+ "Password": "password",
+ "Port": 5672
+ }
+}
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/test.sql b/Anul 3/Semestrul 2/Licenta/Practical/test.sql
new file mode 100644
index 0000000..00747bb
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/test.sql
@@ -0,0 +1,2 @@
+SELECT * FROM Orders
+SELECT * FROM OrderItems
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Practical/tests/locustfile.py b/Anul 3/Semestrul 2/Licenta/Practical/tests/locustfile.py
new file mode 100644
index 0000000..2d6e152
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Practical/tests/locustfile.py
@@ -0,0 +1,10 @@
+from locust import HttpUser, task
+
+class OrderUser(HttpUser):
+ @task
+ def view_inventory(self):
+ self.client.get("/inventory")
+
+ # @task
+ # def place_order(self):
+ # self.client.get("/payment/payment-success?orderId=14", allow_redirects=True)
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Presentation.pdf b/Anul 3/Semestrul 2/Licenta/Presentation.pdf
new file mode 100644
index 0000000..4601978
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Presentation.pdf differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter1_introduction.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter1_introduction.tex
new file mode 100644
index 0000000..2907c27
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter1_introduction.tex
@@ -0,0 +1,81 @@
+\chapter{Introduction}
+
+%\chapter*{Introducere}
+\label{intro}
+
+
+\section{Background: The Ascendancy of Microservices in Distributed System Design}
+\label{sec:ch1sec1}
+
+\par The landscape of software architecture has undergone a significant transformation over the past decade, marked by a discernible shift from monolithic application designs towards microservice architectures. This paradigm shift is driven by the escalating demands of modern digital enterprises for increased agility, faster development cycles, independent deployability of components, and the flexibility to utilize diverse technology stacks for different functionalities. Monolithic systems, characterized by a single, large codebase where all functionalities are tightly coupled, often struggle to meet these demands, particularly in terms of scaling specific parts of an application or adopting new technologies without impacting the entire system. Microservices address these limitations by decomposing applications into a collection of small, autonomous services, each responsible for a specific business capability. \cite{fowler2014microservices} \cite{richardson2018microservices} \cite{evans2003domain} This architectural style inherently leads to distributed systems, as services typically run in separate processes and communicate over a network.
+
+\par The adoption of microservices is not merely a technical trend but a strategic response to the need for systems that can evolve rapidly and scale efficiently. Enterprises such as Netflix and Amazon have famously transitioned to microservices to enhance their scalability, foster innovation, and ensure long-term growth. \cite{shekhar2024microservices} \cite{walia2025leveraging} However, the very nature of microservices introduces a new set of challenges. While they offer solutions to the rigidity of monoliths, their distributed characteristics bring forth complexities in managing inter-service communication, ensuring data consistency across disparate services, and maintaining overall system reliability. The independent operation of services, a key benefit, also means that the system as a whole must be resilient to failures in its individual parts. Thus, the pursuit of scalability and fault tolerance becomes a central concern in microservice design, moving beyond the capabilities offered by monolithic structures but demanding new architectural considerations.
+
+\section{Problem Statement: The Intrinsic Scalability and Fault Tolerance Imperatives in Microservice Ecosystems}
+\label{sec:ch1sec2}
+
+\par While microservice architectures present a compelling proposition for building scalable and resilient applications, these benefits are not inherently guaranteed. The distributed and interdependent nature of microservices makes them susceptible to unique failure modes and performance bottlenecks that differ significantly from those encountered in monolithic systems. Without deliberate and sophisticated design and engineering practices, the potential advantages of microservices can be undermined by the complexities they introduce. Key challenges include the risk of cascading failures, where the failure of one service can propagate and impact dependent services, leading to widespread outages. Network latency, an unavoidable aspect of inter-service communication, can degrade performance and must be carefully managed. Ensuring data consistency across multiple, independently managed databases associated with different services is another significant hurdle. Furthermore, the operational overhead of deploying, managing, and monitoring a multitude of small services can be substantial.
+
+\par The amplification effect of failures is a particularly critical concern. In a tightly interconnected microservice ecosystem, a seemingly minor, localized issue within a single service—such as a transient network glitch or a bug causing slow responses—can have a disproportionately large impact if not effectively isolated. This is because services often rely on other services to fulfill user requests. \cite{nygard2018release} If a downstream service becomes unresponsive or erroneous, upstream services that depend on it may also degrade or fail. This ripple effect underscores the non-negotiable requirement for robust fault tolerance strategies that go beyond simple error handling. The architectural design must inherently support the detection, isolation, and graceful handling of failures to prevent them from escalating into system-wide disruptions.
+
+\section{Research Objectives and Guiding Questions}
+\label{sec:ch1sec3}
+
+This thesis aims to conduct a comprehensive and critical examination of the principles, patterns, technologies, and practices essential for achieving high levels of scalability and fault tolerance in microservice-based applications. The specific objectives are:
+\begin{enumerate}
+
+\item To critically evaluate existing architectural principles and design patterns that underpin scalable and fault-tolerant microservice designs.
+
+\item To analyze the influence of different inter-service communication paradigms (e.g., synchronous RESTful APIs versus asynchronous event-driven messaging) on the system's ability to scale and tolerate faults.
+
+\item To investigate the role of modern containerization, orchestration platforms (particularly Kubernetes)
+
+\item To synthesize these findings into a holistic understanding of how to architect microservices that are both adaptable to varying loads and robust in the face of partial failures.
+
+\end{enumerate}
+
+To achieve these objectives, this research will be guided by the following key questions:
+
+\begin{itemize}
+
+\item What are the fundamental architectural principles that underpin scalable and fault-tolerant microservice designs?
+
+\item How do different inter-service communication paradigms (e.g., synchronous REST vs. asynchronous messaging) influence scalability and fault tolerance?
+
+\item Which design patterns (e.g., Circuit Breaker, Bulkhead, Retry, API Gateway, Load Balancing) are most effective in addressing specific scalability and fault tolerance challenges, and under what conditions?
+
+\item What is the role of containerization (Docker) and orchestration platforms (Kubernetes, KEDA) in enabling dynamic scaling and resilient deployments?
+
+\item How can chaos engineering be systematically applied to proactively identify and mitigate weaknesses in microservice resilience?
+
+\item What are the key considerations for data management and consistency in distributed microservice environments to ensure both scalability and fault tolerance?
+
+\end{itemize}
+
+\section{Contributions of the Thesis}
+\label{sec:ch1sec4}
+
+This thesis endeavors to make several contributions to the understanding of scalability and fault tolerance in microservice architectures. Firstly, it will provide a synthesized framework, drawing from academic research and industry best practices, for designing microservice systems that are inherently resilient and scalable. This framework will integrate insights from foundational principles with the application of specific design patterns and enabling technologies. Secondly, the thesis will offer a comparative analysis of different technological approaches and patterns, highlighting their respective strengths, weaknesses, and optimal use contexts. This includes a nuanced discussion of communication styles, data management strategies, and resilience mechanisms. Thirdly, by integrating the concept of proactive resilience through practices like chaos engineering, the thesis aims to shift the discourse from merely reactive fault handling to a more holistic, preventative engineering approach. Finally, it seeks to identify key best practices and illuminate promising future research directions in this rapidly evolving field, leveraging insights from the provided source document and a broader corpus of scholarly and technical literature. The overarching goal is to furnish a comprehensive, academically rigorous perspective that bridges theoretical understanding with practical application.
+
+\section{Thesis Structure}
+\label{sec:ch1sec5}
+
+The remainder of this thesis is organized as follows:
+
+\begin{itemize}
+
+\item Chapter 2 lays the theoretical foundations of microservice architecture, focusing on aspects pertinent to building resilient and scalable systems. It defines microservices, discusses their core characteristics, advantages, and disadvantages in distributed contexts, and examines critical architectural considerations such as inter-service communication and data management.
+
+\item Chapter 3 delves into design patterns and strategies specifically aimed at achieving scalability in microservices. Topics include horizontal and vertical scaling, load balancing and API gateways.
+
+\item Chapter 4 focuses on design patterns and strategies for enhancing fault tolerance. It covers principles like redundancy and isolation, and patterns such as Circuit Breaker, Retry and Bulkhead.
+
+\item Chapter 5 outlines the application's microservice architecture, detailing the public e-commerce storefront for customers and the separate, secure backend for administrative inventory management.
+
+\item Chapter 6 presents the results of a successful load test which proved the InventoryService is stable and performant, validating that its CPU-bound behavior correctly triggers the designed auto-scaling policy.
+
+\item Chapter 7 concludes the thesis with a summary of key findings and contributions, discusses the limitations of the study, and suggests avenues for future research.
+
+\item The Bibliography lists all cited works.
+
+\end{itemize}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter2.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter2.tex
new file mode 100644
index 0000000..e4a1c39
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter2.tex
@@ -0,0 +1,85 @@
+\chapter{Theoretical Foundations of Microservices for Resilient and Scalable Systems}
+\label{chap:ch1}
+
+\section{Defining Microservice Architecture: A Paradigm for Distributed Functionality}
+\label{sec:microservice-architecture}
+
+Microservice architecture is an architectural style that structures an application as a collection of small, autonomous, and independently deployable services. \cite{fowler2014microservices} \cite{richardson2018microservices} Each service is designed around a specific business capability and can be developed, deployed, operated, and scaled independently of other services. This contrasts sharply with traditional monolithic architectures, where all application functionalities are interwoven into a single, large, and tightly coupled codebase. In a monolithic system, scaling a specific feature or updating a single component often requires redeploying the entire application, leading to slower release cycles and increased risk.
+
+The independence of microservices is a cornerstone of their design philosophy. This independence extends to technology choices, allowing different services to be implemented using different programming languages, frameworks, and data storage technologies best suited for their specific tasks. Communication between these services typically occurs over a network using lightweight protocols such as HTTP/REST or asynchronous messaging mechanisms. While this independence offers significant advantages in terms of flexibility, team autonomy, and targeted scalability, it also introduces the complexities inherent in distributed systems. The network becomes a critical component, and inter-service communication reliability and performance are paramount. Thus, the very characteristics that enable benefits like independent scaling also necessitate robust mechanisms for managing interactions and potential failures in a distributed environment, forming a central theme in the pursuit of scalability and fault tolerance.
+
+\section{Core Characteristics Enabling (and Complicating) Scalability and Fault Tolerance}
+
+Several core characteristics of microservices directly influence their capacity for scalability and fault tolerance, often presenting both opportunities and challenges.
+
+\begin{itemize}
+
+
+\item Independently Deployable: Each microservice can be deployed and updated without affecting others. This allows for rapid iteration and targeted scaling of individual services based on their specific load, rather than scaling the entire application. However, managing deployments and ensuring compatibility between versions of interacting services becomes a new challenge.
+
+\item Loosely Coupled: Services are designed to minimize dependencies on each other, interacting through well-defined APIs. Loose coupling is crucial for fault isolation; a failure in one service is less likely to cascade to others if dependencies are managed carefully. Achieving true loose coupling, however, requires meticulous API design and governance.
+
+\item Technology Agnostic: The ability to use different technologies for different services allows teams to choose the best tools for the job. While this fosters innovation, it can also increase operational complexity in terms of monitoring, managing diverse runtime environments, and ensuring consistent security practices.
+
+\item Organized around Business Capabilities (Domain-Driven Design): Microservices are often aligned with specific business domains. This promotes a clear separation of concerns and allows teams to develop deep expertise. From a scalability perspective, it means that services critical to high-demand business functions can be scaled independently.
+
+D\item ecentralized Governance and Data Management: Teams often have autonomy over their services, including their data persistence strategies (e.g., database-per-service). This supports independent evolution and scaling but complicates tasks like ensuring data consistency across services or performing queries that span multiple domains.
+
+The "small service" characteristic, while central to the definition, presents a "granularity dilemma." If services are decomposed too finely (sometimes referred to as "nanoservices"), the volume of inter-service communication can become excessive. \cite{shekhar2024microservices} \cite{baboi2019dynamic} Each network call introduces latency and a potential point of failure. Therefore, determining the appropriate size and scope for each microservice is a critical design decision. It involves balancing the benefits of modularity and independent scaling against the increased communication overhead and the expanded surface area for potential failures that arise from a highly distributed system. An optimal granularity minimizes unnecessary chattiness between services while still allowing for focused functionality and independent evolution.
+
+
+\end{itemize}
+
+\section{Advantages and Disadvantages in Distributed Contexts}
+\label{sec:advantages-disadvantages}
+
+The adoption of microservices offers a compelling set of advantages, particularly for applications requiring high scalability and resilience, but these are accompanied by inherent challenges stemming from their distributed nature.
+
+Advantages:
+\begin{itemize}
+\item Improved Scalability: Individual services can be scaled independently based on their specific resource needs and demand, leading to more efficient resource utilization compared to scaling an entire monolith.
+
+\item Faster Time-to-Market: Smaller, focused teams can develop, test, and deploy services independently, accelerating release cycles.
+
+\item Enhanced Flexibility and Technology Diversity: Teams can choose the most appropriate technology stack for each service, fostering innovation and allowing for easier adoption of new technologies.
+
+\item Better Fault Isolation: A failure in one microservice, if properly handled, is less likely to bring down the entire application. Other services can continue to operate, improving overall system resilience. \cite{walia2025leveraging} \cite{makungu2023fault}
+
+\item Increased Developer Productivity: Smaller codebases are easier to understand, maintain, and test. Teams can work in parallel with fewer dependencies.
+\end{itemize}
+
+Disadvantages (Challenges):
+\begin{itemize}
+\item Complexity: Managing a distributed system of many small services is inherently more complex than managing a single monolith. This includes aspects of deployment, monitoring, inter-service communication, and debugging.
+
+\item Data Management: Ensuring data consistency and integrity across multiple services, each potentially with its own database, is a significant challenge. Distributed transactions are complex and often avoided in favor of eventual consistency models, which require careful application design.
+
+\item Network Latency and Reliability: Communication between services occurs over a network, introducing latency and the possibility of network failures. These must be accounted for in performance and reliability design.
+
+\item onitoring and Debugging: Tracing requests and diagnosing issues across multiple services can be significantly more difficult than in a monolithic application, necessitating sophisticated observability tools.
+
+\item Deployment and Orchestration: Managing the deployment, scaling, and lifecycle of numerous microservices requires robust automation and orchestration tools.
+
+\item Security: Securing inter-service communication and managing identities and access control across a distributed system presents additional complexities.
+\end{itemize}
+
+\par The following table provides a comparative overview of microservices and monolithic architectures, highlighting key differences relevant to scalability and fault tolerance.
+
+\begin{table}[htbp]
+\centering
+\begin{tabular}{|l|l|l|}
+\hline
+\textbf{Feature} & \textbf{Microservices} & \textbf{Monolithic Architecture} \\ \hline
+\textbf{Structure} & Distributed, loosely coupled & Single, tightly integrated \\ \hline
+\textbf{Scalability} & Independent, granular & Limited, coarse-grained \\ \hline
+\textbf{Technology} & Diverse, technology agnostic & Homogeneous, technology dependent \\ \hline
+\textbf{Fault Isolation} & High, localized failures & Low, system-wide failures \\ \hline
+\textbf{Development} & Parallel, cross-functional teams & Sequential, siloed teams \\ \hline
+\textbf{Maintenance} & Easier, focused services & Difficult, monolithic codebase \\ \hline
+\textbf{Time-to-Market} & Faster, agile practices & Slower, waterfall practices \\ \hline
+\textbf{Complexity} & Higher, distributed systems & Lower, single codebase \\ \hline
+\textbf{Data Management} & Challenging, distributed data & Easier, centralized data \\ \hline
+\end{tabular}
+\caption{Comparative Overview of Microservices and Monolithic Architectures \cite{richardson2018microservices}}
+\label{tab:microservices-vs-monolithic}
+\end{table}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter3.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter3.tex
new file mode 100644
index 0000000..48618d0
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter3.tex
@@ -0,0 +1,66 @@
+\chapter{Design Patterns and Strategies for Scalability in Microservices}
+\label{chap:ch3}
+
+\par Scalability refers to a system's ability to handle an increasing amount of work by adding resources, or its ability to handle a decreasing amount of work by removing resources. In the context of microservices, two primary dimensions of scaling are considered: vertical scaling and horizontal scaling.
+
+\section{Vertical Scaling}
+
+\par Vertical scaling (scaling up/down) involves increasing or decreasing the resources (e.g., CPU, RAM, storage) of an existing service instance. For example, moving a service to a more powerful server or allocating more memory to its container. While conceptually simple, vertical scaling has inherent limitations. There's an upper bound to the resources a single instance can effectively utilize, and it often involves downtime or service interruption to apply changes. Moreover, it doesn't inherently improve fault tolerance through redundancy.
+
+\section{Horizontal Scaling}
+
+Horizontal scaling (scaling out/in) involves adding more instances of a service or removing existing instances to distribute the load. Microservice architectures are particularly well-suited for horizontal scaling due to their design principles of small, independent, and often stateless services. Each instance can handle a subset of the incoming requests, and load balancers distribute traffic among them. Horizontal scaling is the predominant strategy for cloud-native microservices. This preference stems from its superior elasticity, as instances can be dynamically added or removed based on real-time demand, often facilitated by orchestration platforms like Kubernetes. \cite{kubernetes2025horizontal} \cite{burns2016borg} It also inherently provides a degree of fault tolerance: if one instance fails, others can continue to serve traffic. Furthermore, horizontal scaling can be more cost-effective at scale, utilizing commodity hardware or smaller virtual machine instances rather than relying on expensive, high-end servers required for significant vertical scaling. The ability to independently scale individual microservices based on their specific load profiles is a key advantage over monolithic systems, where the entire application must be scaled even if only one component is a bottleneck.
+
+\section{Load Balancing Techniques and the Pivotal Role of API Gateways}
+
+When microservices are scaled horizontally, load balancing becomes essential to distribute incoming requests effectively across the multiple available instances of a service. The goal is to ensure even resource utilization, prevent any single instance from becoming a bottleneck, and improve overall application responsiveness and availability. Various load balancing algorithms can be employed, including:
+\begin{itemize}
+
+\item Round Robin: Distributes requests sequentially to each server in a list.
+
+\item Least Connections: Directs requests to the server with the fewest active connections.
+
+\item Weighted Round Robin/Least Connections: Assigns weights to servers, allowing more powerful servers to receive a proportionally larger share of the traffic.
+
+\item IP Hash: Directs requests from a specific client IP address to the same server, which can be useful for maintaining session affinity if required (though stateless services are preferred).
+
+\end{itemize}
+
+API Gateways play a pivotal role in modern microservice architectures, often acting as the primary entry point for all external client requests. Beyond simple request routing, an API Gateway can perform sophisticated load balancing across downstream microservice instances. It abstracts the complexity of the internal microservice landscape from clients, providing a single, stable interface.
+
+The API Gateway is more than just a traffic director; it serves as a critical control plane for enhancing both scalability and resilience. By centralizing access, it can implement various policies that benefit the entire system:
+
+\begin{itemize}
+
+\item Request Routing and Composition: Directing requests to appropriate service versions or aggregating results from multiple services.
+
+\item Offloading Cross-Cutting Concerns: Handling tasks like SSL termination, authentication, authorization, and logging, freeing individual microservices from these responsibilities.
+
+\item Caching: Caching responses from frequently accessed, relatively static backend services at the gateway level can significantly reduce the load on these services and improve response times for clients.
+
+\item Rate Limiting and Throttling: Protecting backend services from being overwhelmed by excessive requests, whether due to legitimate traffic spikes or malicious attacks.
+
+\item Protocol Translation: Allowing clients using one protocol (e.g., HTTP/1.1) to communicate with services using another (e.g., gRPC).
+
+\end{itemize}
+
+\section{Asynchronous Processing and Message Queues for Decoupled Scaling}
+
+Asynchronous communication, facilitated by message queues, is a powerful paradigm for building scalable and resilient microservice architectures. By decoupling services, message queues allow producers (services that send messages) and consumers (services that process messages) to operate and scale independently, effectively handling variable loads and transient failures. \cite{rabbitmq2025messaging}
+
+Message queues like Apache Kafka and RabbitMQ act as intermediaries or buffers between services. When a producer service needs to initiate a task or notify another service of an event, it sends a message to a queue instead of making a direct synchronous call. The message is persisted in the queue, and the producer can continue its operations without waiting for the message to be processed. Consumer services subscribe to the queue and pull messages for processing when they have available capacity.
+
+This decoupling provides several scalability benefits:
+
+\begin{itemize}
+
+ \item Load Leveling: Message queues can absorb sudden spikes in requests (messages). If producers generate messages at a higher rate than consumers can process, the messages accumulate in the queue. Consumers can then process this backlog at their own sustainable pace, preventing them from being overwhelmed. This smooths out load variations and improves system stability.
+
+\item Independent Scaling: Producer and consumer services can be scaled independently based on their respective workloads. If the message queue depth grows consistently, it indicates that consumers are a bottleneck, and more consumer instances can be added. Conversely, if producers are generating a high volume of messages, they can be scaled out without immediately impacting consumers.
+
+\item Improved Responsiveness: Producer services are not blocked waiting for downstream processing, leading to lower latency and better responsiveness for operations initiated by producers.
+
+\item Enhanced Resilience: If a consumer service fails or is temporarily unavailable, messages remain in the queue and can be processed once the service recovers. This prevents data loss and allows the system to gracefully handle transient outages of consumer services.
+
+
+\end{itemize}
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter4.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter4.tex
new file mode 100644
index 0000000..d4fa3b0
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter4.tex
@@ -0,0 +1,55 @@
+\chapter{Design Patterns and Strategies for Fault Tolerance in Microservices}
+\label{chap:ch3}
+
+Fault tolerance is the ability of a system to continue operating, potentially at a reduced level, rather than failing completely when one or more of its components fail. In microservice architectures, where applications are composed of numerous interdependent services, designing for fault tolerance is paramount. Three core principles underpin most fault tolerance strategies:
+\begin{enumerate}
+\item \textbf{Redundancy:} This involves deploying multiple instances of critical components (e.g., microservices, databases, load balancers) so that if one instance fails, others can take over its workload. Horizontal scaling, as discussed for scalability, inherently provides redundancy. Replicating data across multiple servers or data centers is another form of redundancy crucial for data availability and durability.
+
+\item \textbf{Isolation:} This principle aims to prevent failures in one part of the system from cascading and affecting other parts. Patterns like Bulkhead (discussed later) are designed to contain the impact of a failing service by isolating the resources it consumes. Decomposing an application into microservices itself is a form of isolation, as a failure in one service ideally should not bring down unrelated services.
+
+\item \textbf{Graceful Degradation:} When a complete failure of a component occurs and redundancy or immediate recovery is not possible, the system should aim to degrade gracefully rather than failing catastrophically. This means providing partial functionality or a reduced level of service to users, maintaining essential operations while non-critical features might be temporarily unavailable. Fallback mechanisms are key to achieving graceful degradation.
+\end{enumerate}
+Modern approaches to fault tolerance in microservices emphasize proactive design rather than solely reactive measures. This involves anticipating potential failure modes during the design phase and building in mechanisms to detect, isolate, and handle these failures automatically. Patterns like Circuit Breakers, Retries, and Timeouts are not afterthoughts but integral parts of a resilient service's design. Furthermore, advanced practices like chaos engineering take this proactivity a step further by deliberately injecting failures into test and even production environments to uncover weaknesses and validate the effectiveness of fault tolerance strategies before they are triggered by real-world incidents. This signifies a maturation in understanding that failures in distributed systems are inevitable and must be systematically planned for from the outset.
+
+\section{The Circuit Breaker Pattern: Preventing Cascading Failures}
+
+The Circuit Breaker pattern is a critical fault tolerance mechanism designed to prevent an application from repeatedly trying to execute an operation that is likely to fail, thereby protecting both the calling service from resource exhaustion and the failing service from being overwhelmed by repeated requests. \cite{nygard2018release} \cite{polly2025dotnet} \cite{makungu2023fault} \cite{ibrahim2022scalable} It acts like an electrical circuit breaker: if a downstream service starts to exhibit a high failure rate, the circuit breaker "trips" or "opens," and subsequent calls from the client are immediately failed without attempting to contact the problematic service. This prevents cascading failures where one failing service causes dependent services to also fail or become unresponsive.
+
+A circuit breaker typically operates in three states :
+\begin{enumerate}
+ \item \textbf{Closed:} In the normal state, requests are allowed to pass through to the downstream service. The circuit breaker monitors the number of failures (e.g., timeouts, exceptions). If the failure count exceeds a configured threshold within a specific time window, the breaker transitions to the Open state.
+ \item \textbf{Open:} When the circuit is open, requests to the downstream service are immediately rejected (e.g., by returning an error or a predefined fallback response) without making an actual call. This gives the failing service time to recover. After a configured timeout period, the breaker transitions to the Half-Open state.
+ \item \textbf{Half-Open:} In this state, a limited number of test requests are allowed to pass through to the downstream service. If these requests succeed, the breaker assumes the service has recovered and transitions back to the Closed state (resetting the failure counter). If any of these test requests fail, the breaker reverts to the Open state, and the recovery timeout period begins again.
+\end{enumerate}
+
+\section{Retry Mechanisms}
+
+\par Retry mechanisms are designed to handle transient faults—temporary issues like network glitches, brief service unavailability, or momentary resource contention—by automatically re-attempting a failed operation. The assumption is that the fault is short-lived and a subsequent attempt is likely to succeed. Retries can significantly improve the resilience of inter-service communication.
+
+\par However, naive retry implementations can cause more harm than good. If a service is struggling due to overload, immediate and repeated retries from multiple clients can exacerbate the problem, leading to a "retry storm" that prevents the service from recovering. To mitigate this, effective retry strategies must incorporate:
+
+\begin{itemize}
+ \item \textbf{Backoff Policies:} Instead of retrying immediately, a delay is introduced between attempts. Common backoff strategies include:
+
+ \begin{itemize}
+ \item \textbf{Exponential Backoff:} The delay between retries increases exponentially (e.g., 1s, 2s, 4s, 8s). This gives the failing service progressively more time to recover. \cite{polly2025dotnet}
+ \item \textbf{Jitter:} Adding a small random amount of time to the backoff delay helps to prevent synchronized retries from multiple clients, which could still overwhelm the service. \cite{polly2025dotnet}
+ \end{itemize}
+
+\item \textbf{Maximum Retry Attempts:} Limiting the number of retries prevents indefinite attempts for persistent failures.
+
+\item \textbf{Retryable Conditions:} Not all errors should be retried. For example, a "400 Bad Request" error is unlikely to succeed on retry without modification, whereas a "503 Service Unavailable" might.
+\end{itemize}
+
+\section{The Bulkhead Pattern: Isolating Resources for Fault Containment}
+
+The Bulkhead pattern is a fault isolation technique inspired by the watertight compartments (bulkheads) in a ship's hull, which prevent a single breach from flooding the entire vessel. \cite{shekhar2024microservices} \cite{baboi2019dynamic} In microservice architectures, this pattern aims to isolate resources used for communicating with different downstream services or handling different types of requests. If one downstream service becomes slow, unresponsive, or fails, the resources allocated for interacting with it (e.g., connection pools, thread pools) may become exhausted. Without bulkheads, this exhaustion could impact the calling service's ability to interact with other, healthy downstream services, leading to a cascading failure.
+
+By partitioning resources, the Bulkhead pattern ensures that a failure or slowdown in one area is contained and does not deplete resources needed by other parts of the application. For example, a microservice might maintain separate thread pools for calls to Service A and Service B. If Service A becomes unresponsive and ties up all threads in its dedicated pool, calls to Service B can still proceed using their separate thread pool.
+
+The concept of bulkheads can be applied more broadly than just connection and thread pools. It can extend to:
+\begin{itemize}
+ \item \textbf{Isolating Message Queues:} If different types of critical tasks or events are processed via message queues, using separate queues for distinct functionalities can act as a bulkhead. If one type of task floods its queue or its consumers fail, it won't impede the processing of messages from other queues.
+ \item \textbf{Infrastructure Segmentation:} Deploying different groups of critical services on separate Kubernetes clusters, distinct sets of virtual machines, or in different availability zones can be viewed as a higher-level application of the bulkhead principle. This helps to contain the "blast radius" of infrastructure-level failures.
+ \item \textbf{Process-Level Isolation:} Running different services in separate processes or containers is a fundamental form of bulkhead, ensuring that a crash in one service doesn't directly bring down others.
+\end{itemize}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter5.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter5.tex
new file mode 100644
index 0000000..1510542
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter5.tex
@@ -0,0 +1,329 @@
+\chapter{Building applications with Microservices Architecture in .NET}
+\label{chap:ch4}
+
+\par This chapter delves into the critical aspects of scalability and fault tolerance in the context of microservice-based applications. Using a practical example of an e-commerce platform built with .NET, React, and deployed on Kubernetes, we explore the architectural decisions and implementation details that contribute to a resilient and scalable system. We analyze the role of various technologies and patterns, including API Gateways, asynchronous messaging with RabbitMQ, and the application of resilience policies using Polly. The discussion highlights how these components work in concert to handle fluctuating loads and gracefully manage failures, ensuring a seamless user experience.
+
+\section{Architectural Overview}
+
+The application's architecture is a classic example of a microservice-based system. A user-facing React application and a separate React Admin interface for administrative tasks serve as the clients. All client requests are first routed to an API Gateway built with YARP (Yet Another Reverse Proxy). This gateway acts as a single, unified entry point, simplifying the frontend logic and directing traffic to the appropriate backend microservice.
+
+The core backend logic is distributed across three distinct services:
+
+\begin{itemize}
+ \item OrderService: Manages the creation and tracking of customer orders.
+ \item InventoryService: Handles product stock levels and availability.
+ \item PaymentService: Integrates with Stripe to process payments securely.
+\end{itemize}
+
+Communication between these services is handled through two distinct channels. For immediate, request-response interactions, services communicate synchronously via direct HTTP calls. For processes that can be handled in the background, such as updating inventory after a payment, the services communicate asynchronously using RabbitMQ as a message broker. This dual approach optimizes for both responsiveness and resilience.
+
+\begin{figure}[h!]
+ \centering
+\begin{tikzpicture}[
+ auto,
+ node distance=2.2cm and 2cm, % Taller distance for vertical layout
+ font=\small,
+ % Styles for different components
+ service/.style={
+ rectangle, draw, fill=blue!10, rounded corners,
+ minimum height=1.2cm, minimum width=4cm, text centered, text width=4cm
+ },
+ dbs/.style={
+ cylinder, shape border rotate=90, draw, fill=gray!20,
+ aspect=0.3, minimum height=1.5cm, text centered, text width=3cm
+ },
+ gateway/.style={
+ rectangle, draw, fill=green!15, rounded corners,
+ minimum height=1.2cm, minimum width=4.5cm, text centered
+ },
+ frontend/.style={
+ rectangle, draw, fill=orange!15, rounded corners,
+ minimum height=1.2cm, minimum width=4.5cm, text centered
+ },
+ broker/.style={
+ rectangle, draw, fill=purple!15, rounded corners,
+ minimum height=4cm, minimum width=2.2cm, text centered
+ },
+ external/.style={
+ rectangle, draw, fill=red!10, rounded corners,
+ minimum height=1.2cm, minimum width=2.5cm, text centered
+ },
+ % Arrow styles
+ http_arrow/.style={-Stealth, thick},
+ async_arrow/.style={-Stealth, dashed, thick, blue!60!black}
+]
+
+% TIER 1: CLIENT
+\node[frontend] (react_app) {React Frontend (User \& Admin)};
+
+% TIER 2: GATEWAY
+\node[gateway] (api_gateway) [below=1.5cm of react_app] {API Gateway (YARP)};
+
+% TIER 3: SERVICES (Stacked Vertically)
+\node[service] (payment_service) [below=1.5cm of api_gateway] {Payment Service (.NET)};
+\node[service] (order_service) [below=of payment_service] {Order Service (.NET)};
+\node[service] (inventory_service) [below=of order_service] {Inventory Service (.NET)};
+
+% TIER 4: DATA
+\node[dbs] (shared_db) [below=of inventory_service] {Shared DB (SQL Server)};
+
+% SIDE COMPONENTS
+\node[external] (stripe) [left=of payment_service] {Stripe API};
+\node[broker] (rabbitmq) [right=of order_service] {RabbitMQ};
+% Labels for queues inside RabbitMQ node
+\node[anchor=center, text width=2cm] (q1) at ([yshift=0.7cm]rabbitmq.center) {\small \textit{purchase\_queue}};
+\node[anchor=center, text width=2cm] (q2) at ([yshift=-0.7cm]rabbitmq.center) {\small \textit{inventory\_queue}};
+
+
+% KUBERNETES CLUSTER BOUNDARY (using fit, updated for vertical layout)
+\begin{scope}[on background layer]
+ \node[
+ draw=gray, dashed, thick, rounded corners,
+ fit=(api_gateway) (payment_service) (inventory_service) (shared_db) (rabbitmq),
+ label={[yshift=0.2cm]above right:Kubernetes Cluster}
+ ] (k8s_cluster) {};
+\end{scope}
+
+% --- ARROWS - Communication Flow ---
+
+% Client -> Gateway
+\draw[http_arrow] (react_app) -- node[midway, right] {HTTP/S Requests} (api_gateway);
+
+% Gateway -> Services (Proxy)
+\draw[http_arrow] (api_gateway) .. controls +(east:4) and +(east:4) .. node[midway, left] {Proxy} (payment_service);
+% Use orthogonal paths for other proxy connections to keep it clean
+\draw[http_arrow] (api_gateway.south) .. controls +(east:4) and +(east:4) .. node[pos=0.25, left] {Proxy} (order_service.north);
+\draw[http_arrow] (api_gateway.south) .. controls +(west:4) and +(west:4) .. node[pos=0.25, left] {Proxy} (inventory_service.north);
+
+% Services -> Database
+\draw[http_arrow] (inventory_service) -- node[midway, right] {DB Queries} (shared_db);
+% Route the other DB connection around the inventory_service node
+\draw[http_arrow] (order_service.south) .. controls +(east:4) and +(east:4) ..node[pos=0.5, right] {DB Queries} (shared_db.north);
+
+% Inter-Service HTTP Communication
+\draw[http_arrow] (payment_service) -- node[midway, left] {1. Get Order Details}
+ node[midway, right, text width=2.5cm] {\footnotesize(Polly: Retry, Circuit Breaker)} (order_service);
+% Upward arrow from inventory to order, curved to show reverse flow
+\draw[http_arrow] (inventory_service.north) .. controls +(west:2) and +(west:2) ..
+ node[midway, left] {2. Get Order Details}
+ node[midway, right] {\footnotesize(Polly)}
+ (order_service.south);
+
+
+% Payment Flow
+\draw[http_arrow] (payment_service) -- node[midway, above] {Create Session} (stripe);
+\draw[http_arrow, gray] (stripe.north) .. controls +(west:1) and +(west:2) ..
+ node[midway, above, sloped] {Redirect User} (react_app.west);
+
+% Asynchronous Messaging via RabbitMQ
+\draw[async_arrow] (payment_service.east) -- node[midway, above] {Publish} (rabbitmq.west);
+\draw[async_arrow] (rabbitmq) -- node[midway, above] {Consume} (order_service.east);
+\draw[async_arrow] (rabbitmq.south) -- ++(0,-0.5) -| node[pos=0.25, right] {Consume} (inventory_service.east);
+\end{tikzpicture}
+\caption{The microservice architecture for the e-commerce application. It demonstrates a vertical flow from the API Gateway to the services, which use a shared database. Asynchronous communication via RabbitMQ and resilient inter-service calls with Polly are key features for fault tolerance.}
+ \label{fig:architecture}
+\end{figure}
+
+
+\section{Implementing Scalability}
+Scalability is addressed at multiple levels within this architecture, from the infrastructure to the application logic itself.
+\subsection{Service-Level Scalability with Kubernetes}
+
+The entire backend is designed for a cloud-native environment, with each microservice containerized and deployed on Kubernetes. This platform provides a powerful framework for achieving automated, horizontal scalability.
+
+The deployment of each service is managed by three key Kubernetes objects. First, a Deployment manifest defines the desired state of the service. It specifies the container image to use, resource requests and limits to ensure predictable performance, and any necessary environment configurations.
+
+Second, a Service manifest exposes the pods managed by the Deployment to the network. It provides a stable IP address and DNS name, and it automatically load-balances incoming traffic across all available replicas of the microservice. In this application, the InventoryService/OrderService/PaymentService is exposed via a LoadBalancer service, making it accessible from outside the cluster on a specific port.
+
+Finally, a HorizontalPodAutoscaler (HPA) automates the scaling process. The InventoryService/OrderService/PaymentService is configured with an HPA that monitors its CPU utilization. The system is set to maintain a minimum of one running instance but can automatically scale up to a maximum of three instances.\cite{kubernetes2025horizontal} \cite{baboi2019dynamic} A scale-out event is triggered whenever the average CPU utilization across all pods exceeds 80\%, ensuring that the application can seamlessly handle sudden spikes in traffic without manual intervention. (See Figure \ref{fig:hpa_mechanism_horizontal} for a visual representation of the HPA mechanism.)
+
+\begin{figure}[h!]
+ \centering
+ \begin{tikzpicture}[
+ auto,
+ node distance=1.5cm and 2.2cm,
+ font=\small,
+ % Styles
+ pod/.style={
+ rectangle, draw, fill=blue!10, minimum height=1cm, minimum width=3cm, text centered
+ },
+ k8s_service/.style={
+ rectangle, draw, fill=green!15, minimum height=3cm, minimum width=2.5cm, text centered, text width=2.5cm
+ },
+ hpa/.style={
+ rectangle, draw, rounded corners, fill=purple!15, minimum height=1cm, minimum width=3cm, text centered
+ },
+ metrics_server/.style={
+ rectangle, draw, fill=yellow!20, minimum height=1cm, minimum width=3cm, text centered
+ },
+ deployment/.style={
+ rectangle, draw=gray, dashed, inner sep=0.6cm, rounded corners
+ },
+ % Arrow styles
+ flow_arrow/.style={-Stealth, thick},
+ control_arrow/.style={-Stealth, thick, red!80!black},
+ metric_arrow/.style={-Stealth, dashed, gray}
+ ]
+
+ % --- Main traffic flow (Horizontal) ---
+
+ % K8s Service (Load Balancer) on the left
+ \node[k8s_service] (service_lb) {Kubernetes Service (Load Balancer)};
+
+ % Vertically stacked pods to the right
+ \node[pod] (pod1) [right=of service_lb] {Pod 1};
+ \node[pod] (pod2) [below=0.5cm of pod1] {Pod 2};
+ \node[pod] (podN) [below=0.5cm of pod2] {Pod N};
+
+ % Deployment around Pods
+ \node[deployment, fit=(pod1) (pod2) (podN), label={[xshift=0.3cm]right:Deployment}] (dep) {};
+
+ % --- Autoscaling Loop (Below) ---
+
+ \node[metrics_server] (metrics) [below=of dep, yshift=-1cm] {Metrics Server};
+ \node[hpa] (hpa_controller) [left=of metrics] {HPA};
+
+ % --- ARROWS ---
+
+ % Incoming traffic to Service
+ \draw[flow_arrow] ++(-2.5, 0) node[left, text width=1.5cm]{Incoming Traffic} -- (service_lb);
+
+ % Service to Deployment/Pods
+ \draw[flow_arrow] (service_lb) -- (dep);
+
+ % --- Arrows for Scaling Loop ---
+
+ % Pods (Deployment) to Metrics Server
+ \draw[metric_arrow] (dep.south) -- node[midway, right] {CPU/Memory Metrics} (metrics);
+
+ % Metrics to HPA
+ \draw[metric_arrow] (metrics) -- node[midway, above] {Metrics} (hpa_controller);
+
+ % HPA to Deployment (curved arrow to close the loop)
+ \draw[control_arrow] (hpa_controller.north) .. controls +(north:1.5) and +(west:1.5) ..
+ node[pos=0.3, below, sloped] {Scale Up/Down} (dep.west);
+
+ \end{tikzpicture}
+ \caption{A horizontally oriented view of the Kubernetes autoscaling mechanism. Incoming traffic is directed by the Kubernetes Service to the Deployment, which manages a scalable set of Pods. The Horizontal Pod Autoscaler (HPA) forms a control loop below: it receives metrics from the Pods via the Metrics Server and adjusts the number of replicas in the Deployment accordingly.}
+ \label{fig:hpa_mechanism_horizontal}
+\end{figure}
+
+\subsection{Asynchronous Communication with RabbitMQ}
+
+The use of RabbitMQ for inter-service communication is a cornerstone of the application's scalability strategy. \cite{rabbitmq2025messaging} When an order is placed and payment is completed, the system does not rely on a chain of direct, blocking calls. Instead, the PaymentService publishes messages to designated queues in RabbitMQ.
+
+This decouples the services, allowing them to operate and scale independently. The OrderService and InventoryService each contain a background consumer that listens for relevant messages. This asynchronous, event-driven pattern prevents the PaymentService from being blocked while waiting for downstream services to confirm updates. The result is improved responsiveness for the end-user and higher overall system throughput, as each service can process tasks at its own pace.
+
+\section{Resilient Communication with Polly}
+
+The .NET resilience and transient-fault-handling library, Polly, is integrated into the application's HTTP clients to gracefully handle the inevitable failures in a distributed system.
+
+\subsection{The Retry Pattern}
+
+To combat transient network issues or temporary service unavailability, a Retry policy is implemented. This policy automatically re-attempts a failed HTTP request a specified number of times. To avoid overwhelming a struggling service, it uses an exponential backoff strategy, where the delay between each retry attempt increases progressively. This simple yet effective pattern significantly improves the reliability of inter-service communication. \cite{polly2025dotnet}
+
+\subsection{The Circuit Breaker Pattern}
+
+To prevent cascading failures, where a problem in one service brings down others, the Circuit Breaker pattern is employed. This policy monitors calls to a downstream service. If the number of consecutive failures surpasses a configured threshold (configured as 10 failed requests), the circuit "opens," and all subsequent calls fail immediately, without making a network request. This protects the calling service from wasting resources on calls that are likely to fail. After a timeout period, the circuit enters a "half-open" state, allowing a single test request through. If this request succeeds, the circuit "closes," and normal operation resumes. Otherwise, it remains open, giving the failing service more time to recover. \cite{polly2025dotnet}
+
+\subsection{Fault Tolerance with Kubernetes}
+
+Kubernetes itself provides a powerful, declarative foundation for fault tolerance. Its control plane continuously works to ensure the actual state of the cluster matches the desired state defined in the configuration files.
+
+\begin{itemize}
+
+\item \textbf{Self-Healing:} If a container or pod crashes for any reason, Kubernetes automatically detects the failure and restarts it or provisions a new one, ensuring the service remains available without manual intervention.
+
+\item \textbf{Rolling Updates:} When deploying a new version of a service, Kubernetes performs a rolling update. It gradually replaces old pods with new ones, ensuring there is no downtime. It also monitors the health of the new pods and can automatically roll back to the previous version if they fail to start correctly.
+
+\end{itemize}
+
+\subsection{Message Durability with RabbitMQ}
+
+For true fault tolerance in a production system, the RabbitMQ queues are configured as durable. This ensures that messages persist on disk and will not be lost even if the RabbitMQ server restarts. The application already implements manual message acknowledgments, meaning a message is only removed from the queue after the consumer service has successfully processed it. This combination of durable queues and acknowledgments guarantees that no critical business event, like an inventory update, is lost due to a transient failure.
+
+\section{Observability: Metrics and Monitoring}
+While scalability and fault tolerance mechanisms provide the foundation for a robust system, they are incomplete without a comprehensive observability strategy. In a distributed microservices architecture, understanding the internal state and performance of the system is paramount for maintaining reliability.
+
+The application employs a modern observability stack consisting of Prometheus for metrics collection and Grafana for visualization. \cite{prometheus2025monitoring} \cite{grafana2025open}
+
+Each .NET microservice is instrumented using the prometheus-net library, which exposes a standard /metrics endpoint. This endpoint provides a wealth of real-time data, including HTTP request rates, error percentages, and response latencies, as well as .NET runtime statistics like garbage collection and CPU usage.
+
+To collect this data, Prometheus is deployed within the Kubernetes cluster. The collection process is automated using ServiceMonitor resources. For each microservice (InventoryService, OrderService, and PaymentService), a ServiceMonitor tells the Prometheus instance how to discover and "scrape" (or pull) the data from its /metrics endpoint. This declarative approach integrates seamlessly with Kubernetes service discovery, ensuring that as services scale up or down, all new instances are automatically included in the monitoring. \cite{prometheus2025monitoring}
+
+While Prometheus is the engine for collecting and storing this time-series data, Grafana serves as the visualization layer. Operators and developers can build detailed dashboards in Grafana to plot key metrics over time. \cite{grafana2025open} These dashboards provide at-a-glance visibility into the health of the entire system. For example, one could visualize the CPU utilization of the InventoryService pods to see the Horizontal Pod Autoscaler in action, or monitor the HTTP 5xx error rate across all services to detect failures. This ability to monitor, visualize, and alert on key performance indicators is not just a reactive tool for debugging but a proactive one for identifying performance bottlenecks and potential failures before they impact users.
+
+
+\section{Application User Interface and Workflow}
+
+This section details the user-facing and administrative interfaces of the e-commerce application, illustrating the typical user journey from browsing products to completing a purchase, as well as the administrative workflow for managing inventory.
+
+\subsection{Customer-Facing Storefront}
+
+The customer experience is designed to be clean, intuitive, and efficient, guiding the user from product discovery to checkout with ease.
+
+\begin{itemize}
+
+\item Product Catalog View (Homepage): The main entry point for customers is a modern storefront that displays products in a clear grid layout. Each item is presented as a distinct card containing a product image, name, a brief description, and the price. An "Add to Cart" button is prominently featured on each card, inviting interaction. On the right-hand side of the page, a persistent "Shopping Cart" module provides an at-a-glance summary of the items the user has selected. On the initial visit, this cart correctly indicates that it is empty. Figure \ref{fig:product_catalog}
+
+\begin{figure}
+\centering
+\includegraphics[width=0.8\textwidth]{figures/products.png}
+\caption{Product catalog view, showcasing products in a grid layout with an "Add to Cart" button and a persistent Shopping Cart module on the right.}
+\label{fig:product_catalog}
+\end{figure}
+
+\item Adding Items to the Cart: When a user clicks the "Add to Cart" button for an item, the interface provides immediate visual feedback. The selected product is instantly added to the Shopping Cart module on the right. The cart dynamically updates to show each unique item, its quantity (which can be incremented), and its price. A subtotal, calculated tax, and a final, bolded total are displayed in real-time. This seamless and interactive experience allows users to track their selections and total cost without navigating to a separate page. Figure \ref{fig:shopping_cart}
+
+\begin{figure}
+\centering
+\includegraphics[width=0.5\textwidth]{figures/checkout.png}
+\caption{Shopping Cart view, showing selected products with quantities, prices, and a total cost. The "Proceed to Checkout" button is highlighted at the bottom.}
+\label{fig:shopping_cart}
+\end{figure}
+
+\item Checkout Process: Once the user has finished shopping, they click the "Proceed to Checkout" button located at the bottom of the shopping cart. This action signifies the handoff from browsing to payment and redirects the user away from the application's storefront to a secure, externally hosted payment page powered by Stripe. Figure \ref{fig:stripe_payment}
+
+\begin{figure}
+\centering
+\fbox{\includegraphics[width=0.5\textwidth ]{figures/stripe.png}}
+\caption{Stripe Payment Page, displaying a final order summary on the left and a secure form for entering payment details on the right. \cite{stripe2025online}}
+\label{fig:stripe_payment}
+\end{figure}
+
+\item Stripe Payment Page: The application's integration with Stripe Checkout is seamless. On the secure Stripe page, the user sees a final order summary on the left, itemizing the products and the total charge. On the right, they are presented with a standard, secure form to enter their email and credit card information. This critical design choice offloads the responsibility of handling and securing sensitive payment card industry (PCI) data to a trusted, compliant third-party provider, which is a best practice that significantly enhances the security and trustworthiness of the application. \cite{stripe2025online} Figure \ref{fig:stripe_payment}
+
+\end{itemize}
+
+\subsection{Administrative Interface}
+
+A separate, secure web application serves as the administrative backend, allowing store managers to perform essential inventory management tasks.
+
+\begin{itemize}
+
+\item Inventory Dashboard: The primary administrative screen is the "Inventory Dashboard." It features a clean, tabular view of the entire "Product Catalog." Each row in the table corresponds to a single product, clearly displaying its photo, name, description, price, and the current quantity in stock. To facilitate easy management, each row includes "Actions" buttons—an icon for editing and an icon for deleting the product. At the top of the catalog, an "Add Product" button allows for the creation of new inventory items. Figure \ref{fig:inventory_dashboard}
+
+\begin{figure}
+\centering
+\fbox{\includegraphics[width=0.5\textwidth ]{figures/inventory.png}}
+\caption{Inventory Dashboard, displaying a table of products with options to edit, delete, or add new products. Each product row includes a photo, name, description, price, and quantity.}
+\label{fig:inventory_dashboard}
+\end{figure}
+
+
+\item Editing a Product: When an administrator clicks the edit icon for a product, a modal form titled "Edit: [Product Name]" appears, overlaying the dashboard. This form is pre-populated with all the existing product data (name, description, photo URL, price, and quantity). The administrator can modify any of these fields and then click the "Update Product" button to save the changes to the database or "Cancel" to discard them. This modal approach provides a quick and efficient workflow for making targeted updates to product details and stock levels without losing the context of the main dashboard. Figure \ref{fig:edit_product}
+
+\begin{figure}
+\centering
+\fbox{\includegraphics[width=0.5\textwidth ]{figures/edit.png}}
+\caption{Edit Product Modal, allowing administrators to modify product details. The form is pre-populated with existing data, and changes can be saved or canceled.}
+\label{fig:edit_product}
+\end{figure}
+
+\item Adding a New Product: Clicking the "Add Product" button opens a similar modal form, but this one is empty, allowing the administrator to enter all necessary details for a new product. After filling out the form, they can click "Create Product" to add it to the catalog or "Cancel" to close the modal without saving. Figure \ref{fig:edit_product}
+
+\item Deleting a Product: The delete action is straightforward. When the administrator clicks the delete icon for a product, a confirmation dialog appears, asking if they are sure they want to delete the product. This step prevents accidental deletions and ensures that the administrator has a chance to confirm their intent.
+
+\end{itemize}
+
+This clear separation of concerns between a public-facing storefront and a secure administrative backend is a standard and effective design pattern. It ensures a simple, intuitive shopping experience for customers while providing powerful and secure tools for store managers to maintain the product catalog.
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter6.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter6.tex
new file mode 100644
index 0000000..8470c1d
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter6.tex
@@ -0,0 +1,83 @@
+\chapter{Results and Discussion}
+\label{chap:results}
+
+To rigorously validate the sustained performance and stability of the architecture, a 30-minute load test was conducted against the InventoryService. The test, orchestrated by Locust \cite{locust2025load}, simulated a continuous load of 10 concurrent users (\ref{fig:number_of_users}) making GET requests to the /inventory endpoint. The health and resource consumption of the service were closely monitored throughout the test using Grafana dashboards populated with data from Prometheus.
+
+
+\subsection{Results}
+\par The 30-minute sustained load test yielded the following key performance indicators from Locust:
+
+\begin{itemize}
+
+\item Requests per Second (RPS): After an initial ramp-up, the system achieved and maintained a remarkably stable throughput, averaging approximately 124 RPS. This rate was held consistently for the entire 30-minute duration, demonstrating the service's ability to handle a continuous load without degradation. Figure \ref{fig:rps}
+
+\begin{figure}
+\centering
+\includegraphics[width=0.8\textwidth]{figures/rps.png}
+\caption{Requests per Second (RPS) during the 30-minute load test.}
+\label{fig:rps}
+\end{figure}
+
+\item Response Times: The service exhibited excellent and predictable latency. The median (50th percentile) response time was stable at approximately 35ms, while the 95th percentile response time held steady at around 50ms. The absence of any upward trend in response times over the 30-minute period confirms the efficiency of the service. Figure \ref{fig:response_time}
+
+\begin{figure}
+\centering
+\includegraphics[width=0.8\textwidth]{figures/response_time.png}
+\caption{Response times during the 30-minute load test, showing median and 95th percentile latencies.}
+\label{fig:response_time}
+\end{figure}
+
+\item Failures: The system demonstrated high reliability, with zero failures recorded across the entire 30-minute test. This 100\% success rate under sustained load confirms the robustness of the service.
+
+\begin{figure}
+\centering
+\includegraphics[width=0.8\textwidth]{figures/number_of_users.png}
+\caption{Number of users during the 30-minute load test, showing a stable count of 10 concurrent users.}
+\label{fig:number_of_users}
+\end{figure}
+
+
+\end{itemize}
+
+The Grafana dashboard, capturing a 30-minute window, provided crucial insights into the behavior of the InventoryService pod within Kubernetes:
+
+\begin{itemize}
+
+
+\item CPU Usage: At the start of the test, the CPU usage of the primary inventoryservice pod rapidly climbed from its idle state to its configured limit of 0.20 cores (200m). The pod sustained this level of maximum CPU utilization for the entire test period.Figure \ref{fig:cpu_usage}
+
+\begin{figure}
+\centering
+\includegraphics[width=0.8\textwidth]{figures/cpu_usage.png}
+\caption{CPU usage of the InventoryService pod during the 30-minute load test, showing sustained maximum utilization.}
+\label{fig:cpu_usage}
+\end{figure}
+
+\item Memory Usage: Memory consumption remained exceptionally stable at approximately 97 MB. The graph shows a flat line, indicating no memory leaks or gradual resource exhaustion over the extended test duration. Figure \ref{fig:memory_usage}
+
+\begin{figure}
+\centering
+\includegraphics[width=0.8\textwidth]{figures/memory_usage.png}
+\caption{Memory usage of the InventoryService pod during the 30-minute load test, showing stable memory consumption.}
+\label{fig:memory_usage}
+\end{figure}
+
+\end{itemize}
+
+\subsection{Discussion}
+The results from this 30-minute load test provide strong evidence of the InventoryService's stability, performance, and the effectiveness of its cloud-native design.
+
+Sustaining 124 RPS with a median latency of 35ms for 30 minutes is a significant achievement. It proves that the service is not only fast but also efficient, without performance degradation over time. The flat memory usage graph is particularly noteworthy, as it confirms the absence of memory leaks, a common issue that plagues long-running services and often leads to crashes.
+
+The most critical insight is the interplay between the application's performance and the Kubernetes orchestration layer. The CPU utilization for the single inventoryservice pod was consistently pegged at its limit. This behavior under sustained load validates two core architectural tenets:
+
+\begin{enumerate}
+
+
+\item The Service is CPU-Bound: The performance of the service under this workload is primarily constrained by its available processing power. This is a predictable and desirable behavior, as it means performance can be directly influenced by resource allocation.
+
+\item Validation of the Horizontal Scaling Trigger: The Horizontal Pod Autoscaler (HPA) is configured to provision a new pod when the average CPU utilization exceeds 80\%. Since the pod's CPU was held at nearly 100\% of its limit, it continuously met the condition for scaling out. This test proves that under a real-world scenario with increasing load, the HPA would be correctly triggered to horizontally scale the service. This ensures the system can elastically adapt to demand, maintaining low response times by distributing the load across multiple instances.
+
+\end{enumerate}
+
+In summary, the 30-minute endurance test demonstrates more than just performance; it confirms the system's operational stability and resilience. The InventoryService has proven to be a robust, efficient, and well-behaved component of the architecture, whose behavior under load validates the core principles of the automated horizontal scaling strategy designed to ensure high availability and a seamless user experience.
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter6_conclusions.tex b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter6_conclusions.tex
new file mode 100644
index 0000000..034bf25
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/chapters/chapter6_conclusions.tex
@@ -0,0 +1,45 @@
+\chapter{Conclusion and Future Research Directions}
+\label{conclusions}
+
+\section{Summary of Key Findings and Contributions}
+
+This thesis has undertaken a comprehensive exploration of scalability and fault tolerance within the domain of microservice architectures. The analysis reveals that achieving these critical system qualities is not an incidental outcome of adopting microservices but requires a deliberate, multi-faceted architectural approach. Key findings underscore that robust microservice systems are built upon a foundation of well-chosen design patterns, enabling technologies, and proactive resilience engineering practices.
+
+The shift from monolithic to microservice architectures offers inherent advantages for targeted scalability and improved fault isolation. However, the distributed nature of microservices introduces new complexities, including challenges in inter-service communication, data management, and operational overhead. This research has systematically examined strategies to address these challenges. For scalability, patterns such as horizontal scaling, load balancing, API gateways and asynchronous processing via message queues have been identified as crucial. For fault tolerance, patterns including circuit breakers advantages intelligent retries with backoff are essential for building resilient systems.
+
+The role of enabling technologies cannot be overstated. Containerization with Docker and orchestration with Kubernetes (including its diverse autoscaling mechanisms like HPA) provide the platform for dynamic resource management. Furthermore, comprehensive observability—through monitoring and logging emerges as the bedrock upon which effective scaling and fault diagnosis are built. Proactive resilience practices represent a paradigm shift towards anticipating and mitigating failures before they impact users.
+
+The primary contribution of this thesis is the design, end-to-end implementation, and empirical validation of a holistic architectural framework for microservices. This framework was brought to life through a concrete e-commerce application built with .NET and deployed on Kubernetes, demonstrating how to effectively integrate a suite of modern cloud-native technologies.
+
+Specifically, this work established a blueprint for:
+\begin{itemize}
+
+\item Independent Scalability: Leveraging Kubernetes and the Horizontal Pod Autoscaler, we proved how services can scale automatically based on real-time CPU demand.
+\item Layered Fault Tolerance: Resilience was woven into the architecture at multiple levels—from application-level Retry and Circuit Breaker patterns using Polly to infrastructure-level self-healing via Kubernetes and guaranteed message delivery through RabbitMQ.
+\item Decoupled Communication: Asynchronous messaging was employed to decouple the Order, Inventory, and Payment services, enhancing both resilience and scalability.
+\item Comprehensive Observability: A full monitoring stack using Prometheus and Grafana was integrated, providing crucial, real-time visibility into system performance and resource utilization under load.
+
+\end{itemize}
+
+Crucially, this thesis moved beyond theoretical design by subjecting the system to rigorous load testing with Locust. The results provided empirical evidence that the InventoryService is stable, performant, and CPU-bound under sustained load, validating that the configured auto-scaling policies would be triggered under real-world conditions.
+
+Ultimately, this thesis argues and demonstrates that scalability and fault tolerance are deeply symbiotic. The successful integration of the specific patterns and technologies presented here—where observability informs scaling, and resilience patterns protect services during that scaling—is key to developing microservice applications that are not only adaptable to dynamic demands but are verifiably durable in the face of inevitable failures.
+
+\section{Limitations of the Study}
+
+It is imperative to recognize certain limitations inherent in this study. The rapid pace of innovation in microservices and their associated technologies means that some of the specific tools and performance metrics presented herein may have a limited shelf life. Furthermore, the empirical validation was conducted on a specific e-commerce platform within a controlled setting; consequently, the generalizability of these findings to other domains or application types is not guaranteed. Finally, the scope of this thesis was intentionally focused on scalability and fault tolerance, thereby excluding an in-depth analysis of other vital microservice considerations such as security, data consistency, and the developer experience, which remain fruitful avenues for future research.
+
+
+\section{Future Research Directions}
+
+The dynamic and complex nature of microservice architectures presents numerous opportunities for future research. Several promising avenues include:
+
+\begin{itemize}
+ \item AI and Machine Learning for Intelligent System Management \cite{walia2025leveraging} \cite{makungu2023fault}
+ \item Advanced Chaos Engineering and Resilience Verification \cite{gremlin2023chaos}
+ \item Serverless Architectures and Function-as-a-Service (FaaS)
+ \item Dynamic Microservice Architectures \cite{baboi2019dynamic} \cite{ibrahim2022scalable}
+
+\end{itemize}
+
+Addressing these research areas will contribute to the continued evolution of microservice architectures, enabling the development of even more scalable, resilient, and intelligent distributed systems.
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/checkout.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/checkout.png
new file mode 100644
index 0000000..eac1173
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/checkout.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/cpu_usage.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/cpu_usage.png
new file mode 100644
index 0000000..22865d6
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/cpu_usage.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/edit.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/edit.png
new file mode 100644
index 0000000..a1bddd5
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/edit.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/inventory.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/inventory.png
new file mode 100644
index 0000000..3c54609
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/inventory.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/memory_usage.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/memory_usage.png
new file mode 100644
index 0000000..d12f8bb
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/memory_usage.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/number_of_users.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/number_of_users.png
new file mode 100644
index 0000000..35abd4b
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/number_of_users.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/products.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/products.png
new file mode 100644
index 0000000..ff12379
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/products.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/response_time.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/response_time.png
new file mode 100644
index 0000000..0f5c299
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/response_time.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/rps.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/rps.png
new file mode 100644
index 0000000..ab5baad
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/rps.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/figures/stripe.png b/Anul 3/Semestrul 2/Licenta/Thesis/figures/stripe.png
new file mode 100644
index 0000000..fd27d08
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/figures/stripe.png differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.aux b/Anul 3/Semestrul 2/Licenta/Thesis/main.aux
new file mode 100644
index 0000000..6aecfda
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.aux
@@ -0,0 +1,166 @@
+\relax
+\providecommand\hyper@newdestlabel[2]{}
+\providecommand\HyField@AuxAddToFields[1]{}
+\providecommand\HyField@AuxAddToCoFields[2]{}
+\bibstyle{alpha}
+\providecommand \babel@aux [2]{\global \let \babel@toc \@gobbletwo }
+\@nameuse{bbl@beforestart}
+\babel@aux{english}{}
+\citation{fowler2014microservices}
+\citation{richardson2018microservices}
+\citation{evans2003domain}
+\citation{shekhar2024microservices}
+\citation{walia2025leveraging}
+\@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{intro}{{1}{1}{Introduction}{chapter.1}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {1.1}Background: The Ascendancy of Microservices in Distributed System Design}{1}{section.1.1}\protected@file@percent }
+\newlabel{sec:ch1sec1}{{1.1}{1}{Background: The Ascendancy of Microservices in Distributed System Design}{section.1.1}{}}
+\citation{nygard2018release}
+\@writefile{toc}{\contentsline {section}{\numberline {1.2}Problem Statement: The Intrinsic Scalability and Fault Tolerance Imperatives in Microservice Ecosystems}{2}{section.1.2}\protected@file@percent }
+\newlabel{sec:ch1sec2}{{1.2}{2}{Problem Statement: The Intrinsic Scalability and Fault Tolerance Imperatives in Microservice Ecosystems}{section.1.2}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {1.3}Research Objectives and Guiding Questions}{2}{section.1.3}\protected@file@percent }
+\newlabel{sec:ch1sec3}{{1.3}{2}{Research Objectives and Guiding Questions}{section.1.3}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {1.4}Contributions of the Thesis}{3}{section.1.4}\protected@file@percent }
+\newlabel{sec:ch1sec4}{{1.4}{3}{Contributions of the Thesis}{section.1.4}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {1.5}Thesis Structure}{4}{section.1.5}\protected@file@percent }
+\newlabel{sec:ch1sec5}{{1.5}{4}{Thesis Structure}{section.1.5}{}}
+\citation{fowler2014microservices}
+\citation{richardson2018microservices}
+\@writefile{toc}{\contentsline {chapter}{\numberline {2}Theoretical Foundations of Microservices for Resilient and Scalable Systems}{6}{chapter.2}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{chap:ch1}{{2}{6}{Theoretical Foundations of Microservices for Resilient and Scalable Systems}{chapter.2}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {2.1}Defining Microservice Architecture: A Paradigm for Distributed Functionality}{6}{section.2.1}\protected@file@percent }
+\newlabel{sec:microservice-architecture}{{2.1}{6}{Defining Microservice Architecture: A Paradigm for Distributed Functionality}{section.2.1}{}}
+\citation{shekhar2024microservices}
+\citation{baboi2019dynamic}
+\@writefile{toc}{\contentsline {section}{\numberline {2.2}Core Characteristics Enabling (and Complicating) Scalability and Fault Tolerance}{7}{section.2.2}\protected@file@percent }
+\citation{walia2025leveraging}
+\citation{makungu2023fault}
+\@writefile{toc}{\contentsline {section}{\numberline {2.3}Advantages and Disadvantages in Distributed Contexts}{8}{section.2.3}\protected@file@percent }
+\newlabel{sec:advantages-disadvantages}{{2.3}{8}{Advantages and Disadvantages in Distributed Contexts}{section.2.3}{}}
+\citation{richardson2018microservices}
+\citation{richardson2018microservices}
+\@writefile{lot}{\contentsline {table}{\numberline {2.1}{\ignorespaces Comparative Overview of Microservices and Monolithic Architectures \cite {richardson2018microservices}}}{9}{table.2.1}\protected@file@percent }
+\newlabel{tab:microservices-vs-monolithic}{{2.1}{9}{Comparative Overview of Microservices and Monolithic Architectures \cite {richardson2018microservices}}{table.2.1}{}}
+\citation{kubernetes2025horizontal}
+\citation{burns2016borg}
+\@writefile{toc}{\contentsline {chapter}{\numberline {3}Design Patterns and Strategies for Scalability in Microservices}{10}{chapter.3}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{chap:ch3}{{3}{10}{Design Patterns and Strategies for Scalability in Microservices}{chapter.3}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {3.1}Vertical Scaling}{10}{section.3.1}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {3.2}Horizontal Scaling}{10}{section.3.2}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {3.3}Load Balancing Techniques and the Pivotal Role of API Gateways}{11}{section.3.3}\protected@file@percent }
+\citation{rabbitmq2025messaging}
+\@writefile{toc}{\contentsline {section}{\numberline {3.4}Asynchronous Processing and Message Queues for Decoupled Scaling}{12}{section.3.4}\protected@file@percent }
+\@writefile{toc}{\contentsline {chapter}{\numberline {4}Design Patterns and Strategies for Fault Tolerance in Microservices}{14}{chapter.4}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{chap:ch3}{{4}{14}{Design Patterns and Strategies for Fault Tolerance in Microservices}{chapter.4}{}}
+\citation{nygard2018release}
+\citation{polly2025dotnet}
+\citation{makungu2023fault}
+\citation{ibrahim2022scalable}
+\@writefile{toc}{\contentsline {section}{\numberline {4.1}The Circuit Breaker Pattern: Preventing Cascading Failures}{15}{section.4.1}\protected@file@percent }
+\citation{polly2025dotnet}
+\citation{polly2025dotnet}
+\citation{shekhar2024microservices}
+\citation{baboi2019dynamic}
+\@writefile{toc}{\contentsline {section}{\numberline {4.2}Retry Mechanisms}{16}{section.4.2}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {4.3}The Bulkhead Pattern: Isolating Resources for Fault Containment}{16}{section.4.3}\protected@file@percent }
+\@writefile{toc}{\contentsline {chapter}{\numberline {5}Building applications with Microservices Architecture in .NET}{18}{chapter.5}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{chap:ch4}{{5}{18}{Building applications with Microservices Architecture in .NET}{chapter.5}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {5.1}Architectural Overview}{18}{section.5.1}\protected@file@percent }
+\@writefile{lof}{\contentsline {figure}{\numberline {5.1}{\ignorespaces The microservice architecture for the e-commerce application. It demonstrates a vertical flow from the API Gateway to the services, which use a shared database. Asynchronous communication via RabbitMQ and resilient inter-service calls with Polly are key features for fault tolerance.}}{19}{figure.5.1}\protected@file@percent }
+\newlabel{fig:architecture}{{5.1}{19}{The microservice architecture for the e-commerce application. It demonstrates a vertical flow from the API Gateway to the services, which use a shared database. Asynchronous communication via RabbitMQ and resilient inter-service calls with Polly are key features for fault tolerance}{figure.5.1}{}}
+\citation{kubernetes2025horizontal}
+\citation{baboi2019dynamic}
+\citation{rabbitmq2025messaging}
+\@writefile{toc}{\contentsline {section}{\numberline {5.2}Implementing Scalability}{20}{section.5.2}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.2.1}Service-Level Scalability with Kubernetes}{20}{subsection.5.2.1}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.2.2}Asynchronous Communication with RabbitMQ}{20}{subsection.5.2.2}\protected@file@percent }
+\citation{polly2025dotnet}
+\citation{polly2025dotnet}
+\@writefile{lof}{\contentsline {figure}{\numberline {5.2}{\ignorespaces A horizontally oriented view of the Kubernetes autoscaling mechanism. Incoming traffic is directed by the Kubernetes Service to the Deployment, which manages a scalable set of Pods. The Horizontal Pod Autoscaler (HPA) forms a control loop below: it receives metrics from the Pods via the Metrics Server and adjusts the number of replicas in the Deployment accordingly.}}{21}{figure.5.2}\protected@file@percent }
+\newlabel{fig:hpa_mechanism_horizontal}{{5.2}{21}{A horizontally oriented view of the Kubernetes autoscaling mechanism. Incoming traffic is directed by the Kubernetes Service to the Deployment, which manages a scalable set of Pods. The Horizontal Pod Autoscaler (HPA) forms a control loop below: it receives metrics from the Pods via the Metrics Server and adjusts the number of replicas in the Deployment accordingly}{figure.5.2}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {5.3}Resilient Communication with Polly}{21}{section.5.3}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.1}The Retry Pattern}{21}{subsection.5.3.1}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.2}The Circuit Breaker Pattern}{22}{subsection.5.3.2}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.3}Fault Tolerance with Kubernetes}{22}{subsection.5.3.3}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.3.4}Message Durability with RabbitMQ}{22}{subsection.5.3.4}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {5.4}Observability: Metrics and Monitoring}{22}{section.5.4}\protected@file@percent }
+\citation{prometheus2025monitoring}
+\citation{grafana2025open}
+\citation{prometheus2025monitoring}
+\citation{grafana2025open}
+\@writefile{toc}{\contentsline {section}{\numberline {5.5}Application User Interface and Workflow}{23}{section.5.5}\protected@file@percent }
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.5.1}Customer-Facing Storefront}{23}{subsection.5.5.1}\protected@file@percent }
+\citation{stripe2025online}
+\citation{stripe2025online}
+\citation{stripe2025online}
+\@writefile{lof}{\contentsline {figure}{\numberline {5.3}{\ignorespaces Product catalog view, showcasing products in a grid layout with an "Add to Cart" button and a persistent Shopping Cart module on the right.}}{24}{figure.5.3}\protected@file@percent }
+\newlabel{fig:product_catalog}{{5.3}{24}{Product catalog view, showcasing products in a grid layout with an "Add to Cart" button and a persistent Shopping Cart module on the right}{figure.5.3}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {5.4}{\ignorespaces Shopping Cart view, showing selected products with quantities, prices, and a total cost. The "Proceed to Checkout" button is highlighted at the bottom.}}{25}{figure.5.4}\protected@file@percent }
+\newlabel{fig:shopping_cart}{{5.4}{25}{Shopping Cart view, showing selected products with quantities, prices, and a total cost. The "Proceed to Checkout" button is highlighted at the bottom}{figure.5.4}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {5.5}{\ignorespaces Stripe Payment Page, displaying a final order summary on the left and a secure form for entering payment details on the right. \cite {stripe2025online}}}{25}{figure.5.5}\protected@file@percent }
+\newlabel{fig:stripe_payment}{{5.5}{25}{Stripe Payment Page, displaying a final order summary on the left and a secure form for entering payment details on the right. \cite {stripe2025online}}{figure.5.5}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {5.6}{\ignorespaces Inventory Dashboard, displaying a table of products with options to edit, delete, or add new products. Each product row includes a photo, name, description, price, and quantity.}}{26}{figure.5.6}\protected@file@percent }
+\newlabel{fig:inventory_dashboard}{{5.6}{26}{Inventory Dashboard, displaying a table of products with options to edit, delete, or add new products. Each product row includes a photo, name, description, price, and quantity}{figure.5.6}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.5.2}Administrative Interface}{26}{subsection.5.5.2}\protected@file@percent }
+\@writefile{lof}{\contentsline {figure}{\numberline {5.7}{\ignorespaces Edit Product Modal, allowing administrators to modify product details. The form is pre-populated with existing data, and changes can be saved or canceled.}}{27}{figure.5.7}\protected@file@percent }
+\newlabel{fig:edit_product}{{5.7}{27}{Edit Product Modal, allowing administrators to modify product details. The form is pre-populated with existing data, and changes can be saved or canceled}{figure.5.7}{}}
+\citation{locust2025load}
+\@writefile{toc}{\contentsline {chapter}{\numberline {6}Results and Discussion}{28}{chapter.6}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{chap:results}{{6}{28}{Results and Discussion}{chapter.6}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {6.0.1}Results}{28}{subsection.6.0.1}\protected@file@percent }
+\@writefile{lof}{\contentsline {figure}{\numberline {6.1}{\ignorespaces Requests per Second (RPS) during the 30-minute load test.}}{28}{figure.6.1}\protected@file@percent }
+\newlabel{fig:rps}{{6.1}{28}{Requests per Second (RPS) during the 30-minute load test}{figure.6.1}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {6.2}{\ignorespaces Response times during the 30-minute load test, showing median and 95th percentile latencies.}}{29}{figure.6.2}\protected@file@percent }
+\newlabel{fig:response_time}{{6.2}{29}{Response times during the 30-minute load test, showing median and 95th percentile latencies}{figure.6.2}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {6.3}{\ignorespaces Number of users during the 30-minute load test, showing a stable count of 10 concurrent users.}}{29}{figure.6.3}\protected@file@percent }
+\newlabel{fig:number_of_users}{{6.3}{29}{Number of users during the 30-minute load test, showing a stable count of 10 concurrent users}{figure.6.3}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {6.0.2}Discussion}{29}{subsection.6.0.2}\protected@file@percent }
+\@writefile{lof}{\contentsline {figure}{\numberline {6.4}{\ignorespaces CPU usage of the InventoryService pod during the 30-minute load test, showing sustained maximum utilization.}}{29}{figure.6.4}\protected@file@percent }
+\newlabel{fig:cpu_usage}{{6.4}{29}{CPU usage of the InventoryService pod during the 30-minute load test, showing sustained maximum utilization}{figure.6.4}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {6.5}{\ignorespaces Memory usage of the InventoryService pod during the 30-minute load test, showing stable memory consumption.}}{30}{figure.6.5}\protected@file@percent }
+\newlabel{fig:memory_usage}{{6.5}{30}{Memory usage of the InventoryService pod during the 30-minute load test, showing stable memory consumption}{figure.6.5}{}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {7}Conclusion and Future Research Directions}{31}{chapter.7}\protected@file@percent }
+\@writefile{lof}{\addvspace {10\p@ }}
+\@writefile{lot}{\addvspace {10\p@ }}
+\newlabel{conclusions}{{7}{31}{Conclusion and Future Research Directions}{chapter.7}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {7.1}Summary of Key Findings and Contributions}{31}{section.7.1}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {7.2}Limitations of the Study}{32}{section.7.2}\protected@file@percent }
+\citation{walia2025leveraging}
+\citation{makungu2023fault}
+\citation{gremlin2023chaos}
+\citation{baboi2019dynamic}
+\citation{ibrahim2022scalable}
+\bibdata{references}
+\@writefile{toc}{\contentsline {section}{\numberline {7.3}Future Research Directions}{33}{section.7.3}\protected@file@percent }
+\bibcite{burns2016borg}{BGO{$^{+}$}16}
+\bibcite{baboi2019dynamic}{BIG19}
+\bibcite{evans2003domain}{Eva03}
+\bibcite{fowler2014microservices}{FL14}
+\bibcite{grafana2025open}{{Gra}25}
+\bibcite{gremlin2023chaos}{{Gre}23}
+\bibcite{ibrahim2022scalable}{IA22}
+\bibcite{kubernetes2025horizontal}{{Kub}25}
+\bibcite{locust2025load}{{Loc}25}
+\bibcite{makungu2023fault}{Mak23}
+\bibcite{nygard2018release}{Nyg18}
+\bibcite{polly2025dotnet}{{Pol}25}
+\@writefile{toc}{\contentsline {chapter}{Bibliography}{34}{chapter*.2}\protected@file@percent }
+\bibcite{prometheus2025monitoring}{{Pro}25}
+\bibcite{rabbitmq2025messaging}{{Rab}25}
+\bibcite{richardson2018microservices}{Ric18}
+\bibcite{shekhar2024microservices}{She24}
+\bibcite{stripe2025online}{{Str}25}
+\bibcite{walia2025leveraging}{Wal25}
+\gdef \@abspage@last{41}
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.bbl b/Anul 3/Semestrul 2/Licenta/Thesis/main.bbl
new file mode 100644
index 0000000..e7cd83b
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.bbl
@@ -0,0 +1,94 @@
+\newcommand{\etalchar}[1]{$^{#1}$}
+\begin{thebibliography}{BGO{\etalchar{+}}16}
+
+\bibitem[BGO{\etalchar{+}}16]{burns2016borg}
+Brendan Burns, Brian Grant, David Oppenheimer, Eric Brewer, and John Wilkes.
+\newblock Borg, omega, and kubernetes.
+\newblock {\em Communications of the ACM}, 59(5):50--57, 2016.
+
+\bibitem[BIG19]{baboi2019dynamic}
+Mihai Baboi, Adrian Iftene, and Daniela Gîfu.
+\newblock Dynamic microservices to create scalable and fault tolerance architecture.
+\newblock {\em Procedia Computer Science}, 159:1035--1044, 2019.
+
+\bibitem[Eva03]{evans2003domain}
+Eric Evans.
+\newblock {\em Domain-Driven Design: Tackling Complexity in the Heart of Software}.
+\newblock Addison-Wesley Professional, 2003.
+
+\bibitem[FL14]{fowler2014microservices}
+Martin Fowler and James Lewis.
+\newblock Microservices: a definition of this new architectural term, 2014.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[{Gra}25]{grafana2025open}
+{Grafana Labs}.
+\newblock Grafana: The open observability platform, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[{Gre}23]{gremlin2023chaos}
+{Gremlin}.
+\newblock Chaos engineering: The history, principles, and practice, 2023.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[IA22]{ibrahim2022scalable}
+Abdullahi Ibrahim and Mallo Ade.
+\newblock Scalable fault tolerance for microservices-based systems.
+\newblock In {\em 2022 IEEE International Conference on Big Data (Big Data)}, pages 6329--6331, 2022.
+
+\bibitem[{Kub}25]{kubernetes2025horizontal}
+{Kubernetes Documentation}.
+\newblock Horizontal pod autoscaler, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[{Loc}25]{locust2025load}
+{Locust Maintainers}.
+\newblock Locust: Open source load testing tool, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[Mak23]{makungu2023fault}
+Chisenga Makungu.
+\newblock Fault tolerance in distributed systems.
+\newblock {\em World Journal of Innovation and Modern Technology}, 7(2):105--108, dec 2023.
+
+\bibitem[Nyg18]{nygard2018release}
+Michael~T. Nygard.
+\newblock {\em Release It!: Design and Deploy Production-Ready Software}.
+\newblock Pragmatic Bookshelf, 2nd edition, 2018.
+
+\bibitem[{Pol}25]{polly2025dotnet}
+{Polly}.
+\newblock Polly: The .net resilience library, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[{Pro}25]{prometheus2025monitoring}
+{Prometheus Authors}.
+\newblock Prometheus - monitoring system \& time series database, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[{Rab}25]{rabbitmq2025messaging}
+{RabbitMQ}.
+\newblock Messaging with rabbitmq, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[Ric18]{richardson2018microservices}
+Chris Richardson.
+\newblock {\em Microservices Patterns: With examples in Java}.
+\newblock Manning Publications, 2018.
+
+\bibitem[She24]{shekhar2024microservices}
+Gaurav Shekhar.
+\newblock Microservices design patterns for cloud architecture.
+\newblock {\em International Journal of Computer Science and Engineering}, 11(9):1--7, sep 2024.
+
+\bibitem[{Str}25]{stripe2025online}
+{Stripe}.
+\newblock Stripe documentation: Online payments, 2025.
+\newblock Online; accessed 15 June 2025.
+
+\bibitem[Wal25]{walia2025leveraging}
+Anjali Walia.
+\newblock Leveraging microservices architecture: Key principles for scalable and fault-tolerant applications.
+\newblock {\em International Journal of Information Technology and Management Information Systems}, 16(1):455--468, feb 2025.
+
+\end{thebibliography}
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.blg b/Anul 3/Semestrul 2/Licenta/Thesis/main.blg
new file mode 100644
index 0000000..e5f236f
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.blg
@@ -0,0 +1,65 @@
+This is BibTeX, Version 0.99d (TeX Live 2025)
+Capacity: max_strings=200000, hash_size=200000, hash_prime=170003
+The top-level auxiliary file: main.aux
+The style file: alpha.bst
+Database file #1: references.bib
+Warning--entry type for "fowler2014microservices" isn't style-file defined
+--line 1 of file references.bib
+Warning--entry type for "kubernetes2025horizontal" isn't style-file defined
+--line 18 of file references.bib
+Warning--entry type for "rabbitmq2025messaging" isn't style-file defined
+--line 27 of file references.bib
+Warning--entry type for "polly2025dotnet" isn't style-file defined
+--line 36 of file references.bib
+Warning--entry type for "prometheus2025monitoring" isn't style-file defined
+--line 45 of file references.bib
+Warning--entry type for "grafana2025open" isn't style-file defined
+--line 54 of file references.bib
+Warning--entry type for "locust2025load" isn't style-file defined
+--line 63 of file references.bib
+Warning--entry type for "gremlin2023chaos" isn't style-file defined
+--line 89 of file references.bib
+Warning--entry type for "stripe2025online" isn't style-file defined
+--line 114 of file references.bib
+You've used 18 entries,
+ 2543 wiz_defined-function locations,
+ 644 strings with 6514 characters,
+and the built_in function-call counts, 5851 in all, are:
+= -- 567
+> -- 210
+< -- 15
++ -- 62
+- -- 62
+* -- 347
+:= -- 942
+add.period$ -- 54
+call.type$ -- 18
+change.case$ -- 96
+chr.to.int$ -- 18
+cite$ -- 18
+duplicate$ -- 247
+empty$ -- 493
+format.name$ -- 93
+if$ -- 1209
+int.to.chr$ -- 1
+int.to.str$ -- 0
+missing$ -- 12
+newline$ -- 94
+num.names$ -- 54
+pop$ -- 143
+preamble$ -- 1
+purify$ -- 116
+quote$ -- 0
+skip$ -- 212
+stack$ -- 0
+substring$ -- 275
+swap$ -- 30
+text.length$ -- 15
+text.prefix$ -- 14
+top$ -- 0
+type$ -- 132
+warning$ -- 0
+while$ -- 52
+width$ -- 23
+write$ -- 226
+(There were 9 warnings)
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.fdb_latexmk b/Anul 3/Semestrul 2/Licenta/Thesis/main.fdb_latexmk
new file mode 100644
index 0000000..563c69c
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.fdb_latexmk
@@ -0,0 +1,202 @@
+# Fdb version 4
+["bibtex main"] 1749992123.89534 "main.aux" "main.bbl" "main" 1749992125.97674 0
+ "./references.bib" 1749992121.6784 5375 2b645d704c8d18963be012a8150d74b0 ""
+ "/usr/local/texlive/2025/texmf-dist/bibtex/bst/base/alpha.bst" 1292289607 23907 a5f93555796fb564b924339521f10a7c ""
+ "main.aux" 1749992125.55841 16338 a59be3ec13ba38d0d0cb1a0c5a0f4396 "pdflatex"
+ (generated)
+ "main.bbl"
+ "main.blg"
+ (rewritten before read)
+["pdflatex"] 1749992124.0252 "/home/danielcujba/Desktop/Semestrul 2/Licenta/main.tex" "main.pdf" "main" 1749992125.97712 0
+ "/home/danielcujba/Desktop/Semestrul 2/Licenta/main.tex" 1749987874.44292 3981 a9023c09d5af29b1ea62ac08551655eb ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/enc/dvips/base/8r.enc" 1165713224 4850 80dc9bab7f31fb78a000ccfed0e27cab ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb7t.tfm" 1136768653 1616 371d1ee60c04b008c8fd760060cd34f1 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb8r.tfm" 1136768653 2532 9ad73cf4dd2173a847f2a5f5608e0b9a ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm" 1136768653 1804 7b5f73028f6509167f47ace9d69509ed ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8c.tfm" 1136768653 1348 0e8eb69b4437626c0f6c9bed4a4e373c ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8r.tfm" 1136768653 2796 d37c29814a6717720ee1a7c9a0b2c3b8 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri7t.tfm" 1136768653 1732 3671a0e54806deb8b706eb5e53aba0a5 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri8r.tfm" 1136768653 2720 70000d5e623e601132eab3cded5b819b ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplro7t.tfm" 1136768653 1892 fb1b87dfccb60bb53717003f5bea7526 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplro8r.tfm" 1136768653 2948 325b50af1ea2702f0a5da8c6a9d8c345 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1136768653 1512 f21f83efb36853c0b70002322c1ab3ad ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1136768653 1520 eccf95517727cb11801f4f1aee3a21b4 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1136768653 1292 296a67155bdbfc32aa9c636f21e91433 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1136768653 1300 b62933e007d01cfd073f79b963c01526 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1136768653 1292 21c1c5bfeaebccffdb478fd231a0997d ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1136768653 1116 933a60c408fc0a863a92debe84b2d294 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/tfm/public/mathpazo/fplmr.tfm" 1136768653 1032 7fa31d93ecd4cbdfac02c7a1ebc6facc ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb" 1248133631 32726 0a1aea6fcd6468ee2cf64d891f5c43c8 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplb8a.pfb" 1136849748 52406 dad2f72863a03727d5f536c64a69c452 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb" 1136849748 52665 661b1e6b26edb5f50dd491f8a701cb57 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb" 1136849748 50022 90249cba7e3e4e9845f80328d6f9bd13 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplb7t.vf" 1136768653 1380 798ef26de8f0a21f37c9b1147f4fe5d8 ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr7t.vf" 1136768653 1380 037725697594405988999f61172f52de ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr8c.vf" 1136768653 3504 f65f653e1ad318a9d01b4af15300683a ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplri7t.vf" 1136768653 1376 a5f9301e24d8e27c2286a3b415778d2d ""
+ "/usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplro7t.vf" 1136768653 1384 47cb8415ae561ff513ba357f3b1ff5fa ""
+ "/usr/local/texlive/2025/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/atbegshi/atbegshi.sty" 1575674566 24708 5584a51a7101caf7e6bbf1fc27d8f7b1 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/babel-english/english.ldf" 1496785618 7008 9ff5fdcc865b01beca2b0fe4a46231d4 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/babel/babel.sty" 1743197512 144118 8a0145ee10f36c9987d52d114dccd1b1 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-en.ini" 1661803479 3966 caeee5a9e5771d4446aa1ca9015ba1b2 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-english.tex" 1498512262 336 ed676b5e7dfd862bc78d634f6a973f37 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/babel/txtbabel.def" 1741723514 6833 ef397c732d8c72f527b197aa1623476d ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1576625341 40635 c40361e206be584d448876bba8a64a3b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/bitset/bitset.sty" 1576016050 33961 6b5c75130e435b2bfdb9f480a09a39f9 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1576625223 8371 9d55b8bd010bc717624922fb3477d92e ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/iftex/iftex.sty" 1734129479 7984 7dbb9280f03c0a315425f1b4f35d43ee ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1575499628 8356 7bbb2c2373aa810be568c29e333da8ed ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/intcalc/intcalc.sty" 1576625065 31769 002a487f55041f8e805cfbf6385ffd97 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1576878844 5412 d5a2436094cd7be85769db90f29250a6 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1701727651 17865 1a9bd36b4f98178fa551aca822290953 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1576015897 19007 15924f7228aca6c6d184b115f4baa231 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1593379760 20089 80423eac55aa175305d35b49e04fe23b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex" 1673816307 1016 1c2b89187d12a2768764b83b4945667c ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex" 1601326656 43820 1fef971b75380574ab35a0d37fd92608 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex" 1601326656 19324 f4e4c6403dd0f1605fd20ed22fa79dea ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex" 1601326656 6038 ccb406740cc3f03bbfb58ad504fe8c27 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex" 1673816307 6911 f6d4cf5a3fef5cc879d668b810e82868 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex" 1601326656 4883 42daaf41e27c3735286e23e48d2d7af9 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex" 1601326656 2544 8c06d2a7f0f469616ac9e13db6d2f842 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex" 1601326656 44195 5e390c414de027626ca5e2df888fa68d ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex" 1601326656 17311 2ef6b2e29e2fc6a2fc8d6d652176e257 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex" 1601326656 21302 788a79944eb22192a4929e46963a3067 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex" 1673816307 9691 3d42d89522f4650c2f3dc616ca2b925e ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex" 1601326656 33335 dd1fa4814d4e51f18be97d88bf0da60c ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex" 1601326656 2965 4c2b1f4e0826925746439038172e5d6f ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex" 1601326656 5196 2cc249e0ee7e03da5f5f6589257b1e5b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex" 1673816307 20821 7579108c1e9363e61a0b1584778804aa ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex" 1601326656 35249 abd4adf948f960299a4b3d27c5dddf46 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex" 1673816307 22012 81b34a0aa8fa1a6158cc6220b00e4f10 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex" 1601326656 8893 e851de2175338fdf7c17f3e091d94618 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybackgrounds.code.tex" 1601326656 4572 4a19637ef65ce88ad2f2d5064b69541d ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfit.code.tex" 1673816307 3626 2d87dc681257fa32d07a8b3934b10f88 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypositioning.code.tex" 1601326656 3937 3f208572dd82c71103831da976d74f1a ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.geometric.code.tex" 1601326656 339 be0fe46d92a80e3385dd6a83511a46f2 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex" 1608933718 11518 738408f795261b70ce8dd47459171309 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex" 1673816307 186782 af500404a9edec4d362912fe762ded92 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex" 1601326656 58801 1e750fb0692eb99aaac45698bbec96b1 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex" 1601326656 32995 ac577023e12c0e4bd8aa420b2e852d1a ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex" 1673816307 161011 76ab54df0aa1a9d3b27a94864771d38d ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfint.code.tex" 1557692582 3063 8c415c68a0f3394e45cfeca0b65f6ee6 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex" 1673816307 949 cea70942e7b7eddabfb3186befada2e6 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex" 1673816307 13270 2e54f2ce7622437bf37e013d399743e3 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex" 1673816307 104717 9b2393fbf004a0ce7fa688dbce423848 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex" 1601326656 10165 cec5fa73d49da442e56efc2d605ef154 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex" 1601326656 28178 41c17713108e0795aac6fef3d275fbca ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex" 1673816307 9649 85779d3d8d573bfd2cd4137ba8202e60 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex" 1601326656 3865 ac538ab80c5cf82b345016e474786549 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex" 1557692582 3177 27d85c44fbfe09ff3b2cf2879e3ea434 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex" 1621110968 11024 0179538121bc2dba172013a3ef89519f ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex" 1673816307 7890 0a86dbf4edfd88d022e0d889ec78cc03 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex" 1601326656 3379 781797a101f647bab82741a99944a229 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex" 1601326656 92405 f515f31275db273f97b9d8f52e1b0736 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex" 1673816307 37466 97b0a1ba732e306a1a2034f5a73e239f ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex" 1601326656 8471 c2883569d03f69e8e1cabfef4999cfd7 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex" 1673816307 21211 1e73ec76bd73964d84197cc3d2685b01 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex" 1601326656 16121 346f9013d34804439f7436ff6786cef7 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex" 1673816307 44792 271e2e1934f34c759f4dedb1e14a5015 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/pgf.revision.tex" 1673816307 114 e6d443369d0673933b38834bf99e422d ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg" 1601326656 926 2963ea0dcf6cc6c0a770b69ec46a477b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def" 1673816307 5542 32f75a31ea6c3a7e1148cd6d5e93dbb7 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def" 1673816307 12612 7774ba67bfd72e593c4436c2de6201e3 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex" 1673816307 61351 bc5f86e0355834391e736e97a61abced ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex" 1601326656 1896 b8e0ca0ac371d74c0ca05583f6313c91 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex" 1601326656 7778 53c8b5623d80238f6a20aa1df1868e63 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex" 1673816307 24033 d8893a1ec4d1bfa101b172754743d340 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex" 1673816307 39784 414c54e866ebab4b801e2ad81d9b21d8 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex" 1673816307 37433 940bc6d409f1ffd298adfdcaf125dd86 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex" 1673816307 4385 510565c2f07998c8a0e14f0ec07ff23c ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex" 1673816307 29239 22e8c7516012992a49873eff0d868fed ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def" 1673816307 6950 8524a062d82b7afdc4a88a57cb377784 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/stringenc/stringenc.sty" 1575152242 21514 b7557edcee22835ef6b03ede1802dad4 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1576624663 7008 f92eaa0a3872ed622bbf538217cd2ab7 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/atveryend/atveryend.sty" 1728505250 1695 be6b4d13b33db697fd3fd30b24716c1a ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/base/atbegshi-ltx.sty" 1738182759 2963 d8ec5a1b4e0a106c5c737900202763e4 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/base/atveryend-ltx.sty" 1738182759 2378 14b657ee5031da98cf91648f19642694 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/base/ifthen.sty" 1738182759 5525 9dced5929f36b19fa837947f5175b331 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/base/inputenc.sty" 1738182759 5048 0270515b828149155424600fd2d58ac5 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/base/report.cls" 1738182759 23203 7ac64169eac711b8259b91f4833984f3 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/base/size12.clo" 1738182759 8449 ffe4ba2166a344827c3a832d1d5e0a91 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1739306980 46850 d87daedc2abdc653769a6f1067849fe0 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty" 1739048179 31715 19e60610b63819fe670dfa1cd84a4e94 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1459978653 1213 620bba36b25224fa9b7e1ccb4ecb76fd ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics-def/pdftex.def" 1713382759 19440 9da9dcbb27470349a580fca7372d454b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphics.sty" 1730496337 18363 dee506cb8d56825d8a4d020f5d5f8704 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphicx.sty" 1717359999 8010 6f2ad8c2b2ffbd607af6475441c7b5e4 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/keyval.sty" 1717359999 2671 70891d50dac933918b827d326687c6e8 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/mathcolor.ltx" 1667332637 2885 9c645d672ae17285bba324998918efd8 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/trig.sty" 1717359999 4023 2c9f39712cf7b43d3eb93a8bbd5c8f67 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/hycolor/hycolor.sty" 1580250785 17914 4c28a13fc3d975e6e81c9bea1d697276 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hpdftex.def" 1730838014 48154 82da9991b9f0390b3a9d3af6c8618af4 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hyperref.sty" 1730838014 222112 c22dbd2288f89f7ba942ac22f7d00f11 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/nameref.sty" 1705871765 11026 182c63f139a71afd30a28e5f1ed2cd1c ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/pd1enc.def" 1730838014 14249 ff700eb13ce975a424b2dd99b1a83044 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/puenc.def" 1730838014 117112 7533bff456301d32e6d6356fad15f543 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1655478651 22555 6d8e155cfef6d82c3d5c742fea7c992e ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1665067230 13815 760b0c02f691ea230f5359c4e1de23a7 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1716410060 29785 9f93ab201fe5dd053afcc6c1bcf7d266 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty" 1601326656 1090 bae35ef70b3168089ef166db3e66f5b2 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty" 1673816307 373 00b204b1d7d095b892ad31a7494b0373 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty" 1601326656 21013 f4ff83d25bb56552493b030f27c075ae ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty" 1601326656 989 c49c8ae06d96f8b15869da7428047b1e ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty" 1601326656 339 c2e180022e3afdb99c7d0ea5ce469b7d ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/math/pgfmath.sty" 1601326656 306 c56a323ca5bf9242f54474ced10fca71 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty" 1601326656 443 8c872229db56122037e86bcda49e14f3 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgffor.sty" 1601326656 348 ee405e64380c11319f0e249fed57e6c5 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty" 1601326656 274 5ae372b7df79135d240456a1c6f2cf9a ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty" 1601326656 325 f9f16d12354225b7dd52a3321f085955 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ot1ppl.fd" 1137110629 961 06b773644d960aac68add40fcb596208 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/palatino.sty" 1586716065 871 125278a9cae6071e87c6114370fad4cf ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ts1ppl.fd" 1137110629 619 35f1cf70bf09b6e2d22ee0902cfb1a8b ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/refcount/refcount.sty" 1576624809 9878 9e94e8fa600d95f9c7731bb21dfb67a4 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1657483315 9714 ba3194bd52c8499b3f1e3eb91d409670 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/setspace/setspace.sty" 1670275497 22490 8cac309b79a4c53a4ffce4b1b07aead0 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/tocbibind/tocbibind.sty" 1287012853 8927 46f54e33fc9cef24f78ab3bc811cb63f ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/url/url.sty" 1388531844 12796 8edb7d69a20b857904dd0ea757c14ec9 ""
+ "/usr/local/texlive/2025/texmf-dist/tex/latex/xcolor/xcolor.sty" 1727642399 55384 b454dec21c2d9f45ec0b793f0995b992 ""
+ "/usr/local/texlive/2025/texmf-dist/web2c/texmf.cnf" 1739380943 42148 61becc7c670cd061bb319c643c27fdd4 ""
+ "/usr/local/texlive/2025/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1743252366 5501089 f2ffe622267f7d8bfaba0244ab87ba6f ""
+ "/usr/local/texlive/2025/texmf-var/web2c/pdftex/pdflatex.fmt" 1743252446 3345751 e6da723a315d587e30201ca3058e16a6 ""
+ "/usr/local/texlive/2025/texmf.cnf" 1743252360.64443 455 5b996dcaa0eb4ef14a83b026bc0a008c ""
+ "chapters/chapter1_introduction.tex" 1749990643.36252 9621 dc278ac41e9424a1ae8d419462e795c9 ""
+ "chapters/chapter2.tex" 1749991009.10717 8889 978d3c817c8f63314b140c07575a50cd ""
+ "chapters/chapter3.tex" 1749991142.87949 7190 631b93a0c662a7311216195dd5179dc8 ""
+ "chapters/chapter4.tex" 1749991341.07602 8718 56131644bc963803c0ccb83e1d78c272 ""
+ "chapters/chapter5.tex" 1749991587.58473 24346 f6b0ef60675b8cc641b7eb94b3f54f44 ""
+ "chapters/chapter6.tex" 1749991638.49689 5616 d32dbc681de13c04063c657a399ff165 ""
+ "chapters/chapter6_conclusions.tex" 1749991834.63349 5542 a9fab0bd6d1b56692e8a001c66b3bc24 ""
+ "figures/checkout.png" 1749985543.54901 53337 068989ac3372d17f9ff8d770147064a6 ""
+ "figures/cpu_usage.png" 1749983967.56335 32305 91fd979bffb037a5c0b5f52dc94acf1e ""
+ "figures/edit.png" 1749985493.72489 42695 527e5a2578aedcaa2e53fd7d578b836e ""
+ "figures/inventory.png" 1749985474.68085 87570 d731333966a36a6ef1139c2856ce96b7 ""
+ "figures/memory_usage.png" 1749984003.31671 38571 44a5083021c7b3b7a5ed1815aabafe4e ""
+ "figures/number_of_users.png" 1749983923.41636 22524 c1ad7c292d04f066cfa39502ef782627 ""
+ "figures/products.png" 1749985524.46896 366175 1b250ce631453b016c505aeeb44188a3 ""
+ "figures/response_time.png" 1749983897.7398 34810 32e8c5c67c6f8ed78510907d23010c2d ""
+ "figures/rps.png" 1749983870.89523 50694 89c35875bdb48a9f26ef5ae09355732f ""
+ "figures/stripe.png" 1749985442.42478 63999 ecbec0047849e5c429ded4be2143162b ""
+ "main.aux" 1749992125.55841 16338 a59be3ec13ba38d0d0cb1a0c5a0f4396 "pdflatex"
+ "main.bbl" 1749992124.01041 3432 125a40f75fa26618b16f8d83e20c4d7c "bibtex main"
+ "main.out" 1749992125.55841 10798 e8005b1a9fd61a1f10cce79621d3f105 "pdflatex"
+ "main.tex" 1749987874.44292 3981 a9023c09d5af29b1ea62ac08551655eb ""
+ "main.toc" 1749992125.55841 4194 e15facc87981a380ac81243fca6dd3f0 "pdflatex"
+ "style.sty" 1613827656 3009 254cf1aa1f7ee43df8efd2c12a433706 ""
+ (generated)
+ "main.aux"
+ "main.log"
+ "main.out"
+ "main.pdf"
+ "main.toc"
+ (rewritten before read)
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.fls b/Anul 3/Semestrul 2/Licenta/Thesis/main.fls
new file mode 100644
index 0000000..49fc270
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.fls
@@ -0,0 +1,420 @@
+PWD /home/danielcujba/Desktop/Semestrul 2/Licenta
+INPUT /usr/local/texlive/2025/texmf.cnf
+INPUT /usr/local/texlive/2025/texmf-dist/web2c/texmf.cnf
+INPUT /usr/local/texlive/2025/texmf-var/web2c/pdftex/pdflatex.fmt
+INPUT /home/danielcujba/Desktop/Semestrul 2/Licenta/main.tex
+OUTPUT main.log
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/report.cls
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/report.cls
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/size12.clo
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/size12.clo
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/size12.clo
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/map/fontname/texfonts.map
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr12.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/pgf.revision.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/pgf.revision.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphicx.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/keyval.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphics.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/trig.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-def/pdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/xcolor/xcolor.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/color.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/mathcolor.ltx
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/mathcolor.ltx
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/graphics/mathcolor.ltx
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfint.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgffor.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/pgf/math/pgfmath.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarytopaths.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypositioning.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypositioning.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.geometric.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshapes.geometric.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibraryshapes.geometric.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows.meta.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybackgrounds.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarybackgrounds.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfit.code.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfit.code.tex
+INPUT ./style.sty
+INPUT style.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/geometry/geometry.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/iftex/ifvtex.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/iftex/iftex.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/palatino.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/palatino.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/setspace/setspace.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/setspace/setspace.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/inputenc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/url/url.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/tocbibind/tocbibind.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/tocbibind/tocbibind.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hyperref.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pdfescape/pdfescape.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hycolor/hycolor.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/nameref.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/refcount/refcount.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/stringenc/stringenc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/stringenc/stringenc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/pd1enc.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/intcalc/intcalc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/puenc.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/bitset/bitset.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/atbegshi/atbegshi.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/atbegshi-ltx.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hpdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/atveryend/atveryend.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/atveryend-ltx.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/base/ifthen.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/babel.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/txtbabel.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel-english/english.ldf
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-english.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-english.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-english.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-en.ini
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+INPUT ./main.aux
+INPUT ./main.aux
+INPUT main.aux
+OUTPUT main.aux
+INPUT /usr/local/texlive/2025/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/local/texlive/2025/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/local/texlive/2025/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+INPUT ./main.out
+INPUT ./main.out
+INPUT main.out
+INPUT main.out
+OUTPUT main.pdf
+INPUT ./main.out
+INPUT ./main.out
+OUTPUT main.out
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplb7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb8r.tfm
+INPUT /usr/local/texlive/2025/texmf-var/fonts/map/pdftex/updmap/pdftex.map
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/enc/dvips/base/8r.enc
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplb7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplri7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr17.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr17.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr17.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplb7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplro7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8r.tfm
+INPUT ./main.toc
+INPUT ./main.toc
+INPUT main.toc
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr8.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmr6.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplb7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb8r.tfm
+OUTPUT main.toc
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplro7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplro8r.tfm
+INPUT ./chapters/chapter1_introduction.tex
+INPUT ./chapters/chapter1_introduction.tex
+INPUT ./chapters/chapter1_introduction.tex
+INPUT ./chapters/chapter1_introduction.tex
+INPUT chapters/chapter1_introduction.tex
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ts1ppl.fd
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ts1ppl.fd
+INPUT /usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ts1ppl.fd
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8c.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr8c.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/public/mathpazo/fplmr.tfm
+INPUT ./chapters/chapter2.tex
+INPUT ./chapters/chapter2.tex
+INPUT ./chapters/chapter2.tex
+INPUT ./chapters/chapter2.tex
+INPUT chapters/chapter2.tex
+INPUT ./chapters/chapter3.tex
+INPUT ./chapters/chapter3.tex
+INPUT ./chapters/chapter3.tex
+INPUT ./chapters/chapter3.tex
+INPUT chapters/chapter3.tex
+INPUT ./chapters/chapter4.tex
+INPUT ./chapters/chapter4.tex
+INPUT ./chapters/chapter4.tex
+INPUT ./chapters/chapter4.tex
+INPUT chapters/chapter4.tex
+INPUT ./chapters/chapter5.tex
+INPUT ./chapters/chapter5.tex
+INPUT ./chapters/chapter5.tex
+INPUT ./chapters/chapter5.tex
+INPUT chapters/chapter5.tex
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplri7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplr7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr8r.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplr7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplb7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplb8r.tfm
+INPUT ./figures/products.png
+INPUT ./figures/products.png
+INPUT ./figures/products.png
+INPUT ./figures/products.png
+INPUT ./figures/products.png
+INPUT ./figures/checkout.png
+INPUT ./figures/checkout.png
+INPUT ./figures/checkout.png
+INPUT ./figures/checkout.png
+INPUT ./figures/checkout.png
+INPUT ./figures/stripe.png
+INPUT ./figures/stripe.png
+INPUT ./figures/stripe.png
+INPUT ./figures/stripe.png
+INPUT ./figures/stripe.png
+INPUT ./figures/inventory.png
+INPUT ./figures/inventory.png
+INPUT ./figures/inventory.png
+INPUT ./figures/inventory.png
+INPUT ./figures/inventory.png
+INPUT ./figures/edit.png
+INPUT ./figures/edit.png
+INPUT ./figures/edit.png
+INPUT ./figures/edit.png
+INPUT ./figures/edit.png
+INPUT ./chapters/chapter6.tex
+INPUT ./chapters/chapter6.tex
+INPUT ./chapters/chapter6.tex
+INPUT ./chapters/chapter6.tex
+INPUT chapters/chapter6.tex
+INPUT ./figures/rps.png
+INPUT ./figures/rps.png
+INPUT ./figures/rps.png
+INPUT ./figures/rps.png
+INPUT ./figures/rps.png
+INPUT ./figures/response_time.png
+INPUT ./figures/response_time.png
+INPUT ./figures/response_time.png
+INPUT ./figures/response_time.png
+INPUT ./figures/response_time.png
+INPUT ./figures/number_of_users.png
+INPUT ./figures/number_of_users.png
+INPUT ./figures/number_of_users.png
+INPUT ./figures/number_of_users.png
+INPUT ./figures/number_of_users.png
+INPUT ./figures/cpu_usage.png
+INPUT ./figures/cpu_usage.png
+INPUT ./figures/cpu_usage.png
+INPUT ./figures/cpu_usage.png
+INPUT ./figures/cpu_usage.png
+INPUT ./figures/memory_usage.png
+INPUT ./figures/memory_usage.png
+INPUT ./figures/memory_usage.png
+INPUT ./figures/memory_usage.png
+INPUT ./figures/memory_usage.png
+INPUT ./chapters/chapter6_conclusions.tex
+INPUT ./chapters/chapter6_conclusions.tex
+INPUT ./chapters/chapter6_conclusions.tex
+INPUT ./chapters/chapter6_conclusions.tex
+INPUT chapters/chapter6_conclusions.tex
+INPUT ./main.bbl
+INPUT ./main.bbl
+INPUT main.bbl
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri7t.tfm
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/vf/adobe/palatino/pplri7t.vf
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/tfm/adobe/palatino/pplri8r.tfm
+INPUT main.aux
+INPUT ./main.out
+INPUT ./main.out
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/type1/public/amsfonts/cm/cmr8.pfb
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplb8a.pfb
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplr8a.pfb
+INPUT /usr/local/texlive/2025/texmf-dist/fonts/type1/urw/palatino/uplri8a.pfb
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.pdf b/Anul 3/Semestrul 2/Licenta/Thesis/main.pdf
new file mode 100644
index 0000000..dc50970
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/main.pdf differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.synctex.gz b/Anul 3/Semestrul 2/Licenta/Thesis/main.synctex.gz
new file mode 100644
index 0000000..33d1500
Binary files /dev/null and b/Anul 3/Semestrul 2/Licenta/Thesis/main.synctex.gz differ
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.tex b/Anul 3/Semestrul 2/Licenta/Thesis/main.tex
new file mode 100644
index 0000000..ee8bb14
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.tex
@@ -0,0 +1,89 @@
+%\documentclass[12pt]{scrreprt}
+\documentclass[12pt]{report}
+
+\usepackage{tikz}
+\usepackage{tikz}
+\usetikzlibrary{
+ positioning, % For relative positioning of nodes
+ shapes.geometric, % For cylinder shape
+ arrows.meta, % For arrow tips
+ backgrounds, % For layers
+ fit % To fit a node around other nodes
+}
+
+% language may be romanian or english (default is english)
+% type may be bachelor or master (default is bachelor)
+\usepackage[language=english, type=bachelor]{style}
+
+%\geometry{a4paper,top=2.5cm,left=3cm,right=2.5cm,bottom=2.5cm}
+%in style
+%controlling the appearance of your headers and footers
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\lhead{}
+\chead{}
+\renewcommand{\headrulewidth}{0.2pt}
+\renewcommand{\footrulewidth}{0.2pt}
+
+\begin{document}
+
+\specialization{COMPUTER SCIENCE IN ENGLISH}
+\title{An Empirical Validation of Scalability and Fault Tolerance Patterns in a.NET Microservices Architecture on Kubernetes}
+\author{Cujba Daniel}
+\supervisor{Assoc. Prof. Rares Florin Boian Ph.D.}
+
+\maketitle
+\newpage
+\setbool{@eng}{false}
+
+\specialization{INFORMATICA IN LIMBA ENGLEZA}
+\title{O validare empirică a modelelor de scalabilitate și toleranță la erori într-o arhitectură de microservicii .NET pe Kubernetes}
+\author{Cujba Daniel}
+\supervisor{Conf. Dr. Boian Rares}
+\maketitle
+\setbool{@eng}{true}
+\newpage
+\pagenumbering{roman}
+
+\cleardoublepage
+ABSTRACT
+\vspace{0.5cm}
+\hrule
+\vspace{0.5cm}
+%\cleardoublepage
+
+The imperative for modern software systems to be both highly scalable and resilient to failure has driven the widespread adoption of microservice architectures. However, the theoretical benefits of this architectural style are not inherently guaranteed and depend on the deliberate application and validation of specific design patterns and technologies. This thesis addresses the gap between theoretical principles and practical implementation by presenting the design, end-to-end development, and empirical validation of a cloud-native e-commerce application. The system is architected using.NET microservices, containerized and orchestrated with Kubernetes, and employs RabbitMQ for asynchronous, decoupled communication. Application-level fault tolerance is implemented through the Polly library, integrating Retry and Circuit Breaker patterns to enhance inter-service communication robustness. To validate the architecture, a sustained 30-minute load test was conducted on a key service, demonstrating high performance with a stable throughput of approximately 124 requests per second at a median latency of 35ms, with zero failures. Crucially, the results confirmed that the service becomes CPU-bound under load, a behavior that correctly triggers the configured Kubernetes Horizontal Pod Autoscaler (HPA) policy. This work's primary contribution is an empirically validated architectural blueprint, demonstrating the effective integration of specific technologies and patterns to build verifiably scalable and fault-tolerant.NET microservice applications.
+
+
+\newpage
+DISCLAIMER
+\vspace{0.5cm}
+\hrule
+\vspace{0.5cm}
+
+During the preparation of this work the author used Google Gemini and DeepSeek in order to improve wording, rephrase sentences, check for spelling, and assist with the generation of LaTeX code. After using these tools/services, the author reviewed and edited the content as needed and takes full responsibility for the content of the thesis.
+
+
+\tableofcontents
+
+
+\newpage
+\pagenumbering{arabic}
+
+\input{chapters/chapter1_introduction}
+%\addcontentsline{toc}{chapter}{Introducere}
+%\addcontentsline{toc}{chapter}{Introduction}
+
+\input{chapters/chapter2}
+\input{chapters/chapter3}
+\input{chapters/chapter4}
+\input{chapters/chapter5}
+\input{chapters/chapter6}
+
+\input{chapters/chapter6_conclusions}
+%\addcontentsline{toc}{chapter}{Concluzii}
+%\addcontentsline{toc}{chapter}{Conclusions}
+
+\bibliography{references}
+
+\end{document}
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/main.toc b/Anul 3/Semestrul 2/Licenta/Thesis/main.toc
new file mode 100644
index 0000000..5624427
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/main.toc
@@ -0,0 +1,42 @@
+\babel@toc {english}{}\relax
+\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}%
+\contentsline {section}{\numberline {1.1}Background: The Ascendancy of Microservices in Distributed System Design}{1}{section.1.1}%
+\contentsline {section}{\numberline {1.2}Problem Statement: The Intrinsic Scalability and Fault Tolerance Imperatives in Microservice Ecosystems}{2}{section.1.2}%
+\contentsline {section}{\numberline {1.3}Research Objectives and Guiding Questions}{2}{section.1.3}%
+\contentsline {section}{\numberline {1.4}Contributions of the Thesis}{3}{section.1.4}%
+\contentsline {section}{\numberline {1.5}Thesis Structure}{4}{section.1.5}%
+\contentsline {chapter}{\numberline {2}Theoretical Foundations of Microservices for Resilient and Scalable Systems}{6}{chapter.2}%
+\contentsline {section}{\numberline {2.1}Defining Microservice Architecture: A Paradigm for Distributed Functionality}{6}{section.2.1}%
+\contentsline {section}{\numberline {2.2}Core Characteristics Enabling (and Complicating) Scalability and Fault Tolerance}{7}{section.2.2}%
+\contentsline {section}{\numberline {2.3}Advantages and Disadvantages in Distributed Contexts}{8}{section.2.3}%
+\contentsline {chapter}{\numberline {3}Design Patterns and Strategies for Scalability in Microservices}{10}{chapter.3}%
+\contentsline {section}{\numberline {3.1}Vertical Scaling}{10}{section.3.1}%
+\contentsline {section}{\numberline {3.2}Horizontal Scaling}{10}{section.3.2}%
+\contentsline {section}{\numberline {3.3}Load Balancing Techniques and the Pivotal Role of API Gateways}{11}{section.3.3}%
+\contentsline {section}{\numberline {3.4}Asynchronous Processing and Message Queues for Decoupled Scaling}{12}{section.3.4}%
+\contentsline {chapter}{\numberline {4}Design Patterns and Strategies for Fault Tolerance in Microservices}{14}{chapter.4}%
+\contentsline {section}{\numberline {4.1}The Circuit Breaker Pattern: Preventing Cascading Failures}{15}{section.4.1}%
+\contentsline {section}{\numberline {4.2}Retry Mechanisms}{16}{section.4.2}%
+\contentsline {section}{\numberline {4.3}The Bulkhead Pattern: Isolating Resources for Fault Containment}{16}{section.4.3}%
+\contentsline {chapter}{\numberline {5}Building applications with Microservices Architecture in .NET}{18}{chapter.5}%
+\contentsline {section}{\numberline {5.1}Architectural Overview}{18}{section.5.1}%
+\contentsline {section}{\numberline {5.2}Implementing Scalability}{20}{section.5.2}%
+\contentsline {subsection}{\numberline {5.2.1}Service-Level Scalability with Kubernetes}{20}{subsection.5.2.1}%
+\contentsline {subsection}{\numberline {5.2.2}Asynchronous Communication with RabbitMQ}{20}{subsection.5.2.2}%
+\contentsline {section}{\numberline {5.3}Resilient Communication with Polly}{21}{section.5.3}%
+\contentsline {subsection}{\numberline {5.3.1}The Retry Pattern}{21}{subsection.5.3.1}%
+\contentsline {subsection}{\numberline {5.3.2}The Circuit Breaker Pattern}{22}{subsection.5.3.2}%
+\contentsline {subsection}{\numberline {5.3.3}Fault Tolerance with Kubernetes}{22}{subsection.5.3.3}%
+\contentsline {subsection}{\numberline {5.3.4}Message Durability with RabbitMQ}{22}{subsection.5.3.4}%
+\contentsline {section}{\numberline {5.4}Observability: Metrics and Monitoring}{22}{section.5.4}%
+\contentsline {section}{\numberline {5.5}Application User Interface and Workflow}{23}{section.5.5}%
+\contentsline {subsection}{\numberline {5.5.1}Customer-Facing Storefront}{23}{subsection.5.5.1}%
+\contentsline {subsection}{\numberline {5.5.2}Administrative Interface}{26}{subsection.5.5.2}%
+\contentsline {chapter}{\numberline {6}Results and Discussion}{28}{chapter.6}%
+\contentsline {subsection}{\numberline {6.0.1}Results}{28}{subsection.6.0.1}%
+\contentsline {subsection}{\numberline {6.0.2}Discussion}{29}{subsection.6.0.2}%
+\contentsline {chapter}{\numberline {7}Conclusion and Future Research Directions}{31}{chapter.7}%
+\contentsline {section}{\numberline {7.1}Summary of Key Findings and Contributions}{31}{section.7.1}%
+\contentsline {section}{\numberline {7.2}Limitations of the Study}{32}{section.7.2}%
+\contentsline {section}{\numberline {7.3}Future Research Directions}{33}{section.7.3}%
+\contentsline {chapter}{Bibliography}{34}{chapter*.2}%
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/references.bib b/Anul 3/Semestrul 2/Licenta/Thesis/references.bib
new file mode 100644
index 0000000..503a5f6
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/references.bib
@@ -0,0 +1,176 @@
+@online{fowler2014microservices,
+ author = {Fowler, Martin and Lewis, James},
+ title = {Microservices: a definition of this new architectural term},
+ year = {2014},
+ url = {https://martinfowler.com/articles/microservices.html},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@book{nygard2018release,
+ author = {Nygard, Michael T.},
+ title = {Release It!: Design and Deploy Production-Ready Software},
+ year = {2018},
+ publisher = {Pragmatic Bookshelf},
+ edition = {2nd}
+}
+
+@online{kubernetes2025horizontal,
+ author = {{Kubernetes Documentation}},
+ title = {Horizontal Pod Autoscaler},
+ year = {2025},
+ url = {https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@online{rabbitmq2025messaging,
+ author = {{RabbitMQ}},
+ title = {Messaging with RabbitMQ},
+ year = {2025},
+ url = {https://www.rabbitmq.com/},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@online{polly2025dotnet,
+ author = {{Polly}},
+ title = {Polly: The .NET resilience library},
+ year = {2025},
+ url = {https://www.pollydocs.org/},
+ urldate = {2025-03-29},
+ note = {Online; accessed 15 June 2025}
+}
+
+@online{prometheus2025monitoring,
+ author = {{Prometheus Authors}},
+ title = {Prometheus - Monitoring system \& time series database},
+ year = {2025},
+ url = {https://prometheus.io/},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@online{grafana2025open,
+ author = {{Grafana Labs}},
+ title = {Grafana: The open observability platform},
+ year = {2025},
+ url = {https://grafana.com/},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@online{locust2025load,
+ author = {{Locust Maintainers}},
+ title = {Locust: Open source load testing tool},
+ year = {2025},
+ url = {https://locust.io/},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@book{richardson2018microservices,
+ author = {Richardson, Chris},
+ title = {Microservices Patterns: With examples in Java},
+ year = {2018},
+ publisher = {Manning Publications}
+}
+
+@article{burns2016borg,
+ author = {Burns, Brendan and Grant, Brian and Oppenheimer, David and Brewer, Eric and Wilkes, John},
+ title = {Borg, Omega, and Kubernetes},
+ journal = {Communications of the ACM},
+ year = {2016},
+ volume = {59},
+ number = {5},
+ pages = {50--57}
+}
+
+@online{gremlin2023chaos,
+ author = {{Gremlin}},
+ title = {Chaos Engineering: The History, Principles, and Practice},
+ year = {2023},
+ url = {https://www.gremlin.com/community/tutorials/chaos-engineering-the-history-principles-and-practice},
+ urldate = {2025-03-29},
+ note = {Online; accessed 15 June 2025}
+}
+
+@online{microsoft2025net,
+ author = {{Microsoft}},
+ title = {.NET Microservices: Architecture for Containerized Applications},
+ year = {2025},
+ url = {https://learn.microsoft.com/en-us/dotnet/architecture/microservices/},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@book{evans2003domain,
+ author = {Evans, Eric},
+ title = {Domain-Driven Design: Tackling Complexity in the Heart of Software},
+ year = {2003},
+ publisher = {Addison-Wesley Professional}
+}
+
+@online{stripe2025online,
+ author = {{Stripe}},
+ title = {Stripe Documentation: Online Payments},
+ year = {2025},
+ url = {https://stripe.com/docs},
+ urldate = {2025-06-15},
+ note = {Online; accessed 15 June 2025}
+}
+
+@article{shekhar2024microservices,
+ author = {Shekhar, Gaurav},
+ title = {Microservices Design Patterns for Cloud Architecture},
+ journal = {International Journal of Computer Science and Engineering},
+ year = {2024},
+ volume = {11},
+ number = {9},
+ pages = {1--7},
+ month = {sep},
+ doi = {10.14445/23488387/ijcse-v11i9p101}
+}
+
+@article{walia2025leveraging,
+ author = {Walia, Anjali},
+ title = {Leveraging microservices architecture: Key principles for scalable and fault-tolerant applications},
+ journal = {International Journal of Information Technology and Management Information Systems},
+ year = {2025},
+ volume = {16},
+ number = {1},
+ pages = {455--468},
+ month = {feb},
+ doi = {10.34218/ijitmis_16_01_034}
+}
+
+@article{makungu2023fault,
+ author = {Makungu, Chisenga},
+ title = {Fault Tolerance in Distributed Systems},
+ journal = {World Journal of Innovation and Modern Technology},
+ year = {2023},
+ volume = {7},
+ number = {2},
+ pages = {105--108},
+ month = {dec},
+ doi = {10.56201/wjimt.v7.no2.2023.pg105.108}
+}
+
+@article{baboi2019dynamic,
+ author = {Baboi, Mihai and Iftene, Adrian and Gîfu, Daniela},
+ title = {Dynamic Microservices to Create Scalable and Fault Tolerance Architecture},
+ journal = {Procedia Computer Science},
+ year = {2019},
+ volume = {159},
+ pages = {1035--1044},
+ doi = {10.1016/j.procs.2019.09.271}
+}
+
+@inproceedings{ibrahim2022scalable,
+ author = {Ibrahim, Abdullahi and Ade, Mallo},
+ title = {Scalable Fault Tolerance for Microservices-Based Systems},
+ booktitle = {2022 IEEE International Conference on Big Data (Big Data)},
+ year = {2022},
+ pages = {6329-6331},
+ doi = {10.1109/BigData55660.2022.10021021}
+}
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/Licenta/Thesis/style.sty b/Anul 3/Semestrul 2/Licenta/Thesis/style.sty
new file mode 100644
index 0000000..7a246a3
--- /dev/null
+++ b/Anul 3/Semestrul 2/Licenta/Thesis/style.sty
@@ -0,0 +1,108 @@
+% used packages
+\usepackage{geometry} % page settings
+\usepackage{palatino} % font
+\usepackage[onehalfspacing]{setspace} % 1.5 distance between lines
+\usepackage[utf8]{inputenc} % encoding
+\usepackage{graphicx} % images
+\usepackage{url} % links
+\usepackage[nottoc, notlof, notlot]{tocbibind} % table of contents style
+\usepackage[unicode]{hyperref} % references from the table of contents
+\usepackage{etoolbox,ifthen} % ifthen type of commands
+\usepackage{kvoptions} % define key/value pairs as options for packages and classes
+
+% package options
+\geometry{ a4paper,
+ left=3cm,
+ right=2.5cm,
+ top=2.5cm,
+ bottom=2.5cm,
+}
+
+% bib style
+\bibliographystyle{alpha}
+
+% define the boolean variables in which we store the options chosen for the package (language and type of document)
+\newbool{@eng}\setbool{@eng}{false}
+\newbool{@dis}\setbool{@dis}{false}
+\newbool{@lic}\setbool{@lic}{true}
+
+% define and setup the key/value pairs for the package options
+\SetupKeyvalOptions{
+family=std,
+prefix=std@
+}
+\DeclareStringOption[romanian]{language}
+\DeclareStringOption[bachelor]{type}
+\DeclareDefaultOption{%
+\PackageWarning{\@currname}{Unknown option `\CurrentOption'}}
+\ProcessKeyvalOptions*
+\ifthenelse{\equal{\std@language}{romanian}}{\setbool{@eng}{false}}{\setbool{@eng}{true}}
+\ifthenelse{\equal{\std@type}{bachelor}}{\setbool{@lic}{true}\setbool{@dis}{false}}{}
+\ifthenelse{\equal{\std@type}{master}}{\setbool{@dis}{true}\setbool{@lic}{false}}{}
+
+\DeclareRobustCommand*{\specialization}[1]{\gdef\@specialization{#1}} % define command for specialization
+\DeclareRobustCommand*{\supervisor}[1]{\gdef\@supervisor{#1}} % define command for scientific advisor
+
+\ifbool{@eng}{\usepackage[english]{babel}}{\usepackage[romanian]{babel}}
+
+% customize the title page
+\renewcommand{\maketitle}
+{
+\begin{titlepage}
+
+\begin{center}
+{\Large\textbf{
+\ifbool{@eng}
+{
+BABEŞ-BOLYAI UNIVERSITY CLUJ-NAPOCA \\
+FACULTY OF MATHEMATICS AND COMPUTER SCIENCE \\
+SPECIALIZATION \@specialization \\
+}
+{
+UNIVERSITATEA BABEŞ-BOLYAI CLUJ-NAPOCA \\
+FACULTATEA DE MATEMATICǍ ŞI INFORMATICǍ \\
+SPECIALIZAREA \@specialization \\
+}
+}}
+\end{center}
+
+\vspace{10em}
+
+\begin{center}
+{\Huge\textbf{
+\ifbool{@dis}{\ifbool{@eng}{DISSERTATION THESIS}{LUCRARE DE DISERTA\c TIE}}{}
+\ifbool{@lic}{\ifbool{@eng}{DIPLOMA THESIS}{LUCRARE DE LICEN\c T\u A}}{}
+}}
+\end{center}
+
+\vspace{3em}
+
+\begin{center}
+{\huge\textbf{\@title}}
+\end{center}
+
+\vspace{10em}
+
+\begin{flushleft}
+{\Large\textbf{
+\ifbool{@eng}{Supervisor}{Conducător științific} \\ \@supervisor
+}}
+\end{flushleft}
+
+\vspace{3em}
+
+\begin{flushright}
+{\Large\textit{
+\ifbool{@eng}{Author}{Absolvent}\\ \@author
+}}
+\end{flushright}
+
+\vfill
+
+\begin{center}
+{\Large{\the\year}}
+\end{center}
+
+\end{titlepage}
+}
+
diff --git a/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/.gitignore b/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/.gitignore
new file mode 100644
index 0000000..3dbf826
--- /dev/null
+++ b/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/.gitignore
@@ -0,0 +1,39 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
+allure-results/
\ No newline at end of file
diff --git a/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/code-review.csv b/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/code-review.csv
new file mode 100644
index 0000000..ac01f52
--- /dev/null
+++ b/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/code-review.csv
@@ -0,0 +1,3 @@
+sha,filename,url,lines,title,comment,priority,category,additional,id,private
+"","\src\main\java\curent\Curent.java","","28:8-28:52","Move hardcoded value to a config file","","0","Best Practices","","d6456668-ad58-4a3f-a01c-5567aa06405b","0"
+"","\src\main\java\curent\Curent.java","","33:10-35:9","Catch-Throw Bad Practice","","0","Best Practices","","6074a0bd-1291-4e9a-829a-f94f9cdad443","1"
diff --git a/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/code-review.csv.html b/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/code-review.csv.html
new file mode 100644
index 0000000..d932c5e
--- /dev/null
+++ b/Anul 3/Semestrul 2/SSVV/L1-L6-IC-TH/code-review.csv.html
@@ -0,0 +1,124 @@
+
+
+
+
+
+ Code Review
+
+
+
+
+
+