From de5173ded680776d108cdcd34409751bfa011227 Mon Sep 17 00:00:00 2001 From: YiLin <482244139@qq.com> Date: Tue, 9 Jun 2026 14:52:29 +0800 Subject: [PATCH] 1. actions.py 2.add_trasition.py 3.check_upload.py --- actions.py | 65 +- add_transition_point.py | 146 --- add_trasition.py | 10 +- check_station.png | Bin 146225 -> 0 bytes check_station.py | 4 +- check_upload.py | 1042 +++++++++++++++++ connect_appium.py | 169 --- globals/__pycache__/apis.cpython-312.pyc | Bin 20873 -> 20879 bytes .../global_variable.cpython-312.pyc | Bin 638 -> 725 bytes globals/apis.py | 4 +- globals/global_variable.py | 4 +- ...ection_mileage_config_page.cpython-312.pyc | Bin 46106 -> 44442 bytes page_objects/login_page.py | 98 ++ page_objects/section_mileage_config_page.py | 25 +- 14 files changed, 1208 insertions(+), 359 deletions(-) delete mode 100644 add_transition_point.py delete mode 100644 check_station.png create mode 100644 check_upload.py delete mode 100644 connect_appium.py diff --git a/actions.py b/actions.py index ec9a58e..fbbb1af 100644 --- a/actions.py +++ b/actions.py @@ -1,7 +1,9 @@ import logging import os +import sys import time import subprocess +import argparse from tkinter import E from appium import webdriver from appium.options.android import UiAutomator2Options @@ -143,8 +145,14 @@ class DeviceAutomation: logging.error(f"设备 {self.device_id} 初始化驱动失败: {str(e)}") raise - def run_automation(self): - """根据当前应用状态处理相应的操作""" + def run_automation(self, task_data=None): + """根据当前应用状态处理相应的操作 + + Args: + task_data: 可选的任务数据字典,包含 user_name, line_name, line_num, id 等字段。 + 如果传入,则使用传入值设置全局变量; + 如果不传,则使用硬编码的默认值。 + """ try: max_retry = 3 # 限制最大重试次数 retry_count = 0 @@ -193,19 +201,21 @@ class DeviceAutomation: task_count = 0 - # 获取测量任务 - logging.info(f"设备 {self.device_id} 获取测量任务 (第{task_count + 1}次)") - # task_data = apis.get_measurement_task() - # logging.info(f"设备 {self.device_id} 获取到的测量任务: {task_data}") - task_data = { - "id": 21, - "user_name": "czsczq115ykl", - "name": "czsczq115ykl", - "line_num": "L220076", - "line_name": "CZSCZQ-11-五工区-列衣隧道进口-D3K638+507-D3K638+607-山区", - "remaining": "0", - "status": 0 - } + # 获取测量任务:优先使用传入的 task_data,否则使用硬编码默认值 + if task_data is None: + logging.info(f"设备 {self.device_id} 获取测量任务 (第{task_count + 1}次)") + # task_data = apis.get_measurement_task() + # logging.info(f"设备 {self.device_id} 获取到的测量任务: {task_data}") + task_data = { + "id": 21, + "user_name": "czsczq115ykl", + "name": "czsczq115ykl", + "line_num": "L220179", + "line_name": "CZSCZQ-11-五工区-德达隧道6#斜井左线-DK632+707-DK632+705-山区", + "remaining": "0", + "status": 0 + } + if not task_data: logging.info(f"设备 {self.device_id} 未获取到状态为1的测量任务,等待后重试") time.sleep(1) # 等待1秒后重试 @@ -264,6 +274,14 @@ class DeviceAutomation: # 主执行逻辑 if __name__ == "__main__": + parser = argparse.ArgumentParser(description='DeviceAutomation 脚本 - 执行设备自动化流程') + parser.add_argument('--user_name', type=str, default='', help='用户名') + parser.add_argument('--line_name', type=str, default='', help='项目/线路名称') + parser.add_argument('--line_num', type=str, default='', help='线路编码') + parser.add_argument('--account_id', type=int, default=0, help='账号ID') + + args = parser.parse_args() + device_id = create_link.setup_adb_wireless() automation = None try: @@ -271,12 +289,27 @@ if __name__ == "__main__": logging.error("未能获取设备 ID,无法继续执行自动化流程") else: automation = DeviceAutomation(device_id=device_id) - success = automation.run_automation() + + # 如果传入了命令行参数,则构建 task_data 并传入 + if args.user_name or args.line_name or args.line_num or args.account_id: + task_data = { + "id": args.account_id, + "user_name": args.user_name, + "line_num": args.line_num, + "line_name": args.line_name, + } + logging.info(f"使用命令行参数: {task_data}") + success = automation.run_automation(task_data=task_data) + else: + logging.info("未传入命令行参数,使用默认 task_data") + success = automation.run_automation() if success: logging.info(f"设备 {automation.device_id} 自动化流程执行成功") + print("自动化流程执行成功") else: logging.error(f"设备 {automation.device_id} 自动化流程执行失败") + print("自动化流程执行失败") # 保持脚本运行,不关闭连接 logging.info("自动化流程执行完成,保持连接状态...") diff --git a/add_transition_point.py b/add_transition_point.py deleted file mode 100644 index de1d23a..0000000 --- a/add_transition_point.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -添加转点脚本 -使用已建立的 Appium 连接来添加转点 -""" -import json -import os -import logging -import sys -from selenium.common.exceptions import TimeoutException, NoSuchElementException -from appium.webdriver.common.appiumby import AppiumBy -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - -# Session 信息文件路径 -SESSION_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "appium_session.json") - -logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s") - - -def load_session_info(): - """从文件加载 session 信息""" - if not os.path.exists(SESSION_FILE): - logging.error(f"Session 文件不存在: {SESSION_FILE}") - logging.error("请先运行 connect_appium.py 建立连接") - return None - - try: - with open(SESSION_FILE, "r", encoding="utf-8") as f: - return json.load(f) - except Exception as e: - logging.error(f"读取 session 文件失败: {e}") - return None - - -def attach_to_session(session_id, device_id): - """Attach 到现有的 Appium session""" - from appium import webdriver - from appium.options.android import UiAutomator2Options - - try: - server_url = "http://127.0.0.1:4723/wd/hub" - - # 创建 options - options = UiAutomator2Options() - options.platform_name = "Android" - options.device_name = device_id - options.automation_name = "UiAutomator2" - options.udid = device_id - - # 连接到现有 session - driver = webdriver.Remote( - server_url, - options=options - ) - - # 手动设置 session_id - driver.session_id = session_id - - # 验证 session 是否有效 - try: - current_package = driver.current_package - logging.info(f"Session 有效,当前应用: {current_package}") - except Exception as e: - logging.error(f"Session 无效: {e}") - return None, None - - wait = WebDriverWait(driver, 20) - return driver, wait - - except Exception as e: - logging.error(f"Attach 到 session 失败: {e}") - return None, None - - -def get_driver_from_connection(): - """从已建立的连接获取 driver""" - session_info = load_session_info() - if not session_info: - return None, None, None - - session_id = session_info.get("session_id") - device_id = session_info.get("device_id") - - if not session_id or not device_id: - logging.error("Session 信息不完整") - return None, None, None - - driver, wait = attach_to_session(session_id, device_id) - return driver, wait, device_id - - -def add_transition_point(driver, wait, device_id=None): - """ - 添加转点 - - 参数: - driver: WebDriver 实例 - wait: WebDriverWait 实例 - device_id: 设备ID(可选) - - 返回: - bool: 是否成功 - """ - device_str = f"设备 {device_id} " if device_id else "" - - try: - # 查找并点击添加转点按钮 - add_transition_btn = wait.until( - EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/btn_add_ZPoint")) - ) - add_transition_btn.click() - logging.info(f"{device_str}已点击添加转点按钮") - return True - except TimeoutException: - logging.error(f"{device_str}等待添加转点按钮超时") - return False - except Exception as e: - logging.error(f"{device_str}添加转点时出错: {str(e)}") - return False - - -def main(): - """主函数""" - # 获取连接 - driver, wait, device_id = get_driver_from_connection() - - if not driver: - logging.error("无法获取 Appium 连接,请先运行 connect_appium.py") - return False - - logging.info(f"成功连接到设备: {device_id}") - - # 添加转点 - result = add_transition_point(driver, wait, device_id) - - if result: - logging.info("添加转点成功!") - else: - logging.error("添加转点失败") - - return result - - -if __name__ == "__main__": - success = main() - sys.exit(0 if success else 1) \ No newline at end of file diff --git a/add_trasition.py b/add_trasition.py index de829d1..45e1a4c 100644 --- a/add_trasition.py +++ b/add_trasition.py @@ -70,11 +70,13 @@ class CheckStation: return False try: - # 查找并点击添加转点按钮 + # 查找并点击添加转点按钮(双击确保点到) add_transition_btn = self.wait.until( EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/btn_add_ZPoint")) ) add_transition_btn.click() + time.sleep(0.3) + add_transition_btn.click() logging.info("已点击添加转点按钮") return True except TimeoutException: @@ -1061,4 +1063,8 @@ def get_excel_from_url(url): if __name__ == "__main__": check_station = CheckStation() # check_station.run() - check_station.add_run() \ No newline at end of file + success = check_station.add_run() + if success: + print("添加转点成功") + else: + print("添加转点失败") \ No newline at end of file diff --git a/check_station.png b/check_station.png deleted file mode 100644 index ff218a3e58924e0c1d5022052f8b1cd4cd859d09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146225 zcmeFZRa}&D+ci1}3P^~8bQp+qDP5wpq;!{nbV-+r(jg)O($d}CEz;eMfHcy*uX%l* z_xtUWeX>tK50n}3o|*rB#k$s77yk0H;y5=+Zz2!~97ze0R|o_eHv)n26XOOvBlv)7 z0scX;e(d9aUyVrxF>ub;ONKPM&eG||y4ilL8AW!=? z6}3wBdrHT4C{4S4(RUitn7NC}JRQ~W*oec9IQy+V{-b8pd+7H+;yuSe{^fUlk?RQM zKM&v;;=nuP|NS0Dq4U?dd;fjp*P4v>fBqjMmU2}o;L z?1kZNspB6`$%_i`{EHt`V!?z^9{XjzsS4YI!a~!M3x1DN0`yyyEz8|8_roMeErp~G z4-cK^KN0Qx?PPffuL%!tSc)?eF17`eaeJO~%f@oQ|NGYtpUU*YxGU;?^b?b7tb!=| zR%KSx0Z~y=%YxX+@*fsS4$p(lyQ{7S=WlmcdHsu5#_I{a?L|hNtOhN9G?Ocbo0El} z7pG#Ab@lZ^X|izv`prHhu|s`nX=yjoW#gJcg)aT}_uqzFX~uAvkLb-cyq77;U;Yvm zExy&b*SxVxz@>4m_%F4pbkFm_u3ft}H#aB0T}FKev&?!ngv#suHU|esnlm4^kdP2L z?_0mUSb16zX=&^{om#VzQU+&!O2xnz5pa$V9zKLKz+P^v9w^Xn?mG1_H5?gi@$vED zT)%WX-0+X%b82dB6pIu`TkL}+$ytnYkNBshl~@#`-ejNK%qgR4jW;i?a?}c+uZw1~wHUyOj5SKyLXMgKRBMm zoSd%LXKxs*Cc@zJX=#z)!N)Ij+SZZ%Vz~4(jBq^Adv*#v@uiJTfn>Rfxq0AwRP>Rv zBvgc)oSel>jXG0hSY)Jc443r-A)$o58ed=ZGK=wRs;a7`mM$(XNlx1{GT){Uh;&EG z7zSS9XW9r=sa6pt_L#IRx{KBHESj&nev#s_WAU@K?wuX&9nG^{=gO)xd8rRc3;AnL zsaxkx;oRG zGO9K3bLlssSxl5j=K7)|{6rpT)w3ruMNv+tl@I8`}e=`V2gL zG5f^-N^{{`92u+Qlat2gW>h*lI^J?J0s=Hh-jb4%8x)~=q&Np8LZ1A~y$SiYSwnEw z4Vry$e*XG3P|@4hCy!0ciavu)5nVm%oxN*kD#RbRveehT$L!@(x`eNd~dD5a{Nny^Q zSwncrTy=IR{#oXM9V+beDI^a~AEly=!M?-hR{w(sK5i$~cMy2x`6HllMKjpR3eO6?(j?y7P ze2$CDbvR8qSRXa~yVN0#YGY&5Fji<-XuBw89GxzgV9@d9kza7IsJ{Mvgx=0vNBV(*FsxlcV~pTqnEc*;%UH-QBreXKtH0MBVWMR&ZzSUJswN zb}-2kK|s z5fHTS$HP$}d-TVTXyp9PpTjq3>FJw(MKFYY{rZum{``)kqhqXP?ZJrVSg}dy$bF`^ zzriC~J`Lk-ILUnLs_WEM-8Mmgo?^Mz-8D0Mm2!9HLrU3=&Dth?h63@c233Uzt^w2K zDlxAG4hxIjZ27Ue%5ES#!DG6xgaqp$XSU&Z($v&cQa5Xae9YwWP^Kbpd0bS~PnYu# zQtx|XW63Qh%Yr4X)B-9BtRyyOUNBX%sfEtd{RhZ6;L}L!dFETI1wefYe@4tWLIY@)6xkt!VE9`+ckN-u&Fmyyi#(A$G;hQ7D9w(6h!{SEPfck@#eyV1>_1fkxV$KvARj5;;M zXNQ}L)tDBvl%c-Ry&p0&<8IgN;jVn&-I}gG9<9G@-9HzyUHI5j6&Nf@o!fM{&amrw z9(ep4v2E`<>9;u=tT(L*_11zs>}mSO+H zeMs!|6jzd+$e2$g72rc``|~6`D96N{7R0;`YiN%jKmHmKF%NKp+i@dGr z-`Fxcy6r41vUIPVdNzD_75InX-u9;-ef)d+dstQXx_smkV$Ib*n}%z-D|(Q&IA!$? z8Cf74TvA2`hCyMJ%S>p@eE%U+ba%-_Ae-F&YLEPxDFebP*6Dv#*e`%84!wDZh6-z*=+RIUu^ z$o=B~7)CLB1M$|Ze{l5xdwyl5T?;kZ%@Vg*#wJ7d_WJU&kI>aQK6DMUPGb`j!{IFD zv2yE#{xfAJ3;H|$YcfhxmGaOA$gsBb;37*OHF}wb|cA)FHP?==2nT@;}AI z#I*gU5^((p9b+Egp@fXgaP%rBHg?N96jWB5xo2;7KcrrvpqoD~d5g>HT5A$FPQ$H)k8^Q$G+Jc=5TL+u zQ{(vT%$(^)77Gy(QIDavVsDYMs%mpIhq>RHW0wMhrsf9rW*0y67b#X=(OO?IGSQ^? zEB>OOk2wD@NbemPN!&+<;bd)HKYmEIhfv(c$44b2J6MPTz%f>2gaw#C$*DJ>J(Ow@ zvKxvrI$+CP0L{tbp_H*k*HBRl?N?-_V>o5ZNv_%dexu0c`iwd9VfFs|HlttW0rPsB zXz1o9$)j!~(Uv$NfZ9ym>j33{`t<3uRBG%>ZcYxX^$b5YmEcsy#l+;KJ!NsV`kxFzHtsgx60#|> z9?jEkhMRkvfZ!w4CJ|9leduekY{u8#Bd`b=Ss~zq-n@2nF8)4HBs%4%w$oqo~`R9puGOB zsp)ym*;X|YKAV}F^K@2KS1*>1>NJn)dIbagLsl#a7))kr-C(eCm5%2psjI6qJL9%r z#-@>t^{c-;4RqOR@yF+OKQ54*eX02Q*P7MWJ(mfV?vt7-^H-HxAw}OGB#*#d+Qf@M zMaP|6?N2^lO%Bzwwhn#t@|%rLZ)aySk*@oD7|U`rN&`-wm0L~{J`@iD#2hPp#>B$1 z!ap)pDuqA%`>Uu`*KktPbMjZwWh3ovH{AFf^eGcI2yqcnN31x@&lQPyJwCW7=8OO9 z*qLv>Gd&U#qJnFo?KsJV^a@=~F>d9xx3&HF@#9*rz!7=f*%n`^sfLG#$8IA!)m&<% z&b5Sm&-YtfTOqgvUNHb!16BAnheg1U)o*4?nk&6Ufo$KOtX?k>>N&7FT!Nq0F&uc zmAUKhhK7`sl+NSk7xqptaBzkzy@u&50|Nt@*c(w0a(5dIydtZ1&GENVp03RQD|>%K z?~;?}*wT-!t(pD&ZRdV@vI3~gNXH9CmAA4zeX(fQP>{F+5+hx>1E&n8!nsN7`rp!9 zdVjWrY8%gIGDW{mtcP8)Gz935vdjzjTPBY_X%VOLKueOxfN?DKWh7~7Zrhgzto}ZtOZU4qDkV9kgGLR>9Z=bP9 z>K~+LV|qWgjeGRn_+|gsCB1w@StQG#kSu2Eo|}?__E;{y1u)wOxXbt1*uv}wqjODq zS83`&iZOjLId58FQ9e^CG* zq15Q=d{6G}pTAB_0dSWWe5pM9s;=NGJ4)RO8{w5*PX7swXT8@lE%^5S?ucPgAsRZ% zgJbzLQvLA$MU#lv(e^BoewhFL`_p23s6CCE{Fjc`YIW{BvI&AXFg>)iv>0;_oKDw! z>2C7C;R2H~2S0Ci@FXWUm(6)cuPcs^NJmE}cGS+^zT1Ep7lF|m*l+B2isR@J5fH!7 zm3-lxdO=Vz>9$z>e$w`|A4S5jdM4#raoffna=;=mv(dK& zk$CsS@jZlmhS5hO(6OqbLT{`Db$&9zyYiI}=oAz*14&WStxw$ymzAskLv+5h z|1*&48X4C4o7>~`?IKms?VfmnKnNiNz-)+jdn>($m**!M<`h!YcgO|ZiQx{nRynNW z-M)>IXjS%gI9ru#+!obgG#DUOmm!cG%Nl=Y;;YoTJM8(9iYE53Ypz2Y2xTyiH(-M7pH-jwF;dn&3T@FmQ3(+_r0dk+)%Df)tre0H1Al7g~)4m{Wn< zG=O04T7=O`I*JwLcW|HKG*teiq@;qPqUXRg^^Eh&6jI7_(Hk6XO#?M+5+C@F03>ri z@9t*ACr1>x9+*kTau*7(Pt~~K0|c?^6H<%>3igf6w>L%ZCw7pbtECo(kGc6>kHkj1 zW2DOjUQB&Ip$uTr&hrxf54gEMh8ZFg!#Tf_;AK@rjhqS7q@zC^&3Yxc?3<`+> z+xPKR_7enj-J6u`!1?!1D*)lo|M`Q7a0Z%zr^9EN``hwizc`htv=yQOF7*yN{Hj3L zk3x)3&*78XxY`1AHH2K{HL-^zHhwbs@&!Dv_Sz1Wbpz_U92+B0nN;Giu2M>3w)Rp-&A{#<8(aSa-!xi)KX;W!Mn*8Ou#kCt z9}h!bP0epe}+B04HXXVb19t)(LHG0Wk0XeCT3ygtK3v~ zx&DjNB=N5>X*^B5u)?cX4=LFGUGF2_E200FG8KKmNdKSO1c7pz_+M@pp8LOA*S~my zbNT;N@IDL_6)g+i_#4E)z~CJi_|l&0hD)0Q-$R-A6C|cLhk7IwY2h2&$GhDg#7iWR z)lMv}PXOqfz*Qw8lK#$J zSb0k{yUi^5+t49XTxIzaGsBcZ1+s_1!4t%6CTaZM`QJJ|Ke}^Yj?w399?m{Zc*o9C z2mWj0*NFuMc%`MKypfSosX&u@80Xb@35aPd%tnXL9fPj1|7TirQEqniO%O5Lwe8;T zpAwulo`HyvOx|~3KDu*QVv2!{@eBl`K0#_UeeEi}KPCynv;^NRgxEC8f5>gmj1_uR zH%?Z#9WkqT9NdjxAMSkJE?RQ7v=|zF=)8D(;2No0X>h&xJbEx)#*sXDSS%)M6Mxfl zrqJ8;iEUw_Ywlk6+HeN3mQgoHkGiTB?A8Mux`#Mq$gb&+aY zn`vF=A40*aH$IRmzXgRr7YXw{@ zvY;Y|%c=2V1mf1MTl}u)V;P37-=Ix!IA5-l45k}y&(snNx^p{j&fp-N&sT2)c7cBT zUeM!oE_6%{5WJbz6_BLF`wM}HcgT6bm&yw*wEf9eaN_R78^zKKlW4jL7?A1UKZZp| z`^(1h-rwCf9UC7v)fVDoz=B$a=PyFcW`O2+`8TkCGiV~p#jyN|y`Q8{BB$}?*Uc_+ zgD>|pg4KPBir9}ssCxP1W8y=CU3CzZSZK#(mYPA9{XYtE-^Sr-|JMu9yA&@)&HYL% zh~nggTU+BMVut|Z^VO974QqQ7VU(FFXsqN0)}a9t8cXzd$SgNDY!VH{-`d-;Z_P2O zZOzo0t(eSu9Z?W6X`uOsh(yQ5QE*y}y|c~Xq>qrg-Is<#Pfy=hY$6xS?~v6WQq2}^ z9^|f)XU~DFu>1FK6G$sOLMuIS&0)#ng@6xA%tvt_J$i&3R`=_Y{QZJVU&L zS>^ttN7qO5blY{0w&q(p!dJ%%9~KoCBgGgc6(!=*{1hyr&++jgsyZ&B+e>Y^F+k1;=Jc;t+HRXLTEUZ>$L4vqPM~5l2J(gr!`TaX7qfQCNGwlaf(0FNh8qIS! zC%#%HtS&FC1+*r3-b7T`ui)a6b0^xLFlm-OqrQWJ0Bu9>EnhOHvHEvD8j=qaQAVa) zQLiz~48P@n3dYHE-0nH49H`~H)7(^$WU2XaY%*DmzO}{esGvT~^=-_+LBP%Pv-uZj zI+Y*Fw`NVgkhN7QE4=@6ixPpD+4-KYxD|gmi)+g}!z* zX{|LJcRG*Z|Acz{a?t-o|A__St&`ot`A0sUq=amS%gyz`L4EzzwN(s6)Y;DcfbNFw63bVh#S(bV<1P~f}FcrowaD@&G0&Ad)K~Q`-A$e!8 z%+l2w&;b^h6cB5d#}oUTlSBv`I13+2=Ea}$&7UQxkqSm^Y}|p)b~BIt&U`G-YU0nf zJByEKsP#Z~d-Hqy7K@ymh`6}n^hD{wA;#K7E*T+<4mJX*py9T)qh?gU)2^~0f%>Lr zV&Z#sIeR614=*FvTGq0JZt_wn;{K*Z-&~{f$?r%M1n?nZl?z@eZ;!UL&tdFDypt0= z5!npkFD>*Ud|@~M(ZXuFAOhgwHgI(sL_l7Rw(4;j{yj*!(AmO&M#| zSNe{!vr!Nc>?C5dwSoOk+Y4HzbXH1AbHUY4^Nza@G_DNtv0)vf`Q}OX1M^B(qg89Bf$U;>^C?zmufYZ~sWE zKSnhCGGGE9W+SB=Q1pnotjNjNOluII+ixn>F=?7<_kfOq0KF4cNmbRn`_%Md zWG9ksM>J&T*G(ik_?zZ}JjbY87rUn=Wyk*NOStV^0}A)Zpw*1ml}Af!`@=^(B!NUM zVsB^bxSb9e4X%z+5io5Syxka6uoRH79O{{&yi-WbPk9Tf<2xU=&VLXn=8H6qw=~UQ z6u;S5kKvK$dUJ7vFD6Ms+nYaJ$FhM8eQj)P08~v>5B)@m=QJZPz#H@sN^>xQmN(Jxfa*e-UI^LVm9GtLDi`vNMh$3ZR+@ zzkKuW5VW14T@-qpIf7;q8;;hWnw1rB zqOH1Uqi304R8-V>^_6Tie-SVj$fqLCp_Dipkx@PK&A!orJxMQo4Zr~NW-^Z=3u^r3 zxr_VZxQTSBt|hXX4_{qSA*sx+E@?*1Dgxl|5bt(&Y!x2}DQ|9a}6?)OrWbvO}T_P&RGy!)7sGtfW$xZO{ zprPGhw{0K>KN3WXxQYs)T~V>Z58`4oLqk++Yis!S1MskH1u!R65l{BG0>QC1l!=4_ zNclR5f{)N@YpcR#@dof=s0g)^H@ByhLQ)GC=HOH8-ebbyvYOJ12PX#wD5GGLdH4A< zUhp)g42iCNQ8AAtIU-hD3y+jE%b~iB_4noL(o*DmgqsJaEw7~X5#pGem$#|A8wYF{ z7_U5;v5yyqxo9%$(vf8Y40a+~7CCKb?Euii;^T1<&LW-A5)%>6w1WaS#`m^8 ziYAENs&V|qeeR47-Q#>_=9hE)1rP5iQ{;bi3wxHZ@$>>t&)c9X@4 zpBQ5Y1O%|YU6p6lD8bm|dkcQ5yRwgI4B#iZUH570)QfKE4!P5NuyoZ{Hp2v%IP*l3GP*n5=t`(Rz&vW7$#zkW$6si?4TR(PBpt_tZPV#!!PDrDA0rTh_~ z3wQ9nMI{Cob@%Y#nN*^YjCb4OdAl~`@8Y>xqus3tvc&GB){;T^tFk}B9!zB zuPeco7P1UJr^1pa?|oXRjW+OTFGtI*rkfIlz2_h+qNUqfLf~9b5Fn-wO(0V}&9T?Y z@HDoUF!&(W@JSdQPZRGS@C{{5RaqN6~&ztb=;n?Yx3?|l}%1WL)Z9bHw`6lLZ4 z5VfGV>(`|}pdvWS&3%n5CmK2@G&YMhH8lf4lz=mQt|BLJD^uxL%L~w;ftf&-(*Ayh zZ7e3o(64_7UP*9JzXFGve)s8yA8BEag#G7^*FbhDnnz0gLL2-Hir`fP%JTVZ;O!+| zzI*|_)WE<1*{P62!V4d4;e4Ii{WZ+Sw9UQ#AEH>$zfcg!Qpo4Dg+L$&_p;3iwoWFk z3OrF!QLx{x#Ij6`kIx_UCo8Bce>yVhZsN*TU5s;@d7qulfJ-G91Z>I=uy%k&P0!$& zM}qjUS{hT^jyh&dN(wc^=~@t5Tl~7|DVd<>zQl@KzbJ{}ucz2tgKs?t^1Zy!(9y|i zgp_fr8~_*vLT{K8dif2hkzPjxk#XV1RlhxP^A4!KhV!Rtlvq?tN%?E!BCz{D!20Wu z@Rsx+i9ZDrhcukqdAs)L>CD}=sZ=bnAmXIaLqbL^Kb0IQFrW1<5BZ|J1Br94;qn6M znuC4`16yotEO+CJ$ebKTt)4SpNdU-p8c?6pGjG=Lw+CJ z($5U-UWAtbp9N(y*2?bmGfX{>`?Rw0+(~SeNgWXks(3_X*^Z4rUS~NH5)-r#RBBWk z<18#LM46ICp05bSid>7yT+nlI;W@mx51n_KA>(} zlCG#nZZR6 z3wfT;5=GnbT-G?>CSuVMxo)mi#0>W^SS2!%uCDn&nIU3f-WwhKP{a@scwkWa`jsHJ zuxVhGEF72==zh!ryog`%q*8X3v6YHrz!k~5u}hLa={Hf|<}_|98yhNo!JyctTS+cS z#5||xUektkO9p(aAaf|FsQ73gj-Z~R$HBa&(YXOytLfr5_~H$H5dmiC*{2sv$&DbBcSUQK!3G{V}?cpL%@BIP4C{l z%R3nZKj7fN@k{+G6l|Nt0p2pg8k&KRy$Gu*csEJ#AE-gR9y39f6GO@Y?-aV1UlZEwUu|}DG zLVWx?Q5PKhu0OVHt~}+C)>ri)wyX;d`ye{d5jUv3=87sd}xhJs>+=LIhSXYO81v}B#1*I&uwq_s;5C!0*TXAj)Ez&1L>ZiA!!_;xrYEV!0Jpb-vk<3Ms0jpn1Yj& z<_mc)Bfc0mdzzZsS_Ob=dV#SLVNQ@6G)$3&{|(j8ChUh zvPn+5-N8UZwk^axLFSOXiMSypC9x}pE{cXl54gFB6>43RVs$HF4wEWd0%72oJ<`|9<=vaq?Q2N(SOT_&9QWrV#(Mz)^3scB8nPvd|_ByF8N zdF14jGiWzDEZTWwj>W)$Mqk&?8ToaN1*fC^JqUc8E54cZwd%@%y$Fbik}E345?g%I zHY2`%P0YxUSU>!VNhKrt_=*nvE06`lRxP_H?!cKecXVKaUTwCbwy}o~o^4>9$wsZG z8j$8B%76hBK#a%pzErHQcl4xVSy67O;j6!SHM_D1Vx6<~vNRAcz&bp+-Wb6gD|9Py zYf5T-@GOCa&W=f>|0g z*dEsKO`(gAVGqUTT7|uBe*d}~tNON9xpiglHUW9iJ5I~F)g?4HK0ZJpN`WG@EDX(H zwkV|$RmvVU#|N|s6H;(KoELluz}3bYkCg$QAd3!|h3Vl`Y5)jMhB*i4wjc^F*=^>|34?(^mYR1K6ht~OWN@{9q)>8YgS=m{zKG9=OxwQqFGH*x% zccZ(B?00?=Px@wKC6HJp49T&uum-Deaqu~`JlG@^H;B1B`H}Vxkg=0qw1?~*9Ebve zcv<`!6LAlU9zYbacHA=10BQw0)6B5IDlJjxF}b?Q`9Ha_s|r^DVp8K<1Y7M}3pFAc zmmCtgv5jMQBrE#b+PY@z52m>w6>LF(ZO-Pi6iRDlcuWkLdnvU#7azA?SFM`_Vc>3& zyx&Yn$f}8v;eV=^oRZ=nx`WTUT3kT=7R%8r)+m3UMSSTBgfDn({AtU4xDZjL2L>rnf zaI@eFYjX){Uu*kl501z5CEE6_thx)Fppuo((VOGTBG2zZ_T{3y;)7kN!h z|Etq>{m@dY+BITOv>eM^;v2nV+iZKg_-2#lT{o3akW(qCskUXizJJ~w4BGLHj>Q8?%aIj0rND7ZyP47?Smqk7Gx^%BO zS&r#)N?&ukdGqFTu$9`L9a_fnc#tmMZ56wc#}*(KaD7^AVJ3CcOr3}ltV+bEzZeQe zhBQC4zleE0x!OqGI#bZh>)Se!fvDc+|&Zp(#W+tGKOTQcbb@SwD2h z`)vBh%R&KRT{`jLOyIvFw6R3U2|m;X+5T4R_d;^;EAt z=1IDo`2}O~q`%;-=|L--Oks0xZ+@e8UJQfd8$Ln+NHT?nupx+-(S>#cA;`(ejZf$U zc!q$G@HtKRur~URGsgbTyL2fW1Z5~X%vEZIu1bGT+;fR^U+@dq7K`7q=;>}9nbOkA z$!QU7{Zzo05K8ijPOzZZJM^259;764?;)HF`kIZM-9UwP{DXe5WkhkNk{dTzG2r6j z9uU@*8pYxBR8}>$cVNohygB6RDWUF#&xb{CmJ_VTsPa;yqPp5VHX@{VrFndu#C$aO z1zomhR2p&f;%;A^hZ}OjwXWa8Me?J7pT%Hl5V_w7UuJ3V8$%m)y_4-J2nphI5%5Qk z%WC4|T$$x?$gcl_56lzS_bzg=&iGnB_dcvPNiNEL6Tr5?%>~YZpy z>o*LlTY3DeK3jtNIiQ}NOsj*W-EbN_47{l_rj^IE+{93MXymLAbFuu&neK1K=+ztB z>rmR0V%b-_xn?cCF&8gc|FSrS{0f?owY6m;61}}qU4bvLmctf*{J1pFW1N0?M%n1~Ynx?`BdEPVDD%3B?d0Zg ziw3{1qW-+bdRMXZ$s;#(^t6m{xraEmhUGB9GTZ2^52Rw*w?EU=TqPjQa%?|005@t% za?VXkH@Nikx2FPp4W>C6qJ$8 zuVAKL@ya@lhiL}PW@rfMYYa?GI4~rCs;w2cflIDdo~RW96q)Tva6rI-``?BISOq{@ z+>U0weQ%XA&-OVtTUGxe9;SOG_ z%~!%^dOm!IuS6z-8PNx|lmhmLmgnC;GdD-WK-(!Sx+bmEOEcDko9+E!C&OHI!*u-4 z-qaMHsd=D5H1<_wxc5xC^&+#mF-93c|I$DU$e0o^9zlo0smktN+?`uqzClGrr8YUn zDyr;oP*zZ0F8)$fn+)-Ja=cOFrF6DlDT*6@FF`-~FC|wtK3?7tw{nmD)qc`mxsq05 zfRz1)Z8kmY%DsUI8)I~|iiA)Y3DX`gz)r-lLF|`^h1g;^LT=ZMsF8%=7*73(64O}y zULSYLaWA1lwH%H%n>ydk&Gle5AFY={&O3?!0^4FE(-p^vFjItTM0-YyLj9o;*AEyg z|4ciGG7=iXstlrmj{e1W-=a%Nh<*j90i+>g59JtEb>~5PzRyzo(RQ&7B_oD1WcpE! z=Ft{N{vx$b4>)Xrpj%}#jB2l%$Y8et@Us>nqF{Lj%<(EdMYlQ)7gr=5_UPv_Yd`l0 zt8O5+`aKNVf4G+C*Cp{oD}FOuCt%-y_clr9sH7xT1ap4YAa!#G;eWjVUr^G_O=SG1 z36*>|MMT8dC24YPKesEcH${hqHExm&ygNSK@4$~${$ni0IK zfa@E9Fq1`1^~{4FItGRpA(V@!9IYwvJZtH#ugG!06)A-cJzCoP``1RJ-{@`AN6aqP zY|=ut&5wDh@lN9xnx!A`87_@7VuuPi_N%{nyw8=^FkAbRHkFs3Z=F1C0dsGIU)aNb zu!)OBcQ?h}y-S!Cms4cuo5u+%(+bZzWMpFBJGPk(?lxJy>@v6CPN_4N((Nt}_#A1= z*I|2nB*&os)GTBy$sY(^w!#+&#lPZ%JJjqD{9zcipp?9iAv-)dT@ZOg%YXeENbhPn z_hltv!Jyb5#i0WSmI-UE7)=eq%|@uB1MjBKh1me~4%mG~D_97W7Z(U&Y&E}scxY3y zLrH$eUt}}(S4T(Y%y@=#&R#hFW7#>RR*P0@B&D z0ii}>+g<<`7}rvT-`8as1mtp_mU_q-p7k&U+~Y{uBzs=UmoF!9y>3iN?nBDKROLCV&9!I=w7Y0fe z`cM2`EV!#|+#{q?xgFLBR<@GM%bm2XH_546?FqG+)%4Z*FWv zZQlI!9Jw--Gnq7HB_ZLbGkNito!XH$QztgN4Obfq+J^jeyx{r8Mf6e~dx+^NBSSsI zfu-R@55BUYuU+-U>4Eu9As4{v6t;!`i739&C>=V4O-co^xt-mPp$;Xr0o%%lUVsw4 zZmtUtTMN98e>@nKWm)MWZiEsxKd=Ag`#X0*-R&jw&v6u5cUK}*9k4&~<{$G5 znb2UWnp);IUXM}^CxfZd^=dkT4LS37baYgJWwZ9W$oR_UFCDK}nMzEJt(Qne18MJu zjUpRc+r~B=vbQrf8+pgFgf~A`B+Zj|46Qr{!&2<_OG`Gf!J~pa;=w-iKi`-%zsm&K z%AZ_C8E_I6OW2H!jj=k-cukZA4|<4!6YEpv8-WUx)_m{;qa&iYZGT{fd?jYcQe`=& ztE+%L^dwu2hx)Q16L0;cl)*KdPkU`?b2At$G{0(SA|yUXM|YHj0$-exlA;Hq_#D|d zlY9c_cX%4j+(T}T!*aC0|8{&1wi&D}4RYk)x17ZT@~;t?z~Ehc8ogt`+c;7-eoAdk zSvMFh(XI(kQ)mlp*JSj3ZO%K-du_q@@KniS+9mWi|(E%FCS}E`F!Wktrwmn5Jeb8E^J}sFbRXBmuRefjYBDSc4R9;RCntBagG4(+q`U)5)?Mxm-rS2-Gw+7hya)hP`(MdHIH#L*PjC zVH*Ik#!P+?7hec-I&@!HA|$(kLpqeWct04qZxl$N-Fmn^8+w;Pg;g=&*Ka$mO1tZ@ z)7z&pw+ta;lojE1*-8|ve;cSGpaWlk0??cP z%E?SBdz$jQ{6#A)EJTow9O8g{cb!O86%<^gj@pyMmUf_Ukx;lz{(ZnBB76(<(9%FU z!^!AETnc_aAnOeJn?B)GO>%fPp&_FJY@DzRm64I5S9Ls0gdSljT}tW*q6QE#`A+UQ zSXhb-mlOHA^*0_>lRl3MHypUgl+Cp;F&UksU$mkxeF(IoS?Sd7071CYtRlSkD7G{P z)to-pQ8P%Lg5qMsGA`Q%kskl*+&GFS=k#EUt3UsXRX1HCnSZ2|m?4f2<|%+l1Ox<6 zkE>M_$r%`!M3LIsG;GaTj1>s4IMOvH!Ga)DR(5uwP2-0ft+=)_!4r5dWTw3xO4)|> zeK0XGoi~S74=(eR%G?|^E1Y*9q<=#> z+@Y#n)Qydcd(k9so=%_li_wHD zU#4)_5yEz=^DsJec5KS4}uOJL~OzV{+AfOTpt#3{4q+y@_exCsI=_{Kqm)t${>^ zZbw!*m#5|y6BV~%?V%Mi6S+GAs0G{k(j``*vO4}tY!FxhZz7N!02l$j?Nt@=F~RSm zfs*qPBw)W*1Ee3a{_>CvifnSZ0&FBB=b_lZFQ_w^7pjiHK6)bI*j{CwkZ8URi8cklN{uWJ?nO9bA zDb$!HyOXP8rx|?(Ep1{iBErwidcqBV-}{LLfEy2oEFk!el7Vocc@RgxTCxEuM`5c~ zP~r2T#Kf_}B$S7atse}8(M10r_TKuds{Y#_-AF5?G)OBVB@NQuNF%L)AT3CUgmjnE zqO^1)t(2sM5*tBE5K%%}y6#+`bIus&JI1}^-ap{}^b`;7z1BPCeARrXVluf&Jo)(x z_&eLrB;vnznm*oW;TPNelHvAMB3$2Fa^!nEpl1MwbjUyYt&_m2B8vFjL4I=;yx58$ z2LA8Bl?ZHf9ptHikF7|c-S70Q`}o_(=WbA7u|S9k+`)MG_#J?)JY?-WYl4!X;mHpi zEy;GW87s%Rx>0v^9$i+`%@GzQ7d}yA`<5)Sh;=Qed6)U0KZ8KSx%l@r|1!X&EbAm5 z-*HfC_?uUZ4$@q-3?;KPXRY9{dio>z(?QEti_5|%?8c_%T>Z6geV@M+%#pIPvcetB zoadt+u>1j%0j@#ez;^p~&K&%F#XADpn&Eez%CdCcZ0caauwxJhaf@a3eR(L`N!=*# z3we~Z>=43hIy;h35% zEM!|pjV9Z?4xLMu4e$9m1(NQn(qB)y2)ldtE-?MFU|gX#lT#Tmo}@u>adPDp7KUR$ z48`Om6`W6qoCOKyp%Jui2fW?R&hGHv3aN)WXojk-*9?-9Q=%joQc_ZC|Hx%KNH^V5 z3Q~^2w*baqOXM~_if8%FlPxISIL(^>llcU9&;ryeP@#PEIf&aSS_7kNk7gPw+q4oi ze=##NrsDqRZ+H4%hDuu{Jtv04oBlaDKE}-Ktc9(uvK>LCQQ2T$wrmPp;&AoY&x&qLSO+U3|l#&-@3TmgSq7$AgzO#rR*Yc+dWf>o6C z&Djw@iys%PMC>y@At6P$+|WV+A77j`_fIF*{?;{bH_^T^^fvm7rRvxXyFcie@#OT_ z=BG=SH=^F{knuchN1*~r-@NIPQG#`A;ozV~y`L`R6a`|l>hF&+j-Edk0UXzf)f$@g zvLAH`?qx+)B*5S0?At-46X3GB3D3MddWxCN4Z&B)u};zhz?}U*Z@UAk)B%O^D8?_> ziNc$E(>`)2Y@UFZ8j_fTJnz7PAMafVIVp;RW3PrjjDq+U7#w9471&PTZPi<)A4~F7 zmiwRG^u8AG{==g`S^3=hY+PIj-K-j7v(ClIsdsHHH#Ps}d3}S@kIR_fq7$x}ei`T- z_#`{&(scN_1A}sAW}eZJ=jZN7;m^!vJIhN}L`v&wx*{l?`{JaSj*btR7aFJ@J4Ej~ zJ1^VYMKVh=T#!-xbk@Gwc%3M0qBxjiW5c%4DpB{+ows)$v@-JZC%$S(vo#guP8~R& zBeNw)9SCg$Iw+PlJfN}-;m`#YNvVX5>+C~gX@!}04qefu_ci|>p#tE@9y`wNtD(&{ z^|2YsjD^lsYw;62BKQOg z7sRk>+h>@2dy7gwdL*4S5Ng)qT~%h3IKCa(;M_4WK?(6H5iRbK$=I3M#^B>CY8TFh zB4-|~tMkc8?e*po_AcEiuvh<1H6HsHyyKR!7) zJltl1U?y!ty^xrH?jL=RbR74y;m}>4U&Oo@%H!};(kg2Hpw;IOkzl8jl~piMrn(Li zH@D}{{oaZ_i<_#iu9gAyJM~KTmW1c(FBRjej~f!+!#cGpqZ3J~ceVi?7+d{2)=+6U z-vNIBhz47<`p=eYDO|OT&p{w~UsN)&IgRf*pEXKL zUhFy@9j|oY=M2)`c-^UvKf54M#Lgn3d(_(SYxW?>he=F~7J$?o$%-4Z2kLXlLHj#9 zJ1c46U|a*JFi>hJH@ z($NWm6+N87lLj55Mpl2)$5UVX@3ziH)K6n#+64ten=d5F&V}}_E-Z-dTb{1WGW6LT8$}e)s}f~JJ?Ij%HzPi2_jQ6`wJ$;*jozC8 z_t>j1h<8<0yTl&~|8G{+)xUhob*j#xQ~$=Zj~|6FwmqtIzqyV09H_mJbqo#?fUIuI{=1G%i+VB96z`*Dt#r?%loV#o8(s}O-rn9tM(Zg%R#-D{i;@X)s?cOnQB&vS zBsE@{qRP54*Q_wcWVepbN;%1>Vg=>xQrjI4f#0wiES*$OxUi;9Zc1hCJfh52iPd)Z z%_V5AW>hEq$H0R+reSIofXxC-!8yD0u*AZ@;l#+7F&zPB}T}`Gl zWtlTZozhN{0okk8PF3~wis5l|`un*f?mo!v4%b6bfGwP!pF*Q4M}VSo$!~nMGtiIx zz8k8~@!hP4{y7}eT;iF3YGKYxV*NA41a>S)YdSkRFbX(vA0;S1KT4>-*9^IqMY`Ao zG|jnmkcTKQRy%C&F-F7+r4HyTI{W$}JO;5eFGE_{SsR$H!+r$02av>?9OfaV^@w&<(=jmCG#`}~{&Yj(K_pb8SKIzfL-fOy1_4c#Ij~~l0Ncbub z)Rk9O#)GbnUEHlNDID5P&`lNTHgJQ4U2)g*YE?ONUTj4I#KZxmGY^|$`CB=yDf>q? z2*)V#-dq0c6)Ew2C#2pK#iprNz>S&1I>pZ`7z$b$uDrp-cQ<~)$A$K+>U~3@O+EyS zY{Ov!1-M?erAl9V$M`?N)1=ptMa#AZ9ipIvc?Bt-z4{1f2T+ON>0iRcPdSA;vz&Xq z5ma`tISaP7p(qcIkB`6X^9~{ByT0ul9UqrG!fAkG5vUj3EXeBWmDAR~DhZlQkPdrs zCG7~aNYGscHPVkZDH>>MYeiw^_VpB58w^ovK@!`fBuIDs3gy@4kG8^=Nhr8o!F;j2ww7lzln$j9`G6!; z;}KBMXxse^*m*5(7woO^pz~{%6bm0;f)J^ljZK(Axk;WyFb=3r!X;CqA&SKJ_#Zy} zL~q7)Lowr1$U5x!;eQbeaSYiNSc{CLqjPP&YZH~lP5`JBZ*(UUnvKL!WM)=1yl0up z3EeMA^aN9)r8I$nSa_SLL z>VWlW&Q1F+t3*YkR4p6)%97hl+qRirmtb)}w6Re<$xx7ZAul1CCi|ZiT+n;#Qbb^| z)=eHEAqtKY9W7}!pZi9`6B9~c^qt>W$l0GaihB7bFQq)dK&s|{9 zW-xnwpt$dz<)cSfR#sN<5+j?l4t*sN4?^KRy3iE12=6CQEbvw+xr+n8V$iCWydd&< zc$g%GuO~#DKK^oZ@x2??Ya=+YSza?61wq#ELp!_MBLO#$#kR@+Wi!#}wg@PWEs|n% zwaXM;Q&v?;f0fC-*D;~M$;Gv>u|Wj+V#x)D`ZsTOcY`%Cr+n!>5RdRm(Df;rR1UPX zhX*Uc{ExrPt0tvs6{X$`EXi z`mF?!K}*-_dnD`RCUQM8QFrvE`(|oV5|23_3(u5tUR9MA3l5PP)15o<$A?QUB2`tj zA+L*z^@2&2x?X|>pKv7YX-RaC?NeW70$w@!FA0p6f)oUo_I&;ln(7SI7cCfsKtl|Fj9VVHg-F9PP(*Gh3iY zuQpON!NNPzSOg&d;oYuzW-0t5OCo5q&I&%Al84)hqLzq1?p0XZJBqIa{ zzsXuxmKTQ$xVd!lVtPRW>m+BBNg?p8)ipHi7%rlyMC4;}3v6u4#M_W_W$CHioJ!Dq zA(rQss#@_6bJ%v^PkWk57l~8zYujr+*z6-iF0Xq@a1W1+{vxSGqk31Yv=)WN%;P)e ztzE17rMA|vcf;Q+$36By939Y_>r6xThYaXqsTi^bp7vi9H5{$5b6@$z z(fh}>lAeFj#p3TZu;CiFovdQ2D__}vWMOH4nG_#mJtV6IY7iv13|*g`Odb|bC3CV4 zruui=ZpWub{H!qynjF!R&lASqAHZ>I`~f!n@?sbyK;vS?aY1n=k0JC$0u56?E< z&MbzU40rS@sf$g%Xon2uAPT%jFr|w;`&XoTiM6MvhuQX*vb_(Y{%y0sEEN@>nX#qW zWfn4cEU4(^dkN>O3;+Q$3MtID=q36Mt)P94=;_O5cOW25qRWbq6^Hva466M|Y7q!b z4tg+AIiV9@LPW`JnoTW?Vssp$skI+hRg<^`?TjrB(a1yfsgSRKSip)+PfvenwP_Bm zU-XD8d~w^qe`Ef9&D6G5iD!6!to)qKQsJ40NB;Br<&~9@848SfXz-S2ODPwHLYjaQ z^Tr<{gKE4B>X^E3H{%tx|3?du$@l2dqj>U^gtG1C%{E=2>Kht34Jpr8aaV5 z!ej+2`H>d9Ff357I!%#DoSoWQE5%*!fZT~XbY4jZ0M|TzQv$}{-+fL*lDW9{ir%Wf z>ic1%t~+EG0F5i$t`-B|%42YeF99=aH;ptKrHhNC*KDW#PWJMg)>c+>${U1BMU!R5 z)^B$<*Ew{Xql3c(Y(i+h}D<9IIDMYVHFIB(a}~OrmzaGJ(%OE@6Y!Z=@!0(iQ|)t}q^BgFGOvj1Q=R)DCXO84=1n5J@O_sIfn!yWaC z=}fsPb=xj74FDPqW3c&JfX#DLIovkJb6OWGm-jD|njW71WzaLIzZJlrZg9%$hrPk$ zd+2hyvsMWz?GLhhl0L^|_bbf10Swe1*Uu<~R4cdNgE9$PJeqJPhJ=RR{>#UTM48-z zKmzb4#DV?iQ_c%N$TG?jZzF~kOOvm4fz&giqUlr4a7Kt;=}v$3%d>1{fAT3v za*_1x+8O{pEfR*)-LwV#?!lMb`uDF3P>|vp(Cy`cbRlL6F7WQi#a=t>40)W=(fQq@ z$=#F9+M0P@t9E^>kfYVhBSh=ja4%5)FfDpB8>n z<+30P^wcN4FFJ`pKQVH0#{383%8%tPk*6+w54T5w<{QObMPvGFLG^QUE=3O>th&ZC zNKr(~@PnFmc_mV8721N^Z?Bx4xA@eiW&x>cP-e)qOQq4!n*<-sakiQKjga%ZWVa?$ zh`74y zxX)^*>2)JK-7U}$JZy1O2fD#>0VY!ElZSD!vE5Zq+PZVQqY+j0s*!3$JY_V$fj$#W z-t0b7?q1owrxw7e&7^l1F2d@gh9AR|-;MrW)H}^afosm{^H-@wkYz!LRInlUCQ{Zz zVcT}Ta|Q0M5QS(8#0rYq8k=cCenRn!+#C6j@UctJG1|e#J6vYOpNxJ2?E!;)N)s%> zt}c91Ta2<01SD}i6$w&|d#8{Lis?^9BYFCxcg%7c+N8iPTD%S@1CqBxEPu%zzw!0U z0Bso=f%_wI8KODw6DYPy`jK}7{wl~Tk0hi=JzOl%h%xU^x9JhOEWSk143D?{)bLmz?ZNr^ym8>2= zb|mX(Wts;)!l4ikiB)e5lJqR8N?i#?1MpHXgGbRSC>R;dP+c7kw0QkEel9Qk-vnZ@ zuW+{K8TC})x~THMc%e=uMSmdw^9jJE4r&kH^qOSw-k`0{1Dx*ip4x=#vuC|M8gF=9KVcakZTBg| z!cOvj`}#Gt=iixPU0#)11#keirjmFWUIS~DVV!qf|HmY>0$4b=d2e6=h>)Ay+uO@x z&bHYi0RHl7w+U_mdvt`h57ddZ>tHo=DdWK_y{u5DFjc1I5pEm4L$XeyL|K;y>J`vL zQrUb-V@jdXZ3hG^|Am06<>}#enxKymfX#a2L+rRCR7*@WEJP*%*z5^qT`dv+{rk6J zlRfz-7G^|f9J&Tna7XLe39__QEwz^U(ob!91O&QD#!Ii#Q1tXW)xn7^LQWbCpTz!e z#{TxfL2piHxOSFBEf7F&IQ%N_3)6^+El%vMUEQ8|AS&fW!Xqj|1xCW8rr$=_Ktg;d z#&-=Wq?rA${r$Pm4KdomdTdmuGE5{dh9({%TCvp;g9$VU+%lMUmlVpl%M)V|e|$Tkf22`!{ER9?^5h4b(u(Zq#H8*M z^gE%T2Aq9pAhgTUtdq1G{e*FT3 zuZjdf^{T2WX~=jiIdhX^oa%r}I{ASZR<#iFJ7?ZrM^HrQnW1$mGHKujhqhLwxrEcR z_x;iWVRZ6V=u%$j<{2Ru=~AHdfBup)sw?695uA1Z{m<|hJv)F~{_DT~*T0m_4+k{t z|M(H_|Nlquu>K#OOExc(TE9BZ;q>f(KSq6$ig(}@l!ZeL5OKR^DP>jFPf+-vP|g(< zc!XERycp0bP#l9f6@}WPyFOg4d+YTH1oz*!s;m=EdxVoltGNAlumVfdyn--rnxF5DDV1-@n+7=SYG_#UQfC*$@SPm2 zcf##z;p|*dFZ92byH-m!wTQ2;FAsEC_Vp5w4FDMi-7j`2F@yg*70Ah4>IG78aJe3mpAqM14a^ zIk4AL>Ik%r&Y$iDm)cpnFJb%R|CI($3nF2Qj{TM zlnVq5P3=R#+)EOM%9j=n5W{PEpau*!%(f!i$YL|~^HVn%R%5+$hZwH9!-L-%P{87X zBtgd9oZcy`2Zl|3tGzulGc!Coa0TuuRs1LS?h(OUjd%cCSbfQ5nL-|3=?7g`ql#rYOD_6WD#QzlnOTV)^^~3pjjJFZWZ9h*$EJy;MF3 z*e)m)&`105LS0}mnrV|SHOStSAbo@?<89!#$+Y>z90qswg zSU8}Krfn}WylrA)V;6q?3h`W@&NG{?Uk0~50U@FFH~oygLKt-cU`0C;t@>=8#vH&r zR8?(lh#It^=xP?k>?X9SVHUm||8!m7;A|v?wMb_oJdtSwK zN0{=WtCs~_y0FnvJRlOS<0}4kGs2l|f_^0SX>B>}RLJh{b(2=x1(?FX>pRH<1AXwM zkCaBCyaHpB71X!rYvinIw6HhBGQ>Pl*>|+R*V-k@WA>i;9Drw<7=`$a_fNNR^GKo4 zmHuFHKGQ%9w_!}2wHmDYFgz}%yI@&0Zm{cIo`i1Ny|~c^_P#}T6gg`7>_LtD?VdQg zE7{_VkB9qSq57>{Vu*-RjHKdwgWr^L2xhmqAMqir-P?>u_0HdeAQ^z&ES~+PdrM+M z!f>9?v*bF^I)?fjY`zy|1;ftC!DjEA)VVa!uBBFMAngH1A=Zl%uGMel1BW7jm_%U*Tx0@FC8W?g?0g7bG2fsc>` zzz+m|#TCb-kP~1%kg@;>-P4105JgdNo8pBZ?-}it*U0`W^j?b>5|9~hW*v-K8AHez zdmqp@AcCYktM4!0yovUAo@s|Zf`pv>rp;Tw?VX!&MC#2|R7krAFDvSg5;`%DOcX;6 zJ^ArDKPY@d095+*`?uw%!)=l0t4ReXg*=z?q&*NK34JB!UWTYGy6Basm>wY_tnu;^ zNeK^O6c)apBMKTfWcY{Uk5)PWBRaq&veeA{`_CV%IZder03mED$jjTC9sRZc(g;JYRQkJ`HDh4RxFOte@ca9SxTtHpvK8DU zvy9C-D(oMe`{Y*fdYV*79cOCsS(IV|5)(-c%FPJ@5ZBn(xLxoy4FkBTI<%Ro-aGy| zf?VjXbp4+}q8V3(FOpKt>sHXeW~~|=MmRnfcDpnF;`G#))3gc&fSb0;2LPjy0H_K8 zH{dhsY+A@%r&8&Oh3c}S$<-=p`v_5Lj&t0%z3@NUu}0?nKn!$gt;5E#v4I7LKYSXYPxzc(-;VZ z=#=DYjLOZZinXu6OLoQ3!Y#5q^8S`-xKvo=xXfnfReFU#$Aq1&wBP{_~7lIAX|C}JLl8D zfZ9f|8(by*T;ImVbl04VKoOa&*e zsaGi^oCT1YDf<2OhNtmJH4AmP3tSl07ySJEo$WHgNFM~JH32**ASIOm6@pMxgc1gA z+$TuyM-Z0k#jkHA3E@~TUi%kEe>Vv7dq(PS zy?6l2y>%eYK?~{Zmcei|{9$Heizu)HWN{MmISue729P%d$3b#N+1<1+`3^?)0 zh5_tE24E4=2xKSk9{D1BB$|Tz9d#_22jbuj{duesV001Py4vL`j-!39v z`~Qm3qMV#uM&%9Ptl=yolT3v>{*=qo?hImGtm$eAphV z=nkkTigw`2eh4s@NM zWk3?V9GMBxTy_JH`;ejMaTyCjg0zls)g8i67n{A;u@dkT+=CqUb`x}RW#FqigHgmY0G z`L&-JOlKP4512Mn zF(|kTOlg{c-L;{1WEfybSg3xn5!%CHVzeH!?Tq3F9yV4=7Z}vHHizB_IGls#1HsQi zD~BMr3{rE{IIhqLsybm}>(^2GY%@dtv6|EL)Rd)%ZBds@5Q-=~7=U+Vh|2HdCXgWm zv!drEB%eI-@;_uvl)?Tiy7=0I-=6?w!9!&Gz|H}VcE6(NU#R)(f486}g~=FbPiRkg z9rhiYzN!HK%j>bKH<-a6&K|9)T=W!&C|9b#?!NwBIG4JhOsYpL;dKcK^`_d1M_K^uV60mia^^n{NdRX zDjMp~z7Zvuy>ay2P&JQFDcTw$16>Msyg^5NKKUWlfP#vOZ8r^~10tJj;hX<-@oLne zb}%(HC84K}16b%YR6o4DGHox;kdPrj0Mye&UcI75n0ZH$j zgjAXglzI?q^;$^F>*P1#&x<2mIx!E+Sz`SMod9Nk^xlgy=n)vshbRZ9lgK_}J?kRJ zV>ivNP*Im(i$I^ke4v0a<>d zqN$<+YW;9lXQz)XAd9@Yn+CP$uudu{wk@DYVpr*P00Xyh!$+{I0J^FTGZA1TcYOc; zT6;E`>DeAoty%^KJ%=wSenVqYi_o3f;0cb2^Kf^Uho@_6upUjxT}96ZdMQhYIv0p% zg)yth@eEqPNBXG+(~G-DA}lq(a@hR8ztYS~LQAVxkW51mFJL>o z$<}2Zv|1c!TopZ`v#S!%fQ9ezh_-QJ*Ly#a#Y}Q$fjh!5-ua)$Q$i~*JPF6}9?2|8 zIG@W~F&_#T_lto#t$s{AI5e~k`6sJoC!!#z`*vlG#+3Vh-h>mtU}-#HM(~q*ahSbB z<|k;6*7`he49WFO8jk4CAicMnhGRD6XgVK!sc>S|)==|5&V^(K`;{zCkOg+wx8yGi z)-^OtH0f1?wSkKCdW_Wm1~ARorB(`N8_iW-5V%8Gu?Pdbkb}8Y6e+vk2tU!82DU55 z!oq%cN5|R+N}ayGzU<`c&+b5}BewP_E(oGI*~2 z{oiAt(6-h`v8lnb08{2%9#?nCyVJFB+gP(4cfvj_36Eu6E~(HLj&QCDUJhGjYGxv` zo?ix$1}p?*ek-cIAeL5pY&2mz{C&Z5mkY#5S~p7=3DRCvhUl|zp27l(&_549kR41E zu6)o5JefgHCaiEPSZTHK+dyV@3=L`A^dn!-+7k7IsV455b7sGJ5ndSPUO}^Pl|`}W zD##1dneE;*T)=hE83=QBa1` zqg+(hJ@~G?upaRU;b$%FE|B+9a2tof($>151~jFOnYnhfdNrU~lKXv4jmz(Uc1ZLG z{`R)Log6)=6@p-|6!=|8%(eP)JiCCK8wTZEIXm9(9ty!K@kK9>L`20ILm`mn zPf>%}374Y2vsQ-*?k4j97&(JXm$kDV)e(N5FSkBs7CE**_41jnsjhCCL-i?vG7mUqFzr~)bzos#(Y#6#g&1tT^i zV@WZDA|IBt?NsgUgpeRsNVJH0Mg9WvwULSMb%xAojRwNlhq2bqy;<&^I9T0+}v>AbbGH_|j5E zfCc_@3_qj2(-U-6j;xcg?c_@#EfNp^BzZ?iPB;!UI80hCLuH*$)wS;XK#R1sy)6SX zz4bkzt01rz(So?mcBWV8{D8xB4Hes;H0kN-mec#|RFaNV|ABB0-8RkNO1R+w#TVeV z*i&TT81we8bXFrPH-O<>g!oRhK7p6C2;ZJN@g!O03O^_*n(Wt==|B3zu{Cke{|;icw} z)-);q7x_G_>KUT?9P8(higDSx2pI9iw#0;@ezkXceI6>A)(M~iue^V!)_DvEj0*Wd z2LMvhfd`Kl#vC5HF9!^dm)cRAfkmMj-csFjCp;LfO+lIue?*_e1~68&PN1(f_}UEx zH6#&#@$$do<|gu9`HqJKHxV%ONyiruE7x@}R*(Z>$fA@!a!GJ6{eirqJM1;p{VxVYCPJPBxp9kYLGwD@1pgUc<|I|fuw zva+(n{_Ut_abYM|ZXopnga080h}rbM1A#OGgk=7zzOcN1?U=d#1cM!03H~K_nF&03 z;o5Nk&Mp|6w;6Q&k$i=>QIUXV#ZqO2Y!S4vO3vJL73b68SVzS7+pQ3FhW>GE|J35= z?!}3qo(JZRA(aRg__VE-`jeqb4~Jr%1qMHWu+zfALfVkZ=|^ND>%z%qTPlZg$-Isu zXQq^oq7y)z)XoGmNAeF82@Q>>H8aE`NnX8HH$sNBuL(Oo91r7s`$hnxt&BjNUej?l zHvlfI;xY+qVE^R%c9!sH?k2ELSNn;5c`F$UHDd0Ai}Tt^%m?x>XcbuQN8|kNCoR5D z1>g#pC>Gb>2_!o^|0d-5Dki}qaVOi@OQG6 zPVCv=mxmXEkFZup{|RFCKlTOo3>REdY@`#=uDbmBLRafF5jQdzAzqSr9ugWh8Z-F- z@>yCFd9TX+3t!fR$EyO5_mi#3L@hqj&&Wdo5W&2wmaK71xj_8_ldxPOp&OZ~2n|;M z?317GRM0xtL8p3M!dq{HS4Bl7P0%4l_KcmBPts*?kGw?AnN}9VQ?HJoK(FYY9YgOZ z61R0vUSVP4!HW(A-#EXBZ}Ay{#gl*1hXwXeBX;Z<8o{WM>fFHSkXZfXz^%^kt1k|D zK(SB_nMaV2BkRaOOsL>zkOU>U1*}3)y#aj5!2@R@s{JZ&3Hx!vLbT)B0MEBfkr$@w zcRtC=jZ^&7CS4x~8-d&JFWo;CqKj%4U%i4D*-k+BMw&HfVFDhyqh6Zlr`B@;oY{9a8;@odDu5Gi$hK zV{e};1t+o|*V(HOzH~E;5b2F0Kb^5(6*VxUzy1l+!jGIbalYwY z*3Ltq`bl)j&4&NBj7GY?$pz2O8;U_RWKU#J|E8m?Tju*rl&6A)VGXT{mZ4U_+y68Y zmqC5h2^d(>*~X6#;ZI<~+!uHyDVPfMQWY!CYD;GJ?C_phZS?5{Y)OI?V`ZVdFXn?W z;8T*h)tA$ln>R+~Rog2Yp3FUbH9SCuf+^7~ZY||}wl$DL$T-vFM+?1oUjMb9i@c7L zJcwTes3}ktT=Ur<8XQEFE5_W1z#OY-+%H^lNJ~fvnxB7&G&t<<>*~6H-PRqhmcyO= zJ`Dy6JW%*}ou48zFJq{ zA&g!o9?1eKWmHQM?!{q2Cpmy;p#;gL%`N(SMeIHsR|2<}%Z;vH{^Q1YQP-g36CjxJ zPWMd|JvgGOmZ@)(Gz8-dV1`G%i1y9-ai3)AE~x%mPEYl8E`V;QUY}@kd;FJDMYt~v zis-TW;NW2DUd`&7`U0oNj~}z#5l*c($@vf-KAA3Ik?`Q7^x;Bh%xXdiU>VnfX*B>5 zfl5Wr&=AS3MJ1V7v}K8sLzyI?2~&3OgihbTsi2^MR2{W{^1;)T!fnRRTa~*k9jFq( zrh-RnkD(l6`(<$(ne$-$un?#=D>$+**WD)8Xeb1q$8Z($#3QkPz#NZU1p><9DhoNs zsgKlcaCy?Qd8uywN5&4l#-VdR+0?)cj5B!Se?kZ&Q)>MjzLiA+c%1{cFeLGzV6rgy zTp-`_;l|s$AUsHLt>?5TsX51knb+OVe)uU7hM*q8Fk=wlr_ESJo|BvvM;)_Vu@;cI z@2)Y8;JvW$m&4d}+Fn4jU7(&x01`^~<;klcmDk}|fEWbwbPXMMy4UQl$Q`vQpzhUo z)m+9aWYM|7b30Ec30uFdN4v zu%B>E)jM(QUBIEFzZ1w52~5=F>GTsgmng_fS;4jk`rr<@n9!pIe2DrBitkHW8&l_F zAD`o0zMOD87-2m9qcHzA+PS2!tnpnM4=(X_1nDnwa&vPlGp)O<$oI{WJ-A>RvtJ_L zAUrG=nozteg!#FS(LaGf0!5S6)=MVvCdzz_*q+d}tyiVe$kIhek~ZE-nkxga5I~aL zM*T-2t9Ra!g5swOlyxLp3pRsEtJzYpztbe0Xq=pCpu2~p=b~MV&mm05c`f?^C55nx z4M>rT?*jT%pLGm*;WQmHce#>4#BhhC&O`VcY98uj9o-+GBONgbuMI3O=W3-F z(b{-n(%_imq-pa~a(C0JckBGjC-itvVObRaTS#%bWzK7UqqU6hFORkt{XGl}!((G& z=0VI>LcgHgD}A(iN<5`JHMNT4 zbu*41=)DTg4U!u|t8VIToj`OZRd{Eo(YPDvzc51yG#`J-Og?f24va8sf4$gALAUP( zm>GO74ue5xzV-0i9<<3B`+=@o^D!X2TdF8HrjS#!#}xE52;zt+ z(M;Nw9c4Z55v_{=pg+}Q-z;GV&@u2ks=g~%NI_SFeCx~LxXVqpTYM`Cdh|E=__a0r zoP_TIf6HkZRv@g~DIz+4@77C{?!W_r$=^R-1P8}d2Xo8*QxaQO$*Wn57f2e%G8-2B znaozc;kNB`BcP_`9W zoLdD3cZ~of8s&WZO-M*};&T#$?7|k8Zt7KLz)mGm$Pkek$3y{sNM-%~YBwnQrt6*a z>veT>Na*NdpR^t+=De`O1Z_`xpxj|5S_pVq7;1-vu|X&hU%je{kx}H3^DT)NgZ9~5 zS~n=0AsT)tR1YK@e-%97asS&Gk9MW~WZLo+yCo#3jfjxoUH;o|?mqo5|7#A+Xg?r~ ztosY)v2Oi?gJfcHLw*=2k2Q3T(_?GvoW{nq?GF_tYhNKjvCF36)3>s#v}~)Q^8OL$ zRWh&LbpC6zFCoWg2Tm?+x=e0h@Yg?Mqklj~m41Bk=1FVdgRhyW^OIpe_FweK=K)8j z3rCR23kWmV=(Vid-JqU{r=~V59gjzmz1bxw?A&TfSN+0pirq)h0*~g7oC#btsf_0W`Qg z-o5mcckg7=&KgPXu-JF3R{pjc@?S#vGP6$L?_PSXQIwa}M+h3c`ER+u0Hs=i`^wDg zdOCXgdjr21qhUbCb&AN3vnrn$^O{1GmsjOM?Jo=EgXMe1L{`m|W+DBtKR4_?|DsK~ zZJ?k#0M2AS^IK-*drH!v6fJmhKrfP%oF#9moCF*5I52 z$L7k)3aC?U$iD9b7>7(4LM{DiR=BZTbOUr3FO!oMxGo-&${c(iD@6bJrrO0`4FcqU z)chzE06lsAAoA3pb?gCd_Gbt_B0PsStP_m!YAM{ z-RZj;`t^_1*Uh%E{-EBN9Pt>k9QY+7zRM&-jWF^y92wLFVo8g<`D^qG|5``cI61pO z3%?ER+ajFAAR1=?{sD2;<_X0qDURx-LAZh@hfKn|oERm4S4ZD@p_MA?FJuPvZDSNg9U6bWH=ZIU$m_urVS<%kKMhmUqEs; z;_TyCOmNH+RU#nsrdcst&Ry=qdUfcs;@&V}nFJoK~2-_5?`rGP~6e*8A?g`4}kb5G})wCw~U1IdwW3~;Wa zwJnb#;M$qQgxwNFC|lut32|IxzhbF&nidj4SH=U?U1Prnv4?;!PZtth~{LPUIx23^DwernHf6@~? zy9yE%K@p$d1a(f%&M>B1*ufD$PZTH?(D&pyHp62=Qw1`&$yXAHMYv?#zud!fslNCAP@R`?!)0q3R zFD3QPYoQ50kByO5JdN|){)sKfxCbrH^Nn8!)>)2c3VQIcA5h1hKHq(ro*o5^iY4%= zlTB`g@>ePaAmhLlGP~?QK!7^?`g;Lbs}UbywkYVp8$I{fPft(DO8x}Aq{Ksk^W-M4 zl86bYaIFx4kep1O!ygW}R!A|3rkbal!Opv|3|pE=rvuXf9c zIxhf7QC@Eq`*bFlaCQ<$cX+sfsV@WrI?IR%L$k87x-je^uK*eH!+CV{_`j?Os%+fJ zoF(b!coBHSh1g=)$mG7^kNBl5Ae2zE9%r!7E5@H16%4Wm2+th4^kVL2CYyPLq66(M zaklSD=$oYY{nGmt4?(tw-d~=7h{W`A8P`fvXT{r*uZ2L6Vjyov$7Hozq3R`b)t@kS zJWc9Jrs}FrZ6-8fO*nBrvTFXnmU?Z}0HJ)5Ch=y99#ZZR{XHhI?CLH&fJg=cNwPTI zF75cEI=EVFw665Nof?fX$8#3Y9Q2$Ro0$AZB|VZCF6)&4?j53~tmV_Up4fak_k z=;uV%k&3G*B#hgf&724IZ*sR z*c@c+RRy3qbDaA~EkQ0IUjkNshmeqvhcz#+*#E!S9BLnCN;f^54+_0PJv6DWfA+u4 z99i1w9@_t9<{(^KbiWE5R!+%EJWAgoNXT8Iy~cW=%6V4wo1dirLXeKyzY=C3YcNL$ zZESUg1tQb>PdSq4>!U003=R%;6E#Ds4$|{Fi3!^wd1boOpm!C728AatmlG87c}lUL zDrP@eJb7~Gz1)#(;Aon8Es{Q$!(4Ho{#xuYk(0@YcN!IE2xe0K%fvUY2@wyVrrRH# zV5GoCMq{Anp;v@H#tP&)NHqav0ngJeys{rv7=G06Ovzsq0c(e(o8%v}r+3I@5G#Uh z%*jVu8g)H1)EuKN&+e?*EUfHLl)WE)kAN%h1tI&#mpN zV)LNog)fD3nH}dQh}kANEoRq2v!G>Q90gGd7$|yiuYgye4ThnV;HAw$6X6qgLD&gZ zhCGDVP~i@eEy1~p=0j4Ktbm@qJkAmis<5}$YMPsC3|X0D0lA(}ec<1X9LN12WvqhB zE#0C7lFbmSX$-9x1&Az>lm}ML^pL@&0c&n;udR6uCwv_cK+T8{?;yD|P9|pC4DiNm z>4~5-E+zVJpT*yqCQ`&%m`PX!o#0yM=+xoSTzzKd;cu|)~T`6rrQ8^sGrP!=Y^u)7vA?2|b6jua0P zlSbdEr4|GjE@zJtl1Qgt(#coGT~Xd7`E>K;)25TNt55tJ?myeCpKHnbv%n-KEXM!g z*-6ItXLHYc-|FP6T73KaosGlAl<`@Cp&l6y0aXC35jOU?XbJDG?i|~ZT&lbFWB>*B z9(@Go*~8-)>bDJ+9*@s*D9L(Xo=3z_{Zmrcc&R#p=gKro!Y~?pvAEIP!RK;=mDLhh zp+Q&d#K3#T#x$*G`zC`~!tpA*;A$b3I*)+(ryuqU3}7)K$cWocXne6w1M-KsJAkSp zRy%MwV&UM(=8Z72uwWvgm7_P+(stLWWeISC$Bk~Zrd3!VWtpO4*nqXY0L_)JAuQp< z{3l$L(NQ%K$@5F=LykZ4s^9N_pZpEK?q?}A{}%eu^mo|ue1Y;q&;MjRtFnY4^U$nq z-=GG?MP{2qZU4!Fzzw?I}r)juk1ZW6-1!;P$H=sP6y!ewfS?|G- z*q~Re!%eI1SS`pDNd6=jLRqv!M3=YF2!_wV!9bJTqt*L7cf$9aCv&*%Mqy#io6u1;UppA+8mUsP0mx|$E`B~Rq)OGDsc{+50)_Y& z)qIPiQrxwHbZ|~d;(BTU!6kknCU=_9&@p))VM$WoZd*Mwaa3r02b^DeTQ^}qja#kQ zj5ENH2PCB>t=rOokwgFpG@tQMX&e?w$v2G^fXmIyNPed|Z47_An6_2LXZTEkhxsf= zn-Um*c5c?75s-?k5)M2a4YAMv4LxqE_a7=~QUEWKQL^I!GYaKTchPjkF6uiMEw zF?4Oj6cj-;A`YMKzP|K@#EF-O0uOoE5&GNc=rf3LOTT+@?o!!wY-FR|7*V>`->jA{ zbv&p9Qs7khl{C!I_XxvN+-nb2Sgwi47Qw1~veZ;ARoegApYL6%cl?|mygFHUc*aDw z^TqNb#s=n{2SVDN$xgmwQ%ju@ysu!aNd#IhRLP}celzfQwx5r|1iVKoGJV#jd6>r)Cz%gFHV_i!T$ zDMh{m04+P-GCvy3dU8EU_$3Xqe9T>_csYLp$e0RCSoqgmMMb^GFBh}#sFFn)FZJRy z8FV?wNEp<(5oeuAL`D`+RK)Xet2dd2(D|k6-p`-XuP`S5p?VMm+X%AV0!E~|Mgc1ivvB7Nw@JO(lmh6dg$cM%9|o0lO|3c1#qgP z2XnvBU}Xyf}5tB6VcrUjCD; z5%5rXJ}NpIqL?KkFCVf#_gXA{Vr%19yDw;-5q%$~uhh?)%yByUElSVd$NB3=+4#eB z6Aar6fm!B}EHY<{q94C-ORxJTX)>`;Ra4(3dioZY4(uvRyYE=+kAG++NqCZhPko+v zds>=O$-OI}U%(u?cIy*7S6%Np6IG5N%SInaOTu0!JP|aKVbB_*q2TdUuDf?-G*215 z++v~w>$=zc&+?pTn8@p`MbHX6trLN7GJ3KiR=BLM!%BCmY~KenIP&G+bFf)Z185Mj z#G+U<{Bvy}61G& zDNYY<&e8+eD3FCoul|SX`gO0V#>Q4J`0?iJU}gZklX*}QS9$*yMA5@66=di4W4}CC z&U7#acRy+%z`Q9ZjMDW)%>xzwpExj3MbO-F39Ft3+wd4J9V!9KF=?p6fDgaXotZ-d z7j%<@3B1MK#bX`BZCO4eU2wB%JFwjxb7EZZ%arfJ>o$v72g6Rq`xKop|sz<3!kII8_ zD&kHJTYzZqG^ZdLT#$RB(}}v06C}up>CIWM=(VO3x~($hx#b_ zr*H?eNX4vHfQt9V!YCgoC^*G8zWRGXadx`K)i{`qHcW^7=@ibD(99?6yg0*c{Cgn= zloAvD2h~TrjS!KxGDapKb+$Np))EK;0;|Ulnqa_X2OOKk(-R8ew$Tp^Dc%9#a=Ll~ zaG2Zy8K-bEJ672}e>+Qn3W@>Y8_m@s$6Xy*oB4{a!6*b^)M$AfLf!d$cvaN-M-YgVv8M=pn|;{c zv1mEz8Za1ngI2Gjb9>633P$ws$p@>Hnfgzw8IL5KFyZIm$V|6QkxUZxMpfDW5nc2+ zY^ua16V@rDnLm{@)^&Ip9*o|geP6k z`y;&dY`up*@TY@3b|vDb(H^`aw1yBvtAkQRU;vC+vJH?c+zo!q9Njl}ec<4 z79gOhy911cq^_0i4!&0NTps?2ctB7}Pywa1;v^6Do1j~&cxQjV>l4z7cb%QXFdT_7 zUhPk2|I$;a9d#Ua9E4_0X!on1_Hc9TQPkNe&IaxVE;*f~7YLJN=Y1vx;#D#p5R*-(7c5o{&fYk}kfx%i0M!iWQBL*lQhf&tHj*b%1U(i}C!AfWb(nmrW#K#$Q9B!Og ztSZD!+r#h#+HzpeW)$qU?Jtp``@nIp_oK?5RjYzyOUUu>tON%{2g5ox83r162(Stl z;C9DNxYs&7hOM%FE=y5F=U2ed7Q)e5t#Zs#R6Ur1TLyTgVWt3-c`sg`GUHsk)g~`Q zfrp$5VCN7Bm;LqzeAWAKFGXsDx-%tEL@@9FR%U*cJ>M8+@4$%*A!Tcke+6Z!$-swp z2a%a7eRRo-6GP}o{71^aT!CGd9@%8&l1}g~0uS2-zTbcG!yclvkaj0HSYIA0NzF=| z@Deyrpf!OJ_o8+Ijb=KgSuoCm%leUr7i1TaCD+NOH-BpOwV$7tQb-iUhf@5$kgEWZ0?mvOuVb`?r_15)-1WKM z#7_Aa^&aIt1wo?81WO$e#?{*Z9?xdp&di1*UH|9u*Ss?L9lg_^E39e-N&ZrKcbnhD z?~kcbz@&=(546zgjW)EqXMNL)-2z~E#wafSJ?9m0xxQHmmJZiATjn0+y{IIBu}rT$ zFoyPl<*4a&hJv&Ve{i1D16pLBMmGq5VVm|HasHYk@l}%(QG%#yrZjl-+RlpOE@4Jp zW3@g`5-}UC;$`JalCn)~kxh_9MIq%I5W< z`dWYcbnsVr@U7;W77589Tstt2stcp`In+!i>uQp!q6J-SXHB`KhB-J?sF%8M%0|!x z!%)_NE7$1j+xXkYI4;|>;kS)@()3cLPaGESxp`_yiaz-$-VD^EgeB-G=MVH-X*>+z zq%)jvdY#9AklnY_^j*YJy%T{`Ya{Pecq+ocZYc8+xeG|AYRYED;1LUh^SE@_pw`v3 zMm%S8y3zJJyj~}b+`W7Axe0v4G$aNGG(bl|9$h%#4KiQ-Z6yRj+}aE#)6+Q_m5c9< zkTaoU7$N5L!%RT95KeN~;ML91F$tW6-B_PyU_n4or4}p_RHDMEhEh8O)cQ&z0sssW>?PnG!e$`fXkr zXk$c4o#Fc*ZcN9;y6iQfY4cGU{ak={G+xm87JEKy@~m8gHII3>_;#IOTHR+pxVg0z z`sB`^m{=FsHINF)l^V6No63gii^i^&Z;_vgbrIS-P_!w# zlq%iM;4YY0+d2E$H}Rqrz&Eh6S%Xs#2Cv$)w>2#Cm9HYZa0qiKc`4=^SRS2R{N7bA zGgFT1A-Hm-xOVLTnG1Is_rxw~yA)}BDtUI*l`j*~l|s7VT#n)vjaX zJIo=#n=wgecDBB58W}+p8+H_FpUTH^g~Qgk&-G~Y3=b3CC9#@r0<57APT}y81+Jck zc_6{{)fs}E-Bb~9`Zm5ykqes&Y>VoBmfOt9xy`)bR+wjaU^-3ZU_lsF&hqEiopT>P z(*Z{PEma`t`KnA76sWzwG)#B;uiDa^!8^K8(sd&4U~Rzg>s#i$G7YFE08QbFwY>N5 zZykVyq(eTfNhUs}DCsr!=WjDE5POos#tZ3|@qG0%H{R~|oIR)72ir7#{&H6UjWXE# zB<1$!OkmfsPiNiYV7)1CWv<4VeOK^&@6Rtp@9LO0WX9t-&QWU6*y`KGQvVNM5e~o72r=hPBmGf_%WUPc*3bjmQ6KNj^prHfE<+B) z#Mr!-uwg?4JJ|#c&^AJm$Hdt_G9jY903boJQ}}gBqh8kqSk3U1n`-zQL3GF zC(&^iHI&jqE1|JPxHV*I57ynswVJNLZDWqTbF?tlsTc$1JAbCWu5g5 z-V2x;xOa{}a0*!rrCr7$=jt8x1a2lAOjrme@#~xV;g89y5TV*S?uP*;`)?g3o|=bG z(W7H6kO6wM2(UyRzuFtihhIU`t^R)WeZJ=Y&x@$HAS^)ZvT!VXBH3JOIzaQ$5vrAO z`{HcY*=aq{u;T-=qnDY0rCQPsyZt{AVZ!hj#Y=kE%*-%rONE`~aSFLLIriBF#3tlG z8K$@humy=1HO67@6TemVmQ|;Qzs70f4HVT&FbG3z7$C+~-?hH5nz_E~ z6`557=`C#vHH9>BM-9^|5IJ&aRfNR~I#2QEYW=?QTK(uU2F52aQxPtC%q7?5QYuQd(x1`(`DbRTeEK!Vqk4onHJNX3L| z$z^{2Y|ys109D}ScY=2FcVlin@6L2+M-1JNf^_G5wJ+4SX;AyEk5qDF64He!@u^8Q z4ZrPQ^VCl^B|G7nY^I+F^pt|n1dlx*IwO#~5 z5GVwo+CzjMp#wC1Pm${hS_B(j?2W+&iM0b12GY~hc_A|v$?~u-7V2f#j?R)C{`gmBis|BgorBaF z;}h?lY;Gaj??q+<@k8kv0eMgq(SLr*d=s-5X0n`uG>E6GbctyvbZy(?EEVI~#JBB; zY+k#|sRU&)dw1G4>W3t-_)7qRG}QfI?chsmk_PA^02S#)cqFz$DB=_WcY{S>^s%XA zF;-{^-L&3MyZ;T^le6RPP(bR7#!-#DzipDj<&&YT9k(x`CBFv^F63Y>f)$T~COorV zydGt&(p>kw^EE3wAQY}IkFWunUhv%rg+6#%oA4v3kKj`12W#B0Wtu$yV?EAtBvIC$ z^843P$I(`=JuvQ+0!;S`fmBg<&@VP<#-F4uIalZI3wuMFL+mXAQ_HbziO=`yf6?K2 zNH~cmw|kf|Ax|grN7^!yc$j>c+;t?*)1=4BNtD*`J5tvp0Ku*2xg~hKfSDtYC*Z8z zA+05DLyXS~b!nYxFwm~4SdL-?tXSD3&KfPrr}Fu|ogtV*n;u!@Sg_pOo|D z1L@Jq*LPS9*dB>6E#9-x%JKBvd;Rhm6=OaH}0h3I)d6l&VI@VK${bwM1ehE(` zn-&?sI-P*Q=|u;Y1>&0%niG;g@T`(LYY8~K|L5%IXn^T67}s}%U$=G6qJTq{AE=tJ z+uqlXq&tCHB7OiILl8^$=IIVw8LNC{CZxW)9={ZT3;V;OwyDIn3C-5PvNp@k2d zIe=iF`&#gg`%I(jKufYM zu&P}qhHKu$9JP0JEdEH~Lz=^Pi2Ion2vMMpLrQEwKseHhKwy&&twNsntmE2OLtaOt zdvH#NB39kNRqwTje$Ha7pzrh?R6*b`8F8(QlacXK%JFU_)mSdmi;MHUU%wFF92=lB zKqa9M!^&PVM}(mc2bb0Pk(w$Iw+ifJ0IJDl##2D+n9<-JI-$vlY#eaDEe$sNDl{N- zA8^o7FLBCgS0F~ND*TC5M_Qq(#0K?)mJP@hXh`D!`Z>Dg0ig7IW4#GxLv{Ktecn$^rM2;vegR?hi`r}0`$zU?edC3xRT#%wrvuRiHH0V?j^~7-+;$Q04 zO31;=XuRop4g#*cC6KJ;@?9TC$nZWFe>9R`f|n&3aPYt?N!{IXx$8CIopYk=FHabd zK{0d`i?gqYe}Wu1R2e4O2k$vmXN+SDBrfBSl~M5n`R)P%!4RMZ0@*Hgo#EqC2@_3M z*ml+~n0LVWpqTj=ICtQRs&f}Aqh zaHLek?Y(Yd3j(Gyrw! z9<20BU7DH)5SR^qWaT0!e3cn@ULJPkc=S~gl#=;a^lgqIV$g&oK!K6w_rhh|u;$I^ z5t_zyx3_@fO;~f`u#4VSF70E}EMxUJTz?%oT`8xhM;~$hPXAe5-B*PeHV5r@0?0B7 zrxxVtM36R<+vy8I)-cSi`zmM#=x_1VMk0*(D7^sL&YOG(XOBJ%>dlT)EKArd2I;g& zLql3xb{ksZ<3{*#YN3qkZ+QRx^9#Dd3RdTuOXiVYM`#%m+6>#uEE(KC$FQp68ZbUk zUcn)|<;TP4o52LZW39LCw2KXvqvij#&Cvq^jg{qb6&@$xIl z;`!-;;q3Wo-LJ=S??4Z_IDHuxWmNuZXtA9@XA0*-AKeSE3BmMz9j7c;IH9G!hnsl$ z8BErwJ}V}7%O`?wZU`A?cQu{l1DzDM+1Xj-h9TznaHh|L2-WTMCv(YV40<(ninLiz zLMZ!9O>iNM#z)S?w-7o{tr+$-frQfL<;&=(n)VJx_@GGxFDwOlc1LO}TNURXK&d*E zYA828|MFLXj;h$pOv^|nV14mG;!{Tx8ft620LedhC+uqTE0b$DQ()M($1{&SqeogP z6#$TW>$9Cq=xDWB4HoZTL2*BJ(dK82{nu#;;*}!}+CKm=6HSz6&HPEvH2AvM&QU1_ zWu*U{ci^SVI9=avU08iDLW2PbQmVbwF6&BTst7oxrw4XAI9SL53@SYF`()qnW=lo1 z^v&NHP=trkNqi{BtbhRut47HUFsNBB@;XR(lQB`Ku?Ed-X~FZ&Gpp1gGo=PE_gvZ< zHjujM(SjG-Rph~9f6O+4fdb=Mq@vX@2k`-KmSgx@in#roSk-b(f&Ml0yMPI6&^B%e zx~#HlcvdM@+3Clys}Vq5W;l#s^<W$05%>llF*k|4bKXP)4>mPyvB)IV$m&`V4Crxt z_VXr7Iq#`&z{nbDS>WMo?S7ssJYcrcn=oSVexrM(rw$V>uJ>4k8!lLn#OU<&blO$e z&}bwrzQ;S#ex?z1BMN_fiN^&*GvEUioiC~8c6P`HfwHagTi>fo+fnKdC(5k1Q~`MA z?Zl@RkPaqc7M}Ri(yf4%GDnT_TkGo)Ra8*8=iyQF+|@YKg77*lq|V!Rpth3l7%xJ$ zlm&G2$eJ=an+Go*yf|rE`G9o#qT?3jZijoRW8lcbGlx0#J^d*()zsh9l8O9qvY+LU zgphOh%O?sre$I<-hwC3QfJtbQdGz~GMVC)negU{s$Z!st_@*8mauk5LEuw%sG`c6h z`ra#V-9R@5s-sv#1Gm@>oTn3OIF4(*#p~D*v@y$=^0a_WLV^|)XNH+z-50J#Id1as z#3nWV{l|V$fGl2vAK_S?{3u;Ro!jYKXPUfEnT~Mt#@2BD!H-y>#XQ|~yv)4y2o64e zstUqp-cogj2xP#&C0v-mD~)^)-oK9*phxeuhx?*b@8PU#ybQOVahq-ct?|^wDLOh@a6*;+ zz9&>$QMz&-M9 z>@g5?VIZE=!}H?h(+(@FYdHW943b=H$u}F%0|Q{49;*54A`TdcrGU`EszzSu63%ty zOC=^?4^0z{4Cc&Xo9P5K>9eh~m5{yI-}C551zGT-7L&f`c0F`LiZ*4`f>wHz!M6at z12U1ua_-Yi90WN0;?4b{t_kY0ge5R;O$UurZ?OQman9CK53u49lXX?iXvX`4kW-Pk z*5&;e0m9yMn`X8j{V?afx)?M#s1(Eff(|Nw{b85gDSv?8?L_aulcsf*MBQAV53^*o zD@P(HC+FLTC?7-@3zI)qr6PKlo$tW_57>QS((fS~9}n8CJBZ+DrnQ!uVzTx2V%XlN z*|x`e@M1YXlG|b^PBmYPNmBBoh$M7<@L9p@ZA&cg06L^RN3?nL(rw##yO-1d<^lkK zC?JIZh)`a~i#p$eIQ;Ef}H-j-<53De5%6!AIPkLm!F2$^VsUgWPPFtEX?Lg zT=JhTubz<gQ-w8T*lRk?GF0Q=^AWYARMF*bhlqteOdQ>OvkCUyG z`bK5D7Uo5{=Enx8wvmWSBys+&72VDgVgsdxe#sTkyfH>v)DVIUIC zi;PGXxE=!**ADky-5m6D&tn+gm&whZRY_01^Jg)S6uW!IXzQ)5oY?RzU-KHgys`C? z=*x3AXdiKqE8cf-=pg~#L|=bmSWFZok3GJUF%B0G{Pru;fn`SK^*jIm*`2@VzKXPB zi|;;46hmm7_^adI%~Mzhh+P-p%|m=#1n}0zm!mJCY{jCZgz{bt;GA7X0lXv!pk8tn z)vty0n~&AGT)1`X?t*I7eu$&%ee^pP#ZR7A9FLYQNArR;ZH)BE-v0izgSZ(Yc6#kF zlZ1EY%u;-!sQULO?v`+crz^}dM4zid24>VW$Gj>Spca9r1#HW?Yv4tp2b?jAKkejs zhd^^*Y7MzYJI)q&3Rg=S&P*)6AKDi!x5Du6S3|a45RoV<%lq-0^)PAU5j!-V{ z%PoL{{L2EvSJ?u;5u~Y01&kP7Dduj0S!Hnd=d=bVIjA$K^ol56C(b=Ms$*G zZ-_KzAd2XUWhd7afAtRopmOe|VKQKOA;8U2PhQx&fsFQGd!QE(xP~0B@buaLY`c;; zoeUU?9{4nyeant+<6P+kuGl^-wUS}&$tz&tj|atCbJk6pT;zW3>edrMRS6|610?oB zc{g~IWoZ*~BO)VB>*&LfE|x;fhGtDevbrn_<^t=)^AWTucvRx? z#_=L>l70|0e*;iX8a&D%v1o;Hi~WAfWyk~QZ#m(GNqkHNvCKWLd^8`}5)7djO*)`H z1y1PfqrXY75l9m8PinKB@&lKJZ)NXwYn*~dB)`de{Mrd02*j7Mvnv`Kn8?#GV3 zQoiuc#Mw>7H{krYW2V$ zh>IgfM%RaB{Gs!fux)aTPkl&-?E@Cj?zAVzv-)>ngfZWAs|NB z*w}V8Nnj#|G%(0qqdRfe6=U$I$ev(ZV75z5xb%21D9!|+bH9UAdb$GdJs^9rv&J}BGtiWSI z{ObIIuZp;f{WJB4IGRe9|ADyqy!1bao1Z-?7H9xn1ogUDk^Pb^j1Bu+bO=zlRP%xm zPe}JrGN7r&q{eQh!48Kw=fR=^C5$Wy`Q21Fq?$s|l?${*o_%@tu;?eUH`RkRB)r%O zgbC4zI(2QTzJ#6z2%tv@#rs)-_T8Vyim}%|vZ|@sH)d^I|w*Y^^DrbW72WBeBDt{Um3l z|7HYqtaJ=0w*SSU1CpHI=00A^v;QEzeWwCM@4s1g7^xor*N+28`X9gkB@mD1fB&#l zHr@ZjUmoh3LH+YV#R+|zo6b6!@4&}b2YS7I|I+q$9~=DZaO-4~K8^Yy%9n^5Mvls& z_zk}1OCs~Zz_*Vrn%tn%~fx6w_3D2xeo7F~=nmaqOpf!Pl z1-x*Gt$XE({0{7H+pQm+{cWV!JQ6&Jt|QSdn!tB+_iUXOvs{UZq78@wQ@`8oU0YuV z>0f^`ZRhn$xvG}Jo{DuSE1~%031Yhh&{CAS%)8Tbs*`hT!GusqLH~#lA)1A zXKTS!-A5lz&jYMi4v+VtCg(9F~jY2I^=8bmBhz z+-ufhd75ON`?O#egaN=8?H%T_wT06Vu9n=62{DHLB^LC+p(^mP^9Mk6e9gimhbS#y z8>`V^B9+w7#u6?8aHJ?@f|Lqg$ zkjyqPI%(_`0>|L}o+ltel zO)##MV_m+?z|8DF!~?zvlVu6?*jvKMg_`HLMb&zu8v!EG8 zXj%aIS?A+J!>(M_>TfP%GpO$hb#EXInv~_mI@F$NNj}2idF*(2$?D^TW_?7rW2U55 z0Nz2ItLG8bz|htaL1FXIkwea0ov!DvRvO6(L0!f}V}*qfieHn_irBAX{=_FO@iIqVUf~zrr>SBq7tN3WK&h`H_zNP9Eymnc}Y?N-&Np;YDS$-n{dib*%Zl^r5?P(a}d@e8GPff6U7w zU)$@2)8ptZp=B;~d0xyp?H;GG`fuZpiUbaC?nnQqkHLMOQeU^qy{Nsl^7PI`o%W{b znJ~exo+(qWsd?6!Dd$OfFeEHhOA+v+gZ{~5{Wf1|*rbO9$N;u}S?1;+3-d{E22 zojfEcK#^I^81oC4lJ@%+UDcEjPV|6=#E=<34=U{C228R^Fc>(J@MzBdUi>;fHmN_M z($i8>_x190-m@q$%;0!Jsq@j20-v;(H_oxQf6arAJPeb}SC>%2Z{t}qrGi%CjMHHP zQyYb!CgWV?j||>++O%=-n2f#LVRnK{6~d!uD)(^&`XaM>JSs;E;rnpwGE0 z;v^osIB|aF=Fsk$CwcVxNrFL}4pHeq6b_f+J;^mTT7fbxg?i!=1>QQr6N({gSnaWy zItdATmxRs9Vc%&H>B`nE44l=Q|6$M2LH~w`Oih%l*!24mCVJiFJl|ctso5W&Pffkz z7_Nw5y9(Y(xt&Z~m%EVwam?!Yz8aF*M;>kbtb6wf4E_1s`<#2D)!s&-dyLroNAabs zPBe|}u^UTD?y;#nHe?ehi{`c%ROH3ObQt5ziVoO6AK6M3N<3l4mZr3ux~bYluCGO# z$nIQaXv)U#K*g6t+lD*F7Az1i$T>#}QwJ~8Vn2>VLa%9k4+4plZdrVEN6Rh=T(9(LW`H~|4{Ii^mwlyFmB6SdtBQ1O<{p*(_@}R9p1$k``0LeGq39J$yx+7K zI|KsI=S-7Af7kH2``;^A^Bp*1U7&oA>ssSdEy1SUxAx=qHQx+}i+Z8Ls#o!?kzPVVuUR;JZn_^t48AJ0K*XYPHem?V*v_{v9C zRx8O+XWr$cVjFvVjZHkrfB2!I zX7=0NIC^o)Sxf?6yN*9Iw3`(Z1OgMeM*C}1w+l*ryqM}A8N1DIdC%uH!z*OcPgs4K zQu=vdNmz|X@)U12SwfEW2|?!h%@eA()rxfwXtjKC`zwZ&|9P+E`)mV&Orv{sxHGcF z;tCXoh4KxaZ}#{}_2+ry6yscSwp3;07+n(_TE-k(NgKpIWb4mwcI!#X84p_esQgy zIa?0o*WT%|ka~())uD5Agim^WAAd#wp@Cj$WJ(k#J4p$jMm~RmjH#pkL1FP ztxx{ zoz;Fzi_Ok^^&$0-*0qc5{ObqL zM$Z&NgTKu>ISpKqPGEI_n{XP$wh8vdAyhp3wAjPAHD!bITB0$_`uB^XTdEkAeRO-{ z(B%f|08RLMRm^}Z@R^tc_qGG30LJR_)>r1ZaUu)`!nahyZA6zy$TyTN0!<0oIJOHg z7@t$i(^(}lnTFw&Gp&?zRSZ4*Qsd|Mq&5@h_LoCb*il%8L8Pb-w(#D%g@ zq>L3Uw_Qup*t}&TsU>{7J7~o@?|p+Gy*U05K8>`i-p(My7km=C&TqeUa847QfirZa znd`JdE5uYMtbEr(>fu27sI|TGV82iy-)Vkx`+T!8{jR*0-$em{Bk&h?5Dd0R+dP5- zVX@pk7Rk4{cGl@he1{f$1a@SuLM~OBmD%F!!2fieX)GbS#v=DolL%3QJ_MGz%Y<~eH%X4F*$!sbdt+&*ciehAqn8!HDENDvE#uBAMwurwZ1OC#zo{#;8C-B|tRy`gR zrp$O~YGvhoc+@R|*DM3$Q!P5$gWC)%71;*W%OMiI`>>vbgr~{+zM)uq zq+BsN!MZF#48^Hciu$j(-L_Enfx5w-vbzFnQmsur|B`K!`H-{x78K7adY65 za}avneAPgf6`y&|v0PH6fN{dvbMwzlY-zWyCI+S(tHbFT&1E7xoBA0Yf{E#$cRQ{+ z-Di6w-F7eB+U2rZXDOR#(JeqxT*Xu>o=)krH^yViFt7Ww zqz0Uj7o^=l51`qXZ=)MLFn`C6d0A~IIrr>lnaMuelc2eD7R(p#(OvlzS)Ieoa=8k2 znL4WO!AB-k78h;{GF<52T4)alqk6w*{f-C|BNZz?qT8i{)}Yr;lU=QA&i}289z%@% z-{hCU?h=PMcc<>Qx$W!A=ch%=p*M`fSj_p%*2zti`nkBO8) z4@ls#wbFqJdLP4$%@y7z|u zo1LIt)nX0%^Q@fD1W(Okifo3G?M?L9J9dX+(JG>>NepRg>q|1dDrSs9JC!M3YvJ9j zy4Z6$PSh`Kl41O1-+DY+$2>Gdd_Z)ZHhK>SQ%kfB^Av|MqkfsHDSEGlygegg+q#ME*+r@1_p%lv z)e896%PG7rEHNBsPphQm>l1^S+Nw;L%e55aETka^@Nu3xYx`dM=ik~9`c6s#ZWvNohs+)9?a?avaI8+txg*P{6r90kN z5-&a|3)Bolcj&$AK&ya$j@ezn(MK#Q8~E11NVuE(s5Cdmg_TwSe=lZOHM5?-i_+%_ zUX?{r6!*9On9OH{s+p7$d8uWd9oLv8W#ld1J+m%WiyREVXP$ZShMpsuqbplejH^7A zOvW$Q*MZG$EPG+oc6Rc1tY}k3z*CdoC+9n(b}vppWtjF;jY_^e3Ko!IJ9Z#ZOOf&{ zrccrkMN|Z!g}#J>?m<5GR_2K*=#72@SsDvv1T;OE%9bX+Fn=VU!GAXk=zd^`2HutT zL244ssU;ZK?Foz*Bwfj{OpX0x-C-0x_5#sNQ))*4J0(nc^}y~*eC_wi-!yk051{VE zyqq(ujuv)nx%;fw^3d;h=QT^JmS5E~Mf&Ise=j^ycVXytak51CT8m8_giMHz0u2Sm z7i~cEr2W`Bk*G}2W`+ZrS(Mlg+cJ zUa{;@d{a~$<=GSLoY5)1@~df*K2w@t9Ul`N@8+vo>Ya?=UUif!Z+30hVOp5C1eABt zKVsiYjBz0=J`y3ZL23ddprjAM_y|763b2b1QA&3Vn=i~cny04|kK92uQl^=&Vhq#V z>C_2%Sy@aNm!s&nF6>sogTG$sER5A001Xn!@`^?*4rSditgu4{#f!cyb-Zs+@)aaOvtZ zjn9pt!2e+cI~6_dAufLvg(*cO}?vmFF9N>S|( z#%+^pN@2XWpiXG{+Qg8lmCr|O04)kM+`f5T8@s6v=-VJA@1P$*cDhJ7UF|D~}*Db=~z!-tu+9)L)4r6N74xCw7| zeAnxTU(Jo8N~|o`LjTOvkofvq{=iiGDYBHxa-#sFgbYzYd!21$IS8Sn5F;i+$rB&P zmnwu2u+qf5pMWoLAlyX0P9TIyfjxK6oHB@h5QTDEXD2%180rhSqu2R+Q3OeTJ4~BbP zU7oF<%K|kc1fBIV7(_ja(t|;D*E<$Mn8R5|H|jONA^6<`jBcLSj*m4; zjIO}NMn`=sH6=_-OZ!1}N~8a=5Xhd`SFYG^YRjEM($o(skR0zR+<1}Jf+bfv2GW^4 zv?#apF z>T)$-H;psS$jajLrS>%b)&uTJ62N^3f8sa^j1BL;R6)m z1E*f$3y6El1($jeeW7DGP=)b8JBsoFIujnXU@zkU=pu?CBnYV6?_56(!oa;ZQHT%- za_uk+Lqoy-*aGBNWK8lxF``HkwhBJw77 zi#Ks^6T?^u(Sb*I9QQ!4AW%22B2zLTpr~TF%0G+)Ggldb6i{L%E z=Ah-1_xkOrsF5k9xLXkvc=mFaEJ5SdXK@DKj8k%JC>;yB6T9_62HC>dSAV@t1}#Ei zE356%Nm_v~bOPk3=$IG`SZW|-O;ay6NHU%Dlg=GmgdsZO$O}|_Ym*IZKgS~ zT2k=k<}uWlanHqmz_%A*QcZ@&Q*H1?4dyP0T1jNWQXamoQqEK6z_pdG=vEuN2(X$f z>A*+ky}^dqt!Ck6l+$WC&O?sI^HrxcsDJ;Ze(@$~)v(uLBQe{%uqfWm{gr>P-yOKbvyRh`OVC22X6kSx5k6ba7` zcY3y)#@#Xcw6!W6RJ?YFBoaV+1^yv#Cn7bQuLF7D`ds6kgGrbu?N6Gfpmp6&LOkxC zzn4vy0(=>m*1Z|la}6^K^v*E2T_4T4T8Zo60|aWYVK1_pyxp-fSr-m_atBL_R|~s( z3LiqS1;t$pOsP3t&_Jllg2ea2CNZDvI$Kk2Dk?DPU-5Aj*kKG7$}HegfMqE z0ZK_0h?Z;YxfUmde30046j}j%8b9ol^6tKZSlN@c?FlTd_b7U0h!q_{O$l= zb$)@+ny+SD32X6;0VQMA`@V^pq$f%yo|;!FDZh$TTzVnnQ}40TqIu`*n(j}w3FVh+ z{X%b}qI|&i=G%E4WZDVdp$22;0K)72@^F+;8{R-PbPyf|4qBX3uJ*86>7wpx1D4+SHfxCAJTp$W(|G8ZV^IJWMX3uEG^3UBAgZPwGH%2F34s_!ST!05Evq;5(C@1 zU$dT2*qc%^p+3PmjVjrR+b@Oq3!s-600A&h&*|00DGMS25`6_lDIyqyrT|Hz?scm^ z`;JI4z@F+`y{8cSABdT_57u(9k~;Zx-d*$w&CvrJ_l4KK|0ll6SLgeIV>;x}7XSjS zQE&<(v-{vHQ4E%b{Z#CxcbLoN{E1fBjK|+@*(zWc@|)_8hHJKEDw>L`KMoEHE89aY zg%sQJE?SA~0-Y<%OPWGrG~kq^4NSDAv^TSXB7l%WYYpKE> z(2ZPJ+JP#POGjXW;(J;P%i>0aBE4zW(ht1E`~z5D3tL+~IUFO3k{|*HGKgvqJ|STz zJgVR%)bz7#UaX0LfWX8+74+6oUsZq*QwQh1>VQz+1O!2la%od!%EvmW7n;vR3}-ZH z)&t43cTPLZ2e!W!5O;s2dGdijSdE&5gd_?k$slk|ifw=qeyBz>XpXPl9e)%YwNnTD zVPi@mWN;5Yk7@UUN%CfR5odW=#iZ3rS2;bJB*^?OG=Hb{_4jb1E2eRWUO=W$oJfd|?`p%h z1f%9hJ(*22;nYx_!b9H*=N+1n`|gLG&&J`f6Q#pZ@eNdlK6%E0z)z{9jFW#jkfnrO zUe5XA-k4T&4-1S`jdaos9?<|1XuHf`%L-I(Ae3sNNyLg}j0q*d9QoYn?peD@Valw% z-v-_&2-O9)6tsWHu@KyFiQY1c@PJ&F37A)U74K*zK#d~Bg*FfGt}q=I?-7frEGN^T z2(ANGd~A>N#lgUx-nrF%&t60@7R4Y#QTPU`5{Hm6Lkm*g_fQ)6LACHKR}~)$H$-rO zsMA-)kofkid4)iG?AQL#R}tT^jA(fgFYxwxg!GB9cA-cL0dd{})K91qlfOy4cIpRp z31Y5XmgaLnB;+)ShwBrG&{SSsoFk$mpS-vVh;Y>dc23ltYoRK*@8u;f>hfcKuMX&+^l(rnu_!G!P1%ZrtrN5crY_pK;2#V7UNYAJ9io$g zQX0H9v4P_SW>KL9Eb;`OpAg+63khycB?H^nzH^;Cb>7+O>RYs~*DN#fK7-)kpi(xy zSfomz0s8~jRR=PyojmC(&)PSNS%$h9`O(NSF}GU|z&U><5|NT}9SSq`iHtD|`|}g~ zjwbYPb5wiq!4cCj*haSrbA&zc{?q^73k zkz0*$K7wP;ruZn&JVDmB24Dz-!}TGBvmjz7q({xQ9^Y^RvBiD(F6oV6*xg&8ffRti ze*59E`3EeI5qtnKJq6Vl-*nh?>-ZnC&4d+AMd043tU(l8AEQ2GJvv~HJ&_$cu5tZ9K`K-&O(2~Wq(c)uHxlCuVK_*&n#Zh(0Q>$7*H z{z-f$pQES3rM~t~ze`B?iWhPT9i7=cuKol9jo2zxKNpKTqNloR6D_T2n-*0{zGONLJ*G2XvGnaKF(}J)h=5 zR1RPg;vs-oQlRvpf>{UA3#flXAx4G~nDwxNFQdHn+sWT-w!;$|-w29%^AXF=pk}=y z^_m-P3Q%=;21*~oykp8rB9F2bjP)D~@_ub!X4merK zdPu_o3AnD1asUS13^#6IKs!`DffW`(9tW%V2frZsm}ZAz4svOrd+D^HJE(xIgAUf3>VeH< zNxMajd)7;6)>ZZ7M?`zk?KGD_0#nJ87R#mcfs#hI%I-Dqo*ku|r@K4!r#MKS7Rt!I zIi4$+=P8)7hF!liYomb_^w3Z%fnN$@xdDB88x;J?HBRQL4PfP`59Mqg|46en6h%me z0D`Mjy8?F7nysA9XSG31k9{a zMt^ic1RM-ka(=$qx5{~o44N!Ry+$lEK7l2tLez5=2(1f+jb0xLA7Mxr2X)6KutY3tXPeswF>b?(qqlkV?@XO8&(4W=0lOrWsf~tQbQE6wm9ZUxP)qY-?n0TlJdiS% z)(alRw_mMw$M$@g(DL%Cd$bKk54_L~mNhr6mm#ZPG?sl!lZB?Pw~BD2Wu6_M;t2rJlIij$ za*h*GhD%dZGZQ9{Pha9do4x$do&&+Dy+JGFolje4VTR5pFQ0UxH;xbhgL&LE2Yk#R zLyh{jFIa{e$PFnfzU#_;mgMTCJY;H`sQooN#*2FFfpzEve0;9E-6!|3z;Fqe%!(kK2h`F6T&OXP^I$tlO6&6!Me+ z3*t)MaA#ZcK5!7jm6_)Ubx&zA{|K{Elye-Mo_5;*Ep>nA^%G4hYY>v*3{j8C2?^aw z5LrP=DB1$)(!1tTU^N5gMIt+n6v5Pu^y1)g``+hHaVfa}8ykb)?-CVl`aZw)6WcZ% zfn0@^#CJ`mJwwxYumH6llEhAmf2P?INwW>7TOH-$;R~&}k%$0oeD85?;TG%UR3J=s zJ%{o;hXJ5=p)@njw`e|9XJrEz7{lX~;kFe-Kt51<28f#so{E2Latcd*rr-S++!US; zqcDkD7-;h?X~Ltr2%^O(9(C8Ni)ZG{z-y7WYJNKe0RbRbQn=nRo4}2lFaREeeWZPu7ONicRdv(*N|0{|2)f zi~hZj)Q7hm4iw_rrOJ9?NY9A*uE5DywoSaURU-LD)YOj+sZ`%&2nFf#W(nT!`^w`+ zPU=hPOX^PQ>+W0d;^ww{arH-;3```GF10FU!>tI-2{LTi+@R@)<S^GFR7 zE@P%eB_;24kDWGN#rc=gK0yGzxNv&*>HY%4AM|6w`)(mM2?lYn3*F{JKFZI>cVpP# z{HCjl;{q{93*@{~h1RGBwdMY}Us+IxX~k3NIASs%l>F)_qP-#*#wxR)KWE0BH0pVF zpJNv@@D-L(?`ydC>=aPv!v{mir5m?ys+22j1g98lc|uS(E#GS?wdN0R9}YZ8n8I0h zYIzCm@J1pZ1#@sl`T?fL+tnXMee?YMhh4eSC=AA_6j>UPQnl`kvi!X=*9G7AbZ^3T zX<-Hj)~+b-x1{^S`D;IV<@@&)ppc{{au0wBl8v#jlqDhb5}t!VDCGS9D4tM8oJGK? zMQ(p?AIDrhoXik?k9c^enwBc#ZOt*myDpU0qR034SI z*7SQ!j(2&teiQlunRjd$!U-gy0_Go%%fE@ZgB!%{*8;l29dzbu&a9PvR z(i(W#iO7yjgaX*i5e%5erVijz@NoTA2!9H|?7cr0-Dn=Ndf%fH>y#LIzqRJ`i6WP; zk@jiVK2ID3vS{~eUw&3rO~cOmtq~g4HtEuZ-ir>ZW|~c=9BU@Xq2Y4#mfZgAbm!QM z%`#JR4n^@7UL>5UBa>w)j^ZIZjdlpK7KJav)FbWsuf0S832<6EsmgH+%u`XQKs6Cp zvK@LoRiJfpd&fr)H!S3QnwVN5pJ^?Qp1wD{<-@ll%-;{UcRt^pPiI2R=X30OPElK1 zYx>%m>z=GrSO~ZG`-Wo|rITEd-xD)oG3uV=4`OvXo>-1aernD_vHK`}jD=x-XU}Eo z186o?6(4eVbt*gHb`l@8zOwlhF{f7;{$A%v>e{sQp6S+vqpPMe1PES~iS+v$j^Eoy z2j{`U)gI`Qlj*++20{3twPXcaBaqHISZ{O2uOpYgo0hh@%);f9e=)jUr9VGvdoDB| zkoU`n0uc981OO#sv>UOVK=u!|PxYeFQ(oO;@8~)Gs#6k!QhqPL`&)|vlSD*_jf=}b z<{-NUP*p;=Xxr)3LsoG4vwTrP8kPP6cPdhg(t)XN{X@w*r{lMIzk^x46a?I0#&xbnif`3xe`*b97yx3|G;Fa zYr2(?y{;{MxtMRZNQ^)xG98U5?&gVB1QY5-O?r2cp8~&gPYA8^4LO(9ZovRH&fy?) z+R)&UTMr)W%6+$O`*wGRP&Ijvsl=1VjHS?}s~w!f*%$}6HA16hf5GTnjYZWi&F3E4 z(2vjg{ayA0AzOA>z-%iNF#Ou_=P=FUTX&%##9Djmi!CKmL$|i3+0uKO5E8Qc+Uj%x zvtoxa{((Lt&;UJLl%uzh=27E=5Grdogrt`)U%4TO3>57aG6T9hUm+Z1($a_`MbM}y7nY$rS%RPdE zZ{O|=aE+68iXuGeWM0KznCN74D4u-XqRaZEme#EtsSh7ro&F?_-`+$?!gX2=?AwcR z?<hG4L=P)rVbNV03MxND8_|l^)c&cGU*jsK5pmr38!^*y{uoWK&i%5*wog9 zJu&lK1uHhP<8#nYO{ZI{@1r@GKN*YiJ$4uK(AoAe{+>!*mgu(2f&ww2A1XyxA!^#O zIRX;Jn%Y{kINNM-m$q~YmoqKrQ23Wc5=lIwv3{loqXpN^YiXj3r!%CUPIc^l^v?gv zn5c;q67_7wqz=&@Dpgv|HX+_oYOy19%|t!wa6>K#u?W2himKAZFAA^mT?somQp2a<{n+=^)YPSuzq&sA6`tOAR>ANrx8M3A zTQ=8KgM166x08chl~>Cj`PtFMG2{rmbe5ujH98X?wnf1cx}cF~t;u7oLTRDfe>u`l z#3Uia^p9%Vx$rN{`AUoa++CSkbz#OA7{d)T`8X9lnQ`q9aL|-A#sKT;MheZ`!BV>~ zbz8`x$gJ#fc^3h~gVdZnrvXxW(kR8zxcMQ=LIAMn&IEPy0BYv;nUXTgd;L%|x~p5a z%%U}m7ZVPyc>YFHiIYadsrv;#QL!U@Z4hd8T=+Gaub$iSMJeyncnc@x#-5Zu3%{o2 zJNeFh>jhV)tfQ3bq+HG4dK~{5@-A0uH3lhaza}rx$oM3tNsutZDx&#ndUr8Hmqpc(cuns{kAvPRy4g9|H<@7p+f4Ph zh>ZEaJ7!)X7t3X^wd)!utZB33Cr^DA9O6A<4N}S=XV{S_Rt2A?KP0QSL-Skkq~KAM ziHmS$G~w)>goF@$a<`{5sG-zwLijh}f9Pop{6*H>_}TbCDx-6x8S;g^P%-d3rphY1|=G^sDuHJ^i&Y3(rAn z)lpGP5ncBhAF1WH>FK2L*0k}OUFTY#_ef_kavfxCRaz#(FB7-oE#lrmXUU_?`bA-3 zQhM#uXXU@Y7g~Y$M}J!=s70FzS2cnD$50>H+mfcz8v5{Kx+YlkXgS znCyemKZ4&5@}O23t9b@PPdZ$MLd7Y#o*rOjoBqIYnbW(k`}R%`U}JU){QR}wml2cQ z;_1!AEzMp#r&OQ2r$)@{MoN{E7oxZMT=qQ^^*b0h>R?vuW@-K7Dw;^ML_1C>>aUFm zt>{}tQfz$uu^(*gKv{hZE|0KSk1$^xAT^wAB9e7Y>}=;j#RGZi->ti^C<2()4tH>p7rqlKDP` zoU~>^P!5ElBn&EgFuI>GA&6ON=WK!}Js zoG7y)Ms`^q?)-dj7)oYfUmQd*>-QXH#PJiGrXIBs$wtLHEXKyo-EyDCNCk*HjI%?d8cs3Sl$l#qH7-AN)G0ftDCSC*18kfIKA z@nTT$P>0@>Q)4F^J>%~dxJ?j46?1bI(EqCiiauAlkw@~v*F5+f0HlzzMU_st=^_wm z7<=7AFW3P`iI@xy{edMWZ}1dC9<;zGVP~^g$D!c zZH9L6V-Fgbn~TaZh1fcrl$Y5^yT9#=f^N$Sm0_BT=6XT!>!^uH#V@GVqOk3y*4!hX z;RD1y6Mr?JWwDZ%_E7U~;oj^Nz5@pmVpMIBUlTrgqUzmmuSyick<;Wz#5t>k=m;Ja zZlvd$xWZt1bx%kQP8}6Id01^P2rUthqZUQOlR$L0is*RLxVmH`J4HGO`_ou{jx&by2os(Q)sgE(ca z&aQgtzrTE6^d^jG(Q_c9h5P*4ng_x8*lTS%XV3p%E`YJ&X0C%ZO#_QR`g-!B&)37( z@~NV0Y&w!1tlf!Hu5|OfuE!c=7__1CrBk-ZiMB6k5>`++?dsnSSCC6fV)jOKb6N&1 zabY1@mmNty7FocqPh=gJPekKm`0ke%w%WN}9PTnm2kYK8bCw!2_%261iy@se%zG1v zG~}sy$yVUB@0*)zF*lOPtqEgd0&u~1953sHp!Dq`l>aC7IV=`l5sy-N{pX3J*WfGs z?)jBTV~i=;_8&%*TZax#9a)ld%ND-J$K@ZNdi5lo^(`vHk*S{hj#7mHu2flsj~$Yd zqg5*_?yaaiP*~-0M0O_&dZ_1?owZH0P&D0tR$=U=jUgs&=oteg3K>4g5bJZ9SV-&_ zbz|f07@PDDNm&NEBod$5%RNQ930Y_KiSzR)lkAr7Jz+Ny`V>E%v{yu=n(eG_<Si!cgS%w7TPse`OK7s^!A$LA(HS4JHTfdy7qdbk5hgjiZnK?3gMf| zalknom>P20)6HKtW#H(VzC6DL`7qI#B1{X}HJg_I#ONtoHh_g0c1rCkfIr=2`iG_^ z?hmyYIKN(7=0XDn9|J>t@S4V>Bc8@xGNXq|vXk^FH!2L|J$qA1t!EGoia!5m!Jn(! zc5c>j&N9zOQ&EaN0=~ziKcct6Aka!tf0RMkVdBQ5&`LhPdn2T-D&c5Ia>4<;4hQOP zN=gJUS1TY7Ah?HXTH$JK4waBCC@An8xvNRF{3$7F7C^Ri57PZtA}sM2O2igTt`aD~ zeJQ=B#Qd{nX6!71))oE~M483;xetS87&ztbyw-gv85Nu=?ZFb1KiKAduElQf+i+X= z6w_3a<)z+R$lMP4)<2K>+v@j+GQHQzN#d3jiha~^jOo6!<1!kGzh|pU$G0J+A%?IJ z1PrQRs)6|S$B1yr{K8YO!dtA$O%QU1&T#J*3@evQW{4KnXlWk3I@ML_xfR^Da4Bbk zutj=~!J(jlSpyf+DFK=^{5U&R4bfBzO=p-c5OqB0XO$=Pl=$C#o%)+Hh+-l6S~)3k z%>Dznqr@ir(8$O-r0h|x%4-Zr=~clau=kh-K2U>KqaZ~o&eLW((v=CI3!FSE<}0_x zH%dQTht9uT(jg+BL_-%)n#g>U83#Xr2obrpXj@)&y{2#JFSkxT*{s1|XS?^Ny_9Nt zcee>)YmaNv5?2xFTwJ_~I3^|dW4mD|5pfvxaD42Mu!#1H;{4?|laUqQ>3077H0hJJ z(a4>5fX|+udPR?HjWF24;G&a@^xvcqNqh_ zV)uc!=Jy&O;Zb0>V7Dc^qnQ&_Z=;5ZFmwGrGg9K!FvEQl7kz#vxEyRZjloq|nAAZ5P#Vk0=4@BFDT$ zy0CWyd5(_2P8r{00zUPIM02ms%5p~gWH{I2(PK)6ele$+YJ6X6?Hy)t=eV%Kz^i_f zfr6A98|^;153O|;bK{84{`u9r-q(muEZz5B3~soRK!**D;DlE}gP24)3T)P=r} z5n+;jY;-M81GV*C>b4IboW85cJ^1u5VY!YD>`gR?NF-tyyy9~2C66`xAFVh{1+Xc~ zEuV&?Ig8(osK4toeoafr)e{{VNd#>&gsc!K7TnN(4OSdP$wS!7U`FOp#DV^b2S;wt zem?EOCnB=x(5j}cp<(p5@~NKJdbm*RS7)m?%U{?sx<^HY2aMMts&wS#+%C_}N(d7{ zATv8UhmrIU)MciG$3#mnxuO|8q|4u}+wZ!m9_N|MJFn^Jr)b;6mb?2o*}A0X07t|N z(aG5A0bb1>t6vp=gf=z=s^*5m@Zk5j%HK*n2xuh49%p>>A7dQc%*YeI!xgtlr;Uz8?f$HR=5FJlW! z)pUN-7f^meUn(hF4AYTyOLVy9-Gf+sh6~8tg{RXrGA%c#%hRU{#lznZ#ee-l{j;T> zcdZ9zX=05&Lhpezk{o(z7GRQF?3qieKsQ|juD~(kvv74asEKZ%ju1l~ka3M34jiA{ ztk2!5k+;9t*48%spZ}iiaeiUy(_uQG01{9%P$X+~(2`k8ftG5bJ)Bj9Gzmz{cO$>x z^wZO(YQnV2fDBha4SV z#f7Wf#Posd>x(7?89IcCs|rV`SJ}8BB6IB|X2lW|o9=wmf?en$<+|qAuz(4Km%Q|m zykRtz30*4IZMRPC?cx@|$js-He7R zr1ieJvI#c$#@rS0$k}m7Q(K-x~s1i!{yYlcLWl5B=XM$Di z#cf)i$hN`FiFw(c2jDcoP&YS@NDXiuTQ8xv=5j#yZZ9!J1hfFcshuKrryShV0ucFn zA0@OPCN~_-RYXSI|CFLXjANU9_qJbtspRE|tsRjj#_y+$=NPSu#(?yjg_lt` zmJ=NDT){B0@?YOYM22bforOHXGblitRF&J=DnaFzS7ej)ri#3TyoUyf%}6lx_4O-C zDaDTJ=)~?lVUXt~Q6I47wrFu*K`3?2@ge?k&*U_@I za*B(Oe*m1g`0~V7j7H|y6jTA1D3gI=G%z7SNm5dh8P>U5J6yDZieRM4ZQ{TI984zN z0nfAs^;sB*6c6xijma+9Qw9gJWVO{rGP-GO|-14&hHxnPl7Niwl_P8`u*99jb_(HP5+D?OS;s) zy?MSqYWHsbwX3iYq1sN}P!@`GQ+_!M+_WZzb)r!V-l}}R2S)@AC?1}`zu2pLu715{ z|Ea>@t%sB1+Ek&A##3Ol>G+z?W=p(Ryh3G?m9O242{-_;io;RRt(*LhI%UadCs#h*nF}wNk5C_rxZJLtYI3T1!U#C`*v5FaS6s{h_cS0msX$8q}KaF6wNB&s1Y5i@;65;IrH!om-V->Zv$7=ul^f z9T%OQxgGB`k#I4-L29&6ls3ee#$Z^@% zai{st(`8P954YpKtdknd!`#q-Mvs9WpgVEWv0YMq=Z}tIOjX4k$@5!A$l+Ha{5L~c zF#^;xK^e~NRzQXVl%$%jiSON82?G?Hi8SV$4D3T~&7kMJ<+LrbCP&KVyWwul9C%^r z=TAEtDwz75W4!5xP4lenZBj$wW3=Vn~nP$XyHU5HK#r1H9_xq=3+_SUxLJCV&N4W^BvN&4^JAeU!EU1N;G%E`4kluIeC0% zDIg-iJg@q!E5IXUZ!&QacO$`s6rULflPifdk4!E+A$WBC%R4_6@B%8QP*V{HkQiKs zpv;o>8@LI<-HR7BtD58*6h-I0aGoQs0RX7js+=}uNahY5DpgN5@dK{UrIK`teU`-q zzoi(N$XqfeWtcu{asPS479*%Y)6q4W1+4V*N8jlp{{4;*E2L=xbN31f5kj2AYbBk` zZ+`{v3XvAGyAW8ysCjp|x~hsuXFvq#9oxFyd+ z##OBI{R<8u2traHMo=*}`(gm@9(2EGJbGBy6z|R4mRDw4b5YAH`Eb4l2t2`M6F6s% z{wy(D2dy|jC~N>=$#Ap36CZyQWvqeW?-axb!rbgZ)TJ80m2z{wBM-8&sIb%Slvz9m z7_tpiYBGxEXNF9tqcPSAU9k*MAjH3?NcKKt*mOMV`_Zt{9f8VemE^mEWVFwc)^RA^ zhUOC=gIELm>?Ga>1mqX;l)WHlV2HA$g_g>nmEG`kyl^rPkRUN0Wg&wYWkQ(DBguR1 z6B$2F6RT29^bt8H_fDOQ#Z)Bw$ifhf%t0H=LdUc-E!+rOI}|)b1&?0*9VW^CZIOAKed<$oH#rq7 zHe(x_i7ikxC`oi{KR_G}l(Mdq9L0bR>dX(f2y&aySqmkQ48RC!vJBr+m`quvbav;y z^XC>LS-o2y>7})FCpZk8+qgABnwwr~X)9HR^WmLxE8LEcWu8x&Zh(JX4klOjRR-pB zdHg!ISM}!9t0e4nkOtj9x}1b#A=1v5^26f605x?b_m(ILAVQO3&#Dy8)fm5v(AZ7* z4x<=K&&mpt*VudUoye9+uIdE#BUA3%G^uE4!sc%YA?7vp_ZWJMt`z`50W2Q6x(3?D zv(F2lT~b5+Sn+rL>t6~IZnGdzkzP9W#K%;5pws8kIs^S-@=s^AZJ8*TT;t=rqEDO_ zZzK{}!af|7Gig5z!y{J(Z~A~C%E>Bz+$;h*6*$Q-HYbvKq6L5}j||kS;Ucf}>sn`- zJ$nutZr`r?JRwVKf7M=j84>F8B1{Ddg1mD8(Yubg?-$)rVFsZ9O$SK@D$}@;P~ML9 zGxU+)?=DRuAr}@uFka?AqQe?(T7eAjy^OdqN|I>sdhPUIt0bnCFM4^vf#Ho&xMn)q> z0~h!@ZGclZc_1lz7P*S%rlf5HE9MC}b}XK(HlH8FF6qLp!Gpq`;#Zw+KcYE)PJCD5nV< z$gB$s+VuYC0t4DA7qK~XPU*ug8lF;+x~b-OR--oxmN9tW-QC^cmeo4$?k_&kub5PRdiob(3p$aVmbeBO-SzLEYlOQvr*)#z^4XaBAe2+mg$GEIaNbm0Y(F8p zhI6Z8V{1Ezow0$0@Uat&49i`GCnG0Aa}}QShubL$d=M0||7JmxZuNUeiU_ zriO+pDp2XCV6I7dQ-{0ZeA#HQ3+MUSZ4Hi=>4ecB|#A@0M z;j>7xdjtc$!1yN58Xye3_xxOw?5?M7>?R&o;xNwy2_CUV=;liz3|?A zUq?Xk*SE~@8^d^5MD4_VeZ?~O7w%3%WkZzjB!7@St#DXT7vCI?xxCw|{|p`znmjK~ z&2IVlz_EhC(8{@h{+!3P_Gw3GpD}3^GmZHIM-+o zc$xqkb9GJ-F*Kjt1GJG2b0ClqvXBTc^y!(m+i_9|38CA{tR)pSHMU6R%a^Qd;^q~2 z6p6#rUMBeH_ucYqs;)<|v9VoJJoxaObP_}$M8ubN>^DMc0CN3ZB-*>@|=-$4iUm(PLbrE2PTSIB; zF{uOo9}sY2(j>vjxbz#`D|riT46q_-gk(7~u5abiaV~@j1nDooBb*Ko?ndo_Yb4x| z6&x9mO^8fX=lwiV#RvXg>T&TH*66A-KBwwZeRtleZvNoyBQSnb zR&`en=mW(4XeItpVkkBWi9MP# zm>QnkcQu1(PdMIhMv$jkz9F{JZt4ur(#ToRG_bceruSa50q=wmL@oFrGa$|h7UbFg6w1WpVW{m1Qp5%lXZ1#&rSHI3Urw=a0LtbgFc~ic&DEDdLreRQH81`O(yA#H zcLeUnIAT!o2p}D;M)C6(jv__$V&nv`jUYEXG07MA+T2qQi12V?z%;?s!4Kakao>8)>oIW>e*`eau}&Y} zo)v&(gA**g>z(@$qci|fe9k*_8z|T=C8fTM-)NPTu8!Ro5)-S%y+rs~o0t2tqr7_2 z&`u-;7%Oi|eV?i!?(vr08nYbW&OBh|=62q8I|H92;G^*8$0s%d*{*we;SV)NfBAbmI;W`gtiXep{nXg=eGO>jZGzE-B0*>Nl4hzbkW9COf%ot64b!N4@&qt& z9#g6y>f51E!C3@&`WDAFPLNV8e%z`L@^b8 z6k-+QJo8Y52aOi^SQETj7<0?%@YBbBUB;va+8og%5%=0LCH@YAWJmfRYJGC#nmobbF6488j{$Xsejt_()%-@4}}!+N^B~QAHFGElZ>c zgfa%N;rO}Q4)VJ9_4TR<*i+th5j&(d0MOYI>wF0x>wIsq6uk9CJ-x!bexIaoyvV$B zr^uHIidY}2dkN?O$uT1b8#vA~t=nW~h$u;rmQZ%|^qp~kj|2AM$w?7FVIhTz)TC6u zKVAg9Nwnh-^bH;!+h)-EaCG(lVl_YoNpB5TSIH+vj{{J`hD@9SQg90(@0Z`reb!m4 zCEyvnZZj|O?il-KEghFFCMG0w2$U|Q9w_@NvN?*Yn%lPJ3@Y}ntGRBs|K%c`G|PK{ z4fr83)E?{3l6%~gV(8Q)Ozpp3JYwj(BkUSIze5G97*9Wq_Q&h}*5ZhdY^i(^Zo zGI%ofFa8|S)VwYIl)z4vZI#I#F`AHEW&hZl*HZJ8dGrjXruoL@g+^=nUL|Lydn`2+FLd8g ze{`n9PqXt(=7-|i>h~!Y$NR$sBd?a*v_ChA66{sD#N$LwKdN5uru#G`Or$_(&8bzP zZflAzd1v5ZCpqh0QbR)0Eh&fRkI%d)xqfd^8!Y8DD-)=X!oGo)B60SW+B~e8(s2 z|G2H9$Z*3z*nY>xP=%iDVS+zD#LNaskxzuPyLar)0*5&0!}*`L)-;*R!_+A^o}Oc# ze5lGJ@SVKV!a}Vl`hgDR5W_aB2#)w`FHO>NnPq&k1=`)$ed+X!X4~8CulhL9iscIg z_uqY;+~uy;V?C^!xsm4w$7HVXWh8^^mx|N zpYGb2HC<+laA5{c$M;>T%u9DK+8JK(Jvlh0UjOPZ_cPwGnolhqpMFg;2gm1la-6 z*Ox77zpLp`F3o0db~>_&P1W}DCpHVJd!IJW1)T$3&ra>J;>o^4VV!}srTigvTR)!lx7!e-0ByPFO(2UK&|?d!ax$WNxPJt+D^nqNFxFZH2^@kh|4 z+jwD4otr-|ZR?SEe&PP-b!jvvqxzp-ojh@NWw!mwk1SV~ASc%2h2JTx@9hq%TRs=X zr$*j+)tu+*E3vU(%;gdHM%90m*E^By5)5We?xFpv5qqOLm9P4ALJ;$kfx~BmiOn0N z7H=CEcRV;}s6uo7{+%7Z~>+Dv;%`^;B({JBOP^os+W!zAI zs_>3EnXXPtXftEie8!`uJ>}_%zpCWlY&yGxt^IPO!}RTYzedG8dx}So({N>Y_FNit z8qcJ<909t;EnOCEPoB#zbTSUo?}dUTk~2+xEg5FBE*V`s+wnz0{!X-fW1MG9=RGC) z=*H9Uca}!>-r&ej;#fP(9Q4L*b?Y`Yr8aGKrJOS*MK$+hos>uPtKy7a9KFGIQ_y_3 z-nUGNA-dsY!Jh^U?n;|}>V%T}I-AZ+e|j6sTe|rJ4U>yc($=6;b2awOcMU2|>mNM$ z_U+`-_V&vW?d@z=hg(?lT854f?-*3@94Z_W{`Q4AXgPy^Gn3x^vLz$mE6mF_w)c2x zFMcyy+NC&U;eE`Pt|WEKtK`j=JbF7=lro~M^ml3Sq4-XxrwkEmj~@FNlX0Vy#=`Zu z;(p$g-uaxmOM8;ZEMzggsX|tpli$jI4p;PCX1nKa$dovQdx|e%jo>pMqeMQfOE3qPdj}HtrFZbO~U#kh!pnM}um0iT>=}3KfcH?bdDf z88^~+lhvDV9dA{x5#$`Nj$ayzDI{5JXoO&PFzONv))HjW{luH@|5-WigPuOOO zYfT7{yv3C$pr` zIPST@D(=FeVl}as41*TF$0=TK+&kVMoLyf;_m@NWn6`GDOO%bNaXYViDpP${X|bBX zt5af!mLqtL81rvbJG8Cae?7lX_zPdvYlDx4)g2A{vYouy-*6h1pP{TTnsj^RDDtT7 zuM9Vu5qF*8sIHm*Y2w^(`>9<@fxPXZXErnG-ZLd>#MI|S4_^q&J4GX)_tv>(sAy8R z0r*eQ`B?pL`%j5ML=TWZEbMkh=Y-AU1YTM-Xx)$L+esb@bRW(?RnAWvu)=0R8PXk> zHvRFev9YmoOts&gDK4X}9f{i%r{2ilE}OJ4Hl`WiS&b<;Zup2UfHx~6NG+f6YM->+ zmvraSUu8&xsd+?f4J$eYwj!&!E3F(VUw2Ltup<@6v+W=O*o^SfZX1%M2{F#Rp_?68 zdF~KkgrDBG)wM40CRYwUgf_==A4f*V`SjKChl9?x9Im?Z0<}14{C5t@hAHXN1@{AE z`g8rde|^wSuw-9m1-*XyOsf6!*D0?tI`-fRmSF7t!q$RkM^Bx$PAZ#gZvDzb(&yVl zh0172@H#HOO-ziOV^KOlo6zU7yVx9WJeL>I*?`&xuE+BUAN?UuvKmz2COzq+~m>dbt+ z?b*$zRnxpa`S4VY!%JkH^kYWulJV@g(U9c2zJ<0eegkc0>zeRtHk0DZ1V zCApWU{$qw78ylORlXL5||1(q9KaS5_?`#;{+4bgYsRZMuBw7Yq|Nhqe-eI-6gqucK zo~Qb!r*G>&q3{-`4S25cv)GcHI2bOy`F(yHJgTT@sQHA2>9Ov&o*2=|$BFbP)%oss zjHp&4+s!}PO*?bb#dmnEdF(6a%Pkz+Z=!NDqNP*S3Z{RdTek(avsfum2(fYi08s{y z7B49n?(5QjY5BD>Rkg8So0?>;^J#Jsbclo_cF6{hC@f`yJs7!Vmx#SF^j=0?cbJCv zom&2f^8ZJn+qB-Dob^HA8RjxG`pbJ z7`9DQgDF6Nb3lAfVwnW~%!OIPP?}adtJJjV;@fTzwCw303VrgwoFw3dYNkVr-Gyu2 zPQy94-jE%NQdzZfzr^hY1qtIF(uxzBJ-&sbU7fjP+A?fd|#xRJhVv&^;kTih!S z3=4JMR@b%VxRd(ejzti3-M8BdYLezO@lxh6gah66fhZL|9;>@f1uP*snG$kLons6F z^|$g{Y|qkRA-qTo>6MxTwh{v!_yhwK<+|?dQuCDl_p|?ugzyyH7Y9G%{|(ivR!khrv0_Oys5gpT7|G{|}4sRK)PG|M%0XVce+yePz4__hyVr{hxmuFbkX7 z|Mk-#awglUHXCWTKZ3LmQLy7zSo?8zonrcE>#CjlhLPAM_}3#EcWzX}3CKn|?yn4o zSL59$$7w55pFI8GkkJvZu)Y47Q4A-GyPCTWsJGG9|9Lll*Yg9CA|FvD0-cYvXHat0 zFvuAin{s^o%){52=5ysMjC5kG_aCt4m35=F!NKJDivJn;P znrf{2Bdy4zk==JVb2mj>U+{dwiKmKJ5(+*;88Uj%rA&9@ZtaYZ6{jp;8WrmdoE^Tn zAwAB(>_un%Ni&MDjLh;)7qq9tq}LRidIbDCU-iwG9v6tonQSr1W-qhYtbXA_NpgV| zqg*ByErzp4`bxlm-zSupGGs38FXE5p2k9GUEp0>&Eg2mv={RokIotW9 z*$%tl#BMhC@Y*@GD3$=Tj05Zul4_}&w?Ti+*}a!UM^57|s-0l%_!bsx3{iL>+>S5>= z<2kG9@h{(Xc8-Wo?vS6!_(+y1ydy2rzK5K;xn8Qi;J_jGrxx=I3tP5s9s1#{H3mRJ zNLY9SsXgz^PD@Km=O3_=r&2B6Zn2rEMQ2duZ>!~E(M%gY{V6;1YQDv{zFfAJ6s5@@KZs`<)VO7&vQpzc zhYR0mFz2LWT2Q(%|JO70@f@rQCdKtJoNsA})sVs?%skVmoRh(0hrkLbiV(!0(K0eJ zLQn#iUlbCO=iU+@w%5-6hYy|O1=J&$qYH@qYX9|}@79-glFossh$c~B^9zFaIhN*k z@ESM4a(>tl2RX;Tl@foz$a##n-RVoum!i(idd?=t8=i~s$qUFY(GVLcZm4Ctr})yc zIFgJcKmOWUq5V7b&CSCB5Y79ouD+KLI)sk={KEX~KqVz%sfLb06?y^srlvwUWd^%7 zA6TsaVrraN^w#m5-mkbkRY>w*1`AmoBO4G8a$gXR1z4ur3T`_cdtZkBXO>I`>4~JP zsg?2j-i+QiZ=9|Qr}gLQyxkdX-H9hAx`&)s$u_bA1$G6D7S4R`2SN-?g){&zpX%!$ zeRI`CPK0$1{x}2@bc;c5;l?E{1$}eFU8^fVRlD}h|9cMiaDUFeB3TDr{dfBJkf{tX z-I4G}3(GkcNBA@3yw^Icp|ML^m>w||BeD){+rqsSybv&&S1fyENfl7Wx511Bc5QRq z3stuz9vn4{9*~8(lPhM{SB|FGu7>bf;s0aGe+DwtZ$(DN7ibdaF+(xT-hi+DM(&S{ zQJvg&kNq4GPhRLTfA=R&(@tJ_8luC}o_m%D!4XLEA;3B4O(aea44i{Y&h9;OJ5(zx zo4yiK{jFO!r05D>^ds>?9IdCaz7Oxtyp28dqM4ZoBPRyJ9cfKfqVDvAoI8QArsSoq zV!P`UN`HFwZexmR=)u~eXNTYB89FOvaFttkJf}$=F*WTwHcU5thf`!zeZj>qZVx#L zKEl;BhGZmIk2}gRrd6E zx??ZPhC42o9gXbUSYP0alf60GdNKO`{o7aVTSnH`qgVtJr=jco zgk{2v(bK+;!R(iC91N-0G04mPBG11M-yy_pV-%XR;t=|Brcr3{g`{MsVuinXziRnRl2>w8@BMAgfq_MS_$^(b*!#OHG15KW~> z$*mCm?3b>5g(|X2XJ!kI)Ydk65Gtr?%t*oORWaKPNG9p{*Hb}En_~RuIhR08J%2-9 zZ$sIEfn&8DeaEEh3zpT~MP1hSkbhJrj1)r#24mPuM^7I;evejs4Z8VZbjV2lfJ`$& zZ&`2JM4vc)XW-l*7pp4RWXwC+1W#Wp+01+ zc9!Ix8g=)nl4<6@_|PTOa#mFr^9hl|j~_H4O)7tD6kOglPrW;68IUu)Fu#yA%^a*K zXSk8E3e9zi)7P?fQ`DB7`;wnzI+uBS-oDa@qnSLto%nuQHyJpc4~vBfsLE0PXG4kT zJ+7>9T&R8L$_9>hqO21K{iaP6q)%VH8-*nw?{;^0Pn?GQ$!sm#j<8#U)8Y?j;zLuB zq+MsNw7ai(Y`@ETUc4x8WKF*5_Cf74hi89vaCf0PBp7!emM!P|IlGiPO#qhIO#nGJ5ryBU@C`+)o-LxQC&M1ILDKjsd4ft`Yo(EA7_3ef+Rp02D|+o@dZl{0T_sKNzF zLBcmREw!PeVdA`{0%DU-psfA*|F5C-?s8O**D8R%}?g$ZGp#`yTT5n{{7Y^%O+udt_YpA z^M&w0aw0TDM;Fs@;lZqe)kroru5Ld*lTM-}1&hVCxD$^cGG1B9jB11KthdaE4Ucwq z{OFB0KCRp><=rxeohiwGWgRQ<|D9L5L^?bxaM;VW>(Yr=*-i8Y6(jmL9}0W_FskW$ zoc!j2(|+NvNLO)~ytN`nLq<&HvAgfa#nnz}YG`~B?aaI8gC4)O!*HX-J66X5&#W^F zO=&7Tgl%6ATm(k*kR6!*`JhSgR8xI^$P-&awh<{xXty(r{?LQJcv1k}+g1inS`zwh z+uHSrkHlMp(WvP<^lE31MDPTZZ}^|kvZ^1$Ss1aiz|9S_1ut8>_+wh0=*j>kq*Pxm zyJ66jjwTn$A38w_jKU>VWJM|Yeq&ym>Ss*vJ%q`OPM<2~5XO&vzX)Bi1-ADt-QD9V^p_Or^b(MdV^NXsYY}qjGB7fj01@b{_ ztw=hTL&x2HVLD-_aDD3 z_4xSsFYD`I_Q;m${yT1;n3DzK4MbT%PD< z|GPYPU*~ruTG&>IP{qCzTZy^${nviEMj{Gioravcun~qq!-ZImk4&N~PBWdrejG7St z?Dof0L|i#x6Nxk@r93SAeR8zBFVxS3eEy@u?hSi2DohxW48pMz^m@`A@Mvl# zTx&p%-4PXzXx=0CcAdFVYaRq$ zI9VFvUm@|mH(*DMR{!(=xVag(c_pr1ATtpz$7^nLb6xNJ-sK!5mS0Vr)$D=QrU(u7 zu>4K4thEXGy0831qyH5Kwx|#p_mD>&dyDUOU!Q-Rt*9LMeo#FG8iz2@)F?=AJSJ}@ zkfYdqe}h(&-@s2Qgf8K%S>Fjr5v6oR zPrqTs*JAY)Afix)GAnTWWBV*azo`6iRCU)e{g*2rYn(%~w7_oB!S0>jOut8CzQrs0 z`s4Ss94^8pIy#ai3>sWKYbo1#8z}WDg<7A#fO3>Dm>RwO#cww98-(;sdJ0Ymw#?u#eCyBLXqerC%^slv8fJJmkGxe-^HUK*T}ONac*gs@ zj=Q0r-)UVT(|WFDZHAIm`y|_4W_{#7t z9NvM3j@%}duy;hlQOu&s&3R13#ZlBg3=bS^%)`&R_jj5Z8g4+8Mfo?b@Lgb}dNvx4TmzQjx~iBPX7FviUp#d~{UGjRwi~`M4XZjw$XK-sK?+ ze3=;pC=^8>$O*Br73cQ>E>_RK`ukw)+84NrZwJ0Y@(1O2x2UMjU5}BR6Ag1;G0b|n zYzrGt>zvJVGT8n?Z^THRE=!K)t7|St$@3T@f5Sv{=%P-lG&OePSX`1Oj}HS*Z5?>F z6#i01rqXaGKmY3Uf)1`Yga?}?a@IrGEY{d@K`XDNqf-NGZ-V^}LjW4ET#}`si_%Gg zmc|N&7}zs!Po7Z^VYCjHAUN|k8Mwm0A?kJnV2*enHoz}z*Kt#?{;sy${!TyaLW03X z48S~mn2NYN!Ew3u#GY_NzV>UMLwn8*P%CypdLOUs%`xRugdq#&tAe}MWLgyizkNGj z`^9i~Uc7b5ccZl{SE%=p{|*Vu_k&~(8#4-0qMX~VkDorJJkk3xdC>2V@6$i_kGx)+Ez)tg4*GrEGD#Oiv0H2%I9}&+!V-iL(-hQapYu6a?F2 zUCUnP!n}=z3$^CR*r?@v*3sz5(P1z<$iKoFruyEpfoPnl;KGe3V!xaSk}q`lG`Yt4 zb%;C=@-oJJpnawrf^2x-(PLFHdP=sJ9@COI*QXB_HC$qSXoz+0a4Zv)LJ@Cv131LgEwW}6C zaBD;jNsb7DEDy`;Fu_#M4TRf9Bq3OIg>5!#;795UcA06BBl~s+lxbAVC~=nk)F0!(Ra%e{*#v5;AB$2)|77%qt;UYJ=KYcfIHfz^p1{3QhlH<3}Hk zO&6a|virLE>hckK!;uv{9^LGYnBkTQ^`v>0Rc<-a<$*1nP?&~_w zeeS*XT5Cg8iV8O@S&{M0S*PnNe%6KJHjQ>smtzXM0RBMyNK3sy$s18NgZRJ+0x3lX z6dYbEkaO1Q>*g|`8Nol^B}CN8uL;Nhq*^t<{}kN)KP~{gL_)`ko-EX#6<^#0rzaR5 zC?#vr6Az^JjrwcVH7jaF4;Wo>eMaDEx0o0AR(R+H*l9K~VgL}F-TVUrmf)N~J`n-q zaX9LCWRzUw$7h9Mq~Yuruxd&!^nAUmO)~|excIUMblaq*n}>58eUEfG(X_F-Rg6MU zo_4-+LrjbP)Rq4Fq!2AuNo2JpPey}X^c{~^M`PaU0&{RC-i7RZo-eRJzTGOn0W} zgbND^k*rd(?1-Ww;nzA1t^u)2UHxI>a4wf=P#tkADG%8C;6C`cZ!~^sslK2~15UAV ziv4<8(=I}QhX8^>n9#tni9-s2b_j0Wa4qptbH)zl#6Vxogl@fhXV}7 zS7PI!P!i7bgX?o(awZy8`~QV+J1kdLMl3zQJ_-kI2l(JDE}_9qW0;ZaaUQB^Df6#0 zHcl66S{|M-t=%xjWht(^Z#&gy!{X#A@v~Z101;igq6X%Wx|m zSGO`8Zb33Q3RgV3i-ItN2Bj2^X$W7xKnEV%RJpNj3;cH>fh`3OGZo1~)g=(ujk8dp zdE(S<8ZtoDFbWk$%g(Ng`;PrX_aDlstXX|&ZtWN!PA*TduOx-aE`L9?EZ-|m&5BK{ zJ(e3m`9ZofTxtIEz`q4SN4RA}@`G9a4Vk)Hs8%=Jjl6-sHG--yv>*>klaEtG)$+0{ z^DzGC{HU8h2Xs}CEs2^n7FCa+h_`d9B#u&&dui`|5WC>X|3UP>>e_Apw;Y8iNHt>T zPAS-3KGHQ^XV$T1|Ac?>8hcd>uC14E=^f%kv2$uzuWXVkr>0Kv21Q0#+IBT2d6GwS5MJz zHDoh|k^bdiy1W1I@1g@2_u8O-b@#k}iu>-st@UQ4Vs+X-X|rjvmxN>3~=1p7R=n-_YQm-1bA zcM>mus|0f$#{b$ z1>MH|ido|k{%zN5%=4f_(qLvHP6fZ?Eo2PZ#_y>~FkfvPBRigzL>B0K#I8 zLWZj|sP^>+{X0v z`m(0=kKJ-$!BdP?NzB=({4Tmfc8Mn&3uVE4O}b&)w%dtaCu+DGlxEgtli=s?D7Q3$ z1vTfXK*S6@C+ZzU4x$K4g+owUaG%;Yx_o2=IQxJ5Ww<2mc5w-}HnLsfj&PO_I(XdV z%PRN3x^L~yh7+lB4<)r7YCzEAO%gs^JKqX_cTR+eNQgZIai##xIRXO{hKC>V_;VhA zUt%|hF2sM3%)sR-mxoLY@hKt^jqFt?M7aAPg zr*5Nh94V!id-FZ)A>13T zLtFfTea{F4BG8&9Sxv?*$rPrM0(V{5Ab%Ald2LDv6Vz@I)B%wfeA7U6{tvcN0LRX8 zNLoeJUZ{Mu{}TNx(>uH8KY?WnTaH^}?_MBVd@yK7EBaXtgmG0hweyyLpv8yXVT{!z zIndF+<%lr0ab}--sB%qd8b^nJP*9Xf!*Uh4V&@81yUFd7^J8XaCeA1@o}=W<&38DB zeD{TgL~QPG3QHTfI0 z(@|$fw}yst@|{#9noi6W@t9n>w-XmZehn-7uki49EO}IrV0$-o&EAhT*LbS*CGxvY z@G&ckeZBNbpQX~)*;#Va%{g15pCh9>#>U1diZqGv6Np+1Io% zV%1X7h_s?SQ^9@Y8>~tfMO#Svjl+2fg~HV2KO_9zH&-MsI|1d=)216RakC=x2Zwzn~|+>IB|u?ZrvOQ&!%B`^?nkA`g1>j0vVJd z3R%^K=V6X7kzmnJ)MU;){nrtdJX9TPqbj=^MNXXDrT5hkknq*y%LK4rJ9skm1WRAP zSB8v{6S_KGX^W;K`NdCj7G!S~Fc+==7Q1Slf{JaszGGH`w_lA9>CH zJoH+XA~z=ealp4y0%J%RH(P3WBMx?;O-3BPV1gc*wyAXVCTm$viLH@Q#9EoAgxMeJ z{&aqG50s*abEf+|TnnD2?u|CSXgfDhCkWMUQC*!zuVr9h;FcgIm2{J1cQSkNpez(W z=(qxn=l}#kr9V;?|6%e8$?l_feYM{QcdJXM7#24zj*3S^=F2|6$wW$da=HT6LFDypnxAVNksn=UbN{I&SImmA~0SaK9-yBa6fKYs#-cZC?*jYU~$ zk3G30ZC+G#5dl8afBr{kZYHOP8l6REcn=ZA++_szP=i73fF~4j&m8hka+UDLL?u8P zrk{VEE>7J`rn;I{_9ADNRcriYpC_Ia`K(m>vvDnY&z*Y5qEtUVmso=sxts!5p988D zO&xSInJz~}PUdT60iF)G+LY48v~FF%F#W#5fO&?9s0C@GVYtKi!k8;0ht2)jj!wyI zd&-cz6HjqU$6%QLtlhG6oEz7lunpbcyoCDJ+Nz=dJRo2Td3uJPc2#tT7I$bSvT7#j z`{HhQblh1%Zfwt|Fz>~)>AatRy9>K{7*8eY6fIP=pZglGaeO4}C@+)p(|v5ur-m4) znG2&vm;|QKZB~P<)ez6+YMWq7c(KQm_RTyzVy^qHy+rKnom|LCHkepHDEj)c>xYc= zu2259Dr;>MKTqbQzkcmeP$0W+|9*m0qW9ktJH2&Y=PIY7;GEJ>M@RUW^l>E{GK3Aa zW_^63xEJF$8dk@up1NB7*KPQhKjvcsKA)^Cq{!0{XlXfMLgn4{_J zMH_bYWof9DXzn;~;D?8N$(6@=nMAidxZ~~3K+9DN z0_w3Z9I8|oSJSL3yYk`l{9>q_d6WdO*)Z%7}BYG}u-M-%pb>PCf2HMXyN}-Rd}X z0p%)`OFE6s%|*4fY6+GIxI(-V7*8j1Wy~aL1bbSKm{K8ExSf!Y(9B{mK?b%Gn+zl; zIO5c#P5o@I7ka#re_(=i)SaXck{kC zco@8S(eNV$aV6R$byHmUjSrYnboWad?~r=3E*o-&BhbM4)O?tS^R+$KZcWqXuVE9e z>;VC7Ec@xVmZpskr&w}AZpaPDhf2@qj1MtUx2^f?s(bh_UtkBURgjgOetOOUIx0-j zJBTg-Q8`1#LUf|UD9L~CK}Y?9qY!1RgSGvJsmD-SK_hF~ngzuwLd`ii_t0!u(ZgOw za$tafQR9xtC2Df4rYyHTy)JIE8DxZqrc&^*ni!~KKwcyNq$X-~rh2O{ogc^?33H1q zj+oo0{(^2b4^KoyxtVM>%U4bsFL_h%fw!B0E!o)Els9bj!7=aKP;hN}HIjOFyZjX= zSj%WUY_0a?ls@WwoQhH<)+O3Y@C=qsq)YVy=r=Jq&=tCpE~ri3Ag`%l(V({Pq+yT? z&Jcs73+kFul=5Hlu3c_yZ2XZkh2RJe2d`8z3X+T$kj|V07-r+-RMl|r5i&jB(q4UO|3xVH%o=0Y!QI7tG{uy-l47xc`EwP;__D0K_wL1>GizN|`?@Rs^DYvD z8k`sK?cQ9SjIX$Meo;`sfGJ9K2TUIr;?(JP?b?-L)x?yQl||ixH$WG}lg{(Adm#r} z%FWFkW!Y^fg+KB@ebA1`4L3UxPEO8;6%ePjW4D&#RA_H+zXbq;Bd^xt!>uy# zT{NDZ=r4Nw9x8S+q6Xq(MK}-Ged5>>_<>B~B>F!xG5~kO-ggt0-#ajpY~l6uaOc?# zfRix(*6pPASB)DBe#p_~hOR3wm~Zb^7m^KuPW>>$#`wIRr-!(^fL|RE+?x=;os40b zofu|J)ApfdWIwmyN;A8+QLgkp_viCQp7&zQtECH7P8(!EC=}M4JB@5mfSFTHQw9Nm zF5u|P+EkUUM4p$rNs$F+^0#@Q+LO!{S!U)q{4ayT! zQ&av*QT`uHP+68D5|RAw&W&VOb#*4%9v|D#o25Qoh*lkY3z@blk(}6~5+f5>@oWy*FB#;ePaH`TY=e( zW5SQSAW<*60i5Jvm5hu`B(QnsKT|u0zvm^4&D BmJR~tKa1VpAq%h+K?SXqI)IK9O~ck$0`O+GrwA*TXTwH~^mn(X7`eF~5Zdea$sN45tZg)s{EVPi%`1)@jUT!2 zvAg%{vE#?pnrPL^M|$sjdlv)H!vvjlEdYs8Q;bO-xKy8t{%6>oT916*p?$Vrw&U8FCdhif|^+o@j!8ymU&GPeJp<0T^ zd71k6+uuZC32#w1mlA_np`qhmxEat&3;sk!ZqWVe*RNk|^?N;iecc~FeyqxcO^rn+ zd3l(VYDZudxXB1t<}Fy944VgCi0?Do4+h^jRzW`oqbJ((-`aFV{Km`tZA0PLf;Nm{ z0UT0(VKR@dup+dT3OoV+y3RAdw&edAmI=24oVJ&56ClpVmO8ao=s?OR8|S=Fi&wdN z#T*3)@f^jdDmE|~PS0Laf_L=+bnd_6DhI{OO~h~=2OGJi9bzkv9Rf-y%*#t!0PvqZ z9oK4<#tLYefag>@(0Dm(mP&ujv0zfXzlnw-?jOLU-H}Sy5A8Gq9=P(?bi-itfrAH& z#>-)hv6Ip{mKjd72Go#-9f2 zNWov#z{s{wJ7$bUKwZwQXp!4;a3SxSc8-Z>szG(}GW07OvNxgYCcpicmb$~_j}Oe~ z^d1zdVz+wm=uz}UWkURx9u)f^1>V&bx*HV4f>4BdA60}q47-<>&+h&7z;xw(Utg9R z`yCw|++cB1;pYNe#BB)7ju*g0i(Y-~>F?ihUGy!0cig_v1bclr1e5d!(5XE1zJU0n zCm6K!g@(Ler?EsEER5f=wK_o1YGPwZrS}N2i5j`t3XGDKO`vqF%l|S0^E>3iANHD~(03dqC^YCkpm!C+c0vTs1xd2G+sbS& zT!{7;Vmn~897giiUuN-0YHG5KOa1C*n=jLERp8>{Vr(X^PBnhjS}Gq>U>%N;>k0cu z1_qv5(kY~A3pt3_#hrbfe9*&x!%HMbQKrO+J@YudH1cFD2cW2mXc@!5A}C*IsSfkZ z`NzjF3J-W0@`?uu!br#rSKmRV3d5082`59P9HT$Q?ey~M6if3lo@dM1NeZ%WYbcQm zA6ehz<}&=j00y;?b~7OEIO~0Dl3m+7I&R|tj6}XnjB|(E3f530Dv}A&Fos=|-Q%vp z8>AF;Lyud^&Lr7QK^*oJNSl@+7j>SU*nuXC{fQzSfNtR*aUEoeZjhiiBkZ-%?xrZ> z9yIgw)o1uYyYG`tiCa8^2DLmaBlkSIf`1LfSW|ANY8D(aJ2WEEqqdl9>3tY4(tlBO zuc*HPLYv#Q5--|>UHwQsM3og3)LDb)C9XRPhNG||)Rs8rXRWr_hpZ%-x-j#ZZ-Y0P zhp;CrHL7;KOcZdHbv;|Q!x`>bLY4E?t32@V@bmK{2f$>B$TjDim;tG)r`PfGXJYy@ z%$zFv^oenoLB0Ym^2B!);Y517W6iFmlH#Yt#mVIKLY!EnO|*)A&(Z$tm`@R;AG6lG z1o`C=gp6ub(3u8(ub%wby}?sqrVq>|46K0((L2CpO~lkPdd0)Yk4!58fFv^yIqhmjniGK`Eq&s zw!jVuVHnfV8he9fH)Cis$~NgbRC)Vg5XmK1UrysVgbKkXf1yB|C*TF{FXcbdusSR> zR0QK=$k-H=I;H4K7+PB=jXsgE__`8lIs8^xe+~_eht{44-5j zT(Z&+JiQ21#{!?FBqg_>*dDvHB!KIw_CQKEV4d2leTiFS3YwM6gWIZXRQi;c=`inR zr|;61@G-7)cygb2SM$lMPwb1d4>!M0L-0&hP7DWpzX=j9Z&6k;c`6Jx=ol1S-DdSzK%=64h!^G9TQ;lJ ztL?cM!v#w|>wI}0BjUiz_?u06bWozJF?Bji-N$(RT!m!Sm7B*+{A}N1ibqh&{PtO` z5~iHe45v@*a}!P>dGVg1jhGf9n84@j-Y6Ig4#+(UP@S)a+7ft2zA z?W?_yzMkV$GXw_4fbA=!Cb2|LQyBw4Xs}Dm9WQp>Wh^S+>|s;_cc+K@79|`6#Z()` zd(U6-7w!?er>lOgG6bXQ-cK#1?j`v{KnZ^ ze<>OAx}_bBQccuNJ7iA7dDy^*-5n#GLcyl6Y)HHv8M&3j`>X>b(r11}eVJsbS zj$~Q&D)>(E*J6Kffdw85Z6D*>bDSI-x*GR*DRIKran0gu6VFmHl6u`LC{Sq`g~{x> z@#qsp3yrp2zfkl3Y%AcFtDlpztWPHH1rd=Ezdm)Aus^=xvVNn-8;>=wvbgsbrAHlK zLa7zZR=gNm4Uh|%9HV9%R{AQx6>H7xizUT{O4H0m{1_8rOVjr3W=0XpUiriE``Wp= zxl}PplFM9qWDU+9oMmV!Qr#evTtO9$rLEg2+&&SfM%{Xpbf&PbjyR-OXncNm@XmyV zB@jQ68%4_#!Nj_F@nT=p;gC$n=_)SLg&%5ut%w7cQF9kACob60bu0hs$Ms>`oFZ8G zRfT+j_`Z7YjC*$S5$l?}eqF6Fot#eAqfIzvP+wnvW}AfFgQL8MjFwR*Vx-aQHV+J- z13l?0^?~TQTUuHs4YPeo=30u$LMVqFFQ$l#vqouR8P}#ZYN@Bo=(*1ycT1kp6=GP_ zj~~s}-ms9T-etdIZfc~(Lw0eFnL3R@GZ`0izXbgF9~YqYOv2z*hY>&2Z=D#tc;%7H z+>Gc;RrCDjCjkNBqjT`w)$o(v!o!okXTx4s`M?P2>rcaairj6L-IsI)@1fJrROo%NtJ#% zjzN1dzfa4$8bv0>{7!h=Cgu{JJIqPgD+%;z?J6&{!59w4R5~BEHwbyKQRA0z%<-k6 zz~<5nj@h~khXT_PlQ(bPm7i* z!P8FFLYSD_r7{l}akN&UjMa=@sNgvJUTU$K4%0!h6m)3i2+Jwp=^rR!OZZ@TS zeU-Ec!`F|*92!-d<91pf@IK1Bl)i8L%F|nLNvxrVhjtNgcix!mSdnRs?ICtqdcMIxEhcii z!>S#x=jK}X21#6aE8@3FhP2>9rgS!eR*3}VR-OvgVB8rxN-1+L+J zz;1|L9BO1kV{1l1&*i(AnMex!&C`#Tl9ZOV;N%MThNa;-tms3n6rpblE%b2UZ+Zj_ z(9Sfx_T%07_6KZ-jymhwK5Zu^6-%h@c7y3oQ6khhm=pnw;n#*yQ;@ST8r; znwvy=!CxBcjd5A~qGuvXcX^nY`E-3_EqfG`S~40J$e(7{t(4gt5+D3VjVGWzq{Mq~ zy$qZ;;IP^1v4!9Zp%HY zaqAOUG@t%9`no+cQiY_;gM;3<@tr{bFmg$OY1VxvD+$a$mQS9Oz~|*2qIY-qCf?_=8aEm?sF)~}6u!z@*4z+x&(=zx-k4Kx zY-&pL$~P2qWa=?SBR(C}g*NAOeUnb`3i$v9oSi-)Zo2flTPy*6d%2uXL3t~}vB;+ZbX&G6@|9rb|{%ME)&cnJu z#^vf)J|Y#!TLWklY{q*|ATkk5FPn)InepwsYh9%O_$_vw#q4Z+VhnU&X5U`Y4S&zR zgSlbAR4v|;GfRqTzmKs(C6E!h+hY>#J0uXBH+XMh z@;tX~Lvi&7I=G@A#PH#|`YY&00!rSl*Q@?k5={`hPoCjPSL}N`!6>0_wXNoI&CA;M4rlZz9kP_b!ND2O&cj#O?+|Gm(5>07bKcD?9T zsIA5{){p~Pq)^4}$=KtAH$-{m4gV!ghd7ZstYZtQvbTvHT$!e({K)O^*@oQsUY{(@ zfe*0)@zVW2UvTIf-hABh6_7u&I9;DE*Fs4?5?l7YI%*Re(fHfA_l)dMxsXj=l8dZm z(PffVvZbQ<&H{{Zt&z5K?{~31 zer@V5&*MtN*i%)K;`_;e6-i#;+(>)Z#~2sLW2_p|zSdLWkm*U`$7ij|PKG#z#MfHK zeg4|G>bEXyS*a=clC>;b)NkjS=fufg=fR;-FQpr4%M{5O|GyvFf81(-76;OQukMY^ zoVa}QG8qkS-yE1a@qyNpLO4aZ!p{^C%6NK5o|mb+X-Vg`T9aYcGIiF!pXr`DD){oc zgEtCx1%B{p-Yn3(Udvl#d8z1=rQ~PHmx01gxYC}VJc#9)bbdb#zjzgg1N_^v!7@0jxJX**LalFR zYVRY1r_Zhdr@1vfYI^IMs2_vB`~KH+Mt|1;z1V+u+h-@LpZ7fL5)%_Q2Pp+0+I#Yr zZ9Dw4L0Bx6(|`{-8GhmK6^zm}#~ID;*eV|>k&G^SajP?!)KS`F$~GpKEpWKO1(1I( zA~3MRFz=@o^NX>KDvn_$$Vk>vp1zE{OrC|(wLZob66EZ;u(pic!_o)SD_5tnGI=h? zFMuA-)5BqQOWaSs((O;(*B~yVc=%3y!RwkVqYh3{LsLrz&&<8NOmw)=RrP$OqWxZ2 zvA3oEF1NHFPul&D@}|Cebq7!vG^*!JP5DFB>dZAI4uDt=z_?a;xH{YY$r=xvCl+ zr?&H_pp|!0B6hSP1pKMfd2D454Sb9RR(;&^_kJErKvH^h=v8{Ut1_RO&PlbhCt(8- z$J9)UEPRpRw2x{-?IeG`?iZ2C|dYXr94d7=DjylfbI~pEb9zRornI+0f)Q z=KWvkN47?~v$D;E zzqy56eF;o|kPoR(s*ZNF1X)BcMcNM24vM3FIY395Ox}uS<_UI*BZ076#XIg~91n7v zah|D>Tn5(vD@u$;BMyU>zsE6NEy5ywOSw z9uWs;g1lHX*$q_80Tk-$>iz;G4B&DrsOSd{9H6Po(#0l)d+4u;el_YH-2E8>w0+RG zCHrFTXETbgZ*)3|8dmQC0 z`YC1a|KOcJ(H_@(CMmY&NEPK3|~95s31l>O$-yOfh$NaaewMaALy>-R26hnP%dzt*S-ZN+Htv)pTpgJ#;j1IFptbk|=>7Dd_yD7pQSSQrNBE<@*!$YhO+F z?kuaO2ZGs4D3nb_rHmY3qU=rQ(B|ed+w$*$(O%(`L{rfneT(7`AL!t1P>OaW&HWMY?*)I z9U#H|u2ww%u8rx6FtgwW?=}N!>N=gs`t94dvBU&47`5{* zFw!z|5~lbv3ffa*r70;X`6D5079y~sX8*N5+!CwNAeRHDW$j|8yDFQYpkN{+U7_1( zmncAmEn6b`Kzb>f0uV6@E$5FbBalcLzB7H^y(rIm6rTdMbc}-)yy;O(tf_dsYt3fM zy`gC5=s43T2?QBU#H!2;ec1xAc!NVA$suquxzf@3-NX1jmsy8Afu_uB5&#VYO|#MO z>x7f}SM6vl3$z=O>s-LU^7Rc7@2JgpsRk>-hfQV!)3Ik#9Cs?p%in>n@X&9k_M5fH zC!ygk0jb2j3l(z-%J?M|X6LvyRwy;T2FoWQK@bgm)Oa!K22(HNpT0CT`7s^I>Vu9L zc5Xmus1RpMs_j;AbQ0C8T3fl01H0$u%H%(lW|6BG6ijfvlV&kFu+)0@-`lSvzJ&t? zvmcP+ehp7uzTMh)9J)aSx`R>dXmAJrSU_ZuLwL#*xCVo205RI#*~o>B>IUi{-^r-i z{uuM7Hfw>n@R_~^CoBeu6JXfEDtna35f$a--RHN+-~FLs>s;x@(zah+&55 zvK7QK^vET_e+ywXnz_x*>@55DO(Y!ls5>5gV=}08eD>|rbMZg!iq8F-pDvmz*tm;6 z#eO@x=ygdVs-)gca!7o<_@qw0U_LrS)}-&WZ#OtXcNw{p_tq3_rJM0 zXt=XYUcjiTB4p0KSMR%OMk}*%N;;qJ&IUdwie`u*Xdtt}`%V2S(o4cZZH5Lk2<@{- zRO1695JX2`^M&AHw`HIYqLW3m>Yeo&+8o;@+FPgg^>3Oh7V5IV}0N5u6#r{9*j{LD^NnJ zK9!FE#dfB=jk{1#3$b(Qb1?T&P)1_KNIH)3Qk!Eh8E_tOSc$aao}U+CV%E4A85z4< zpW4sFsS&SP^6kpFo6Fg=XTt`+{5X95ZOsi()^Yok{n7zXtg0c^6J7#ycApBX-(Imt zIPCxr2ZEy87{puin{-Z#vJ6^tN-u4>wQ2v=7w9q<-EdHU*t}d3)wIpgPpXMt3zvVV z*Ko2m>#7Nry`pZx{U4JJmCU>SvFwaN#M!P9zaB^AT0a>nsSa=>;j0CDnSxro)0X<4__e=_H=gM&k|)Y^2#?GGKDj-YAD@WL}E?bR!J zy`4+KYH<@fCfE~8HJR0a`#G%G8@Qn&}-8}VBZa<2}nZu_w^l4 zIZm0Y>k)KLqdABfF`ONXbIU;5^88UCt2V_Oik@Js$z6LJ-W|N#NJFSL6WbF-07`Tn z$Gj`XU$XvQqe@4RV4;d$N5g!1h(r(*XNp0=k@tVJwC3jLgYuoxIn*6ec+rG*<8838 zWA}42b1>j|8ajK4_PUFUC|H&+qhgE!tJr7+EAk+VEB|4q@I8kHU9PA>oVKE*b7j%Q zG_`s)xFe;#2G^HRMJv4toeVS>GPaFsCn%uq7Idkr%^egDs#vKxMI1US_C&d#onu+S z0r|g4sJmA3a*xiJkFa?TpKi-9TEM?@A98(qvzSTwxv0Fk!b*y;Jpcn8#yOAE*Jc9T zt?ep24Vk{|5*xA*Ua1#%Q&MbxJ|FLOUrw}O?p-h>*xP3+vOcD>#C=FY+V35@fv1~y zJu{|Z`@0Z%9PPGAa&mDIHWjX;eNJ|9dsuFS$l~2-Eot0Cr=&?L^{x&gL3)r z58T8BQ63NrW9XVRoW5JJX*)VP-e9N#NVk8r zDu`ez(55WAL0@c}qOD>s3)2VirO)X7nfq-YHSZ-g@b6}*DxP;O*6LvK?1Lz!zKIPI zWa9Niy<3dDzvpCx&cl7z7C2X|;rycAgEOqb`M^;_x^GrH&t$F7nnt^!*>Pa==sf*4 zbZFcfbUylC_6yP@u(6|S7jQSFKS7h)+rUsHFE73zIzMPmSAyBxdI(%nasq(Dv4nam zZmB7f^or`P43d96-0D6rdn)wwnPUp0p%J;4hudfWoIj_r%^Qyff2Z!)$bc z7lN86u0GBv+*|$(P@hHKp-(tG9!}-GeY>ijFdFa@_@>S$DIj<~?d|9dqw2wiWV*5m zJ=IJR3&5afvMgvQ648Gd78B(&0pu|=1khXDSk999Kg-IWnnvIl$gTqOY!&C8l@QOV zNPoZij*1F8^YH|H+(|Oo;TSj$eIJx~pT?!p$3qK7tuaL}X7&H7%a?nDMxIDYOKlMm zS<9S1#{@|T&9AmO4h(@49o*F@hXSfZWerXDuW)%3V9ThFPxha+wj+;~XbY$pBQek8 z!)~e9?c)P!WUsQZFH(M5^q-ig)?l*kU>!4NoMcDrxpb^SSnuQ1Ue3QCTuj!2zebyl z(}&Rbz-~d5D4OHo{{3g8cGm<+I$vCSeX%jbxbu`T5mG|Li501^H7mU$^XCqVOb{!a z`+X=IM?peTZAFDZLs}<&W$M#}(3I}$xmRA5j-kz_{px~m>Lp7{Z*ZG9qOAXJYjsKU zy=r~P76bhKDGEckJZ<)gimt0xQ7JWl;snrK3|D0G6ekR; zn6t>zx%ttqHL{zL4#?GS{0&c+c66I4&=L8ITU+(4!=Qz$a3r}gM0yRmVOX-xQ$L^l z8o~a*+7RUjWiHfbTYlceAeEV+_Jcv^!R3Q$$Su_vHX;~A^)Zv3;9qzJ@Sz$(^5Vy} zU*P9+$s3$t(;Teau=8}ng%du{MG9jXzaDW=Uq4Gr)8PRW-Y;l}8to36H*+vWa2y@H zy{s|Yaw7;$D>n;@?m@x0=TiMDQkB3u;n#oZ2C*GM=OQlYQbSdkb`npaEtr7E9|_%7 z=BrHzo!t$7!?*5i;2!lbjKXyo ztUqDi{QxoAxIg`TEaZ&0vq~x|=rIFR4nGhx)jaiNE)#+#c`$gQK^6GFjZB^uQu?DU zg?IkrEX&?3T-TvJdVv~x$zRk-^L$?(c2pj#ZzojnWkgz&^%@-YR zGNwZedL9Mlzm-bt+I9I{yMkp6SoK~cAuTeCHu}&Ay8m0}0C64DP`=QYO%FHS0k4q$&vVpf zxa|kgAVYnpJ$ECc80EkBWpi^fzs}0a%4hNR#FsQhq@y zrtP)2Bgn0PBzzV~f;8(;elrfBcVGy5FDqDx7c=AyI11R2u>3zh-OE7OA85LWTFuzN zfkdU>(H8{ubLbKjS@1l+IZ6W^OB(8P>Rs0J8%2O}QXQJa3>VheGowH3w@KzM{OAlJ zIRVEhuI36Mz7Mu>qmie{aq910RJgK^iBn%+pGa-6W>v~QuQ{NRPz2dh(7yd36j_NM zcPcG#zRf75Z%-NpND7vmI&~^AqaQ?aP{;*vDR+o{h3y({fv^#nQs5Ep*A&n|15AV3ums$-bsIN&ARQ<~HG>wiBC5BKd|7|jdbu6yTTrn&FPOYM zsDHVSdA(b*UXGcD_%(ex>mVTwtmCZr!+Ni9Vchvm_`U# zal}p1?CYB}n?waqCc><_x`MW|VcCkc)4#TeCmP&Gwaak+!0#W-b8Qc{3CIQlT#f!5 zyaeejM%hsm@>4g=v)FoFx)^;vbR_ra@Ob^bKKfl-3JuGza6&ZgrkQlsQllO}Kjw-g z5Zs>6&+jAUEN*Dn2*#<0c4D2y>m#It88wyr<_$4n=xa{mKttrKesA9oG9rzlR&yT^ z;*}(p1Q>#Srt3#I3R(gdNnE~seZMt3A`AWEEozy|-(b(fQ)!&KO)`{|O9g{(sGM!b zHqiGidv`JhY~k9-G|;5yWN=W&@bK!9ilE<5|G}gz<`EvYwsvX~u2i;e z6)(--trPG}dHUjt9fo%Q;MSuz|Gxvmo=RDcX~*p3SZ!cDFUCd)huONx4U^4BPb!I> zX?@rNi~;FfK#DZDyxv$5%QFA2f_q-O+K)I)sdXX)KGQm!DZKLB3Fl9dR>_pPlLZKE{dU_DlL<2E&^O4_JjE&0`?ZIxqax$sY;% z6z6OUruvr8b^u`SW#2T2$FQF_|O$vpHK$QvA}w^;K+Q3MpB5!g#4vZ>yek#g;b4AxtbtsLhx}iurr*LAl$b zKaKgv+qX#&GY|mVj(K@UiWPm{CF|vqqZ>dD$z{%cn;E6e^N5Rzj_yRbr%h7h3+#7E zf=09cuG{8RtzDEHx|lO|MayxefA%ScS$)qqwj;Y5>CZvq$152m=gAas9xBD2vb&2Xcwt)pWJOyS(;ak9SOf8FfMHCC8TFwZWh ziJK$je>I6ymME4=07|>f6RBTykvlv8gL&lC1RFM#eF1a1Fp1CYqW{o_!*{B-N>cBT zdwLiArVTr=zzWG!Y+uLi#$eX+ZabjiQR#p@aBCI8YN}`4#af`KxL9<(y!{<0BtE_!6wNU<9V2>bSLlHR9}nwLqV<8fL67xTr8Ry1@Qdo zm0wU{p^dF=buJ@y4n)Z*0?KDyYI|nNRpYZNY96QHmi=3op&HJvSm0Q98?}G{7qfSX zcIvr<&!(TqTuv^X`r9y2seUP1I0}097GdF&L%$(hEiNov0y)(!6#EssioCW;+)8v) z#J2}!SfjolBvYtLEoz;D2xUUlxXkGLx9nJ*SA3|YHTd+`d!hv(CDng@7su|I2tClQ zfD3UXEx5TYCxpbSdb!scgp(>aF*4T0e*=8>znU;Y7kxJ}3oa@DyArMC#N=r)Fi{&CJ|;V`fw_((j>&7RGNX%(ydL)#G4da`t>;`g}^ys=q zcU|S@Yn0?e zhR)VafBv{;jZ0E-^WwEM-!@HZ1uR#5m2bU%lF`-LlFYQT(dGpXm>QXZR(-pRwDv(;?{j z;CV5f{NWS-V&>U!WgAqVhJ@tM_**;-e9>W4wWstxzue_B?|#3(8XMgS)kxN zJD3h8S?Q$}YnD>q1U28o1cdC=2A7?mP+6v#P7hzNGen^XlIz~n-hUUL*WE*p+X?9p zV+jR*etx?DY)rO9`Zj)kh88SIa2aULpNA)5EG4p%GeIt>@xIfowr`f0Xd z78?p<3iSrZ0N0m+qT@afoeLrEI73)=u%#RI1jyO!87Jk)oO7+T9gD4~V4Qz?q* z|HJrYcOEr374j(MM{QW28N4E!Ztbi{2ZcJrqP4kwlKqfeuG31hhN`ch{>B;sJE4Ub zBOn<#IY1fQ){u>8ycHfp5TXWu;ws3r^|7%2`YbSm&06{78}lr+lB>7l8fyESSPvmMq8Xa7uk!GbBb|-akxFHl zZoU+#pKpyY#2=Ag|0NxdjvKoY_8@g@ic8u|&k)UX@r&Q?0q+fmQ2LBsE-U7=bp{SDPz=ED2lZHUfe%Y?IgrZ$JtPCadsIE!buP2!XzW zChMt^g@wiKZ;F91zUk5FK?OxbB@g|qTk^R8g^H>s{L2yTcJ~Pg#GHKgJ_DnXQPq*b zy6AQ;LHG6UTle;NDFp)CB+${u5~mf?f2)1ehPs7jo4ECNAJn{{0KD&4ixB~aQ>|0{ zZS7+2bsh79p+CC@!Q`fg{$cOW6(3^ABkLYIn^bY()J2Q!paqap(;aHj#`4dyrvFRI z=|h{Bm*K4)KYlDn!XMQI^x?nch;njr!Z{ahGmHkb^URGBA7fbYe|WGhSjs+HGjbE; zd8GYm45Ak97|o=tN|nyn>c-_b$p*4aQ|l=(KR%LCuo zrlp;hQ&H>qh+_Uf76Z<&Lw{CtedUu}dTqLXAiuO{WF$o+8={a7?1G}b14rD=c+iRx z=3Nd(WTj(rQh@#moz!znXc;$IJUX+R{?9_ zZW0zt>JX+&gYFV0FgZF}`1bd>sAI)?N@ra0t@G%iqc;0oX4eCXH2ade1&l!uU%lxJ zZg^@G7E-r-Im9==Ycnu^=IfezqnMU3W92j>_+n3SleR0cbAVt3Udx>tB2~7rcr7oc zg^C!?IY(6sp`f1WDB~u4vM0)qOu3p;wwxb?Q-c|Zw$ z8n&?9u^IlUgBHuj5Sfi=3%J`ugir*DeMes(F=R5T?kr)IGFlEizz59(>XsDn(8mTh z!N$nbpKhoF;FSvfi{Z_WjcH2ORh416m)E_u+XkTIZXGnYIJ-rU>^=eO1m<8-mmL4O zCFz<;O>fMZi9VM)^C`q`3(uioHz!cVL;WFnC9hR{TCS)97H+8v&=6X2#EF)ys~SQZ zyot!^MLbqu^3e`LP*nkG z7gPC{HI%bHWa30U3X9i-RBp@&?fe~lr%2_KLO4N@o$k;wo-;OHMiEjIahOHeS_+lr z*}F~{>OIgEd6{F(4n%Xfa;^6qdF<7TW2UiRAMO(Vun zrkBil8}oZA9J{bS;GvSz8IRbNQPCOU(TD#;pFhL4Gb3jIP;&^=35F+o_SZg)KJr9G z;o*ZQpPkhm`);;Rhqg6McMV@DSe$L0&VF3!QZ+Q0D?9DzlENZrv@rL3^izXDnbW6` zm=hn)em}4{Hx9D}oA|O4zP$VU#4hIaN2|{3slNn&x5Q=odq`F?nzTz-Q`9YkCmG2s zBl&+WTHHIT@LuK0*Q4d%IgGJLwn_K;`uVk&ufn*&CMBki!1N~ z8Flp2UmgXy7~6E)WrJ1hk|IDO1J2z1ynp(~Q_<)%rHhVszYRY;*mr+==yhB4fEv7I zWY~MF?~w8Eqr?{VS4Xkh;8g47w#MueA&tNdx{_r^lv{4pIwXfA3dZ>J%lf|lF6}3? zFmtc*m&_H%xfw~za)02nuY`Bv^3~(N)(#Y)ADz)|_~qSg)GJUD@Vb@7U27%eQLf9uK556z@aAqWnzuY?{&G{M*M4f&&#y zZ&B*U#j%3Z`J93RPW%J2qy3PhtwTUU+C&@QRR?s#an*d$~-v zN(|H|Y_z0^W;E70r>H!>E3O05@X|N zlfBRG4P{Qrn>y1B1L&4AtS&B@;S4qGz_y6PoGug9qcz8O9aeY`>Ab(V@5L(X@sLeU zxmNoPfRbkUUhX{nyZ1Pk$=5`k-BZ|A3V(WHVt1E9>6-HKvmTS{MqGxS5~Iov zPb{<4hGea@7k~0{|AUT8N z43aa5z$J4f=XeDqOT1*Z&wTs+0lT%kRa@l`)|6A=Ip+=CPe0xL^uNFKT;L2o{Oz+N zVjS^qZ~SlnB0E#{nWMyT2wg`34|sdS?jikd2H!(JjA5iTs&`ePSJ~n{dZf z_t#+rwqEd-e%+&T{*{Cr{q3~@<_EPuL)tB5KB5TB-66UpS%`PBu${21|JM)}NJZ{} zC@fR8S~C}9Mt_Z@h;Og-Kq8bPdU*lFTLZGF-Btf)Ifv)j9-f2W0%vG;DJS1oi{I88 zkc#*~_9AI3(0IDdn{#x0YS_H;KowDk(x?jdg(aTWczSs z$m6Gg^9r|KlOD8OsRb4_Z)u)m^9@|UEDYf0%%%uM3f#*Lr6xf|FlED8cFT_YbCC+m z+Rlq<6?b1ZXn>WFPvqd<-5b@1<`LA$k0drwo~xLP(3r)wP^$EF!TU;v-n4=mR5}@f znGfFHdp|>ElNY(h;Ks&BmNmjat6M`_F6KTmT<+gL41>jy8t#9`vbR=Uaj=xrF*p2i z#2`|ONpM;y(J(6%` z7Nof~)>4K=cw-NX0__%tCCg&NT~EDTN7^xT84<=n95yW$D5|S@nxl(;{;0Uikt1Dt2s29ka{&cJq7OZ~( zq=1!wRWiSK$$Z1KOl1OEN)!%98yhR=*P2NEXZfTv^8s#MXU6kkVhw4^QlrA5k59Hk)Zi>sfpHGYT*g)bk5BNOYy~L9nmq}QB9Wq|P?Sj35!sFh% z*Fcj*liw07X+O(PKMYVsh%>Jo6#o6~To!j0)UF1`tCv665T;=TuAWsnxO;YQE>ef9 z+7k;ZI5KYCt;4@f^B{H~73mTq(FSWeglG&ZJ&y%ah#HDaBw4s2^nTi{5j`#--Q+akxhz%VUTn2ezAk z-Jj^<74Ord1z|!$)b8gy8!I*#F_5Y1EvsEblVd&45#0ZM9@5%=UR17Muf%FTqITPs ztF+_SskS%I+QmTOMW0s|z>O08cxl0ZS919GOriBa_AOjHl&hlFco#(BNn5VN-NrND zKSJ4P)b;Y^99|m`awX218?&fpQ8v1)E2#^!>tc^{3D=UohwoA`1=Q}2G6OD%JeWAz zN<8%kZu9Og$hu0JDxmZW8bWH(UGxAp{6P=B2}0RfjK>LdVhRY_n^B;e2n*q#RZ`_= z9s>d$n}kp8FHY@r_W>o}BN^f2?WPL?vFC;e@t%hW)TceN80Uc!OiFQTH{1JKRgVDD z5oVmu5NwRv0=N8Kn@JAoD2L5_tL5I zwC-@WW29KhElzp{O)tV)`^bKMxKOlZ6zY8|(m!x2NhX5>%fc|LR>X#w^nty#@s&nhrKy<%Z0e8&I8O_>{IUvoo5fP8U2bx!LF_ zMvq+be6Ge^U7l zKNRWu@HbI=ji8R}h8W;{61vfHcz8I8mHzUba0M`_v%CCj-f(cN$xRe{9#s7P4x=Tc z@_DRR%oha~Aqg+t?;)6J8FfS@gTg2kEP+??~zgZQChew?D z?ZJ8EwFOR^hzb`HTyF9;FH}RAVA%N!ikBZvxgQpp8vGrHLX*y^3xBB~FhZ~&SR?ub zuzud&2qx*cKfOmMp43p2PB>wblQ(;ExE`bz#7nQfTA?>?-NEwl6FGv;E$Xp>*Gr8- z+XS_55IMJB3`|{G*S0)GxS)nKs?uvyImCt0I9)c8>Rh03U1v~iEma4M4NTS=D{Ef6 z%C(ac)Sl;Q=44XaCsPPv(#@&~F!DEHoPxKowv)l=!%A|?iaQ8sDtVe`fT}C{%A1gr zix?`gd)pctcf2U%Q_l$kmBePCC)X@a+WWk_GT`){TVm;}&%ATcHFw}-o5iE{wflR!lZTI(|xIqD!`6A%g7*R@mVSBb!7F-f< ziT)P2r=4FAT7x#{-M|j6_dW2@vxr8tts@nAMIhee-Xjy{k2|Y<8AY+5I}%)0iGhC% z0qkdSZ~JQt!UKIL6JX(fS0R^2XJ&@gmLc zQv0qLIEO>nuZ`FI$T&@()zZ|><-@DRS)h+HOcIGLvZ$!k_@4p<6&BnYsGjg(U!UnhvX_g;1ur2V*_36ZaHm ze^3c-PMj1&Y&co#OuS5Se6Y*1S%#S4@!-62F=Ii1I2*$$LFp0IkbQw(86U**fng)6 z7v3HA_KxDSGeO7$pm2V%Usbh^5pc5BbZod_y!`L&B&faT@A78rYuT;ZnD&mF8fJ1Z zWCx^ELvC6jP1U220ibU=0o>eEt5IHJ2S~$|BG%mTslA$-+Qx`cVl#O`JrxpBseg@5 z1dG?aPont`euUiBI9nIWt2i69pk*kl?`^&@K~xP`llm2?10Z zXZ~&Y=PC^eMj#oi|I=lH%(B*w!eym!15n_zrcaN*eDS1}NN_v?h(>)HrH-g*`crT+ z?UYpj{6Xy#t29Y-Pu?OVw5;2B7H8AV%Le0LtYh<1XezzhWuD+(%0YzBZeGcLHgGef z`1dlDATnps5uTIfr2|@8GuI8I`N~MI6B)m~*;|fO zSv!)~Fe32@%Yq8b1qn%uHZZF*y^1{;W6b%hQ< zEq+p)yxKB$ThV8dGt*&2D}qAV0I!woyq6W^yvFzIi{_Y-zCP^K6a|Pa_(72eSOO&G z5OmoF5LtN_IUPt$rWDKM2WPVIzJ{CUr#V&2Gy{;ijDRGOkXImgZC?az9YIP46ftzU1LrjI6Z{4;sL&3N}BrvCgfPFekBisTT3}i zf^hEKR$rM`^&ZBbGLLclq3OgFEEU124De8D|fr@p( z>@IlG`?iU_F(CRTV0C)DFN1&B8pYP5znrJ{J1b+JsZ0%UXT@mHjZO}XXw#?J zPux?s3N^ovwovG3BQy;0jb4_vlYn+0wzV!cgE!UIHC$^+MRKDX$0IJBuDqtoHMmKa zG;{fOp~Dp-Qqpk#GfGenD&O#|o2D_X#|m6ExETozl?=~+Y~j}WBGJ!`I0Z(-R%$!J(Y-VD`8<${=X5JQKFlD)>s1AWXLBVmA}oYK15iMV|+pW zt`uNoc$<^^DsolYtlgxhbp2TVWykb_1i9+=50=3J&7jHk65ViJoV(TR2KxGD%B%PC zp~M`$g%KplxI%FYI*J^#495{s(cXxR7tzcPbj3sL5|WNxx_Z~X9ZCB61OO6$YZn2}n31IgU`v$@YMj9Atm%NJjR z$u$B4rX~=&rU~uRgLm~qYglUiT!mvy?l9rz5L`Y5F>l2Nd>tV3EIY&u1ye^A0N5*8 z^x#&5T9PABTHYTFTkI(|LP*Bugwn;Vj0E3%>vbBrZbf6IZihSu)8D$*G>P3P&)_jh zCdht+a_S(^3lVnrSSdt_7HFg9!d2*JpZo#?mld`(3E|DYOm$SEdHDpF_F;#Pq!#%r zxQ2*wU|OCA(0+)kQje6=3WB0TzDWpH9i3N(`@hDlz~l>35*=666*2)Hp2#kb$?^jI%rFi#K2WkSM@HipC|NLr|-X2k+)shk@_3soEeruns8kPTBx z{=5y|)un0bRD0!^tBq&oL)Yei*R8H#j~`@OJ)Dkr5Oy)R?uWj?p(e=A7roIaBp%H9 zQiI@Ax=~i63bxnZKj>2HHN3mv6xeXO-6tzWY=wk1C!3M=P0JqpQV1I{wd(FMjzV=q zWCmwmVL88Iv;ECjzLuu-Ml<545q>q!wO0bQm==k4T1ZS>z6EBUQdVGJzvg&%3(m%;^v1a%w9XW|_uD}StZ^K5nYKYR!Kw4k9tQw^b+zymOB^5tyR+>?&9 zAbO*?a%_D~cH}4gybokmBP#@<(H72NHS2tLeCz@y2)F^k*29BqjU!gPxIueZB0 zvH^KROD=^OLj!|m1UQfFZ|OBdz8ZD|s=D1D4eR>7DQvvf1J-Mpro~P(T2FoI2t;D5 zzfIc%Wd*}{dSTYEIz;iO;6MbOwJEtDAb)^Cp>F&{AS-H_z4;UHZoRU>?u{MbQI4mc zaKFEEzTSKw`y2j}G-!8|5(w@AM@|9JgV?CiDrunVGddj!BXSk`hwe>k?;iFGr%v*~~^#OE_%JvI&R? z_iy&xZ@tPr8MTi2_hp1!9YxJDNw)fj3&r>hckeI}l23kBvHy*m%T?Q0+S}LwP~CK7 zS=Z)J{hmOGXXv+g@@@t1%GbtZT(I~}<1r*_m8j!<56KMmZ$O0Fya$($94GwyF~Vp4 z(9;w)Q>CzOy(7k_qwUKi;{hxjFiMAz#GXhZ^b#L$BhS9#Ma|B*Ls zavwIRWw$F<96Hl=PtRRr+|`(!I-2KZn-3P(UDmzvU_2GcFhIt&V*1_XS=hpWpmdo4 zxQ_+HEfSYt&GxJZb4%tBzAKGS8^}HzC%p;ynvyxFjZ;zohLFFvfMi5KGmZJ_Q2j}1 zoJL8*HU5=utBkpYEj{>Wk`U{ek9TMMxv=7dS(z!ebgHA6;MHiHQSxX z%VgXa5`#oW^XKAjUu1!+*6Ka-xj*riAKRZC^;_3=P2ZXRL~g;@<6i5s!-S3aX%5T} zYD0{KSamA-A>`J*M@G<7>wT3rk0uOb6@MZ7B?_5lNdaX(z#R!5C;ReUXm+q=6-PxK zvmhtzcTB+ZrD+uiAVJ+A!CgiaKNAp#)@Doc)P*ya8AyD@H`z|iET6a>`2}CxY1lB< zJQ-x`vJUul+;)_}oRoftd1OJtXkN&ccyt);20=1G3=&tm5Xo;q(xe$+rA`CO_`_WD z;hmwD&v!)Rmth)UFj!)k48wTwf6^(M^}x--gubWQzmbVfiKf{YY2|#)=-r570pDg~ zDC?I_nUWJHu9|QoH#!{tnQNvqxw*BOc&eGrx&$K*P;m}xm07Pz2+66=XDjDKC_5HB z9Pta`0+B~xe%Q)PCk0B^kQfOh<$WRc2(QSC{T={kNT9w+CYFoE(A-sT5}5arX!!(C z*RI&~1>%3!pQ9VnEpA*$Mw2Gq0esvBsL!Hd;WTE;RJd?2Pb6Ik=8WK~A{=%9CX54B zTN=GF;-%1^qfxHd!o-XK072Y1hf;>2A=}9mBQwIom=;vht5kq{$MDQF5y9H;wsNK# z&G`~<6aWVgGqAh3Z`>o8AP{_nK=$k%5X0--1Kz}D=R?vf0G?kfJGiG?g+iNU@-#98 zc^1Noc?^L{?D%4wW^;Oupb2@6U-sZtvkuNM#92MnbeaqQxYh@SdcVdpWDCc_0F@!x zgrkji=00?s!>G%81weS9X4aUk|2@!-d}EHsw1?Y1@B%I1eaVrR8SumQh*RBD`c~Km zpG0)JkE>4sg{B^Z`r~AfF#ul-K?oWM@<4BIh+NYzP#{nrf302^s^&%DWi1^Z-c2vH+l$BX}3ae5m=?EhH!sR$aJ!vkAH0ptt_B8WRHyD*}m+rL|Da#Kz6sp^z5Y zm~2-LrKiyaQRsUE8;}%;9ekhSUh53jM-9etnlEkro2x!0VEPWJ%=j|bHo8dB#5yvOv*q=Fzw$n$oFHCiLvWP!E)^cI=|NOpRFJ#TFpo>pGc3!J%#e<~ ziJX7y-dgBMkM@e$#D{@2$gy+4ogw)i7UjGLd+Jwv)b+@t_AR!8M_$70|f{_gC%{Aatc|&g& zvPLP;6qzP;I$lsGsWDk_-Nf_80Jn|@<>j0ApKA=g;yBQv{|Ly)Y;E%j4@7`Dd-P+9 zew4+60^Go3kv)3zSsg?!-SREkVOo)sKVT7n$Ca;RdauhUsjJgDc{2s!7kIaFcFq=c zum*wTgy=x_zI}4r5Cl@uyL4M&Z_o8j#u!3iiuRFi#I z5XrxAks{H3SIysLF1%uYJ{DWpLe09BoC-k;b00Q54Y7gdPA&2FzR$?LM&xY&V}m%R zTebOLt#`*?b~Qc11PMvTmfohBtu#suNOV8A2do3J-PXN!haYe8(YxfAA6RHzv?QXX z5jt29Mrz&)t!BOt10gIgLVL*?DBm=6;rc|S&3J6eD_w24FhoGtNDF=@nG@h&udy*J zpRh-MFig?d9J$aGD3*8A5%C&vcZP{?M1HciTL zes%glE2A$YHJWTj>iVf1#!+-j@7!lTlAt3YDun_m?BJM%)JJkcLI9<{+7RJFm0}=Z zsg`@^@X=~U38WAdIcL+il>$+Q5j=Gb&fl5;CaCx|WL)GzG^dT>xciv7@v^V{?b3%G z*5@f=`^J{wxHUoen7Wkc@3Avb@hjPHGk)jSR)8R43PO$6vt~^aQqntJ)@w=NVGnHU zfz6CM?cz=o@{rR91OUJ|xh%bu}oz7^m>2o1*aJGD%F%z^8VC-`&KTS#s& zpF+oxi}Z9Ur|=*nakjg9t$izRA)k^jtm@EF2BA1aMGKeIj^@kjrQIftTPPJ;7+;_= z5;|L<;y|2=6n~}O!zV*Z3$bEt0!aE&fcgzmuHwsF;7@x^7#!!(R=1yU{gL%b z1vXGjXaQb3a!?~x9Fst2;sVYOJ0DDo-5x2{1DZhca0EvlbP86j2{Lt584334Alt~C zU$vCYW1uG(>~XS{h}e!6Y8l~L)diT}VKSNv<_P+RSwp|)TtE>J=a=-ATWkVyZ?PNF zp@tQc$b<5Xm&lQYm>P10eG$dDnykN|v>_0oUB0i^2O)M93V%qD=b5OEfwN4!#Dh4M z(}SUU>j@n~@=v7()P{pJi6gFHQpx+Eex$^%s~m!pdM~%#5e6zq!}o7O%@z6KTD2wM ze!3|S3}9VkGH_}ao)VQiOt;&^Z7*(g7GuzRDmv1KY5;MtNKQI`;k48WxZBjW9sM|P zYL*7%A)kjL=cJLU8pnlr2l);x!wYXvJVf)7FS8)=jST-zf5rOAA-8QYE5pCJ9M$h? z=eYza0Dx0}l{(y|nfb(4-rH=;rvfjAir^otbtjA=F9Bj+lbFVu90yB9h_pYMTYcS2l3* zTY}vVn*Njf1@trP0HK&=vEWM*L*Q~M)7i|y1Xo_9SWDWh_Oga%4qqfMh$MgpIUyg> z%{*h38&|h?v{f>f*S_cQTdM4$Ny! zyhrM#q`K`{Kc|yg17R5mm$z2sN+6%d!z7N01kRo_@c4M$#@yxGTl{B;TuDP4;wzy= zayIvl$n4hy!4#ldMWI$e7b15knvIKsQUn3ue2t$dq7Y`2MX}8o&}kv)xSq|pUAMB? z(Q)@kk{#gYUTHhA706uB?xdwd99U>7L_p!;f}2390~9*W;a~mNBiTbDP&F}}7^$cL zN)xJC*c^X+ar~X+<$GjUUIFP=LKSV4STsdWYD=Zl&(^2Z-I5CCCqTRTu<4;wBjBaU zhBR%YlP2DK#ktud6I-(0MIt*5on4GnE=LbrToWk<(tcoFDJr*L}0;v^%6#i+iyTomRl!OY#=mS6i{BSG3Ja4qN&G% zKaIdDXJMe=FaV2x#TyCbk#zY|7SAeyM=K|>&F+8hM&ZfT{VbsU#;qE!vc3A|srUv- z%_0nUe$o|QpqT78pib}RVH`A8dMM) z$rZRCYw{!2LXbo>N{v9$s@=eP_gjMqk}kXvssU|>0Q@Tgb778-ol#GzvsDaYua{)% zxr~*Xl5hu6sHK|QRGIzyQ8E`ol_7BXRoy>XnD2IS?*coYGFw zWc&~@ObDS*<@medtc!?1f;r!?mi-7FW@E>$IAHD+0!&?~j%sFVs(_M;|FG8P_LID; z3jiSfx4QXR5$8ro7&_(755o^`0#$K;la~oNcipul1n-_~X9%a|@nbtVu&oe&*`BN* zfoVcdiUJ3rm?+Ey=3QFYsP4o}ou1%$_ESS82lVb#1Czq5UTz$^>@W%rPVpN!^Tw;( zP3H&%K6BZ!9ERnKMU!S^LTwi>6;z)g(W)-wlf*_B+QCjEMLSq#D@T!`d@XFUAL|2L zl5xHLfBZDD)e+}de}oopjCJT5m}qq*r;{~u39vm0!~}t8UZyOlKIkcQpQ!5JPC&9{ zp)!2;kf)rjE;aP{lBw17)Dfl_1|lU!#$$1HN1GjrB!@&YJa;Z$x%Dy`8y4vUX*MWK zGaRh~*mEQ2CNeZ`7D}Q5ktzsk_q{tbTpuV}w%4gs)+-q>+*J_!1OlQ=kB}8yEfFwv z)Atw#D%0PC(UmD(HM-~$N-1r;q(H{ZuwQcF7r`47GW3=j_qc}IuL`mkh`6!mZOZgA#iKSkY1F7u%H#J z8PK}TNJUpEBuY)n_?QR@LH6!}GJiP`)Vd$Z;ol5G@G4Y%++u+sBF3^@3nu&ChjKPD z>9P^}si(PMjeW3z!a@md^U=WPFL!ZcgH*IhBXv+>P!ji08xkAH?Uf%}hvL5G1BV-i zz(II#0L=q|C|Qv3u4;ak9rq%5zbm|lD{r7a5oSElz-#s{{T==h?4&4+P)?DWL*n|uLAZoMe5usb)xXc|{%#1{LK8#z$ zeYFr~D71tu9*zo0Zfkl>*ll#8z4oQ6AlXSEu=lFY!zT6!zQ5=7ke1&>PBQF1i1K~V z-9gm7`~~^!{b9C7`XJO;GD0qsy8d|8lKaCgppIZckfBvQFwO5eL2V4+G$eLcWC@gp zL{c=@4P^KT+uDFihxxo8a-!0T5mW#=SARtb#+ z-$=m|;#t?P@uq$|PH;KdcV*u6*j>y(IhK(=`{_dN5y|@0ibfT$s8aZZgyMv=nnA%3fmt~5O(a+l@~WzwJ9`6UiM7`qu>*3 zQB&At?mPS&{re+{PG>Q`cu0j;`!j9a52Snx>I^n!@TpVtkh;n7({Ja*>R4rj7E||@ zbxzfPmO*hL{aPh%5>y_ggK;B2p^5^j!09m?Gf#n~EgVqR2-m21cru`Z{7V-sY~X#K ztFh z!UDtiC<#Bx5;{RHEJBT~=5BkYwjhF$c;<)oupMf}$Pnj^-%)I7m$+%T{FB`0M~tup z8Syvk^$pPh+!Km#EI+^d4nldw-F(bs+$J}W1JoJATdca81@DW@5kr!{UGBdm8+N@BRulq6|-F^mD!~HgMQV zi?Gp^Cdp>KVDfo@u4Kv;#KU{p)9Y*nLT5}uuyuROKidjbGGuxH?)HCzKph2&=q;ND z9kUS{mMozo6wmx`5q6v$PC-5UztyV%sgt2qv2a1#g_tk)siC1^on9@o27sZhTot*f zI1xpQ%DIR=NHXdD0wZZ^GL-z^Y6WO!*EVeF1j~rvYIue&@YOdefXr5c$|f?T%or&U zjxJ3qf_wJN9rptwd~6X^Q8$z5_(M^9Gj%}~)70pVeKlYM>Nrjm^Ppl7GG7Rp4LoUh z=4$vVLb0|`xjmYMiV38o17Qd@4zYoLLT(3PZ{9#d!Cf)+Z*ozH5C|A9zvIVGdR_oU zhunH#CLrCPeQO%VA^CFdCU!--WNssP9x0WFa5i`RlgkkqL{MVN%7cc2Y3z7-VQIP- zkg8(5SlWVJ_|N~Fvf}^kdgMR9_+@B-&=g9pZ@7MWrt^QoA z|D|j7yMARtOO|Nttmn)C!Cy^|ZXw5~rxPPX8mX(>nv7KCgqikVwgwj@p1*u8q`cf2 zQ?AfT^l$r_z+0p{?ayEStihji@aHbzdHz|0KWl*S2Y=4NpEdY%4*p=IKhW?GJpL0R z{BehWAiu2nE(#Db6aN~YjqAa;W%-I(m~_++d_BbNEYUra*{KS{OcRUIhj z`37rS*lemN0=t|AxyDw9&A9YR)p?cA;gR5UryYICgMxyvGc&JUL0y|d<_d+4O!-1g zjn3gu(^7S|cRl5rpA{~5ABQbefWPwCOx;_hK3Xvrv7A;*}T^059)Hws~ z@f3L9Xlk7CTOLX4m5&9qw6qjz=b=4L4wePWmM18JT8tPBEIHL&)YqhzPbh6zE&pCl zu$y(CEy_2hC@|J}u$Z?y7j}7EM-4aL5j!TIKxFgbW8!K@;tk7_L)?^J{a64-rxCrn zx@s1*-p6wyf&ClrXuM#O?!aVvcpZm4vT^32koysjg{38C^qW*wQ}br;P@%rm*lC(M z0n0k7a5qEepFwoRk>kYFM1Y5o8(H;)g&9{Y%EpGH!#czG;1qKdldcxA&oL2J0 z?OQs|#|x^XSRpUd@eG@qW=BnD|I?C0${kRj+rVVV>eWvL!P1}{92|DX6zjV9uXzlEVyC2 z$5!oMFw`Y)9yjj?B?>Pb;*3~VE&Qa+F&flXk=C=d%9gx!tSpD>vi(Cgl5bJl5f-D7uOYGEw2 z%(V1?oqLb$?lrH*VGG%Vt}RSV`eFwK){$Z?Hukj8VF4wth?{JwpAaO!a_$O0&F$NV z^s%0q=SR+o-b`s=c$V^8bh@(Vmvlnr%tqDZ-Jw{=0*yz898Ur~uLqn>{^$G|1Gy(p zUUG@u93lNgYPjfr67^zYEm}LfI;Se9N_c(9kAy>T07Q(k^KA}PjN}3_k&4b6f7KCa z^tcpRkOj}1CDqw-XT%FYBm|f{zn~uH~O|dktOu0iFK8B1O z=E)jS4W)1Q7J0H<)0#H1so1k7at)$}3nZ(ys9rW+7E0z@Tl(kEMqJs*cyzLFR5N(O>1KJbhOV)n8WKc@n~S=od~>Jf^xqmD9ggZ9zp-n{ds?oj%^x z%wCJZN3;Iq@wW);=LY+ur3KFytrNXZocl{C6k8-uH8(^D~7((2hY&&kf zvD;TXE_Qp#FPgTyBYF<|_VMErkCXKsXXy(vOXeFG^cN*vN1ROVwJ>xy3Um1PL>b!W%^|qIJj_5 zmx*N@EiOMw-4x) zGfcpjjnXXjcMr73i&tN#dp*E&XfNSEpQ;j=4`QC=* zvbdi*Z9f~@d3i$&20j?d@X?pIN9+q1?HI;MMk}LbDC`LfMlrb~cRUs~pEP$rdR<_( z(Al*kmd;lF?s{&^aVI5@Y_J^HY2&Vv;$53iKXkRP?})7eou+nfOl$u=*)zGWx<5a# zUXS*VjVngE)7XrD2$$hg@%h=@>9Qip-Sa43aUKuP=!=D?TKYMPHcdstch`OHH_w-Z zzYLL{YX7?|PMK??{nPF9?BevwRWh(sdLH%*{1f}Ox_FF4!cusiWaHRXy@A#<8NL}f zlXeDD>7P=rGz~$Hy)zvpTkYuXqaR`OE#2Z&qjE_ z$I)S~;_h)LYpzE67??R=vyhM$ft;@t@#TUH|AJJd=3!hy~k=; z$%a{+FL_lP`jQLJvr2$UR@3hNBA(aOx-6qe@LhGEW)6?1d}P`(oqj}QUzGD4v8kJ- zlJr!eefqj;hNEn0)%+>(i+4Nj?f*63B*06kGf10ahNpjdsk7ggZ2D{UW?PAYA{}l) zEV<{5J~M;zHeu3HLej`;sewKLj7^^}%Pd=V_5x#j#-!E0;!T2|Q*o`RXO}T1m0a=Mo zibUcTeJ)Do)PtyZ7=_=5OD8O&_H93tEVSR@h}SHGdkd~DZ>L?w539#`3mwENwun}XZ!Vv_&UjHn?`ih9 zfb!5v#}>bORJB#$-f9EkeI=dk<#a-fE6s+PDLt!UUlCKhW3SXFC8xh-7lF ziB`vBD<6C}SHN*{7>n~ObF6a|7l`)yZQIZs21Nu$3(!^7s~VW@M$HO}w|Otr8F2HT zJuf50I%!K|PQAW>xn$TU`-uAOH{q7X!IN{Zs`b~%qp2un{8*<2vP=#Ki8;PKIfp*J zUR$w}c_m(%mp{vF`daj`x3%@xvq`-Js$V(c6~Asi`KXXubu^*Km5Gr~RMDr-$F#z| zlxlJZG3|$xfhoF3dfii470bYj3i)y`FJ_j(x|qg)iT%E|NcMfe~+^ zqu=?vi3}41!yFx{@nx%imT&rzE_P21$jm$Kk{4Bjwb|nazo6ttn%;XpU(#>ys?4{g zj3jU82zB{#Hs=ttKCI3aF zsLtA<@hZJMRURLM#e>-A>>E*WOhg@F85_Zs$5AVBmdz54nx3y@ma_iFvtm#|)d{J-kvAndX1OL`^=FCh)ZM);cb=QZrjacz$LP~Qt=0;oDMMoY8z&oU zEiApg@clFYw722LUpyhrh+tlrer~^qAFl6cL3u(bRaE;PkKv28zkiVgb#?pX(zHa? zr&$2xTfF`INZA zrE8?(yj(2RJDA_7zTt}JzAY!CA$HA*d?|LAF_A1i!pBbXwHli!-Kfi%+f*`@+iLzH|o#MPctF8|#q2 z^;0)ft7_ScOz!7u86->|4gjj@EPkfN?^H&qc+3V86<$ z(9yiwV!(B}c*T9VhbmJV^L*@r-D^I!j9cUG1?OfPcBs_2!lVUSkR4rAKj~jN%vzaw z7G3f5iaY~3Q<<%eBq=`~^+>z%7NdUq&SR~MJR0farYny}L?iNxBu4J0v|Xg>?5uy? z>^^N~p>uKAM0v;l-QmlmQH+GaN@~q{8)SI}yR>s)YUcpDB;T=tA z1;Q#+uN-}-B!$i%Z3nujt-qZ?A?Wgs8Y;h1dnNcDP6F?*XYp@Ec^0eK%6%n&V4hQc zVj1o*)(VLKfT=oW#IESg9g)aLGHA$&YXlXY$!!#*^08X7Ba%J-2lr37{z7MFtTwx` zYPbwjP@ANTDqXsA8K-32!3=(GMAlGMsPi+PdvN=IpKhIbo~})6f2V?q)ZpBQ*%K4t z_B{`t()+XV!{cRln3OxiKWE?erZl~nk(?~uEcR=#hzSzfWkNw>0y?HZF{Wxlcl=D*AgiK6|uxQK5>GQg|S> zaQ^J9?%dp5^Uh>@yCgg|8w552-|+LC!SNl+p=T;9H9O}g1gHKo({G8qT9yCI&|qX` zqFM#|Vg^8P_8$jlkRmEM*=rG&49TyYCllOkrTu%3IR?7u7Wt?41MeC`fA0ZEOi~OT zLdReZNE(aicpR7d`uXjEa#v<%X6vSF3>!=?1657Z{VGtc?h6TerBPFM=61t>%5k;U&iZCxk24vQiLH1+-2Kok23Gyu-SVD6VvSBgYmiaKkI0u?o z(x+VJJ4snozdjD>|MKMA1PH)M%v}iHaFV*(&Ks76=M{R1CE?O=KzQkdto?*4ed$s} z7pOI4=^QVqz}Cq_XENvO@8|oB<9Sd|J&u=k0;Zq`j!$aKBpljZNCkifGH}K_iSTi%$o^o2C z%+smY23eRP7-O-6DE5pGVmE$);#)5?XwpeQ|9g*;ik5+~dvBY>&WAqL9-@2;vM}yk z^zYC8FpS5aiJ4iUPA3tQ0j;R$W1*my6sZT5qA+4Z9*z=BOU#ERXJcrpN}oK1aWl1&S7=bVEeN<9D?z6n0geM8iqR&uv-cPZ3=S<^~%c1DrhvlFTqT< zL|!3{-kr9xG3byl555oyEqUgON=kGRAnfm+4$Yd;bv>-0uktIv3VJV1VBX%K(coE- z3jcwtKXns?mgSICXpGZ_F2Jr4FEy}~L9nc)V~RV`PnVZPH-&|&0qKiw^_r`*Ir z+xr`sLhQWVBd(;Rlm@+ly_?#6AjMF%u?0FLx)!Gs>+VB;Ss`OKSk7D{V+u~IHUl&_ zy7f70mSyNgP0Oec741B5v(}G&ABpj#$y?{{>{T;0J_p{PTjG(`- zA6ox1*ZJL#Dxk6O^^uV4-tVY&HY_x*KeM9c=2ih=Wl6p+(Jj=`9!g>C=FOYgaJUXY zdvF^>H#Le*VZ^Wr%$$x$CH~tkgulr}xNCch42E{fFkUH^YN|rXct6iIkxEAu_R(hcH9OA1`a@#+w91_gQYxml}AcaQdg*rluh@;#uiAv z?F?#I8iS-LVYwwp>^+ygSUz0iR1AGoEE2ssrw1ya0?4|wYgxCSPMC^FU?Mv2ma*$@ z>n_e~l?%uWE|~fKoO|3#WO(&D3dT>>LQ`poNdhuwhw0}!1gWsncVx3cdHRx;_E)A-Hg>(YGiC_1il~Ps<)IuYE zrg2r=kpMXinK3I2n9D`b4y(>G$0wl5WzMhoK2Jf%O0>R^S+FYInrxckicwkkfsP z#~>)U7$2QLcd0Qqya9t*oiCBZ2uGP~#$64>5;l~})O^9{~DR9d(Phky3W{_#ob?p6I1m`YXQ!gd~~ z`Z<+eI;M$p;e%qIh0h$=m1me?t9LjxIk}`EZ5L^1SIsNe5)=D)0$1&04Rm#LQwlgf z)E$KhXKaEk!@$16t%t8X^%hp2e*~rHm<0W8@VtoBQRgaH$y`uFG=T|pd`_FG z+8{bM0h*Yv%iUnAPKgnQNJHp$;qi#P%}FxC*be) zyT+g(kH*03b2$Iy23ia|^Pi$YxtMSojycIA(2sDwIsiwHOc=L5H8tqVOvK#$VudX@ z|M9czK7$c8{eykkR1y&XmDLk6ZVSzV6EMl#CzEwl14nKnuXktBuBxfR4-ZNA5?C5}bO^ zT(*BD-BUsKbIenm+A_o1M;0R-(Pc+?otSg#B97OrOqcLz3 z-@w|3n7lIshs|+vbNumTq0>@m9yL0T$ck)(i>TGUy#QC{q5B#PcJ4gF%TneSr5j7F zx)U2C0ku#r$RLr`ua6Xq!}z*@g9Ol;7Nva3k&3lAT(N?4VVPrKp)7E*}+_8=Lrj=&ZyVtt)YFJw=0fU0j>m? z`$^JUrSM-vAu5mtNx7qoK0U5K<(}Q& zhqh+g-J5FF_IaTGlLNS1f>Vp5Yg_cUqd?WnC-M@5j++v_V0Fc%69m+>3smI0nsn=r z=2%50ZD1^n*b7Tgyh$$)Pks09UDSdd_y%W?yY`;~mRp@Q0LGrl!(6+_yQ{;6DcY8i zqpuag=MDiJQPk2hKSEFx`ezm>cttO=we|4iJ+)VNUkPh#iOC}JKWo2rcsyExN&$15 z0T zK`T|iRy0dKFV9NFEt9?%4!@gx@d7m>9PHEy2y>Ku7GYKUamXwiGzJl1e{O{gE_DVu z;JX9grc~^_A15M&xPV3MAtpz|9+kE)z6ZqgE z(4$IScU|CrjoSj#Y6|_}Atv+Z_8SP?Uu9G1fV|-6BcSZ5PkD4d8-OUu>vI&K-Zg-X zc*EX%2|y8XfjOW;l)lSr*m(=IxLz>G#Qi|V6a$PTJ@c-G$_4p956j{K8J`^1pYogW z0UY6XSnCIYE;mqh zSuQvW@UawpAPHQSFNs`85OrgcFo8H_{7i`B0A&I@czbW;o()F56p}9(Q-|P)iG@Yl zi8ToH{Q6_9%64lcdaKv#$k~&!@9HU$@uUQPry<+0 z%*FubN58%n8Lm`HP9rxZj&)p}s@FmEG4#?&Yi_K`cA=+m=TtjeEojKw#L_WDX+RgWl7u zpDF+VqnaU`7;zU+trkl9>An|8Xz25ZYJr|kFk62bI4D9F%jcY-Zit*<6%4TgLy>oS zvVMB)-olx47k|O{!k|$+AAOiXanPZ2l8gWgaBqX4jbl5c<N{GON^7-VLA> z0vWE4oSsyHPP0_24t*esU$ zLoT!7S4RSj0)eD{5=!L!6@pQeXj#e{;V_ z7^DF1$%mgFA}Ub&G&bcBma052DD?I9^&U&$wL$N}3`;JwfOhcq(m;nQ>1tm2WG@VR zMZPOaL?eU~u7q=~Jt%=0lw^SPhn%IiDQE__Hm0g(5(Ed##^~R$dIxBdG!!)mXVT&0 zc^-sgZU9O*aZmZXx_%1y{Fp}`JBX!?W0YlvAin~ z7%<;t8P<&tqHyGN0v>$>_X6csnV*^Y10Df`J5dsx=AIz1c6a*%T!^)uPv}p@&O0Wn z*G#tyWZTm75N))$>q!bC2kTFvwTtYG{DG?!DnKIKnktrgiB=brf*+8@B4i}zCX{iz5l-LYrDHmSFZD1=UT@)j(y+PvBv_#I`vhIi^CzC zzM~pEo=-rp8mf<#ss8}8O2^)m@yQ)K=F;i;c|^&B3(n@9D=Pxe#K$0M>5%>)2@C1b z8Dhp%nP>xahiCUml?n$Y^ti(^wFA;sX^-!E^SyOv^HRp@*_8sK5bE+*@=^3gPHna5n*=`~kX6r2#atg|FAgm*<^Y##_-|GZm{t zluED};=EWeZNoG=cU@pLa|^3*YO~Ul;aiVmN)lgrzUqD%>!m1l=DiBqNHwER4+{L# z^$*c();MbM*Ah}(9!@)H{FwAlk=wB~tf;6cihVm$@<5A?dT)O{xiQ)hh)y}JG3x}5 zX1~iW`BVG5qkgw(c3V0+0d7}T?n$|Je(X~ww!d#NJ@eKTHTnyFrB8>W|B)Z7Li`S5 zF?oE?-LxP;|M`nozZaJYY(ok@ZE3joSYc~M+U2mfG2tRgdwFgRSr6=vM2s;ztT=UN zd=B~RRF_M`mF~PzA5LrIMrJmYQ&?%ubhl5Ia~Xo!U7S!}k{lLCOu42YcYQ{3eNpYc zC%wMQmwup)nz-Nn-4+*#w~5>K29y>HA(X24#Yv%68|7OjU$E)y{ph_5-7L|nFnmc;)Iy6Fw2lQN%}|d?|tii$q-^47mH_nbMl{yaV%Y!zTVlU zBP~QF-*q?~B$4~HzoJjm_?seozsSh3Fm5ys_YP$ZT7T~M~*@edET8&R+VtX|$ zp)myf`NEeFc9UA#wRqwDui9NY*6wP*Q9oVYk#4y6v$X?HYKj7fX~!wdmZL=;PhlpL zh=x|S$oJNiRzyZb*dnNlh>5|=X~7kJEzZBjBr zCI10|TcFi7S3A+{RB`f?C%Ode0wVKT=`FK)bP_QoyEfT-BhLZ8Bd@*=sbup`v5#F_X)-b`jpI4a36mR+QK7i!If1%c8z-7e{rxT55AMNwOyl$UxsNJ!LK6+IN3VC@^GwhK%A@E#ec5Nt zCm`%=SW~*U=>=G#Q~aO#i3Y(|pVU0>jvSON8x*%w;@H=dvy%p_E`Y)}A`oe{aT{v(GCR9ZtMnx~3o zIToM?Rg+BVtadSK3i)$iE}MG}Z~=zwNzd;lwbvv25jco&tgvpatys~N8SA=hM?;-* z=dzCXSL8Xp4PSWzMkMyaF8k|gD^{+QLXmh`=*^CuJEguB-fTmg>ZAsxxg8H-v3}qB8904rxb3PeGZu7~`x?D7nQJM9YI!dyL`1owH2M;#H8>6S{>vsd8NJX$H z|AGir>qP{F`<=>PJJ>s*76++tJ1Q7_#Rym%t#9i?{Gv@{3J0R}@^0R2J(O@%N~w(+ z6mjMNi|*D>618vN8p3_N-W47y7V}+s4#)JzSO&4)T7mFR0$aEm_$EVCNQfZV7EA7^ z_(DAQqwS}3XZ96ztX;2s0(sY(s+bQ_uHSUEgmdn1P9{1^2hHZ4QgW%kp;(I?5*zi!%PUP86E^ zBjZs{&-q`|uG$%KvorDKUE`$hGRIbb4~XMnacs%)eiQ79`iZpX($v%>j%}9Tv@uS( zfThqG*9KXy6rTd1e(v;#8WK{bb^=&7@3D1Gp~>$V+>?c|R9!;@dvtaNGM7InE=5wU z6Mmj?i7sD|cv|xIj-_*V_j|2N7uD3KnP(< zqhr&Ix?APR52fDHuCi^k^YSb}EZc6icuk{NaLepxcK;N#220P#&?=ql9&3T?7=Rz) ztUbeNz6no#=iITdg;Jk~NqPJ{N!GaX?{anyuO&oCvV-hAUPx^Bnl>%|WLg+0T})5B z_w-dMngIu$Y(u(~jJD4-7No%t5&a~sMqt#bmF6aD^hmk`0hfO%-}qHkJ5#cf-=+ zp0a<5070P0G5sQoR&D*z`Gtd7Pd)TP6$j0i_Q}VIUEnQswV7EPq-f0;btQ}6>7CRfQmz13Q zH7XolyFF$dB)I|9Q)n(?_<-0eIC2Angs; zcF=CG|}I-9Y{YC9Am=6E$>+TRDAg0fr{_kwDz!4JL>|FDULYlc z9Q-C9ZAwL+crH0;^4!t5D7%i`OIMF)@a3&+e={~?j~;*MTp6EuZ~6^fLiIShLhOdW z@+o>mW?czmxOJ-a2_50#y!m!yTYOLI1LUzDP)J;@~B`DHQ zAwzzfXj82;SuI#RoL*xtaNauC(Qy){22qu8Jot6AyJsY8Eyw&EsSa~~oLKy|uG@cU z0nku+O5Eh0SeOmi!-gx&t}=k+x1@RQh`b!~8NcycC)St3{vh3a>#H5e{DD>5quIQ? z&+jK}DCdB343oU8Sm@wW#=`|tm}@m-52QKhgx}6vu15^2fyTP-AKMA& z1YOhvd#iS z8fUT2cA}5}o%nbs>S6#b_JjG8i{Zh-pQhDn@7~DuHlfPv=!pE{5Y0Sm+iNv^&JUqf z?a4!A^85!(hgUGt^S?GCdCvM(YoE25!M>gpPiV)hnZ_Ny*L(VVL8NEqO9u?f6d|B+ zPc0avDZ=2Qg*;4*h5C+iSz)SGHsBFzp1I8>BqAcxM1UY}N$ZxmP6AXQn=fc`v6ri; zW2qXttRS!@^mI(7&fX)eeY+c2+Jpv0@^Ghu3O4&u;%Wr+kw(q-2eVZTjE%`u`h&H$ z-~2?0&x=U06OJ8z#11t#-%fypore30xtNC`Z83Xn6M)(rjZmxuO{h3*ljpunk&0(> zyne!`@!+}+zn!w5`ND^`TiO#KY=S_`k_J+POtS3D{@J&_M;%z z_85pdNp?ZvR=n^{T{%numwyOmpy7nB(eFM8i}Fnp4~HM$HRqX7gy*qUMJeGq2!EmF z(236HQFEF`iTr!V>nBH(G~a7`uKJqfBXrMLX5%BSsF*tQNrjpnsIm!_c%bC$3HOfE zUT9FdW8{U!6_6pVD``G`8+xwKUDzj*3E%fGB3_>v8+IPp`y|&M!@h6y-52`NA6=H1S>Kmrbf&}#w8`)bh_hHq%bT}tAWKyk*#Si$Czw*gkOyvH3yB)xXE z2TSOz0t$#Cf%KZ^=X`JihB3pP`PtAR)O!|Ud$D1aEJlOVvl~U6LBA7vZp!=wng#=& zAY_QT8558+SmWIxj2&KIb@mZZ`MZ_pNYx^~i8VUTfRFafV}#B{QFhVuQp)i#;Wb7* zRvg+5EHZm#ob6^lA;`8JQ=5WaLL2g@*sz7FW4k_Ydrh!oEbhm|3xqI&Yj>DD01Zb} zG-Ab*VdkJ?yoM&fcj&V#{XS{dy&Fjl3A;SUw-Q8MozJr(@*y{0usTwkNP(@@{8aJ) zz(uXjJFktR;OU*T#LGfAq_#$j>5enL2HFEJ`_d8AAS+GzZ4jaEN!r}z^ZLebnbUz@ z#l!v!*-MX^_&my5-t)dJ7^-`0IwYH!2DQO$ znsH5@}u z?t4LO`(aJCuGH=J9E`iC=$(i9htzdYotY7sU66`j-Hh4#0ApYeRZOHzy+kpGd(-%` zo*oIgG7e_O{#d>9>{o5tMO)+L^5c`y9Qhif48m|GtcZjZgwx^(eg|1nD>HBZz<@1W z2kg2Ep2C*g?)g@-#xRWtK{JdusD9f2^(zni5hP{xzG{W{k*6l3njZ$R{sA@h$f{sD z-#^dCU9e}Rj)V>5cVC*gBm1&$R~EmB&Jh`9N0TGVrUaWeoWb5jW`VfbBS1tVyLL%` zu!~3RB9*3gywY*Z#=z*W2+3(zR<6?w6AX9wkQT=&z=uhPGX2Okk@>pP`CBj!5jlRo z+l>bznABZ2Ng8YJ{X>e{lq$Js)bOBh@^J&zsD_l zUIHQPBL+qyGBPq>m6TB6dU>ui>UN()YO^94X%|Z3;6m*kpq4rx z>PQ;v5fZ2rloNIk3P4?#gsgOZd64Q@5V8YOB|dU&er~Iu>(FVm&WyHi|6IT`-QauS zqs}+&!x~jDZhY$awR}j>tM9zt`NN`hLUHS^#SKKCJ#Z3yAbBiniqWb27NJj}Gqgov zgI?3YM6!lesseYgKo|}sfTBo2%0s3KK+-_Xw~`4)f-^x(^Z(5(=^!037dcP@IVc`}La5Ege|eMKQg% zm#ssa*!>pDE-=7kCS7abVMfM|uXzNQ8!etO*B`p_43#WdplsZBTd71tDCRf566M&= z{;7|aFTe`7JW^-xMtZBJ`xWolsx8x(fcj$f&P2M#|b{i|2hc z?vW_s7m90s(Gao>Ywrl7Q+eFe280llIeMhX`Ggn{!oL-zBKy$eFH>HvAl89^7+|vN zURu5i`KDNWgU$Sehk{y+n2b!mc|&iZ0}=TVQw~zaleq%JL3+p&{1dv8ExXj^ojw&^?^A}SXfmv!^but-)Zq<-kT<*_mE2`0;l5O_gI9y_nrgf)y!I2~>*9=*{z1{(oPyrXk7Y{QdSE=3RwT->iR~2lJbbVjD_T8MJUq?kPcB~lEto2#&PqIWXB9iww3@4?r1s+tMfs-CWUQ|tC~6JBcis2+awFui z>MiJg;ofit^ATRjizFUZAT(D zIfHvY5?|2Y-~TNs#_{Iw8P%z8jR#=M_8x|}Q(*HerL+V*YC5fm>iVnHMo05tqAHB} zo(G))N%*8dk6jT?SAVE_VDe$iF55VdJv{kFevPs}qV%|b)97Ue zxN2PHe%{uC=Tmo)r;7%S6omv1t)JZo4G@aLB-qjp0p*f+?!SJUPcaRP=NrHZ3!&{n zNmyu8=JvSN_RWXnX+4*@BnIR)A(VG_{us`XJW#blM?MLW-~QYChnV+~#06IR%yf{G z&w-xbl`_N)|w=|u*&9>tOrxGvLX%qw`>0FvCp6JDh5^SUF^%m zbnGH(y+eq_hMQOG0@Q3pspv&_8+!tQ;K=Ss49cShJ|Hog8tXYhV(Bfhk`(Z#`+%$b z1rv4IZxt0OtXjWY1#)Bdxfw#ZU@GZD<)w|;-)%edgW}~ zRVEHM6CxoJEBblS+1YvW(x!P8QeY9-d&UM*DqDa@vb-`NK#oKq-4+D?$< zz1DA=Fn{*|m?Z;-fzLdzkUOw8y&iTV3ErbG)JY|ki?zOrPeJzc{1UYGA5fh1Pk9YY z%-#tPe*|0y(siRqof01Hj2D_1v_LgYhx>Y-{%O7ha;|y1G^@O%4h=~mEcdput+}a= z#KRTt$o3E`4!32WXc`g}Z5|HL+I!!X`F>1Ymic`Zi6&pg7r7gaO-#tcK(h;eTb1%|VrQ3XtVXF;#-(1zXqq-?p*UgT zBd8s)dm9=UBmx>tnJF(gwxwpRK|xI3@jfxz_p;&PS6@;bBUmDg@_NnQRNemNJfhlP zt@AX?7%q$!n?^@yVP{|Pz2!@`6ygq=GM5~4nWF`poF1*T)La`L%HMqYkYEIJeuQ?~ zub7*y=?M-_b?27ThrOLS_tiC^^Tm(*%#_rSX{s7$(0=v8)MLdTuZ3@rjP}qndU&>% zagWmLx)x`u&4cn$SG`bo+LJ{0Q_9KbUgeHdIMW3fIKL`hKTaKxyT#p`viC+5SM(w4 zsGA#yR5^Dl=1WU_I|n9+ecxFUeF%~_u42v-e~Dj{P zh71h~dr*zbG;7TCTWZRddKUxFT8WhHI~~dwc*~86=hW!FgHB?#GIQsC zx_-J=z-F;-*w|`s-L;fWT}f z(9LI{rD+u?pRN}XF`~{;-JDlnc(|UDqg^<{n4B|r-|=)qqig(uVP#5y=}^|Q?%4^D9LB| z)1`3mDxX+yJdsz{Q5e%Ta}%U&p0Ki9I6EL-6=P(kDEoyw;nW*hRZ*e!hY~|FWBES~ zQ=7xy9?PjRm{~C5z1!-k8Oe1zrrvYK%qLg>HJZ|5Lq#1O5s`+2LJ@<~$GI{MXGHgo zd8h7(G5A`QHTP)a0b@y1+7lj1uTG11s*NrCZR{{!``OD_g}VMZWA^Gt>`ysok=kui zXQSJ;9(uR&fD+y2;+)4NHEMaRN2u4dVqeH}2Ga6OAvqs&{p@eYXDUO`|=GsWe*``gr1M^s0ed-&GF?DAd03 zyCXiFu!>QZY37X8qjtL6JC5E}>K=}ij3~}EVOi!_vCyVaD}p&`azXB3z|Vpz`f&?3 zw$03(X|Hze(G9W9C`#hyxMj8b@^Z)5#cbDcTq&gE@G3gC%~S<9XC@xb07+1peG}Xd z+P0sK%o+jU7G2OodADwCu*Egt(gu~`rySI;mhFL3n5>)LyE=v3^YR?ukr z?rZNWS*=s@r-@{}{r+{_L+kvyWfY3Wva2a&d#;|ML|@yCFDVks=-3iff85YDY!=gPMqxb{%cvQ?bVe>;Y*ya*tVCB)MV%=v@TNsAly!Pq_9ih1J+*7s zem)|v_py9VM|zVHFNAg}>uj|JifO0Uq_ci6D_*W+**ds~N7DA#Y)6W30LT31$AyJQ z!RO@owsbsH9NIE+#L{Z@D5r|q_rfJZW8*`AY>t)pduuI|o!?g;1of2a1QW(WMMvlM zzyaf8zF=f=WUE7~mVy2Xad!D~4GN`;|28E7Xe<6}>kF+yoJ7ja%x&P5b_;Ua&-9HqSJdK}oB^%GtXSaz4 zC&nUw=O7TO>)ptPr z0aZ{fx=i5BP{42=s#e|bT1&K|mj8tUFFhskX2euj^bf7acTOsrgv4jZcA4Q#ss|^c zy$;t?)E#whJG(gl^K;G(u-QQW*KK!RtX|6`yCqJQUYJ73zy9I+lkY2Y4i160O-;zr zTQ)ljvN~75AMYu$eR~M1CBQeR>9vX*w2nKqN?SLl{J63IBxZ=C(FgS;dcL&|TWdUi zh9Z$cdSvfK>;F0+ET()S%(XW?o0N6>(JXDc*V{d=TXvpVwR$fD&mKJr<#W5?i~z?^ z<~c9k&U=|7M7pGQHEsvc}??&^ce9gAu zv(`PIr)K|^Luq9X^GKC_9``Un{f~N|mf&OS80twqm+e8Kb7a@mWGQN&4tLec5hKEM3$XOysm0i=r-#)gj$ z7l=Q-UW}x>BYIqptm*yx2_;MY-+9s9zA2BUI4nv02}tyyzo4?YJNjS0Kx6p4GV?i3rkC$3f}gVEEp1U644jjNZx2Nihd$9z+bBozksvGKrL}zj#TSm ziG<~b4Ak}=7e(MIA1}qs2G{~&^2ZI@9T9Y4DXR~eonDS|St`LJpl=@nS&%nI@E5`k z5$QX)@y;10t4FA!?Z&^nQKKCQ1O5_I$xEl=%uJ)u;)ntT(dF@+0uU`IWW$?$>2;m~ zNcSoag8G4grl?aP#R~m3F+uJhL6oXzZhjx-nLy3hOga#uFtRzJhD|LhG7}UOBuX)q z@V7!5rlFjif(ztGt!TDZ;~M&oN6()d;A||ZF9X}ILM;POAX(g)62eQ58%#!(iKCh- zwKFVM&v4=e+=pa;E|7t5xHm&b$1K4)NVMC)YD__HzJbtH+T@Ii_<5#){?_F(IKpgO zBn`O?&U9}HdO;u1-*}YLD~}l1jFW(b{tjE1^-;=&g`?mcee5vQ0Q{vVz)wZ`b7L=g zA0=){WX=uBOJ;g+1s+4*vALSrq#uJyG=w^_vKB?sw)ULB6;Or5c8iH`fv?_R$jQPv{utUs_l>)A_oTvQsb5k9`2Epg(QU zHZqk)xFCQbn$t|OM`-M~4VXvEArgvf@?~&@Hq}(Dpt0Ede9*?dkq`I-GE@Q>0!DV6 zC{eId3NVoUKPw`oT;NfF964?SRmYk6PdI3bZUFajZ5id=Yyl(Bal}Y;nuVewp(h^8 zN{PMvl8@3BE$wiRZIe=Lj^l_@{9!z3YE22HrK;JcES4OL16WnrpMYadciTozFRr4P z{$JC{z+Y|!UnGaZCZ>RDtUf8rN>+?%JF_z};SN&`VNfyZ4P}NCtFUZ!$W1x%D3gCQ zwEX-^Kri!2JpYB`|BX1&qOWASo07=$UvnY6$AEE@Ualrb$PFY-d+;lPL^gR~DLKI5 zm1`dxg*yn-8oyIatl__=OLk69({DLwq^B3?qLZYnaV}zIUoN0;q6ue|qgd_u-;>7F zH2TM!C{j#6YeDAC;^fpkf*DCc`f>?HKL+I%kIOR3G=CX3?Nck*Xm{@1X)h^-)c48U z^40MGWb6o~hr`9=9|2yg;3n0!{C%z6`v(`sCqRpy?KwePE$Goh`Lb?T^-};>nWoRS zVYyTOwF`^mylVUJS;Tk#0~#6bkbFT{i9E_-jy~rgKEjyyA+oT(T<~Ng-RFC>Ewd

