From 8367da8e8ce102bb3171587938951e9392ac84da Mon Sep 17 00:00:00 2001 From: Justin Hsu <141555665+JustinHsu1019@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:34:32 +0800 Subject: [PATCH] Refactor: for aicup review (#5) * refactor: for aicup review structure * rename .github/ md * refactor: docstring, readme, update structure * Add repo structure * Add comments for main.py * docs: setup environment * update readme * fix: pre-commit issue * update readme (os) * Update README.md * Update README.md * Update README.md * Update README.md * add preprocess * fix: pre-commit issue * Update README.md --- .github/contribute_guide.md | 25 +++ Model/README.md | 10 + {src => Model}/flask_app.py | 12 +- Model/utils/README.md | 7 + {src => Model}/utils/__init__.py | 0 {src => Model}/utils/config_log.py | 1 + {src => Model}/utils/retrieval_agent.py | 24 ++- Preprocess/README.md | 8 + Preprocess/data_process/README.md | 204 ++++++++++++++++++ .../data_process}/conbine_readpdf_result.py | 2 +- Preprocess/data_process/data_preprocess.py | 159 ++++++++++++++ .../data_process}/read_pdf_noocr.py | 0 src/db_insert.py => Preprocess/insert_data.py | 8 +- README.md | 158 ++++++++------ config_example.ini | 5 +- data/README.md | 4 +- docker/README.md | 7 + docker/dockerfile | 24 --- docker/entrypoint.sh | 5 - img/aicup_result.png | Bin 171379 -> 0 bytes src/tools/automate.py => main.py | 29 +-- requirements.txt | 8 +- src/batch/README.md | 1 - src/batch/time.txt | 1 - src/data/README.md | 1 - src/data/read_pdf_ocr.py | 2 - src/tools/monitor.py | 25 --- src/utils/ai/__init__.py | 0 src/utils/ai/call_ai.py | 53 ----- src/utils/ai/gemini_tem.py | 23 -- src/utils/ai/gpt_tem.py | 39 ---- src/utils/ckip.py | 16 -- testing/README.md | 8 + {src/tools => testing}/checkans.py | 0 {src/tools => testing}/get_best_alpha.py | 2 +- 35 files changed, 584 insertions(+), 287 deletions(-) create mode 100644 .github/contribute_guide.md create mode 100644 Model/README.md rename {src => Model}/flask_app.py (86%) create mode 100644 Model/utils/README.md rename {src => Model}/utils/__init__.py (100%) rename {src => Model}/utils/config_log.py (92%) rename {src => Model}/utils/retrieval_agent.py (74%) create mode 100644 Preprocess/README.md create mode 100644 Preprocess/data_process/README.md rename {src/data => Preprocess/data_process}/conbine_readpdf_result.py (93%) create mode 100644 Preprocess/data_process/data_preprocess.py rename {src/data => Preprocess/data_process}/read_pdf_noocr.py (100%) rename src/db_insert.py => Preprocess/insert_data.py (94%) create mode 100644 docker/README.md delete mode 100644 docker/dockerfile delete mode 100755 docker/entrypoint.sh delete mode 100644 img/aicup_result.png rename src/tools/automate.py => main.py (59%) delete mode 100644 src/batch/README.md delete mode 100644 src/batch/time.txt delete mode 100644 src/data/README.md delete mode 100644 src/data/read_pdf_ocr.py delete mode 100644 src/tools/monitor.py delete mode 100644 src/utils/ai/__init__.py delete mode 100644 src/utils/ai/call_ai.py delete mode 100644 src/utils/ai/gemini_tem.py delete mode 100644 src/utils/ai/gpt_tem.py delete mode 100644 src/utils/ckip.py create mode 100644 testing/README.md rename {src/tools => testing}/checkans.py (100%) rename {src/tools => testing}/get_best_alpha.py (97%) diff --git a/.github/contribute_guide.md b/.github/contribute_guide.md new file mode 100644 index 0000000..c5f4798 --- /dev/null +++ b/.github/contribute_guide.md @@ -0,0 +1,25 @@ +# Contribution Guide +這個資料夾主要處理 CI Pipeline, 目前僅有檢測程式碼規範 (pre-commit), 且在發 PR & merge to main 才會觸發 + +We follow GitHub Flow for contributing. The steps are as follows: + +1. **Claim an issue**: Start by picking an issue from GitHub. +2. **Create a branch**: Open a new branch with a clear name related to the issue (e.g., `feat/xxxxx-feature`). +3. **Development**: After completing the feature, ensure you run pre-commit hooks: + ``` + pre-commit run --all-files + ``` +4. **Create PR Request (PR)**: + - Ensure your PR is small and easily reviewable. + - Add the GitHub issue number to the PR title in the format `feat(#123): xxxxxx` for easy reference. + - Write a clear description including the reason for the change and what was modified (`Reason & Changes`). +5. **Review & Approval**: + - Assign the PR to all members of the team for review. + - Wait for at least one approval. + - Ensure all CI checks pass. +6. **Merge**: Once approved and CI passes, merge the branch into `main` yourself. + +## Additional Notes +- Keep your commits focused and ensure meaningful commit messages. +- Always rebase your branch on top of `main` before merging. +- Avoid large, multi-purpose PRs. Smaller changes are easier to review and help prevent issues. diff --git a/Model/README.md b/Model/README.md new file mode 100644 index 0000000..884c41b --- /dev/null +++ b/Model/README.md @@ -0,0 +1,10 @@ +# 進行檢索的主程式 + +## flask_app.py +會開出一個 API 供 main.py 呼叫,每次呼叫會送入一題問題,並回傳一個答案 pid + +## utils/retrieval_agent.py +負責呼叫 weaviate & voyage reranker 進行檢索 + +## utils/config_log.py +負責處理 config 檔案,並設定 log 檔案 diff --git a/src/flask_app.py b/Model/flask_app.py similarity index 86% rename from src/flask_app.py rename to Model/flask_app.py index 991bfa2..e53164b 100644 --- a/src/flask_app.py +++ b/Model/flask_app.py @@ -59,18 +59,18 @@ def get(self): return response -# TODO: Modify the output format for general RAG purposes @ns.route('/chat') class ChatBot(Resource): @api.doc('chat_bot') @api.expect(model) def post(self): + """retrieve and rank api entry point""" qid = request.json.get('qid') source = request.json.get('source') question = request.json.get('query') category = request.json.get('category') - # for alpha testing + # for alpha testing (finding best hybrid search alpha) # alpha = request.json.get('alpha') # input template @@ -81,9 +81,10 @@ def post(self): # "category": "insurance" # }, - alpha = 0.5 + alpha = 0.5 # 最終因使用 Reranker 全盤處理 sources,故任何 alpha 對準確率都無影響 if not question: + # 為避免任何萬一,無論如何都須回傳一個結果,不做 Error logging response = jsonify({'qid': '1', 'retrieve': '1'}) response.status_code = 200 return response @@ -103,19 +104,24 @@ def post(self): response.status_code = 200 return response except TypeError: + # 為避免任何萬一,無論如何都須回傳一個結果,不做 Error logging response = jsonify({'qid': qid, 'retrieve': source[-1]}) response.status_code = 200 return response +# For API Docs @app.before_request def require_auth_for_docs(): + """Require authentication for API Docs""" if request.path == '/': return auth.login_required()(swagger_ui)() +# For API Docs @app.route('/') def swagger_ui(): + """Redirect to the Swagger UI""" return api.render_doc() diff --git a/Model/utils/README.md b/Model/utils/README.md new file mode 100644 index 0000000..04f9b54 --- /dev/null +++ b/Model/utils/README.md @@ -0,0 +1,7 @@ +# flask_app 主程式需呼叫的所有輔助程式 + +## retrieval_agent.py +負責呼叫 weaviate & voyage reranker 進行檢索 + +## config_log.py +負責處理 config 檔案,並設定 log 檔案 diff --git a/src/utils/__init__.py b/Model/utils/__init__.py similarity index 100% rename from src/utils/__init__.py rename to Model/utils/__init__.py diff --git a/src/utils/config_log.py b/Model/utils/config_log.py similarity index 92% rename from src/utils/config_log.py rename to Model/utils/config_log.py index 655d224..0ad925c 100644 --- a/src/utils/config_log.py +++ b/Model/utils/config_log.py @@ -6,6 +6,7 @@ def setup_config_and_logging(): + """Set up the configuration and logging.""" config = configparser.ConfigParser() logger = logging.getLogger() diff --git a/src/utils/retrieval_agent.py b/Model/utils/retrieval_agent.py similarity index 74% rename from src/utils/retrieval_agent.py rename to Model/utils/retrieval_agent.py index 4400670..6534092 100644 --- a/src/utils/retrieval_agent.py +++ b/Model/utils/retrieval_agent.py @@ -6,30 +6,34 @@ import utils.config_log as config_log -# 載入設定檔案和日誌設定 config, logger, CONFIG_PATH = config_log.setup_config_and_logging() config.read(CONFIG_PATH) -# 從 config 中取得 Weaviate URL 和 API 金鑰 -wea_url = config.get('Weaviate', 'weaviate_url') -voyage_api_key = config.get('VoyageAI', 'api_key') -PROPERTIES = ['pid', 'content'] +wea_url = config.get('Weaviate', 'weaviate_url') # 此次所使用的向量資料庫 +voyage_api_key = config.get('VoyageAI', 'api_key') # Voyage Reranker 所使用的 API Key +PROPERTIES = ['pid', 'content'] # 向量資料庫中此 Class 的欄位 # 設定 OpenAI API 金鑰 os.environ['OPENAI_API_KEY'] = config.get('OpenAI', 'api_key') class WeaviateSemanticSearch: + """Weaviate 向量資料庫的搜尋類別""" + def __init__(self, classnm): + """初始化 Weaviate 向量資料庫的搜尋類別""" self.url = wea_url + # 選擇的 OpenAI embedding model self.embeddings = OpenAIEmbeddings(chunk_size=1, model='text-embedding-3-large') self.client = weaviate.Client(url=wea_url) self.classnm = classnm def hybrid_search(self, query, source, num, alpha): + """Weaviate 向量資料庫的搜尋方法""" query_vector = self.embeddings.embed_query(query) vector_str = ','.join(map(str, query_vector)) + # 下述兩搜索式主要為過濾出 source 中的 pid,並只針對 source 中的 pid 的文件進行 retrieval & rerank where_conditions = ' '.join([f'{{path: ["pid"], operator: Equal, valueText: "{pid}"}}' for pid in source]) gql_query = f""" @@ -63,16 +67,20 @@ def hybrid_search(self, query, source, num, alpha): def rerank_with_voyage(query, documents, pids, api_key): + """利用 Voyage Reranker 對 Weaviate hybrid search retrieval 的結果進行 rerank""" vo = voyageai.Client(api_key=api_key) + # 利用 voyage rerank-2 從 hybrid search retrieval 中篩出的所有文件取出最終的 top 1 reranking = vo.rerank(query, documents, model='rerank-2', top_k=1) top_result = reranking.results[0] - # 根據內容找到相對應的 pid top_pid = pids[documents.index(top_result.document)] return {'pid': top_pid, 'relevance_score': top_result.relevance_score} def search_do(question, category, source, alpha): + """flask_app.py 呼叫的 '搜尋' 主程式""" + + # 先根據題目給定的 category 選擇對應的向量資料庫 Class if category == 'finance': vdb_named = 'Financedev' elif category == 'insurance': @@ -81,16 +89,16 @@ def search_do(question, category, source, alpha): vdb_named = 'Faqdev' searcher = WeaviateSemanticSearch(vdb_named) - # 從 Weaviate 取得前 100 筆結果 + # 從 Weaviate hybrid search retrieval 前 100 筆結果 top_100_results = searcher.hybrid_search(question, source, 100, alpha=alpha) - # 準備文件和 pid 列表供 rerank 使用 documents = [result['content'] for result in top_100_results] pids = [result['pid'] for result in top_100_results] # 使用 VoyageAI 重新排序,並取得排名最高的 pid top_reranked_result = rerank_with_voyage(question, documents, pids, voyage_api_key) + # Log print('最相關文件的 PID:') print(f"PID: {top_reranked_result['pid']}") print(f"相關性分數: {top_reranked_result['relevance_score']}") diff --git a/Preprocess/README.md b/Preprocess/README.md new file mode 100644 index 0000000..082c981 --- /dev/null +++ b/Preprocess/README.md @@ -0,0 +1,8 @@ +# 此資料夾為所有處理資料的程式碼 +包含 資料預處理 及 資料寫入資料庫 + +## data_process/ +OCR & PDF 文字直接讀取 + +## insert_data.py +此程式為寫入資料庫的程式碼,並包含建立資料庫 class、對資料進行 embedding、利用 text_splitter 去 chunk tokens 數過多的資料 diff --git a/Preprocess/data_process/README.md b/Preprocess/data_process/README.md new file mode 100644 index 0000000..39a494e --- /dev/null +++ b/Preprocess/data_process/README.md @@ -0,0 +1,204 @@ +--- +title: 資料前處理使用指南 +此資料夾為資料預處理的程式碼 +- OCR & PDF 文字直接讀取 + +--- + + +# 資料前處理使用指南 + +## 簡介 + +此程式碼包含用於讀取與處理 Reference 檔案夾中 FAQ(JSON)文件和 Finance 與 Insurance(PDF)文本文件的 Python 程式碼。程式碼的主要功能包括: + +- 先從 ZIP 壓縮檔案中提取指定資料夾內的 PDF 文件,再將每一頁轉換為圖像,並使用 Tesseract 進行 OCR 識別以提取文本內容。將提取的文本內容保存為 `.txt` 文件,按類別分類儲存。 +- 再讀取 FAQ JSON 文件和 OCR 生成的文本文件,將所有資料格式化並合併為一個統一的 JSON 文件,便於後續的檢索與處理。 + +## 運行環境和套件 + +### Python 套件 + +- `pytesseract` +- `pdf2image` +- `zipfile`(標準函式庫) +- `json`(標準函式庫) +- `os`(標準函式庫) + +### 外部套件 + +- **Tesseract-OCR**:用於 OCR 識別。 + - 下載地址:[Tesseract OCR](https://github.com/tesseract-ocr/tesseract) + - 安裝路徑示例:`C:\Program Files\Tesseract-OCR\tesseract.exe` +- **Poppler**:用於 PDF 轉圖片。 + - 下載地址:[Poppler for Windows](http://blog.alivate.com.au/poppler-windows/) + - 安裝路徑示例:`C:\Program Files\poppler-24.08.0\Library\bin` + +## 安裝 + +### 1. 複製或下載專案 + +如果您尚未獲取專案代碼,請複製或下載到本地: + +```bash +git clone https://github.com/yourusername/your-repo-name.git +cd your-repo-name +``` + + +### 2. 安裝外部套件 + +- **Tesseract-OCR**: + - 下載並安裝 Tesseract-OCR。 + - 安裝完成後,記下安裝路徑(如 `C:\Program Files\Tesseract-OCR\tesseract.exe`)。 + +- **Poppler**: + - 下載並安裝 Poppler。 + - 安裝完成後,記下 `poppler_path`(如 `C:\Program Files\poppler-24.08.0\Library\bin`)。 + +### 3. 安裝 Python 套件 + +安裝所需的 Python 套件: + +```bash +pip install pytesseract==0.3.13 +pip install pdf2image==1.17.0 +``` + +## 配置 + +在程式碼中配置 Tesseract 和 Poppler 的路徑: + +```python +# Configure Tesseract path if necessary (update this path as needed) +pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + +# Specify the path to the Poppler binaries +poppler_path = r"C:\Program Files\poppler-24.08.0\Library\bin" +``` + +確保將上述路徑替換為本地實際安裝的路徑。 + +## 使用說明 + +### 1. 準備資料 + +確保您的 ZIP 文件包含以下資料夾和文件: + +- `競賽資料集/reference/faq/pid_map_content.json` +- `競賽資料集/reference/finance/*.pdf` +- `競賽資料集/reference/insurance/*.pdf` + +### 2. 運行 OCR 提取 + +運行以下命令進行 OCR 處理: + +```bash +python data_preprocess.py +``` + +程式碼將執行以下步驟: + +1. 從指定的 ZIP 文件中提取 Finance 和 Insurance 的 PDF 文件。 +2. 將每個 PDF 文件的每一頁轉換為圖像。 +3. 使用 Tesseract 進行 OCR 識別,提取文本內容。 +4. 將提取的文本保存為 `.txt` 文件,按類別儲存在 `dataset/output_text/finance/` 和 `dataset/output_text/insurance/` 目錄下。 + +### 3. 資料格式化 + +程式碼會繼續執行以下步驟: + +1. 讀取 FAQ 文件 `pid_map_content.json`,提取問題和答案。 +2. 讀取 OCR 生成的文本文件,按 PDF 文件和頁碼順序合併文本內容。 +3. 將所有資料格式化並合併為一個 JSON 文件 `dataset/formatted_reference_ocr.json`。 + +### 4. 查看輸出 + +- **OCR 輸出文本文件**: + - Finance 文本文件保存在 `dataset/output_text/finance/`。 + - Insurance 文本文件保存在 `dataset/output_text/insurance/`。 + +- **合併後的 JSON 文件**: + - `dataset/formatted_reference_ocr.json` 包含了所有格式化後的 FAQ、Finance 與 Insurance 資料。 + +## 文件結構 + +``` +project/ +├── dataset/ +│ ├── output_text/ +│ │ └── 競賽資料集/ +│ │ └── reference/ +│ │ ├── finance/ +│ │ │ ├── 0.pdf_page_1.txt +│ │ │ ├── 1.pdf_page_1.txt +│ │ │ ├── 1.pdf_page_2.txt +│ │ │ └── ... +│ │ └── insurance/ +│ │ ├── 1.pdf_page_1.txt +│ │ ├── 1.pdf_page_2.txt +│ │ └── ... +│ └── formatted_reference_ocr.json +├── datazip.zip/ +│ └── 競賽資料集/ +│ └── reference/ +│ ├── faq/ +│ │ └── pid_map_content.json +│ ├── finance/ +│ │ ├── 0.pdf +│ │ ├── 1.pdf +│ │ └── ... +│ └── insurance/ +│ ├── 1.pdf +│ ├── 2.pdf +│ └── ... +├── data_preprocess.py +└── README.md +``` + +## 範例輸出 + +生成的 `formatted_reference_ocr.json` 文件結構示例: + +```json +[ + { + "category": "faq", + "qid": "0", + "content": { + "question": "什麼是跨境手機掃碼支付?", + "answers": [ + "允許大陸消費者可以用手機支付寶App在台灣實體商店購買商品或服務" + ] + } + },// 其他 FAQ 資料條目... + { + "category": "finance", + "qid": "0", + "content": "註 1U ﹕ 本 雄 團 於 民 國 111] 年 第 1 季 投 賁 成 立 寶 元 智 造 公 司 , 由 本 集 圖 持\n有 100% 股 權 , 另 於 民 國 111 年 第 3 季 及 112 年 第 1 季 未 依 持 股 比..." + },// 其他 Finance 資料條目... + { + "category": "insurance", + "qid": "1", + "content": "延 期 間 內 發 生 第 十 六 條 或 第 十 七 條 本 公 司 應 負 係 險 貫 任 之 事 故 時 , 其 約 定 之 係 險 金 計 算 方 式 將 不 適 用 , 本 公\n..." + },// 其他 Insurance 資料條目... +] +``` + +## 注意事項 + +- **編碼**:確保所有文本文件均使用 UTF-8 編碼,以支持中文字符,避免出現亂碼。 +- **路徑配置**: + - 請根據您本地的安裝路徑,更新程式碼中的 `tesseract_cmd` 和 `poppler_path` 變數。 +- **文件命名**: + - OCR 文本文件必須遵循 `{文件名}.pdf_page_{頁碼}.txt` 的命名規則,以確保程式碼能夠正確讀取並合併各頁內容。 +- **套件安裝**: + - 確保已正確安裝並配置 Tesseract-OCR 和 Poppler,否則程式碼將無法正常運行。 + +## 許可證 + +本專案採用 [MIT 許可證](LICENSE)。您可以自由地使用、修改和分發本專案。 + +--- + +**感謝您的使用!** diff --git a/src/data/conbine_readpdf_result.py b/Preprocess/data_process/conbine_readpdf_result.py similarity index 93% rename from src/data/conbine_readpdf_result.py rename to Preprocess/data_process/conbine_readpdf_result.py index a021ced..7976b17 100644 --- a/src/data/conbine_readpdf_result.py +++ b/Preprocess/data_process/conbine_readpdf_result.py @@ -4,7 +4,7 @@ with open('data/aicup_noocr.json', encoding='utf-8') as file: noocr_data = json.load(file) -with open('data/aicup_ref.json', encoding='utf-8') as file: +with open('data/formatted_reference_ocr.json', encoding='utf-8') as file: ref_data = json.load(file) # 建立 ref_data 的 dictionary,並檢查 content 是否為字串,再去除空格 diff --git a/Preprocess/data_process/data_preprocess.py b/Preprocess/data_process/data_preprocess.py new file mode 100644 index 0000000..e82c118 --- /dev/null +++ b/Preprocess/data_process/data_preprocess.py @@ -0,0 +1,159 @@ +import json +import os +import zipfile + +import pytesseract +from pdf2image import convert_from_bytes + +# Configure Tesseract path if necessary (update this path as needed) +pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + + +def ocr_in_folder(zip_path, folder, output_dir): + """ + Extracts PDF files from a ZIP archive, performs OCR, and saves the output text. + + Args: + zip_path (str): The path to the ZIP file containing the documents. + folder (str): The folder path inside the ZIP to search for PDF files. + output_dir (str): The directory to save the OCR output text files. + + Returns: + None + """ + folder_path = f'{folder}/' + + with zipfile.ZipFile(zip_path, 'r') as zipf: + for zip_info in zipf.infolist(): + if zip_info.filename.startswith(folder_path) and not zip_info.is_dir(): + with zipf.open(zip_info.filename) as pdf_file: + pdf_bytes = pdf_file.read() + + # Specify the path to the Poppler binaries if needed + poppler_path = r'C:\Program Files\poppler-24.08.0\Library\bin' + + # Convert the PDF bytes to images + images = convert_from_bytes(pdf_bytes, dpi=300, poppler_path=poppler_path) + + os.makedirs(output_dir, exist_ok=True) + + # Extract only the base filename (e.g., "file1.pdf" instead of the full path) + base_filename = os.path.basename(zip_info.filename) + + # Perform OCR on each page and save the text + for i, image in enumerate(images): + text = pytesseract.image_to_string(image, lang='chi_tra') + output_file_path = os.path.join(output_dir, f'{base_filename}_page_{i + 1}.txt') + os.makedirs(os.path.dirname(output_file_path), exist_ok=True) + with open(output_file_path, 'w', encoding='utf-8') as f: + f.write(text) + print(f'OCR completed for {base_filename}') + + +# OCR extraction paths +zip_path = 'datazip.zip' +ocr_in_folder(zip_path, '競賽資料集/reference/insurance', 'dataset/output_text/insurance') +ocr_in_folder(zip_path, '競賽資料集/reference/finance', 'dataset/output_text/finance') + +# File paths +FAQ_FILEPATH = 'datazip/競賽資料集/reference/faq/pid_map_content.json' +FINANCE_OCR_FOLDER_PATH = 'dataset/output_text/finance' +INSURANCE_OCR_FOLDER_PATH = 'dataset/output_text/insurance' + + +def check_text(file_path, category): + """ + Reads a JSON FAQ file, processes it, and returns formatted data. + + Args: + file_path (str): Path to the FAQ JSON file. + category (str): Category label for the FAQ data. + + Returns: + list: A list of dictionaries containing formatted FAQ data. + """ + formatted_data = [] + with open(file_path, encoding='utf-8') as faq_file: + loaded_faq = json.load(faq_file) + + for qid, questions in loaded_faq.items(): + for question_item in questions: + formatted_entry = { + 'category': category, + 'qid': qid, + 'content': {'question': question_item['question'], 'answers': question_item['answers']}, + } + formatted_data.append(formatted_entry) + print(formatted_entry) + return formatted_data + + +def read_ocr_files(ocr_folder_path, category): + """ + Reads text files generated from OCR, consolidates them, and returns formatted data. + + Args: + ocr_folder_path (str): Path to the folder containing OCR text files. + category (str): Category label for the OCR data. + + Returns: + list: A list of dictionaries containing consolidated OCR data. + """ + formatted_data = [] + + # Capture the name of file + file_basenames = set() + for filename in os.listdir(ocr_folder_path): + if filename.endswith('.txt'): + basename = filename.split('.pdf_page_')[0] + file_basenames.add(basename) + + for basename in sorted(file_basenames, key=lambda x: int(x)): + all_text = '' + page_files = [] + + for filename in os.listdir(ocr_folder_path): + if filename.startswith(basename) and filename.endswith('.txt'): + page_files.append(filename) + + page_files = sorted(page_files, key=lambda x: int(x.split('.pdf_page_')[1].split('.txt')[0])) + + for page_file in page_files: + ocr_file_path = os.path.join(ocr_folder_path, page_file) + with open(ocr_file_path, encoding='utf-8') as ocr_file: + content = ocr_file.read() + all_text += content + '\n\n' + + formatted_entry = {'category': category, 'qid': basename, 'content': all_text.strip()} + formatted_data.append(formatted_entry) + print(formatted_entry) + + return formatted_data + + +if __name__ == '__main__': + """ + Main entry point of the script. Processes FAQ, finance, and insurance OCR data, + consolidates them, and saves the result to a JSON file. + """ + total_formatted_data = [] + + # handle faq + faq_data = check_text(FAQ_FILEPATH, 'faq') + total_formatted_data.extend(faq_data) + + # read finance ocr + finance_data = read_ocr_files(FINANCE_OCR_FOLDER_PATH, 'finance') + total_formatted_data.extend(finance_data) + + # read insurance ocr + insurance_data = read_ocr_files(INSURANCE_OCR_FOLDER_PATH, 'insurance') + total_formatted_data.extend(insurance_data) + + # store the data after cleaning in formatted_reference_ocr.json + output_json_path = 'data/formatted_reference_ocr.json' + # os.makedirs(os.path.dirname(output_json_path), exist_ok=True) + with open(output_json_path, 'w', encoding='utf-8') as formatted_file: + json.dump(total_formatted_data, formatted_file, ensure_ascii=False, indent=4) + + print('The process is finished and the result is saved in dataset/formatted_reference_ocr.json') diff --git a/src/data/read_pdf_noocr.py b/Preprocess/data_process/read_pdf_noocr.py similarity index 100% rename from src/data/read_pdf_noocr.py rename to Preprocess/data_process/read_pdf_noocr.py diff --git a/src/db_insert.py b/Preprocess/insert_data.py similarity index 94% rename from src/db_insert.py rename to Preprocess/insert_data.py index 76ec8a0..61de115 100644 --- a/src/db_insert.py +++ b/Preprocess/insert_data.py @@ -16,13 +16,17 @@ class WeaviateManager: + """Weaviate Insert data 管理器""" + def __init__(self, classnm): + """初始化 Weaviate 連接""" self.url = wea_url self.client = weaviate.Client(url=wea_url, additional_headers={'X-OpenAI-Api-Key': openai_api_key}) self.classnm = classnm self.check_class_exist() def check_class_exist(self): + """檢查 class 是否存在""" if self.client.schema.exists(self.classnm): print(f'{self.classnm} is ready') return True @@ -47,6 +51,7 @@ def check_class_exist(self): return True def insert_data(self, pid, content): + """插入資料到 Weaviate""" data_object = {'pid': pid, 'content': content} max_retries = 5 for attempt in range(max_retries): @@ -73,6 +78,7 @@ def insert_data(self, pid, content): return False def split_and_insert(self, pid, content, category): + """處理特例:分割並插入資料""" # 使用 TextSplitter 分割長文本 text_splitter = RecursiveCharacterTextSplitter(chunk_size=4096, chunk_overlap=500) split_content = text_splitter.split_text(content) @@ -118,7 +124,7 @@ def split_and_insert(self, pid, content, category): elif not result: # 如果失敗且非長度問題 failed_records.append({'pid': pid, 'category': category}) - # 將失敗的資料寫入 JSON 檔案 + # 將失敗的資料寫入 JSON 檔案,之後有需要可以利用此 JSON 檔案重新匯入 if failed_records: with open('failed_imports.json', 'w', encoding='utf-8') as f: json.dump(failed_records, f, ensure_ascii=False, indent=4) diff --git a/README.md b/README.md index 0a74b05..2a8c3fc 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,52 @@ # AI CUP 2024 玉山人工智慧公開挑戰賽-RAG與LLM在金融問答的應用 -** High-Accuracy RAG Retriever Template ** -## Rankings +## Repo Structure +``` +. +├── .github +│ ├── contribute_guide.md +│ └── workflows +│ └── ci.yml +├── .gitignore # 讓 git 忽略的檔案和目錄 (e.g. cache, logs, etc.) +├── .pre-commit-config.yaml # 設定 pre-commit hooks 以檢查與格式化代碼、環境配置、Git 設定及檢測敏感資訊 +├── .ruff.toml # ruff 設定檔,lint: pep8-naming, pycodestyle, pyflakes, etc. +├── LICENSE # MIT License +├── Model +│ ├── README.md +│ ├── flask_app.py +│ └── utils +│ ├── README.md +│ ├── __init__.py +│ ├── config_log.py +│ └── retrieval_agent.py +├── Preprocess +│ ├── README.md +│ ├── data_process +│ │ ├── README.md +│ │ ├── conbine_readpdf_result.py +│ │ ├── merge_with_ocr_pdfminer.py +│ │ ├── read_pdf_noocr.py +│ │ └── read_pdf_ocr.py +│ └── insert_data.py +├── README.md +├── config_example.ini # 設定檔範例,需自己複製一份成 config.ini 並修改 +├── data +│ └── README.md +├── docker +│ ├── README.md +│ ├── docker-compose.yml +│ └── docker_install.sh +├── main.py # 主程式 +├── requirements.txt # Python pip 環境需求 +└── testing + ├── README.md + ├── checkans.py + └── get_best_alpha.py +``` + +## Setup Environment +- **OS:** 除了 Data processing 使用 Windows, 其他以 MacOS, Linux 為主, Windows 需安裝 WSL2 等來模擬出 Linux 環境 -- Overall Ranking: 38th out of 487 teams (~7.8%) - - Leaderboard: 38th out of 222 - -![AI Cup Result](img/aicup_result.png) - -## Development Mode To set up the development environment, follow these steps: 1. Create a virtual environment: @@ -17,95 +55,95 @@ To set up the development environment, follow these steps: source aicup_venv/bin/activate ``` -2. Install the required dependencies: +2. git clone our repo: + ``` + git clone https://github.com/JustinHsu1019/AICUP2024-RAG-LLM.git + cd AICUP2024-RAG-LLM + ``` + +3. Install the required dependencies: ``` pip install -r requirements.txt ``` -3. Copy the configuration example and create your own config file: +4. Copy the configuration example and create your own config file: ``` cp config_example.ini config.ini ``` -4. Manually add your `secret key` to the `config.ini`. +5. Manually add your `secret key` to the `config.ini`: + +- [OpenAI] 的 api_key 可以在 openai 官網註冊取得 +- [VoyageAI] 的 api_key 可以在 voyageai 官網註冊取得 +- [Api_docs] 的 password 可以自己隨意輸入 + - flask_app.py 啟動後,直接訪問 http://127.0.0.1:5000/ 即可看到 Swagger API 文件頁面 -5. Create a `logs` directory: +6. Create a `logs` directory: ``` mkdir logs ``` -6. Navigate to the `docker` directory (optional): +7. Navigate to the `docker` directory: ``` cd docker ``` -7. Start the Docker environment (optional): +8. Start the Docker environment (weaviate database): ``` docker-compose up -d ``` -8. Run the Flask app: - ``` - python3 src/flask_app.py - ``` +9. Data preprocessing (這一階段因不同組員處理原因,OS 環境為 Windows): +- **Tesseract-OCR**: + - 下載並安裝 Tesseract-OCR。 + - 安裝完成後,記下安裝路徑(如 `C:\Program Files\Tesseract-OCR\tesseract.exe`)。 -## Docker Production Mode +- **Poppler**: + - 下載並安裝 Poppler。 + - 安裝完成後,記下 `poppler_path`(如 `C:\Program Files\poppler-24.08.0\Library\bin`)。 -1. Copy the configuration example and create your own config file: - ``` - cp config_example.ini config.ini - ``` +在程式碼中配置 Tesseract 和 Poppler 的路徑: -2. Manually add your `secret key` to the `config.ini`. +```python +# Configure Tesseract path if necessary (update this path as needed) +pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' -3. Create a `logs` directory: - ``` - mkdir logs - ``` +# Specify the path to the Poppler binaries +poppler_path = r"C:\Program Files\poppler-24.08.0\Library\bin" +``` + +確保將上述路徑替換為本地實際安裝的路徑。 + +確保您的 ZIP 文件包含以下資料夾和文件 (下載官方 dataset 後): + +- `競賽資料集/reference/faq/pid_map_content.json` +- `競賽資料集/reference/finance/*.pdf` +- `競賽資料集/reference/insurance/*.pdf` + +運行 data preprocess scripts: -4. Navigate to the `docker` directory: ``` - cd docker + python3 Proprocess/data_process/data_preprocess.py + python3 Preprocess/data_process/read_pdf_noocr.py + python3 Preprocess/data_process/conbine_readpdf_result.py ``` -5. Start the Docker environment: +10. Data insert to weaviate: ``` - docker-compose up -d + python3 Preprocess/insert_data.py ``` -6. Build the Docker image: +11. Run the Flask app (/ 是 API Docs, /api/chat/ 是我們的 Retrieval API): ``` - docker build -t aicup_img -f dockerfile . + python3 Model/flask_app.py ``` -7. Run the Docker container: +11. 將主辦方提供的題目 json 檔案改名為 questions.json 並塞入 data/ + +12. 運行 main.py 進行測試得出 data/pred_retrieve.json 提交最終結果給主辦方: ``` - docker run -d -p 5001:5001 --name aicup_cont aicup_img + python3 main.py ``` ## Folder-specific Details For more detailed information about each folder and its purpose, refer to the individual `README.md` files located in their respective directories. - -## Contribution Guide -We follow GitHub Flow for contributing. The steps are as follows: - -1. **Claim an issue**: Start by picking an issue from GitHub. -2. **Create a branch**: Open a new branch with a clear name related to the issue (e.g., `feat/xxxxx-feature`). -3. **Development**: After completing the feature, ensure you run pre-commit hooks: - ``` - pre-commit run --all-files - ``` -4. **Create PR Request (PR)**: - - Ensure your PR is small and easily reviewable. - - Add the GitHub issue number to the PR title in the format `feat(#123): xxxxxx` for easy reference. - - Write a clear description including the reason for the change and what was modified (`Reason & Changes`). -5. **Review & Approval**: - - Assign the PR to all members of the team for review. - - Wait for at least one approval. - - Ensure all CI checks pass. -6. **Merge**: Once approved and CI passes, merge the branch into `main` yourself. - -## Additional Notes -- Keep your commits focused and ensure meaningful commit messages. -- Always rebase your branch on top of `main` before merging. -- Avoid large, multi-purpose PRs. Smaller changes are easier to review and help prevent issues. diff --git a/config_example.ini b/config_example.ini index 365639d..a64b35a 100644 --- a/config_example.ini +++ b/config_example.ini @@ -1,8 +1,5 @@ [Weaviate] -weaviate_url = - -[Gemini] -api_key = +weaviate_url = http://127.0.0.1:8882 [OpenAI] api_key = diff --git a/data/README.md b/data/README.md index 5f31f8f..29008c4 100644 --- a/data/README.md +++ b/data/README.md @@ -1,3 +1 @@ -# Data that needs to be saved in Weaviate - -應競賽主辦單位要求,無法將資料集上傳至公開網路,請自行準備資料集,並用 `src/data` 內的 Scripts 處理 +# 所有 Questions, Answers, References, etc. 等“資料”都會存於此資料夾 diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..567d04c --- /dev/null +++ b/docker/README.md @@ -0,0 +1,7 @@ +# 此資料夾紀錄所有docker相關的內容 + +## docker_install.sh +為 docker 安裝的腳本,只需運行此 sh 便可 setup docker & docker-compose + +## docker-compose.yml +為 docker-compose 的設定檔,可透過 docker-compose 指令來觸發,裡面僅包含 weaviate 資料庫的啟動 diff --git a/docker/dockerfile b/docker/dockerfile deleted file mode 100644 index 853149f..0000000 --- a/docker/dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -# 使用官方的 Python 3.12.3 Slim 作為基礎映像 -FROM python:3.12.3-slim - -# 設定工作目錄為 /app -WORKDIR /app - -# 將當前目錄的內容複製到容器中的 /app -COPY . /app - -# 安裝 requirements.txt 中的必要套件 -RUN pip install --no-cache-dir -r requirements.txt - -# 暴露應用程式運行的埠 -EXPOSE 5001 - -# 複製 entrypoint 腳本 -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -# 設定環境變數 -ENV NAME World - -# 當容器啟動時運行 entrypoint.sh -ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh deleted file mode 100755 index 2d874a5..0000000 --- a/docker/entrypoint.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# 啟動 Flask API -cd /app -exec python3 src/flask_app.py diff --git a/img/aicup_result.png b/img/aicup_result.png deleted file mode 100644 index b4a3e7f1e4e52d1702c9ec160f8b07f1b0e081ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171379 zcmXtfbyQT{_xA;fk4x|EeBa+6tXb=F=gv9j?z8v)#EDi{QzRvNKm-5)>5J!bngD=r3;=i!A-Ld`QhXZ` z@Z+}Ya{~_mpk)2`hx0;{Jv!U8+0OtxG>%I5!TKpW9fXX$ubrju>0Prk+qHi8$G(!t@fKGAzAp0)q87s zFL_eUZHB&A$=JG2w@~iICl1Q0Ta2Qv4RbCRgS(0N35oz`l6*|k>Xl|AHZwbWmVRq6 zaMkFe&w#gdo;n8w(HnT9J5+k`iU?rD1Ee8tZTEgV)@BdUF*$#fk#&pF_;<^`aahhS z!T;{gQwM;`vs?r%3}_;K94cf$)!m=sLh}Zmr*7J1m*1rjU?Kn{R1#`U30)eqaJSD|v1n{JR>~|4Rz><8jnnCzx`3Bxb^xrQ< z%UTir-^g@2#@e5Ckw{OT(*qE?D&T8Ri1Y!&f8*fBMgQN^{Un8R8v$Wj1@k_A^FHWD zd-37lI^gS0cqQ|SBHTk#+A~TExJc5I3o}3&W4ugEC7;A<~*k9-)<5^-EHfQ79}@zC&bJ;lF`%d{|2%p1hr9 zG)RVH=o1FTg+s*I31Irp>_9QazlivtynxR}WFF^dkQ5}T$H;imk~G177MPFexqWYy zItt3zUFRq}TI+98to>j`v(>odzA_pvQ>;s>Q=oh6zj3LTQ|f9E7+Mh}d61KJpva_^ zpW&_*p~j?Zfd5`$YB#YgIBup0>YP+@XEX7K8-GZAye{&|WV~e{R6ToR%dQySKRuQf z!Oj+2D#6}$Nf`SW%MF4Qg8$xTp0R4JKeWRm^(vZN!}U=EVBjtg3WTyg2``+)85n+z zQ55xDmi;%Av9LKoZ0_zeW4eCceC+*=KM5ygx4k_5naMg=s=18HCLG?t3ygI)y_6@o zFyT;s5)4txf;UDock5s;$u3=2Fqfx)$d-+5RZ&5S*dD{{hz)Lg8T(&=|4`2IaKg#r z`Lr_MgPXu$t*ikb%w7}nalDfHZ;n)J4)qk$5DTOmKJH>d!r=e2%t3m2BJL`;}mZrh&@ ztXI&gif#nkF*D)&dHJ-eErtEUFMN1A}=T;a-@xnunXo5 z1zMiXWByLphs7g7FKvq0X;)&LGy?wrCLCf;HRl{Y-=<3r)4hfB_}0G-vohs+WJn|p zF~~Vl_?q2CEBaQ50Gn*s`aUy9Ej|I&+e=*hVU_c!BIb@K0DSIbvaD`2gjHxiMh8kx z*RZ`)VVk%!g^cG_iI207k3<;g?YI2zZL1GjAR0PRUed}5Ur}crjb{*KK55eUx{@~I zf2pLt!!*}wRV4>!~(0~Ey3Q-o>fA5ashXZFa9#WCcIFC5gW?iPzPH^~- zSfxYuf6<+lTB=8}z$(JWJ6wO20j?HWJx$otZgp~R>#)|aGap&e%>};foX=oDiX(fOyj%!owo+a6%k!1Bi_)t^MB#A z&t$ox8M4V!xkBtXP7xw{?5uMsuQfaC7I;(}hHgGXf} zr}tkyBdy68vMnm&Um_n7lxV@Q`n6L0 zYd;yi2a#YxLOW7H7SG1np`G9t1RAL!qs=XMGly_a-GSD^G? z)-rYdf(!z4D)I|HvX@MMj|uhPI{j?;BZmWlb-CrZ3eRDm_ywUY?RS>@4!au+ORxT< z<3eDO&J=4}Rxfvk)L!1hau<%GELyCK5}@#rrQ_bEYq_u5VK_%aZTWQEYZ zD$fE#jt?~=S`(S~nId?*7`>0md-hv|=n_1AE-b6ImX~L~N9mSkzkFY%is2`LL*$?^ z&pM4*Hi9+oNT_9UAqfRU^ihr@Cb)0T_}|!DJ_^%{enb!pZz@)P2z7mQ7se8cHDbE+ zQ|RHpXv-1N%jO8BQ8@MwtV-jdWJadsrmMYF)%6fjBm;9~9NB9ae9a`zlpgMAX@qn# zh<8UEFZaEv;sZkMsk^KBUXyjGJ+e$@OI^YZ znN+??MS!&TNn;BlgUXITPTeyge49R;<-Qg%(qcSDev~(h$Ux?=Jaf`S{huofzfRiQ z>;wdG`t9nWxB9w|QnQ2f^0gnYI8s8tVv^R~nQf|?4I}e(OVbd329XdP0DwiJ9*<>c z7F#0U2TJzyA}u(^9^(K4lj_>N5L^N38qO|vyNzmc>@(G5eacXE&t`mswhzj-c7|p8 zPoHiVZUy{T+1Ea#Gy(d~{D7e)DYuh^p29~L)_*G~E>JG25xOE0Vr0adZtdH~E0+0y zUQ3A;V{H858wqoR^~ko3yqnuI-)N|%Lxy4Lqm&XS18S>&esFw@brd)#`?L%jhb9EK zP;|&(7?g>ihHmHuQ62Nw#{h1MTBDq{)PvizSAr>p3KE% zV(}Aqdi}c1_v?#IFh--Dtm0<#%x?y>w`s>K9Gat`tG=dxeSKg2W)+#4vRMCiHbbac zq^R&PgwBF(dNi4OD>YEkHh?QNQ^HO2_`>Qch;!%`z&Xk}I5d$|Bs`#CixUI|~oargLDlB{g%Pjrlj zhvH5%kC22D4b{E>wJd&Y#wt`m*-yZJc0oF4D(Uur`AjdDBUEINA@;(O50HM8J*e`s zm}?4$I_IFrGVl0~%hRuwTZMYBjC9NN`-cWm>}*j^ZOq<=)Un4Mo@kkVRTy~$D%Cs`-G?g~)J!5o^Ima;46(3wx zQ>3T7pcj{*sNoX|9!H)~gKzgC4Y)XkhG?$QXC!FTx72R=)X&*u`;Na}wv=;F!}{F@ z+iPUiZb-*4Evw%&^q{C=#&_sR`$deOO=45$`@V>=kL@ zXFxg2ZF)~J$2UCTUwK+##fPg?;9={=ly7$)aEjz|1G>*|RU*0`<96P+nK&NEJ-bRI zIrN@yU)z&9yOcsv@~1W|31$ifF4lxVZxec6X-)kyCzf(DvM+jG2MBHxkzyWwSW7KcqcGPWC%@BtiGzLm z>J1#-V@3~j><2QwU#Fgf?rtOS7k`$bRRyHPUh_UK8U?=knwj4lFw z=lcCVB+9uSkx^&g<9|V&AmBAS?1eUTnzqZ@Wtr)ep7>_bI%4+$vpPcuihJ#wg-+Kwal~kry5&D@2uLlY?XJ7c7~4tw zllW|EYVK7X7`DAinAxr`8I6mMP*akDqy7~Mblc|YhSEW)|nZKA1D64J4= zZRFf+u_hGqw>`CC*X8+C3GL3oBUSmY<>q1_Bp`#jE}3-u(YT~ z#Kf$pV3bw4OZJxd&;hVD)3(vWMP%IUrNyyM2poF*Ncydx!p}9)Trpi4<#+0p4I5|c zqV3bi3?;I;*7Y3lKe%rgd*uT*22;CBa>csepQOa(m3U*|5?`ZM{6@BsSHWr&JnBRI zoTH8(l(RVCaj=LM&c;B=sWq)vf~|&QI&UVQeWk9+TK85qtyn(V=T2Xl+I#&LY>A_T zX(;g+J4jYpUmW9$FY?;Zm?q_%O=pHHOz|l)~8kbAiO%MA5i| zy-sTy2f*9g7beX+h0J}Sec*@I71Bo6R(^b<p!LFzBNT5+14gu6lpENn+W{58CyKdLTcZP=a*jQpa zs>}RM`j+<#mb9$MM=^2MT=1u=$*g3+u-#{#9oi31KF|^BW9s7WTPgpLpK7uX;wLi! zeBeB(Oz z5VKw?#{x^$8iJ-qzijMjVU=U_9Dl!I@rT^(9+IxVwmoW*2-b?1u6=2pNDGG}g;rw+ zQZrj48@J%Lj3J|@xtWn)wU&={(z44aiI5iN1T`(|M5jR`pM@xi*`}$HWvM^joSiB3 z8IMH+FbKf7%v8Kf`FfFu*z|d5F>Sn3VOj>^JB}2k0!_BMptjV8WWUqKn9y}$o(M6q z){*Z?PExQ4MhO0kgfauIz7?>61q+$s-EaDb4J*<>4d+*CX>}e-E?GrtuzK;Pllb@$ zCm9c-Qk2H(RFG>DiKH0d9YO8;(hIlW3d?+HI8Z|8mpTaM3JAteKC9x=8jVK0 zcqjz$MN}Db^+#YNbU=7l zvZ>-si=QlLzM|FbV?DNd%doXhlj3w{{^sCt>nn26YyN8FWn%8b)*1HwBz%in!xr`^ zz7A?P$?@F-Pjvl}C;H~HO`?po1U=2e5F9vqjz;@m6*Ko%=)caTO2`o>1=gQ`Q%gvo zQchWG7U2>9`)8KKJdW=h-P+Mb3;lL5gWrOpuNy1ybT)Xfz0tL7E!%BHm&z7M&x zH8b{1n6bfFsZm@?RJ19?j5X7Vk}-n11U0q^qH!vt4;3V;Px=Q`86=RI*&{mlWuka3 zeLERqNq5?~8@EjiJ3A|0 z-I5ihXQg9*0GMgDZ)4{^9ONyyIQ1i6L=CvoMZ6Uhu{ubp~zp zH5TML$$V-fHT!J5bnqc$Sf*}nu1^kc;H;@ND#Vr~$Z1&!NB>Y}69J%If>tPG5*s0+ z7a|<3ElVL|yXY7)G0)jCDi73tp zUc|=mt%^`uIbyqcuZ0chono<{%39Fi`Q((C0~cap5wqJNV;_ zkS!1EJ3OeZWEQ}cV2axDTX?_fpXQYOM&)>p@Bj$a5xW--wTL4#q?0x{K2!LN$uSv_ zto#B(WuSVCyZ#bScL$QyBOeFD>t;hb792l`zQkX4I*PrZdrCbXH6Z6peb?!SyLm&GAE-ax$+Pgft71jd4NG<42bao zOKRj2)CN+eqKa1Wm}2e$OG}mZ6C`qbGqz`%fPhqINxpCR$S^PMVea>#L6g%cqq`Fr*y*t z=Rc9;ssMaFKH~NEHs{c0i6#$)L5>gp>u^r11lTh^ZL}%peJaX7g-Ll1L;3TJ5qR}j z+B?m!L3~6e2LMrIU3*O>(ReXA* zwrJ+iDlt`#TPt*`vhJo{%CqP|BxUe=-S*^aKq|OZvrLe<<$$Z=>d2?fU?N`Xa)zp8 z%-^G#GghqL*-)&~1`~~he%C)k- zxkjSO1Ire-_dPwDkYV=bF#3IDz9YS9y|e2;0#_GKu8(!#pXgg}i)^(N)v~;+1%>>; zif8}1T~TNNyx**B%zJmTy1ZTQ-WzSvW}lnRQLE&)iP?r{@V8LY8o#TiusNs9@t%VB z4rRga%l&Py74J$01F;$jHi6?1O2UfrS&v{pBV{2UC?|1T-SL;RXo(|16 zqkpmUr%FJ_ul~#Wn~S2s1XbMN-Gnk)p>kU4KW0lu4Xc_P%)N>^lELR4@2xQY8^hAO z0rPtVaeE`l1&O;-zp$esPb+OU{|@(GerOs0=Y8T!zHRAX6U}io<|eQXQ_8(sai><1!nM zH{%8paE|qpH?r5(Osj4fAk-cGOd#_I6{ayTZ;DU0vje$^2BcLd82mj$ULADhEqwF3 z1%Y9zcLPqV#z*)4W*0-}cTeP*Wy01<(Ee@uk12k<(QMQ&dD`4Mv6K*j8=T8dc{>`{ ztW0RX$30J-^FzrS%f3f!FMfN8)!_mZIzhktm@&)ZG7ID*uHuxp39rP5#%O=Q*-{7Y z+pJN2@wj>Wm;2tGCKGp#^}DC7kUY)eqyZ{Q{P&H?|k8orrkx>d=o%&CglU5XD z`>ctJRlK=V?1|{aduJOq9~j(|cN>um0s}E@&Kc;49<>6u?7%c!CS-UQY{EvKzq6Wh zDAV9T?!VCl7gn!CPgAT3Ov)hUqDHPk;dKbwCX4jd8e^i6aaC89Lma-R@>&#qn_izD zL-Kei=_k=xs`x)8Ntqd|ERSZUU=7AlE9D6Ra`I8d#KCMy9i9~Vda-eADxD#%3Y&aA ztsqtT?c!y3Vk=v=JM^4|qtz3%f7T%^$t1nF0I58mS8K))IWC-@URG$1sWB>%7wkV9LWdzbJs1p#vYOZ~pJkoe%3M3fOGYB6B z9s!b3BwbHQu(i=EoWHQ$)qo916Gy_3^1uR%2xH9Pw!1Y&9Ms03Z;8~$OQET$Ws$eb zg9H;+rmjaJ9g0{_@9R4!5{U*mPgDKc9xI{kY0AV%jo8K+)X}Y}K#L)A!rpI1hQue{ zK3~kRgurL*%}9H^z&Vu8+Ii>ol=k_0^!u>6^1)-g<`2xM5Y<$R48?@(;Pt923~~ck za<_atli)q=PvH4}U#tc?40~y5>?%xgBj~xoyGegS1 zKb<7pF{k-f{bjB^A+sDi$RBs07BW^g(SE^Iaj|0}rKP={Ak->K7Aw5s(&pStIDa*+ zRj`zMmKhT0x_dqTq9@xWBVQIUzUcP{+T`5wx<`6 zhU^AjY)W0z?kd&wjA$3GxRD(g1$7S zLVxFcTF3z2+`;QnrO5?cvRVg>l0 z8MttO?GfT)!qc0}D-^}CaMV!I?5*tLLpbDCh9-l@to%sa_2aGiq|Fr3BsyJ=tzx}L zly$IWD3mt1nk($;>lrxRm||N0YN<&E2t^oRcVB(Ye3q}XY=gNQHA~IKVTuw@!gLasa~fiC9Eg8D+BSG1(BXnX1#?|NTK2U$*=ca zy=r9*$~=LL;$}jlp8r50$dRB-CZh5?4gz1=?)P_lqIC&@i16zH+VSIxjif?krCWAK z-L`RF?QSu1Q7>Dz)ZB61={K*}Wg#`2gcktNWbx@|qsp_pFvnO$A4huUm)*iUS)N{X zPA>;g53wP3++O22kLeCw9z2}podk1e_16`L?F*k-6Z`i;^-fcjUcTR1l?Mp7%*|e! zXxw3tK>N(g*b?`8bZwp+iCNnQL&Tf-)iDQ+HZaD1x_R` zyAeuZ^^f)5a{xHj`bZGARXG`;P-V3g4K1Xgn$sPfk74*LU$7$$SUB31=$0Cx`l9oN z9^Ce-y#=(6q~&oS?X`*V6V_Va+qv6CE&3H2c9M|)S^qO#`)Fjo*R{p40x4jiH6fz$ zS0O)4j+Q+p<7WpbuE1-HnuBKj*}sKpmW{{s^e?kiIhi7H_tMz!RmC;%+^caShFO2k z$SdLGiF%m0e)Qawhh6Dh678_8i_U8TNH7GytJG}?pTrCRk0YR3T9|atR{f-_;HfoY zA5TgfTjlhpRoolTpujIBghgOW7N$Bp$^aE)=d^ZCnzj-~u5Yo&hXZEFF3Sj5ct>Oh zU#5itmbW@tYeT@6sQ3dS165)d^Hn)t>S5yX7cy&u;xR~-feh3-)#-s@t3^72rM}vN ze0^zFUq%z^mqYasA=yvCGL7<*vB$9PIu*2TO&L|5AR{P9ZoG?)3eL5i@`hNj zP_!JK(^Gf87f61xwmR5k`~=dOP^T}vZblQIg-GM-dPSzt?(6EJOj^F_1t#!VA+M0X1 zPB?dwAoQiBBslkEu)bCDVQkBqRj#4PU>Eg#@F@3MjleKV1m3N-lleWHIOvea0JA7Q zn1io>-<7(~o4*+?V5h$uXxnUcK}2}rj~u%Tqg&s;K9D+99jy)C8#cA=!N)!A1k=xn z)bVxb&?d#GXZ9M{hjr`*?N+q%Et~`|-<4E`jCjflsf^YdDlR5ux0lmcKYG9vVZNu+ zzTQm;0P&Guc^e+Fh;Xw5p_+x$S^Q52rs*fzSC13wy5~cVlZAHY+WO^b;AwG+AtyJW zo=J4sx7OYw-1pXY^MzcOlQRF0sV9}FO^@93vf`;TS;d#aw1^ky%~CgV{A3<&k4tQ@ zb&P+hVKNJ)N0H9dJgCZt1DJ->#ThLDuFcbpDt(q(i_Z-3^%K8)d+Y0`pS1S3OzazF zDjHUr29F~Srv8zNbfd2zc^z&mNTZptIqwVA<`!ovVJe6P=e?$#>9V6p{$rBea`qqUq^OCwa(plrue)iud`(sE(DJ9e^VJCn+2FEl$R=6ppqQKYvA;xg6X z+@;>m99MU29r4cIFw*|n%jI*hTwxp9&RCwR##-BigN%W^(4n)jYEF2l7Hx0!8GMRuE&i#GNW;HA4AylJjv3(nf=C0QsKbyi z=_O64>ldMWFwT%k@h}mQ0l>R?p)l-IQq{Kr6b}7{2Lk}P@BFGJS{|dL zHS8~KP;9E8zphf8>d!h<{9y>E1NKwai%e9HE4T-AH;?>_KWUfb_cHh9hrUxNOv=p` z@R9}fX-vs|B4Vq86ctLqoV;0sd*esXQE<0;Cu{R99Bds+y`pCy31&Zkod{1wHT5dE zbK6pXumPEa%NW0PVPPDStfNZatM9aww)d{TSh)>JjeUh%zpd3(KLWNu> z?zY>-;r||SbR_iCd=P-S57X2dLL1KcN4*V%XfZM0iJ7DNXKRXmnBnlL*D z<00^jM{1kX>dvv3i?NXF8R2w$UUvO*)1-5`5gBqeg5YAMew#N?ojLY zQH8L8$d!-T*@lMZRsjObuDa zdvF=cbJ>1#;WCe7egqjPyJb$W^z!DIkX}9%y8pecNb+W-f+6ty6nt4t^Vh@KeZJbr z?vs`)(qhl!-0LGOW;1MDj8S)x1oI5qeB)JbRy59lsfl)6|}G`rbJ6zwq$ z#yBgIRXSaC<(?ii@3h?on3R8B%&Yg|VU-Zwnag;Sv88}s2q^%xa!b4nAI}XHq z8&`-|&MawA%#Fem5}t>@x)Qg+Y+rS|eR0|;aYw3_g5p*s$-(Nx+}u{yMUJTd>Evz5 z$dOq6onvoV2;v1rx9vN-mXzx`ZbdT2h#9YwAX_$D0HDJ-V{4rc&e3g>Cwow_!I_ZH@K#9s|wooA%ZPQEwRmR{9NZ@suXSojl^BtaEn z|3aL4Np+L($=EbVdz3q}z^nruj`waUmW)k%LJ*It$UOnr8Y2Vw%9@bujhkNSWm5-2#8laQEJs5xxZ4aFnZslJb|=p zWJfTve5!6cDlyGMKZk0z+`p0EW6RgUvsRbW;M)|Qh+&zel)L}$;k+qw_78?8$9`x9 z=9!U2l~;VPy>uR-Rx#=QpgH6$-JsCWjfC_;3V#Z1<%hfnIWB;l=geGJDlp}M zVk4ndSsj&h5#Q^g4a@Ajtkc$h%LE=Q?Mij={pQM)%G1-DVeyd{w9=lsacHH zJ`CRKE6R~v?AQNC#WM?2iM4Ks}3zAWW(xP7w->BWGENT?{&`mY(aK{ zTz5eR&g|l=t&ht*3D5vGu#y$c+NL=%?hZD=C$HvpO2=@3-J4SepIX*BC&RV=xBqM+ zVv?6HiYA}T?R6#xg#0;ZzyUzs;QBSgeCeig1-OoyXx*D^&|_laGyf7|@O^du#3=Xr zLh5EYVD6d#=oprEVWOnT&FG=7FcSltXvTI(!Q?)zy-=@>+G?p zBM2<>-Nmu^o><7fUy;w%h0m_2fXG2l`|0bQgikC)*m@G>`7;e!jZ74-S~jQ}&bD8q zx4S8f`2-(o-R!Nj2cB_F-~i7m7#tr?uyQ>B^j?uhs54Q5wGnN&gfY7rPi?<0^HAIF z>6|jU)$!BIQ~|9E$|UgbylIH38q5mU#Q4;Ax0(D2F4&mA36fQQ^?^Dy<*?zQZhWwGCvnpI$}u2SdN;kvu(OO3{u zXGEnD^1kY*r`7ItSHKB_B-YTTDh)*oh1X*WOER3PFYZ2^4f$*L>W%G?C!Y=p9soiB zQ0>p!>OP#|dFbE2cT3dU;fs1n%g&0BpM-N{r_&zD-3TNM$=8gM!@&f6)&sVO-vsZ9 z@8eZ%FM5HxnG94IDP~6TlZvx+28CFT=~*?gajVG;Q#_`hIXDfA%*O$s;m{7kWAR0= z=5bH-E#UWi*BTaBDDbmIYkBK~MU`}+Vf$K`qUY?eC#cv%OSE4}o$g66_|4NpWa6qg zAh8z4Bbt-XGwqsS(M*8)C`jwSak=_iG(g@-jqWK3@3;m0oVw&W5zpcI003kDOPz`* z2Xqso>DC6QCsW?bllF?7Ug14Fk^(~|ILbp3wRQ#wLz_HpH;lXNn9Ar(^Ud&^iaEq@ zhkN+Yd&b;)ydC?-t=eCxVhv>toJuZd!Wb=iyQ&7W$fcurZTxbm;Hz##QxzL|FL<%J(Z`X$!5caB?RID7NSv*J~l2+gMgUN9Y9VA83 z5LomR;dZ$h7L0JD@^yKCF>^6mRXTeO&DSpRU{@Q=5l_#}6z~EYd3QRV7j61a$FaS) zla>#v!odR%scdXA5cyOLLt-qn7SB(2XtzZrrCWxuidxJ%}RK4RnxS6iAWdp0KV0s;rCr^^bC1n{^pEmN3`YbG0P?>6&sH4SBPf(oBJ-Q9 zZ!@!S`?*;W2$gxzl6qaNk`83>eak?Jk!?&ISNM%Y;bvHHC=V`|jo@&HvP5s5PYCC> z`%KK1<=`I>r-P=Ylj8weeI%K0Fc#HwRIUqFYld+{mg|a;i?`TkWge1Xw|70i>a8>O zFkpYU)VUQ5-aGhE$NMRiin(A%!Fc4{j7bHe{lGGCI(Kt9Lx$gt zoWwiX_WN4r6!C6o^S_*#SHKQh8Zy(B5$+UrlhduY`me!WZRZ%vM9^-P+7e8q|dCX6LjCy&$@C& zs8gK&BQPIl_pQdH7?#bc+pJPL9Q7=2b{~GRlIH$9gK?ftQL?RRv}`nVdirZhyGbx~ zy`;8>DIvxoZ9Kg%ef&Ekxb#!n)0=L$0H(!IWh7EAOrE4moR5D_r8LjMUo_K4^dTG+ z+V*=^_7u&Av&L=>-ki*NM&kmt-Zcuc+jg;pw@l;smaK7rk2EyhHD9lmzowza-mCb| zaz{WhmPPhRCs;QKEO2fnyPpCd^-Dng|2an}lx}M~Is%t?!?;}k=TnL7C)OVLy^9!- zE+a7ihess9IaTQ+-9*z^_LIJYl>L5b)$crmva$O*$*dapdO)!8?Tw0LcAw5>yng{- z>W^OzM^7Amd<3I$p+wI0Vo

H@5zBgxZ>&gTF{NXhukJpW;`Az$^{^*#<*}=wvv_ zRqEDk*N8k0%0{I?fG1G1;`z&yc)KvbMJEVg)K89O}ohS{# z2Oh0hPwb^e%0Ofy95FvBhx)`5m)`J#8m=Zc8hnlC5>Pw*pGfYnJJ_t)y$obM% z8kN)6bMWC)yLWxOe+17@wY`XPGB|P)hP*uIiA5phWm3m0*;|(HQ^j@4i zXhnY#Q!TY{8y^ObEa8q#4pg&<5Due~kc@Nlb|B)TuGK%61^BwYk8pIk)j1s`u{2mm zBKW#8n!f#QS#YPx_;cAPa&`*`fLKLUEhORB)56U;O3JxUASSJ#br-k|tIL~+c>`*? zQQIs$wIr>kj~}Hd*~7{N9}I^5v!fb(r2V#NRm6s}(YroeotSC+`T8SGS(!Q~53MII zptMp#PBXWZBqPvxbr0=d@GHsHNaGi(un@IT7H0p{#4L^nf@4~3X-9go%;{61WG-L% znuT1l-Xb9;Ir7FB9T;u<~PvfqBdQRbt6*Kqv=f(Yz!5x~E`qDCo~pX%5BELA3s- zM?|5lCg%6e77Gj43K2Ie_`0(VU#7?H@rFQX1P8fe-#_1@5i0_X;fN_tOoK`F(2~7w zb?v^{(CW}M1`25}fUb)R;t&Y~)xyGs4xR_o_;`ruz zDZppGel3tR81|FjNNhJgD)RMU!MEBklUoQdchYsK^1N>l~*D6@#oSr{xq4I zSmZXp>no#O#|Qq>z1`clXtX!*SR+zFAqeS=U0&6;ZQ#(ADq(e!UJ4Jfa|qB$cS z2>_^!aw1FF)pGsz|MFp~eG{mVwQ=ghAs8<)T?y`9w|tIg@?peJy=|N=K&-cakO;c)2G&TNHpcH^`AN{aV-HA+z!k*seqqHhjBFqG z{_gXV-D{KV+g!rK;iI->S7ciSkpKzhz;ghU>9!91mJE;x(ClA9TQXjo#uzFbfCFcQ zL#!Y?V~3y{j7mO?dusDlo4*rAvt-PHTd!}W*1zj_L;vBY_A;(ta~rWe%-JRay@_J0 zFNY3^WFr^>LlX^Jw7aO2-C7ViFWu(tx2%a&Oc69TQ+BTb%XAxy;NbH~KCMw)Cnpej z{Zd|O)GGSZlTY`zp7f4kQ=2dW+p{Wg23-ePjG);nSymRB_j_xrzb~1}sm8EkC@~(T zmiU3+e)F;pP$` z|CVjBG-q~B8bpF62B*E=P!AMeZW})2e^?)Dk)|`6 zU2Z+K^?-T#%eRWjD}rkLuIqe%Mb4(+2{^I(p@AO?9c`tpr*E(Q1;~?R;h+Q8wzp{ zFnr4Ud{?6BrhB7m)7vpx5l%O;)dbfI$TUK>?Y(9&`^|vy_&UZ!#7N+g&)78kg{1`T zP@rGwdF9^g!$(@9%XxoQE4}YgD{D#R){%J}YyA^G-i6rSa3`nq=-Z%%*umD#uc{@a z8+j)ZJVhj)XWko0n%&ja=BrZt>x1FgFE4BzS$LY;YHMoUJ9tz<&eZDun(`G!fLOkY(HyWLHCaMT{UVjs+3c}o&BS?^mZ9W` zZRD*(WJZSZdY@f^dwpa(`s8Sw=#9IB#iJdLW#3NP=-Q(reC)jzPW$*88!J?KD%DTo zCEIGP(NzckXP|Z0*Vo`TOEmCV=mF2Fv>dpZO7hf8gkfL0@}wCTp6F2tP|HGY1-p3k zf9Rvk@u>P)tJ1}ry{`09BItK9GrOT#xOne9TvKc3s*;lUgqMO3VpyW1^_M|`=eoc9 zaQV=<)O5+M+4LkPQ$FlwHRMW8M^II0b#!WO=MK>E&t|(j=jAi%X>jiic%_#{XCgkC zd1>h5qqX*QjOopQ*FMPaZ-KIEh@D1C2V}d=yHwy8TSS()1i?Q|pIpl$0)TYF*-rlW zT<2gZbj2uQfviFXe60yGIqU#=I>y-^2xPuESd3Wfb5w0;YBq^N{_M3UpT%b6Q@$W3x3qB(m=)eGv%Fy5~ zfSTaMv(AO)p~Fi#GPrZ<%m}5298TOYob5u&XMVS~rMbZAAQGLueLLUGrJ|TSzdtwke>26oYG?@`6z=io6>IJX4P{2KMG@Km}7OEN})$DFGRXNxptl(FhqPzy=(4N*(zZ?gGPim6Ci`wXp;fJ4*L3^kVQ+iD z#OxXT(ZYdg$oBaBWrtX{!`+7xe4>(G21awE>6c6MSASF6kISZh;l57ydfl3P@vAr6 zVEoYdNBT-hhWFvJU9s_<)1W@NtygBJTT)k>^}R(lPsR+HC>vLr=<8=I4?N5+*T92g zB?eruPsU|zmKH!qz}((9&;-FpA`1}_5UJs~*IAQCV1(7G5Gp~7M*O|8-5q?rEc&yn zBP9K7uC%$Nw6tWGR!BOO<#{NcjHNG0B8^7I2;z-mo(Z;@C_t~Os+6?Xub>TZp zS>5l|dcEbkClM=EHVVgaPX*`(JFT9F6G{Ut3ExKIB}+>;CFfImulGtyEB+8j-;;iQ zb!7?1Z7wxy{o$_{e72JM;b(7xc!QPo@S4E?W9}`3;)=Sp!G_=tf#4S0Ay|N*AxNWX z+}+(>f)gYV+yVp|4UM~p;O_43?l$MW-@V_|{G6$os;TN<-KV#%z2wwl>6T5mIJp_nBsnxd~ev~3V@sQNo^bL>TUxi|#4L%mxV>1wqrMhyBU zro_CDc)_^Ec#^#SAdOL?JQIpEj@V1z#nx$npEwL4>>od*_z8RZay8%)B79 ztMl>ZgiH(V1RuN|Sxn5)@|Oq`;mOqMtJo=G^u!5l>+KH;`wUVwW{s3si`OwR18-_l zG{h31ux14$0WSxg97swp;2H@X<-9qjkozZ;d{cG*%0wNGbrc!e#eInm1=p@{UWQH- zSMNUhG`AM(=PKiX$a;rOFPnR%T=fo5kNr=IH!Vhgqzn*@eBmKms5SAdXusXoSkWa0 zCqNe1v5`pQptAJ|HFF)&Uf2$glq{>oK7RZV{QLhCS$!G~C-8{NT+msd#Zq~{)n{rF&a zoTbZj(xhIdKS&rI$blaPN8K5VRX`fHN*UYBt7nnElWN|oTW7=DFW^B|t)3up7fk(A zb$&msF^X_P1EyLnz!YktT`N(UsfE&GEa6zH?nYktb6BgkNjK$r{2lkz$ji$&zeh9| z7jvjCn8UDDJYb1y@et^3xP7uX@qxiMS)eT$4!@SrE8bM zGLQuGNU6K0NY_G;L>aJk=J)9CrKFujUa8DU6;d=q;?U}|Gs%+&;EB%$ujfiwN6WP~ zt|%a^rT_p$n{Q<7%tF9uY;rVvLX`C$IOp6XD`b_^o6@TS;r*gH}18{tj_@k zF9%n?)wG?Z4y}(DHVgqf-4?_qKghidM@PmZ54nL-2GfcF)1p-iqV`+T*NfhO^%U(( zZM|7xx0{yw58LN7*e~I$PZ~`y4d&W_htUAL%RKhhQ~-Drb-u%)-r5UBe(iF2DGdbf zG`w~SU;F8c-O-~OMW3R|j~0db=2kPn{{rr_pKpPYSKmumxfZq83vI{1`5!)(``wqW zKJ}Gdb&m>PqKiJhg_O9`3vmf^3uRLyP<(1wCGD~0`BT3ld>PN*mV}9UMZdwtaU9BZ zz#Y8?3BUj`PcICXx4CuQ4`rRtRfbb?Vmx=OWC1C~kYWK?#@^B1F&HioQleJu#NO%& zsGJ|4TxBL}+J3<(177-#8{xrpf;NcS{xr znB4dnp6F;W55v*eN9?0`uv+Q$f7+i$rS=nM;_w=%vUA|SIU;Kfc%^`<)~+xn4KBEwGr})S&O~ zxvs9uP_4SW%objM&fv1%dl=Y%z7D&8=vOI2W6F$jhBAj3Mk5A)BmCvxqRea)jd^_w zW3{e^l&v_D&2qYeJWu+2-@S9Gw7fgIA3P0k6bB0k3uQ<2f(%bbxTy0t8}xf-9*$|> zo_~JyxXu5GO|g{1g5T=;!;*HXxdt>0EgfEhMWrzGgdw-!6*l*V0U9R?T6K8g$x0Fv zMhqPlzMj))zjyXyk{)u-)Xl~D@daeq+ZVX%aEFlxDf4?iZI?!w=lbAj`D*`p7FdN! z)#4e_kidGGl39_M43^Lv+4&FRa0=*B@4czSc!vp5+^?>bW1M>3NMaiIDY==Cun& ziLDcFDHd&O;^i^777CMC{y<&?jpwKgco>1l2>{xV5hmV&O{o zeG_x`WEA2~$Vzv%dsL^qQ+1(0*oAd1$8_mQqIM=}lRAFQX*krL)@Dio*l2((BDVn| zYB9!K`MhYSS+~njYd#D0QZQ2w517~ppV5t+fuGy&d8zSYk zdb3jDNK)a+gDUNSntQ$A_rLwSUF&us>Lh_8Vf6u5i9Xq4G(GuQI^aA>^mX*LwlZ-n zevt5W*x}W`xad{?<{C<=VBjYPM_973n`V{dx-OTe^4NS zQZC~=+lGVTr?sDjMDNB`dMRaH-9v)lPO+09**-gw?E&}G3NL5V{HxFRulokR&!hev zX%Wb8{5dGbFJ=MIqWt;h_1TG8>(lKNFfoN^!Fvt6DD33%FW_j+{A;N2BPd=lwu z|NZ0>1vxm_y3#q#N;7CUkB$a1<{iLaJ5F_6^nqFo-G{5j?Ta`DrEC`g(U(3W2StCw z?%F}O`!sBhT4S7A@6GFkLf~*}FpHx^hI}q_48#eFt1aHpzYD~}iwZLtubtjk3UKTs zZ6qh9KmbX|@Q{6nMR8;b`n-gR$Iah|wm(0fw%$D@2p1!m@ZkQSQ>XnoG-A>A{5 z@V&Fnc+Z=8+#Fu?KlSR*Yqj;4-4g@NJyW*c?jqbgW4(;aTpvCbAhm)3Y3+K5kzraD zxLn_qrbGyIWZZMR!#-LT@OP`yE;S%(=ld{4`Qr<3%yNL?=s>%6b?u1fkdAQ==M|vg zp!!~u)BXEVa#0zoHrJ=VuhJZ!fYdodN@`j%j1UcE)&ld1o9|U3=3Om<0>V?XhnK|Z z1zt>`Vp9uRGFP%+M@O8lNT5nfQ-xNHMW`T32jPLyWuJ*PsXcnkKMAaQ%75w}-+{@H5ftJaoMOjbHE*15{5 zSuR7E8DDQ7#o?f;CDV%oeK)HJ%vNH7dG8?TJo_Zmo#$;n@fMF){D3m`OpO;G`>`~Nn0+J3$K@p@3&eqGw$ zV$mBh%85b;W*V$2msbRIS#Nu*>$W;rbO~LXFxgF1Bld8lfZL(PugNa%3sZLrShqHI z&IRxbvNHW&_ItyTy>-xu!Nt}wJvI(mO`QI2+wXK!+Wj7ajT^l;=DJooiWv-8172$r zW-WHq+h&c~Uz1*MCJ6OCOIW7&hyS_jdN_OgJA3b>F;GnN+HE5q+XUQRoEfhEM;HDx z(La_2t?2@}1P;Et1mysz@U-k5wpmzG{%Iuvdf6BG! zEgHMxC`ZfvNSZBs`^%07vqsyE$Le#X1yG!KH0$P2hWv{y5s3d@H>w#>s1FA>+FTCE z;5_fXy;+&1h7N5Ce+Zk0>V&@m&5wg#pcVocx2=82#>e#B$An@Punhb z(tY0+Pt9ZZLRFQ>MJKd_X;L`A#kRd(_tW(SyYDDOy+6LgEdN9g)ZtOKosVQ0tfu^P zCu{9;m`@hPm&d}wq!gU1xA=jJVbyekjucdxs#WHH)_SVv^ZNYvD030^yQ(m+a5r}} z!2jrM-SLw?+ZMyBsLM_>N14uH8x!xRn$z=5AqsECg=szcQNl@dfPJJP6GR>T5cKk2 zq%(b#7)c+ZG*-PH2ZS7e-@C%G$e;VO<*}|f6aiFX(BN0Iui3D9TF=w^SzqqwThUwH zmh#a*Gq7v{mDFq%i94Ej$$)@UnBF*yT|&ml|7D^1H0!bRb}+4btD~bb;H)|io8leJ zN62~J|3OQQu zcb4wVYOTtI1~eH-$Ui!+?Gd)mRhvXBdslCxCPBbXy^T*ZIu`ogOhUYN(}(G~x5q23 zhw*trKR)4|9=h4FxLhAhd#pBJ^^ih`F49?=M(c0SH*bZnU8%_UN|T)FtNXtPHmygw zdxRR3$C~N+KG$BBw^&aff^zn~Ees59=VDK?Ogd!{P{uK6mgeW@XLmKtxmpd?Z2r0- z5N>yOPy7us;e*i72vG>)#r6t#l*}JpSMN?}uuC^L@pj1=P;i)kaBr<_Ym5#Q<>hhR zLN}1X{Gsc4Jso+geJ2X>&fe73TSL`k^t>)GVN$M(T5YGwY^>kfPYfjj3%T%;velR zZaat8u`t=b$HQ`m{*0P`dT?9jlV&>J2TRecyP8+(-f#7q1b23bIe4@wH<7<}6uBmX z#>;3jskKFJeuI$2grEYsY;A4!w_pUSwc9svlTF3)YF%SA>&kgX_9AZ=$F5~)P1Ds) zHme-@@zH={!ho`I%jPM>hg5ifQE0xAHveU-4>4WhPvDk@uMaOKjJ&rs&Efl35;R1( zME*`wm-HUsTx~Y+yYOB<`hE*+*LSF48vu-au2@c8r^9J<*-xgmRCRlEDaZPTI6nAJ zG1`go<;iBB*knl zD<&H;t>8;Dq`y-<;A72)_c@7>l>?^Zj3|ItlP;uE=6yT~1&lDNehMx*Q*PuxE>X} z%tHcXqa2Kv;X>+qwj5+uuA&G!*c3|L$viHV^)Ag$6k2UvuA8*V14_W9_DnlvzNg^g zVFr6ud%th=9{P{Pxp*8Sz$~bIdRqEBT`DHS zle7S23UqQU?Vn5Nuxqztpt-1 z@qz&gM1YC|CD&(K9ThE*fBK)T=d)dJ-RJWLo3tE3`@3+^nzp;Wdykv#@~Ml0O`d;q zFO2`9x*BF?R`}jjVI2)hOIT;6?$T&2Vli`IY}Fd5UCiTi{!uTpg0i31&YorPtOAZd9uyE)5*-m z{nL`J7xl1So4?jq36#le%Mat#Hie>ivRBw48%_$d_U4EL1F0PN6F^k~Osg2gIACcc z(&~79u(1`QWoMpp-?ct<7O~9v_W2pDqeQiFlT+_DGzhjSBMqiL=!Ueaj>zjH16SYc zoIj2O&pU&m3r+; z+e{@S$fa4`g^h(M>OdserLD~f6>flMc^61qgoeuJK^8t;V*b~DP>0l2vEc)W3d&>h zJ^BU@mMSnaHvMeokwR2Du*|I6QcUkC`6Tnus794miPd3qJ(!t^&V%fvfn`?QHgWJW zrI*+w$i-)~(F@Gf|0Pcq;A?^iDi9$e2Dywhy6QHom#2IOe{U`8>N9%w%+^pYiqE}aYtJ+PdB@0 zoWjTzm*ou_e`fq*FPKcyov}|fw)!hyt6XC0GT+}1aL^e$R#ca_Tl6wA&KIfLPF_^q zCP6A{+#ISp9$wi_EBG_S9O3g*f3-Vbkgs2yR90SW7(ZMPRBJC6VRMAmkj8Wu9}bPR zAim`TGb)3f7TGP{S#anxTD;rl%TNLox24Sk5UOOv=lau43!MfC+U(GT;4~@JX)3Sf z;YmbjAJbc8qfkqB)vV9Z!#nlb33d4jL-9QXJQ`cuW<+)?yafXjC-e#19a(Mi(tW{9 zosDZtjgh~_DN3xGMtkj=Gy6IH8e6RCGP0Uooz@4Y|2{p@+psfJ?{erR2C>jZ{*N0?+xFV?{LwB` zXI4WG1@nXNDnQN2A%p?oe0WY!_CS;fnTpCpvskYLfQD0RgqAy?KE? zGl989Sx*=u?te67a+_~$I*095`izd_puOtAcK4S>9s)&5F%;?=#Ham$hlk}AL_i_j z=KD}FiZPmzm^5MK1S(4aS`Y_51WesvB3HRyqKE=Q0quSgd;@gKOhf zeaoav)w3EM0g2i74=B^56-!K1FH6tPLJSn6egCn1=dwFAG-)4c$!Q=hTCHqE|4blx zTeD8XpkkOGnrI_5?VI}*wpCCNEf&}eQ!B5>?DUkQR=vCjQ1oGII|W)}%ucT|&6y_0*=N_R&)!@x?H~J$ zS7^kp->$Evn@{4xx(J(X1Qb>hMm8&lc~JoiUE{H*+Otjo9n{rMx?xEt$L+G-5-QqI zXE%KSW^!`2{!${$ZK;j6L;*D%;Eiu=FDx)(eD zTO5uKiYFmk{OFtY{0ttDEK_70$E4)OSl&ehu5^5xz825LgyF+$ge{`%W~Q*jWau*& z3}>edTu+pINeaPW+#5 z3*blLO6V@G#~usDZhcyqo^H4J!9mor*c|!aV?$Z)s&PO)qZpI%W8G#K`JH_-3U1#(EqV( z0KMY$3?`bbB$L^+^?e#KQ-h7xHN+|*>EOSY9gzEY9}Y$k7+^#MPD}cz9Q6=b4Xqfz z0FCN@H2`Gu@2sGs0g?TpJ9(ixYY;pX|9?vufS|4cKLRDSXqn{Iqb@RplMM-h>*zbSu%9vgbU6}j-^_##+ zNuO%`1CY4cu%u#l4IOZW5>{sMlm9Z!nt*O z1yGB?p+3j*ASDtY+3Hnp!SK<6ohWoUTrvnU^XkdykZ&|e4Hl=tBA8h2m2D`9fuHpj zY}K|&Z;!&Y*m7{C03fHBtdc;8B%5^7gMkOskVwd(^zr1_>TdJR!#YI_UTWDu3QWMv z2fgm!u=c$1YL=t@WET(3+ANCJtxN4y0D11o{_b74ca8L;Tg+eM&;ExcDx9Ym)Rp}G zzlg_q!6dMULF}V2pWx?lrn|X^Q)K)=_&7A(+<(HpsSa)k9fi1A5@UfyKLjNR6zFKr zls3RV4LUx~n#h6OO;0;XKy*S9J@MGgBSE!e;-w-a;GrY&qZr4lNcv5nr&tE82%GTK zKQI9Y#R>t0FV?z@Dua5*E76Lcqj~~qpe6W??QT{MF!Sa^YejEX|!O22IE+FycAA6VPtvOmp(!d7iSG-v{<6M~ioZoVK-2$~! zX>&Dy_b+n3nO9x-j}l3CZnca%rOq(s?cNvv2bx4YWwZ}&UKxMgDUqphZWH1ZK{=+y zB`%BDGQpiP$U+OHbiuCM-?qTK8cBrC#<2IIBlZ=|{K0V`Wq7ne*5^mQNTR`vn@RD|ehYYEA4L39&-Sr422@F&Ur$ z6|UG2)^t6>1?WSM{$zAC9Qbg^!U+Ot#29a0I7uj$sK5k}%d$6*K{*=bWB*jKQ{)mA zgm=buA)ag@%4P)*>OeX7CM7`xqu6%q!qpJ)DqXti!NVJJ8gqK)=qzTN&JJE2H!4jt zxs>PR`%!&^zvJDQmGOv}A>;i;cnbAeG#bsgZ6rscp(60T{;5|}x5O)1c;;BnM`8kU zG>>oh^O3642@>?m(eWvgo}6_va|25m+kWh6bDA%<@5DJ$PzGJ9-HRvRhVJXC{Tf|? zDRF82Jhkw2h%g^sykoC7-_KlNr2m|(Urn$3)1hzD>b8x&hfW}4{ayREOFo0VsL*c} zcvy(2u#I107QoeiWmU5s1pkZ z!hfg3rG*#e*3YPFcYTgLgYz(@jP^bG$~y_6qdY!B+>Znl*x3hDOvV^1*R2`$;Wk)P z5o4B_O@EUR9T$j%OF7L55}Tt6_o*rR(ZX|HX&xpGaM&}}et8pxATvir9Sq_bv|Cc| z;(9RTzkCnRr{ThzR4gZ@rV)1&Qe;2_`Fqs*X-=nRij@0Pj(C^aja_pZI;z7^gLqb| z?z~69K}YWfxFMC0n}7+{~F7#9l&uZ4kVZsKC^8Gzw$j`KQ-) ze1~f|9yHO)LH-GGII5g@LXU$0$CCRHLHs-?QMf?c&%@*&$vrI@(cTl&Q z9YLk~k6L(pq?+D*NNJ5K>1XN?)cusdQxy4A_m2bLaVYK{)?_>pCTYHD>Hc@!qW&0f zDUlf0@IA4R5Z9k}MQJ6hH5n>zr}~wn?}#cJnsnp9;udj7(beZIjOF$nKgNu+Sz%L) zmrus_YC<<(_LNS~_c2h!ECPM^1J4;Oj_d5IsuOO)igM$t*vj#@(v=9W<8z735H6C_ z*~%aEX+%B{K?OrIi+7lvhYc_#ixqQ?yG&&PK{GV?2`4tM?n1B+-b0Jm%Np9?{6$E4 z%$0>l6fu#@cx{t!I(SHzwD^(wZ~143RIHFRrQpz}%;LW9ty+>B zZ|Pc*Bc(>Tp|xD5L!;75n13iCM0T4X%=I(+i_*`t<*H>raTJCW3~W{|IR1;uh=!R} z@S)TkRi4uVdA{ynTQ&KV?esmV0ATB6H7W!egcih4Pt8Gb{L@biTyDmgF%s{^{78Ve z7nQ!;R3#L%Q4$~phkNs)8kQ5W*e}};)TJ|*E#w7aH471gru5uuE7r%iC)bt1QTH;z zrTsr;G!}hJihe}9D#I%Sd68f6;7y$P$e?D@F}q*f_UUDqqTMQ1I1!aK(2Ofr=us#> z^cf~T5HTWdB39P*DpKK6<&pE8F|B`aDnm2I3}mMe^2u7D(VJVz0<=B%H3 z_?OG?YdRVZs4v61E{GZph{6Z!l$8U&&Se`58=-+DI@1te^0Yk60#fDf9vYsNIedJ_ z&IWMW8V2ur%#cA?1vSE`NT5sJ`{l@5Xv;6M8OpsGkYNdHAs7<)9+V}1F%>6*uQM|E zX#%~VbR~0>(79C5vstjVP}&ttwHPO$65Gv_jZ~*B+H$g^aDEp^ag7UVhoC8;ohsErsrcWnWev0_%7u3jPOHW zynd^w1VNx;N+AinSU`vfzjX-adjcZc<8l!pYe@`aXWq&Og;O*sL)H-r(lNYm+gJUY zZ@l||uD0#4|Jf6GBqH9=`Eg~_-%%ndR}9Q!C38C}ruIi<7Tm>Mj>t@>wpNPt2ActCz=azvF2r&c5m5 z6xPHq+Pu=cCYExe*>3))XzTVL73Hy z)pD*HLpg*~g}`CxYzQJ+!Y`?WL9DOQduiEz^1L~$#jmpq%2An1GQ_^MT#2ukF#Xyh zGI$xYt!{zeByrV6>-1i_L#NuNS&OD}hn+zFT7$r5dp`q> zH(=UvyH+B@IS46u^pw-PtAcu#M$pp;VMf}@3`PcWB8(ybw_kq^58={G?9IL zl}|BPv)}%>`PM&OI(d@R;;3+Ry3su>%%<>#s z9gag3F=nAbc?|58n{=z-rv6BI6LpX8*8SJ6!E~<1%dNPR=f^Fw_P+bPXK!X1xE#^H z?QU*re>it&l&}tjjhOLU_)m@h6J?(?HEWnzX2mILk2WK!{L){ubAS<6Rq@*7h|0HG z>|<9g4Tc_~O`MFCNcY5vW91WpP!I{7m*T&JTtoLPq@z2b5rNv;$t*bu(vP)|kU{JR z7B{556UE_r!MKaO`JFO*>C7;7hQuDGh4E_M4Y-S|iZ&aj_hSom!SUhV zSJDsZli6sJ2CT5dzyZ6iwv~v@Y z9n9zxaR(hTE4d@>Rp&i?n<}aI@}DA#WOHb|cB2p4x)h4;w0ukuw2lk+o)t0e>S0S> zYUn>W^rH;C7*$?d~gP;DV1ExWeh@ z+(&e%xk8-PN$BzTkPM4s8C~yWeEe%~qF_N~9M_9f6U<~cJWDdwFP2!P#LNr=-1}4l ziw{de{BPkF_8m@S!?Vc_4PsGh6!n49+JRqW_F*b;V(>Dx*215lV#R8rfU5{Bp=pHz zdUVgcO4q}H$dF@nTf^kpdw4Xlz8x;ulyQrRG@ja(VTm5cjPZ8U{1$OGRyJ^HwI+_PijP$b z|Cz#e5xU&7`DPFo4mcxFS_w#NZruY^d0E@80mA#>v`7mu*iXm z{{2Nhok0kPD8WYAPaW*Z)^BzhVP}^6u*8(vWNZDhmSJnW)r>5#qA0H)fl=4y7w%#-*~Bvs?-M~Ns175IUsSB{ z0Z2h6I@A?FA6PVNP8gBr!ZMq0qO+xYXm#|=RRJ$Bmq<8q!WHS(!^%w~3+z&C*hYWj^ln0SNXh5( zREEmIY#(f7dpAW<^cZt8?fVsiAYr;+TZdN)rPV>*{>~tOA@*(9kU{H$(YXC zZ$rmU0QleQj5dq)KOXwter}qLDit_bdOymWIP0*4YmwMt@}?>7K;HaV1s#qGffZ(6 z@?kZu7Sr4`-{u0Muc?dKy*Kjlk_+!c-)3-nf70zSPM|RAjb-+ZpBJ5+-cVEvlaGX} zLr^Ft-c-LzR};k1h^hSLm?ywobChQb+ES!BK>BMrWy}>xJnKlV>fSmd5<4VNDx!Z{ z{tGK#qQ{jr{x3>y?=BYYKYer^u#cn*Io&7U?@Q!oO^13xR5@?krCOLc!+qv*VdgD= zEc>ymfA18nIJ#t2tHz1&<_Fm6s@tm7Y#Hmhg$Lph9p>y-59^x^DQQzPIMf{b*4K-9{)(1k$cMe% z^hN`1!w{Uo8pVQW0=`c=X2zovzq~|HJo&AQQhyk@UOy*5v z10^V=Tbk`V3bHm02VJZNMND8r>C9sVPVm~ezaD%GcQ4#pxQe|d1NODm3P#YOnG-t= zC}(FSnT|U&s0vC3hx8^m-sJfKrl?-2+6kE*e6NyFZ$jMHQarNj*`?-ZRBq`mW`yywxb_<&1yRz9Au#vE~9udN^jf=yaLR_P-yYjr*bQ%%ada1`uYHMI7}^ z{_7YdmgjNM+;!Qo7H0%W8FGSe>E{~1oOIU`hkh>J8SJ?<{=|_FFO|z7aZ9(C7TvJ^ z8^Z_hh`XyPz$&OGG_!BYY)R>+um+2AocPm3p_Z;*U*xsRJCtuFc`$-*Uxk~{{TJFx zb!CyIJOvF&`$_DE0^9)G@XD8IxU4^sCAKGq-@VG~Lmpo856RNta6HZfiUgDnjFXL6HRULbN5a3#6FYmqyti*aZ7U7WqwEd3=#E9skrd5Ft z_yMv3A-EvunnTZVsI|+Q-)~xx_DP~cL+UKD*M|k7H2Zq{>;O0 zYu>Wzb_5f$|ES)4-9bcz7rgpI#2ihOPk?{6KSr1fQg+(P%4Td^N%%Y*Ay!A-?loUL z2ZqCe=O#Euzr808RgItz=9$Go>%et%j%`obQPUBSdm}z+cHS-ABNpPdk9P{q&{@f_ zRRoY0ZeoAu*bH5`j_npt=eY)sY4ar?r9%Eg0#=yfNaJpbd8VQUt(Xh_fo5jbXyi5B z8+i>syCrrlu#Dwnpnn;yewuS>9Rv;bPO>dG7W*JtEIb*B%6TlFnSjyXXO>p=+(6Irh zI|CO^<>mTI?>d;N0fO_E?mnRzQ-X?uO8T+pRG~>iqKV$!1JW)f_=dJNal^mCLhZZc zd$A^osf=PDgAxI;hZBj%1Ji1?`z#y9<*#^#pE%kY7KtK0fcDVFi^Tb`(L!9Ei%JEs zv|OfUd+o|E_NIeUnWHEdt@aWn{kAIMj%`xX^`12fmj)5zi~G0V=DsJQ_Q8t=N%{@r z`GJ4{<(n$EI>cjYw&!?8{9|j)`HxGtKNd{`xC4u}LrN`HB(T8ScXy4f<(h*Gr>a_a zye5nTC>_d)zcSx|D!eYEFBuUh0sE?<$77efqHxJgtY4YbTvHqQ^RD;yQ9{rR0U|yS zv4+NjCNdMffX{aQ0`CAt)n!6K91~2DHg;u{LJee@Dz5PnoE&=oRV)KrYs1e&aPOW^ zLtIDURf!jox`Cz}l-9r7WLS*0i6)eE2w6>;V1$d2P>Q$-5o7eM2%pw-v;Uf@wZ<>- zb=%z3`oLzhjwTV}D8OM}dU0ujgcEV!_pG;oUATadILdlfzuVYPfLJtl@K2drT#VV% zZ$UVF6Bc;h;uz{(q+x*|fwYfVZEI5P96+7rxtkAhwEnhxFx+KWMXNY+u71nguwiEL z&a0H9&s4UBTRM|8OdjRaR9@|Scp$7EQisNMpvWh05xSEa1>f;HQx$ue3C%pY&8wHo zH>#LX)9SKCH08x&S|;MOOCiy)*6$iRmW|!b2&bcSWMW8y*I@(| z&6OBOZL1h`roWlfd7XGfDvk9v8^~fsW&cKC)WixL<>nyOJkEC(DQJV;G}rK7T7+ep2}D7M@Yu zS49UG_|>zhp7>}k!7$4o9>lAmkd)z9@(3BmKloF85c~a3W=QF`Ki*h>8piEPGY7y2 zmLF8VyR7@U2|h%7rGLKUtl;ATKE;7m+jXAb@Q74X-Oavx>k8+2&s9Unp&9W9;Qz+{ zcpqe%*jsi<+h_iG44b)l8G)&AX@SstZJlD7l>6K{pXu8P&h^Zs{k7eQseSL<1e?vZ z1jh~nPQ(M?H2oHNk1wx*5XjGM?3LPNTAcnyBt{YwFwQ49k&m+GR$Fy0Um(UdE8^on zQ-D|FF>?q{;Es_<>d_p~l;tkWmtZ^s5F)pxt&9dE2sqEob32}%qFscC1GvXD@UhC9 z0$=MARdYbPr~oM6ZB2n1jJxB8(uE|;COoP)ba^!aqDtY^!XtDUwhPDjsk?xz(P6B2 zfd3vz7D3h{f)@VYV+9Cjf_ln6B2unF9p7boXMAxfhEeZ8s9#RN2xeKC!e?38{H5&i z#|sLt=4Cs8#5$xM12hlYz&lhfmZaB`UlV*(~$J+_D z7i%m!CB~&m3=W0aHAn|S@bz`u-=Wr6cNzw07jg;5Z{aqE;T#cDhtUNvB=<&FcZC+p zp%S#lIA9cmug%=XIHx>+njOnnyW|M5lG7kp^E zfPWVq_#<9X)X!Pwweh*FqX|`D=(&n2lgjJzP-JJFm)~ z-+X*h^i!(3{{Wl9bZ~Qey`cJ+hLO!KSMC)WB(L{N&-Ug3KwtdOSpw(3x2WTqSBxA}pv z(Ens(EF0-CsszeSJ0^LMlEzfcyJK%qw9okdOu*Yw$M9=!?#L$QLg{!x@No%~3w%Mj zG@mp(bT;3=FSu@4BA|WkdVZ;M80YJp!7Ev>Yt+&JF4m|{PG>-CZL~ru>qs=gUy(o( ze^s>-`Lcun+F=KYyozylI5CR~VoTAKZ2-+Hr&4||MhIP+mWAtZoxWvQ&R(&xOvI41 zTvB3%-2iu?6#}};@Z7h)BsGEp3}IJqSq>=5@XvV-c49a`EtQU)$Y%aeE&%42{e}JU zF<1nkj0=iM@X`PcE>8#V`J%f~H0u68XSb=%q(AEjBfPawbs zW%Lr!jFHr}ww-1KQJ)#t;b9fn4b;zvQL1MR%#DC7y4-Yg6X6po$*BlDpY8%0`rpz+DX#G^@R$GQ8 z#Es3`I1-(2mecvy$j16KGrg^DX1`BZ&vtP(YIBolX?iz7w|d5BW+HR&hyJivZKIvN z!>2-E{FbBG;=BKXB0L8@j+m^w%p``3@j_kBsfNb9kuMV|Y6uxF{NTs)4QlfNgkNUv zFs!4nnX7L{3w8q=F6*yOd_t1S5d{Ny-RG|}?&{TT8{yRijioBx04($6C)z|WvMW2a zUIL-ZhVwTec+2W;5J>Q8i;~ejLVS32mjLp zT?vjcAB?k;bec;g3Q=rzUAYhD+9|3triHA2$4{2Z{P`6%j!SoCzlcef%}G@-gMisu{K5h$37jB*%+ujc zEWqK)W%$QVAkB^OWZKAt_MLN_{Vo^un@ofhK+$qezS^I7GCiV@6&U~PI6Ssvp4d(c zlvvF369Yr6{Jq|G07M2OGfT0ogXX4poAYs%F3jl#j-Dct$%X96K%n z&ryG6jl5NJ{ix0+;4N%L34HInZyj6poxvbWo=bdq1TAFRaO&y1R)oH?|X9?pGuGDBNDgvzE_gZg5(JosexaWnBu z%WG9$mvDe2hQcK)e0;~qKO^EQf4$&w%65@xQAkT9K1E;0?tEBCaOVFgRKrXz;$HNH zB>fM3phzXWG_Bdvw_%SzhH#*o1}$gcm5&}tKy&OI#c9=zm1pb|}Y$X4&LKAvLfsx~ZeDh2%$ut9e|{F0zu&6MT#48Ijn5RvI3zm3$4dh8t|eSW z+xk%`dDwu0iE3L@dXJN}lK8E?*5SIUHtF~D+l{e742hn?rhp+#jkgKOQv$KAe{s(W zuUzg@1JVOEkhUX*g??iHN$kPptn;t{dZ@%kMf&|G94Y`{TS#+x64-0wB<$1~f@+8`7v z8Iq_fNP*ICrFk((_P*oJc{sa1Prn{kn%>V*6=XM1j99}LFziO0X;>+y;%@^*#=Iy+V` zd9R}hBR0OgGz)_#plnKCw35brMd9tL-s@v{PNhOLh#lrQ$h@*%2%k@XZNpyC&L(&g zHnVO0a7G{Eykp_P*DJVreK%M;h}R*sioexRkNHXCD*9ziBxfM^%kt_;a^~P|YThYf4ie^6)PR90Azpx+<9nMtNL1I7(nGWN z{7umgIub9os-7ARH|SJ5e+K#`%`GT_RbpLWm&|a$I*S+Q9K8xRW!F9nl$g40D9ZecH`*9&5k{W$NotH`CmNdvbtraea*K{v@lTYf7rVZ}_b)N-VLhu)E*9^*K_whVWf+7+A_B@3!L%8N`X& znkG0^1eBY)*lxM)8Co|-S(ogtl^e1j?&0JmPGr4Rrica+ zUSTbvTf3;zVW`I^Zc3j~U_8ozS3eu14p4DNGBhdQdKG(dv&!NZ(8w{g{ra7+kWdXF z@lKJ_BJm}_hB{Dgr;-lu^qdZy3!^oU`>FZ{v4mpBHzXp~mbc9@mFCwi${j4Os^guG zJ?qwDlNbDnGh%0Zni=?cug%Z}jlGb^eOwfS=8ZlN?U};aE9n_r!|n0OD*jF~%AO>6 zV#-^~%VC3BNn@i`%t55KbimQbFHD{Vq4Z|=&n4;_5)aCO?tAN_St>opa6i%dQ@6db zwZncMBd^Ku)fparLO#r*?hnc?Y(G1}X5ekLs&79ET}{+UPIZGXOAS0~SB*23#yeFU z?0PnZ&;baXhxqk=gCyW5 zkzAtY zY#;gsgoDhCy-miG)RKD}^YhKEu06M6z2!{4c8n~eS0Bq345txDJC z&V>>+216g(8I~`uvSmGrq-1WE?R8b%MIj^4UF_b=q=pZMZ7#mCb)TeXSXz3^!FqOw zdrYLcbX2o6Xt&((hnEwqGQiIKkcr##;991&P_n_pxc-n9Wur#KfCGvQ{3%6-b>d82s2X{tH^)zcuK-EuNVZjWl#RqN3_;vSI zbyjVmfll)0g50O~%~rJs8nM5`(W&rOc}SQ*AU5`fR#j0b;W$u`!5FdOn%hLcSMQ}8 zk{Stfg_B7+gtM{X3&|8h59_AI6MWoXv?h`7-F`5=5igM%iQ2^Y;KJ{zZlw4%TF?)t zoJN;EbLRt;dQd(fFIUIXH#J|>+3)j_No|_uLJX95@3gvIv1Vd}FlViTV?t|wlYlRB z!ex(MiQzjf4Id(Gl!RY6_IC%pAmf=1<|!(gCdCV;;3dWL*{N$WBp}Gx{_2t)XGs@h z`01AU_2{%Z15*u}R$lTw?v-EiHyq?0^U{M2>*(Ntc)HNDe&h6^Uu?g7NmS#-b3b3H z3}4fY_Czs%J$_(`y;kXljcbH z=A@!9XtVD$T)JYODs74N_phrLJ9Ws-Eh_IG0#9y42&MP`YCcb8Car(av3W*Vuod5t zM9*OF)Nti0D5YhR`122caK!F27mt?Gx6)QuV_qV%oOR~4H8?zsV!p>!yqr?17$31KjLk=2&0=4pZgz&MM65duN;P!THVu8(nXh@B&xJU3j~yCVu+2zb8d}dO zynaSW5e^dy@I4+q*}$8NLA6#Wm1DrE2NB*(Yb=#N06O1sLqa+n zjSTw4tYw;*cok z{e1^xSCdvk{?VF==$C43TXVxvi!8B@u)^J0sTWZuwT50vL~xf5mEcsYw(*rJ-S2^2 zFmqn&OYPu4eGSvHqQnE`E?_r(=TK4Swz)q%!oOZhGEKf@beB?j^E^KXRZ+J6@boJ$gVXPNP1( znJb4X_w$>OkmOdv?_z3}fsZHsBkMLQKc>*ZtDjWMz7x{%G+PD#Ol{{e_;dBbR_G5> z_MGC=&GXpq)Fln3Y5`91PZ%3|i>%U~tTNU&Ji^W8I@%6D$wd>*gcA+xVZ&HY;o?Xc z9}3M%VZzqVlX61#ZfdIE7OlW@FT=S)XSKe1$|dU2;MAsR&0Dqqyf*_-$ULgr_^LG` z!@f9iWO!YHq|2F8K;Dp$gRey=KasXRcEK~^@N*=YOMLg9#phg3PI0H3H$ZgxEn7}O zP(o9(W>1LLn$)}?nJ1d!ZB~ejj+7jqBWRN&i|XK7u4A4T|68>-{mqD!jR3xkbOE}+ z4}*-KJ^P>`xyRIp!R1|&#AVZ*JThctwE_k z``4@{_6rzJQ>=u2^_t{2s#?ajw!b)0-97f-q)b2<2FjLY5p~W!(!5;X24c-FYSbbZ z_brqt_0^eT6kg}L8Te}DWAz#J1V_-wZ6oLjZ2==d>BA-ZQD!0wdWK#X9fQ^T**M%$ zB9)mhmEl>}R6gf7Yy;PwMlU)YeY!Uj)7aJ%Z+%IYAqz}PAE1+?YlP^ff>bjU&^o4k2d1+sRei=m` zhj8gQeUUkgl|=6*ZSs-~6AQ;1U_GyNS5t{=lN_%3_51tB1XV>1;b#rsiG%e*+ko;R z55GdoS6KBF4;k}qLs=2ZxmBII6hGFp){)E;#r7>FiOH-Jo?}TD6xSh-qvK4qRo0C2 zCgcXZ7<&DVEkeD9HqKbKlq%f*$(O3rGv)Vhg3`4DDp_V;?0qE`1jMUiP<7Yg$B}&^ zkh27Z%j+#^$U-DQ-{?xdp{7F(GqhVtHmgg>sIu|@h5;wS+kri%6iCzS=B3jNc(g`e zBjdiC8fZd%Px`{i8$RhuhV=G3ZvT$kqG!?H$EQS5;`gu!_&Wvz$u3?${}18(SwqN0 zu)nYN52ubz(OuSYJ!Gd*y)Doq zNyt^Rsd)xZ6@GId8XN3F^qitbh@yg?P+xuRKr~>WKLH<>NWm{X>W*bOHES))@;vYr zZqcEt#zSD!hbyJKRmbPtHb-vWB`0MXnqL6;`%J{TNvfejO_;pq0!|+j=(048LCcXk zdZ4p0wr5IbF_-l$2R3YTq_Kym>f(eP7@Db6RXU^bOz4r;0$NYL>wsW_|s3Mu|W*&eplY zYpnik=^xrAV%p*Q2l>B(DBhTd>KC*R+p{6fbMbzxjVx!xozV;@7_AoLM0E(auS`lz zyl+WKo{uI$TN;1sE$AR!A_Z1sM$Pyc_4~Jlw{du74TKM0F8m~6%f!47*IKi=3972L zorZ(_>eqhG0x2!s@t@W1?N%SUh6cGsJxafBEO%iOhN|A5GKH&e=HT?+s^OmQ&9h^B zkvL3;wsA8W5tuPp3yi9>GpyyTglXx&(<&~%-EpwW48@6orHQ9zOT^X;G7Lq>*Cbx_ z#vG91n9t78a6V8V|aFJ2p&m~37Uo9h0^ z=0(>~D-Lf~tMd}HQw;ujY#*0kz5mMJ(WCBqDW0*eWv`IL8SojB2}Bw#i-*S0fu0x8 zLk{vH1qVH&C4U_u$UU6i+O>QWi~kUQZii*GFptdsybQo&7(-93CvS{hqrIx6&il#z z_j6xuX?c66c=2Ql`vSOynNV9hjLm`M_TuJ~ooC*qdN>i!Jaj~MMms!c&(M!sJwt{3 z>&6Do+-So3fQwN^@criMb^ECO3Q@m$#myrTdDX zn0A1G0EExEqY?gA7J1jnS8^1a+{r#=$xppWF|#^ zCfY9n03UNoMg)87)O~0i6{Mj1*WVxc?Ww))7vkXTGbkK;|FKByOKRwGADySD4>Fpt zjD~OsG+f4n{WXy(HRiaA>a|o6awgEK#%=mW^P3VV7)KMu3mI8v3i+c|n6ib3mAX!`mDu|o>zIqK*yhe>tO(w9gAc0c2qmG`b-`{{Ah`E|v)TPg9E zeyJb(6~2W9ki9tn?dwNHxj@i{|f*+4dG5Dqj+wU-eklO`XUfUDyC zu}8e=8wja3RMqE@?bR>BToS#cR0&;AarJ3M^-_NYP^jG-JB_x9Hs%0M!0 z@Wc~^o6xRPyUAN801hXoHqmbHulwM8y?iOWisM9x?vuwoQGPKRL6dEhg?R1tDxqEL zjZSi1w@k_((tSd-?DbeSdR2>;^+eAWlZ3P>X@io~F`XlawopnUeM1oIZzr&Jz6Ho< zM;=JyAlnFoRZe~3o>|I_%H^HX}b5hi}AEb4MQTj@TLrG<_GTo2>-|LH3gv?j@LTQ)ZGz{|4Q zBntLn5Sd`+`}`63`%2pXX)48$V2J*h)2n2ANc8*zdd|B)*4lA6|J#Nt5%Awlts?*3 z)JpMRO|2@}|J77k9Qt2Pty7Z!)zrG5^IuJ^S1SK|ePI9lF#cB~>;FG5Lmf)8ROACp z6$6&z-v_rBIBAovrHx4c_p>Mh{Z9w~f0~E?Kd@q5CCi`?C63O=7RbzU@Dl6ygn#oa zKbLE{R^_{0wJ1_0HQ&t-^4e&QMMfr8&iSsM?yd!gVjr*Ev2DS4Ba;xXKs4W8F%Fyz zJ5wQhJYbREnGa&=CSLejMiX;wdU;|1b1#)p3GZT&$)6>atH*dDOu>Pk}Num*6<$K9*_o4lTngF`tNq!;NAQ4_eZTaM`8wQ zU|pKiM_5v(n9JW^xbxecM3tkB<`2hLX^jb*8Vq#Zn2hX1qQwDrZc`=8>~5$Fo~M6f z+8=HxS*;!F^9yJ(NezT;cHc(pK}s86X8cao8(JCB^;$hu&D?q6;#$#SCTI51>&Edc zd_5v70JvW#O?!xoiGeZr1j7<@^1u!LTo}9pmz4217HL8_h4&o|f08E-m_A+a5{{vP zn-iJh!*~a^Dpvw-854979e0vw1UnYyr^1xCy1?q_Huy+NX+|qSk7gJgcYpcsmGlR_ zRFS(OXVz`LPO6Epsn=WTEdIPXhGfko8#EXeS7$m3&*HNa&;#S+nv%pF*#qkH#0iiEe9ECX5G&ShG87b|uowilqnaVg0t;nwAl>7nEGZEAg@$uu`n@qWSx8=1@K|ewV4O zYrJg>Y*HPAMTRUKWW!=xt8`J{Ag#RSyHxorA4Ba(s!Il%_eDDzjwljEKM=w<_hsJl zj|ewk;Sij9xh=;6Wl`VD0LqpHyw~u#s5#}1+XgwDXH@)64Uj8?yx%yta+0PO~CO4rP#%%k6uIoOZ=h_+ZFs1mZj1g05w=Cfm#V;fkSMgQC6FF zmOsA`%~9h@tcnc2W<5v8(|E2ql$WGlufQbAyInM8;^ingVzv|UnvfJy%7>HT&1ibS zXWxE({qQ_!#=0Kp^=jQP$rbZ^O7S=3a~XizQ2Ol`DC&Fe*O7?he3U)+YLi60glv_B za!;s%vh&N^w7PBI3T#`at~;lGP019;^N-o%qu z%pANUa>HJNJZuqWLRr;y4Id5z{hg&mErirNaK`& z{2()g%c5QY>}5M2HTSaX&!26`lemYp%@}u$!XPu0^8SQHzu|;=;N)rhBKB%T4!gPG zDy?A|(H)sf>j-|IMpN~;V{{C;)XieF=C$cfUO4I>Q9!K15EhpC9-^j3kei>_qQKet zON~o@!{!%B6@Keq8x0&{rOVg7!SS@J@fFRNUl0#F!#@feyh3PYCp*&bCiE$7d2FKf z*aoMzJYtCjHtUNhVdCIr%p{c=KG-T!g_X_s*l;pO#OP#3O719+6IKYMP1hVfkOO15LbAZ&8N{r9~@ z>I5GAhR;4!&JbgM8yOd$LNVm`mQXdWKxAPfZeYL$XDL)tQkGW*?4w>Mv0d(kL@l6U|9QjVwHJ2=^Chr^4QWHI;* zUH8JMP;wR4*kc*Eb7fZUMAP7s*50sqS<_LH_l$f(e@yB}!Bu8Gqn(S0+n27L@VA@h zFLE3nTU9ZhOCuOf|?$zIj+1fcA`P=8x+RxVHmGnIRZEu7=^Z%20G}?aM z0WNC2YI!+IB06^LG-A|dGky-k7QH(6lI9|IPrgED%U>$js!VKOI^NQy-40I zuBHinMY+g9#eNO=w4KR-+x^yNfs_(HFr?%>(cJcZ+fDyv$n7lP`RsPH*9*6&u|?CG zod;t^Er*&PPG zrS{(PcTI{b0cv!B_^#WjcGItkoH3LrwwrJ9^`6vsxHNAF+$-s`U5=Hu7|Gdt8?8ydgj%3;`ewpvogxUKBP_&M=NW?t1p8|?sP@B*BAh2=sIn_Iy4J&TtuVUi8Lzd9RjA(`lORChht$4tYfU^>$OE{{(9&g4__ z_?VE;I{_-Cx%rN--dhR0Vve&l)(1*-jHj{s6>LL;#JqOd0U~?tY9wiTGj_8Ey6Qq(Q!!2wJ7>L?4#Vu+f8 zoD%a7&c+T}-@ui=*W(X$B*TEE$OZVXd@;xaBgQ5xD;DY$F<$VeR{&n8dGYw+xNUE` z(=aDJ(R(gM8}YOP0J}_|<&d_+p}Nidq%6NNU;xQAlG6y1@sI^5)8`rkd4Hn)(h8K z0KXJ|mDm2~P#QY8cm=quxH5Ml&waIFQ;>_NwuOpTZl{S&<9;_08?*lsWULtg^p@`aq5xUX@45mMvIMq&(lcD(2WwP z98ZQNlRW+weMzdxa@1&X!lwCR8ybqeANv}qvuSph>1Qu$#~VsQTtf2ape;>aAd6*? zgQ~`o^75SG$9&)Yi{9lds%lbXQ#(dHxaUGCthRsVh4BBQ33mhOMQ`uRj~Ja@aG+sP zX7GEM?Uc-OComNNbC^Oikv`}ok8gRX%Q2aPvS+N(t~g%!CA~f6`avIq6VUpJ4m~Md zjLC_(T>58XT)tLGOrj=pCE&glGdWu}d_s_Vo&!mewROG9fLCTRbyr^&udowwFgPje zXT8l*;rRf`Rsy4XcaJ(fDmyN|wVYBET3}5C^Q#x>A471|KYD3N@6+5Yjdv=;wGb3Qg#gHrOvSU{%w_q$|Igrt|T*uXMjodW@cL%06gN*9Jft`GvZvh=$`s_khpzG%oZPY{2NWR=!qwo+q1gWtHE z7Xl*D*GsC<)7CXy5TFKu$}I->uhO!7pHR~NoLSll?h_N4`eIWo2NZ8Ep5^_-T^|wg zz3h;rd%#WzF{ttMu+Wm$bGLtLiPlF(Xv~b&T_=@q$Y94t2?vSaI>hd%$fo?+Yq{9A z?fMgC$mUU8_X<=qp$;oGy;zx0i_4`}eBYW^)1u|wW8taR8zn8d!-W;J&1x{sB4B*@ zH%Bl%c9IP`Tw!1%I9l;>*Ymr%H)1VMsR-(6K_WA9n|fY;<@`M1Fh+;_g-N{1??Mzo+(@19@4csAw#a%L#@E(#GRAbR_{Rj};9v ziCYA^`6MIg0WDPIP215!oBkVdQyOGe=ISBuWZOXZJLeR9A3|k3)2E z&@qW}i8d6#*4JeDdoI^0bu6_)4Ky3x^}yT9F7psI8Svz0OOQ+NU4SL96^~ z$t(JJJrfbka={Da5d*1$(z-4texE;nh|lNf%xHB!h7jr9!%0HWtG+lOkgc12fL=(rU+_B&Mf zLjYJM#%t=>$6VLzfwGxAiSxEm(J1ZjAsd_7iUD;`hy_?o01mNwfJ95cP*wv1r=Ma zZ5`_EmYVg8CJAo(4{TDt6>bBUrt9e|yxMmOwA7WlT1E-wC2?Q*GB)ZSRXq_=DoJN< zUD7{L#qZ`qt~`;xq1$UwTWQc*?P%XnwTGw!mS-Z7 zzA%|6o1xZV@k9^_^Pih?&23@yTgB}G5RqP40}|wAg7zU+(ZWW*!U>K%bx3!gG|C5g zXo}jr0B_*Zn!&?hC3gXU7fw4r5ibCtBUY@Oh|BC(r$c*1bI)U%P~=$FNfh>rQ{jNM zO$>m|5G;2%52$};WHwgK;J2WQpjXevUo9t}WE7lpR_`)O*vbQxmKcG7w; zMlVFOZUI)oQR$&;&jlqAb_{SGMNY9}DO;`0Vr<~*_nf4N_;6E-_8TRH7)z zPxornlo^Qe@9@ZAzfP_3KhTg$Qi?ac`#P9Lac#l#Sj44HxYLsW^eK+V7arHub_n?G za-nN7M1yx5IBhBCO~}qly2tA2czP61hEl8D@V#=;XbS*qPg;%y3k3Gvnt5&9chDgp zy^>i6!H)VTIHMOo3Qvz(uM-lrkv~Mv&D%8K;cqTO7Tkg4Ov51>b9fk}GBbAjNJ=Re z7eCD+Tj+LQc9%7JyVfD(c)wt-UR|F1FZ^3f`=u?Njfn(^!4|%ZeD=jA^FO}AKE$%r zRBQ(xLchYp4qE`r-(gYM!q*XDQPuNswH-e$vc5exy~aLCbCUCDNi;k$mlN_E;qyZv zm$Dc&LI(ARV_>hi${2%{R!v+9*^H{}65fQZg&)+^rVY|*=G$nfn<5$Sx(XWO-FJitOxsf)Ju35`uO4A|-^=?@1m6^>N@7O>pQ01nrNKd5Nwl}hK8mOJ{~WyA*P zRF!3WUh^gy0y;vJbBG&-<6`F9BKw(p{H@NXE?neM;%HQm6|X)3iG?lKYWj@)Sm*^^ zR640aRr80SF`H^E3KhRUnuJ9Kw5rmLM~e^lXjz@t$3=h8t`4Gu-y!+^Cwaa-h>_M|gtpWJ2qCsBQkuN|#b_wo>_fRXY=~|aGSjjYvJJq$77QoKoMeitD zb{f9B-Ud8c-_?y;S`=QjtPMm;h{iQ9W-51N);rDZx1|rIRW|c%a)T>RLZ8bMu!41y zlP*>b8^4xe@8I^#h~3)t%p1{1lk$3Z5k11vM=an~Z|Ui6K6gr(cLc_nTOV=gcRZXG z0iG|UNvE+-9jt3wJ+H}}pp|#FBla(gQ<0tf<^R=NK$mK!4KenE0qiG_*8^ZP+IQuU zmKUZ`)gwjEs0{vo6EU@$Y%rvRoB_n)sIXsbKsRH-VMc7HpwsOx#B*6^s>caGLa(j)g1cn~Jn=`ckzIHj+X^G{;FD@?r zw9E8{MRP0oQ_bVLJ|*PosjaIm{o%N&8u|)-*G&bi+wQS3E&g&;zzt&#u! zZ@{^On>{wZDK5AP9s%?g!lS20y|Ue~a+29P&QDae|Jd(@obQ`3u&cG<7db`H(u3os zz5U1$p@kLm;_+g@?)pg6<$~38<7x9$Dcvj*wWo#8hiok(uTo@ANM}!UOk%v{69aBG zlyOH${QKi&`NQ92jKHbIkw8w(A_UNAHJj?W#^c$GN7BjoxsRyr#|1?cuZFI3>IUpQ zLKRA2+d6j_Kny~BZqPw`EBb!B=H)1c_r(WBTJhC-5=HH$mywC(*Iw30cR;MQ zcAS?+^zg?pUc5Fj&8_90c+6rv^;6Pn(JP;?wneP4r}^aio@uW;HUFcZ<}Q-(Hn)W@ z{wN_%Y`<>4G*wVG5k*L%UDQb3)z(9r znX>eFsKM~Tf2q1CVC74rk(a?<1VBJ@-av0ET8@@s2Yg08zne|xgOP0#2C@b{KCE=1 z0TDZO;e?~SSXe_%Z?TANDVudr%<=JRZe}^j>~1e$#dV~qRxlt}VQ*dY01P=%&l5+? zEpS*Agc4c3m7OTPN`qgGP41O2#UfV3B$bMtTSX}Sua@{~x9NKO+V3y_=M@Igb%aH-Ey>K+f0;MGVBG?P$PU8z;>b8qX+r)FLhWTm7Wdcf4kv7v5 zkd-pS*)MetZ7mqsyWjg}(LY#@f0~th*Ih5VrL<6VmyOMW#dHXdVlB%~f>=lo?0&R@ zIC2sMZt9*1x9^_i_4E{9+i7oT6c@ndA1z7^L~6C>)wQ+2OrG{1C}|X5o65XWQdSh` z?|YepdozRa0-#{e5t&|0r}!CKX=y*bkIZ+JMLZ=|58`Mc?`)S{D+6%qoSco9@d>j$ ze>dYgJrW5rrL*6(^{_n83^+aRR3;IcKnNCG0`NIN=%#42aMTC5QHe}PJ_Gmu_E^zY z>xGfw1y8PC`Y4LyO2>f5S3ZVr`PP7b<58rJs}idcXFkpVkmm`%P(C;)(SxR@c*Ej0 zJ82r~Qdyt}K9-grW!z`H*U#>WKndm`)DOTRO~8D-qXr%Opx?Z)eSa7q$XidfO{(Wb z0jvbXE| z?!Mk)p=c4~C{5TDFK^>Az%c{`Ut9?;-Tmwpx!8XI(&YGwY_+3^^dYyP9do&i;|9F5 z_zCy4hK}3q(D)il%4WV|i5v;M0;$0n;j8n7v+D8KCB$f3I*zJ4z;ipzrOIS^^V0Bc z{cd$61rqU{w6e)9IPfgQvd$!xEaq91MdBAWLaQ=>_WOTmnUmylCkoq8C~$+Hj{F;- z2=WG0D-{ioC}>Y0k+D_Yy7y(WaHKBYVQd0h_g!U2!0GAuK}Fl{_`@;!KXS&z&n};7 z{ny%?#)XZ_!fqlVH9dB8KLZ84HGa@{rlo3Mgz0FfaqYrM)7kz(Wg8=>W>JsL%a`vW za_fAS3SkHDnK%aG1<90D<2sVhB)zXUmdCx-!uBU-%z3`rGQe6Yp&!qGONFs_>9^QCo%50&cO2b+ z=iQgVA|7KAaGom#911Q7`Q0>Gr&Asm0}Es>^=buiJ1OSSF^#wfFkJ?_cID-KtrEk@8`)YQ~wcg6IHQwsp{nPt^f#VgKdEhErL1*@9cN-Y4^ zcqc|o-g|t{MIdm4#0$0WSAEBQYo5|LG|f zz$Nw$9`_qJp%gNKN-Ujra}EtU7cSh9FI-x6qqyD!kdTsqb#QouNVKWb<(N&cL%Im| zidcm#p1Z2BVlA9-WxoDq70BZKb`)paV!Y`X=xG^xPsB88Y@W6O55mYHm{GB1`#%3h z4oH-@&~xIC7F}1HXT%sQOPfzd(kfd`N;^!sw&S})WKP=u?BJpp@#q67`;Dog z(rbL;pm5YN>vh0fc8B&{*o{X>DL#!Do6dYGfHoX2`fl~8JG36Z z5J}XL>Fcwp)t-T&iQLfk^rgLY0Iqx8E#VLoYN$4k_Wh) ziP~;`_D7at7A9yXN{r>nQ)C?qE3NH|(y4NTJ!B1|zawF9Uo|L~u3ek4S8jh)a*Ho{ z%O{_*oER6+X|cHqNG_c>dwd9Z->_b^#pHB`(NMA^y617oIGhS~w3CYsFvp>=-__%) zAQi)f)4QQL=(PP*F>D6BoH(9@a}H#*t?P-cD^HuG>K|`U#h*mLqc>vg;97rqjd&)f zM8jAKCSTY2B%`79pFa{^j?4+q$&A378wi$BXW8(xj4XrK`@OAM{&_Gf`e^c$^yF+> z;N0-K!*XjQ3TCDZPM;=lY$Kv=Ly_A+y(O5uKD?8s}yJGu~x$(O2v1EF_{N8TPAA!puKsJ(A(OjqOuVk)h zxZ2PoEn_{kFYq#{{cep=3;I<3aIBy#d!3Yl3d-DA-!RemQU&-B?d7NLV>eN^8~YUN z_EO|&no~cGd|Bvt+s)jib=D|Awsin-1rrsr3L^sf&@rsTZtJKc{*`Muw=5;{=X6PAmfo@q@@!4MlkMV?1O zoYsqfU3;?t@(mTWAqo|upkbCg&Tsu#3@FPTfP@+D%=Pp@pmP*MxN?8`Yb}pZIi=XF zhOxX15VAdi_j@h4Ye$jt)>Sv3%`;B@Z!JJi=NpMnACt%NUW)=MVzx-BqaC=#Cu4F8 zC~`m#aJC9jYVK50S)F(ZFr7o6RO5yS4gf<1`|tcr)QY5)1;pA(%i)usNf(WS3-s@x z8eNLoMlO5Lcf26E!xs9D)(1%|BjqKw-)Wmm3y&{|Yk_2YgxHf{gz7`z#*%V}_svho zFJR#+XJ^;Qe?<@R6F{2OcF_vpQhap=$CY}=z5Od~12^zaDj#6TQ&mClc39n7MLZY1 zuBy}KFftRR?%Ge9*7gB$@kng61Ab_G@(z`vQl?yO#eYL{CqqO_7r=UlEi8q{Kz&ah zN9V(4ny#^QUXRTN|M?ARMTgaS^>M0w>y6@r3B9R85p3TrRjW1u=MA}eDtztWd3&t+ z<Pl=UPMv~@-{D2<$_gMt3QF%wa(N&(90JWed za+X_6qBgmx-Uv~epn%uoCwId?OW0yZ*Y`xG1?CB&s+;KEhwy+!Cm5ZandSI7uSe)R zpu$8)5eWp+0aW7*-y3x~!b+W1ub%nr|B?SWM9x4|PIJ$9;5FV4v5|?&?Z+dhoOugJ zKg-2>_{eVdXw;W(SHN>PdV!sq(^@mhYOBk>P733 zl463G!p{IR0_2cKN^IeJ^9P5mN-=odd1>V64K~5pUY$K|NF45q3mAJrf zY`4|+4e2(qaC#?R-*cblqXoV(Ppiy+dqBF#TL=OB83Dk>_JdyD*x zUzfEk?5XJq;|I0GuFO!|Kye?NfxkH@>_9=<>TJq-*CQVgz8|ubDvK-3qcDlbJcs^L z%>X3_PS3hg5N+Ngxm%&Y1R2$JbSCD%Y{x$X)|xkbEep~7)Ab5k4yF%k-%aeW8%&$L zx8+S;OdkT0yw;|wR@Hz2dy?`(sQPnISJbx=6vEg0%Mj1S__T~_?*#`{JUZPNZYit! zR4$rO10T3RPAk&%SZ%AXdex7KG3I0kYz~v8Y;*6p< zEZhsV+UI09=jzzk2S527&zM!;XnrYeQa-Lv0`FGl#i!$~z=jQRLMm$7OJSwUy2P)I zjp1@==owgH!+Qd-h11YeuXc|1r!xklfXc^OP7cdnnMxV=A3H;9Zc82~0YDN}_;?Xf z@-xftwBnR=Bde|){ppOz6sstbi@<`%?Wf%2wv!rjDDf*QmK)CAHc_BvXB`j|hKRT! z@stI1J$B=^^{8bnp<|Si@w7#gM`u17%=pqtWBt_qHA`z6&}YG-xBF~^E|GI4V+TUm zP8aunN=XaZGq!^DP-2uUMnOaN*goi_bu_97mW4RO*FSqM{OM$)QYq9SVu$(XJ`g3( zU02ea&Zu|r+(Re93?)xHg}P3ju&y24*!aW;ME^y)bb*bXjVcrdD{vWUPQsF@;fS=$coH>5mis( z8ecv~prfF7lu%uE;&_R2Qwwiqd1aoI+SN*zAD6xoqRLi<^6XO>2BJQ_jzVoei#_og zvziK`OUJpF7u*O&Uhq6Z%t#{0J*TT!I5OjY{vaSX&y4~^p0=yCB+_|bIMQ1-I^D{d z;q=zsKO7wZV!4&tQQXZ)FpdcO90f$v%`59HN`8ZVBYrw2Rad`ZiV!8Ll!=;w{R+5E zwXq`ie@bx29QlEZ<NF8K<8*=L>S_>0|TtDvB z0tX2Kgq~M>ko+5oa~JMVtiwo@g|R&jE_M&tVx`iR*8iDAH1av1zOa&3R=g5$$(``h zNSRm1E8c6_VIUA7gD!eJB}mop;y!Bjv#L}(VnWLW@ao#XU;~S5DG~IVc+0oLA3K3;a8wZm4WAcOX@dkfATRxazL9a8^fO70;a}no&qIt?{IPm?Klb{4m}* zFX}5Q%F@`B+wpor+2WU>MTwk1O5*pQ=ex(Lg5ZAO%EtFL(e#y7x2NGDWo;7QEKGAH zWL^;y;S;dF!B8Zh-gl$h()7h5A7x`S)_qUSQcb zqO=6z4x0~1O`42SMcYa@|GD>L3RwMBmj4yRz%RExp&&RT3TI+!aei@Pdwc(JE7b8- z#EXZ);y|U!74OyA(#rP@^@B!69fx}|$21{huP&Yv$;BKNCdcRY_753nl&>vn>%hp*>RG|K&eOjIue5lsED=Y zvzzn14aq2vu2zDWy2^y^=k&NHu^E~%)N(EK8=}RuH}2cEFRvb&DNjZz71`P+;Y#$z zlEAxg3Sct|2}(&A50r?!S35|% zt3iS@MFA5TfmfiuEHDzcu0>#yJ|>#{aB?&lM@)kyzSlJm6?Hw^?SBW z{KUsPd(R>{*p+CO`D{e#{0FglGIhN|f zY~@VWbMFeH(l~9J9L2DId`iyDXfz&-!PNJNqM*Pfr;tFmwzBDGWBg}1o7FTA-YwxF zU0>E~I6Ch3W|l%xpWP3q3LgvRks?1qmi^9TgM*HDH4?P7`Z5Fp9xnx|Kh?SPoIAAs zU*x@IRFqxYKa2$kNC_xXf~2H$$>@M|N;gP%cd3+sl$3M{2sm`Nj)3IQFmw-HL+5{c z-PirB=i9s1`}JYXQkKq~bH?7sK8{};+v~FT%xjoQ`*`9c9V?neMEGVy?p~cf;eW5O zYiihJC47ZA?Du&zg%Kpv|GMQ0zq4Ia1Eh$26uXHc!s@VXXH6!o+3IIE4|uOuJW|!I z7358|WOWh?(>j-0S}yk$6DE;eA9@xDp`tVTftS7!-Os@xELKP#2j0fKqpzp2u(I=< zECQQ$f%bLknD6r9vXKKT&+L>>LnA+L&5v{MrS^DU6XmDEqMqBG4no2c$f<65Dh+qn zmh;)7UyIx@MJ8e#pDAr!iuL*Lj!QS>A(1!)0Jv0&P8YlQ6(^_g`qm>RDQN6a_{Qhy zj|(qU^aXa+iUTHVraC5N8RN!A1+D@esOBA@Ij{eDvULfbq9v8Nfk)NRzwi0_*IJ*v z++Pf;mm_FzuVkC5_Jyx*qd4>BQ@Om2Odr=D-*1i_ne1!tdQ8N%=qS{Ylpmf6o8w(- zF^foQHqEkvVkg1xQxMJ@S=e|_B2fEV+orx^rA7I(Bel0~T`3UVdPc*k1eH$J%O0n& zckC3R>_!wAN~~cd$m*-BT0BQN*ULTXv$M1nOO1!}$d4=ZGcwdxRTE%u&CN}1VnXiC zk3qpUcz=KFInAU{v(K2A!<}8++}+&ig38!*we(5`tv8>f;DyZXHfSd*$SPjh&g6fJ z$qLv#S+MaRvqgl_Q2swJm@7%wHc^5#$1(||dt-Bu|&G9oB*xc6DI6pmbX zC_&WXzCVqGvWE86nE*rv1~c?NC(^W#s_ff13OOj+0Afx4`kb7Gj+-lw5}VLnnmA^lUw)%3?EW6wf4Rjc1phOyx>kc_hGN0P`@tPfS2$*!HTqbU z&bYIF+eq3$qGrD0wY7-~69?#!S#U)qOrN7NwmjT6EhC?|@^De-o?c(Cuwja|tBrj^XK!2zl%9|fd0)+_F^f3khO1kZ@B7HIBt;`i9q@v|?sv=wy4V=wuczoFAUd4&US|ob8&A83QA_bZ7b7%* z>`N2XDBSu{1VjAkDlIC}ZN3i0PuTbw>=LPsQAZhNWhw@*2w7DX+ z#dNsw*OAX@9+0bzw%E9<=9h_(mP6sI!OaJ)J1-BB;}js~mU{Xpw>m&7-Hs`vrs~|7 zl6q!NS3>;-VlIJH1{3Q%EC}kMX))(dJqTjkb&I);Fmmbv1<6@obSoo6L4S&HOI95l zYpu~({JsVm88%KERZ!MHg9~HYfG&1#p8+>2L;g=UYi~d6206(@%Za1?>;3oduUmJ7 zY*XL?d_0;CTxntf<@MEej;^OcgYe+nug776l>J$M2DDW>65`c&gdH!1U*Ag5sk~Y1 zs-~#%Y-se~J3n|GYy5JPi_Pa$;xc8IUoKB0v*n^299W>j2L6stp!DKU(mGt?*V-N- z6ILUvb(;p_eY#SdOqE^)2G#7J8jMoY-26=-G#c*P5-j0m>-_kVXg8EdnZBnusnUd^yFn4T^Y7bp>Itsl>=yg zNML(B{_oSDs_sd!;QThxW$Sz4^+fK_Tf9J)y}ITbvvt=cl7}gBv!)9qHMQHqbw>SF zV0^{Pz}jD$uRnxV3F}KLeyC98^Ba0>A^~iGdqz=8W4rNR}>-tqYZB9PW1%bs*zcn1bKq-{Gx3$S?XU31VkT0)} zB_m04yTTT*kdl*&2<%i0I3GQMZ6BaA^}vSM%5M#j)lrS9m3b1*axIkjp(zZ0o0 ziflHUMW->PLUB(ob%(gy=0g5EZe=k8uP=k+#XAuLyxYr`rGu6$IC%+qZ?qienH*Y| z*H>k+L2}B@qnW3nsW$rL(A$6aq$8jF7MtfxHav-qFsNFEKgNrMMgz(;C<~|2&a4c5#&v-~gF3 zEEi>J{jOg!V#%w=p-D%Eb$%iL*9eD?86qsmhw4rc=KiYTQBM-5%(bUq_J@5(R!+53n z?|s3*I8+fJiu=#njq$$m{=f4K1H+Hx|MaiBiXNa_w=l^zX5fP2$$#^m9fbUm~zOiI#Ifq6%PhqtF9fRb@KgGP?$^J@pAi8+FVjBOq^8?MKX!G(bDEpZ{W*a&eF zaM6XKR_MJuFX||(ti4^cK(801e-RlGb&BkpCr>^wU*pt^|E{zWtjq$&*61g$yeR0IcBc`%EdkH)=ssSrtPF9rLZNugdA(3L!4{oIMPKzsr$lcwWu; zjEQsqt+mw~b?rCR8U<)q7i5KhLgDS63UC0d=*$*ZhUSWfu~DQGfIGGdm#%!9ybThM zUO!M^zlhEN$x{lK^~4XBrCnE#`BvG2;Uo<;28M!F(uDYU^_niylKv*5UB6pyAAy$S=`6Ytf<)chm(VyrFh7?dZ(m6F!vcCJ9m~=jBSI=kOxI6 zax7LdNuX1kCO00%@~#LMo$2LwV@3Sq4hp7p1H-o(UbHJ4!OK-C=a{j|kJnICRMgzY zhmK%fET?LoRn}2S{+j0ff&tc0lYu~Con7GL5u|hbe@n;~aopQF;noT{LMv0pOWb{1EfetmJTuV}5+Tzmh1|5+&J;mOXE($Yd3LGO*N zb(cq=Ed2pvdnSGxC7((1WZ40)l^aiYZo>7Mj*2+wR(=@I3 zo6cC#e}8}2!UZ=R+(Ox?x z92$vaESfw7ln|IQGnQn?6Rhg(2@lg1)aDYxkT@);#efn2y}Qq@E2U2X=Wfz4vjhKA~OA{NwOCo#wq<~(w1iXc<21YSFhFi=p3B(vrv3j z=Q7=T@2hc&S^%1X;s;bsQiQ zt>wSp(ye>TK}-%N?o}4Ji#SWr8ILF7^)MEg$7_z`1pjIX$zNtA2l(g??9MvU3$%s| z%x%oX2jc-(u3IayxiB|Af1M^^2EA0HpJ8v$I_Eh%H{JuKqYdK1GkMapw`D@`T`k3) zf-E7C(`Vn#M>jR*6~rX$=c`P4X`LH5zpifTD9w+x-EAvcB2|*S;q^xQy3P6WZ_CBt zJN>yYIl(}=y}dY{HCj+VS!n6BS;ItP%!kpP&Ih%Bpnj~it6+oqRZNP zVG-ep9%`TY>azJ)$&q{t!$%MLrj98u?RI19cu?ZEuSy~Qq*(>U$wC0&dboF1JnO^f z`W`|{FVebJs5v`Te>2hcXJ8(qH6s;-h|tA;HMLP+P;RThP1xA!si=y2G*w4&u+hUVnza^#q!e|<;#KsULou|>qZl}bi zFKBkjj3uHgmZ=E@#O(qQYC(7J{;K<6jO8%Pwmky1D2UX?YgyQZ38dN5z`q_>+T;NM z>Fhu{Kodx-#J@)*>FBmx_U7iAn3#@@1<}>tV<-hSpQtM-#?Mq@)|Pm*66ViV(4M<3 z=e=#8lqm|qEs*Kb)GWO*p6SR;nigq9*$SRAO|FD1v~Gb`pk;d5hprxWn#?|9R`zxm z8y7Gif=ovz=Q@9z^yfz_#pK&KD@$@@j?5bp&>@5f0Z=Bl9z>$_)2WWU#jPd#H(4Q| zlAGO&c@GfDlBux~K7eKn&ea;aN_+~IVAEvojHdRVYf8?b<{*x(Q{cE+AAhMEFcomw zTVHnTR)@kdbyNf-laiYFa8Q@CL2$CTdJ+_#z75A0Goevf=U!9Yww`(=T5K5*m+mI= zhv}4C03h*GMN4G{Jk0z`Nk(}(q)Oni+4}QUYwgBn@APdVe4f*jdVq@Qz;=|U*Ogi) z={28ghnQ)Flm#s+`%(v-&VNT``ZCjJwH8)<$p4EZ08}2tfH6U)6vA+EC+7Z<`?(o@ zTes%?Gd%1y=lemi3SKKjd>3m;t%9JhcG#PVX7TTsi;-;Y|Gl zyy)vqL=>g)fGuPutq;%n!VBdeo)dx}zO}n#2Aa!Q%^adRf-6k=q#U9st*?n{6&-+^ zrO#legkV}kWB?ILNEfHWnF2Hk>=&Je?vPg7LMsdl!{L%OPy2S+5VN@eKcP^#*X9!E zu50vstKIw7-F!Zp{WITT2}>p{p9CGh%fqv@OS%xVI%#@5fk5N0fC1Tfk^&~JBM?b+ z#I=82s3Blax#%O9dOKVR7yuu|Tg4@?QkVnb{a`t=UjCL%Ba6-Tg$DN}1hA1sDzI}G zx_LUzZ=4t|xh2c&EG~1|Y@Am8n2so1M?8dL?;krtuBQk@XEX0xZkh5AGk%t7`Qo&2 zpl+gUH2o(V%m=V6W^s+xDA@`#-uDOU5@U`Q*CC z?iE;My$$gxP8(anD?QX($41Vm54oXB{SrZ#+S=M+99?d6lFhrHA`E%s)ipT%j*pUN z&#GF=Wng2LRXPAK7~ZVb(U-EYm`+Bclf+zJFhrVZL!~9%XTSMS`-8zyY`rmJ9VuBn zydF^cW6biHGCcKW&jsMacrMMNE*JvEISu>_>^8u@3LcPCS!EyRbC&1qyV{Xv$Se#) z$eh0qLAs?~l80Y$Vf~S_b$)HqMcbzsiW|KUV@|`qB2dgMU;A|Y#;@O}#e9>uViCs? z5%dw@-l;X+>})K|9Da@qX&|!sOqJDDO&f9535sAIpYW5OAEFN(JzfmB>S*jldR%in ztFAa*>wBaTuy>wQKkU_Xb4g=Rx5OMyjB{6CHMg7%wC64!wYITg{p=N(I?AERUt3kd zCgRiWIh^Sip3@OUDal+^_v0;W@OZj=vild5PQ`|oR6SsJftRmVLw$Tw8Ww3~!yLYd zJ{zg-w3d^j=qalif^=#|Nc^%HHhl}q!k#5}_oB#BAkN{_x6i+qesbJ{7f>Lhb5~j)9&PHC?vfUJMfH zZ+;G=(i&DJ{B_pn_mz3j2urC$i z0Gjti7_rLp8(Y7ZoGuQ& zdT}I)_-q7OElJS|iB2<`C5&D~Wqe~+lvjKF#rs#EwI;L9)CyhfK+iDDrallBnJ%xR zu39jf0$M3dAm4;w-oJZEpi!#S)4i=$=!_E%vfv~D@BudHxTYc_^)a3+IOVR&N1%T0 zI7*?EDjwF*7`Lu&_%x6;yHUoLnwDa3Vh5^;kttvDbj8e!bi|6Y_{U2hn}R%8b3=(i z8!8m@-k}E8HMPeh6e{VZ=M@_hwS9jNO~4)}3jaG_%I{@X;&RK8y~j{&g<&076ap1% zWAeb48UdxVw}~rOvsN{h)iGCke@V*RPtm9hSr<8^eirrKwQe|#}p6otuc#oKFZDD@N>*7(QGz{e8G>=X!1CY zFF~VS4kB>EdvqozBV>C3*;%}~0Ynjk{>yu_=b%HD4;^h+UptE^eOawAh}uc2JXaS! zScfO;u>N{EmNyJ5Z*7Xd8m!(Mz;j_>XJxH*oS6SEmhs@ku%x`6kCw&D$W$6apb7m1 zP>04;mv_$ADpp?dYF`T{0b5@WE!^4~v2^PoZvGh)NEYv6%-f;D>_Lzq-y*S&*V)N@GL3xue$F(2xh=X#y@^RFi%%V+i~aOszn512j^K zjo8{vXX*4ZV_GjQ!+Whoj%EGqO&)j!#oYSfk2aTgF00(u0T-eQ*hSO7bSM>^i-$2< zpUWr3$^W$y9{k6Zzm19vQcmgR;`)wtjUq5c0H#G8yWXP1l!nuz(hX=-Yi;MoC&ya6 zS8zN89#y(Md6L>PS*PBHf|R=wEIx`a|E`5+Fvn)v_&I=#<>VvGu-qDK2DzXC1T zkGx+;=RNS!Hh?zT7QRGGu5Eh1`E9!t5_2P8= z9P#%_`cgaSCHZhYTUt^cb~I~+*gMqe_5Xe`E|D)pva+>oWM*cChcnUj%^a)g)>l4@ z$)K*Kca8n=F56#fqs@>swcA7yZ~Vos@OWn?IV>LY`@R}Tc1eor%p}<3K|8{sYzBfB z8-OCD6mhd(9(YZOZ*fzuirGv{=h|k7U$QA#FkC$PB*ZueF5aSjl_5b-7X&K2lWnCj zdt{3MEsGHSpJ<m9e(-3yz($kOB{gkq|GG+0y82j?l1%|8-v?m5;!6 zh06@nE;01(7rQ=~f;;U4hiA7smS6BCp+nt|X=CQh%%cntxFK3M8bT6Lu%zZC` z1%RND3;*b_9Pv@)V}7z-BY{^#qeL(k+EWyY9SYYLw9v6P?i!4{uSzERoG9WD^Nulc zFDC2Iwpxpgo1>w(g1$EETh@2i^KXL{)N-`MP|FlC|J7+-nt=7q?ds)OWYlphR;8z? ziL9JUIhTp~Pn!Tj??7YJ&!tq4E%ec`_su9uz7r-3^IAxc4u<|5dgC&qUy{UoYrek$ z)QI~3;Qu;PQ_<$KuQzC?YbM3i#}$QN za~H#&ia--}&n2JyrgU`Of4atJCf`s4005w}@^jB4IQ6;f`$76CmjSNZn_*X}f}+fV zRHQF+9%(}6k1GQQuBL;nTmp`?XC&CvK8`;dB3rja9hWQJQvap|Rtp)Q2A-}13;TQO@u4Y9P!7OSHj9t?$kl7+SS@~P&H z^`?ooSXAo3I5@5^!xJ(a8--gh51)x+UMH(6(}VKi(%tKXkEB{S-Jle}DsFw~qT$UG z8lf{F4Y}ic;deL|p)r=2e+;=<4V}LHyP|vgG>nf45JR7&>W)~$3`$EKY=_p5xC{BB zUY-in`Fy;s?G-GgNMFVVn!SL<8i1EW6nH@~YoB7G=X}dIDTP9eOTJlvhZ|<59jT$K zrxW`nF>lNgoA!mu0uYJu^*_3OigKqBR#X|u`aTfT22rI1z_2Gvb={A}t@e1pCLd0N z<;ZFAD-qK}VpX0B8;X>0+3t==0EA4mTJ&wkeR{*sKgLZ_n9$Bwi={zEjEgIy+o)IE zY@Uw?ub>D(GR&hpI`H}N5u4pp!_6hxU6S5?rSPBqi8+Gafv-!HwWNRVaP;HBd8@0| zUA>1>BG`HWrt=st#6DN%);t-wX&|qWkym`_L7P{R&mlOUfAj8@p}7@pc}112m7OL) zU7;Dm|;cCfchmI z%wu-~&Wu`+AOgPOThlKRk{H%_Ag!ILFbPoe`~!3w50`hR&<}xJ5#aV>o|nBrD)2e~ zGpovid$w~7Y;^)T?$(Fe!oqQOt$#5$N95t zYi#ZqkmkmLbd4{&Vq{>C`jcynj@8l)fVdARZ+@B-2$HOtY?A%dppP7#0kf_3+B z*Gq8y@EpK?H!!4;6|L7&FcVWW1@cI%8jLzwdIqxueF0KR)$Ftlss_be=2ZMmF0{T6ZX86&j#~Fg8TzwU*LZvG zztqBhc>Q1}C+n5{&vP38b)9z>th$00lhf-D8xMCt^26k=Yk^1k%7&h37v)5U8X-}=O0`yzD>{>MhrJwQ~*{Jq`M;OMV|(4 z>0|8yamwr1?2D*0TN_O-wjMr#j=st6@EqoF@#Ixo3cL`&Lrfg@l*Bx}iJtQw?Ci-! zX@F`~bI#E1d@K0HvyhhaX%j_!^C63>njVODrSVC29q>=JoGm^y*s*^JY0WP58Xc!l z%4|LzSoA`O9lwv{JHWjz23`U^nVyPx>5j+^G3|*zbrP(!->MZ_tY;VtN1g*+u-2E1 z1YHB|t1S~bZ}V8ufc@^!%u=BAyz#ln8-!zdG(L85a;{2{0SSDn&LrjaCtWa)lU1LR zg^5n7v5-Ubk$ahD8Qavr;l+@-aI*pMY*bBl zDOIPoqoZb z0J~VyGB}E~0@6X^@`*!GCuVSYe~na2i8G8((6n@)dVdXe*Z2u=aERXyaI}FOHz4;8 zs2PA}Ec?|SvOz&V;3@cDF#D-X`e!oAe@q?X_6^*525o2`{G6}!q(IpnkZ~#{r!KrR z*>ybL&0@TN<~$$LRmOtKr>UxG<6u;Nm?_@^MVc5NioZv&_3||@#-$7BVoi?pqTb=K z=ZFf>r^v$1Rwkq(vbHm;_aEjzk1l3RGy|xtr2`W#!F^s1hPE2F*Wy9Y);!m`lE%z85PrbbGIUyrbF61i> zC_8u5^9A~)P}U4!4%imL%+6IkTB(I>i#oDBw`~gbK-U^Z_55+O9AGE39z37%fY^LW$P?uZj#N3cw2j)S#fBkxD3* z@X7LAGofP{l@3c$8-Ku#b@wdu!KkcdHOgY{I>>ll}~#9_P@PnXB21k!Rda zfv*=zkrkMm`T-Wvms((;HNZ^0uK`3twL$~!Q*7eQThq@uo6(ST1BlfjwugX4ta8@) z@L78v1;2wPvq&Oanu+^2K#E3Eyl~ykt^-Ay2Sl64;ha7(2INjm1?KWkC@7XuazMv+ z{5u(qXu5uF8FN!Y)4I6t>EB}T!C%Y=ze8whN-3F3mW{ZGZxZfg;Z7we_HOOfQi_OD z^Fc;JLi^W=pCyWl(Ck-v8U^3X?9RQIGCNcMQqFXYL7*Sn&6WBl$W`EhcL2>>S^6M} z;4^lD46Jps?&vhxg{?=CT4WL0Jz7F~>U#|=9zeMVCba#On=&0)UkdlmNIkCp<|m09 zK$6sOuk)1pIdao>Av$}8`&N3-B4%2GWK1Mo8-0RAm)UV8@+F2aj+ zmPqA*vMx5xf`BUe#L>lTp)jw8|1DHnT|wXX-2o`NXUJgkh;IF+Ei>qM07wGa`NBhs zhL+9sohL-Zzn7dJ^(F&(!uAwRKy|z{resJ>PXbs>zmKkkbV`sXJ(rh3T<)Qdww>Dn zH)M(;HAP*KQ!Ob|8qy%1Lgq5Gx#}r7-lzcei;!NW5cjQ}PmN5>Tu$;^pR(^*rKl8w z3Oe#4I$hLrOJ27zjqpplW*u0f9GVZ~%Ne6P(|PQE#qa0hVFGL+K3;PN;=KVf1spRh zh2i@$T^9WWI$SF3o3{o z$CPe@!FEuAnJ0QDWm#k^=I)oIa!JF#`Uvel$af+RlNi&POZ%ntqnY4e& z{$BiEc1uaj)o|R+4}@xv5yYn#$(Wb`{;-!HRF(S^cTR@z{OD+{P#;X*m46afX_?JH zh&l&s#eB%O25J;e2zreGvg^G7yV2H?9(i8fnA)RCFed<**3^x&naCXM&;}n&>z_9e zCah4PYu|=Ahj%XN=x71A3VF!>HfsO$3uraf|MLv@8q-4RLcqZD-O)Ks&F;$zlUi9=X49xgPx6^U z=rAlVqG?+HJ}sc_rIZ-ACVYZ=RwlJ{t9wW(IXXLgmIfJ4#JB=#_H&~%#iX!Rm__)n znkp?i`Tfs~J*Aajs}#N<==UjZ+0l4yZCAb7S$gSr!C=@oK!N8SxB!bDcP(C8+&bOY z<&+G;mzHjl0Jc@w8WNv&+4}Mp*4=yd6!>m;$m0raI2sRd7|iBmI&XkEaRWO!`{ z0@k=AiGV%hWYQ&CTe_Ds6W6ahHtznrSY~eC?-pb^pu^Xe0p^WTI#&ZsAtNz?HTIJU zmQ*S%chDLr3v{$~B!eHs=;*4Cj}}<0oSk_lFCqc2bhsrNDJkMV!Zoa2Rg}-c&WafB zYme_ZljP;)vsfV;8xyEt+g#mP-dWs2O_gqbR}B0alM*{TFhWVZ?BG6aKAsP5rpnmv z;(xUOMK%;Mru z+Flp{QBv~I9Bx$Sa|>1a?Ne8;NCoLWOloba$p2B%P+tEAuoZS@>&r%{rIm%9jd!9> ze7t;*lGMQ^b(6{_=$OzFiA;1gy_^ZWeV!Up1*AdXl269+Ks5*WLv#C<7oECFx5Wa0 zatr8>WxX{J_eehfrc(iOiC#%>ZrZT?^;t2Sp$Vd2)N;dcNP)oP3N#Kyiq1PMDP5gI z?+<>DuF;BfkCT@~7 zxrO+0s}-n;mr)C=LvC>JNYgHJGSE?x=U#QmZ=VkGrfX__QB}4Tt(nnJ`*`W6@F*y6 zB>{Q%#++ioQLs6Eg-^#$(%rv6mQ=(ui-m!wjml#j^InzC3_!42=MH?<>|edQv73X{ z>@u8r706z#p&b|v8s7N|Ih_AKF*JTO|=vA$wSNl zaF}G$g5TDc^H*CLt}HrhcX`KBv?da3$L<{ay~qv(;+K_OSf5kWF+SBZ1bwIXIf(Eb z*MM830*b@nh5EyYAfVC$AS33T?VVLNvik}NN8a#+!yf>#RyEU2evo;Sd1F3b0@`zn zc#nbLb8*Dvpp+??Zv!?1ROwxDyyli;35CCCEW3>{{hZ{@ex2UOuG@}sSN?iO2O18K zq$$G}52;!5nL+#`{%AsK&%n_s@4J!McwPR$(c=^`cW#a%W%pYJf{ynfvu>;x1YRQT z#6kzlNsmKQf8(%19eK67S5F09t`{H8U6b%XHPVv*))*0?W^Kkb0LW;-^01Zu;2(?s z)b8Ih3r5N=#^sbW3`VUZT3YMTh<|$bA0aQ-CIFi@WdfYI!>|9?io)h{Y{50T`$n8sU{W}}?Z z^%a~qx{c6+ab0ccZ*L1DtIZserNNMF)EfkA1jQl$*k5!YFZgb~(2buUSxky^_pOZ_&>e*5*gLv} z7;jLdf~x+whQEfJLRF}z0+gQm91eDIXiq(g!jUn_Zq(d>U!-C|sg3O-+Ot0jICYXy zxokZ}d{6$e6d=KWB9@6--J-9q;cg8~FB)?ff^&5wQF2Hz6H3E=1VKL(;wucZ+c{V3 zC}2CexUD+X18tUJv>}foGY6kk_WhT1|AXa>-kj++}-(GnE zR0viNC2!0s?Y0m6q!g({{KnvYD}m!lz@Fqi*457`>bT|VWc3CFCb`t#?3=mLbCZ z5EBmY16|drrzF_?zU4!=eAi_| zG>UyZ_nTTNIkUFbrptH#bOlMkG{%P}?E%kR3^`w%irWuc$bJpDX8SnSetl^f1%$Ot z5>SRLxIOt%Xrpxl=fsLi*I*WzT*0}caPs4!$Lci5`vLoj{~0@7P*}tKnR?-9zaoBf zHF9Lyo8hG{GYMXF*wDt|w)2~}&eqfGE>en&KRo@BzX!|pIHZb4fh!Lz1%%LJY9V8O z=9oA`*EP>3gVIO$gMnE8d=9UTJv8e-gLGOp!=57oxS7#MQDJzbduPB3_Or}nZova` zw(%$I6sS%GC#UpVgCjJD0?yr{m7fl5me$M6mY?jEt6CH&Jih8@RhsHD#q0TIZrXY@ zm;{nsL5B`gpTBZJb&c_tweQTl-3`7*@f86 z<&JNb-T*Hm!D{h;W(drbHBPL>^yk-w7i7dQG7(E?FF^P9SA_);nn_vMq)uzG7i66- zBXNPV$39h{x~fF4Sq#Ld#jjc>@;{e*>*es>E0C(4A|k?jXQJ7!xafu7Z3GPl#W?s+ znEz0nn`qiyD+E@^<7ik5P#FIDQo(?09#FRE#WCJXMF{803_#~f=2AT-ssN~ZA{nt* zbmxk*m*|dR{~pR&kS_ZbJuy&jVu>J!qo*G|Buz|?n`6}cy5Z?lFBOD2D!{Mb^kvo# z4K{mf4ppqH7km?hsecoQVgK;IW3Yymy_7x(JNP!M9Ii>%vmQ;+n#)L_s9oa-JR|Ln z5`dgTIW(s|5b_S31c_hmx5Erdl@$BRs>&Qa-1td>nQ$R67eG{i=j`}`Xgymv6A<%V zttJo_5s73d6}?z%1b=k%L{Cch72y4VIduQ&X9{XMTa3%!xqA67_RmCf{;Gy*wxWgS z#=?cp)bb+^L%x-#T$3KlcSFS=M1;9Exoh3}Uk)$+ciQ~5Wv82w5Er2|kdNf=qsfTx zCv~p4dyzO~t!H{re-d%=?^rGeF?eTREpu_-3z&6#+}T&0nV~A9)o#Mg8H99XVa(y! z!M>{OnoOMlkT*ctw`P4)D^UhF=m_oD2<)>c$LSAC1unP|>ehXIJ3l0g0cTGaG%+cy z5X>tcO)31R2M+YwtzdOlo8{0<`=qq&D9FPYY4UhX-UXwU#`$0S6HHTG)nn~FLi(g0_#|&*P*}I?ukzfkR(kEOo%?sf}BJLpL6K7H2Ce(X8LC!Ap6P)A5XE& zzmF6=({w}2?umkN3JwDqha^_5knJrsT-(#0q?dx$6HmeW1u{Co1`Xw^dDOzp2VldO zMo$KP*qAbj87)z#L@-RNrMDfqk2z)h*!(6oPLsz4`tfqh&MexB;18buV=OQ_8WpA3JnKj&HaM%nZ#T3?B#v3627=bL_xuD)tn}$vgp#(d z_Hm6JAV@)ij}u(c)NuR@EWOAx;_|hHi`A*4Ki-1wzsn+ZJs9W>Qn>BEkftj^Cn%R_}8W&KQ40~|^Zx;HL!-U1zh@ryw~tpt>!Fm5RSO%5D4g(i@Iw0(Ek z`qQZHODuZrKtM4~<}(%LOTWdh_6en?rgk&si1Df6@lKwCtO+eG&AC5Zw&1|-{;}!3 z9bG@8;0vP1ZOyU9cMig3b#x+~=eQrUZ#LBj8v>*S#%F00*5Jt*^cJ$c%e^er?a?k!n<$wC8a- zRs}j700E#~xc@9oB@@OD_J3p0F~E1kbKqcC2O*M2hB_*vmA`;u=SfP6oA3-Mm9hon z%ggerXN$bY=1T~nNV!DWAEzW&c_b(z{R6lP1F}xscoxX@jGZ3GbmH|(k3Q1Nzw5`Bq<54tsz9xNi5Q05K8S#_p!NwtnSi zTP(a&$!&e4W#J$kgW#U`ztJi18`z`AI&%6oBQXwhI9sTbC%_ncYa)SD3Cc*qd-F@_)eJ(R>J3kzbC1BKzWsCR|B z^!vD`{rC?j3iKq0yQ4?)Zx0IQ*nnP|DtAh7LXKvn|JDux^go%gr;%1-q)2R?`*2A= zRSu|9&5qy3A@!8CnjoMTqv_Vn%Nq3o*!~&k^==@@`Vg~zc8hD-X^j+`h>EQYNVJn6 zFmH`khYzDT7&BT&`0{5yTQH4`Yd87MgxLAyOa|HM?O*Aa$TE}NH}qdf{?YW2#$P+# zP>b>jN!IZCF}0Y1x~j-#y-dGi)XfdYj!x!Ixmrd1Mkdch`3z-`FSKqpvCqXY5O9%*JG9@>B7UHtzt`w zRUlqnt%9xit;c(qwNVx| zXRM15*4qY32-qvXh+TXV2YU3m1 zk&HB@ttfnDW_355JT+_7sfXCR!V=iJJ#_8u#$69w5~e1&Gtle{UL`e&GcKL~EE{$ILr|6fCAI&=o(y_B54 zv6GB;JJoYRA>q5{XO8vL;YAx;(;v+@U9IO5dlq<~H^nA{c2%TnsBP5JsB4@~Fx|^% zp@fTn(YIBoirTR7N`ksqa62BnK}h7@`Ni}$3lS9i#S?{l?ZC{bzLGGC2S4}rsM@foTkJr>l?PX-D7gv6tX%T1GFe&^-(%s(6jIXC6gWA5ufEvL2ykN(* z;)Cv@&p(=Uf3piv?Kpel9geht7C3)hp~Wb>q%57EcAR8M*rrjL`s_X7HqG+|US zu4`r#IX(r4_f;c{>(0-UREO&H>29e_ z7I^w#k48pA1=x=gKHXmDWHxTm!>e&aXBVfUIhp^*-Ft^q{l|afs*h+GA!J6G8D(#! z5ISUUviIJ*A`(&w+1cB%k1ZtG+1Yz@?Co$r`;6cBy07bZU-$pFt3O;<2j{%sulMWq zd_LAw(_`L_vOKZcJw2yNEp; zGFLyd{+&ogZM^SO<(9~6lj7fzNC+iQweRReK%Y$6)i)B^#Tw+o!N11`JlX;jjRNsX z(E$cuYJ=X}On7`Ptx-x=Dq_3m_5u6&s3VpyTe6Es8E-gT)ugAatZBgvBXoZT>Pllt1t_t&DvarmuAS%~vu-V9sIi}+d0zQ@E2dt8ldGc5mUtYjvA zGas`d9vfNVl#tFE%ne~tv%bwCtA8A{(zIuLYG^*#7t!v%F ztiGs?YDsQ*Ma2MQdv zlY-v(mhH*lnz=3Q6^!BjXelRZLXZ$CDJ*LDl_UZ49>F z`DU(Dbb)7uAi+`}dlh2!b;>6jFMM`=RJK~O#%7N;Ubu#)>Q3`P{aSbkKLz4)YR?Ov zaUZLs7p5g1-N{Cin9`iAw9xkX!G0DR*N~|PS?ttI+)%{J;rN;k;q zz`RZyjl}q@+P?dc*%D?>P4U^4+pE36|JHDvMpVo}TL`FJoAztv{4lzVCA5MScFu8y z@7h*GgWfaf%T@c{=>v_8k@H$M`RVvhaR0L%a;d`RQ1#9~rNd5bH<_yH(Ej>> ziG4kdWV1<#ub!@o68d&Y5|{5?MBlPzWy$2JMrNNIy5Dwf^Hl-I`>o6_5Kk;t}oLpEfNz=F}Z!rWxf^(;#vpbNW;FRc>@mM9!bd`Yem(^gYj9c9qUreVNrw$7%$KKX3y7& zU3TSOb77%t;^ph>G^5jtc8kJ7KXK_&gLeH^Bi^(qB#c)0Y;-I#_K-;8dSKF*Pw;8| zERKy84z$BVM+szjq$+x9%+AKj636d1-Q3PnTlIrV+y#w}J2vKy>4XVw z#~uT;60cq?y_|rhLQpNa>F#BE`t*$~M4dggQy{Qv1yzCHWbtaBT@;P5ONKs@gZv5B z!3ucDmtzENIlAK1Ib2k?HP$QpwL&^X3gw zYxa0C59`SXeO$#mAekT2)y)W{WsiIsxW6%vUNFqR@6!9*P5i`l=+zxUq-yNs5;b){kHlu%7Uknu#QVC?Sp@ZqKEcLg|*rbD3J$I2s4s4jqNl z5oQ@?3u$I^Q1Cq`8Az4OTx1NV9z&T0W#O)duN7XXO^U&&!Jai7q7GZ|Q(TXefm;Fe z=W)FGb=R~}U-0d`cL!eGxguNkqe1T&S=U<5$W*@x4@9?K#oGEZT?wkamD5s-NtAnW zyt`gbuA8DC)$*!>*zLEri_Q4_XP(qn9-CA1K!bhi_u_6_ZNI1e>&|CH@ez=}d7XN* zV+}Uhj6@NqWJNwtcof1y^I)SM4MaIQeirAp4S2?yz~ul07JWb{O|SUfUmFp~=rBf>a}l=uLu2jh8s+qWTN4x5%`z_|YJK`)p>( z`;B%IA^MUZT}TbuOA_+P{7kJ$DlKWOa zapM9OFu?popp@iWGD$HWCd^*tPP9r2q$+oqD-zR0Xw478Af#76g^|9Ul9iz;&cT05d z&w>XfSBrdt73Gcn3~{HPe;j?{l=BQ?$w>w7*NCcd{TZx zc%P>3lcUk@uL}Vmpy)-~ZA3DX;QqKyxw#i!4`yDj>yP_NlTeF6b~R&#?@J<#x;YYT zP3O}x%rqar!qVR`ne-hgd>@|a^+e;Ttd^AQNGDB#@WhT64m;%0F|emrlzPL)S(1s+ zD|b~cN&YtfxpYLUd2NxgR=}ijE5gk)>O*9NAN#s#_0LT;x>vH1RTZTWX4;kTApOh} zB2h83D6ptSy2&RZR(jGOV`i@gnm~2-ZProPE!5TVGqD6kSOY-qAM>@3JiYYfIt!yn zqSeyOOqBy__^d2_eo%~O?7b8lCz99y$&EPeA0&~VO%`uX^u=A-wDVef{0cmfw0^qL-XN^t1r}yGW_a>k z>A9}*NdqOPlev&EYAO|5JnC~Ke|7FX7U(N>fS$b89cpKR=6UJWTx<<)Ubty@a1N}7 z7)6AN_h6sh?T9Z(7~w5wEi|BeMV~yi_U7L5t>GI6bbFkUswxRGRbzBHh&~4#w--Dy z1?dxc1=*Mx|DnhJ7qxPt5@U>*Zd40Q@+B!7uc~#)JLaoFe>6Y$+dD0vpZuBWHM+EE ztOZ}u>Ypb2(*|_z6TKgv(CckZ$5G)k{hWm4wL=4boWzIMn@A#~EK0RF3HT|DaHePm zSV;zW%K|>Y!A2Q{vZAD$0&CkKTCOVJ(VBQk3LRp2_h1dniqGz(@#?$uMV)Nk|d+= z_XM_D^O1vwA%;X;n}A4C(Wk1Vs!|Ab<(h#;U@4&*KJ_nf%rnumRSeUy?maWzfu#fJ z-EdzLV?Y+~$V@MnbmikzxzE4x6}h}DOjN_P^79F>W!qVaAc+L`@bU4UrNy~agpA#N z0b${Zk+hnW47KUi*;`X52brH2emz(pK?^(Ad@T$JHi)IRPEoSbkTBj?iakD24S6Hz zyf%mSmp(Z_^O-a*AxSx_n_@1Ckc4A?v4AAU)kbSb;V)1^f{vQP_YrwmhD)5=&709g z5{=r}l7T^k^~PpQ_}8vDJ2>WX_E@?|6L*nD^CeMWjo}0u%n*0SJj<9EH-fO|fRB&g z$+bry_4xU2S#%Q(%Ag7R3fO}l+l^Hsry;nApS#!zXCFOie-?KhEs@;D&Rl%|8M5F3 ze~IIe^~hFJF|QW^H76^(6?uwGI+1^aInVeYO`u66Yni-VR*r?k*=uN|Vn?)MY7^?a zCy6g!!G2xvVErR5kA$*{#?u#1ztUdLYplOJ{j8UueQ;PVy|%h##^~~aZ2BOxiX~1= z?an$%W8aksnt4#yNY&p^d+#{>w!vrp?o4;xiAU!TYCt03*o;5el7QDh|HiXUD2>}g zd7aX2P1yOAB&nNL-14d1dXKpabP}c^3^@o5ITyC;5%xl@G8_l{&Q>fWpbAh|?h~Yv z$1DYAfLwR`>bteOGrwM(N3DFr6h)7?pb1?TvlUE~s^Lbv$%8ZlY$9S?HPJ!ZEm^n_ z`P&XYZi=ud6WewQ^1uO0mjRcnVe;zw?m{e;8RZ2=)juI4>AP10Bsuk9xad8#}uL z$k_gA|LU*sw3fQemrvLd`8?K|?+x(^jn}B_EsfTeJiPrv({=C1dXn!>#9mj6IZyg{ z$M((^QOJ{PVu{h8y*r0SXV)vatDQp^wkovpZKr!D2d&2p@^#cSRkajvkxZQwc3-C< zfKFP(`BbGT_hX%?P`A(4hV2eTg74y4MfnYbqZvKRmX=oOO09rrMi7A}gw${m~;++n6CSDbci<5&6Qu}blR zthCeGAv507`AaX)pTU-9w~7LPvQDLIYDR%P`nK0`-(RP%idE_8`oAhuZ@vK$0Q61kiZB4A{q)R3aSs@yu9cqGjl~vSLog} zr%Nlu({Niqe2F{|eRGj9LME3VGJ)Vac)6bb)EhT6-tSG58yd73E^}`df`I)CwbhCw zHz!ytRPDbV=X(Ws`&tK?r?$E;x9!<@5jcRJE$EIpn!eSTYkiE?ZRs#OQCAodC$Nu> z`wNTUxrgKcv<8eNZ(3$S1?or3Ndr?2RVoEqX)4Y_&Jr&FTOm0Ud zi&snCj0qxsBem{D%I4%)>gZC1T~3wF|2Trdtnou#JoY9Rw)>xC^4MCR57k_QGWh@6ie=R>WRm~j8; zDf=qkRoKlkyL89u4hRu_kUj28|1xxK3!v6@D*%uwXU zb8D^`Hu$7^>O7s(JMN?099kwSmKDNn zT+8KON`EJIJfNJLJZz|w&$K(_6s#GT9RG3g)K>fCvx#PE>-R#G=Y`5jfyzpub1U{Y zOr1*x7^YB)-pwA_CON8vi9*v^dHkTRHg=6VS8hmr{L;HE8!=pCXS z)MIFtRx!tG%LsMMg_q}2#!qr->rNjc`TJQu3t~&+;J0+^SKQ@hI`8oLHL zl(P@AR8~Z{MriSueO{7)N+dJ6vT|Ub6sTKM3N!fKxT*U5--^uKm z$8q+JJD|rLj}y)BiTFZ!YnaxrR)D|W{zw0n z+G<{I(jSHfUHVnW%_$}U9|Sq&mnr((U(@7%ro1)Dp{uE!={^e?Xqk;RZwBHAAgPoI~u_q_9wN+1|U5l&rJbDpu7M_G$v(66f>=^E3+~ zo}cIQWQmxw=mDaSZ(A1s-h#{e<2OEMK~E66o#S7Jvb>+?Vr_3K-mDC2t?)*F+@ z-?xvvIijt&`1Pnhn%uh9^!7=k)D8KO*!Ci)nD9hpCCRYX(P{HNxJ@}(d2|79B^wiU zg*?y7Eb+gcw>P&w;9>rn-c_~8p$nM*od7CPhvTK-K0JLPD4VL0osKTH3lYO`eNmZS zQfjuIrmioOy30j_#&i;@TgvN)I2ydg6zEAkK!!}g9Xj;l>KL4LqcY#IB^hMPMkJ?x z&f8bDl*52`c6MY|Rt|J5kWB|?)w10xgW<=xcAN2AY}a>M%4;VvHL|9hK8s~BiZ=|F zvaW9y0yVt4;mUTM81klC8yVu<&`FrFIn#P=EG>G%O^~NcsnN6-vz6Z6u-++*Nf+}{r)xMCV7-7Rnp|%b>mCKFsKKHeR?G4*o&qNiGicq1*Z#Hx&L}gNR+{se0 zm^e37^qx5~xa3tYWMql4o-cEG*Ij>7SzJ}F5Y7P<2NZh&A7V$U+Hxq$q`dZLOrZYG z{rWO0!|C!Nr>NlM%W8ZYkMo_4E0Ei&!A9!e@M3*vXD#64M*W#m6NiCm$jcc#S2%JWTV z82QJavymdGMAuIA)e;oyqCQ6GXFkVA4>fH}&>Fs#{6k8BiM!{EA5C=oyh9ix_s$TH zpbp0nY&k7`wP%i-Qy+-~2+f$JVJ|+$yA?HFzSs>9Q?I2Yc;QBIO_^jvdu*KEk@FM zBp%J8t=ZZW#r!N9W^Nw6X|6xpZ2mSe{(yfmwWINVE}wPuTS<(Us|8P*;W?e;CmF?30P_{?lsM#CGN_#^5si9 z@pD{W%VD9TKdd1uR7Xh)*WrWAD$-BIvU8Qz*Mn{PS-0(j4UC;D+yD?M0<0L(TIzDp zK8N!1ILR~F52cn6M2cZly)4VqZ=CPIn zZdh~yDa_I_p()HE%@P_>JO{I?y16gN1G^VB%|_`U*hiI9qvq6EY1=8H1yIxYj9Y&- z6~+i2_38U$7RU=OzA*y`abov%n86o-3i!p(w9*Hk`7LA*naa=eW;YQzE?cggzL8rY zd6z`$%T>XNZlQ6BMyA755y3X|Jik!5j6(_{f23q*=dilKIB%0Eo;K6c&W?Sib!yJ^@}aX>3OZw@j=2d;EqAzC4JM z02S3C4xM89>1RsTEm<4le)T;w)WF03q{FDJjG_e~-Ct?DY(!}OYn|vEmu8bRCl*0Z z1o2fKRZZ2BxuHo;J((CDQw`Wa(NvezRaD_vpPP#TpoI2TUx7`@F!w`%y%e*R_^XVf zM`Sdj;AqiNbwNabaYZcFERAF*#N|3YQfzJICcDfZO;{}?yth6)|8VSz#M9?5?Eud@ z=;0F%u5d&B1_L;f3~65&9f-QR;3xp)Er9zhL|6PzeVXa%=mHo5z?_l6B0(Mq0cX19 zrbY%17S%ro|7Hl^nG8RML%d{{KQ=||3xB5S^A`ycs(!cegUTb`K6sBcB_8qFJFI>F zucH&$bk{+vNf7_}OA~Qqrj>=^MhNrNi-|mx6QGjcuq`^7ol!q8N>z3?Uj21jBCCHl zG)#CO97W|AE1$BN;_apuVjq$5lf4z$K4%bH#)a&hRU88PatY&O@y<|#Pnh3tV|o^X zS1;5}@F0?E?T5SMA#BhF6Z3*RBQ4Kxk9KtTvXREyT;6Z2Y#bOM3#EzV321+t!PBua zn#uR!?HelmMN7+LSSZ&(Yv*S=R`K!i^~Ykq0&0rpK(sM6&YFP@bhpxlROZXZ8;nN}w$RO+j zK;{oi#SDcS;VL=%S}fD{CZub?eX|i0A8^_r!5lS67l>&w$Db=%$s4 z%G9zQQ>bu0>HAFru_wPyU+;d7#}TAlPy3Gk;)ThUb|dI(DH9YmB?p9)d?F&$cZY?M z22)rfLW%L(llVO!X}i6et&70-4~UX@IHP%~P?;1lS(3XT!+IuCJUi)KU{i8+i|eU7 zO}BCRl5~C(CD6C@`UntIwJXIncKw8}5kb!9uKuhbYv>$o#Y!B9yB;ewaN7 zDT3xM$HRS${I%MyE)M9S)b@8SaRfA?!4KxV(4l6Es`mbnUyLqJ^fUystr9Sm^up z5pR)=n=zPtW8GvGpUS1^nO;Z0s9+S=nmE)4;EUg zf5*gxe72Ihikg01)WY1U}| zWFRc5DW2dOkTY(LHFwuxS_g)U+)(7PEg`tq(Btf`qZ5zqy3ZL|Q_50P^Kz>8SAg5) zDo(m3&MNRLoUqusGvi&3r8q68G)~OeBQ;%R?dK|v^T&ANwB4258Cr|J+I6mdXBF-j zl9CeCH}__4hEeSI?kJp`c%B#8Y?SpoOTe_4iPJaYe0jHtf+rGBQZlPoe^8%v=~Z-0 z{~Gqd-tei*GN7*XUyIqg16pMGxMLNT8_~>2gYCU(27cGiXKN= zIjzQ!SpGCM+R}3M>~~$abrGS&JGr*r5=T2@<8bo+#q?zb?IaJKicgp@(FQr{Pg? zUhl6i4IvR`oYuoW4>O0Xc&dzHxE-PjP`4(5!Xv@?n11_oqN{*C;G2R?7^5{P}KIECmI@i|j^ zqH+Jnjc@F3-sT??VAv-XhIgey4kZBA%{?xmspaD^sj!wtUcrXL47H}CfxMmmeC6} zC*OL?;#@V%tO#}w{xFsiKk!i#y5Us4ZkVWXc>G91-n7iec9>=-7(d*w1wjkx;ZTh& zq=*I(`uDgq%uDqJit-wM08te}H(_soqklLgjP)n=n!fLuMU+W9YYwDfkTXs@E2Rq2 zpbPwu_cymdRl&v>(BIDziw+_zo|;9S4Oip3H70M&v5rh&wD)uiYUlUA{_oIUR*VNRr!$uE=W$um}jgC%=HKx}Tj~H_mvBhaW z|E&GI-yGHDhqyX5ySxSD5W8NT>&Zk@@FGVM8|BSgd}hboK3>j6uJPG91wG5V0Uz2~ zEW%tHXSec_HRQ}=8|QC`DE*`3+eCsTSpU4ja3FAfP#l)W_~|GCd;U^}l9g%A+4S;G zbe^9)h45M`|Kf{jLibPiuS1+&dvR!PiE>{u53n_*HNA#Khew_=v2n9lSTrEJPR^-< zeI@t_JwI8CDHHRB3iZpW*(p_8Y=i=B)D(Np+_BG~T$X?DxX3u3I6z_JVv|skT4RBH z5M=_H%&LfdrF7Rql$+}(BX;e>MaV`h$j{Bnn%S-Z=QhIZv-fiq3L69>AtGW7UzC2j zb?^59$^DoP#u6DgK90u?$rs9lMZw!co*=K_Wd10k8M{=dw#WFmnxp9~4sqH2zOxVp zkREN%GQ{eyz}zdnJmcmL4S{Rvu1_1VXoMwReH-ly`|zX0^3o|Wm}gs3k6ODy7!E=L zQ~lzIw}5?{>O%%JJ*mN4U?52(1%=xZsOQi3U!@ThmA>ib`$jxlM1ajz>~#LS4&|c~ zhp%`8gl$AcZ%u|{g(P*nXM(@i3x`9EH6pkEK0)MrsHwHB^W3MsK=));M>qbi;m0Rzz`Iz6Wqi#7DV4Sr z#QjT425iMWJH5P_<>2C~Q!=+2rMCx^C@1AV^Jv0TTf|5TbMlpWLa``r@fCIh0XuN6 zsj3Xoe52L~u_S))=SjdU6jo4(9K*#@i7N~m|3^~p9t!Ug@bYbtCgdwanIOe^<;_J9 z6YXXu#R|Hlls!S;-f?!z&w^ZAmoV0lW_q*Aro2T)1sdT~Jtp^m#_V9ZQ;F{95`Y>V z(6l)#kU=@Rc-E?AqBPhpis`eF9-p|og;|i@AXTcb_$rlK9TO7~|0yam4%xTt;wjp6 zUjnAZ5CvX7a$D{%Kxq7I5(U=v&)3WI4kOyD{UsXY{ykrZDA_~bbk9QkP4d^~){C8_ zAq_8nQHEY`!aej(e)w(H;eqi#KZRx81_kZE-+vQLrgi=2Dq&$wO@j*RpRX6Gg#W$d zH#6w_{`um&n*8r~FT*7M=cN?{)&IzBHv^P&`iJ_s5sb>!Kkb2`l^X!e9DG8L6oZx0 zquw?{z9Q%zC0>0UZUgcgids-Zz;khKcj+0Uvb?XN-lLCNxh}4sgZ=^+bfpr>K;ipg zYYsM+d(5mbbRC9GKp83T7$m$_l9K`B!oC|8X`Ih(3n&GDZ|WS7r?+(nTykbah=J~I z6~YQ;fI5q_wVN)?fxw$5=)G-UZ2R;d*3sGA9D3s8?jvg_Q^uLnYo6Jxh}FQbM72w|##E<(4)&;~@ZUy?5^bbWDLy!_?a zf{V86`iNgzUa@Q@Kd5vd-2-qhG-+RAhMh~o;3^(S3f8nnI^VTf`u8lo;KbWKND!VK zE}u3CEB5yUA;4*=qrYrEL%?$gpecQN*V)bG));c}gRdxq;SIVpwPdZmmi-d40z!$p z1aZy`9~JIS?l|$Y6)8`$VR(^Wzho@u z#EzV!E;umBv+HcfK`e`asmAKBZ^W4quIP|^EV&x>Yr=L4WU_zB{-*`tmv{?1)=JAw z%5t=Wv-1}|i_nB8-fMG}cea96dCT-`&OPG_KbX4ZDp@%0grvECf&+W?dSF{l?6qj5 zu3W7Ly76X2tB7y^3yvTozBsvdR>$qDxOAiYG`4&s750Mjz%;|U#=aP6fZo={c7Oiw zTK!g^UM^p0yVJG(j+F+rm5DI5z(V~D7MEK9*ydGmP^YBRCka)(pqb{BYIpnl; zf@S~$^GM>Yj5jq6z{ZFW-lz4nS>TcQc_gP!Kr75bxQRmQQA{l&a6N2$e;)zHTJ5k1 z0!N99n7_Pz<(SAxi4J?To$}5{U+`dRESmr+%F{q)+l6a@FxN^jx}725u70iFbDfow zp<&D(V_|*%r0k8xSzhj9=-yriU;g`fn}PtKHQ;&Q#|v;{mNP}hbSY~+fv8ZWEML4y zN(@6XSH|d$BRrgZD8{(m-daLthA~eJm(zA0gK5Okw~qm!SP*AFHGVpo*h#YsOH*IX zPJ}4wXE7Vy+;&+%2nq+2ANf=@YZzVp`1Ci@EE-FE13s#@*&k0v$HU#shW9!PDaDysV+8>2rL_V3oTvKSxF- zCosFXdUKp{jU)Wx=8OODfs};yJ4qdLgL>Grqws>^$HHkjw)VR7<`nFZXj);9L2Ew# z>dGE-u9#;elEDF}^7$Q)Yhs?W?F17`J(Z8;9%IyPfA0gcd@cG+EmP%&L_t~x$Qyo6 zwiGqwy{engOSCNj>`F3yesCBMQp@|-QS)4&^gPLmub~f9b34fFSlodFF@W%mlCD1d z8Gx-cvz3zSomHW!&#O0@G>FacatU+zFg%G-#G<+V-_te)igLfr`2*4rll|S+u;Y$D zmmdgJaFXvURUZ$ZQ2^GQtIT@jt@re+zK?;%)93Ey&*kC>C2B;*1bEmZWb@le=SWE$ z1mdy8lLF~pgJ@SMN#E9&4$()S{4&F0eVzaOdOJlYW4dg*Qf{j*gwh^KG6WEkF?skT zHybXK3}m>N{~GAu9ebT}3>x$mctByEl2{g}De=o7?0+|Ikrz@CM?of5#ZK1}{akgz zyQt%8gC?uCTOx4y-cvrv8ditU1?UQ_RzLfAxo%l}Vi{`?b~2+HFSA`;p_P=lK=&m1 zxe^aUwU6xIK&2zJ5wbTW6(3#jg^!6hdeD#L{8?=M$l(vfp%JBORq7@{)lL*>lD~83 zZ=r!J$h5=O2?q*|F18bKgbRCWoae=#elEQpGCznpAC^;>Yh(SRZkt_pJz&D!d|{CC z=CB4d48U+}8eNDa<9U&v1j^nGdiEOu>j3S`G~nM|=H7CFs1w&#L6}2MHwt zBpRskqt&068m=>zNoi~8dGPXz3NuX(jXM4458h^Mx=`i1GR5pB5Nq$*{{cR-aK3!f z2Y0<}CD1A$F(m`cBdT&g(n@G>`5_62X#-J==W8x zdKog^AeLCE#_BJLdV1GT;whBSUdT?ZQtQ2shkc{_r>*xxp}Mrn+&_|RR#&op`h7-t zO&s;rd_K?y#tt%;LHb*$1({%)AM(q-O`NOW=DzbPXdi#Ka)bZErb!#}J2Om-%PgoV zsBh^hYVIj?-Iz-H@02Hi=_Xcu>lL3IXO|tCVA2Z24dBwTwOf`7L4Kr8ee$4r(_{a6 zeD;YIV72!K2--pPQB%qJqtxz%VDwJ(F!yzB?M!nGbDmg`*t8c9%3QcYx1LI0cXpT$ zQ|`ChSn(0n0>XmAt&@kF_c-0ugP%GFVW3!p#7nB!$02Vdgo8EEwtK7I`fGS*5d3p#efTcLaXSPy$f{=NLKNx_yOX1HMf=?ArsPpcsly}pg7F%s z1t(&KL>WidPc5#Ybx9=`-R=K7eJ(v#?g!Wq1hEv6vbb*N7)<#+w)F^G&c}uWj(g)RG%;!|8vub#$=i@X9U5uay#EF0$aqy}j0OaZO zXTB4@6NzEvWgJRS=8#0f3AzbAU13F%0U@5O$IfxE$zy`T z6)1$Cu@OO{;hMO&2p~-3L#BfpeTD`CRI!AOh1QZLdkeZJ=OVGcigf2*PK+PcoWzhO zYkG^>y+}gCyU;H8Oig$)_Mj?kw}Aowf8P7)kVcfxLCHprl@+^PR}7ay>BNgehvq7f ze*>xuJtIs)$u^h=EuTfij|x+LGz z9h;iQ89?wh)|^{JJ%YbHnd_TNeS$xK6AIMEoRyKW)5a1qWWZlX-LZTu%-;_1TdD{| zh1{H7oqw5^(!KgyUrw_3;()*&`QNSg`+m%m2$t5*sbkPTN_|`G<1s1Hc-P)`g>Hb? z1t&b-yj1n1d>Wty+baHd$6i5uKu)|%(Ub`At}9D3Qi;Q+tvy;-xaUSI0vXF5I_N21 zQB!gL*3qU~-`uoz7U6>y2Z7R7V;I+cOWbl3Y!0=eV>E|sFQFI)u!}>xgoR6l=iAT; zk~sOn`0fAA4T%+}tewf6n|1Z-rq4^v&J{YT)MZCmE%)3hsa&l4Y}$&dFx0I^bj+jX z2Z3~%kgkD4Opo#QzP;NA85WUmIB~E3$7Prt{%=$8zm@<0UIZ+x|9hwK|L9BqG(Zq$ z#6zwTrD^3%o$IudshQKICR zDiD&oZ-Dx@&pNwF5|+Fgo+V8W$@R3srvLU_ze&<~|NZv=(1`s%dU^kUKi0dGLQ1Sn zbHN1XWyiKKVHI5b&DC*UDQ1$fpB-YZ+twv6rq5!Sr*^Pc_h>m#Y{mk=8c$DTm7S5vkp`>x5H_9JA_vOO#PoE9BoEelWgsYj&9%WOFD1ux_Pq~a z3IbGB2#uw_St*drx=nmH=W1?d%1ARIiTdp6Q30~f{f!<~HqrrgK+NEGMJwB;O?31w z?>;&c!+5%e*%A+~aq7ZIv3;K)W2Ne%CY-C-uT8_hBxrxI=WA^rcX>XU$X=FHQ)~&| zp@y@%aYNzK-Eew_^@Ua^vW;1$o9M`i7jG3r)OEDBfWl<=N!j&mq7~jBmid0k)5Ybp zFpoBjD%lWp&dVrA$2i=fUV~`@z+S*kdzV3fc1vLW&YeJlHFlD#apUEsHI^-Bk3UZ5 zSGiiZ%sQ-oZUdePTvlpB{eMcCJ`OG+E*&<@nsq35fhiy%i4+j{S=CZX3Ds_r+bFi4 zgT)baTX2(LKZ8~i$O$m(E0YZLY6Em$UyH7Mt7xEpyZpQg{5yRA=p(&r1G-@%M_5ytT#M_7%w0SvSaVG4_qNjS z4H=D~#&<^zeIpRAv?5#wg9hvnbqzLCu_U{44S)!LU8oiFJK$xK_Gr3eSz0yjM{|VE9AGWe zx=Z3{9&0ds-kG?6+Bb_X?o>zw6djlcX5bSZ-k#cVzusi-QdK^kUx(Qp|8@I3Xk5ts z6dDswo$b|zJ4{a`E+loEX{sUlzpzKa(c^u%&<-FDLG`Q6Lj&@Kx#19HJLW=_# zMZ?Qas}3go%hzgA))#KkUwqB{juOReJC^eL?Zx6p`y9CsZ(&31h!(T+#(3Ir>v*l- zUyqj`Zc5%b#+(j_c%WOIrhkrO&>p@7O>=W(wUtZlPAt)XW;S3kh}L7TGLwpAKk69By5*cbK%pe=5(P`r2O9KK*leH^ z>a=zP=lRug2lB@%Y=+zL;OFlWZM%#3H+%Vx|Bj4H) z&-n-aUNX2eD)~lJpF^YKw<2AVfNRBGQ6;K6E=}>ahy8gX>_v1a8g>MYtUZ;R*u0W~ zA`7AqlvOOtF}fottNcq$T{=+ASkjPGL`5e>CNveV=~BnAfuA+@@H8$Yji|LWI2C7q z89k4dQvCh`D11`*QL`@HH4;iu=ZD=NzGB6;2zzdKjIdXmcKJCCRhg{QORx_Rbu;*3 z`s@n2@VPTW!{6hw_e=;-pE zXJsuW!R=(a#B`?%V%a`EJ~>z!c_8pjA=~nI)ya#~B4y;C$%(vj+TJ>s?J42yL?ev} z&_gAD$bxCQSDvX`-rMP-TP^!kB7+b3JV(Cw2xLv!0!HGq*-R9>fJnIS+5hW|s>NoU zxZY&34jFw`?mm4HNYaHk^3Wf4etIrwL(3$Z1W*O8tN{qo}_Mf`l7)* z_(}YyL{&XSm_YLlM0=NyJ%@5Bh`Jd!#{3S4%KS=0a4Go>3)5ME8a{a5s8C;!tDd7J z+zG})+expbApIc<1mml(%l0rxL;9%;V*R~Okl6WI^r(nGOfA-^wKxgPuRiiVw)0W7 z&%Azl_NafC)9)18=3Ec+ACM17E9kJWntsp9a@B4!w$)h7ha+oq0%jzhpMZqM0jls7x#OB_ZLTwxi5Hw zr+9Rs+e3o&1`KwFK~Iw)<^&JlgB!{F`{i&~;P;%Ip3Gl;gXx!+=35qTFV=RY`CZ|Y zwC8Z`n_o*4A<6x?&gB^OSz`I2{(+%^d#jPGQ6}rwCispp&gc*%jUqY;SLjT+OKjT< zcJp%mhQA_Fi+S0z^M1T~_%yN!GbzH&lG^%pCtE1j^5R#u)h=&?EsK1g8UKbE1Gavt z1wAXDKJ`KW$QVjf1tEW_Ox@0JgXj2#834n7)2Nqi{Z>KXCehO5A$ycbgfi#iO%ljN zGcj2lJ3`Nqks>uv&DLDqo|dO2+?nO%D0ELH2K>0BOB=H=glG68OowGgKL!lQ(ScIW49F+|G^qFWT;hH+x1+uE)C43b9e9NpSPlqE)uNxE5^Q?w5y zZT8m?o8A}hTC-?;U7;UZK?tZU$Ra;8Wtsp(3gYj{Np!=d#gDIi;;H6}6b)R<`DxN! zZD?mVRxvQLl0o-boRII`*B9;81>OtW&pmm!?KJmnI1X73(UctpxtZRJ6G^`OUf#5 z1fvHZykF>p@EX6Vr7Kp?Uvw@c$f*~&IXQT`4)%lRqtb(bvOjhs3aJNFbY_L?14V=C zeOilTd4JEn!1en4^Hkj@OFxq@k+SRc*1V4~n9#4eyS4TPoiGYPKOEX+)8~gHQ?Bsl zJ@y+@IQ{Yp^1Uoa0#+-r7nQkV)kDNxS0e19WtwMT?!@tWcwHUBA6Sm;Xyj9d8E}_S zgk>npw8C2tnQ(VFo+}c8gd*qAFbIG<`#lyqqFt25<=8t+r* z-Y?UanqFV>77-<_uYbrG830aCv3q>1W9B?QXBbXsN#jNKKQh)gEh_bjW6)-_oCGl{ zDFX&+e5WXp%}1{QK}^5LPbKV8UYHhY@a2b{A_f3n5mvw5(EV zxG_$NU;5qOy;2&m7n}d|^e%ZXa#0r>Tb=>({Sx|6>O+}Yw_2rei^__YcNW=e->A@E z!P^~mdkZsbv}NHAxbO|Pw2KPS_fvFjZtaruT0gXu8mwz-$$#{Uy?TFW@Lp1aAZ!sD zPyWh_PoN6KuP{O9!sM@#)YpVc&vo8?#TsJ=OuJe;^9KWoB+HyDi6r>8(Y`L%Xf!Co zK=~n3J8^$8xFxSIN0NRzt?157ctTrM6nB<>_yYH-W)#ST49H{V7K}W!DPz=fX9c2W z1ti`+VY8(r9(KPcmgM?jbcb0M$**rjso{eOUyPrl!!)W-X z1{M>m6159Ao=fZq!9>7`3D@1f&4#el4@IIDwqON7ct@h|OwqOMWw-skZ3Li3XVpM9TeMKls`t8<;I-+o|X3R@kcGo3b@L=953e7rZb)5}$G9VDi$ii*nW z`YKu+k+Ok!Yn>-MhD|Us^eldPbpN}Vu}LnkRy&o91a4Cy$Vi|9KR!U43f9Ek6$Ivk z#+E}Ke|zjTy_^h)b`)h|o-@Y_cviUlDhi5Q1++`eW=u^(iIjrmHpx|?NukY%mRZRF z>@9Z{O-WFN7n|DB2SDI@8-3pYvm z{X%91RQ-hnd5s!7776UMF&hVXF9{nRbUX*k^48+j7dvy-TFB(6rDaBZu(OOFHFC56*FLK8k)F`vs%5h?|K@k}+MY>Lny+>6QxQ>T+J zxK`63fWExDB8AJsanH`--m91AD>a%?^-eq2wDax|U1gufl6V@T9vDFQE=A7^&C)*E zYQZj25$MItA!OK$q9vA4vE;R2&>F7vsqV_}&MxI5$6Hk9;LRF@{lyfD2mGrgdMR58)(WMO3~>2K}itooDyx_8io(A**&s{uC@ zOdR6TN|-l!iA1Go?km0|g%B8>$|yOC@twAH>v3J(JWhn^PNKgwH8qK@5Euz|my$0X zP>Do2)0MfQO|cjMtH0 zo^~}#1UR}b2q7i4nDaxsSgGe&==bu- zAxjrb%cJhI{2D9qQotEzJPu^(Ks6$K&f!ok$ zxtKjx)!Bg03??^0H3tGbAxzlT5nDUMT}GD3oGV6w_hQovO7Bx3$dtHOB6IfrE;sj6 zgvlfAimww(Dgtf|GW#l_D3drGY!$qf+01Tkw$TzR94oqZN2YGQ-$m#4NHq1I?YSxg zeU9P4I=evN{rqLd^2f)Qp^SK%-U|&ksJ_7$BJr~)!fdhTw4mWdp~^iDcBspJ9MBP$ z{fj*AfURc32cj>mJOT)Xwd25NFg*M-R{fH>ZF?662L}02k+>T_hXLW9KaRQT3kBdD z7Za@l5dVe*q(Q>bNF<*S_rSzE#Nvae+eTU;s``topfD3BJ_9dZZlysXzYkDM}K=okN_Y__Ealok$} zM_I|24DU4Ax#npvCY%t^3V8MczTPzm9j(q&#AJ<8{cwjpm6<8I#8VR&Ub?irnw37g z=n|^cjoH@1wT$%>-^mK2v%Ws42}loEN#Q=MmanN;mD<&wcIXdXHkXuA+n3fqPgApc zCwI@;)92~eNhtaPgZ`S>@NMvKG3TPBWcXSJ`!`XrM&?k-_0gHYgqe}rt;W8c$y58$ z#6ugenJaX9G-zaZl8vCBrp=_6`B1~1y*<3gT{?IO{eg?$+Pmx5(37h_Ww8%}C#DI`3C z|4{M`cKH8d@2|qDT)!}07%W;*5hRrk38fnW0VSmyq#L9gR1gHDL_iwpM!K0uBPCMO zF$w9;N$lbJul0TVWFPE(wy$e@G?fdS%=dktXFOxv_wObdpV87&RBf;xz7h2NtT}O| zckc!InH1D0Kosz6_L(l|urV%eKO!wroP!m6)Def7O;r?udD0ea zDltF)R!K^UyOUqP%{G0>`PS}-EQ~v09@HgtP9!QRhOMu-4eq!Ar_;Kd)W#k%Nr{`>Z0gTUBDtaxM2iPAN2=~#Is0R z0&Kuv3!{8aAW(uz+%H@H{;=^Y#DMX5BaaViS{zP%kV04fZGbwxqa(bh^M_uUyV;LS zz!4vn?*6E6HViO;jOYQu5{+k=icEiHn$jkt@+AuLBp_VqD}~Z37IC&SY8P`ck}iY# zsePBB64*XFYnh0oh6rwh{cjfPxv6)Ik(-~) z(Pfs^o=hsf!-g@q_Pj*prOIwc(N$9pYSgcF;}yQ)k|kk``Yb2vMHS0P5mfI zMk&k=E|Fu#V5vb)O1W;nFaby5gXQ4_^Z1MHULqEE9xND9dRKWlyU0&>_xF6j#;K9g zztPli^!OS?b&hC?s{ygbWKne_c8*ds1NdbX*?qLyrEh|tH5ZW^c}MKyY-+%1ImN?E z3^{mXiXly<*jl5`J$t}dYqvXIf5e*3A3x0ez$3rp=h1++D7MR%;W*rqG#r;RxQ`60M0Viy{K_eUtl&NXK7 zen8hF=8OFa6PRi%<&umrpNla!PAHR>gJZQV$c)YDV~8ygv1!9R_N|-8^M2O>oWtjE zwjYNB>PokT2%kX;=sWCM=RUJO!Q&*6g9A7aSJ{L((%VXcNB6LoSdLRO%ID+al!4~q zhBOSok9^L6kLlza##?Eq*>21}_WL>GG>iRPP<-)-oGIlh`JNrh*l*aNS>=)F~c zS2O&((NXH3T~4IIEEqJn3+U98dh@K{oYTq z-^T_hn?@&2gE-~D9)d~!cjb(jn0 z0--pCp9a}KDRc0*KJ$S$6q7kMF5z#he~w(>W1~$J<`MQZPZ9CEas^#~d-)UplSl)c zTzLqhi*xdVA3ShGAmGv->Q7Ge~RV zN6%yJqt>;3o-1#m(Dc7i@jB|pHV?=_r!c~{PxjxPl##MQfZRGj5$q-_m#Yr63E6ah z8a_2R%_xBlciY-wd~87_40&UJGt1m!w|fJ47Z@1s9%_}+g)W3sUh8(I_oD`AqNNL# zMIcy!M|ch_f?(^{*q&T(oD!HZt!L;(@-Z#=NBr9T0oNNW{_33j4zASx(5vUq{PF4I zvLwnwsKWtUB0+Dt3;=Q$s4TgOBbN^$r|VPd=k@lt(T=_}G(cF7%#X~TfEx$rn>d26 z$Os&|4bjz$mL<8QyL7blG_|vxoLwx15B-tVX}=(1d^|fPk;ZzzNQKJB_+`p1#93~A zTD-{^;e&GU4((dR8))LGSp_1L)Qcx8wm!(xk^e$0R$O%xOfHm_#2i?`OQ_t6l5Pbg zpi-_szJpNlwwPsmMoA0#f*e~~(J~=3hy>RY>sO*W8ijr3kskmg0HjG#1L*6f53dx4 zI608TCPj5D@98FzGf;%%H$&F2R(oBF&qV5opn&5lw0cQzVdSXiu5VZqb2!fL*WAtS z*Tg1{v3Z#9PfH}b2ai=z<_l56F+O*xu$0Qi z#Dn8&xOd-p($We61z*F!PQ>uFNVjhJFty()8Lz|q>*kgDu|<|5#hF6o#PC?DvwG!ZGv~Z(^UI zaFVws@*jC)T;c#?Cq@^=W};{F;4U$dw^2so2I+~~#;(q6C z9nWCLI$M}hXI2p93!8A<&Iy$zfdE8e`!4%L$?UsW?_&fQpnai21rl|;Us?^NqRe+- zRn@LLmG1w+ozUyxS%)@x^SeGDG?_ZIia}US)Frm8JQRr8h|%MC5~7jON9xdR z(9%2Td(_X*umDUA=8zlPTb^$3uJl@z*HY8VXJ?ol0&RQHRnNwLVd9hi2w)ewXZ%nH zpph4QGx0Ky1gs_rI!A8RHKojs3#}`w9@F+OfxCUthgUp{Tn>rh7W!K^o^Y|7Q+jxt^>vqf*%Hog$zg zt2sZ`p^$=FuUllQIQ1J{Mxoq!D43-N1u@=FvLC%g@|MMwe7qc5-ACAsmsqxNi&fv! zOR-Dxd#X6}ZrLN;hGM;blCk;BJ8Ko$r}5 zd5Qw$nlaIU<0@^$ymE_=fMnsp$uhdNqK=mEQS^JL7eTtr2eu=)cJbp0Z&^s=hPo6D zsH5;!X7<2~segW)pAe!P_~p5Y-zl;PTFX+&(X&N8p<(r3cW6I#OoBclL)**Y>`W(ZrJlPf*HE!Ik9(9cTFZ9P>uNV+7S zVx3ew!aTE~{{a`r$F%)(6-d4t6cDI|1QW6jVqD3R=g0d|QGs}WjB?8?IvPQAC)R0I zCErBpU(L(svwtW9s4F`E&oS!4CugLB!Ehz&-x*SbFK@1%4NR~}1kQZ&e#p&aeUWG( zQlPT=nCQT8)fY zM)&@9)y>O6(~4dd);HmL?B+3|8e?)q&JWz*9lBn5Vv*gwBfWG6;2%T`E-S-L%6S-M zW@BTs&o9(cdi(3!{+=(^FJAjB9IuprWESgGfYHKA6~u(z-ab+2|8jP^SGMIOg1%W5 zxLhkrbEh_#49?=4MT!RBL3A5eHS3qLz}Z~~qlq|n+iQpc=TBqS7dGc=Yu$jL3Ak=# zV`iQQt!;XYnxs&|CaL^zi+f7 z9|k2)S}?Ra`kn<`&mWfKkk{^9bdkS_-91C~^>Nc^U3IyR0o(4MUzE@@$oYES^6pCf z$4~f}*Y-?>DE@5KInK=egSI9kSrD-_zodJ_Rmn(Il2al69^cT2+DiEK?b$=UM3k|{ z>!zBJSXqFKTD#ag0HX%5NMr(D5rL$4G@55P4Tc_rdk&61!;e%2Df(wdQIVqFg^#KR zImz!4-XXn50rbHa3#_wy%d(!#O&tQlluwFNe;c#I;N}|MA1>=xThqD%nteB+-_Zc& z)o%0}(6*3RZf+GoISt3=FK~zpFZOD9;nfAU$Cde&n)7Wt;FdjAPA< zRQGxadf?(_@;Z8(4oZoKvsEFuNrH#Bt*!$AVnPRlTkliZ6G$|^ePzkz?X#}E*IOWUi-rZE7rfL@H;b2F8lasG}-55s(D^X?89@Kv*W^87%~O``S{yB zZy&pIyX43!O+Ug~G<}#mr-CZ-rGed1Y$!m>wTt0WgsSVIz47cc=7t`p-}i^JIM&t~ zA6UN&8JOO$kbE?|mvHI9fvc>X{rLrL?+p8WK-uZhMRV%Ah9W<78UOm@ zQ~wvI!q6YzQlKCcrM%QrG;t>;CYcnbyK@`e?Hka$nB5R7Z+!F3%;YwH3AdkqN@I}G z`i=-qV<3&|k#xxp-F6dPW4MZTOb79wo~%MZZXpZ>nFmb+o=J$VqXW+SE4G-Ctk%4Mz7-56FqZ z^sw;IjE@!Z?Kr_C|L{vZLHHUM>Fn++8%KxXJUX^@_Pa*Cu`fzOzgWh|@Fua-+g@`GOi09F+c$RuP8$q8&?LUJ@yn#QWp)lfl?t?urGm zIy0M)(B$didT^xmc9XrUy>P8J)banzKM-u9s1z_L8=K6a;bfTY>N0}iaz#uI$&lwQ z+WQ|R#V{ol2j(cB*zjH_`JaZcTobykO*5lbtH+TrzARc?a3nKh$!7Qg0|E7_FvxM= znrzfX$`$E#%hg6$o+K>oP>}OwxJxSk@B7~bPG3cwqWz80lOIk6(ZDccbcOT5jr6V& z$)(f?$WLU1ZPnViUVAVjpDVspL>X7f9||m~Q~dw^0CPY1JpcC+4ed-w!~efPz|jAH zAmIPgm-91Q{{{kz%h)}J-0`CF0*7^KzlB2=*J{=F=r#KO z%;jc;5NnRnwUd$G9xrnYoJG^8C>~x;ic>FsAmZ5QezIUsz2H(ADsw*u{E3awEq)}B z{jFM-vMNE)))?h-n}s_eDJu5MXY0rDm{3lEowv7*k(;S`cr5a?tY0f>vo#I}S|k1u zkk&WRnbA8j$Gh1ya2Fyk#n3NzcG6+csP83!c0}-B64I7ES++{9$hqyH(H#qFZ#Nz>b?rHvUDZ5#GDe=*8%sT~Hr(^m)=yia!gG?)$I}T(9nj^;CIPc#D83pvG2=xw+1>q|dTmSy%d;}c~EXqw*d82?^ zmeXNc>Dt@hi4G2!N}lik`9O(@-GspXFY&MgR}$GK6BiPD_Q`>9a75CDJ^>b(mpZkU z=atctb~aBvs*6Yai0mUK9trFh|7#^+4r65lMCJ`sf4Tn8Te(08t@G`7h#6y+!S>30^SOR)zk>aN(9-b^G zi$_Zd5Z0xb%_B?3ah7Rj3Zx&g=TMtgNTN_#8^BkO~I^V#oT!O}$Z7?IoU8?LI( zg_F~^Kw$@kh-G2FCoMz9H%wL6o z@CcTal>X&Go@86>YgfXM8ZjJkJu#oSv|W1KS2n7IPoXy;^TOSv;yDBC3Wd%Zg#)(Z zCE@tHJs%l2CM2fapQU06%eh+26nV=U+vs{*xMx;ON-}}g$y`G9Ac%wLw}_{Sy)Z2c z4}yWSlZ}~ocFUWg=@Po0|125R9nh1y*xl#=PAY-SGk>eES32yqT`8XTc1qWIwHdSD z79+d2D*^TA{3Lx6*}aT58_X4gi7;e!#=_A0q@YY!#pGG}$4AWF@K6mXIV>E5fHHiJ5C^*);+kVG@VwgEvI<|OPb+t)J$>&z* zWijV?m6X)JMoidEmnhKO`Nc_2NH7bH`(>nom66dH4Sn&;u~cYAI-mTg0R51$Uhi$p zYbAHO-=4!F_1q?4eCMmUL?rV2`I6_9pj+wOt>$fp8IE zm_f$vpQY%-Ni7OF>|q`uRL4Nz5D$#KZ_H~eo6u#tmlDB17y`3%RnuG5JFue& zKV3?%vRqwVJggM^`ZAjb)F_3QMx$G#u0J_13yJS3UZ_?3(Wp+;|cR7;ztr z@Z>~zp8a0xX{-BEawSnuLQ34^a4gzuJIa5(*S7+OKK6_f`mk12p;lXXAl)Kk5Ki$z z<@;3!#lG9`lR^uCeb&qKm4T^fiUsRZp#2#*_v?>VT)~;^V{~Cn5#Dh-jGE?g(@|1v zO2u?f`2EQ(rKMpQ(7^&*C-?Gc;olBQmY;f&?FKQpP2*rM5R2(K}ZwM~l;f{lXV1k!W)kB)jnJ!UELM)7fKq*wZ8rZ*;u?KHSS!ch`J8<-}Bwu|r3f%+=zi$zw3t}2c^j}luLY8;QktIv^1m}EG#_SniQ5~ zCY<@_Z7%$0z9;RlhYsZeFDpc$JL(90{Wi>XN#f}~UC^yww8j5=e|DgC_NhoPm3r|a zbdBI{n|3!z&g`2$_TMkCj@H`iiHZ`M)RBIaA5%PiyqAaPkB{-*Tel$?KMa3$WhE-v zcNMFfjx(GG6%<4?$Pu0-DB$(Wx~3s1Pqf!w2hN)~j#&Z%eC6X`>qeijj<-xnW_-75DoooFPcb0aCLIQ7NW^iO_>54yr1c1(g!RGP% z%|qW5I;<-&M8gh|LGAyUTwp1A`5U3m19FkzG~63kC2}HOUA{n4xEo#QtgQxUB{kNU zGJ#&FXB!=kvu#}iU5eiy7o>~X8d2}{rRZs-OdklKcX=(1;9k$KzW28MxFPCH- zp&rgk&O9tj=V)Nh7%mk~EWCXaNsV@do%!p}*1x}DYVW}6KAvSol;69omAWaAv}H=m zVV0CdYewDF0(6Rw+T7|o4IvgOQCC+W%<*{(g*axUv7;!vDXQ|60M`a0mM$1fF72;^ld?Ti4Ds{BygZz47&b zNfYzKddrn9_4;K{DjK9A%C@7XaQ^q@W2v9zvp%lqT9Ub(r>LoaNh4_0w<7*MprOGP z_&;5Y|M$N9=P-9x_2;hd!u^)>&9)X<{NJ%#!xuhB|MSaXioQfk#mb_J;#k>qWuq|l zs>(r4{qIy@dnQIX{NqyUjX-N@;&<~`_W_zZSgzqD zg%J%z1PJ;?5L4-Ji)ax?ZIt%P4?AY@a@w#DUICkk-YF@OV@3DvUtNd z?uP;w58{>v_{M4Q!nWnp->)wi3z+ymaErO4KzRxvJ&x$`rv5`KLvrbl3 zFWrEzNUC}*R>A3Y$-UcRrYs`*TKTs2;w5iHte*aCWz~zhxuBL;mBhyHQ^Q`DF)c~; z0q3<_LBh-%hS8;?GcD>Urv}rVqHgxcSKt41_Mrz0Y}sf-M#jx_&qEBpbwqPkTYn!v*1a?bhSWJWAoYA@E5#-~?O56U{Djm>xGldvUxo zqtM2XGhT^Jf6SF(&O=XBLbU?oNFosZKQ9^tTAyjzrtEu&d#Jf6IgAe{)_M zL=JEiY`Qg#mGUP$0>!^4eps%p-g+RC^eGY!23*2&fj2M!`&;LTx*wUdQYb*VFrV22 zako%mTY)s=Kw4GFL2G^t2PzXLRXp?yVMPPVt0<>%OstHR1fo}fZTCdp4NH<{%Fih+ zi*9=s5K8)lmyZ2o|MFcRg|g)5@Ox4ow65&cyqEB3c=DGTE%8QH4TeL z_a>f8$dQx?hT5%r*>0@#{QAT+JV&tiu@U_(s~p?pV94iD>_=FXYX|Kwro3o&vqayr zX9^2vGCV>g;@?@cCmKB;eZ(oUiKrLKebb-*PLRNxN|!;5Y=dUxJFaEJi`E9t#XMdy3_dA5yZmy9AQ$t z;&1R7%L|3s3(#49SBT?w+XtCNDJ1h%8xjgUr=@}nbAdow5Qu4_sXDIzVOUv|TKk+MGq@3~lJyuvjF9H=3PcNce?HsqR z-TJGn1CLL!RaJ(GPDxo=63^Psk~3&Hp?7d>Gc}U-tMt!y1PtaXM#kgz7zH4V2@|h0 z@&!ovVvDp84pVBbJh3j3U$v5Kp(_m@0x#Rca_DAh2VCVm?A}V~(|Jxllr3eGHt8*iG86GyYx~mqSmyj!@Q))RUzi`p%|5-X{iluV}BGkC;UcR&{cj$FTe z_VV2x-`SrRR;1|13*UE&FyCKdF~d=N&~Q5TfKl9Va%!V3#g9kHWtf%vuF?DoKMeQDAteyudN*pT)I#Mc~ z8=!86B@5uy9PFH(Ba)_^aUj(ex%6>|#S0V-`aY&h2t@XFF-VVnz-lvi=*?6yJ~{!q z6idDA+R9DnmAkA9Ev#&Mphh^gHel}aIWK@uL3Tk=1^kY+EOk^Zej+|76IUWL7$NT{ zExkJu(XVqi({XyH{ zYg?Bh1A&U#Ft~xkp#?Bga=C4_XUesL=<4}2^XwipLE)Zm^9|7#YU(an0^^+G4dIU zjY(F|PJgtbQr~>e?t!#}-2_&tl4F zySe>GYFRVpZG9dd%CQ530%6vEw1fwU5rgv*ID$# zi+NgT1FcUsPUY{JHq>sH#n;x|B)Otd!d!RsQp{aqQKr9deXt?QB(KboCooR=f$nbi z_(J(d5C>2cTQnv>lIy2Z=@Jb==QD}9!wR0oAMI3Q9>r4@D zmL$Bfy3Prf#*kR{s84L?-E~-(bTLTojo+7ht8&;iQ>Q72@pA8(w?;v|`Gq=F&KpbQ zLUk@@^XH?e&}5f{8#uwzpuBoZLQSHgCUec*K+s{x4$? z5O;oi2n4mMzuv?f=})MbJ4Yv?(sJ}0&;6-d`IVbQZAC19H>C%?$o{0%x#y3sq^g_n zcM3o<<7FW4_B=InJSwWa?SYJ}taRTa1{al1-9$3PB9Itg%3J+ z2HASOOS}BKK)JOp;8pKkhY8B|$#?UJqrxj^;uOcj7`xaZW`dXPFhf@#9RXt|)N7A{ z;$vE-2~JC4AItfV%Xgzb)rjonz?{^M`Eb4lVdNh%c^d~?-4L#;LhI)`>#WP4m(?vuV~JF)Ze_%b zjXzI6BilT4B#!B3Eh@D7=^V75G}V9EH#kOPI%-U$x@U2^Bm6d|5SOkpPjZDS){S?P z>?JkfPu*srW6mut`_PK*bgW3~x*KdM6Ag|{x=t0LKh2#}yf0;R8yrrJj3%n;LJIKF zdO@h3NUThud)kI^(WvMDQ2XAQK5SDkNDhlo6i4yM`-~Ku@%*LrU^{z=?-j0F+gKYb zCCSHXzl7w*;yhMnCb(OeuRdlB{#mtThvY5Fs|_&HlzM-bGD%#8Y^{d~=#`AI7sSo{$hG-OYzQx;z?403v}kqe|`op@>G4{GWGYkz2Hn6Gn@ z963H!(2|Wh{G$YVb{#F-nzB@j_(m=bI(&fJ2~wDF&ye|b+3QGqEP=G1Uw~=a!=7~) zr`h)>*rWhE7aDkubM1;0MvV$pWei9Um-Y2k)P0e+e*`;ggGJWPd$gmQnwj_Mp&1UX z$s!P~Anj;fe?_1i%QQwHLd*0q$%Bn~>R4=4n_KK?-XM-;La|PhJ$tio=27p( zdb^!T^w4t5@U5@|f~nrLtM{11)k;1gtIaSlmeni|v!m@q^d07!VX8!Ky3_GWyext8NB=i^60GHg~?UwpslOLfiDuFB`-t?ss(&+sE5{>!B)c)1bsmc;Yd`F5lZFy7}iJ8#5!v zeJxCEAW4Bnivat2NaGnLAB%Y5K$e*a0=2`#&2CX8Z!aIllJSKr0p?5Ww`ddT{BenY zu00qhKMn`oNRkK&i)WdT9Y@REvs&nKh?9qCd4eZ%cts((;bD~Y>HZ%v5TL-p2K)Go zj#3dlg)Q;}Akeg?dW~OzbxL)3=-AC2yttMn_F+irM@)duHB7ga<

1>)sEBxUH< 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 diff --git a/src/tools/automate.py b/main.py similarity index 59% rename from src/tools/automate.py rename to main.py index b61aa2b..1015c61 100644 --- a/src/tools/automate.py +++ b/main.py @@ -1,48 +1,51 @@ import json -import time # Import time module for timing +import time import requests -# Load questions from the JSON file -with open('data/questions_example.json', encoding='utf-8') as file: +# 讀取主辦提供的 Question JSON 檔案 +with open('data/questions.json', encoding='utf-8') as file: questions = json.load(file)['questions'] -output_data = {'answers': []} # Initialize output format with "answers" array +# 初始化輸出資料格式 +output_data = {'answers': []} +# 設定 Flask 應用程式的 URL url = 'http://127.0.0.1:5000/api/chat' -total_start_time = time.time() # Start timing for the entire process +# 計算總花費時間 +total_start_time = time.time() for question in questions: - question_start_time = time.time() # Start timing for each question + # 計算每個問題的處理時間 + question_start_time = time.time() - # Send POST request + # 發送 POST 請求到 Model/flask_app.py 的 Retrieve API 端點 response = requests.post(url, json=question) if response.status_code == 200: response_json = response.json() - # Extract qid and retrieve from the API response - qid = question.get('qid') # Assuming each question has a unique "qid" field + # 從回應中提取 qid 和 retrieve 欄位 + qid = question.get('qid') retrieve = response_json.get('retrieve') - # Append formatted result to the answers array + # 將 qid 和 retrieve 加入輸出資料中 output_data['answers'].append({'qid': qid, 'retrieve': retrieve}) print('成功取得 JSON:', response_json) else: print('請求失敗,狀態碼:', response.status_code) - # Calculate and print time for each question + # 計算每個問題的處理時間 question_end_time = time.time() question_duration = question_end_time - question_start_time print(f'QID: {qid} - 花費時間: {question_duration:.2f} 秒') -# Calculate and print total time total_end_time = time.time() total_duration = total_end_time - total_start_time print(f'全部題目處理完成,總共花費時間: {total_duration:.2f} 秒') -# Save the output data to a new JSON file +# 將輸出資料寫入 JSON 文件 with open('data/pred_retrieve.json', 'w', encoding='utf-8') as output_file: json.dump(output_data, output_file, ensure_ascii=False, indent=4) diff --git a/requirements.txt b/requirements.txt index 743e682..c332b34 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +# Python 3.12.0 Flask==2.3.2 Flask_Cors==4.0.0 keyboard==0.13.5 @@ -7,10 +8,11 @@ selenium==4.21.0 weaviate_client==3.22.1 tiktoken==0.7.0 langchain-community==0.2.0 -sentence-transformers==2.7.0 flask_limiter==3.7.0 flask_restx==1.3.0 -python-dateutil +python-dateutil==2.9.0.post0 redis==5.0.8 flask-httpauth==4.8.0 -voyageai +voyageai==0.3.1 +pytesseract==0.3.13 +pdf2image==1.17.0 diff --git a/src/batch/README.md b/src/batch/README.md deleted file mode 100644 index 93b7dae..0000000 --- a/src/batch/README.md +++ /dev/null @@ -1 +0,0 @@ -# Scripts for spidering announcement data diff --git a/src/batch/time.txt b/src/batch/time.txt deleted file mode 100644 index 04d1b01..0000000 --- a/src/batch/time.txt +++ /dev/null @@ -1 +0,0 @@ -2024-01-01 00:00:00 diff --git a/src/data/README.md b/src/data/README.md deleted file mode 100644 index 197793b..0000000 --- a/src/data/README.md +++ /dev/null @@ -1 +0,0 @@ -# Scripts to process data automatically diff --git a/src/data/read_pdf_ocr.py b/src/data/read_pdf_ocr.py deleted file mode 100644 index db6c31c..0000000 --- a/src/data/read_pdf_ocr.py +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: Add OCR processing script -# This script was accidentally lost diff --git a/src/tools/monitor.py b/src/tools/monitor.py deleted file mode 100644 index d89f7ca..0000000 --- a/src/tools/monitor.py +++ /dev/null @@ -1,25 +0,0 @@ -import subprocess -import time - -import requests - - -def check_service(): - url = 'http://xxxx/api/' - try: - response = requests.get(url) - if response.status_code != 200: - restart_service() - except requests.RequestException: - restart_service() - - -def restart_service(): - print('Service is down. Restarting service...') - subprocess.run(['nohup', 'python3', 'src/flask_app.py', '&']) - - -if __name__ == '__main__': - while True: - check_service() - time.sleep(600) diff --git a/src/utils/ai/__init__.py b/src/utils/ai/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/utils/ai/call_ai.py b/src/utils/ai/call_ai.py deleted file mode 100644 index 1551113..0000000 --- a/src/utils/ai/call_ai.py +++ /dev/null @@ -1,53 +0,0 @@ -from datetime import datetime - -from utils.ai.gemini_tem import gemini_template -from utils.ai.gpt_tem import gpt_template - - -def call_aied(wait, quest, use_gpt: bool): - current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - prompt = f"""【今日日期】: {current_time} -You are a helpful and informative bot that answers questions using text from the reference passage included below. \ -Be sure to respond in a complete sentence, being comprehensive, including all relevant background information. \ -However, you are talking to a non-technical audience, so be sure to break down complicated concepts and \ -strike a friendly and conversational tone. \ -If the passage is irrelevant to the answer, you may ignore it. -請用繁體中文回答 -並在回應有關時間/時程的問題時,要考慮【今日日期】 - - -'{quest}' - -PASSAGE: -'{wait[0]} - -{wait[1]} - -{wait[2]} - -{wait[3]} - -{wait[4]} - -{wait[5]} - -{wait[6]} - -{wait[7]} - -{wait[8]} - -{wait[9]}' - -ANSWER: -""" - try: - if use_gpt: - res = gpt_template(prompt) - else: - res = gemini_template(prompt) - except Exception: - res = '太多使用者請求了!請等待幾秒後再重新詢問' - - return res diff --git a/src/utils/ai/gemini_tem.py b/src/utils/ai/gemini_tem.py deleted file mode 100644 index a098852..0000000 --- a/src/utils/ai/gemini_tem.py +++ /dev/null @@ -1,23 +0,0 @@ -import json - -import requests - -import utils.config_log as config_log - -config, logger, CONFIG_PATH = config_log.setup_config_and_logging() -config.read(CONFIG_PATH) - - -def gemini_template(prompt): - api_key = config.get('Gemini', 'api_key') - url = f'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={api_key}' - payload = {'contents': [{'parts': [{'text': prompt}]}]} - headers = {'Content-Type': 'application/json'} - response = (requests.post(url, headers=headers, data=json.dumps(payload))).json() - return response['candidates'][0]['content']['parts'][0]['text'] - - -if __name__ == '__main__': - prompt = """告訴我 CTF 逆向分析的 3 個訣竅,用 json 格式輸出: {"訣竅1": ,"訣竅2": ,"訣竅3": }""" - response = gemini_template(prompt) - print(response) diff --git a/src/utils/ai/gpt_tem.py b/src/utils/ai/gpt_tem.py deleted file mode 100644 index 0486fa8..0000000 --- a/src/utils/ai/gpt_tem.py +++ /dev/null @@ -1,39 +0,0 @@ -import textwrap - -import openai - -import utils.config_log as config_log - -config, logger, CONFIG_PATH = config_log.setup_config_and_logging() -config.read(CONFIG_PATH) - - -def gpt_template(prompt, output_way='json'): - openai.api_key = config.get('OpenAI', 'api_key') - - userprompt = textwrap.dedent( - f""" - {prompt} - """ - ) - - response = openai.ChatCompletion.create( - model='gpt-4o-mini', - messages=[ - {'role': 'system', 'content': '使用繁體中文回答'}, - {'role': 'user', 'content': userprompt}, - ], - ) - - return response.choices[0].message['content'] - - -def main(): - """範例: GPT 模板使用""" - # import utils.gpt_integration as gpt_call - # gpt_call.gpt_template() - print(gpt_template('問題: 太陽系有哪些行星?請用 json 格式回傳,{"回傳內容": "_回答_"}')) - - -if __name__ == '__main__': - main() diff --git a/src/utils/ckip.py b/src/utils/ckip.py deleted file mode 100644 index 23d192e..0000000 --- a/src/utils/ckip.py +++ /dev/null @@ -1,16 +0,0 @@ -from ckip_transformers.nlp import CkipPosTagger, CkipWordSegmenter - -ws_driver = CkipWordSegmenter(model='albert-base') -pos_driver = CkipPosTagger(model='albert-base') - - -def clean(sentence_ws, sentence_pos): - short_sentence = [] - stop_pos = set(['Nep', 'Nh', 'Nb']) - for word_ws, word_pos in zip(sentence_ws, sentence_pos): - is_n_or_v = word_pos.startswith('V') or word_pos.startswith('N') - is_not_stop_pos = word_pos not in stop_pos - is_not_one_charactor = not (len(word_ws) == 1) - if is_n_or_v and is_not_stop_pos and is_not_one_charactor: - short_sentence.append(f'{word_ws}') - return ' '.join(short_sentence) diff --git a/testing/README.md b/testing/README.md new file mode 100644 index 0000000..c63f11c --- /dev/null +++ b/testing/README.md @@ -0,0 +1,8 @@ +# 此資料庫為進行一些測試及檢測的程式碼 +這些程式不影響正式比賽時的運行,也不影響資料處理,僅是做測試尋找最佳 hybrid search 比重 (多少 % text2vec, 多少 % bm25);還有用來為公開測資對答案的腳本。 + +# get_best_alpha.py +用來測試不同 alpha 的準確率,尋找最佳 hybrid search 比重 (多少 % text2vec, 多少 % bm25) + +# checkans.py +用來為公開測資對答案的腳本 diff --git a/src/tools/checkans.py b/testing/checkans.py similarity index 100% rename from src/tools/checkans.py rename to testing/checkans.py diff --git a/src/tools/get_best_alpha.py b/testing/get_best_alpha.py similarity index 97% rename from src/tools/get_best_alpha.py rename to testing/get_best_alpha.py index b2dec99..b552275 100644 --- a/src/tools/get_best_alpha.py +++ b/testing/get_best_alpha.py @@ -4,7 +4,7 @@ import requests # Load questions from the JSON file -with open('data/questions_example.json', encoding='utf-8') as file: +with open('data/questions.json', encoding='utf-8') as file: questions = json.load(file)['questions'] # Load ground truth data