From 2cd4d272d60f37e3fac9ea63c81a5eface2ced98 Mon Sep 17 00:00:00 2001 From: Nik Rozman Date: Sun, 1 Mar 2026 17:41:48 +0100 Subject: [PATCH] Cleanup macro --- .gitignore | 3 + pointer.FCMacro | 380 ++++++++++++++++++++++++++++-------------------- pointer.FCStd | Bin 22832 -> 0 bytes 3 files changed, 229 insertions(+), 154 deletions(-) create mode 100644 .gitignore delete mode 100644 pointer.FCStd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0fc0096 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.FCStd +*.FCBak +*.3mf \ No newline at end of file diff --git a/pointer.FCMacro b/pointer.FCMacro index 8d6b287..57cd876 100644 --- a/pointer.FCMacro +++ b/pointer.FCMacro @@ -1,71 +1,60 @@ -# IMU Pointer Enclosure — FreeCAD Macro v5 -# ========================================== -# Lid drops INSIDE the base. -# Base has a shelf step cut 1.5mm into the inner walls, -# LID_STEP mm from the top. Lid rests on that shelf, flush with base top. -# USB-C notch on front edge of lid keeps port accessible. -# -# Layout (top view, front = left): -# [USB-C][ XIAO on posts ]<-wires->[ AAA holder ][ grip ] -# ========================================== +# IMU Pointer Enclosure import FreeCAD as App import FreeCADGui as Gui import Part -import Mesh -import os from FreeCAD import Base -doc = App.newDocument("IMU_Pointer_v5") +doc = App.newDocument("pointer") -# ---- PARAMETERS ------------------------------------------------------------ +# Global dimensions +L = 115.0 +W = 36.0 +H = 20.0 +WALL = 3.5 +CR = 3.0 +TOL = 0.25 -L = 115.0 -W = 34.0 -H = 28.0 -WALL = 2.5 -CR = 3.0 # corner fillet radius +# Rail and lid +RAIL_H = 4.5 +RAIL_D = 2.0 +LIP_H = 2.0 +LIP_OVER = 1.5 +LIP_EMBED = 0.2 -TOL = 0.25 # fit clearance — lid is this much smaller than the shelf opening +LID_H = RAIL_H - LIP_H - TOL - 0.55 -# Shelf: step cut into inside of base walls near the top -# Lid sits on this shelf, flush with the base rim -SHELF_DEPTH = 1.5 # how far shelf cuts inward from the inner wall face -SHELF_H = 2.0 # how tall the shelf step is (from top of base downward) - # lid height = SHELF_H so it sits exactly flush +# Board dimensions +PCB_T = 1.0 +BRD_L = 21.0 +BRD_W = 17.5 +BRD_X = WALL +BRD_Y = (W - BRD_W) / 2 -LID_H = SHELF_H # lid is exactly as tall as the shelf recess +PLATFORM_H = 0.5 +BRD_Z = WALL + PLATFORM_H -# XIAO board (front of device) -BRD_L = 21.0 -BRD_W = 18.0 -BRD_X = WALL + 4.0 -BRD_Y = (W - BRD_W) / 2 -BRD_Z = WALL + 4.5 +# Clip arms +ARM_LEN = 5.0 +ARM_THICK = 1.6 +ARM_H = BRD_Z + PCB_T + 0.8 +CLIP_TOL = 0.35 -# AAA battery holder -BAT_L = 50.0 -BAT_W = 12.0 -BAT_H = 12.0 -BAT_X = BRD_X + BRD_L + 6.0 -BAT_Y = (W - BAT_W) / 2 +# USB-C cutout +USBC_W = 11.0 +USBC_H = 7.0 +USBC_Z = 4.5 -# L-post mount -POST_OD = 3.5 -POST_ID = 1.6 -POST_H = BRD_Z -L_ARM = 2.2 -L_THICK = 1.2 +# Battery section +BAT_L = 50.0 +BAT_W = 12.0 +BAT_H = 12.0 +BAT_X = BRD_X + BRD_L + 8.0 +BAT_Y = (W - BAT_W) / 2 +BAT_CLIP_Y = 8.0 -# USB-C cutout on front face -USBC_W = 9.5 -USBC_H = 3.5 -USBC_Z = BRD_Z + 0.8 - -MACRO_DIR = os.path.dirname(os.path.abspath(__file__)) - -# ---- HELPERS --------------------------------------------------------------- +# Rounded box helper def rbox(lx, ly, lz, ox=0, oy=0, oz=0, r=CR): b = Part.makeBox(lx, ly, lz, Base.Vector(ox, oy, oz)) try: @@ -77,135 +66,218 @@ def rbox(lx, ly, lz, ox=0, oy=0, oz=0, r=CR): pass return b + +# Simple box helper def box(lx, ly, lz, ox=0, oy=0, oz=0): return Part.makeBox(lx, ly, lz, Base.Vector(ox, oy, oz)) -def cyl(r, h, ox=0, oy=0, oz=0): - return Part.makeCylinder(r, h, Base.Vector(ox, oy, oz)) -def export_stl(shape, name): - path = os.path.join(MACRO_DIR, name) - tess = shape.tessellate(0.06) - m = Mesh.Mesh(list(zip(tess[0], tess[1]))) - m.write(path) - print(f" Saved: {path}") +# Rounded slot helper +def rounded_slot(depth, w, h, ox, oy, oz, r=None): + if r is None: + r = h / 2.0 -# ==================================================================== -# BASE -# ==================================================================== + r = min(r, h / 2.0, w / 2.0) + import math + + cy = oy + w / 2.0 + cz = oz + h / 2.0 + hw = w / 2.0 - r + + def pt(cx, cy_v, cz_v, angle_deg, radius): + a = math.radians(angle_deg) + return Base.Vector( + cx, + cy_v + radius * math.cos(a), + cz_v + radius * math.sin(a) + ) + + l_start = pt(ox, cy - hw, cz, 270, r) + l_mid = pt(ox, cy - hw, cz, 180, r) + l_end = pt(ox, cy - hw, cz, 90, r) + arc_left = Part.Arc(l_start, l_mid, l_end).toShape() + + line_top = Part.makeLine( + l_end, + pt(ox, cy + hw, cz, 90, r) + ) + + r_start = pt(ox, cy + hw, cz, 90, r) + r_mid = pt(ox, cy + hw, cz, 0, r) + r_end = pt(ox, cy + hw, cz, 270, r) + arc_right = Part.Arc(r_start, r_mid, r_end).toShape() + + line_bot = Part.makeLine(r_end, l_start) + + wire = Part.Wire([arc_left, line_top, arc_right, line_bot]) + face = Part.Face(wire) + + return face.extrude(Base.Vector(depth, 0, 0)) + + +# Board clip helper +def make_clip(corner_x, corner_y, inward_x, inward_y): + + plat_w = ARM_THICK + CLIP_TOL + + plat_x = corner_x if inward_x > 0 else corner_x - plat_w + plat_y = corner_y if inward_y > 0 else corner_y - plat_w + + platform = box( + plat_w, plat_w, + PLATFORM_H + PCB_T, + plat_x, plat_y, WALL + ) + + ax_ox = corner_x if inward_x > 0 else corner_x - ARM_LEN + ax_oy = corner_y - ARM_THICK - CLIP_TOL if inward_y > 0 else corner_y + CLIP_TOL + arm_x = box(ARM_LEN, ARM_THICK, ARM_H, ax_ox, ax_oy, WALL) + + ay_oy = corner_y if inward_y > 0 else corner_y - ARM_LEN + ay_ox = corner_x - ARM_THICK - CLIP_TOL if inward_x > 0 else corner_x + CLIP_TOL + arm_y = box(ARM_THICK, ARM_LEN, ARM_H, ay_ox, ay_oy, WALL) + + corner_block_w = ARM_THICK + CLIP_TOL + cb_ox = corner_x - corner_block_w if inward_x > 0 else corner_x + cb_oy = corner_y - corner_block_w if inward_y > 0 else corner_y + + corner_block = box( + corner_block_w, corner_block_w, ARM_H, + cb_ox, cb_oy, WALL + ) + + return platform.fuse(arm_x.fuse(arm_y).fuse(corner_block)) + + +# Base outer body base = rbox(L, W, H) -# Main inner cavity — full height minus floor -base = base.cut(box(L - WALL*2, W - WALL*2, H - WALL, WALL, WALL, WALL)) -# Shelf recess: widen the top SHELF_H of the inner cavity by SHELF_DEPTH -# This creates the step the lid rests on -shelf_cut = box(L - WALL*2 + SHELF_DEPTH*2, - W - WALL*2 + SHELF_DEPTH*2, - SHELF_H + 0.1, - WALL - SHELF_DEPTH, - WALL - SHELF_DEPTH, - H - SHELF_H) -base = base.cut(shelf_cut) +# Inner cavity +base = base.cut( + box(L - WALL * 2, W - WALL * 2, H - WALL, + WALL, WALL, WALL) +) -# USB-C slot on front face (X=0) -base = base.cut(box(WALL*3, USBC_W, USBC_H, - -WALL, W/2 - USBC_W/2, USBC_Z)) +rail_z = H - RAIL_H +groove_h = RAIL_H - LIP_H -# ---- L-shaped mounting posts ---- -brd_cx = BRD_X + BRD_L / 2 -brd_cy = BRD_Y + BRD_W / 2 -post_corners = [ - (BRD_X + 2.0, BRD_Y + 2.0), - (BRD_X + BRD_L - 2.0, BRD_Y + 2.0), - (BRD_X + 2.0, BRD_Y + BRD_W - 2.0), - (BRD_X + BRD_L - 2.0, BRD_Y + BRD_W - 2.0), +# Rail grooves +base = base.cut( + box(L - WALL * 2, RAIL_D, groove_h, + WALL, WALL - RAIL_D, rail_z) +) + +base = base.cut( + box(L - WALL * 2, RAIL_D, groove_h, + WALL, W - WALL, rail_z) +) + +# Lid lips +lip_z = H - LIP_H + +base = base.fuse( + box(L - WALL * 2, LIP_OVER, LIP_H, + WALL, WALL, lip_z) +) + +base = base.fuse( + box(L - WALL * 2, LIP_OVER, LIP_H, + WALL, W - WALL - LIP_OVER, lip_z) +) + +# Back slot +slot_y0 = WALL - RAIL_D +slot_yw = W - WALL * 2 + RAIL_D * 2 + +base = base.cut( + box(WALL + 1.0, slot_yw, RAIL_H, + L - WALL, slot_y0, rail_z) +) + +# Entry bump +BUMP_H = 0.5 +pad_raw = box(WALL, slot_yw, BUMP_H, + L - WALL, slot_y0, rail_z) + +pad_trimmed = pad_raw.common(rbox(L, W, H)) +base = base.fuse(pad_trimmed) + +# Board clips +clip_corners = [ + (BRD_X, BRD_Y, +1, +1), + (BRD_X + BRD_L, BRD_Y, -1, +1), + (BRD_X, BRD_Y + BRD_W, +1, -1), + (BRD_X + BRD_L, BRD_Y + BRD_W, -1, -1), ] -for (px, py) in post_corners: - post = cyl(POST_OD/2, POST_H, px, py, WALL) - post = post.cut(cyl(POST_ID/2, POST_H + 1.0, px, py, WALL - 0.5)) - dx = brd_cx - px; dy = brd_cy - py - mag = (dx**2 + dy**2)**0.5; dx /= mag; dy /= mag - perp_x = -dy; perp_y = dx; hw = L_THICK / 2 - z0 = WALL + POST_H - L_THICK; z1 = WALL + POST_H - p0 = Base.Vector(px - perp_x*hw, py - perp_y*hw, z0) - p1 = Base.Vector(px + perp_x*hw, py + perp_y*hw, z0) - p2 = Base.Vector(px + perp_x*hw, py + perp_y*hw, z1) - p3 = Base.Vector(px - perp_x*hw, py - perp_y*hw, z1) - arm = Part.Face(Part.Wire([ - Part.makeLine(p0,p1), Part.makeLine(p1,p2), - Part.makeLine(p2,p3), Part.makeLine(p3,p0) - ])).extrude(Base.Vector(dx*L_ARM, dy*L_ARM, 0)) - base = base.fuse(post.fuse(arm)) -# ---- Battery cradle ---- -base = base.cut(box(BAT_L, BAT_W, 3.0, BAT_X, BAT_Y, WALL)) -base = base.fuse(box(2.0, BAT_W+3.0, BAT_H*0.55, BAT_X-2.0, BAT_Y-1.5, WALL)) -base = base.fuse(box(2.0, BAT_W+3.0, BAT_H*0.55, BAT_X+BAT_L, BAT_Y-1.5, WALL)) +for cx, cy, ix, iy in clip_corners: + base = base.fuse(make_clip(cx, cy, ix, iy)) -print("[1/2] Base complete.") +# USB-C opening +base = base.cut( + rounded_slot( + WALL * 3, + USBC_W, + USBC_H, + -WALL, + W / 2 - USBC_W / 2, + USBC_Z + ) +) -# ==================================================================== -# LID — sized to drop inside the shelf opening, built at Z=0 -# ==================================================================== -# Lid outer dimensions match the shelf recess minus tolerance -LID_L = L - WALL*2 + SHELF_DEPTH*2 - TOL*2 -LID_W = W - WALL*2 + SHELF_DEPTH*2 - TOL*2 +# Battery recess +base = base.cut( + box(BAT_L, BAT_W, 3.0, + BAT_X, BAT_Y, WALL) +) -lid = rbox(LID_L, LID_W, LID_H, - WALL - SHELF_DEPTH + TOL, - WALL - SHELF_DEPTH + TOL, - 0, r=1.5) +clip_y_start = BAT_Y + BAT_W / 2 - BAT_CLIP_Y / 2 -# USB-C notch on front edge (X=0 face of lid) so port stays accessible -# The notch is a slot cut from the front edge, aligned with USB-C position -notch_y = W/2 - USBC_W/2 - (WALL - SHELF_DEPTH + TOL) # relative to lid origin -lid = lid.cut(box(WALL*2, USBC_W, USBC_H + 0.5, - -(WALL - SHELF_DEPTH + TOL), # punch through front face - W/2 - USBC_W/2, - 0)) +base = base.fuse( + box(2.0, BAT_CLIP_Y, BAT_H * 0.55, + BAT_X - 2.0, clip_y_start, WALL) +) -print("[2/2] Lid complete.") +base = base.fuse( + box(2.0, BAT_CLIP_Y, BAT_H * 0.55, + BAT_X + BAT_L, clip_y_start, WALL) +) -# Export STLs at Z=0 BEFORE any translation -print("\nExporting STLs...") -export_stl(base, "pointer_base.stl") -export_stl(lid, "pointer_lid.stl") +# Lid +TAB_W = RAIL_D - TOL + 0.5 +LID_L = L - WALL * 2 - TOL +LID_EXTRA_TOL = 0.5 -# Translate lid up to assembled position for FreeCAD viewport only -lid.translate(Base.Vector(0, 0, H - LID_H)) +LID_W = ( + W - WALL * 2 + - (TOL + LID_EXTRA_TOL) * 2 + + TAB_W * 2 +) -# ==================================================================== -# DOCUMENT -# ==================================================================== +lid_y0 = WALL + TOL + LID_EXTRA_TOL - TAB_W + +lid = box(LID_L, LID_W, LID_H, 0, lid_y0, 0) + +lid = lid.cut( + box(WALL * 2, USBC_W + TOL, LID_H + 0.2, + LID_L - WALL, + W / 2 - (USBC_W + TOL) / 2, + -0.1) +) + +lid.translate(Base.Vector(WALL + TOL, 0, rail_z)) + +# Final objects base_obj = doc.addObject("Part::Feature", "Pointer_Base") base_obj.Shape = base base_obj.ViewObject.ShapeColor = (0.12, 0.12, 0.14) lid_obj = doc.addObject("Part::Feature", "Pointer_Lid") lid_obj.Shape = lid -lid_obj.ViewObject.ShapeColor = (0.28, 0.28, 0.34) +lid_obj.ViewObject.ShapeColor = (0.28, 0.28, 0.34) lid_obj.ViewObject.Transparency = 25 doc.recompute() Gui.activeDocument().activeView().viewIsometric() -Gui.SendMsgToActiveView("ViewFit") - -print() -print("=" * 62) -print("IMU Pointer v5 — lid drops INSIDE base") -print(f" Outer : {L:.0f} x {W:.0f} x {H:.0f} mm") -print(f" Shelf step : {SHELF_DEPTH:.1f} mm inward, {SHELF_H:.1f} mm tall") -print(f" Lid : {LID_L:.1f} x {LID_W:.1f} x {LID_H:.1f} mm") -print(f" Tolerance : {TOL:.2f} mm") -print() -print("Assembly:") -print(" Drop lid flat-side-up into the top opening.") -print(" It rests on the shelf, sitting flush with the base rim.") -print(" USB-C notch on front edge keeps port fully accessible.") -print(" To remove: push up from the USB-C hole or pry with fingernail.") -print() -print("Print orientation:") -print(" Base: flat bottom down, no supports") -print(" Lid : either face down, it's a flat plate — no supports") -print("=" * 62) +Gui.SendMsgToActiveView("ViewFit") \ No newline at end of file diff --git a/pointer.FCStd b/pointer.FCStd deleted file mode 100644 index 1ad0e058b909163cd36ba7c3dd4b13beef5e519e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22832 zcmafaV{j%wvuW81cE+qP|Iqutm}HnwfscCsFyH4+IqQ* zZ6*mD-5SjrTiuTGM@sO?JY;6F=9|p|x2YqBOs$-7!g>slp)7lvWBQd-6RR)JckF>2 z>@ufnRIor0UoY2WRVQ{_+F@H71P#s0!s_3)51Of4u01uH-|JYL;dhpr?ZfD%08gOn z2$t4iSAiUX;`)wQKoGWIUnrW*B3EpPMvD+TQi`pf=1bg9xk~i0JyZ>z9P}yC7)7gX zDdkF7KjKlgg%}~DUZ_9KW2j~K(l-@S2)~CYslw@C|L%@B-{ir+z;O* znERCre?J{U5+@N`F)W9rY+1(qlY-miP{{hpvvKj8he1>^l}iW8qeI52D<7gz2UQ$68X3%?bO zMt~z;#`(FE`M~~1lRK@bDY)ZI8oK%UrEkdS`)UB8JYJqLLKav@8FSk?;l+#`LcErU z9L#WJ0u}ydW$)Mb=gUK=wZ%b>)8n~4=#~F$3EH-RE!g9SC`-qYQ@V4YCq`9w1l<(` zfvJ-TfVIk__^Ex1P0Jsx58t!g{3(J|jH4nIquJinoP~b%mQ%*lkunG^m&uT}G8k%@ z3`t#!AZk^OjRXpe$Uq898oE#o-}5d|_prpkn{kL$b1*5x9HwB&F@K02k9mIo=&ae59VC@m%}POq}mTdTst)bq~4ez&iqK8x}ojH)L(f`RLGW*w+is* z!nvPm%`z#l<+gF9++?gd5)A%0_BwGnbVuY83s27(+by*0oe`V#qOH45YdK^+VA38` zDTzIL3?5twOpu(-^@?yt%XDR#IwdeWP*k{rBJ}D<)A7L(51~M(w~xLl$Pd|pUfudS z38PQ@tNf$ny&wI3G{Hd+3|gP?JM38|PKoUleoNc z(;AhbM#@V#lH_#5efX#IFx`|nFC5Iu@L&3zO!h-9JVL`=E;n1N2t%A7yYTtPpG3Rx zVtd_fgKhTVw!j{&URNf4K)}7_%}?yTs;8cpoNu`~8Lj=pYOndk#UPAlq%TP2{}FJ_ za}qhw=|Dh~!N5Q;{{>uSCmTn13s)mi6E_P+HER=R3r15{XFz~lJUNf+i9nD9VT-Ip zu%$myIAINA*CwRz9|0`MrXnb)ox#T#5TIWoyQF7(*TT*jLj3r6we6p#$>eMDnV9DT zslzGc@7KeBt1HMC2xR)co5~M*TMFv=qWc`W+ym|hb${JB1p%kpmTr21Pg_A>kC#e) zpP%=Afp0@?eWiV$@3uyNA!lvhPc;C(_l^F|H%m-Ol1WN8dH6X72-Z2_e`?z5{al?_ zS+wnnJg{R2;+Z>^%JOz*D81gJnz{&XkaBmCgFdE$zEHmbYg&)jkcKSN+0JzwdAY$p z8G^I{`F_vqN_n^VWkJ%| z!26pF{Kfc#)yyE?@h#CZt!zsXJq#!Hr_cvC=Ao;swx7QIfMdtYZ}$Sw9h-RtC$<JO+3seTu!YNAkytBrlP;yx^8{njP|+TL>>=P8lK8#Huv#n0wql;Oh~Y$^JzV z!cV%}{9Y-QfSB3fY4O(_7Kgo9MaE$=Jgv-?voRosQJau4Mamz_6qJ&Bi}hgLw@MsZ;O?_ zNq;{_g&l%k19mW_@D*Y*o1UYaQ+S~J0ZjcaqO=_3F&uM`aGfBXm=ohTN22zCr(b4=jQL0SCUIa3ITa{`7-YH$H`(A1GfU zF7t)zZzYJ~%a>E#e{Ot-H5ZoSY9|743q_6u#i{JdWj?yYb!(6^{H}3{{;?k^dE0j$wP*PlsM`V%D${_>w>)crjrtK}6<503O=Tm# z#PT=FWW0z!Kf{tTwbvqRhGiU*!Xu-{53*4f6JV`{Wbd0sON>Afi!P4(E*W>E<1|@c zPnyc6V00Ret3}*A%X5xgW3X36)$rfH@~_6cqmto!9x=ujO4VkM8xR&tqO0fM#zi!( zUcudM$QiOvzsgovOr=g>2+U?tQtmd(IBXhGLBAK=W27Dgu&8iL19l~=UU9}mKCI?Wm5qH@O{ew@cuyuRaqoOe(2OHn@4q-}zpvI?d*KUG_E>j6xiM@znP zI3*EpswVk_T-=S$l2Q2X6OBYd^TpC1WeU_rX`lzrGs5PFn5C~)C1;+0G<c@zjKsUdH z!r{25EZZt##yUKjSNRG3xZ5;-r12)yH~v`N9LM^duP^kZ59J)SM~MjXHaqh1CwBMP zOMb`U{t8kFdgjZ;O=vK+y~PclY21O^`_Kz z^NIa(zBF|qvb$uZHDSg@gLvBAE?2mL50f5@V{oK@n%5D39Cd`u=f(-^T9?^m-Zo{Y z7~vLsFuQTI)RPe?eIhse)HRa}0D`nW@V*G{8dbgc`LK2;^{6@K-+UTQ1PBUR9GZCv z-^^{koXMU}%u1a|O$WqW7CA!lyI+gtBC~xZx?3@H-EI)CNOcODZsrJ)rL_{KhhFLr z1w_p%CSAT`W4tJLHsQ70u1^RJ=<*GQV?=+LRS1?^-f}pznYQsbPTy~x3LeA8TW}Eg zOMK*_iNh+A&-;sr)|1{r(tvKPm}5f2(6CgJfUo&=Clhflzuis)q_Ta`zCYx1F?g1} z(0G8-iH8R9U8sbDo69#Xo8C%SjxO;BtgSE3!oJ)6uM-ReM-PmX#D(GhLBT4u{LP@E z2n&VKX0dQ51^O_94q;ZuqWqVCYt~jF*f;-7Qu*KWBEVoSnPnRe!bCz8euZ2r6NdXg zhi6>n{`7ZV(Y{^PAzI4nibr^?-*2iLK5~IXuX)*ph{bhScBw#C@bzX&_D%<>rb76- zqDxd8jj~FfbH=-2{V+oq5J-W|4nFxM} z=3JUaCMJRsJeqCXZloVEw-xH_w^V|i)PQ_?$$Vvm5LXw{Y zqWWXq1*;9`Kn5tGX~R=R>4u|f_gCj=lV1_sdTQkhO&>oUVvN{! zX0V9hP7|zi2j7n-L){or+2?e+5<-9b6H~iL__+BIj(435{pxZT7zAprcr~mGIq!zl zMUhqEvUhGf5eS|{&9LUm;RNC?a~QFd%+Y0w|0?Ac^_}Z0Bzhi&)o)hD zxXM?CG{VOIvLO6B)92py<%7FSgz7Z;R6$R1Rux1U*_+3e(cPV~43Qksg%*A|x{Rq8K>_tvpyUvokCpK)##g~ZWqdODl+n9S$LKm4n1ae-t`kVVZ zA9ym6y3kz=4rY>EyKM=&RguD6=vvgQs5Cg7;LP{)3v{5&EqY^Se;B)BI2DL zA=N>~tpP3_Nh6y%3l06_CPW=EwI0mASu@lUJgTx?B((IQ^KTz<$%O=o4Y!qgC$oUL0`$etcL{4+!H6pb?qPkp+okwaEoYMk7t+z!;>xF=P`0$J? zMy{jGDkG&%;uzg-tM7g|he~nlNq*vpuZ7Kc8z_AzHo6^Bj}j#=xMT%m@-V`uO=-c! zMfVO>ci8dP#3TY4zrVAfEBW*bKgx?E81m$d-)BJ4UO8NbXAt(6**HY@Cb-%~^1S=$ z-uwDK-}=5Dr{>MrhIz8@ZLzVDaX^1mP3gn~Z)3$NO}&&2;jncv^fkwRbZ7eKPh z=iTn)0X~KG`t#M5SE4p`LhW_`YUfXsx(?RPpBzI(Qm`!Fe6(=!)3-8MgVsEIa~uvX zz!MQMAaPb~`W;aJ3RCWFsnKt|*1uFH`jSHEyjqG$-Ftm}gfMnJPUtZyY>cLZj8VpW zGvmaiC5))z70OO4h}LoHQd5YjtB<^iNOSO|NaoeR5!}0c>8n0zBwl|dzA_HD&&|O2 z>$SO>kZuxKJb5KI`0|R&WR!qn^rLaL{O$pg=8j{4_WtR60`^Yg4u|0KJ6Y|ZVP%By z91yGUVbcL@uR5vsP_G6Oah zu=>o=9UymMoY+Ww+V}t=m(YO&GWJG zZ(sown0nI(I8EKKc(y$!^%~Q3>n-=7-+#bVzcUX(%l08oUi9mRuNTK^txhL-J`;CM5je<|Pp`jqo){=Gra&cM0l zRc+Lozs1G1DPZTUN3JG~cmyb9jT_dZ{n zPUPku|8xj)QSdq|~48)#wc~|ZVe?UztYrpNl%{%$!G#=m_ zY&w<_@dN4XM6j0sq5I(Yw;USdThE!$Ftt~sg$&Poam*kAK2bH8w^`gC9r{Ggb$HeT zNaIQ_H`%p5>m_DYB%1i)iz5uQduPCb54XsQnxR~K_wj{=wNL!Le|uqSwHMElQ*N6v zPcL=$)BOk0H*hQH^KMP6>h9R+`_g zvX~4^-bv+B(EV!Zyvp)s_ZM4=)2WEUcv#|iSb%wG_ELq_3FnN#?xx4$M7{g{+Cei5 z))L8HuN_Ai`-?zTL1V}C!Hv<^o)Xq5`L%A%nHLFAnt=dV4SBGkGG~^} z;n8w`Zn0kgP*Peq+v{^TQOetdz1mO^`t)_R$`G6+j}I5Qf1c3heuGzIv^ju4S`1W) zhvTI=`kgSdoha_bR^*p=Es;B=dsv0lYDrV%OFa}d%WUDFPk&~(&r)YncRSA-QNOG_ zWfO*!w!sKRg%ybP^Un8i4UQIwbmmn&)Q<%TS=;=XzlR2{W55sWE=afEnr2A7kTGX_ zpVrS4t9_2<4Z}`B8XYNSo}~d%WNc7O%#WX7V=R6gp_bK)Jg}A4bqhp0Bb=m{3)|@r zpT37by)u_7TX@SLO%@MzgF|+JL#$~%-&0ASkZfFRTzz9iH@T#-sobt-yZ}mmp-epi z4pAXFF|#8GEUFd`uI}IO0rl{8|4n5on;jWID}8Rauz}mh%{fl?o88F9uf`MV01N6; z^DGflx<%xX3F8b>N@(1bu9#@v6C^XqvCgkJ?E6(guxCFN6cVXE7{WZ8)lc0UESyTf ziCE^>W2&8EmNq^!x)>4iV?C)E^|73^P=1J{=VGU&N!Sb`i|BG5MS>p5e84z5@5rDh zd=eSq6*{?;J8P11NjuPV_f1d}nsfz8GxCx~{s04A064oCU;Vl$rXQ>2j9W)7!6Xu| zHOrkhv>`|F0^)x4ODl%fC&Mu)gjHw4Q8w6U5D z+&(Rb71%LxNOCdVL_luf?o$-XVLEbj!t&h&`-*@|E{jB1XD;pJah9<-=`sa+K&H(h zHPrdE!jNd#w8tM_^nxrNH*!&}JWai@Y5A~G@V_P`2L>yW<(B?dpLV)FPc`ecwT6dd zhkGVy6IKaU_I;otB?%BZ>6OQ+f1q#zvl+#Wi9Z1xd}8o{2H=0x3Mk;7OkPYUR~H`}nb(pGNj@ z8`2^PpNL)?KY#QvqvA<{o#mJ>q#|@A*dQ75K@9FIVje!-Qo+x1-+$oO@Jaom&^J@3eA)K?$EOR(sJnwyocrIqo7Diy#WwME0XaZ|(E_q5YA7hi{|;S1}3whkYDsFyQe ze!BHZEO6eIl+_y5NW4=^Y$)2a)Hj#UzrWqNpj0rRPO6TJshCtDAQ`}8U!l0H9H%aXv^+(i~u>YZNo|+u^LRel5M4ZiKM*eVippS|Wi%?fjuM+>`Wk#vsTN ztXC>tdKRizw#mo*u;`h`ANT~imI!1c zG&7xDi|l*6qlQ>v(nc`+>?4ycu`fhfqYP<&bsodYPmH_$vn48_>59_E?nUQQnp6M3 zUYQ#*d(}3*aaswFp|`2O@GHC-r1Yjokv5=8J}|+HrQ0Ac*L4w#ht|yz6HLi|RH>wN zny6wpHG``(P4-d1aFO=uz{w|C4Til?saCGsb|)TwTo17uXG52BON#$Gn-WNjXy1rl zMC-eAY$tb;=aCD{9~7h|XiQQ#ZF~%iKlhhNisMRVzM&kOc>3HS8g^y**2wq>K*UTwyI8DB|{n@ zx`p*0<3D4gp^|!7DA0JUW<58?$fADu$*Zc0Abu)chVO7rYX}s7P`iIW z#D2z#FM!c)kV%S@cNJE53=e>cU-To06e@v7ELz9AZqJ1AuilW%0T_D52&Yo!rn73X zU+2V=ZvWb>Qhb2M~;BzsC}=Io^N_5ca*Fu)FEZtG57QJiB3mNDk?0^3DK zMkkJ;Zi5u2f7um;sPEGhQbmA+gk>#6mYVBNrz2OUO_A+hTWFb&^B-3&_c_L<)<%@T zxNUGTJ(H|%1O?f2WuWfTN%{tLIs1s)WeePCV?e%216<{h{4v{JZ3a!>lzbxLYGq4G zQXZETwDmj={4Ve1HmV&>GpT^G%nH?xDKTu!i#lI>$Ht0vyn^=MLZCYKxY)?*S49M* zkLyHKCaEO0=CFm8LM3kw<$cr^9vGx&6>ca?+l1LIMMu+s_+<~5NYN+)X}*pN%;8bN z&;graDV0dUkbhI@&jca8QoCRL2hVZN5lPSVKJr`8Imu(^CCJueSn219PB51aZUU!_>tIeV~VqoKO7IQp#- z`q#g*`XA1bZ#!*1Z}LrhBFw5h?@0==;A|^J z-2UN4|FjnU6gHe`<{o>ZN-exiIez z2lRNmxiBYOjH-2X zrQ<~~lI#koNgFY3T3eYGeZl6OsWxpn7yrf2TQw;WowB4UQv*1Ba06Jdnsd%gGx*~! zdm#)c*Ee;#QO@7+*hurk4ODru3*l*_QYAekSI%vfDz>@&n{z`7>B!d8-8n~E$jMaM zVKht*_s`QjHHe2TO20?RFGano!{A_lw0S{5r!`xR|7^f;6xFAsJ3v)5zWP;`q_j*W z5R%Z>vnb{+bA+1P&h%~~d1HQ#s|BS2Bz81<`dJKghr8Adm_^V468O-$%YvB+WS*Tz zmJpc_FTXFq3JCCqs5BGd;c1Ho#&i3yBZ|8ohL`L1W3Gd(C)%cBtVP$_DbEkWv>EpA zG|jKw=1fqMkHYP!4Ew-k0VO@XI)!3P5QC^g$cO)Zpt;+vVoLAL2#eUy`YnmN zF>bM)$s-J{51HJ%hcGOe+MD>{F|}iM`VuTANvrjPW5GGhkUlfdc(L*{qom`>Q$kQc zovfoQdUBvSf>n$%i*WC1W$78&Y|d(KP73~pffk^Z{iBYoVFrIT)jGz1XdoAB+>0$v z{X>}mgj+qp*ik+&Az2eCixJAB2fI`m73|X(mToWM4;S{TnWTV%!+|cWH;$~ozPE3^ zM>(&_K?Z+L?(cCe3Gx)89kQiXH^laytf*~{IUCYRDPj$FDW$A&hjFEhiFj){P<5#d zdi7rTvp5>&t+sYXgx2kY!ov@7jOuqD``3=8Foary0h9vPu{F)e4zZPC_IrRxi*XK~ zs7!{Wd%&L+G57da5SdJ7c9Hy8ta_hNTd@~qiAVTfoMj997o=y3oY|P`e$g|vXc_qxjGxEgC7(YHA|h+h}<-Kd`j!9+JSJh8n>M7}-yz()`Zix;Qu>SvA9) z!Ov9VU;@g>QC{rSSohMF#9Nx zz}Y3xk0uXsmK%BDcz!MyG?sNYge{nbR3@YcL?j$QkZbzSAiiDf)wE z70w&(;-f2fiV9($BZ(`!l?t0taujeiCi+E-GN}`B!0ro4_QJj*>aV%BbVe0MH1;#M z{(|FMnd6`87droBGzWX&{2BHf82naN^BVX$Iosvlr45WcoU8?7O(Oo*RBq+a-2x!we6ih@blXq1yhzp zo{=h4qiKR^5s()*3D(HsA5S?E9&DRc|1nWL{q#5{;Cxvd6|m-p>zOqLzBg?n&Uhv;Oz)d0lS!BZJ$PqWf3{dW3K|(CjE=JNmLR7@&PCtu z50;~(N)E8<+9cE9O=-3|1Mk)OJL1Yy6~1=jC{E<)#|SmuLZE-ppm@(-5Z^A)N-M&+ zrF1U#dubvGH|vf+b9gHTy5%qJVPfA38HBJ`C)f%rcqk{BgTf+gSZWEs0^(0SC0qK> zNN{`Yi9j#t(n`hM?#+ffJH0wdOK-JXyKR3Lip(O?}Sey=j_1t;zT5>1EK7r!k zEp_hvYs93y@8O)9Em5SOD^`s?54TpyE!@?sxkIn1Q{{$z(-^OIa1W_k*utdNfOGJS zkxgPV_m{FiDsBU`x!5HFCUaV3d$*hI~pbkc2${EMhyB6PWH@jAp z!QKd-Pj*vjf)$h+u!eegWU^XsQ}aenUt1MWb46`4mjL}p?IQ^;sjhMiQ*S=S71zo1+ru$c+QQyzj$OeqU}4xQ4&>&_oR z9#>}zhDQSchj8wiLy~XV_Ovy5;oS=AzDctjZEm0o)L<}<^>inf~uad+F-5Td4vB{9WjOh;R1eHZ9YNLF;izQc%OO;VULvBc(Rt0a*13|16?O@44SPitdux z57HT}&0VzX(!Hp8Lt0Kdt&^nkrS7(HZ*gy9fT&G}zs8cd4UU2=<4mfGD;*$_c2stg z?Fe)O*qkDZ+9dDQxUQ_T7Kl02Vw$hp)2XEIA}!I^BeFwW>z7)&2`SO17m3}z5vbGS z?U(G_HLnK8G~QCusr3xDGf`AaOsl;|a?6d^eM~KR6#RmWWj#L{X*EyW;<};HJx7`2 zYmvZMgP=CDD!pY?&+*Sh*N`dpEgZFh2E@LWuf#eZd$%H6fPWe9hW9uAQU5Zug5q&u z-cdDgNj=cdV-oO;;C&PdlKne~JY3pO*@LR2xMlCa7lH+xNMet5{NXTgqbeIvq~`|j zhwqzGN8y6f=B19?rlqrnfzox)5EF`Brl?Q<7hmiaUa-Q+a-gmmSsh1fF;FI#yHX%B z_tw{^lOD&yZITL$x#qo?2}gos)x6~P&uOTueC$ZNRr>S#VicZy5e_@PGdr`K(5Y`L zo4!P?5Ig-sY-f;~2VqRXgl*<~kdu>iAq9YHnC60gyqlcL<9jlSmqW8x-9!lr7;0(W zs2rvkKo(;Qn%%2%-U#N+hpJe+T+QpykG%7v3)MVxLsO*eX~#|p9Zvok_Uwz78c)Va zJq2-4GS1re1?;eTRp8C}&33fpEw)bag*$wtOjgnX^ie0YgmRwL zk@TU*VnEa)VMV!T-9QE@Y$iy*D^3R)DM*{TQ^(o5xWNXwC%eH+MO*4~#BW=_9i8EHk;)Ua#+Eo$?oRk|2dBl}y<+NJu)4hqrHkxk0t zy!Q%_oz_|(GoC9o2__RD7NP<}+XhJP@OI$A)-IBq46{ccN+~cx8b?GWk2AiKL1|t8 zDo+qRTjp7?GtWmH(~RsDRF$CZzE4jF#EZD$=uVaaM@>yvx|n5$j2Hv2kORHWxl}C(YuU|c8jkRO!~ziD-hQy zgvlm6DiO!(t6zGVLwFQ%t+Z*=zgt*zZ4Xn9KTY8*aR!e^lUcbpRkyia1h$X>yaFvG zQ=Kl=lIxLsO_Wt+)9ue?zGsJR=3`r`O|rLi%aP0QB4dC726yoI0n zqFC!Fs~aYyI`^|zs;KVx!z_7d5{zYov|3zWYh<-FxW6B!90am7dv!E#psJlu;?hTj zzCKo{7z~1~s9o&O8ePQFb7QEaoN(7TGP>ytkJ&CS}o=Q(706zIZ?qs{#wHEz+miDk~Q-!;9L;-D@j4Vh^~boA)@IumY&` zm*UJjLlhr1xoN@*+&>=6O4ttK?A&eAnkoC0ht*_so?cSoRP)E>)xU*+;m&TyXA0r*W+qH?*85IrY(3oynyexcxU885dK(vSI z;lo{l_ z?FM)s#5&f+-+TZrJ72cEfKEj3b8U5o9orw>S1mc|DMN2MN-Ga(dp?Hm3$yS%LbGz^ zTitC>W`>p7+P@iQq|{FZcAtG<8{lXaMzGW44X&Q~`@)%p^axCuD16Y$I2p#mqhGaO zI9ZnO-TSauq$noP_l0e2{cgfL);%4fzyOWZRC#9!5&#n&fl|R!%H5siYY45MKUf9$H^0a2sDS`1B(uUKlvR^Isd2oF2V~rD{*+zL#Q-ZHkqCijm zbOI(LTeK=G_0zaC8A_sLIXz7uEFzvs)1>)Fv1=cuJD9<7iu=ZG%KE4A2kpN&2?-Qk zzY|Iw(u29F?gYqBI$$dw=>|qudR2@YolLNzue35YyOpVz%F?N17V}&A$<)G64HdPR zdf#T~vl6~2(z_Xt+f1KF@H$T?g4W)HQi33%=F|7Sjt{%~CgNS zojwhr;bwkP`^8Th7heyx{#B9jLtdft;+*6zpF3%;^AxHf8OW>8&m|}`ZBxyzv5QUD zdp-_g{)D=YW_K%a!orMn-ydc@O)xqXm%bA%o3dUyNv3a_#9VHqZM5!sUL;MLE+3K+#-kMU1pl$9yw%n#n-5xk%{RNXPEq4UNcT@Ey-v}plD7ZMAx!Y%LN}pcWP!Cxjb1JzIXO$v z*ve*dBCF$RSuKzXy04xvO<@$4k9Bw&MPmM*)nRLr@t|4N%fUBOB~OD8p$B^K!MwYg0MN{<Qh>1CS?}8;mXV^q$fe@O)=hK98t=n^cI!fW;#~HDoM0tAH&^h)xfhe z^!Nw&kvr`D45N*N7^)d|kMO37$g?}@)F--4eKZ#U3ITnAI0ajP`>9`kg;c#Y`Ld2o z-|x?nW;PCOTSS-fKqQ_fzpftVxoaOkv=DV;jBYrQ@N!XAk}75Oa$0r_PYfiCPB<~h zHW4r~Xj!Bjd}*F~*FVSoQz04PY|yqy+xX)=^=^Mo`{VoL=}rGi{a}lS`Op5} zX(lPWQ?@~5lSIQ=hQPG7D^nhUk`g^yhqBb!lpC5{LL`& zc7=`;r5;=xs+G1C!I-QbX&qb}*&gH>BrRlxLx@VO>j= z?ytnJFt>>_Qd~r{{@!{?7bjMlg2x+MI_DGasa-u2tCmTimTQzP^gKVL>@Zr(D;+;4YX-t5nv+2 zfT0Thv@K_ZZ)Fa2=q_MRHNoJiU1Tmh6Gj^9XmOQ7*|K{zXVP3Ypw zv}CrgB^P8>)q+9e|GTBo7OCTuOj2t|R@qqEhe^J*! z_rT&)upmYv3n9*7B1>S~wwF5lNA9(0z%_O7bqkp93ffs@fft$1j~%pm1b5I*JIGl0 zXiIvedgpp{6RIIawnqy-@OcP#5MI!ppW&q=8|+&Oix-3grh6*qhmB;2l?!=TY@5s0 zMDxv$ECgV%BPUf7W&L@ZjN5xyU4wsuUE+14nxO~lQaJ@ ze<17$+f8b?tJ`?TQ11tXr`4C!|HMqn8LDZ#|1eXdH3$gCf5S}jHs=3(^5|G^D-K-> zB_O{pV=Qc<`h8a*-kQWmCPg}Wya^IQQ`D{*Uive@x6+|5vbLeBRN#;UL|60B)kx9c zJ;%1IGceE%_&GB5zVg2Ge)tY-dvE!y`8uAddorq;d#QRJxp=s^1PlS*Yv0{~mQOri z_sUbWUp;6;LM<7O#gjw|c%6mV$6|Ep@$SImuS>qC=K{}yq?Y$x5ImnF9lFFw7x{~i z2CK6KP!5SSK~^6+3Kv?IvB!%^#r$rB*%AHb^#m6wNb88s6|G&;pOrU6qi+pk9Jq1- zc{*ik?YF|SUgVY$kY;Okv&870+{B6MjR(~7rg(?mb)YOUT|55EP;E6c|G%&*=))ws>M zhC0-b9?GQAFz-j`$qSZol;X&z6Z@tT!*sS?G?Schtd{6!y>-b$vVh@n)by&<*x_aK z6FQ>!; zrSm9@#!d)$m4v1Z*zT9y*gMO{cgEoA3W;Q?7-(i$xTo*W7Vun2$u_h`ai+e(3k{|p z*h{#j-$Q@)8ll;2xkjR93eDTCBWtX)r`ia~d^ulK``V7g&Jro+A3oeh=CjX~Gy3^{ z?n^1LXe1c3;r~4%bB~Ca<2f}f?v8KI_J>Nl#uHk{%r;1OF3_RZY7LT))?FHkZhnbTZ@*YKL?j0VY;kYFg< zpN-Hl2{tOPo0Dpv%z6rUM>Nxy_&1(W<79!D46pDs_%-!5m>0t(HJzT&7mXOq=IJ)8 zb$xnvqHldn=YW*U05ZPCNDmtA{xCc7JSlx`ff-Dj?7dQzja;Rqa^TVE3v_%T@aPDT zOD#w#lV%L0T|g#~O1v|AvS)52AmWkwew}C9)AVS);2m|}k@EaDB77Xj3N{mwb|Tf2 zLKA7(rEmXkIe+KbWV|k99FVAYZsS zK~9!(Z_BWbcwwN^)E~AGt%g_|0{e?^&|UB`KDLq^3%>DD`Xx3v4*Y%ZApBRT>Z@nR zS6toU?4XI#`_;yz3935KNMf&GD?H@b(pVr*0;i0oj?o8mAn76VzNkd1@nGx94)Ii+8~g+t><^&q!R2j-^GA`1dBVwY!sv@Qtgqdnb3!#B{n}|Q zTdtW!tKiyyK79g+O%t;Cz?pZ(_kTC>&ov_#iQn9wBlb5N5{6REE%KW=bHI3BUn-N2)7_5>t~xcEEVC32#l>L2<5p zj-3ms<5s;=ybDI(g&6hTtgL8{wqaT(J_as<3^t;x_=lLckXxA_PU<<<0YoWYI94zF z2lbB!d^ZT1KOwd*8^G+Gv3*P zTBW_uWP;o$+c_02Ui+>f`Z$EB=Ftc1zX;>h0|iW-hZA&Ul72;z=Saj$xO(Z6Ri^&r z0+=!86LdwT;ceyE5_|Ssbtx^^qg0uejHv;1 z)+~)*R{i0INbfbirQNJ1racRR|FNAhOsV!M&Z?%ot3zk#0%4-o{P32tiLxAKaT+MC z)!%^9{6?1B$`CCN5TBBdbUX*-MoTv1nauh2-0@8c$9qB|Vq7bF`BB4u15eP+i_`Um$SMK}X z-I6k|+#6#+$1Ty*2 znsMU8w|!YLr5$>jtk!Nh%hHKYXDI(UAiHH-i^eT~Eb&ZSjb1j&oI5DOy}-mg|9l*? zHhSP~c3aN1J(B{U}Wk+muP@l33A`D z2;=8Q&AWOFUY@=1SH z%&*7W^F*)#fK_GyfaGeiq3CAwhqgr8yyKDx>AQuqr)cQN;VRxqP!QL1ZR@?GG28Mk zH-@JWnlLw}nA@STkLE9731fFDz9w-$L8|m&sfaCq8#IfRRLJm6(PS3DfeV0|G}Y%t zSV@6CAD5iZ?kD7@xt}hcuWT0^?gWAH{UODQUSc2FNRdX$H>70lCN$_)4_XTP2GL^B zZ-S%x!UzNwG4Ue5xyi6L=4_oRSB4y^kQXon@#P-hkP>|G9jMN`jvtK-I3N!gG|(1e zaXa)JG=9m2eoZ9(qokk!S+C#tKy|~B1D>LhQ#lW%QYAI2n%26bH5Fv?Oz=K4{AWzB zpILg9iQNj6C)ZzTc1Fs)##A38@q3+vi~4E{Ej$t%12(8%{^rI@c`TZDU`x#VI4AKQ zkte4KKOeLgGCohpS;Y=A-^YgJ&H|a;9} zFBrdCU2}C+6~_19o8K+$LhJUFvgpuSSm)+GQuv0hnzt5hoF3YoZ8Z}5F1n3##Fafk z?Sr5^2sp3?_Jb>fZVz(=`?h%TS^SV+r_|V3VpNfKUW1j>5zTwK=9`>knM^0W5#~`% z2;+gENgFYZdTFL)+`j5g#nMEX5f0pRcNCSj@@)x=f$yY6%Z8Kh?^~~3So6Dj_Po~< zV)abiOojEW=@$*VI#Yq7YVTk_ZzuHnJo3D2ML9W2zrp4LP$NtsOskMzS)#f)0O2kt z74`H0m%tkdvbU|lr#BNGM{*~cT)-^|k0)i(2ZD6{`{Go}cJ+eZORxx_*vV~~ zxlkXgphYqs#rMizrvhR4ClcCkA(y1hx^oOXy9A*}(~|ojXGaFHU54&ViFT(8k8U!Z zHR0Gmtwm0k3if=M61fy8M`RikZHwBb`C7ioIU#I#x4I*(!w-nwHWPbCx56KNX3Xl^ z1f37SGcIm6pmRpfC+}nxZoiUO<3S{U$m;*b+#WAjQvCwqj${REwd258Q;l`|f;dz6 zH_t2M@joS=G*n z^cRet9aLYSRGVB}JSVk9@ih%V0X?oiLYC7*lx>Ngx!77VRxRs3|S`Km+v1Oz^xH7ZP~rJKL1# z)W9tGT-Duv@;EVStu3M*NylbcI*3KfU76ZC+n|or86o|SB#|bi*KYry@_x|oy`zM^ z)!}zuwsrPPtUo82Tua2IIS~MGNDKhbTum~r)@}}_5EC1F7v3j-|KxFkSgk%ilN{Zl zyR5KCkUemfvYt5j$P}GKIe0(+RPRotJkY|tl>dWi!b5us=)H2e_e!~04?~9HWVu%E zMMo*w4%F_L5HB2B`4}xQR85{;EFz5dwpw3Ip0!q;HDWC`m&GUD1OUp=me~zFh3h271-vXr+rrYVgb;=%QP1ZZ9W|I|oJL=uHv>Y$|*? zakoh*enckfQ#d)?mT|WTg&8|2pqhq?zi=~TXgi$SR=bGhws0@){YdcFc?3|n-*X{* z3UrXP_-r%~t#mGWEY1bx{zx={E3E(pJ>7EN=rMW3*>s#7>1dn4t*by>EjUVs@N_AO zfQ1xzlDX$+1NyWPv~QuUG}#*ySFh;)n2y@`mh8r z5om(~lszLPN-dCiAGE#B#`#&h`iy;VGBXy-z`R&&W_xF4k0z5#@w_eaonavPAl&zaK*SQP)PXbO%cHueZ191KGh_JN?hC{ zhKgjdl$^ovwvH)8uk$34)bSTA6rg&6OrirxEDw6(=ryxCc!3fMJbd!K2E*X~9>s=e zv7Sd*wPzb&yFf!fm?Dth%4|IS{{2@nBTX&3U5&98Hx4kER(j|b%O!&?9^gre8ZX`X z!Z%2)TM|+CZrvyI*}fF(%9CL45$()AfGDrGpmc%ZONGx<&Mj+xP5$~I*|_uU*Y zHeN|Uxt7{{j8bn5(k+$%WmyLzk{yhh;Fjr8UvS{4=vv)b%xHP!a-2x0KY%R zOF6>r0K=@OoB~zmNfW^sK(Oi4g>Zu}&qu%vwg;906K{ZWx59lPb7h-~q|RJQoD@*u z8HA9%%^R#H2{!Yl32ID?rEc&M&@vn|qD7F)&N(Z{X^ZOa_IobyQw}EEo$}7b8}Xri z?z(~eO^<6c5k`<5yF@CuQflF&`w21PJExsvOSdKJ4mKaN&wPUrtwo5nt;I_7Ag5o9 zpT$@OM7Y(xP{_>B%1e8pWp|D}WLp+7$4TIrsmf}*ARIveylrH|R_Qt6JIGqFk*Ozm zbj!(u#M$WVupIxgr{HV`ZeJQuzW}!%l+262@)Z0Qc;Ai;*Xq*WmWx9+`idGtJ* z8}|X5@L&6x|j)Q%q5#`aT!uQz>lZhb~L-X9eS% zie+6?t_A3{ejL7FVaO@Wdo++q4}W(-9^bNEj5Akt$||%%|G?D*rJ9%`t1X?fpSU`a z`Kce4pSM#zBd!^q!}=1h3Qb;RghyG*kYtU;WrD2Zillxa4tA<#ik0OP-jR>u^g#Gq zZSqwInHsVX1P|7q-_ctyZ1rAtB3V1#enO5z0Fft=?yh(Az}DjL>d%Q=`T6<%X@n$d z-|Ow8SjBh2yiIZ)MdG_VCA?Om-~;!sDPw0^H}I{iNDMD3==AzSI}02Rr`a^?gTD;U zV01gE_f_>jhv8OjQhM68hB&?cahRA!0lkKb{M~bc<)~bO!zq-R8ny_o< z*C*I>IbZs7oiU{?c*CT=4*Id2;Ov8Zmgy=57e!WBXa_)Cf}9H8I%_@C{d1*$-aX@~ z-j51P0ZM#kb|%>q-!A=&oXyBXw`5-82;3e2#*fO$+o1huH8tx-g#ZP)COoe|6xLpV zt%o_E%QmV}dziaiZp^mlbiFCYd-+o^E!4(>@wD?&Ix9lbj-W^n(gixjd~=txN7TTT zDy0Bfu_O2+^t?c07>7ubO|EGsyD6Q&$*~9OdDaz0RYfWn*>+_1=#WDA2gF3hD8R6w z+)>f13l%@~)z<_iH|^`0x^^?3hqcb5q7LZKW=sIhVU0#+scG0wGVIVM+Sw<)cy;K7 z?p~*z=zN@Qn7~pKarp2f0L$CW4e?>{i6X}%W^(Oeq1IKpt;)PNqrPX=NtrlbP7s;7 z?A3Q-L5^^JP2R12bptC6?hL)MOZ4#AL>RHOhvP0VIlC^iXnaLScr__|{2V8|R@Osu zkHD|OqSDOJ&;W5@Bt-Tx1F!>cY(ai1o2WCxtRY@Wu=U<3oQIVazrAP49`jT~$~k6* zeg&SQyr+Jgwfx~^GPfJZ*`;0_b zy*>t(9*V9FBpL)924*_ACziJ3P1h47up}9z_f6Pdn1XG|g`O|+#+RW&0u4IW*;da9 ziAj$*EH{SA8|)6=*m{phzt?)kk~&?31wVhf%JNvkYtK#a9yg9t_aMqDZY!|u3rZUg`!UUo87pJUtt|fOkL*afpRtI#9icD zis@?)D-Q`N{m)PudO3HgzHQifNT@7`*qa1L%IT9*Yt?J_oqV0~3~N8QvHB&9h2T6h`Qe+&cyEd&gX@1##UsRXTRtI?lC zZEUffb1tp^w7^wyu=)JZw=r3?8Cif`<8jmMi+3j-K7e~R%{oba=VS-LT<`SlAr%Tcy^25m^fol> zL6l4ILkE)86$&fG?Gk?g_0lS)w4uYv#kxq(oKyvv3M^2cZL{!+qAJsaLmTMxJ<&)z z^5@Y7%<=~jqI4Z2LjV+5%i-i5#Z9g=q!OJuo6e>K@#>g2gi5@bjjhdfNlVHh#haKP zqX~58iM)r%+txOl#Jt+f%%?qHvVR3|G5nkZV-#bouGKsVk2V(jqN~l9^m+uG!a=kV zU^?eX=Gy8Ci8)~@H28W0oAe;-G8%ABVP}WG*xkx`VdS)&o6&*BG_StW7imm;$gpJA zdMo9b@594M*0lD;>1^1VXJBWI&kybF=*g&3eN*8&JVXrZ)6im@i;D{j`EVZrtwQH# ztPr$|83rudWk&nvSb z1q%7At)?rLQ2^lT;tZf>1F?{Gw0DF`L!l;~X667)Wo2c+KQq5dMt@1;{Wr+bCGT9} zR|i+`U(jC?deTl#7A8;=h?#|%xv?>tftI$Pba(gSZGQf;WL$PqlI7sLA>$7K98M|w zEX&j+Q%FXEoo$?bshw$xX>PiCmig5oB+c5`KF&TREe-p>`1xmS{Qo^T(*F$ZA1G|V z%V3#*MfZ!k7Tp!~ukdo1c`yGhJb&yb{!?O~1-ReOi6~EwF-||8?BRPaBitv}r!+Y> zcYpZZ6yr4Cg9rFmp0BCsSd?hgZ*U9`3 zox|%kuHV-6+eS0r|7qi2H+fyRbA7Axx1H^WzwP|7@p;|E^#bN^69!jj(SLG1rT#zmS6=+x8eT