From ad6137d355fa747f27f0e3207e4bb62765243f83 Mon Sep 17 00:00:00 2001 From: Will Miao <13051207myq@gmail.com> Date: Sat, 25 Jan 2025 19:22:02 +0800 Subject: [PATCH] Initial commit --- .gitignore | 1 + __init__.py | 13 ++ manifest.json | 7 + nodes.py | 326 +++++++++++++++++++++++++++++++++ static/css/style.css | 315 +++++++++++++++++++++++++++++++ static/images/no-preview.png | Bin 0 -> 84440 bytes static/images/theme-toggle.svg | 11 ++ static/js/script.js | 229 +++++++++++++++++++++++ templates/loras.html | 80 ++++++++ utils/__init__.py | 1 + utils/file_utils.py | 48 +++++ utils/lora_metadata.py | 16 ++ utils/model_utils.py | 22 +++ 13 files changed, 1069 insertions(+) create mode 100644 .gitignore create mode 100644 __init__.py create mode 100644 manifest.json create mode 100644 nodes.py create mode 100644 static/css/style.css create mode 100644 static/images/no-preview.png create mode 100644 static/images/theme-toggle.svg create mode 100644 static/js/script.js create mode 100644 templates/loras.html create mode 100644 utils/__init__.py create mode 100644 utils/file_utils.py create mode 100644 utils/lora_metadata.py create mode 100644 utils/model_utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ba0430d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__/ \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 00000000..265926e6 --- /dev/null +++ b/__init__.py @@ -0,0 +1,13 @@ +from .nodes import LorasEndpoint + +NODE_CLASS_MAPPINGS = { + "LorasEndpoint": LorasEndpoint +} + +WEB_DIRECTORY = "./js" + +# Add custom websocket event type +EXTENSION_WEB_SOCKET_MESSAGE_TYPES = ["lora-scan-progress"] + +__all__ = ['NODE_CLASS_MAPPINGS'] + diff --git a/manifest.json b/manifest.json new file mode 100644 index 00000000..3d75d681 --- /dev/null +++ b/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Loras Endpoint", + "version": "1.0.0", + "author": "Your Name", + "project": "https://github.com/your/repository", + "description": "Adds /loras endpoint to ComfyUI" +} \ No newline at end of file diff --git a/nodes.py b/nodes.py new file mode 100644 index 00000000..779ad743 --- /dev/null +++ b/nodes.py @@ -0,0 +1,326 @@ +# nodes.py 更新后的核心代码 +import os +import json +import time +from pathlib import Path +from aiohttp import web +from server import PromptServer +import jinja2 +from flask import jsonify, request +from safetensors import safe_open +from .utils.file_utils import get_file_info, save_metadata, load_metadata, update_civitai_metadata +from .utils.lora_metadata import extract_lora_metadata +from typing import Dict, Optional + +class LorasEndpoint: + def __init__(self): + self.template_env = jinja2.Environment( + loader=jinja2.FileSystemLoader( + os.path.join(os.path.dirname(__file__), 'templates') + ), + autoescape=True + ) + # 配置Loras根目录(根据实际安装位置调整) + self.loras_root = os.path.join(Path(__file__).parents[2], "models", "loras") + + @classmethod + def add_routes(cls): + instance = cls() + app = PromptServer.instance.app + static_path = os.path.join(os.path.dirname(__file__), 'static') + app.add_routes([ + web.get('/loras', instance.handle_loras_request), + web.static('/loras_static/previews', instance.loras_root), + web.static('/loras_static', static_path), + web.post('/api/delete_model', instance.delete_model) + ]) + + def send_progress(self, current, total, status="Scanning"): + """Send progress through websocket""" + if self.server and hasattr(self.server, 'send_sync'): + self.server.send_sync("lora-scan-progress", { + "value": current, + "max": total, + "status": status + }) + + async def scan_loras(self): + """扫描Loras目录并返回结构化数据""" + loras = [] + folders = set() + + # 遍历Loras目录(包含子目录) + for root, _, files in os.walk(self.loras_root): + rel_path = os.path.relpath(root, self.loras_root) + if rel_path == ".": + current_folder = "root" + else: + current_folder = rel_path.replace(os.sep, "/") + folders.add(current_folder) + + for file in files: + safetensors_files = [f for f in files if f.endswith('.safetensors')] + total_files = len(safetensors_files) + + # 识别模型文件 + if file.endswith('.safetensors'): + base_name = os.path.splitext(file)[0] + model_path = os.path.join(root, file) + + # Get basic file info and metadata + file_info = await get_file_info(model_path) + base_model_info = await extract_lora_metadata(model_path) + file_info.update(base_model_info) + + # Load existing metadata or create new one + metadata = await load_metadata(model_path) + if not metadata: + # First time scanning this file + await save_metadata(model_path, file_info) + metadata = file_info + else: + # Update basic file info in existing metadata + metadata.update(file_info) + await save_metadata(model_path, metadata) + + # Add civitai data to return value if exists + if 'civitai' in metadata: + metadata.update(metadata['civitai']) + + # 查找预览图 + preview_path = os.path.join(root, f"{base_name}.preview.png") + preview_url = await self.get_preview_url(preview_path, root) if os.path.exists(preview_path) else None + + loras.append({ + "name": base_name, + "folder": current_folder, + "path": model_path, + "preview_url": preview_url, + "metadata": metadata, + "size": os.path.getsize(model_path), + "modified": os.path.getmtime(model_path) + }) + + self.send_progress(total_files, total_files, "Scan completed") + return { + "loras": sorted(loras, key=lambda x: x["name"].lower()), + "folders": sorted(folders) + } + + async def parse_model_metadata(self, file_path): + """从safetensors文件中提取元数据""" + try: + with safe_open(file_path, framework="pt", device="cpu") as f: + metadata = f.metadata() + if metadata: + return metadata + except Exception as e: + print(f"Error reading metadata from {file_path}: {str(e)}") + return {} + + async def parse_metadata(self, meta_file): + """解析元数据文件""" + try: + if os.path.exists(meta_file): + with open(meta_file, 'r', encoding='utf-8') as f: + meta = json.load(f) + return { + "id": meta.get("id"), + "modelId": meta.get("modelId"), + "model": meta.get("model", {}).get("name"), + "base_model": meta.get("baseModel"), + "trained_words": meta.get("trainedWords", []), + "creator": meta.get("creator", {}).get("username"), + "downloads": meta.get("stats", {}).get("downloadCount", 0), + "images": [img["url"] for img in meta.get("images", [])[:3]], + "description": self.clean_description( + meta.get("model", {}).get("description", "") + ) + } + except Exception as e: + print(f"Error parsing metadata {meta_file}: {str(e)}") + return {} + + def clean_description(self, desc): + """清理HTML格式的描述""" + return desc.replace("
", "").replace("
", "\n").strip() + + async def get_preview_url(self, preview_path, root_dir): + """生成预览图URL""" + if os.path.exists(preview_path): + rel_path = os.path.relpath(preview_path, self.loras_root) + return f"/loras_static/previews/{rel_path.replace(os.sep, '/')}" + return "/loras_static/images/no-preview.png" + + async def handle_loras_request(self, request): + """处理Loras请求并渲染模板""" + try: + scan_start = time.time() + data = await self.scan_loras() + print(f"Scanned {len(data['loras'])} loras in {time.time()-scan_start:.2f}s") + + # Format the data for the template + formatted_loras = [self.format_lora(l) for l in data["loras"]] + + # Debug logging + if formatted_loras: + print(f"Sample lora data: {formatted_loras[0]}") + else: + print("Warning: No loras found") + + context = { + "folders": data.get("folders", []), + "loras": formatted_loras, + # Only set single lora if we're viewing details + "lora": formatted_loras[0] if formatted_loras else { + "name": "", + "folder": "", + "file_name": "", + "preview_url": "", + "modified": "", + "size": "0MB", + "meta": { + "id": "", + "model": "", + "base_model": "", + "trained_words": [], + "creator": "", + "downloads": 0, + "images": [], + "description": "" + } + } + } + + template = self.template_env.get_template('loras.html') + rendered = template.render(**context) + return web.Response( + text=rendered, + content_type='text/html' + ) + except Exception as e: + print(f"Error handling loras request: {str(e)}") + import traceback + print(traceback.format_exc()) # Print full stack trace + return web.Response( + text="Error loading loras page", + content_type='text/html', + status=500 + ) + + def format_lora(self, lora): + """格式化前端需要的数据结构""" + try: + metadata = lora.get("metadata", {}) + + return { + "name": lora["name"], + "folder": lora["folder"], + "preview_url": lora["preview_url"], + "modified": time.strftime("%Y-%m-%d %H:%M", + time.localtime(lora["modified"])), + "size": f"{lora['size']/1024/1024:.1f}MB", + "meta": { + "id": metadata.get("id", ""), + "modelId": metadata.get("modelId", ""), + "model": metadata.get("model", ""), + "base_model": metadata.get("base_model", ""), + "trained_words": metadata.get("trained_words", []), + "creator": metadata.get("creator", ""), + "downloads": metadata.get("downloads", 0), + "images": metadata.get("images", []), + "description": metadata.get("description", "") + } + } + except Exception as e: + print(f"Error formatting lora: {str(e)}") + print(f"Lora data: {lora}") + return { + "name": lora.get("name", "Unknown"), + "folder": lora.get("folder", ""), + "preview_url": lora.get("preview_url", ""), + "modified": "", + "size": "0MB", + "meta": { + "id": "", + "modelId": "", + "model": "", + "base_model": "", + "trained_words": [], + "creator": "", + "downloads": 0, + "images": [], + "description": "" + } + } + + async def delete_model(self, request): + try: + data = await request.json() + model_name = data.get('model_name') + folder = data.get('folder') # 从请求中获取folder信息 + if not model_name: + return web.Response(text='Model name is required', status=400) + + # 构建完整的目录路径 + target_dir = self.loras_root + if folder and folder != "root": + target_dir = os.path.join(self.loras_root, folder) + + # List of file patterns to delete + required_file = f"{model_name}.safetensors" # 主文件必须存在 + optional_files = [ # 这些文件可能不存在 + f"{model_name}.civitai.info", + f"{model_name}.preview.png" + ] + + deleted_files = [] + + # Try to delete the main safetensors file + main_file_path = os.path.join(target_dir, required_file) + if os.path.exists(main_file_path): + try: + os.remove(main_file_path) + deleted_files.append(required_file) + except Exception as e: + print(f"Error deleting {main_file_path}: {str(e)}") + return web.Response(text=f"Failed to delete main model file: {str(e)}", status=500) + + # Only try to delete optional files if main file was deleted + for pattern in optional_files: + file_path = os.path.join(target_dir, pattern) + if os.path.exists(file_path): + try: + os.remove(file_path) + deleted_files.append(pattern) + except Exception as e: + print(f"Error deleting optional file {file_path}: {str(e)}") + else: + return web.Response(text=f"Model file {required_file} not found in {folder}", status=404) + + return web.json_response({ + 'success': True, + 'deleted_files': deleted_files + }) + + except Exception as e: + return web.Response(text=str(e), status=500) + + async def update_civitai_info(self, file_path: str, civitai_data: Dict, preview_url: Optional[str] = None): + """Update Civitai metadata and download preview image""" + # Update metadata file + await update_civitai_metadata(file_path, civitai_data) + + # Download and save preview image if URL is provided + if preview_url: + preview_path = f"{os.path.splitext(file_path)[0]}.preview.png" + try: + # Add your image download logic here + # Example: + # await download_image(preview_url, preview_path) + pass + except Exception as e: + print(f"Error downloading preview image: {str(e)}") + +# 注册路由 +LorasEndpoint.add_routes() \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 00000000..9b41e5ab --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,315 @@ +:root { + --bg-color: #ffffff; + --text-color: #333333; + --card-bg: #ffffff; + --border-color: #e0e0e0; +} + +[data-theme="dark"] { + --bg-color: #1a1a1a; + --text-color: #e0e0e0; + --card-bg: #2d2d2d; + --border-color: #404040; +} + +body { + margin: 0; + font-family: 'Segoe UI', sans-serif; + background: var(--background-color); +} + +.container { + max-width: 1400px; + margin: 20px auto; + padding: 0 15px; +} + +/* 文件夹标签样式 */ +.folder-tags { + display: flex; + gap: 8px; + overflow-x: auto; + padding: 10px 0; +} + +.tag { + padding: 6px 12px; + border-radius: 20px; + background: #e0e0e0; + cursor: pointer; + white-space: nowrap; + transition: all 0.3s; +} + +.tag.active { + background: var(--primary-color); + color: white; +} + +/* 卡片网格布局 */ +.card-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + gap: 12px; + margin-top: 20px; +} + +.lora-card { + background: var(--card-bg); + border-radius: 12px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + overflow: hidden; + transition: transform 0.2s; + aspect-ratio: 896/1152; + max-width: 240px; + margin: 0 auto; +} + +.lora-card:hover { + transform: translateY(-5px); +} + +/* Card Preview and Footer Overlay */ +.card-preview { + position: relative; + width: 100%; + height: 100%; +} + +.card-preview img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.card-footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.85)); + color: white; + padding: 15px; + display: flex; + justify-content: space-between; + align-items: flex-end; + min-height: 80px; +} + +.model-name { + font-weight: bold; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); +} + +.model-meta { + font-size: 0.9em; + opacity: 0.9; +} + +.card-header { + position: absolute; + top: 0; + left: 0; + right: 0; + background: linear-gradient(rgba(0, 0, 0, 0.85), transparent); + color: white; + padding: 15px; + display: flex; + justify-content: space-between; + align-items: center; + z-index: 1; +} + +.card-actions i { + margin-left: 10px; + cursor: pointer; + color: white; + transition: opacity 0.2s; +} + +.card-actions i:hover { + opacity: 0.8; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .card-grid { + grid-template-columns: 1fr; + } + + .controls { + flex-direction: column; + gap: 15px; + } +} + +/* 新增元数据相关样式 */ +.model-info { + flex: 1; +} + +.model-meta { + font-size: 0.8em; + color: #666; + margin-top: 4px; +} + +.base-model { + display: inline-block; + background: #f0f0f0; + padding: 2px 6px; + border-radius: 4px; + margin-right: 6px; +} + +.file-size, +.modified { + display: block; + margin-top: 2px; +} + +.tooltip { + position: relative; + cursor: help; +} + +.tooltip::after { + content: attr(data-tooltip); + position: absolute; + bottom: 120%; + left: 50%; + transform: translateX(-50%); + background: rgba(0, 0, 0, 0.8); + color: white; + padding: 4px 8px; + border-radius: 4px; + font-size: 0.8em; + white-space: nowrap; + opacity: 0; + transition: opacity 0.2s; + pointer-events: none; +} + +.tooltip:hover::after { + opacity: 1; +} + +/* 模态窗口样式 */ +.modal { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.8); + z-index: 1000; + overflow-y: auto; /* 允许模态窗口内容滚动 */ +} + +/* 当模态窗口打开时,禁止body滚动 */ +body.modal-open { + overflow: hidden; +} + +.modal-content { + position: relative; + max-width: 800px; + margin: 2rem auto; + background: var(--card-bg); + border-radius: 12px; + padding: 20px; +} + +.carousel { + display: grid; + grid-auto-flow: column; + gap: 1rem; + overflow-x: auto; + scroll-snap-type: x mandatory; +} + +.carousel img { + scroll-snap-align: start; + max-height: 60vh; + object-fit: contain; +} + +/* 主题切换按钮 */ +.theme-toggle { + position: fixed; + top: 20px; + right: 20px; + cursor: pointer; + padding: 8px; + border-radius: 50%; + background: var(--card-bg); +} + +.base-model-label { + max-width: 120px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: inline-block; + color: white; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); + background: rgba(255, 255, 255, 0.2); + padding: 2px 8px; + border-radius: 4px; + backdrop-filter: blur(2px); +} + +.loading-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.loading-content { + background: #fff; + padding: 2rem; + border-radius: 8px; + text-align: center; +} + +.loading-spinner { + border: 4px solid #f3f3f3; + border-top: 4px solid #3498db; + border-radius: 50%; + width: 40px; + height: 40px; + animation: spin 1s linear infinite; + margin: 0 auto 1rem; +} + +.loading-status { + margin-bottom: 1rem; + color: #333; +} + +.progress-container { + width: 300px; + background-color: #f0f0f0; + border-radius: 4px; + overflow: hidden; +} + +.progress-bar { + width: 0%; + height: 20px; + background-color: #4CAF50; + transition: width 0.3s ease; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/static/images/no-preview.png b/static/images/no-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..e2beb2692067db56ac5f7bd5bfc3d895d9063371 GIT binary patch literal 84440 zcmX_GWmp?sw@q+&*8oL}yK8WFifeIqx8g2Eid!k}?(QxH3dP-_h2j@@zvs@MBr|9B zUVCkwGl@`AkVHlxKmY&$$kI|^6#xL@^(!O*?(JjERtg^g03x`EYq>ZWIT_iSxtKXQ z15BOFjBITzt<6AoX0A>~Hm@Hp?)FaBARBvgdytETkqgM#$kQ35pa@b@5!a9w*F;b- zGdFUvbTb1vIN94exbTA5Oc7LF%p9C~L9ER5AXOt<2OBddUXZx!>j%h)9wa6q334_u zvN7WYv9P`_Ff%iKUCPeR&BD&k!O8M^#?tHc8V3uj2Nx$dJxJc()XWBCVdQMV3*uqr z;bJy2;^OA`-+5lp|3hYQu&{Tre>K2{ftB%9GuX_|-qP99&K%_I;$&uL?(%v+Gb0BV zJxE+Z75s{mg^lg?hrE%qHOSb;^%Ww!yMuWa00;m`gGJOlGEbf?+dhoAlE8KDr+I@{ zDVs)1M@vO3XaFBXFm#0-td+6EOT52(llLy-m^23Tkleitk;C~dR^HLuv6F75XQTU;Wnl5`Eq zMKJe&gp;GJjAdzdT&%`pC%nO;$SVNSyygS(6@GCLhpE&X9$ct0OF-}kAL4L(1^Cpr zkm4sAfsMDcdzUyUqV{;9urZGN?o#MQeuTFee0@H4D0~7CO)6mHU6{VjIi^G?k_PZT z*;>EQ7Tz>P1ydg8{# GBM1Jtqb?Rx;(Ni${nb>^O*Z)qU7L(A7E$@AAM)w7vX Nu$=5J z4xVYT+74e4$w^`*8u3ekJ$y@Nfse0sisM}Z+w5mu5Itqex9>p~un#mAYoVU4AB80b zE%OV^2hp2+{wQlGu`MEHp|_bzR^OCx5Dj=5R7V$a?@doPdP;grrtlj}XP5FDvQ46A zZAz{g3@u^)^NHsO7z VLZo-zPfO zAIx9rT=^~FA4e1v2f=9-D`$n2MT;3v1BJzeQdgVXcf>;AUol{!d hwO${zK|*Wkb5 z V-%0g4QK2(&H-g84>#QK1zK^;xX3a0F?R?iM9N zc rN94%BYt@ILhm3+_ z3v# Zg+Nf41ZlLKWOTERQT8ab$vN`x}9JY0Z=M`{ZJ0g${{?%;B1M4 z6WtZSR*x4CAB*SHaSk@!w**IKluTTPC!au==|- DGO^V7>*C{gKONkid<>-8z# UOGL)B lJYlk}9YUV<;5C?CE*Oo}SVxO{Lr1#U}8kA!G6o)tJ0^Je%c?%kx;6+Fp2 zk>kvhrQ;x6iIc|qekj{rc##v;@CKIAt}C5p9smB8P=gR_1Tm^Cj4xmjN5CNV;zAC= zg*BbDpj1j#!xa&~K1>9b-|6HX(Wce5gp0?6j6?%s$!OU;Th92)m(KIc_ic8|&)&{D zls-X4vJ{ pVPEN{kunG@@>Pxih0Q3SN|02zi5l; 3HVy@d zjCx_*%AHMqM$Y=32EinnWgHw$rNtJnCZByW;2V-?PLz*;t&B{Xf5Zs1v?5cX46?eW z>)BF7Q!iGe8E_L0<8oP_`-pv3TWNWqHT=9AUDTY51lo3Sfb*K+LRGG}fjU2|MkBJU zHc&2dB-W&_X~}@N)C^cVG9axHLo*{cX{MJ^#WN04VeTsvRj>cM6kA@|i2;g%`WBAF zW=N1&UYf5lAktAvrmz6w-VcO05sjmXJSSKW>P<8$q$OLC_~1U=20ME*VXQECxS7uu zz%QbJ6_$j93t!(cmS27nL&qqD+Hf|fK^L}Tja8Gyt^j4WS4$JkA_wk|os5D`2vXxP zV=2tHyVPKQu+SPTirCiZNX&(L-NmFLhrs__O=<<9TtnX2*s!Pp76HqBh)~QcY5$2W z>PVKLJZ?BcZ?9xA3X=$hU1k*TX?`hWLK`~)nDqQ&cI0n`2ci*JH*c PcVtW @ZO8_<<(}`&&WTN>u>kUafDMK~v=TI)oYry =pD{F;7hXU=(JHXHbg*QU)ENGg4u40Y&bJx1?{8FwtyXJjuRvk=09t4{0YALgb z$?uM~8Eu%m!OKJ-brGZ-qewMH0#sUHen5C_UOxS3{s)f|ZS~nJ+VDLvOaO*hux;3C zDS(O!iivTfoV}b*CgxeR5CbdtpeDx6=hk$VYKz(rEiFP`Id*6}W&)Xw)m8mxL&Zm( zsj{q&wWp_&1{@{oKM!1#AcySgKV&rISpmfxY}0$@IG(Hu7-RCnAETR`HL$Ltxyitr z9-r*pv@`PIf4KJQxC @!R!++| $_)NkdOGyu$cT%~$NQ=; zrvWc B+3!xL-R0sc|IL>D?5?}$tWyDx ze-@k>53S^BUm&>PzpR(B*>wabJqxVMrGWoDY|uzyw^XX6I+i%XVNM@WW)rd=3h^ji zwV>(23Wx71o<5&t@*Vv6v9{9L*wCQ* 80GK^(yMRN$%O#Hv#2Gr0TY4Hsy1urYes*%EX#RjodOEMpkt2^?N-l0h zwS8Ijd{xzcb1zHBrn6vp1HrvP?yjPv$o$b0o5FzwLm3*|tfi%f2lMV((f=|jr^EB5 z#{?RZnXx94E>~T^e7K=Zv+Jh8;AJ+|V7-$(jzpmRvvW5u**cTlh5dGL#_WLOQA_?U z4y-{)c6V+u^g3HM|8&=Lo&Wycc|cA8LCG<|g=!j~j4i+!tXs4I=7SLYO}(PpPsg(6 zaewIl?>Cd+zk{SZU8|4A$J%OY<*rR|Z0J%(r#>&K`uA63)s@+=7QJNFiPno;!ARyU4BpU30W2q6x{F%zSMu+W=YINH0}Y4Shj z>Uu2FlrHtYJ^NMaWD{MoYmG8kW~dV-QY&55`eJHoSaL78@qipj375Mo81R>?y4)Z6 zC&@>A|5m9pI5KvN@@?hMN}`rjZk6Yq4 kPGdk 4hiC#c znL5V!TXJG=XB5@{V!Ib>GJz24sW9>AbW4dj5Ki4z95E=c6afr|B1c2l`l@ZH9)cwQ zc@7_njvdcP%xJmFD+yH%I76Tk%}J%%_%ii!_0#`Oa~+*!*A$Ui2@bq~KrbfU1NE7; z9}I k5R~;P(@Bo*yLYGR|bk4uD-n1Q5AvN~#7fQ17j{qbK&MF3$cB_s2zv#g- z@ZiDl$RPC=9KxWdr0ItXD=dv`t9CfNRKlc+Q~z7im&fh6a~nH7b&d}JwfS=;n9C0t z!M>5X kNOswe^>K`^WD;G}MdeydS)cCPbO !mfeu}GFkZ#BVybS= zboufV&K3qU`R7pD$kEZ$sq=5O!W7}&QH4$EVMdaG@QMZ` 5X6BX9vp}tDRwbu)!vS2Wh@n1nb z6>?@amL*RyI8d4s`(4=i)5dw{Evh&R1Z3_<%}Q)D_!tFeDt|;D9T>{74mXFuIpxp# zn!EV->C!JrUraIrCX?Xy^SltIp>vSiXZ(%eMM^coOYuk#Xve|e&=F?B&oJJJ@+VuO z5yD9E7})2&|A5!w;T^>7MYSIU0g_(CY=QA$N%op5Q&1)nsrvj Xg8q?Q$2UYZ#BBcPd{v-2fR z$Y;BvsfnvHa$e=vrH2WBI!(zB@o;AZ4n%gLaz4Vu9ZiWL*Z7bpYN#mc ML#dj5DCmgCc2Q=|8*W$D|pZi`a` zjZ7dkfORKY8***>M5NtgJtL3g*azjN^D~{p>lUJ*OpKo`Q6Z3sySw&Zwf@2F&=$#2 zRH84FU5-9G*4&d71B@MhweLYBreWR;=MGUDc>GyKvQEC*7R`~Pid0~Q!wmiU0;(-c zwnbvXQT?-9$qQ|{pc@PcQ}|E_Bq&v&vW7Z@OOBPxTazB$_O%r5nA^ACMcob&YJ$^+ zF>qnoeFpYhE&_QA$+EuCd7=iY`Ub6kVxSGEU468FIpuq}E~Te-6@XN;YHMj>A(3Cb zZvkCDa4mj03v(0SiA8K{p6k+@?mArNFZf9sc3O~9KL_ECs>{4Hv(gjL?Qx+VWdkw) zY^{fNrffSI7XH;mo&neo9{)|ffve6@pAMu E?~`pgWVGUJ3!&HuN^)nyx*PlJGNT~un#M-W53jT~Q!&;yV=%II!t z^RF(mZ)yw8>v(;|{A&PT5rL5xa`^rzVfywNS>bsACXjRYGAt kb3Pgv9GDMFMs%e4_nzE0Kv~NSx_LusiYk}x5?|VL z#y+pK+y-v%*ZNbKObl~bc`-@j@B@ZN><# za6o?6Wu@l=>IoAWhWjO=Wo&ua&XU~|_j%vW{^`wy^oT3P5m!#8R3lpZ63Ka!(x_*E zE=soP0->7B*EZLY)k2$zJ wZaBvoHK7YJ__C(VHOjHwyj2qweTHn1xZ(EY#v$Tc Qsb`pyWAZ{%LZW=1i(};1__f?m2H5w&w47B zZsA=bQH`QX5m-V83u=tESqa(8ii`_UL!9#6HTvAQ4n8pJw%=}sA$*olBL1dBK12pV z2$PHKF2yY@_gC>mj=o1mv`2o!-7tEBnQmzP=`t=L!3s!Dc`5f5uU}4I-LOd^z{Q`l zqp{`gxa;a`)yrTN|LrOVF)dQ~aCKfaS4>sL910c`9&=zt!+^*3sr&D>^{lT2ENbE$ zHm>CjOEa%+o~W&RamjeaMSPYxflYPA;IJ#IkkX2DDl|7LTFh-( 6|{Sm*erKP2b3!3)Jx1UHn z ge0-9H z{@a-ln2&Z!Q^ >20lUVA0D z`ppe&Ys(p@3j5xC-f^-O&&yn$M*1YV^1;qtJxhD43#InfRmL9BN}Td*0{%&DR!9 zcrmmVA0|z|RIBdpEq?iyZSmkG22fuqvXm^+q>98XvYn5l;gzx+*ODZX*5e~171qF> z!X#$#ANg~N2rn`~xOi`wYeLH~Ks^aO9F86}-r0Kc%{6b2rUCa3Va_u{nzvEg6Oh|O zI sr~NKbBV%Kd|XcJcq5nWSxH84qDsN-|yED)|I0P zQvG%LLFLERYX{@Vmcwea)V>`hM^m4fh>`zHC6iA4t%6!-`a8M?IJ-9$k9dtqL?7NK zefqq+hw&8c0mLJb-tOy7!NFy)x)3W!TM{c#kk34WL_F;KFGkqw3Et^5{=eR>JgIiQ z_763*_UoN`KaH0>DB_&=IJKp=@T9~{zuC(dCLk`vvATFr(ujaU(-5!wxcoFy2 {( za7k(qz7|Z}uD?{5*3-y1&J_7kR$Jq{Mq98mPXCZMY9p9UW9RsTD(;O+$uM(&;s9%9 z-~gx%s#egNb$rsd+s+RQ{7etq&}E$gsHc8XG6wpKkLj+0d0Ml4skfzjP8jIErOYc? zlKQS=$(D~`tfkRl&B%d8Wo&ND{|3XxMb^5&Qxwty0aB1{mLGv4qo`f&kiEaIOxTN} zkX#k_^V^*tp0l!uFW{7N#(@gxaLc?Q;ZpNK2zguXeh)uOJ;g(lp_Is}`d}mitvJ1p z?i+CJ1gO &Pj!7JY>-g_QS4c zixlq|r2YV%SY2X-l%*TkYW~SFtGbX2M*ZK;FDIDl=e0~q^go#%vR DoY>caED>0;B{!S43`QlGT@Sw{`$LHzuAYJRot7kc z#~GC& ypD6 V~5rnjPD^mBZ#lA3ThRB^1svgKhEW}q*3MQw$6kGVSa)K7bpX}34 biJn|)iXs37Uhx5?F!4TTQM$)zC%qZlDkz!goROo(H0o**EoCSlY zuRo7vDk`@4XhDS#&`H=8MV*e$4|}Ry!$ZA^p-@70h~qTbh@k4yy_ yqNo)=1j;( zYhjc|G}FQcZyyf*$FE6YwX|h^@277SbeAH}1hi&I4A>u)o{pHhD%oK{j)WOX0^}Gp z{pk p_+@bY#MJf&8~~={Y4Smw=O%d8J~L6p;*djl3*D|6k4Ktl#y|uR z9ubxQIPh?e7WZVw;z-D7K-h(w+I{*t*!m}@ymBdqH$#s(KBal7Io_7Gt@_WYbuTx5 z5?Zl-%7PoYIq#O9EjIPOQjYH)w@;|yvIx&>-MeV3M}i9^SfG_OIbkS; &+mQkyMwJh17rdo;M@y99 jP@PaFLUOZ ze%LPa%`-9DCZ2K?6Db3~?hZ3UyONC_cj81G7H=YuLBN(=4vrKDE_&awBV>jzqNuPA zoIRh+Y_Ij6qe7AvVy+L^6D_MzCYbZtlM&4JhLlA_ZO!xzkxMM-BsF7;R3VWA0q8(2 z_$dMJq #4LqgQR*#!;kr+s^D9CBxX_v;WTl~)hX(O9O za~E3A^xDOiyupLJc+%9N;tMNZg1m4;##+`Am)C+$vhnT3iFUJJ|LK` }=%pU;!3O>W!d>uwM>Q2^ zphX?q0lu(f21-;(9T6Lwk8Wbol$=~}Atb4D*>)Fiwt*uu`FC@p06~kAI)>R4+z1ns z#p?W#^S1B5&7uC#`CnTEL*YNY+fPY)ply&8B|@%K(STOp1Y>PaXVGbabTQ`KP%({s zweAN1Q~z!r6KQ+m9;m{ODAq;nlE;Rl%ov%r)E@N1I4$+`v8mr)=EWG)$g<3ve5~w@ zV`yIa6&P&`2v^?CEVD0$DmPSCfpk1|(fg=@3}nrg(qLqX^Y)im8KY=r_|SBv!XK|y zvYK4xX#4lff)*JgeOP+>gbr!DB6C6ozPX%qR^@LiD&yUf;;I%K0lOSRD!ePpTw>on zDr)xf2EwG7*KJy`6}ww?{Ro`Cl{+o p3BK_=x}sWPvW9b5WL0d18dX^Ix*r29RsFrFkGja z Js^o5XI^nVq<1I0PDb~qmj~p7b-8uRN9~I|E z4Gs;e!4mFcKDh5RuloYtkN+H%Q?}e);EM*=h9EGKJdbm$nlbD95CELefg}RIRXGCV zL+0(3;%lqYWIcgp_m6doQ56NW5zC0zGt!7nb$H2e >U- `p>qdgO89=iJW9I&8~XYw>zIl;oT1_*BtPz9_wE zW+Z0>@z-qt*rR{G2wONB4%0Ku7U4is85o4R@2D#!H$q5AXcx!uqc+M;nYkqfE3f<2 z3BBU@TW1{)-ODx@Z6Q{CI rN)JF8*1UP$AdO!$vGKZ_H>zt zq@giQchm&J)yJ6O{#~uGjeL*s0@~^B!xy@}l4ULjtT5B;(vi?gBGX?6fOf1KL+i z#W^_#3u@J{h3C~Z)06WI6Ix4!Do)l {=%@OL)u^upp9IQoO50)lA zh*0ICIIZhL{9%VyBwv7T^oHbrd7ARCX>e`8v!#ps?RO4|hP$g3LmMT{Lx6AY9_xv& zV&cfBPnj5Rq2QA5gXxWBvvY)eYAigp-a25q>egDi1F=srMK^x%bo;x6A#J%8nLq&5 z*}H)&`6J4O#JGY~aw&wLssVKP-Q}doUhjVC#W;mSv;_VolN!!v>so2FCNAbA*>mAo z(tcUUBrKYv6+z!8f^;ovCpoUPA$A(P?2OvYDSQ93QL&Q}trv?QG98QvLE2xP_zAEF zL$F1<3qi8g*nb4a4SXM$32)uI9!AVbCvD84g9OH$R}d)mNo5$+`wA&XpJ7cihPiEt zf+Y+<$e`nIWx2lu;SX u3%o zDJPv4o6sxBNXiK3hfww7!;Jno;+l8G)uE)Z)SIvuaJOb9;b}{13(I)Y?EdaiU3Yu2 zNui2`rqU!^b!}KyoETG>y(Fbwk$=(lz}oZaLd5-SjT#d|ZViVKstFaTmmD5h<7%WC z4;NfWh43^9=(p=iZ8pb+j?h19{hcN^SP+yb1NM`4Y?A&vikQ^meM=IaG`;kFAmh8@ ztZjgr_}cG*T?;jwB9?IpWZ?Hz^XrI%bss->_7w iW%3VF zDEps0E5j?(Agd1bnlgdq*d~hXbJ1oN5f8QqcoRK^ l+usk<%Mz KD`dH|a8*|>CtwYL )*`_Wpj$a(Jn^hekpc@`yxbiTrh0V*(oR7UeHVv*z_ib;p9*A57ne{2b#0Wl~ z-0+e5j1P9V!rd!@bGM(p_Y>foZY mvAAx5lAQTL>uN!FUBW|(M*`uy6i^qOGM#z z`OdqTdM7*ROG~%vG~%ymVTp?c 6N}w8DtL&u%o7KB&RS@O21au+5PUlKq_SF zXqfnYnoXSkKKq+p{`*f|T`vdDQTU^G**4fk4IBVCoua855)8JF4=32t7fMw7xJY3X zkzs#;<#QIp^ZszK4Kkorz5AVrcpA8e>!*(8`fT}+I$xowk`fTfT3UUdQvL5zzwH_$ z9I fUu_*f!W)xXNNQfkk@q!xEyZw37xz}-bS-j?_xc%~$g$D&v@`koj fdAmF(aaKOckE*T#0(soi4R#{7f%P>s~&0V29#argcp=p50dq zJtZ2-`tO&=EuK@M{Z@KY&xhyFH(ih0LjU|9XSnoRUB8}?{Gg*QsHLgY>mXBk*zi75 zhETlK=__2&f$zC~p4_85fB6s)esg>K`nsTrQ(}VL?8 Cp51G`@VHkZ |w7aFier7@oI}omcf)^qW z0ZQ?!uqdhTpOJ}*iHd}pzmGrleGiw5E0^wm&nfDClpg92q21ipZ7)yrGF8!DR)+oN z&%TmRphAf8(5%|t)g?rL&6U$C@guO>If_n7d;ni6O_J3A%2AKD&XJEYvVnzFeY-B{ z$aO@sIXoi5(%+xdbn9Ey;A53Tv}&H8v!O7!v9S>w;l>d>LI~X^WU1>`o>!sn>TNyd z3==t#%4kUO#kLCcn(UUTi1TcC(^+h~GOUN}17V+WG>isUg~wYGY{?!W)@Wr3-~ zX$`Md?GwX9_}B<++*tv=Y7%jgZwm(Np#da6kSg~CpoKtue-@6BIG_R8Nd0ujO-x3` z`8{pwqiWin&*TT3g{rQbBm0+?RI?kc{kAzT1dfv;UC9bUf<-UxhE9s%)=79IClN+l z)ljb8;DD#Y>>s{&A-IoLEK?-mJxHO6iQN~!UHopJDOB-DlUGb3W;J{XqTG@&htXBK z+ycYH-P~?6`(rj5#K(-m7dq~qiFzqi+)kLAT$?T ?{dOy-fJ;{%RU9e2$}rMp#7uRa|K^UhG!+FV)~BCPpQ@ zv!;WEQ*G+E-))~Z6aq#UZ=YjE3dGOPH^ha<53G~OVb)Jy*#jyGPvZx&L98 o7h(rmia=BP13U6Tz(0NjC$pvpvnOKcg1C{@15np7qyClxgJm z`T;kpdI)uUGX!8WWNNgJdjt9asLC>Ja8AqJyal+QaVECO$WxjK4BETGweN&x3|I4E zgx?oAEu=W&h?xq(R3js&T3KF8ig#m+_Y_}3>nQ_0cSHym)P6zzDIJBnSF=~rnb+}E z(v_V+?CHp2$VrV5CBO6%M_Am{-#=&h!^CRDyj)9GRY577Qq vr^Sm~Ox-oeCkiG}d1#0_DgOby91R{aXsAd1kZG~W;n|FRYLJdLM1@p(}j zmyP5A?XL=RA*#i!R%mI9Ey>fiue^y5WnlPCv8r)$(#&6LO`)epmLBG%k==eM?ANEA zw3(qCAJZ}eYLod=x^Mx>h_Px6XH_L_z!xm1SXp#7^z+km*q`QgiXS{>qeH3wd}lX7 zs?kA^)IXKV{x%65sx+R{NvOpO6qUmgmsPtEL<0}tFGGQ*+rPDK%z{aZQG`GUWw@Cg z(YXkSV;cVFhvt6AixufwvqxSnHBDVi64EC^zIOvc_oHQeaU{nsdn$lIF8ea`EO_G5 zm5`gtac<{7)X%K-t=5;J%=@cFo?v1q`DY>+7?J-2TR^10G#21L~XOHRlEFtz1;I0iB!KEqNlQ?Ey*{MPs2Q~YR6W-{OW6B z=jxpUJ}a`nk3r0Jtq&hOG^P+$ViZ0Kzim(%XsjTUQ>3aqo6Vt}n_`Z n5F>zytEx`?$pb=p)bRX^k&0_0CV|#cv7K*< zZlIXY>$%o-U8!h2o664K{L$WQzp_@{B5;aU!j1{A)g-+}UC`DU7YGdlSTl;7$JIfg z_FsD3{S$grqq(?c4 }xLwKEZ^@`B4@fH-4~Dlww6@c{ zsv3KZCgc>ssH1^lf s-t39PwxqjVX8YRn_)cFBNuu}-bCYwpO?g26fTwoG|V7 % S&1*EUP{EAEW6M{q?iBtf}D#W$mv)iAWa;zX`qb|{=hSyG<-O)_qgP4et z#(=dpNgb5PJuzDm#V{%gZ5is*mzP_1q_j6&EGc|!D*#7{gM%BfHQmm`fQV3|Ycx$a z(AU)N5c1|ER&tws#z=l|023)p0Rp*{d+6DhTs%?#DNCN5v7R`nZx)$=bU@fU-jfcG zELg0DWinV;Q5ETNyeF6%04>W=wC}`B2>v^V^ V}8Fkw@?{oeb;2BhU^ vMg zPhHhf&JS;rHddgf?&X_!nY7j8I;xfi(&-cTT%WZ_wP8!H5xn3I2~14XI);@{;sL=t z(GIjJ#T^UjEj)jrhSL?sxP=VPRox@vN&briKxpea8S99}#Cfp^=-_+XIQdbK1&gK7 zgk~*lswAwhBZLRz13+crHxcZdMPl(z3 2yt#wp8Xu((v435)?`ewa!BeeVIcG9jK?@zYY z!lf Xt%>R9TQ-r5=_QFB6QlC}*|;SE&*CN^wh4v22; z2?&O%< KkIz*G2#|@8! zReDH~ZYvz~FT_}LAQ&3lk!Y6!p(yyZ7heKu2?ls?n2;DrNp-Dv@7$qcRFs9HcJi_} zt8}UoJkbPzm;&7=Z|Vv5E$;^KA*?~L4h y zs+>65-KEu`O0l6e`4uce@eZd^fk4hD5j&(U#V2aTd6R;S6Gg8x57q!yMJC#3fV7iz z!S~L=#_Z7?PmKy(m_UXiIV1n9gbX%iF6-zaF4BBYtP}1_k}ClUTU)m|up@;pKmP?) z8&wVht9uh?zEK64ciw-G4Hw3!NJH$roZDgpKK+|2Gq(&Q%uS^ldEKQJjV!>wxrzjO z9}CyCQF<1jz>U5AN7Cb-83aAdXB7=yWw-!RqYn8v|L}_KNTPOI2g)DGe`6&g6$mMq z4LQSFG(?3 f>GwSIFAi4G01njqP7PV1TmW7CW#Ppw{@@60L*JTfwJgdIsH4Gp zlH|Yd-~cgUpjy;uAZbRrF7Xl<1j%ksNK( )AfPN(&F zGy;)AD4Yt)Mtpw_X7?cPhPE&q)PO;TN dLI#_pblif(it07X$0hz5z4FnD-Q+%qOOr4UkDNkm;D<4iCDCWwj^ON1|d@pV8* z)bIM`eF4tcqhPZ?v-ckDZcHYqh25qu!M>uQ*!VbtTUyJW8>xa&7!x%H1Qr$cBum=C z6LPiIy3HCJ!%=AExWuj7#tL?1-KUW7npRjF;Zpg#<#OWVg;Yo5u}>WonbSi0-_gq& zBOtX7`ehBGN>D?bT&|SbjSf;N+q@!6Y!?^ N%x)Vms87`}F3WC`gT(d~oD=cwXf~at+^eCR-FEFX z5s8S1OT3_Qkp=uSqV=bt!lTi+dDXO`yG&-V*HY(%`@gB4Zy#=I(F$T(MEjFuc^Q`m zi<7~fwdCKjnP#-m(Ezk7-L=kkj}QC~dCuT++Q%@*=6W5t@t`Vpg~3Qw2rUMX1me5L z1Ut0)a2QpqDpu+n*REW O0RXFLX-4n8_rV))ylaYaD7~pVH5AYrkHq@` z0v{nQ%R-$0z*Vgg<{MH=jcE+CS;cH9eON;t`)?l$pxV|U4&QS`a_Q&-19eNd2yk2U zY)mHN_b*1nEmA4me|78jylz3sONT&TZR>tMg%A^QNOMiW+Z^9{QQr>@u{>ulFa{Wa zw*KjTKP_YpU R6i>#B}6rdU7UI7Gw@C=(H}h=}OsWbBv4g%@s`JAEmi z2E(&-1*o;AxS3Ybi$Gor@qTd%1xDZh60~P&p0gJo15V%p6+iR%^+A-uVyARiLT^6C zV4EgGnUi%@jkkdN-z!*?I;Yx|=#r3zP>@SQ;O~i|YJ3$hmek@D-R@iTJLBSGu@gA`oqK*w(CL)Ey58@p5a6T18WRsIP!uHsElTpi z^m$19Tx1ERHo2tMkw7EUpp&NTCZaKT4BQ5g3a#yUTz=uXTLKGi>_2YBfO-n=_l)$U zj8c(BBR>H_RSh!-H?oLWYp-9uN+iAN`d9Mr9V$$q{oOrglZfJ7U8!Lqz6MH!!W4UZ zdvSvoPt}_woKW()=G1Lj3~X#|*0yrnRmQ*YENwG_;8|`j^h4wj;izXgjyWm}bBO;+ zR&jR?j;#jCSa%$fRv)|}OeX$ogbrm&4=#ceY=f0U1JQD3Ze~ihB55dbx5$RB3`Q5m zJ5uve=epD`ky1^KWYCG R)K zR8>U y^kbQDdwuH<8 zFescId~tV8lso8ILtGZ?4|hb!_Pp 1kk{d$9#y1`H1@ZjB$im@;$6_b&f}a`Z2~GZ1xwxTvQ8rJQhzo}qzRCY^ zKN~8f;jpH6EUZl+kInX2q53WP)!UXrJd!s@xrlhN 1cjXr8oAcn zfBZEe!Uo)=;GvKe0xBX_4D;q> <`}rrieO1C8sS?)Spuo)j+lX=mzacl zuF}Tp(D0=YkLXuTxx1{bUwi3!kX5LVUqcWne<;26vPgo9oQk6^$UazD{5}LsqI%=T z4TbeA$cz0^j`zv{6pr8Q?e2p8>fvSqU38^(G$xl)n@B`=_ogl*bkuv;(O-h6{Hmm) zu=8p@nQU0pZof;n&zCfIEKUCRFWc4I7IsM}AX$y3O+ttzJ-G&0&stq@EL{k8rY)Yk z_aH>sZN;uhEiEw(Sqzg`AW1gdu@bdu{etQYZxY+7ZcFXxTCamqJ92|20Z-zbw6(o{ zW$XI2O(jtk^7{@XVtTWqVJZqor>KVaBlekpVA$<9rlR(RXPzaMKpPuYsDV*wco>tJ z&1-8bm#_gzjXS;(zp@Lg3T88#PL_EE}qOi(T@9j-*KJ}DUh>rnM5f$wja5Q#Z>*>Q5olf06 ztDyFwaNyu&pr=1idt52ghJ$f 6}0ovG04lx;e*EhlE9D+awNcpOD ziuQ;oFLxj9W!uCR9oH=-^f+AaS&tWw849(kR;rhte{MV~8e2 ?yw zFn=c#84w^UqP0<&n@?TYpH6Gh+Da`dqJScC1|YCW4Ao;Hx~FxJd3Ae#SkpW9oLyc( ztXH42WjLHfgRGAR;E+4{ARHu@w=Q!C`2iep3L&9tI86t3)TVD)dfKESq3h_#n@H^p ziJ^%ayOK8nsRAORSGG2vy0HbSLpC4 Ov#C2K(URR*6{9LVlKJ7bN8-jl=nl{RiCE8*IZR p%r{$(^8hMF8W&0fXCtt<|zq6%TATQ{GPy7p>9v#W07 zHb*e^5X>i^enw{G5_~3BqJ;D&Z_aGW(dgsbpS$dv6b(&*Dzlq}Dk=)_yuyvAZ*o!E zx>8ZG65RmMlrj^-Hks7wtu&CgU7PmNR%f&m#rFHLeWbe#?TA>VfXKusIg+smCt?CR zC*+Pj2uGT6fnsQ5Y6+ac2c>kMkjUeQLW`U94bh3UMq4)pLs47Tr-sg`DiMp77oK}& zV_bNu?z8AOX)Xi3@9HAa$_^j+ *bk|=yWI86+9eOlPo zv=Ve$x_gZV7Sd<{?g7oZ!9HI&IYI5vQbv1>Wr^`5a1spQWO^d^=VJ5?>nlv2*4&Mz zk{H<&LgE*ccew7*#Xr5!natbtiP|D(!5q;c;i`bv)|Q69`0A@x<}M^gq97V_H6$de zF*qeV1StEWn-pkP#ny7;>h@$}qK(Aok8bkt1eE{)u~qu)^E;*}$)}-6-&Cn#AVi8$ zQGE9K=X2{hi|0kE@R=Z#AOulWD`26=v*`<8xK-IoAtDeTs-zOKU!?6DDStScn#>W+ zOKA0dQ`Pk5R&Vsz4JN|D`Jk@>WQh?c&>>40z*%;7rv6K@vK-c;yn~k7kVT<$HYF)X z?2H9OLxbg_Bd0cItwt`^@GA!6x49Vfl`p)&Tr;C_wsxQ1yo%=vA=3o~RY(IrbV`GW zHHEqL^i7qS+j+(>kW%$a%KY+Na+?vCRJ{A{dm$xUtZ`%K3Zl9aQCW 8q*J>69x8r`O?*%xx z^ixF7l;yuf1@@$slP3pD7{FO_Sjr52RnW55>S*{tuv|Bk-iH%9s;14<(e~Ur9+Gl{ z_Zif-&@@k?kcFZ3Cea2IE3P8;`n9ba*RH~428Cb5)MPRvZ_MbLF34NVoeb{QTsfbt zLafxH_SKhOCRit9i;{#rWTG2@fDpi0e0KYDAs8lYywPcBC4pEKT$lppgO5Kp#sET4 zhR=c>18`IXR$;Z0V!yJtUVR#cu}~M3B%%sIkM=imaAFl|wd|mEAECL!73l)NJ`ZiH z6Xyi&J-lUj3*WJDQe-T_`uG4Ei7=y!POJ2%#4>2>{(dqyParAUIQkil4}(C8wfRJ2 zR!%PozvB8 SmI z_SQ2`kH?0hO^4E2C|t;?a~+s+Z!Qn+?UbXD=cVadHZT0ELPy2u!NW&8yHg@V> =YtVtG2dvRaa7BHnlIl^z^pfnpL7&$3@a%#aCE7&}QJ&{MRh@2xnU> z&Z1P`we)Gq6Fnn~YarGIZLOyHq{XuXht-wW9;fgwYvKgX7{Z`{qpJz(+EBMZ*IUId zDxlH-lSNI3LL)pnQW8}Q&v2-7b@Xl$#q^!w@eQ%^bgi~lp|8I95|MaM22os0;Dp*% z&SRgn$EWV0NT8d_I;XJA=k-(9uRnF;nxI11tTA3Ep7?64qA30JjbChSUIT+fMFm0- z61Yvh%;seB!F%uTOf3~`NZF+?^}I<05G!g$h3d-ksQl>B!>|3?mnyA=m03xZA+FW9 zS(Om@9W|6c?KMrLcV`4^1xUG;^iGIWe@IRv44U;M0NVRRk5;An%UZFqV`A`Kj@L~q zJAuz)G+eUoIyU-to ipiUAzx&zkd)u2=tXKj;lmS*Y#*B=a?$7`0cfY%}xeX8z zhdsZ11&xA4MC{yFOgf# iTt6+vqq* z%ZsJB^9?UyHm!PvWxNCuz}EGPU%0h79=XuVu;WblBZ!OLQK*3^ktzT3Ti@K>uQtY; zwOAMh6C0Y8 D!Fo_Zrx}<55B+pR%TswWBuL@i;gHIo4YXUlZ zEFfu5I2H*wO9ZoK?P@S11AbOFf*&;jfpN)g5C9`h(2%(%itQAO=%^-$Pi!M5Zb+Wq z&>z2l7XcbJsA;U Khd@CTt=_sJg9M^>*HFGFHsI6>H z#$Wp4%hv8WhUY{4i3rRtlSJ6IhKWeW(@OsGn}0JG+1l7F*i6Qw&8 i18{f(`>>5>-i4n!biu+t zrpA;5LI_V$#{oPwb`}fKU;)sC{3GTV3;B4Gd}>}=?{rd3YBm@`s?IsuGS&F1sJ7x( zTC1F*=8-f9sR(RU*DpNtj4`BeiTs^)JxOe!p)QF%1d7%kXsv7!#2|w*IBpUmuN( zLR7?bXf65DoJJr7V0{14?tl1;zrOu&SIzkD-JNg!_aFR!{*Qls_rc@I)>W}eDkQ35 z)tBF=#;S_7V&|3BQStG;d*ArYUmB0L=kwXv2rB`~U^Zlkn8*+@6Gxf9=|i92)M){J ze;NPE?pk&csZer02q>wtk84sQVl)Z$g1@F=*;t(9>8!9w52oa&wy$3!es%g-!Vy qYz#0?Bi;Mn1k%+t?=F96n9Dtp(_bRY#2)X7GpAFEz&&D zz7p;tq8R$)ex`XYflfi*hwHWqwzb`uY(9PC>W7~_VvN1 %f3KA_mpXe)&3dWyV1`2@T-H zTAX@co^13doc6z`Zr5(RwG@A9NpsGi!o<) PxSXS`v+sM1E;lQ%ZPRqx!@mdo4-;P>ZeR z)35&0mp3;`QLBI<4o0euO6Hy>3Q#fLymDoG``YIAjg5^f&=PDwq;Q+M3p)cBxrM!| zB2&S<25(&1o7>;|+N-5(%&jQq2>VsCll=`FCT3!0pG_j+MM2GTCL%u)44LiGWTP0D zY(zucQWE{DAipd^;j@rR+AJ}@9%;(s2Ya~PdJBJ^AUaf@lD|uj)!%U?9Z0bX1337h zC$DflQ7T*yi{?^SwvI>R1+8||DA4&+J`Iqw2MAPEEeZVITaGk%@}q9|T@K73@i8_; z9YJMSBJKs+Ow1Z99V$hhh U(<68p~m}JM+-%$T_z^xsveR6C*tH0(- zT|`)g0UZ3$(;5$JHqOo-%WXbOu5Zb;4Fl0=5mypXG6u>n53wb+5bKBt(TJ#IBkC>1 zP<9e*stPm&o!SqKkBc@XB1o)Rvqz)`aW*6<(xhYn-3_Z^I3|Itt+uu|Zd|+S0(PiN zyc!)KghDFRt;Rx|cm}&V0e}INbZ>v}%U^uyx#ypm)%$^MaL`wX3EXfg754@N@##GW zmR)%7govulM5ncY$2uyRrvKvie|J`uQ?Z5wmK1E53qvInGZDjU0FFd6LI9N}&Ek_H zk@Bb 9{k?B)3aP@X3nwBbY`|{Mr&~J@ipTd$Vz|vPB|3mQ%f#ZU z=+r87-sHCP{Eqm4-nF|}SVJc;o*0epAVl5!ASFDJ${T`7>B%6f`+rr{)(kCJ%d%ub zX-o;;H05 {7UVZsRkX4XqNU{S28r%svQdKo !UFM z>-LBY0yL@1=jI|;k*w}=6xw@YIjk9TzG4NesI{VXU8zD0*Shz6zx`{o68rO+!n!5M zZoQbhkJ++cJPfyW07r`4W{t{TF)@IdS8NI$Z^-U_z5CgO$gmWI4c2n+asB3xcE0;p zyZ`Xb-5>rPS5~c6ai%v7E#X@_`p`q;A7)CP6ctXVKw_gBxGcRO{eH>Nf2qN4S^3?U zIDw-P^?Y0Myq|yeSY%OIJOKxZu=YfAXL4~nPmN4*y%@>8&nLH@tIH8cbz0%kgPouL z Q{Xr*@}qKSlDbN`5~qfWUE;Z=f+QFDH9jQ*cSN zED#!4it{~?YF%6V(sM8TgZ{*Mx1C`}RXJ?D>s1g64*`rZ! _a9U<8c{<6yz3>x!W|xAO+)_Qh2O)g yh)7w**8BUrUwrWesrB3c@O{Ok;4-9LZ~;9{`e_9i{=;)0=k xMd{9!buGK3Cx36f*f`yTIJL@T<( zrG30F-3`h~OJ@HN`?|mwe3#=%zlYxt<{UIE3V%pGY3S?)!4kQqGt1&k7}SMY819e6 z1Vk|;o|(i}Y>X+#s!T-8hLuSmH7QuF*qw*;=;7AZR#}dS;{LbMAdqZ69;(-?fu|~} zI-ZQkIFmUM7=Ft|Qh>uMCQ}p?_DH9sjQAevw^D>R@vF|~^VeT_g-P6ksbr-T!R`MZ zi6ko#CZmzK)IUI6;G8yk2trlI &W9N z$zF0Nwf{QDm;6jCNQ?h64#MG`z>7?8r;9#a)MgU2eqKPNOsz9~57cuHC^ry|AhbIg zDQatLWwbTpQb7W>BHjteB&u51^J@0-JMUIA>ta`Yol-6Uz!T;{+7A#Itf~UJvbo6= zvg 1VFa_8-F5g%6^1%c;FOqYzc=lKiMZ zEQtjyIh)tRy{Vno|F=K+)9tNtKCP@+h=7!d4RgU SIo_r3Qyjc znPU(QG1Xd4HVPH%$eX5RAh?`0z6YG8-`bkNUwrkYy58f03ufa3CcP7tQp*MF*5-y^ zZl;k=gdOAEHBkumDhB{nmHp{dsrsM($shji?|!YEU^d+Ws*R1&=0>?ODobXgfRHN0 zZQ)4DMp5Y8&UR+Io7 PIF=8$a7sePvhN&=Qj24Cr z!L<+veJ33ap~KksnW4$X=$RWg?tb@Mdmq0KV|+{%a}uJYWY`7daxt;vD`KtGHpJzI zjWww^h>}5e!Z=WD?+8Pyi1v%U6TX{nbC*5$OKT*7gQLpxi3YJ%fVfV?iaI zgeoFW-@K-?{d#Jx8i@0 !2Ya~u oKG8a^wJ&*>2DII-4l2?G<0^W;KVwVF+L z>iWwsec|<2Uj6vvPk->EpMG}dQvsEu(Wo3xMg_4^kX5l(_xJZ7?oXNO=bw4z8(;q? zH*Z|2=kuA}olR$k7)%16)svZBj4c?32`&SiA?E;y;hrJWQA-bSOp%BT%!tij{J;NS z_U_#mUV4SMukxrMBCV%}Md95D0v~9Lt*bL3u)2*7qKS{XQ%V r}OIOKmXruS2{;!6r0 a{t(#Rmvqd-KXDJcB%VMEdBu(7$p zh1q>Hoz3d`ysoOsiZzCdqS)Bn*xufrjLNFoulDyVwJpnZWHw!6kg9jL(s;Z%uk2gz ze=yydPiHe#wJOdoQW!JYoLswp?S_wGG@_;7bRSE0g~t*x!+pL^zuUwq}(&1=H6_xRD{ z-ThibYX}L16&BtYPtI^ 7N`_}#MfA96* z`5oE3M%J3T;_2S*yFcgYj*2DXT1A 7UhVTR3!{Hjd^0!Jvo|DIvm+sTNGSC z)mgR+Xa6Cnh*(rrRo7NwK^hi $DjQd?_X=&co~IyS0I3|A8(garT0F7k(o$bjMw2>@b3=_ve@OQuH W!n$(8@S- zoB{*5l-WQB8>xRyV;nxCdYvv7F*)zrbJ32DX8XuXCM(3OwJHiQ8zHG^Yx8Trd*{Jj zltv){&1TbbG@_6j+6$loVFi{y+G >9X zG%@**(rP}R&u4KP$wa0k_aug2&r1Nn)J%isWxAF3zbUE<>I_USP#>tRt@rC0_EjaU zJ|GFT6^L2^gN Y-7e6|A-Qxp&(g&MKNq?p_=^ZT}{O;Hj=fzgepcIz5Od?CRA&>A*<#t^#q#OBf> ziM7vcvVrK-u%5YqjtNTskbFUM {3@Rq-UzYmZF?&~PjeCFgv;`cAJX;-3oApPt;e<~_ALvUyv$Oqnh( zQL8HIR}Ls3$!EMs r^CRx+guDvNn#E30#6^Zcv(<(ApL!XvP$ z%&6q2p0zGm$>pzW)|jQQ+Eu$WKKG4>pi+wxiP?d2n?k z-nAN}ss~OhB_dd>Q>~`;{Mu`;O`iWkwevv7jM2u!de-cqm8cWDyL+3PTi)UlBl;5? zMPrp{wK@d}I#?b1q}>(J(kbHE0SjLDSrq6}yTn#?Lbwt%k{zX_@|}_g9+s9(2+X4~ z$f$;G36kPiUE0t{OoQKCE|m5yfT{0*tL4UNj;(Su!K0t8BP zJ9ky8q}IvS nbi zoRiWS|@Lw8QPmNh7sYa{DK(KQp2Nu0d ze5vH##n&X_EgHKDI!@*x-J {<)+cPZW+vfmYA}R&3(65QPsI8c9N% st}i|lgSIqKBbu|gQ{w7j46ysOO6Kqgez!D;eA5~%5~sq zYAY+Pe-4Yq&x$o^v4Mq;NoCK$(_RPYJUBFvYyBpoKk-xq$zFjb-%rRll)Qo_4cTG> z05Q>QKINi-lB$Z8NjZTCoLx=Cs@kvu#5qNLtd-9W6)Udk4Do}85c8_0Eph7Tr~-qh zPU(qjh$VG99tFCfK7g(e)D{jJ=?X!Zpn-!ywn=dK0dQ{AzoQ&$@?}Y#yun( 2ss zpZszu2_h~0x?fLgT&@F!VmjNmR+>}VPEzLYO&hh_Q_I_HmBD0=A+@wuEmG=E=^Li>Y(d+$=tasq7Q8 i0%e<6|Wt BYvWnvpA-!ElUcpg3=aS34{r$QY;=(O@mf8}N zieu8wZ?Dc_-S8MR(M{bkqYcCH%z*sm3$&oLHx4HItp_b14TGckpt27;bJv;XpA9Z3 z0~i>$NXF>li}3T+`3O%`7hGgDp!m2R=b}h>2hkVNXz_%KHznjI;e9})RSGCc8q?#8 zC5j|~m_*bC1^M-41F~;lVbz5A486-Bxn0~1=`*{R(7=<1TBh}ygSA@713Jf>^|>kk zN|Lxae{P#XwnB`;U+kdBJ_037hPDDwE2@N@{XJU?7shpvt?TeSLfjl7WLI_NI3>a{ z?XU${hY>U?N3(lpXtIN+#!%xgyR6?ggX4Z#m$$Ault6rL`uhpuc% q2b6y6a_503waHCVgD#?sI3Ou5kOG#P#hROzcYKE# zP+;WCL7w5Z6^BNDh)e=;6vWt}K(#5p1OZSoWM;Fuh=Q4vp`;>8%7*>YYwvkLW90E8 zKtslA1ZfBD;nN5ogNYv&Dw@sYN?vraIj1SEV}$D5v+&O0TC9BSiiNE`j>p6 3< z5>gwKoY(ddEFXpg#k2z7j@Zso%ugffnp2&+42hYYN)H6C4AVgbYfjAE*?JL0>lPoS zqV1>kizWXWP7j!kM 88(`gf&;Ei00Gtu;u2)({s_184?? zpC%o#t&wh4D~#HObP3Xm1r1iQMO0G(cd*2+Riay;;Y?gZqS8Vd6<*X^mcwLDw>6JO zXLl|-3V=q^2N6MZHm|I;E^lXtPkM^e>>xm04%mKiZQZ^2^@d)I296D1+#xCLvIiC$ zFM49Ts3Au%&}zl-BcYxhE)Zf#n?u@^Oo44H7{z>EHI-Fo{8tc|n}p83$ZoX=pu|kn zdFkG;iIqy&au~+RxL6F0t_$kNFD-m*s~HYL$}g4;q=Sn=(q7uD)@n1iSAmlu{inu2 zE+PZ)=r(bO3^e_)f@2ZwCQkT4DCTfHATWQ5LUW|NOYTZ?0QAqLr $3%1xFD z0%Dj^_)PYahu=wl7;!9wIiTH@8=+%6jXh8lH6q5)b)61hS?WjApv@>nw|x(|9nC;W zmqT~TYyGWA3aIzxz*?OPS`1(f>(@oQiplbt-X+5WVKFBiygtSW9Y}YFs~IL>BT2R9 zeCO(g_37R+EGQ>`Nr_#xV%c*NwCbi_lnWHc$(-ydUsccRsz(30O^{5=Ni^lB(KHd> zp>?*YL;BvGTiOry4{Gs^Ro=I`jfUEHkiK+jgRknMVbaotk{kTtwj85vdJ8Cs%xpGG z)_Qv$knFD9P1r|1{c9|UnucuC^ma{SCcab^Xej| 0AaRj1e#2mgKktDSTN&3sZfOZGY0hQ@E4hBRxFE0+2*R82iw{7Dy z5(?cq6>CqPmXPx@RCOiLaXEr}ry!bkat8QTpr-rU?}dhzcU%Ge_et+hdorDRM@8tZ z!4X2O>c>IRp$D$x2sE%(qTSw+am06t?-7Q(J2st8z40dD4(b Tgjszjg%I8D zD(fUgc<7;a6}3yjn%C`)uGS1B3N>=cDyZSpaZ1E$LX-D)E7STdo{YV;qMga!7jp=3 zE#JPf-B UEtj?A$HS;e8%7Yra*0DK8nO1 z*B+AEEc8oTMB7c~iVqjHLPNE=9MQ?F>CjK!soU-gM3|-(J2$0-d0FAX B^39y zMJd}PfV^g}3;VZyXAH7-k83@@J-6adZHQca=5XO4O>Ii 9op$HLQi705N)U(MMs= ^$$uY zF`BRGqP3Qsn-Ik&fGeq#wx*ai&+n}e7@Qi5u8Gx%5=wZ3)}4fI-zhcYFtRj7?>fYJ zPSJFk91j-FIDyiNrt)C==j-i$g u4ClkfXAVA-1EPM *6G*)@sE84n< &XNhZrh+xB$G6q z)Io?1hZEM@o6Mad(0^h~fYB7}o}-%fS|Sa%$Z2fT4%uoyA^vrKI=1LIJRq>v&gL^` zSW$^&D_-WyqafJFY~ArAk!zX*jgEk5Vhm)mEo+6!x7i=kHDXCjP@CL`@v6z|CQC+q zm6F02(a!d-W(0b%AmI|xG^2s?N9l_~tu*m|gf`b$;SPW9Nn!r!jeotv>IZRh mCy F-W^ zwR$XGpivw0caq;6ImXMz5Vz!iH1%*pD!h4G Y}})4Pgk~5TsXCB6eQ4_IO2lBPFzpfJk2ATn}TXlNDh>B^SMchJ^DP zr7X{eG!*DZO?zOWBbxhvnz0?;wwd0(vNUL)YR@&KL)oRBr%2KwOJjlnd9^70u;uGV-jKedPJ%pt!8c gisBJBn=#)(K9TX6UF_EhX5#8t&&tqP8NN95D}D$%p1{jg4T4 z@!Jg$APIA!AUa6sqO^0|%d0|F{Jc&h_61;&sxY&va;!%BvatbO`-REmhf)|F6sxDL z7LSSoC@gnLW3wXlM`Z3p)9?^9c_~&bV&x}Y3 7$oFlS%V@@QVv<4nb+C?p=({zV)|)O=T}={^iW+NbI;nyk z0MeLi{reKZCGQOKrXne^Q>(xsn%kR-d&*6K+a=yN4-qQ@#rC_Yvyakqt*F8D5CvF; zc!ffViNFLB!Mv*Ld0mzxCL%V`HUqG--~HC*l}q?5#a@jTD9=GX6Xa;Q^?`m0vX00& zO@iG_B|rji4 cuD*cfNPa6=G8A|a1Kq+ ha2Dyf^sq^c_7YA9B$IJoHus8m&5Rn>I1Z^c5DNLj<2 zCWr #C~lysoNwHJ@4WmGx40j8}IQT*(l@Ff$uAU^2## zYk)u?typWduBxi89DkxlI3EzrA~TPy$uS8LF>FSY@u)1o1}Z@zQvx#+ltk* &1+Y#J$?O#R(5Z?yT7+<>zY{D={FR~7~oZ$ z;kMM)FGSgmf*Vgnm82-kThBcws_%U8@q_yhcK4^Xwbs^%YPQ0PB_+qJRPC&)RJE=x zRBCIPSga^itXip=$&j&*4TG$$nZeAX!fb3ze(5V;{^Cn7L-qm0`Zy_DRf!o4W;W%h zu4QLB-`RPzKb`JPD_h(7tX4=>*F-uRl~=a6UViDNtDD>Vv&U)`kcK2J9OFtcHUOeT zLOR|YKe)g9{>Pv0?#-;7tCNMnY?z6R;ZaGG$@tpV_RXu;xq#Z*$&JA><1O<}HfJs$ z@9#glzqdb~&8M^3d|p*j*VbCsT(z~ @WQj-_^q!iYN=^+yt&UaTh)Q~yGGS^G=pn#aTc(;vfEcT%5uCvo4@`3NB15) znoVc(s#dQ?v*T87&=_YBWA?#HRzz$N`Bl^sSRHv*IC5DOytTD)b^F@$&)phNis{~t zdqKzlyrKdy$f_7Fn2it&7kjhWbbohlZNWS$%kiifjYef@g4{0q`+K$$VMer5DTpAp zF3S;!Oi`4hvE#XwRgqdmjN#F^C@gr3YpbME7<2Whr>bc+zP7b{|8cEir}NQh nCr@cR4_=wutf>j8BfmOm>)&wRO%KK9)^<6by!Fn9fBl_r zld>r%0IRiDtg5()BTh9{2|>J`x{D~6yg8YC;l-C<|KiIp+*{p6v%B+1YHJGP z1T~^y28p$dWVc;+PjFP(n9a#Vf&cdH?|ky{r=xOHRIQ_eD(;$KvvsP5=Vq=TQDrbl zAqqo)-gxTfFMZ`pU;5&!&%bbEw!eG-{=KT2vy%+NOb)^%T1tANskRQbTh>iNsqL-j zUwH87@qhlSzutMcOUx=xEO$XCVNnezI`){zsv2WN)fg55v#Nki0ae3=0w5+*HpI+@ z6;n9MrF&EP?%)3aLa)90LOq`;z|>4&rz;T?m&GsM`S9=l;RpNsl?Vv1RtaQ9m NTF$LLL*l8VblD)tgahU$%Ti^QV )yZg7GtH`s#N9~* z>9<61o{1@pVY4@#{>Q)k%Ln%!jYb;)MV(Ju11qSIagG24a+&G8n<4e5x=9nZBQ6Ym z *?#W{e4j}!~pwMBEh3BwkA{VO=o}qgYVw?{DBp9@vb65P-2Y6 M6mk4F%@!J1p-Ku-AsUaj_I9S<{LZ%~qpRh3v#!K2*J4KqKG?A3wZwHrQGamz z=81j(owwe6^C#oc==ImX^jly1ji;Y|aW>t%|KN_XVoKv2m|jngj$*WXy5SEhBF2;( zqm4J;egD%>Ki`;KB{C{%jI#{bsGqX06$vyNFr(XAq2%3WcK7k)?|kPw-}&~po__Y3 z-~akIo_p?v`Tov>NB3C-tN^L=X0;kEwNgfJU_ niw_9<8?E=19S#&3P_-YYM^;42;s z%8|2?8Up{_cmLkj#b~^(Rt%H1HhEj}JO?^9=DXkf{#U>DWsp&|Nf&kKR_Ly1Ya+Kg zfhOb0kAC#?N-*BMZUx4Ws5+V6TcpU#_(t*g(e89wZEugFg~riI5UU8WneNZ;+__s$ zt{7!_cTnJ?vGtXliOu(aaIQ*tIf@n=@;nWJ6MKD+L_uoQP$4q;^!A !(6+ zf;6GZ6he5Mgv0EH07L~c``MdsJb&w-u$kAk4u0pTX8XZ9+SvH^_rCY=!A>#WDq-Bt zmyQ8A(tGFb!_RKt`^TUB=zsj -S*{QUy?(E+E)nEM;fY=z~qEP QJ*|XaEZ}*!IsZ#axIrWdN!8Kfv>POx7@yp}+age;<{ja${R7RfSdY z(~z7u&>JJeDodzHjA39UF2-e1PGqa9tGC~L_r141c @$D#`@i?%i!VQXaC>KGkKOaVh7 %i}2`hor= sh?MK ?mJ~MAsDEr1pN^TVgMx0*$e^-E?kUCAko2l=xMjsv$++v;=PMRq*gtx z3?WC}WF9Kxf^9;Wf6#OhGWdHQ V3jNL39nNZ7A Jdul(*ee(UD=%Dua{oe1k=q=Wl&VH1bPh0Fb+qAc#;yT=$S z6@KoLs%M@)crG+*kartRAoZ63Uiyp5TeNgJc}c|WSxC;804_*LQl&&gu_6GM2&t02 zf+XI~;_L#Ek`tTHKD+z$&DV4~b3ydpAK4yEu?@WSLsX!p8O^8F?%qsj6OLyAQE&)> zvTzm;RuXVI8c~d+^5JH_K?yRi>#DL`__}+;5QjK}SP^pWRe)R+W}t^Lj6T*TsXs-I zPXI)TYf%POR?zs{*;_tAqtU3YZC%gB4G`bPek2lzl*kmjd;7JuT$WZ _a$S|}Ojjq%oGyz%27egFUa zZ~lLGA3c8gwO54w1aRy_#gok@WIe2Wf%h1)SX)(f+|o&`MabLUkjhxk_+qN0$^gN6 z+(M!1(q5=qA#hogMOnV})|>z4-~Ri14|kq_@e44lA&7#(UPB&Ox HrwT`x^Z@ETAM+}Da#u|1ppgwxhdFC|mb0r3o68i`exL_*+tEz;WxY*M` z@O;avqAW^~B{=thH`)i14`Ya#3^BWqNH(9}zD;brjcCCP38o41Z9+r}F3blXeO!AP zJq@7p5wR|W)xEWnfOR|`i&X(6vczWklPIjM{Yxp4!Vp0M#dhq)cX((8jkW4@R??47 z&QT&aBt=!(aVK$}VPX(_=PEUvxG2qdJa(oSgp*M6!K?&hcxQJ O8vz&{0QTZ5>sYZ0j{xpw91zxtp5 z^pF4W8?1U|YeQ?PtI7{eUp_T05$BfgoPjZ?oqvyjW8B)unlgYCUD6ePIwC|NmRT7^ zVVtTOXHpzU&hko7H|E`Za>fS^lOKSOq;?UCq6#gFVm#j1-`)K;fA(kp@cp0MdhTU1 zMQv*(wM}HY?`t=-gB(qwN=#K%k>OwkRbz-C%u$8VI7I?K5CWK^L>A>~^2?F{aWSnT zYL$phSxl$<|M5Tl=O6#%7q^~!u_#L`0+0lAO|&X|IufUXt9 1s55ip h=>Wy;22dB1ig-a80JEdHyTY-N&T2{JWNHbh hEoZp(Rq`MxEU5 zEIZ;_MWKMLYGMvO6&%FuVm=MISRhllx$31NX4iDyEy9gqD%LQi&Kj1si3*Vc`S&3( zlOb=2lge5pf>J?-jqdL4Jb3u#a%1+%KE6&N0m zCdB5u-~I06$B+K#4}R~#y*s >QX$n}t@1 zw#eYa0zhB}pf<3!D3`mnK+W|bM@;AvrvP~|H jySw|-sxWNp;BRk6jQbMpc+onf z#+ZW3dk-GMThDEH#h}eN)sIL-T+)oK%?)vZW^5^N2jAWb1=tWbOX>i(K7`$p5!c9+ zG=@^+pr!Di6V=gld r&~bSUngLJJp$tN?D=1YFN4AP}i-O{QdHtXQd~FkFuKqYpn}Q (QcM {~E zPhY!sZ9bpD1-XJ24+v@vVHYnUDuIBJDmTW?5Qajbl1ch#ik2Z2Z>NfKAEI?6 Fo8*t9V%6RCoU7_4>u{0q;EwKl}ada2y&ISPP{QLvMv*%^O4 zArF^^!ULa#Z(-LtB#EZ!+R*>`aYZ3EGrpCeC^)tvh0b%KMj)>!Lv>V+#-lL>?L- z$gX1=PN4UWgk~5-!sq?^XsAC0y(NxwigcP(NhKJP5Vo)swQfj|ArTE41&B!93}SXG zroCYiN>D~)aEuCc@b@IrADSOtByn<;DhHb$`TA;ITf;`eD@$Efv-xy3b1UJ18i1{Z zs5?@dDG+}wBf>|OtXCw+D;IwOOhDTDrvb%Ltsrj95(|_wH!;I9ny^qx$;ALUvdWJ5 zH_sz-OX1mFiej>HzP~6fw`_-;2MR5%u#GZd+Nny2O29K%tl_EaW^zh zN+Jze9i0KoYv5i`QYK (4y%?5vtQrQgYeuIRRt zw%4qF2@{8Ed(p0O6{^B5TMjKt>{V> G^ HNxL`8m zT@gN5O9MxA%K<~|gLmWm@f_p=uM{$g55`x4cZ|DG2nCemaw>9-?1RJtAMtWp<8(;p zmah}J=v`;0Qs0QaHc4W)z*ERDJBLSLX`a 3n6;5=DTQP@GUq z6vQi^|3N{DAdfiHvtKIg kLA@6mL?*~`zBMeM(9w9~lTUB|`G5JV&F!mKu3fFA z0+9&dd4PH{xnLMFkwOG+!IF9-Q mhq=*6yatcf^N~c1j z&k960pMJ)_Wn=u&z@t@FYmpl_u8v0qK}fYUMnw%9CNfkIxg-k=b(xa1Fy+S|f1=7@ zisPkuW#40|&PGIJjJf~tK`rXc7@jr+iBHvsu_&BplM6#vuUr$C%S-?zm4 _Q{MdX044Do&G*^{%WyLa?W=lur^g&}4T!5A(K z6%1yOt16iy)=7ir< %09#GS1x)W*>r@ z10q{18^g?2t#b&gVmh6dWuaEsGdFk^6I7sPOtr{>4$iM*(N#Lu-F>X725^80D+&j` zLHy*6LRFw|t|TvAk%m+@aHOAz*i#>ZsCsR{Q4yl(lC>h_jH)CqW7KG}^^ZUP@ehCW zlP|pVib(Au-hJFlQ!hs&{GuO?G@;`YbAL)iuqxKpPTVO>S-`j;3a99*Pon6oRZb*Q z@)k^iLPU*=KNpmvjrTu%|C`_Z=FJ;7H#Rn{SZ8c;X6GR7A{eSdg~BY Or) z4cECMT(fvv6uTTYK^rq6PZ L(7;PJHpVxu zUr|^EHIaURiTWU-4yDGF4<0?9%`0Xf$%^4| ->5l3$=XKn^^p#R>wKp==~O7Dy%AK>F{ zmh60@VNJ1N6xiP0a(S7e4v;dIrXf5}00^culkwOT1_UyOh$VD(GH5;3bv3D2V*PB|LEg4wy`V$#`O|^WFnZ=mM#_WEg6Eg11mtip}Fz)&)u4*_0Ym zkdS~zD*)IB5;SsNn1%CdPDD&>MVuj&*i5H0GEf58*tlZ9;i~S@$>dH4*`NS>9ISHp z$~wlHG63q;Uz5*xO>@>u42`hUjz#xkxTq+}T<5cDR@W6^qp{H#!(@CWOXVnjs$22z ze0Ks75rz^rCs+RacfbGn{l_<+dZwypZp|lJ;UDnR!$zM(s@Fs *`4N z=kM9GLrrfpTL_A|rWha!AT*}o8vTJQ^U7Lv36&Z_EOBRN|F6IDw}1JSzj@=0d%=Tl z+|&IrahS445fKDpjQO^t?6?@qZUumb8d9c@1VBN8Fq% Nu4GhT0DV(Y##-r82QPQV{96nm=fMNs}q1o zKnfVX|KSISGxW%;IyJJR0szc+EFiMKze5;p(^*NJ-|Ei-9mm+kpZ@V5575TNan~+m zTy@ fjFsU{du+ja3|b!}&l z)zgw3js<_pA61zW6ZAy1Gv5)30SQf6Am?x12a;ZgEW*Gii{s^TwOXw>w!(~&(PLPu zJh`GG93=|Jj=RWRj4`%zkb@i7x^{&~fWpF{o;TJivw$>>#i0_nR+UPJw06=n@X&pX$1iQVi#Eii7 hc5L^8 z%`1VEZgBM=kj@T)Ec{CqF9jzpKL7=Quw5;G@Ux$P y4t z$i_mQ*CvyOEu!pPyY}Tj`10*rH(!7K^^ZRK5U2rR&n(jCJh{Y&+EsmU{ok0QwLq;c z1Q8|x0q(lhvW*SSLNgOwBA|rW0Fz)K)XWn=5ENwHM;|eO<(Cp7VrXVJ_wW4B=RZHA zw(FvAz6w66U85Hfz{vde{kwnumw(OCdN~A&?8z<=004y1Qjf49`skyN-+1FQh~~y9 ztV{Fmr9~nFKuFB; |#w?K^_drNE%Zq(Ie601zZtcB{AF zy!YS#cfbDh@$r+x pH-rC#Y*masQr9&uL2 @uOe({N8-FTyzXA3u@RF1Uinu!V*bztcie{-DXY=?lyZ(bL-Zv zgM;09fKLur0J_%@i$}?|=H^b)ZNoL3AXb~6JV?9>d;b*nZZa*vg|!ias6|KEb_?N% z2+R>6pdfRMU57NwzMfJTLhs@LSg@f2&%swGN?QY&uF?Rfr-5$`6Vc1~Ao-H1ayA z;)F^TBQ1Hb-EP~%G6#O=-TSY S zIeh2Vt^Hqm`xlz|?8EOp_|w1s>-XP(A4K-{_5(H%xQmP-sOuIXd7u2`0LzYJl{T~4 z-oN>c-~4a?`9HsQ?cnLtCt)@d)+4`k<;%ciH7=KIWAQ#t^ClU*nr=k`|J}d*Z?Esn zMIdOVgh)dK0JB-6S$8aqsE4aSv|y=#u Uz3_fdCdvDej7J#|3A%y1W ES zT`Cee#;Cp(=$5SzfXHgqEmtRdySq^{>%2l*Ko{doHw5K0oe=?IlHf(NBvWW|1&O`f zR5~-#>{oFe3WYFmv|m(93n6rE7o*0#Bp_+-752<|XGH~B<&RSqz_eW02A5?4IM x<>; zVE@K^Ht)KQJ82~<#f#g+syK3F3>XMOWZvv9S0}&w?|%26{gZ#PTAj3-5ibZxWxpm_ zE9SoTIEoZwAp(fmAtC@#R?F4VqeI-AtyW7GCIa6LR2SdtF2GTJ1p#e`OPi9AcId-E z!JI~FauoX=xc34PP&kGix_kG|qo>~yBtqYloi#PZviF1qiBOO*eDdHEfuPbSiLru? zy!R1wtNsTce$=s1kANT%FsqQ!jv>_OCm^?sv%UR27U?24!8FNSx=Sv%x+Ll*44!4B zEQut@!EF>IpkgI}>8$G2KtvWM0g3#{0^ zkfYh =1tZMg_ypjBMy9A+^k=;ZjsSKkBWbiWck9d&px-x>>G`j>OW`B(rKUCU>L zvwK&xl3@!|3qSzCgKI$4fM$6CGQ^|9!{u`Ivp?}uKmH>>@vndD-!6~Z>(>s1Q4lpF zf+LG)VzTj90U#g-0fH{Jv)#Qf|HnW4-~WsMey2H(QIJYv1Vl8GBD 7NxA5CEhA zfB;15VUF?PCm((C;K9z`-jDt04}R$