A;W8d@v1g&1-;W8>fM$TVzVE&O? zCu2I)4NjQm1fxer=JA(CnX@-WlVpwuZREDBrPr|3!AvhykmBG?l=Bn1DtgQ5zyLB&CSsqS-V4YOjq9 z47RUku0|M7NO<+z7-!jGnmqzIH6x!9$gVG57?ab-n6nS@pS0fq9{N5?e-M(K@V1dw z#Ls4Oo3TP=``amINvLyhi$)N!YEBPM%(f(HZ>YPk$KZ$~oZQ9eydjJd3$o<;Sh;Yj z8eI&ALJb1B716RDuP(DdF0D>x#*MAyX=@QK`IFCtHfV?H4-2jk5(1RBSX@nz3p%E zM|t-*JmK^Id9wMR17*q str: + """ + 根据站点编号检查该站点的值是否以Z开头 + + Args: + station_data: 站点数据字典 {编号: 值} + station_num: 要检查的站点编号 + + Returns: + str: 如果站点存在且以Z开头返回"add",否则返回"pass" + """ + if station_num not in station_data: + print(f"站点{station_num}不存在") + return "error" + + value = station_data[station_num] + str_value = str(value).strip() + is_z = str_value.upper().startswith('Z') + + result = "add" if is_z else "pass" + print(f"站点{station_num}: {value} -> {result}") + return result + + def run(self): + + # 滑动列表到底部 + if not self.scroll_list_to_bottom(self.device_id): + logging.error(f"设备 {self.device_id} 下滑列表到底部失败") + return False + + # 2. 点击最后一个spinner + if not self.click_last_spinner_with_retry(self.device_id): + logging.error(f"设备 {self.device_id} 点击最后一个spinner失败") + return False + + # 3. 再下滑一次 + if not self.scroll_down_once(self.device_id): + logging.warning(f"设备 {self.device_id} 再次下滑失败,但继续执行") + + + # # 截图 + # self.driver.save_screenshot("check_upload.png") + if not self.take_screenshot(): + logging.error(f"设备 {self.device_id} 截图失败") + + # 打完数据,截图完毕,点击平差处理按钮 + if not self.click_adjustment_button(self.device_id): + logging.error(f"设备 {self.device_id} 点击平差处理按钮失败") + return False + + item = global_variable.GLOBAL_CURRENT_PROJECT_NAME + if item.endswith('-平原'): + item = item[:-3] # 去掉最后3个字符"-平原" + # 检查是否在测量页面,在就重新执行选择断点,滑动列表到底部,点击最后一个spinner, 再下滑一次,点击平差处理按钮平差 + if not self.handle_back_navigation(item, self.device_id): + logging.error(f"{item}平差失败") + + + # 检测并处理"是 保留成果"弹窗 + if not self.handle_adjustment_result_dialog(): + logging.error("处理平差结果弹窗失败") + + + # 检查在不在测量列表页面,不在就点击返回按钮并处理弹窗 + if self.check_measurement_list(self.device_id): + logging.error(f"设备 {self.device_id} 未在测量列表页面") + # 点击返回按钮并处理弹窗 + if not self.execute_back_navigation_steps(self.device_id): + logging.error(f"设备 {self.device_id} 处理返回按钮确认失败") + # # 点击返回按钮并处理弹窗 + # if not self.execute_back_navigation_steps(self.device_id): + # logging.error(f"设备 {self.device_id} 处理返回按钮确认失败") + + + # 执行上传配置管理,传入当前断点名称 + breakpoint_name = global_variable.GLOBAL_CURRENT_PROJECT_NAME + line_num = global_variable.GLOBAL_LINE_NUM + self.results_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_results') + if self.upload_config_page.upload_config_page_manager(self.results_dir, breakpoint_name, line_num): + logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传成功") + upload_success_count += 1 + else: + logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败") + for i in range(3): + if self.upload_config_page.upload_config_page_manager(self.results_dir, breakpoint_name, line_num): + logging.info(f"设备 {self.device_id} 断点 '{breakpoint_name}' 重试上传成功") + upload_success_count += 1 + break + else: + logging.error(f"设备 {self.device_id} 断点 '{breakpoint_name}' 上传失败,第 {i+1} 次重试") + + + return True + + def click_adjustment_button(self, device_id): + """ + 点击平差处理按钮 + + Args: + device_id: 设备ID + + Returns: + bool: 是否成功点击 + """ + try: + logging.info(f"设备 {device_id} 查找平差处理按钮") + + # 查找平差处理按钮 + adjustment_button = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/point_measure_btn") + + # 验证按钮文本 + button_text = adjustment_button.text + if "平差处理" not in button_text: + logging.warning(f"设备 {device_id} 按钮文本不匹配,期望'平差处理',实际: {button_text}") + + if adjustment_button.is_displayed() and adjustment_button.is_enabled(): + logging.info(f"设备 {device_id} 点击平差处理按钮") + adjustment_button.click() + time.sleep(3) # 等待平差处理完成 + return True + else: + logging.error(f"设备 {device_id} 平差处理按钮不可点击") + return False + + except NoSuchElementException: + logging.error(f"设备 {device_id} 未找到平差处理按钮") + return False + except Exception as e: + logging.error(f"设备 {device_id} 点击平差处理按钮时发生错误: {str(e)}") + return False + + def handle_back_navigation(self, breakpoint_name, device_id): + """ + 完整的返回导航处理流程 + + Args: + breakpoint_name: 断点名称 + device_id: 设备ID + + Returns: + bool: 整个返回导航流程是否成功 + """ + try: + # time.sleep(2) + logging.info(f"已点击平差处理按钮,检查是否在测量页面") + + # 检测是否存在测量列表 + has_measurement_list = self.check_measurement_list(device_id) + if not has_measurement_list: + logging.info(f"设备 {device_id} 存在测量列表,重新执行平差流程") + + # 把断点名称给find_keyword + if not self.find_keyword(breakpoint_name): + logging.error(f"设备 {device_id} 未找到包含 {breakpoint_name} 的文件名") + return False + + if not self.handle_measurement_dialog(): + logging.error(f"设备 {device_id} 处理测量弹窗失败") + return False + + if not self.check_apply_btn(): + logging.error(f"设备 {device_id} 检查平差处理按钮失败") + return False + + + # 4. 点击平差处理按钮 + if not self.click_adjustment_button(device_id): + logging.error(f"设备 {device_id} 点击平差处理按钮失败") + return False + + logging.info(f"重新选择断点并点击平差处理按钮成功") + return True + + else: + logging.info(f"不在测量页面,继续执行后续返回操作") + return True + + except Exception as e: + logging.error(f"设备 {device_id} 处理返回导航时发生错误: {str(e)}") + return False + + def handle_adjustment_result_dialog(self): + """处理平差结果确认弹窗""" + try: + logging.info("开始检测平差结果弹窗") + + # 等待弹窗出现(最多等待5秒) + warning_dialog = WebDriverWait(self.driver, 5).until( + EC.presence_of_element_located((AppiumBy.ID, "android:id/parentPanel")) + ) + + # 验证弹窗内容 + alert_title = warning_dialog.find_element(AppiumBy.ID, "android:id/alertTitle") + alert_message = warning_dialog.find_element(AppiumBy.ID, "android:id/message") + + logging.info(f"检测到弹窗 - 标题: {alert_title.text}, 消息: {alert_message.text}") + + # 确认是目标弹窗 + if "警告" in alert_title.text and "是否保留测量成果" in alert_message.text: + logging.info("确认是平差结果确认弹窗") + + # 点击"是 保留成果"按钮 + yes_button = warning_dialog.find_element(AppiumBy.ID, "android:id/button1") + if yes_button.text == "是 保留成果": + yes_button.click() + logging.info("已点击'是 保留成果'按钮") + + # 等待弹窗消失 + WebDriverWait(self.driver, 5).until( + EC.invisibility_of_element_located((AppiumBy.ID, "android:id/parentPanel")) + ) + logging.info("弹窗已关闭") + return True + else: + logging.error(f"按钮文本不匹配,期望'是 保留成果',实际: {yes_button.text}") + return False + else: + logging.warning("弹窗内容不匹配,不是目标弹窗") + return False + + except TimeoutException: + logging.info("未检测到平差结果弹窗,继续流程") + return True # 没有弹窗也是正常情况 + except Exception as e: + logging.error(f"处理平差结果弹窗时出错: {str(e)}") + return False + + def check_measurement_list(self, device_id): + """ + 检查是否存在测量列表 + + Args: + device_id: 设备ID + + Returns: + bool: 如果不存在测量列表返回True,存在返回False + """ + try: + # 等待线路列表容器出现 + self.wait.until( + EC.presence_of_element_located((AppiumBy.ID, ids.MEASURE_LIST_ID)) + ) + logging.info("线路列表容器已找到") + + # 如果存在MEASURE_LIST_ID,说明有测量列表,不需要执行后续步骤 + logging.info(f"设备 {device_id} 存在测量列表,无需执行后续返回操作") + return False + + except TimeoutException: + # 等待超时,说明没有测量列表 + logging.info(f"设备 {device_id} 未找到测量列表,可以继续执行后续步骤") + return True + except Exception as e: + logging.error(f"设备 {device_id} 检查测量列表时发生错误: {str(e)}") + return True + + def find_keyword(self, fixed_filename): + """查找指定关键词并点击,支持向下和向上滑动查找""" + try: + # if not check_session_valid(self.driver, self.device_id): + # logging.warning(f"设备 {self.device_id} 会话无效,尝试重新连接驱动...") + # if not reconnect_driver(self.device_id, self.driver): + # logging.error(f"设备 {self.device_id} 驱动重连失败") + + # 等待线路列表容器出现 + self.wait.until( + EC.presence_of_element_located((AppiumBy.ID, ids.MEASURE_LIST_ID)) + ) + logging.info("线路列表容器已找到") + + max_scroll_attempts = 100 # 最大滚动尝试次数 + scroll_count = 0 + previous_items = set() # 记录前一次获取的项目集合,用于检测是否到达边界 + + # 首先尝试向下滑动查找 + while scroll_count < max_scroll_attempts: + # 获取当前页面中的所有项目 + current_items = self.get_current_items() + logging.info(f"当前页面找到 {len(current_items)} 个项目: {current_items}") + + # 检查目标文件是否在当前页面中 + if fixed_filename in current_items: + logging.info(f"找到目标文件: {fixed_filename}") + # 点击目标文件 + if self.click_item_by_text(fixed_filename): + return True + else: + logging.error(f"点击目标文件失败: {fixed_filename}") + return False + + # 检查是否到达底部:连续两次获取的项目相同 + if current_items == previous_items and len(current_items) > 0: + logging.info("连续两次获取的项目相同,已到达列表底部") + break + + # 更新前一次项目集合 + previous_items = current_items.copy() + + # 向下滑动列表以加载更多项目 + if not self.scroll_list(direction="down"): + logging.error("向下滑动列表失败") + return False + + scroll_count += 1 + logging.info(f"第 {scroll_count} 次向下滑动,继续查找...") + + # 如果向下滑动未找到,尝试向上滑动查找 + logging.info("向下滑动未找到目标,开始向上滑动查找") + + # 重置滚动计数 + scroll_count = 0 + + while scroll_count < max_scroll_attempts: + # 向上滑动列表 + # 如果返回False,说明已经滑动到顶 + if not self.scroll_list(direction="up"): + # 检查是否是因为滑动到顶而返回False + if "已滑动到列表顶部" in logging.handlers[0].buffer[-1].message: + logging.info("已滑动到列表顶部,停止向上滑动") + break + else: + logging.error("向上滑动列表失败") + return False + + # 获取当前页面中的所有项目 + current_items = self.get_current_items() + # logging.info(f"向上滑动后找到 {len(current_items)} 个项目: {current_items}") + + # 检查目标文件是否在当前页面中 + if fixed_filename in current_items: + logging.info(f"找到目标文件: {fixed_filename}") + # 点击目标文件 + if self.click_item_by_text(fixed_filename): + return True + else: + logging.error(f"点击目标文件失败: {fixed_filename}") + return False + + scroll_count += 1 + logging.info(f"第 {scroll_count} 次向上滑动,继续查找...") + + logging.warning(f"经过 {max_scroll_attempts * 2} 次滑动仍未找到目标文件") + return False + + except TimeoutException: + logging.error("等待线路列表元素超时") + return False + except Exception as e: + logging.error(f"查找关键词时出错: {str(e)}") + return False + + def get_current_items(self): + """获取当前页面中的所有项目文本""" + try: + items = self.driver.find_elements(AppiumBy.ID, ids.MEASURE_LISTVIEW_ID) + item_texts = [] + + for item in items: + try: + title_element = item.find_element(AppiumBy.ID, ids.MEASURE_NAME_TEXT_ID) + if title_element and title_element.text: + item_texts.append(title_element.text) + except NoSuchElementException: + continue + + return item_texts + except Exception as e: + logging.error(f"获取当前项目失败: {str(e)}") + return [] + + def click_item_by_text(self, text): + """点击指定文本的项目""" + try: + # 查找包含指定文本的项目 + items = self.driver.find_elements(AppiumBy.ID, ids.MEASURE_LISTVIEW_ID) + + for item in items: + try: + title_element = item.find_element(AppiumBy.ID, ids.MEASURE_NAME_TEXT_ID) + if title_element and title_element.text == text: + title_element.click() + logging.info(f"已点击项目: {text}") + return True + except NoSuchElementException: + continue + + logging.warning(f"未找到可点击的项目: {text}") + return False + except Exception as e: + logging.error(f"点击项目失败: {str(e)}") + return False + + def handle_measurement_dialog(self): + """处理测量弹窗 - 选择继续测量""" + try: + logging.info("检查测量弹窗...") + + # 直接尝试点击"继续测量"按钮 + continue_btn = WebDriverWait(self.driver, 2).until( + EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/measure_continue_btn")) + ) + continue_btn.click() + logging.info("已点击'继续测量'按钮") + return True + + except TimeoutException: + logging.info("未找到继续测量按钮,可能没有弹窗") + return True # 没有弹窗也认为是成功的 + except Exception as e: + logging.error(f"点击继续测量按钮时出错: {str(e)}") + return False + + # 检查有没有平差处理按钮 + def check_apply_btn(self): + """检查是否有平差处理按钮""" + try: + apply_btn = WebDriverWait(self.driver, 1).until( + EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/point_measure_btn")) + ) + if apply_btn.is_displayed(): + logging.info("进入平差页面") + else: + logging.info("没有找到'平差处理'按钮") + return True + except TimeoutException: + logging.info("未找到平差处理按钮") + return False # 没有弹窗也认为是成功的 + except Exception as e: + logging.error(f"点击平差处理按钮时出错: {str(e)}") + return False + + + + def execute_back_navigation_steps(self, device_id): + """ + 执行实际的返回导航步骤 + + Args: + device_id: 设备ID + + Returns: + bool: 导航是否成功 + """ + try: + # 1. 首先点击返回按钮 + if not self.click_back_button(device_id): + logging.error(f"设备 {device_id} 点击返回按钮失败") + return False + + # 2. 处理返回确认弹窗 + logging.info(f"已点击返回按钮,等待处理返回确认弹窗") + if not self.handle_confirmation_dialog(device_id): + logging.error(f"设备 {device_id} 处理返回确认弹窗失败") + # return False + + + # 3. 验证是否成功返回到上一页面 + time.sleep(0.5) # 等待页面跳转完成 + + # 可以添加页面验证逻辑,比如检查是否返回到预期的页面 + # 这里可以根据实际应用添加特定的页面元素验证 + + logging.info(f"设备 {device_id} 返回导航流程完成") + return True + + except Exception as e: + logging.error(f"设备 {device_id} 执行返回导航步骤时发生错误: {str(e)}") + return False + + def click_back_button(self, device_id): + """点击手机系统返回按钮""" + try: + self.driver.back() + logging.info("已点击手机系统返回按钮") + return True + except Exception as e: + logging.error(f"点击手机系统返回按钮失败: {str(e)}") + return False + + def handle_confirmation_dialog(self, device_id, timeout=2): + """ + 处理确认弹窗,点击"是"按钮 + + Args: + device_id: 设备ID + timeout: 等待弹窗的超时时间 + + Returns: + bool: 是否成功处理弹窗 + """ + # 等待弹窗出现(最多等待2秒) + try: + max_attempts = 2 + for attempt in range(max_attempts): + try: + dialog_message = WebDriverWait(self.driver, timeout).until( + EC.presence_of_element_located((AppiumBy.XPATH, "//android.widget.TextView[@text='是否退出测量界面?']")) + ) + + logging.info(f"设备 {device_id} 检测到确认弹窗 (第 {attempt + 1} 次)") + + # 查找并点击"是"按钮 + confirm_button = self.driver.find_element( + AppiumBy.XPATH, + "//android.widget.Button[@text='是' and @resource-id='android:id/button1']" + ) + + if confirm_button.is_displayed() and confirm_button.is_enabled(): + logging.info(f"设备 {device_id} 点击确认弹窗的'是'按钮 (第 {attempt + 1} 次)") + confirm_button.click() + time.sleep(0.5) + + # 如果是第一次尝试,继续检查是否还有弹窗 + if attempt < max_attempts - 1: + logging.info(f"设备 {device_id} 等待 1 秒后检查是否还有弹窗") + time.sleep(0.5) + continue + return True + else: + logging.error(f"设备 {device_id} '是'按钮不可点击") + return False + except TimeoutException: + # 超时未找到弹窗,认为没有弹窗,返回成功 + logging.info(f"设备 {device_id} 等待 {timeout} 秒未发现确认弹窗,可能没有弹窗,返回成功") + return True + + except Exception as e: + logging.error(f"设备 {device_id} 处理确认弹窗时出错: {str(e)}") + return False + + + + def scroll_list_to_bottom(self, device_id, max_swipes=60): + """ + 下滑列表到最底端 + + Args: + device_id: 设备ID + max_swipes: 最大下滑次数 + + Returns: + bool: 是否滑动到底部 + """ + try: + logging.info(f"设备 {device_id} 开始下滑列表到底部") + + # 获取列表元素 + list_view = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/auto_data_list") + logging.info(f"时间戳1: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}") + + same_content_count = 0 + + # 初始化第一次的子元素文本 + initial_child_elements = list_view.find_elements(AppiumBy.CLASS_NAME, "android.widget.TextView") + logging.info(f"时间戳2: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}") + # current_child_texts = "|".join([ + # elem.text.strip() for elem in initial_child_elements + # if elem.text and elem.text.strip() + # ]) + current_child_texts = "|".join( + elem_text.strip() for elem in initial_child_elements + if (elem_text := elem.text) and elem_text.strip() + ) + logging.info(f"时间戳3: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}") + for i in range(max_swipes): + # 执行下滑操作 + self.driver.execute_script("mobile: scrollGesture", { + 'elementId': list_view.id, + 'direction': 'down', + 'percent': 0.8, + 'duration': 500 + }) + + # 获取滑动后的子元素文本 + new_child_elements = list_view.find_elements(AppiumBy.CLASS_NAME, "android.widget.TextView") + new_child_texts = "|".join( + elem_text.strip() for elem in new_child_elements + if (elem_text := elem.text) and elem_text.strip() + ) + + # 判断内容是否变化:若连续3次相同,认为到达底部 + if new_child_texts == current_child_texts: + same_content_count += 1 + if same_content_count >= 2: + logging.info(f"设备 {device_id} 列表已滑动到底部,共滑动 {i+1} 次") + return True + else: + same_content_count = 0 # 内容变化,重置计数 + current_child_texts = new_child_texts # 更新上一次内容 + + logging.debug(f"设备 {device_id} 第 {i+1} 次下滑完成,当前子元素文本: {new_child_texts[:50]}...") # 打印部分文本 + + logging.warning(f"设备 {device_id} 达到最大下滑次数 {max_swipes},可能未完全到底部") + return True + + except Exception as e: + logging.error(f"设备 {device_id} 下滑列表时发生错误: {str(e)}") + return False + + def click_last_spinner_with_retry(self, device_id, max_retries=2): + """带重试机制的点击方法""" + for attempt in range(max_retries): + try: + if self.click_last_spinner(device_id): + return True + logging.warning(f"设备 {device_id} 第{attempt + 1}次点击失败,准备重试") + time.sleep(0.5) # 重试前等待 + except Exception as e: + logging.error(f"设备 {device_id} 第{attempt + 1}次尝试失败: {str(e)}") + + logging.error(f"设备 {device_id} 所有重试次数已用尽") + return False + + def click_last_spinner(self, device_id): + """ + 点击最后一个spinner + + Args: + device_id: 设备ID + + Returns: + bool: 是否成功点击 + """ + try: + logging.info(f"设备 {device_id} 查找最后一个spinner") + + # 查找所有的spinner元素 + spinners = self.driver.find_elements(AppiumBy.ID, "com.bjjw.cjgc:id/spinner") + + if not spinners: + logging.error(f"设备 {device_id} 未找到任何spinner元素") + return False + + # 获取最后一个spinner + last_spinner = spinners[-1] + + if not (last_spinner.is_displayed() and last_spinner.is_enabled()): + logging.error(f"设备 {device_id} 最后一个spinner不可点击") + return False + + # 点击操作 + logging.info(f"设备 {device_id} 点击最后一个spinner") + last_spinner.click() + + # 执行额外一次下滑操作 + self.scroll_down_once(device_id) + + max_retries = 3 # 最大重试次数 + retry_count = 0 + wait_timeout = 5 # 增加等待时间到5秒 + + while retry_count < max_retries: + try: + # 确保device_id正确设置,使用全局变量作为备用 + if not hasattr(self, 'device_id') or not self.device_id: + # 优先使用传入的device_id,其次使用全局变量 + self.device_id = device_id if device_id else global_variable.get_device_id() + + # 使用self.device_id,确保有默认值 + actual_device_id = self.device_id if self.device_id else global_variable.get_device_id() + + if not driver_utils.check_session_valid(self.driver, actual_device_id): + logging.warning(f"设备 {actual_device_id} 会话无效,尝试重新连接驱动...") + try: + # 使用正确的设备ID进行重连 + new_driver, new_wait = reconnect_driver(actual_device_id, self.driver) + if new_driver: + self.driver = new_driver + self.wait = new_wait + logging.info(f"设备 {actual_device_id} 驱动重连成功") + else: + logging.error(f"设备 {actual_device_id} 驱动重连失败") + retry_count += 1 + continue + except Exception as e: + logging.error(f"设备 {actual_device_id} 驱动重连异常: {str(e)}") + retry_count += 1 + continue + + # 点击spinner(如果是重试,需要重新获取元素) + if retry_count > 0: + spinners = self.driver.find_elements(AppiumBy.CLASS_NAME, "android.widget.Spinner") + if not spinners: + logging.error(f"设备 {device_id} 未找到spinner元素") + retry_count += 1 + continue + last_spinner = spinners[-1] + if not (last_spinner.is_displayed() and last_spinner.is_enabled()): + logging.error(f"设备 {device_id} spinner不可点击") + retry_count += 1 + continue + logging.info(f"设备 {device_id} 重新点击spinner") + last_spinner.click() + # 重试时也执行下滑操作 + self.scroll_down_once(device_id) + + # 等待下拉菜单出现,增加等待时间到5秒 + wait = WebDriverWait(self.driver, wait_timeout) + detail_show = wait.until( + EC.presence_of_element_located((AppiumBy.ID, "com.bjjw.cjgc:id/detailshow")) + ) + + if detail_show.is_displayed(): + logging.info(f"设备 {device_id} spinner点击成功,下拉菜单已展开") + return True + else: + logging.error(f"设备 {device_id} 下拉菜单未显示") + retry_count += 1 + continue + + except Exception as wait_error: + error_msg = str(wait_error) + logging.error(f"设备 {device_id} 等待下拉菜单超时 (第{retry_count+1}次尝试): {error_msg}") + + # 检查是否是连接断开相关的错误 + if not driver_utils.check_session_valid(self.driver, self.device_id): + logging.warning(f"设备 {self.device_id} 会话无效,尝试重新连接驱动...") + # if any(keyword in error_msg for keyword in ['socket hang up', 'Could not proxy command']): + # logging.warning(f"设备 {device_id} 检测到连接相关错误,尝试重连...") + if not reconnect_driver(self.device_id, self.driver): + logging.error(f"设备 {device_id} 驱动重连失败") + + retry_count += 1 + if retry_count < max_retries: + logging.info(f"设备 {device_id} 将在1秒后进行第{retry_count+1}次重试") + time.sleep(1) # 等待1秒后重试 + + logging.error(f"设备 {device_id} 经过{max_retries}次重试后仍无法展开下拉菜单") + return False + + except Exception as e: + logging.error(f"设备 {device_id} 点击最后一个spinner时发生错误: {str(e)}") + return False + + def scroll_down_once(self, device_id): + """ + 再次下滑一次 + + Args: + device_id: 设备ID + + Returns: + bool: 是否成功下滑 + """ + try: + logging.info(f"设备 {device_id} 执行额外一次下滑") + + # 获取列表元素 + list_view = self.driver.find_element(AppiumBy.ID, "com.bjjw.cjgc:id/auto_data_list") + + # 执行下滑操作 + self.driver.execute_script("mobile: scrollGesture", { + 'elementId': list_view.id, + 'direction': 'down', + 'percent': 0.5 + }) + + time.sleep(0.2) + logging.info(f"设备 {device_id} 额外下滑完成") + return True + + except Exception as e: + logging.error(f"设备 {device_id} 额外下滑时发生错误: {str(e)}") + return False + + def take_screenshot(self): + """ + 通过Appium驱动截取设备屏幕 + + 参数: + filename_prefix: 断点名称 + + 返回: + bool: 操作是否成功 + """ + try: + # 获取项目名称 + project_name = global_variable.GLOBAL_USERNAME or "用户名" + filename_prefix = global_variable.GLOBAL_CURRENT_PROJECT_NAME or "平差页面截图" + + # 获取当前日期 + date_str = datetime.now().strftime("%Y%m%d") + # if not date_str: + # date_str = datetime.now().strftime("%Y%m%d") + + # 获取当前时间(如果没有提供),并确保格式合法(不含冒号) + time_str = datetime.now().strftime("%H%M%S") + + # 创建D盘下的截图目录结构:D:\uploadInfo\picture\项目名\年月日 + screenshots_dir = os.path.join("D:\\", "uploadInfo", "picture", project_name, date_str) + + # 确保目录存在 + try: + os.makedirs(screenshots_dir, exist_ok=True) + logging.info(f"截图目录: {screenshots_dir}") + except Exception as dir_error: + logging.error(f"创建截图目录失败: {str(dir_error)}") + return False + line_code = global_variable.GLOBAL_LINE_NUM + if not line_code: + logging.error(f"未找到与断点名称 {filename_prefix} 对应的线路编码") + line_code = "unknown" + + # 截图保存 + screenshot_file = os.path.join( + screenshots_dir, + f"{line_code}_{filename_prefix}_{time_str}.png" + ) + + # 尝试保存截图 + try: + success = self.driver.save_screenshot(screenshot_file) + if success: + logging.info(f"截图已保存: {screenshot_file}") + # 验证文件是否真的存在 + if os.path.exists(screenshot_file): + logging.info(f"截图文件验证存在: {screenshot_file}") + else: + logging.warning(f"截图文件保存成功但验证不存在: {screenshot_file}") + return True + else: + logging.error(f"Appium截图保存失败: {screenshot_file}") + return False + except Exception as save_error: + logging.error(f"保存截图时发生错误: {str(save_error)}") + return False + + except Exception as e: + logging.error(f"截图时发生错误: {str(e)}") + return False + + +def get_excel_from_url(url): + """ + 从URL获取Excel文件并解析为字典 + Excel只有一列数据(A列),每行是站点值 + + Args: + url: Excel文件的URL地址 + + Returns: + dict: 解析后的站点数据字典 {行号: 值},失败返回None + """ + try: + print(f"正在从URL获取数据: {url}") + response = requests.get(url, timeout=30) + response.raise_for_status() # 检查请求是否成功 + + # 使用pandas读取Excel数据,指定没有表头,只读第一个sheet + excel_data = pd.read_excel( + BytesIO(response.content), + header=None, # 没有表头 + sheet_name=0, # 只读取第一个sheet + dtype=str # 全部作为字符串读取 + ) + + station_dict = {} + + # 解析Excel数据:使用行号+1作为站点编号,A列的值作为站点值 + print("解析Excel数据(使用行号作为站点编号)...") + for index, row in excel_data.iterrows(): + station_num = index + 1 # 行号从1开始作为站点编号 + station_value = str(row[0]).strip() if pd.notna(row[0]) else "" + + if station_value: # 只保存非空值 + station_dict[station_num] = station_value + + print(f"成功解析Excel,共{len(station_dict)}条数据") + return station_dict + + except requests.exceptions.RequestException as e: + print(f"请求URL失败: {e}") + return None + except Exception as e: + print(f"解析Excel失败: {e}") + return None + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='check_upload 脚本 - 执行上传检查流程') + parser.add_argument('--user_name', type=str, default='', help='用户名') + parser.add_argument('--line_name', type=str, default='', help='项目/线路名称') + parser.add_argument('--line_num', type=str, default='', help='线路编码') + parser.add_argument('--account_id', type=int, default=0, help='账号ID') + + args = parser.parse_args() + + # 设置全局变量 + global_variable.GLOBAL_USERNAME = args.user_name + global_variable.GLOBAL_CURRENT_PROJECT_NAME = args.line_name + global_variable.GLOBAL_LINE_NUM = args.line_num + global_variable.GLOBAL_ACCOUNT_ID = args.account_id + + logging.info(f"全局变量已设置: user_name={global_variable.GLOBAL_USERNAME}, " + f"line_name={global_variable.GLOBAL_CURRENT_PROJECT_NAME}, " + f"line_num={global_variable.GLOBAL_LINE_NUM}, " + f"account_id={global_variable.GLOBAL_ACCOUNT_ID}") + + check_upload = checkUpload() + success = check_upload.run() + if success: + print("上传检查执行成功") + else: + print("上传检查执行失败") \ No newline at end of file diff --git a/connect_appium.py b/connect_appium.py deleted file mode 100644 index a18fefe..0000000 --- a/connect_appium.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -建立 Appium 连接脚本 -运行此脚本会创建 Appium session 并保存 session 信息到文件 -""" -import json -import os -import logging -import globals.driver_utils as driver_utils -import globals.global_variable as global_variable - -# Session 信息保存路径 -SESSION_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "appium_session.json") - -logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s") - - -def create_connection(): - """创建 Appium 连接并保存 session 信息""" - try: - # 获取设备ID - device_id = driver_utils.get_device_id() - if not device_id: - logging.error("未找到可用设备") - return None, None, None - - logging.info(f"使用设备: {device_id}") - global_variable.GLOBAL_DEVICE_ID = device_id - - # 确保 Appium 服务器运行 - if not driver_utils.check_server_status(4723): - logging.info("Appium 服务器未运行,正在启动...") - driver_utils.start_appium_server() - - # 授予权限 - if driver_utils.grant_appium_permissions(device_id): - logging.info(f"设备 {device_id} 授予Appium权限成功") - else: - logging.warning(f"设备 {device_id} 授予Appium权限失败") - - # 初始化驱动 - driver, wait = driver_utils.init_appium_driver(device_id) - - if not driver: - logging.error("驱动初始化失败") - return None, None, None - - # 保存 session 信息到文件 - session_info = { - "session_id": driver.session_id, - "server_url": driver.command_executor._url, - "device_id": device_id, - "capabilities": dict(driver.capabilities) if driver.capabilities else {} - } - - with open(SESSION_FILE, "w", encoding="utf-8") as f: - json.dump(session_info, f, ensure_ascii=False, indent=2) - - logging.info(f"Session 信息已保存到: {SESSION_FILE}") - logging.info(f"Session ID: {driver.session_id}") - - return driver, wait, device_id - - except Exception as e: - logging.error(f"创建连接失败: {e}") - return None, None, None - - -def get_connection(): - """获取现有连接(如果存在且有效)""" - if not os.path.exists(SESSION_FILE): - logging.info("Session 文件不存在,需要创建新连接") - return None, None, None - - try: - with open(SESSION_FILE, "r", encoding="utf-8") as f: - session_info = json.load(f) - - session_id = session_info.get("session_id") - device_id = session_info.get("device_id") - - if not session_id or not device_id: - logging.warning("Session 文件信息不完整") - return None, None, None - - # 尝试 attach 到现有 session - driver, wait = attach_to_session(session_id, device_id) - - if driver: - global_variable.GLOBAL_DEVICE_ID = device_id - logging.info(f"成功连接到现有 Session: {session_id}") - return driver, wait, device_id - else: - logging.warning("无法连接到现有 Session") - return None, None, None - - except Exception as e: - logging.error(f"获取连接失败: {e}") - return None, None, None - - -def attach_to_session(session_id, device_id): - """Attach 到现有的 Appium session""" - from appium import webdriver - from appium.options.android import UiAutomator2Options - from selenium.webdriver.support.ui import WebDriverWait - - try: - server_url = "http://127.0.0.1:4723/wd/hub" - - # 创建 options,但不启动新应用 - options = UiAutomator2Options() - options.platform_name = "Android" - options.device_name = device_id - options.automation_name = "UiAutomator2" - options.udid = device_id - - # 连接到现有 session - driver = webdriver.Remote( - server_url, - options=options - ) - - # 手动设置 session_id - driver.session_id = session_id - driver.command_executor._commands["getSession"] = ("GET", "/session/$sessionId") - - # 验证 session 是否有效 - try: - current_package = driver.current_package - logging.info(f"Session 有效,当前应用: {current_package}") - except Exception as e: - logging.error(f"Session 无效: {e}") - return None, None - - wait = WebDriverWait(driver, 20) - return driver, wait - - except Exception as e: - logging.error(f"Attach 到 session 失败: {e}") - return None, None - - -def close_connection(): - """关闭连接并清理 session 文件""" - global_variable.GLOBAL_DEVICE_ID = None - - if os.path.exists(SESSION_FILE): - os.remove(SESSION_FILE) - logging.info("Session 文件已删除") - - -if __name__ == "__main__": - # 作为独立脚本运行时,创建新连接 - driver, wait, device_id = create_connection() - - if driver: - logging.info("连接建立成功!") - logging.info("可以运行 add_transition_point.py 来添加转点") - logging.info("按 Ctrl+C 退出并保持连接...") - - try: - # 保持连接,等待用户操作 - import time - while True: - time.sleep(1) - except KeyboardInterrupt: - logging.info("用户中断,保持连接状态") - else: - logging.error("连接建立失败") \ No newline at end of file diff --git a/globals/__pycache__/apis.cpython-312.pyc b/globals/__pycache__/apis.cpython-312.pyc index 09edfdb407f219a894d504245df7449d1953f518..2b1e5797ccc793579e2f6147844707e6c6fccccd 100644 GIT binary patch delta 92 zcmeBN%-Fw}k@qw&FBbz4_@=05Rd3|I!^>)DZdvL%`5mu>?!N6W_U(H)Yx&E@$!5yW qrpYwFYO%bxGruj}G%W^ANwZeR{)nQqqQ6Jlb_+3Xq delta 86 zcmeBQ%-Fe@k@qw&FBbz4d_Jn2Rl1S)4lk>Lxml_6K)TxEL{9@*7BE)lV9wg k{j`6vu8Xm^nX!eosew6+X=Y%)*_cm=i7{=nn}DYy0BwjKVE_OC diff --git a/globals/__pycache__/global_variable.cpython-312.pyc b/globals/__pycache__/global_variable.cpython-312.pyc index ce0d191cf3b8b5937916d2d1e8664ef22a572783..2207843b42bb72248f8c279836df09f713843cca 100644 GIT binary patch delta 191 zcmeyza+Q_$G%qg~0}%M8sAnyl$g9K66vdpv9L18tlEOOCMX{bull>OME$-y1%F?R* zy!7(ayi!k~a_6XE=cqtkLqpvsyQVzdzVvC&F5Rd5w!hf7@8zuJFB>PDDL`2_k{Id@;OLoum%d-37ch5b4 z?s@N=b9;Xkdmo6_+i7X30$&fSJ>lf^i1pHD(!|C#`&8vP*V0b-Yxe|+!SF{B!%41y zhdvdabek>~?UC&r=y3ueBEEsry=TL%C{`kzh%Ja1B8=!lbR+g4P9Z#q?TB{}J`T-D zT_}IckuV>qt*Hqehy=*d#`c1;no$nJLEH7d{1@PhT9eOpp~L-`IYp7R@j z=i;aI56C~iDRTwYdTsT>Va@2D?6dPjGD$M`#k~@|%uf-!2t@rovh;-%w!ykjT+pSt zA=+VqsSmTD#FhcO&)IEjc&xrQ2sA%xfV@B!TrbR!l!yxM%JmLo)X;4B+*G0O4WvP6 zl=cY?L`#AFKW;SATpru>2F&z3a(SO3RW5%0Zv%c8~q`QKE?`cx#0!HNnRs;i>` z?wzpwH!Z9>mI*nRD+B%9bVOJ&93m->=N7@GeV-9m2i4)=J=Hs}7R;&z3-;CX_MBOJ z&d{!S(O}Wcwz8Q`!F%@dXOif$w)s~SABAy~%BK|=T!Xd-* z$aPW;Ka6fQFQ8WDNH}3#vlA3H=1fJWwP?Vu{cZA9*H+XY4i(UJm}6UQAFm>grvg%U F`WG(nL(l*K delta 2366 zcma);c~BEq7{K@C*aQ<{alr@#38KLW1!FuT(^0A7fk(Z@qZ&~%9957_Qp8D!7YHJP zeJH4))cZCzSn#T}ohptUC#i98QmrvjymmJ5kPf|ZHt3Qf=*>jSRp8e%&ZA1~m}wSaqQJi=Mc_ZT zOAkz&C1$pQM>#+M*oGI++m&4cVg?`_Fal5s$Odc&d<~cd*a3(I=mBE^Ndy`Rrv$m0 zz$;sko0DT)VKyu`=WsQk-UZl$m(C9tRS^+Cq$8Zw^EU`l1rA?Sg-Y<5MFSP3#A1TR zR4OhK0-)GhEj~Ls%qd(PC`S8npJlP=s8hcz0g;%jv^A&{|B;r2b~>Y$8)#JFv}bA% zayXA=?URz!Q@Ap;-+7x82$u3~m9>EWI^Y+aUD%(#0wrVl zl1B;;iqK`8y3vSkI=|i6D5D#|Z!^xV*iF**s{9F|2hN+@Z%XJ_V0i7^ziXtB{tM)r z_^r)co4=3kPe)J$L5SofM;XXa589gt7pl5|ZDGyCS?ea-hJZ z#1G08c&07{uU;TS1^9khKfJFh1Q(XckQGOd48@T_()ZnF)XI?nKRn!@{A75lp5@22 z(?e)+hR7zg;`*{sxm9=qkt*aeMeqfh#UXfTjZ9!x;C*wH0&_Ut8?D4MRMPl0$Rt2i zy2OU8h#O&!>I|bOE9y@11!>qOvWaappNe#sAhnA2Q0W0yF<~z&O(?6Abo(PJhfbIO z8)e0-gF_jssM~Hr1p;#nc4(CNM!B5)%Wn#ZS@IC^%t6zUT1#P=uK_a{1-2#H(wU5EQ%>ArVD#ykq& z4TuQ~wn+*l1%h;b%t!gu8sS1JA8GpFK1bDd%NP>wKd{b!uFO~BXuEKwz3~i@pKPx1 zT{_=(y!z>-t&cAk`wnhut1NzB?>l(5z2VTL{}bL+^>Mhrq|&!#pQS%dsy}Wj$8W_E zcCL_2EIR0?_PD?Fd(w};be+Gp)OV$*{qTBU(Z;rh`p$mZE*@#Sc*^IfYd^E&Nl|&* z<IkFT+=t#*C;xlK=MoW7?G-Yr}z4+zw;eD=66)-RTenT z;#K~pW4;TA^{Ua9-emrxBblfiRlaRydX-n0IV(*gd&J6+>0eOIYKq`Pg&!7vhJi}-<O%-TMuFpU<;rg@Cfj3-)p4&S?QHP z5u?e(8Hm{%%o+16S)4K5U|eZjWy~>~ypnulnmN>rqx;sorwQRerm5FvU(XIhYJj~KN3gtsN zQ!%Y{TB}^?mMdM63q10Le2~V?YCLS*2SF1&Ofm_2DW!r#S{b#QQQu|QRwl;H#PGrp zH)9`ihZ)-uAdU`n$s;=gsgQoHtj^8qT*D`N*h%m5L5OSMLJza(B~2+JTKmSj`^KIO zY8{;79-MNk@8nN(y%MzD;QHCpXwJRgfm1lNETW&L7bf@8`bIBvHA#SpkIz65y{9#0LFd2T9sDTNG=G`Jw5L5-N97>b^vw)Eq;1%1sBm5ve0K5SF4R{OSx3COnooGfGc*x07vU{Kv x6L`aMbYVCyKG_h?Kxa{4fRBYY(xg?n>6VqoPq{EW_tdDMX~8J$IR)gM{sI3n{L=sc diff --git a/page_objects/login_page.py b/page_objects/login_page.py index fd66518..2b5956e 100644 --- a/page_objects/login_page.py +++ b/page_objects/login_page.py @@ -185,6 +185,104 @@ class LoginPage: logging.error(f"登录过程中出错: {str(e)}") return False + def login_get_username(self, username=None): + """执行登录操作""" + try: + logging.info("正在执行登录操作...") + + # 获取文本框中已有的用户名 + username_field = self.wait.until( + EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_USERNAME)) + ) + + existing_username = username_field.text + # 日志记录获取到的已有用户名(若为空,也需明确记录,避免后续误解) + if existing_username.strip(): # 去除空格后判断是否有有效内容 + logging.info(f"已获取文本框中的已有用户名: {existing_username}") + else: + logging.info("文本框中未检测到已有用户名(内容为空)") + + # 将用户名写入全局变量中 + global_variable.GLOBAL_USERNAME = existing_username # 关键:给全局变量赋值 + + # 1. 定位密码输入框 + password_field = self.wait.until( + EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_PASSWORD)) + ) + + # 2. 清空密码框(如果需要) + try: + password_field.clear() + # time.sleep(0.5) # 等待清除完成 + except: + # 如果clear方法不可用,尝试其他方式 + pass + + accounts = apis.get_accounts_from_server("68ef0e02b0138d25e2ac9918") + + # 检查accounts是否为None,如果是则设为空列表 + if accounts is None: + logging.warning("获取账户列表返回None,设为空列表") + accounts = [] + + matches = [acc for acc in accounts if acc.get("username") == existing_username] + password = None + account_id = False + if matches: + password = matches[0].get("password") + + # ✅ 关键:把 account_id 存入全局变量 + account_id = matches[0].get("account_id", False) + # 只有 account_id 存在时才存全局 + if account_id is not False: + global_variable.GLOBAL_ACCOUNT_ID = account_id + logging.info(f"匹配到账号信息:username={existing_username}, account_id={account_id}") + else: + logging.warning(f"账号 {existing_username} 未返回 account_id,已设为 False") + + + + password_field.send_keys(password) + + # 4. 可选:隐藏键盘 + try: + self.driver.hide_keyboard() + except: + pass + + # 点击登录按钮 + max_retries = 3 + retry_count = 0 + + while retry_count < max_retries: + login_btn = self.wait.until( + EC.element_to_be_clickable((AppiumBy.ID, ids.LOGIN_BTN)) + ) + login_btn.click() + logging.info(f"已点击登录按钮 (尝试 {retry_count + 1}/{max_retries})") + + # 等待登录完成 + time.sleep(3) + + # 检查是否登录成功 + if self.is_login_successful(): + logging.info("登录成功") + return True + else: + logging.warning("登录后未检测到主页面元素,准备重试") + retry_count += 1 + if retry_count < max_retries: + logging.info(f"等待2秒后重新尝试登录...") + time.sleep(2) + + logging.error(f"登录失败,已尝试 {max_retries} 次") + return False + + except Exception as e: + logging.error(f"登录过程中出错: {str(e)}") + return False + + def is_login_successful(self): """检查登录是否成功""" diff --git a/page_objects/section_mileage_config_page.py b/page_objects/section_mileage_config_page.py index 8a0b71b..26747c7 100644 --- a/page_objects/section_mileage_config_page.py +++ b/page_objects/section_mileage_config_page.py @@ -741,11 +741,13 @@ class SectionMileageConfigPage: def add_transition_point(self): """添加转点""" try: - # 查找并点击添加转点按钮 + # 查找并点击添加转点按钮(双击确保点到) add_transition_btn = self.wait.until( EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/btn_add_ZPoint")) ) add_transition_btn.click() + time.sleep(0.3) + add_transition_btn.click() self.logger.info("已点击添加转点按钮") return True except TimeoutException: @@ -981,7 +983,7 @@ class SectionMileageConfigPage: try: self.logger.info("检查线路弹出测量弹窗...") - # 直接尝试点击"继续测量"按钮 + # 直接尝试点击"重新测量"按钮 remeasure_btn = WebDriverWait(self.driver, 2).until( EC.element_to_be_clickable((AppiumBy.ID, "com.bjjw.cjgc:id/measure_remeasure_all_btn")) ) @@ -1086,25 +1088,6 @@ class SectionMileageConfigPage: if not self.click_start_measure_btn(): return False - - - # if not self.check_station_page.run(): - # self.logger.error("检查站页面运行失败") - # return False - - - # # 添加断点到列表 - # if not self.add_breakpoint_to_tested_list(): - # return False - - # # 点击返回按钮 - # if not self.click_back_button(): - # return False - - # # 测量结束。点击手机物理返回按钮,返回测量页面 - # # 点击了手机独步导航栏返回键 - # if not self.click_system_back_button(): - # return False self.logger.info("断面里程配置完成,待执行测量") return True