diff options
| author | fedorst | 2025-02-25 13:46:40 +0100 |
|---|---|---|
| committer | fedorst | 2025-02-27 13:24:12 +0100 |
| commit | 3da109713ac12c02df2a13b6d45ebf76cc6699fc (patch) | |
| tree | 9be80a81ca2eb2d04eb91c7e654cf7bfc5aa219f | |
| parent | 74d2386bd3e67bfc4c7ab7798fb66c4ea7ff29b2 (diff) | |
| download | sec-certs-3da109713ac12c02df2a13b6d45ebf76cc6699fc.tar.gz sec-certs-3da109713ac12c02df2a13b6d45ebf76cc6699fc.tar.zst sec-certs-3da109713ac12c02df2a13b6d45ebf76cc6699fc.zip | |
proof-of-concept
| -rw-r--r-- | notebooks/llm_annotation.ipynb | 849 | ||||
| -rw-r--r-- | notebooks/llm_annotation_prompt.txt | 26 | ||||
| -rw-r--r-- | pyproject.toml | 1 |
3 files changed, 876 insertions, 0 deletions
diff --git a/notebooks/llm_annotation.ipynb b/notebooks/llm_annotation.ipynb new file mode 100644 index 00000000..c94fd0e6 --- /dev/null +++ b/notebooks/llm_annotation.ipynb @@ -0,0 +1,849 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Annotating certificate references with LLMs\n", + "## Before you launch\n", + "1. Create a file `openai_api_key` in the root directory and paste your key there.\n", + "2. Make sure you have the CC dataset extracted into project `cc_data` in the project root directory.\n", + "## What is being done here\n", + "1. Obtain names, certificate IDs, digests, and old digests from the CCDataset.\n", + "2. Create an annotations dataframe based on the annotations in `src/sec_certs/data/reference_annotations/final/train.csv`.\n", + "3. Enrich the annotations dataframe with the raw texts in `cc_data/certs/reports/txt`.\n", + "4. Enrich the annotations dataframe with the old digests (the annotation dataframe uses old ones), target cert IDs, names and target names.\n", + "5. Call the OpenAI API with structured outputs to label the certificate reference based on instructions in `notebooks/llm_annotation_prompt.txt`\n", + "6. Analyze the metrics with a confusion matrix." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from sec_certs.dataset.cc import CCDataset\n", + "from sec_certs.sample import CCCertificate\n", + "import pandas as pd\n", + "import csv\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ff5d3e43f54f44aebff9a2835b6b1839", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading: CCDataset: 0%| | 0.00/178M [00:00<?, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Method auxiliary_datasets_dir can only be called on backed dataset.\n", + "Method auxiliary_datasets_dir can only be called on backed dataset.\n", + "Method auxiliary_datasets_dir can only be called on backed dataset.\n", + "Method auxiliary_datasets_dir can only be called on backed dataset.\n", + "Method auxiliary_datasets_dir can only be called on backed dataset.\n", + "Method auxiliary_datasets_dir can only be called on backed dataset.\n" + ] + } + ], + "source": [ + "if \"dgst_map.csv\" not in os.listdir():\n", + " # get dgst mappings\n", + " dset = CCDataset.from_web()\n", + " data = [(row.name, row.heuristics.cert_id, row.dgst, row.old_dgst) for row in dset]\n", + " with open('dgst_map.csv', 'w', newline='') as file:\n", + " writer = csv.writer(file)\n", + " writer.writerow(['name', 'cert_id', 'dgst', 'old_dgst']) # Header\n", + " writer.writerows(data)\n", + "dgst_map_df = pd.read_csv(\"dgst_map.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "reports_path = '../cc_data/certs/reports/txt'\n", + "if not os.path.exists(reports_path):\n", + " raise FileNotFoundError(f\"The reports directory {os.path.abspath(reports_path)} does not exist, make sure you have the CC dataset unpacked.\")\n", + "\n", + "reports_files = os.listdir(reports_path)\n", + "# print(reports_files)\n", + "def add_text_content(dgst: str):\n", + " if f\"{dgst}.txt\" not in reports_files:\n", + " return \"\"\n", + " return open(reports_path + \"/\" + dgst + \".txt\").read()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "df_annotations = pd.read_csv(\"../src/sec_certs/data/reference_annotations/final/train.csv\") \\\n", + " .rename(columns={\"dgst\": \"old_dgst\", \"canonical_reference_keyword\": \"target_cert_id\"}) \\\n", + " .merge(dgst_map_df, on=\"old_dgst\") \\\n", + " .merge(dgst_map_df[[\"name\", \"cert_id\"]].rename(columns={\"name\": \"target_name\", \"cert_id\": \"target_cert_id\"}), on=\"target_cert_id\")\n", + "df_annotations[\"text_content\"] = df_annotations[\"dgst\"] \\\n", + " .apply(add_text_content)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>old_dgst</th>\n", + " <th>target_cert_id</th>\n", + " <th>label</th>\n", + " <th>comment</th>\n", + " <th>name</th>\n", + " <th>cert_id</th>\n", + " <th>dgst</th>\n", + " <th>older_dgst</th>\n", + " <th>target_name</th>\n", + " <th>text_content</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>00efeb17bcaafce6</td>\n", + " <td>ANSSI-CC-2009/34</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>Trusted Logic. Carte à puce JCLXxxjTOPyyIDv2 :...</td>\n", + " <td>ANSSI-CC-2009/35</td>\n", + " <td>4e9ff22a844c6003</td>\n", + " <td>6f55526f9162a4bb</td>\n", + " <td>JCLX80jTOP20ID : Java Trusted Open Platform IF...</td>\n", + " <td>PREMIER MINISTRE\\nSecrétariat général de la dé...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>01e8805514b4ef67</td>\n", + " <td>BSI-DSZ-CC-0891-V3-2018</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>ID&Trust IDentity-J with SAC (BAC+PACE) and AA...</td>\n", + " <td>JISEC-CC-CRP-C0649-01-2019</td>\n", + " <td>abb304884762a560</td>\n", + " <td>42586e3d73fb8bd4</td>\n", + " <td>Infineon Security Controller M7892 Design Step...</td>\n", + " <td>JISEC-CC-CRP-C0649-01-2019\\nCertification Repo...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>037577fc2019fcfa</td>\n", + " <td>ANSSI-CC-2021/49</td>\n", + " <td>previous_version</td>\n", + " <td>NaN</td>\n", + " <td>NPCT7xx TPM2.0 rev 1.59 (configuration version...</td>\n", + " <td>ANSSI-CC-2022/28</td>\n", + " <td>88b3519651a7b7c0</td>\n", + " <td>cca6ba2fdb06af5a</td>\n", + " <td>NPCT7xx TPM2.0 rev 1.59 (configuration version...</td>\n", + " <td>Secrétariat général de la défense\\net de la sé...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>055985699aee1e09</td>\n", + " <td>ANSSI-CC-2010/02</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>Carte CC IDeal Citiz (sur composants SB23YR80B...</td>\n", + " <td>ANSSI-CC-2011/62</td>\n", + " <td>338e26cd240f6572</td>\n", + " <td>700f9a9a01a58722</td>\n", + " <td>STMicroelectronics SA23YR48/80B and SB23YR48/8...</td>\n", + " <td>PREMIER MINISTRE\\nSecrétariat général de la dé...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>05726637bd47a762</td>\n", + " <td>BSI-DSZ-CC-0891-V3-2018</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>Java Card Platform Implementation for Infineon...</td>\n", + " <td>BSI-DSZ-CC-0869-V2-2019</td>\n", + " <td>179ef93627203d9f</td>\n", + " <td>377db3692d1a6bf6</td>\n", + " <td>Infineon Security Controller M7892 Design Step...</td>\n", + " <td>BSI-DSZ-CC-0869-V2-2019\\nfor\\nJava Card Platfo...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " old_dgst target_cert_id label comment \\\n", + "0 00efeb17bcaafce6 ANSSI-CC-2009/34 component_used NaN \n", + "1 01e8805514b4ef67 BSI-DSZ-CC-0891-V3-2018 component_used NaN \n", + "2 037577fc2019fcfa ANSSI-CC-2021/49 previous_version NaN \n", + "3 055985699aee1e09 ANSSI-CC-2010/02 component_used NaN \n", + "4 05726637bd47a762 BSI-DSZ-CC-0891-V3-2018 component_used NaN \n", + "\n", + " name \\\n", + "0 Trusted Logic. Carte à puce JCLXxxjTOPyyIDv2 :... \n", + "1 ID&Trust IDentity-J with SAC (BAC+PACE) and AA... \n", + "2 NPCT7xx TPM2.0 rev 1.59 (configuration version... \n", + "3 Carte CC IDeal Citiz (sur composants SB23YR80B... \n", + "4 Java Card Platform Implementation for Infineon... \n", + "\n", + " cert_id dgst older_dgst \\\n", + "0 ANSSI-CC-2009/35 4e9ff22a844c6003 6f55526f9162a4bb \n", + "1 JISEC-CC-CRP-C0649-01-2019 abb304884762a560 42586e3d73fb8bd4 \n", + "2 ANSSI-CC-2022/28 88b3519651a7b7c0 cca6ba2fdb06af5a \n", + "3 ANSSI-CC-2011/62 338e26cd240f6572 700f9a9a01a58722 \n", + "4 BSI-DSZ-CC-0869-V2-2019 179ef93627203d9f 377db3692d1a6bf6 \n", + "\n", + " target_name \\\n", + "0 JCLX80jTOP20ID : Java Trusted Open Platform IF... \n", + "1 Infineon Security Controller M7892 Design Step... \n", + "2 NPCT7xx TPM2.0 rev 1.59 (configuration version... \n", + "3 STMicroelectronics SA23YR48/80B and SB23YR48/8... \n", + "4 Infineon Security Controller M7892 Design Step... \n", + "\n", + " text_content \n", + "0 PREMIER MINISTRE\\nSecrétariat général de la dé... \n", + "1 JISEC-CC-CRP-C0649-01-2019\\nCertification Repo... \n", + "2 Secrétariat général de la défense\\net de la sé... \n", + "3 PREMIER MINISTRE\\nSecrétariat général de la dé... \n", + "4 BSI-DSZ-CC-0869-V2-2019\\nfor\\nJava Card Platfo... " + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_annotations.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from enum import Enum\n", + "from pydantic import Field, BaseModel\n", + "from openai import AsyncOpenAI, RateLimitError\n", + "import asyncio\n", + "from openai.lib._pydantic import to_strict_json_schema\n", + "\n", + "class LabelType(Enum):\n", + " COMPONENT_USED = \"component_used\"\n", + " RE_EVALUATION = \"re-evaluation\"\n", + " EVALUATION_REUSED = \"evaluation_reused\"\n", + " PREVIOUS_VERSION = \"previous_version\"\n", + " COMPONENT_SHARED = \"component_shared\"\n", + " IRRELEVANT = \"irrelevant\"\n", + " NONE = \"none\"\n", + "\n", + "class SimplifiedLabelType(Enum):\n", + " COMPONENT_REUSE = \"component_reuse\"\n", + " PREDECESSOR = \"predecessor\" \n", + " NONE = \"none\"\n", + "\n", + "def convert_label_type(label: LabelType|str) -> SimplifiedLabelType:\n", + " if isinstance(label, LabelType):\n", + " label_value = label\n", + " else:\n", + " try:\n", + " label_value = LabelType(label)\n", + " except ValueError:\n", + " return SimplifiedLabelType.NONE\n", + " \n", + " if label_value in [LabelType.COMPONENT_USED, LabelType.EVALUATION_REUSED, LabelType.COMPONENT_SHARED]:\n", + " return SimplifiedLabelType.COMPONENT_REUSE\n", + " elif label_value in [LabelType.RE_EVALUATION, LabelType.PREVIOUS_VERSION]:\n", + " return SimplifiedLabelType.PREDECESSOR\n", + " return SimplifiedLabelType.NONE\n", + "\n", + "class LabelDetectionResult(BaseModel):\n", + " explanation: str = Field(description=\"Explain why this label was chosen.\")\n", + " label: LabelType = Field(description=\"Categorization of the relationship between the examined and referenced certificates.\")\n", + "\n", + "#label_detection_strict_schema = to_strict_json_schema(LabelDetectionResult)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "label\n", + "component_used 58\n", + "re-evaluation 16\n", + "evaluation_reused 11\n", + "previous_version 6\n", + "component_shared 5\n", + "irrelevant 2\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_annotations.label.value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "label\n", + "component_reuse 74\n", + "predecessor 22\n", + "none 3\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_annotations.label.apply(convert_label_type).apply(lambda x: x.value).value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "API Key loaded: sk-proj-tco-...\n" + ] + } + ], + "source": [ + "def load_api_key(filename: str) -> str:\n", + " try:\n", + " with open(filename, 'r') as file:\n", + " api_key = file.readline().strip()\n", + " return api_key\n", + " except FileNotFoundError:\n", + " raise Exception(f\"OpenAI API key not found at {filename}.\")\n", + "\n", + "api_key = load_api_key('../openai_api_key')\n", + "openapi_model = \"gpt-4o-mini\"\n", + "print(f\"API Key loaded: {api_key[:12]}...\")\n", + "client = AsyncOpenAI(api_key=api_key)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [], + "source": [ + "system_message = {\n", + " \"role\": \"system\",\n", + " \"content\": open(\"llm_annotation_prompt.txt\").read()\n", + "}\n", + "async def get_ai_label(text_content: str, name: str, target_name: str, cert_id: str, target_cert_id: str, verbose=False):\n", + " messages = [\n", + " system_message, \n", + " {\"role\": \"user\", \"content\": f\"\"\"The target certificate id is '{target_cert_id}'.\n", + " The reviewed certificate id is '{cert_id}'\n", + " The target name is '{target_name}'.\n", + " The reviewed name is '{name}'\n", + " ---\n", + " The reviewed certificate full text is: '{text_content}'\"\"\"}\n", + " ]\n", + " while True:\n", + " try:\n", + " completion = await client.beta.chat.completions.parse(\n", + " model=openapi_model,\n", + " messages=messages,\n", + " response_format=LabelDetectionResult\n", + " )\n", + " return completion.choices[0].message.parsed\n", + " except RateLimitError as e:\n", + " wait_time = 60\n", + " if verbose:\n", + " print(f\"Rate limit hit, retrying in {wait_time}s..\")\n", + " await asyncio.sleep(wait_time)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [], + "source": [ + "from tqdm.asyncio import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "async def process_row_async(text_content: str, name: str, target_name: str, cert_id: str, target_cert_id: str):\n", + " result = await get_ai_label(text_content, name, target_name, cert_id, target_cert_id)\n", + " return result.label.value, result.explanation" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "async def process_dataframe_async(df):\n", + " tasks = [process_row_async(\n", + " row[\"text_content\"], \n", + " row[\"name\"], \n", + " row[\"target_name\"],\n", + " row[\"cert_id\"],\n", + " row[\"target_cert_id\"]) for _, row in df.iterrows()]\n", + " results = []\n", + " for coro in tqdm(asyncio.as_completed(tasks), total=len(tasks)): # tracks actual completion\n", + " results.append(await coro)\n", + "\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "import nest_asyncio # otherwise async tasks can't be called from a running event loop (jupyter)\n", + "nest_asyncio.apply()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 99/99 [05:47<00:00, 3.51s/it]\n" + ] + } + ], + "source": [ + "# running this cell costs about 0.15EUR with gpt4o-mini\n", + "results = asyncio.run(process_dataframe_async(df_annotations))\n", + "df_annotations[\"gpt4omini_label\"], df_annotations[\"gpt4omini_reason\"] = zip(*results)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>target_cert_id</th>\n", + " <th>cert_id</th>\n", + " <th>name</th>\n", + " <th>target_name</th>\n", + " <th>label</th>\n", + " <th>comment</th>\n", + " <th>gpt4omini_label</th>\n", + " <th>gpt4omini_reason</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>ANSSI-CC-2009/34</td>\n", + " <td>ANSSI-CC-2009/35</td>\n", + " <td>Trusted Logic. Carte à puce JCLXxxjTOPyyIDv2 :...</td>\n", + " <td>JCLX80jTOP20ID : Java Trusted Open Platform IF...</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>component_used</td>\n", + " <td>The examined certificate mentions the Infineon...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>BSI-DSZ-CC-0891-V3-2018</td>\n", + " <td>JISEC-CC-CRP-C0649-01-2019</td>\n", + " <td>ID&Trust IDentity-J with SAC (BAC+PACE) and AA...</td>\n", + " <td>Infineon Security Controller M7892 Design Step...</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>re-evaluation</td>\n", + " <td>The reviewed certificate ANSSI-CC-2019/19 is a...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>ANSSI-CC-2021/49</td>\n", + " <td>ANSSI-CC-2022/28</td>\n", + " <td>NPCT7xx TPM2.0 rev 1.59 (configuration version...</td>\n", + " <td>NPCT7xx TPM2.0 rev 1.59 (configuration version...</td>\n", + " <td>previous_version</td>\n", + " <td>NaN</td>\n", + " <td>component_used</td>\n", + " <td>The reviewed certificate indicates that it is ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>ANSSI-CC-2010/02</td>\n", + " <td>ANSSI-CC-2011/62</td>\n", + " <td>Carte CC IDeal Citiz (sur composants SB23YR80B...</td>\n", + " <td>STMicroelectronics SA23YR48/80B and SB23YR48/8...</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>re-evaluation</td>\n", + " <td>The reviewed certificate (ANSSI-CC-2020/71) is...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>BSI-DSZ-CC-0891-V3-2018</td>\n", + " <td>BSI-DSZ-CC-0869-V2-2019</td>\n", + " <td>Java Card Platform Implementation for Infineon...</td>\n", + " <td>Infineon Security Controller M7892 Design Step...</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>re-evaluation</td>\n", + " <td>The reviewed certificate ANSSI-CC-2022/29 is e...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>94</th>\n", + " <td>ANSSI-CC-2012/68</td>\n", + " <td>ANSSI-CC-2014/25</td>\n", + " <td>SOMA801STM - application BAC, version 1.0</td>\n", + " <td>Microcontrôleurs sécurisés SA23YR80/48 et SB23...</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>re-evaluation</td>\n", + " <td>The reviewed certificate (BSI-DSZ-CC-0976-V2-2...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>95</th>\n", + " <td>ANSSI-CC-2017/47</td>\n", + " <td>ANSSI-CC-2017/72</td>\n", + " <td>Taiwan eID Applet PACE with CAM, CA and AA on ...</td>\n", + " <td>Plateforme ID-One Cosmo v8.1-N-Standard LDS ma...</td>\n", + " <td>component_used</td>\n", + " <td>NaN</td>\n", + " <td>component_used</td>\n", + " <td>The reviewed certificate (BSI-DSZ-CC-0912-2014...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>96</th>\n", + " <td>BSI-DSZ-CC-0945-V2-2018</td>\n", + " <td>NSCIB-CC-200689-CR</td>\n", + " <td>Idemia CombICAO Applet in EAC configuration on...</td>\n", + " <td>Infineon smart card IC (Security Controller) I...</td>\n", + " <td>irrelevant</td>\n", + " <td>NaN</td>\n", + " <td>previous_version</td>\n", + " <td>The referenced certificate BSI-DSZ-CC-0911-201...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>97</th>\n", + " <td>BSI-DSZ-CC-0950-V2-2018</td>\n", + " <td>BSI-DSZ-CC-0596-V2-2018</td>\n", + " <td>ORGA 930 M online and Cherry ST-1530</td>\n", + " <td>KoCoBox MED+ Netzkonnektor, 1.3.4</td>\n", + " <td>NaN</td>\n", + " <td>unclear, mentions just ToE delivery</td>\n", + " <td>re-evaluation</td>\n", + " <td>The reviewed certificate BSI-DSZ-CC-1035-2017 ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>98</th>\n", + " <td>BSI-DSZ-CC-0827-V8-2020</td>\n", + " <td>BSI-DSZ-CC-1158-2020</td>\n", + " <td>Digital Tachograph DTCO 1381, Release 4.0e</td>\n", + " <td>Infineon Technologies Smart Card IC (Security ...</td>\n", + " <td>irrelevant</td>\n", + " <td>unclear</td>\n", + " <td>re-evaluation</td>\n", + " <td>The reviewed certificate BSI-DSZ-CC-0879-2014 ...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>99 rows × 8 columns</p>\n", + "</div>" + ], + "text/plain": [ + " target_cert_id cert_id \\\n", + "0 ANSSI-CC-2009/34 ANSSI-CC-2009/35 \n", + "1 BSI-DSZ-CC-0891-V3-2018 JISEC-CC-CRP-C0649-01-2019 \n", + "2 ANSSI-CC-2021/49 ANSSI-CC-2022/28 \n", + "3 ANSSI-CC-2010/02 ANSSI-CC-2011/62 \n", + "4 BSI-DSZ-CC-0891-V3-2018 BSI-DSZ-CC-0869-V2-2019 \n", + ".. ... ... \n", + "94 ANSSI-CC-2012/68 ANSSI-CC-2014/25 \n", + "95 ANSSI-CC-2017/47 ANSSI-CC-2017/72 \n", + "96 BSI-DSZ-CC-0945-V2-2018 NSCIB-CC-200689-CR \n", + "97 BSI-DSZ-CC-0950-V2-2018 BSI-DSZ-CC-0596-V2-2018 \n", + "98 BSI-DSZ-CC-0827-V8-2020 BSI-DSZ-CC-1158-2020 \n", + "\n", + " name \\\n", + "0 Trusted Logic. Carte à puce JCLXxxjTOPyyIDv2 :... \n", + "1 ID&Trust IDentity-J with SAC (BAC+PACE) and AA... \n", + "2 NPCT7xx TPM2.0 rev 1.59 (configuration version... \n", + "3 Carte CC IDeal Citiz (sur composants SB23YR80B... \n", + "4 Java Card Platform Implementation for Infineon... \n", + ".. ... \n", + "94 SOMA801STM - application BAC, version 1.0 \n", + "95 Taiwan eID Applet PACE with CAM, CA and AA on ... \n", + "96 Idemia CombICAO Applet in EAC configuration on... \n", + "97 ORGA 930 M online and Cherry ST-1530 \n", + "98 Digital Tachograph DTCO 1381, Release 4.0e \n", + "\n", + " target_name label \\\n", + "0 JCLX80jTOP20ID : Java Trusted Open Platform IF... component_used \n", + "1 Infineon Security Controller M7892 Design Step... component_used \n", + "2 NPCT7xx TPM2.0 rev 1.59 (configuration version... previous_version \n", + "3 STMicroelectronics SA23YR48/80B and SB23YR48/8... component_used \n", + "4 Infineon Security Controller M7892 Design Step... component_used \n", + ".. ... ... \n", + "94 Microcontrôleurs sécurisés SA23YR80/48 et SB23... component_used \n", + "95 Plateforme ID-One Cosmo v8.1-N-Standard LDS ma... component_used \n", + "96 Infineon smart card IC (Security Controller) I... irrelevant \n", + "97 KoCoBox MED+ Netzkonnektor, 1.3.4 NaN \n", + "98 Infineon Technologies Smart Card IC (Security ... irrelevant \n", + "\n", + " comment gpt4omini_label \\\n", + "0 NaN component_used \n", + "1 NaN re-evaluation \n", + "2 NaN component_used \n", + "3 NaN re-evaluation \n", + "4 NaN re-evaluation \n", + ".. ... ... \n", + "94 NaN re-evaluation \n", + "95 NaN component_used \n", + "96 NaN previous_version \n", + "97 unclear, mentions just ToE delivery re-evaluation \n", + "98 unclear re-evaluation \n", + "\n", + " gpt4omini_reason \n", + "0 The examined certificate mentions the Infineon... \n", + "1 The reviewed certificate ANSSI-CC-2019/19 is a... \n", + "2 The reviewed certificate indicates that it is ... \n", + "3 The reviewed certificate (ANSSI-CC-2020/71) is... \n", + "4 The reviewed certificate ANSSI-CC-2022/29 is e... \n", + ".. ... \n", + "94 The reviewed certificate (BSI-DSZ-CC-0976-V2-2... \n", + "95 The reviewed certificate (BSI-DSZ-CC-0912-2014... \n", + "96 The referenced certificate BSI-DSZ-CC-0911-201... \n", + "97 The reviewed certificate BSI-DSZ-CC-1035-2017 ... \n", + "98 The reviewed certificate BSI-DSZ-CC-0879-2014 ... \n", + "\n", + "[99 rows x 8 columns]" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_annotations[[\"target_cert_id\", \"cert_id\", \"name\", \"target_name\", \"label\", \"comment\", \"gpt4omini_label\", \"gpt4omini_reason\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [], + "source": [ + "import seaborn as sns\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAH7CAYAAABxHsNDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAlapJREFUeJzs3XdUFPfbBfC79CJdQVQEAUWxYIu9N+xiiQ0Ve4nYEFsUBRtq7EksUQNYiMbesRE1NhQUbIiChVhREJWOsO8fvu7PFdRdijMs95Oz57CzszN3JyAP3zYSqVQqBRERERGJlprQAYiIiIjo61iwEREREYkcCzYiIiIikWPBRkRERCRyLNiIiIiIRI4FGxEREZHIsWAjIiIiEjkWbEREREQix4KNiIiISORYsBFRsXfv3j20a9cORkZGkEgk2LdvX4Ee/+HDh5BIJPD39y/Q4xZlLVq0QIsWLYSOQVRksGAjIlGIiYnBqFGjYGtrCx0dHRgaGqJx48ZYtWoVUlNTC/Xcbm5uuHHjBhYsWIAtW7agbt26hXq+72nw4MGQSCQwNDTM9Treu3cPEokEEokES5cuVfr4T58+hbe3N8LDwwsgLRF9iYbQAYiIDh8+jB9//BHa2toYNGgQqlWrhoyMDJw7dw5TpkzBrVu38McffxTKuVNTU3Hx4kXMnDkT7u7uhXIOa2trpKamQlNTs1CO/y0aGhpISUnBwYMH0bt3b7nXtm3bBh0dHaSlpeXp2E+fPoWPjw9sbGxQs2ZNhd93/PjxPJ2PqLhiwUZEgnrw4AH69u0La2trBAcHw9LSUvba2LFjER0djcOHDxfa+V++fAkAMDY2LrRzSCQS6OjoFNrxv0VbWxuNGzfGX3/9laNgCwwMRKdOnbB79+7vkiUlJQV6enrQ0tL6LucjUhXsEiUiQS1ZsgRJSUnYtGmTXLH2kb29PSZMmCB7/v79e8ybNw92dnbQ1taGjY0Nfv75Z6Snp8u9z8bGBp07d8a5c+dQr1496OjowNbWFps3b5bt4+3tDWtrawDAlClTIJFIYGNjA+BDV+LHrz/l7e0NiUQit+3EiRNo0qQJjI2NUaJECTg4OODnn3+Wvf6lMWzBwcFo2rQp9PX1YWxsjG7duiEyMjLX80VHR2Pw4MEwNjaGkZERhgwZgpSUlC9f2M/0798fR48eRWJiomzblStXcO/ePfTv3z/H/gkJCfD09ET16tVRokQJGBoaokOHDoiIiJDtc/r0afzwww8AgCFDhsi6Vj9+zhYtWqBatWoICwtDs2bNoKenJ7sun49hc3Nzg46OTo7P7+zsDBMTEzx9+lThz0qkiliwEZGgDh48CFtbWzRq1Eih/YcPH47Zs2ejdu3aWLFiBZo3bw5fX1/07ds3x77R0dHo1asX2rZti2XLlsHExASDBw/GrVu3AAA9evTAihUrAAD9+vXDli1bsHLlSqXy37p1C507d0Z6ejrmzp2LZcuWoWvXrjh//vxX33fy5Ek4OzsjLi4O3t7e8PDwwIULF9C4cWM8fPgwx/69e/fGu3fv4Ovri969e8Pf3x8+Pj4K5+zRowckEgn27Nkj2xYYGIjKlSujdu3aOfa/f/8+9u3bh86dO2P58uWYMmUKbty4gebNm8uKpypVqmDu3LkAgJEjR2LLli3YsmULmjVrJjtOfHw8OnTogJo1a2LlypVo2bJlrvlWrVqFUqVKwc3NDVlZWQCA9evX4/jx4/j1119RpkwZhT8rkUqSEhEJ5M2bN1IA0m7duim0f3h4uBSAdPjw4XLbPT09pQCkwcHBsm3W1tZSANKzZ8/KtsXFxUm1tbWlkydPlm178OCBFID0l19+kTumm5ub1NraOkeGOXPmSD/9p3PFihVSANKXL19+MffHc/j5+cm21axZU2pubi6Nj4+XbYuIiJCqqalJBw0alON8Q4cOlTtm9+7dpWZmZl8856efQ19fXyqVSqW9evWStm7dWiqVSqVZWVnS0qVLS318fHK9BmlpadKsrKwcn0NbW1s6d+5c2bYrV67k+GwfNW/eXApAum7dulxfa968udy2Y8eOSQFI58+fL71//760RIkSUhcXl29+RqLigC1sRCSYt2/fAgAMDAwU2v/IkSMAAA8PD7ntkydPBoAcY90cHR3RtGlT2fNSpUrBwcEB9+/fz3Pmz30c+7Z//35kZ2cr9J5nz54hPDwcgwcPhqmpqWx7jRo10LZtW9nn/NTo0aPlnjdt2hTx8fGya6iI/v374/Tp03j+/DmCg4Px/PnzXLtDgQ/j3tTUPvyKyMrKQnx8vKy79+rVqwqfU1tbG0OGDFFo33bt2mHUqFGYO3cuevToAR0dHaxfv17hcxGpMhZsRCQYQ0NDAMC7d+8U2v/Ro0dQU1ODvb293PbSpUvD2NgYjx49kttevnz5HMcwMTHB69ev85g4pz59+qBx48YYPnw4LCws0LdvX/z9999fLd4+5nRwcMjxWpUqVfDq1SskJyfLbf/8s5iYmACAUp+lY8eOMDAwwI4dO7Bt2zb88MMPOa7lR9nZ2VixYgUqVqwIbW1tlCxZEqVKlcL169fx5s0bhc9ZtmxZpSYYLF26FKampggPD8fq1athbm6u8HuJVBkLNiISjKGhIcqUKYObN28q9b7PB/1/ibq6eq7bpVJpns/xcXzVR7q6ujh79ixOnjyJgQMH4vr16+jTpw/atm2bY9/8yM9n+UhbWxs9evRAQEAA9u7d+8XWNQBYuHAhPDw80KxZM2zduhXHjh3DiRMnULVqVYVbEoEP10cZ165dQ1xcHADgxo0bSr2XSJWxYCMiQXXu3BkxMTG4ePHiN/e1trZGdnY27t27J7f9xYsXSExMlM34LAgmJiZyMyo/+rwVDwDU1NTQunVrLF++HLdv38aCBQsQHByMf/75J9djf8wZFRWV47U7d+6gZMmS0NfXz98H+IL+/fvj2rVrePfuXa4TNT7atWsXWrZsiU2bNqFv375o164d2rRpk+OaKFo8KyI5ORlDhgyBo6MjRo4ciSVLluDKlSsFdnyioowFGxEJaurUqdDX18fw4cPx4sWLHK/HxMRg1apVAD506QHIMZNz+fLlAIBOnToVWC47Ozu8efMG169fl2179uwZ9u7dK7dfQkJCjvd+XED286VGPrK0tETNmjUREBAgVwDdvHkTx48fl33OwtCyZUvMmzcPv/32G0qXLv3F/dTV1XO03u3cuRNPnjyR2/axsMytuFXWtGnTEBsbi4CAACxfvhw2NjZwc3P74nUkKk64cC4RCcrOzg6BgYHo06cPqlSpInengwsXLmDnzp0YPHgwAMDJyQlubm74448/kJiYiObNm+Py5csICAiAi4vLF5eMyIu+ffti2rRp6N69O8aPH4+UlBSsXbsWlSpVkht0P3fuXJw9exadOnWCtbU14uLisGbNGpQrVw5NmjT54vF/+eUXdOjQAQ0bNsSwYcOQmpqKX3/9FUZGRvD29i6wz/E5NTU1zJo165v7de7cGXPnzsWQIUPQqFEj3LhxA9u2bYOtra3cfnZ2djA2Nsa6detgYGAAfX191K9fHxUqVFAqV3BwMNasWYM5c+bIlhnx8/NDixYt4OXlhSVLlih1PCKVI/AsVSIiqVQqld69e1c6YsQIqY2NjVRLS0tqYGAgbdy4sfTXX3+VpqWlyfbLzMyU+vj4SCtUqCDV1NSUWllZSWfMmCG3j1T6YVmPTp065TjP58tJfGlZD6lUKj1+/Li0WrVqUi0tLamDg4N069atOZb1OHXqlLRbt27SMmXKSLW0tKRlypSR9uvXT3r37t0c5/h86YuTJ09KGzduLNXV1ZUaGhpKu3TpIr19+7bcPh/P9/myIX5+flIA0gcPHnzxmkql8st6fMmXlvWYPHmy1NLSUqqrqytt3Lix9OLFi7kux7F//36po6OjVENDQ+5zNm/eXFq1atVcz/npcd6+fSu1traW1q5dW5qZmSm336RJk6RqamrSixcvfvUzEKk6iVSqxIhVIiIiIvruOIaNiIiISORYsBERERGJHAs2IiIiIpFjwUZEREQkcizYiIiIiESOBRsRERGRyLFgIyIiIhI53umAipTYBN6iRlHmhtpCRygS0jMVv5F5caatyb/vFcXvKcUY6Rbe95RuLfd8vT/12m8FlKTgsGAjIiIi1SJRvT8wVO8TEREREakYtrARERGRapFIhE5Q4FiwERERkWpRwS5RFmxERESkWtjCRkRERCRybGEjIiIiEjkVbGFTvRKUiIiISMWwhY2IiIhUC7tEiYiIiEROBbtEWbARERGRamELGxEREZHIsYWNiIiISORUsIVN9T4RERERkYphCxsRERGpFnaJEhEREYmcCnaJsmAjIiIi1cKCjYiIiEjk1FSvS1T1SlDK1cOHDyGRSBAeHi50FJkWLVpg4sSJQscgIiJVI1HL30MJvr6++OGHH2BgYABzc3O4uLggKipKbp8WLVpAIpHIPUaPHq3UeViwiRgLGvE6uGcHRg7oiW6tG6Jb64YYP2IALl/8V+hYorU9cBs6tG2FH2pVh2vfH3Hj+nWhI4nO1bAr8Bg/Bh3bNkO9mlVwOvik0JFEjd9T38bvqe/jzJkzGDt2LC5duoQTJ04gMzMT7dq1Q3Jystx+I0aMwLNnz2SPJUuWKHUeFmyULxkZGUJHEETJUhYY9tNE/O6/Hb/7/YWadephztQJeHg/WuhoohN09AiWLvHFqJ/GYvvOvXBwqIwxo4YhPj5e6GiikpaaioqVHDBlhpfQUUSP31OKKdbfUxJJ/h5KCAoKwuDBg1G1alU4OTnB398fsbGxCAsLk9tPT08PpUuXlj0MDQ2VOo+gBVt2djaWLFkCe3t7aGtro3z58liwYAEA4MaNG2jVqhV0dXVhZmaGkSNHIikpSfbewYMHw8XFBQsXLoSFhQWMjY0xd+5cvH//HlOmTIGpqSnKlSsHPz8/2Xs+dgtu374djRo1go6ODqpVq4YzZ87I5Tpz5gzq1asHbW1tWFpaYvr06Xj//r3s9RYtWmD8+PGYOnUqTE1NUbp0aXh7e8sdIzExEcOHD0epUqVgaGiIVq1aISIiQva6t7c3atasiS1btsDGxgZGRkbo27cv3r17J/t8Z86cwapVq2TNpw8fPvzq9Xz9+jVcXV1RqlQp6OrqomLFinKfHwDu37+Pli1bQk9PD05OTrh48aLstfj4ePTr1w9ly5aFnp4eqlevjr/++kvu/S1atIC7uzsmTpyIkiVLwtnZGQBw8+ZNdOjQASVKlICFhQUGDhyIV69eyd6XnJyMQYMGoUSJErC0tMSyZcu++lnErmHTFqjfqCnKWVmjXHkbDB09Hrq6eoi8yb/yP7clwA89evWGS/eesLO3x6w5PtDR0cG+PbuFjiYqjZo0wxj3iWjZqq3QUUSP31OKKdbfU/nsEk1PT8fbt2/lHunp6Qqd+s2bNwAAU1NTue3btm1DyZIlUa1aNcyYMQMpKSlKfSRBC7YZM2Zg0aJF8PLywu3btxEYGAgLCwskJyfD2dkZJiYmuHLlCnbu3ImTJ0/C3d1d7v3BwcF4+vQpzp49i+XLl2POnDno3LkzTExMEBISgtGjR2PUqFF4/Pix3PumTJmCyZMn49q1a2jYsCG6dOki+8vsyZMn6NixI3744QdERERg7dq12LRpE+bPny93jICAAOjr6yMkJARLlizB3LlzceLECdnrP/74I+Li4nD06FGEhYWhdu3aaN26NRISEmT7xMTEYN++fTh06BAOHTqEM2fOYNGiRQCAVatWoWHDhnJNqFZWVl+9nh+v49GjRxEZGYm1a9eiZMmScvvMnDkTnp6eCA8PR6VKldCvXz9ZMZqWloY6derg8OHDuHnzJkaOHImBAwfi8uXLOT67lpYWzp8/j3Xr1iExMRGtWrVCrVq1EBoaiqCgILx48QK9e/eWu+ZnzpzB/v37cfz4cZw+fRpXr1796ucpKrKysvDPiaNIS0uFY3UnoeOISmZGBiJv30KDho1k29TU1NCgQSNcj7gmYDIqqvg9RQrJZwubr68vjIyM5B6+vr7fPG12djYmTpyIxo0bo1q1arLt/fv3x9atW/HPP/9gxowZ2LJlCwYMGKDURxJslui7d++watUq/Pbbb3BzcwMA2NnZoUmTJtiwYQPS0tKwefNm6OvrAwB+++03dOnSBYsXL4aFhQWAD9Xr6tWroaamBgcHByxZsgQpKSn4+eefAfyvIDx37hz69u0rO7e7uzt69uwJAFi7di2CgoKwadMmTJ06FWvWrIGVlRV+++03SCQSVK5cGU+fPsW0adMwe/ZsqKl9qHFr1KiBOXPmAAAqVqyI3377DadOnULbtm1x7tw5XL58GXFxcdDW1gYALF26FPv27cOuXbswcuRIAB/+x/r7+8PAwAAAMHDgQJw6dQoLFiyAkZERtLS0ZE2oioiNjUWtWrVQt25dAICNjU2OfTw9PdGpUycAgI+PD6pWrYro6GhUrlwZZcuWhaenp2zfcePG4dixY/j7779Rr1492faKFSvK9b3Pnz8ftWrVwsKFC2Xb/vzzT1hZWeHu3bsoU6YMNm3ahK1bt6J169YAPhR95cqVU+hzidWD6LsYP3IgMjIyoKurhzmLVsK6gp3QsUTldeJrZGVlwczMTG67mZkZHjy4L1AqKsr4PUUKyeeyHjNmzICHh4fcto+/z79m7NixuHnzJs6dOye3/ePvfQCoXr06LC0t0bp1a8TExMDOTrHfG4IVbJGRkUhPT5f9Av/8NScnJ1mxBgCNGzdGdnY2oqKiZAVb1apVZQUUAFhYWMhVtOrq6jAzM0NcXJzc8Rs2bCj7WkNDA3Xr1kVkZKTs3A0bNoTkkz7sxo0bIykpCY8fP0b58uUBfCjYPmVpaSk7T0REBJKSknL8g5KamoqYmBjZcxsbG1mx9vkx8mLMmDHo2bMnrl69inbt2sHFxQWNGjWS2+fT3JaWlgCAuLg4VK5cGVlZWVi4cCH+/vtvPHnyBBkZGUhPT4eenp7cMerUqSP3PCIiAv/88w9KlCiRI1NMTAxSU1ORkZGB+vXry7abmprCwcHhq58nPT09RxN0erpiPzTfQznrClgXsBPJyUn4N/gEfpk3C8vW/MmijYhIaPm804G2trbSv2vc3d1x6NAhnD179psNEh9/H0ZHR4u/YNPV1c33MTQ1NeWeSySSXLdlZ2fn+1yKnPvjeZKSkmBpaYnTp0/neJ+xsbFCx8iLDh064NGjRzhy5AhOnDiB1q1bY+zYsVi6dGmu5/xYlH485y+//IJVq1Zh5cqVqF69OvT19TFx4sQcEws+LaSBD5/3Y+vn5ywtLREdnbeB+L6+vvDx8ZHbNnHqTEyaJo4BtJqamihr9aGAr1TZEVGRN7F3xzZMnD5b4GTiYWJsAnV19RyDwePj43N01xMpgt9TJDZSqRTjxo3D3r17cfr0aVSoUOGb7/m4xNbHhhNFCDaGrWLFitDV1cWpU6dyvFalShVERETITYk9f/68rOszvy5duiT7+v379wgLC0OVKlVk57548SKkUqncuQ0MDBTuwqtduzaeP38ODQ0N2Nvbyz2U+QdFS0sLWVlZCu8PAKVKlYKbmxu2bt2KlStX4o8//lD4vefPn0e3bt0wYMAAODk5wdbWFnfv3v3m+2rXro1bt27BxsYmx+fV19eHnZ0dNDU1ERISInvP69evv3nsGTNm4M2bN3KPnyZOVfjzfG9SaTYyMovnrNkv0dTSQhXHqgi59L/JLdnZ2QgJuYgaTrUETEZFFb+nSCHfcR22sWPHYuvWrQgMDISBgQGeP3+O58+fIzU1FcCHnqZ58+YhLCwMDx8+xIEDBzBo0CA0a9YsR2/d1whWsOno6GDatGmYOnUqNm/ejJiYGFy6dAmbNm2Cq6srdHR04Obmhps3b+Kff/7BuHHjMHDgQFl3aH78/vvv2Lt3L+7cuYOxY8fi9evXGDp0KADgp59+wn///Ydx48bhzp072L9/P+bMmQMPDw+57tevadOmDRo2bAgXFxccP34cDx8+xIULFzBz5kyEhoYqnNPGxgYhISF4+PAhXr169c3Wt9mzZ2P//v2Ijo7GrVu3cOjQIVkhqoiKFSvixIkTuHDhAiIjIzFq1Ci8ePHim+8bO3YsEhIS0K9fP1y5cgUxMTE4duwYhgwZgqysLJQoUQLDhg3DlClTEBwcjJs3b2Lw4MHfvJ7a2towNDSUe4ilO3TTmlW4fi0Uz589wYPou9i0ZhUiroaitXMnoaOJzkC3Idiz628c2LcX92NiMH+uN1JTU+HSvYfQ0UQlJSUZd+9E4u6dD8Mznj55jLt3IvH82VOBk4kPv6cUU6y/p77jsh5r167Fmzdv0KJFC1haWsoeO3bsAPCh8eXkyZNo164dKleujMmTJ6Nnz544ePCgUucR9NZUXl5e0NDQwOzZs/H06VNYWlpi9OjR0NPTw7FjxzBhwgT88MMP0NPTQ8+ePbF8+fICOe+iRYuwaNEihIeHw97eHgcOHJC1fJUtWxZHjhzBlClT4OTkBFNTUwwbNgyzZs1S+PgSiQRHjhzBzJkzMWTIELx8+RKlS5dGs2bNlCo4PT094ebmBkdHR6SmpuLBgwe5TiT4SEtLCzNmzMDDhw+hq6uLpk2bYvv27Qqfb9asWbh//z6cnZ2hp6eHkSNHwsXFRTZF+UvKlCmD8+fPY9q0aWjXrh3S09NhbW2N9u3by4qyX375RdZ1amBggMmTJ3/zuGKW+DoBS+bOQkL8S+iXKIEKdpXgu3Id6tRr+O03FzPtO3TE64QErPltNV69egmHylWwZv1GmLH7Sk7krVsYM8JN9nzlsg9DDDp1ccGced+enVac8HtKMcX6e+o73kv00x653FhZWeVYPiwvJNJvnUmFPHz4EBUqVMC1a9dQs2ZNoeNQHsQmKLYODgHmhuJojRS79MyCH+OqirQ1uc66ovg9pRgj3cL7ntLttDpf7089PL6AkhQc/gQSERERiRwLtiJk9OjRKFGiRK4PZW8iS0REpLK+46SD76VYdYkWdXFxcXj79m2urxkaGsLc3Pw7J/r+2CWqOHaJKobdV4phl6ji+D2lmELtEu2yJl/vTz34UwElKTiCTjog5ZibmxeLooyIiChf8rlwrhixYCMiIiLVItJuzfxgwUZERESqRQVb2FSvBCUiIiJSMWxhIyIiItXCLlEiIiIikVPBLlEWbERERKRSJCzYiIiIiMSNBRsRERGR2KlevcZZokRERERixxY2IiIiUinsEiUiIiISORZsRERERCLHgo2IiIhI5FiwEREREYmd6tVrnCVKREREJHZsYSMiIiKVwi5RIiIiIpFjwUYkMIfWk4WOUGQ8OrtC6AhFgqGuptARioQzd18KHaHIGPbbeaEjFAmP17gU2rFZsBERERGJHAs2IiIiIrFTvXqNs0SJiIiIxI4tbERERKRS2CVKREREJHIs2IiIiIhEjgUbERERkdipXr3Ggo2IiIhUiyq2sHGWKBEREZHIsYWNiIiIVIoqtrCxYCMiIiKVwoKNiIiISORYsBERERGJnerVayzYiIiISLWoYgsbZ4kSERERiRxb2IiIiEilqGILGws2IiIiUimqWLCxS5QEY2Njg5UrVwodg4iIVI0knw8RYgubCmrRogVq1qzJYqgAeQ5tB5dWTqhkY4HU9EyERNzHzFX7ce9RHACgvKUpoo7MzfW9rlM2Yc/Ja98zrmhs8duAs/+cxKOHD6CtrYNqNWpizLhJKG9TQehoorU9cBsC/Dbh1auXqORQGdN/9kL1GjWEjiUa2VlZOLrjT1w5cxzvEuNhaFIS9Vt1hPOPbirZqqKosc4V0aFmGdhblEBaZjZC7ydg4d5buB+XJNvHtbE1XH6wQjUrIxjoasJx8mG8Tc0UMHXhUcXvBRZsRApoWtse63acRditR9DQUIePexccWuuOWj3mIyUtA49fvIZNmxly7xnaszEmDWqDY+dvCZRaeOFXQ9H9x36o4lgNWVnvsf73VfBwH4ktO/dDV1dP6HiiE3T0CJYu8cWsOT6oXt0J27YEYMyoYdh/KAhmZmZCxxOFk3u34VzQPgwYPxOly1dAbPQdBP66ELp6+mje+Ueh4wmmoX1JBJx5gIhHr6GuJsH0bo4IHNcILeedQmpGFgBAR0sDp2+/wOnbLzDDparAiQuXKhZsRbJLNDs7G0uWLIG9vT20tbVRvnx5LFiwAABw48YNtGrVCrq6ujAzM8PIkSORlPS/vzAGDx4MFxcXLFy4EBYWFjA2NsbcuXPx/v17TJkyBaampihXrhz8/Pxk73n48CEkEgm2b9+ORo0aQUdHB9WqVcOZM2fkcp05cwb16tWDtrY2LC0tMX36dLx//172eosWLTB+/HhMnToVpqamKF26NLy9veWOkZiYiOHDh6NUqVIwNDREq1atEBERIXvd29sbNWvWxJYtW2BjYwMjIyP07dsX7969k32+M2fOYNWqVZBIJJBIJHj48OFXr6e/vz+MjY3ltu3bt0/uGz4iIgItW7aEgYEBDA0NUadOHYSGhspeP3fuHJo2bQpdXV1YWVlh/PjxSE5Olr0eFxeHLl26QFdXFxUqVMC2bdu+mklsurmvwdaDIYi8/xw37j7ByDlbUd7SFLUcrQAA2dlSvIh/J/fo2tIJu09cRXJqhsDphbPs1/Xo2MUFFezsYV+pMn72XoAXz58hKvK20NFEaUuAH3r06g2X7j1hZ2+PWXN8oKOjg317dgsdTTQe3LmJ6vWaoGrdRjAzt0StRi1RuWY9PLoXKXQ0QQ34/SJ2XorF3WfvEPnkLSZtvopyZnqoUd5Yts+mf2Lw+/F7uPrgtXBBKc+KZME2Y8YMLFq0CF5eXrh9+zYCAwNhYWGB5ORkODs7w8TEBFeuXMHOnTtx8uRJuLu7y70/ODgYT58+xdmzZ7F8+XLMmTMHnTt3homJCUJCQjB69GiMGjUKjx8/lnvflClTMHnyZFy7dg0NGzZEly5dEB8fDwB48uQJOnbsiB9++AERERFYu3YtNm3ahPnz58sdIyAgAPr6+ggJCcGSJUswd+5cnDhxQvb6jz/+iLi4OBw9ehRhYWGoXbs2WrdujYSEBNk+MTEx2LdvHw4dOoRDhw7hzJkzWLRoEQBg1apVaNiwIUaMGIFnz57h2bNnsLKyyvc1d3V1Rbly5XDlyhWEhYVh+vTp0NTUlOVp3749evbsievXr2PHjh04d+6c3HUfPHgw/vvvP/zzzz/YtWsX1qxZg7i4uHznEophCR0AwOs3Kbm+XquKFWpWtkLAvovfM5boJf//H0+GhkYCJxGfzIwMRN6+hQYNG8m2qampoUGDRrgeUTy71HNToXI13L0ehrgnsQCAJw/u4X7kdVSp3UDgZOJiqPvh3+fE5OL5B+PHBou8PsSoyHWJvnv3DqtWrcJvv/0GNzc3AICdnR2aNGmCDRs2IC0tDZs3b4a+vj4A4LfffkOXLl2wePFiWFhYAABMTU2xevVqqKmpwcHBAUuWLEFKSgp+/vlnAP8rCM+dO4e+ffvKzu3u7o6ePXsCANauXYugoCBs2rQJU6dOxZo1a2BlZYXffvsNEokElStXxtOnTzFt2jTMnj0bamofauMaNWpgzpw5AICKFSvit99+w6lTp9C2bVucO3cOly9fRlxcHLS1tQEAS5cuxb59+7Br1y6MHDkSwIcWRn9/fxgYGAAABg4ciFOnTmHBggUwMjKClpYW9PT0ULp06QK77rGxsZgyZQoqV64sy/6Rr68vXF1dMXHiRNlrq1evRvPmzbF27VrExsbi6NGjuHz5Mn744QcAwKZNm1ClSpUCy/c9SSQS/OLZCxeuxeB2zLNc93FzaYjI+89wKeLBd04nXtnZ2Vi9bBGqO9WCrX3Fb7+hmHmd+BpZWVk5uj7NzMzw4MF9gVKJT5seA5CWkowF41whUVODNDsbnVxH4ofm7YSOJhoSCeDdqzouR8cj6tk7oeMIQqxFV34UuRa2yMhIpKeno3Xr1rm+5uTkJCvWAKBx48bIzs5GVFSUbFvVqlVlBRQAWFhYoHr16rLn6urqMDMzy9EC1LBhQ9nXGhoaqFu3LiIjI2Xnbtiwodw3SePGjZGUlCTXUlfjs8HDlpaWsvNEREQgKSkJZmZmKFGihOzx4MEDxMTEyN5jY2MjK9Y+P0Zh8fDwwPDhw9GmTRssWrRILk9ERAT8/f3lMjs7OyM7OxsPHjxAZGQkNDQ0UKdOHdl7KleunKMb9nPp6el4+/at3EOanVVYH1FhK2f0RlV7Swya7pfr6zramujToS5b1z6zfPF8PIiJhvfCX4SOQkXYtfPBCD17AoMmzcHUZX/CdfxMBO/7CyHBR4WOJhoL+jjBoYwhxv55RegowvmOs0R9fX3xww8/wMDAAObm5nBxcZGrOQAgLS0NY8eOlf1+79mzJ168eKHUeYpcwaarq5vvY3zsyvtIIpHkui07Ozvf51Lk3B/Pk5SUBEtLS4SHh8s9oqKiMGXKFIWOkRdqamqQSqVy2zIz5WcOeXt749atW+jUqROCg4Ph6OiIvXv3ynKPGjVKLnNERATu3bsHOzu7POfy9fWFkZGR3OP9i7A8H68grJj2Izo2rQbnEavxJC4x1326t6kJPR0tbDt0+fuGE7EVixfg4rkzWLXuT5hbFFzLryoxMTaBurq6bJjFR/Hx8ShZsqRAqcRnf8AatOnhijpN26CMtR3qtWiPll1748SeLUJHE4X5vWugTXUL9F55Ds8S04SOI5jv2SV65swZjB07FpcuXcKJEyeQmZmJdu3ayY3jnjRpEg4ePIidO3fizJkzePr0KXr06KHUeYpcwVaxYkXo6uri1KlTOV6rUqUKIiIi5C7S+fPnZV2f+XXp0iXZ1+/fv0dYWJisW69KlSq4ePGiXOFz/vx5GBgYoFy5cgodv3bt2nj+/Dk0NDRgb28v91DmH2wtLS1kZSneElWqVCm8e/dO7rqFh4fn2K9SpUqYNGkSjh8/jh49esgmZtSuXRu3b9/Okdne3h5aWlqoXLmy7Hp9FBUVhcTExK/mmjFjBt68eSP30LCo89X3FKYV035E11ZOaD9qNR49jf/ifoNdGuHwmRt49Trpi/sUF1KpFCsWL8DZ06ewcu2fKFNWsZ+F4khTSwtVHKsi5NL/Wmazs7MREnIRNZxqCZhMXDLS0yBRk//VJVFTh7QQ/sAuaub3roH2NS3RZ+V5/Bef+/ja4uJ7FmxBQUEYPHgwqlatCicnJ/j7+yM2Nlb2O+/NmzfYtGkTli9fjlatWqFOnTrw8/PDhQsX5OqKbylyBZuOjg6mTZuGqVOnYvPmzYiJicGlS5ewadMmuLq6QkdHB25ubrh58yb++ecfjBs3DgMHDpSNX8uP33//HXv37sWdO3cwduxYvH79GkOHDgUA/PTTT/jvv/8wbtw43LlzB/v378ecOXPg4eEh1/36NW3atEHDhg3h4uKC48eP4+HDh7hw4QJmzpwpNyPzW2xsbBASEoKHDx/i1atX32x9q1+/PvT09PDzzz8jJiYGgYGB8Pf3l72empoKd3d3nD59Go8ePcL58+dx5coVWbE6bdo0XLhwAe7u7ggPD8e9e/ewf/9+2aQDBwcHtG/fHqNGjUJISAjCwsIwfPjwb7aWamtrw9DQUO4hUVNX+DoUpJUzeqNvpx/g9rM/kpLTYGFmAAszA+hoy7d22lqVRJPadvDbe0GQnGKzfPF8HD96CLPnL4aenj7iX71C/KtXSE8rvn/5f81AtyHYs+tvHNi3F/djYjB/rjdSU1Ph0l25v8RVWbUfGuP4rs24FXoB8XHPEHHpDP45sAM1GjQTOpqgFvStge71rODuF4qk9PcoZaiNUoba0NH83++fUobacCxnBJtSH4YNVS5jCMdyRjDW0/zSYYut3IbkpKenK/TeN2/eAPgwXh4AwsLCkJmZiTZt2sj2qVy5MsqXL4+LFxUfOlPkJh0AgJeXFzQ0NDB79mw8ffoUlpaWGD16NPT09HDs2DFMmDABP/zwA/T09NCzZ08sX768QM67aNEiLFq0COHh4bC3t8eBAwdkLV9ly5bFkSNHMGXKFDg5OcHU1BTDhg3DrFmzFD6+RCLBkSNHMHPmTAwZMgQvX75E6dKl0axZM6UKTk9PT7i5ucHR0RGpqal48OABbGxsvri/qakptm7diilTpmDDhg1o3bo1vL29ZZMcPnbTDBo0CC9evEDJkiXRo0cP+Pj4APgwLu/MmTOYOXMmmjZtCqlUCjs7O/Tp00d2Dj8/PwwfPhzNmzeHhYUF5s+fDy8vL4U/k9BG9f7wy+DExoly20fM3oKtB0Nkz926NcSTF4k4efHO94wnWvt27QAAjB81RG77jDnz0bGLiwCJxK19h454nZCANb+txqtXL+FQuQrWrN8IM3aJyvQaMQmHAzfg7z+WIenNaxialETjdl3RvveQb79Zhbk1swUA7JrUVG77pM1XsfPShxm1A5tWgEenyrLX9kxummMfVZHfOQe+vr6y33EfzZkzJ8dSXJ/Lzs7GxIkT0bhxY1SrVg0A8Pz5c2hpaeUYt21hYYHnz58rnEki/XzwEuXw8OFDVKhQAdeuXUPNmjWFjlOs6dZy//ZOBAB4dHaF0BGKhI/LH9DXnbn7UugIRcaw384LHaFIeLzGpdCOXXFKUL7ef3N+yxwtatra2rIVHL5kzJgxOHr0KM6dOycbDhUYGIghQ4bkOF69evXQsmVLLF68WKFMRbKFjYiIiOhL8tvCpkhx9jl3d3ccOnQIZ8+elRu7Xrp0aWRkZCAxMVGule3FixdKLb9V5MawkfJGjx4tt+TGp4/Ro0cLHY+IiKhAfc9JB1KpFO7u7ti7dy+Cg4NRoYL8vZLr1KkDTU1NucmSUVFRiI2NlVsu7FvYwqYAGxubHMteFCVz586Fp6dnrq8ZGhp+5zRERESF63uumzt27FgEBgZi//79MDAwkI1LMzIygq6uLoyMjDBs2DB4eHjA1NQUhoaGGDduHBo2bIgGDRS/QwcLtmLA3Nwc5ubmQscgIiJSOWvXrgXw4X7hn/Lz88PgwYMBACtWrICamhp69uyJ9PR0ODs7Y82aNUqdhwUbERERqRQ1te/XxKZID5yOjg5+//13/P7773k+Dws2IiIiUikqeCtRFmxERESkWlTx5u8s2IiIiEilqGC9xoKNiIiIVIsqtrBxHTYiIiIikWMLGxEREakUVWxhY8FGREREKkUF6zUWbERERKRa2MJGREREJHIqWK+xYCMiIiLVoootbJwlSkRERCRybGEjIiIilaKCDWws2IiIiEi1qGKXKAs2IiIiUikqWK+xYCMiIiLVwhY2IiIiIpFTwXqNBRsVLY/OrhA6QpGhraEudARSIbZmJYSOUGT8M8dZ6AikgliwERERkUphlygRERGRyKlgvcaCjYiIiFQLW9iIiIiIRE4F6zXemoqIiIhI7NjCRkRERCqFXaJEREREIseCjYiIiEjkVLBeY8FGREREqoUtbEREREQip4L1GmeJEhEREYkdW9iIiIhIpbBLlIiIiEjkVLBeY8FGREREqkVNBSs2FmxERESkUlSwXmPBRkRERKpFFcewcZYoERERkcixhY2IiIhUiprqNbApVrAdOHBA4QN27do1z2G+F39/f0ycOBGJiYmFfq7BgwcjMTER+/btK/RzFTUPHz5EhQoVcO3aNdSsWVPoOEREpCJUsUtUoYLNxcVFoYNJJBJkZWXlJ0+R9aXiY9WqVZBKpcIFo0KxxW8Dzv5zEo8ePoC2tg6q1aiJMeMmobxNBaGjic7VsCvYGvAn7kTewquXL7Fk+a9o0aqN0LFEa3vgNgT4bcKrVy9RyaEypv/sheo1aggdS7R2bv0TAX+sRtde/TFy/FSh44hWcbtOKlivKTaGLTs7W6FHcS3WvsbIyAjGxsaCnT8jI0Owc6uy8Kuh6P5jP6z3C8SK3//A+/eZ8HAfidTUFKGjiU5aaioqVnLAlBleQkcRvaCjR7B0iS9G/TQW23fuhYNDZYwZNQzx8fFCRxOlu5E3EXRgF2zsKgkdRdSK43WS5PM/McrXpIO0tLSCyiEnOzsbvr6+qFChAnR1deHk5IRdu3YhOzsb5cqVw9q1a+X2v3btGtTU1PDo0SMAwPLly1G9enXo6+vDysoKP/30E5KSkr54vsGDB+doRZw4cSJatGghex4UFIQmTZrA2NgYZmZm6Ny5M2JiYmSvV6jwoWWlVq1akEgksvd+fuz09HSMHz8e5ubm0NHRQZMmTXDlyhXZ66dPn4ZEIsGpU6dQt25d6OnpoVGjRoiKilLo2nl7e6NmzZrYuHEjKlSoAB0dHQBAYmIihg8fjlKlSsHQ0BCtWrVCRESEUtdg165dqF69OnR1dWFmZoY2bdogOTlZ9vrGjRtRpUoV6OjooHLlylizZo3c8S5fvoxatWpBR0cHdevWxbVr1xT6TGK07Nf16NjFBRXs7GFfqTJ+9l6AF8+fISryttDRRKdRk2YY4z4RLVu1FTqK6G0J8EOPXr3h0r0n7OztMWuOD3R0dLBvz26ho4lOakoKls77GeOmzkYJAwOh44hWcb1OapL8PcRI6YItKysL8+bNQ9myZVGiRAncv38fAODl5YVNmzYVSChfX19s3rwZ69atw61btzBp0iQMGDAA//77L/r164fAwEC5/bdt24bGjRvD2toaAKCmpobVq1fj1q1bCAgIQHBwMKZOzV8TcHJyMjw8PBAaGopTp05BTU0N3bt3R3Z2NoAPxQgAnDx5Es+ePcOePXtyPc7UqVOxe/duBAQE4OrVq7C3t4ezszMSEhLk9ps5cyaWLVuG0NBQaGhoYOjQoQpnjY6Oxu7du7Fnzx6Eh4cDAH788UfExcXh6NGjCAsLQ+3atdG6desc5/2SZ8+eoV+/fhg6dCgiIyNx+vRp9OjRQ9bdu23bNsyePRsLFixAZGQkFi5cCC8vLwQEBAAAkpKS0LlzZzg6OiIsLAze3t7w9PRU+DOJXfL//0FgaGgkcBIqqjIzMhB5+xYaNGwk26ampoYGDRrhekTR/eOmsKxdsRA/NGyKmnUbCB1F1HidVIfSs0QXLFiAgIAALFmyBCNGjJBtr1atGlauXIlhw4blK1B6ejoWLlyIkydPomHDhgAAW1tbnDt3DuvXr8fUqVOxbNkyxMbGonz58sjOzsb27dsxa9Ys2TEmTpwo+9rGxgbz58/H6NGjc7T4KKNnz55yz//880+UKlUKt2/fRrVq1VCqVCkAgJmZGUqXLp3rMZKTk7F27Vr4+/ujQ4cOAIANGzbgxIkT2LRpE6ZMmSLbd8GCBWjevDkAYPr06ejUqRPS0tJkLWZfk5GRgc2bN8synTt3DpcvX0ZcXBy0tbUBAEuXLsW+ffuwa9cujBw58pvHfPbsGd6/f48ePXrICuPq1avLXp8zZw6WLVuGHj16APjQ4nj79m2sX78ebm5uCAwMRHZ2NjZt2gQdHR1UrVoVjx8/xpgxY755brHLzs7G6mWLUN2pFmztKwodh4qo14mvkZWVBTMzM7ntZmZmePDgvkCpxOnMqSDE3L2DFX9sEzqKqBXn61RsJx18avPmzfjjjz/QunVrjB49WrbdyckJd+7cyXeg6OhopKSkoG1b+e6TjIwM1KpVCzVr1kSVKlUQGBiI6dOn48yZM4iLi8OPP/4o2/fkyZPw9fXFnTt38PbtW7x//x5paWlISUmBnp5ennLdu3cPs2fPRkhICF69eiVrWYuNjUW1atUUOkZMTAwyMzPRuHFj2TZNTU3Uq1cPkZGRcvvW+GSQsaWlJQAgLi4O5cuX/+Z5rK2tZcUaAERERCApKSnHL4LU1FS5bt2vcXJyQuvWrVG9enU4OzujXbt26NWrF0xMTJCcnIyYmBgMGzZMroh///49jIw+tDhFRkaiRo0acgXnx4L8S9LT05Geni6/LUNNVnSKxfLF8/EgJhq/b9wsdBQilffyxXNsWL0E85avg5bI/i0Qk+J+nVSwXlO+YHvy5Ans7e1zbM/OzkZmZma+A30ca3b48GGULVtW7rWPv6hdXV1lBVtgYCDat28vK0YePnyIzp07Y8yYMViwYAFMTU1x7tw5DBs2DBkZGbkWbGpqajlmcn7+Wbp06QJra2ts2LABZcqUQXZ2NqpVq1Zog/o1NTVlX3/8S+Fjkfgt+vr6cs+TkpJgaWmJ06dP59j344SIb10DdXV1nDhxAhcuXMDx48fx66+/YubMmQgJCZFd0w0bNqB+/fpyx1BXV1coc258fX3h4+Mjt81z+ixM+Xl2no9Z0FYsXoCL587g1z8CYG6Re8sqkSJMjE2grq6eY4JBfHw8SpYsKVAq8Ym+exuJrxMwYXg/2bbsrCzciriKQ3t3YO/Jy/n6d0dVFPfrxHuJAnB0dMS///4r6xb7aNeuXahVq1a+Azk6OkJbWxuxsbGyLsHP9e/fH7NmzUJYWBh27dqFdevWyV4LCwtDdnY2li1bBjW1D0P0/v7776+es1SpUrh586bctvDwcFnRFB8fj6ioKGzYsAFNmzYF8KGb8VNaWloA8NWZsnZ2dtDS0sL58+dl1y8zMxNXrlyR68YtaLVr18bz58+hoaEBGxubXPf51jUAPhSOjRs3RuPGjTF79mxYW1tj79698PDwQJkyZXD//n24urrmevwqVapgy5Ytct26ly5d+mruGTNmwMPDQ27bmwxx3JxDKpVi5ZKFOHv6FFav90OZsuWEjkRFnKaWFqo4VkXIpYto1frDsifZ2dkICbmIvv0GCJxOPJzq1Mdv/rvktq1aNBvlyldAz/5DVLoIUUZxv04qWK8pX7DNnj0bbm5uePLkCbKzs7Fnzx5ERUVh8+bNOHToUL4DGRgYwNPTE5MmTUJ2djaaNGmCN2/e4Pz58zA0NISbmxtsbGzQqFEjDBs2DFlZWXKL9drb2yMzMxO//vorunTpgvPnz8sVdLlp1aoVfvnlF2zevBkNGzbE1q1bcfPmTVkBamJiAjMzM/zxxx+wtLREbGwspk+fLncMc3Nz6OrqIigoCOXKlYOOjo6sO/AjfX19jBkzBlOmTIGpqSnKly+PJUuWICUlJd9j/76mTZs2aNiwIVxcXLBkyRJUqlQJT58+xeHDh9G9e3fUrVv3m9cgJCQEp06dQrt27WBubo6QkBC8fPkSVapUAQD4+Phg/PjxMDIyQvv27ZGeno7Q0FC8fv0aHh4e6N+/P2bOnIkRI0ZgxowZePjwIZYuXfrV3Nra2jm6P9Pe5b8VtyAsXzwfJ4OOYOGy1dDT00f8q1cAgBIlSkBbgXGGxUlKSjIex8bKnj998hh370TC0MgIpS3LCJhMfAa6DYHXz9NQtWo1VKteA1u3BCA1NRUu3XsIHU009PT0YWMr38ujraMLA0OjHNuLs+J+nVRxDJvSzRXdunXDwYMHcfLkSejr62P27NmIjIzEwYMHc4w7y6t58+bBy8sLvr6+qFKlCtq3b4/Dhw/Lls4APnSLRkREoHv37tDV1ZVtd3JywvLly7F48WJUq1YN27Ztg6+v71fP5+zsDC8vL0ydOhU//PAD3r17h0GDBsleV1NTw/bt2xEWFoZq1aph0qRJ+OWXX+SOoaGhgdWrV2P9+vUoU6YMunXrluu5Fi1ahJ49e2LgwIGoXbs2oqOjcezYMZiYmOTlUilEIpHgyJEjaNasGYYMGYJKlSqhb9++ePToESwsLBS6BoaGhjh79iw6duyISpUqYdasWVi2bJls8sTw4cOxceNG+Pn5oXr16mjevDn8/f1l/89KlCiBgwcP4saNG6hVqxZmzpyJxYsXF9pnLmz7du1AUtI7jB81BC7tW8gep04ECR1NdCJv3cKAvj0woO+HomPlssUY0LcH1q/5VeBk4tO+Q0d4eE7Dmt9Wo3fPboi6E4k16zfCjF2iRMWeRMpl+KkIiRNJC1tRoK2h2l0eBUVbUxzd7GL3X3yq0BFIxVS00P32Tnn0o//VfL1/5+DaCu979uxZ/PLLLwgLC8OzZ8+wd+9euXVNBw8eLFvi6iNnZ2cEBSn3B36eb/4eGhoqm9no6OiIOnXq5PVQRERERAXme046SE5OhpOTE4YOHSpb2upz7du3h5+fn+x5XlY7ULpge/z4Mfr164fz58/LZhgmJiaiUaNG2L59O8qV4+DrwlS1alXZHR0+t379+i8O+iciIiouvucItg4dOsiGB32Jtrb2F9doVZTSBdvw4cORmZmJyMhIODg4AACioqIwZMgQDB8+XOkmPlLOkSNHvrh8ysfxaERERMVZficd5LYOaG4T4RR1+vRpmJubw8TEBK1atcL8+fNzrI36LUqPYdPV1cWFCxdyLOERFhaGpk2bIiWFN7+mwsMxbIrjGDbFcAybYjiGjQpaYY5hc90Snq/3V4zZl2Md0Dlz5sDb2/ur75NIJDnGsG3fvh16enqoUKECYmJi8PPPP6NEiRK4ePGiUsurKN3CZmVllWsLT1ZWFsqU4RR9IiIiKtpyWwc0r61rffv2lX1dvXp11KhRA3Z2djh9+jRat26t8HGU/tPyl19+wbhx4xAaGirbFhoaigkTJnxzXS0iIiKiwiaRSPL10NbWhqGhodyjoG6LaGtri5IlSyI6Olqp9ynUwmZiYiLXH5ycnIz69etDQ+PD29+/fw8NDQ0MHTpUrhmQiIiI6HsT87q5jx8/Rnx8vOw+4YpSqGBbuXJlXjIRERERfXff804HSUlJcq1lDx48QHh4OExNTWFqagofHx/07NkTpUuXRkxMDKZOnQp7e3s4OzsrdR6FCjY3Nzfl0hMREREJRO07trCFhoaiZcuWsucfx765ublh7dq1uH79OgICApCYmIgyZcqgXbt2mDdvntJdrHleOBcA0tLSkJGRIbfN0NAwP4ckIiIiypfv2cLWokULfG3BjWPHjhXIeZSedJCcnAx3d3eYm5tDX18fJiYmcg8iIiIiKlhKF2xTp05FcHAw1q5dC21tbWzcuBE+Pj4oU6YMNm/eXBgZiYiIiBQmyedDjJTuEj148CA2b96MFi1aYMiQIWjatCns7e1hbW2Nbdu28dZIREREJKjveS/R70XpFraEhATY2toC+DBeLSEhAQDQpEkTnD17tmDTERERESlJIsnfQ4yULthsbW3x4MEDAEDlypXx999/A/jQ8vbxZvBEREREQsnvwrlipHTBNmTIEERERAAApk+fjt9//x06OjqYNGkSpkyZUuABiYiIiJShii1sSo9hmzRpkuzrNm3a4M6dOwgLC4O9vT1q1KhRoOGIiIiIKJ/rsAGAtbU1rK2tCyILERERUb6p4qQDhQq21atXK3zA8ePH5zkMERERUX6pYL2mWMG2YsUKhQ4mkUhYsBEREZGgxDpxID8UKtg+zgolEpqhrqbQEYiKJXND5e57SCQkpWdUFgH5HsNGREREJCaq2MKmikUoERERkUphCxsRERGpFDXVa2BjwUZERESqhQUbERERkchxDNv/+/fffzFgwAA0bNgQT548AQBs2bIF586dK9BwRERERMpSk+TvIUZKF2y7d++Gs7MzdHV1ce3aNaSnpwMA3rx5g4ULFxZ4QCIiIiJlqOK9RJUu2ObPn49169Zhw4YN0NT835pYjRs3xtWrVws0HBERERHlYQxbVFQUmjVrlmO7kZEREhMTCyITERERUZ6p4r1ElW5hK126NKKjo3NsP3fuHGxtbQskFBEREVFeqeXzIUZK5xoxYgQmTJiAkJAQSCQSPH36FNu2bYOnpyfGjBlTGBmJiIiIFKaKY9iU7hKdPn06srOz0bp1a6SkpKBZs2bQ1taGp6cnxo0bVxgZiYiIiBSmil2iEqlUKs3LGzMyMhAdHY2kpCQ4OjqiRIkSBZ2NKIe090InICqe0jOzhY5AKsZIt/A6H2cfu5ev9891rlhASQpOnhfO1dLSgqOjY0FmISIiIqJcKF2wtWzZ8qsrCAcHB+crEBEREVF+iHXx2/xQumCrWbOm3PPMzEyEh4fj5s2bcHNzK6hcRERERHmiimPYlC7YVqxYket2b29vJCUl5TsQERERUX6oYL1WcMuNDBgwAH/++WdBHY6IiIgoT3gv0a+4ePEidHR0CupwxUqLFi0wceLEAj+uv78/jI2NC/y4REREYibJ539ipHSXaI8ePeSeS6VSPHv2DKGhofDy8iqwYMXJnj175O7Lqur8/f0xceJElbiV2fbAbQjw24RXr16ikkNlTP/ZC9Vr1BA6lujwOimO1+rbroZdwdaAP3En8hZevXyJJct/RYtWbYSOJTq8TqpF6RY2IyMjuYepqSlatGiBI0eOYM6cOYWRUeWZmprCwMAg19cyMjJybMvKykJ2NtdEElrQ0SNYusQXo34ai+0798LBoTLGjBqG+Ph4oaOJCq+T4nitFJOWmoqKlRwwZQYbCb6mOF+nYt8lmpWVhSFDhmD58uXw8/ODn58fNm3ahEWLFqFdu3aFlVHlfdolamNjg3nz5mHQoEEwNDTEyJEjZV2bBw4cgKOjI7S1tREbG4v09HR4enqibNmy0NfXR/369XH69Omvnmv//v2oXbs2dHR0YGtrCx8fH7x//2E12v79+6NPnz5y+2dmZqJkyZLYvHkzACAoKAhNmjSBsbExzMzM0LlzZ8TExMj2f/jwISQSCfbs2YOWLVtCT08PTk5OuHjxIgDg9OnTGDJkCN68eQOJRAKJRAJvb++CuZDf2ZYAP/To1Rsu3XvCzt4es+b4QEdHB/v27BY6mqjwOimO10oxjZo0wxj3iWjZqq3QUUStOF+nYl+wqauro127dirRlSVmS5cuhZOTE65duybrZk5JScHixYuxceNG3Lp1C+bm5nB3d8fFixexfft2XL9+HT/++CPat2+Pe/dyX+H533//xaBBgzBhwgTcvn0b69evh7+/PxYsWAAAcHV1xcGDB+Vm+x47dgwpKSno3r07ACA5ORkeHh4IDQ3FqVOnoKamhu7du+do8Zs5cyY8PT0RHh6OSpUqoV+/fnj//j0aNWqElStXwtDQEM+ePcOzZ8/g6elZGJexUGVmZCDy9i00aNhItk1NTQ0NGjTC9YhrAiYTF14nxfFaERWcjw0CeX2IkdJdotWqVcP9+/cLIwv9v1atWmHy5Mmws7ODnZ0dgA8tXWvWrEGjRo3g4OCAV69ewc/PDzt37kTTpk1hZ2cHT09PNGnSBH5+frke18fHB9OnT4ebmxtsbW3Rtm1bzJs3D+vXrwcAODs7Q19fH3v37pW9JzAwEF27dpV12fbs2RM9evSAvb09atasiT///BM3btzA7du35c7l6emJTp06oVKlSvDx8cGjR48QHR0NLS0tGBkZQSKRoHTp0ihdunSRvK3Z68TXyMrKgpmZmdx2MzMzvHr1SqBU4sPrpDheK6KCo4otbEpPOpg/fz48PT0xb9481KlTB/r6+nKvGxoaFli44qpu3bo5tmlpaaHGJwOPb9y4gaysLFSqVEluv/T09Bz/4H8UERGB8+fPy1rUgA/d3GlpaUhJSYGenh569+6Nbdu2YeDAgUhOTsb+/fuxfft22f737t3D7NmzERISglevXsla1mJjY1GtWjXZfp9mtbS0BADExcWhcuXKCl+H9PR0pKeny22TqmtDW1tb4WMQEVHxI9JGsnxRuGCbO3cuJk+ejI4dOwIAunbtKtdsKJVKIZFIkJWVVfApi5nPi2AA0NXVlbveSUlJUFdXR1hYGNTV1eX2/VKLVVJSEnx8fHLM9AUgW5LF1dUVzZs3R1xcHE6cOAFdXV20b99etl+XLl1gbW2NDRs2oEyZMsjOzka1atVyTI74dNbrx9zKTpTw9fWFj4+P3LaZXnMwa7a3UscpDCbGJlBXV88xGDw+Ph4lS5YUKJX48DopjteKiL5G4YLNx8cHo0ePxj///FOYeUhBtWrVQlZWFuLi4tC0aVOF3lO7dm1ERUXB3t7+i/s0atQIVlZW2LFjB44ePYoff/xRVnzFx8cjKioKGzZskJ3z3LlzSmfX0tJSqLCfMWMGPDw85LZJ1cXRuqappYUqjlURcukiWrX+ME0+OzsbISEX0bffAIHTiQevk+J4rYgKTrG+NZVUKgUANG/evNDCkOIqVaoEV1dXDBo0CMuWLUOtWrXw8uVLnDp1CjVq1ECnTp1yvGf27Nno3Lkzypcvj169ekFNTQ0RERG4efMm5s+fL9uvf//+WLduHe7evStXoJuYmMDMzAx//PEHLC0tERsbi+nTpyud3cbGBklJSTh16hScnJygp6cHPT29HPtpa+fs/kx7r/TpCs1AtyHw+nkaqlathmrVa2DrlgCkpqbCpXvOFszijNdJcbxWiklJScbj2FjZ86dPHuPunUgYGhmhtGUZAZOJS3G+TmIdh5YfSo1hE+vMieLKz88P8+fPx+TJk/HkyROULFkSDRo0QOfOnXPd39nZGYcOHcLcuXOxePFiaGpqonLlyhg+fLjcfq6urliwYAGsra3RuHFj2XY1NTVs374d48ePR7Vq1eDg4IDVq1ejRYsWSuVu1KgRRo8ejT59+iA+Ph5z5swpkkt7tO/QEa8TErDmt9V49eolHCpXwZr1G2HG7is5vE6K47VSTOStWxgzwk32fOWyxQCATl1cMGeer1CxRKc4XydVLFck0o9NZ9+gpqYmm933NQkJCQUSjCg3YmphIypO0jO5WDcVLCPdArs7Zg6/n3+Yr/ePbWxTIDkKklItbD4+PjAyMiqsLERERESUC6UKtr59+8Lc3LywshARERHlmyp2iSpcsHH8GhERERUFxXrSgYJD3YiIiIgEVayX9VB20VMiIiIiIahgvab8vUSJiIiIxExNIsnXQxlnz55Fly5dUKZMGUgkEuzbt0/udalUitmzZ8PS0hK6urpo06YN7t27p/xnUvodRERERAQASE5OhpOTE37//fdcX1+yZAlWr16NdevWISQkBPr6+nB2dkZaWppS51H65u9EREREYvY9u0Q7dOiADh065PqaVCrFypUrMWvWLHTr1g0AsHnzZlhYWGDfvn3o27evwudhCxsRERGpFLV8PtLT0/H27Vu5R3p6utI5Hjx4gOfPn6NNmzaybUZGRqhfvz4uXryo9GciIiIiUhkSiSRfD19fXxgZGck9fH2Vv53X8+fPAQAWFhZy2y0sLGSvKYpdokRERKRS8tsjOmPGDHh4eMht09bWzudR84cFGxEREamU/K7Dpq2tXSAFWunSpQEAL168gKWlpWz7ixcvULNmTaWOxS5RIiIiokJQoUIFlC5dGqdOnZJte/v2LUJCQtCwYUOljsUWNiIiIlIp33Pd3KSkJERHR8ueP3jwAOHh4TA1NUX58uUxceJEzJ8/HxUrVkSFChXg5eWFMmXKwMXFRanzsGAjIiIilfI9l/UIDQ1Fy5YtZc8/jn1zc3ODv78/pk6diuTkZIwcORKJiYlo0qQJgoKCoKOjo9R5JFLeJJSKkLT3QicgKp7SM3l7QipYRrqFNyrrr2tP8vX+frXKFlCSgsMWNiIiIlIpqjhAnwUbERERqRSJCt79XRWLUCIiIiKVwhY2IiIiUimq177Ggo2IiIhUjCp2ibJgoyIl7q3yN98trswNhb2NSlHB2Y9EqkcVx3uxYCMiIiKVwhY2IiIiIpFTvXJNNVsNiYiIiFQKW9iIiIhIpahgjygLNiIiIlItairYKcqCjYiIiFQKW9iIiIiIRE7CFjYiIiIicVPFFjbOEiUiIiISObawERERkUrhpAMiIiIikVPFLlEWbERERKRSWLARERERiRxniRIRERGJnJrq1WucJUpEREQkdmxhIyIiIpXCLlEiIiIikVPFSQfsEs2DwYMHw8XFRegYgmrRogUmTpwodAwiIqIcJPn8T4wkUqlUKnSIoubNmzeQSqUwNjYWOopgEhISoKmpCQMDg+963tiE9O96vi85uGcHDu75Gy+ePQUAWNvaYcDQUajXsKnAyf7H3FBb6Agy2wO3IcBvE169eolKDpUx/WcvVK9RQ+hYAID0zGyhIwAAroZdwdaAP3En8hZevXyJJct/RYtWbYSOJUq8VooR+3Uy0i28NqOzdxPy9f5mlUwLKEnBKVYtbBkZGQVyHCMjI5Uu1hS5Tqampt+9WBOTkqUsMOynifjdfzt+9/sLNevUw5ypE/DwfrTQ0UQn6OgRLF3ii1E/jcX2nXvh4FAZY0YNQ3x8vNDRRCUtNRUVKzlgygwvoaOIHq+VYorzdVLFFrYiXbC1aNEC7u7ucHd3h5GREUqWLAkvLy98bDS0sbHBvHnzMGjQIBgaGmLkyJEAgHPnzqFp06bQ1dWFlZUVxo8fj+TkZADAzz//jPr16+c4l5OTE+bOnQsgZ5doeno6xo8fD3Nzc+jo6KBJkya4cuWK7HV/f/8cBd6+ffsg+aSTPSIiAi1btoSBgQEMDQ1Rp04dhIaGfvXzv337Frq6ujh69Kjc9r1798LAwAApKSkAgP/++w+9e/eGsbExTE1N0a1bNzx8+FC2/8fPs2DBApQpUwYODg4AgDVr1qBixYrQ0dGBhYUFevXqJXftP+0Sff36NQYNGgQTExPo6emhQ4cOuHfvXo5rcOzYMVSpUgUlSpRA+/bt8ezZs69+RrFq2LQF6jdqinJW1ihX3gZDR4+Hrq4eIm9eFzqa6GwJ8EOPXr3h0r0n7OztMWuOD3R0dLBvz26ho4lKoybNMMZ9Ilq2ait0FNHjtVIMr5NqKdIFGwAEBARAQ0MDly9fxqpVq7B8+XJs3LhR9vrSpUvh5OSEa9euwcvLCzExMWjfvj169uyJ69evY8eOHTh37hzc3d0BAK6urrh8+TJiYmJkx7h16xauX7+O/v3755ph6tSp2L17NwICAnD16lXY29vD2dkZCQmKN8m6urqiXLlyuHLlCsLCwjB9+nRoamp+9T2Ghobo3LkzAgMD5bZv27YNLi4u0NPTQ2ZmJpydnWFgYIB///0X58+flxVLn7aknTp1ClFRUThx4gQOHTqE0NBQjB8/HnPnzkVUVBSCgoLQrFmzL2YZPHgwQkNDceDAAVy8eBFSqRQdO3ZEZmambJ+UlBQsXboUW7ZswdmzZxEbGwtPT0+Fr5FYZWVl4Z8TR5GWlgrH6k5CxxGVzIwMRN6+hQYNG8m2qampoUGDRrgecU3AZESkyiSS/D3EqMjPErWyssKKFSsgkUjg4OCAGzduYMWKFRgxYgQAoFWrVpg8ebJs/+HDh8PV1VXWOlSxYkWsXr0azZs3x9q1a1G1alU4OTkhMDAQXl4fmpG3bduG+vXrw97ePsf5k5OTsXbtWvj7+6NDhw4AgA0bNuDEiRPYtGkTpkyZotDniI2NxZQpU1C5cmVZLkW4urpi4MCBSElJgZ6eHt6+fYvDhw9j7969AIAdO3YgOzsbGzdulLXo+fn5wdjYGKdPn0a7du0AAPr6+ti4cSO0tLQAAHv27IG+vj46d+4MAwMDWFtbo1atWrlmuHfvHg4cOIDz58+jUaNGsmtmZWWFffv24ccffwQAZGZmYt26dbCzswMAuLu7y1oti6IH0XcxfuRAZGRkQFdXD3MWrYR1BTuhY4nK68TXyMrKgpmZmdx2MzMzPHhwX6BURKTqRFpz5UuRb2Fr0KCBXNdiw4YNce/ePWRlZQEA6tatK7d/REQE/P39UaJECdnD2dkZ2dnZePDgAYAPRdDHViupVIq//voLrq6uuZ4/JiYGmZmZaNy4sWybpqYm6tWrh8jISIU/h4eHB4YPH442bdpg0aJFci18X9OxY0doamriwIEDAIDdu3fD0NAQbdq0kX3e6OhoGBgYyD6vqakp0tLS5M5RvXp1WbEGAG3btoW1tTVsbW0xcOBAbNu2TdbF+rnIyEhoaGjIdSWbmZnBwcFB7hro6enJijUAsLS0RFxc3Bc/W3p6Ot6+fSv3SE8Xx6QDAChnXQHrAnbi143b0KV7b/wybxYePVDs/xsRERUeNYkkXw8xKvIF27fo6+vLPU9KSsKoUaMQHh4ue0RERODevXuyYqJfv36IiorC1atXceHCBfz333/o06dPnjOoqanh88m4n3YVAoC3tzdu3bqFTp06ITg4GI6OjrJWsq/R0tJCr169ZAVmYGAg+vTpAw0NDdnnrVOnjtznDQ8Px927d+W6eD+/TgYGBrh69Sr++usvWFpaYvbs2XByckJiYmJeLgEA5OjilUgkOa7Lp3x9fWFkZCT3WLNySZ7PX9A0NTVR1qo8KlV2xLCfJsDWvhL27tgmdCxRMTE2gbq6eo4JBvHx8ShZsqRAqYhI1Uny+RCjIl+whYSEyD2/dOkSKlasCHV19Vz3r127Nm7fvg17e/scj48tTOXKlUPz5s2xbds2bNu2DW3btoW5uXmux7Ozs4OWlhbOnz8v25aZmYkrV67A0dERAFCqVCm8e/dONrEBAMLDw3Mcq1KlSpg0aRKOHz+OHj16wM/PT6Fr4OrqiqCgINy6dQvBwcFyrYG1a9fGvXv3YG5unuPzGhkZffW4GhoaaNOmDZYsWYLr16/j4cOHCA4OzrFflSpV8P79e7n/F/Hx8YiKipJdg7yYMWMG3rx5I/f4aeLUPB+vsEml2cjILJiZyKpCU0sLVRyrIuTSRdm27OxshIRcRA2n3LvYiYjyTQUrtiJfsMXGxsLDwwNRUVH466+/8Ouvv2LChAlf3H/atGm4cOEC3N3dER4ejnv37mH//v2ySQcfubq6Yvv27di5c+cXu0OBDy1TY8aMwZQpUxAUFITbt29jxIgRSElJwbBhwwAA9evXh56eHn7++WfExMQgMDAQ/v7+smOkpqbC3d0dp0+fxqNHj3D+/HlcuXIFVapUUegaNGvWDKVLl4arqysqVKgg1zXp6uqKkiVLolu3bvj333/x4MEDnD59GuPHj8fjx4+/eMxDhw5h9erVCA8Px6NHj7B582ZkZ2fLZpB+qmLFiujWrRtGjBiBc+fOISIiAgMGDEDZsmXRrVs3hT5DbrS1tWFoaCj30NYWx9pim9aswvVroXj+7AkeRN/FpjWrEHE1FK2dOwkdTXQGug3Bnl1/48C+vbgfE4P5c72RmpoKl+49hI4mKikpybh7JxJ373wYRvD0yWPcvROJ5/+/1h/9D6+VYnidVEuRn3QwaNAgpKamol69elBXV8eECRNky3fkpkaNGjhz5gxmzpyJpk2bQiqVws7OLkeXZ69eveDu7g51dfVv3tVg0aJFyM7OxsCBA/Hu3TvUrVsXx44dg4mJCYAPa5Zt3boVU6ZMwYYNG9C6dWt4e3vLcn7sMho0aBBevHiBkiVLokePHvDx8VHoGkgkEvTr1w9LlizB7Nmz5V7T09PD2bNnMW3aNPTo0QPv3r1D2bJl0bp1axgaGn7xmMbGxtizZw+8vb2RlpaGihUr4q+//kLVqlVz3d/Pzw8TJkxA586dkZGRgWbNmuHIkSPfnOlaVCW+TsCSubOQEP8S+iVKoIJdJfiuXIc69RoKHU102nfoiNcJCVjz22q8evUSDpWrYM36jTBjl6icyFu3MGaEm+z5ymWLAQCdurhgzjxfoWKJEq+VYorzdRLrWmr5UaTvdNCiRQvUrFkTK1euFDoKfSdiudNBUSCmOx2ImVjudEBU3BTmnQ4u33+Tr/fXs/36kCEhFPkWNiIiIqJPqV77mgqMYVN1HTp0kFuC5NPHwoULhY5HREQkPio46aBId4kWB0+ePEFqamqur5mamsLUVHw3qC1M7BJVHLtEFcMuUSJhFGaXaOiDt/l6f90KXx7jLRR2iYpc2bJlhY5AREREAmPBRkRERCpFpDcryBcWbERERKRSVLBeY8FGREREKkYFKzYWbERERKRSVHHhXBZsREREpFJUcQwb12EjIiIiEjm2sBEREZFKUcEGNrawERERkYr5jnc68Pb2hkQikXtUrly5gD7I/7CFjYiIiFTK9550ULVqVZw8eVL2XEOj4MsrFmxERESkUr73pAMNDQ2ULl26UM/BLlEiIiJSKfntEU1PT8fbt2/lHunpX76X9b1791CmTBnY2trC1dUVsbGxBf6ZWLARERERfcLX1xdGRkZyD19f31z3rV+/Pvz9/REUFIS1a9fiwYMHaNq0Kd69e1egmSRSqVRaoEckKkSxCV/+C4fkmRtqCx2hSEjPzBY6AlGxZKRbeG1GN58k5ev9FUtq5mhR09bWhrb2t/9dTUxMhLW1NZYvX45hw4blK8enOIaNiIiIVEp+Jx0oWpzlxtjYGJUqVUJ0dHS+MnyOXaJERESkUiSS/D3yIykpCTExMbC0tCyYD/P/WLARERGRSvmOy7DB09MTZ86cwcOHD3HhwgV0794d6urq6NevX8F8mP/HLlEiIiJSLd9xWY/Hjx+jX79+iI+PR6lSpdCkSRNcunQJpUqVKtDzcNIBFSn3XqQKHaHIMNLj32OKMNTVFDpCkfBfPH/2FPU2NVPoCEVCHRvDQjt25LPkfL2/iqV+ASUpOPwXnYiIiFTK977TwffAgo2IiIhUyve+08H3wIKNiIiIVIoK1mss2IiIiEjFqGDFxmU9iIiIiESOLWxERESkUjjpgIiIiEjkOOmAiIiISORUsF5jwUZEREQqRgUrNhZsREREpFJUcQwbZ4kSERERiRxb2IiIiEilcNIBERERkcipYL3Ggo2IiIhUjApWbCzYiIiISKWo4qQDFmxERESkUlRxDBtniRIRERGJHFvYiIiISKWoYAMbW9hUibe3N2rWrPldztWiRQtMnDjxu5yLiIhIGRJJ/h5ixIKNvur06dOQSCRITEyU275nzx7MmzdPmFAitHPrn+jcrCb+WL1E6CiissVvA0YM6oN2zeqhS9tmmDF5PGIfPhA6lqhtD9yGDm1b4Yda1eHa90fcuH5d6Eiixp+9r0t4FYffF3thZK82cOvSBNNG9cX9u7eFjvUdSPL5EB8WbErKyMgQOoIomJqawsDAQOgYonA38iaCDuyCjV0loaOITvjVUHT/sR/W+wVixe9/4P37THi4j0RqaorQ0UQp6OgRLF3ii1E/jcX2nXvh4FAZY0YNQ3x8vNDRRIk/e1+X9O4tvD2GQ11dA1Pnr8IvG3bAdeRE6JcwFDpaoWMLWzHUokULuLu7Y+LEiShZsiScnZ1x8+ZNdOjQASVKlICFhQUGDhyIV69effU46enp8PT0RNmyZaGvr4/69evj9OnTAIC3b99CV1cXR48elXvP3r17YWBggJSUD7/cpk2bhkqVKkFPTw+2trbw8vJCZmbmV7N/3m3p4uKCwYMHy55v2bIFdevWhYGBAUqXLo3+/fsjLi4OAPDw4UO0bNkSAGBiYgKJRCJ77+fHfv36NQYNGgQTExPo6emhQ4cOuHfvnux1f39/GBsb49ixY6hSpQpKlCiB9u3b49mzZ1+9bmKXmpKCpfN+xrips1GCBWwOy35dj45dXFDBzh72lSrjZ+8FePH8GaIii8Nf+MrbEuCHHr16w6V7T9jZ22PWHB/o6Ohg357dQkcTHf7sfdvBvwNgVtICoz3nwL5yVZiXLosadRrAokw5oaMVOtVrX2PBppCAgABoaWnh/PnzWLRoEVq1aoVatWohNDQUQUFBePHiBXr37v3VY7i7u+PixYvYvn07rl+/jh9//BHt27fHvXv3YGhoiM6dOyMwMFDuPdu2bYOLiwv09PQAAAYGBvD398ft27exatUqbNiwAStWrMjXZ8vMzMS8efMQERGBffv24eHDh7KizMrKCrt3f/hFERUVhWfPnmHVqlW5Hmfw4MEIDQ3FgQMHcPHiRUilUnTs2FGuoExJScHSpUuxZcsWnD17FrGxsfD09MxXfqGtXbEQPzRsipp1GwgdpUhITkoCABgaGgmcRHwyMzIQefsWGjRsJNumpqaGBg0a4XrENQGTiRN/9r7t6qV/YVupClbOn47Rvdthxk+uCD6yV+hYlEecJaqAihUrYsmSD+Mj5s+fj1q1amHhwoWy1//8809YWVnh7t27qFQpZ9N8bGws/Pz8EBsbizJlygAAPD09ERQUBD8/PyxcuBCurq4YOHAgUlJSoKenh7dv3+Lw4cPYu/d/P1yzZs2SfW1jYwNPT09s374dU6dOzfNnGzp0qOxrW1tbrF69Gj/88AOSkpJQokQJmJqaAgDMzc1hbGyc6zHu3buHAwcO4Pz582jU6MMvm23btsHKygr79u3Djz/+COBDcbhu3TrY2dkB+FDEzp07N8/ZhXbmVBBi7t7Bij+2CR2lSMjOzsbqZYtQ3akWbO0rCh1HdF4nvkZWVhbMzMzktpuZmeHBg/sCpRIn/uwpJu7ZE5w8tBsdevSHS98hiLl7CwFrl0FDUxPN2nYWOl6hEmu3Zn6wYFNAnTp1ZF9HRETgn3/+QYkSJXLsFxMTgytXrmDUqFGybUePHsXbt2+RlZWVo5hLT0+X/ePcsWNHaGpq4sCBA+jbty92794NQ0NDtGnTRrb/jh07sHr1asTExCApKQnv37+HoWH+xiKEhYXB29sbEREReP36NbKzswF8KDIdHR0VOkZkZCQ0NDRQv3592TYzMzM4ODggMjJStk1PT09WrAGApaWlrPs1N+np6UhPT5fblpGeDS1tbYVyFaaXL55jw+olmLd8nSjyFAXLF8/Hg5ho/L5xs9BRqAjjz57isqXZsK1YBX2HjgUA2Ng74PHD+zh5eI/qF2yi7djMOxZsCtDX15d9nZSUhC5dumDx4sU59rO0tER2drZc4VK2bFkcOHAA6urqCAsLg7q6utx7PhZ+Wlpa6NWrFwIDA9G3b18EBgaiT58+0ND48L/o4sWLcHV1hY+PD5ydnWFkZITt27dj2bJlX8ytpqYGqVQqt+3TLsrk5GQ4OzvD2dkZ27ZtQ6lSpRAbGwtnZ+dCmVyhqakp91wikeTI9ylfX1/4+PjIbXOf/DPGT5n1hXd8P9F3byPxdQImDO8n25adlYVbEVdxaO8O7D15Ocf/6+JsxeIFuHjuDH79IwDmFqWFjiNKJsYmUFdXzzHBID4+HiVLlhQolfjwZ09xJqYlUdbaVm5bGSsbXD4XLFCi70j16jUWbMqqXbs2du/eDRsbG1kx9bnPZ0/WqlULWVlZiIuLQ9OmTb94bFdXV7Rt2xa3bt1CcHAw5s+fL3vtwoULsLa2xsyZM2XbHj169NWspUqVkhvUn5WVhZs3b8omEty5cwfx8fFYtGgRrKysAAChoaFyx9DS0pK990uqVKmC9+/fIyQkRNYlGh8fj6ioKIVb6XIzY8YMeHh4yG37LzE7z8crSE516uM3/11y21Ytmo1y5SugZ/8h/IXx/6RSKVYuWYizp09h9Xo/lCmr+oOd80pTSwtVHKsi5NJFtGr9oWU9OzsbISEX0bffAIHTiQd/9hRXydEJz/6T/z3x/EksSpqr/h9NKlivcdKBssaOHYuEhAT069cPV65cQUxMDI4dO4YhQ4Z8saipVKkSXF1dMWjQIOzZswcPHjzA5cuX4evri8OHD8v2a9asGUqXLg1XV1dUqFBBrqWuYsWKiI2Nxfbt2xETE4PVq1fLjW/LTatWrXD48GEcPnwYd+7cwZgxY+TWUytfvjy0tLTw66+/4v79+zhw4ECOtdWsra0hkUhw6NAhvHz5Ekn/P2j8UxUrVkS3bt0wYsQInDt3DhERERgwYADKli2Lbt26KXJZc6WtrQ1DQ0O5h1i6QPT09GFjay/30NbRhYGhEWxs7YWOJxrLF8/H8aOHMHv+Yujp6SP+1SvEv3qF9LQ0oaOJ0kC3Idiz628c2LcX92NiMH+uN1JTU+HSvYfQ0USDP3uK69CjH6Lv3MC+v/zw/Ml/OB8chOAje9G2649CRyt0XNaDUKZMGZw/fx5ZWVlo164dqlevjokTJ8LY2Bhqal++nH5+fhg0aBAmT54MBwcHuLi44MqVKyhfvrxsH4lEgn79+iEiIgKurq5y7+/atSsmTZoEd3d31KxZExcuXICXl9dXsw4dOhRubm4YNGgQmjdvDltbW1nrGvChBc7f3x87d+6Eo6MjFi1ahKVLl8odo2zZsvDx8cH06dNhYWEBd3f3L36+OnXqoHPnzmjYsCGkUimOHDmSoxuUipd9u3YgKekdxo8aApf2LWSPUyeChI4mSu07dISH5zSs+W01evfshqg7kVizfiPM2CVKeWDnUBWTZv+Ci6ePYdqovtgbuAkDR3ugSasOQkejPJBIvzaIiEhk7r1IFTpCkWGkxxEPijDU5R8Vivgvnj97inqb+uX1Mel/6tgU3gK+L9+9z9f7SxmI799P8SUiIiIiyg+RdmvmBws2IiIiUikqWK+xYCMiIiLVItaJA/nBgo2IiIhUiiounMtZokREREQixxY2IiIiUimq2CXKFjYiIiIikWMLGxEREakUVWxhY8FGREREKkUVJx2wYCMiIiKVoootbBzDRkRERCRybGEjIiIilaKCDWws2IiIiEjFqGDFxoKNiIiIVAonHRARERGJnCpOOmDBRkRERCpFBes1zhIlIiIiyo/ff/8dNjY20NHRQf369XH58uUCPwcLNiIiIlItknw+lLBjxw54eHhgzpw5uHr1KpycnODs7Iy4uLgC+jAfsGAjIiIilSLJ53/KWL58OUaMGIEhQ4bA0dER69atg56eHv78888C/Uws2IiIiEilSCT5e6Snp+Pt27dyj/T09BznycjIQFhYGNq0aSPbpqamhjZt2uDixYsF+pk46YCKlIoWukJHkJOeng5fX1/MmDED2traQscRNV4rxYj1OontZw8Q77UCxHWtxHudCo9OPqsb7/m+8PHxkds2Z84ceHt7y2179eoVsrKyYGFhIbfdwsICd+7cyV+Iz0ikUqm0QI9IVIy8ffsWRkZGePPmDQwNDYWOI2q8VorhdVIcr5VieJ2Ul56enqNFTVtbO0fB+/TpU5QtWxYXLlxAw4YNZdunTp2KM2fOICQkpMAysYWNiIiI6BO5FWe5KVmyJNTV1fHixQu57S9evEDp0qULNBPHsBERERHlgZaWFurUqYNTp07JtmVnZ+PUqVNyLW4FgS1sRERERHnk4eEBNzc31K1bF/Xq1cPKlSuRnJyMIUOGFOh5WLAR5YO2tjbmzJlTbAby5gevlWJ4nRTHa6UYXqfC1adPH7x8+RKzZ8/G8+fPUbNmTQQFBeWYiJBfnHRAREREJHIcw0ZEREQkcizYiIiIiESOBRsRERGRyLFgIyIiIhI5FmxEREREIseCjYiIiEjkuA4bkQJWr16t8L7jx48vxCTid/36dYX3rVGjRiEmISJSHVyHjUgBFSpUkHv+8uVLpKSkwNjYGACQmJgIPT09mJub4/79+wIkFA81NTVIJBJIpVJIJJKv7puVlfWdUonfv//+i/Xr1yMmJga7du1C2bJlsWXLFlSoUAFNmjQROp5ovHjxAp6enjh16hTi4uLw+a8wfk99wOuketjCRqSABw8eyL4ODAzEmjVrsGnTJjg4OAAAoqKiMGLECIwaNUqoiKLx6bW6du0aPD09MWXKFNl99S5evIhly5ZhyZIlQkUUnd27d2PgwIFwdXXFtWvXkJ6eDgB48+YNFi5ciCNHjgicUDwGDx6M2NhYeHl5wdLS8pt/FBRXvE6qhy1sREqys7PDrl27UKtWLbntYWFh6NWrl1zBUtzVq1cP3t7e6Nixo9z2I0eOwMvLC2FhYQIlE5datWph0qRJGDRoEAwMDBAREQFbW1tcu3YNHTp0wPPnz4WOKBoGBgb4999/UbNmTaGjiBqvk+rhpAMiJT179gzv37/PsT0rKwsvXrwQIJF43bhxI0d3MvChi/n27dsCJBKnqKgoNGvWLMd2IyMjJCYmfv9AImZlZZWje49y4nVSPSzYiJTUunVrjBo1ClevXpVtCwsLw5gxY9CmTRsBk4lPlSpV4Ovri4yMDNm2jIwM+Pr6okqVKgImE5fSpUsjOjo6x/Zz587B1tZWgETitXLlSkyfPh0PHz4UOoqo8TqpHnaJEinp5cuXcHNzQ1BQEDQ1NQEA79+/h7OzM/z9/WFubi5wQvG4fPkyunTpAqlUKpsRev36dUgkEhw8eBD16tUTOKE4+Pr6YuvWrfjzzz/Rtm1bHDlyBI8ePcKkSZPg5eWFcePGCR1RNExMTJCSkoL3799DT09P9jP4UUJCgkDJxIXXSfWwYCPKo7t37+LOnTsAgMqVK6NSpUoCJxKn5ORkbNu2TXatqlSpgv79+0NfX1/gZOIhlUqxcOFC+Pr6IiUlBQCgra0NT09PzJs3T+B04hIQEPDV193c3L5TEnHjdVI9LNiI8igjIwMPHjyAnZ0dNDQ44ZryLyMjA9HR0UhKSoKjoyNKlCghdCQiEgkWbERKSklJwbhx42R/wd69exe2trYYN24cypYti+nTpwucUFy2bNmC9evX4/79+7h48SKsra2xYsUK2Nraolu3bkLHoyIoKysL+/btQ2RkJACgatWq6Nq1K9TV1QVOJi68TqqFkw6IlDRjxgxERETg9OnT0NHRkW1v06YNduzYIWAy8Vm7di08PDzQoUMHvH79WrZYp4mJCVauXClsOBFJTk6Gl5cXGjVqBHt7e9ja2so96H+io6NRpUoVDBo0CHv27MGePXswYMAAVK1aFTExMULHEw1eJ9XDFjYiJVlbW2PHjh1o0KCB3JpZ0dHRqF27Nt6+fSt0RNFwdHTEwoUL4eLiInetbt68iRYtWuDVq1dCRxSFfv364cyZMxg4cGCui5xOmDBBoGTi07FjR0ilUmzbtg2mpqYAgPj4eAwYMABqamo4fPiwwAnFgddJ9XDgDZGSXr58metM0OTkZK4m/pkHDx7kWGAY+DCgPjk5WYBE4nT06FEcPnwYjRs3FjqK6J05cwaXLl2SFSEAYGZmhkWLFvH6fYLXSfWwS5RISXXr1pX76/RjkbZx40bZ7ZfogwoVKiA8PDzH9qCgIK7D9gkTExO5X6z0Zdra2nj37l2O7UlJSdDS0hIgkTjxOqketrARKWnhwoXo0KEDbt++jffv32PVqlW4ffs2Lly4gDNnzggdT1Q8PDwwduxYpKWlQSqV4vLly/jrr7/g6+uLjRs3Ch1PNObNm4fZs2cjICAAenp6QscRtc6dO2PkyJHYtGmTbB2/kJAQjB49Gl27dhU4nXjwOqkejmEjyoOYmBgsWrQIERERSEpKQu3atTFt2jRUr15d6Giis23bNnh7e8sGOpcpUwY+Pj4YNmyYwMnEo1atWoiJiYFUKoWNjU2ORU4/vatGcZeYmAg3NzccPHhQbuHqrl27wt/fH0ZGRgInFAdeJ9XDgo2IvouUlBQkJSXxThC58PHx+errc+bM+U5Jio579+7JLcZsb28vcCJx4nVSHSzYiJR09epVaGpqylrT9u/fDz8/Pzg6OsLb25vjQz6RmpoKqVQq6+Z79OgR9u7dC0dHR7Rr107gdERERQcLNiIl/fDDD5g+fTp69uyJ+/fvw9HRET169MCVK1fQqVMnri/2iXbt2qFHjx4YPXo0EhMT4eDgAC0tLbx69QrLly/HmDFjhI4oKmFhYXKLnOY2w7Y48vDwwLx586Cvrw8PD4+v7rt8+fLvlEp8eJ1UGycdECnp7t27qFmzJgBg586daN68OQIDA3H+/Hn07duXBdsnrl69ihUrVgAAdu3ahdKlS+PatWvYvXs3Zs+ezYLt/8XFxaFv3744ffo0jI2NAXwYg9SyZUts374dpUqVEjagwK5du4bMzEzZ119S3JfVUfQ6UdHEgo1ISVKpFNnZ2QCAkydPonPnzgAAKysrLgT7mZSUFBgYGAAAjh8/jh49ekBNTQ0NGjTAo0ePBE4nHuPGjcO7d+9w69Yt2XInt2/fhpubG8aPH4+//vpL4ITC+ueff3L9muTxOqk2rsNGpKS6deti/vz52LJlC86cOYNOnToB+LBIrIWFhcDpxMXe3h779u3Df//9h2PHjsnGrcXFxcHQ0FDgdOIRFBSENWvWyK1N5+joiN9//x1Hjx4VMJn4vX37Fvv27ZMNrKcPhg4dmus6bMnJyRg6dKgAiSi/WLARKWnlypW4evUq3N3dMXPmTNmsq127dqFRo0YCpxOX2bNnw9PTEzY2Nqhfv75sYeHjx49zfNYnsrOzcyzlAQCampqy1lz6oHfv3vjtt98AfJjUUrduXfTu3RvVq1fH7t27BU4nHgEBAUhNTc2xPTU1FZs3bxYgEeUXJx0QFZC0tDSoq6vn+ou3OHv+/DmePXsGJycnqKl9+Bvx8uXLMDQ0ROXKlQVOJw7dunVDYmIi/vrrL5QpUwYA8OTJE7i6usLExAR79+4VOKF4lC5dGseOHYOTkxMCAwMxZ84cREREICAgAH/88UexH7v19u1bSKVSmJiY4N69e3LjH7OysnDw4EFMnz4dT58+FTAl5QULNiIigf3333/o2rUrbt26BSsrKwBAbGwsqlevjgMHDqBcuXICJxQPXV1d3L17F1ZWVhg0aBDKlCmDRYsWITY2Fo6OjkhKShI6oqDU1NS+OvlCIpHAx8cHM2fO/I6pqCBw0gGRkr71D2JWVtZ3TCNuLVu2/Oq1Cg4O/o5pxMvKygpXr17FqVOnZMt6VKlSBW3atBE4mfhYWVnh4sWLMDU1RVBQELZv3w4AeP36NXR0dAROJ7x//vkHUqkUrVq1wu7du+XuUaulpQVra2tZKy4VLSzYiJT0efdUZmYmrl27hoCAgG+uWF/cfFz+5KPMzEyEh4fj5s2bcHNzEyaUSAUHByM4OBhxcXHIzs7GtWvXEBgYCAD4888/BU4nHhMnToSrqytKlCgBa2trtGjRAgBw9uxZ3hoOQPPmzQF8mARlZWUlG4ZARR+7RIkKSGBgIHbs2IH9+/cLHUX0vL29kZSUhKVLlwodRRR8fHwwd+5c1K1bF5aWljlaJTmGTV5YWBhiY2PRtm1blChRAgBw+PBhGBsbo3HjxgKnE5eUlBTExsYiIyNDbnuNGjUESkR5xYKNqIDcv38fNWrUKPZjaBQRHR2NevXqISEhQegoomBpaYklS5Zg4MCBQkcRtczMTFSuXBmHDh2SWwKFcnr58iWGDBnyxWVhOHSj6GFbKVEBSE1NxerVq1G2bFmhoxQJFy9e5HijT2RkZHBJGAVoamoiLS1N6BhFwsSJE5GYmIiQkBDo6uoiKCgIAQEBqFixIg4cOCB0PMoDjmEjUpKJiYlcl5VUKsW7d++gp6eHrVu3CphMfHr06CH3XCqV4tmzZwgNDYWXl5dAqcRn+PDhCAwM5DVRwNixY7F48WJs3LgRGhr8FfYlwcHB2L9/P+rWrQs1NTVYW1ujbdu2MDQ0hK+vr2zBbyo6+N1OpKTP7xWqpqaGUqVKoX79+jAxMREmlEgZGRnJPVdTU4ODgwPmzp0ru+sBfVjD748//sDJkydRo0aNHGv58Ubd/3PlyhWcOnUKx48fR/Xq1aGvry/3+p49ewRKJi7JyckwNzcH8OGPzJcvX6JSpUqoXr06rl69KnA6ygsWbERKUnR2408//YS5c+eiZMmShZxIvPz8/ISOUCRcv35dNqP25s2bcq8V9xuaf87Y2Bg9e/YUOoboOTg4ICoqCjY2NnBycsL69ethY2ODdevWwdLSUuh4lAecdEBUSAwNDREeHg5bW1uhowgqMTERu3btQkxMDKZMmQJTU1NcvXoVFhYWHPNHVEi2bt2K9+/fY/DgwQgLC0P79u2RkJAALS0t+Pv7o0+fPkJHJCWxYCMqJAYGBoiIiCjWBdv169fRunVrGBsb4+HDh4iKioKtrS1mzZqF2NhY3tOQ8uT9+/c4ffo0YmJi0L9/fxgYGODp06cwNDSULfNB8lJSUnDnzh2UL1++WLf6F2WcJUpEhcbDwwNDhgzBvXv35GaFduzYEWfPnhUwGRVVjx49QvXq1dGtWzeMHTsWL1++BAAsXrwYnp6eAqcTLz09PdSuXZvFWhHGMWxEVGiuXLmC9evX59hetmxZPH/+XIBEVNRNmDABdevWRUREBMzMzGTbu3fvjhEjRgiYTFyGDh361dd594yihwUbERUabW1tvH37Nsf2u3fvolSpUgIkoqLu33//xYULF6ClpSW33cbGBk+ePBEolfi8fv1a7nlmZiZu3ryJxMREtGrVSqBUlB8s2Iio0HTt2hVz587F33//DeDDjMfY2FhMmzaNM/0oT7Kzs3Ndpf/x48cwMDAQIJE45XY7s+zsbIwZMwZ2dnYCJKL84hg2IiXFxsYit7k6UqkUsbGxsucDBgyAoaHh94wmOsuWLUNSUhLMzc2RmpqK5s2bw97eHgYGBliwYIHQ8agIateundxaiBKJBElJSZgzZw46duwoXLAiQE1NDR4eHlixYoXQUSgPOEuUSEnq6up49uyZbFHKj+Lj42Fubs579OXi/PnziIiIQFJSEmrXro02bdoIHYmKqMePH8PZ2RlSqRT37t1D3bp1ce/ePZQsWRJnz57N8XNJ8o4cOQI3NzfZZA0qOtglSqQkqVSa62KmSUlJvD/mJzIzM6Grq4vw8HA0btwYjRs3FjoSqYBy5cohIiIC27dvx/Xr15GUlIRhw4bB1dUVurq6QscTDQ8PD7nnH28Ld/jwYYUX/yZxYcFGpKCP/wBKJBJ4eXlBT09P9lpWVhZCQkJkq9XThxt1ly9fni2OVKDS0tKgo6ODAQMGCB1F1K5duyb3/OMt9JYtW/bNGaQkTuwSJVJQy5YtAQBnzpxBw4YN5WapaWlpwcbGBp6enqhYsaJQEUVn06ZN2LNnD7Zs2QJTU1Oh45AKMDQ0RPfu3TFgwAC0bt0aamocik3FAws2IiUNGTIEq1atKvYTChRRq1YtREdHIzMzE9bW1jlu1M2bUJOy9u7di8DAQBw+fBhGRkbo06cPBgwYgLp16wodjahQsWAjokLj4+Pz1dfnzJnznZKQqnn37h127dqFv/76C8HBwbC1tcWAAQMwe/ZsoaMJplatWrmOr80N/1gqeliwESkpOTkZixYtwqlTpxAXF4fs7Gy51+/fvy9QsqLrr7/+QteuXXO0wBEp4vbt23B1dcX169eL9ZjJb/2B9Cn+sVT0sGAjUlK/fv1w5swZDBw4EJaWljn+op0wYYJAyYouQ0NDhIeHw9bWVugoVESkpaXhwIEDCAwMRFBQECwsLNCvXz8sWrRI6GhEhYKzRImUdPToURw+fJjLVBQg/t1Iijp27BgCAwOxb98+aGhooFevXjh+/DiaNWsmdDSiQsWCjUhJJiYmnPFIJJDu3bujc+fO2Lx5Mzp27AhNTU2hI4lSVlYWVqxYgb///huxsbHIyMiQez0hIUGgZJRXnA9NpKR58+Zh9uzZSElJEToKUbHz4sUL/P333+jWrdtXi7VFixYhMTHx+wUTGR8fHyxfvhx9+vTBmzdv4OHhgR49ekBNTQ3e3t5Cx6M84Bg2IiXVqlULMTExkEqlsLGxyfFLg7OvlGdgYICIiAiOYaMCU9zHRdrZ2WH16tXo1KkTDAwMEB4eLtt26dIlBAYGCh2RlMQuUSIlubi4CB2BiL6huLdFPH/+HNWrVwcAlChRAm/evAEAdO7cGV5eXkJGozxiwUakJE6HL3jW1tYci0RUgMqVK4dnz56hfPnysLOzw/Hjx1G7dm1cuXIF2traQsejPGDBRpQHiYmJ2LVrF2JiYjBlyhSYmpri6tWrsLCwQNmyZYWOJzoZGRm5rllXvnx5AMDNmzeFiEWksrp3745Tp06hfv36GDduHAYMGIBNmzYhNjYWkyZNEjoe5QHHsBEp6fr162jTpg2MjIzw8OFDREVFwdbWFrNmzUJsbCw2b94sdETRuHfvHoYOHYoLFy7IbZdKpZBIJMV6kVMqXBwXKe/SpUu4cOECKlasiC5duggdh/KALWxESvLw8MDgwYOxZMkSGBgYyLZ37NgR/fv3FzCZ+AwePBgaGho4dOhQrosME1HhSEtLg46Ojux5gwYN0KBBAwETUX6xYCNS0pUrV7B+/foc28uWLYvnz58LkEi8wsPDERYWhsqVKwsdhYqZpk2bQldXV+gYgjE3N0f37t0xYMAAtG7dGmpqXMWrqOP/QSIlaWtr4+3btzm23717F6VKlRIgkXg5Ojri1atXQscgFXL16lXcuHFD9nz//v1wcXHBzz//LLc47JEjR2BpaSlERFEICAhASkoKunXrhrJly2LixIkIDQ0VOhblAws2IiV17doVc+fORWZmJgBAIpEgNjYW06ZNQ8+ePQVOJy6LFy/G1KlTcfr0acTHx+Pt27dyDyJljRo1Cnfv3gUA3L9/H3379oWenh527tyJqVOnCpxOPLp3746dO3fixYsXWLhwIW7fvo0GDRqgUqVKmDt3rtDxKA846YBISW/evEGvXr0QGhqKd+/eoUyZMnj+/DkaNmyII0eOQF9fX+iIovGxG+bzsWucdEB5ZWRkhKtXr8LOzg6LFy9GcHAwjh07hvPnz6Nv377477//hI4oWrdv34arqyuuX7/On70iiGPYiJRkZGSEEydO4Ny5c7h+/TqSkpJQu3ZttGnTRuhoovPPP/8IHYFUjFQqlS0Pc/LkSXTu3BkAYGVlxe73XKSlpeHAgQMIDAxEUFAQLCwsMGXKFKFjUR6whY2IiIqMVq1awcrKCm3atMGwYcNw+/Zt2Nvb48yZM3Bzc8PDhw+FjigKx44dQ2BgIPbt2wcNDQ306tULrq6uaNasmdDRKI9YsBHlwalTp3Dq1KlcF4P9888/BUolTomJidi0aRMiIyMBAFWrVsXQoUNhZGQkcDIqiq5fvw5XV1fExsbCw8NDdueRcePGIT4+nvfI/H96enro3LkzXF1d0bFjR95JRAWwYCNSko+PD+bOnYu6devmurbY3r17BUomPqGhoXB2doauri7q1asH4MOyKKmpqbJb5RAVhLS0NKirq7Mw+X/v3r2TWyeSij4WbERKsrS0xJIlSzBw4ECho4he06ZNYW9vjw0bNkBD48OQ2ffv32P48OG4f/8+zp49K3BCItUVExMDPz8/xMTEYNWqVTA3N8fRo0dRvnx5VK1aVeh4pCQu60GkpIyMDDRq1EjoGEVCaGgopk2bJivWAEBDQwNTp07lmlCUJ2pqalBXV//igz44c+YMqlevjpCQEOzZswdJSUkAgIiICFk3MhUtnCVKpKThw4cjMDAQXl5eQkcRPUNDQ8TGxua408F///3H7hrKk8+HHGRmZuLatWsICAiAj4+PQKnEZ/r06Zg/fz48PDzkftZatWqF3377TcBklFcs2IiUlJaWhj/++AMnT55EjRo1coyZWb58uUDJxKdPnz4YNmwYli5dKmuVPH/+PKZMmYJ+/foJnI6Kom7duuXY1qtXL1StWhU7duzAsGHDBEglPjdu3Mh1Aoa5uTmXPymiWLARKen69euoWbMmAODmzZtyr/Hm5vKWLl0KiUSCQYMG4f379wAATU1NjBkzBosWLRI4HamSBg0aYOTIkULHEA1jY2M8e/YMFSpUkNt+7do1lC1bVqBUlB+cdEBEhS4lJQUxMTEAADs7O+jp6QmciFRJamoqZsyYgaNHjyIqKkroOKLg6emJkJAQ7Ny5E5UqVcLVq1fx4sULDBo0CIMGDeI4tiKIBRtRPjx+/BgAUK5cOYGTEBUPJiYmci3ZUqkU7969g56eHrZu3YquXbsKmE48MjIyMHbsWPj7+yMrKwsaGhrIyspC//794e/vzwkaRRALNiIlZWdnY/78+Vi2bJls5pWBgQEmT56MmTNnyu6fWVz16NED/v7+MDQ0RI8ePb667549e75TKlIVAQEBcs/V1NRQqlQp1K9fHyYmJgKlEq///vsPN27cQFJSEmrVqoWKFSsKHYnyiGPYiJQ0c+ZMbNq0CYsWLULjxo0BAOfOnYO3tzfS0tKwYMECgRMKy8jISNYCYmhoyHF9VKDc3NyEjlCkWFlZITY2Fq1bt4a2trbQcSgf2MJGpKQyZcpg3bp1Obpe9u/fj59++glPnjwRKBlR8cDbnSnH0NAQ4eHhsLW1FToK5UPx7rshyoOEhIQc64oBQOXKlZGQkCBAIvFq1aoVEhMTc2x/+/YtWrVq9f0DUZEXGhoKOzs7rFixAgkJCUhISMDy5cthZ2eHq1evCh1PlNguoxrYwkakpPr166N+/fpYvXq13PZx48bhypUruHTpkkDJxEdNTQ3Pnz+Hubm53Pa4uDiULVsWmZmZAiWjooq3O1OegYEBIiIi2MJWxHEMG5GSlixZgk6dOuHkyZNo2LAhAODixYv477//cOTIEYHTicP169dlX9++fRvPnz+XPc/KykJQUBDXgqI8CQ0NlSvWgP/d7qxu3boCJhOv9evXw8LCQugYlE8s2IiU1Lx5c9y9exe///477ty5A+DDzMiffvoJZcqUETidONSsWRMSiQQSiSTXrk9dXV38+uuvAiSjoo63O1NOdHQ0zMzMZLPXpVIpJwIVUewSJaIC9+jRI0ilUtja2uLy5csoVaqU7DUtLS2Ym5tzHSjKk/Hjx2Pv3r253u6sZ8+eWLlypbABRSI+Ph59+vRBcHAwJBIJ7t27B1tbWwwdOhQmJiZYtmyZ0BFJSWxhI8qD169fy81Sc3R0xJAhQ2BqaipwMnGwtrYG8GHNOqKCxNudKWbSpEnQ0NBAbGwsqlSpItvep08feHh4sGArgtjCRqSks2fPokuXLjAyMpKNmQkLC0NiYiIOHjyIZs2aCZxQfG7fvo3Y2FhkZGTIbeeq9JRXvN3Z15UuXRrHjh2Dk5OT3KSD+/fvo0aNGrJFv6noYAsbkZLGjh2LPn36YO3atbJuvaysLPz0008YO3Ysbty4IXBC8bh//z66d++OGzduQCKRyJYX+DiGJisrS8h4VITp6emhevXqQscQreTk5FyL2ISEBC6gW0SxhY1ISbq6uggPD4eDg4Pc9qioKNSsWROpqakCJROfLl26QF1dHRs3bkSFChVw+fJlxMfHY/LkyVi6dCmaNm0qdEQqAni7M+V17NgRderUwbx582BgYIDr16/D2toaffv2RXZ2Nnbt2iV0RFISW9iIlFS7dm1ERkbmKNgiIyPh5OQkUCpxunjxIoKDg1GyZEmoqalBTU0NTZo0ga+vL8aPH49r164JHZGKgE9vd8a7GSjml19+QatWrRAaGoqMjAxMnToVt27dQkJCAs6fPy90PMoDFmxESho/fjwmTJiA6OhoNGjQAABw6dIl/P7771i0aJHcGmQ1atQQKqYoZGVlyZZaKFmyJJ4+fQoHBwdYW1sjKipK4HRUVPj5+eX6NeUuMzMT48ePx8GDB3HixAkYGBggKSkJPXr0wNixY2FpaSl0RMoDdokSKenjekZf8nGslkQiKfZjtJo2bYrJkyfDxcUF/fv3x+vXrzFr1iz88ccfCAsLw82bN4WOSEXM/Pnz4erqigoVKggdRdRKlSqFCxcuoGLFikJHoQLCgo1ISY8ePVJ434/LWxRXx44dQ3JyMnr06IHo6Gh07twZd+/ehZmZGXbs2MH7iZLSnJyccPPmTdSvXx8DBgxA7969UbJkSaFjic6kSZOgra3NpU5UCAs2IvquEhISYGJiwtXWKc9u3bqFbdu2Yfv27Xj8+DHatm0LV1dXuLi4cHmP/zdu3Dhs3rwZFStWRJ06daCvry/3+vLlywVKRnnFgo0oD54+fYpz584hLi4ux+Kw48ePFygVUfFz/vx5BAYGYufOnUhLS8Pbt2+FjiQKLVu2/OJrEokEwcHB3zENFQROOiBSkr+/P0aNGgUtLS2YmZnJtRRJJBIWbJ9o2bLlV1vS+EuD8ktfXx+6urrQ0tLCu3fvhI4jGv/884/QEaiAsWAjUpKXlxdmz56NGTNmfHMCQnFXs2ZNueeZmZkIDw/HzZs34ebmJkwoKvIePHiAwMBABAYGIioqCs2bN4ePjw969eoldDSiQsOCjUhJKSkp6Nu3L4s1BaxYsSLX7d7e3rw1DuVJgwYNcOXKFdSoUQNDhgxBv379ULZsWaFjERU6jmEjUtLUqVNhamqK6dOnCx2lyIqOjka9evWQkJAgdBQqYmbOnAlXV1c4OjoKHYXou2LBRqSkrKwsdO7cGampqahevTo0NTXlXufsq2/bsmULpk2bhqdPnwodhYqojIwMPHjwAHZ2dtDQYGcRqT5+lxMpydfXF8eOHZPdmurzSQf0P5/f91EqleLZs2cIDQ2Fl5eXQKmoKEtNTYW7uzsCAgIAAHfv3oWtrS3GjRuHsmXLsuWbVBZb2IiUZGJighUrVmDw4MFCRxG9IUOGyD1XU1NDqVKl0KpVK7Rr106gVFSUTZgwAefPn8fKlSvRvn17XL9+Hba2tti/fz+8vb15f1pSWWxhI1KStrY2GjduLHSMIoH3faSCtm/fPuzYsQMNGjSQa9GuWrUqYmJiBExGVLg4zY1ISRMmTMCvv/4qdAyiYunly5cwNzfPsT05OZlDEkilsYWNSEmXL19GcHAwDh06hKpVq+aYdLBnzx6BkomDMred4ixRUlbdunVx+PBhjBs3DsD/xo1u3LgRDRs2FDIaUaFiwUakJGNj4xyD6el/Vq5cKXQEUmELFy5Ehw4dcPv2bbx//x6rVq3C7du3ceHCBZw5c0boeESFhpMOiIioSLl//z58fX0RERGBpKQk1K5dG9OmTUP16tWFjkZUaFiwEeXRy5cvERUVBQBwcHBAqVKlBE4kbmlpacjIyPi/9u49psmrjwP4t6KUcteJQBUQVxQ0iIphY0tAphtkCZORhUSZQkC2ybjIRdEsqHhjwQiRXYCBihiKGlE2kG0yRQbqSAbCnCITRNHJEreJSSFCsc/7h7F7K9OX7hWeln0/CYk95/Scb/nD/HJ6noNOm7W1tUhpyBip1Wq8//77SE9Ph6urq9hxiMYUHzog0lNfXx+ioqLg6OgIPz8/+Pn5QS6XIzo6Gv39/WLHMyh9fX2Ii4vDtGnTYGFhgcmTJ+v8EOlj0qRJKC8vFzsGkShYsBHpKTk5GXV1daisrERvby96e3vx5Zdfoq6uDikpKWLHMygbNmzAmTNnkJeXB6lUiqKiImRkZEAul6OkpETseGSEQkJCUFFRIXYMojHHr0SJ9DR16lQcO3YMS5Ys0Wmvra1FWFgY7t69K04wA+Ts7IySkhIsWbIE1tbWaG5uhkKhwKFDh1BWVobq6mqxI5KR2bFjB/bs2YOlS5fC29sbFhYWOv0JCQkiJSMaXSzYiPRkbm6OpqYmeHh46LRfvnwZPj4+6OvrEymZ4bG0tMSVK1fg7OyMGTNm4Pjx4/Dx8UFXVxc8PT2hUqnEjkhG5lln1yQSCa5fvz6GaYjGDq/1INKTr68vtmzZgpKSEpiZmQF49PcNMzIyeA/UE2bNmoWuri44OzvD3d0dR48ehY+PDyorK2Frayt2PDJCXV1d2n8/3m/ghbn0b8AdNiI9Xbp0CUFBQRgYGICXlxcAoLW1FVKpFKdOncK8efNETmg4cnJyYGJigoSEBHz33XcIDg6GIAhQq9XIzs5GYmKi2BHJCO3btw85OTm4du0aAMDNzQ3r1q3DmjVrRE5GNHpYsBH9A/39/SgtLcXVq1cBAB4eHggPD4dMJhM5mWG7efMmmpqaoFAoMH/+fLHjkBHavHkzsrOzER8fr93RvnDhAj799FMkJSVh27ZtIickGh0s2Ij0lJmZCXt7e0RFRem079+/H3fv3kVaWppIyQzPrVu34OTkJHYMGkfs7OyQm5uLFStW6LSXlZUhPj4ev//+u0jJiEYXr/Ug0lNBQQHc3d2Htc+bNw/5+fkiJDJcM2fOhL+/PwoLC3Hv3j2x49A4oFarsXjx4mHt3t7eGBoaEiER0dhgwUakp99++w2Ojo7D2u3s7NDT0yNCIsP1448/wsfHB9u2bYOjoyNCQkJw7NgxDAwMiB2NjNSqVauQl5c3rP2LL75AeHi4CImIxgafEiXSk5OTE86dOzfseoFz585BLpeLlMowLVy4EAsXLkRWVhbOnj0LpVKJ9957DxqNBqGhodi/f7/YEckI7du3D6dOncLLL78MAGhsbER3dzdWr16N5ORk7bjs7GyxIhI9dzzDRqSnrKwsZGVlYffu3XjttdcAAKdPn8aGDRuQkpKCTZs2iZzQsDU3NyM6Oho//fQTHj58KHYcMjIBAQEjGieRSHDmzJlRTkM0drjDRqSn9evX448//kBsbKz2j5mbmZkhLS2NxdpT3L59G0qlEkqlEj///DN8fX3x2WefiR2LjFBtba3YEYhEwR02on9IpVKhra0NMpkMbm5ukEqlYkcyOAUFBVAqlWhoaNBefbJy5Uq4uLiIHY2IyKiwYCOiUePk5IQVK1YgPDxce8kwERHpj0+JEtGo6e7uRnBwMHbv3o1XXnkFv/76KwDg0KFDaGhoEDkdEZHxYMFGRKPm+PHjCAwMhEwmQ3Nzs/Y6j/v372PXrl0ipyMiMh4s2Iho1OzYsQP5+fkoLCzEpEmTtO2vvvoqmpubRUxGRGRcWLAR0ahpb2+Hn5/fsHYbGxv09vaOfSAiIiPFgo2IRo2DgwM6OjqGtTc0NGDWrFkiJCIiMk4s2Iho1MTExCAxMRGNjY2QSCS4c+cOSktLkZqairVr14odj4jIaPDiXCIaNRs3boRGo8HSpUvR398PPz8/SKVSpKamIj4+Xux4RERGg/ewEdGoGxwcREdHB1QqFebOnQtLS0uxIxERGRUWbEREREQGjmfYiIiIiAwcCzYiIiIiA8eCjYiIiMjAsWAjItJTZGQkQkJCtK+XLFmCdevWjXmOs2fPQiKRPPMSYolEgoqKihHPuXXrVixYsOD/ynXjxg1IJBK0tLT8X/MQ0V9YsBHRuBAZGQmJRAKJRAJTU1MoFAps27YNQ0NDo7728ePHsX379hGNHUmRRUT0JN7DRkTjRlBQEA4cOICBgQFUV1fjww8/xKRJk7Bp06ZhYwcHB2Fqavpc1p0yZcpzmYeI6Gm4w0ZE44ZUKoWDgwNcXFywdu1aLFu2DF999RWAv77G3LlzJ+RyOebMmQMAuHXrFsLCwmBra4spU6Zg+fLluHHjhnbOhw8fIjk5Gba2tnjhhRewYcMGPHkb0pNfiQ4MDCAtLQ1OTk6QSqVQKBTYt28fbty4gYCAAADA5MmTIZFIEBkZCQDQaDTIzMyEq6srZDIZvLy8cOzYMZ11qqurMXv2bMhkMgQEBOjkHKm0tDTMnj0b5ubmmDVrFtLT06FWq4eNKygogJOTE8zNzREWFob79+/r9BcVFcHDwwNmZmZwd3fH559/rncWIho5FmxENG7JZDIMDg5qX58+fRrt7e2oqalBVVUV1Go1AgMDYWVlhfr6epw7dw6WlpYICgrSvm/Pnj0oLi7G/v370dDQgD///BMnTpx45rqrV69GWVkZcnNz0dbWhoKCAlhaWsLJyQnl5eUAgPb2dvT09GDv3r0AgMzMTJSUlCA/Px+XL19GUlIS3n33XdTV1QF4VFiGhoYiODgYLS0tWLNmDTZu3Kj378TKygrFxcW4cuUK9u7di8LCQuTk5OiM6ejowNGjR1FZWYlvvvkGFy9eRGxsrLa/tLQUmzdvxs6dO9HW1oZdu3YhPT0dBw8e1DsPEY2QQEQ0DkRERAjLly8XBEEQNBqNUFNTI0ilUiE1NVXbb29vLwwMDGjfc+jQIWHOnDmCRqPRtg0MDAgymUz49ttvBUEQBEdHRyErK0vbr1arhRkzZmjXEgRB8Pf3FxITEwVBEIT29nYBgFBTU/O3OWtrawUAwr1797RtDx48EMzNzYXz58/rjI2OjhZWrFghCIIgbNq0SZg7d65Of1pa2rC5ngRAOHHixFP7d+/eLXh7e2tfb9myRTAxMRFu376tbfv666+FCRMmCD09PYIgCMKLL74oKJVKnXm2b98u+Pr6CoIgCF1dXQIA4eLFi09dl4j0wzNsRDRuVFVVwdLSEmq1GhqNBitXrsTWrVu1/Z6enjrn1lpbW9HR0QErKyudeR48eIDOzk7cv38fPT09eOmll7R9EydOxOLFi4d9LfpYS0sLTExM4O/vP+LcHR0d6O/vx+uvv67TPjg4iIULFwIA2tradHIAgK+v74jXeOzIkSPIzc1FZ2cnVCoVhoaGYG1trTPG2dkZ06dP11lHo9Ggvb0dVlZW6OzsRHR0NGJiYrRjhoaGYGNjo3ceIhoZFmxENG4EBAQgLy8PpqamkMvlmDhR9784CwsLndcqlQre3t4oLS0dNpednd0/yiCTyfR+j0qlAgCcPHlSp1ACHp3Le14uXLiA8PBwZGRkIDAwEDY2Njh8+DD27Nmjd9bCwsJhBaSJiclzy0pEuliwEdG4YWFhAYVCMeLxixYtwpEjRzBt2rRhu0yPOTo6orGxEX5+fgAe7SQ1NTVh0aJFfzve09MTGo0GdXV1WLZs2bD+xzt8Dx8+1LbNnTsXUqkU3d3dT92Z8/Dw0D5A8dgPP/zwvz/kfzl//jxcXFzw0Ucfadtu3rw5bFx3dzfu3LkDuVyuXWfChAmYM2cO7O3tIZfLcf36dYSHh+u1PhH9c3zogIj+tcLDwzF16lQsX74c9fX16OrqwtmzZ5GQkIDbt28DABITE/Hxxx+joqICV69eRWxs7DPvUJs5cyYiIiIQFRWFiooK7ZxHjx4FALi4uEAikaCqqgp3796FSqWClZUVUlNTkZSUhIMHD6KzsxPNzc345JNPtAf5P/jgA1y7dg3r169He3s7lEoliouL9fq8bm5u6O7uxuHDh9HZ2Ync3Ny/fYDCzMwMERERaG1tRX19PRISEhAWFgYHBwcAQEZGBjIzM5Gbm4tffvkFly5dwoEDB5Cdna1XHiIaORZsRPSvZW5uju+//x7Ozs4IDQ2Fh4cHoqOj8eDBA+2OW0pKClatWoWIiAj4+vrCysoKb7/99jPnzcvLwzvvvIPY2Fi4u7sjJiYGfX19AIDp06cjIyMDGzduhL29PeLi4gAA27dvR3p6OjIzM+Hh4YGgoCCcPHkSrq6uAB6dKysvL0dFRQW8vLyQn5+PXbt26fV533rrLSQlJSEuLg4LFizA+fPnkZ6ePmycQqFAaGgo3nzzTbzxxhuYP3++zrUda9asQVFREQ4cOABPT0/4+/ujuLhYm5WInj+J8LSTs0RERERkELjDRkRERGTgWLARERERGTgWbEREREQGjgUbERERkYFjwUZERERk4FiwERERERk4FmxEREREBo4FGxEREZGBY8FGREREZOBYsBEREREZOBZsRERERAaOBRsRERGRgfsPJzmnjdJE5NQAAAAASUVORK5CYII=", + "text/plain": [ + "<Figure size 600x400 with 2 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.3535\n" + ] + } + ], + "source": [ + "conf_matrix = pd.crosstab(df_annotations[\"label\"], df_annotations[\"gpt4omini_label\"])\n", + "accuracy = (df_annotations[\"label\"] == df_annotations[\"gpt4omini_label\"]).mean()\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "sns.heatmap(conf_matrix, annot=True, cmap='Blues') # Use 'annot=True' to show the values inside the heatmap\n", + "plt.title('Confusion Matrix')\n", + "plt.ylabel('True label')\n", + "plt.xlabel('Predicted label')\n", + "plt.show()\n", + "print(f\"Accuracy: {accuracy:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "df_annotations[\"label_simple\"] = df_annotations[\"label\"].apply(convert_label_type).apply(lambda x: x.value)\n", + "df_annotations[\"gpt4omini_label_simple\"] = df_annotations[\"gpt4omini_label\"].apply(convert_label_type).apply(lambda x: x.value)" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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N27cwLBhw945x9zFxQV+fn74+uuvsWPHDkWdf/75JwDA2dkZMpkMu3btwuPHj5GamgpLS0uMGzcOY8aMwdq1axEfH4/z589j8eLFisFnQ4YMwc2bNzF+/HjExMRgw4YNCAsLU+l8q1WrhsTERGzcuBHx8fFYtGhRgYP+TExM4Ofnh0uXLuH48eMYNWoUPv/8c9jb2wMApk6dipCQECxatAixsbG4cuUK1qxZg3nz5qkUDxEVDpM6USGYmZnh2LFjqFSpEnr06IGaNWti4MCByMjIULTcx44di759+8LPzw+enp6wtLRE9+7d31lvaGgoPv30UwwbNgw1atTAoEGDkJaWBgCoUKECpk6diu+++w52dnYYMWIEAGD69OmYPHkyQkJCULNmTXz88cfYvXs3XF1dAby+zr1161bs2LEDdevWxdKlSzFr1iyVzrdLly4YM2YMRowYgXr16uHkyZOYPHlyvu2qVq2KHj16oGPHjmjXrh3q1KmjNGXN398fK1euxJo1a1C7dm34+PggLCxMESsRaRafp05ERKQj2FInIiLSEUzqREREOoJJnYiISEcwqRMREekIJnUiIiIdwaRORESkI5jUiYiIdASTOhERkY5gUiciItIRTOpEREQ6gkmdiIhIR/w/s/B2T7xYAXwAAAAASUVORK5CYII=", + "text/plain": [ + "<Figure size 600x400 with 2 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy: 0.4747\n" + ] + } + ], + "source": [ + "conf_matrix = pd.crosstab(df_annotations[\"label_simple\"], df_annotations[\"gpt4omini_label_simple\"])\n", + "accuracy = (df_annotations[\"label_simple\"] == df_annotations[\"gpt4omini_label_simple\"]).mean()\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "sns.heatmap(conf_matrix, annot=True, cmap='Blues') # Use 'annot=True' to show the values inside the heatmap\n", + "plt.title('Confusion Matrix')\n", + "plt.ylabel('True label')\n", + "plt.xlabel('Predicted label')\n", + "plt.show()\n", + "print(f\"Accuracy: {accuracy:.4f}\")" + ] + } + ], + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/llm_annotation_prompt.txt b/notebooks/llm_annotation_prompt.txt new file mode 100644 index 00000000..672c8df0 --- /dev/null +++ b/notebooks/llm_annotation_prompt.txt @@ -0,0 +1,26 @@ +You are an expert in analyzing relationships between certificates. +Your task is to classify the relationship between a referenced target certificate, given its name and code and an examined certificate, based on its full text, using the following taxonomy (labels): + - **component_used**: The referenced certificate is a component of the examined certificate (e.g., an IC used in a smartcard). + - **component_shared**: The referenced certificate shares components with the examined certificate. + - **evaluation_reused**: The evaluation results from the referenced certificate were reused in the examined certificate's evaluation. Lowest-priority, can be overriden by other categories. + - **re-evaluation**: The examined certificate is a re-evaluation of the referenced certificate. + - **previous_version**: The referenced certificate is an earlier version of the examined certificate, but re-certification is not explicitly mentioned. Refer to the target name and the name of the compared component. If the target is BOTH a previous version and its evaluation was reused, then the previous version label takes precedence over the evaluation reused label." + - **none**: No clear relationship applies. + - **irrelevant**: The reference is unrelated (e.g., typo, leftover from a template). + +**EXAMPLES**: + - previous_version: "The evaluators confirmed test results from previous certification procedure BSI-DSZ-CC-0322-2005 where they could repeat the tests of the developer..." + - previous_version: "L'évaluation s'appuie sur les résultats d'évaluation de la précédente version du produit certifiée le 30 juillet 2020 sous la référence ANSSI-CC-2020/74, voir |CER|." + - re-evaluation: "This is a re-certification based on BSI-DSZ-CC-0353-2006" + - re-evaluation: "Ce produit a été précédemment certifié sous la référence |CER-2014/76|. Le présent rapport d'évaluation a permis de prendre en compte une nouvelle alternative dans le cycle de vie du produit (voir & 1.2.5)" + - component_used: "The security IC hardware is a M7892 D11 or M7892 P11 device certified under BSI-DSZ-CC-0891-V4-2019 or BSI-DSZ-CC-1105-2020, respectively." + - component_used: "The TOE is KOMSCO JK41 V1.0 ADV on S3FT9PS which is composite product consisting of the following components: IC chips : Samsung S3FT9PS 16-bit RISC Microcontroller for Smart Card with optional Secure RSA and ECC Library including specific IC Dedicated Software (ANSSI-CC-2014/58), and..." + - component_used: The TOE includes Windows® 2000 security functions. The evaluation approach included the re-use of Windows® 2000 evaluation results. Reference is made to Common Criteria Certificate and Validation Report number CCEVS-VR-02-0025 Version 2.0, dated 25 October 2002." + - component_used: "L’évaluation s’appuie sur les résultats d’évaluation du produit « Application eTravel EAC v2.0 sur la carte à puce fermée MultiApp V3 masquée sur le composant M7820 A11 patch 1.5 » certifié le 3 février 2014 sous la référence [ANSSI-CC-2014/07] et sur les résultats d’évaluation du produit « Plateforme Java Card en configuration ouverte de la carte à puce MultiApp V3.1 masquée sur le composant P60D080PVC patch 1.4 » certifié le 22 décembre 2014 sous la référence [ANSSI-CC-2014/86]." + - evaluation_reused: "Cette évaluation a ainsi pris en compte les résultats de l’évaluation des micro-contrôleurs « M7794 A12 et G12 » au niveau EAL5 augmenté des composants ALC_DVS.2 et AVA_VAN.5, conforme au profil de protection [PP0035]. Ces microcontrôleurs ont été certifiés, le 12 juin 2015 sous la référence « BSI-DSZ-CC-0964-2015 ». Le niveau de résistance de ces microcontrôleurs a été confirmé le 7 avril 2017 [CERT_IC]." + - evaluation_reused: "Also, specific ALC related parts were re-used in the sense of AIS38 from BSI-DSZ-CC-0891-V2-2016 (Infineon Security Controller M7892 D11 and G12)." + +There are also bigger categories: "re-evaluation" and "previous version" go under "predecessor" and "component_used", "component_shared", "evaluation_reused" all go under "component_reuse". "none" and "irrelevant" are not handled. This is not something you should however respond with, just general taxonomical information. + +Return a structured response with a `label` and an `explanation` field. +Be concise but clear in your explanation.
\ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 0cd409a1..a18bf949 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,6 +92,7 @@ "umap-learn[plot]", "plotly", "scikit-learn", + "openai" ] [project.urls] |
