From cd4e8e6a3f811462667ad5363bd6f8ce4613ee1b Mon Sep 17 00:00:00 2001 From: seeker Date: Sun, 12 Jul 2026 20:37:34 +0800 Subject: [PATCH] Align pi0.7 minimal structure with paper --- README.md | 283 ++++-------- configs/overfit.yaml | 26 +- outputs/overfit/context_ablation.png | Bin 93967 -> 91355 bytes outputs/overfit/evaluation.json | 40 +- outputs/overfit/goal_generation.png | Bin 51295 -> 63265 bytes outputs/overfit/summary.json | 6 +- outputs/overfit/training_history.json | 619 +++++++++++++++++++------- src/pi07mini/context.py | 52 +-- src/pi07mini/data.py | 32 +- src/pi07mini/flow.py | 99 +++- src/pi07mini/infer.py | 282 ++++++++++-- src/pi07mini/model.py | 126 ++++-- src/pi07mini/rtc.py | 41 +- src/pi07mini/runtime.py | 47 +- src/pi07mini/tokenizer.py | 71 ++- src/pi07mini/train.py | 301 +++++++++++-- tests/test_context.py | 22 +- tests/test_data.py | 10 +- tests/test_model.py | 27 +- tests/test_rtc.py | 47 +- tests/test_tokenizer.py | 14 +- 21 files changed, 1485 insertions(+), 660 deletions(-) diff --git a/README.md b/README.md index 046811e..7e4f4e5 100644 --- a/README.md +++ b/README.md @@ -1,246 +1,125 @@ # π0.7 Minimal Validation -这是一个面向**结构验证和小样本过拟合**的 π0.7-style 教学项目。它在前面的 -π0.6/RECAP 最小实验之上,重点验证一条可解释的 steerable policy 链路:利用 -短时历史形成 memory,在高层预测视觉 subgoal,通过可独立缺省的 policy -metadata 控制动作风格,并在存在控制延迟时用 RTC 对齐动作 chunk。 +这是一个面向**结构验证和极小样本过拟合**的 π0.7 最小实现。目标不是复现参数量、预训练权重或论文指标,而是保留官方论文中的关键模块、模态顺序、注意力信息流和训练/推理闭环。 -本项目不是 Physical Intelligence 官方实现,也不能用于真实车辆或机器人控制。 +实现依据: -## 公开资料边界 +- **π0.7: a Steerable Generalist Robotic Foundation Model with Emergent Capabilities**; +- **MEM: Multi-Scale Embodied Memory for Vision Language Action Models**; +- **Training-Time Action Conditioning for Efficient Real-Time Chunking**; +- π0.5/π0.6 的 FAST、flow action expert 与 Knowledge Insulation 结构。 -截至本项目实现时,作者没有在 Physical Intelligence 官方网站、公开论文索引或 -`openpi` 仓库中找到可核验的 π0.7 原始论文、官方训练源码、checkpoint 或完整 -model card。因此这里不能声称“逐层复现论文”,也不会虚构官方模块尺寸、损失、 -数据配方或实验数字。 - -本仓库所说的 **paper-faithful toy** 有严格边界:若 π0.7 的公开描述强调 memory、 -goal generation、high-level control、steerable metadata、CFG 和 real-time -chunking,本项目保留这些模块的输入输出关系与必要消融;所有未公开细节都使用 -最小、明确标注且有测试的本地替代。`TinyMEMEncoder`、`TinyGoalGenerator`、 -`HighLevelPolicy` 和 `Pi07Mini` 都是本仓库命名,不代表官方内部类名。 - -若后续公开原始论文或源码,应重新审计本项目,而不是把当前实现当成事实来源。 - -## 模型阶段与输入输出 - -| 阶段 | 输入 | 模块 | 输出 | 训练或验证目标 | -|---|---|---|---|---| -| 1. 历史构造 | 当前图像、过去 XY;不接受 future | deterministic history proxy | `6` 帧 oldest-to-newest 图像、历史状态、共享当前状态的 ambiguous history pair | 检查无未来轨迹泄漏 | -| 2. Temporal memory | 历史图像与历史状态 | `TinyMEMEncoder` | memory tokens / pooled memory embedding | 区分当前状态相同、过去路径不同的样本 | -| 3. Goal generation | 当前 observation、memory、任务文本 | `TinyGoalGenerator` | endpoint heatmap / subgoal XY | 只监督 future endpoint,不把完整真值轨迹输入 policy | -| 4. High-level policy | observation、memory、任务与可见 metadata | `HighLevelPolicy` | high-level context、goal/metadata logits | goal loss 与 high-level classification loss | -| 5. Steerable flow policy | high-level context、预测 goal、metadata、noisy action、flow time | `Pi07Mini` low-level action expert | 连续 action vector field `[16,2]` | flow-matching loss | -| 6. RTC alignment | action chunk、随机 delay `d∈[0,12]`、已执行 action prefix | real-time chunking target alignment | 从 `action[d]` 开始的 target 与有效位置 mask | 仅在有效位置计算 masked flow loss | -| 7. CFG inference | 同一 observation 的 conditional 与 metadata-omitted 两次前向 | classifier-free guidance | guided action chunk | 与普通 conditional、unconditional 和真值同图比较 | -| 8. 轨迹恢复 | normalized action deltas、历史终点、训练统计 | denormalize + cumulative sum | 未来 XY 轨迹 | 轨迹 MSE 与可视化,不等同安全指标 | - -核心信息流: +## 最小结构 ```text -history frames + history states - ↓ - TinyMEMEncoder ───────────────┐ +history images --MEM video encoder--┐ +history/current states -------------> observation block │ -current image + task ────────────────┼→ TinyGoalGenerator → predicted subgoal +task + predicted subtask + metadata -> causal text prompt │ -optional speed/quality/mistake/control metadata - ↓ - HighLevelPolicy - ↓ -noisy action + flow time + RTC prefix → Pi07Mini action expert - ↓ - continuous action chunk +generated future observation -------> image-goal block + │ +FAST action tokens -----------------> causal discrete action branch + │ +clean RTC prefix + noisy postfix ---> flow action expert ``` -## 重点结构 - -### 1. MEM:短时历史而非单帧 - -PAI 的极小 manifest 只有一张相机图像,本项目依据已观测的过去 XY 对该图像做 -确定性的微小平移和曝光变化,构造短时视觉 history proxy。它不是实际多帧视频, -只能验证 temporal memory 的接口。 - -`ambiguous_history_pair` 刻意构造两个“当前状态相同、历史路径不同”的序列。 -完整模型应比 `no_history` 消融更能区分它们。这里的 MEM 仅表示本仓库的 temporal -memory encoder;在官方资料缺失时,不推断该缩写的官方全称。 - -### 2. Goal generator:只用 endpoint 监督 - -训练目标是 future trajectory 的最后一个 XY endpoint,经高斯渲染得到 heatmap。 -API 只接受 endpoint,不接受整条 future trajectory,从而避免把低层动作答案作为 -视觉 subgoal 条件泄漏给 action expert。推理和最终评估必须使用**模型预测的 goal**; -真值 heatmap 只可用于训练监督和 oracle 诊断。 - -### 3. High-level 与 steerable metadata - -最小数据由一条 expert demonstration 确定性构造五种 policy mode: - -| Mode | speed | quality | mistake | control | -|---|---|---|---|---| -| expert | normal | expert | none | human | -| fast | fast | good | none | autonomous | -| slow | slow | good | none | autonomous | -| understeer | normal | poor | understeer | autonomous | -| stop | slow | poor | stop | autonomous | - -训练时 `speed`、`quality`、`mistake`、`control` 独立做 metadata dropout,任务文本 -始终保留。这既检验属性是否能单独控制行为,也提供 CFG 所需的 omitted condition。 -这些合成标签不是人类偏好数据,也不能证明真实世界可控性。 - -### 4. RTC:控制延迟下的 action chunk 对齐 - -若推理耗时等价于已经执行 `d` 个 action,模型不应再次预测旧 chunk 的开头: +官方 Figure 19 对应的 prefix 顺序被明确实现为: ```text -original target: a0 a1 ... a15 -delay d=4: a4 a5 ... a15 PAD PAD PAD PAD -valid mask: 1 1 ... 1 0 0 0 0 +memory observations -> causal text -> bidirectional image goals -> causal FAST ``` -默认随机采样 `d=0..12`,返回已执行 prefix,并对 padding tail 屏蔽损失。RTC 在 -这里表示训练/评估时的离线对齐机制,不包含实际控制器、异步推理线程或硬实时保证。 +- observation 只能读取 observation; +- text 读取 observation,并在 text 内因果注意; +- image goals 读取 observation、完整 text 和 goal block; +- FAST 读取此前全部上下文,并在 FAST 内因果注意; +- flow actions 读取 observation、text、image goals 和彼此,但不能读取 teacher-forced FAST; +- flow loss 通过 Knowledge Insulation 不更新 VLM/MEM stream。 -### 5. CFG +## High-level 到 low-level 的闭环 -推理时在相同 observation、goal、memory 和初始噪声下计算 metadata conditional -与 metadata-omitted 预测: +高层策略输入当前 observation、MEM history、总体任务、metadata,以及过去的 subtask history,输出下一条 subtask。推理时该**预测 subtask**同时用于: + +1. 条件化 visual subgoal generator; +2. 条件化低层 flow/FAST policy。 + +评估不再使用 ground-truth subtask 替代高层预测。 + +## Visual subgoal + +论文使用 segment 末端的多视角未来观测作为 world-model target。当前极小数据只有一张当前图像,因此本项目生成一个确定性的 `future_observation_proxy`:根据 segment 末端状态对当前相机图像进行小幅图像空间变换,得到与未来相机帧相同的 RGB 接口。 + +这比旧版 endpoint heatmap 更接近论文结构:low-level policy 接收的是生成的 RGB future observation,而不是直接编码的二维终点坐标。它仍只是缺少真实未来视频时的最小替代,不能证明真实图像 world modeling 能力。 + +## Training-time RTC + +训练严格采用 action-prefix conditioning: ```text -v_cfg = v_uncond + beta * (v_cond - v_uncond) +prefix positions: ground-truth clean action, flow time = 1, no loss +postfix positions: noisy action, sampled flow time, flow-matching loss ``` -默认 `beta=2.0`。必须同时报告 `beta=0,1,2`,因为高 guidance 可能放大过拟合、 -产生分布外动作,不能只展示最好看的曲线。 +推理时已经 committed 的 action prefix 在每个 denoising step 被重新写回,且对应 token 的 flow time 固定为 1。RTC 不再通过简单左移 target 来近似。 -## 数据与防泄漏约束 +## 官方 prompt dropout -- history proxy 和 ambiguous pair 只依赖当前图像与过去状态; -- subgoal condition 只使用 endpoint target,不能编码完整 action chunk; -- flow expert 训练时不能读取 teacher-forced 真值动作 token; -- 所有模型对比使用同一 initial noise、归一化统计和 RTC delay; -- 数据增强的随机数由 sample index 和 seed 决定,保证复现实验; -- 仓库不包含或重新分发原始 PAI 数据。 +- visual subgoal 出现在 25% policy examples; +- 有 visual subgoal 时,subtask 以 30% 概率移除; +- episode metadata 整体以 15% 概率移除; +- speed、quality、mistake 分别再以 5% 概率移除; +- control mode 始终保留; +- visual history 整体以 30% 概率移除。 -## 安装 +metadata CFG 使用论文公式: + +```text +v_cfg = v_cond + beta * (v_cond - v_uncond) +``` + +## 运行 ```bash -cd pi07-minimal-validation python -m venv .venv source .venv/bin/activate python -m pip install -U pip python -m pip install -e '.[dev]' -``` - -默认数据路径: - -```text -../../alpamayo/alpamayo-qwen05b-validation/data/processed/overfit_manifest.jsonl -``` - -若路径不同,请修改 `configs/overfit.yaml` 的 `data.source_manifest`。 - -## 测试 - -```bash pytest -q -``` - -测试至少应覆盖:history/goal 无 future 泄漏、ambiguous history、metadata 独立 -dropout、五类策略构造、action normalization、flow matching、RTC shift/mask、 -MEM/goal/high-level/policy 前向形状、CFG 公式和 checkpoint reload。 - -## 三阶段过拟合训练 - -```bash pi07mini-train --config configs/overfit.yaml -``` - -或: - -```bash -python -m pi07mini.train --config configs/overfit.yaml -``` - -| 阶段 | 默认步数 | 更新内容 | 目的 | -|---|---:|---|---| -| goal | 300 | MEM + goal generator | 先证明 history-conditioned endpoint heatmap 可被记忆 | -| high-level | 200 | MEM + high-level policy | 记住五类 metadata/goal 高层条件 | -| policy | 900 | 完整 `Pi07Mini` | 联合训练 metadata dropout、flow action 与 RTC masked target | - -默认预算面向极小样本过拟合,不代表官方训练 schedule。训练完成后应保存实际 -训练会生成 loss history、checkpoint、evaluation JSON 和消融效果图。 - -## 当前最小实验结果 - -固定相同 flow 初始噪声时,高层策略预测 `steer_left`。轨迹 MSE 如下: - -| 条件 | MSE | -|---|---:| -| Full context + oracle endpoint goal | 0.470 | -| Full context + generated goal | 0.491 | -| No metadata | 2.458 | -| No goal | 4.043 | -| No history | 2.159 | -| Metadata CFG beta=2 | 10.576 | - -完整上下文明显优于移除 metadata、goal 或 history 的消融。TinyGoalGenerator 的像素级结果仍较粗糙;生成 goal 在当前 policy 上可提供有效条件,但不能视为真实未来图像生成能力。较强 CFG 在此极小数据实验中造成退化。 - -## 推理、画图与必要消融 - -```bash pi07mini-infer --checkpoint outputs/overfit/checkpoint.pt ``` -或: +训练分为三个最小阶段: -```bash -python -m pi07mini.infer --checkpoint outputs/overfit/checkpoint.pt -``` +1. high-quality segments 上的 visual goal flow; +2. next-subtask high-level policy; +3. 带 prompt dropout、FAST、flow、KI 和 training-time RTC 的低层 policy。 -最终展示不能只有 full model。相同样本、noise seed 和 RTC delay 下至少比较: +评估输出: -| 实验 | 移除内容 | 要回答的问题 | -|---|---|---| -| `full` | 无 | 完整链路能否过拟合并重建对应 mode 的轨迹? | -| `no_metadata` | speed/quality/mistake/control | policy mode 差异是否真的来自 steerable condition? | -| `no_goal` | predicted goal | endpoint condition 是否改善几何方向和终点? | -| `no_history` | MEM history,只保留当前 observation | temporal history 是否解决相同当前状态的歧义? | +- predicted subtask; +- generated visual subgoal; +- full/no-metadata/no-goal/no-history/CFG 消融; +- delay `0/4/8/12` 的 RTC postfix action error; +- trajectory 和 normalized action MSE。 -还必须提供: +## 当前最小训练结果 -- predicted goal heatmap 与 ground-truth endpoint heatmap; -- expert/fast/slow/understeer/stop 的真值与预测轨迹; -- CFG `beta=0,1,2`; -- RTC delay `0,4,8,12` 的 masked trajectory error; -- 每个 ablation 的轨迹 MSE,以及 goal endpoint error; -- full/no-history 在 ambiguous history pair 上的差异指标。 +默认配置在 Apple MPS 上完成 `800 / 200 / 900` 步训练: -小样本过拟合中,某个消融偶然更好并不证明模块无效;应展示全部固定设置结果, -不调换 noise seed 或只挑选最佳样本。 +- high-level subtask:`steer_left`,与目标一致; +- generated future-observation MSE:`0.0246`; +- full generated-goal normalized action MSE:`0.2848`; +- no-goal normalized action MSE:`0.2938`; +- no-metadata normalized action MSE:`0.3739`; +- RTC delay `8/12` 的 postfix action MSE:`0.1210 / 0.0874`。 -## 安全限制 +在这个极小数据实验中,metadata CFG 的 trajectory MSE 仍然退化,且 generated goal 的视觉细节较粗糙。结果被完整保留,不挑选更有利的 noise seed;它们说明链路可训练,但不支持真实世界效果主张。 -- 严禁连接车辆、机械臂、移动机器人或任何会造成物理影响的执行器。 -- 合成 fast/understeer/stop 轨迹只用于离线可控性探针,不是安全驾驶示范。 -- endpoint 命中、轨迹 MSE 下降、loss 收敛和 CFG 改善都不代表闭环稳定性。 -- history proxy 不是视频;RTC target shift 也不是硬实时系统验证。 -- metadata 可控性可能放大危险属性,尤其是 `fast`、`poor` 或高 CFG beta。 -- 真实部署至少需要真实时序传感器、闭环 rollout、OOD 与延迟压力测试、动力学 - 约束、碰撞检查、冗余控制器、故障降级、急停和人工监督。 -- PyTorch checkpoint 使用 pickle 机制,只加载可信来源的文件。 +## 安全与结论边界 -## 能得出的结论 - -成功实验最多能说明:本仓库定义的 memory、endpoint goal、high-level metadata、 -conditional flow、CFG 与 RTC 对齐可以在几个合成 PAI trajectory mode 上形成一条 -可训练、可消融的最小链路。它不能证明与未公开 π0.7 的结构或数值等价,不能 -证明 emergent capability,也不能支持任何真实世界安全或泛化主张。 - -## 可核验背景资料 - -- [Physical Intelligence](https://www.pi.website/) -- [Physical-Intelligence/openpi](https://github.com/Physical-Intelligence/openpi) - -在原始 π0.7 论文或官方源码可核验前,本 README 不提供推测性的论文链接、arXiv -编号或官方结果表。 +- 本项目只允许离线训练和可视化,严禁连接真实车辆或机器人执行器。 +- future observation 是单帧数据上的代理构造,不是真实多视角未来视频。 +- 小样本过拟合、loss 下降或轨迹重合不代表泛化、闭环稳定性或安全性。 +- 成功只说明论文中的模块接口和信息流能在缩小模型上形成可训练闭环。 diff --git a/configs/overfit.yaml b/configs/overfit.yaml index 5203fac..a6a871c 100644 --- a/configs/overfit.yaml +++ b/configs/overfit.yaml @@ -19,11 +19,9 @@ data: model: patch_size: 16 d_model: 96 - mem_d_model: 64 - goal_d_model: 64 - high_level_d_model: 64 n_heads: 4 n_layers: 3 + memory_layers: 2 mlp_ratio: 3 dropout: 0.0 max_text_tokens: 96 @@ -34,14 +32,12 @@ model: memory: enabled: true history_frames: 6 + history_dropout: 0.3 ambiguous_pair_weight: 0.25 goal: enabled: true - heatmap_size: 32 - heatmap_sigma: 1.5 - xy_extent: [-8.0, 64.0, -16.0, 16.0] - endpoint_only_target: true + target: future_observation_proxy high_level: enabled: true @@ -54,10 +50,11 @@ high_level: - control steering: - metadata_dropout: 0.25 - preserve_task_prompt: true - cfg_training_dropout: 0.25 - cfg_beta: 2.0 + subgoal_probability: 0.25 + subtask_dropout_with_goal: 0.3 + metadata_full_dropout: 0.15 + metadata_component_dropout: 0.05 + cfg_beta: 1.7 rtc: enabled: true @@ -68,10 +65,10 @@ rtc: flow: timestep_beta_alpha: 1.5 timestep_beta_beta: 1.0 - integration_steps: 10 + integration_steps: 5 train: - goal_steps: 300 + goal_steps: 800 high_level_steps: 200 policy_steps: 900 batch_size: 5 @@ -86,7 +83,8 @@ train: evaluation: fixed_noise_seed: 1 - cfg_betas: [0.0, 1.0, 2.0] + goal_flow_steps: 10 + cfg_betas: [0.0, 1.3, 1.7, 2.2] ablations: - full - no_metadata diff --git a/outputs/overfit/context_ablation.png b/outputs/overfit/context_ablation.png index 8d01cf110dd527d07d0bd2130d3c2a0f4ed86c99..d35268d10785b7491398e67c17c67ce7daec415a 100644 GIT binary patch literal 91355 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 ^o_TEIxG@oK97 zO4u;gG10ak9m5BNDVS2fO)^@A7N5xGRMpsrMzjJ4>3hK`J3?!iB2J@2TN^W}R?9y= z(-K==W8j`09CmU7gfk5ZscTa$G1q{o;NaG11Y2$mHaLw*y|d{)OS5(HP8t?55S>d% zzZvSsHJE;LzfP6Qcg4C#;3%b z#~tdaJ4knM?A?LAC8!GF`XD>kr6)mux**o5Jsy!_zkTy5H-s6U%$~ash#`j!3UQebQ zM_#}E`b5Jj_%`Mr>8pQzIB=I14y@}4Byn9Ete5KiSVLYP}rU5*~J@jE&bn_{_-m+@|ZJT0M9RhhJFT3k&9HUu)7tUb*^hZzrO9Y7_N5DrO~28HvTMp+Mj^`b&q=V z-W|vL4`R|R!CNJHy_|#lCn{iA{?BPI1jbahd(q5)`PNXg%+{}uRuHx%yXLYx!hg#8^%_^=+tjv*o6VViZH*SW4;V9( zB(oFhE4rB5wi`-#kDosBQ76;lCkg=ZkU}3<>xgtG%cgbl{yOaG-FP_xZ^y!o(zoqG)mWg7Hc01c-Gq(G4 z!Xv~VY;SkX?PAeBbr7O?S9>tiL2E%|&iBY8UzC22@9`mgp3tWrGEKI|E=b3skL0?A zxF>GlFyV9V+Ktage&m~&LDyp%%{}1;{JWxGu6_weHZ^*kiOz=OhsU}AkMj*?JeRAW zq+9Ai9`i;L;o}pkAvokvRUWYIhr|OMzYBEUk-qD#u!TcN?9KUxMJ(RoD5;6fna8jp zn44a&o;jKp$icFD7%qn}EeWH8d*rm}viQ&E_9!w}I}xa);qE#d!>bt};rR1<+kJkh5!>>wPq{Puk^M zkYgpQlfP6c65!f(@QqTi!%$Xt_r&J#_HVk5BL79 zut6fa%4n=x&ECwk&*HCIqIe^12aA*E1~I9JZf=qm+15&T1W5kQ`rH-H1UWV(Neit@ z4Vn|ba!Gz)Z^S4k5c$A7#~Ld4doX?#X^16_f$r`gdXHxU)RI?+R)QB3SEgEdN1W(G zNAB3goNV9O)pPA{XPSFDZT&oU`jwQ&mReiqJ#PJhyqQBkq!M zl}m6S6=ERMP^c?cRr5Vfa@CU^TI;W4oyJbDkb>zCTsRp%{a__EwB?x1;VigM@sn39 znhqkj+rRTQ>C%0M9*XceR}HMjRA;dF#QtVsk9$q7Qk#5c?CbZ_^oF1XTiCV z6WloNe>?CiC;!n6bRO5c#rMKGfnQ`+snY0M=b=E>|I{PU3S`ydh&@IW!Ufuc-8S6+_jxTAS?_YqJ?C&*wA379KJa(eH+|wlyuy zIrAFg2Ob0znby{ZPk7l0kl`*2GoGnf?Df}5U~7rvPwV@!1e%*LbW)K(>UQPE?}=0NH>6D`s7GZ0aYUXKVu?^T^JLELlDhUDhuv!n%dPS$ZvH2}3-(#`g zLGY^l9*2G*VjUIuS)V7e8;gR2=4H$n!aUB$od8*AKHWS`UGsRGZS>{Z^#P+rb|V^< zM_ACZSw(3h4S@|Pr%)^o(xy3JNs(%xSYkahI5Ri$Jh}s!|~BL zFmJ#-Vu?)sbYoxi)73VaX*&WpT?EW?HYrtE(gAKZmoD<#GUXPD8=60*#wt zV2oA@S|pg?wk1ms((*Uhkr}ulswH&;zRRCk?^HNO%97stf`Yy%CgoH!my`BLH?R5P z6`E;Ov~*g^Bad7k%IWt-?=23};#x0@!283le}~Y5;~uF{g&T;MFHc=-($kjIHP4wD zl+abq2^T`#&96wk+1PIxXJYjj4avtw=~SR1Jxu@IB&Hh~zU@e|nG@&RU+#+O(I4{2 zOAQ~4bw$kaGL?Lq+O0U6j7V}v=V%?xU}S3-$mTyU34)@e|L+p$!q+om{m?uKP^F6! zw8QJAm#RJ@Q_=pq>zUjS;of0yrG1Ej;VJHrX{W(3QU?DSdT3NNJDc-&LB(O( zYhZUQPtU7yjYuHKMK)y(c%oa}u)HJ9HuCxHY5W;_#m2TDr4XtnfCZ)jFjTbWJ>W}N z&OfUL<-7r6N|psBef1i6^sBB)M21ZRKYOAq61xE*>IDnkMz7B-`aF#D<*6(wbDsC! zS-pf|izj@B>zdEN>DBFovFRkD zXKCg`{DZ*>#sXrC-e`ZxQYlrktryaA*_X9uZRs|(PxoI67Nn8gS4E0T{1^P|ElM~< zq{vvTOnzp~ zA3cu^A{xNp8EW1F^>-Ih9`-NoA|;U|hc`{|4&it1GwKw7r^|sn!LD#kqSIug-SvM5 zrnoJ1O4hcoTU;1BcJCrYD+@WJcBl7&oO2gYms+|)NLvW2sSOl1=3YNepKrS;zg;TN zh{0wOGr~H!g3;&RE}8??>4NODso!jJ{#CFc(2^drn!$MMwzuYRk1baqORo}r(VRB+ z0|xDb$D>L`w5f%K;oj&=`W=()iG$IX@AVX801{e(l&@?mH{xnH=7){-ThSP8M4BL(bZGHo4no|IE+dB$Kmrj<_G557uEm|zEH%plb2u=R80V?=i z2>|=s^)5`c#&tfuMQf4(;Hs;Cq6?1GM|2Cy^R>7hK6&LmZLsA9n|Mdot^ZbCY?*%@+9=Jr-+257#Cl3ooTaDbD;HZ z8xff*Rw%HLjwf{+0#NT9hOYv?CMuTiKpq|MVnZP<0&3nh1RY0htj4pw9z}8Z%{;%7 zYjHAnAP{1jZy{CmHA&jLBTMw}FLYEeTIKr{72Z@9IS786kqER*BX!`jErG>OFnuz~ z`pd-fke6q|P2Qdvd72U|KO}QKW5Y++_lE=wZ+&v#^SLYlkxL6Ni_xv+mfXOfyv(eb zm$n?XDm8aJ?~oCX#eoWE9Z1+F-5IfF)H{33DfO1>yjJ$B4~Yi^tKK6i5UjR(%u#`z zCp0t^$-IG}Tf*{0Grl2t-UUFKJ*WS##=ZUew4Mv$^_p!Ycqqa`RHGLYFk4k5t8U$% zVEMl^|9@CivV&XlK87B_S9_)atfmlwA`^CuSd;rsRO~$<7WZnY7BZ;DTr*!@pIelX z05VXYeDjWDGqc0q#F<%|F~!1Vhy_}MZI4GQ>oQDZpq=GdwI_)6*^bpzpkAb?I(BSb zLcA#pSnRA_s%ZsNu=(j8Ko=Ecj9J6D$Kpu8Q=(z%Tn!YA9GLVNAAFy#hw?idV%agD z)e19K-%YHbB^-;q3k}=y@nHh0;Qi%lvvqPMVZp(-vh9nlp z%AHwaLq;l{a8@G$?Snkft0l%*p3eSb?{N0Kc zI#n5T3cM36y0qDXeH?a+(}bL2pgdl_?bVq~WW(E$z1aNSS>Vd;!hf1ufjx_-yAvqA z*wt4rz&Sry*08f#aHys{(7A5;Hqs1qtTtLkcM({x)>B5OWy159Po* zl~8F(VA7B=Z_d%=?J4DZ;t!_I!b;|yNNg)#pH^Dt(T{;QO`GpWw`BxXf zx4&lD5?#8>7+CfL(|W(-P5J9+6H6KX$u~@Y2Wz>NJ+7MUx)pkuLyg8{*I&@aPg3ra z#RGTzrR86%4-f$AV>1+a2N8%q5Mc18nqb5fTr;yn#bHs`Dh^k{Y zf3Dd#NI1__cU*XJjxEc(W;Z6qsJbl9XTR+!q!SJ@5L*}hwLixhQa`(=(r3(Q;Z^9R zcbFIQQE7(9?bPf7b6p!iJA=bRMTzCzeUSC^2$z$P`cV?C-_ZuECT^J<7q*H&b4_BT zCOxk&|KoGg5YF|@URQO8NcRsH+qq(7iPVZEcPHtp^}x#fA~XI>rtOZpYdao4M&ds< zA5!;x8N4r$Gm=;9*S9vdEMZCB!9B}I*c1>Iv%YU?0_aUUu)noGzX@h(pBDjn6(7-_ z9$0BV*rCWjQYtyo?XSDTy!q)gn7s*-lpUZLy9Q@QmoBq*qE0+RKhtIL23au(6F)+~ z8T#5TvJ#XNww1h>rk7zX)#+o7Q2p-@dQawLS?xG0U0U_S%#-XM%^LB==yjF-E8ho) zXfdXM0_Ksp)O*!XEQU6SSoA=PO^kZNwYx2j=|Hk>T&KK-40!;eFH9kv>a92!Vv=rT zSFLA790z*Fm$Uo{xoua<%c$l5m<4c>%KPSv9-8+jxsFR&)Iz^LcN&&Qp0e;xv2z&| zH2QZ|bd^2v>FbHx1Vt3!ApU3ms{|m)kOVZ5ztz zzAw;JGB+q}<+V&g3$Bjsx22~IjQ)8Yz5K#WB0c)ui(;L7+0oOo+IXSlPfH+q6p=Q7 zakdBT+Or!g8qQmR>XlK4%ungAC(}~et>UtQkfvdh4Wt1F8fzL4pg6Ln*_viRKOSLP zgK4qyN6!p@p&+Cs{E~Nk9;2BajN^oS$e~@#CjeQu7YD+<-^HaI{3bfu~ z+f*9|fF1cblXQ)$Qd`2$9T5H!Xat_d={oL~Lvve&OnURy$ZbkOzGYf)HpCg;g8G!W zG**ju+=BkHxWZ^8Vy&x9x+hZ3)xV?ON#ts)gG`Covwj(qga(yG27=GTA!+@nX>YgP zT%ptRJzMG{81(~pIK&x`Kr1q*_}QAxVL=5=pha`A2m9uK>Pp{&p|=T-ymm8C!cB_& zJVN%LQmOafSU6vV2Z)TL1BE%u+ka+P9XaU56QXPo*@P#8OMdBIgbi8Jh0H5bF%`15SR_ z@%1L8VPv4CX{>EQ+G&jjblvB&<1UOaKXFu?)b+Ki<$v;tJ*b~2VzvpAvUp3b#ND>A%Ty#MS|7y7yxD%u8 z=Wta|d8#v&@CVt$2X>>-B?jOI_`*fEfw;E7E=?O;m>a1mNN&E<&$Z)@w=wzd6dsM1 z*ELy%4*r%l2M|#~!(+hvNJL-|=T8%901{L{>q`o{92scAv4B>A%AuAs)YvDD(?UHc zkks59x7F=yY4W}ve?I*K;DvWFrZ@*_EF`)|9M`f@4Kzyw(ok=crM*WO&my=bEsW~@ zt9?PpI(HfmThRGZ)Y=xh3Un|`k+wE{yXT+@tD7L&r``&F*tJV~g(WQV;jBVfggkn0 zkA<#z3>Y~)i|=eA8fb`)U!vkF_;xPA6e+I-n@hQ&upr@1o{bUtDKECB#prKyp ze4Sjz;7x%mylQXnpAay7XvBxEQARv~U|Xi|w@3RI=8w*=l)li>Ww}6$KHJ{Ckgd%p z`wtJ-%%LT(PJ>EG)Q$CB^g(2fS1HTM|8+;aUjtBoLc==SM!bHsm|rSK<^4Qi*1kv? zW9@MH5UoMd^Ul@WJ$8~a_=vXj>$8pfxkLa8h~0d8Q2BLfwit{BU9fX!`%F#$oSvrCNFgL7%HJH&; zwf#$0f)u5^m)N_N1L)x=^k0RyhyrGKiTkZ%Uk!P;cX1}M-KN)G1_DdR3QW;>5S%(S zKe2!Ycyhu8f&Vgb9_>Pd(r44FuG5FK-={yn*q#o~;AwX-_h|F`?ldJ3pk`TU z)Q#KzpqtxU37u+;=F?F#y!|gfrc-*@_EuPn7z3ET+w|2{pY~S?mg;kVpD+SX3HYxp zLHEDgp8vPRADq(vgKv5D{iTWIz!r9<@)-m_`Yp6S!0lIq3GMc~;$shsYku-y^Z)(p z?LaRKR?^sdw)iP?wu$OR$T?ks+_5M?Csh{;L=W3QZg&86%kH$8gN>BO?0qQ6tm|)S zk41p_FXi4kUw4{E)(f+vfc%&zmVG|Rc@gSSr0U1GBXXOw=a6P;;Z2Je(CTs^9;fBJ z=WLYdhpGQ;4{j6flC^>7m1;|c)$P*a^%iz41uSAOey%vOx-YZ|Q;7TR<=(2D6QxB* za$ua8#{9?e#V}*}cAx?l=^Z={q~t%pe8nONrd>%81f-d`<9HTzTKdomk98c!Pj{v| z!?@sm8YEu@ih8Gfr`V*H24;9_P#{iDLje{8=Pl$b+@`K(GN=wTpAsmt;5W+s<_L}( zm6c#PhB?{yWQEa;*Xo%Rq#Er1vm^TyBmVC8QzI-hX67F+(yK8hC?Hfeo@)8M;7m-S zd7x~!=N@j;BxV>7e*haY7W9Xvbd_u{!}?{``*awb8i@52hm+Y|)1U*00f`jF)U7<{ zgNGaVeh*=FkYEXe$Xh(k2BT^0u;b&QVc?r*pp5zhVYlkb)4IV`U{`oV?)Q6|duX0I z1A)OZA`2lrrITRdJ!VOpUxC9>)3{rq4i2)qD#+;BY-b+S>_P%b!Dg;Dyn5m_@b6ZkzJV zcg6{sW$>RzSmdiH-x!1|Ntt!!RZqGC1AxMixf2&3b$M)}aS>voFY^%QFdD7~>qEmL zZNOC)CyvVh)dIi#O48&v$ktT})q=703f?|Z>qwi!eAa?V+Y~Y$W(O9+bz{oobVC9!0lfX%xp-7;aH<% zUcga@B?ELNnc8T{0Km}gFmGU=YPL8?!#zl(grU`Fm8%y!$UH@3){qj&frLh2(J2d< z!@R(Tw%JPHRi5bGsRBH=r{1)C;iCabD~nmicIV>a5qi;j{JD`k>L;gcMypC`I{F64 zmhG@?ALT*=Pfodv>;a^7?c4UA{fEo@5$M9_;`HV#@I;y>)YvJG{{p!TZ58dBt3Tnb z4AURFjjz|Qs)QL9-*ENgr-wNbzSYC}B+{m{iU$XQ3AFzmJ2Tu`k1B}>Qu(>=ZNHbMsC9&Nr*0PJ zD*%o~;T%m2>^8BIgJR@_41%*@_pK^hNr<>rM<)$oDd%68x@O zw>YRw30OYeX0PGTR4P6@y*_U$zMQ3UJmh3*z-GQL?1MHC#Frdz=)qWdRF6kS0~9*3 zS5-iG7wh!EuMlt8S_wZT<5Ln(6Z6F&R(U75nFA*0#>Z)S#1k~NMeK@8Fay0B*cP?< z0DLQ@tO0Ui&nFpTZR@!REhj=)Xhutsl6Gwcprw%@+Ou-bG-JdZ{R%&vt9Wz?9z0T{ zt1a3Kp;}9D1uSo-*wA#ia$q)2p(DedOQXY11h{60G`Gz)TOzip=1At)o$fA)sj^l< zRTm_%Rfmh&UVbCIw8t0WOeiDXa=i56ulH$#nfBt)dtHVqcy@=;>+I?*X7-I9xt@SN zu>!YC+KlHp5|DQh?z9JnxU15;!8{qBZuR}6JtWba{(psVCGP+VnL4s~>*v~VFKL7! z+yCQ5$r(xO0WM=MFWK{}(IU$^=#%uC^4n`s+uoo(oK0Zjt+p{{^nhoDm_L32P;eN} z^8c{+mQhu1Z@(~t=oZC55EVpBN>V_Plu$YrEL0j1r4}HaA}At=fOK~*BotV*h=sH? zk|G^TL`wQxlf6avGu~&s=Y7XB#`$pmeA(Nfthn!a&v{+Hy1uvO==Q58!TLF?!kF^u z%84i9JKXTAH(uQIq#S5{si^Nsx~t$*OF?YQE=}sLF-Mx3^rLl!G(BjKf`wEOZ=hRj zl@hZX{H(VLPSu6NF|0PN{L?{7BHVyl@Wb=t?-0i$!4{Pd&xQ)DS zE#!J?&-7t0;F#-QjLei@(WTLGCuO-ag%6Zi-7j6t_{qzJR}Ft;OaWXX=!cP~z~_o+ zl`7%fh9J{ocWl2|t%#e+=WDOT9D|rNzgxaF{v1ZNDzQ(uNiFl;SJ*L5Nc=Tw$3E)( zEg$es?-3QM0$hubc!}=pX>DkC7A&wn&>b|Q!>;d(G}7qg7(|T9v`IEtPf(c`8!dW& zAS!haRP;7|duz0)l23ibxWeSvdR6Fp7XK3pXXq5~j6TJzTqd`Vq+^4As_&4;vrjJ@ zeni&FC1^qENn8+c57xl4=3>U?VHr6e&m=fC2x;QaO@2yvfWwXn_J@diK7`{@?^8#& zW0nMY#A60`HL8qORbi$!r5|uEBsw(xZ4KUc`=phd*tmTy*@c!!{=d3T9YbT{F6uepV)W<_hNUZscK`U$rZ1=@{v z(-}3u1T3OTfUP?d$ut4IArHt)_FXThe%$qm<*z0o@keSnANieuOa340jp5F*!i*QMvlr52Z1j+Fe~C~cU($tG@XVQdV!A&n(oZ2 z&05-fV+Pgr+987IG>ta1ON%w0Rbf(YAZR&wLLp_7XbRm8 z3}%a_`9C_M*TU{^n8}qIqA?{3i^fOTqq>;6mf)eQhkdE6kmWHzW$)ymic-fE~a%~!Rlc%Z564pzSc*}t|3mQ@+6Vk)sAn2hKUga}s{iwb(L-q=LZ?ws&JNFXB z{O@W(VaHF>L@$4-!WndBT}u#}1D4z@DvXK;fwRjskx|N8DTA>x!Meg-JkMxRKOY{V z0+TgP8%kc?7Eoo@!C_jypBS%mTC$q!_mcf`YuJRJ&SKMca|$Nc;;T} z$81RD6t*m@Y}^}5@S3V9P?|ejpf!h7gPnHw8}1%_On~SxNVL)~Bztx$K=$OB^uk`d zs0#rYD?FF%+PStxjK!glwF0xx&97M2j7bZia%|}CSKF1{$1GdV=NQxH5^1Smq4@Wb zBB`dkBG4?(oO0+^!#pC@pc}r;=A}mY^&zc!(=wlZ0IP`_rCOQ8UFUnM*c%kmYM+y2 zW2LphO+~nA1nFyb$3U*f4~;P&6q|*`aL^uP&%q}kxMRH+;)!619(&H)p$z>{9WWjY zbH#I=aGG^DMA*#MUx+#><gWFq@uI{7r%V4~0&=jurEQNFj z&Y#uyX7A=%&u8@MwGJnO2V5_WX3c)3*fw8wG;`!;b20Ae3m_7Ag~naHn@IVy)x0r* zNY8WYF{LZ7dDhjO5PaYcP!M#J;tk^lk&kAF=PO#_D{8n@H^EuCahFx#0j8WU=XjFx z6P;zrt8jvzhtBTh@khuTO_`MbNvlRa2bZhsc$Y4)84Eo|kRo_WCv4=K%KJcuBms|mE5r-k z+OqmV9PUQn;vo|6^C2q@b@p#4fNzw)S?g*-`pqkV2|UJx1b=wtG;cze+XHR|fZ}7h zUnn<;SKM2hTJN~dd-mxxGU8WyiKkv))IYbvd=%f=e9E#uP z$!pgqyLWKy$KGQRYT=F_ZowZ^aZx{e&0LHzL>{*`=bps709fl{p9m1g-E3+*J^C!& z_nKpMAPd zk6t-J1gYJ3nOQoZ!0Y=`YuK=3>B}<21rQl=1Zf!i9Kq_1mn}dOB=3}_{*d)#6JcSz zr7GEw38T*#($-e+R-KQ6fUY|Spa<@Sqi$8e~+DXZ+lK@D;+q{Byc*Mphz#v8x5$evVwBNOdIezOl& zeHpu4F&UUMv#-habry%TCMvgHQo#*e@ja}s*_z_HU(xys5KGm`_WmNv>5kuuN53|w z9`HUOU2Ft8+S`!sbrt}v5um0N=LWvIFlW#jb0LMUh0U3fiK-*JHoU*Pu()5_eL0O% zTqEUGJc&d9wj+$!c#Kx{s;#oq^)K8c2#1oC0(RWYTi*wYFeth5(i1 zl<6|C9dvStC9-BHS1j+u2>R(34Z|xFK1x+x2Wgr-^mPw7qO{&~MFb7s;0XXXK%b%{ z%2*Rr>4kmvklnp>K=sMBZ-c6!uR<<_m1eYQOTk|RJFp)@D4CK}kADItE&|kko?7d` z6cIYWSd{C(>lVPx8_o$lcld!6@gB9@0>uK!-PNK2SZ?jHs%0mavhz za91io$h}ni-V8f;w-vtS!=Dp1AuRI=V>Ivo2(pgD|ch$_XPR+g`X!t7Ykq z{B>*2pW-hQ(vot3UW-x^S$enL3p>5T9-4oyJPG6H1JY-j0ERI{Nwa$ygp9HwBu?{) zEd&RF=A%iHww`Tx8o6|dKatZEbW{3hw+FNC-^%BClfVza7)OE-{H$&Iua_lZ@qoh# z;kygO?mHVgfNry3k{?$CKJr=)go0GUIw#s8ILTNd1N4=fF`KB>1t2v7s^loDGqRoC zV62F3P1w5F$&a72%;t|n10WzDE97`mhd-c-!MRQg&i;|77y7tRSB6`=_VSiYOTMux zLiUhY|Drz%c;5VBT-py`6P;;~uSo0uGbJ^P7;_H%+~7eS`q6V~o$v}90` z%~ci3eqM@U;>|b3v=4sAOo3>){jFl-UeF+&SDDOv52VIbH zSF?JGMdn@vY_vcZ7+>pql&=Px+>VYSQ2 z-o3F}25X=xuLoAVUR6nWGxy6f0!0C?NppC$2xRp^2?|mSpCfzdOZ-9;_fW8lSt{}E+90&r7uN4A0 z{0PK}=F?nl`WP*chw@J90LiR_?`F|GoWUyFCIg5=fxx}hA{@=(oYAMZmcX;n+5QkR zg)e}T)7Qi~z{=?JufFE3H7G+Yn+q(y1Z%uWhaLCh6a+%X=8J;lF#=S4pP~NP%o-ke zL}%u(A5wHp>wpY0tK}=Wq56a`rq#ddq74uqX4a6Uso91pUDzOop$8BW8ar8|5K6v- zvXc3`a&0j*vJoI}j(kK(7YWPj?Ddg?4xRHr>J;FH0G664*RFibkvQ5+0KB%n;j&GW z6zykQmfT&pfdIP=3-7Gk`f4f?>Op&UIqa#;TEYjslEx0onADNh7fQPsCHg5!f6>eVrfK=l*>tG#y$jKt2m&?wYFTVbaBQ@&Fj)^akYggWFTuO=XT; zZNp=6`x7nengD}9DG8CAo)fUj5}Xbe1g-$5D-XmR)pNN;)6WRqh1KC`(FlNHR-hvw zH41=}PT_!;-+vWOTB5ccG@<-sO?D>cCpNf}00JcVq=C8)G}Dh$XEJ|OC2$!5roF9D zFmm4OXeKGj+lvAW@QP5o9ryt8ZrbWi*jUA}rV)j`?}gDoRX4FLXAw%`s9 zTrF$j$Qcxd(`*FlQN{q-Q(H(!vS8FS?%2G6tUvuT=HRa8F3=C1k9wXW8zG$Y>Zq0Q zjVILHDP9$ZJyx)T(oIl9ZptGJVvd-G-BxF=YI@HCI_nhX3f+|1CY8GvOA_ z0TW&I4n@>1p*)VPS5`(Mr+dR7wxQI`CXV$Ubt}vM7UHYK8*W7}8sbDn@h^5H&3_EJ zJaWFpMILa6^PFYhJ-nI7r8iltM`~HYt)oxv9NC?L%zRhORtPcF3U_!J5x-kl1cPGs`0Q_nYTYMX!;yy9i zfk&*k)<=p=M36AtgoMD#xw`X>os-weSe_;UXJEH}GRI*#u}?!ghitLuvZ%7HG_W&e&K z7fouQdir))nUJT6RcCzaD!Q8#amf}>xquiTpl(OAIxzuh#esn@*Od*hk2h^I(BX0< z+Il9+@~Lo*Ss>9fkQ0QIM2lf93=6pS6b0?3xPVsEP6Tk13{G2~-($ zTPmSsZtyu_JV1lS4?3lv1Iki?Bb-if<{W&eqR3Z+j+#t7_3Q0X&aBbUn)T6Lsb(+i zxtY^uRe!;k3d_h6(Dl;r3H0HArC3VPh?gi0(r8a6-j|)-#q#qzWu`|HA^liv=sw9= zRe^k>)82Z~p@%Aot_l0idNwRN4o@x*3bZRD-;d_8q2m-WP!#TX6uBXTy*^_Fa@pxh zmp=>c?rweAs1UgUFtRx4m(Bz$)(N(XE0M;eUmHu@Zv?_90?$?dr-t|bs3 z-*9yj>1Sm|Vf(~0ty)q8q%8FYDe;oE_>d^p54=|j`c?ov#W{Sf8y_lli?(xom9HIH z%fd3b?}B>4@RO<%YW&h8kGl-Gx@up((QDd%t(=)4o<7Ol!oRG}HbSOlD?wNsSJaUR@2|Y7lTZ?P_v0jqwVW z311__g7}>*D|9}_C{<@9{)jP^nH7uy`lPR$w<-|trDi-_TBfQpq$`v1Nqkm|yj#>n z8**{>IdxZ51B#B56V`3Y7L7Hal*&2^y{0oA7bIAM7lYNMIKm z9#KYKt+|ViP}734Ox=oCD7hl0Djf=U!dJPu3yv03*qjn|u5oEhql79bjzbv(n(1}cXC1upIn;B^Lo>K% zOd3^iyqoy>3F)=0EOea3l>9f+t@??m)_J%cx+ z7g5d1D6yONO3JXZ33wsx`c8T7!EcB3Kco{O-Lb8jh!{?+24v~+fICIUV?}MP88*G` zg|<_jO-LBDYb53<7$qs~^A&*o;ydp0-Q9i(y8kFZ?|RfPFFC_Ti=(?#ug?qF@y=1C zC!R`8{=foMp5AfX?74|(8tXajt0mcb<{-9QacThg8l_a9_GHaMg=Wp!G^p^Ke^A= zyLR@JK~vB5M6ojrtv8i%^J=&@5E%sZK}lUluquNDp@VASCkTx-Lp7A?zaJJUx^pZ= zvh`WZi76DZP;+`|E3yxOLpJi9f%p&ten#z&@)`vo1vkz;JoYKQK(qQv`OmLUz)dXa z{;LTg;VDAeb7fZgf=mE)W1ti@8Qs+l^#KcH)yXur{=@+l2T5aD z)zbGjxkyRJ@Q#LxXZXg$paK@*?eFgY@zStOi>7#yFviqIH~+GkBlYAK!wD<@e{@34 zpTPtf{f)X7{3)z7JZEZX9~&*jxE<%|?l{I3*6-pzX&~VM!ftLTV9!I~@zUg7PzmMX zz|jMP9>5j?F6^exn>6JaY|6d3C(?yNCnSV zUpLeLi+@D3n0go16fqm9hbD;24g|_a@z}BxES`XZ4zRQl_lFWfnf$ ze8^2&8^LK3325_kj`B!i5O(UUKz{S?Y$dEBSan`pZh{`H4tDc{Gs^&yD?vVPSU5U8 zVn7ZDMK}v;aYvx8R>&<2RXGz(nvS#uhuol`%QZl5&x85>K}cQ+TRT$;+AB4=N91T! z@nuf1Ws4J*$^Onc-rU;X?xvMZ0Y_%#Ba0ORpj6?|kV&=rC|I8ypP|tC`hIXG9Dwd_ zA4V?^T2Gdlqh1;l;{so4l8uD%)R>P$f}^cS@JGh%c?A?9g)|sNzGe_`5c?Z!FT$(k zci_#f-Xud`(cR5=ybU7FZY{Y9mn&1`BM2n!JTwNkia|IiiUu|$w#{&P#{X9 z1DOgR9x1K2iYQk#K=}d!AI83|%7;-hMa^VaQZn!>cI%AThJ5qht_Hc}cJseYqU0`h zNEikU)Ks*ziBj4mT*(&o_0#W>!^ArCSj>lnP&-8$<-re6gLwT=LkwMQm#yhuCT+H4 z74iV_q~z;GmI;)%LES>wUN{X+x6ZY6y3a9}$|yq(%n9bJ0(v21ER zQ6ae&uE~%+085!>GX+v83W)>IF!}64D!^@)nwsVqZMuC@t^&>@ZtShm$~AG9o)i0LbUWu)ONSq4 zcBfL%Ya{QMrc6==AcMBfaT-kmdyk8lA+zhoJ)j)T3>!glMAVW%xq!F_i_nEhuC1CR zEJAPF<#WRGibjrj2&kMsTgnoDy1eJ{W5wdbcO5+28IOaCZv-|Ue$a|?!Q;$}3>{fk zJ|XRA))NBPv+f&#WMp%&Q{_{F3~oW~>Bx4qu2|(cr^hXJoXT87r3^$t0n~4-D<8&! zl%?9;I~t-@)>~iZD0>T?b#8dBuenex zQ2$nb zmkFS3?yN=llaft8a1sZ}u}yyP7IRVbL8Ob{}2xi6`F=`+!Q&7$r5~U3iXTlyEcZ8WSnk`VwBM=hR zQWjjp7a=?X0Z!!$^N`NcJqd2NPv&XuDG*%++V}Fc1TO~JTo;&0K`a;rT#D0ulL?uUd7cAr<{4?FPRaKz1pVDK5qhX)tCb0^q|lEAWd*!9dHp>Trl?{jn6W9B3r; z3pK4BSze=23Y~`AE^Gyc#- z8ewy?aFB>~O`P?lq7WhVq<^NYhitWx2;PFJUdItyY!?I8mOQs>ndrNhEt~pTnZeCFEX|JkR3*3W$OH9y3Zo&G0`lq9b%E^ z0gx0&K^G(N9!k_#yhGb&A@PE%l8C25(K|!~8uJWFeehA%LHe^X44Z0_%-U@T%oLh2 zavO$0Efm87Ge){>B(|7#QC&x(VNKVO<4)u}jz4ZWACqw)FFFy#^y!(uP3=;AyO)E; z$eeu}EhR~xy_nMn`#&ORq(H285RJ!Mu!wowA+zG}b7`_ZRV_vQfR`K|k2!3+R8Jf3 zD{akg2=(w6mn$Z!9Vo;K5{H8{GTvmO$5~C)7Gs6{#)T7X#n6PdywXMOy;-Ao{>+UC z(FiND-vVNXrX6w=*%;HzSJ&YgW-=NM$pJ2)%j7IpFheSa)d#XJOxVI&Zz@34B5oq{NPB0uUu_{uv#ogyK|cDkSWOF7B4z76KGdX?!n9dPL7^#0kTk;*$<1 za5#ts!ePgaf+f>c?2De)W)GyY2w{ z7XL`{ZZmKEpU3Tg&e;Fo>ifkW720&&%5x=7{4MF{!Nb~#04|05>##FONzvj7dWI%Q zqR?nKf;lRQJNMFaK@iIeV{l0KGIfOwxB#7y3Y$|Z&IG!!Qo*qb=6(hV`oeHlhmhY}R)NA%06#!5~vcSs@y(1fUK7 z2&|q1Ig{Q@v0QM!Z+mnD>v0oqj3Juy)AG}4VaoUrhn5jy!x4g3Bx+GKe*r>^@=e-m zdVn%Rj}kYIteN5W(lkop%>J)({3qXmYPt<7e5#gg*y=)-#?#`OTg}xillBuKDP30W zSO^4-(Y^CM%zbjoiF%!xx&|nsBcNPbg7D<2K@?EX=eFTG3qortVFEfaeo5}Lg)C0P z2%hXxc~A!_fTSmpLA06UcQ!#JYogi_8jj!}`;ty(q`ujJNLT@hf+;!($zr*d9gWi* zmAl*ug@&1)b=5KZhuV!mH4SU)0#2j=bxT*r!8IV9Vfx z*XMzIP*CZi@d3sY-63RY2}$z!iCIe{0dxarayt%Hy2Wrb)q^VFwuOCqZ#SeK;hqQz z_Z3670Y@rvw$}~zj)K{fP)jzVs-0gt129IYvW#96Tg$EXTvTJE9qp?8EAL;T5vikZ}^}u-Z~4kQzPmDM5m8v;HX%mTRvDq7kGAT(L3T z7Ap&hA;AZQ#x*uVftp)t=uJMjf#kl63!tssr2BV}3q`Lb1|S1EOB7AnU!8UG$YA54M->lPv}`7#xs7>zY~1(MzE&$K6^KF1*ioZCIa# z+-a0UURF2_kcSrhFT`VWqj;N<&Er}GJ5vUiXvBRd0~e^)_Y^B3!p#{ZW7ndRJApev zvuNTDc6BM#&^LI3HSP|)W^{36~^axVfQM6$tdk?nUX0NG2#20<^x z4RB>X_JWCFAp}im77r;8V^CG%f;h_`eL8TGhZiahwiA(m9IK7Y&;vJ+x>Fedj&w=) zR>aig%+n8C94wo9Su2l0T(XX76sZ98B?r&Z`YeRtJE(^;tl0V*>FSqVwPBj%!gb|> z5S^XL7F#=cbIh^H#JI4Lsfb^~^cjbSi1H1yU8S+BQcsRt0ED7}AfTEl=%rB&%Jdp^ zd!3{3Pt*!9NmnT80&gMFRCcjzYosFayV?P2Q%0Kci=@@hPI;B9+lEYQ$(pQ2Ppl3v>{0y8pXBwWBizOTS3xn2(XK2Tw=FV z0}4rV?geDi;yP3##n2~qvZlauRD8)#41w=t$FcO3kRhU8jWidfe$uB6SJZCMd_=oJ zVQt1^s)BeypyeH5jh{LiMi5qt74rT-&3;F8teC7xOW{>5c^<^nYrap#^I=2ZuQ(=Y zS8%4W%Ff~IX3kp3uzIMxvNj53+$6Q4wq+&x2%+2j{IhRiNT*a22Rm5A^>G11sL{4f+nd{m z?nc^{+<|5gy4L}2I$f@f`w_iFP&?2LX_PI{dZx!+=$c1<%5eL*6Kh*OyMS*!g5TS= zTBimrf^FQz!eh(!{^bg|HH@Gq8#qDX$T$;ubsWUlFNxn_I}1BGSPS|IB~30kK!Q?dH_Zfdk4!dEwXGfKdlO_d?Vih^ngleA?*@PsV>4*7G>Y{Lkp!Is z?~7&wERF!qbL1w}oEh#!p+Xj!5Cnl*u|35MOmj^?+|zj!XbUd+4sYI^8rQrk zzZc6rjDixcu>@E#D>vg{f3tsS7T2|g9IN973{9x9W>yOUr`dfk8~ke{!0@AFk{4|fCLv)|tqTe# z{6ECETc9~#S%E5#6XFN)nb|)$5P$CUfPp=2MXh{jWFbR#0?2!A0HOII7g1L&L=le< zgxi0%1Qa_syVXe1OeiH6__0>w{Mr!g6SN8BcCF=suUt@66+jgQwgQA zwf(zB1?C*?ti1{Ya_#eq97GUp5Cu0>c^m0!mxn>{#~)Av=C+{LuKmV4e^WZ_T8BeI zC7@n#swsmOitxS*0R->?jW?Z6_fg&*`0c_^4mJxZ;0Y@8O;A7A!8$Wp_||KR@+oFN z--&bVp07sFF&RDiVGYI0{vO9J6rvFd{9iE2&7k8>XUME!e>w`qvaC(qNNDrVwm!w~ zlU*FWsZU0lexxjAgM>&BWl?AHs|TmcjX+gF&>fl@s8YJJ&Mb1BvJ zsV{U7%Cic|n#CrKd$Af*4{cA%m9jp77%=P(pTFTM_ufK?YVq_=$ivg8;= zX6*9Uqkqe8yYZrde7@p8P*5b&;nbt&{@W|T<&Nvy{P1}UFh~++qsL1wnlhY4OltLG ze)Aq9By(F-h!b(eI9(iX_EtMAea2V!AJroxnGZ5V(-=F197<2T10ycO2SlUK7 z1=2lC!8c3j!UIEsg7dhuuD0nQ_cd_G=V7Qw?yUB}#vb4q)L*jXN_^N7l#m>W1~;Iq z#>Ge_W?}1v%P4OUaPT0t%H)6?py=!vSWhQAR-&OTL7=v=Q`jN?2V)g*LP8$i_ASRX z5Z?yHvcstfBy6pDT6T~)d-LjO-J6YvQEzvT|4whYWjQWvPu`LNA|DOXP|0- zad42FUb;o>z#smV^8CNyUH-4X@@FtKrsC}^A(Eb!hF73w*xzU=NONyg5Z%7W)s7Hb zSF0hfa*G+DJ+`vKqwu7$PuvOMY3fVz2Su+6yF+OK-3u;gc6A|n^1FK>570T zC_}j+Y?TMFAYLet_7-O&fF5o{1e#5+1+$GtpoO^rPlT_Nd{g!vz^QISJOeTqr$S=o z2;}Yaf$H>f;xJ-az~6MhMi_P^J|&?UNsqzju)ar9qs)Dr==RfXmE~uXyi~j@KHuaq z?7!_}^PB-m9SatFMW2qg-dLITrILk!wfC@Jil(BXOr#NsyCKIWh+6tg$902w5FkVX ztl7UZ4ZBYXl{9?dMzH?w+sxtZrv8QuV+#vVOnmN!#Il3D0hgfs9PcU4ivUjsM6ZKM z`lc(iUn9VGc^jQ;${vM|z-|@VuTegGJ0+Z&*OLPLgX!|0^E#_;Q$xGwN6C#b{TQVF0m)9f zxMbTzkd3k$x+|FQuHO?k3SXsgpb=bnRNFVbm|4DH7>z3iJg*L(eDUlw=u}2v$~PBe zS#Tkp%D~h11UHwDy2L*_p&b=kW z=^sEe@j+Od(p(ub$f8*^Q2FAhda@0`CECY@f=(g1_*Uo4sqro9=avyg9JRQ>Wz}3| zNNn>-j->d$h&({1p6pQN+2VGxm{kMwmB=^(`4suvo{Hzf5$pAQFG}ac;nL<;A=?Cn zhwWkwRI6V=85S^bkZtJt%^QvIGG;l5GenAxX(9k-F_g_V6&8$qmS0}qZ*+ypL|v16 zk6k)lr0pK6aRg47J`uM{k0VT4iY!|NGEbRh0^+7NJ@-}{FRB>wIzaVGz||mN0CG8r z+h^wxIsmk0JMx~`Wyk8l%{9pMhNj0*sfI0`S(9HM5_mGrdP~{}8gwXda{&$Y(2;B` z08uqGM;d}*jZ(DQw>nbxp9}{zPbA{{z$Op{iFx6mDkInCZ=NsZYnLWM=zLwAXn%vN z&HB=46d2yS?CzQfUI3XzX+4icpHOMz@UyE7FG4U03v#^Hrp7v~1(l`$Xf;6;BoKZw zg&P{654`YiFF!twP6SFT0N?U*-PO)bHqomlvhwIgTFb7yFBYXf)(y#gxjD|D2R+!E zBlaE1H$!gWb3ID8ZXYmr!O4%fWNqHugO!6~9r?|aJ)a~&B`^XIay|_cN;k3o{AgRE<-A+}%JSf~QJuVREIC6yU@lu0h@_w0|dgPMV z6WSE8=t;T5ZJq@bXFDNB)gg$w;U46p-wlpecPc@hz*Jv(H_}&R zPpW*xzgE^ChthjWdmTzZLX|6ke{cPCvkrjv00)7L?)MivpeG-K;X`2UqTPBd9w3oTpW|L>|AVmQrZhXZZm;TDn5!DNvY%6odDFO2!#0 zJN~eQba!tWo)IgBO;@fYcxmPvJ)@McA?>&4H~})uF9|gvFvFp9A{JDUHH4rR7ZHTI z*0RQ9(o+OnTt*G8SpBHuk#K;3X_>770LbhM3cQX&%(0PoJ6QLf<46yAQkGbNy#Z;Z z^W4MD7is>!gc;3O2V#-U_|YT0TC*JsWAob4sF8r?!_-0g_6Y(k4^6p62`n2F7rJIE z7gf&qya__MBn5TM7yB_0@*@-}(PFZ*D`PVN(d|3D9r4XV@DLCZQG+ys%2P4mmc4Kh zBip%Ng7f=4M63(iH$f{?KJZZ78$~M-Qsrupm{FQV+7YTNT)|WEFyO8nrd2)tNKf{r z&5YT$Sf`t$!CBQeyuQ8yPlh{`fJ;1VapSFe-HGf$2~H+1Hedn#u9> zwM|IE>j!l`0pg*vlgvb!U)fhcfV#A{?~CM#H_o8MCpZzA*e_cnGj@jHz}gp%4o z`cXD|&y!R}73r>DH)ReEn-Wjrps1VLIZ*n&Nrsjp5=n0@uC?_dSIC28Y1YC-?M66( z%nXCN)>s(TUNXs!`BBxa*gsM_i_dJvz3$y<}H%kJPW~im|tvp%!?_b=vRI zJyxBBDY?@@+&7*K^G8_UrtAjsCpiVRbStJo;Mp|Yt)KmAvW#2m&Txo?cu1Md8|UAJ zH@;CIS_-`C)Zw<95Ugy%G*)-wvlEIQ9|BM#YpjEY+ZzV#u21@Rfhe z%w*+Lr6qo>2!!UAPdBh)Q&$QEUw0p#v1(HcTAutIw4hIe@h;Q^qbPM4ur_uNyYvtW zv186zwh#ctRq1N-d9*@T{H{2Cfw4TRrx{eBGL}&zqnJ!#N6-WfzG6tjE3GKdsJzOz zXkBQsFBT&%+qjsnr(06{;>-2pC&b^;Zpj&V%3$8=+g&NqhBm|sc?~NFjEMxCJPHl$ zJ9HOtT|TIU3*1peemx>7l|Gp=uvDRgJclpGpY(A3QyV}iyK4>=sH^4{pksa?6b{{W z(Ci_^} z=8(9QLLHrciH(}L8~eN-7`9SfHST2BmwJ_?rMf3^Zy`n@TD3NmJ#VEu?88u9PBI0n z%2*O3ruC?D_gCd7gX;5#5&SV*iG9C$Y(5sPbF9a|c$CSTCl@T+=ho({(IG!%GX zjzX2szMg?820Tr!2;f+JdQ6bNk_h25KZKUYk~RlluDEgnu(}Aj#^)=4fCS__lDt-0 zk?q)%y9nb5Pd7QCM4dQQw|y`a0j45;>lsHm7#_p(KOxzuN);#rB|vPb&K)OiZt6%4 z3D`=vy(H$Wh|G(*I=RRh*!Gw(!Vmm}yg@=O}m`z1u}WQs=w@>pCbO<-9p?y!!d| z{-(@W7%81!(nhi5l%;Vf-6*Uryd`SzA0w>iKZBh>1v~WN!DY6j)un5Q!@Y5) z4PxX43;je3=qDjiHtX!nH4s+ZU(7I(o;^DcLM8+S5McTnWrmYf$R&L63;-kSc_wYF zh(p&*utKbX?P(1!hFNI#qM+E00(ED%>|w0tc<~zBjaG{9s1~y3&xn+wk%XG>Jlw?d z&_NWiFSbgVeq-A5gG?jKg+6lGP(V}iT`x~i>Iv+7KP@QWZ{3L4Y#F!gAS|^ z4mKT@rwTN;fbNMm2JTkUph-&=%9RUHZJh@VvaIr2lC81egC=@~SBNdobDX`63`co@ z0j@aI4`qYC4 z6Fq?WHJM4{V%@Mc9Q?8R@j9r*a5-xdG@f@&PK~a_w)Uu?EH@&F7f@qPb7KdZtkc`# zx<=3(0u-Emx6dPAiAd2F`U6@e!U}V_z=8MwPHzABJ&`h$S}Ub(DQW)^?6r(QrfBdz zMuA@9gJB`wLwc6QSdp`S&1UH10Zm+r?1_3N8iib7+l5;arFH{|!q`$`YZ?Ttcabl5 z`C&9Q2DCY7Dgca9IpU&P3xg!UAvKQ=1*tQ6~XME?oz5tp3hd;dh^qcKM&JdqGizeNj20`JzQ zE-fWD>&_A^4juBGe&Olg6Fo>)Q49>rOC^NFY7)1ND~$Y3S0*88zOYr;{I}`v0k=^j zv9bt4RE*6zk^qgE*(Dcnkl9LJ&M^2j3T?kTEl)I-gJ#!L`#5PBoSM?)fZ8hI{rAQHBAuS5@967>~TocBR^e+9dq^EubE>9YGQ>;QPm8x zTT!ODXJ=XDZSl$X9aKMMG+uR8oS5Y)_&rc4GARg5VIePx88$a{JH#{w)aGFd(&-d0 z51Y;2oQJg_e|+|LwN&3M)6uH7jYRS!C{Y(Kf%R;P>(=26&XZdTX|a;u$kqR_K>A9#%-T;u;y8TNnP<)2jxBdGs#k+-hJf7aMmD8Os%*4_jf<^KcE3mQ#%M+o3TK2#_o zLl~O8hycoW{=yKSdZXN_047%iuwe1Q8P{JVW*YpWc1fi7LLxyfB;3!!6sIVJjsa^C z4j5clHw`ObgzQs;N-(MgW;5%daKX*^JR(%eJUQhHk;VWA2tC^MYfS{4{44pZ9!xkx zbyb1eD3};fvgK{a|0{u;gpuK|WXvaUqTR}Y zx$}C^gwR+7n7^k1YViM&^^m;PcvvjhnbeV_eSmI%xyrQXboCh@O2nEymmNaaL`2g**!X^a*) zXcK{!#DmK)0zTHvVC!&uOv{>#31AJ0#zR!xbS>mWNKOg^T-rI2fg~DpjOAuK1493w zCYgHqvZ?Z@UEM{4VHtxYrQ8lUKX;Y*PP;bz*!ptDyWG_%@Hg^O%b`}t`wT%)uMO|5 zFWs3IQiVk--#)XoRNj%nzbpaFT^?9ABE1SUt&~M|cj8=c=b(`TrRRRVrkI8VV~7U@ z4ePB<%`3x2%Xr8Ifazc$pfx=Y=KmFY(2A?x^8NJ-Br;Of3iLoHR3R-`pIZ(%`gP)j z9GmHw1-7X{0ZJug2W7Qg1T5aqD=6_qHjD!o%Aswd0~-8NN`k+JqT8X3?7q5eL z&KLwUiQU*46k_GPp^e1Bz)Wnf4F>ZvD0JQ;k(gOeQ4^#=@Kvrs8df=o36;Kb%m4at z_o**4((FVjkYIb=RjLJP&SZV}hy@*y&~`+i2m}P+j{w+)EIz5=`5Ot8q^x1!YW$Om~Z_Q%*={D87 z(?xT>SmgWY9);=h^U>w@;^K^E6c2^vSU!nIiSG`>7;)k(Hjd@biCZwSCuwoujB6PT zgAXu@QN5HP+RwL6{#1wHWa zAcf+0=baeaLqHdF#6`*cd90AJ1pII+cYyr8?^UAf2TVJ%g{NM+E!FBipM)@dJ*dKd zPF$<-dH($Q!Tgjze~~wyltrQCd#8c_0F&s_uA@hfK3_R4^9JC2Zh%NLS!Ew8_#|GB zqYZ-wL=XJ2o#oCKUaj;_f4wTYd;mqauYTDnDrRCb;oW8P=ec+3Ga1W)bG_jFU}j@` zfX5d>;^|%RZhZkufRvNd@&Puyq+A7*uZK7*R(Tj;28_^b-FXMFAw8ep|HpyYRIMO# zKzAswQAEPgQ2;t25mWWniuHL;G`;NVo}}$zwVr?i_nY)zQ&oMSyEbu+OW`0ygSLBj z{_FD`{fh=OJK9*-^^Jy_n!d#;Ffj0Y%(P2YBoidYrw$Ta|8-GblVv~-0z=3A873wJ zaBf!F#{BE=?`tmn@fi;^Wjy(J6+pQf>gokjWObqSpM#KqMLsbxv477FXYGYr-E|(A zW|(lWB?bl!iI7DgmHF(4JXtf@)&GB5810Q5scLvtOee_mY`(&{m$fdyw6 zFQIq%&pLUi&N9mN(3e|gdM+N zPOk{5c?Vzp`>KnPWqkN>LZKmiYqENaY!5b2ST9RaLpc zyj!LY1^n`=b1!8KQ+79lk4P>F}TT_KaA?88MW5maQa6 z^#t1APX7R1>fH*d@wKKhOZgFL0# zwY9Y?rU!pt*BuYZ6c~gmN=P;F8cp9i0;ZI?6S!zP8d)#jeNUAMg-WJ=)3-J7}i>Pe3FLdRPU-C|d|y=J`+1+MAXM;HEVW%NjCx34|% zc^~5n!P|0=g7D45*o}%P{T()wgROa9(edoUd~lQbK$!rY7#Vc7Rj{#e15CZ%MZI-f z6N8$+mDmZ*E%3WsSKs~CcP+YT+W$E5jex=I_t)N$yWH03V&Ly)4BIb50y?nq}rx>F?b@wRkwo+&)KHN3(qCmq=2## zxpe8$bAsz`S`JAJhRVmsM_Eg&XK)xSC1W}DXSOcbrGyX_UDw-`8fBFt?3|$oYoAo9 z-1PQIXSyx2e^<)-_vNF{U0nC|{ahR6P6#$?VPZ}4@Yxo{G3YUW=Hm;c!q6Mbg;r)@ zB&2v*@<`>H+eRAm(er+yAGUj9_9Q7*is8%4kA;MU7~zEHBtP*|VzJovHDT?@$jD_= z>)%hm;^C&$oE&|%@ayXdg|$=!g;r~3Z0xJump^;O>-s;$B$~*oDS7j|#??K4!J2ZV z^!C@cUK z85^>XuYNFk?V6q(maS{;Xy7r{v(%|ymv5Y5Zm?Wj9EstTZ;`wzb~W?DV|CsASvvK2 zt7Sb+qDt2E+m}a8`;VI+?+{(z-jjD{aC+xGgMxrb+zyPxUX0&YF%vA`-so80Hs^k# z?T$c3yelkj8`(P1m*On1DPsHRHx3^%FDLshIMZcuZ7@rvu`=lF4fi(Ah6>ux?+x5- z8Maf3ie%p-XILB$w^S4fT^%0Kd7Ex2CvakZ>crY=Z*0#VrB7XVQgyusTJ)FsCcC&V z9eb7awEf<5XETXgj)ZZ+_oOUMkxE)ykEzl3{rW!X-SsJ&Pit|d!pizq zSmAj)Y^GtJD%Rxs9ZyzaPs~YQjpZKQgu^>-PiMc`IZ5g;U_<`1qh9zCrYURmVdYWT zwl;HdIny&;Xzh;{~>aVoxpMC#G5wv<#KCY-;f0=jk5*62t z#qp2j&PQ8$uhuzv%$v4|neCzW?l-in2lpsYshm-?*slKk-fp(lKWS@1%)Fx~5(tl$S=xuNN9>&h~;EI;6?sn`L zm2|b@m1AVv++?@T3mYxgBtPmaQU`0jhjojs`?#;kdQ&737&84mq+OS$(~t5q2)0&y zfjRC)bnQ30s!Cr7<}zaHhbSk)KbIY{j#9t;z@uI7M7x55gh4gk_m4cO=Ebye?XKrX zOh;Dmckj(dd@OG`_4NQWTZodePx(%s$NAzjiibT)_^vn?K#$b3DHW+${|Qq+?)N{2Hi~NdNN7ToqTxC zStMO{Uh#J=>1UVYPW{aVOf)ISR>C9~EV2%$A~u&l)JVe^61~d+$DL=y$x%09#Tz~G z0T&^)Rjf6&4z4%P?c}^EtuXZUetM&5#Rp;HD~8<0!g(=9TZSHD(B(aEFBgz)bpR4P z6VcSvWTK-<{-GC=85{Qa=>2>sEzD=X2Kdi^%awzNkzS(d=)?vehbArH@Qh91;WvRL zdMIPOx4p+wGl{;<{DBX$Va?Vnl>G+S;a3G(6|WE1`W(naZXt{(p#jOd1A#M_9qolU zM^Xd7SWG(ZYuv*V+HM<=ExZLq()+eJ5R*tsZ<9a@jwK#oj2boyRUf%5&CxP-s)d^0Q=&&gTT?SLuO~gbt}1Ng2d{`l;Msh%1Ir z5Ese-d36=7z(kRxh#Livi6TBzUviXJ_Uh4wL(vSUGlOvn95@*0I(Q-ArKThwbvES} z)_x#*Hr!~$_aY|%=dUvXqF;GdnkWg}F*LW&&U*U4zdd=>KMkgZp5h|>P%9d2{tTn9 z2zm-9Ykkk`!1>PUsKY2({*(WUCV-Q@nuUQ_*6(H{&v9|WAf%~PkS3-9hw7tae)TX? z5$W2hc6@4Lhovm2_H0GzTN()bqq)nw<~_X+TH-EsOB-!L!>HxOYx~C)Q-A_ogE*uc zh@4k#WY-;iLCLuRb;Tgd)NfK}v7B6MuYUDj@3Qp@XQgm8XmCozP^vFLC4{-1GgSvM|=$sQt+#f2eu6IK>; zRizVl>hS6KdTDuUItaaGfph^J1@@!tesllKNj+?C0)FqQhOnMV1`23Gsy#6f&t)Zm zT8Tja@rqawZlP;ImpZdEP$h^^?_}Acj%s?1Yp4uOK{bUy}jf@s^-S4;BNp>FfORAq=#_(q}?502+GsOK5&!hI(%BeJ}8wby7IMf*AB+WbB)k9zb}I;Q;JPzVW3;9^IvzP z8zqTGOmvh9m9|ohK;A7CxQ%-G* z)K445%GFKwMYyx-tpTj-+I$sk(D)si{V62wu+J09!e!(-T;F%ZrFDyD52~I|63;#b zZ)Cu-iXA=wiAtP;gKTK!{um`aq!}7Gsuw$ouH?nAjZT}BwNUq(Uxht-mS9x5jo>90 z5{$wyO*Yu;rFq}wRby7`_{arPK^FthRZN%JDWQ@W${l&mM%ZSRuGidHs@%dBxwrC= z%MUSaFAtaT4ma)X%`1?k}c`>tZ2%m|=%Ze}$mZ<5$C*Puh`lGYJ zOS%e*QH^Dngj@m8hnlFB#5($~iBv1t0BKKqkKg$2wj>MQ&P9t6yIkVsuOBmZSGiVL5M1_A{L$ia!!RL}knd7Q z*N4oO=fnK`yw;MJm)A=dy+kPrsfUCBI8uSycZ+hjUfQ+jXIbTIlRypFl_G{`QCo&0 z=FxA?yA>5naom?2Q#NYOXH4Ipl+nN!H+mpy6tsa(AHeg|qbKri=@nzkYbKQO9qgGx zr_)@3vBjig`hpLu|DKCdEV+ioL|^p$5&lx$XUw0G6$NCIFPS)pD5eJCB;U3}r{;IG zU-_4he<~%j!V{IQL&0%Xs#yE%lQ|8aJQ<-|zu!;m7rY?l*%|y%QoOv_DR+Z5&}wrb zsxO0-CiIAG=}%^>K#L1G?PtHaY~OJX5Lt$7Z9yC4lXQy^`SzjRLzD1$oO>8Gwi)*a zZFFo6H0B9F&)cwc5pHw8>p`S{H(vr1&fLdAmEI1EkEz0Mic*arXF$l7CEvu_I!>G6@#x1Q&7 zz3f`^ewwvv7TIwb>q|{{pDK!|%VGEhq#)bYQ{nFT`IvP;!n|u8W?qkaRQ?_Nsr?!; z7P(9kjO6(aevSY`6RCC>1-%kA9G7~K=?!s=8aztXm22&D#*v1S>BW-}w$PCOC(v00 z{gb2r6$`&y4P~#*q5b@9OCt(d%xHu*AwqHTSMs73wH{=)i@G{8=XLi8TO zj!r}V_MGYI>C=S+g#JcvgemXjh)Ksoc61V^+;qxgGRQmfJjKY7z3-NW89EEljvbPo z$vy9M^71@R%h)*QM!~Xsb!?siJ^*&scKPb+5lPn=I#X}(1sYI5Muuv83(Lp613Fx5 zE-WRn>$wH>ENs47>J9kGcPFhEUIYsApx_c|bG;Dy&1P1n1Bs6IAZ)4f2G_x8Dkpvr z5Z6TbT5N_2zX5)#VXMDtC8(q-QA_wiq1RPpmXF2i+QhNVb|n3piDx^MMyxxHP>uU- zz*-q^B0-LW#)o`z>l=Zre-?^rQvNZUnqF|hw>8XcsF@zQA7<8s*tK|4(h=&3Ma^7= zoAv|87-3F+Q!?G}aBXWN+otw@ifS8utVmwl)6rBmAu3TD6p8@FwjuteUtkFqoFZ_h zA5}6_<~2QWwi`ZWuZ4BLhY|#4@kv4&D)nGQ$A;Q$_@VSP(4T0sz3~;&l+CObi(O-mX?IMg z0YQpp9__vIU`h^^7;gK40KupEPvJ5o<3Va1SHC?@mxF%(l$~E()JcV;VH=2wLP0t? z9Mt7zt_C24WE`#{+J{?oQlI~f5Pq*Hu+da)O>bI-M$;1~6~CGso!roEqpVW)4rvN| zqPObIVP8gks7^Ua?3}du$FhvXe3?+0GpHHk%Ddt5t8$(>3-Na}8Wy$v=NMB`V&&t} zUntoV3f4xUxRzCGejE%e7W{OS(3yQW>#dj-vyqw|#g;N_wM%Cg7(+^)EoNvfX5jh7 zMW=#*?b;iP5Pl>oauO(fDA{`vv2+n3{Gn-eM*a)wH{_{%t_J68qsJGPXQ=ePcch+2 zgxHI6{R@+|{hKR%_6x58`I`oa^2$K%15(t=pS0~=>ka$XO_W5Gm9N35GIql^T{(?r zc{uRl4`=1eEc?duW0iY4@$4T4dDpmDo)TwJJm?U4J!36YYsk%&{zlr)HAZ1li8RwH^GZEG*`wP#|(6(PVD7h|*} zy_TA41}Y~zJ<|~`I9;^Pc$^?vTbIy5lhabo+>R1wtw7sF^Pl2W~0%;tn zD5PR+<&0lyiICWUmb0)i5E^qMiNYLm#8Hs^-GKSM6N_T_r*1OU5L5g`Aw_$3)+!ZA zlVML07h?q{By()4K9u`*uFMBL5Yd$PZ48B|y_`|zZcE24F(2CiFr1{b&+lh1_gR#JW z(ulrA&Xf;{k1^q^l37Hvox+Alg+W+3AJhVrjGIVv8?cO7?V;k*YfOQWCy5FJ94c1i zbwsJW9qAx7B^4jnB{(kG&Y~U+LDMVhIY?Hg=O^FMtHqk)?W}*{$EYnZ7{B1k8v!*U zGF_yK$AwBcTjXOu-cP?o2$dGC`k*k#4aC^ID&N>>K!DTk;V&1t(ZLv2thEMiL2g=I zcY0rwUcSKUZ<&QD7hq2LKLD^N8Dn56ca)CR96n0_eIkU@id7PO!YYxT>lir<_qo!8 zCh>=A{dZl-W2=9pd~Y*2{W6oOR!ao`h3*jCEoon0_-W}rAqYg@wNFSP<&En>5Gx~> zcE{Vhfau!_fe!O9jkU-Ly1_dRU7 zASu{Y{T4BLWw>UB2aZkrEs=@F|%_p8&X98JcvLCbBox<59ek?#EQb-d#HlBZRbI14sKAQ^W>nWxiL zl>7oZjB<>Z7%nkl>JkdPa05xwIy;GFBAD!nwn?b=?13DtYXGNr(J)E2A@nPTnMl6j z;U0u{!>|BjKT2YIIa%i)w_TcWC{=Np--^oE)Mh3pX@KODGa@)g`o8+W{>Yy{C0IQ4 zbr@7^37o3GsNtDy3DMK2u|5;(Y;F=EMtfIDG>j$;d{nvLqgs>UKLB*bRr~rWf>@3n z&vqp6n>+P}55opnuM5OKvK$a92N;q|!aPQ$T0To7VZ`$nsKRYs|7U0L_|sGlfzdTz zti1C2%MO)}Q~3{u)ah}Aq8QguIysL$=oHs1!c;u)HW8)4W*Ua`D%~)TYlcKRo(&*|dA)lzxUD>&2=xW5jRu8~U~M0?g8b^UU)fQnnRNtw*s2kVZdxAl zp}__NsN7WdawJolwG!2(h|Ck{rMQ8*GGY98pBU#yQbN+d7ioz`)I8Oh3?naRvg0Mu zi;D9z%xy~Qry>r;2nKC&#>|=`lEo5P!>NS7Pk20hp71gHhV(~*sNHTrK|IyQ<7-FX z8TxKj!!nm^D%^FQ*&&_fX0cOsWqvv89C!)3VWNUG_;_#=L$g4LGm`6#nepAv2E5(z zbr+*#6Wt#KB|#uH&4{ZgTLGn6W~Ks4@LgnSqpiaa5lq&tPjv89~wU4c^iFQpGv zcLhhqXN%m}9MD>e_k@$}4>k$7Al<&Pa+M=W{i$dviyQhF%%>tdeVU3jj%>HHK}u#H zhEw5V1C%055#f5w*f+q(T_~?X7_j0`~rZd~72ucF$d;+*&%33l=Kfti14i@+u_LRxTJ3^73@6D$3P`OsJOfMK+Vm$ z-MUoM>F`SGNxt{0?27Keu`5YPC|a%~Km?M#r^?oY_2$vZ(1B$N7dc zc+t5vIAV3$>npF8kO>B~-CK-}AUHq#+FeatB|BlAK0%M(as)sAh1X>J$_^4Nuuvh= zP?7kdoitg1SR3qGmSjD_(Ev@Q9WI_oo?%R*cE^x8B}n)a2H2fU5FN^{x@#kdXXiAr zHM7n8ZfL*PYRQ+VZQzHGKo*)JzncM3!t2G;S4t=+^fE;JweBwS~bGI(( z3f_dmh0)e^!JXZ4n7HE6gA|9Sb4X#p@Ba{4goEr!gMI*AwS+oZOKcz z63n$*@}{?P@}~gWk`VhDHE6`|GtCK5!?h&(8ni)zSgiC1{)c)mQn3V1H2VY6pS+@Nn>)K}r-0Qtd@blt}-z=;vr@tSkA%JF3%TDUPRR`h1JjahuJGide!7`Qp$` zo5p|vi!s@(3$YvBZw^>wWT;M6qmB-FQuydqF$DS z4b`k6(*5i(`OHI!R|9{v(K#e~O0sl6ytqX#&}Nio?khpC&}WUVNB+uG)7MB09(=SS ziPHYEIsmLF5bQDoGCOH$p3wWleo%(;Yg3SE|4M_uqtH^*;3JHSVsq-^|b5R(_xdfSv_q)O4}4G}ipCnO4*OM^95k4-2_(p(;MF zx86l6Msj{ORFG$uvbtCm_NP}cp-cZz0gr3rMU|M2kf2;PIyVQqM&l2BA^Z?=sh6~1 zl)dyFtZ$-{EUPQZ^-1e|9yF0eKK9^w)7AjvnRw=uL~ko*aUYzLJdVF#Esj(<#W$8f z-~wrDh|npW0{X?9W(Nd|X3XmwdK zf;INDZG?rMFOF}J-dlLUb>)9R91Q+Kndf;o2N)e{VQBMrndN;6*BB{h%gI-~3ZF?r zf|JTME_VsPM;#vvCTJqhI1!YBY`B>NjPOm^VN^#&QDy#%k79RHJy`>>1PMtKLSo>MnjpN{`DRDyeuJb z9;txiJM|Cn#lSoJw0V^cOgSWwnSnVU)>jF6Vhpf`lbZpi@K_NE0jrmD>ZtYTOSTR5 zu81JG#Im*SU2#)wU)~Lz>*-c(5%n9gHnM~mp2fTSBZ6<2UOI=h=fj+*jTK?*nZi5l z$)-C<@Qf zNdLvs1Ym5xO|}OyBw|;iQhEr|M#t3^-cT?yPw(`Bvx}8r?C^DRe3w@MqATHdv_o5) z$LmZ_+tX-pHYDc)zFfDsuzdP)HiB`1;VT{1JE~`w5c}wA9yc)p`{382cptxPSYEb9 zz*h@iSr*0v-;ob?hiDjHU&BBc9cvziGS_Yz6j8j=z>{ls+3f_wFr|hvk>ijBb)W6K z7Ll;<`L@QLPd~%Huq)M-GuK?`sr|uzIlW2ONY|~@VQmo#{JeOlwBU;W&xJ~rD_F0y zxq&eCqa8rRSD94Sm|1pmw%rF~>G?--`WV~~kPY+O+<#4dZHrWKEVT+Pwl@0j9Vxl@pA(PCKBJ7=STT>9TQ63{@Omr zwSAd8z&A-YqQm^tE%Xqnu4pT~MDkWGO^XGu!jYe+74-wpmI4BOmLhc@{5@5V<5vJ( z&EHStm%z?Zo?HBz>?v{XQnOxre=g^l*iFunkEK9A3s(iJ%lu7*^D|h~5t;TtI|env z{gh)G(;PJqgtphYP!=X|%zT%%kWU7$+sDn!KZL7EUp0Q- zQfUy4m>WtNrkrG@b#}O(IfWD}flrl&zJ+Udy!i@nk-xVJB|4|+~tQ*GDx#1u>N^V03Zd~_7TX!8F`u+)5Z#!R zdk8_>O@UiG%LJV1&eM^o)ZP0mzVsbrl=i`uUqhpW1X1M0Nd@4z`&gSmQ#tW6HGc?; zyWdZ>yE$AY;%Vx^Ru_9r$Vpe`hGnLvuW>8RJ?ZbeV2W6RIo-c>#8tiSG-&tv`Ek&|0J4buYOw zC-G?4G@FuS4mpLINe1Ew5v;ON6IlrT!H9E@>>DglyASz+p}UD=?QF?~NmXgLa(t@3 zEV#P@preK^OLqipA&L73;iun%cQ26Ul!u`}*|;r)YV1t>$!%w%>9C&*c$%@%#d6l?4X%%%GUv>@=^{41xV)mw?eR)=-lFoJ^(%rnqdK>XFfFe zv}>g6z?{(&<4L2bF$lZiQ*n*Z*I98bZ zSz!<~zrDP0;*AEn=B~aO5Kilc&%Er8r#2TJ*o_wyrwKd`w8h6am_doa?L8Q9rff_! zKPwkgQWyKEGXJ$``b?>;36ew-C?76J2P|Ud5I-7kKw6FwSLevw9o&4LSX z5u7wuUeli#kQIj0fRu^mr)RhVh=O6tVo`#KrFbY|N!cj8^oY(XZ2GIqum(1$nn50_4`U(jubq+cQ1^|3KH= zd!Y@0N*9%z6hLSb|56W4q~tgqf#~DQLWQ~l@+X*_DYh)D9!v@lfXk~zEkRB9I61=? zescvxyAB@r2bGjQNM^NgfwfTQ*QzKnWTPJJQ3?+|cYAIR)y7fPZjvDhC4`XVEYkDV zJv2zTS$+>!$iIm7!%+S-uuK1r!iR4^%euprgSF1@;%kOZxr!U97sLcuu^`*pS7E4p z&u3T07)+?SFX*p$DMe%CKztKf=3a3Boi{4v$dFK1*DSH>uMMk+kw~CoenM}_->4N| zxc~{_GF`6nRVEBJw|>4x_SgY)`y)SWo0kntg`m*tyfvWS^}}=-ffia6&_LB$enc&2 z>a0!*ENXqS?sN$gI3WA|&ak~>f-IXx=Z(Q!AMMrjkIo-r6(7;|&y}Rkh(`W>) z6&M`-vIeqiVc|$tpH9d7AhjMm+3#FV9Z2CO4p(3C8=_1%V#ojN0PLYmz35P`Iq&6! zSBaaIut_Rt1`^C{Ni$dMxKyN9?+7kiSGXJ{yJgx9SQu`iud_} z%A5-<(6J*=kD7@B{zW)+6g9@*<+@_{gKr=SKyW-#e^ zZ|j#I+Sg;uHyQZCMjZC7)-BDptPM`?GdaM$`8~@Cke-eB@K58iFy7}>>em^$lum1q{2{08O$Eh);+vEB%{8l z_-aTnQR}0mg!H$7Ht~PM;Dshja{@)VI#VR}q_bDK7_+)x+D!DomXMoc(V5$mSP4a9 zzvxDdKGh@-0xIhCT1@aKso?Dn$kgtfs4|Ot_u*(5s`YfB+wMTNwRT_F?7jG{cFvc z)op~yu@_DF`M%@nqAcYOc%P5nD2(2Zo1iqkxOq0FR!XgnrfS`C_;Mule z|2J1rLy6Px@#b~8O7ve$>1%<+zaIwCCo~SPy8VNmADK5Qry~S$rV-JIVdbs<8i>*C z>%;2>HK3hS2m7|lHG!g<>H`Tn9Q)xS+|MUm=tq`1Q@6jVEEPqQlQ=2Nw|zQ|)FcZJ z$}A{xj@ayP_^Pc@R8yw~7)kW6^*(XE;bwSoob_t5vEYvBEgiusl`pciHo@{ldt(h$5 z+^PsJ#9T6AM>*cj1)8SUJp^5UC(wXXwz6Z#o(s*^M!H+~Az#U6;ULpEe?vHiQP+q} z*=O#1?mzLiCBRENMcy7i!(qK!FjM@Iw)^oieQkFwBGxWl1%n9Qp5)2wR8iNv))qy)j+MHrEn#BD(@&JiKOza6i!Xg3Tt0D3(=pa^fwWHqdWw&|dV7RcjXCTC4 z%aEjT_ultR)4?ccELP1&W4xh+H1O12M8R2vJH)b#H!%M^g!zarlLg9(5=YJN;DmKJ z!R8P4y*tMcJYa_auv{Q zLC*C9YYSWrVl6jWss4I}1kLF7&EGB=pno4*$jjm>V@aSWC>%0KiF`ze7o;HdfyuEX z`^%msygUj!jV%U5td>o@5Vn|wDa1tw2mP-M*!h>!Fx!AcsPYaLsDMqRsq$FoH`a#2 zd6jNAQ8|s4<}ZfzJ7018@hz$64;}5AK?%j=F1>D{a-wSEwJvD^+RhlED$V*@w;>fU4CjEGfz#`nAm{30?OVb-jryEzXcG5aqJ9mk5M#>%4~jewAY`1BrS zbRXApG;3!%oKo_EhH4a%vJNi@tVtez6WLqV+J=~fcse!yL0BC>DXOBM>;4p;O0R$1 z4#Kk|4xH#DoX6UIU)rA>XuyzR*)1c*nA~VUN0SHHe^dI&d9jwT&^_@vdLISWX|m;I zqau?Fl?dT4y=uTekc$AyB*Y?*x}+P(jrmCM5NI7iwFb2kzPkVJ!+d?U7b1fofAuOg z#%m-!QUT6JDz!oLKKYP|lPV`4$3}&vi@9lkZdx=)Rt$Z0{S!FSmTk6MaDY!^Q1S@H zm~T<7@QAv;+7BeUsO2OK3QCIhGa6mZVp2I z-+_{oIjpb9w2!uAUQ>$e5@pGbSKItM7IIzf5rVZF{RY40)&Nry_8WGNbS;d3Opmu# z2DeAopd5aoqu#GxPOc5NpBl{CBNNx1-84ZeL>UOBEi1J1z-kIO55(p$TsBq9)(j1I z^-+r~Dx}QsYc@e<_WVr-$Z?BM|GgIxWDzU-6$~D5wD$K@=O@i}V+WW1(#4UI@kW@9 z!95+D2vt1~6h9BtL!01Wu(s;`rH5*HjoVueCypbNqb`$S&g3c?Vo(oLf|8DjA|oZ9 z8Omv5CerlAW=i#tl(44pesms+JuoR8K7|7&Pw^GkbpcWG8t6K8vYe=o+Eab74dhlG zvr$?mUL(CoZtD^0IIv1g7;3J8Tl<-a&GBvsO{QLaEGzn#6}MQbaiwknOa=7Pr8ty| zS~^w6XhP~_ycv#yb~rNzT&p<0UJ^*plfW*btGFC`UxRbBuHqy505bxTgMf%d-Mr16@rz&CKGn9{R zXW8lH05TTEAIzl!E0g;@BRKk2Q#oeau}YJE4B%@3cOMFV7kuN)u#E_KC!{`JlA*A_ zUp=;B1JUP?I?K2(oyvziix;RdsZ{9-f&uReYk{=rF|6{>qV7$HO0uvkJI6nRZgL^4 z3Pi(2o2<%~fMjEB-EZ*rs3`zRHdt=wr5;;r!4md==1oEJ z#WGg)L9T&b5R-a!I{3(@j6evApwWW3<@W1xqC#YJkH5jccvxedam23X4BhKdY0nSB zF;=X!#9y-7_S6a77V^?`jnuRZ#LB-<0)m~kHl#_UhOlHu-3qT>lY8FD)yH!Aa#2S{ z2m9Uo9|iQ*$V;rS_XJ~HiZ}3XYk4C0W>5n^jMf4L^ZT&SQlCZd1%(dvKi{CC%NZc3 z+_)DVG2zozw$j@%pEjV1QU*dOALX>KFde@_tRI0Cfr*>M>xVrU(Yv7pH+|PD4n`2< zyc_)r9gG%%`qZdG*%;$06J9d1tY0NH!IqRSVNM7|uP;2g>_l#!$59;LzgPg>RJKtW ziY8sJ7|L`MJZ(1-QBFiADS4&Mv&|3zOue%TPjq7{$Jbkmdq!izq==F&=%TC<6WI#f zsI~!S1f{zbEwix-o;;VmlW8hI-e?(h2k7;e=K89EFi~|7q-aqGe$CIecHiY>#%aEY z!WvP~L5Yq^$SAPcyYcT-p~jLORyO1ZossYbH%uW3<-j|RPQLZ>D)1+@k5lszi{B0O zfSs^kjuBXg!*>>@Z+}T> z?e^2UR-q~BOw2~Jmi6!TYsaGBF%~l%h30N|zI?8%_tZW8ltUS&vg^|G^#S`7%AnRL z<({_cv!z6HHP({%As;cWoByQCH1g6P_>p${=m1Bf~9O>YSz%9Bgvg-87L!XmAhmX8=@Kle@g* z!Br#PX&kunbK`OPw(j9YC+)a`^cLsb-#sB;dl(x?;~5cbh7E$a&LDH4XN_!7+pOO1 zkO6t$Xe>c_+PD7g2ilirvw`x~j&W8M;A-@?V@w#utDycHFZNsn_(u7C1))1fKro@f zozigy@J?$>RbaDRJKSCTq)MzoJQ&rgg(^FX7jw8Dl#lN$%4YkdLtf2;zht5*HsG-x zg(z>(VH|g?Sxyio`J|VN#9v+)QWa6u1+sdfLD|+?)au z_~SRkaTX&ukyncge7o$D;Wk+h9aHKG;MVu~_10JWkdF_~{Pc$+Mc@6w2=t=0s{dmT z5Tt65cC;FO4tQLRj(ZIMp9P2445r+WC2~pM2Ne=N#3S?wKru$O+k|9xJ1%Nl?6e)^ zLX5PB-!~vtDBA<*!l9q;F6u^uLjMsD{(B{!8LhDS(zdBHdb_A{Zu&NMTQjWhdeTM- z#|W_^^*_!AGq)F%eg>+wPGp-;#aKBl=;FIk=!&RwcsuS>?rymV26UJD(F(La%e3CU zgLbFY?>^T*otO;6wGA&kdiSRSy|;GYk#QCdajCL|{+;Z&3kRc!bOq*woO zu!qg_l0jFIWj4XhwjFl56?wyjXt#18;x3QcoVWH$*Rl`Q?(F*3lHF2E2**Sr!t-m- zt4Bh57^0f;K+W~ea^moMVQb~6{Dhcf9r2l-jEKe`BlCcS1L3&c@61*jNW+($T@- zocVjoH8!H^mEq*H;)cM2#fDGbliUGKd~nTCCPeBMVFs{5P5C(x=vBPtc_YeCoJeY7 zkRp_K_SDCvW}$a0SGOlSaj|ODI@GTv(_Tgc#O7{=KnZfLS?%4S%F>OWaB{^a+2DB>?`p!qA8W2u5p+K1MlvOEjdI?8!fZ1+FZ}kPxDN4Y zzjWThApD~odzOs)XZw*T3wTCswU|10A!@orobVI>-1Hj!GQs4rb0>d7Nh|x(VY{I- zD)|Q2q0@=-ZBYQ*ir(WY9pSM#^=l_&1*$%H#FXuFJ`ku>VaW9Y_#qZ^`M2_wOsucU zi2C0B`3#0gt@5NDXoH7@5neKl)bXRDDGZdP^E+`y-&PTLEk!h`ZTTt5+{zg`MM+2v z-u1bo2a}=)+nurSA44g^9IND9j`-ty6S-Ey1Q{Y{cXN%e`M*OY8Q7VYL+QOHx$YbCs4E&P449Z%jKL5N7*cW`(#X;zzeUR#iAjisaowT)D8He4Z8*hlJX zSbhs>ht85nqrXNy5F*!fd4H%6XfTG8*=?@`8?tZmT{hu>wQwYqs@F_ZX-%BHeVI`2 z9t5>^tt6EiM3dEEO>snJ`id2Zew1B>0Zxd7deh?6dCtDz8P1O&Q%?1ah5KSL7yA@% z@BCV4g_}@tki)M6!707n>;slfJXg2%ItasiV3JHJe)qc=eP#~a#E=+1wiaQRY=N(} z^f|oigJ`w^6?5Lci`9EZpB3t%De0}vRm&dhQOMF3v=-v^q9i46_wGKEew!t&AoIcU z6A(w-U2uy35vtrZA$7cJ{KwRK$ct^9zhE!^e+LcqKgj`* zS*`DH#*vYc!>jtgE^q(qtSznTCsMCpiCCS#VetO%6AM*#>v^fhiQx&jrqlmpq0^Yq ze=S1eItha~C59A1@6#~Vn>#z^ojr8D?GuB;8rw2tOiG* zxdqenKIZinKmWmqf$P5HYg`}`s>d0LcmaaegKg-K97y zN6O(t>*yVISp!!4zVy(e1w;}M4J%VpWo%=Vwh*q6jB_YUCt(dpGz1ujW8~u(h>bSw z?hS)tFDvA;l=z$!AAk2c29Zx%C!sPDNxg6 zlS(!hG?q)^&(6Oq-LDTW${z^((ZpfXcE(hxbn?y4gZ3-`ssD&yx;FONM1|(g!i$C{ z74r(1I6H?O?+UZ=8#rb(oFSMm0vclGHP=jVts{{!i*>3#QH8wBV=OqF1DoJ&xPL2B(3y=k|km0;9ZX?qMV30k-4!gg2)oB!yaZ* zizBjPIS&4)FpkI9d_v`4VUUBAd{FYe-apYOzit0rl|{(_QSQFn8?IOt6%|$SIFfyk z`UhKe@xN7M(!^yCe-kPo1;2xk=-MigZ;#>s{lOyfNmXoZUO(LStn%Esz`ssiLn8{5 z0HyJ-C_Iv&?}pkx*n$4~(jEl$DxtbHcOxL{@Z#v!;=0ql?@v%ZoYSBZ!{g_dLS3~e z76u!G#Dz>-?Y$G8r&s=Xd?^SjFdGry70C3vuKEBCPc|xGR-p4Z0C?Xyox^PV5T94z zK7#LhA9DGm3*;sX?drx25@B=K^ZP(ee$uJi_k3U3xs*pdcN2j||+U>^!a&@S-~T8rc58eyX) zo+>3AaaJJ}IdUc$eSuaZ0yo?Bu7=-rRG&Z$In{1MCT1JD%S+uW)+VLPwBjm_A4eIO z$8upgA*$5dabvoSNpVq?Wc2+kpAVl^uRosrIJK|!Dqtu(`kezrSHt)dS~0=E|9toX z$5EN-uz!gkxVJFLuJgezJUN(9ucS~=O9e=SPfHSAhOf2hGJ**L5iJ;%KDCgO7-yMUf(_<0x#%K-;NK zY(Y6A(!0eS1yME^qk%opQ8#9r3r9VT^sg z^>+ZyhX*jnj*BI#;_X(`*J?wS;`Ja+_r06(G4ZpXYKXiBS-$<|vH0Nx*1UMrJE(_; z?=68`Zu-KVB>JAZS=)AYBKggveP9|-U2Em<=ejXElB{nx=^!2B;Wl-_-Tyb+r@xsiPsrJ(OQ4&UWgRp6ljc6suQMoTHvv1a7Ua z4uXH~_)}iyV_F$)>APx`p5mnQb<3lz7URUXIYA8py91_T11f7E$f})4TgUffl1DJ= zoBx~U`$xYz-kjDy!U4faPFPB}jW{fP?I3%B>~#nE=G8$rKYeL-R1)t!G^&YASY6R` zptgiNL0^cv<>S~Ki$FDtPK$@n1Un~8iG6rlytVk!+Hxy3#TMr!uNx*K=>TWMTz7LplakSfUEcX!0eP%e9 zr@ZAUmbTtlXE?ul^Qf}ME~~%#fKX!zSVr+q559@LfwkI|DcAc#^M3Lhyl(|er4+W# z+0fwVOeOP!;>Zx3=k-I*;^@*x7o96|f6E*tCab!?2@%sUI=>{WTN*8ULHN=Ayc3Goa`-D*O@Wh7#`|WW#c=jXpIOR`Cl0M4Ga@saYuYg0u4%oF^0H>Ra7N z)a0(vOVSrzW|-Go5oG6uOLbJk4R1rocJ8`KmZqqOPKF8i(L#k1>;jF&)vvUdRTB_; zJW!tt#45f)FTHPFNC6yDLX(~7s3=eGM+~S{xyeMM=B9j{P9f*w=#JMhcrdacxLr8G zc|+*IKxqbIvBy&pH4uC8(B7T4F76>e)){YE+m3z;gC}r7w+|M-rrdge~%8%=h^ehMJrZ_&+9awZ=|3ZytYIA#0A zYSIUTsYI!}usQf^YY}x3awUeu#0O82mL3H!TM zn^r5qaQrn^r0dnkeE90w5zZX|GfZLvAQ^$>8~$g ztyB+$%hhSlP`>Wla77nefjhVLLH(ORJR=JoYL0Ts8b217DbZgoL+}D*Iae&5)q)^k zGO!oeN@=9%ddc2ZfKgGT1B`zk@LWTzhASVj)PdWvy6B;+Y4sBu4CQvEJUU{av1(Bc*c=wUgfkBcTScUlSD(s4b-pmdnl&B#}0`i1}JZpwOzv)w;ou zt$<^lMfS+pv8xl0VL4pTBDm2%-L%W=sL+MDOHaj{Qg&JTL|kxb=cCM)Wd3`&$^f>E z>}|(oBonIV*Rb?}frQDd{>h97i5ZqPyDn8 zco-!7ue$O7!leH{0Zowg+8$B8zbeeCDOU2*8`{w=zj1KV;RlKAn@>KaCFO{8nrU{a@+e7skcJBw%2(PI)zC6_DPEIf^m`((h21Ngly|)UhYw5N{lR$6@0TP@LG`I(cpuyeU z-GaNjhTu+cch^7&5ZoPtyStwvS!?h0pMCGkJ@?_>?_2YQF_~kIIjTmls@_}g)!O7> zDXUa~14Y{Y?Z;gKlqdP|@m#M_M+|>dmo%rc6%B55tK+4R%e>lx;$IZ9>Je z>=~EZIn&x-?RqXU9>qx;u5^wS#h=Y3k9gBGA7f+S(dflx4vzDv3n-ol4ASplF$TGr zNVZ^wXGK|_inrtOB@TE#7cY*Gl;Rm4O6nUS>^B zB!Y`0~_H%#~L2234!Tve&Pp74h8SG01u=pt_9@*Ro|*fCe7 zgxR_*)YDea>2FQT-*BUeI1%H!$KA6CT1>dWWHJMEUEx(^McZ?xaZgN`>L65Y>3*+4 zY0Xyr52er_(vVf&z|7kks=i(n^6n`fbb3#YyfzW$*RW)i23xLLiCN_!u?Utue4UTE#VhM4E}MPb zZP>ssAwNiT)^Hrk?r<9Z<7@UqB^ORcvbuB~rri(7-)kf72N223q?c6`1=`x+Gy|A= zg{rtHT_}+6!{Peup`};xrthA@y@0t+$NsQM8=0H}s~Xh{7br78=5NY70am@BX^nS= zuR0VWaa2E}Sx8T^PIfooGL>$A?8>*QWBxo`8L9z5$YTn7Jo%7@)OIqm4^3?Q!=P5n z;xoC*V36(|$VY~tm%2Ec@lAu82*(1Ml>|Tgri~m#IbceEm*s8hweti+ouX0I{ebi;a(w|=dbgNlvKEjS^Ni7C=aaILqp#G5a@*4Zr$U-ssKZ3@6<9sFlM zT9>wrO=)#BVdXl?o)wz9A69;o$J9?8s(!-ZQp4wkSm7nLiHe{S$K!%Z{!{VWn zJM!21YKVgT4@|aIM1?FaZs>X)z68Crde8TSucpAZda+@herCA+yHY|`b3TEkFj{?5 z+XJ>NEcWvBH#Ki_!M4=a-f%M)6zY$y?bn!r6V{@I8vZJc&t)(0O`J&O&{F(xS>bNi zTk2ZohoP})D{5HRTdGI*1vq2dX|amovW)2U^jP57_|m2h4f)-$qkKr-6h;8 z&*G#%Q5;-tmw%t)#gFP#5>8K1bdn7NGIHg9 z$5;<2vz2r%*xY(|`Qjytf1t>ZQm)D$aM^#6;~aGOOG_@Y!87<9;MjyTl3f z1fZqPzQ)xGI=5L`WNH}T3wE%;H^k|Tc$gq$I|7>)|2R(nU00anwS1(>?R|tA&_3+d z4I9yMwc7l;%+7|Dx>-+qj+8^<#|kx$_vvX|{}QUeQmYDeiN*J<6ig`uh)M@V?bFGF zz+}g575U>2-&)JwU&*Rfuq`Im4xQ1&WJ*>ct}4@X$=bG^UPW7eP)v?AhpItzLvdhI z(|s-hl6Gzk68i#O@1s>*zhTxXv~a!j-JLzhxo16+!a$ESyVTl5zdT^4 z=?u+CXm+O>rPVUQN;jUcHrm8u><{5d$NiQLeeV-P3v%#!gZ`AUVQ?M==cPR6^G`3` z+>P$v*oyn$jV%e=WE8iV&rdKy_#5ydV|}E$c-u>pIhNp!zz0{HYvVS1ha}g4u&I#r z{zFB9`%DTC58Btj0(=Hn^L9K&0_>-K^L9_(weYOo45L9Sh}YxxU$a|tt;w-4?1$G2 zO+dgHv1hm}@a1HdsV1>B?zT70^``%1HWD0y)0(X|$hu(!TPP0@+~o@0)O06^7>Nt> zwv@uy7QHMq-2^9|f0P-0yClsb^$EjMy(%1)YV&);cQyfd)+hLQx6s?J=yW^Q-4<$e zrzI?{4!=5^BieY(Oq<_cko65Vl9!w@KF2DrJI@@Lu!iIBiHH|qq_boEL4q7+s$O`9 z=(rHAHDiWR!gdIh$#%0^j@6Z(-K?tB;lj);!^lvT7YboR5a188Q?dK zXXS6=T>6VEf$rPS&joJ$w8wyBt^?*LOgC2{Jvok`0JQiLvrPd7H~jj(j3iDPS1X$ShMG*p%qGOqu- zW!rwSK$0ILs-${3wAV5;nKt}h$ZgUCCxljS)DWA_=2%Z587CmEM>CGnzeN}7wnZPq zG;YXf?9}m?>y}|!CDF^Sl$Z~e@vVTWznaUiu)NzR#;*A#i8i~Goif5LNsQ)6&ysEh zGP~)x*BPf3y~X;4v5EwT*VK7YzUjux5yBoq_R7!A8s_$BTBrBdySXC>pNoqYrV42| z5ub-5Qt5WH*~hkgr!A;$6Y9G{F`se8g>hERXw=&bHumFk_kg~2N4{NPhMY7Pu(-y^ zs*}-Xe40un>`4&7o6n4l<+?^T{eTx01xNR(Z@jE07+ug!?arHtkMx-7DUmVr6uT># z(XdpaMSzLXg#Fl##I6L5U`TPNiVP)%H$DpF)n1Og7aE*fXm_a9T2D!Uk9BcIR ztXkelBu&h>1@=S~S}3(>q4~yw!j)YnXCysvZz!hN?wPBw(lVx7@m1okIGB6Fm$T?5 zR)}p&x*EtZMuxPj-QbIb{NBx4m1!}b@?cIdHqDx=elJQp+B$hV`*wnW+_fkoTCNZ= zh2@CK#9c3bVxyqhrPyswb*IkJ%t9rYs=v2k-a~qL?_+h>KsRetgz17{m}b*{@BsnZ zll%$@#aHSm7xtVpP3X8$-s!76QZgCBaQ=nVbNgZurkra-M_Nd~tn#|gAW$8k(=pn} z;=GQ+2@l>Mg^nR2`sZiPH6msnuyGr3DIzF)>+-XWAqYi$ldiMFk;6QX(#zW#u+WsW zM7E_a<&i;JRM`jh((0;%ez+yi)$7jGShTi8$rU0v>vnd0qMsEj5-*qMrRrk-0 zZE3RT{EF_r82+1twD4~d(w4tTNN?&~5wR{WEkP;NpRF2T`;OPxJ0qaR@W^hfqM{-t zC+AD!x&%)~M#fU2>Eku_>r>q}DvIFMd!r%O-Z!&yY8RTw1eqPLSy7^_cYKBtZ3s!R z6f8WTO*PGYhObFH-%v<|cMN8o50q-{HOPd@GKzitxmo^|i0zFM!=5VbnP3)VtdK#X zRs(kDWPcmay+D3xMs(2)?blstvwpyX=;uSCOjQ*tJb}SaX))dhOYCR3REMf@_K-~Y&oCt*Z}A|XeckQ~@Ek;L{`&NtIk`W&7*Ap^uKXEl z+mDJEmZ=#pPXk^(x{1!{Uv|AllG0Dq=M3A)N$9+yUqJ{zrTKAl+kFhB1;sngr<0=J z8K>21>SDMS#4>Kt9^E$((P@@8WpAo&XigQtp7&vZ($8g|Gtx}L$loiQiH3)v+9HN+ z?_18mHWn+17K-^e3BFO;GyK8|L7AaMW*q2B(V=bSF!F< zsv^IbUCJCQt-hOw_|kEeu>b9oZ~zi&A`CholklZfFb&3w2p8KX>?lH}} zJ@esdTrq^^U<1bNqN*uwg#Wv5pY2fu)!(i_kGJxNeEp`qd3kUY9VlC@zN#ZobBzMzOSOE)oeX2xZ7TYn6d|9nXq$9=-9K)c+ZsdgLe&^D_ zNsS*X8JEqc+Kqfos1|cutxP*|W`#PcA&A!zoq^QmUQoJc;U&;o7$1xp@Ecw= zI8K=Jj9%dJ7e)mjres7DnZ~zl2%w2I;03=#;?ww`9vfb`JK0V^PJzH3JJu9vj){vQ zldMyXZ4+JlmC+JX@HLWOkzaxB_v{h_{0W8HZ>XnAUJ=In49he8rUhnhl;pO&%Hgo` z3`;N=-RIR>2I8W5+hiD!-XF%+#X4%1Upj`;OKT4A-Ppc+H(|pYoAuEz3=-4HTqByf z3cq0NGnyP)T9|}oQr@F?!3o2l)nEFM0!uPR}s_8MFEp~<9^TAbb&|4va+9q#9MR2_~wnCUUr z49zE#E=q5f=;a-&fJXFMM{U>`a5q#`sH&IX=Emv!kmR#@YI1 z*HCQL>xUEvGNWMky;t9UPKlaWd8|n;eI_o;BwIUa4UJy`iu(;A!}&OxBZcG z8k;qP_JyQM7rF>0iA14UTeJ{Ax615 z6%kcs7wu0|tjn6!&UI?i#Ty%Lyd4@5PEJL?l5w_W$c>R@ZtV#Yo@&9=sW-XQ-z%0% zb=D0au1sKGt!f(fPn4&A(M)+VIy8LP#~l9@0x!Pqb!vBu>bNu86WO8q*bmcfA zY^(WDj#ZNUAs-zsi5DN}2uWY~F6?)Hmwx?KZww}z>u5>U}eGj1@Co|C_45jaRDq>5E#W1)x^J)%O(MnNF%W+EJ6b`~`EAIc9nB zc#*w1y+5C|`wo+lV`(OdDK-Q3k8N>8J8mG7d4BP&%HR#IYnkXF`O@&!9kDsQX?)L$IO_v_$O}h$vL`F?F1@rBIF6l zSL=0iqe|AIwI~SStl4iyy>w2oipiKZPtVgPLwLZ$FnB@bjIGgU;_cS0aeLS{Z-reR zBleZeNVo)%s)rn{@mZ3(*L(&~bxEc-f%RU^w>1PmA&VrqIGE2xZ-l*Gq9dH;KGI^u zh$`aJg~Ej_v=-N|6iu3l-@akncnAV?bCkyi6#}3>MzJ>dSAi+n8Q~glA5~*}LFmg; zs(#d2+P!rO-Io2H7b3X(ZkFjasVkI(STK&C!UMZ-hx5G;oPHOpkF7*-hqLe3L4>@b zs<6N>)rU^J*>4<#O9BE0WkAtbEPI(X&FgQYdRdkrum84_4@;0qmHJ zQ|B9id5Npo`Dt+tD=oSZpn=Jpj`+$eINGEjADS0wUH>UPubgyNHSr?js}3$(ViL+J z^a})E>cqMUTcdAJPScShx**g?Gq7ID{AwS2XP8;0hY`y2qKsUZk@8^|ahIl4pl!pa zWJdwr2S%J9zQt3WSMUwyJE|yjp7fKi+gxb1HE;B9U8A4>Xrt|fwY9EkfNeNn7<0UM zt96OwCb_(tZVEZj*Z3@$NpbDP@TYB){X3B!0@_h2L*$_#rifFJ85Y zmBQBHT#QZ-c9w=7`LWyl#NHxTPuzT;KI$`7L2kDFWe2~Mf;{**dy+4~oh7yj&c?(jk9gxof^SwRd0W z?>_6y8QR4Ty~vxi@alS+w=W_pQb)3jSb1Z~$Zf0+qMFK5X}C8q>s@@pjb9z!Ljvaa zyBC9tQ#S_zs2gnt&)HPu>QGy7;aqv`jFx5(-UK2SgMHnY_C$Qa%91R!BaOa7OZxod zI-+q3{%s5g}r?<6so8D;d`*KFv-(0-XaQ;SwUM z)%~QaPJ2Za=yJ3hRO7cv#&HI@u^MVgZs{wu*>26t9<9eV(wbiS(Vc{~7q9wm+JCa4 zrtt&SW9;vXx|(nm{ZtAIUTzCc+QDZ^#7YH|!u+-W;_skim46ND=nmG38$N{+hr^W% zKh<#=cIW(}<)S&BR^-Lrb*jrgYmsU#QtQq9!C@c6;OS^A67@2_m}Up+2TIadkF^0O zQgi(Xm^6MEbR?edc6HZ87m^PF2|8TEzJ6i#OJD(@da5yZvAGGmBPQb2bqP;) zDtlTNK7hsSFFvtU4XDOL3CBo8;+xFCWsAM?3@!kKX1 zv(C1e7@CYvlNy(|xI>|D_+jH=xQZlngCP}ZiPa)??&@22CqJh|g-M6B`21Q-t5u0u zMr$3 z8HM0fIL@ZVPK9gJrcaAb07yMvpDINhB0qlI;>#u{RG{c<&4Ryz({_E1T%KuXSNlG> zQpCcOz4AgNaJptQ;*;lC@1gs+=I|yrM!lk$olAO+Dh4rGl=s}+)T9i->2Cb6?wd6Q zSvsQnIOUJ(_ucBQ0@Cc-7_6Ms`;qD&%g?CH5L+{Yt~fbSP6ETbZdQ+O8&T{>ccL!HY^z4ueCC z8TXOdH_hK46ONzXjKJX1*9VJ}+!keW5RJ0Ui~5EH`Q->os4qoE7k_c7jk=$I=qNF| zNLLCT&LMj1aDG6#+2Eh|peEk8wFv3Drvenvxl?E3` zuANUsX2HIS=KkXn1IAwnKYXsU4~#I+C`gaan?*|Ut{?8TUqC9(JXsl-Ey;_({ko?X zcSl$t+j8Ih&@p)ZLeMzM-~7tsd$PRCk}NJpYvq%MuR=3FvwNNoElwfIM``Cl;Zfc~ zOpxw%;>~ht!SiNBuk*~Oy+;a`5^1{7IPbnVn!9T&s9FMJ@;g4y?FR0o_NJmCp&^ii zL7)n&`f@W9IHfEAs5z+Db<0CxN|36*VEd0;GYmDC?1ylF zK>aPkk@9oQYh*&=1=SwZqd0habMt(I8<2RssOyVsz163PbY2O2U-Tu|hbnpp`D?M7 zX2%!W@}~ILj~oux728-MF^i76t2SHV_Ww6kM z^pVDcou{D;>`8uh_lq>&PC^{YG|?F}zr&skov6G=a3m(3fq*^|?hl!7>7vW8q$M%8 z7b6al@)=i{vV70Q|uSSH+7jR`*OXd4hT33QBZ>DzAr2 z%q(xtEh1PwHfuBNi}PM|zBKnVUvLX>7sTcHu;FAQE|=MZl&t6|yLzItm|ua&5M_{A z>gvo@Q%f0AFDVC=UATqu`DKAE`%8z7&ewh0M<@2vm>0?M3mS!DCuGkMDf$BSaRih` zlQO4s4s8xDeLs@F3A(72I+Lpl7U2k3$^Ka{6?3?gq$j^^w0)HDfee%chv8pbvd%NQ zz^L(-LNb|<-?Ob^D@c)_+t$g?DoZUfG40%!WQboL4QE8u?SA~(8I=X!=yn$-6$xS4 z$9!7VvNVi^+O9QbmkP0)vX6``;0~Ux9v0*m1!`DPtoA{xyY7uePu$H-A(4W4&l?oe9ysU2(y~`}H*qJe$SDYX>WpeZX$l zWdiS@Mxp!?{jDEwY$j|}!vg|wR=v>0R=Lh>agEp8EJnn-Xq1%M7ta1wM65&GeL{^( zi1JNA4`QelMs`M6L*gh1e(Q6ATKuj=?LH(O{FSEu^3s`nUerBPafu=6QLv@^UexVx zP<~?SsADxnVb;^2bq6x}@s6DdXC4`kz))lj>jRhLyxpJDS}f=W8U2?4wT?@}LM^i) zdBJcqubB^%av_7BSJ3hV)?C9Hl~FjtE@d-ZgH8YvA}W%*=Pt@?9tE=$n>CFe=O}C~ z+l^4v(?P}whS~tRyEMJllVh_f*6NzE6#7ZxO!iC_p}zqKxsVWLq?~Jma_0&0UmWiE)3Lcl~~WVbd#vr@uYW#4NDW^l^d9-Ck-B(2Rt+?(x5#RIq3nvJ`qdC9Ga z)fByvjlJgbTL`gIB61=@+*Ml<${&xQM0GTgPw&M4h)s~vMqal*+;F=BQKWEJ92m&A z7a=vaoG5!$Gc)`NPt(cZsOwi>B9JuN?^TqDii*0Z8(bdpG0*{Z=pLSJjOMbOXF^GQ zfvtEgo3&|g$MtuZhBl4IIo+B|o(c~3o|>zx$KlA=LUXtGtQfT?uH@H>#HL;x4j1oi zwsh?8uqBoW#-inY`j!z)hYB;J4>`^V8R}U*Al0p-B>6_RiWRLGP8>zqul=A)6SN5!zsu8}>qqwe%*-{1j+kMnAjc*gy}RH&^;5 zrCNsgX*))V`BuJf&g_jQ)wit#_#$&Ox?W_0XK#KH)Ghhz&0pX;mI=>c%d;4&BiEZzLEag*x>^^CN;;kw)k+c$26mCV{A#0r{!iLXD&9=u10 zXne6FG!Mtuhf41asATl}MC+mG`7zeIy2eY>`?-*>#_KOT0^_U{`N*PGB3)ps5)}{S z9%b`#TZ24FnPGwveRU3yt35)Hf^h(sHQ!`FY#2w5O>;P2iv$NcpL}oOi>V>ym{Cl@ zyQR~$kHskv<9VImc&OZQihdyD5L=19TqmKpEW)MBkaO34;_|}?Lt))>9ziEcB|=ub z?rhFBg}X{xT_b-xO|V6t(A;=W6XO+JW>L+j zGK05%8*hW0J}$rH95kW@Kvl-512x9zV$z2{#+K`e`s(A=ojcG!v2E0ZlwGnacz<mhKXarn)Dwxhq zg!kWj>_&Yj6Q1MZk$q}miJ8CR;gKc29Jd{NzRebgC@<69@KpKY+ZM8I32Af8s*Kzi1-boAFJbN}afffgR^;toBvX${EqYntU_LoQBfNNveO>kt ztY9H8f2?%MXJ4vM*hrA}0_0-5-`?!HbKibIghIo}$y z3mITzj4?g!hZ4h33uHcj-ZzH!=5j=YHTFVEwzq=69T3~ab*8he`i4o_QM9`sgRtC! zes-`@yh@j6t*7ELvS%qI6;5xdJWQHGzS3{4KD8P9Nk3-#w4I3UBa~q}YWsyrew(Z zG(MT`VK&W)L`Qn}((LV+G>B)~HitI&9SLL6KSZ8kP~foH;yQ<--LO<|*oAZj@DB0A zO{Uqsq`~^ohVab&=tjKBwD6eMrSh#z%;@$)NXmwy?(m%D(qIzlQl%aKvS%gCc(^U2 zZ`!DI#+c}r7T*ji8m$APH1vwq4aF5(2SN+Bi`%CU3+{};DQ#(`*go8@&QE&JnT1pa z{rKK}(DTbhmh750e3dzc$x@Z}gZ)jd;RkYiK599sXOl}88K{w^l)g@F5C@LXO}W4B zxyEt!4wCo*@v%|*(r*^jwO7kSU^*4;XqKJ>I>b2&zx7mKN#Dc*c|h%ldqRI^Tn0F#N0@lXFKumLAPNuVlmxL;9TT)~U>(36cm~V^9-DxgTHzB*#Rr zsShr}^N+72chvYk#Y0u&FffR+Bx_4{w&Mt*(33i-hpWp|R!FLVxjT_TW&7a}bJ?s8b%pC5){CIbF;L-Ic3FEpYs@eXS z?%8QM+nH3|+YAm4wwf`{U6Nb1Wh>t4kPm$B^X;Q4OI)EPDUXV(YJ?JJOk7;Rw>Jw1 zgoOIsp7sdL0qjd@Ni+U3gWd78+iSPI#i*AjV_}!xdsxYzqwr;|E9wJ+zi8%R7O}9- zh(y0z^fq8t(H;YwWuJhyh{KhowS+10eM>s#A@wFgHV)l5>D~BCaXGZW7kqMQzCI`@ z-a!%O1vvHG$4)!v8C|{y_zIQSwZ$;-8993E#5k?QnV@Iia(KeN-1pC-&YsLEI#*fo8?e>}7vcpIPeetYRO2$h^tp z%kRy7wd}9V$4ekBHwxYA0#U&EWvD@5Q=RE?Z?5skV$ z!cj$X5Rl2(tlIm&9Q)y*@ZIG$gXz%7v^Vu_aw^nwkIK&b7Om>^#xp7S2HBJ;4_P6^ z5~obtPrpn-W&+R~|6#ZWs4?4zjVg(cZ-{5UgC~-ikwLJIJ=f?^ie8so&|Z9vq=*H4 zdW`y%*jRhs8dKUNsrX>zUXzIHqb&<;dayyHO4yCV(M6+Vhn|z81i2KVqrgFTIGDR5 z|7xj{^>D1+#q$;g16eD}kVym!$xpgMTSw4|=^RN>N+U9Ox6QS0(sn9cNqekooJLEh z3~S~)%~z)CDU}EOJCc2qCv!Qziz32~jM!5R=Ug4X}E}JXaeYEz6@2H3>I*{Fc zzvJ72?*H-gO;J9l%*D-He20Zs?~864xLSJII`*1%@Mr>BB^(om20O4|NA**dh6qll z2F&-HaPJfI8*6puN*^W*__y8xzHC&NAMpTW8G=KxygJ3bT|>aJBeUxded}sGFl3<} znU}o9%EE?5FDxCy7!bR6<%DCQk3PsPvyH##-H?u7F&j1vq|pL$B|}^-`dcrw*J3$6 zUjpI^JU(kXR9oT>6IfOkNp!(9L%wtQFNBpEDi?98R0F`t9*$oA(J)&z83qXwpybn@UwZa$j`BPvCVPH178r{RbOkIHDlfA-xo|ihNGV;Cx=6``j=%zKTJN5rnU|bY9A$Y8k*s?cpNE3ub--z{H@7nE5l0Q zC09p`t2)q$#ri4BuG!^cU*jSLX0IJ;7NPjw>aOS|$MrDvPL^HMci6V~2ZF z{G)V!jmDZVUYZh+p!Uz5~uf=^Sx&~s;qfUl$XG;j`md&SsQM)2--0L&FvMk)wkoWEwe1}GQ zE;(`M(ByZq)t7hEVn3}}?qb1?cRhOiQC=b*CYyIW7OG%u2q)V-m7%PkkWF^xa63hl zJ7dNC+$h6v1gZ3ay`;hssX_9YY<|S^IdXi5k6|zzQ*S zj>XtiHw0G}sx`#cgAeGIFNt``P(%`*;@)%iPq_J*d*B_U^-OcOVtS}oV2nm}b<~ie z39f+@YLF3(r98<1QTw)-x9ghEp-$aHkzyO*0%SC? zk0yt3zc_0~z+`_DZmCcV)ZPB*7Iu;TM#zhb@-mRwXxK)KUw%AikXdJawMU^-Sn;b2z+#5? za-e4K#l{A+c3Q$o+)1FhRDw-syZFyn_{oHd_F0E-j+DY1QT5H8bmubQHV)pbJBC}J zPok@Ko<(?B?V=zG{w0Oy0=>4n0POci>_LhtUcMgYVLcCo!v0H^=P!ceXtt?m?>@*qbGtq2$}1}R zE`;yq3*?3IfI4{>*lW6&+a;OIg7T>I4uy&`lwv<){HUPbvD60GVzlMI6sy(06pf>< zj=kDb%yJJp5MCLer;(oh=uPQIo1p$%2|EG~SO*fx`UchfM zk-w#-zORID%6+@wU`t5Oo8uASPT+K5c0aF7)BX{P$uf?Pj;?*Q+zGaW14%ul7(G8f zzq()E@I?u#wmSYlP%k!mdYE`#rTXx<7PY4G1djNtF4-iW1_ z9OE#P)!t0Cf?s5OKBLpIUNTT@ylYneTaokeuPsjZreT`fIVOpCqOWqL!P5DxWtT(C z32qY*FaA8}alMuMQ9|NJyC3|G9s7UD`GH?BdZO_0v1h@TnSssI)6+*LBm~VjI&@Jo zST1nXsZlq9z3d8Sa-h_$)tu(Pl&HZ0Vi{aMkReyr9z%RT=Ltlb<{TE?=3}MNI!zW| zBS4iq9xc01OZ-<$!2y=1*I15tQc;5R^z^jjaSv%RIhk;jvsz77*7t^m3jJQ#1(E+a zzszfFy+5gVXHdC+qT&kJOIvM`=Cqzb>iVDk=LsbP8dC>^*HK^~t$@U4dU0{_EIp8_u3HYK7#be- z0vv0)z%uSCivM{xwx@EZnTz-5wMq@P?_SYpgc9)iE4}_8Cr+hS_W~H@Q;_7Fvv{BC zyq$kPC-)z{VuUWUlpyuiHIcy(36z!)R(@r+TnMdQaPEc6^hd<@N9MkL@r6Wudr^?fAvx#AdZfW)#(gISE|s11yv`UyYr2cCM$7iX%T=GMTzQW*WSg$lH{NLfjGuP zzFSl|P(l6An`f*$HSOj4kDIy$yNv(w8g8?kR#Z^%&lZitJ8=g3>H(vY+;??mf6^#_ zorw6A#{_6jK8lluJ8^-~aqoe%MYxA@q;e%iw>AK!e{RMgvR^ z|9FXzf!&M$ctuMg{I^UvxDHvy|KD!lp|zR)X>9@d&65@$DgF=75zs$aNk}KjiOE?_ z^by$H(vOPtjxh!#f7<*~HNqIshhrl_8GvBu#VBq*gl2ZBL-|gD0gOoAbApGSL;c+UnJPx?KK{>6l+`n z&Nxx_gC-lKOa)E1v(rM&JMu7029gxl{R0zR1-Lh&vbhrC6vb6C``e`|u+{VSv)N(q7g)@}?QH>WAF=m~t~UEE z$iJJEo+(W*4h4mTql7Bh9|T-|(s>ZCIbDB8l{6coT8ve-NT^wKzu|B@>U{l=c09|s zx1CgXShLP;u-%Gk+%xTqYdOtM)aSn5%)Dyy`+eyrClYVQ!|^w-Qxi@@bp!K+n-a-KY&w#`flefhtW{FK_f&_E649oc!cOTAn=C`fFmE9 z<^ndttkPF+$j4aU{X#ZMQ{ z$VDn&?s$kd+wLdNc3B6KXav{wrdqMfdV*ojAc&*PD{$%DI4z1oV9@NHZONB@OZd4 z)-Ef%#T)u;uP6;<%S)aI_K7)VVHl{kdk%n@E!lulC1+SdP0L%?GwecBp)r{MEEv@EFdg z4bx6%OiQyebW z&rOzDq5kV$K6&!5|NPq={*5&ryWwAB_}3WzjTRqm;NJk@_el7E#TZVE*838+0I(tFnDcqx@IBxmi3Z?&`dHapR6U{c+jEA1LNKzu$23g- z3{m{!9_{Y>OjNfkTpW-gnt$2b130#ODx00jcK3qoN&hX*Q@r%~Z|!|_$W@%1VmKE( zjXneIbP>;cZhs=meeBQ7^Pd5yjY@i4kDj(cAZGz0#drPjbcCEIeGFUiy5Yj$dXkb{ zS9&vm5)T_OxnNwL&N71YynCnl;r^yx#{`tjNCM>bXN)Yq`{h!T1^MqL@H9#h$WH+; zCLx^TxSQjyi~F9=yrPH1ZXFq$nUeE#h|l=)aLLI%j#}MhT|AkEuDJPphBZC7$>Vg9pOl25xPz*8Go4WF*?KOJUYS94E%v6bu)3N?TLYpb;>JR<9pp2I${c-u&25eE~(;H^6x@XS-8eyI!6F zVxp$8V%7P1PM}{y6UDMmL{X{P;f!SPTU$BhLNJEIp>3H>g0dmu}ihbxj zoxyqz!W@|mzKa9A0lqO#W|f380h7-6z$TlGb!!ks)^0O^#?_oQAGpy-;=AmY8z-69 z7@tPqtassK{V})Zyhw5_5ZD=mU`o8wpkL(CFUDdrk<08A$d=g?$^X#=o;6~uWzSf? ztZGr}_F}7t3I-)*E3_@q{|Iz!HPqK-hs8k10uXS;-DZI6f2-<1V$Z^4FvtSY7U`oK zFHYSEVC;p`Tc-GfJ5rX}?T8B~9|l}zZ(xFDX}=`e?coNe5NAB`)4y31a*@n?Zo#`Yz2~S=TJO&9n3w1Oxzb4rj|muxBMgJ?E$7|oXg-MQSXZ})GrRtKT)y~7^`zzD?jRS$`|Nul7R}deb+2zX z>5e2|ZF2^B%F%|MlG%kMnBR?|oowj8EAY*;2<~cnoG4Bpe*arbJCpZc)cVPj|8rPA zj~ZB#%sHV_r0w1eQ)gO}VyQ+xVc~t{-bl8nizS>b*8dn`wB|EauElQWyVC*={&4vc zB=^!(2m}Mbs^joI?V;h>e@_OFGs7OzkMlO%5oqM?MFMux0FS9)Y9+p67 zE|E@GP(|AhT?Q=MyADR}K#DH;{%X*prp`k_SwH4ggqL++=z;SQF3o_V+oTUGs`)0! z@DG}khHF~SnTA~~dT^Ic7Alrj?N;>GICClu-hexE+xb^N_w3o6{42#3j3X8=`tHqcuJbN@pymB$)IjB$Inb8iw z9RVmzf`W>1wrev{&INcbu3?q$hN)|(4U$}oLQW>`?`}3uCMpNmC>E2S;;P4q%tb-M z*MT{cZV#*?SI?Z~w7v&PCF96TdLyx}Mm{=ZRTl=l0rUWGbwz0`0Kn!IyoVYs_g>ZL z2wfM>=aVA{>x#>nN-%E`^M2Nd)cYeVDluOZZlG$ox! zyL+{Z1ErlQmVo@gnGIMN_PjX?kq0On{n_>1V!mNbi(=*kteq#fmL4~=Td!L${nU}p z9znG&z?U#Eita}#rAMtY>kp?rn_uq#~lmQ$G3pR z`^3*K{pi5iw5VK=%h0TkX;SUWgu25#RH+d9QJHqfu{HH~zf+crP?NA1UZ1L(>*yei zi~zy^7Bu(e2XSJns*FuULSV@AM9*?(EnAzvIa_}jeO#d9f>v~0Cqq2zom(0}(L`=x zY0C_Cu5Jhq+$+7()_Z6DAmZ4-UsV;IuT)plIsoFT#JUzOd%Sa0ck}~$)U7qY0`NMrN!rmEP8;cz;iy52RX6S9CxAc{Cmcc-=NIE{jnYhPGY za*&ZPGUk4?N*}ueuuLXi1>iXw=>tdq>a2Frz43UB#)GxBWlASRooW%KEX(*k%u`$H8GK0xzsTajt+AdoOT zuL*$BOeb8R1wX+Yq@lU)3`*P;9&-&%3&8P_veCF27Q&ZzzduRaI0&RWc(mox zR^%!sFEscj!UzufhXCw{cU{j`J|L;=7f|C z__N{X{b0DIPKG2MgWSeA)Jf}EvE|wo1T>PF6&D*2Ba(jLSp`E+S7#h!(Bd9^u7x7G8J{Lq;S zPv!0-mF-nuep8$d${mN1Y#l6WNwz}R5r@X(!4#?Rnar-4ss_;A9)E7Dq#g`%@dSMp z=3rYlG)Lpiceh|0l{c)`f4Z3uHLkjr6lnFJN6$BaN?md}S+a-F=YA(|%>%D5T3=`{ zt%hl3l#pY^NZnkZiSU&wXjDDH2KBi(k%;P76P!6^*Z*@Y!BHt^N3L44C%I0i`C_c( z;E6otmR?wI+jy_S`}2QmKHJ@A2NkP=qG9UPy-d*?jwSe-#L8QFUi)lBJHUgVOzby% zL@3P^+IDCuYQlV2T&WdRe=0?dzJV5Vwm-8$=3>#=P;OohF5BaCe{wAcrKfDlNZc7T)i&esYMz<_J@-8)|VMZP42Hasg)e4q%3^T9MF?p{P*Q>*$kpPkcL@ z*r*#{03E2ptSB#L2;&_ZANUccv$A97!DH+_W z{h6A(;rYo7^L$FBTH$gP>z(*b^E7?TLu+{G>h$%oqkO4KKsJ2=o9xDuC45H*Ny8SF z`g0e;W0lTm3xN>4Cxx`6<}t^op{q2R^t%!{8D#aE+cV4baCnEBx*#AFV++UysX8R$ zCxrs<&=QV!XlMDvnm<7PidP3!!$((1fJ1V8OFtb^5#Y$_RGK{gFP=B)YT2G5g~fQV z|HAn1+}@wF*-{_5ZD(uC8{L)t82_Iu!F^CPV0(uKY}y$b5@M&B5UQ`AAH`nMj}8dPX<8Dl9ISNG!?Cx(@j6Ur|yfyD3@HBktyFaU6Z zR`7t&OtO7w&4N{~nyQ8}CL5D9I@$NvkqG|TrfoEjSO|mqSfx3G=LV^1G<4P1`qSXS>=#1}(O}&_A27Uvu}^TVK;j4oIb_6TKvG3%Den-v`?7+_6*1|DOZiKo%y!gKZm>{qGmJgNo`EyxA50xI^dAhd6X2w~WzSYQU3HP%f*7 zN--5>Wvh{m#ZEkgb89U7Gi~-DlRMll-xVylBT4!1somvD&Y=+5gFn8h1Dt$!ZZLJb%$JnQ%nJ7^b%W#q)|h~xTbuuX)e zA1Dj$Zz8vI@SE=S3IMgt6NS_l?3cWXZQ>%?;c?oiSf6r2LEerAmaiYIW3Az>R9q;t zS^!4~74n#0zI*BL92~_nzEIVJ^=1_O+Q5LM03=GSB+a_oEbsWU1i*LS_uq>E1ZX9z z2p@}<=n(~z3g6|bp>MZn_&~o3zTOYs>mii|iVTWnDB^eMgqp`*RYOlV4Hj4hZ!LBW z7`B(?B-&b4J5+ZLV*456Po3t8&R5-lB~1sdiVCYn+yiYASh5y9eTH+0{#b@o7Y{@qgL|jtGNMU$GF*NL>5_^?DmY0 zk0xxI0iXRZP4!Ai0YE4Rn@MJwpBrQUhMNcK1CFe|V#I%IiKE?3y7tR6N-zM&i}1^# zX@;Y*nmF`lTVq@Iz=1rR;#O+~?OP6!_%)o-l{38JD(Xnet2Nf9?fb8K3b_yFVZ;oF zqa2)IEG9A&*pqOlV;}lqNJ~j}V>up4%lcH#C~CN0NaX`gwJ#iaG~{)~NVvFdDjhNz zlb~6)ap*l<_s>Sl!x5qZ-(d)yrWRImY1%S zwnZMeA3~`PGg74TFK6YI%gODw`a{7*zcJz?f$+oT++0dbc)X>-(g)`U(xifBCBu?g zw3wq@&%ToF`EiU}2xtxfc$7tt5KaZIX}aR_vbcYRPP}-SjkKEdTS`#7zX^)qkej1i z0<0?86rcH1fT$}Zw_KgwTz7yM4OgorT@M`!c=?Vt= zgiIS>_3B0I!e3&^L}u78&aqB66K(yS;;AP`K2|_o98W(~x7kq+#ii+Bnn*R-Aq^j) zzc0A3326$P6vBFJYn)d%!Ac*UX5V3OPvn54McOZ&ng08ynqQST)HxR(lx#Cj3h~N@ zvOMgccxB?3tvgdbiaS3#dxvwTBDE=a0{JWy>dE&;qV<5zbK5_SU+vJT<+lewf`xN^ z1qS-Ptqmc5-vOJbDyGXXcOEhTGW%5iO#h}9!W2lN6Vsq)@;T)%H1H{Fqbj20+Czq4 z>%{qI4g_E~AJ>Zl{X&D(@b!a@rB*V^W&by!Q@|_pOY)73zXg$nwwuEzqP0t5ooJW; zbkvnBNm^=pYv=r&EOYF0?ZIO)l3NOxwGkpc@j<($WE+Ax%%-D?ZBsq@_LY$A9xT|g z6bo4Rp;h}J8MVpQ`6XF$EH0X1Tf084&e@$`Bd`7$>T$=5y`4e#u&Y4Z(h#NJBq=&( zG*B?=LhGZzlsiFr;d+L7>UqqON5?Z)#L5)p?QeWx8S zeY_sIbG}HeX0`|6J>#<>B`rq_2Jz}Z^VWwtfB){~#K{b`jPg)VP$Pn;<8pf+6`da0 zqDs@bTfrdagqOL+MXM`XEVZi~wYCaU7O!q8*8)eR{U*0(ZuqW<0%*ME*pLGAL2Ef- zR3Q~b>M?FIjol}kxQ}2y;FTFSuR-X1el7@e`k?A}nU)*nXY}t6B5H*O{-AkGYm)@k zk-LF8Ka!grbH?67SpImoOLzFF;_yGSPzSL_O2jq|{(2E>$<-!f?Ii81M}_V-DP?_K zdrpgn7CvgT!ZtIjFlkN#I5Y}4lYpgxnO0yf=Y{j4K6Gd6VB>MrZcCwhjcJugxtHu%9tGvJ4L zpVK6aG$Ki^;>m1kwprFGH^T)!C*AV0dUXH`oHzD6&L*+C`in?XI=~BrcuR0^UU&J> ztDnkU`}z0c#yyu`LT2k#wGR1wydF2#xgrnzvm*Cnuo3t88Ds>?NGPUe%^JiT{RFh3e+v=Lwd z;9=oupp&MBgUhgRN+n{Q@T6Zp0rq6*B&*EIEQ}B-GP8pp1syzXo$QTy;-T=C-f0n6 z`#o$Ai_iap2VJ!o?my3g$X>ylb$LtL8h=Tv%z!vAn1%kv=L69&&M#9G6IC~<%moT!(pC^G9hlN0MS@4n0sDk>9$z7ZF zG@^?CUNOi%2`N*3DI4tmrkY2O58wY={^68nI^TTlo!iDAZ0vL&yoTY4*KMaJ3mG$J znI>^GO(Vmjs?-eHk7>Ig6o&~Bfflc0JL8+%F5s`O};G`y5JN=wwa0jL`D{XS5VH>M?Oabzwfmm9O&^L4v+zNWhBqk~tY zJC7S4E!8n34wMrR6B_d|x;2Mg`OF7TJ#;Hti2C9j38TDp) z$+@y2fU?BC2&)6Ahn;L7(*^~uTVBO()mHi)^{f{mEZTOihX3*NdBM_yEaSu0*uy+<5inw8^iHH1t?vUv z9AEsdntdVAA@KXZB&r?v^jI-{Z$!C)&|(3Bg^Nkf{+GCLBk@on1b;O}Gf2kR5isL? zkTEIDR4EYaYP3wW85zEk++VnJli2gu-}c8yW=Y)2h&i@7UE-pG%&7hYiDMLQHXhdK zCB*j4T*#>R2JP@|cS-(pTDJz=wML=1)iP?DFO1t_zg|eRF}F9G{oPdA+dq|Ein&k2 zHCablFM&In!PaE=LJs38qnCVA^?uqPvMte{h zYEZX1*?Or-*W(4t*4=}au9Ap_#XR+`B0qp{@c`j4=VYyIv7L*v!$y`Z<>%x0V@HiX zO><7m>KfaJA-eH*skDVdSX$7Eol99w?oc!?3-)+w)LKRzuMSyiO~^e>Q|W4Zt8Kq> zIaapkPd2;6WJ@3bMnC`CGNadwpO+#h!OoRi*+R~@;8}cF=O5q{RWtkYW&KaIC(KAv zt%d7g2b4AOpzCksI~90CyLe!N-TPo-xe%j)zlyzRLDeo`@#; zsL4!q3TQ#iD%t92pb-t_NmA${)0CLJ_rNue(E~`Bp+fQv3ki$wpO0FN&0UYtc#cdD zQ{BDaXkCT*Wx-!sBL+zD0@zmSIx#j>s|;uFZ@hc&=q;_BaGeK4y;@Aq4>YYrM=`Ow zh;Ig=oLLVc#(n(-y9!z*AJe>tq6iESFLn3eL@=mPQvrSUJD>cvOC^m#rviAhI4SFK z-u9<#+R?Pz2Za-+My=flpp>GIgaM?ydqSD$bQ5b^AV=0HrF3-}`ov`>80vkKh(@nH z5SP-uUdX7(SNhvlyl@%5)YJQBP?XU~`}+H;qfbEzt}@q0weitiudbJufh`&Z^MP;l=}JU%51ZHXqWE6pNk! z5*^YoH?&d+fpxeLMt8D|=0N^h!!HEcjY|Aykf& z4?*A}xy+29ORK|4Q3Xs8&x_w4p^i<$ec>H>2F9|^@<2ctct}|UoJNZG^%sb&g7Clb zNyK&w1J-SU_@)%-$x_ZiAh9{Wwb^-vvg4j(rUKg7Vb6h%Y$~3@;O57~e*F6epO0udGZebx8(EiOBn0gZm%O&0V^uvW6cen>rZYrjyf`?qZ2jyW zHG0(_2(>B(Z6v}M%}VcwKeH_fEB0Hpf3zV`fFWEb$>r#Y5jIGu)_uN6Zrh;f5c zp9=+2YZFKtfd$eljl`rS3nVCz@=4GS17mOu&(E;-jNGYx5s74l8=QYa599ePEMlNG zzD=O5^;k+@kKK=X#pX0uPDxtX+U|@(!)9khWYo7~0xXvh}y7LRYe6mgd$S};nM zs=d*^-VQ9^L-n5hQ{JZTIv*(`U0 zhTfbiPxgWhCGR(x2Bf3TS$eonXWt%XC0=Pq5>L2N#9P6gG*bPIw%}2DTzc$6R@ZNe z_~eGn++SiQC%9-gp^_~=FcKcPQmcbZ3+a_)_Tiov`l+kt!{vU$QZ}(92F`~_0lUM zBnv(nSsm^h2n7fy%g50AV1O{)S*Pei1E^_rcfKO>2(BnM05sSZF7|q&+@OI;lj9Z= zqK8Y>A;U@BwiAI_U-K-(R7rIC9v9F!g?EJ0GM4%p_5ngbL^38o4VgDWUdB(@a!_&bP zAu4?7lJMU`XY9Sa+&ra3L|p#!8^W$0b|MK4S+4LYhuu_-JZWfHFHry46FyV%gJus6 zjoNj^+kVOO*uym%Ym|nij;Udi^U#g{TlOmS7cQJkIA&bRa^rp6DYc}z*DuwLOJmgq zvu^14@YAUkyAF|pcVkE-lJrX2TWL>XD;764u(I@KdQ23TyqPNcjIg~eo8}tUfm=BZ zU;q0RanrxJ8ou?<>&)7rt$+U`!fHSH-=BZI6c+OD`(J-4%K!V`{rNktf8O7}s@%!= z&wB-S?wN!Cygw6te0ASH?~gV7|KZ~&|0*=8C=a8hH_kUGEUxCSG9EyhVexLuO}usv z(yKd;4f=*=37KPtLxr+5G-vR?&;R;I{}tQ7ji2EQy?WYZ9#hRmL&Y|Q4m}^P_$}TY zDRt0G>=;S$9h(hHyn|qr+c<+_iG8jVest*b!-H4`BVKgPQFFH5)MPiAp|bz_&__#H z-|-p#oi@Mt2l{N_nDc^8LuJwcBU1NE- zbK~+YP)+f?+tRYOt#9rvy)!DYMPgo?dZ-ylTrer4Rrp&j4G#R`@0)dPXQ_e9XUOJt z)m=*EM0Cj|tM7wP7}%UAzDKS1o46Xiy=>z=QtsljIrVy^{xQ8?@UD5#(v6Y2(9mKD zS?warZ=+j}=~>G2QMFQrb>=EDoNK-T?9x81zZ3(a_}U#@n)viSXt<}P5bG#%`AK`N z2XXNvNgA3%32&?q)6ggg4`gd|jg;8MOm(D<*OJ#woJK2)C`FvI0fYS6$(Gq^A=L|5 z^gsZK;3B`XsFat=d+AaaHg4tfL9Rgp7LD!5yJS}5w{%;UCDvrdlYY{xrehC{0-rK< zP43@Vs2DdL;+!2SvAfksbm+}_VHQeWBjC6~ce)bRoA^+5yVVpNn`_OB0cts*iQP|K z`i;ludUKgpzLr<#@_4+9k=tsdcvc{==j6u42TYlKl2%KDHa(KAxFl{HdG1XPULTq@ zNX)UQ3-K9t$ToUR$6R3D6lZ`kmo=;)PrbJAx$vxhX*1}`z54y=Urz<+A2DgU8M53i zxYK1^YJcy`6NVBFX`kysS}wR0Pt<7FfJLawYx98IB;R+pb9D*ok>Q*HjXn#*3D(=p zf(Df?(mwMu7X5kp`R7r%9G%R1ISO1@gfG_nHNLXzYjZ&D0S4B}d{ zo}Mhq)yr0vDPNjsFiF4mc(l4=)ZG=?a*_=+&Nw}rnBBv#{ zX+0ok)^$!GUEIF&3@L=)thzMN8C&hWyJk{>Sa>x{KHj!lj=;|G3>q9vZON?^JrCwW-#ii=`u_Hqfb6(vQHb3hn)|mGp*&8~z_+c;hPqf{ z#9fBP?B$^z__VA{x8bSF{wq$}YbI7Cbaw}VH7GQ;X}rY1ezkMF-7YQoO53)y-{L!B z`3Pd=!uj*(1GN$*TvM$_G?T7uCWPBJikU9R~+Gx3mSwil4c!agqpyk>QdjgnUp&(=_5^t3iWD( z{KvP}@bLvJxU|r%r_6%W{SKY)9=H<6FuM)a-uPFRfj3_ZFFZ>y|6FB85mf$|1Ee-THRI{8{IMAsa;oY(t zqUjJCy0fHGJkF6$%)Z4ayL#&@>6IL#JY}Z@rI)Qm@RfCS#Co(`l`|_%6d?HbZhUSNwO0r;%&P?*DhG>qJgRa%$h|xjPSRio| zet!zSEZcRqJF6CICHmuBaf|Rx4@6mQg-Z;lY>+3eeQjZ|=nJVso>Hk5@$1{OZ6#0H zSEilg`Gz7DWBV9oe$;czQsOS$43ZdidlC8-(L}T=>A&hxx0zubwIVd2z`&?BD%Ul?Fq67C6~FjC5jW+g-yy^No3OaHldCZ zLK?fxt71G{?Dq4T#fx({Mz>&ntunBRHCEVnogInk1dRmg-Fwt{C##J6!^jdmMt9bSqnc3u-GDBQ%JSP&1P5mQ z8H>nKbef^L|2K+pFUn$E!u{9v3dUfAx}D{l1Ccr8Qs<$|Z4XGW*A|?{YcZ~^Z!XnB z6-H0=;j}q4x13X;Z0?rNc&5B)C|n#26kgC9@oyk+;?lNR#T{Q>j4>f{1=r;VJ7y2( zlR6J_1^u814_q|Owh$xcmzIi)r**s>X4){*$<@6u4(0nNl$aD(=u)-R%08Z3Xacue zbY3=o_`fZoOh3g?`&;u4BjtsGHMVVu_qa&Pvw~h4k;=7!nUtOp*uT?^D#+TcIWeO4 z&-e;?+FiO=8RE`^e^bh5wz-w~utJ z&i2H+RP2>;HKTR=8EwQNd(pVm4WDCmp>#s!2_qL_yd#)|#aV+;jRP;$l3w#-o`y$u-0wl_4R!e*CX1b3Svq*$2$T zk871G)*-fzgrhxF4A1(xbTgk#hyE}{9PQpcIrBtUC3cwYucvk|GgV@$kLh=0dZy|$ zU;;@9i^vlfcE;1`0>7lNq4o)(IVx(CypE)MiAVbOMMi5k91}=9zUtuOBs9+4RA$$a zDoc2JLe?Bq;brqAwAZZVTSf8W8)ZdMx0CL5tibCbR|tyP>+=_-pwP>~sc9s&-E;)iXyYqHz(CA%GF0iA&+;*CnVAF9WCeznCPw;!!^ z->o{I8ZgIi_)PX?tx{^}u7ArBC~@v<9XD_?-7;*m?xWJagjKGJTJ3Alp@l{`NuC|D zxLU?*3H*BB+eFVv)sn_T51#(x!o{a(uVm-QUJ;b7~Mt8n(gE ze`t6nXlZB`d-|eNA3b_>vP0vC)Ps=^eIGQF=37MSyyU3`&$!(A?FVw9IcE5kkkPLY z!e~_q{jZFyNJmVQxcFgL503qbo!#-HlVuN>=ALx#&*yZ#+|!$?$@6^^f1hN=z%^6}k7eydwDiu|*Y#goGY-pP6g1N-2QDRy^}hXC_45f^oY_F2 z>}z4OIjNi7o?H*aB0b)>hxMkm08IR_VSa=px5~q%{|2R2z};m%p13F_J3my?pm_zG zu5?fu3bI)vL33}R2^7^GJkp|0?n{icu3gHE^i8HZ+w6&c-%qgZxt83$r*kJnvWTcw zdnaT6ajPu}_3_OYGos#~X<0US6QWmx<6ixHm41^I`NuNmu^89!+LIm6E25S8l|5+{ zO2u?dxrZ_L#S*o`CxxIeQcA*R?-blAI>&cRTkFR}D243%b?xLEl@nJl1Ej>hGKQ`e zPQk%CmHoDc`CDDl^Sw_npm@Y89&~__Sad}o3h-L1_m!6y zP5NnHR$ER$>(#0_)+QY)rA!>XeqzJ#$L7tL;QiDdo0UB|7XE=e+j@Z3xlkhDlGeQz+mREKVem=u+khP-}KKwW)ww@f4^`?buhg zO$>DV9ObB+(Byj7gz|)*^C{F2s`1@5@~GY?j|4BpC4c(ClO?#PSLfH`F>|AMxB7(8 zLqfbib^d;73`ld45=6w1sy#TWnfZ0UVsGz$L-RjMylnH-#PGA}c{&OGkaHg=TMzRl z-+ilgFH2cJ&42ps?#fORZ`$DfJ^Kpa%MmBb)cIUSD=%qwOr*$Td}};e2s^W*DS?El z-G#j!76J3zw+e{Zm*+`xM}kD21abwWJ+ntfM^4cty4?=Tav3QXe$=;#rtEHG0~HMC zW=8XR)FiyG+hk7&o7YsrAJJKDaII{VO?m{%PT_WpLGIWk`Ep6u;jSFb*IDFhCeQ|E047- zk@KgmF>Uz>nFe3r+y)zj>d`YY3j_tUL@xJJym0rvzqo;(G5>i{$PaeGVrTSe3jGK!%tc- z6pE53M*T*MN+tV=sQFb^+FGryngb8;*1aSj+aPLf_`_+Ic$ja;%KH*VBkWYx#xaNe zv}MzN+4BrN@~wG$E#*VWQd3E28Et}rMkz%QEnvnXE3twbgo)s{6rgloLRK= z;x@moN*2lJ=+0Qn)AA1q10mkZ*}YZxU{t;y8t{bsb_x`|-()mwe{?&i1j6)d$qE&u zg%Wym^{SI^&|c2l6iyJ(_sF`}Ex4*Pbo#V>NKM_tbHjJPqw^HFh2!bPV<5$KLSrsRn(c<;w-{CY<4)*U*XFjcwSEEtcm z{N&`R{@LExVOiVT(Qgl0;0Z+F)QEL2RjGs}9UhMWVqD%1-d>W5Ut{7XsLzwji( zfHHARtzf$}QN|ZVbP9G=$>>@&A1W4YzsmjXgsjmL^(th%CR0RMft+*rE2_W0YoJJg z;;;~6Kyw@+hEzW5_^5&<+OI6UM?LFq&0$vYW}Wz*53fVWTbo~m`;@eVW9hs>3_u4) z`2+)dFe(WmOHFd>bpC0VPV&*JESG!bl2|+rsD4LJJHIbr9 zDSPsyWj!WUE80Q*m`9=s>P2l1404(2_dDqYzi8H0Kerjh(ay` z+9GXbn}F^h7fj%RRK6;uUYb=Y{|h6)Ur)NXpT=m7)k(5Cq%rGm{RSMr1*ahyNp)mdOM$5q3O;t4CZ}n!7b9S^#S7;yg z7B+ROMvlPM1)u$j+SM-n zG_VBHQH8cVxfc_@Cd0a?@F;WeDJfrq^Jz`R0y)9uZDJj|qZRfYwua6zX6#`=jIc$m z%m{~XiEZ0xATf+y*o}L;jH}EZ0-F@bY&y*GlhI^R^t4ws9SlW`!d`P?#lEp(`Z}Zv#&~wZ2p_7SJL~z%EZV zO_+SVs~EQ?M_$#l=*qb9uwPSEb&+EFUiJ7m5W8e&69N6a$^Nz^3D>6!=B4&8LdSug zuiHEVkh@jwv%u=5F(!Fv2Ll*Kt=tR~P=?aURBl4N9+mW`kV$0xW9ji!@-}IEfbFui z>Yz83d#~0+Mn=}|rKPJJ0hGmFN&rzV*mum|uG0yJ;Yr6SR=^$nUbhf&oO`EbdkxQ0 zesOz!VFjo`XJIC(r910pd_jrNg0V%eZdO=ogA;0uyC?_h|5H>NqGCJ*O&lz;azL~I znEfJWSGmGM2#)96&VgbZSOE7~CnXaAqr}kqb#z@I5hF3wfoey!d(QYiBANGW-)nx! zUmMLKT|LewX8+@6p$ez}`KBtmAnp7@XgO6B-;|Z-Qiv|x*{lgDmhszW9Z6=<+n_M4 zg`&bkcxU=6T*q(Mp}I2*i-P3z9Al1f$;mX~gjTmRK$NIWk@kIpm6QDsthc&O)xY$` zEN^iai8tTLY|p=)`%A?ASWfWvI^t`dV@du_gfcHL4^MRyAF*=cDCvzd!WO6Ir{r+H zhDR}3F1UJart1r+Q`6BmafrC%!)eS zDel9M*VPF+yiCQNKT)QWX{CQz&E|@jqXD;tcTdNI+qNo(W_~Cekjb$Ax2g_d@oTrS zOTY&^0TNH6TndNh%!im0Ji0xfWRhOYt>N<+qHgsyVmmJjC%P(f4|``l;=$i$2tZ+q zT3?@Gl`R}l=*Y|$su@s3Wj2Se&JXp3Y|ZjY#3)qe3s|~5YhQwE>Hy5Cyxe8PcyoCQ ztIx(7h03?`l0$prr;$E~k~7a@NG~{Mcjjb5K@s)oy1}wpr{WbPRp&X~T0}2W(`iwh zb3O7zZU_<<(Kd>wJJ7tN@Unb99CitI9lTXa>h_yeXz)n7@wqKeHOwA667Qssb5R>vJ%t_srIh*c@;@QLUtv`7|7KcH0nRfk={f?CU^Y*HXk;kXfW zKAAsOL?aD7i?Ej`Q)B4v3YV`wXvH+K$N$(1XHp!_`{4Tv&D8j!o|wZH=K$1|YzMz# zeaP{*8KEFhYTs3F9=xW%JrN`CjB8Ip48bOv2b}NiY0fvv(neBf1dM$D`PYcw#)oPf zm)=?Ne*NvyB&RQ#ktp%w?qVzS@QF0JH~!cjxr-|u@*}W8?L=)`KYHW)hd>j-p3h{( zppKI<0c*vu;oT8%@ne7fbCewRVs*-ERBz;M)PJ*4zPm9|KbQLYe{8i}u=U;-TeUph z<|LQa@$}Ti=G=d5nEOXc?K(Jbs;Yj3)oVN1b8HoNg>KWkr4`47dAnzEh-Slg-w#SY z&F(bK<%6Ly`-0?RWvvZPwM6WierIc{a~eQu_}4;3sM=nhYO!lx*|QYZap05Pz8~X9 z?^95FHvhHX`x84S=UBjRA&sC1NB4TW$8UXcuCr0G6H?j(tTs` zo^R-nPkXf3E#r8#Ie|5Kk%k!lwWWSNsULzv9RisU+?j}#ccH-KjIbxa=7K+A0=u^G z?&q*qX4ZAce=g3M=Rny8L90}1j1lXKaK_&6)m6!?eYTqN(rhuBYWqP?D#xvCIs=d( z*d?^_!3JZ~Oyam{edLP&{nB^^RrR1X3?5T;sJ+5wJPr^OJ7Oa{m5S8tc#p@q`nd zdmGg^_ew<;w>GKtqC-~LXew`u#jM zAcrTx=<^PZ#I9x6*Ulbzhv4@y&}mJ8L@$8#)zs-yoKMvNt&A$&?ionXx<~)JE2;v{ zQ`TJDOH#HORmy7nd$xv;(iGGG=i>)-t5WTiLSp*4t~lgI5&ZLP%Ax&_Fv{=TWs^XZ zf&@G4k4v!w^MJwF4iuYm=*4)DMf5=)oGGIAZV;Iy&_BZH=U?h+70Cv!4+01)09?>t z?d`M;+NsO;=cixA#{O701Kwuc(%zaPJ+Mx|Isv~ffqiWRQfgTLVJxNCrez*1sbVv< zPgSwBWBzXn*ecqwQGo_pUEnp_t(NKuD^SO!#AW145=j1Js2U(`@9{0jPEA~0Q%43< zy_!%=f}r6r=t8dHM>&e2Dq$1F94vdXwSBplzm)0YVR^SLh-jzEASfV9`gBTBwJm?*mj!YLIdLaNzoo9fk7O%4E@=eFp|V-un_ZTzv1#0rYgDlj$Nyj>g-| zSA6F0H~~5hHTtp3d{=(0R}WD&EEclkhu&Fk;r2Nv24+&zvbNmj`EM==%$h+U&>L(Z zPv={^REM;Xtz005&E!-Oi(2cE>?)c`K;acs!z`Lz^4Iw5uno9h)oV&4d5gQiaVwx` z)5=ne>{4vFf>&SY=iK^CMtW`l+2xUpmhzq(1R(c?llvEOJI9Y_s_6N@+h!EMJSSvQ z=NYOoGC%0cr+>E2u%vE*zNgUoC*{dZSI(V`SWIZo+uQ)T$2)YR%c*m) z4OQ+dw});oR3P{L{K};5rC7igfO_kt*Qq4+oh4WDN+yKfI zJXjw?`cd}=j&-m`s@I?MC-2IfeafiM zV2RB4gEmu0Er>`fg%Q8_rB{N6!p*+4i0$(3}~Jpwy;(O72$}op&66EkEmb>B@La|3RGhzVgRF@hS1SAgIV{!x=9Y0cfff zQ>dzeT12Xj*Nx8!hUO08jNxg4ii&m3g!jF2kE>R29lqQ0;G(fbnkbW?(3QngVD z?QLKYn%af?nt#P7cW*9*g`C0Ms{W@*Mm)@~*Ed(LP(69~-~n>tUloBQg3ov`sVdh0 z$EOF!D;O@8F;$u>QULXsbrQ>NTnLVHQsGM&YC6KIh6>n9yl)Oo&ngxoLvPg@$*BX8fyRi?C)De|8k3)D}l zKd({_%}dR`ewf0y9Iq`W`70n%<4Py&CQE7#B7Yop;tC)xkF3CYBTRsIam&qDLZ^FA z^;I(#t`H9!TAAB;T>e6}a|qz1I!T;$KhrlGbKZ2DYLH4D>IZScC#iEv;BDcWcdfnw zUmTc0S$^ya1%GfGU>cIHXw$;*!gj$oJv}|~v#zQ8OGE-IJ~n6VN;^0yOMxFP1hu(5 zloCQsd=%PuWhlnvTR)#`Jg9XPuUVV_VnKd)BU6w&^RP3dG7wNcZ!WVZo-v4@b-Zlc zQR>j+3<(2+Di0eL^FXHVkfm=dgeuOU#n0!rhid#w*vMQL%R1O((>O=`GS>ue=Nv0F z{alCChNJ|o*-=49y9{a!6DIB(?!6P=2u zkb=;^Clo8l|K3%iwr>weor}EPX|@c{JXvGk=LiqNJF` z1kA;klu)-KY}q(QfV(aXXMHqFIY&1pu887UjLKrVRvKz{xC_y0Q94L6=Tt zTdIRDOB&_m2n05;P*BqDL1JLL;&tI=Y1AAU|6$<9hZcQ)Mu0LR z_@NvNEfsNcmujC$$;r$)cj+HR)o$gnZ4$efj|YU5DH+PmoXUZ`5%Oz{3ddgK4@d8- za0U0uThJ)VTmC~~XzrWl+YV)1nI6_#*pk5AU|tuTFXfGLmeb4Xz0*{4 zUssW?@JnC(fMzUg?ku}&r;Wbg=p0{#HL*Bgwb=jcP8eQ$EU=!q3Fc)-K z=Dex}irQhfX@eevu_}&~D8Y4)f-^7G^88w%lon1%4T7BWUSVnw} zD7LCy6yMZGs&H?LN>6sE0+ufW8LILHo+=iMDtNMfy{!1Lek)!}ir;?dy;}TePRL_Y zb@866mIr^;##|PRv7ss})R%{B)I1k<<+g+(5pcWn(w12{?#FRK<1<}zhC+xG?ff_g z@y!<)Q*b8{9u`rP1AR2rx(bFzR3X$+Qtf|V>E9IIPE7qyNFm-$?#BSgD24?4t<_n@ ztmxazxI`!9PmQxCXa3FTdF0xI5aW}VhVrKe3C0dUvzPd)NcGG)unNo#Bp4R|6X)~D zJ#j&OP_#oPzOSuuyt=t#RjQd)*}wC-!SYS7wDe`Ao1nv zWIloB`@NJ5Rl)_DhXG)C&^w%;l>b9{XpT`4hO$$CK@lK=(RN83JCw*+Y9NM+p}psN zi=g?KK(@yPs2Kl&9RQE-M+{Q-MX^bgLoRRVv|aK&K-$_)OhDG*b*!n>uGOF;dUwa( z%q9M@&-~y$K|^FIXw}({fegBR>--m696Y{U`hY9qlJxlMQsPS-`xwIo&NoAV9EAI- zOWmO)9UmWHWiMTPQ;;P}yJX0$V@Vk@WLk3B4nTwoniNg{7rP%($^ zsQd300<{xM1X1A-8q zD$oDA2RS3pK9#*x=qB7DWKi&i3WPyRa0HTE3bN9N>R`~M%0a|a4zdsw>9cx)fB=bV zv8K?%`~WIV+;wb}p)uNUKiT2E#1G(3#IW6c2ai^!W`q0G2MI67w4mk41Yxsbh-O)t zReQO|gtLm;K8MTSPL=^qVNw@@A+L|PBIKd#c&8kM@=|fpr2KtZ?w`{;bQ|;7Xg9+) zeEmK9df?f*{=O^2SD5%kb(P=8>Q1FXMr`^(;@;DWnIqvxPFqsLY;1$`Llv%RWdMc8 zf=Ol)x}d(t__pwBCC?lX!aK&_nQeZMgsA2pB9&aegTX1en$NC)z;~dK%SoCmVCJkz zv2|n=r|j@AX2np}GS~63wad8;yrrC>K+fjN2FzD1c9+^D#?KG!7Bz5slHhKaK&LYv ztMSJY=ic`9(F8CN#xNt04cIKb!u;nf9^|Fo^J#0~4=1Oett;;;e>(%s(5H|4?>ZZ8(;;uT%?nnY}OdmBsp-z-pZsa~b zK&8!tak79FS1pQSU-`^Ey-zP(`6uQtB}5HDrnUEHeyT(kF6O%Us5kOl-+OI_ zgaw0b@p_rzf%A!;Z(e!6Jh7m{Jz@euM@S7a22fqcU4aX%IwI57`qzL5 zySdq^tUlYougAyL6gK||D)%*xY?pji-K7$A*2yt@I|jP7xw!lTRmosY1KY=c9Kjde z6s|h|Wh7TI55Phx6btkx1CpVs`;9?0UBH+ghMr~%bzlt^s=hdf6l(zmAJ0jF=-oV6 zcU}p?>aT=m2{&Kz{Zw`hY+y%z-@d_OHaYhZzX^J!Gc~G6hSkSk9t=2Bn6JN_YFip% zfpkuF5Okd;8($!=)C{A7^Ml87mfcW>Lb$)haeT%CI>=8Z2^!a=&xom;{|p7XAI8~J z3?g^6$K->QtNc0+@1VW4B@iMLrp5b;=H9GKHpNf-%=slu_VidS!dajy-SR zvScWQ-sca<;NatbmgSkSfiDNgnyR-j6vl1L-B68BAt#pKBosKV zw>@kkX4^}av=iUsZ)Ucta>p@mqb0B0aZJ&}d%)jd1GT3T^1ctLIk8J=@l^DwxhRmg zp8hTr43Yj1nryzbO2!@c3UGXI*cm-AH3E({K2& zsg8NjU39C-%LSyDfvlU-Yn%mU=yJ-&1OxY$Xslc*h*ZAvc-_~Xoack@d`miVj@?Z6 z*S&ulwgO#$Yc$zsHS}{n%X;`Shv-Pn)hTiT&RSV%~ zr!IQDrt_C|eozx&VeV>kH9*5cAn!D@OYq<1ea9llX66)oS+3jOV&waum};7eshqx+ zAy^j*Zb|5pmxFSLNyo_z%?>7T+>qi;kMS>S(lb8A z@VJmpLq7}$^2|C>Da-Em-YjUXh_AtwIBG~sslsU&K!Fj`3P80$p#$EBPU05%^>0a+UuXao7 zL}wqi6dxXyrsU0~CoaL+9}Upd^*m}NsZvy1OIPhJeqUXH7D;T|b8J@juS%gTTooRP z9$lLC!+2u`Zgj+Vug|^d3Xlz0RV^kIiItX6!`tQ;Ud6E`7Y5^#=gf&QL7V47SL`vp zrbWjD!*-8chG3!ZW`x|yEt+uj?dz1kX+w0vGaG6cGb-f%?A3Z{1Ifx!)!WOv67O%` zk#1P74Yi324?gVQYWN}A=z%5dSJf(0Qn8SY?1dn-bKz?EM+!*7*Knkg&@# z>{iLLyS}!}T0U-8h*KD?g+7 zv==0wud#nq@5o%fmHxAIfS{_cQZtp_z%mDr!I$GNYH*ppS9WZ4@7!u<-;rVM%3yvG z{UI)n3gq2G`j;6NZsU}H=FGLg zbfM@`ic?17bBWA3>%g^*FC1u2y$v=(@=P+n(9xh)dN=A?Lg_vZn{pcw@H?env&cE% zIqU0+e4qfB%WY4&a%SC1yELNvUQ7r;Y_znwtHsy~p8P_01Y@;&peF#2-|^eydR3r; zsl}fk0(+sQeltF-o%x0?_yU0JKIe1j0@A%#XFvnb0kpYs>$K) zdlsQ}R0n!%oF~att6u{ecw&7CQvO)1SY5qUjO?q)B^W~(_C7YF{@jh@Z}09-EfGU~ z^Z3zAIVGP18P;~ykd`-XpHH(mu4ap_?XD59Bjg=OWmmD@dtraYT@ArA_bK33mxkpZ zG<*Lq{z($g&$VkIv|HwFAs2hBj8*WqqRaxf-NajzTI8VW#pv|i)TZxy`uZ>v&qltk zpBR6EdLv)NdOh)_-<0P`gM$YK$2=c7!nB0^kE0SzE*=SDH7=;?IRQ$|!So8~+zqBm zW753f#e3C;0|{;B8qHp3{~i!+Ii!C9@Ym=y+*=lFLGVqEp0!j4L=@f_4b zaw|&O&9o(XUfY+jhBj2@ed)XQSe^TEygb7~Z{M*8xHGALXUKER#=QWz))agO@RuWm zG1Pp5U9ZubS-y`Htv3_?r5Tbgku&H1=X}pFT?>g}Sr5d|$US{Qeyb)v4%t-~Dn#3c zcuCX_&WX#NpJMyaROHj``5oP%2&Q1f&%R@h?Bw>loUW| zMvTv$*U>-9(5jF7L>1cjP|I?O2hTtTqVyw-Sd6^n*E9Vql$y^O)ka0OtIar_!2j84 zxT%MXa&8@5tbXGG_(J49wTDUG?OO6=uYuD)8G>pT%17cfGzuh@P7ViV61n^*kNeVR z-P(m5hwpX>NCoxfnoOsub~HiUK$^Qs{JT%UbVnKyc}O+4WCA3aoF75S1TF(13fei>2A12;8reyx$tn zMByB-3$1fq`t^7 zgJX~*lCl6^5(KQrqjQUj`eU+7g^cCNtMM&K*U~I1;1X>dWxsl?bQj3kPeGlG>tD%b z2&`072pDHLJQVnCf9f;@Uc{*QD~DYrP97|Xc=m~OrSQ=Q2B#5 zS8&?JbpSFpfoaW9C9%YIDo%Jc;0po+0{dX!K^}hqqE@xknI&gwk*diP;}8Q51AEE& zO`vmQ>{)&};@3zRBmm*=S!FxK->_1^BCU(JrA}E%+e|el5SBnfzi3wXhuMcp-E!># zFMlFn8>TVrl%5=kbd+8@;_&OpntY5H%_MDUp_pDMrp~fE|;5^7_-dW+dnU%QL#K%8@ zCUo*;TBNdXJ|}v*t#>9c!6NrgQ3f@SsmLr*&ym@l;#i)~-Ue!_sY!SvZ1Jm8`Y>I1IU^PZ@DM)kKV~g zi77Umw!2Q6;*_E<$597nUh7Al7X1!#_mtemmaaV*IA|HZOD|qi!xiv)JMke2@l;?` z|4nc+fA$^3F}$QsDhU)zv(S@eZe4{(R;c!Q5B=Vr!$GE%v*;$xM&Qte+`>cZb1i`<<@NH@IkM zQVSzQrx?X5au8LYA01{A8vEB*r&$byXqzP4teX~fB+Yl)x zH2Tjztq5-ZgRWgG$Zxq)6 z0zExs8}q^X_V)q5Y6xOWu^-l-yv3cxFlH?wXO!v2(-d98 z%acmGNp)32>l{P4kh-F-sJFekkLDn?PMsHB2Qk5BrpX8>2J=N@F_jt`aM;SgkypXg zcHlfelfXQ*0|Dr005$qqOxeN7E4J`xytzv?pQ*hUEdoU*KaD;8c|H~L|=3k}BH!gJB~kA7eN z1aDy4PCc6=G?9Ljc~tO|Ho`jeZX?R2^kQ*45OWvc&^7x{tA55v>A`f6Q&M3^!{OL?qEDd@4l%jrTwqWTv znhz3bx2gw-ac0*-9%r*I)Hn?YQ!djkvre%iqj#uk8qF3!k%Jd0U;&%aATRUgVF+CT zbgRtOd1F;7c&aKX8=4~J-CaWgU{LKL_<-qSGln#VZ~nAj_nnMw>tBXwGNcWbL=2la zMLHP@B*#IO$r=6-C-T7MnHQqRn3b=8z!~B(NKxya51NWC`gAJbb7W;Ij4-uGK1;af zDG9Sh4_~3~6xDlYL)*KPcz73p-_SqTM_$jIznLH~#gn108UWY*-7#~q zVdJxTVYUg^A;S8U?IQB{6vz}=SO}&HA3ItK<6|uK`N~zwT26JWe=NeO2l#9s%5Yk9 z;f&)Rj)wyXj-;@y7GZR&mdw(13LoJ(w{m5ikibI5*6bMHx-_vyw8^>#LNC#IE_96+ zfeYdlNaf~0T)9olD}uk+3Dfv`0ltAl>z$rS$5C&G(~Xzu3PCpak{EJ>IE@PoeO&>* zOf~$aeIbjw=KA~E`kKQiBx`99b*jqTg&qgohS69=Qpz@kh2tTTU9}xX$bZ#`cz4eP zdxP_ao`RW{LwWc*2!e>wl09IcZWuhwDWrO*(R3JRKt!^>$KM{OU8UuVJ7}7@T zii1q#uJ}=XVa7ZYkLfhdY|@ufzNQkT(o+tP4*1mfy5qG-THBjTU*xw;&lXqIA`j)j z0A$><*y**z*^OSwE(mL|6z98Sw1cc~ThD_;ALNDS`KQBBXJfszP%>JV(^*Jg?aEnm^ZIt*u}9^^on0QuqEb!nIgDq%g8b@eo;g~=LnhNg)caNha_=IryJlQY zk0R4oPARX(asN1ToDh4|bHhr`;Zvy5TknJO`$K*NyvW%fgJkczy7&K1}?^RMmjLhABg@$;+yZY-zg7~w^VhwBN8wwvz+*{EE~Fif@gXhLxJ z&b|Q7z9~byC@BOr-zIqH?I>vrPhLneX*Z#2y@3ULYU$D|EOJP|)s8u64R_qH_y0Z9?J|hN_Te~)SY9e`NW6(Jwwl!TYuB?vLHFxmc3V|^ZGnXv| zfjXw>YvXQ;K4LC<{wydLft!a3muBZcXVRwpk4Y|f#Y2ndy z!9mKdsB^O71Tv&nqVE2*ai`>Z*fw>#s&Cq`DO1KjE+$3Xs6lGbH!7xi)vpvYu!qSnAN2S@Q$y()(x)x5 zlq-0zz89XZCQGSMO{>5K>PU;klKYvqFFzJ4ARCEzi+sNL%3=4>t;EhdiWHc>inm5Q zp8u~rsjm82fJob1f%BIn{B!4GQ6?4bw66p#GCGZaz7PAMz^Y$(yp#1CQfDBMy+5gS zt)5<_6yW*anhRth{c60`WU$ z;k&Ygv8~?6ysepLKhOeyIwlKt8oYfA1J;kQ%9$fD;xz&DQS6cG&5v{s72eu}$KEh( zziF>iZnyioEBlmR{Hb|WLbT?+@~{AKJDfO$Ep#Ia+|0d6;#<;g`~BXR=hi%b)bD9{ z3+b63>49P0&3lY`K>`+C+#1k!QVb%UqmR3#QYVoD5mU+3Cj%h$6dnYL-KN6<8gt(! zO&>dybwWjo;%N2WyB}piTu;wGeXejqXS-L+?CiUIf%-0gohF_H`=_PRGmdnakQXzu z$G58Ip6>D9J0r`4u$=1+;<7Q|yxE!7a%^?q&^|@^{~mYe#y<=ZnU`PK=*dX6HoQj} zjq((goiw~91J7$PM32(vh^w1%$FRV7lX|78|5U=;;SYYy{4?6FOS_5up9Yxsfoxd> z@|3Ywh2=Lo-wWZ<-kDe#aRvN(vnL$57DBu5T@mwW)XFe&+p zX>Mxra$>HhQrXgki{)@{XAL7Htlgf%PP#FhY6?z}!uqF(kozzfP{%<-v7lX)P;vIy zj@bRwH3NYOuQh@^*pN*6gqsj=F**vl&_Co=!I3}N z!00b)xu{NU26IvCCo*rBVQ~4+>x>fIk$>L*U(FZ%_a|1}Y@Pd~ve3{N*|g*s7A($Y zoBZU7$}|og7om3^PnI;8ew8Fz2A!mKBP%-w;+tPfZE9R}oi7alKzG=uvL7L+(; z84&1DflYx5!?7dZ3)!p|miYTI>q9O)JiK2jlK}d&6DImFMR8mR>7F~jrQj!W%0@91_ zQUocL?lM4X0n)i(kBRcWzyFTsoO7|yvoE$6UMM1Ke&=`2F+Mc}`D(Is7`Gy{%kiLA zowljk{LBUULMZ=cajK8!MvNi!Vk%&PfhzZPhe|R0^qNJ3r8bY2OF>~0E$Gk-@TM7L zJcv%JfNo|GN(>W#bW)=yA+V?biuE=^f2L05S<%YgmP(hctiCXiluI>d`tQ!)65d)3 zpcSxft`vAQSY{19XUPa4uFD)4iT4NzX$- z0aMEXod!dVQw6~8)0=l zGV}*pY7u~EeX88R=QdgMv{;U-Lh~$#xltkRM{TY{R>kxhe14ZSi<+Ui^DZ=4Sab8Rq}Z1taQ#~8pl;Ht^4(9O}qI2;a~`3H}sq&F7N z$!|d<*Mtkag$CUE4aZIl+aC)Y1aO^w-=Ty+o%IQ*Vj_Cw;e9%BIj!x({QKP$-9WY( zxbHm(4g}BQwaK?ZSD`t`1sqSnNXK4t@({gHe`whL^d_AAPwM(8FoT30JbC%O$Iqjx zyElPAviM%?ub2;Qz}Qv&hN6~9Fr6M!$9?qy?4l2L;*8F_KrN=mk3RZa;{%m&|YJ6~80_6Sh0_nYfbcDX4S|y*#WJX?cFz;W-U=Mb~W)D+M z2{Hpqquz3`>N{U$x>+~gS-|^Bbw{k zsa=e*uI0d|slcga6IunA%J@V920B~e59w|$*yGP+A5Z!P#_(ZNCpVfq4%%zORqmo0 zh!p%i&=|Nkl=VB#f0@1_Q<63xU(4C5MawW@)I2AWjTbKOqppXhYHV6Az@lOw$r1np zd4L?S3aO_yW(IDe6e;`2=9f$MUs3GK@~v3Fl8TnS`23VgB)HbFT+gKccnY5H3+RO! zm(u3eGd^$PA;sc<-!5MQ`SI#9zZo!`&3F(*87oio8+bwdRt;e|O||7}kaU@*!&JWc zQH4yUCIBR-kOv#w5B>BDY@D5Sk3)szPpVfsJ8cPZ{@8>_I;-WBgKHg!I__bdY#&vZ zi)m_!#@@3A!K`SaYC8+~80d@qJ#)YEHC}>9z+jqs9e}@iA~fP~5&T@w%iOBzlamqqJ*1Ii;VkB#I!mpDK0Jszd_b3A7|yaEWe+>98UiE4qaHU+V>}P zVKBS$z)gyMcOhXp*;0a*AGA;&X{9srDM@f=HBWSA&@AyT6fGsn9tq7P-Z_{K^U#4w zB-Va|Y?dmFO=-#KS)TN}exNU55qbF5;iR^}?7GnHuhb`e4ypEqhr>a4RXvcFciX5O z>-P%NTxs0F>e8I~8}mI^Ja6(!KE^6D(#@sA9dntsd;eh{{}H%9EhoL=*S6?Ls_hT? z@hyuvw-nzUts2`3HItq~pR|4zUcCXMr4TU(nX0rS^L(Qvb5*4|4Cf^LPd}mMOI@b_ zQeE??w)?j2^{V$%!jC5fl=o&#B>F zu0IV%KdU6wXYs&A++zs&-1``)>jZR|IvwB|E(avrp+cjG|Ct ztWJJEm7a-~-|;T0L&ovazmsLls?0JCDhlOh8-DF+eUhT$tiBWzZ6@Q-$41PraYm-w z0pX`?2RP$!%%}as0Qb0A!&-dIR=*0;uf9(!@0D((s!KDkFgoOOH#I3UO&CsJGO_?^ zxfEZe2M^v}Qq6jgRkd5#R7!d&eK8-1-{hYnWrtWZ-S_P%d+S6~E4Q>$3+BZ(-}~6q zXjtnF@TCQM1kZjF`;cw4$LYE{?lD*I+@(`J;?P@n(@KH#L9ss^gxZe*i74!Q!BKH? z;gvJSmacBH|L&!g$MHkT!j*7Oqzt;)7jW^i3MTL#ZvXXIA8V!W>P7&UMq{Y;b8Dpv zi9VlS^4^>huI3TXddSz9TGnNvjt=hmk^_m0U80F4gr|&^N+4Ga4Qm~)n=ri&GJ7|= zW#;%!-uEt7c52IF^`gKb@`c^!$2y$8>Gp&&*M$Q5Rva-;CL_ptJKj|zK8x$QK-wG2 zue|0;OPhpsR0POgUCj`8Fj-gz5(Cb1>Luza9NTWTFOV#h z@QE-@HvvmvGFVo;)x8j5HzOP%J}}AEiS7nMWBL5smJR9;^eaLgq5D`lsEV{1%Dt2e zF7#8KEvDLey+VhUJYYy7!Zj=s+RJKg*pa3|*)01}K4ZuI?XrBCahX4d5qiZWR9nswewzq;`YR*iI`4Qu84g= z^0Ai%fSRw+(_4f>d`z*1K~K?>_|je9a(Dfn+53JAvuoqaF1_eCE6XeJaGf9q$C`)m zhHmNWR!w2v6Uw0cMPr?KaX+`tuBFVfx#yX1idP`>z*wQ<=MW^P$3H9xNAQy%V*y~1odACRP!M;KSw0yyvS&KGR>}8D!D*u<;L89 z&59-XR zhV10dGVzaTrgz2?iXz6apc*mfEEab_3VOew6H_<(l0*E&^LUJ!-}e?in!z1vw)FBR z!$>jsS#*tAb+}^ePDasa?TWKZY2|s0fumVCqRFg1CSFW zh?)8;hL*Kim3IoVBg7>8Zu%RFGJbe8VAhO}So0g zJ(bKyA&j;FB5O5dlYG3CTgMS0UwfKjNTTK%%YWEIGE{dvVE5^bu5Dzude5UM(3(a2 zCHzAu0=|TBGulJuqa}6)DWgC}@TGNs*tL&9tqpXr1PCsvLcVVw9t0No zlv8e-cqz&s72xIu4}>&^?EHDfClOF1C#7sC$?n*Lh=vuywX9!9+5Yg6?{Jq`O5i_Gv0z}txJp$gT~3V?F4V<#H-IA@sEvs6Nhjx*{9@{zytG)+~(}hD=%^Th5xS zA@bFH9M}lFg{cRSyP*&HT*c-dbBbvP(1VfW%8X7tep_n;Km|<;N+By9LGKDk8=I{0 z-AA7E8AUIHeIa+-$k&dM5Cgp|QeZ5>h1ZAd)Zlz4Q{RFUE9czpux@C=b%l;spZK?j zr!o%9vM!gCx`LYGe7}NQ8+L#*YjrzArtMA5(eb1h>!+(sAZSV@K%YBf4FObrNCx+i z7W%#9HN+)FJI>W}3O<4+43DJCBTiPg-1yjmJ2o(k!iFJb1eW+2&IJA;Ia@htT@Ku#8xi@!=b5z}OdPEDq6L9#r!MPkgS z?gnOzN@lvMuea1$drTt>LaBe%3hEL>gj&6~h9MWCb07dDF`->AL1|Vx0yqtJna?K0 zX%O(6UQoB3%#+Pf&&O})8Uf)RBUK=Oim}`Vgf_?KXBnJ#a4H7Oi(^ZM;ek5r$UlJ5 zj&CWoo|>4*P1|$;z&^V@E)z{u|7#r!KEk>sEk+NVG@(f$OUF zhe~Em<@ag7`{zM9QS@8&C?%zqDz23sS?l|pf$9Y3R^qF^SXmOmm|@8FCLti=n%k_m z8{nLvbgPlJo^+AozLW1nRP%clb1^yR9_Mtx zG1~)v&;BM>l6VnYxDn9_$`6o;7VjIx87Rkpf-?p$-F(5f%bBW|14Mfso2-qL7r3T? zmc^lrY}{^LsF1lq-+w|6%7}VrRH?BF=jUv3~ztlyca2~N<$ ztARw(4C&#qoE94QEx<;n)r>enKD&^`Xl#MjK;dMstah2ijQ8Sj+^mQS~hO; z!ohPY zbHZBdk)6dlc`c0(u34~u-pliMc7ZOk1r4JIfHF~@Bt8^agW$61u;VBhyman6+~uP2 z6R5JAhQhERs}I$h(@TI~6^RHQ)$)iXq~-!5wEG#>CEa;JdC0zQg93TPN`?zkT`RDJ{|4{bp3w zY&SXX#)_maAqm%cJ3I(urCWC$HsMFa$~4s&sprO^P-{cv0*2|^Zk7#|Q*W9h8-7Yc zQRm(;eDiJVO;nTwld@S+a6(=>##&N8yiCed*GW6-M&^dx1;2L8t4vwn$7N}I6t3;M z_5-+UI)c#=37H}RD?)jCxI3TEg=_w(y4O(^5GuW7B;<+` zP%di+SF&bxRhO*^=AD&IpSq4BzX`v;f1HBjp%CIx+CmFkZo=PYY`a%8>z#I|6qHL3 zKO01GP|GVQpTW5+q4+5!rOE5*-2;GFY?@iU;oJL#qZtYAHXywH_Ts#;^E0FdL;kz3 zFP1XW_Hf!|f6bSs1hj><-pKj2uuDa0(ECX}k*_y)vV4Z6Sv)r4?pGG#rgKYtIZ*Q{0b&;w^M{c1AEjzYkB|M5Kba{a{G0WuYTpwixI~dw5@MjkmlU?#xBh^0l4@%15v8Z-deK>n_V>tH*S%{jMFJ%w)2^e2}pW|Um_Ff8U=zizzlXndvI+m^KP72wfeF>$_160JL{+E zGF?1sir)9ULh+w$cy!`vy?)((_b_r~^+ABcLxkCn=;t*7B3v4C<2<>4J}oQx0^so7 z$X&-A-|?&*6x{)AGVw2G?fskA7FZuq`hj{&9cfR@HsHn(=UUBP%IMvU)Es|PE zd|JQSenQ{iw{i6N?Gyi1NNkCO#1yBm--AmbU|sEl0eIlr^eg9?GxMbLZ{MQron$5Q z*htdW9I%LgOj+IlwUt)NYt$+M4y@l3ij!zDsLBL+eZb+<$C!mncy30$qA#7~j- zU3|#IszSPBJB0uQEKkQp;duovXmy`S9 zH&H90_;WBVF*8etX+`he# zdk_ih4vJG&PV8k^XBcZ@2ENK1n1*yn9&Uje^q0Xd%ok_Efj>Vyk;vISgdU?$Gk2lT z%|j%r{ql6wIkP`22_bSW@Yf=6sBRNbU^Y{QgKl7K(}(hWFH~q5axp@vk)Yu=Rc&8y z6FSp!XAH2^d?4D@41kVvcqc${_|gB+FQQDdHoa5?ObYK#iCd-!>|726+3hk^?NZhi zq#5CXf%i`N#R|VTc?C*3z1GxYnwAamN7u8H3K#NKj%6TQ4gi4 z%W<^e)$*%9YXcBpR#HM>ouV{rMyYPcB-STc-9Cr(G?7-5Lm1S5a?WE&qpHk$*l$A4 ze9xuB2M2FRW`OvoM1IYl0;P749lv<;$-w86UpVZpj;IB)qA@Sv04|Cd{SsNLwv$qJ zR55konONc02kUGSZT*q0kfTZRTPAVDZ>eao=?KOHASQiR~_?ljHHIOSAD zj?~32LUDB`ySAR8rgP|sI7;M05=->5bgZGn1)v-`l+4_C2?U%5K&NGvgGv}}&B8mU zzM;$pJLFoKf*V*RNtPB#w;T8BW;?B0M*>)jf^?Sv`B#PJ#dKk;<$jkF96NZA6WaUM zU$J^Sg8SzF@)nfB-SDm=J%=>_FRGAvjt3S~E@%26Pyap88yAj7JFr8ex5hLkM+&E6 z4!RDuwgn}bX)aK@t%f822W-fxEmT5T14pO7-E+|R)RM-ppojGaUU8?ih2naT(u3nO6o>9!fBp9dnPTcp+pJ*G{txH-svv2-@Ob z|Jfw_U_X%kQHrzUDGqG6p$*VSn8Q<%?nqHDvwhO9wf{1}g=&fg8P-8dQRfn8vRz{ z9A|MoY(%)cjjadmMpwfj6a(dCWWa18(a8d!Yhbp?aDhBav=N#|fmuB}r8w^(PP5Pj z(@AQ0MU?e##&1Eo$F!J(GTjlZtdU60UZ%+g_xG_nBXya@zo;F?;=D|uMVPijuua=j z`|rfJ7pkQ{I2Tc4{;YMKDvJl9=iD$wy5AOrQ1^gx$0FrjWOb6^rE&Ecjta|WS+IvN(mm#UFz(ZecF zdGhY0z}WH0S(4~V;P|@z$`D(Epwj7+R*SAxOMs$yX56R*^~|y@+^4|@8cOYLrAHy0wtM&ExW1ytH>6V4bt)%C!? zsiH_T{<6xs{t$rBW*Z0zP#>oYeFmB1Z@xtF^B66ZiCK8m0gNDhl{c;GG0DKw`)28H z%_NNcoMom{?{2{faG*D)fcDCRXTqi`wXPU1p~vgc)Fw=ZdU;r}m9PH(&16I3`S6~W0 z;GL_dGR3EomR8!$FLlkQZunL`^cZA~i9bXn<4Z%mPzeR-w9wmXB@!;e;aQmah-(h*yH6AYLVbJ zdoZm%k7e7#c`BVbDzv$G&fdTMbWCqX>{iJn&a%>>&!=H;O0dZKym-mv1lU^TlU(_j z6>*%nwX<{$3pj%3$~f#0r^2Ug)i(i(lvce(ww1w==jZHm|J5*9H*J=}_gsNmz@^63CN@JAP618}3+8db_C&8pv%6j8|IrCu^pR-@cL1PuOcAL?Ie6CzS zf@hbS`@fVbYo~v?r}JR7qbTK!r^0x2YiOG4rq~C{5Kp#&;FrhFj6zUqy#+}lb;dL= z%+x9k;LPdOz%5oyag_HS@h?ymMDJpM1q8e~fIu1GBWKI_FH{>QX9hwNmR4X?*mpik zCF2VrIPqr7G{-<`=!pZxwxA?I5vG@V=Pdxh=gARl9WIGTF9eJSr}t8NID{=c8}sy; zZ0h7V)Li6ST=kC`@*P0Ahbx26+Ni1J9Ll3$=3Fitkt9OP7Y9xLs4!_A^*<2hm68K? ze9C=xj4t1*OMhJITb=m@r~uD#vW)VhJW!HIDB8%h`n!H3ym4kSOfl|A2XfL^aQ z`I{yq5(ZyPOIOctz&6}0c`jC~nK`&s*#&X8*|}E@L=R=%0RJwv5PW@P zF3qY1$;3b~ct9OzA%G&}*40KFiDh12t-(s#T5V#Zl?!!fIiWs#)IHjI1rEbrtrXXE z(H%Yewi4Q>HcRJensJ7S)he<`L15Vrb(vRuaPRZ$OebX&3 zD2ouhz68MOTH}%}<*@M&ZIXI*xm_i0)4l=~AX6%RtnqXaK&Mk}1rS*|)iPZ8l=HkR z#?1(o0oTPIMF?DP21}!xe;2fQWoF1i9yY!KA5mgR5&0>g0v=G_6LCQ`;Gv89bg0x^ z1A`p`u5Cu1N;43^dOe*lFXODmd!(1;8`3vSDm541=#={H!Di)g`nF)iVB($EqJm*> zIVAr(Z~05`mSf(p!uwnl!zHE`?Dnn$??c}Wm8>lHa6tQ&=8XwD>rW#XHG`I9Gm;+G zOO(@BqCopYkw|0>Z5sOlm{MgCVUk?idx)ePsuK$8l$re7Ory#MN#JW>X9&0%w+vuH zzqc)|yLmR9&b`v|dfSg35nX)Li#Xk8y${)~bsI?X22&fSC|bCvwP~s9c|k9d4oSzG zL%=0~y0~DE=WJ?lX3GkAO@hSnUcHds%Jx0}s#L^^>U|drDgX(fY+3Cde+nYnQ53Gt;51ylmD%7OJ4C+D*7fM* z;@MKN^)7bpkQ7GYR*Z${76N;aLo_l36F;b%cxb6b~IYFvHSHw z$3CYtC4o7=03ODUPcvY&kCbCL50eqROM}E{Y3kH>PBszt#8$qz;95^eKhtikFSCr5 zG8uw+nyh$&?zn(_#(MwdD;dA!Z6OX*@gm7HU(h)J`8kFaMnnmKt+R>ZW z48P`~oZz4BPU^|Nx5wV>;Z-gwrv8^abk$@{B3)@|xb#850{6cqd2Xk8KX|$x2bK6cqKM0pP{!dw1vc1B4kV z!!%GBT@it=0O0*+C(IH>`Osh03(d^{qVO%b1kG?R80#7Fx@ev!cwM=SdO&1j1T2_$ zQDt@Y%~C*Ts)Uw6klc$#cQ}EL9$z;9H5XQzBx4?ean*o6NC${Qo_@E&zef%C@X+ES z>+QPA&W8SGhHX)CSeFaWP+a`8KAiB*|9*D==P4n79Ooy1n6%)9BS+?NT3)FqX#qBCDaQB z9b5xQ&ICami2tjESzQmNv3U3pN@gwdi!(#QcwJaRxuXkdesJaa770fMH^*+ljflKe zeUK+L$tNWMJ!cue%fy@C5bV?mXe6Bmm~Bz?W2&ym#LnYpz_dy_Lqzj5)wlB}mH^Y< zzdB!HmKzUF#~P21h`B}nMY0p@cyW!|TqIBS=ze%`jY=T^XhIiRWNbW9?E?87>>-Fq zA5cCFJ*BU)3rYs*8v-Gz>9!C$2B2Y@*O{@KFe)VrD7kZ`F)$ZS6&T@x(7h9fo2gC$ z6Yn1T%5w}c=`y90_1OOq{9O*`yzPRN3ODZpUCMMeJZ zCF&phO|i%=Ny&DSnk3sLd_)if>V4}MtAhR|IGMA=f$u(>NzhB z51|pqKy%~#OB)j3U^~@t)eV1B>A9WOtO`-DJu05kXjVAzOFY{l?<*w#4_uge!Cq1a z`awY~$q*Qa%p!V|)CoFHi=m~$K(lFfgQ)kg^#E!~Y(h%R6kJGFT%$}KzL@5rat9lJfa01hqG&<~<(o6PZ{4t@_oWve^sB}siN-<+ zuX+*9_~a4W1n5LgL0tm7fQn?B5z%kTyHDM!MLl$}Wm+*g@i^fe+0^bE&hm!hMTh*5 zazNXKfVCNM$1#X}`d0vOoCO~a!f&?E&Y&CB`kiriDE{##q@`sEIj!yKFr*i>x4PS% zdRb$!8->>K_@qkQFA~pYD}%ThqX;+W(6kn#$1-A*^7l5N2v>*laHA1y`@h8SFji#U zr29pc`IqytN2aw$p}gJQpMCq=tl&cP4f7$gK4sFu$@br4t5%v%6ZL{}0Rgjt=KN!F zC#IM_wEQ6;Juv;sl#?2?jwBKXsRj2XY{GaYH+4tJhz0v%%tQ8X6N3HP(=b z*MEY-3bu5~G^qF{uY?xJ57>GPku7qmrAjcBp%L2{?OVa6_8)S@_0ViiZt#9_=F6Y6 zRQe>&RK+#XXHv)4{S;mo7Q=8c_Bb`1KO4FUFLdnT-;aOr`A5`11LGo5lj=^U>0?r1B- zbDDyo#zsGWVI78h-iIGOWAf~Np4s0po$y<^K$7CAYa)afpY1m$Hv>kIwRIfDw6ZWaO7rR(CivpM_of` z_>qChcV;L~#clb$tgB?Z{1Z@QtV(?HYL#4&JQkg1DQ2ed@YD?JQ={a5fAJ)VzAJ}) z_>9hGomMm=mA0VW^>jh#Zhh2y`NdxCC?Qtegf59ufuouIibg%r@2!n1p20=mA?|;A zoFg-V?E;9}F=iJb07=X2Xq`#G#1`d(;pu;${;Hzl4dF*(U}Ba!`|4a6o2ebyA2$7h z(s3E{NOkIgOWJmkBIl$-Bo*j|RLIJe-Oh(BJF;f}^y@w0QT24hv8v;<9Lv~HzDYRw zL_SVDHH}HM_U+Z1C2peM%P~X3A>waM5-M@Wn@Rwx zB$H1k&yB)-jr}yuldKdZgpwepqfs}sX5-j)0k8GuY=B9X0d1zg#ys;Lx>9jGoXZ`^ zDOJqIBj)amW%lVxargbF%R3$4pK(6Pn4e>q0{XTxeThQ)JO!TihM;=e@*^!|nTlz) zvp zcTG#wB|&}@oE7;{SM-4yfv$t_NCj{cJOE4u3AEj@kbho+DH zDS#Qm$^L7XotyHj#7*7rmCD1AyO7`{`Gh_-l%v;6JeO2KDtuV%n~@+04@4{3ikzX4 z>2HE->0N1;(G$PlDx+0!)8i+mNe4NlGR4P%F`V5bBo9`I|4Q3*W_Xn6JXYrdfJqIV zf5YcD;OHp;@Dw8_#Kl;7VId4!Mm6;@ETV$7k~4KFI3HB+vpMJ4`$}P)E{Z%%O3;hXpaoU6x*{X;R7;sJwG<* zP?j~MA+a1csmCd^Vh`HDUNn(8ANeS3aR3mFEBHMkvDBXioIF?Oqp3KGf5)xF?_dCKF#AC z+IZ%(n{cZUYOfeI$Ho#Sc_C&&wd~L_nTGWGCvXH#OpIW_Mu)XEI-@6ZI=!m^3i$g0 zx7Ia^9>+zNsrB8m02ZfISHDA>h>k9_7$!-h_WJ2^sFn&1--n&JDn|PyyxRS>EXX7n*0AJKLJ) zO#)c8nCs^~2KlVU4tHF61e0oLO+eTdEU*L|*tzx7_6Nlf=p^MYzmBr(g46jS@nd-< zknzSw<9{feO|F5Q(Yv;FdkQ<~)D;D$K?bu1sj$Jryh!pf1Y(llbYY0-ST5>)qfr^~ zTwj5%@!zx|QVibv`cCTF>-aS;YI}fTxdFT9Vbx(uR?ZPmd`#S!Xmqns+}vc?@j^!C zk!5(*veP&+?SCU79e6!@Kt*B%RGxV%VuX3RqCw+X)G{2=ufkN09T9=BQO)rv5$czj z)N2qfTZjT4L#^cx+WPf(CI4>rdCFCvE?xpzDyLk~4HTi7M`1P(JFN7`I<-7bx3yyz z9|iT|3=4#FYy1jjA>)}4wz_G5Hlj&{X$z!5MyTLxHo`_VNyd*RLW?IAhMnr|h;sSD z7Rz=h&xKZ^s7oFrVYEg4VWuVYAd>ATMpkH0NwMIC-yFE-_ z%wnz4>{9a_9WCW%s7Y$&~dMQ07F4HDxJU%o$4YBf!n#UE+@&44ZyR*SQ|p} z3`{4~X&hJjC4NjK$)kZT#qld@NdUN(OX?gs&8m@b^$r@<%`d@Q|3BpDBcb%8ph4R_ zkmK>3(ZJ3sW1PWZH$6erVTdVr=1A|Xv-9he^`@Nl; z^ux6bz)Sbw`MM(QYQO9}*#*3W0-!kG^7PK^+~^G9%?a78Ji%{ZY$$hI?`{UCvr+0W z8TQYw>VrF9_rIDV*P|^a=C(Bo^oRaK4WeQ5TH*?Kh-Rca;;>}&mp2IXg$ZS=A2&gO zW`QHpdtJV@eyG((0cP44*q+OgVEgl5x#}6UqkJPXSX_wfIbMj=l|2TWmws$3uhGnR zAo#sMzT5yE+oB8U_7HSO(to;c_7H$FP>hkAI*FNf_ulHN(fM;Mq$JhSOsfD8nDpFQ z8Z-at#UFp%JdVPb#>ryve57drPO3B?`N3GabKht?0U zA2Yxt19Pkkdw@QB1P5?{eIL+%s+rp5nsr0qHHJGo0)+TgaKjs-WL#l1vP*p_wB(D>Q+!M)T3GsPYt=dnz*Ko4jzM#EwN@$Upz4|48r+o2JXHQ5$l z{C6|Eo_=R4}fc@iKNoX?Y&B$s3H7qY1&XIc%9_twVoh4WO~R;I?@&p?4j| zI%1E3XNnom7ZHfr9!~m!PQ&=tqferMkw{Ek`g^z$G1%O@I(QL{i?pGC$muesJGjQe0=D_;T977~ z{XZ(1T+=@c4cFaa9f%GL4E)~o(R=eEgj`**iRmZLs4c54NApLwfBl9iUvj(n#o$Q2 zWspANx+FM{3RA-gDE%bQ1z`J2*Yy7mr>#XXkomx41vdx>fCvX?{B~&02K0_V_+TtEDtS1I31=pk%1Q^ z^?JtZf4>t^4?QTT_y8d4mw_0z@v{M_G=ZmYwrmN)>1*Xqf4|Tb9{}PkLCABRc7}r# z^yTz@#g<9y1b~V1fG8*)QjXk$xYoKKVLM8)943&{{RXQ;50cYV+I=Sg4dE6ByN$8F z0FB!~k&c87NT2CO*^5Yy1_VqmsNhj-4`SHWpcZV6|2r9j$n~^mtS~K-ZH4yCnwQ$l zST_PTc|6Y%3bgx$E--Cx3aW@gP!)C%aPk{uD_}GrTL<}0I%vtpTkh;E-l34~7Z+wo zJ>anyJ_oR6z)Cm#m{aB;Pebz&i{y7Em!XkK!nDUO+nXsAca#9j-z!v z)W~KK58iU3ww?t~^Y%%qR!@n9t$Qe*$gJt3xa^Hns zRBJ^M(lD<_3Z_>5{n|jkBMXL>j)>{Y}5t>{(ij( zH^doTw5~rF-VN8%faE3^qqgQyJ`9i-dT^5FqN^Eha*nQDhy5V*LBi1#N?(Z6kw>8o z`kv4O!h~d^Sx+Ew|Hlc*!}F_d7DK*Oa4(_~L=EX!%ep6snkB&#HQxt3{1jv(G~{sq zb4hTBFBs~=RhA3fulOdG|w0qspxAS!ZsFL8c#;bxB`W2E{ zQga&JL-ifdF@5ku59mUAmBl1dxPav$JXB_9JLoCyA*dyr_T->Q8yGsGRDJ68qoVJ7 z9Uz?cYWd&jXd>4Y5%@V!$})tI`yd50f^RfRturDWmy3S-=PJtb)*vG#m@*m~nEzQ& zUZ|y1Qk7UHA?~zvXM-PR`(N$G|Fg>Xi&xlU9AP)05d+I15lUcLBZd* z_rS?}@SYU_wcEFwLICNTo6_IyRP%wQ?#?7jNZWr^2JTsF2v8_e-vCY1Ya}+U3Df}* ztR9-9!}c>5YGwzRh46WF9tE4dJ|(kL2r_6ih8!Wl3fhd=aDFgXKgOa^4JXCu#3F}! z-i3kQov#xqYY2(01XIm;NhOF+dtqc#C~kd6=FUK;FTG>*f#C5g|G8;iE0mn)1+h~B zu({j0V8{^+C8>la8lnpEVOe*~=yz7TM=fkG0VNNCr|&GyG-)q520RP@Ca@E^+6L*1 zZozwrhuA0!MiQ<)ggQ5er~Zg}U@G7P$HqSfnA{O5V;>Zvsky}d=wrk_~Lr%SIB8UOZ#Rk#f$#=3*#z^;#=JLU) z^eUVV@N>|%sJ$!PF^s$7S#P@|Aif6<#sQ;E6i}mKfi~&C*hbFn<{=nhwH+bd;nr@BI1U<(!LSkc3uIssr$+3fInhxE6)$CpsVzw@Gha z3X0-A4pV$VbkUId?(e_tse%ErrW^fSOSNnNjChnyRqf}CQK?}KXMNN0Wp|*A{y4r6 zAewy0l~V&Fw*hr1#-=kIM;_sinJ$<6;dx_#qSnBSX{e)Y~vkCwF*x{Sjv zMJRvS1K&@rc?;={;lxHJ1msgeBit`txzYk*ONRUR@4sI-4#y&z(9qWR=QcPTV4=@$8$^o|9xAMgfiSi(WG7#_7f+PYFMOEPvl#COIAJOG;WzzZW;Q8t%no0d-nZLf93Ncr9jS5`D`zU>Z1e8BsQ4eEIFZb;@q=ldkozR8P((DXbCG@By#6a>_8+3D zl(gs{y40gr=o@7S&D!kD5PgBypqIeAKq3A%$ZaXOQHY6HiJdSIaI_W$V}DUW~2 z9Bzi~7veAa#lin`F0FNBwb0kTh76SFROYSMQx}&BIq#Rgyw=q>FXq)+j z%icRtOMl&n_UN42raP(Wc;v^7joI+tPj0nIC+EEA3YRuI=p!#Csh2rpRCsoYn3Ju6 z-BwEjg6U9*I1GdL;hdTT42Ro(!Ke?^9WW-~`ati#?N5?3bHO?^L4GytYD~qW%23?H z+tQfj%*vH659=`((V5P2(y1VmlJhh$5qcM)vPt-n9odNjRtT>+**?kJxiFz$yEJ84 zIa%DQOaE54i}!9_X4clnI12S#{^`PMGA`4u&5s3>@9+2JZ+V-o8@`@e$DecQCOo|Q z!8W1gJ5KElb26|5didD4d$g&1qV$2AT_gh1GGB-n2|!vnR;^Fo8|Ebah0{xoA;CQ zR~OkPi}iA*ZeP6T{mr5)qIH2u?k{)v!tnD@`>FsH~NhF zB-bxIZeS@`clog4vU}|#&h+a`k4p8$B)Y6>_w}jAn{G?JxS*x3NK1lfMJJ2u(ovJ# zrE9tFr1(ffuRSEayj*x$7JO4mEiJiL3o%j9H$}$01J(;;@@TZiz&=O6>TsC%+6H2? zsp&|Vpo*$zV0VgY+Y_MD?SoPdjbT9L$OgT`@~$CqyUkr2Hn$rc0;+o)W^Q%UR2?YI zOK&A2X<+qe{SYG-=TYE$oLK+(1qad#hgJ6VFuLO(*3J&zp6uM3ub>XQ*b{cTHamEf z{CUFsxFes*Ca|0}P-U-Lm~zvYR}!rIK`$mLDH&V&;7w3)@T#4zZqw;rW%=*?0_^9{ zCrLQdGdht7^6ZNn-OIQzD7w!HH{tJ$zc@^xWZ!iC*V)sAMvVu(Sz0L;GY{jIWvHmi zVy;mAxiR$Eh>mVaSb#u$$11~bpS>cUY*2`A*C$#Y(%mbnsT2HUzk8<4f|=uL z8pZ4n9+aiJB)maXJ7exXW-VISo4w{K{6J?j>t0|?nFAZU%krbF6uKfkw&~fKH~Y9s z-d)BEkyzimNqMQ;;80tw|E-tE|v$KIQ z9&2$>dOZO`ZQj)dls?*Q6Zf(HG@GnCwdb7#=W4 zkxVC9^0dB&s~g+#=*dLQ`FNKIrgudAlVKY6PTgA*TLZhLmiK<_7wMkKCQ9=hzG3K| zUa;R@&33c7!SMcU$wx8g<4=o}1mC_DYTjhdbBorJ8!RUYuV|xg-*Wz%-~C1?ncynq z6#J-#gwdA1+tEdR^N~pVs-xVUh=8gP0q=MIj0Y2o3>wd<9-v~ccf&|T`L90^>$8fRxN!{Y7(C={HjM z<#h<_jG2kC7Zz7EX}ju==Q4$19Ty8vj$I`C+C|;&?zOlffVVl>eGRYIe&E#+I{(Hq zYff_~B%^=5qGQT_wt=DNI$6p0#P+hcp{UEF51-y#U(3{qXB$6VN^^T!pyJ~wzmI=K zaB#Gh>R!Swx&TrT&mTuhPf%*?;o{ zLWdx5eJpkF{^BS(t4LymY3%IBYaAmPI|qhC+IBn@%SYe46srF9YBySviVZ!@Gfmr+G?_BTkU~2Af zW4-!MF0q;6t$a7@{k|(t<#;PM5op(4R8Mu~_^7V46;^(VX9SZM#%`^H{;(ZF3n^NQ)gZ~8;U zT_aVm+L~?zdntFM8Ck5SjLD?TyZd&igPF{L3ohn{U* zTMGGcvPr|%^e6)jwQSl7S?OG>TcK3ifN!Tsi(eXhwTEBheJ&+ctAoe2JZhSMPkBF; zyh7dlpm5J{;{h~vHhZc+GQZ9`ulCY3_@ybv z_V(L5;rl~s@=sP!o>^;OVe7j_dF(S?#E~mb!TDI4nlcrG75V*fTJ$B2`{OO_v2{)T zPM?g@+0%bY1XVv5JnrluKKzwMtnTGxU_kc=?J@v>>*f9~o|vS~0&Zw7oHX0E%{W<` zqjFHKd#KO8Q-XZmaNzL?=k@7#-hna7*TVbWYt-(ka<=}8(;=MsJ$=wJ5L0&TkA%J9a|+@|(<*l#ezp6$eYYKBf)p zVuzAKvrh7*N1WguAdmdzQEPm!tn}4Zf7ir0?u)~6mi8+nrJWTGO*X?;$0sEkEIaQx z+S$IiZ{RcjsD_eM%{mf;p02AHG?Zc>)dM_K@XmG?NR!8 z;>Ub2!~07;@n2_xOhNFy;^@Oovim9}AXiPdOT@EWs?H~jY6+*3!jq6w54q1W*;r@qk2Iy@3Ji7#lP3yvT3b(omQIi ztf};j(R+iljCV#i*L(Oc>Q!zNK2H7}0XYLBhJ__C$*0EsI1hVI{$&$j#2vPQBID%;WJA^on7nE%41&a zFJziB9*L&1IY#X%rJWd}cPo5MZyaOCXS(@DXK4R=-I22Rrx)rE>ksjkMn`l}(6?Z@BEqkH=pt){k&f8Y+e%y{yab6@x8zHDjeeweiCcgpUcL$j92 zSp}LD&N&Bl%+g%%i$A(i?SJ zvr=~h+46ESY%Mqeg{=SYHPc@0eZxE1`4j!Y(M17$c0MQ_Mw(vd@ypOCHX7|;yhJNZ zP?b)GXe{-SbOofXeR7F_&0}k*l1Sb+|1x(;-)_oCnWNxD-bX|skasMBOxGtYCWb7u zW(Sm-DM`V6$`o=b3<2QgtM}a8%7Fpilw)_x#WJ)Y5jW&2;7m%z;R2FI6MC zUr6?o{n03eCa_(8g!ey+5&Y)Ul%W|sD}^x<;f}fKIxK;(J3kP3k#+N9A`E+sTKovgF@?{07;XT4C#5T$r$X4c>R zf(98w+86grEA`>QMpnSnM=q#d5NG8PG1Y$MmB7sZ?}G z;A8=d0oFz5Tf%?M?KRn(T{oJ&2D8fG&+&l*RPp-B6JY4+_bK$_ z)2a$#zt2W%#PuIZnk#AYXYip%l=B0Yk%uZl-|Qowv0>GA<3hhtS!ig4vWuosh^2Mo zXVh@rpB=M^u2r?I(A7u{fnz*=&Q!+%89i6@IY#6{|Ij`u2nt93Li-ZqB&Nrg?c3XF zf|Wy`?7p@ly3HMVXKpgS$r*D zVRULcfHf~K;#X`KjxKBnd`oSvB(;t*X+Oet~uE&3=&-TwY2sDxx!4zfZxxy z+KJ$Kp37clvmX78<&#UtGyJ6x$)}s5@3CG^+QA`+!bTd+_wkVz?ALSF3Tlc?!Tv91 z8|}Q_NuxwAKOCx(1AT1tm&9u9X(TK0Tn0ejc=^G4{p1A6-M9vim>|!ecV_%)H(tBx z^rnA%_$U0_6WtIWe%YEiPs5d8d~5%PrOjC$H6a`>Ieu+Gxv12^B*}Yh0R^!h{j?%l z1EduIQXZbjPG`fMC!5bduWOVmnNwdQ12?X{cQ!^erIw@8e`_5X6Hx~eJaHo+|Me{K zL1+R#{&1W#Y8f&bNiJ_n^h~(VH>Mj~oz6d1o>MySS_s1s5YH^ktM$ zF{xc8bMl>P11P9M)#Q6Hv{S}>7y71mqV@J183L^}Ki zxC02MkY4r>jKJ6G|nWxW;JR8RXe?M&nyJ2OE&Ec zRAlUS0y%s;y(GZHjL{m(@57X^GlfLfc`9=OC$w0M73Q$7PoDd*D@l~$h{@k#3w`Yw|NkV zv}C>A4sF8*I}v#be9)aydJsU;6gCV=lF_U|!!JnqCu&3vZ#A<%)t?~j9_Y_8Z=6ah zFQnB0Qa-bm8^iQ?`|7nv71Y($Gs)7dTUQRH{VzF_3&o)_PFS{P9)3I5Yd_AhfP$`_ zClqR~$L4khkAjC*j{FhV5gyWUnr4dReUf_8g{qwY)4C;@nXxgHE~!oL`vgTIBP*9i z7IKVCkn0RW_2B-IbUISMd2td^Lya$HTRdq7m&dA-90|`h>ohWOM-DE-&v|UF2`-RI z@!>DtS{`V&lv9>S`}fiHMuwlaLd>*V9v-AmfF6{2Z<@RMdI&Y@3N;D^wgz;0>VQpX z=R|&fXdvS}gpSIa$(>o5XVeVAwCNN{U5HO~Gj~0#ygD@r`MWxAJ1#$p`Hg)6ZM86y z?#&mqypZfU>Kv@5e>iphoLpAVh~zgl0T9%M?dwTwl7cHrQRXw#TDaPzb*^PKfcM*9 zYS&N~LBIw=J7p6N3HF_*OU)r~g84SDuM1ax3q-BhF2$oG8^#t1VyB|d%@DCND$KFV zF-ImOOK*keQo2|Ww+OEY%yon?*c~NtNz679cR^f|J@&qgTeVJ4@1we^+VKVhI-z4w z$>5b9m!VLUi-D4CGk{_K+*Dl+c)f#Oz5%`;OHX(UqwS*>DK9rkoY^Y*?7SZ~3;88Z zXzAvVEFozxiw@j6M+(G1;+j(%Ms)ABRN&&M-c zJ7$c8nT_U07V3Eh#EAEJM}E#WOBfJIBko`FALZQM?1zWDrX**59&sqlCo=tNX=^7h z?9M!{e4q$IwwZ^si-()rnll+{wmEL#^8|8K^7$#_$}3ovhSo)Xws#S`X&^u|3Sj+u z5$$LwemU~fNN2+3#8;2S++{#1_Zw*kwd?jWO-HR*up8}k)sUXrj?@uMVh2pH_9Gec zX^OjcU1KOyKGul@|13R&GcSv+DM){Sz<0FnD)Ty%zNyk@B9adqkqvlgeJT`2AX)wzXv>tp*PYw!25j)J=?ynfz#c|8&kCZ5H@I zSH40#82y>cOz%u0ub(~Tmm$1ndsP9}02=Rf;RbMWN<|x8CrKmQiL>a`-|RNX5w-v+ zC!3`8FE49_Nl7H<+rOpB}&sKiPhQ@ve%^g)d)sO>+eZ>=4Gcc=sR)1OT%$r<8=3be3wvT=3 zJ9)_vNzYM8&%wGJavO~Oc!2CPukx(>pUMV)tGfg1od+VEz`AuB-j1o^N?sKYfR8GZ znJ~*2mve`44gqi}SySd%9DtF%MJA#KSoD1gj>_>{Fy*V&&f@1H&`l5m$&PU!9C_P8 zE8zWlVmu%CgEVTQRBVo%9yvK1ExynS_4jnq?o5mj8*kl|0eupt1(L~N2ZtkfegqKG zODHAJu(r+8JPgVdk{}o}6FADMbKd7_LZ52*Tl2NQHV$kG9V)x6rbH^`u>tMhUBH{w zV9BpNsNZ=`TQ2OC!gyzExq@ANmG3Ug)hwDg1A|@FeCs!6L}M!UA=|9OW$Ahd2q|kN<4Z6&j~|E`2kg z=U-F$NGk^7GjoQ4*RI#}x%|`SBd{M3^M-2*gNxCZrsTJb+(TMbZI3fjZ0pl`;X;Tp zV`vdQvz_2#@X+DnUU%4cjlQ>YCM*?T(Gvu3j41GM@@fz)Bv9ke$AQ*w9qS_xdEQ4S z$x@U1n5zt~C+YYlB8Pv4mUh@r5ij&$NB~k%DV$6}v};HcpcD(Ry2ZSA^0CCr%XEs% zUC~5Kn}E;V?x{9%iXWcV(&Tkg;t}Gn7S^@L;`;NuzcOaj~*A!=HR*~n;Osq7yL*2NM=uQJLNlh;mqDc@V3}R6?JO7`WnIa z78KMaVO1^}-CZa`HY|r<;`A&tNG$Nd^srlmLIg5Btdz$!aJ^xU|L?9&;Wq;9vOy=& zf7Zi0&MjCmF7YS;#Ti10#}e(ER--JB^6o^D??hi+TluIOGqEfLHs{Mn->f>4 zr^Z62p>g|OE5UQ)*@nDH&))|`o1U4~Px@zNJT}h_Z!yfmaK+9@E7baMM!+eKQ)6s=uAkqmPrXv}mia zB;B8n#m0v9<-^m>JPw`Wr_+N0YjT0dlFQ}NI(|n^LM3GK=HAlvq1zVvwUK(seIa-& zOnS*)XD0RDh*aoLaiOQ1Ak^UAPYHfrEAi$*FIa?@zh2Y@BbJCsMTAC=AftS#|U~VQ)~OA^**Fp#=XHo*fv1 zLl8!&!lYjCUBgZ6Nj=8K=Z5^BBk7Zv8Hq!!aSfFdSr+bpYl%I>NcpDU$KEFv9m^4n z<$Z(q7vx>2S~m3Xq|y8P9qmYPi?W~Y@cYUI!q~NNt74QJS824;X4H(=@`+mik zSpeDasgG5IH<(;N>;?Gwi^rx-6vPL7<&5KsSRaet^3Su8WgqMSKT$DU3Dz+MSo4!+ ze5hce;6Zy$dwjqv5>D0!cenR{@Y>K>;p~n8 zOevQc`lIDMJ0i+6Y1Lr2f@Y|Lq%C=<@176pD%9t0R5q9sf_1C_rBz)iV{6Pl6 z=_?Q=OFi?WVIW^wZ|dwRG>u=(%5aVb)wINXc|;$utxIVUUQk58oNp^uqN=IgEOCrr zW58EOdjM4OK~*^rqTT=H(zFMgrTjqt(&$C_iRD*8OHn%eJM6kTi{ujpE1& zU9dTVQB^ule3*T0gQy^*3h>w9z+iHy@d zD_Dw@v|PffQ;Q}<@Kv#koA-pAoXC9$P(RoRL5`9rZf+F^^}g}q$v4OTHguF}0q7pqQihbF`j~6_Xd#=3- zWeGHW5NJ3T6rGW@e_;*6IT7$$T^K9BvN^y@r7wT7xqGKXGWGd^ZeOSJ`hdV)qHQ+W=Et-!8zh?F6$N$6Fc@elPJUr&o&7k)k z(j?pRp?5`oLld>J2!#C3>V~DD_hrCp_rm7=$35-G=2Q*VS-iBSVB|0PWXOMLo+?dec#C(l*93~}If!tm zS&KAZCb1q4s}H@q>O9(Om;#VF;qaO%kg#Snu#l)D4I?q8+ZEu+mdb6wJyID51IWpN zeG5>NhD+^fPQz7ZPRs66kbE0aUmZY(0#V+;5HS=FK8^2h-kXiO5~_$P_yS1r?H<;7Smm`AKZ{x_Gh@X+-bmNHcWG+@ z2s_Pr19BAWpUl|T)8McE{sgosW8)lokQg^ltByN?Hl?n@Dfn4R>Y8x#{gsEJ%cj2+ z6K!bx$F<%*>x}ghx9yaJTOm_->!I*CH@%@-_f=nP<**>Bd#6r>u5FFX+ zB|$lOsaImRm3IT%?s%oSQH4WkCtH(Wn9l_1;xl7QKi59=YtA9=1IU|Y?kwYvoqAa= zylf55rsy8B21UP}DkH%Fb8OIPEXdM}21mr4(91#&{dhG(1f;!Pf(U+Qy5gf!>PJp~ zr>^ch`H&v7ZJwD~!^A*RV7!6pF^t4;4JuqL&Off$6!-rUj{3i(p+0du|6k43#1wht ztZ+rdy>6m3!$e3f#_F>A+g$U$ok8b06kYl_Bo-EH>?I;W}C1Y5Jbf72H`Ll49X8kZn#Ee?kUndWuJ-Z(NN=tq0MDs;gBbRgTGXA-aH^nFZ4N0(Y$3&=!tdO03GSQ0o*7~Ot~NeFTE4H4 zV&CKL$E;I8;^&1E!6knpL%{elP{Gg|k8~s`J8j%}-?CPyonPVSq0Kx0o&5wkbnu*z zj{*Ao*%P7Uo5W|q=)S?hfbyu;a|dN2X~s(vxJY?&$~pJt54BW_ zsso{)@32V+Vw5!4jeuNl_;LI5pNa9ZQr_!x&{%CO2dv4o*b1NuW>)7^1DWPBUBAIX zQ-}Od9?D@jHY{x|bSJd8iRxnQS?F(pw@{~OzDOVNXgC#=nQCDDAXw&-yRZrr%~k%y zyJS1nPA2Lt`vU2v^KN^-S8!uXtDg98*xYyYCc^*3Efd`_S7ly{Qy{(SSksliqY-^L zapH2p8;K0R@v~9h$vJu5lv#xL_2p245L`&PO{$5v$>a_PzD*Of(CMYHHaQmnaI)uL z4vqNl23H_JVquaj+cDm9p?_6VBh$ee?d6w7t2CvOhoI{S@s2?h zi}dY-hRTBces`(i7##K3e{O2iJ=JX0=kg zQc33ch>-U&|MzgXZ|>UN^|XL>{gPSN>Hd}hm1xN-C>f&GcJ~|kh5}WtvN|Ec$0D$& z?K~K-fJL&Fym79*^5O`3RPD}i1`whEPMrVG95iK&(c4Km3@MuaKzTyY^mwK!guM^22Do}HbzDU&|$_+*y$RH28H1L~7uWUZQFn0H;(*=9!L))rc`s9di z=jZ&G1FI-a&eI9hgZCP3JFQZaQg(uruiJBdk_=k$&Om$$pQkjZtzKLV=y&buYE@s# z+e?%<)X5D!CRs|(a%3>aH*PJ$sku$l{82;ivP1&FmHaNv_;HK28G+=vN{w~2%tatFOd@zm_EIvDRIgn59Qwdr)G1L{vD9vHy$r3 zVor?j?3#6N^a|?iK!4$EbpcOuLJA_yBHpgt18LVk=>TQ^3Q)<CKx?C%)W_RU(gC*^Y^sxuCcyqFO>Ko0ud&U0FAVwHQ zNm_ex;ii=?C9RBKS}-!umQ}$FpOEM6DA)ST-)z|xE;f;eqm(pH5|D9| zGa~F_0z!#cQr15Y)(4RI$m0OZcRMhby+UsW>F|r9W1&roi#3^-bD?VoW+X5lx`|X2 zltJtRW8-3p6s3a~^;P7k;J7%kol8rGzPA??(DEI1J?_0l2nj+tr5ga(*(ELV!5ETrHsP<*YVg(l-_b~JTX%uYa3dnq5OPj`Bqs~56usy z2mp(HJsvCiv^<@SD0BGG+s5FJh^zA?%i?fJI;BsZ{-?= zncVJ1qHj#oVnuSboE6md$f@N{m!7-R=Y*)uq`4y34+6$aySk^gXoA+;Ll$|&JQ7cC zCD&}<-|dbvQ>5j#l<^<6&bqt3EM}gdo4e(gTN!w(A+a9vPb+_>CxwxGN^-vpXxW0Y zHe-@GxB_p7%&i8gSF%kT%Qi3`Q{5OTQ8(hI4U^qczxl1d%j&KB|Lcc*=iD|lDP|X# zNb$&j_ERS=eNydNFh4u2l}&et@)*_?gnNvKa-qu{-lU&{^rG_u0cBYC-*2_nL! z;w)k@)qJ1)v=CCr>@Q$Tc<5kr>8ose#J%Qh`^Ne0Nn&RR+~R9_IahmrQ8TDU`4iKo zFzdpDve<~>_Q=5 zKTTMblXA4)09>aV1WCQ`@3vvbGyCcNvLp1vvpfCYjCt3e3(lU$OcNRCTr0OzTE?jc z^VTt|oyZVrU&>ZP`JFp}A|;1BTP`rycD6?p9N zJf)U5J6JT$Zeo{H>#Jr&N`SugJ44|s*j+f83gfOSiwLyLw8KwyIJl-(%xcHR9-8Sf z<8QOi_e2vqtp#N{vJ+PeWycP9KAR*ndrfYaOSin_m>uAn#ut{VoyFwE2i2BETnX5N z&rIKki0pCO*P0Z%@DcYeB>gUsyR4O+Tk8Kx^K@j{PkwFx}1{cZ;WGOaI((f`|L)1I*}TS*mDK{C2wn!A#U~gn8ZFF zQZrCf9w~bZcdJ7^ma!>kUkz9oDbw>i1bsRb^JzV@(<<;*Mpq;IEfCbcX%Dsb2km_zqW&H^&si*})wFI>Um9Z1TlZz%RZyyN9qM1%q~(uhFj|hOg8F3!s^L3VzG=eu;;=4DP;)sa zI6%vb{M8bBqmQi9q~HpGp>3JqAW6r7pq73vn<*nl$@^-W{r2V+DfN=_gop&j{7G#J zVn6ZJtmU7KouK48l7eN_@6;R#19i`;LppjUbQnFDVg;0ud)YW_ED!%XRy zt{0=~8l~JGu9 z*fkoDhg0V15;UKFm$S6!TR4BBj>1nW-iI$#db=hs7~rNA446v+b3o4QkD6OiM_8~g z&vWf>BvnFaw5en|Kct0m#-F?HUG<1Lu84LNU&=zps?%-He@a@Q8!d?co6K1E!mJB{peDTLwVD)HVa~A zY71$lh0&hTnCDL1Watmc<+bRd$le(7hNBUn5&T}HWQ1)yfZKG!{OlW>)|FNax^Mr6D zqhKVyJZh)>PeKt+E~p^JTkSAn@EY#5B1xYaE5!Z&LE!hTvt&bcf2fmt%cFp*QGbUGz(_SStw1RL44z;{Tz(v` zf4yo8qs)8EKwFv-owI+Fak4@dNRs9jz-!|sOlD4v$Y2@MZ6>UnKTU|NU1mn}7gJrc z7knDW!b5`Z&?{9g6lQHz`Q$RrPMw}}6$Xox<|V0MhcfKG6(AU##OX^qvp^db zPGjLIt0^5axDj0~a{$n>2_P%^)amluJHPo6&4M?EK}zs5iT$|ic$kI19>hGEb|s&} z(I11Wn8Ipoleg3KH7Q57f`fHFB_U)pn4g2u!NDdw*_W7b#o5o@)e zt9v!O!p~J95?8&2fPSi3Cip{^$Q)B`eHncZ>NA34YlW<3dCYlJCOq}2Oz6q`sNvOs zXQ)rGBF*aLlw6K-SDCw2A-8EdYYBBO?;VR_HQ=x@6D*rL>aEqkbW5}F_29^qfJ2}z z>DkWiVfaWe?-<4>AYt;u3c>TY-&}j??cn=JjJ`7bMCzm;V<-^L=u(e`u`62z5UV)7 z*yYUg%F4=o@~)*pQLT9_zD%#~e1FE+B^q#OUh{>w)#ngPg-5|*>UA!s@pSj2t2$AQ zYQ%uM=L(rTkZcv%ahEA$5E&n?+e#}Ou?U!#g?g^)V!Lwbn5Q{D7`GC1NoIL zlxBQ~?TxVH;H6`Eo$s2ZZfv}5NCGR*slY7BJzarhkCul3fWyzD_)%(*eig`|>kW=? zq^?qqF0r}>iEuZoVEI!D>uHr>f9sQPSn~b_MC|O zVCP9QkgwjKVb5Gh#!4UgP^VfSnPQubAB5@shX}GO1=Vf|r`y(Px(rAB>f)!~b1g*W zSl$YNX*td}Go*!x**Ag;_8~OB`>uHzMRK|fYkFw{!(SuCi`X@5%JEoQj>A&xGA7u5 zSuXYEI#f(=#IEtJE{?2W-PGstL5jFq2hW!F4&XigbfI%HT(9JU^EW^qZM`lUHpbr* zco=V_MYcgBd<6#*txNiyd~G_nq`%|A^(mJqsIn#T^U=jGQY@)iQareJoU<;yUdK&k zRqs4R)O1c!&_3^#FWcJ-z9z8oDB=@Wr_bqxT%{~|0tFjgofH#bQMqrp=9I^!;b4(B zv_kzMw|-Oe1=*Ahm)qQiop*D`KuQp_C$z`3`1UZ)Mahr;am08j(1nUXck4vZt9+wY0@` zmzQiOzuVj!oZkVT1U0mb=~|Z8g~S!8UMYv&Ywb8QUa^D)Nv0&pP^trKPNGQ>$|H&O z6h{$LY@snMuL<}m?}8;JapueXIVqO#)1B+Qx267!|93Caj{Y-X?jIan$2qPfMqwgJ zd;Jj@d!vk?(*&Evgf@4cTH??g&f^ik_)^S>doI z-#q7AorDfDo_2>T0!IqMcSWD_f&;?Or}Q=b=gcj=r=t*68^{yL<$PU|_8IT{CMJ5X zMXb-VSTe+N=e}B|CSjMEyz4ZV**Q|LqhMF27az0rJbvIaIjfTaC$wRnKdrWEME3H&ghyOSAK&Hos9fX@{%3Tj7iCk>pW7q z?>ni;2St=unpdob!B9bR*1etCDoKD{sTJoRznr&kZ&gbwyi3Yk?7)^Xi1}ygFF9}? z(lot1cacYn+rj&MFU z?EsqnCX!gK+EJnb(zbXkCdTvDo?gq$jc7x3X27ZoTg8@^qL5 z1WOq3Dy5hKNmT46((dfg|B%PKUEo`4m(1nuE&oC_-QKX{_haSImKgKatO_C!xJdqo z#AD#>y;Rv&{if|baJr41dx=wGxetG*;WKZ^3lBkQCggkg9RWgBKw$<_kFs_0Vp-X0 zJ&%qE-coFBJvX056T7g}pFzZ52s1#+Jb8t*$THj~7(LU|S-n4Zs;{he@ob{JhqWo+ z2PbM}J#OU}J6)7;(wc354zs{8bHp7jOXhLXY{JzlPxnOTj}gDVJxE)ZO^_m?zao{b zy~8*EXsw$^k(PGzoLGRx+*-drDVqfFomsx^pIbHF_3}8#k>tM8Ak3}L| zl~yEgZB5c7*0S(6A0E(Rf{w@vp<1ygb^4O_j7-6D zXpFQxy0Y@MiTi{i#NcVkyZ#Qj|JWjU$W4pt%xFc-`J4K&(|fj)BIm#NkVD@kzNoQ9 zz)vXd<#GF=<92s*{JZ`1oBaty0LGMaJr_$*i`(5KyuTCWRhAZxeODC`-ID+egwLb=D$W_^K?D)xLk%F7(CT`0s=4 z8CrP}o#6!?M%pX=WJiOGJ1cLg6?U^CA8ppE80i8k*Cy8bCFrj~qi*Wnnm=Fv3O_d5 zas*KA*A#tE%ITT&${L_rUsi7D!>QsN~3m(?kfyLC6{z5kqSV=$H4f5lyBl47RprYYD zw0q@L(QZYYRQgE0@r%%F2y7+SGbhT9pw%`;oM*&;X4lu=&p@i{)@6&$ zl@qf6h0IZpa9j=V_qPZoJF4kk+Mm4KLdw`6)Gr2${YR@5L*Zc#77HYrWMsufYdjp5 zd2Ci6C)~kYznJD~VZUphtdIxrKAwKX%dHe+xt_bQVx1}aiAOttU1GDfcBd#_b&r$3;2)ZQm6_ns6^c|t-1^f_ zV8^m{=J;4vaCGKybXtA3xTRo(94nd^0;XM9kES^c3Jk1?!~MXDN}^H^gb z`e(GDE9t>b?{Op$u>9m--%qucSp0t=nc_(%TMO9UFz~EdrKK=oSl`|QdY~y zg|){RF1+y$X1`}GT^!P)SN_VJ>0urVDO0I&^@FeB$cfn_6$)eP&m07m1ZU~Zxz1ne zUCO;N*s?Pu@QeNbMT^k|$oDXZYmI0e}f zRpiURH@b|b@1G&uY~rLUVC13+*9{%DBZCxIvU)*p8Bz4Yhd{=&@=R}bo$`dDg6pmu z>n~ZpQj$6t`ItnBNjbEM@#TsiyA`V*?HNd*iu%WZE&s4o$-Om{RMbX0(#bw)WL*1V zR!GKgl|@B$Y!#=zSe;JNPe1qL1n^X8??tz~fJdA&^;c~j!U3W2B*~uy>&yWJLOWL7 zju={yWoY^9F^ylbCQ_J!+{Nu6kRw@na=)_u2aBEo^uD521k9_JU-HoI*l-jEg~#}S zjMHTCT6AYve-SQ=GG86I{Q2&|_bvJ9{jeV$P_fIzs2&UF+w-m@Fr_=imqj|3a%x*_t@huNHMG_kU_KA3BG> z@RG!mhqq7jVmAEtd?C53;)LHs*X?A&@eZ=Asr(avq^UoSfN9XrAD?%<@L(r-7HXp@W67xgb^Ce33 z=2mrey&bRRFU2YfvT=d5Ae`BXBJphEIrX2oYUk_aJ(+M~x5&cPMBX{}i66vL9|?bx zQvDeD!SDW^Z)!^~TV(n{K4EY=>zPH1(6#*THv+rl~)*L9!lyVGkfp(pf_6#J+!Zy|${(}m<&nB)hoaP9P0U}tHTm%l*_bCsSp zWgYrm=HzDP&E>e_jR}bd$4c3DN~ws^9eV~^uSu`KpSrStvvUS5EF0V6en2cWxDQ~VkORm=pJRuC6gLR{Zc6u!wdNo z%;n3P;Dbl?*T!kt{gsYsFwZBkjSHm05U=uD z4x$O0)_>KNU}sWDFpbZHgiL=)aMxQ~Y>Ue;AW3H?c7BHQHRA<*R2mLdsp{)XB??U$568+6$jbLnlz1LNGw13V)q)1Omd)) zILbh`=NxG2JhYv170Qc-FjmynSZ=%UDOJMsJ)S_MI4PRkHcAR<$fydC^^xY}WSwer z_}+`=PtAfm^f4q0keWEz2svJH4_Tf|kgb-XLL?(2XvwC5=&ljzYACAlDSNeF@Y`zr{(3i|MD4!s|=Me))4JI*62fPAA@ooy6m+U zP=}5bC9hsw!~R@9y>twkhjO>db>+D#WiIJme=!s2^cK6`-Hw0UZh`Dpjf9p^L`;pU zO&}f0w(E_)%T4-jAI?6HJ-<%DN99KqZw zjjfaSye#DBkLckdL>9eSVFW=JU8>bi@oQ)vY4!UiYL)llUz1{E^4~2hMR+}ajoUtS z*YP0dm7J^Yo4FxY*g3?ZH&;`Qiu?V2c1QGQ7tz-8md6LiqX`EUwF1|SJdF2d@Ww8F zxVz6Y&(!7EFT$<4_y(ZsPyHP~ba!M0)p#6d0T@+vzYM2V2oE82eKOP%J*16_qAfYG zPgZ3}bJb8|8f;;Qs~?%K8x_$0#p2UI$iweKf6V-xTknoY@iAD~^fT%13=3YOKdA8T zR_*x2f_eU+d`r`z`N9v8Zy3aI;s^F_z&BG-{27_CPI-7VIaxV9TDVIeh|)eio#H>$ zNoP!=7TUd~y-0|}V@8fwPmd4f2<4uCBw=m04LSytN$g|5x-OunV z0g-19iDqqHsLdCmo>S#NU!6HjJbl;O*TF9IvsT%8Q;6)i-pki+272mWwx1t!>0RwS z_8I|pzc9~N)?vd)b9YQ7pKPOvDFQXA#{y1lmfLrJBotr3NDxD3scSpS4N1a9#wWn) zS}&$Ou;#kv{U{DuHO0=!6J-an0LYW$VDJEbwWY@>KEQhCId@43>kF&yb9vxdrv*+o z0=R*2qOKnv4Vat%SksIbpGn&}-Dxa@Uz@r&VOfkCYjKwTU7cc@W@$H@U6k~wv#(yD zSz^)H;f>3p?bqP&np-9!ZT3urQ9Mb86q!~E%}09F(1&l>2f*wRt!wzq|!vKSNHY36#@Af z39;oZ`&re+dpsDPFhHW%D3S9qQT2dI;Uq@P2%!~5CAEFJY0}Jk^PyDp+MIOaM_0*A z-%r2K1s4+3+M)XH7Tq2s*`#TVS55nasugETqFJ*)-n=xyQnSX&#^&|m*OA}Uy=dHD zb5_7cu2Vhw2LC=(7QA-Veo=2(zr?@9?4)lDxjz_NUnukOQ2W_j{*B^YBU|3(&}!J5 zxSGVBj-9$Kpa(`wn1qHdl4M8edDk`*oFr(3%J{kMKjv`Az$yE)@@;|zlYm1RDUJQU zFk~3Vo!}smuOAMrylpQA*SR@Z3xJnx-!JG#_l`Swjl_R7Mn&sKXvlv4K+Zxc;@TM4 zh3I$Fx6no(TIeFGrT&6nNq{HQ!&kY~`GET8&^(fgJak^v;Kc#$FV_a8u5i-&XC#uI zoEKnSxPeFgM|!f$g03PuI6Q+4E;05k_+>J+nB}^NScT&FKdJecml-|q>#C+rptRmf z%)zxxq|%ra|C+32+jAXq*9~xdn?g;=0}PA%>$Ns5%|q)~OoO4<9_5EY$HLxeDN}(0 zcU|}xK75B{vts?mkjX063aR))?>Z00TNrpMgFh!Cv1*B|vwe&;8{7cP zNErKl1=j#=oXnaLv??MyzX6}Y@iKRBT!_h6{%?6mx|;P0o`>wfO6(-~(!1(2z+Hs9 zc%_+Fly&9@o|fw7kKJz;vag@n#5~&O7?gB!VbtVfycHY#?j=hTROCXz%sr-1bFIN| znJ7L?esetx^MMYTn9l{pw$5p#3zM5Ov_&6$Ha>zT)^SQdX&w!^6@Mj~B5InzVzkaE z=%_vFWgxM6w0dbb$juKs>Oj<7XLkdn%RUB(AAam7s`0j18G)pwsMl#=Sj(QvbI+xM z@SA`z8Q!VXxpGf3u2QkD78iZR0|-_lp$fcN(1p0%Y?l~gj@0gU(Qpf3Yr zbM9G&8p_{OhTdIhCJI5*1?o679064cDN4mRbkP`IO~GeWEe;X8CHle4PjZxHp;k*FRWXUqmr6o4(~B+$(IixUq&{r$Hr|*no_R6YBVIR z`OWJz9coC(SdLs;fIO1de1b-WqxsR~c=K~=arGF-{GoApTj#1o_40CC^NTRc=%lg1 zMDM`q=0=(_mXgn`m1UW`e(8R$G#B_9sVl~th*oVx;N(YJM({$ZE8j$dm*Lcle)U)=6;olSp5?hne%&-H}8 zG6jg`t2zn#<7#--l%bv$Fm_k-d5nZ!^y6y^QE7j7-jli(m+mnE`Y|ggUmy;bwLSdG z5`fFoJ}^fbE;SK8*va6XuI?S1W|`tUzStIS-Ztfi)%pTW{Ze_(Vs@5vIT3j&bN`z! zb|&#gdYMtI+@8L>vpGo^`P`{RCcOM3G5d-;?-TLw7BQaYDkq*@;$L2foXoFhvTp(p z;-2UT%9fUQp%{TNKU-b4D?S7DO{snU`q}r7;k%iN*gjPE&;N37`e2>^(R z)pSH`GUckJ%GRpVLV{SoU&w!#>gV^e95jp9U#ueb!q`5(ejkMz^okVqr!lJvB3+-U)xdC9qca|F1RB*WmW@oTZg$CaPhxIbuD1T2O?5UG>(bfRG1 zo)cU1SSI??v9DXV)&d6KS&5yZG#6rURy<$&`bi2=P~gj$ZspTSF4`y~-sZmrvaj(tHvI|TK7OE8)ln#k6HUaW!mpOs z8H7v4?7bR6PQW2a%s86}?!@DyZlBMyI(kjhh_!q5ej0F)Ekq_8zZ2MRAqP&Fl=@M) z^mpCxo<6^*y}Hq|_z~$$h#JNtjZx{52PEKCYzA~SjelNWtF%Gyja!uf33b%0Tg4Ye zZvHz7R8{ptX;S$;5p%skX95a)nTM^Q8b)|tMb!;Z~xUS6MyN`lHVy@2Nk`w zBXjmLVO?o)3c&vMVbsZ(hlF?k6T=25^1|Pw%!g!Lk1wj2 z2!2_otzFay_aDDw;wu=jC=Kq_d-{}REZq_y@#YiiN(FrO=hBvrm-zi#+0fZ`tGboLXD*h^^Hr^Lyn|o%dH}4IxjM4Rm ze>{6xsIk(;0(ggdVUi(@Py6vH^+3p4G&1<2qCbhJJ|uht%=G@s-l^!VLhJ&zqR!1* z5w#Z~xQZ3>U!9W_#cu=^tq$1b;VUv%#}DuRKepa7uF3cR-}<}yG2n1lt#K? zBSgBpOC_X3k!IBBZfR)-jFcJ;BL?HQ_xJPo-}~?W9;<8DbzbM|`8*Edi_G$nn@;Z| z8Injvrbo)`zr21*>n+;5RGZXm(c@lwmLG61yzAGdDH>J+(X{tfKs4k#CO|}*pFMen zqJ*ENK@uX+s`~~9Du=X`%1AA+%3N-Qc3wVv|8UMr3plfsxOI|6Q^*+#ruKES*{f?* zbvi|Up|x*tf;oiwsh(IEg3LE7FBCU3Yo+eOH=s#abo~4T03mOM`)rTEb`U58l6vFe zdTl39aUmKu#m7k4N9QHmbZHzD#FZ00GG#Y&BH5lVNI=_4Bm83LR3`v(s)TXuNHqz2 ze3SSxwPkarP}1L2buo2X+Jts2V>H9&#p`%FDHr{kSm-f9Bs+$Q_p*!>7TBshZEVGi z9K$ei|3JIro&b-TLt}m=NopPgyl-=LYS=$ydj7SDjO+ z31TYyK$w9}Gff{@Qs;wkq?Ru|pAW&l;vOMWg||%XY*#vuaThK^V7ml+uFAhhhC}=x zN!^-Atg##<8Tgy90sjpmIJW#g7x9oXf=jg5jCNEE_E^y_o)RJBb?hJoQZc@mNUD0yb1B zv46AYAxP`>*>~$ZcMHU~XGugnBZ#qKq;hkSURa$^&{AU_k(QFZ@AZ5B%|NlHBtfYa zV@iTKW3(n#?$FG9lo_M}`z3=B>JTMky_E=(L(bRZEpon()M~VLUH^3(f`j-m8zy!ooV8W>4q78E!sH(y{4-zlvGbEXkWfusv{%+BFB>-FMEdf5=&B$ zzLoqs;?fGAjm2>(zLR!~VHBb5mOZy3WG1ZV3!|@dp0rK0$c$W#Pr4n857|VZ&V&-8 z^o|msg{zAm%3}24!UWXB$vTo%Nenaid#GcRa_wFAO?fwH%jWgT?2NFx0Nu+>WlC9z(=nEzLt`EYbiqdQh;`t!&Ge{-Sv{u1aH=IGvcK= zP+q)hWkoHI2`STu4kZ~@2)mS6qmu}#e*{)JwMuQ>{PDI3<>bX8-F-N-dqWO0-^iEz z!UV4@4h>G`N*v+osriTOg$&V^X;9!Umso`bHG(WIgj^auaf1y!*aK|qtitN5jN|xr z9I7oiW@(&7D-_+qxbJ_CA$$|qL;|F|B~FySE#Q8%O(DT3?O8C!I;G$^grQ+i{Ea;i zU!!p*VEY=ag;`}xyP6d@Pznr`RzVsCw%lO6uE%^s&H9#nC*y;HL`2o=GLh`MGH-$G zUuVicPWL6BX-~D$IMji%qYlB83u}z?lg<`K>&m|7V8mx+{&d-)(XMz9=PHA+VSsLh~1A` zj!Y?1*fzA9K)OMm-kqJGr%-jg!DGRh|8~1IoY|?1hq-%IOWJwjpU*?NON2f8Em0{C`O;5=Cns$o^vHgiK+(GAxZ|+ zX=ACM+*$Z9Fmdc5`i!(zuDyx78jp+@0I=1x=~rDv=RVtn>7G_f<`!Q!7%OQF|5r z$pB9Aj9G`2v^3s;nd}k^Cl?PkVisYKl1u+MUp>?xa>}wO9L|( zf~go-!d_m{&8;&Hee0MVjjE@iqm(R4s;U?$LUIfW3rS%!^ks?$?{5G@MPXY>m;%Jv zRM|}GY_5zIpq6_0#71#H*fe64)E7<7V-b>qC;2H33JVTpuAfkgd_*-K?tl9_Op%ri z$%wUd+=_Vm3y&+5;7OI6VDJx)wAly#h6p$IB_8~dNOXW;`G2cdX5$9lhH4-2z-rg` z1|*;E$aF-{)b3nb4(OmX8;&ZKGlqd}I0aK>kwxjnp!>cJITZP6pu1~5O4L)17TzC% zq6p|zQC~r?#dLOL0nL?GiUF$4M~K*-*%MOgKicM2p^k zD2z?wX!cZ^KLI1*VRWp|1$(hoQ&SHB zDisi-w5Ty81;L>@yx>KVjLj$a=MM~Q7q&z$%b9X%oOsyvW-s{Zd$I&z&g8jY8O?w8 z{ZJt0s;tsRbACMH0x5rl}`AKb{MCXLS$Pmh@B#ENL6z@wE2KBlyT<6(+kb| zmvy2o*xe|~cyIJG8ax*W)_n4sT;fVO>~ONH z^>seAmeEv^lEal^&{T!}WV1Mm@Y3yhC%q>_)l)_IM%7xs5$96VGeG{WG8DAZ@App*J0xS)Dke=1^ivxYYeg9JBE7kU8_Q+|HDo5Z=O% zh9H82A=_cV+1CzOzg&>-VJgkQ!M=}%2}k;6pu#ZK5AuEJu4 zuCu)r6#j9KL<5!CyFD$JI9089z}&bhM0VPDQD}biTAdY=+i_6-H97PQ_d)aNRKae@ zC=l9#$2`}aqE@!lm!BXHwJ_GrD%~mX z`W$!tH@&F_quxq!AL=GunH{5MOswc}ZE?^)u7?|UQh@T&LHT`L1i7;;zgPO2TkQ+| z)Qxi>&4Q=amtsh+xt1TDr(k5wPa6cPe8S&&t)4|rVzPYd2`mfu46<|KBZQmKez@cR zwUX*Tv=KXOFjn!o@j-{o+-t4$Z}yYG!{R}Ge3ar#`ty|e|- z#rGZ3|DJ>IErVK0&S5U$y%l>lcIcW0vd5fjT}e!y9FP?;xy0!xQt{jDImR$Rz!-U( zgKI3tGyjPAxp!`GVQ&p7VYojAN)S=}V}2jVP7YCkPx z;+rj;10uRk>-{VFtBC6IN@wNMKM~d`*KqD{IcMQL0jRDgYs8{Zzx0JI0N*v_px*?5mBqC!mDclW+4-SJZgeUdDGxRsNBeWE0_fbw9n01r%2 zwwSkFHvACITLytB%<8#FxYuh!>rs#m&x#>Zq48~I!&b$6o~ zsJN49rTOy2>{z+n%kZd8xsO3=FEavSAn-Z4bHYpIJ^+cOxIBGp~dRo&zdLuMI zQy_h36Vp__*|{%^cPA?osW{EXLdz0V_e`7V5_1SnA0g`2g~6-{H)Mi`TII?mb(C!CQo%H*hD@8~N$B~Py5$SCT1~8`O{_)6Vf5RqxcKi3#D$D}yM4VU-@7>cJTHiP zdHq4oXHFFfX4t)T@Z(JOYCSi*+g*x<2lyMR{{YKh2JkZ??a%K27F++MJf5_jn z-Xu=oOiU20J`#7yUa_KDS5SvQ1w6}MyE+rmH>SE_u+`q4Y#`Ns*v|+orGs#8;34=S zyj{cw>kSXYwy$Nn3q;8oP-j3{gD&_&;h(MOO_JH=G~Cj%OC7TXs&S|{27kDar`zHGIX{lb;N1f)`j1&LHq+9->tZ}pk)HC>_=CnS!{=sG~gmDchuD+r1@=b%+bN3~b?aud+Hm^Cfw z+{@R9{!^u<9G}dIx~e^vOSMcNUj%fq1`Y$@9CIBVoPX{cqZjh2sq_)q!dmtMmbSKV zZ8h)Yyqjmlk!AcaMXncT40e0i1A4NDhRdP)M-NBk&;HOWd9uDs!Q)>gdZDeppp~Xy zEl@c&bK4XWVB6tJ$wLTm*Vxw zxlkE_#?I`x4wv5>JJEht1?g)LXWbivD|}1%=q8C`vM4tR! z`>tkuw^r{v zxfX%|U6c3V=v9Zf(LjsFz{V?4?6))0;uh`U_i+!E%>Df51&^TMD-#pC8kBqb3guTo$t3$w zqUtb*f}o5LH0!;c4a1t4=*O@_05w;(1LbDHE^GP`gj$2}(;)gt^HT>YsyL|AcrMDH zuOGH$3yp!Hn&oG_FDly=F%N`K1Ap3T)O6hzP5{Pj!_4z)eI%^1*m&J~nLrJB}`5HQlJr(_OeQ-|NzA)5<$1 z)q;kzBPWRZPxU4%l50Qk*>HCQ2uivU7=$C?FZM3$`TFOd4a()j3t$_oYYyp{mp^I$I7V;p$L7=L;oa~j?vw9s zJ60hz?YTGU4g!)!;`gn0^fTJ!CmG7SD@Q~t-tE!Hx%IK20w~G*w-nj%`HL_E6d}8& zqHC-a|FqUkeZKE^VSqlzYKZ82@^bIe2^lHy`ypqb z`*X^|^1`a{ojQGXcX0+?EZcpslBE`%hg*LX;{7mkd%(x`D=S z4qeY?nZ*ZCDqmN(H)_gyzPP+6o3iTf|8#eFz0Kj0!xmod%@`nj_SZGs>9#^+nSAdA zK_&J^qv=D6EDo~2Td*4X8pl|Tu(?U$q?mg0?ANc2?~EiDM{mC^DrXkN8!b@A44m4u zkDY6aCB{vgB8krld)m(h2q6t~K3Ufz#${=YsSGmq2?pz?a@L)@bc5AdE-MaCxfN&Zi~{JON%5%>+Lrcw!+T^IXfSf4CeH#(n3^_7%-y#boK(5E5$RTy%v$p56)ekcQM6giE1ST+ zj@z4MoY!UZXt0sKxZW_)UulnO19*po%UK9j!}VL6{Z7SJ>8?y9w|ZS?sa>R-{g2=C zOi1)x-EeFR*)c*l9}ghDr#JJv{e6mj4EwB)VZw4i!87MTS;D0RUda05*2?<4eIY$T zXo=tvDYP3NK2_6HyFY2yWI;BWqA9g;yq-?kk#~?MkPuT?t<3ZEJMSzP$AL8rAWTU7 zkgP;XciRaQjbp#(R^k*Qv;HcHnvmX%?#Y&~tTU%I9eAh*3OWE&B1J|Y_K0Ijw4_!` z|H}Ma`4I$nqF*w(=VrU^uwrc{GD}w6Aga!`mz^!Sx_4O86_CRvA2FQZTBW~Y04_rYXlpDM2L%%Jg2ENU3WZk zi=dl_P}Bh8?nUaco`aui6*P~;p)o1Br?5c3PROi{vP2_gNLPb#9(V~CzgZ7(6W+1t z^cRmN1~M9*ql~y)RF5cp2m=(&y=CntVpEB4QMFDJsYKO&>k&f8Adjz}4D1prpl}`H zpw7Q1ITw^Y5eU4(KC*$N+(b)=3nd%phjTWB9fY$3bQ&^7>CUQ0A`TV*wB9a!O?v6Z z35Pty$kqw%l}5fzkRvtfD2W|8h?b0+L_dP7ASbca2qGVkiK@U|f8(Kq+Da-WcEW}0 zw>t^6`4X#=q|S}0ihF?XkYd9_R0I-6u@Mje8s^2}L$r(Toc;m7_0-##yQ~jSKLFw+ z6X^YHNVNdR_7=#?v%K7}j5z!e9d^BYbcXmPsY)tW_71$!A70|_I>U?n1^f2c@8Pzt zB3G0jQ=|_m%&LltjJ2u1QFy*$InUJei__?F zQ&w0ky_sTruL6I5JM7=N%E!*vb038#KC{^h>D<@O8y(-_WBtxWpRZP_nVoh^!T8Fm z6p`$PZ=pO9F@qyX^zF!{bG8f4H~mWvsl1r&DL1Eb znF3Kft4(D@6W?71)EswN>t(MX+Z%lT-xC)qf&?p{EMsc>GV~*l!cT=mRIhI~u!Q+U zz$p@{^6VRK#>v|C>nd?P)-DI8R;-E^r7SG0#b~*qwX#a$&4Ju-0(73(j}*E(qUO zq^sluC5nzS*@c%Mm!uoMbZf-;vc9-OBTxE8{i%mGUABza7H$ayxp*gqt@~qBBQoge z!u}^c>DPTJ{tc7_%%NiZ97#s6j>NppUc{PnIx`pGaVoOD93ZMOy}j_${~}w^{_QG;(1UMnds3~J)Xi9Zy8+W5y+o+K~Ne@^No^U&c@W@hz?w zEmE)usL#gM#N8~mzR0AdrJ*&WAbZTgv_7k3%d!C{tF5<4#Hk0$5xUW|XfC?}{gDd` z&~*a9`jkY?bT$yxbxqOj3{%1M_WOHLC;QUz~Cc4Sp>hHQA65s`HucPdL_>$RXgmZOW9Vtf(mGR z5zGoAAny<^oRkoDe?Z+`wTQ#C7VSK(7Y}#kgeAYMq2MA4;8#a>!G9w%DP~_56JvHD zcWLVGt~0F;vERK3_j>T{Vpz-&c<@f;;8BfHabMc>swk@kMDwIX%G*&-wtNz?oHbz7sEaNE|b&Ul{#586L7)lSB z)6tqY1}#R+PRfzZcdE3`N1K;*smH_0V6C_;^P>koa=9*{p&9Jdub2xfk%O~cZhkPu zw|&c`=?`c4-d;l9oB~?{F#28U-2IvX(*6i}tp;7*@g1u`^2%)c&K9ge=w!5jYzKKx z-l-NebixmM4sC+8F&ET8qAuKCg8WyH9bYpJ?Tx0XR`jf_=I4>CS+;0xvHJ1AdA}At zkkuMMv6QEa;>u}V?NB;O)=K?U78P=;p0C8Zpfkv2YQFrK8VRf|++Ulst0oXDlkx#K z;cNW708KHO_sHKb;~%yvX_nG%*zdJndvG-boezO!guV^!DA1!$#% zFdGE|KsO7DN$V1TaCnnd-gaLdhQ+k}|l%l+d44^n+2Gy;i4uXoL*KW7q`)*X8GG(%FS zDdX|%!+W@)R}9Y+g3d9$%lY2O&Rm`tEMXH1SZXGIu07<(L*S;x!giT`Ue??S@_Iuh z5n>z{s6KcV>FxirSykLcjxNUKI@;9w$dUEX)-Uy%Idd0|Bb!fk~)8{9dNd0%MZysV`i z!}tk4Cc#+Z>;AeI>S$9tfs6|y6?R{nFp<+|ef)RHc2eN-mdIqmpb=aIY&S<96djGP zY;#P;0Wwi@K0;?F&!yu)NrF};@8_VD$xttM+c6n$wdl?6+Fk@z6$i0dd5W6+8fu)%>@vdqcInA| z;dlvd9xk*)^Xb<2;gUylDJ*=*Hn*Oapv^FX%{fcamgHW*_qpPe$v~+Wy)OD_=`zx_7nss@Ez$?L`5r!unM49G9Mp z3&&;t7jJ0Ii3F(0n4*XZU-UFCr`}%{sE$vmU;9)RImvu6i!r_I8_O8%b2p2b&rYGc zc}H7Xo36g`Q%3Ps!v{=8Ua>Wz8PZ!~l7xRbQ@or#f}FQoAH&q+svJHawW^MXany&& zi2GhSGf7C4HkVfIe%!KNGo?AZT-LkPkHWlm_C`uVuMbG= zEL@5f%DMD{2-Mahom=X<;774uf0{`C-H0@1M)T~drUqJ^_{kE@VyOz?BfFfn@w_Eo zMFZKtIk5CE+~4Ca(&tiXX3p{34nHZO$pq`mjMH0FwJhex; z1yB&R;nnK);waiBnCV}?$QFlw#(;ewPoDg7YU+dJ%$DckCmr}Xk|E56KsY^|-s|3} z{OlPMP2gfr0a{W@MO!)FSDkeiol5PTDamnQLSMl8LK10&{Vm89(OE4`hRSKP8K73} zPZJNA4cB`fjblkDq@1-@f*beD`J0ztw_!>5-yc05uBwxS#mU5tZBoUUjHEX{%Uqz&WD-W0Hz#0v5MV`3G!x?>RyyE4N}T3oooBt$O)W4X3^)XQV&dv4|xA zRF|53oo|aFQY%ywvnb3GD;NuBllUX_?qlc)U93!ha?IwxSqf}9l2|6B`FY<)2%AG~ zhy!rHBC3YFedz;6(V3~zqGcUSd24>LIr;&4Q;a^VmR(iSQ_tl63yapDEp^|;W83+n z*wIsfaBWAH3@3Rk6jiQ33{;iLzdcf1BbY7Gp!^lBFB1K!>a+f){oZMv1rG^*q?sGM z*eULmlpelQj#=H@M94Guuo-(?e$NR?e?TwX;l2o)RjC70A<H9qBb>+YDaeQIA&J41+IBXnPr4 z(bTmMk0FghQ9m?H_O-%bMQg!92d!k4?DDxM?=}2cAoF`T5Z9`v&s8a$;5E5`L&O6- z9tT*WnmG)QV|u*4zJ6GBJpf@U;{%v2L$QBQ^oQ4%DI> zOA063ETS%2CaDJZOnr)r-Lnm)XiKZ0T1eoG zwtQy6y#JrudXqcn-x?g+{rhvb_X8-gK*Y+*NMVT4g)P&SMt|SlYNXOp!Gh$hznl78 zVL`Paq(`Q00WJVJH0(<_D}?e&-}(>Q%RMcYi@zee|CauaP!s?8s(1xvj|>;!&wDj& zR02fkHSO{p?~AJJzlOTTRmWjwKK;ZP0_%jn%f#5qD#<}Sun&mZL6}I|5TD~^_$-*j zXY26(I2Drus&7Wr%t=o@8ZPEi#atFhRoUib4W%S{0+?XwH*fr?XutcCz}7>)@{J3- z!rFSLMvdtrp*XDSdx^2!n2+z^m~&R|0{9!n`fy~V`jX_1O6+bX2*>QxSetd+GcyWS z6T5eFYQIIaCiq5q|v4mhc!TO87US$HkL$#{ZchZV4!p2nGg?SB%%-5{@@B7dd!2P_n zaV3Hb(c@vGR+om9lH1=LBzm`JSowPDA~Zz~;e6KkAk`A!b4f;ud$dm%qWmo2%zetl;L`6pr>@ zC^4{r9FP>#R}v0kX`KI*^iiXfqZpdFu=ukEL_|_MPU3a4Kc>@E7lpHIBa7OkCryPUkR3gE9GU3 zsk#Wx^`3lrbL+Ji)6`9$_k$a?0_;thlB=1@f-r#H5f?2hADKPfp>XLzSBPPOHjXNb zZ?bqJF<^>apwX3Y9We=pq`_NCfM52n?hCuy+UQQZ#{6+HFt8cSg*e)M5EXVfB(6^h z-uqKa50qCv@-U$`SUsqq;m=i&;ipZ4D_LRZv4641D~)5kr_aEic>Zhd-lG7cj0|^t zTbCEibAN^PVUX_U6soTMeZhK9p>8?6Z2l^5izCSnx>%&z7J`xD*9e^h;;UddX8%HO zUi3gPGJmxT5;qM=gbfx4<;)>_f&i4X{)KI*P%xwK3Q1Mq#7&rH`Y+rM_}KLp7e~-TLLfpB#IRy-JeJ*N1komeXN5n5wrP@%Wnw~wATAxfZl4E+@LjrI}?G70AnbyIlxi6xWeBsucOpP0l znH#Ja8N40D+P*`wHx?3l_K!2PnaP(^F3bM!Bt4U^@i#IXJ0gPKOc*_;)^${mryGEg zf?W@3#5YOk$LP@fW_d02i*amax68L668v2a)*b?5kX4H>edMb0>&8E{-wF~Fe$y0& zWV`L@bGiCv*^%z>|h4-r;wm%(BffjSUE(lOCW?|x8}_2D;B{& z66c_qJdv6G*hN#)l4L3N!H?%Uls|6lGpMkNv+$0%Ifa*9 z$SOCe)nAvqQhKKux(F<`@6I8C@n^|=$cC%XNl?zuqc4aZ1(I&JDl*27qjd?-^LX|y z&59mP5^a62~ftETy7zN!h;Qru^1}7?>H$Z#?yD4{~LCX2KnF&)?)TUwV zQmz=?n|S(6O^ZHW-_5AVCr9q{U2~f|1_Mt%N*BDtJ$W4QX0K1rY_vsPP;J;42?5oW zPdCAj;&M+2WZS2Ggq1W-1%o|lX-90jj6sST^0Tw84D!UeDQ=AL5N{+`Gw&I0`?0otI%+G=f|+tZUL zYwP=g_otrwK~SA`R+vKbT7Dhi((#f(aI3WzV1AtUNZQyR(tb4nmixeDqwz=Lm7&cp()>oyte+ts_5E{fN;v1Z z?JSWLPyoPV${|^n)#{?CcwgwQsbKOwO_!f@VE5cf*v_vShNn`Ks3 zaZikZY!0LZ9zRq}4x36reWZU{B86}n$Y$zLw!)T>yY9_tIrmWmIrpuJhyA$rZe!f` ze_^KJt##BtQTIg0)(>-B0Ly5-IHpRhCmLW7Qzy!wnP#L}aSxa#Lh>psEfV)GHz&pA=e(BwKJ6%aM?CY$dkA ziet167y9$rBSYR?jx%a z=-USeK)zBL-@oO%@`gfjT@m*`Z2++&Hrq-nZm2sBSE---QM|0xYbGZ9THY>fK4H>U zIDN!4Ja z^KI?uC?W{hpUSVSsSx3AYf=aeF+sxmcc3cuqN^KJc zKAaEh?petyR~bMpV*uvfls#cmAF#KHa2b6i6ZzTCmu!l5{;B9t;>M3pEq@6%GkDm0 z`C(F#q3@cIflqU6W$)I zg@&1mXm9&D=Cpg^V%F7mXkKN-H-t7Kxq6w4Jm{D^s~ ztUpn*ybVA7M3|efx%g{;wke5T=ksxs2+rG$%mNQ@1__vR7io< z4Hq{PvMjELE)_wzKx-f9-~%1N61=sVk2ki~4`56l3E6*7aD^*+>FlY?^JKf0BSg+! zPk9m5Q4!>`s{!kfy&hJxXZ-*1gL_k})I!{@FCoD8zl;lkCbaAIKffJMfH_@^Uk1PP zZ@(Onk@|;};a*2k2-1Hk7Mei9doPwZ1)MYF&O=mnKNd1FT*Nc8%EHUBTTLfL} zuX;|&-;QbrhvP8$hH3{Kmj6CG>nGVB7o8fQ(3T5hpFs_%68?)Yk+ig155|{Weos%w z!a01r7!&g7!{cU{K9&0#j^Zh?Q3zPV-Z?&dVG{b^tcvg7|2%3@JT144#oyVaIQa7O zefjFmpAh)JMY2Qo|$w z4FCa>(t)C}%Q5mwZY>9+X{s-IAZHVvhSr0Vy}kMS4X$0p!xJ*?UKppQagPK-!|eev z-gIych=M65BgzD+utX!f&~vB6^cKi08RmDm!%&5SF?|_ba3!4p@5ZE5Z>Jvs@^uxx zHWndnFwoPrc#1;uW+jqlHToOQXE+&|NJ;8N6CuQ z2=kI_5k&DQ!?Z9z@J;(=bUgTS;PR39idj^F_5!D)%L9+eD8STcNpbYJ*P2{U=?8sdO^3bDWsrvufo!fANYS`qqt$jFp}F_iD)PBlCS+LHyGdME4(zWQvHgC!^a3nH%_Wi^ z6DRurB}wiGeFmtakh`V1vzY4cy~4+G8%#?t(ciB{K!Yzi)>kBlXf7HGn=C1UWd@V+ z0|ddlW~797`uzzwa)Z79^;(TlR|WvJeS=N_I>)NVpV#9IU&EXt{)*Ts(Q#4#wEomh zX>Kh0QWCGf{+qAYdEq!FDk3^9G@ramNnigB06JX?mqB#`PY|IF1?m@9<*Ca`KUg)! z8k>VqGG^mc|EGrl_mkSv3%{ifW)v!uzMzGk-iMG7dk&y8^S8!b zBsCFRQ9S}=AJ0_8zaG}hGVFW~wl`Ulc<2|#8sm>6V^!?;P6aV?w(*<~Zy>P~gd**& zzK{^HEY5(ZI$Y66V5-e_bG@%r!2&s%Ytd^G!Xx$@9z(A5M;k?=Q|&x#I}U_&o>|t=UK~YKL)i#bja(FJht|iXy^MHBwREE zoSaM*B!(&^msACp6$Jpecb}fZUbQP54s3CnEj_OoE_*IhK(*pqKk6VbhZ>I@5sbOEGLDHrs$O6B^IE@$Uo=*!HXq60qD zd!#h6&|WlzebGqoWF&J$73H2-xmYUGyqZqw_A2y6mPN;WusI3YI(38@0Fb1n+eR+yuB$>{GOwM)Y^> zC(T&_E9Y51EPQ%4J$-P-_(3FV8ME)1BY*4>IyK7_OpLiwkoxA+^S5o}DSMAt8jK;>iq1RBe5H3Q*J>2F2<_XT zcA!(6D8JpYjdk@T$%9teF5!P)`hVa2XWzrL1^I#yr1X3FYdwX&vuGmv4RiGr6sVI=Cc`kUO9omGl_1DEZ*7<^Ox;tAqpqa8y!SL+S5Co-*M)vz7|A106^Nc zg&Ps8eq`0oDtt>MVud!x9~eaK2j(hxKtV<$jJSp+*SM!;Q$B?nw~dj_b)TC2v@0bpFUBdq{=QS$FeO!mp%=Ixa8gfvFIDf(2!g=m#&{i_BdX8t>dhDipdkF=fb70;PFJt!31bCygQrBg-eS<)Fdd%S}&F%I7Q7Z1mq zxTfYS#Z04Q-6Sgeo&U+Y)p3JPSz^BJ^p|UN&mQc|@AFSjj*kzFq_N*^bjbRgsF|Ca zj|(_WDj)!>-VmTv?gRAck@=+a#+)ZU997rAI-MX(7(5{CnN zw~VQH-n;Hl4K9|x$AzD+7d%Rx@SMg_nUmD+ILIT6m%8PEuhc*j;jm0?`UK_okFm}) zy?rno#pUQ)uzpYM1wNJd_=yeiRVx`Si`QEx_H21N^6JmG&&ngObWvu8|DR9(V&B0i zHfY%{vk3JV853lwUNqGe^QGJ8iZil*- z<4A}U=JML6J8{E{agNA*`pD@39M-GWc+&exl$-Q_`UzM#vZt^E8jKLo)YLpfrC7F; zB-eXZTRlC_2Wf`CAUw8*He0rn`!`F$U~0)#cZ~JGOD*$J=6jZwCnUmSR!h*?Wc0`mE1Bd*h9voZbE$A?k`IeF+cK-|h!KIQpd{@dEDc z5fQU*>NpZpidq2sed1-U>(@W2|HnsvhRDl!22$$P$iII5?XIaO7jUNt)pzH5^1I&M z*~XRW{FnD`$*H7Z`sI6!Kd;=1u)DZRV;{cNzP-LUb{OL+o1z{U7)RZl_&{Fi{jt(( zLyM#II}dUT3k!Gk#{DNK|9xFj0&c7}6s_sdkB2Y9!m4SL`%B%NyJYRh>xZ_rdQ#RW zN_sFnJYz4i1po11P(<{yxB5|#n&<`fm8!snD_3^U!x}tuIdNs!%KfHR)o_(R!&lb> zzYep5doKyM`9pai7$YLW)FeyXhwnMGoqM`u$BrGF?!@s1xstG7XJ*0a%VWy5Xz?FJ z-CQ&7)2GuaT!=*Cx{ITuV^AjBuS3#ie;+?MX7|IM5RQp2_46bY_~huEmCJMb^_GJV z;Fg)0XFUz|_4}qu*d(k+C&;8_naLTY|4hrz&oA-#oSlr5a}&pZ12bCCz+!u>m2fUD zQa~`ud9Fv81Wx@}KJm-FU2_#!mU1sVoM?(;z<2udWqQizm8PJCo=)lY#;Y02@Wq(^niqVh?;UO`umR>F5(MZbNq$1=?uJ(=jNJ1QTi|6 zdKvF^dKRjx(0_PGf zyK|rIrs6Myc_H6g?DMOc(LR0b`HLYWG0Z?}f?aPFt;wnk52gN=$nwwpdM|c**AtU> zx6K(szM?I84dw=KHT~t=mK>Vn!oxfHeu423Y9zHVdr5lTH3?Cggu(uasWo4CqT{Gpd(nb0u z-c9M9nq1(atkqzK!{BTXl1N5J&&Z6z-{ycmn`9FoUmpIh`+mtahJW6D{{e>Smj9Ee zQ(B3(aP4L~c~nM*O~Hr0s%RqCU)#`SM^p;Ov=*>@f4d>1YJZI&ilH&2xX*Q3T3TJX zcNyf@zHO8JQOWd>3Wqs|hdW>H4Eo0f7cVa;UZ8S^y?pto*QT6mW zrgqC|G&Eg@TPpdpIJ$W06VCA(*09^}V<3StrayV`%0HKJ^!ud?I0o-!+GEY(MxD!? z07)`Ea`K0{YA8T@SPO{H+ z4-dIm9L2@c_{5dRRmP9%#`ZLd{PAVKJk7g`AxUq`UrEHeHC84 zb1BmvzkEhG5$5OFDZhh@D2Y-B2RuIMYV?ywFkZ(JZXaTH`F9t_xkjZ2fTXYBR&u4?CFt z{m8%b@?Xdp?w1h^y$Z}W*M3X^9#?1LRl6D^?Wodg{n09TB1Y8W2CKaLLlSV^nyd5u zZLF4=!ph;y$dtVncax$&14I6jvWlZh&~eI2maYx^TlC~vtgr8yQGR|{xMH1GJ@$2@ z^h~D1Sg3YNj!Dfe%pf4}_ClM%yqWBe;x)#a z6sno+}jRt#Cn@b=ms3!}rg$5;X}wZ&&@c zWpG~se9{5R_Ed;n;sHlQPR2YO_PrLn3iU}NH}0d;T&rWJK{yof4Wj1F@uGI4U-F>v zAF~LQ8jldY*Zy`~=O!8(P0wL|7#!3$7*!%9wPc7*M;W+WMqf@nJ0AF!v+&#Fy(yk# zQZhngobVU;P*MaEx|HQY$S&p7Js(57q|hT9Q#KRx|ZftjcoUkh1@22 zJ&yNHnQ(xnD1T1nfrj_&Oee2?S%p=<_aJHqi_X!)m7qX3bo-N~)}7e~Z0r)&eIN4B zq6A?mlKI}kCe?XgHqKjQvfb{d>7{>Xv?EX|-cj;oDvwfj?{%^8aZ&Z1WDnBPl_xvt zqLN*>Ae-h@(94L{+0|pHo9mv_?P+vsB33i=T_&eL`sv@6Bwv zwG^Oh_mwBwN-DwBBRSMV;a=bj)NjFt&a+)PBKPM8L5b7;3QHo#A0*Jdv-Yy0?ZW?F z!`>{-9^7^Sn;=G&Wm__W6J#u`-!0biO>97p!K2y8_6QsW4$nA@McL?3+nB_T0faBqK_{%pJExx?qo&xgYYujvIo0>&ozmsL4 z($7f?U|f=Tk{auJX0CK~z%e$6g#<&eUmoEv>^mn1z$-sR*DAlG75+0C7@G1W_$w8h zHixhVXI#mX$qP7}z^d(A^G|mGZe`tHoD2tX+dgf}DjaZKmM>o>=%wDNc$%zdQz|A$ ztQWE9`(SHPG!~}%alY8H$28pF2KZ8xiSSQ*f3lt25U-6l%vV{e_d7LX56#>OHgtCy z(a^?+Kd0>WW6!PMoQjC&+WKM7$;mD2_IkXV^zTP#{+$G_A~&~3bmBI0oZwli6U1Q+YiI}TkfU#k*q#lw!I_Oeoc!L4t4 ztJ;h?q~o#N(MB&b`{I^?V@G?wW#jRa|`9u_gX>R-YTQeFHTg!ws|4Xtkx+ps<+cGw$`iSKo0_p{^TT+U5W z`xiXJQBu^6DpZe?w}^2hSQMB}^%mMpw##4cT^;4H^}S|{ z(`?s~f|UhAmfpQ9{AADTduDd(NPH^THmm)}gx;JZ@TAaT?E*<> zkqq&_yT^ZPsXpmnhS}W!nL?Y~YG1GqdalBi;jL?g4jou3O!)kSHWhj$g4beYiyA*b z{2n`?Fj5nw4*B*fX8o%=*7V5MgGYR92o@tn_rj#V5GY-0ovwirzhTv+`gvN%luZz) zTr1vlIb*s8&f|8M9t+XD0f2z`VZQ%kYGaH{s>GnX2n@hJEj|5Az73?4^(LHJMt1SN zy|^=5gHbsOcDYba^(=Gm-0F79{v`cjb>0J{h?>MCY z0^zoCovT}y_Z+=|6X`Nf47gG5Nj8%-D75asCr2R^mW9rj5F14;T9ZWG*S?DyS3VO( z5C!08YOI`FifNc`iWJKhB=Qo!+B~@LmcDHjmdDlXR;pTz-6WU9&&fR^J+hTU|7%5> ze^Vf=&c7)TndtxCFypQbLif>irTcChpx0=pKHHkSl^)Afo-mzbSs#Y|EW!<(u5=pV zJfhB-*6uUnH5`e5La&mMRe;3;wr+dMW*wo1AupkNp=tiuR$OU*it^m`VsPOzF%SOQ z4S3Rv@`OSD^0uA(E~A(=Jy?#zLg1S52slh_i=&7_!z_zb)Fi)gwiJ-|R5hE;)gXD2 zImF!>b~5{xpM_lUr*xBl?=4i1wkpttVlcN=fk7?=Gy-Ar>!ZO-f9(|_l z%TiEL&k1glD$*!et}Hst^@t4yama}0d!r&}&>33JN&^fkclv2&c6K>=kF2s$PKc`)FKAxOriYJxw5;f@1KO?M26 z9j@%<&%4eU3-wl(ZIJBZig}?%k(dIZT6CNLUUb#@JKM?jIu5ODw+vmz z@&J(#SXYO9xW+f2$}ao7{?U2CP>!90xV7r%uMs<36?2Q{i)UKl?x8+ZAe2)AIb;Z| zMix_pMfMXrjS_FHq>e9LoBQ@g{_h;^n0nm4Cqmc+JL(ZH`ahLnuhQYq#)Ft(lvp8u zsXd`(h)s5ZTtJcLC(aOI1(V?=l=2L5?u%b7;Jq~WAM_j{zcF#&JUYB{>$xoq8A!Zp zuOrF;kmyD^ljt31fKq&sSHtO+gfFK^bHHZ$G@HS)fC7R|W^lg_LFE${|Bq2^C6?lg)2FPj%|vjd7s z3sw;;S3Q9kpEbCC(d9Z?;kQ$xKwy+|=meeDSh2v3{DUcG! zhakbfYg~JITsZ|yl7|7ULqpEnt$XANKc;jqL9co21rG43MQ($*DtTiSKmSMJ=|-s7 z-Kk%W2PGX3l0D}EwQLcweGW2XZge?B?{A_w^r+lg2=>mG-;Ynp>)9&InU6145>?A)>I$r|D(+B_Dc@MVy)KpBGfgFBHNB46vjB zE9T){-mdGDGr(Yw)IUJM?=8bf)h%z35Mbvb@tV5GztC;n4M#^##!P zY^Bdn_K?t<-dtmEt|l?5NsWad=2&X;bo_di4HYhGtgtoJ&KnIHe3)08Is14PiUO&3 zY51{jS}yk&aH``eI$I%W$LV$mTU=u`jHG=)QaetyR>cJ+R4zyo{`C9vkf9_ke`to` z#aY3s71MI^N`?sTz92;5xaoHyYTi}5^L9NN-hTeI#$P|7mwtQe z@*v)*+@b4^Plt?^Xqn{jv*U|SCkyy(A4?XnF;ct{4w1O{xK*+1@EcQ|yD^T7!p^2%V<{S2E6M!#iP=^)*;(IPO6DRu7U}iQua^MSzb)JHc%?^%xl2l}(;~V9i{V zp{|xwV^E-!-Y{*sKK#aqvo^>i?o8m6N%@(TqG6p8w2Nt95S&r1)XdOur#9rY7INJr zaV^WN{97HMSy?0^ckKY)_htuB@v^9dBL3MnzVEP5{B*MdLsl`M#|$KZNr!YaG3eF@ z{lKbA6C6@@e`rlK#t`!cHwISIIQw2p9fYFGM3iN)f4o#$`~cad zHSYN^^d9o3y|&T6Ee3i#9f)rO%f52TGCmzlOom!^2y6Z(T_f>QMz8$N`xIzznoey*%FBprN|q^+^P$H@pyP9S17qap4%cl^Hh>frRU&BZ$DkyU8P%6dX4B=(8wK7K)ZNoQm@8-~_J zW7E$;09TXInfPcMt@ww2Uyj9H5^wl@pS0}yF(TpFp{3oydWbesl|TO`r!#w;S%lg}M@0f>pqi7(#`QrbQ;0r|y;7@aesEQZ5D@#_;4p1M(IYL{;YDxB$k z7L_3AFSpWloS_$QY|T5Fsw<k7NgqOolk^=_o`a^{;_rf&`;Hu*_%UyrMGMJQO`nMFm^ zVX}G22eZlTbGDq+fj5ℜ=yI*w|@l-pkk1;*8*b7$Kc+jO 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 B`HBDl diff --git a/outputs/overfit/evaluation.json b/outputs/overfit/evaluation.json index 4b36128..02a14f1 100644 --- a/outputs/overfit/evaluation.json +++ b/outputs/overfit/evaluation.json @@ -1,11 +1,39 @@ { + "target_subtask": "steer_left", "predicted_subtask": "steer_left", + "goal_image_mse": 0.0246433112770319, "trajectory_metrics": { - "full_oracle_goal": 0.47031369805336, - "generated_goal": 0.4905388057231903, - "no_metadata": 2.457864284515381, - "no_goal": 4.042560577392578, - "no_history": 2.1593737602233887, - "cfg_beta2": 10.576497077941895 + "full_generated_goal": 9.339226722717285, + "full_oracle_goal": 9.344671249389648, + "no_metadata": 4.243795394897461, + "no_goal": 9.066949844360352, + "no_history": 10.404154777526855, + "metadata_cfg": 19.987443923950195 + }, + "normalized_action_metrics": { + "full_generated_goal": 0.2848391532897949, + "full_oracle_goal": 0.2848338186740875, + "no_metadata": 0.37385478615760803, + "no_goal": 0.29379916191101074, + "no_history": 0.28792211413383484, + "metadata_cfg": 0.2725481688976288 + }, + "rtc_metrics": { + "0": { + "postfix_action_mse": 0.2848391532897949, + "trajectory_mse": 9.339226722717285 + }, + "4": { + "postfix_action_mse": 1.2005467414855957, + "trajectory_mse": 2.2003140449523926 + }, + "8": { + "postfix_action_mse": 0.12100008875131607, + "trajectory_mse": 0.10110154747962952 + }, + "12": { + "postfix_action_mse": 0.08735787123441696, + "trajectory_mse": 0.11811599135398865 + } } } \ No newline at end of file diff --git a/outputs/overfit/goal_generation.png b/outputs/overfit/goal_generation.png index a38255fdb40d021e68bf66418ac03c2ea81afa25..5dc953720b2a3964e45446dfb6bb93dc9e65aed9 100644 GIT binary patch literal 63265 zcmdqId03KZA2#evGdWF*(_`hBrBlu1l%=DU<^oKsZDyuvu9UcBic~6w2-Gxci%TqOhSH|xa1Aoy*BOHMjuhavlQv(rksp)4g z#aj5CO}&tWNKHzJ{s|d-DJ21syu;bm)%mw=Kb=cWy^!MN;sXDF{=*q@Dc+^1>oEd2 z%aRL+LQ^a(*8XDt`6_3M^1;GFm3Mgmo}kP3B?im(n9xwUNgmlc^LfzIf2yo^ndhN3 zCsyr0v2yjwMK^6$Zz@^fCoVn^ zmxShvpWZ#nff|OP2ONxFaw)cqS?63V%^buFR;~9+ z{nhKjhu`O4L-en$(k?pN7Bh_(7t538H5GyaPBHUKR?h=$5&r|YdvjDWT+Ae_!Eh=**rup_LC#_(*`G-rr_$;6ADc~ z&Lm+Olje^y=8p!ke@RkI_6^L>r_T3;(A~5&p^lc*w%fuY;%?OJ&5->FG>`WX&LbbF z^e1AwNsO_}<9P!%^ef=r0{YKFF&V8ZIh9fYXC&Q2G_ zol2kBeQYJvq=XJQm}VW)jk-#lwz49UiiA(iUA;B!i<|eYh-n{aN>A%Z-;>^(SnWSh&9l7ivfPuhr>P(pyoAd+Za{7GGljv^)7Cb_!~o zfIeg_++s{coEy(xl>xUF&TSX|i=R5^7tv&KAwaJonouHKEl%6*3vSSk^!+rJ#*Q37 zm{bT7_+`)XEt#G=zR-H?N9a8|;&?lqj}&<_SySEE9y)@%Y&FXFh> zPJ@_XOq?(2^2xS4nJ?GT<+sWVlK6Cb#@80bYm*OsWg!#UvMwJKIaow2gKFOwdzlh# zRxL*D`2O;4U71`{mecl~g~f-B8ZOBYHnaA{FHVXRHs*}Bf*w73lwewKYYW8Pzl*`* z>mHB3+&)L)4OBu5(^J4c?N6QTE$uHT;l-!a(Nx@i$_Ey1Z<`MD!HLxFrk!;#U2GjQ zEfkop8(Ag|1lSLQ7;3t5D;(HToE>IrpTo>HlLt=W;hnH_=~4olCa0+d=i=fvYsm;5 zdFrr##z|4*WI#vvvDPWR9Gjl{<-^P4tq!x- zeN(Z}*CQApQRSEcbNr{zjP&;P9e^xcgG^z`9k&=iR30bHWE%Tsn9duyP9Ic3R9Zmb z)}oBCk%0=|3Wko#5bF_-Pu{RMO!@kntHJu!w>r{b5Zx#X36`en7iN#68yuGN>tVhk z^})K9PdC%XJuW#AKxnc8V|<-s<*QIA2CNM4tkSR&KG+c!rD`ZX;D7m*^&bnDwQ9u&e!Lt=pJl4rUN>&IAzhuM*)fzV-0P5y?m-Sa!2VgkqL?rDC*K_ z)jLA!XGe`jJ?rsk8{9q`@;+(23QoyGg+!*Es`TTSGHRq;eb?mL&K{JJlbmwTT&aG=((N0dNasi(cXTNN87fp{Pp7d zIboqm`dO`~9SNd&>yPZTqdLb-G`Wgy_-97XbGpDIk!*9l^fejfCc!i`Z@Wo<@rAZq zHkMRDz9^-erhFmXQ8m&qrN@}g)DU(UUs&mXuZ-B>o{rV=gaVD+Gz&5MrjF-%fInpN zW)$(*$@tG?PJ5?ulylC+fERRdfLC$7rnQeZqFdi3lb`18`hy6haxsqW@69<^d?fO| zscIId@4`uXHze67iGFn_ky)#uz2Kg@luuWw>?p#P<;~ z@=THUU^R*E)jTOO@R||=wJHk3fOY*Ruu%Ub6%)%07c{ip53D>6`pJ}oTgdT7bwt-I zOs1C(`aNM)K{5*V=#Iw5#_9wT&LH+?qPc@*NCt!7nj%^>GV9Gycu$kzyfJvAk}gXl z9py>M;YN~4OOosPKu6_iOt^6mY=w1-@e)$P`O9eTtcyP3fNm8qBIe?N;6I9PZfPmO z%GFrJJ?6w%EY}@qOs4u=C>2gNKs1Gr(zwP^%Wd&OI%b+-6f=4z#!w;x0r>-$-sLmt zI(@_1@w1!zd52#P|7|qq;60W|PRYe-igAaF@7{e6;E;ZkDNneNCmxYkLk%JA!9#G=R6s6+~0J9WTi}#3YNysp1C*EB!0|Q9XfU z6Pd~oT$&>k#ik01l1Cd3+^q=On%22);^h!q!#g|vF{Mm#U)NEPpN}-E5XMPF@L&?y zE?RLNgjS^*RRA`aSu_XqcU;?!{%7#~@!go0OQXJA@x0nPaW{Mf&h*D=2jw<{k;Qql zHWi>=7OT=F^W#$fgb&bPkHyEuy~ob~H=QGyOy)E*O68W0v0Sn45CgzXsoWDDQZg^O zkf%?_sne%-u_HDyjRc{FKtPR#$x$q{^HWx%ap~^}N#^`)0j?c=3}n)<K&KUnt6cV*XC);zULwgL*j&Up1Z66;A zM?@OXVpB~-x$&)5XTAWd(`+mK3#%F)Wz=vJZXoosm~ISx! zT6X=p!z!}l(l*Gay3?Rg%xK{w)v7;19SM+QNeB|h+AcUKIW~-W)>TG-UKuN4 z&^%g_!qI0ZC{j5%Hi3sgQ;LcfAVM?X}g7Cz<;9wBc-hrLDLjNPOj zFsV%j+<+OZrZ8U#pO4i^ z39#|I;mOlJ6LA{gWR1+ZnlZA&wh=*am`>+^?VPn8-(H&_wxGA05oI+ZD-3!bf#Bk| z31`;}>$M)LpM?iUY3THL%m~8pmZ*O_W4B3#RE4P?34R*=F?Rg6GG4X+F^!*yfY)GN z4-2r*!6RiiB_l_a*uawfu7_;zSw;?7U3k!RP+&MduLv?fB4pA%4hX?1TNHD zdl#Wu(^{ium<)u<*Lit4qDEnX*ZmcS(2eS|6$naXp62}2 zFsZU%KuijVuesE4OC7n|HpCvz{Q<2{HH_yzPJ7(N3-}$8oHGDmb$};Ok^4)cW9uivX*IO|xmFgYE~V@oB9wFg zZr1|{*crfA=&ekn&}>?+N=O-NZvFVbQd9k z7s_~B-Pu4T6Eu3|OczHoo?~KDHleR|bXq8p_(=J41FyC)ioP|P-7IOl840bQ;3;i* zR_?xyt|N2s+jJp|p4yU_;%?I@r6l?x4P8Bnv2%h5 z;ZtxAnLl~eo#LU|TsWLZtBS?k=!;E?bhm7T&7LA<4FA%KySN1XRDS*A$8j@;3YPx? zkzFh}T3`>_Dt|@7WW@b|I5ZmQsQRY&-wC%lOx#<#!|L+B^GQiHip4!2U+3@{yMRK- zXw|Brie1pc{=PoY83UOv6W%wi;c%&@V0ZLd4qB@+Phug(4xeYU(ifIwSPh8heZzGCF4P@vHrP4xp{1zu|68CQV>;{;&9>G%8WR+x*y!9QrbR=WWcSrT}5u9)Fd%NENr zUrqj;D0FL}__BzVoWMNQd`voOrZ)cvG#aLs@d>dU{HG`gJb_Q?mLgcVt*O%RO~EVB ziFy?eVU=GEOr1i*6@9$VxGlj4A7ACslGq%k{b+?-_-fiN04hRs325j+AZm{GtFiOG zxF!Wf^_g;yxfcB}2-KVe29WL}V2*PW2=Zlg&m;s4-KG(Pil_p+lR(ur`DH)?G%WyW0{Fg`j$K};H(=}k$N~j)g6AF*}`=^&hkYlq1w=;w~0Yw`$ zx5<9?`h53ao2(Y>(1|47!9V-n_QxX@rLxb8+%4?y#{*+lHQU-aLo)V&tO)n-M}X+V zJWEycZCQPS;Zsjfk6})#f97pfj~j7#>an$k)!ceh?V*ajEpwAFZLc}sf>Q`QntA$r zv74?M;|Vz5V+P)6IWqj}U{RTD*G8RJPlkK6ofIyYEg;zBel;+A)hNi43>_Af$ht~% zpN!Nsh*!|sL!%Lcp=FV*=kDTqSKi(5+F(mn@VkRe*DQ65`yQXPNi5i)`?`QOE$Iu9 zEHp5vAG7W3e`9dE!99WnF`48+pUt!ChNMotn<*yMw5#qK9=G5wPJhZ?<@~+(UyX&7 zKZ_gg|q$&{Xu_EeCSqi}TN`_oZ`T7#KM+R~aU z%UZ2l)%yU*lfHbJ`yo&Vv#fogx;n?zeaZ87nQ(O7(a1*>98j@MO|sqbHvRB* zq1C!2dcp}1Wy|_dBQRp(v>^A# z&&#X!G+8P&t9dqj*2>X78dljLwIbJ{6E?XQh{*}))7{k5F_I0GX5v;=@}beOfw`WE zxkdIj!^K^|Y!RY+ra*WBEGK6-asvh3o2@M~*L0}CTOLh{d?2+qA$N3We=OktJPrOF z4_SYK-b}1F)e5z>X)Ir9`G;EpccBYe&_f=7fEGq+UwsB8Wt4k70%C=Y)q2i9_{{Z$ zGJrf?H;wIFFc)S$H93?@d?BCMOE)~aG67Q67f7pf?b58{HgR8Gqn*82HPpd{b%U*H zYB2A_`kYdaX9W#*hxvN*)PBj+%yhJBKjeb0r)`lzBidvpd#B%iQdL>$l5Wpt=83lk`*-Y9QW@f%_7-}q+*_!eA96K@q5D^0?j>{_>=9==*afb zB&1R2i~Z~?Q-_u}ONLX?2l%PD-2t8^Ute~EKQ$Hd%R9rHLm_I*KB>Zoh8?;1gRUF9 zI~62UMhcs?Z4HJ)3mQqve$_NyM$W;mdJndS5u@ru)Y8B}$oxLYP}NagJn^&m`y$QB zB&*^h;g(nSG_sVV@#l+VqVQV8Dah}9!~Js1`A&{wbjGmZ&8@sF(&Y}P&%)3sbzvR< z#{$gaKJdzF&gEf4OnzRMfRhZ%!hHYO#x4>H5ZZ8&wa*6C;oo)bkLp<}6fuL$l5iYn zhD6$t2G(7URTEE?iZfG|SQr%p?&gR%ixVn%`=)%K!J!;SNw4|NPDOLCw?&ciIF6<^ z;#<^&6LeH_ztKE=5&VU}syx@>z3&y%B(VerKqZ_f2Fd!je3jJROq^UsU~ohcQtPH3 zp}tR8lfP0mdP(;g-v#!LCo;tOf2o#SF6eWjtI>>*Iub7)g^?XB?&uts2_wJLC4A$} zkYHb7;EW{Vz>dRz*I@5b9PH}z5=lq@tc&Hu-;!Eutg<7mo{PWk)TZiU#x#;0@%+T4 z;=Ua|{MO>(YRvoDa-=KwW%1ESj_ax!sAO#rWjPT?ORCU5ZBFr_PFlAeKTlk>Q&lQM zQZa9(K)@_4-x9G3d1)k8_#182{G9hnv7r_d$Y9co*1e})KPw4;%`cp5mZV!r)XsOB z8LlxlTI#i_pHls^`vS}6?tBn(&%_A-ZoajHk9b+eaz=8}rK|BLcrR1{+4BJ_b~jH_ z73P{wSQ*$J(yVk5%~4;5h1qG-EneXjD;1E5`Wv z5K*JH34cO`KBdYND>>={Mg;fu$|HZLEFGX_4$^tW zJo&$Zx31Qt-;IYgU@8UZrw^HQSBD07lfK??z$GIoNJm%(cq zP^Oiq?4vHg7+En4%Xy&5wJ2(h&25ZR2_7y%d=5n;{aJ`*A0fO*AHDVy(#?SzV%2$& zVyVObV8@d#J~4H+D6i?SG+LBhz2ya;E3`ymsVjM$^^Ub9pl?N|CF%rqu|6EjlA2`6MjGgHhH;+QANcTT?N}bh2*H=O_P)8HR zBegFx(XdJ}&LlU{w0DoHt45nmiG(?><1UcM^g*o|p&x)1_UxGf+s34kqd+yZEjxGZ znlR>V-$y$&IK2J}3pY2j#Q*Z%`G2U!plZ+ocwwUqzen}?Da{XN)6j+(UUtc0^m7bN zIt5;mWW5$0)=^esG?Vx`!Z)1HU7SB(V5bHYFo+5^fG~_8YLEXe=?au?ECyj>As6_y z2s=rhU&Q|#LnC4jDk7L;SI&3*7n^>y5n0nfxlA>|6*W;nTgVd2erzsFh9-MhC1rY= za$ZrbZ2mkAg*q2|!_=Dbt9g;g!tTz)XuL55I}ze#l5D&c`Qvlfp=68ECE5q#M4DkR z*2XC*i7c(p@f#7`Zt!T4PKHhGvG(3VDUtDZvm;XcL?((u9K|xK4MwD`=3}&Jw_&=2 zl$@pOc`ltT^Z|1~g?gt)$`Sjz`nUjw9**?@54R7eBATjDPFE~R=uBw$>5Ch>C`t%K zodTiUldTsb|H`Z&t*-&u@TVFgrgopVg3}cQc|=~lA{@=*k{_SmhJ0^j@55=mZ8+2Q zB9GH4qeBsN*j^87=R2TtFpsY#A8n{n&sEuXq_1UmpWJn!9j? z9AE&`jkeUk&RQ)V1SGO z=g6_!uMX6!QdWyWr3+^w&RLS9Dl_QsL}~qMGka#Er_5}*y0mrRVtuO1PQ4n@|1Fb@ z6h8C66VVNxaqgma&(4G}+7w%M<4Z<67U3U_K9T?kkZ^0Sid7cV5TY37?X;^e$Vjk8 zZs>Dv8hw#$<4vE&)2j-Ne-&iLD4S!H&uEdqH{vhw-~P=Xnsa_Q`t5Vs@+y}~)rBq1 zW<+g&)4DWj1XT{p$xGnVO?xA{19PH;JZ4Ff>ob-t)>BkqiLB`9Jct%|9uG4~g~r+) zs!<_t@U4m^$R|_&gzC8L6-{*KR1@b$6Xxr8&fksp{b8o*tBDQax}gTbb+qJViER1b zW@ueR^k}$sR)ous{lUEr6mbODc(yVF9s}1!k-#qV_qzo^?S@)>c$HQlkJ9!i1>IxU z>k~I=$MUu^vvMnt*J$X!xb|ZUfSd;M=obj4qMi!Avx>9x$PlXM+{v`GX!i0psAGNo zGxX~RM3ypbRFo(^8%3>~Gn0}852EyCL^#pV=sF0N#z9l3C%9c<<=Tv=+?S6}+t}@@ z6g)+8X_JHEOCxthC%KH4o#veH;8wb?Z~#ld6Kmho&~!oJotf>qd&J;?^Xt=H3h%#@ zpN!nv<{!f8v(#Z{%RuPQLatnY-$4ZGOS(qYA{(c%j-lIM3$nFPlNgs~992J%9{y}b zbc7{uK5aaDNA8u!pk|gW~f~J*|MpG%k!IkAM`#AFJTN8!BjgAzT&o>fa{`QN0%$3bz zW`?TL9D1p@$9eY23y-1N$4jG38N{RVu6+S_lNm`imD2Wz$PdD&SkxwRy?1)Op-li} z(&j>$IZ~(~y;f9iEX)%!e7FG7pzSaWCBp$;X1+&$Flt$XI z!26Sfg}&tkj?8rVQ;C}zFl*a1gX_Oo@;3uXVDY<)!h-q%L5vC@t_erjzdH(T2@p%N z@=mFCmJ`0q!R|zF(q5vTP8MFLu$rqJ+{vtlGzi2dcTTaXMUvrZ>od-B&cyoy>NpVye@{ghb;buOiGfa8U235 zSB_?GNX7Igzx#70x`O-irw9o^s7%6Cx0^FwyqS~MZco8_j{!8wWENk@Z))u^I|xYpA;b3CJ(L^3 z&}MPkpMtO=v~c_?mP(hpJc5ipO;c$%jdX%tCp4sf11;ARTjup{ds;0*m#by z!vz~)%!|Anrt{u=Z5_`8D8kEZ+N5@;*fu@=>2-AN%&@0a14l}&3esIZU6xSl+B_a( z0Ue@QF67NTW-adG^NSvan8eSeC(+6>1xVB z$@Xb;{M)&$NCF~Y(IdXynes$i1V$Y0ZKLxzqV~Gl?1&d}?lU$UjkkjPHD`?+Q4V*ZN7(&(WM&0ct~woGP|+Run02Vm~-zmsCIEHIv?Qirk| z@D+T^A~Vbu%JXVmiVe4N00r!42kpC@_et)FpwNtt)gg}@G~K>q4Bb#AxCjgIRxMC2 zpbox2wt4UdW^CNPxWB(&;9?pi8dKW<&a3~D6d@5-1ywt+C(COwaZGb*Od4imLQl}IBR80QlH{@HEPJmH5h^|=7s^%dL%h*?RMeBPxtT)cGr<-fHs0t3(u z2Vd}BUxNdDyMA;5-nDQPsy(UkP-cMm?Wh!yTp~9+7IYI1;LP2aUYLCf1NA}&xJ4|t zi2!yrtj|2EYtFQ~pCckN&6bh(=5R?MCFyB^ zKIH{SqQi21zue~o0&7y^aA|@#9NJg{H{sH$NV$NJpPQT7(>T)8b3_XQ6s2mMdI#YB zv3fdgGB8Z(8C~nsTPB)jXN$4Z#lhpX$AB3*kuv^|z!tR*l#!Z-)ta@cYNgVQoL{y8 zP9tJiq{vL23K8~aOa?SVjZSbbrV2UqmX?Jp6PX<$nH@9jpY(aII^{!*k4t1&TwYO(7GQEYuhFGRSJ7MPSGhSSZ0)QNHE-9&Dc6ZDs^6Ug4K+U)rMJ7Gb zOh^JzCYa6NNo0{!((^*~tIjQUE=ee);YFv9PTmDE&WbycEDEB1_F($`hD1jZVqfua zy1Fel(ql4bZluf0P?T|ZjxJYv7k8!4IUJt|n}1T=E5 z0kf}Y7***t;{L2)Cd#@22Uw?sywX9E5|~ggrzLxOd2u~m+E%Im1FmBiQJ25xujoql zI$fD;<3!h1GcuZYn4LGXmT!#R1^Vvu_tP=~rb>8^4(PClh;w%;A6;Bm3Dp!qOO1d; zG_nu5uZN?hI*Q$|`%EA9pE(v$vxBl!9ULtFGTdRzYdeJS_|m3K@;GPifsX(#zWTkx z!c~VUeRx>d5%k$>ilxwnSHo%f1qJEkuEm?Z_e4?qW@6H%}x$D>{c!+=Ar${QIS zZ+HiA_Ugw_p8wa z2V5h_U2)OT8x8kJntR6?i17(Pqt^GA#7_ix{OJ5=QLOaai`4G3vUn&AdA0_RaO^~0g2T#&>+_uWO|H#aQn3+Sho;(TmZFiba+y#t=~pK+_wD>^EO) zda?>>>YwS=9uZRjGTzE5%f7pM_B!;Q$UDSM(n;E3?T)a6}u$r!lhH6BHgtDHNNhn82} z3S9%U8I{W0VjI9(JTQ}arNw!KwZZxTnOOEA>pc3`*6=v$bGXeXDhAI_k{HPZSao{khE-YnmuSjzaa)T$(&vuL+?No2P?3SB?@wl0UG3I}m^k$rtW zt*jQ;!*`nwUaQBiGfUYarvBu6p^;pMZ1$|xPrS>+wbekvS)yNmI{EaLqM%&1=moND zfN*OxB3>F{o+lScE0VDAu0!db?v<2QS|16Hrgr_!ADgq!rw09ZidDb$$2O$6jYwbg zo8s5kvsaED_`+_V+@+?L$C@OM`WG+r{+I#yNjCa-1KY6$X45Enbx8d-OJN#CLS_OA zW_(WV=)N^?c7F`m2GQK^d#5`~iiVqffMK_%_1mJP$;fM~JlinnJgZ`T}k!q2*Nm|dg^&Ev z%k=gL46y?+t{F~b7?fTnx(F@?|_B>qYD|DR^lBEpInU5UORWrUr}z5fYqVDxN)d?rCp#@dmSTS^A^yy^8M^k`_4;w92Lv{xu>Zw+<$5>o#q%7@dt49CySjU9N#dRDbYoF%r?>?D;&DUA`#u2>oAKM@-mx`3$ zG+Qsv0s7v{-MaN#bhAmfC=UIN4s8O!Xy_;hTq@y)t7mjiWEw^|Ot?UCP%|ek4XAM@ zwIv%SJWoMX-}}cfXtph?n=mOUDFh+aD{UqyJ~TL3_mv;7Q)cy;$ih~@qwT{V23;Kp&2hIgv?F^ZcZ?Hjii9SML)@Et02q*{PRi0oQb zevvv%j#FLB#ves+d=X3a*kJKU>QoJ@CMr2(fHH7#G)4A?{7>uvFz^eLw#2#B+-vPWXH$T7UNAIi!fI5;6J3z3ntjnHo7{)Me(o z#@F;^b#!#-41&Tg6|t{1Nsz<@^wnIz`Zl6jIjig^Ceh;|XRz$Z^t6#-!}5PsJ612X zpf%3+^!Fw8HeBq~zLm8;?Q@i*f7;e(j03sHg+b%k2a}FR8!GakfSbs09+E~kOY_t7 zm}e|;+q?SD(RU^?M~I`lHh8;G(l{jygpfY01%QNs*N)lj#jw*Ds*bwD-<>)O#=WRpqUxv+N0Qu*|sElR| z%$W^uitxft?06p*G6%Ss00;Tf4`+dOLRSE-$b9`T7NY=%sJ#KOA!dp!`$4K}0^orO zyN718(Zl|$E<4P&-U^7W5fX0LCJaMXj0&z~j@t=;lnNQ94O<+pvh%@nqNk{Af#1-1A$O|C}87_2TvV|HDtZ0FRO^FnNKD$qqNt ziCK}3R%F<$IS{eAxX5*Mzpx^=5gT=X#_dhOHicU~v2xSHU)Q*n zcb~BRlq(QKxbsqM_oCwa%jO4J_iwufaPNi=PptN!1r5P#hLe>Ms)*z4fhRW(mlpqg z11~t|9(%00ZD_FJSa1_lx4^rzc;oruXT9N}Rjtz#M_Ng+)Xbz_KS=7r^V}`pYH$Db z@hlEBKJFH`@wt^~GLAp*EpOjfd^RR%a$;_@Of4_nA&L=<)Q0otXJ_BJ_c7b2r?&)v zG3&C!0)yvYw*HPkcdPBY;emHgh55Z*;CX*HD=P?(Ed3kx`t_#djQa!QVf7IMsG<$P za#e$V&c8tdV3&d)tcvEu)6Lu&`e)oueOPB>C~3mwwCNJfl3wQm#F3eLndI z@QT>rJCBU_H!m4NZNA|AIGFtWfhgLyVBHY&_3Pv7OeOv6jDCcWw)g(T_oCGS^Bey% zioEs{qYn(=ac}%_2E=rUo$#T;IFX~DKd`>RV3Q^YKdR%;3vqpovB$hK9`))z44V2` z3r%2u>BXB}dCb7Y3FQuQ=XuVC9?CIj4_=+EKCb|Lg6_04sW*}rOi zOLy37;Gh&{g6$54hH(c~uuxA+*5-u!#`ZRL8d7@nmSvk^$!LR++5T3f?V92QVtqSf z1Q16>avq)SCydmrwrxD%zvp4=Ln2*q3US93XZ&cog9@RIKv>!=gdx#Z0pSVDmoD6g zA`77l*!7p@pEwkwbX>%xLE`1l{xQckQ?@C}jC8BE>4NZgQhky9^54BYH|^47Z8;A0 zBvI4(y8mC#lLg&>lHkQT6+tgE zwikD|?=AoEr1<6m+d`HI9X5h-^&}K46b-iP3-h8&ZQ|b;m^-UsUo)9+ux0tzAD(_Q zX2aGQPPO_4teR*TEo0tZvW+yH+%lbG#orE_6vf3xH3p;)Dl|qe^VO?A@KIZ*CzhYe z&JZxlodLn5ZCZ*v+WBY3^M|_y+1WX<$0|O`9d~$pla6eFZQk6Org>A3nfh|pwlQIF zb1C}=_{Jt;r{m_BC|YpJVC9qko|1^;l;Vk^)gG9Hgu|UdTUVEQczRAhL2#QwJBRGr zw)gcOqfP@)N&W2_aId>&pxzbo^SifIcXzHk*Ess3WzJuYDvq+XN2=tEs7b%$$uiXa zZ3VeK?H^qka=W#InBxJx*Y=KwINOyBe$!KS!_a>Ektscyg(^p#fS}4-^K+N<5wzV) zyS|x;kQBW5^l&Gf*?#b~L&dXGpeH+LjJp%gpTe#9`|Z@%Yi|8g>fsI+C?e{^A_pd_ zbv*p$1eWOQa@bb<@I>`3RCcMCh_yT}EdN88!19w{%qyX4q&tGCJs ztE?A3nW#|&UimvUi9FxF(@*btXl+Sx_T5c*wq{)zj3%OYndM(;ozdTtNBr2-LDs&pKHe5CJCeucaJat=kp2Q`C| zpWkA%$GVl4DYQ4iK%E6-W^0 zqS)RfblBuCH=y(k+Gf~HS|mN9U%q0^nl-v-6??(*Cmu7)ZBw+81P@Gfbh}777D9jH z2MrtI?R4|ns>sgC8JiEQ-3ohlir@hTPdl== z(ucsk69%~S^NkFP{$iFm0b2e*ck-9QCAqT?2|1no-Oqh?-L+ifDB5$jydH9bUbe~k z$%!rQZGR@PP#4d9vgyk3>Af+_D7m9u8+gwThyB||QK6i?a6al3Vn}yy$Gq2?dzV7l zSzc=jAMx3)k0+hW6(v7Ehs;F3e>RDH!cSKFr1$(ed1zF?kCnX%9P{`YTM5+I)}Smp^B%pPUDd-%o1tHbbBLlR>$cZ^|Vd#zqo(0C`51c z@JKz_8LzuM@F0FIiUpTBpa(ewoI{^payERej-lu{CeTGPZXr&pRgS z@ke>JelzG$pX|M&P(Q~{&X|k?x$G|0viICu+GhW$f$n_a@=FA)`7j7ETD(Led;JxX*Zs6x^%bylsINV3H`+Rr)Du^(cGV=Ba2g3ZVkurl>~XtC>* z1LEJ9+8p|49{dMjnm=5*3YaF%Z~i$J-?Rgs=l;*}g0A(aa zklpp>;!iAp_R4@&mUk;R4({*zbB&{7?}6_QR~)^^Ex?nL{&LOBI5pXK%%3{laWbIu zQNl*WrPlUCte%p`j}H(WM~d>4bKif%faP{gsfar*l031ZmR{e8Q(u8zz;at1tbeiwf}%#R%q_@)F&0$&bJ3XDAraEuC!*$-Z)Fbubh+-BSbe~!3B+}0&R@JIM zju0|(xAx|?PQUg(&MbMosh|)Q(yJ9M3=`V=S?h+y_r~ZvKg967@&V0Pxd5TOE^s=a z9cw-{r#|aF07qgE61xy~bG*s!8vBa7WZ^c&)}@tW^S!4s#t4Y1Ilm;87_p$xmT>Fi zgC;S-5gyEK)2(mbA!+S1hcEVRC6OGGqei3?Ni%F{>qBM;;@e68=(duvN5$!rU#|Ct zzt!@1M;v30ojuG-vGE1+M*Me~I`7y**A&F0L&x^2>7Tk{?O*-xm-!+)$tM>?>9HrG z_TBlh$K1z79ankTS33?|T&2E)b)YrumKuzYIgfOA9p~P^IGAzN!+K?r-IJiDDRP0{v3_E ziuG)|7lgc!0J&ADpuTGvNS=0m5T(|=FDfc}F{ejmZ&_`aE&uhsU-<`CM=tkSgutQN zuQg&|!WzbV_wK}l%#7nD2{9RKtNo~tMgD%SIZK<1PiT6g+v_}1osM#izlN<&d9R%O zxV@fM?*11`4YpjOggH4eLGpsQ>T(!YThend)B}_to_m~d?zr^m-oo@Vc`*5?qj>x+ z>;7HTjt(dO{EfeW%_nzW$AgF7V^kjxW0LMWX+^W8aBXIL%cZQ|YJ`$PDV@paUZ-~{ zO+Pc~nXL6i7#(d>eD|mk-kbGC_^;H^PDxbQZIt7j(R1eA-!fr;bDE(0HZdg0`E5z9 zV;WyT*0tcl1s?258^gFHL&reS$*fyRV7T-L{ z_~h&B8{7TqQ}h`WmJeuS%-aMWg*tusq1}PT(V+v^^)34>t=^U($=elkS?vyk$77CF zeFjDcz#d6*l#}9VQooZ7iJ25w^?laUkOKp%V~s004iEiy;;%~K+X0w9C=?t#gOhNZ zy-$D{wEG}*aB=y-ZPejU#V+{4eF&}!=4Q*cS@pH_+tby7VOC8 z-J8W7Z%a-@K^29|orzC#lq0d5PLqNh?Czgd2DS@sse~7?;YSv+x~i}{hsp-`Q%3hb z=v%RTIdyuX=XUPf$vF^Pcp`3p_8n$XndqmiKLk(S&5qnO%(nf~S$+a?_TEO)@O$Rc zBFv#6^tt??>JYR{H^jj~quvkFTS%E1xh_RL$r-i5g|6j3r$nPkxRmVO7m}U6)wSdp z^-G}w?39ymyFzxI9yPg|;&5>gpq-52p##op7PG|fhRphwNIySIMHIXCz3+2#!K;}U z)iQDHG2^4&n_xT|kEhT5V#*xzc_JZF?^)Y229H~n{pA`@o|!$%Mlwv>C+1sL7EIAe z7suqdf;Vl;yh)`+DDS)a`T9$dolUY?=9yr!F6H*Z(0aExa&yR}AAg!seB;HByMh%3 z1rwqC{sJ4N^6{l%m)D=yU1f0d*;UN1N6E zpzXb*n#|Ys-@SFLsEmVvC}nJ@ATS9?=%^?RLO=xR#UX@V20}4`gkc;-sRB|$C;}Qf zk=_DfRB8eN0z|q3NeH0`NeBc2=W*}fIqSS@{nj~Wop-!{V1NN#l({~OJ^^@1`TKavn4J6>!py;o}bzK3Dc4vm2dya zgO74Qjd06*A=c^f(53woHU6OB=E3qf58F3Kt^X8b>&ogzIOH2ckfA`3C|DU#T^-#}krFYhJo$ zey)gm1Ff6f3x@fQN*cD!yaLU`U?`Wlvz4R1XugEeN25SgTLIb5$vKo(?(PJwEg&D6 zvh;o-4U1C#{Y1lL05&s@@vN)&M`Q_KTV)aU!Y%f5)z)0UkB7{GNAeTr%R<@4(rOmM z39DyO1+3E**|NV4+st-?$IoEiMD3RR{i(^zxwPz zRO%AuVkV87<~%T~(3~?f6F$6ztT@$w+XE)fgC%yHB@||4X6$4O7#q!bEc69vwfJP^ zEjI=Gyb3|$+8@DKA*~g2i>W`~p^b&eZ*!SNDbekI4X1*FY3H5zs48vZBW7-u?KH1+ zgWqz(S_~ZIzn*|=mz`CD;i)SljMfipJBps-jWHkh)f)Hkc9-=6I zPtV)O!j1Ep=%hv<{&F!SR9B&w?H5D7N3twS7lo!dtxvw|J%RoJ&CjI=T#U95*cBn8 zXQl7A?D-yY*`!or_A?FcD_C1O3D{&VMj@i6lq_gc*+YIH=sPAKB$b)PhJE}0GwJ`A zH-i%7bEn(PoK^-B`|Kofqq>Lu16@Mk+2gRvGjzg5rb2F0==4yad)p4 z-+6Qcxb^`{>web==Mgr7$@78en@+U+SUO|J!DWwcHeS}xym02Upqlu2U3fa^+uZOB zSx)JW(&6L>X}|7VcbnLWnmBX(N{Z`ZbN<=_gNvpdG2$|x9E71}Ejf(R>T4Rt&o&lX z{!F~6(awy_J0f{}&sq1fLKdr`GpA+f8%y0YIQTa6%3MyVV6w@*5yGN9Jj(kE?I~- zjwbhIu`7T>dn#}<`D3xDHM-q%ud0Abt|I+y7~LeQJ>p>wk2N4n*G*fJE^?2`(6q{S z%KG?T)4Y`NO0ef|j`+>V zpmwz{;?>~%`m~7}x6N>4!8ihE*-QK?x&Nd!Jft=OdyJBjVY#&vQCdj;rR5EQmLtE} z7!l;u__8*Cm>#F(?%ML2-rdilE^7Y@pP7xtb@Mi>a$Hi8y6({!=V|=p=f2bEmCL%# zz->1&?Os<|#?ly9{?zU^NRQi47oM$TidsJFmru_29*UN|hS^wyoAaD>#C{|G+duif zw*LQIZ~r%kz6RSNBAVYAR@YZklV}Rcdie=ecr6ZQsAdaS_xahf(yXGmwy9(IVKq_9 z{&`|LzThWC{ZURdYct1=K!<-?Tr8nXY5=-rzCOaS>xPPI9}(zqX=XS3+jePWt6(Em z!st7oN_>Kk=6T>&tbAjMPuYb1raEeY;8|ga0W%?Je3^cW3O7&~OL0Uht zh{fSOS^W~ioSH43?i7!9)!2j5e-Axl?Q7TvosAZ`%2+#WQeB`r^Yl*kgsn`i*OojM z5*0NLEM3F%T?^spcANg!)4VQQ7gi+_D+$fvX4=V*!TJhX`PxftoJcsigFy#eow%u3 zn_Zt9h+;D(Wz=PNb_^nm<>^VRP#HyquXbPN9NLKMDtpcEeKbUy5RG}agCH1Gf5u~A z3&vpQI(bm4T2yz&=HBD-;#t5`xDIS@nva5MmK0(4bF5Zq8f9lnA~1p`E=!x7yutB< zAujE;D=Bcv0r<_ur@mSn$(;*LZUjZ?&k8UJ%~0HJ9uq zM*ZYVij!luB%2Jz+u!IV+Sm0rZzE-DBW5Lm0hHgG37lb+0p79y`ymhgZi-FuhK5ed z&;lDhW;QlbahT0z2N`SNX_;vV01PwrVroy8vung8fOe(hTuV>%W^G=W?gBi6XyCZ7!}?i!$m^=9x9g8*#XGmM6;0h>A+O__G-z(?pMvGGz5e1$Wb%kajc+%` zjj83Kvve=HQq9vh9Nt-jMio3rK}MUi0cJ5bR(GnmYiJQAf}-JzVP001! z=QTzI1BTWVTHpc>VhzacZDfc-a4NXQ9%9PZ?|!dL3J7a%%T&2>qlJw?U?$a{{aHn_ zRbFa_j`+T$_-Wz-QRlS6&+}U-@tx~9DyN{vMwR^CyEPp1RR**Ztuc7d4_z0(?5!yO za^!UPZ;C@J%1~bQSYZ7$&$H+PtY+Mw3a5J9Ss@8vMf=EjH))^8N<)E-k(@ZjXUV@*PE`Jmxt$#741VwfoTSlW;c?OoAMDc9et^f6K1~HXbe1% zyka_xa4pI0#@bRDV*TnPEvdI;eCxA;{dqDYdvHqna&4dczyl?A^Igs2?){9cBR6p^ zQ3cFGCQKw>q@>iO_c#&4sLJ54S3~!ZaWYjx#J5PlD>4WdnxTo-cwQzb-6mg*Y7vN_ zb?57=!cwU}3~0ygX~Nfr&~xevt(Izps9~s~^&le>Wv$R!e089i-3gyoNVMZ=!|Ueq zNt#ZP9z7W$W))Y3hC=E_oSEjST^2fXO|2n4#OCx%fx?E`mi~c&HdAKe z^t@ZXcj996WV z*=1}kn7NfGbe!b%0e16;m)2lUPU&FSKS`CDIHBXvLVrtQJ#{-c{!%yG{I`4gjdF3x zEo_)rat5eg1sEOaqRoiF+f;oqN&O>$zD8_DPG5y9a0nc9{x^d4+}~f7q`nV0|N8O& zS+@T#bIt$m^s5I0CXV9o;=f3Nti1J6NTsV#376-CEjHW3?NVNc*xGl`TySoGFnHLk zQ}Y=&bbHu_l}^3_9M;c@FezYvo%z=D9@id8mv?Eu8??4ORdI9})E`cU&JvOF2|gpf zV8X+yEsl?n0}9SzZ#StfgxQ_*jXokSANqZiY1cSDx}Ae_4FtxY2k&lh?*p=_yw2N< z3@Ny4y=@qc+x%z3^^D!{z|@A>%>DriJL@hzpkOicQa&JhIKC0pPh#5alrXI)>Pe`g zD%gR515F*Pb^|x>pxxC6?H<|LPVqE;VO}xy#>`0@WcDw;y5(BYML(Gbz8s@%cjBdQ4_rAhS~*eEp?M|dzMaG0qVum# zcZXjfbT8b8|H`a)?9c1EBQeu9r&o}yb9_b6kQKQn_$hL={J8t-nRENGu_mF%4om`7 z7ds`~ndDN8kojO-y@31M<3x4BKEgpEovvrbgy!$4K}7Zr3i)DY7zIsCpmUe(Eb(V< z6%p18b(0@rx!Tq7watHHG~wF!pLh3WeH~W^uld7Uaq`KF^KAx&JLG1hVUU+qzH)k3 zcrVdbbRQz}_cQMD_gUop41?_<1tE_z)pT1PF-JL9r+HdqtPho4H56s(T@grcfzW+J zh25@keP?AkTlpN=Q;3kj$b@skZFI`J|F|=duTD`Fc4q^BZ9(_qq6MUle{bJj9nmV{ zp03SV{+%{C3IpRq?bU*QOPf`An+6jGT@?vS z20l*9jqlR^LJfo8R8V0PrO~4I@0T0RYU?os3R!K7J5E(u41Ub~udBFyu+w`tO`5SW&w(q*;Y(Dx>m*2^6EHk^KbUgnu zsz@pmSS4#6!u~aQYX|RUQ6}rZ>oQ8|aC2oJz+N%2Xkyc7G_a?)caNold6wzp zfr}mvzt?3`j%mvdFCXOw*ZK)mu@T>9o(7_7$6tfS6EI0{#{HYvtR&f0Bu?j(XZ-;X z(4qzoat}$vwTF>yWz=tmSuo`!R+_B{WPpO8=TB5Qx+qvm9z_=_+`2OCVK0*`nsHDI%git`*vFiDkAXmN#-bRT{tT8NB zl?pQ)JH@-uoD=QuHPXK5A2h*j$yU)ywCd``~7{luF zsLBK%X@ezvw9oxUdgojPMcHIe`*CvxwYydlJ%g^`=?4l2wu``?;mNDX6Jo$G3A-o$ zT7BCT+jwP@YI6TlB-}h3_X=4_@qvh*%c0D%a;+}RD`Xg;jx`!}d5E+9K(ST!ztgTF zgv8*lBN%K%)STNC@8v;iCaBe5=NJ~Ex0Ejqk(lnvh{KFqzUBu%c|5enf(9%!<)^e+ zby05eo}`UrO!2<XU;cYiulUJ?k?BA(| zT|vqGjijUJIqRCL`0bNk^Dya&I8kjSRwy@9s5v4&LppEGfdXQ||_YMg57nv?5W_s|F4NUMoRnLo+#!w>KzJ*(%xKe$+% z+Mz#^pyc-Eb3qG~Hq!{X4BchClWA+K47XE+#E5% z!FibBWqxY+eGxw1>nH4vQq9ig1&v3`7<^_e%|_~)XVk|(aIyF zXw)iNm=%ABnOBo^Cti$lWCvRm3qw%>@%O-vYyG=HqEhB)xA*X7at!J*rTh^;s!$~< z7xg&0?$gZp$w69TzYPI#%u1Ot4*rrHlx5h32dR-=7I8}Iksi$rNlN(!h?KBI* z>HMd(d-teLP%ti#g|k==rv~@Q$Sba_O{z( z{GukHhE7u#VN!UwZC#t9@J}oBms8z)%{kXIt3qkqk1fSiSG_q zOqSM9NS#koCEQ`}r&lni|2%X;@pY6DwvwFSPGfrbsc*|N_Al}~Djocq&uH}N9k@RX`d?U(#>;W@g$_d(T?Ibi2ti+s9mA7-XB#~^buT9`x8 zMGfS`k^(2M!zPqbyE+=pqtMyNu^&tMo>O`^Yv?bM*>(3MlRvodw!fck{_D-tV1f>U0?iL#bIj~c24y0-Caa+|>8?<@#Qbl9 zG;G-;z^%U25@n*vKDY&>mB-ezDqCDssm|BANh}fP#Eyjit77s;V5&oYf~qAgY5%JH z%N~m*3WI7&!_Dz;sB(=bxA_o5%?mIC>76iMQdfRoR&kGPMeKi{zi$3pb#Fte_;2Tw zbAoe)H2QTT*&_#@eNhb1vN8$IKV%Nv{nuZjq|119`8sq^rL7ZFas!xjXbT>0oIc5o zK$K$IiXXD`;XA>m?2e!(tpn5d!={PS#NB$^bPyo-0|*}gjs`2%&4$g)pd+Vw2x~7m zWrX+IHBIXYIA){XNhiq1XB_wx!)}9nMyBX2Vq?J+BI04y!HQ`^A4f**R@Qt-I8>V| z_xp7}W3kKQk3G5ptZ%;cim+@IpxFSg8Uf5#$c|^H-k0t7Gx%p;kq>RuVDbWc$LJhb z<@mQrWYJdv8K1id(vYlu`XFc~@JJus-`_qT2KLo6=l_w__cwS2QB^W0%pz~<=Z`(q zW*xVXiliPJSW#tC94H70mv-~V`-<*?Kk6MmAW>u96;#{#r=i;l5CCt9S_!9iCn`mj zSCZxW$X+7tUvDR@0dg3d@v`NpTx^Vw@q5dMHHAT%%|tEfo+U5)w6}u2E5`!PyzlBK ztzU6aXx!(V#zHjI7w}%bLRq|UTM{D5TbTzdMy_1PHhOuM;|yxyu3hF{n!Uu~1ViyM z$`W#LZ{jbCpTB@0Gm^cY6CwAv{Y<&zu%0cAYjFg*@6@JriSEkSSk zG;i~-)p^bQF>Y~bCqPC#3AF8U-XG}?6hf&ZXnkS#|HLg{>FAPz#6Ibv_ArX#uSl`k z_mpqH`4O#VnP~u>&x?PBM~@i)Vmvz!l`zy#3Ojc7Duhg2X7=j`1(i={AZ4sJomK0g zF`^3%%BLD`r5D2{Vmfa+K_O^NxUm{xdISk5Be-9SE)T}q0FVDmQyIka7J#gMH^MnCV@x{};$)NqhgzM=_;I$DpF!y|)o18S+u*V_8gkr}^Mc6>D?p1DK2?L)& zM&Tv`44DRdpkDwi^wPP+7E+##LThupR@E1>Q~BspGl|05@pB9Dwto8CnR_pnU~~YdkUSoP&SIkrrMg?>3$=I^ zPE*_|)%z$lH$&^zu#Bc5u@S%H16Su}%GKWMg3mi!J^Rz}NU6;yZL2f)l$C|fWv+tc z?aQH4FPOu=Y>>vW5hG)Oc-vq6^h44=M}c<|wq2OpuoQ6sjV{UWXYQIE+-@QT-{Qvy zD~L|X=Vk28d3nryrOAGD-!0w ze&Zd6h~iYdJSe#;)BDW!1p!IIP5UA&gY=gEh%{=LuWLPoUT&9Y2{cPyXT3|`dXcdG zi3tS`hKlJ zV>`Ep-opMEE9F7iWM05F@+Tsvc$RWQbcKd@El~`I{fSRgo^9gi>5J$r!>?|%tm_|HSYh}yy`pbPvx*bb?$8pYm9qDBS5DLEyYp|Qe{l-K(;=PB2TvXc^JWCAIax7skBj`3qh-c))3p=iCY(a^|$^o@LtJEnM8_sY?c=B1}b^G|-d);ghj({SnN@}_%%z~J&ov0eEd zQTzPj)j#T!roM4&?krtB)eD3T47ur?T^s4m{pSl}V*SFv6^0zp^ z`eR5x5amRfHE;1VXEGoG5j3$_5$c!3cemVrU#-9ySbx3>OFe%eERqA5=^mVtgysu* zuaLDLBU;(b$o(k#>&)an;`Wrp6mKq}J>x;^oEUh`ioEwZTo5O(P!+he{&i|2&h2?> zUh7r*jaK$0>^&KY&Q=dw&VYKLaPPFsYG=9xc&$n@+PvAvf+}VJioV4>8Q=yi*aQCQ zpiYo}aj6&SgWJs1bs336Raa#FDXr{}1>`LjZ*we8AiVb@tiCzCdlXEV(qZDGub%^e zVTJ>?u}ym!Pj^D?pSp@M{4L|^?q29D6SygxqjGV3fK=ouBZ00QxO4Wuk2e3?_R8&$6&0@d}fs6|r(w4gj<1IITf8|qMNl}#z3EE*x zbrh#8;9u3m*x19oM4!b)0+|?7VAIZ|``wRROS6#y$E@SWhj*my%jFiu&Luv_<<;@m z$4hoVxmrV(JY7Y|z5Uj@l1$rcXFOa>ZGiFhik!p|h53y}hz|sQx3-jH>7x;Pp-dTL zm|}%^sC&BSkj0@-hhsDBu1STt{!Jwx7B)V9YQ@d{vY@qcNx7~AV=Jj-^w`CH5Bt)H z`|VcI$x5>qPj^1fCRhKucIJY{Rf-T!Jv`yBB+MO*(y4=%^-CRGaZa4yZ>z~8|JY~U z?Y?;SWNueU%On1e6PEbtO@WCj^~zD_EEUL}0@f~)TLgDqFU=37dBrEc1|e$qv?rNm zdEPn5Ilz2bFcfcPkIyN}Ai@a-dC$FeHv;@*Ux6l9`P6hubuIvd^#T~VXE@yfc-aXV zpIvrdCzM*O0eELaQZw65lb2Pa5q^hR|9qGGu>h$rjhi95FriFfR2MS>pb}m5eWqOU zF6Y?Fu{J28n2!uWc}_t|UYo8mwWWFs_*tjnFbsKT-<8>)^CSU>2?Re7KLX&^Lvt8l zUQJg9Gp%a#Gm*t*MS-ZmczLdEstS0m54!gcr=#Ybr_|Vfx;rMCt?bAHbOrnpkP#d% zj3z=g`B_om^G)F)6g89TLP9i@Vo4@;y^79jX#zmgT6^8=+=c`py+*2dx1Bnr39Nsl zooQi|7AoyO@*Mn^T)@8(|8xeBw=ytT#nXKs$ylqVPw~thkG{S*>JTjZ!umq6q2Dm5 zH0gfYCn(k9AX&`+VUFwDo$_k8)t$u;nKk9*BAez6eWwtHO0uF$9FmzATs4h+ZPC*rJ)u zcXR=ue<(I$b2;^UP!oV&zP+bR*1*lEqPuNX_`uAZ?3+<{iD9dL4Sq(;_##tjE_dPL|b=<$u8C!Ax$UMOfC(Y zjFh1U9uY>Tc;RM(->@B9qk%i<+q#1$C1;DqMo#cZqh&9S^Qy5Gd5xc{XBELQFCF3D zB`hJ?<376ItjN9&BzHQ8ya}p2?iF`PF$Pv9>8*mH1FMt`Wa87)f zz|Xo#9za}vWKw{9RFWuZhH);fnDj4o9%FEd*2Ma0BeHk-EKdK&T5Zw**FCUirX{4= zp9<=5RM6ircDN8p;sf@1Wp_|G&E%X=2+dxnvOF!8HXW6KJAFlLFKS=Co41h{`oT~D zz624@b11J22rmdDA`>6BJVf+OX4>S2?8szfpzsy0om9y>M20LP7set*+XF7TBCbm< z8k0;>?%dmUR{ni;qG|_mFKu=?KL``PX$EF?{3)L%<}}d4W;lP*`6#oWUGx%?4_r{< zi<{tmb^tK13uH4u`IT#9`&l0)_a)iF^hpqSxzFLu8tMPesRrr>^xu+2LjoR z*Z6|rp!aox+_OrqZt&#E0&~bsQ$Cub^gX&{5-jVrv39u&;X$oXn`dit+XO3F_h-pztHv?e0!K*IF&PRZW@L{$p zJsk+HzHj=O8{!asv~{CT8BQ6m^@7jLrOp;h$77-ceIJpaS^fiRZf&lapw5S&rALY% zYp*o@qCKQ&gh;e4AE$4X2{Rr zIqpXDCj;dN{l{u!Hi40iB38$89&odJ_b>%CZd~HV>)t17QPrPyBb0#O!)6eLYdcZzo~Y??GWrwgA+L6Qj3eUDJGBtK3QWm1np zpFK9cTZn$7e>F#Et}#={3;;8quyb$*>Q#i~WjWeTV_0!?)N&S}S1w%KM?J?n@mPyR zFXiW{C)q@OClM#59}6IO+%Xw!<1Z_2oSqXL&i~Bq=KW zP+PQ#Coe1;HA=;0pHBhdMh+SJnZcv)RR3PQdUZfWVVE zy`#>Z|J{#P{yUXlnsya&tewWi#yj!OllBn%;avU^^5 z)?VN;Jps6|@72uA*A$|v3tph&s1`BrK2{!a`t(uLyY*fN8nLvF1M0vT%hF1U956dD zd8Qci^VL|i1bH3lHh?}3*g9Ddx5=w3TP%bI6*ESqn*!|B3 zfHcX5X3$Ip`A6?Re4`h*!Y0+sK5!5cIqsJ1P0nRJ0@mtfEHJfx>v;h%`Uri3pF@JU zXK*i->=~x3bmll%++I18%+JYuyV5S4y~gLxb=aSEbT;;QZan5$be)?am3dbt^ulpK zt{mmjM+1SU-aG1%Q^pTW=jz4UNh^d=J~aN|(~yFKolB3TzoHhqjn#r+^z^c0IrT-4 zBTZ3(wLWj6l+;!c2qRAF9k}$$#X6~*`9~8)R*whXC|$B)VLP7W_6oZ#e#(;dI=FJL z|8|IJD?!H&k@(nB@>;%L!;XIXhmQkv(q<7j=<75UXbPa&wXo9*)Oxc%j0508m@YQMq&v%5@jsVoUWQNSn;!tBj;=#61Lm07w{##=HBnIE`#hY_Hs& zR=NtcH%lF|h$cnF8p`Kkhgk>c&Y&f{+M&K*bQHAKR9)Bb3h_Yh8*w+eAU$ADv;H96 zKH>@&<)T6Y2n#ygUaw%1n-s7YKFZ_;s~hNC=X#dy-7M%@4FJ&Iu=D4$xq?T`Y!$HQ z*O6dsrozU~t95HZU)Ed($7819`o8R({Z|0BD60rGGn)(o@L=hx6cBA^R}@KyM5QHc z-^V`X|M$t~{~atry9>ZMz$#N|Yu$B1{A4o_U7@G-8;du8mnXlEFmqbrw8<4)DoDWS zy&)&jDZOS8Xjr~vl>HXn$+jJv-KfEuQ~9srDE5$|YiTFbscxKlW|AL`h9)omfGL#K7)rm7ydCPcbsE=SYZ^E^-o@sKoA-C8GT ze?^#6q*F5uC0%d41{;tg%|MfD0hTg}Fh(vPT@9zH&qI2$U|#%noA0E5?`gE23iANV zUJN5r5ob5M=;w0GPo)cn#f@?(8_o34>#Bx7%bRNZUbh7~RuVo=0t=3d>c_V$c=*mbv38~bQ> zKDoCzGxYrAi0dn)`nVi`-&x&mBwuJFdZLqYu1B3=a^vOHd0aJVO?h6&69vS-s=Eo(6z@Gc&Q46PVLF8_(`g!_GLm-e`baPBIdB?35R~W@bLuRJsMg z6m{3)CNH|wF?PUVwyBD3&wtnmwU{H|FJ0=(^Sm?pmYdy=$IbX|cR!brkx4-!fKwAt zI8;I=`i~igXRElFo~(v?hK2$Gq4Qi?e};T zW=7o9x9XJ5Jjv`of0+0yoB2HH`pt;78`T66y%<2z2VKW)Q z=u_6RPJnw9dlgRUdpp~BqB18PG-(2e|KX#g=e6^13=Eu-&!!@Wnx`=oNgDWV=pbpv zJ^NW1&H&(~i;TO%dx%D908QKN$-7x=1Sl>Rfg9B8meQ8wtovUk?8C!9LuacCyI&8J zw!;GZCdq*)&rMp(36*Kr`|*1lzLvE4{+Q&gu)rli55k$dUV()t2{{wC>yvTY-V7aV z1S}*I_@mxVehLtagu60E0Jsx#mpV=DUs{oys9C@V`EoQtZ8oXMOYT}X`j?Ph?_Hg3 z{B}g6JlAQ(5JZbA^Zeer?&+p*uyWOGR_E|-h<Hoo~?+U;&bdD2od5SL+92^|OX_=WB9+aNXB^0xw z5jCeXWFWn*!j)pOP>#tyH=V$QaUO@@THc$L0%}veGKM?f89dxAa%}5(%)aaC9sL#% zh$abx7#na5pl`g!w+xIjyJB+B&OE!QIx3hm>RzN!>Tm`+fC<0!{jh585{+FW`c0ka z_cS>{bRgi8aO`Hai*7^<;64Hw`sN(fovlxIEzy6Y(5b`6ZxGHcx=pB%NJ>)i0RB7_ zP-wU#C0j%<%o{?N^ zfl%ybob#K#k#*cL^VK_#CZ!l@4A)|P)apDsJ{bv)9*ZBJll-i zI-3|dGc&j`Y~Y?6KFmcvE`k2TukA}>i@_=?Jv!jS2^Qc`uTQ;5a#*KY5BmYN6+$Xwohue#MChvdoRBl`*}aUQNv*>xPVk(`AvvIgK;OV}FABNS0Sl?A zn}w3*M~=zV@=xzIN8g6LTogtcs&O-@+dE6%^O|xJL21ZjdBA*+P~Bl@>V~s*f(G1x zG)MbpT|#fgYu?7WJrGHwpG<-($lqpQDEaM* zG~6`r=`$GE6OLEnuFh~W*CslUl#SF?Ba26(;5Tj7kVVE;e4vnk*)8`t@jqjBsitUS zwZdq$Iu(FJ_!E~$W={hr^n{P%ruyCSy~r4Fxh27au+pq zHT0J8$;rt*Sv0Q!9#Pdn-0DnvtP+r1Bs8sQ17-=C1{Nznb1b zblzGI&E>oSplI%rdqNp~H#DuEElPPAmWLUZM#NnILebT&~+ZpEWI;zrUw|ex%OK_IQ*z8PEJRFcRODAWiK8yyU0^$v% zEe_E0`shMdL8Ms>=Y-R07|n|nDmSfOBnVoc0et8MRXGG>{V8}Y$YP5eIg{0H5YkPV zhtGUY-)G`8#g{~`FLyLAl|I#6ExWfR2FzJEUycjCzf>?Gj6U}M8B!C+E{(Zi`z1-?L)%tAcm<2RHhNDJiER z`f11Ns&Bb?+--E+-o=34ADq<~B^Tr(F=jttAj2h-by1ish4c3%&?|4K?eh zD%;=_Jne}4KSdij5!fK#D}(uVexrF^iTnYH`|f(?TvYU5;=(!>BHy?^EfsOO zo^Yo-@Wt}g1My;`ud<_`GvBRr{IeKff@U*+5c0ywvv!rw4XQX{(Scs)fT!co0RNAA z%tc{c#Vg1R2-v7N_XC9+#MN12);)y=7wV*?8fV}!_YzPpA`C{KP<&|+R59D!4R!0; zne;t%ioKyS0K8WE5pJ(QLyNZ9n;L9EznK@W+0QeomEsh*HUBYbdhh1-+MB-@6x=jm zXQ~lkcrKvoWYA2ed2Px7HW&fdBolKJ;ShcLNPxS)h2Wi-%6?9iM`&Y$HaM&mH)D^i zOTaqpy`kVLfC7?%V12c%hr9k*h|~^iiLW+u2`2S?Mv?2-C=3V>;Q+zm#zzW4@1FTh z@%lh${l?eg&hc2mP8`B1RQH?=<~1d9DFCR1J0buIjLw{o=plYIa%16>S%#Njc*{l1 z4mW`0;v8JtbXfY{(6^B~iY^l8*4Y2VwacHh4N%^qHB@fG%fhu&3m5+S&yYZ0l`{q9 znx+qBtjk9MF?}1@Jie{A!e?SQ1R#KMwF@Y=D~CQnLxM%V9ji8 zfh|vSe%7t>#7S}%BRxGY6QTz+natVD&L_@)hFV^7VHF+~biTvn{OSs!-XC^qQ30mr zi>k+7-|Bo@5Xp*3yx%!-hyUuO(c~Gyl&Z9pG_W;}hte8P1*CvhY|WUtO#*pH+jt-_ z$G*GBJ^n8Zb`cip;c=HKX?73N=1M1j=jwt?M_P3>%~dlwNS6Y}BcKjwW|^}5JUs}5 zaqX%*-va%I^o>>ROIh!P!{%f8W>c9m=Q;}Wx?c}&rT1?=qrM2e^n87%FGYC8=ZJ9j z!L~c-o*m-ls|WcK6tmR4t|fkkU3sOyeOq?OxB}@o&;bO@O|DG7bz=egv&AlY)_(~^ za3!#bW%+a|mMq?$*A4t`U#Yh@4!M|MZ^^NdRbwY8KDM7^^-nJ2?|^0zy2o#JX#H~4 z=BMDPzl2X87@qF42KIv3m)@E9D-(BXzZOSq+%;c3`w!I-Gxg}J-1gP7Vlol+H)-I# zAJFxJpyxzS*)YS-D_HQ5mS0~*y9O`S89*pW9PNhz8%?;p{nRAW#%=y%#SpJuMgR>x zx9kGo${7E@q13=3U{fVZ=J`fz4p?Brj`6c(9gvv*SbrVTCRf76 zkufrqheM>UP;X8m7$4Q@c32(#fz_>;)j+1%e}znsX#AMc`)M!rr?x!f+Uwlmw=2cPEoXd| zGXJj220-WW65u;owzFLGdvf<;HdNG9`iQ9dCA_q>RH(U2rhbyB268aW0Mu;Cgd-fP z<=fg!-wI;;j^D7jNlwx@9TRi$FR7Balo#PX=fX&d>2dJ3yp8~V69IZ$R>8p#Jg|7@ zQ?)BjN6PG7YC`Yf47(m_U^gkXQPO9r98UT;v|e3eM|}<2X(}D_1B*BPj?uL|sGd2vdv{YeX8!tTx44i` ze``a%Z!Nb)nR+8H5(qj=3D$F2YiP&!14K0&lQ#0(7EAvZ+wLVvcSOiaMJD>5{_~83 zFhI{*M#>%^bsOFk{8m1i3MwFmw~iuk-Ws8z((01I;Yl2o0oZf3G1?D*wN8k|X3KN4 zq1Dj``}M9eS#pJaX&uhhql2ttD+#lT6X=FxVatCdBhkeA?8-c*B3@+z`NZY?B2(0vcmv36xa@Y*JND1&y-yiiRv8=(4SQGKeS#LC__!xhHWzX%f4YcQ!1b(=f1I zLr)o2rBk|-Y!tb<&1trKe%C8PE(JN7?Izv%K}trw`Tbk6-M1a4iV;fo9F;BfqXQ8w zvu>V24uum2B*-wqw5>2OQ|zjNGBv;OLua4_%fK{HGfa4PT62|ZS#<;GqDabUm#YB2fZFeHpL?$@GYh5zmo{#SboxBQ+BDDIY^zF`&2d`E zNHCqi$lPJrXW`O7Mu7iLNUdyQ`@GpJw9iz#FCuCkzwt|xYJK)CnLBqs+Pk{GzQE-I zugU?rR^T1n_Uos*Yy~_%gRf zdp|2XC+9T?+p+ExG&0S*V;U6n)90D(dnA?mgP{If(GO0``3~RbZDgOs7ANIaSA%3| z-Y*!3#5tJr8uFOXXw@BI$Jtkxg`XdYEUqaIEN&s5If$g~F5a-8(-zKDsz@xBT4>^EWQfmuv&Z~12SCi1fKMeMdP5Kz6O5kp6=Lup{`*fqL$4yw~Zt#bKVp08fUl++OHX3!mURqQ0%>PR*C@5L}3b)S-*j=yU0nWbr^#RuP zOKu^w`6Z(2$C}lT6VUx9`IB#x1u5TaimQ8O@h)CrGD#=hu5haoMck6o5+#@>T!gSo z`?UA7jw?`Os+u!`oX6}}ziYVxvl!z)LBNm`(0m!ER1g`yFHF3i^KJ6s-e;ikgzczr zczyb7kll*!v?n!B?;`j4CpN0JO7L}^QG;uLS1`$_qV`rS@({a1aT0mT}HEDck#VZ(VR9*Fcd0zFc)!-rU9rGr>qJWz{Ya`bdKO&^%+;=AwVhkh%E z|0kB~f5(QE7vh18`#LZzS${9po#xpBhu$$DH-b7XXkz17OgM$9f`iZW_0<6S5(-z? zv1uGU;nV_Wzq{v?3fR@RM9<>rzV%bQyA|CdKyfGGVJWYr`R|p)yUyo6mke$`pA*ij zsR1A=`PJJP^jUb3f#3TG_h6s0$-B2@=>;&%JI8d;$3i*m(2y0d1q@N;H6}5-5WeR} zDB=4AcCCn`m#@~uZoVbgZ$Skj#-~ZLrf)2j7I-Zq)h{P(W=&Z@xhX8aiW?jaC0 zbahy2Q~w9*oWgKkH}Ue&3Q2`|)%5X9DjOzyy#F>hX78HBj>!GSFkL0~TIBnIgK*1* zvt>KWgY6IJv{scZGcH)5TwP^f9Mi}w8TA*kRSfktRmy^` zU!=ttKB8Q+Qtrs09^}|UDWZ08z+78N1rYpwUX zMtp@iB_Rx8w0}8q$-}(JH517OK3(IJJ7U8Bd{U^l)Dvuo)&rU(QDs!4c=Fz^PeI8} zQA&dw%QJ$!b~WPwtNz&sE1q&E3P=&CUhUhleW?uFt%q^E=B(#Gyii zBhJXb@@Q`bTl7PY@u+BjpJ@gjVzDI3LjsK+lh)@$Xw=bzuntYMen{bJX4|)s;+`yQ zEnqy)U(Ms-i<<%aZp7xxPpDuDv`TepUKkI=HY{Z~lRLlmH6=J?)9IIr0N@q*f6(^k z;cVw^-~ThyX*<)+bfYLbtR)r8!6t$)iOD&-b zNlA!3NJC2rA~F?85aIWo>p715y01U(<98p=b>Dwm^F2P_&$+zc=j#-GBZ9uwcZ3rP zdzwnUm7}rILBd;TSCjZ*JB5Lz{NA+AX5-{xT>7K&aA|GN);_x~jjfD~E4%+b8L{U- z$-Z zuuRx1oguh}uAX&HBMzCL*1(DazDFf*ea$yHKC+svd1Mq~3NEQV4A4OvWkA<-%WoV1 zBq+Ii0)&(+Rll?hmu`65c!7t?bKTBwFgZfDu=M|jq3v&*54ylW8JH%U0Q|P8oqdX> zMTMc`$@@yj#zk-b9*{pd1aVP0DV?La*cOx?Gj6@TlSteF_!Ocv#nJ5E2hQ{mPbmp~ z9A_!!#goUQ2Xx-VvlM!YL+__dH zh?_RI1D>y}_jsz+a)OUHguOE*Pjxf^OznX6rYzE+q#n_@O0-hr`4OaP5=pW%)v2UC zQXs@yEFcjiT-Wz4D`{<)8C70&V9&LY>gT#;J zZyVn`qcFzi^Z$HXM;qfEPJW@n72@vaTL*hAa0-|!6$%FTa2c)5$OlxLtPT3HfmI%( zq1FFpp7`b4X6@%SefeKM{DO9s=HY@BRkz+w5+E&jZ5UAJ_Yn1Z^T`^EbLWx=W`xRm zfacB4I_c*V^6jpk@yH;3WVlZr9orU}U1)M^5Q%Af6Q!gtQv&&4@kd8()>1>70fbrm zQt-kd8z+kY@uzdEqgZLR3F36y^Z@v3L4+$E)_58AINIFz! zRO4XJpFVkus>7E}pY6-4y2k&lRIaY2BPpv&U%-I0I!_PszkIC%yr+Lp3@3Zu*8&5m zm-iQiR}gWLQ0UxRc`?*NA$c}k{hv;(YDX(f_2>v@Y`)j9*TdlIY|h?&aLL{6h{ zj#TRmSiqYWDhopguAuEsYU3QmUYa}+4*a1Xw4;LO}8 z+7rU$hq+P?v@QWxAa^6G7g)zYd65y{Ew=;S8IpyY8pKRMvV&c_PazQ44De0ki$I%Q zx&CBk@6({KjjP#$Fd?M{>VK1Tx;+wrM*l7KC_j$=0Tz!0gTjs8+u=f6ElHmv3#n;G zqyPlhED=!{1F+(1Zi!(8HW{F};tM*noZk+26~Dnuo`;ei``yw((gBx`k;yrzZs6VU zt;yJuZ$IH!z0Hpik#On)k89kV<^2`9TBwwrT-Xl}&1a_G%pi zHM>}M@IMx#h*1UbObxTaD4Qn^g`-3$9m-2-?q1%HNfNv zu&vzPfgsQm)vJk}Rt&jb@Wkf974ZW9_*YiIRgvpTc5Zb&-OHwB^4V8M({qDa!_E;d z&l?fb+~ddRKoN046M)Cmj9d~o~wivOm zApS(n70prXeiYr_ylW&&w47a_z8mMjFt`xyRnz7oUPQ)oibdDlal1uq4b9Q)eW<*n znP(3h$xG!oSkzr#&kF8x87mhzG(A>9teZbQLFd6kU8&v!Vf3a^tXW6TKY@GLJOpy1i+o2}PJ%wSB(S^f} z4b5&oL4|*as!Tm^T@Sw{L?&qOZ1%6MhfBjeIr)XfVRn7_R3D_ApV}HZs~2CLF=^!a zB0dujDC7ta1&5sW^|jdv$aG#5Fzin2{SEC}xXx}iF3)SZF@%IP-vb89JO`ndBfC~< zDFnbm7{7tZNR`<#GRfl$x!-eZ0G>@F0E-}JiV<<%jqTikVaWR^KyJpNsp*s!kEBoBX%WkZHpsc1ED{|VNoFbRFpKy zH36)gg4NF#d8M$OwwR{o-lt0|fY!6H{r1t~%M59iMQHV}fc1NZK1go}@AEp(yW0cS zBjSY`(j#xZTk@=zA<0ZHBNgb{e!%*g3~I9jh)WB%jsI8f`q>Mp___dw9c><-8>qdr zcHj{(rtV&~zmG)$&|kA|5l$8_aE>8+QObnUnCBbpU%I=|?~F%LkSw4nWEKVXZm}9( zy~w26J5V~F;kERP3;X*{5vAa_Fw0LB5BLepHE}*d#zNoP^9*+nVDbY@oKaR%`mvlx zk*ZA1`bB5z7A3+a_;$RF4F#wS))^4YvaYU?ks=RZ>j1E~(|Vhi0V@yyBtYrM&}$Cn z(!*1H{cgRmP_YN#NqegW&y@@U!o%$sF3DsTQ*P9_B&;e&8~-06{n*^As&qm1777yl&x+*4UAikAtW6bB@E0vJLL; zBhlxpyS%M#+y26taUL~)oh6fbdH3w>Rp{$#-r&)}L+j~bkzO_Yd=KI{OmvXnUl&uu zGLRT^tSM(eY9^Ok`yVfORnLxX{~Y&6m-vs`7jhz?N8cV}+q#qvPc9CN83*)oN=gooxcQc@1^vy*p1v+Vv^IcGeoq0g&OX^|ockk&Pw8ZGQCl zB_!bK(%9fP60317YGG4~JVEk6wxQlKHKFjN4h?8nPiU2ZG!>Y)+1quJ+@nv@D zBsy<}PcGFSL1Z9qC4R~dhNwax3zxvI{0)FWA*k7o9+8iKL2bW9l^#%A6zhQNDXvGM zjOHbCX+i|~5-4JILM|Lp&k^noNOGi`S1m$hZ7KnEd$#Y*fUN04g{BQR{)Aed7O}ZcqIS ze;=79=6Z}F;7bUd&JJG657kA*N3P67)HDbWj`Kr~qAKe{KC>yufxB$ZK2J*VgN+o}*OL2*q7^Sdp ztNMEF{23z9na%){ibvn$J;x5|#|uTuYt~9T&+s zO_ds_JpShENW1TZS720y=W*V3R$l_5<<&6TOAR-qj^(%0d)|h4%$^F`yWBD443`%g zwH(Zxs}3y!{nTuAvJ4B#ceZ_g6^2K>KIe22CXBgVe|*_2%6C9!O6hhTB)&5|p`~aP z$wS@Q-ENx*{gglcDtRTq5{J?vdjNnL%V5BkCJ(*{Ra)L@tpPW506>i+T)+W73#=6I zDTo>o25g5&E_~?=K}pJGDvyAfzAmtaH{> z4-@%Q7D0_U*H}$J3I*6V4FPm^RO;(8fcx2aP1@F?8$bm~JJr=M&iilA&+`z#(u$pm zN?@eI%f%%ik(7ulO`T64PLj6I7*BG6_ft;8r7_)-& zZf$+m4~zb3%AYX)G@fFUgq^;-f7v0{)zQL;_cso1mHa39&ONUmc6Og%HoQ6K8sud& z_m&ldPMd4ak)|ZJ@zMp$(DhV=kJv#Y?6x34V zEw;3nlJ`^fB~6l*(}gWwrFFR)^l@4eQKmIv57hci*9j!D{h0u6Th(cz6MLZlzKwgN zt$(!KBR^PD!Y^{VjxW{CecPw*i-!(SgGUqbLxXc~RlIL|oIIW5vMU8_LX!rSo_Swo ze|?Jf*?6#+LF9hSxL_9OEv>~p=&<_7ZgOF5@w2ALs5_NZRTO}b{F-5+Nf{M4CpOnI zHZGmp>JU^LX1`s65dZ~CYnb6l8wI==54NVREg_KVzgcfbot7RJM+x4Q`g{%@vx7_m zp%Es!gLXYiH?Wr|dZEQ>HX&zIX4@{?(1&i`UUAD3hv>JrEX{|3%h)m1E0BWz@Z=KO_9fI3PjWzW7#g9tX~gQasK0KP=d!Aj=3({V(-equ^zXZ$@@exZ-C zu`0A#YW;hH7nQ35b5wKE$V0Z0>)U>!q}@|NpUXs()(o!l5%Idz z|CZfIJ+EJwRHJ$C;O|*C^@z;7?EEilCz6eotk&C}>j3QfRBU*)sw$wH4FNg+y2bhX z04}}DyWhf$bnPtAM@sVUj&vgV0VJqGG?-O^t5u`qudO|$76t(g(@+5F@3zMN++EtU zDATZP12kb!7h;uh>dU(0b*+=56u=P;48~Npn-D7ou6$9FI&dFx`1GrTf9nTp&%=+q zt}uZG1ADt1RQ3uIoU{KyD4ov!C;}F_d*awvb$%4-VTD2{!EwYt=;0I=o3}6PPyIpN zkCxe`%eu~wO>R9%DG$A!I3_L)Pq_clTVB@cWnS3+@v&ofTHobMndo<8YKjDxNGwp2 zc)p=^Cr$ZQZZrIb#vE%NkjE}col*cL{Wg5Lm2jU^_o6RJIt{oDsBDAmo_tK&CK(Z? zc8mj zy%N0{(gx0Sw0TC!*t=72zGTk@T;P)JW|rs=ssO1gzPw__;YGI_wAvS=<4X0JuTW^S z#>R3By*l#T@DZD`W#H;PbDm5Bu#3QP~i*wZ|lTbd~yBjgsAhDB;8(4&Qt17@1D%JS7UOPQ)$uap>L7Rq^ zXHABz=Rrg@$Jma?$_*OYtl7HC9qW^^w<9wCHsHdA@+aw2v|)4In%NB zrQjEU|HbCp`nb+PV0)RtJv&DRgM*LNu#`Me5!aH zv@TDig6q-X5#XkakL^2U+(p{zz`xm68 zhg?oJAP%Yf{aE?qB=zyC*~tk>Xjdw)Eo;s9(5LxzUJU2fZSPXztNY>;1rHjhb}&tU ztLut2WTQ(`DnB*H`Z?2-4*)iF(eFC@Z^0R%x*{1f*Y3|MC!9_&UQMM1r;DQ@#a*UT z_d%~WanD>BEdBZgo#0^>=E}O}{X3VjUHbsasrF7XhY?&G7LT9{FL5`itbvyB{;@H; zc4qPZ6KDQ7ks|f;kH7tJ?B`!JpMX5CA3YZJqvMGurxktwJPSU0{ntNFfK%5VU)Npw zBWGd)&(LUNtjdHlH;dz^=48r{eYZ3QcnRTLGfi^!PLj`#f^o<$J=rIu=z)~+Rv#qq z@EWTk*_lKd`K*RrM}Pvgnpg=@-rOIE56GZqpTivXynr`&6X|M72-6D;*!(VLg91N~ z(G91XvAhq;0>j7Ub+QOzVssRvbGk4A6nFx&G_lj{p43n;x)<^}4^PG>+(s!R^@pdF zFI^XkiQOhbVsr9KoG>fA>rQZXdBd>K(75#?)S<>Q=1UPb7d%JAYEc~Y_?yC9Yiw}! zh&Le-S;}4V6SiiA6;JZ@tJd|cAtT8A#4&k-OHv8DWfPxq*i6(ppuEL&TI#3-pA5{D zEvcUwx!S^E_f)tieP_yoSnr*TeGDXaO5CUIB0gbwO~<8W_eY@T>H7^>AD@}9!i}29 zGeM=aD-tGwyW?HFPxXx9uHVkZN$>op&3$#V5B|Be%%f-j#s7F88`C8Ixxy^yq{6HJ z_{yM)$v>B%y>$77lK_{Jf=aWaK?I{iW=v^3Q|`_;q~0i<9n&V@Dz-7$)#IjPI>73+ zdC>WoWqC5*J7sF8sJyz`PwiM&IZpDYrni-p{0;T?@h+4TTaf-?Of*>K^R!zazU2~M zE=WIzD-ZRrN)9nV7tF)U7(pOx;k?+#VZqs6Zn>|sl2m2p9*6&+<}l*Ca7eUAI$@4a zza?+!BXWT^4I>&~Q2B`83n#@#4LmK?m;bV&)+fvzijL?H9rZYB5c0&;bg22R`rD4; zSzhF=M^e<}}?`1YMYH;`s(F?cF3|z?@`;{H4CiqaUGh`T3on(Wt zLp>jLw=wsb-R9&?k@L<*-U?a2b2jKeg6W~6y^2SQv@7&o!OG^b#;(FbMTCSMh`Hb% z!1AANodln&5?4g82CGbMuT^%Vrx?maa8o{wx>h^#3|!V!l2PuPQN>&L7yBvxEECz~ zQZ9OPVO_gB4&=V1);zj2MKf_d&&RAJH{9MU&B2nEfr7S%QDy@+L8F;((6mvmxy)v6f2yCVC!#co z<12j=OV5~+JlA!Z_A$7RP<%7iXJ%W88ul}9W~$Wc@(>*>Y1+f@Y2sJZ z_=e^?C}Cg>xog zw6b3{&Bl%apuD8Us6Z6|iR@4OG(c}{&l_Fdt>chVF8>36+cvvKAh%ccK* zEB?6k{mMU=Vb)ns5w|NnpLc^Kdtz#-HpurC$9^bsqBmvu7uCD_EWLPHFRL6RhrB^F8m8vCr%cTGJKCOhijz-PEBg&)8ZO!@hy)KOaPP(Ta`rC{pqDs*BWY zW|23+C@or3&~A*pG9)U25i7=dWsPR=L@ARx2dD}@a1oQa>@Z*iBx?7I43ekAfcn?e4kabm=k3bj&`X2Es8ps_e&xGx}9UP|9%qUgkpU%&1Gi}gY znekX*8=v7Ui#RDE0h@7t*~IdI-%ned!Exc~kF zkA+eA1!#P6;k?yLSatOad__2QZ8A{eC5Cmv-~HCEsm zcdDYNG*|rsHn;BCEnF+@&r2I#ov|N*FS{;nRsAuNRrmpPKu zRJ^C@)4_8@rFfYkSO2A2s6FISDf{DK6=YHDog(&Z(ymNam9umuzI~K1*$81GGP^tES)d1W1Frqezk}QS5lf>LiqarEp*hciPLJP zkkjlf=I7^l@q2Z`c8vBja7xQMKb$2F)x|ZzBPT0yIm=j$m-|s8|xA|h-ap{_A0=6V&Ki%KHwM58X|0FM! zo`C4kfg+P+%oWh{o=wwpQZP{xt@AZ`Ug`*6)H*k1lIN4`ge__yBXXuz8Qd!ic;3JY z1tDQU|b+{Ou{WZnj_@ zqo6PadwEkri=x#&$SNYd^D$G3U|*`&X6E7d54E}P6tyF`aUDWfz-IO|o%gFNIr%?l zH~(_D|LZ&dzfPl6f`x0?@SN|h89i2^C}BbfNcn&@p~For+WuA7#ak|SSkCtL?#phD z=z0HQ3Z}aX;?2-vMP2dH?>fo&7~h#s!BkiK*Pg)ZSozzJFZH@PPKYB7(4R2HZ!62+ z;6>H7D@kn`sRn9eO~|hJI-IKuqT}J6Ae3elQ^6`UJN1?JQ*im}hchSUA{?b$3--Xr zp0Jm6(~7=F&5;fhwkLTkP~c$f)YUQL29a+Skj!l<2I+;*eU5NnZdNyM*Rxkf%(-Vy zHVh*3l@Rvl(M;F5-VN)Jo9g3F`&yMx!srV(Arc!F~=S#M!{cy?-Us1i()x73&5tT* zD=`SQ+gC5Y%e>Yl_4D}3jEc25G|q_5eK!0d%bUA=2@i9k2_NL(^5(Fi`cA2G;N;YBo4(#7|Bi0^lX?ABw1~D5pJweX1hDScJ9;<|yW?c43ERof_~NgB_&?wm zFJ1m;-jFCcW};nCGMiF(bKxOCor*Qwik0yuf*K##m9uZ`AJ|*-SuN{>N5#X)jy18Q ze+m0n{jT%N#iZ%qaqF5c0)FZBWU{(7v$^d3pc+J9IO^P{UNBWZli2(eoYU(}Y9j)v zmt@4J98{#?4~zE$j}#hf?>CxF+#4-*ICULC)Fv%WD$P%!C*eQonLLC z)8`!22zk#x`RtayE0)c>#tczbPQ$Q&(9AlC=O%%&R@~;)e1Wk#8}|Slw8$3M^$bSz zsO^e(sq1j?@o}hyHfa}iG?~|x2Um0TU<0x4zgR1iqO;8KsTF@$&EAyhsh& z32Nm7rw@zdMoczi?I)ir@NkaGA-y)$Swzkz8k-CrjY#dX(#k?8hqCTIX|J6EZ)Ac za9W`sF0P*p;VoTjnQ8YXDwxPj2G%rvNa}>#B?%_OgV`rVoy$(>V<)~ome-Vx+3g(e zxCpCWezzk>tlJyR3X?7jo!S%d>#|nN@S?2!b8SLLA4eE!BQbJNnr+9i+FGsyUg{lm zaao8MsKXILI9i)H$ZCAg;%t=*`R%C^QN}D$ERZrRPP+OH%mvOUK?8ZLfK6hZchLx) zryf6}k=E*|NRBn-0hRwiSB^-;l*&=tTpLzFikDutSA;Gsm-+T_h!Ja-z_>m z!D(w8Yhvq3tn9{;I?H>~*;+5V!ZRN}#z>xMD4*hK;ReA}Nc{@Llj55e8k0zfF% zLFo~2Yev-_Su*0-iCp8Ig{E*Av;E3n-+F;Z$RLpWZk}RqN~Ztfm5Z3B2DbH^Can*u znHn4Bg7t7SPw|tZ#SxXPKp?uolTTw$7tYW1x-C3>M)1jvF-4Vb=WOj&r4u6;_;I!L zSE+AtUxUuTX7znqlLns4e|uzHnf3v_$6oYDUwADQsjL}WYaV8Dhu6#EpCPgQRbD>4{vGWFsRrRr)6uYe?NS&HrWelwl- z#ov0-o0jD=tA=lMqxy%c4Ac@@VJLMz*vM`yp3$nTEScsuqAxV0^JO6ufe-9mv+-`z zIVPTu2Eb((qQwXB3JBI%LnHa-=_RdO^fs{!H~^j%3nWozxL;=bvpv35@z?y>zKR1n zsf2OY0lti*@KeH>eLjCxc8MfD2{t^F|8n(PLBK}TOw%!~x+WlsArUxjry!pudVs;z zCbvq|a8>>YAeme$d@xk)bJS;-fzZ7Qxvg;tV?QEhO&{OT2zl2ns93oKiYLi$ldrW zm5S~PXc>B$Y_|}d9bHHx3r^?r`Nm=Aw=i0!oA1=HO0j+eXU75yf-F}Y=j_n12s>=m z99~~GdR-<8YR4_19a-s>GvLO=SfqerwhsyrFJ}UNdT;fY4QRamj&N=Tog`T57^^tjQGSqYwXmJ~C3|t}eNXT|JHP(}Jt(X8 zyxnNV=}?NBOJ2Zcbd(CLph1`N@d66$xRB^nYt|k<8><1mGUqjr1t%0!FVTBcw_~mqad3T6?n!Rfl%YBxVZo(#7qk_!uIU! z)rCV_NT5Sz7!a@5LdlclwPu+6a(Y3=l`?@z*Pa>gYxtWR-4N% zP+Dc2Qx|O`D8`QN&|%aI5__Q(+uM?g_5YVMD1;yOE&6Ox~!y0ElMyN5jC#H8L_9Hq@9BZDJ3FiwuEQ3+~A z?wsjwx`ZB~MJLzdaE0?l#q!7bo2^;rW5fZK%AmlQT4?XPddto?h_z8;dRKJuN-t{KyRyeO>=;WcEqIls8eRfqEAEQ+>6;xHNLg!WKrqNYtLyMarcPRgm6>;o5N z9X}qQI#B~8Qm>mv*%Fgo0|gUL;LCJe5X3&aY;baqN~A^*<^Y22slIH2U4l_Iu3~E{ za`5iOtX67j5e%j%2yxjtyfOit?u4jf1~1m2)h%A$X9sn`;TST&O+Vzi#(0`FCnqmZ z(FKh2#)B3J~sSazmOan&;@^5JAk?Urbg$FwpA)-g7=Vbk!nG9*cD-z-YO>Ms%Sbj*;?o18{rmnpLlA1fB4D$Og~()& zw}~Hrm!htv4*@Ugt_|XFt9Wlh=wm&8{wdpR|61kggygU}IGRUG?CG4&>)dcbKd6~A z{V!#Q|7O`?9W+yOPzoj;(l@1%EsH+xj}{x=xd3b4+9OS29c(|6>6GFIv@z}a*Az$T zHU@Ii>=;BqeB~QT9%&>sgWpi^-r0=*4c6S;?620pBFda|TkygF|86ZOrn=GzO=up( zBah0Mx0%k~U!8g1%(M@#5dHOS11TLMlW>Hp)Fx3jSU*G5n|=yr7Bjh6=MNh7%hnZf zyt=BDgOcXI!PboO@C2R{A+h-lYxSnmLWy3b(ldF>M^0TvEo{8oqJcgoef8;?j;r>+ zUVFAtc%V`u=Nj$)wc2ENvQHsIsfyE7TF+_yZe`2N2~QbB^WH_Ay4`T4xvUg zs%}k_Ln2CINp9x^eK#t9f&+Dlr5%|CV$EJ92N1@{p{El>4_aF4OqAAXapIa0Yb{n~ zsT|5TFzJH3C3fU4%Lr92*o1}I(Khvch)L!pG_R)oJ@QOX7+e@y}_|t;GtbMiyZbP*2+Q9iBS28 zc-BlA?F!JHV%j(1{ZW-Um(YX>gd)_iiWrN*EX69z8Y7if23E8REfHcnCuBwIEl$C_ z!T?;{i3sTOOk~voA3waD{TC%g;5HR+PAhEUutCkm6P(!3a?9+)dj4t#X!QJkZaoF_ z{=UgMxIG79G#y=x9N_aSLIfC(u1a>^2?;;7)ya@ae(Y)=rkB1F*%%||Nn%SRoouvlgI>v3Z+Y<+K!2ZYj+?0XVxuXlvrP^Eo zyLswS+P%HIejnwlX4!Lq9GqG;;znA?0d975zuy2g)lT_1Aav?H1=Ay@!WyG1TY%?o zt^q3`?vbw9G9x4!49#tC&t4^208;0$Z8l5UL4JzvA=`^7j18x_J)c4<=pjyz4a9|a z-%Bmcsy8d;w&YC08fV7nvg`cq2_{pQB6ZMMLnwrMzVN?;qDdV@I{|5W_c5tg12V33 zfyeU2nwz8m7*jI$Q=uWxAd4?^Q!mqfTBj{jWhhCIyFK&6Ewt=ii~~t9-K0~rEdGrq zrHVV6OW3LIXd9pFQsMI@4<;blcKk$cbUSGLB)+x`2Bca1D*cb;Xp@od*^aq7rz?w% z5Pw`(rgoNZAlRBEXjREr=d0i))cXSk8?xCn|AEkIGR*NcVi5^C1ZO<<9pRxuBa9=y zP4;Yxu2v@9wV!_!&Z`RIQLt&Hxva#qq*lHC9r0yT9rsqP9iot04CFVJ?%zbkP6OQiXSzR`Sv zk_&Y#?fT(}L6zJSxL!|DeTKK}q5ie*R-agXK-6ns7iU+tB{|k6*D$mxQoKi0bbr9# zMVp&R(Wev42Ul)rL=lYG{vg(B5d+lRL<~boq{Nu2Ke87apuMx-48`VJw275Un68#& zAidHZLw2=8XCj_2YB{1}3QZ9kc&aK4M^ z2v<}DtYrk@gmjaP|xOEj=`eV zt#2{47ozP?EsOfEF&+=xp>ieKCCmc*1v@u?KM5_RFT(sVi`sVQ1)34*K(qR08W_uZ zL=DE|gsT<1o(;@U$Gu(lku#9PDAv&5GjOVr;lUW#(^zA7SfvE9`L(%Ng@vhE?KReu znr@Yjdw)rM8WCAaTUU@2C{7T++b$$}O@@rE3e?fsY3n-%{VPqaWqB(v@2>Am;Z}%s zbjDNg(idA&Tdy6#NMUKOVtXY$`+6-uJrgLD|60=Qbt|4^|K0Wtu}`)kg_{ttDKsU7 z#Nv94|H|qRlCb@8sDcWf9t@dbe*dHv5xy8Jmm-IpUNUav70}mPcSsVeh4U>6#Ivy3 zGVTlf_Q`~f_31G#YYn(AR>r!Mx}u*inbaynrEBUZS=DPHQXp2)w~oT13D}vMXaxlK znT2qrXZF42R+42bMp&*eDQusl2eyYhWaESBCQ#j;ENbgp@io$F($Iix;%jXAku9NL zXxK)ld$A;7Xwh$lqD)P8&w=*;52zivjR~6$E#}_6Zu$N|dCTs@^oP^b6hgy$F>Agm z(2qldYFvHz&t~GxhGRm*!hYaBY<`NLBRCN{KG}GuSd%S~?c!2r37*=El9xxj_{%l8 zK1^nvo!GOAxf*$zZLQBwKRe|5$lk*?O1fs8vtw-7A_@kMQ-r_ok!S>Bn{TdQUkN;+ z+Yt_=`qb~IQ(M0`Bpf(rD5=~gQDcoeKC(2ShGijqSUvAH)f1=|k&SD{@$tm^)sJd+ z{vGv#TOg&BXYrK zP%{t*k4>tFKI>)2pjJ~dwTSq0+z>bMH3K@gnwoJkVv2S%yOfj3u;>o z(0Dqh&7m5KK3>mmGo5)urf}$x9I$1ILf?dCdn|RW$dcQOu`icmiMdVC2%kik1*$|u z?*#7|G9W*(mSv|&ATNkR5HoR52QH52)V|7q>}a3?C5JLm)?KV{kc*L>;(DTxl%N0^>n?Awzt$QovPnNjC$Un%gJQ$A3yDr@sIAzoGfHgfnyT;g#(- zH*YHUQ`Z!Sn9iE^ezh1)>e{0VkUpLlDeXhn$%945FM&?jl4E>MEOB2wcz=V`jDu)X z^jezz2jUVnpxN?9I+QtQp=ANwPtAEI*$jQ`Vaf3m*2*zQh49b_;C_cJ>ZU=Nu92r1 z_dO)iu6spjp(z-ag92sZ-tQiD;a7h3lS`1-c;p+Zo2flmq>(Xt;{aR}RbCts-|5zx z1b1S)dE-n1icDeGdpySV;ZHE&8;XML+(+SEfI}-(7mIV|IxKEoD&J6N6)(4Wv}SIM z97`F&?p1>O zT7A#T2#eT-#C(}5pe|KJP$ppb=0jK<1vBz&+9{@6+p@v*DcHrei=E#U!Obm{1?23G zfUXF4#B)w(dM8=qRyXivq&NJ#Se|F7vfBE`vSKI$0 zXZ+v55RU0{JN7Uj-pK_N=mWe4ZR23Ld*4LQ*An+)*GJSU%vKdQ&%HKf=-%&7@zZ}N zDXpz_I6aR%ybeKht{;TXp|0pc(t21^gR4^xItCLDGrhy5b`j1N)qPpHx$?*Dszu9x zExuFJJW!c=3`xAuAp0hoRNEIUW2`|NaPV8%#U4Rf0O{8lWcXG#xr=j$bnv(x->qHI#h36>;uvCD#l;@Ywe>G1PAPl|bgEVa{ks z`h`XYE^-0>c><18K|16Hx!!IPlO)X%NShyt@-DvKhg6MyLITxln#v;u%m@?aADKa3 zxPBs!8TCke{$Nqb)aS{vjtQ5jQIpOSWI0z zAKf`!B{l(NDS-m##?DEz_nsppCJyI<+o57l-X`E+SO^mtbBCAc{DfC2A&^TH0+Rs> zY^rVT@8)2-(e-5Ae)H$A8`Tx zqvcws0+XijTHU8dGpQF3h!8H`y%?WL9IoXC{DQyziAvD;Qgr`XCf^QCz&F+5=md80 z`L-jD$0%;67+TEPE5Gh5$>7Vj7tP*ay|9Ozf9BmaC4IcOx*@qn^(luotg%v<(Rhy9Ih{pEjd?40wMn1_7y89j+HcT7q002Ah|N%IGZ&hiFcDI~jX^T^lp2Jd#RKGWYd*xEj~%THxSg z`ok_3FXeN-BIhhV01}Y;s6A^vac!Y~iualSv5?y}U*{7G@9G*We9zG9_#T_9#TKK| z%m;q!PVbrhETz2lUDb~07LXUa?yg2z!IWoxvMD;PiFzVB@Nv-^=A0FXF2NG+24dAH zQG9r%hcQ`HHw;!?Xf$jo-bQ7J#hRwMc$Tkw zhyFO%-rgknE^5Xo&Sl|M0+%weGX6=81`?~~VUrz6ea41358&peeNdNX&r1bt2EE3H z1x#v7dmaK3l*n>MqUtbRRxd_*+?z-WpqZlZ(R1BurbW}aV5XOF>?0peNQ|kU@xN43 zFCv5`Y=@}>CY>JDt;yt#&pUNM-Z2v$+9hGF3peaWC(Xoyni;;oA}_$?r<3hSx)1_a zSc)f4-^4Y}q-um6+Bb_BkZ+5ivCAi?9=j)<1Eau}vfNJ-h&wafkuS~ECC+wQMi?@b zR`sAimD(!3C}P%5|4tExFU6Wi)Pe&)|? z>_`$kOwzT)KJ~cV=iU`TdSPGHpII(Z*W-kqxNT3~lJf%Qv|OK?kD9Z(pZ)V!ZAtg* z+mD&YBtNuQK!oXF0bK=JDc4}{x{C@*zt9Yb&MqiW%x>BKfX(;MTACM0aqNDoT6Ph} zp3XKCC9!xwJN_I~axJ#|Gja*>(s%lg@5{fDZh9}p6TKWyf?Ldx4ka7f&lHD}O^-ba zo!=luC+txUz$#x2GmBHN$;1#WXbk&SBc6gnV(=; z5iVbU>S-MXpKYb-FCUua-%%e}ta8gnwFL*x!$`g*1JoVqDh-an2Gi7-wl4k3Y6S*4 z+XsoUcM4qY1MiOy)NeYiCfSzxhm`RFf&YWV_2uiNQfw2pd=>d!6{Nh|=NYh>f)!m} zsO2mhP))Z6)wEGQB|;(#PTZey&e)W`FNQHbS3;FGYCQ*~@c?Vj)L->f zccU>;TqL>Pk}wFJ4gIS+BP=$Xy0*W{n_C`U$B1EnJxAE?7)8c?rgK;8^#pC+7IZ&* zR;##vu0fv34%oDaRDo5L!3jp4gZ$OdDX>ld^n{wkoH`mN$~`DuSj0$}CyiTz{=eSN zJgUia&*Po3ty5g^7L`&2+FC(bM1p_;16L8KMT2Z2i=h$-vPm@%Ab~Jyks?cKksy%e z0s;*nF+@NJ5S5)^*b~-7MF=4YktGRaowsN1nR9y1bpDvRcmB>F$;o-n`~05o_w#vP z3-QzjI)-rnVr?C{xR#-uXaDvTp7ul#0PuST=MxmtdAbEi5DdKEW&h-LKh3IexwT`} z+J^Ux+v`+~&Nt3((>Q`K_2C3j+7+{9@KZB@DIm{t6iJt-Ha`5QN%)7<1OLsya#yp% z$lHJs!{}&W4~!Lw_VocWhSy;ru0cgYYbr&>-6+i~fWt`k2ioQ$M4G{h^f9e7Y-FM+ z*p=~Uknj}Nf5ok7ws~Mz&EB>W^7cC0qbydPz06CQT@QlAC|lhM>HXsO;;?= zN>k>P|DvP5{NZRBJOMs#jU#NE9zpB>+!JyD17??)7l^k_bJl$t44FW%}{I_<3=6)#W& z<4CG29^7?_?Cq5ebX?;B0x@Se%G#~{20n3qG;T_Kd$mr>wxORc6$!QwkNFUfR!ykK zZ_;CP*q~mHk67Vqh5|O%)tnB)d1seGu$$Ys;8|0HrgO6?t|bcU%vp$XN}IG!>_zh) zb2k~yuqdf-6u{>*pK|e4HJZbWy*OFxk()dwCqf^>pbpPy7-;74TMR4}C4+q8qSRaq zn-TG!bA}7KE?caIo zE?=tC>jhQi5Jg!i$k;jkjS&j}G>uw(D&vdyD5kB$J8XwzVysEo#XiLLz`$rxZ@sB^ zTc$xx!ldSM(Q=BSCCNnnHA2Tpw<`qK)BrR~pWI1(VobK{FocwXN_o95%fDDs*iFfk zseml){W(5R5!vAdNc!nK86*mT6AmIV>H|>}k)Zqjt5vmUir2_*S!zJ}FK3kYZRj>SxO&*d9LffC zx&Hi%+ydQ)()eH0TYHRV+Y)iK%FYZ@;DW+BpNDGakf2RUy4RqQKLmLxnKN$|}PY~4^4biyjBDb~IGkm})>*R%}MR*%WN zPtW_qMs;!tW`FMsu#{+t{=F;BHV>UYd@8{6!!pxY5buM z3pj>Y9^8rac2lL8D4$p`GJVvFy$CS#oHz&!(#1g3`eo#TPDT?1C_M}#UT&)$FcmLxSt_RA?>J1s1L+hxRPh1<@V zManle#*}YLgI!aDhD$8GoTB0{4-c(3ab+qz6}nlvwK{HrNJBN+APbz#L6?2Rnq;fd zGTzMw^7I{jv(lb{OVWYBzbUr*-co{HGe!4?jKb;%uB3^8iHCH>t9b7Q#K@S}JS&W- z7o9k?(qx+%p_tsfw*gRMWPKKZW`}>A4T?T3E?Io729U0}4CZz<5YCJ(q{lrw27kHP z8r;s*Ua6kTs2H|UWdJ+_3|tKEazaJbqY*9PseITjJZXMHy35>0qG+Biay1ltNLg3h z8vCX~Iu9dFQPTb^r=ALyW#^b(>h-hKukQ|#5|aVlqLP?-6fVl<$Kf;6H*-OP+v$nT zN~1%z{{&TGE5FpU<$PcuVmsck2)wZ!)(iFVdA)w}btJTfTTFZTqClo{t`US$$0a%I z4Qydjr1g1!#%UU>xYn|mmWyP}XS-j`HXoybS~BYzzAv#Sk_M(C(Kqlx7j2MtPE3@4 z<;bF6;QJpE(f0o&m#tKXwPMd#h%P-u`yDw$U$5B;+Z-QDO}~cEre#pQgE?2Xu?th7 zrO9TF5w{0&&o1TN6M;CQ-9zhRt*|eg^FwFhbjs$Vi*wCQ0(pD`cgS<%+Ogf|h6X6a zD__qHh;Vd!42(=5)VHU6RF}tXe9B!qF@|)`lWA)&)B0O^ff2rsx!u6CeZn@2{bk)@ z7;mzn=1w`%2Q&c2Xc2zN3c#WP-#T%q;k0=>1m^HCgjKxaslz+-w^jFC4+pZ-d~+fo zHI_6*Z_u271T7rn&Y5Kfgm$wb6yz`5Y*Iykkdjz6Can36@W3xx!U73epTv=I{uUMo zhP}P>36;FofR>)HhFN9&&i3oNN?nL!zuZ_EuVy{as2!{U?cj7Hm5T{i3`j;B^5!9p z)RyN_Zs9hX7bDocTi>p!UcWOp5$zYW#;foUzMuzC!Ayap@m;P&lpqH(6XzE46I&7O zDOperyql3=sn&oFN`M4*qMi6NWn65fvE^35+8$7d?iJ;-&dW(oaMOQEQ;o#To~_Q2WU zme)9#9cw{+X=#77GEBLBn`oF8y%2(%zI#;_e~EO6Mc@hTjjRwr?CIe}ef>6BkP*`y zjn9;+fxkyaj{`LqYZDRM+szvF)6I|{sDMu~Is7IS{C^ggYah?EGOcz|fAOc1e7RPA zgN?rcOFW>L%@#|G&jY{fq@*8ERvcIu4QWUyOR_fLiXz+go|)<&*-GVGlM{q;(cUG{ z<)F#$7s(^C(9qcvtghu)eo3Gk0%~R+YzZ&_&2wxNT(YcstE?WPl*KNlEx%?91BP$+ zq$BW7MWk$Adg%VvU{fz1VGuY+B9l&r6w)p|3n&s{^xD^gW*1s-a%k0~fN3Ck%)wVp zC)L*l0cVWBnMLp1p0mB{S@Tf(bo`)P{ME*~*{kMwT&0T&CMxYbLdn^L|uPU9kb zTT6EY4Xj1L3g)IEG8(i=1zUNLqjcO1`);!*d6V6^0 z*?*UoMaR_CDQuI2c#kfA-r*MTP92P&90dRFDD31tv}8?kA2&`I*7uaWj6){sO+?Xe zl{vkuN0t=Vcdn*NYDfm9p8Ul9qGap+f*f-cJA!^)ru}hcXZv!mS-Y+Ad#z4eoA+cA z#pB_zdovbHR3*#r`oS%mo5%@tJhj-X75hoc6)3)cJ@s3-VYCRPVQ)g_(JWK%QCkxh!D756%6g`WoJQXhtq)OO>b*1KYWR3( zo4(s@hdCUB%bc{vp6HN(&Ux+3aPmc`Q^0V=&c zgXi7B`)lv7Kyza`7=BriyB1l6dakw+pkpFzcg942jchzwNIONFb^QKak?OFX%YMO-0{vkQ?P2#o(TW9}{p)@(bMhq0#i0q7 z`en3lY-wy&Q!E7)VPIENT}T-U{yF(wA-^`L(_-@3`IRRb>V(ge zG_~M%e={}zn?zj;%iY3acMz@>3~J2F5rKnYVkgPZ!jX$_TYjpz4BUKGocn6J@*Hfj zo>nxKjgPfJ6+vtdMDIz=tBPq{FFCO(KX3Heo$Wau6Jg&WD5`?#-+57x>}(=H*D0vQ zmFySg^wn?KtpP-%cF|;$saLJEgC-z`Muu7gL+MS9f-c{xR1vcC@b3@VhGNFXt`GneHGED=~$vV9Ju!@Agw?oxw zZj8>qxa0+LWJ@v@C(=GW#72PRTT6iPqz{c`3rip$^;IU9&^2#&7?tT98SR(`K>%m= zS6X5DRh-Ql?4~fT&;rD%pI+GBS+** zuPXz5{w-tYkIfQke|BHQA8?vKAj^NS=>Kqb{m&{17((iQ$9@~)1oz9YemS#9?%td% z_4Fh-r^-}IezLePuV%M3&n8o>CF?yA2h;6s*0b`6BvSvQmA<26{H(4MZLeezC57Lj z2W!s9;-gDU1;I6k;qy@Laj7f`I@}3cdjB}M7M?SIkajdPxQrXo8OVM<#5x=9Q@_(! ztbX$EwdeMI>~YQKPH%8ZY{#XK%R{UPM;_nU)HqfUC(x}x?UHAMkk66w`apfTHWP_y z3GeG)S}r{ielN~rE$MN)S}Y-#Cr;QB9jtFIHH7iMxw!@mTxW0{7h@pg%%}!=~WK(}4HcI^}e{&H~FaE~X$G?!#R;!Wltj z6*iolqSV|DUQPD;dgi)Ntyb$LG$`KJHVV=ydzWoN_52o(2d zlepLn#3d2Ac%kXRpd~AIu_@`80dtWvY-A8?ohAXE-TH1Bmd5WbZmh@>;4GLehAZ1L zOA^!46P_PILW!*?8#;GmE8;QLP$;vJ$^eLVTyny4)3j)g=fKj}-z?oQ0h&*ug}mJr z#`pz1*|v(C4V7bx5ary;(Ht1=_!5d?F@LdSV|vyLB(KAX*Mlph$Brdu{sh0dG;_KL ztgnZ;U_GzLb7GN)k~9@`Aox^PV+987m3`f_UZ`1E7*|?cnvnsWZG9@3UFHa)pdEBu zIK~i_xd{a%eUPp+FaJgcz&M-n3c=Cat)09V4dIVg?Cf%r!x#Nsq|>v`f{n@BdGmY# zXDst0x3W2srZkF~_|f9V_bt9oBXK`Y&_%_`n_sTS$5LH#6nZ8>z5i!g;P2Ha)dC(E zT)ODtyG$5l$CNJVH8F;EcecK=QnQ^Hdv&@EWo1ll5jE%uX}!#Hx4T6(Gsf$Ii8pZ1 zNfJX&SW)Z*)o`UQb}IBdi9O(4lGl@S1w?eT+=YQ*;FN|qqQ7XZW_@Dj-Q-)4`BI`} z_e||X+*}0kq_REU3yg-uQ{2${IqZXRfE_4Xgx;qgS0V*vLMLJLhhuN@&o>=R6?q8> zF{Qnv?D8pN*PJY?;ragQY_-O_yPfbxuN^*efP;S;+;I?lkLwx4cvs6@Bpzv459M_( zUA4&*L%#Y8rpphXOn8(*TGrnzLA)WvG!|$=t5TOzgF}nm@CeKZGe3sa6SsWq5g1L!k1K}J+{pL^>-M!>&#m1A`jvs<0mi? zcE~!2@#tO65gxr0ZuRu#}xSh5>6peD6$dD60u%PW^19dV2+aE_`EE>pU@{l zYj#=44|Pl~+sT>QH?&|^T@38`v)ljRZfNS{#qm|2bacWEN&ll*4giWk9|%xs*NSZ? zlTGT6Cq=wIu-<;?o}pHlRjx$=SN;GyFan?Ae6?g;B9E-+ie`b^fq(+Y9CYv}IpKcA zb%0^oGhm1;DFi&kQ0oa{V`C0!)>mnKyLEh5_$zXqH zubO)|=`PXO&Mr)n!tnozb2^e|?WDfrxsi{rZG=bOjZ9aSi7N{_hAvFH##lhOr4@V7Oxxj zVfrl1DYcY5O*fzK#L_Km$Pd6on~YDjGkh&q@}gK<3plM~Eutx%W*1^jp>ARx_2+fy z77*JQzRn#aFvM;KC7Ea|PTf`C-BYs8!2x$jxG4(VuHkh%!^bg$nVr>j3h5`h>R^(3 zDh?E_v{eUzP!c*2z-KBH9Tch}#mxflc56L~uHK22rVJ9+aVGs!;ae{=0oNYMmv@0I zPH{wmA5tV6VzcePWL#F8>1*%hWhA44&smuZ7Ex@e)+*DdS1Z?juq|E0X>m2c7!v0e zchJc|u>E#;WncO~7z2J)9aD^Zh literal 51295 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 R{qkG7xp*ES9QyO>{{j)Mwe$c0 diff --git a/outputs/overfit/summary.json b/outputs/overfit/summary.json index 1f6e681..503e491 100644 --- a/outputs/overfit/summary.json +++ b/outputs/overfit/summary.json @@ -1,7 +1,7 @@ { "device": "mps", "samples": 5, - "policy_parameters": 1088930, - "goal_parameters": 75731, - "high_level_parameters": 652800 + "policy_parameters": 1088354, + "goal_parameters": 75347, + "high_level_parameters": 652224 } \ No newline at end of file diff --git a/outputs/overfit/training_history.json b/outputs/overfit/training_history.json index 01f5f9d..0b20283 100644 --- a/outputs/overfit/training_history.json +++ b/outputs/overfit/training_history.json @@ -2,87 +2,212 @@ { "stage": "goal", "step": 1, - "loss": 1.0040572881698608 + "loss": 1.1256178617477417 }, { "stage": "goal", "step": 20, - "loss": 0.34230467677116394 + "loss": 0.8757796287536621 }, { "stage": "goal", "step": 40, - "loss": 0.37451064586639404 + "loss": 0.4848751425743103 }, { "stage": "goal", "step": 60, - "loss": 0.26792070269584656 + "loss": 0.2024349421262741 }, { "stage": "goal", "step": 80, - "loss": 0.10219617933034897 + "loss": 0.31732437014579773 }, { "stage": "goal", "step": 100, - "loss": 0.2711445987224579 + "loss": 0.22155670821666718 }, { "stage": "goal", "step": 120, - "loss": 0.2289590686559677 + "loss": 0.32919183373451233 }, { "stage": "goal", "step": 140, - "loss": 0.36456483602523804 + "loss": 0.171668142080307 }, { "stage": "goal", "step": 160, - "loss": 0.0842418223619461 + "loss": 1.0167959928512573 }, { "stage": "goal", "step": 180, - "loss": 0.9889341592788696 + "loss": 0.8417221903800964 }, { "stage": "goal", "step": 200, - "loss": 0.5776903629302979 + "loss": 0.10604722797870636 }, { "stage": "goal", "step": 220, - "loss": 0.44620272517204285 + "loss": 0.07537326216697693 }, { "stage": "goal", "step": 240, - "loss": 0.05634145438671112 + "loss": 0.1885790228843689 }, { "stage": "goal", "step": 260, - "loss": 0.05701519176363945 + "loss": 0.06766514480113983 }, { "stage": "goal", "step": 280, - "loss": 0.06764699518680573 + "loss": 0.14665386080741882 }, { "stage": "goal", "step": 300, - "loss": 0.10973378270864487 + "loss": 0.10101648420095444 + }, + { + "stage": "goal", + "step": 320, + "loss": 0.07647702097892761 + }, + { + "stage": "goal", + "step": 340, + "loss": 0.08067559450864792 + }, + { + "stage": "goal", + "step": 360, + "loss": 0.12979857623577118 + }, + { + "stage": "goal", + "step": 380, + "loss": 0.899062991142273 + }, + { + "stage": "goal", + "step": 400, + "loss": 0.12218281626701355 + }, + { + "stage": "goal", + "step": 420, + "loss": 0.07381283491849899 + }, + { + "stage": "goal", + "step": 440, + "loss": 0.13227435946464539 + }, + { + "stage": "goal", + "step": 460, + "loss": 0.08732561767101288 + }, + { + "stage": "goal", + "step": 480, + "loss": 0.09666546434164047 + }, + { + "stage": "goal", + "step": 500, + "loss": 0.06472445279359818 + }, + { + "stage": "goal", + "step": 520, + "loss": 0.08121205866336823 + }, + { + "stage": "goal", + "step": 540, + "loss": 0.06035961955785751 + }, + { + "stage": "goal", + "step": 560, + "loss": 0.07124190032482147 + }, + { + "stage": "goal", + "step": 580, + "loss": 0.14373362064361572 + }, + { + "stage": "goal", + "step": 600, + "loss": 0.07122757285833359 + }, + { + "stage": "goal", + "step": 620, + "loss": 0.8890293836593628 + }, + { + "stage": "goal", + "step": 640, + "loss": 0.062469229102134705 + }, + { + "stage": "goal", + "step": 660, + "loss": 0.05835632607340813 + }, + { + "stage": "goal", + "step": 680, + "loss": 0.8515450358390808 + }, + { + "stage": "goal", + "step": 700, + "loss": 0.06296383589506149 + }, + { + "stage": "goal", + "step": 720, + "loss": 0.06271275877952576 + }, + { + "stage": "goal", + "step": 740, + "loss": 0.09368501603603363 + }, + { + "stage": "goal", + "step": 760, + "loss": 0.07982345670461655 + }, + { + "stage": "goal", + "step": 780, + "loss": 0.06414016336202621 + }, + { + "stage": "goal", + "step": 800, + "loss": 0.08895712345838547 }, { "stage": "high_level", "step": 1, - "loss": 76.15934753417969 + "loss": 84.32572937011719 }, { "stage": "high_level", @@ -137,323 +262,507 @@ { "stage": "policy", "step": 1, - "loss": 51.04338836669922, - "text_loss": 44.21609115600586, - "flow_loss": 3.4136481285095215 + "loss": 51.165855407714844, + "text_loss": 46.97157287597656, + "flow_loss": 2.0971415042877197, + "rtc_delay": 5, + "use_goal": true, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 20, - "loss": 26.20608901977539, - "text_loss": 5.128565311431885, - "flow_loss": 10.538762092590332 + "loss": 11.228275299072266, + "text_loss": 4.843214988708496, + "flow_loss": 3.192530393600464, + "rtc_delay": 1, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 40, - "loss": 13.018914222717285, - "text_loss": 3.846059799194336, - "flow_loss": 4.586427211761475 + "loss": 6.2679572105407715, + "text_loss": 2.9056875705718994, + "flow_loss": 1.681134819984436, + "rtc_delay": 4, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 60, - "loss": 11.344329833984375, - "text_loss": 3.335771083831787, - "flow_loss": 4.004279136657715 + "loss": 6.005075931549072, + "text_loss": 2.709343671798706, + "flow_loss": 1.647866129875183, + "rtc_delay": 2, + "use_goal": true, + "use_history": true, + "include_subtask": false }, { "stage": "policy", "step": 80, - "loss": 6.586862087249756, - "text_loss": 2.5455708503723145, - "flow_loss": 2.0206456184387207 + "loss": 9.903374671936035, + "text_loss": 2.334010362625122, + "flow_loss": 3.784682273864746, + "rtc_delay": 4, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 100, - "loss": 11.200895309448242, - "text_loss": 2.1739449501037598, - "flow_loss": 4.513474941253662 + "loss": 5.646769046783447, + "text_loss": 2.3033981323242188, + "flow_loss": 1.6716854572296143, + "rtc_delay": 12, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 120, - "loss": 17.273035049438477, - "text_loss": 2.1746408939361572, - "flow_loss": 7.549196720123291 + "loss": 6.867326259613037, + "text_loss": 1.850703239440918, + "flow_loss": 2.5083115100860596, + "rtc_delay": 12, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 140, - "loss": 11.353687286376953, - "text_loss": 2.2218563556671143, - "flow_loss": 4.565915584564209 + "loss": 3.6174087524414062, + "text_loss": 2.0811572074890137, + "flow_loss": 0.7681257128715515, + "rtc_delay": 11, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 160, - "loss": 14.110220909118652, - "text_loss": 2.3123977184295654, - "flow_loss": 5.898911476135254 + "loss": 4.300071716308594, + "text_loss": 1.9097824096679688, + "flow_loss": 1.1951446533203125, + "rtc_delay": 8, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 180, - "loss": 19.999370574951172, - "text_loss": 2.749119997024536, - "flow_loss": 8.62512493133545 + "loss": 8.075389862060547, + "text_loss": 1.6174044609069824, + "flow_loss": 3.2289929389953613, + "rtc_delay": 2, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 200, - "loss": 8.102465629577637, - "text_loss": 1.631801962852478, - "flow_loss": 3.2353317737579346 + "loss": 5.758746147155762, + "text_loss": 1.5621910095214844, + "flow_loss": 2.0982775688171387, + "rtc_delay": 11, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 220, - "loss": 21.903854370117188, - "text_loss": 1.6063504219055176, - "flow_loss": 10.148752212524414 + "loss": 2.9783213138580322, + "text_loss": 1.389180302619934, + "flow_loss": 0.7945705056190491, + "rtc_delay": 11, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 240, - "loss": 10.197904586791992, - "text_loss": 1.5640149116516113, - "flow_loss": 4.3169450759887695 + "loss": 5.832153797149658, + "text_loss": 1.4576387405395508, + "flow_loss": 2.1872575283050537, + "rtc_delay": 0, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 260, - "loss": 6.899936676025391, - "text_loss": 1.3081820011138916, - "flow_loss": 2.795877456665039 + "loss": 3.4007065296173096, + "text_loss": 0.8826411366462708, + "flow_loss": 1.2590327262878418, + "rtc_delay": 5, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 280, - "loss": 10.051774978637695, - "text_loss": 1.2130903005599976, - "flow_loss": 4.419342517852783 + "loss": 4.018008232116699, + "text_loss": 0.9588160514831543, + "flow_loss": 1.529596209526062, + "rtc_delay": 11, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 300, - "loss": 7.963553428649902, - "text_loss": 1.1586928367614746, - "flow_loss": 3.402430295944214 + "loss": 1.492077112197876, + "text_loss": 0.9946327209472656, + "flow_loss": 0.24872222542762756, + "rtc_delay": 9, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 320, - "loss": 5.177718639373779, - "text_loss": 1.2673476934432983, - "flow_loss": 1.9551855325698853 + "loss": 5.338322639465332, + "text_loss": 0.8486652970314026, + "flow_loss": 2.244828701019287, + "rtc_delay": 8, + "use_goal": true, + "use_history": true, + "include_subtask": false }, { "stage": "policy", "step": 340, - "loss": 4.487771034240723, - "text_loss": 1.0361082553863525, - "flow_loss": 1.7258312702178955 + "loss": 2.0994033813476562, + "text_loss": 0.8355546593666077, + "flow_loss": 0.6319243907928467, + "rtc_delay": 7, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 360, - "loss": 4.356203556060791, - "text_loss": 1.3223515748977661, - "flow_loss": 1.5169259309768677 + "loss": 2.2518701553344727, + "text_loss": 0.5455462336540222, + "flow_loss": 0.8531619906425476, + "rtc_delay": 10, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 380, - "loss": 5.289548397064209, - "text_loss": 1.4994667768478394, - "flow_loss": 1.89504075050354 + "loss": 7.911384105682373, + "text_loss": 0.6893162727355957, + "flow_loss": 3.6110339164733887, + "rtc_delay": 7, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 400, - "loss": 8.761286735534668, - "text_loss": 1.4391229152679443, - "flow_loss": 3.6610820293426514 + "loss": 2.3619725704193115, + "text_loss": 0.5672968626022339, + "flow_loss": 0.8973378539085388, + "rtc_delay": 10, + "use_goal": true, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 420, - "loss": 2.400188446044922, - "text_loss": 1.0106937885284424, - "flow_loss": 0.694747269153595 + "loss": 1.233857274055481, + "text_loss": 0.661384642124176, + "flow_loss": 0.28623631596565247, + "rtc_delay": 12, + "use_goal": true, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 440, - "loss": 9.683706283569336, - "text_loss": 1.044368863105774, - "flow_loss": 4.319668769836426 + "loss": 3.295243740081787, + "text_loss": 0.4776339828968048, + "flow_loss": 1.4088048934936523, + "rtc_delay": 9, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 460, - "loss": 10.443679809570312, - "text_loss": 0.7045990228652954, - "flow_loss": 4.869540214538574 + "loss": 1.7052180767059326, + "text_loss": 0.5183412432670593, + "flow_loss": 0.5934383869171143, + "rtc_delay": 8, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 480, - "loss": 6.514384746551514, - "text_loss": 1.185524582862854, - "flow_loss": 2.6644301414489746 + "loss": 8.46796703338623, + "text_loss": 0.6230667233467102, + "flow_loss": 3.922450065612793, + "rtc_delay": 0, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 500, - "loss": 2.255455255508423, - "text_loss": 1.0136079788208008, - "flow_loss": 0.620923638343811 + "loss": 2.5979185104370117, + "text_loss": 0.27633967995643616, + "flow_loss": 1.1607893705368042, + "rtc_delay": 1, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 520, - "loss": 4.1700439453125, - "text_loss": 1.1829472780227661, - "flow_loss": 1.4935483932495117 + "loss": 2.012068510055542, + "text_loss": 0.30755916237831116, + "flow_loss": 0.8522546291351318, + "rtc_delay": 1, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 540, - "loss": 6.956455230712891, - "text_loss": 1.1096038818359375, - "flow_loss": 2.9234256744384766 + "loss": 5.146071910858154, + "text_loss": 0.4677533805370331, + "flow_loss": 2.3391592502593994, + "rtc_delay": 0, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 560, - "loss": 4.5965800285339355, - "text_loss": 1.5257400274276733, - "flow_loss": 1.5354200601577759 + "loss": 1.9480068683624268, + "text_loss": 0.9942646026611328, + "flow_loss": 0.476871132850647, + "rtc_delay": 7, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 580, - "loss": 1.7948781251907349, - "text_loss": 0.835124135017395, - "flow_loss": 0.4798769950866699 + "loss": 7.889751434326172, + "text_loss": 0.6651982665061951, + "flow_loss": 3.612276554107666, + "rtc_delay": 3, + "use_goal": true, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 600, - "loss": 11.411609649658203, - "text_loss": 0.7508105635643005, - "flow_loss": 5.330399513244629 + "loss": 1.454559087753296, + "text_loss": 0.5516519546508789, + "flow_loss": 0.4514535963535309, + "rtc_delay": 11, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 620, - "loss": 14.173189163208008, - "text_loss": 0.553065836429596, - "flow_loss": 6.810061454772949 + "loss": 4.760444641113281, + "text_loss": 0.3332846760749817, + "flow_loss": 2.2135798931121826, + "rtc_delay": 7, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 640, - "loss": 2.423476457595825, - "text_loss": 0.6566628813743591, - "flow_loss": 0.8834067583084106 + "loss": 6.838594913482666, + "text_loss": 0.33531704545021057, + "flow_loss": 3.251638889312744, + "rtc_delay": 3, + "use_goal": true, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 660, - "loss": 7.33753776550293, - "text_loss": 0.5569484829902649, - "flow_loss": 3.3902945518493652 + "loss": 4.01173210144043, + "text_loss": 0.842496395111084, + "flow_loss": 1.5846179723739624, + "rtc_delay": 1, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 680, - "loss": 7.2152018547058105, - "text_loss": 0.6606324911117554, - "flow_loss": 3.277284622192383 + "loss": 5.610707759857178, + "text_loss": 0.45004716515541077, + "flow_loss": 2.5803303718566895, + "rtc_delay": 6, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 700, - "loss": 2.5858616828918457, - "text_loss": 0.471678227186203, - "flow_loss": 1.0570917129516602 + "loss": 2.415992021560669, + "text_loss": 0.2757202684879303, + "flow_loss": 1.0701358318328857, + "rtc_delay": 3, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 720, - "loss": 5.87769889831543, - "text_loss": 0.5711548924446106, - "flow_loss": 2.6532719135284424 + "loss": 3.6413190364837646, + "text_loss": 0.15377745032310486, + "flow_loss": 1.7437708377838135, + "rtc_delay": 2, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 740, - "loss": 6.787323951721191, - "text_loss": 0.5064371228218079, - "flow_loss": 3.1404433250427246 + "loss": 2.4192750453948975, + "text_loss": 0.7513293027877808, + "flow_loss": 0.8339728713035583, + "rtc_delay": 4, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 760, - "loss": 11.166234970092773, - "text_loss": 0.5802748203277588, - "flow_loss": 5.292980194091797 + "loss": 1.3346192836761475, + "text_loss": 0.2767994999885559, + "flow_loss": 0.5289098620414734, + "rtc_delay": 10, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 780, - "loss": 3.563460350036621, - "text_loss": 0.6946841478347778, - "flow_loss": 1.4343880414962769 + "loss": 2.4135358333587646, + "text_loss": 0.16017527878284454, + "flow_loss": 1.1266802549362183, + "rtc_delay": 3, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 800, - "loss": 3.2471487522125244, - "text_loss": 0.44556593894958496, - "flow_loss": 1.4007914066314697 + "loss": 2.966399908065796, + "text_loss": 0.2566848397254944, + "flow_loss": 1.3548575639724731, + "rtc_delay": 3, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 820, - "loss": 3.1103086471557617, - "text_loss": 0.7132699489593506, - "flow_loss": 1.1985193490982056 + "loss": 1.8670570850372314, + "text_loss": 0.23726917803287506, + "flow_loss": 0.8148939609527588, + "rtc_delay": 4, + "use_goal": false, + "use_history": true, + "include_subtask": true }, { "stage": "policy", "step": 840, - "loss": 4.753307342529297, - "text_loss": 0.48397523164749146, - "flow_loss": 2.1346659660339355 + "loss": 1.6185007095336914, + "text_loss": 0.27975988388061523, + "flow_loss": 0.6693704128265381, + "rtc_delay": 5, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 860, - "loss": 3.5492496490478516, - "text_loss": 0.366057813167572, - "flow_loss": 1.5915958881378174 + "loss": 0.9501249194145203, + "text_loss": 0.4190976619720459, + "flow_loss": 0.2655136287212372, + "rtc_delay": 7, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 880, - "loss": 4.0379414558410645, - "text_loss": 0.6511648893356323, - "flow_loss": 1.6933883428573608 + "loss": 1.5665624141693115, + "text_loss": 0.317945659160614, + "flow_loss": 0.6243083477020264, + "rtc_delay": 5, + "use_goal": false, + "use_history": false, + "include_subtask": true }, { "stage": "policy", "step": 900, - "loss": 1.7170453071594238, - "text_loss": 0.2673894464969635, - "flow_loss": 0.7248279452323914 + "loss": 1.8227444887161255, + "text_loss": 0.32235953211784363, + "flow_loss": 0.7501924633979797, + "rtc_delay": 8, + "use_goal": false, + "use_history": true, + "include_subtask": true } ] \ No newline at end of file diff --git a/src/pi07mini/context.py b/src/pi07mini/context.py index 2e05286..3e19a84 100644 --- a/src/pi07mini/context.py +++ b/src/pi07mini/context.py @@ -21,7 +21,6 @@ class PolicyMetadata: speed_steps: int = 1_000 quality_score: int = 3 control_mode: str = "ee" - source_type: str = "autonomous" def __post_init__(self) -> None: if self.speed_steps <= 0: @@ -47,7 +46,6 @@ class PolicyMetadata: "quality": self.quality_score, "mistake": self.mistake != "none", "control_mode": self.control_mode, - "source_type": self.source_type, } @@ -106,36 +104,34 @@ def format_policy_prompt(components: Mapping[str, str]) -> str: return "\n".join(pieces) -def endpoint_subgoal_heatmap( - endpoint_xy: torch.Tensor, - *, - size: int = 32, - sigma: float = 1.5, - xy_extent: tuple[float, float, float, float] = (-8.0, 64.0, -16.0, 16.0), +def future_observation_proxy( + image: torch.Tensor, + history_xy: torch.Tensor, + future_xy: torch.Tensor, ) -> torch.Tensor: - """Render a normalized Gaussian subgoal heatmap from one endpoint only. + """Create a tiny future-camera proxy instead of encoding coordinates as a heatmap. - It deliberately accepts no trajectory tensor. This API makes it difficult - to accidentally leak the entire ground-truth action chunk into the visual - subgoal condition. + The source dataset contains only the current frame. For the architecture + validation we therefore warp that frame according to the segment endpoint, + producing an image-space target with the same contract as ``o_tend`` in the + paper. The policy only receives the generated image, never the coordinates. """ - endpoint = torch.as_tensor(endpoint_xy, dtype=torch.float32).reshape(2) - if size < 2 or sigma <= 0.0: - raise ValueError("size must be >=2 and sigma must be positive") - x_min, x_max, y_min, y_max = xy_extent - if not x_min < x_max or not y_min < y_max: - raise ValueError("xy_extent must contain increasing bounds") - px = (endpoint[0] - x_min) / (x_max - x_min) * (size - 1) - py = (y_max - endpoint[1]) / (y_max - y_min) * (size - 1) - yy, xx = torch.meshgrid( - torch.arange(size, dtype=torch.float32), - torch.arange(size, dtype=torch.float32), - indexing="ij", - ) - heatmap = torch.exp(-((xx - px) ** 2 + (yy - py) ** 2) / (2.0 * sigma**2)) - heatmap = heatmap / heatmap.amax().clamp_min(torch.finfo(heatmap.dtype).eps) - return heatmap.unsqueeze(0) + image = torch.as_tensor(image, dtype=torch.float32) + history = torch.as_tensor(history_xy, dtype=torch.float32) + future = torch.as_tensor(future_xy, dtype=torch.float32) + if image.ndim != 3 or image.shape[0] not in {1, 3}: + raise ValueError("image must have shape [C,H,W]") + if history.ndim != 2 or future.ndim != 2 or history.shape[-1] != 2 or future.shape[-1] != 2: + raise ValueError("history_xy and future_xy must have shape [T,2]") + displacement = future[-1] - history[-1] + scale = max(image.shape[-2:]) / 32.0 + dx = int(torch.round(displacement[1] * scale).clamp(-image.shape[-1] // 5, image.shape[-1] // 5)) + dy = int(torch.round(-displacement[0] * scale * 0.08).clamp(-image.shape[-2] // 6, image.shape[-2] // 6)) + distance = torch.linalg.vector_norm(displacement) + exposure = float((1.0 + 0.02 * torch.tanh(distance / 8.0)).item()) + shifted = torch.roll(image, shifts=(dy, dx), dims=(-2, -1)) * exposure + return F.avg_pool2d(shifted[None], kernel_size=3, stride=1, padding=1)[0].clamp(0.0, 1.0) def make_history_proxy_frames( diff --git a/src/pi07mini/data.py b/src/pi07mini/data.py index 877ac25..0bf18e9 100644 --- a/src/pi07mini/data.py +++ b/src/pi07mini/data.py @@ -16,12 +16,12 @@ from .context import ( PolicyMetadata, build_ambiguous_history_pair, drop_prompt_components, - endpoint_subgoal_heatmap, format_policy_prompt, + future_observation_proxy, make_history_proxy_frames, prompt_components, ) -from .rtc import MAX_RTC_DELAY_STEPS, align_actions_for_rtc, sample_rtc_delay +from .rtc import MAX_RTC_DELAY_STEPS, build_rtc_conditioning, sample_rtc_delay DEFAULT_SOURCE_MANIFEST = ( @@ -232,7 +232,7 @@ def build_policy_trajectories( history, expert, PolicyMetadata( - "normal", "expert", "none", "human", 1_000, 5, "ee", "demonstration" + "normal", "expert", "none", "human", 1_000, 5, "ee" ), ), PolicyTrajectory( @@ -240,7 +240,7 @@ def build_policy_trajectories( history, fast, PolicyMetadata( - "fast", "good", "none", "autonomous", 500, 4, "ee", "autonomous" + "fast", "good", "none", "autonomous", 500, 4, "ee" ), ), PolicyTrajectory( @@ -248,7 +248,7 @@ def build_policy_trajectories( history, slow, PolicyMetadata( - "slow", "good", "none", "autonomous", 2_000, 4, "ee", "autonomous" + "slow", "good", "none", "autonomous", 2_000, 4, "ee" ), ), PolicyTrajectory( @@ -256,7 +256,7 @@ def build_policy_trajectories( history, understeer, PolicyMetadata( - "normal", "poor", "understeer", "autonomous", 1_000, 1, "ee", "autonomous" + "normal", "poor", "understeer", "autonomous", 1_000, 1, "ee" ), ), PolicyTrajectory( @@ -264,7 +264,7 @@ def build_policy_trajectories( history, stopped, PolicyMetadata( - "slow", "poor", "stop", "autonomous", 2_000, 1, "ee", "autonomous" + "slow", "poor", "stop", "autonomous", 2_000, 1, "ee" ), ), ] @@ -367,11 +367,11 @@ class Pi07SteerableDataset(Dataset[dict[str, Any]]): max_delay_steps=self.max_rtc_delay_steps, action_horizon=self.action_horizon, ) - rtc = align_actions_for_rtc( + rtc = build_rtc_conditioning( actions, delay, max_delay_steps=self.max_rtc_delay_steps ) - subgoal = endpoint_subgoal_heatmap( - policy.future_xy[-1], size=self.image_size, sigma=max(1.0, self.image_size / 24.0) + future_observation = future_observation_proxy( + image, policy.history_xy, policy.future_xy ) history_pair = build_ambiguous_history_pair( policy.history_xy, frames=self.history_frames @@ -402,17 +402,17 @@ class Pi07SteerableDataset(Dataset[dict[str, Any]]): "quality_score": policy.metadata.quality_score, "has_mistake": policy.metadata.mistake != "none", "control_mode": policy.metadata.control_mode, - "source_type": policy.metadata.source_type, "prompt_components": visible_components, "prompt_component_mask": component_mask, "prompt_text": format_policy_prompt(visible_components), "subgoal_xy": policy.future_xy[-1].clone(), - "subgoal_heatmap": subgoal, - "subgoal_pixel_values": subgoal.expand(3, -1, -1).clone(), + "future_observation": future_observation, + "subgoal_pixel_values": future_observation.clone(), "rtc_delay_steps": delay, - "rtc_target_actions": rtc.delayed_target_actions, - "rtc_valid_mask": rtc.valid_mask, - "rtc_executed_prefix_actions": rtc.executed_prefix_actions, + "rtc_action_prefix": rtc.action_prefix, + "rtc_prefix_mask": rtc.prefix_mask, + "rtc_postfix_mask": rtc.postfix_mask, + "past_subtasks": ("keep_lane",), "reasoning": self.records[record_index].reasoning, "sample_id": f"{self.records[record_index].sample_id}:{policy.kind}:aug{variant}", } diff --git a/src/pi07mini/flow.py b/src/pi07mini/flow.py index eb93db6..4325aa1 100644 --- a/src/pi07mini/flow.py +++ b/src/pi07mini/flow.py @@ -1,18 +1,101 @@ from __future__ import annotations + from collections.abc import Callable + import torch from torch import Tensor class FlowMatching: + """Rectified flow with optional paper-faithful training-time RTC.""" + def __init__(self, inference_steps: int = 5, cutoff: float = 0.999) -> None: - self.inference_steps=inference_steps; self.cutoff=cutoff - def training_batch(self,target:Tensor)->tuple[Tensor,Tensor,Tensor]: - u=torch.rand(target.shape[0],device=target.device,dtype=target.dtype) - t=self.cutoff*(1-u.pow(1/1.5));noise=torch.randn_like(target) - return t[:,None,None]*target+(1-t[:,None,None])*noise,t,target-noise + self.inference_steps = int(inference_steps) + self.cutoff = float(cutoff) + + def training_batch( + self, + target: Tensor, + *, + delays: Tensor | None = None, + generator: torch.Generator | None = None, + ) -> tuple[Tensor, Tensor, Tensor, Tensor]: + batch, horizon = target.shape[:2] + uniform = torch.rand( + batch, device=target.device, dtype=target.dtype, generator=generator + ) + base_time = self.cutoff * (1.0 - uniform.pow(1.0 / 1.5)) + noise = torch.randn( + target.shape, + device=target.device, + dtype=target.dtype, + generator=generator, + ) + + if delays is None: + times = base_time + expanded = times[:, None, None] + loss_mask = torch.ones( + batch, horizon, dtype=torch.bool, device=target.device + ) + else: + delays = torch.as_tensor(delays, dtype=torch.long, device=target.device) + if delays.shape != (batch,): + raise ValueError("delays must have shape [batch]") + if torch.any(delays < 0) or torch.any(delays >= horizon): + raise ValueError("each RTC delay must lie in [0, horizon)") + prefix_mask = torch.arange(horizon, device=target.device)[None] < delays[:, None] + times = torch.where(prefix_mask, torch.ones_like(base_time[:, None]), base_time[:, None]) + expanded = times[:, :, None] + loss_mask = ~prefix_mask + + noisy = expanded * target + (1.0 - expanded) * noise + target_velocity = target - noise + return noisy, times, target_velocity, loss_mask + + @staticmethod + def masked_loss(prediction: Tensor, target: Tensor, mask: Tensor) -> Tensor: + if mask.shape != prediction.shape[:2]: + raise ValueError("flow loss mask must have shape [batch, horizon]") + per_token = (prediction.float() - target.float()).square().mean(dim=-1) + weights = mask.to(per_token.dtype) + return (per_token * weights).sum() / weights.sum().clamp_min(1.0) + @torch.no_grad() - def sample(self,fn:Callable[[Tensor,Tensor],Tensor],shape:tuple[int,...],device,steps:int|None=None)->Tensor: - count=steps or self.inference_steps;x=torch.randn(shape,device=device);grid=torch.linspace(0,1,count+1,device=device) - for i in range(count): x=x+(grid[i+1]-grid[i])*fn(x,grid[i].expand(shape[0])) + def sample( + self, + model_fn: Callable[[Tensor, Tensor], Tensor], + shape: tuple[int, ...], + device: torch.device | str, + steps: int | None = None, + *, + action_prefix: Tensor | None = None, + delays: Tensor | None = None, + generator: torch.Generator | None = None, + ) -> Tensor: + count = steps or self.inference_steps + x = torch.randn(shape, device=device, generator=generator) + prefix_mask = None + if action_prefix is not None or delays is not None: + if action_prefix is None or delays is None: + raise ValueError("action_prefix and delays must be supplied together") + action_prefix = torch.as_tensor(action_prefix, dtype=x.dtype, device=x.device) + delays = torch.as_tensor(delays, dtype=torch.long, device=x.device) + if action_prefix.shape != x.shape or delays.shape != (shape[0],): + raise ValueError("RTC action prefix or delay has the wrong shape") + prefix_mask = torch.arange(shape[1], device=x.device)[None] < delays[:, None] + + grid = torch.linspace(0.0, 1.0, count + 1, device=device) + for index in range(count): + timestep = grid[index].expand(shape[0]) + if prefix_mask is not None: + x = torch.where(prefix_mask[:, :, None], action_prefix, x) + timestep = torch.where( + prefix_mask, + torch.ones_like(timestep[:, None]), + timestep[:, None], + ) + x = x + (grid[index + 1] - grid[index]) * model_fn(x, timestep) + if prefix_mask is not None: + x = torch.where(prefix_mask[:, :, None], action_prefix, x) return x diff --git a/src/pi07mini/infer.py b/src/pi07mini/infer.py index eaf9079..0ac9565 100644 --- a/src/pi07mini/infer.py +++ b/src/pi07mini/infer.py @@ -1,40 +1,258 @@ from __future__ import annotations + import argparse from pathlib import Path + import matplotlib.pyplot as plt -import numpy as np,torch +import numpy as np +import torch + from .data import Pi07SteerableDataset from .flow import FlowMatching -from .model import Pi07Config,Pi07Mini,HighLevelPolicy,TinyGoalGenerator -from .runtime import load_config,choose_device,write_json -from .tokenizer import MiniTokenizer,EpisodeMetadata +from .model import HighLevelPolicy, Pi07Config, Pi07Mini, TinyGoalGenerator +from .rtc import build_rtc_conditioning +from .runtime import choose_device, write_json +from .tokenizer import EpisodeMetadata, MiniTokenizer + @torch.no_grad() -def evaluate(checkpoint_path): - ck=torch.load(checkpoint_path,map_location='cpu',weights_only=False);cfg=ck['config'];root=Path(__file__).resolve().parents[2];dev=choose_device(cfg['device']);tok=MiniTokenizer();ds=Pi07SteerableDataset(root/'data/overfit/overfit_manifest.jsonl',image_size=cfg['data']['image_size'],history_frames=cfg['data']['history_frames'],action_horizon=cfg['data']['action_horizon'],action_statistics=ck['action_statistics']) - pcfg=Pi07Config(**ck['policy_config']);policy=Pi07Mini(pcfg);policy.load_state_dict(ck['policy']);policy.to(dev).eval();high=HighLevelPolicy(pcfg);high.load_state_dict(ck['high_level']);high.to(dev).eval();goal=TinyGoalGenerator(tok.vocab_size);goal.load_state_dict(ck['goal']);goal.to(dev).eval();flow=FlowMatching(cfg['flow']['integration_steps']);s=next(ds[i] for i in range(len(ds)) if ds[i]['policy_kind']=='expert');meta=EpisodeMetadata(**s['token_metadata']);image=s['image'][None].to(dev) - prompt,_=tok.encode_prompt('drive safely',None,meta,include_subtask=False);hl=high(image,prompt[None].to(dev),s['history_images'][None].to(dev),s['history_states'][None].to(dev),s['current_state'][None].to(dev));pred_subtask=tok.subtasks.decode(int(hl.logits.argmax(-1).cpu())) - full=tok.build_policy_sequence('drive safely',s['reasoning'],s['actions'],meta);ids=full.input_ids[:full.action_start_index][None].to(dev) - torch.manual_seed(cfg['seed']);g=torch.randn_like(s['subgoal_pixel_values'][None]).to(dev);grid=torch.linspace(0,1,6,device=dev) - for i in range(5): g=g+(grid[i+1]-grid[i])*goal(image,ids,g,grid[i].expand(1)).vector_field - generated_goal=g.cpu()[0] - def sample(name,include_meta=True,use_goal=True,use_history=True,cfg_beta=None,generated=False): - seq=tok.build_policy_sequence('drive safely',s['reasoning'],s['actions'],meta,include_episode_metadata=include_meta);xids=seq.input_ids[:seq.action_start_index][None].to(dev) - goal_pixels=(generated_goal if generated else s['subgoal_pixel_values'])[None].to(dev) if use_goal else None - common=dict(pixel_values=image,history_pixel_values=s['history_images'][None].to(dev) if use_history else None,history_states=s['history_states'][None].to(dev) if use_history else None,current_state=s['current_state'][None].to(dev),subgoal_pixel_values=goal_pixels) - def field(x,t): - if cfg_beta is None:return policy(input_ids=xids,noisy_actions=x,timesteps=t,**common).vector_field - un=tok.build_policy_sequence('drive safely',s['reasoning'],s['actions'],meta,include_episode_metadata=False);uids=un.input_ids[:un.action_start_index][None].to(dev) - return policy.metadata_cfg(xids,uids,guidance_scale=cfg_beta,noisy_actions=x,timesteps=t,**common) - torch.manual_seed(cfg['evaluation']['fixed_noise_seed']);a=flow.sample(field,(1,ds.action_horizon,2),dev,cfg['flow']['integration_steps'])[0].cpu();return ds.action_normalizer.decode(a,s['history_xy']).numpy() - curves={'full_oracle_goal':sample('full'),'generated_goal':sample('generated',generated=True),'no_metadata':sample('no_metadata',False),'no_goal':sample('no_goal',use_goal=False),'no_history':sample('no_history',use_history=False),'cfg_beta2':sample('cfg',cfg_beta=2.0)} - target=ds.action_normalizer.decode(s['rtc_target_actions'],s['history_xy']).numpy();valid=s['rtc_valid_mask'].numpy().astype(bool);metrics={k:float(np.mean((v[valid]-target[valid])**2)) for k,v in curves.items()} - out=Path(checkpoint_path).parent;fig,ax=plt.subplots(figsize=(9,6));ax.plot(target[:,0],target[:,1],'o-',label='expert target',linewidth=2) - for k,v in curves.items():ax.plot(v[:,0],v[:,1],'x--',label=f'{k} ({metrics[k]:.3f})') - ax.axis('equal');ax.grid(True,alpha=.3);ax.legend(fontsize=8);ax.set_xlabel('forward x (m)');ax.set_ylabel('left y (m)');ax.set_title('π0.7 context steering and ablations');fig.tight_layout();traj=out/'context_ablation.png';fig.savefig(traj,dpi=170);plt.close(fig) - fig,axes=plt.subplots(1,3,figsize=(10,3));axes[0].imshow(image[0].cpu().permute(1,2,0));axes[0].set_title('current observation');axes[1].imshow(s['subgoal_pixel_values'].permute(1,2,0));axes[1].set_title('endpoint goal target');axes[2].imshow(generated_goal.permute(1,2,0).clamp(0,1));axes[2].set_title('generated goal'); - for a in axes:a.axis('off') - fig.tight_layout();goalpath=out/'goal_generation.png';fig.savefig(goalpath,dpi=170);plt.close(fig);write_json(out/'evaluation.json',{'predicted_subtask':pred_subtask,'trajectory_metrics':metrics});print({'predicted_subtask':pred_subtask,'trajectory_metrics':metrics});return traj,goalpath -def main(): - p=argparse.ArgumentParser();p.add_argument('--checkpoint',default='outputs/overfit/checkpoint.pt');evaluate(p.parse_args().checkpoint) -if __name__=='__main__':main() +def evaluate(checkpoint_path: str) -> tuple[Path, Path]: + checkpoint = torch.load(checkpoint_path, map_location="cpu", weights_only=False) + cfg = checkpoint["config"] + root = Path(__file__).resolve().parents[2] + device = choose_device(cfg["device"]) + tokenizer = MiniTokenizer() + dataset = Pi07SteerableDataset( + root / "data/overfit/overfit_manifest.jsonl", + image_size=cfg["data"]["image_size"], + history_frames=cfg["data"]["history_frames"], + action_horizon=cfg["data"]["action_horizon"], + action_statistics=checkpoint["action_statistics"], + max_rtc_delay_steps=cfg["rtc"]["max_delay_steps"], + ) + policy_config = Pi07Config(**checkpoint["policy_config"]) + policy = Pi07Mini(policy_config) + policy.load_state_dict(checkpoint["policy"]) + policy.to(device).eval() + high_level = HighLevelPolicy(policy_config) + high_level.load_state_dict(checkpoint["high_level"]) + high_level.to(device).eval() + goal_generator = TinyGoalGenerator(tokenizer.vocab_size) + goal_generator.load_state_dict(checkpoint["goal"]) + goal_generator.to(device).eval() + flow = FlowMatching(cfg["flow"]["integration_steps"]) + + sample = next( + dataset[index] + for index in range(len(dataset)) + if dataset[index]["policy_kind"] == "expert" + ) + metadata = EpisodeMetadata(**sample["token_metadata"]) + image = sample["image"][None].to(device) + high_level_prompt = tokenizer.encode_high_level_prompt( + "drive safely", sample["past_subtasks"], metadata + ) + high_level_output = high_level( + image, + high_level_prompt[None].to(device), + sample["history_images"][None].to(device), + sample["history_states"][None].to(device), + sample["current_state"][None].to(device), + ) + predicted_subtask = tokenizer.subtasks.decode( + int(high_level_output.logits.argmax(-1).cpu()) + ) + + goal_prompt, _ = tokenizer.encode_prompt( + "drive safely", predicted_subtask, metadata + ) + goal_noise = torch.randn( + sample["future_observation"][None].shape, + generator=torch.Generator().manual_seed(cfg["evaluation"]["fixed_noise_seed"]), + ).to(device) + goal_grid = torch.linspace(0.0, 1.0, cfg["evaluation"]["goal_flow_steps"] + 1, device=device) + generated_goal = goal_noise + for index in range(cfg["evaluation"]["goal_flow_steps"]): + time = goal_grid[index].expand(1) + generated_goal = generated_goal + (goal_grid[index + 1] - goal_grid[index]) * goal_generator( + image, goal_prompt[None].to(device), generated_goal, time + ).vector_field + generated_goal_cpu = generated_goal[0].cpu().clamp(0.0, 1.0) + + def sample_policy( + *, + include_metadata: bool = True, + use_goal: bool = True, + use_history: bool = True, + guidance_beta: float | None = None, + rtc_delay: int = 0, + oracle_goal: bool = False, + ) -> tuple[np.ndarray, torch.Tensor]: + conditioned = tokenizer.build_policy_sequence( + "drive safely", + predicted_subtask, + sample["actions"], + metadata, + include_episode_metadata=include_metadata, + ) + conditioned_ids = conditioned.input_ids[: conditioned.action_start_index][None].to(device) + common = { + "pixel_values": image, + "history_pixel_values": sample["history_images"][None].to(device) + if use_history + else None, + "history_states": sample["history_states"][None].to(device) + if use_history + else None, + "current_state": sample["current_state"][None].to(device), + "subgoal_pixel_values": ( + sample["future_observation"][None].to(device) + if oracle_goal + else generated_goal + ) + if use_goal + else None, + } + + if guidance_beta is None: + def field(actions: torch.Tensor, times: torch.Tensor) -> torch.Tensor: + return policy( + input_ids=conditioned_ids, + noisy_actions=actions, + timesteps=times, + **common, + ).vector_field + else: + unconditional = tokenizer.build_policy_sequence( + "drive safely", + predicted_subtask, + sample["actions"], + metadata, + include_episode_metadata=False, + ) + unconditional_ids = unconditional.input_ids[ + : unconditional.action_start_index + ][None].to(device) + + def field(actions: torch.Tensor, times: torch.Tensor) -> torch.Tensor: + return policy.metadata_cfg( + conditioned_ids, + unconditional_ids, + guidance_scale=guidance_beta, + noisy_actions=actions, + timesteps=times, + **common, + ) + + rtc = build_rtc_conditioning( + sample["actions"], + rtc_delay, + max_delay_steps=cfg["rtc"]["max_delay_steps"], + ) + torch.manual_seed(cfg["evaluation"]["fixed_noise_seed"]) + normalized = flow.sample( + field, + (1, dataset.action_horizon, 2), + device, + cfg["flow"]["integration_steps"], + action_prefix=rtc.action_prefix[None].to(device), + delays=torch.tensor([rtc_delay], device=device), + )[0].cpu() + trajectory = dataset.action_normalizer.decode( + normalized, sample["history_xy"] + ).numpy() + return trajectory, normalized + + curves: dict[str, np.ndarray] = {} + normalized_predictions: dict[str, torch.Tensor] = {} + configurations = { + "full_generated_goal": {}, + "full_oracle_goal": {"oracle_goal": True}, + "no_metadata": {"include_metadata": False}, + "no_goal": {"use_goal": False}, + "no_history": {"use_history": False}, + "metadata_cfg": {"guidance_beta": cfg["steering"]["cfg_beta"]}, + } + for name, arguments in configurations.items(): + curves[name], normalized_predictions[name] = sample_policy(**arguments) + + target = sample["future_xy"].numpy() + target_actions = sample["actions"] + trajectory_metrics = { + name: float(np.mean((trajectory - target) ** 2)) + for name, trajectory in curves.items() + } + action_metrics = { + name: float(torch.mean((actions - target_actions) ** 2)) + for name, actions in normalized_predictions.items() + } + + rtc_metrics: dict[str, dict[str, float]] = {} + for delay in cfg["evaluation"]["compare_rtc_delays"]: + trajectory, actions = sample_policy(rtc_delay=delay) + postfix = torch.arange(dataset.action_horizon) >= delay + rtc_metrics[str(delay)] = { + "postfix_action_mse": float( + torch.mean((actions[postfix] - target_actions[postfix]) ** 2) + ), + "trajectory_mse": float(np.mean((trajectory - target) ** 2)), + } + + output_dir = Path(checkpoint_path).parent + figure, axis = plt.subplots(figsize=(10, 7)) + axis.plot(target[:, 0], target[:, 1], "o-", label="expert target", linewidth=2) + for name, trajectory in curves.items(): + axis.plot( + trajectory[:, 0], + trajectory[:, 1], + "x--", + label=f"{name} ({trajectory_metrics[name]:.3f})", + ) + axis.axis("equal") + axis.grid(True, alpha=0.3) + axis.legend(fontsize=8) + axis.set_xlabel("forward x (m)") + axis.set_ylabel("left y (m)") + axis.set_title("pi0.7 predicted-subtask context and RTC evaluation") + figure.tight_layout() + trajectory_path = output_dir / "context_ablation.png" + figure.savefig(trajectory_path, dpi=170) + plt.close(figure) + + figure, axes = plt.subplots(1, 3, figsize=(10, 3)) + axes[0].imshow(image[0].cpu().permute(1, 2, 0)) + axes[0].set_title("current observation") + axes[1].imshow(sample["future_observation"].permute(1, 2, 0)) + axes[1].set_title("future observation target") + axes[2].imshow(generated_goal_cpu.permute(1, 2, 0)) + axes[2].set_title("generated visual subgoal") + for axis in axes: + axis.axis("off") + figure.tight_layout() + goal_path = output_dir / "goal_generation.png" + figure.savefig(goal_path, dpi=170) + plt.close(figure) + + results = { + "target_subtask": tokenizer._classify_subtask(sample["reasoning"]), + "predicted_subtask": predicted_subtask, + "goal_image_mse": float( + torch.mean((generated_goal_cpu - sample["future_observation"]) ** 2) + ), + "trajectory_metrics": trajectory_metrics, + "normalized_action_metrics": action_metrics, + "rtc_metrics": rtc_metrics, + } + write_json(output_dir / "evaluation.json", results) + print(results) + return trajectory_path, goal_path + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--checkpoint", default="outputs/overfit/checkpoint.pt") + evaluate(parser.parse_args().checkpoint) + + +if __name__ == "__main__": + main() diff --git a/src/pi07mini/model.py b/src/pi07mini/model.py index 4c66a2a..347c7d7 100644 --- a/src/pi07mini/model.py +++ b/src/pi07mini/model.py @@ -72,20 +72,29 @@ class Pi07Config: @dataclass(frozen=True) class PrefixLayout: observation_tokens: int + prompt_tokens: int goal_tokens: int - text_tokens: int + fast_tokens: int @property - def goal_start(self) -> int: + def prompt_start(self) -> int: return self.observation_tokens @property - def text_start(self) -> int: - return self.observation_tokens + self.goal_tokens + def goal_start(self) -> int: + return self.prompt_start + self.prompt_tokens + + @property + def fast_start(self) -> int: + return self.goal_start + self.goal_tokens + + @property + def text_tokens(self) -> int: + return self.prompt_tokens + self.fast_tokens @property def total_tokens(self) -> int: - return self.text_start + self.text_tokens + return self.fast_start + self.fast_tokens @dataclass @@ -133,7 +142,15 @@ class AdaRMSNorm(nn.Module): def forward(self, x: Tensor, condition: Tensor) -> Tensor: shift, scale = self.modulation(condition).chunk(2, dim=-1) - return self.norm(x) * (1 + scale[:, None]) + shift[:, None] + if condition.ndim == 2: + shift = shift[:, None] + scale = scale[:, None] + elif condition.ndim == 3: + if shift.shape[:2] != x.shape[:2]: + raise ValueError("per-token timestep conditioning must match the action sequence") + else: + raise ValueError("condition must have shape [batch, dim] or [batch, tokens, dim]") + return self.norm(x) * (1 + scale) + shift class TimeEmbedding(nn.Module): @@ -146,6 +163,7 @@ class TimeEmbedding(nn.Module): ) def forward(self, timestep: Tensor) -> Tensor: + original_shape = timestep.shape timestep = timestep.reshape(-1).float() half = self.fourier_dim // 2 frequencies = torch.exp( @@ -158,7 +176,8 @@ class TimeEmbedding(nn.Module): ) ) angles = 2 * math.pi * timestep[:, None] * frequencies[None] - return self.mlp(torch.cat((angles.sin(), angles.cos()), dim=-1)) + embedded = self.mlp(torch.cat((angles.sin(), angles.cos()), dim=-1)) + return embedded.reshape(*original_shape, embedded.shape[-1]) class AttentionWeights(nn.Module): @@ -403,32 +422,47 @@ class Pi07Mini(nn.Module): raise ValueError("attention_mask must match input_ids") text_valid = attention_mask.bool() - layout = PrefixLayout(observation.shape[1], goal.shape[1], text.shape[1]) + action_start = input_ids.eq(self.config.action_start_token_id) + if action_start.any(): + first_action = action_start.long().argmax(dim=1) + if not torch.equal(first_action, first_action[:1].expand_as(first_action)): + raise ValueError("all batch items must place ACTION_START at the same position") + prompt_tokens = int(first_action[0]) + else: + prompt_tokens = input_ids.shape[1] + fast_tokens = input_ids.shape[1] - prompt_tokens + prompt = text[:, :prompt_tokens] + prompt_valid = text_valid[:, :prompt_tokens] + fast = text[:, prompt_tokens:] + fast_valid = text_valid[:, prompt_tokens:] + + layout = PrefixLayout( + observation_tokens=observation.shape[1], + prompt_tokens=prompt_tokens, + goal_tokens=goal.shape[1], + fast_tokens=fast_tokens, + ) if layout.total_tokens > self.config.max_prefix_tokens: raise ValueError("prefix exceeds configured maximum length") - prefix = torch.cat((observation, goal, text), dim=1) + # Official pi0.7 Figure 19 order: + # memory observations -> causal text prompt -> image-goal block -> FAST. + prefix = torch.cat((observation, prompt, goal, fast), dim=1) segments = torch.cat( ( torch.zeros(layout.observation_tokens, dtype=torch.long, device=prefix.device), - torch.ones(layout.goal_tokens, dtype=torch.long, device=prefix.device), - torch.full( - (layout.text_tokens,), 2, dtype=torch.long, device=prefix.device - ), + torch.ones(layout.prompt_tokens, dtype=torch.long, device=prefix.device), + torch.full((layout.goal_tokens,), 2, dtype=torch.long, device=prefix.device), + torch.ones(layout.fast_tokens, dtype=torch.long, device=prefix.device), ) ) prefix = prefix + self.segment_embedding(segments)[None] prefix = prefix + self.prefix_position[:, : layout.total_tokens] - valid = torch.cat((observation_valid, goal_valid, text_valid), dim=1) + valid = torch.cat((observation_valid, prompt_valid, goal_valid, fast_valid), dim=1) return prefix, valid, layout @staticmethod def build_prefix_attention_mask(layout: PrefixLayout, valid: Tensor) -> Tensor: - """Build obs -> goal -> causal-text block attention. - - Observation queries only read observations. Goal-image queries read - observations and all goal tokens bidirectionally. Text queries read - both visual blocks and earlier text tokens causally. - """ + """Build the paper's observation -> text -> image-goal -> FAST mask.""" length = layout.total_tokens if valid.shape[1] != length: @@ -436,13 +470,21 @@ class Pi07Mini(nn.Module): device = valid.device q = torch.arange(length, device=device)[:, None] k = torch.arange(length, device=device)[None] - obs = q < layout.goal_start - goal = (q >= layout.goal_start) & (q < layout.text_start) - text = q >= layout.text_start + obs = q < layout.prompt_start + prompt = (q >= layout.prompt_start) & (q < layout.goal_start) + goal = (q >= layout.goal_start) & (q < layout.fast_start) + fast = q >= layout.fast_start structural = ( - (obs & (k < layout.goal_start)) - | (goal & (k < layout.text_start)) - | (text & ((k < layout.text_start) | ((k >= layout.text_start) & (k <= q)))) + (obs & (k < layout.prompt_start)) + | ( + prompt + & ((k < layout.prompt_start) | ((k >= layout.prompt_start) & (k <= q))) + ) + | (goal & (k < layout.fast_start)) + | ( + fast + & ((k < layout.fast_start) | ((k >= layout.fast_start) & (k <= q))) + ) ) edges = structural[None] & valid[:, None] identity = torch.eye(length, dtype=torch.bool, device=device)[None] @@ -462,18 +504,12 @@ class Pi07Mini(nn.Module): batch = valid.shape[0] supplied = action_prefix_mask.bool() if supplied.shape == (batch, layout.text_tokens): - supplied = torch.cat( - ( - torch.ones( - batch, - layout.text_start, - dtype=torch.bool, - device=valid.device, - ), - supplied, - ), - dim=1, - ) + supplied = torch.cat(( + torch.ones(batch, layout.observation_tokens, dtype=torch.bool, device=valid.device), + supplied[:, : layout.prompt_tokens], + torch.ones(batch, layout.goal_tokens, dtype=torch.bool, device=valid.device), + supplied[:, layout.prompt_tokens :], + ), dim=1) if supplied.shape != valid.shape: raise ValueError("action_prefix_mask must cover text or the full prefix") readable = valid & supplied @@ -573,6 +609,11 @@ class Pi07Mini(nn.Module): horizon = noisy_actions.shape[1] action = self.action_projection(noisy_actions) action = action + self.action_position[:, :horizon] + if timesteps.ndim == 1: + if timesteps.shape != (noisy_actions.shape[0],): + raise ValueError("timesteps must have shape [batch] or [batch, horizon]") + elif timesteps.shape != noisy_actions.shape[:2]: + raise ValueError("per-action timesteps must have shape [batch, horizon]") condition = self.time_embedding(timesteps).to(action.dtype) if action_prefix_mask is None: action_prefix_mask = self._derive_action_prefix_mask(input_ids) @@ -587,7 +628,14 @@ class Pi07Mini(nn.Module): prefix_hidden = self.prefix_norm(prefix) action_hidden = self.action_norm(action, condition) - text_logits = self.text_head(prefix_hidden[:, layout.text_start :]) + text_hidden = torch.cat( + ( + prefix_hidden[:, layout.prompt_start : layout.goal_start], + prefix_hidden[:, layout.fast_start :], + ), + dim=1, + ) + text_logits = self.text_head(text_hidden) vector_field = self.vector_field_head(action_hidden) text_loss = None diff --git a/src/pi07mini/rtc.py b/src/pi07mini/rtc.py index f0297f0..f6e144e 100644 --- a/src/pi07mini/rtc.py +++ b/src/pi07mini/rtc.py @@ -9,27 +9,22 @@ MAX_RTC_DELAY_STEPS = 12 @dataclass(frozen=True) -class RTCAlignment: - """A fixed-width target aligned to an inference/control delay.""" +class RTCConditioning: + """Hard action-prefix conditioning used by training-time RTC.""" - delayed_target_actions: torch.Tensor - valid_mask: torch.Tensor - executed_prefix_actions: torch.Tensor + action_prefix: torch.Tensor + prefix_mask: torch.Tensor + postfix_mask: torch.Tensor delay_steps: int -def align_actions_for_rtc( +def build_rtc_conditioning( actions: torch.Tensor, delay_steps: int, *, max_delay_steps: int = MAX_RTC_DELAY_STEPS, -) -> RTCAlignment: - """Shift targets left so prediction step zero starts after control delay. - - For delay ``d``, target position ``i`` supervises original action ``i+d``. - Vacated tail positions are zero padded and excluded by ``valid_mask``. - The already-executed prefix is returned for optional action-prefix input. - """ +) -> RTCConditioning: + """Pad the committed action prefix to the full prediction horizon.""" actions = torch.as_tensor(actions, dtype=torch.float32) if actions.ndim < 2 or actions.shape[-2] < 1: @@ -39,13 +34,17 @@ def align_actions_for_rtc( horizon = actions.shape[-2] if delay_steps >= horizon: raise ValueError("delay_steps must be smaller than the action horizon") - aligned = torch.zeros_like(actions) - valid = torch.zeros(actions.shape[:-1], dtype=torch.bool, device=actions.device) - remaining = horizon - delay_steps - aligned[..., :remaining, :] = actions[..., delay_steps:, :] - valid[..., :remaining] = True - prefix = actions[..., :delay_steps, :].clone() - return RTCAlignment(aligned, valid, prefix, int(delay_steps)) + + prefix_mask = torch.arange(horizon, device=actions.device) < delay_steps + prefix_mask = prefix_mask.expand(actions.shape[:-2] + (horizon,)) + action_prefix = torch.zeros_like(actions) + action_prefix[..., :delay_steps, :] = actions[..., :delay_steps, :] + return RTCConditioning( + action_prefix=action_prefix, + prefix_mask=prefix_mask, + postfix_mask=~prefix_mask, + delay_steps=int(delay_steps), + ) def sample_rtc_delay( @@ -57,6 +56,4 @@ def sample_rtc_delay( if action_horizon < 1: raise ValueError("action_horizon must be positive") maximum = min(int(max_delay_steps), action_horizon - 1) - if maximum < 0: - raise ValueError("no valid delay for an empty action horizon") return int(torch.randint(maximum + 1, (), generator=generator).item()) diff --git a/src/pi07mini/runtime.py b/src/pi07mini/runtime.py index d88b554..56cecef 100644 --- a/src/pi07mini/runtime.py +++ b/src/pi07mini/runtime.py @@ -1,14 +1,39 @@ from __future__ import annotations -import json,random + +import json +import random from pathlib import Path -import numpy as np,torch,yaml -def load_config(path): - with Path(path).open() as f:return yaml.safe_load(f) -def seed_everything(seed:int):random.seed(seed);np.random.seed(seed);torch.manual_seed(seed) -def choose_device(name="auto"): - if name!="auto":return torch.device(name) - if torch.cuda.is_available():return torch.device("cuda") - if torch.backends.mps.is_available():return torch.device("mps") + +import numpy as np +import torch +import yaml + + +def load_config(path: str | Path) -> dict: + with Path(path).open(encoding="utf-8") as stream: + return yaml.safe_load(stream) + + +def seed_everything(seed: int) -> None: + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + + +def choose_device(name: str = "auto") -> torch.device: + if name != "auto": + return torch.device(name) + if torch.cuda.is_available(): + return torch.device("cuda") + if torch.backends.mps.is_available(): + return torch.device("mps") return torch.device("cpu") -def write_json(path,value): - p=Path(path);p.parent.mkdir(parents=True,exist_ok=True);p.write_text(json.dumps(value,indent=2,ensure_ascii=False)) + + +def write_json(path: str | Path, value: object) -> None: + output = Path(path) + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text( + json.dumps(value, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) diff --git a/src/pi07mini/tokenizer.py b/src/pi07mini/tokenizer.py index 47392f0..86badde 100644 --- a/src/pi07mini/tokenizer.py +++ b/src/pi07mini/tokenizer.py @@ -2,7 +2,7 @@ pi0.7 conditions the low-level policy on a richer prompt than earlier pi models: task and subtask language, episode speed/quality/mistake metadata, -control mode, and data provenance. This tokenizer represents those concepts +and control mode. This tokenizer represents those concepts with explicit marker/value pairs so the architecture can be validated without shipping a full language tokenizer. """ @@ -26,7 +26,6 @@ class EpisodeMetadata: quality: int | None = None mistake: bool | None = None control_mode: ControlMode = "joint" - source_type: str | None = None def __post_init__(self) -> None: if self.speed_steps is not None and self.speed_steps <= 0: @@ -84,7 +83,7 @@ class MiniTokenizer: QUALITY_MARKER = 260 MISTAKE_MARKER = 261 CONTROL_MARKER = 262 - SOURCE_MARKER = 263 + NEXT_SUBTASK_MARKER = 263 TASK_LABELS = ( "drive", @@ -123,18 +122,7 @@ class MiniTokenizer: CONTROL_JOINT = MISTAKE_TRUE + 1 CONTROL_EE = CONTROL_JOINT + 1 - SOURCE_LABELS = ( - "demonstration", - "autonomous", - "intervention", - "human_video", - "web", - "unknown", - ) - SOURCE_TOKEN_START = CONTROL_EE + 1 - SOURCE_TOKEN_END = SOURCE_TOKEN_START + len(SOURCE_LABELS) - 1 - - ACTION_START = SOURCE_TOKEN_END + 1 + ACTION_START = CONTROL_EE + 1 ACTION_END = ACTION_START + 1 ACTION_TOKEN_START = ACTION_END + 1 ACTION_BINS = 64 @@ -145,7 +133,6 @@ class MiniTokenizer: def __init__(self) -> None: self.tasks = _LabelVocabulary(self.TASK_LABELS, self.TASK_TOKEN_START) self.subtasks = _LabelVocabulary(self.SUBTASK_LABELS, self.SUBTASK_TOKEN_START) - self.sources = _LabelVocabulary(self.SOURCE_LABELS, self.SOURCE_TOKEN_START) @property def vocab_size(self) -> int: @@ -197,23 +184,6 @@ class MiniTokenizer: return "pick_place" return "unknown" - @staticmethod - def _classify_source(source: str) -> str: - if source in MiniTokenizer.SOURCE_LABELS: - return source - text = source.casefold() - if any(word in text for word in ("demo", "teleop")): - return "demonstration" - if any(word in text for word in ("autonomous", "rollout", "policy")): - return "autonomous" - if any(word in text for word in ("intervention", "correction")): - return "intervention" - if any(word in text for word in ("human", "ego", "video")): - return "human_video" - if any(word in text for word in ("web", "internet")): - return "web" - return "unknown" - def encode_prompt( self, task: str, @@ -257,14 +227,40 @@ class MiniTokenizer: self.MISTAKE_MARKER, self.MISTAKE_TRUE if metadata.mistake else self.MISTAKE_FALSE, ) - if metadata.source_type is not None: - source = self._classify_source(metadata.source_type) - add_metadata(self.SOURCE_MARKER, self.sources.encode(source)) - control = self.CONTROL_JOINT if metadata.control_mode == "joint" else self.CONTROL_EE ids.extend((self.CONTROL_MARKER, control)) return torch.tensor(ids, dtype=torch.long), tuple(metadata_indices) + def encode_high_level_prompt( + self, + task: str, + past_subtasks: Iterable[str], + metadata: EpisodeMetadata, + ) -> Tensor: + """Encode task, past semantic decisions, metadata, and a next-subtask query.""" + + prompt, _ = self.encode_prompt( + task, + subtask=None, + metadata=metadata, + include_subtask=False, + ) + control_pair = prompt[-2:] + body = prompt[:-2] + history: list[int] = [] + for subtask in past_subtasks: + history.extend( + (self.SUBTASK_MARKER, self.subtasks.encode(self._classify_subtask(subtask))) + ) + return torch.cat( + ( + body, + torch.tensor(history, dtype=torch.long), + control_pair, + torch.tensor([self.NEXT_SUBTASK_MARKER], dtype=torch.long), + ) + ) + @staticmethod def _orthonormal_dct_matrix( horizon: int, *, device: torch.device, dtype: torch.dtype @@ -390,4 +386,3 @@ class MiniTokenizer: include_episode_metadata=False, ) return conditioned, unconditional - diff --git a/src/pi07mini/train.py b/src/pi07mini/train.py index df6c8c3..6095f46 100644 --- a/src/pi07mini/train.py +++ b/src/pi07mini/train.py @@ -1,40 +1,275 @@ from __future__ import annotations -import argparse,copy,json + +import argparse +import json from pathlib import Path + import torch -from .data import Pi07SteerableDataset,materialize_subset + +from .data import Pi07SteerableDataset, materialize_subset from .flow import FlowMatching -from .model import Pi07Config,Pi07Mini,HighLevelPolicy,TinyGoalGenerator -from .runtime import load_config,seed_everything,choose_device,write_json -from .tokenizer import MiniTokenizer,EpisodeMetadata +from .model import HighLevelPolicy, Pi07Config, Pi07Mini, TinyGoalGenerator +from .rtc import sample_rtc_delay +from .runtime import choose_device, load_config, seed_everything, write_json +from .tokenizer import EpisodeMetadata, MiniTokenizer -def build_config(cfg,tok): - m=cfg['model'];return Pi07Config(vocab_size=tok.vocab_size,action_dim=2,state_dim=2,image_size=cfg['data']['image_size'],patch_size=m['patch_size'],d_model=m['d_model'],n_heads=m['n_heads'],n_layers=m['n_layers'],mlp_ratio=m['mlp_ratio'],max_history_frames=cfg['data']['history_frames'],max_text_tokens=m['max_text_tokens'],max_action_tokens=cfg['data']['action_horizon'],action_start_token_id=tok.ACTION_START) -def train(config_path): - cfg=load_config(config_path);root=Path(__file__).resolve().parents[2];seed_everything(cfg['seed']);dev=choose_device(cfg['device']) - manifest=materialize_subset(cfg['data']['source_manifest'],root/'data/overfit',max_samples=cfg['data']['max_samples']) - ds=Pi07SteerableDataset(manifest,image_size=cfg['data']['image_size'],history_frames=cfg['data']['history_frames'],action_horizon=cfg['data']['action_horizon'],augmentation_factor=cfg['data']['augmentation_factor']) - tok=MiniTokenizer();pcfg=build_config(cfg,tok);policy=Pi07Mini(pcfg).to(dev);high=HighLevelPolicy(pcfg).to(dev);goal=TinyGoalGenerator(tok.vocab_size).to(dev);flow=FlowMatching(cfg['flow']['integration_steps']);out=root/cfg['output_dir'];out.mkdir(parents=True,exist_ok=True);history=[] - # Goal generator - opt=torch.optim.AdamW(goal.parameters(),lr=cfg['train']['learning_rate']) - for step in range(1,cfg['train']['goal_steps']+1): - s=ds[(step-1)%len(ds)];meta=EpisodeMetadata(**s['token_metadata']);seq=tok.build_policy_sequence('drive safely',s['reasoning'],s['actions'],meta);ids=seq.input_ids[:seq.action_start_index][None].to(dev);target=s['subgoal_pixel_values'][None].to(dev);t=torch.rand(1,device=dev);noise=torch.randn_like(target);noisy=t[:,None,None,None]*target+(1-t[:,None,None,None])*noise;o=goal(s['image'][None].to(dev),ids,noisy,t,target_velocity=target-noise);opt.zero_grad();o.loss.backward();opt.step() - if step==1 or step%cfg['train']['log_every']==0:row={'stage':'goal','step':step,'loss':float(o.loss.detach().cpu())};history.append(row);print(json.dumps(row)) - # High-level semantic policy - opt=torch.optim.AdamW(high.parameters(),lr=cfg['train']['learning_rate']) - for step in range(1,cfg['train']['high_level_steps']+1): - s=ds[(step-1)%len(ds)];meta=EpisodeMetadata(**s['token_metadata']);prompt,_=tok.encode_prompt('drive safely',None,meta,include_subtask=False);target=torch.tensor([tok.subtasks.encode(tok._classify_subtask(s['reasoning']))],device=dev);o=high(s['image'][None].to(dev),prompt[None].to(dev),s['history_images'][None].to(dev),s['history_states'][None].to(dev),s['current_state'][None].to(dev),target_token=target);opt.zero_grad();o.loss.backward();opt.step() - if step==1 or step%cfg['train']['log_every']==0:row={'stage':'high_level','step':step,'loss':float(o.loss.detach().cpu())};history.append(row);print(json.dumps(row)) - # Full steerable policy, alternating prompt-dropout ablations and RTC targets. - opt=torch.optim.AdamW(policy.parameters(),lr=cfg['train']['learning_rate']) - for step in range(1,cfg['train']['policy_steps']+1): - s=ds[(step-1)%len(ds)];meta=EpisodeMetadata(**s['token_metadata']);include_meta=(step%4)!=0;seq=tok.build_policy_sequence('drive safely',s['reasoning'],s['actions'],meta,include_episode_metadata=include_meta);ids=seq.input_ids[None].to(dev);labels=seq.labels[None].to(dev);target=s['rtc_target_actions'][None].to(dev);noisy,t,vel=flow.training_batch(target);use_goal=(step%4)!=1;use_history=(step%5)!=1 - o=policy(s['image'][None].to(dev),ids,noisy,t,history_pixel_values=s['history_images'][None].to(dev) if use_history else None,history_states=s['history_states'][None].to(dev) if use_history else None,current_state=s['current_state'][None].to(dev),subgoal_pixel_values=s['subgoal_pixel_values'][None].to(dev) if use_goal else None,action_prefix_mask=seq.action_prefix_mask[None].to(dev),text_labels=labels) - valid=s['rtc_valid_mask'][None].to(dev)[:,:,None];flow_loss=((o.vector_field-vel).square()*valid).sum()/valid.sum().clamp_min(1);loss=o.text_loss+cfg['train']['flow_loss_weight']*flow_loss;opt.zero_grad();loss.backward();torch.nn.utils.clip_grad_norm_(policy.parameters(),cfg['train']['grad_clip_norm']);opt.step() - if step==1 or step%cfg['train']['log_every']==0:row={'stage':'policy','step':step,'loss':float(loss.detach().cpu()),'text_loss':float(o.text_loss.detach().cpu()),'flow_loss':float(flow_loss.detach().cpu())};history.append(row);print(json.dumps(row)) - ck={'policy':policy.state_dict(),'high_level':high.state_dict(),'goal':goal.state_dict(),'policy_config':pcfg.__dict__,'config':cfg,'action_statistics':ds.action_normalizer.as_dict()};torch.save(ck,out/'checkpoint.pt');write_json(out/'training_history.json',history);write_json(out/'summary.json',{'device':str(dev),'samples':len(ds),'policy_parameters':sum(p.numel() for p in policy.parameters()),'goal_parameters':sum(p.numel() for p in goal.parameters()),'high_level_parameters':sum(p.numel() for p in high.parameters())});return out/'checkpoint.pt' +def build_config(cfg: dict, tokenizer: MiniTokenizer) -> Pi07Config: + model = cfg["model"] + return Pi07Config( + vocab_size=tokenizer.vocab_size, + action_dim=2, + state_dim=2, + image_size=cfg["data"]["image_size"], + patch_size=model["patch_size"], + d_model=model["d_model"], + n_heads=model["n_heads"], + n_layers=model["n_layers"], + memory_layers=model.get("memory_layers", 2), + mlp_ratio=model["mlp_ratio"], + max_history_frames=cfg["data"]["history_frames"], + max_text_tokens=model["max_text_tokens"], + max_action_tokens=cfg["data"]["action_horizon"], + action_start_token_id=tokenizer.ACTION_START, + dropout=model["dropout"], + ) -def main(): - p=argparse.ArgumentParser();p.add_argument('--config',default='configs/overfit.yaml');train(p.parse_args().config) -if __name__=='__main__':main() + +def _metadata_with_paper_dropout( + metadata: EpisodeMetadata, + cfg: dict, + *, + generator: torch.Generator, +) -> EpisodeMetadata: + steering = cfg["steering"] + if torch.rand((), generator=generator) < steering["metadata_full_dropout"]: + return EpisodeMetadata(control_mode=metadata.control_mode) + + probability = steering["metadata_component_dropout"] + return EpisodeMetadata( + speed_steps=None + if torch.rand((), generator=generator) < probability + else metadata.speed_steps, + quality=None + if torch.rand((), generator=generator) < probability + else metadata.quality, + mistake=None + if torch.rand((), generator=generator) < probability + else metadata.mistake, + control_mode=metadata.control_mode, + ) + + +def train(config_path: str) -> Path: + cfg = load_config(config_path) + root = Path(__file__).resolve().parents[2] + seed_everything(cfg["seed"]) + device = choose_device(cfg["device"]) + generator = torch.Generator().manual_seed(cfg["seed"]) + + manifest = materialize_subset( + cfg["data"]["source_manifest"], + root / "data/overfit", + max_samples=cfg["data"]["max_samples"], + ) + dataset = Pi07SteerableDataset( + manifest, + image_size=cfg["data"]["image_size"], + history_frames=cfg["data"]["history_frames"], + action_horizon=cfg["data"]["action_horizon"], + augmentation_factor=cfg["data"]["augmentation_factor"], + max_rtc_delay_steps=cfg["rtc"]["max_delay_steps"], + ) + tokenizer = MiniTokenizer() + policy_config = build_config(cfg, tokenizer) + policy = Pi07Mini(policy_config).to(device) + high_level = HighLevelPolicy(policy_config).to(device) + goal_generator = TinyGoalGenerator(tokenizer.vocab_size).to(device) + flow = FlowMatching(cfg["flow"]["integration_steps"]) + output_dir = root / cfg["output_dir"] + output_dir.mkdir(parents=True, exist_ok=True) + history: list[dict] = [] + + # The paper trains the world model on segments with high-quality subtask labels. + goal_samples = [ + dataset[index] + for index in range(len(dataset)) + if dataset[index]["quality_score"] >= 4 + ] + optimizer = torch.optim.AdamW( + goal_generator.parameters(), lr=cfg["train"]["learning_rate"] + ) + goal_generator.train() + for step in range(1, cfg["train"]["goal_steps"] + 1): + sample = goal_samples[(step - 1) % len(goal_samples)] + metadata = EpisodeMetadata(**sample["token_metadata"]) + prompt, _ = tokenizer.encode_prompt( + "drive safely", sample["reasoning"], metadata + ) + target = sample["future_observation"][None].to(device) + time = torch.rand(1, device=device) + noise = torch.randn_like(target) + noisy = time[:, None, None, None] * target + (1 - time[:, None, None, None]) * noise + output = goal_generator( + sample["image"][None].to(device), + prompt[None].to(device), + noisy, + time, + target_velocity=target - noise, + ) + optimizer.zero_grad(set_to_none=True) + output.loss.backward() + optimizer.step() + if step == 1 or step % cfg["train"]["log_every"] == 0: + row = {"stage": "goal", "step": step, "loss": float(output.loss.detach().cpu())} + history.append(row) + print(json.dumps(row)) + + optimizer = torch.optim.AdamW( + high_level.parameters(), lr=cfg["train"]["learning_rate"] + ) + high_level.train() + for step in range(1, cfg["train"]["high_level_steps"] + 1): + sample = dataset[(step - 1) % len(dataset)] + metadata = EpisodeMetadata(**sample["token_metadata"]) + prompt = tokenizer.encode_high_level_prompt( + "drive safely", sample["past_subtasks"], metadata + ) + target = torch.tensor( + [tokenizer.subtasks.encode(tokenizer._classify_subtask(sample["reasoning"]))], + device=device, + ) + output = high_level( + sample["image"][None].to(device), + prompt[None].to(device), + sample["history_images"][None].to(device), + sample["history_states"][None].to(device), + sample["current_state"][None].to(device), + target_token=target, + ) + optimizer.zero_grad(set_to_none=True) + output.loss.backward() + optimizer.step() + if step == 1 or step % cfg["train"]["log_every"] == 0: + row = { + "stage": "high_level", + "step": step, + "loss": float(output.loss.detach().cpu()), + } + history.append(row) + print(json.dumps(row)) + + optimizer = torch.optim.AdamW( + policy.parameters(), + lr=cfg["train"]["learning_rate"], + weight_decay=cfg["train"]["weight_decay"], + ) + policy.train() + for step in range(1, cfg["train"]["policy_steps"] + 1): + sample = dataset[(step - 1) % len(dataset)] + metadata = _metadata_with_paper_dropout( + EpisodeMetadata(**sample["token_metadata"]), cfg, generator=generator + ) + use_goal = bool( + torch.rand((), generator=generator) < cfg["steering"]["subgoal_probability"] + ) + include_subtask = not ( + use_goal + and torch.rand((), generator=generator) + < cfg["steering"]["subtask_dropout_with_goal"] + ) + use_history = bool( + torch.rand((), generator=generator) >= cfg["memory"]["history_dropout"] + ) + sequence = tokenizer.build_policy_sequence( + "drive safely", + sample["reasoning"] if include_subtask else None, + sample["actions"], + metadata, + include_episode_metadata=True, + include_subtask=include_subtask, + ) + actions = sample["actions"][None].to(device) + delay = sample_rtc_delay( + generator=generator, + max_delay_steps=cfg["rtc"]["max_delay_steps"], + action_horizon=dataset.action_horizon, + ) + noisy, times, velocity, postfix_mask = flow.training_batch( + actions, delays=torch.tensor([delay], device=device) + ) + output = policy( + sample["image"][None].to(device), + sequence.input_ids[None].to(device), + noisy, + times, + history_pixel_values=sample["history_images"][None].to(device) + if use_history + else None, + history_states=sample["history_states"][None].to(device) + if use_history + else None, + current_state=sample["current_state"][None].to(device), + subgoal_pixel_values=sample["future_observation"][None].to(device) + if use_goal + else None, + action_prefix_mask=sequence.action_prefix_mask[None].to(device), + text_labels=sequence.labels[None].to(device), + ) + flow_loss = flow.masked_loss(output.vector_field, velocity, postfix_mask) + loss = output.text_loss + cfg["train"]["flow_loss_weight"] * flow_loss + optimizer.zero_grad(set_to_none=True) + loss.backward() + torch.nn.utils.clip_grad_norm_(policy.parameters(), cfg["train"]["grad_clip_norm"]) + optimizer.step() + if step == 1 or step % cfg["train"]["log_every"] == 0: + row = { + "stage": "policy", + "step": step, + "loss": float(loss.detach().cpu()), + "text_loss": float(output.text_loss.detach().cpu()), + "flow_loss": float(flow_loss.detach().cpu()), + "rtc_delay": delay, + "use_goal": use_goal, + "use_history": use_history, + "include_subtask": include_subtask, + } + history.append(row) + print(json.dumps(row)) + + checkpoint = { + "policy": policy.state_dict(), + "high_level": high_level.state_dict(), + "goal": goal_generator.state_dict(), + "policy_config": policy_config.__dict__, + "config": cfg, + "action_statistics": dataset.action_normalizer.as_dict(), + } + checkpoint_path = output_dir / "checkpoint.pt" + torch.save(checkpoint, checkpoint_path) + write_json(output_dir / "training_history.json", history) + write_json( + output_dir / "summary.json", + { + "device": str(device), + "samples": len(dataset), + "policy_parameters": sum(parameter.numel() for parameter in policy.parameters()), + "goal_parameters": sum( + parameter.numel() for parameter in goal_generator.parameters() + ), + "high_level_parameters": sum( + parameter.numel() for parameter in high_level.parameters() + ), + }, + ) + return checkpoint_path + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--config", default="configs/overfit.yaml") + train(parser.parse_args().config) + + +if __name__ == "__main__": + main() diff --git a/tests/test_context.py b/tests/test_context.py index 0951622..46a3be4 100644 --- a/tests/test_context.py +++ b/tests/test_context.py @@ -6,8 +6,8 @@ from pi07mini.context import ( PolicyMetadata, build_ambiguous_history_pair, drop_prompt_components, - endpoint_subgoal_heatmap, format_policy_prompt, + future_observation_proxy, make_history_proxy_frames, prompt_components, ) @@ -18,19 +18,13 @@ def _history() -> torch.Tensor: return torch.stack((x, 0.04 * x.square()), -1) -def test_subgoal_heatmap_depends_on_endpoint_only() -> None: - endpoint = torch.tensor([20.0, 4.0]) - first = endpoint_subgoal_heatmap(endpoint, size=24) - # Two future paths with radically different interiors produce exactly the - # same condition because only their shared endpoint is passed to the API. - path_a = torch.stack((torch.linspace(0.0, 20.0, 16), torch.linspace(0.0, 4.0, 16)), -1) - path_b = path_a.clone() - path_b[1:-1, 1] += 100.0 - second = endpoint_subgoal_heatmap(path_b[-1], size=24) - torch.testing.assert_close(first, second, atol=0.0, rtol=0.0) - assert first.shape == (1, 24, 24) - assert float(first.max()) == 1.0 - assert torch.isfinite(first).all() +def test_future_subgoal_has_image_contract_not_coordinate_heatmap() -> None: + image = torch.linspace(0.0, 1.0, 3 * 24 * 24).reshape(3, 24, 24) + future = torch.stack((torch.linspace(0.0, 20.0, 16), torch.linspace(0.0, 4.0, 16)), -1) + subgoal = future_observation_proxy(image, _history(), future) + assert subgoal.shape == image.shape + assert torch.isfinite(subgoal).all() + assert not torch.equal(subgoal, image) def test_history_proxy_is_oldest_to_newest_and_future_free() -> None: diff --git a/tests/test_data.py b/tests/test_data.py index f5a7c1c..bdc407c 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -76,7 +76,6 @@ def test_policy_variants_and_metadata() -> None: "quality": 5, "mistake": False, "control_mode": "ee", - "source_type": "demonstration", } assert torch.allclose(policies[-1].future_xy[-1], policies[-1].future_xy[4]) @@ -105,12 +104,13 @@ def test_dataset_contract_and_roundtrip(tmp_path: Path) -> None: assert item["history_states"].shape == (6, 2) assert item["current_state"].shape == (2,) assert item["actions"].shape == (16, 2) - assert item["subgoal_heatmap"].shape == (1, 32, 32) + assert item["future_observation"].shape == (3, 32, 32) assert item["subgoal_pixel_values"].shape == (3, 32, 32) assert item["ambiguous_history_pair"].shape == (2, 6, 2) assert 0 <= item["rtc_delay_steps"] <= 12 - assert item["rtc_target_actions"].shape == (16, 2) - assert item["rtc_valid_mask"].shape == (16,) + assert item["rtc_action_prefix"].shape == (16, 2) + assert item["rtc_prefix_mask"].shape == (16,) + assert item["rtc_postfix_mask"].shape == (16,) assert item["reasoning"] == "Steer left." assert item["prompt_component_mask"].all() assert item["token_metadata"]["quality"] == 5 @@ -131,4 +131,4 @@ def test_dataset_is_deterministic_per_index(tmp_path: Path) -> None: second = dataset[3] assert first["prompt_components"] == second["prompt_components"] assert first["rtc_delay_steps"] == second["rtc_delay_steps"] - torch.testing.assert_close(first["rtc_target_actions"], second["rtc_target_actions"]) + torch.testing.assert_close(first["rtc_action_prefix"], second["rtc_action_prefix"]) diff --git a/tests/test_model.py b/tests/test_model.py index 01acfed..cffc106 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -31,7 +31,7 @@ def tiny_model() -> Pi07Mini: def sample_sequence(): tokenizer = MiniTokenizer() - metadata = EpisodeMetadata(2000, 5, False, "ee", "demonstration") + metadata = EpisodeMetadata(2000, 5, False, "ee") return tokenizer, tokenizer.build_policy_sequence( "drive", "steer_left", torch.zeros(2, 2), metadata ) @@ -52,16 +52,17 @@ def common_inputs(sequence): def test_block_causal_attention_matches_pi07_modal_order() -> None: - layout = PrefixLayout(observation_tokens=2, goal_tokens=2, text_tokens=3) + layout = PrefixLayout( + observation_tokens=2, prompt_tokens=2, goal_tokens=2, fast_tokens=2 + ) valid = torch.ones(1, layout.total_tokens, dtype=torch.bool) edges = Pi07Mini.build_prefix_attention_mask(layout, valid)[0] assert edges[0, :2].all() - assert not edges[0, 2:].any() # observation cannot read goal or text - assert edges[2, :4].all() - assert not edges[2, 4:].any() # goal reads observation + goal, not text - assert edges[4, :5].all() - assert not edges[4, 5:].any() # first text token is causal - assert edges[6].all() + assert not edges[0, 2:].any() + assert edges[2, :3].all() and not edges[2, 3:].any() # causal prompt + assert edges[4, :6].all() and not edges[4, 6:].any() # goal reads obs + text + goal + assert edges[6, :7].all() and not edges[6, 7] # FAST is causal after goal + assert edges[7].all() def test_prefix_has_fixed_mem_tokens_and_one_token_per_state() -> None: @@ -78,9 +79,19 @@ def test_prefix_has_fixed_mem_tokens_and_one_token_per_state() -> None: ) assert layout.observation_tokens == 1 + 2 + 1 # MEM + history states + current assert layout.goal_tokens == 1 + assert layout.prompt_tokens == sequence.action_start_index + assert layout.fast_tokens == sequence.input_ids.numel() - sequence.action_start_index assert prefix.shape[1] == layout.total_tokens +def test_action_expert_accepts_per_token_rtc_timesteps() -> None: + _, sequence = sample_sequence() + inputs = common_inputs(sequence) + inputs["timesteps"] = torch.tensor([[1.0, 0.25]]) + output = tiny_model()(**inputs) + assert output.vector_field.shape == (1, 2, 2) + + def test_flow_cannot_read_teacher_forced_fast_tokens() -> None: torch.manual_seed(12) tokenizer, sequence = sample_sequence() diff --git a/tests/test_rtc.py b/tests/test_rtc.py index c233e8a..c2ab81e 100644 --- a/tests/test_rtc.py +++ b/tests/test_rtc.py @@ -3,36 +3,39 @@ from __future__ import annotations import pytest import torch -from pi07mini.rtc import align_actions_for_rtc, sample_rtc_delay +from pi07mini.flow import FlowMatching +from pi07mini.rtc import build_rtc_conditioning, sample_rtc_delay def _actions() -> torch.Tensor: return torch.arange(32, dtype=torch.float32).reshape(16, 2) -def test_zero_delay_preserves_entire_chunk() -> None: +def test_zero_delay_has_empty_prefix_and_full_postfix() -> None: + rtc = build_rtc_conditioning(_actions(), 0) + assert not rtc.prefix_mask.any() + assert rtc.postfix_mask.all() + assert torch.count_nonzero(rtc.action_prefix) == 0 + + +def test_delay_keeps_ground_truth_prefix_without_shifting_target() -> None: actions = _actions() - aligned = align_actions_for_rtc(actions, 0) - torch.testing.assert_close(aligned.delayed_target_actions, actions) - assert aligned.valid_mask.all() - assert aligned.executed_prefix_actions.shape == (0, 2) + rtc = build_rtc_conditioning(actions, 12) + torch.testing.assert_close(rtc.action_prefix[:12], actions[:12]) + assert torch.count_nonzero(rtc.action_prefix[12:]) == 0 + assert rtc.prefix_mask.tolist() == [True] * 12 + [False] * 4 + assert rtc.postfix_mask.tolist() == [False] * 12 + [True] * 4 -def test_delay_shifts_target_and_masks_padded_tail() -> None: - actions = _actions() - aligned = align_actions_for_rtc(actions, 12) - torch.testing.assert_close(aligned.delayed_target_actions[:4], actions[12:]) - assert torch.count_nonzero(aligned.delayed_target_actions[4:]) == 0 - assert aligned.valid_mask.tolist() == [True] * 4 + [False] * 12 - torch.testing.assert_close(aligned.executed_prefix_actions, actions[:12]) - - -def test_rtc_alignment_preserves_batch_dimensions() -> None: - actions = torch.stack((_actions(), _actions() + 100.0)) - aligned = align_actions_for_rtc(actions, 3) - assert aligned.delayed_target_actions.shape == (2, 16, 2) - assert aligned.valid_mask.shape == (2, 16) - torch.testing.assert_close(aligned.delayed_target_actions[:, :13], actions[:, 3:]) +def test_flow_training_sets_prefix_time_to_one_and_masks_its_loss() -> None: + actions = _actions()[None] + noisy, times, _, loss_mask = FlowMatching().training_batch( + actions, delays=torch.tensor([3]), generator=torch.Generator().manual_seed(4) + ) + torch.testing.assert_close(noisy[:, :3], actions[:, :3]) + torch.testing.assert_close(times[:, :3], torch.ones(1, 3)) + assert not loss_mask[:, :3].any() + assert loss_mask[:, 3:].all() def test_delay_sampling_covers_closed_zero_to_twelve_range() -> None: @@ -47,4 +50,4 @@ def test_delay_sampling_covers_closed_zero_to_twelve_range() -> None: @pytest.mark.parametrize("delay", [-1, 13, 16]) def test_invalid_delay_is_rejected(delay: int) -> None: with pytest.raises(ValueError): - align_actions_for_rtc(_actions(), delay) + build_rtc_conditioning(_actions(), delay) diff --git a/tests/test_tokenizer.py b/tests/test_tokenizer.py index 55f299c..1a6b234 100644 --- a/tests/test_tokenizer.py +++ b/tests/test_tokenizer.py @@ -9,7 +9,6 @@ def metadata() -> EpisodeMetadata: quality=5, mistake=False, control_mode="ee", - source_type="autonomous_rollout", ) @@ -21,10 +20,18 @@ def test_prompt_contains_rich_metadata_and_control_tokens() -> None: assert tokenizer.SPEED_MARKER in prompt assert tokenizer.QUALITY_MARKER in prompt assert tokenizer.MISTAKE_MARKER in prompt - assert tokenizer.SOURCE_MARKER in prompt assert tokenizer.CONTROL_MARKER in prompt assert tokenizer.CONTROL_EE in prompt - assert len(metadata_indices) == 8 + assert len(metadata_indices) == 6 + + +def test_high_level_prompt_contains_past_subtasks_and_next_query() -> None: + tokenizer = MiniTokenizer() + prompt = tokenizer.encode_high_level_prompt( + "drive", ("keep_lane", "slow_down"), metadata() + ) + assert prompt[-1] == tokenizer.NEXT_SUBTASK_MARKER + assert torch.count_nonzero(prompt == tokenizer.SUBTASK_MARKER) == 2 def test_metadata_cfg_pair_drops_metadata_but_retains_control_mode() -> None: @@ -62,4 +69,3 @@ def test_fast_lite_dct_round_trip_has_bounded_error() -> None: torch.testing.assert_close(exact, actions, atol=1e-5, rtol=1e-5) decoded = tokenizer.decode_actions(tokenizer.encode_actions(actions)) assert torch.sqrt(torch.mean((decoded - actions) ** 2)) < 0.3 -