From 528b3e65eeda9de348edf9eb9c9ff98f1927b76c Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 25 May 2026 11:07:02 +0400 Subject: [PATCH] =?UTF-8?q?v3.9.7=20=E2=80=94=20Forward=20real=20codebuff?= =?UTF-8?q?=20error=20messages,=20fix=20BrokenPipeError=20crash,=20fix=20S?= =?UTF-8?q?yntaxWarnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 277 ++--------------------------------- codex-launcher_3.9.7_all.deb | Bin 0 -> 91842 bytes install.sh | 8 +- src/codex-launcher-gui | 39 ++++- src/translate-proxy.py | 133 ++++++++++++++--- 5 files changed, 165 insertions(+), 292 deletions(-) create mode 100644 codex-launcher_3.9.7_all.deb diff --git a/CHANGELOG.md b/CHANGELOG.md index dbf9fd7..5bc5088 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,269 +1,22 @@ # Changelog +## v3.9.7 (2026-05-25) + +**Codebuff Error Forwarding & Crash Fixes** + +### Rate Limit Error Forwarding +- **Real Codebuff error messages** forwarded to user instead of generic "429 Too Many Requests" +- **HTTP 200 + Responses API format** for rate limits — Codex displays the actual Codebuff message (e.g. "Daily session limit reached. Resets in 29m.") instead of retrying +- **`retryAfterMs` extraction** from Codebuff 429 responses for accurate cooldown timers +- **`RateLimitError` exception** carries upstream message through session and chat error paths +- **`_codebuff_start_run`** returns actual error body instead of `None` — shows real Codebuff errors + +### Crash Fixes +- **BrokenPipeError crash** on "all accounts exhausted" response — wrapped in try/except +- **3 SyntaxWarnings** fixed for invalid `\ ` escape sequences in docstrings + ## v3.9.6 (2026-05-25) -**Fix Gemini Follow-Up Turns — tool_calls=0 Issue** - -### Root Cause -The Antigravity adapter was dropping the latest user instruction during content -sanitization and capping. Raw Codex items grew (13, 15, 17, 19) but Gemini contents -stayed frozen at 12. Gemini received stale context and returned text-only responses -instead of tool calls. - -### Fixes -- **Enforce latest user instruction as final turn**: runs after all compaction/capping. - If the user's message was stripped, it's appended as the last content before POST. -- **Edit-intent detection + tool-use nudge**: when follow-up requests contain edit - keywords (change, fix, redesign, etc.) and have prior tool history, injects a - forced tool-use instruction before POST. -- **Debug logging**: before every Antigravity POST, logs contents count, latest user - text, and final content preview. -- **Fixed needle validation**: handles newlines in user messages correctly. - -### Also includes (v3.9.3–v3.9.5) -- Gemini 3 thought signature preservation (capture + reattach) -- `thought_signature` field on all functionCall parts (snake_case, as API requires) -- Fallback to `skip_thought_signature_validator` when no real signature -- Tool output compaction: old 3000 chars, recent 6 at 20000 chars -- Follow-through guardrail system instruction -- Finish-reason diagnostics logging -- Stream hang fix for function-call-only responses -- Multi-account rotation for all providers (codebuff, Google, API keys) -- `/v1/accounts` status endpoint - ---- - - -## v3.9.0 (2026-05-24) - -**Multi-Account Rotation — Never Hit a Dead End Again** - -### What's New -The proxy now supports **multiple accounts per provider**. When one account hits its -rate limit (429/426), the proxy automatically rotates to the next available account. -This means 3 codebuff accounts = 15 free requests/day instead of 5. - -### Codebuff Multi-Account -Add extra accounts to `~/.config/manicode/credentials.json`: -```json -{ - "default": { "authToken": "...", "email": "primary@example.com" }, - "accounts": [ - { "authToken": "...", "email": "secondary@example.com" }, - { "authToken": "...", "email": "tertiary@example.com" } - ] -} -``` - -### Google OAuth Multi-Account -Add extra Google Cloud token files alongside the primary: -- `~/.cache/codex-proxy/google-antigravity-oauth-token.json` (primary) -- `~/.cache/codex-proxy/google-antigravity-oauth-token-1.json` (extra 1) -- `~/.cache/codex-proxy/google-antigravity-oauth-token-2.json` (extra 2) - -### API Key Rotation -For any OpenAI-compatible provider, use comma-separated API keys in config: -```json -{ "api_key": "sk-key1,sk-key2,sk-key3" } -``` -Keys rotate automatically on 429 errors. - -### New Endpoints -- `GET /v1/accounts` — shows account pool status (active, rate-limited, time until reset) - -### Other Fixes -- Added `x-codebuff-model` and `x-codebuff-instance-id` headers to codebuff requests -- Improved instance ID extraction (supports both `instanceId` and `data.instance_id`) -- Fixes `codebuff_update_required` (HTTP 426) error when session endpoint succeeds - ---- - - -## v3.8.4 (2026-05-24) - -**Critical Fix — Codebuff DeepSeek V4 Tool-Call Sessions Now Work** - -### Root Cause -Codebuff/Codebuff proxies requests to DeepSeek V4, which defaults to **thinking mode enabled**. When DeepSeek returns `reasoning_content` in a streaming response that includes tool calls, subsequent requests must include that same `reasoning_content` in the assistant message history — otherwise DeepSeek's API rejects it with HTTP 400: `"The reasoning_content in the thinking mode must be passed back to the API."` - -The previous approach tried to **disable thinking** (`enable_thinking: false`, `reasoning_effort: "none"`) which Codebuff doesn't reliably forward to DeepSeek. The retry system then tried stripping assistant messages from history — which guarantees failure because DeepSeek needs the full context. - -### Fix — Full Reasoning Round-Trip System -1. **Capture**: After each codebuff streaming response completes, extract `reasoning_content` + `tool_calls` from the stream deltas -2. **Store**: Index by `tool_call_id` in `_deepseek_reasoning_store` (thread-safe dict with TTL) -3. **Rebuild**: Before every codebuff POST, `_ds_rebuild_tool_history()` re-inserts stored assistant messages (with `reasoning_content`) before their matching `tool` messages -4. **Fallback retry**: If reasoning error still occurs, retries with DeepSeek's native `{"thinking": {"type": "disabled"}}` format -5. **Primary path no longer disables thinking** — lets Codebuff/DeepSeek use default thinking mode with proper round-trip - -### Changes -- **translate-proxy.py**: New `_ds_store_assistant()`, `_ds_rebuild_tool_history()` functions; `_deepseek_reasoning_store` / `_deepseek_reasoning_lock` globals -- **translate-proxy.py**: `oa_stream_to_sse()` now captures tool_calls in `_reasoning_out` dict alongside reasoning text -- **translate-proxy.py**: `_handle_codebuff()` stores assistant messages after stream completes; calls `_ds_rebuild_tool_history()` before POST -- **translate-proxy.py**: Replaced broken `_fb_retry_no_reasoning()` + `_fb_retry_stripped()` with single `_fb_retry_thinking_disabled()` using native DeepSeek format -- **translate-proxy.py**: Removed `enable_thinking`/`reasoning_effort` from primary codebuff chat_body -- **codex-launcher-gui**: Version bumped to 3.8.4 - -### Confirmed Working -- Codebuff first request: 200 OK (always worked) -- Codebuff second request after tool call: **now 200 OK** (was 400 reasoning_content error) -- Multi-turn Codex CLI sessions with function calls complete successfully - ---- - -## v3.8.3 (2026-05-24) - -**Critical Fix — Codebuff Streaming Now Works End-to-End** - -### Root Cause -The codebuff streaming handler collected SSE events into an internal list but **never wrote them to the client socket** (`self.wfile`). The `stream_buffered_events()` method — which handles buffered flushing (30ms interval / 4KB threshold / urgent events) — was not called for the codebuff streaming path. Codex CLI received zero bytes, showing "thinking..." indefinitely. - -### Fix -Replaced the manual streaming loop in `_handle_codebuff()` with `self.stream_buffered_events()` using an `on_event` callback pattern, matching the architecture used by the gemini-oauth, anthropic, and command-code backends. Events now flow in real-time with proper buffered flushing. - -### Changes -- **translate-proxy.py**: `_handle_codebuff()` streaming path rewritten — uses `stream_buffered_events()` with `_on_fb_event()` callback for metadata extraction -- Non-streaming path unchanged (already working) -- pycache cleanup in launcher ensures stale `.pyc` bytecode never loads old code - -### Confirmed Working (API-level tests) -1. Raw codebuff API streaming: 36 SSE chunks, "hello" text received -2. Non-stream through proxy: complete JSON response with text -3. **Streaming through proxy: full SSE event sequence** — `response.created` → `response.output_text.delta("hello")` → `response.completed` - ---- - -## v3.8.2 (2026-05-24) - -**Codebuff Integration — FREE DeepSeek V4 Pro Access + Provider Presets Restored** - -### Codebuff Backend (New) -- **`codebuff` backend type** added to `translate-proxy.py` -- Connects to `https://codebuff.com` for free AI model access -- **Free models available**: DeepSeek V4 Pro, DeepSeek V4 Flash, Kimi K2.6, MiniMax M2.7 -- **Agent run lifecycle management**: auto-starts/finishes agent runs per request -- **Credential detection**: reads session token from `~/.config/manicode/credentials.json` -- **Model-to-agent routing**: maps each model to its correct codebuff agent ID - - `deepseek/deepseek-v4-pro` → `base2-free-deepseek` - - `deepseek/deepseek-v4-flash` → `base2-free-deepseek-flash` - - `moonshotai/kimi-k2.6` → `base2-free-kimi` - - `minimax/minimax-m2.7` → `base2-free` - -### Setup for Codebuff -1. `npm install -g codebuff` (already installed on system) -2. `codebuff login` (opens browser for GitHub OAuth) -3. Select "Codebuff (Free DeepSeek/Kimi)" preset in Codex Launcher GUI -4. Pick a model and start coding — no API key needed! - -### Provider Presets Restored -- All 17+ provider presets restored to `endpoints.json` -- Previous issue: endpoints.json was overwritten with only 4 AG X entries -- Restored: Command Code, Crof.ai, OpenAdapter, OpenAdapter GO Plan, OpenCode Zen (OpenAI + Anthropic), OpenCode Go (OpenAI + Anthropic), OpenRouter, NVIDIA NIM, Z.ai Coding, Google Gemini (API Key + OAuth), Google Antigravity (OAuth), Anthropic, OpenAI, Cobra (chats-llm.com) - -### GUI Changes -- New preset: **"Codebuff (Free DeepSeek/Kimi)"** in provider dropdown -- New backend type: **"Codebuff - Free DeepSeek/Kimi"** in type selector -- Version label updated to v3.8.1 -- Changelog entry for v3.8.1 added - -### Stats -- translate-proxy.py: +205 lines (codebuff backend) -- codex-launcher-gui: +19 lines (preset + changelog) -- .deb size: 84KB -- Self-tests: 54/54 passing - ---- - -## v3.8.0 (2026-05-22) - -**AI Monitoring — Self-Healing Watchdog with 3-Tier Response System** - -When the proxy crashes, the upstream dies, or the model gets stuck, Codex stops working. The user has to manually restart everything. AI Monitoring fixes this with an autonomous watchdog that detects, diagnoses, and recovers from failures without user intervention. - -### Three-Tier Response System - -| Tier | Speed | What | When | -|------|-------|------|------| -| **Tier 1** | < 1s | Rule-based auto-recovery | Known failure patterns (14 rules) | -| **Tier 2** | < 100ms | Incident store lookup | We've seen this exact failure before | -| **Tier 3** | 2-5s | AI diagnostic agent (configurable model) | Novel failure — no rule or pattern matches | - -### Watchdog Components -- **HealthWatcher thread** — pings proxy `/health` every 5 seconds, detects crashes and hangs -- **LogAnalyzer thread** — tails `cc-debug.log` for 18 failure signal patterns in real-time -- **Tier 1 rule engine** — 14 rules covering: proxy crash restart, port conflict resolution, upstream retry with backoff, schema cache clearing, rate limit handling, stream error recovery -- **Tier 2 incident store** — JSON pattern database (`~/.cache/codex-proxy/incident-store.json`) with success rates, learns from every resolved incident -- **Tier 3 AI diagnostic agent** — calls a user-configured provider/model (e.g., Gemini Flash, GPT-4o-mini, local Ollama) to diagnose novel failures. Cost: ~$0.10-1.50/month - -### Failure Catalog: 30 Fault Types -- **Category A** (7): Proxy crash, port conflict, memory leak, deadlock, SSL error, DNS failure, unhandled exception -- **Category B** (10): Rate limit (429), server error (5xx), auth failure (401/403), CC upgrade required, timeout, connection reset, broken pipe, bad request, provider overloaded, Cloudflare block -- **Category C** (10): Parser empty, stuck recovery, sanitizer flags, double-wrapped cmd, suspicious cmd, empty cmd, bare JSON token, bash without cmd, DSML name mismatch, stuck model loop -- **Category D** (6): Codex process killed, memory explosion, 300s stall, config corruption, context overflow, WebSocket reconnect loop -- **Category E** (5): Schema cache corruption, stale PID file, port from old session, OAuth token expired, BGP all routes down - -### Safety Guards -- Rate-limited AI calls: max 1 per 60s, max 10/day -- Restart cap: max 5 proxy restarts per 10 minutes -- Cooldown per pattern (30s → 60s → 300s → alert user) -- Monthly AI budget cap (configurable, default $2/month) - -### Enhanced /health Endpoint -The proxy's `/health` endpoint now returns `uptime_s`, `memory_mb`, and `requests_total` for watchdog monitoring. - -### GUI Integration -- **"AI Monitor" button** in header bar -- **AIMonitoringWindow**: ON/OFF toggle, provider URL/model/API key selector, health check interval, auto-restart toggle, incident log viewer -- Watchdog starts automatically when enabled -- All actions logged to `~/.cache/codex-proxy/monitoring.log` - -### AI Monitoring Design Spec -Full design document at `AI-MONITORING-DESIGN.md` — architecture diagrams, decision flow, safety guards, implementation plan. - -## v3.7.0 (2026-05-22) - -**Intelligence Routing — Self-Healing Parser System** - -When the Command Code model produces output in unpredictable or unrecognized formats, the multi-format parser chain (DSML, XML, explore_agent, bash blocks, raw JSON, fallback regex) can return empty. This causes the Codex agent loop to stall — zero tool calls means nothing to execute. - -Intelligence Routing is a **three-layer self-healing system** that ensures the agent loop always continues: - -### Layer 1: Deep URL Extraction (FIX 23) -- **Problem**: `` body contained `messages: [{"content": "https://..."}]` — URLs hidden inside JSON values. Regex couldn't match because it excluded the `"` character that terminates JSON strings. -- **Solution**: `_build_explore_cmd()` extracted to module level (was a closure inside `_parse_commandcode_text_tool_calls`). After initial regex fails, tries `json.loads()`, iterates list items, extracts `content` field to find URLs. Added `"` to regex exclusion set. -- **Self-tests**: Pattern M, O, O2 verify URL extraction from nested JSON. - -### Layer 2: Escalation Block Handling (FIX 24) -- **Problem**: Model produces `` and `` blocks when it wants elevated permissions. CC adapter doesn't support escalation — blocks silently dropped → `parsed_tool_calls=0` → stall. -- **Solution**: Two handlers: - - FIX 24a: Closed-tag blocks — extracts URL if present and runs explore command; otherwise echoes auto-proceed. - - FIX 24b: Bare/unclosed tags (``) — auto-proceeds with diagnostic echo. -- **Self-tests**: Pattern N, N2 verify both closed and bare escalation blocks. - -### Layer 3: Intent-Based Command Synthesis (FIX 25 — THE CORE) -- **Problem**: After ALL parsers return empty, the agent loop has zero tool calls. Model may have written plain English ("I need to fetch the README"), partial JSON, or completely unrecognized formats. -- **Solution**: 5-heuristic synthesis chain in `cc_stream_to_sse()`, run when `parsed_tool_calls=0` and text has content: - 1. **URL in text** → `curl` to fetch it - 2. **File path reference** ("read the file /path/to/X") → `cat` or `ls` that file - 3. **Shell command in backticks/quotes** → extract and run it - 4. **"explore"/"fetch"/"investigate"/"repository" intent** + last user URL → `_build_explore_cmd()` with `_last_user_urls` deque - 5. **"I need to"/"let me"/"please" intent text** → echo diagnostic with the intent -- The system NEVER returns empty tool calls when there's text to analyze. -- **Self-tests**: Patterns M-O2 cover the full pipeline. - -### Architecture -``` -_parse_commandcode_text_tool_calls() ← Layer 1 + Layer 2 -cc_stream_to_sse() ← Layer 3 (after parser chain + fallback) -_last_user_urls deque (maxlen=20) ← Session-wide URL memory for heuristic 4 -``` - -### Test Coverage -- **54 self-test patterns** (up from 41 in v3.6.0) -- 13 new tests covering all three Intelligence Routing layers -- Tests verify: nested JSON URL extraction, closed/bare escalation blocks, module-level explore command builder - -## v3.6.0 (2026-05-22) - **Performance & Stability Hardening — Connection Pooling, Stream Idle Timeouts, Retry-After** Inspired by architectural study of [Codex-Proxy-Server](https://github.com/unluckyjori/Codex-Proxy-Server) (Rust/Axum). diff --git a/codex-launcher_3.9.7_all.deb b/codex-launcher_3.9.7_all.deb new file mode 100644 index 0000000000000000000000000000000000000000..1ff8129f47618331f558840a28b2e07bf60094a7 GIT binary patch literal 91842 zcmafaV~j3L(B;@OcWm<++qP}nwr$(C?K`$@+x8vryZLta@1Cx7(v?&vefn4BoFd{e zbTYQ!gE28RvNW`#HL|obbn+x5BxGb~=Vaq#V&`BXBxLyS{C{^w1_m~k|8oDu|A7Gv z6CDGLvAvy(lf4a{i=h*pm$S?Nx1Ndfe{LltG=KrL(tn!(QItXfK_swXF?fQiS|8z- z9(#ckU{Rqpw6y#|V>vF_1f~U|0ip#O(LND?BhgGC)f}GT?qpu{%MVQN7X2&7~k~}6I zg93fp1Qy(gvj&fV<7xq(g}5xnn?`O7&+TBrWKG-A#{I)Fp}c?x0ekZ&$A_MPCIzSr z=rq|8^ufBM#l+CX@c&W!AMgLa-{E9rX8Rw0|A$>L3z}A7Y-%)iVFt@l&i?-a5FrMr zNb2dzotTK&7kcNShD9=}lFe{YiYGJdD?f1u2B^orK2^-<;I1!GrvtLrkN3GIgK^5y; zGPiiE8gII|drc=z_Vd%WJGVtgzq>2Ii2PG zn--q(OSad9Y8L-2^-A~b!^rw~dFePc$C1P*p&kMPS zD$+XYvk5d{Lz=)F;xxk#furtxwLrUgkk3+VeDaj(`#H3TDC@)K;-&26Rn`q0NoPJC z8X0j=EX);h0^HJ~U=JOOrNF#i&%HT*DJIUJW-Q6Odh&Yp+%x~@AZI6eCq6SKb>(2x zrhjhH#-1$-Wh<83xSd4X0ZL#)L}!!wgzsBGxfZz3{`9fcx4&g?sdk~Fz)~j8W}r}V zL+Sd}XtU2tp0l`_a)O!qN&CaaiKFCN`z6<0OLD1?_N9(8v1fU4;|cCK)-s7{oSCik zNa};qz7{~+oRf?=8w-8pnAm8jDVbu&!m?ACI<;tB`%q|K#oVhWjuQuiJr)evNb>5$ zd2AUw3Kb^;5+efg>@wHoxnyhluZ2*6_!_foaBwhEwzZn}r|HPYK)967&y? zm@u$`euVD=_D$IQOmMtq7ty8UV{bHj%|ZYoP@$o!r@npKV6V<;EJVv2PKBS+T$72K zCW*ADSdaveM5V#Nh7KtWdh93$_a{5{%4eTBhBxnypIr@J)$8k;6fYhQclw6B(zEbU zwd*TjwwHh_0OG9)Q~*ewIe@1QLh?AuLEkg=on-uMrsz%cg4LTvBh3w)bS-#bVDMKn zHFakM?r-DtFQb74#2=_*FBTC(1cW5m!Fz-L{re8O@aRBQaMcpIJEky3Z^nrt4(v$z z)$pwMzY(sr{9Rso zvI#oBYZc5+wjPk?dKvCsCO93Efee&v4TG$m}c2AhL=oHiSiM2!HBKnfIys zqGTZCk*IK|qmR@-{9D%~pY-eejc_%|+E;TnZrXhgaGX{->!bx9aS1&j82oZMI-j6MmRYXKa2TiK9rE6?v z=YKKG_4~XFx7ACurmQK7-|Kfsb9p0u_E?(J^90K7#Q8fmV)Xd8lf>om@Aer#sZ-yD zDx|a>aVyQw72e!oB>Lr?V{F`=G}H1cHnbPgsiuB(VXrrmn~ip+SW0!j7;c7I3o1As zOqz-hZWt&0Dm!&*FZgcOa1hvbc5^6cHq9K`P^zA(G|2|hEUcw|3br<$k9n2)Aot|= z(r*<6sjx|@sj{pp2vK+!P~V!w6fmr{gbI0Yapov)E6G~dXi_@GtljBnRs2fAI$YL# z`3Tzaza8bbX{# z_mPPzaV5^Y7A;I;3OIkAJMZF+eWd32C+miW0roV6b{khE^68jUqa7W2Z@%)UOKq~g zWjR}0tDW-l4dyzv&9_o@zq`%&SZd?EsOf!DWj%Ipr_tPtI(<^@kJjL+V+Sl z#W!1DHe=VxqcY}g^q)iTTg;!DXIAz$chULU)U7Sfkq}mc^LF8a_JB|P(2j@O4jO<4y!utjq3 zP6KK5O-0xj>#T^g#`~eK_p=XHjs0DLc}HfOgz({z>i`p-_C%OX{X!ER?6RhIFZtqJs^Wc$x zGRWhdR#^qX6(@hBR)n4O6}kHCU4$;EYl$EXhpE=v9&RKr`Ls`#qNX}znx5GdBzGmF zTThpg@Zo42C`pke!(N!W2&o|e01^05OtLx&AC(8=3MEdmTFq{j(W@qt*ID)63H#=z zLm6uy4J1e74f!XYJ~3m_E2Ty@A9|T#pU(C-F;ci>NZ}j}genLLS5wV4P5emhi;$AG z$0*n`Y77~-cIt)ueE0IpNSqr6jbDy{9lad;v!s}FNB=orCKse-1wo!fw`G*BznXmp zvP#l_QHI4 zb1q-<%K%UQtpc2I%tlpMdHboL>V{HJTWg6mW%fn69)4Ud)xM_Gbh=)m_w}+mGx?q& zHTMV^W0(_eFI+dYcp+bYglC_U7y~}_q*1gvZkEi9g8uRj?T`? z1@X>ZE{L0K4D%jxd_M6l0D?XZdb%iSK!=Vs3!Yr5ATVfVgoK1>xAq*6Fh#1>c%cPt zY;+`=w_Zb$M-Q>MEU~P6F}#9E{wLTj^~_Y>OxAG5xmz}?j5G`he8g1f!(B%*@iK|$ z?b4T3vBIcwWA4zh_D#@l;{F_hc4LcE^iUE(J*q;G^*hWR7 zPz>c!SmB-ZfGA%(C&|fy{35{;xTP+d;#V0-u6_dK$APrj4*MKFSWK3dM zuo!gUpc7#nYEUb9y{4Mm4Q~WbscGAxGQ@t-(7Is{S`@@;1}Z<$(^-Z8TiK_a?!VMj z8H7wOD6~66^<~;>>V1on)hlpe?N60m#1bYc^T<`ZW{YZKz}#PA6c8B#%;6lc4v$C; z2h{qBI`tUtiyh~9fQb?3scr66_V1_@^Mp*Myu6yn7(}#JataJxXC9cPp*&fRA*E;b z+cabX9HMl7iv$#4?My+2{U1lX`;;G{%UX{6i7F=4wnE(0BU=j9TeUbaL6oZIJsxO zcv1h8<-S<#mBG*@i9Yw^ozP>P_O-JQ&@z)ByQZ@~g6! z58$ooCxe`(=ulHfoUF{5q!ZCQv^yIW1)l9OZi7#g1#bp|u2=}TuuAiLv135g6)c+) z6d^8rt}Os$>}2hDy`?T&PG2qn3s?<;B<5F?q(r)~Qs8AF0RsgP0tE{IA)+SBnvpEp ztUE)t7)M9Xk4zmBF&0386QL3_!T^Dz0--`N5CVaL1p(Xs<=@7VQblOz6&&nXjV&nF*dHev-B-NA?$}ffi$&kGM(_HV2PKpMgl6xSG z5P`F4$VrKeqHvTrskx#{z@%h|=AWi0OBF1Q!E?x6_zUpo}HJ*}XRC*~9%L<{8xDGlN4 zHFa~h9f`m4a?WhTcI3Yx1Zt!EBGL^m{;8P}QTIUP6(TcNVK4|wr>7X#8zT4PFj$uA zW8hDgTGb8AoBE!OOA|7t6;~X3@W*x|78$BNzgXm;$_ChJ^2O5?9(WpnZ6D&jI9`x& zP60t3O&=9Ws2qst@ zh6OT>a*V}Lj7d5+Q^NCetzXC3e-2Lb&Goh#s;Z?cvkdn%$I4tT09IcCm6AzDyM#+2 zuqh+}O@k%n41~0yE=kg)w-f)k*ls2-$E&pVtLk$|6MqREr==2cQotij`mcKgmF1hl zffn6&_GYL#&x4fz*tmhX5M9Xb>|Y#)02_9gCP8^iVd2UvH!yOzNu&(U@2*HkG7$xW zc?Iso z!;5tv@K($(^9_)6znD>ZS83SEQ(vjAKWpFS72C56jChV;g$hN@+KvqOl8 z(a<3j`Z)L9Bm#f_YQeH*&oYsZa?g1UxEcL+P#>qqZR+yddA$^Yb0loi*i z-IHz%{ZbZ$+nk5>t(L+XV!kQra6ufBosP?cb;{{No9r{mE|i?bVJ$4iKYUX1$5Dqh z(Ow(QcM(nT>0>aoAPAlH9(5(AkoF|CLB>K7`*M}IPJ@j_117VW6Ae;ea~M$Dxar5u zCc!E~c;BG!df2Cifz8)HA7+3oW9v17 z@%|EoDFrd8Yz6DKJun*PQMY!C$9OZdy6zvwXF=f49CQ1YgzqoJ7-ptLes~qV+wyR; z7iYUV1Awg8>?=NUvX32ERj+_9X*O)(%yhYhRi5dLhB+hGIx#& zT)8f}lyB=8-8Cvh6;?0Q#8OicCr*Lfq-O1tIgs-`j8SH9VO8LpWF45R zy9g|Pi5d$klD6eC@~A1<*Zz4xx54$7G;FF51BvvViGix^^HeWwyeajP zjoQC0)(p0bqp2;vwBj)eBJ-vvT+d;b1%=bNBdkvM3oTUt7E#)&fnT@Q`J>&GNQKTx zO7&bZnz#lBw8VrwnW}QIGq~GEzC-F!^+wTft3fwxzAFTcfv483@Us`lUab23rG%mU zn1{TWJXk^Ko~WRDD9sAz75i7HC3zNsLhm)N2_RrsJeRARFB+x)rO~-lXH_yJ&ZE&g zqZwiBLp}+&5DqUPyJ7+m)X;!K|gtJK-)xb|UF|x_D)AQVOKkf1yQK zu9~~0k^g9TMt~QuO~t>t%2MynSWpdQ7k1|iqD9}rpPX9YVz5C6aE(ZW&OvJ3%t$V& z@Uym4_|JkTxZ9P=G8NJx3|{pmVZF#8Cy7*7Edi1i_Zd4$4SV&l^t$4Tu$0=nj(nGr$|lw1Wm z2&+vl^KLSWMyEKLg~36Afnz>u0f}pWCa`YssGE4qpACfg%2JAeao5h+O_CfBP`B%#c6ls*beZ*jV z(8w1v!$k`|TEO;@T@{TdyXln9uo9LgT_pmo{4-FHO89M^aX^?gujY;8-9@DGT6rP! zDoAbleDVHS>zJ!x%ET%QTVx#>$R`1~FT}l}%`&cny70DMg7y%K9AE zK%U!tIy&~OESBzFeL_1m-)qZOe{}AypSWI|b@EU+m&CvZ)H&j6^=T}7ACs(0F`{tq zPkYhnMRhcc;&hHo9FH#C@uGpg=4*q%_wEPW-eB2AHKF(t48YX{aj}qshjTW%;|IfwwIXg2)+2dWIVwPdVZSug(|Y+l?LR36|PbtaJ(sJ z$ZmSSjQld1Tst>ylyO>O)-k^xEfM9*pksrdI&ht7`SNY>h~F^eYzQmKaOhmgMyv8j z%!TG%i4Mo`nB^TasC{_`dH8=I`UK`Ze;pm^6X%o;E^UlUF6-{4j0L`mS`|4Fa3F*w zxfHdFS4=1(Ub0jDG698D9v$tPq_c++07JmCt=W&{smLb-$Rd>_B}IjPl=uUtS|@dGO-VKA%w`NzknI2f2F#iaDnRu5*365MKqDh+JdE%z#4iMT6lN# zN(PgURO)w-t-lvGD7I{hMH>QN2(IGG?w1tWatC`Y)phr80F_pIn|Ci#isJl6+2rS&W zUCts}DN#s{GzkMCm7K198wkhc-rl07;EEhGcFmoRspOFypu_D$7@eRHAx{|MEq@)# zfZnYI!n5wqe??fU$={~oCBLb3KX!g-mH0%@shBHosX$-X}9`GS zlu`*9=~Xe2x^e;E%U}GXhK_h9RE5yJE;TT`zu^W%5PRnFZju(tY-7rVuykPfTY&YH zIXE9X=?}|wOeUP*#RStv1krbS{kO&0yW#CQ7a0?#(Zy3zf`h6+3Q{NQ203B(-9d%P zt^%!Fz=so+o&ZmQGVEF-+dC3pB27vOdcXq9?moMI83f)yHE^4vGm2$Di~8aUVJuRlSf%>b!+iAj-+Qr` z;1d~A4I8Mfb>!-}e`}QM;uQVcptAxp>o#_X3Yq+s5TR^0K1xUCCuT00ovqWKQeG$n zSp_c(bV~Qr;*l^kY!JI0+F%d5OadRdc$nVki14|aqV>3nq3W1Cvn+A!`tSjkG71hS zNIGxZEWyjGbJu8=LU+UahH!^HiaV0&<)bf2|LG;p|12ddp^_lm3NCf6n&*@D3sga2 z7rI6{4y~YoGdb}q1c44V>Tb=oZ`?%?WVj%14JC^d7ibpB>I8ZN&SC|KQ)=R@NnDK; z96h{?LM+TQ%{kN|#+ex1GEc~74n<{Wko9&%&S!qeeJfe;#ed zm{V^{<>kI?;I{sBTcf}vzZZc}tafrK`!4+q+E^ly^`c6UxF4kD`_yqk6#61VZWa)f zwZbNi@guqZM2z0fWaTho!B2)L)HL<+U%_7256cb>o6qNB-x_^BcO4aJ`OzbGkz5dK zz%`*jIP3`cMe4Hz;_;A6S6?o%Jf_;`EyWl~WiThGutTOk_!d@di2OE`xU(+Q$nGNR9r1=UgOXwtC z{Yur^0bXt;-{UZAcGm{>1qvkwWo?AZi37NlVwz|6SqYV9!A6Ot9H9*m9(FR+H|%3h zB2%%cbyf0JvKj4SPgI%5zsV9;Z+SS)=)kSJroXGDRv3eF0ZndV{7OC5aNj7BD;o>G zEtR;#DT(R$(LOpGWco%o@<1)d9!o#y!=E=+A@K)7s}d}#I&e9(vy9pB$&)+Og-(f@ zk(U?BG_2tL$YV_kDboj^FiyRx~{rCv`P79f3Nh0ngw&ldaF+0_7M)l zMG^X_dy%E|y$F=X{I06CW_#tBJf_HNZt07+THM&TtG}8SuqO#yQL=Rbr?BG3s(XQYQKE>V_?cS?EpxG3|S zCHe!4ll2+J&YgUlh|kSWb1J5MbS(2#zmPIk%6FJ_>h-mswFo=J#5{}ZTV_;7*BE&6 zA3x?NITH=F;?r_evAF)WaOY7-5-{~0<02)u3%4`)Tn8pg7oVkoFy1zn2f{9vg_sE2 z!kjQnknkRzt68$BYT*?Rpr5E4Mwtfrf5g>bOn}Coiq7Lgu|PUSp5U+KOT%1(wj9b8 zQo^Ye(ydiB^_@({4ES-(E;pZ{hR;Cx5NlFIcBC05Hy5wuTsXZhPLe@m!NX+7==zRJ z1~kTJPZtajxay7PuOf~T@}n6VlVTm6?zSUxa=vQ?fc!2MKIcA;LmQf;3h4!{FZt`# zCC*!@#fg9eY*r|J?ZCR}1Z-cOev-NaY=HR0flkkOux{@=;mb z1Ziq63GUlmlNKAmu@icKcvde8qgi5Xv9K?e_($ku==UCA8nyD1x_t{^S(aJV0GlA#8(m`3GL>f)MkC%1LYq&}sZFbLRU3 zmu}~gFieKLMG@fvDHTOin)@>?H`OSU88&NJRE}W&yVlYIZ?d@g7?`&^F*!Akf19o; z*U7eER%IBr#7M)oj48UMhCDgJ9)cbe*@gO7^0?Y+S-84<;?H^~G5BoOJPa)>s&QHF!QGFoC0 zB|;0B(?UH%$D+AjeV-NlVjCvB9iXz>4BIdvkk5UUbSkhI*{^}>bKL8d^xao*joy+0 zEOOA`Llx$R`4V`wbL3amcxK$042UwA(|pp79+|Zo<5ajG;;ppz2tMdd#*b%?C+kG( zcc8ctvQVB+_OR*S6NgNu!l6)l(?=cHUVouP=VwODN{~?LjkK(%ln;?R`)-(g7vQkeDZz|$QwWaF;2ID_vfz$A3w#YF>B&e4hNDJQX z5?SGYMCTcimW{dd$THD%Q~gH!LaWV4RwZHVvo4gnRFdwjoG06Vp0oqKt-pD64~X>a z{O83bN4rCz{g?H@&c{jyr2sMv%71dAqhRJPl);SOBV9A3#@`xWnC@q&*c_g_Ck}bW zq5|!6Xw}u}K=8;r0I7e0NvHNBgs4M1*sl3&9MS?a$18C=d3SGv!J40;IN1z@Zb>Fe zt_E=Q-+nMDK{Z%_qfpwW_HT39 zur1#fGWNKRy7h24E%;R?uHxfdJ@Z@8+X0auY&D2M)mF)L^%i){8R~dlVjRQ3vY~T` zTp}EBxZN8-3OyW<_Bw&a+Wd1IOa)V+ws?*>Os)^0H;IKt#Kx3J-U0Xtar8~0tO5JO zlX3inkxnRZL4uG8WC-njZUL->{t|06?E^NgkY6>Ij1~ICIBKK*w=m&xJaw1FAVTJD|Bb>IadWVCZ%pY62_e`Cl#&shb;3)TBLZB9%Z}NfuTDG@(&26{MT((cC zOFSYt7hiY!^wiIgNd_{~V+AdpvZYqw>=b0w#C@}iQ%a;HT-{2`_E%enyc6swExyL^*! z4v@o1A&#~(>;x%?sRGlC=FH7l9I317{6vZEV%2pYkY`5exmz8oRaYARt_W8^eDzxd zx>s>aLbx~aaTTw&u@3v1VDfO=__6)%4=H^NjpxZxv(U^M%hwAXB2YjVutRES#b@>T zNn;9OMPO|&`XvmChVBLuCZZP)sQAy1EBR6jv$?Y!*WqjuczsrPeE4fnYD{Z$=}(#;An3o%?*KJLhe%M%gfOIn+_pP)A7d z{;OjV2Af-IEyrU$)G=CLP!{TZXpo{d^|7nF)igg3g!E6vmjsCbY3Lf55QS+16fr3j z&1m_E9e>dl&0POuMj-xC6=$*e{R3u6hwE3O7G7VCor@|t=u$t27%Sf_-BLp)7qz%j zW6B$LnwIOm1MHaY^aVV(`1NpP+!m-%UvoYS7**YXu>FDcG5L4^gk*rrmwHZAA`q=%`hBb{^G2Vl;; zO3HF(BD2A&{PcjD#|#Dq^K@>HT7jlY7Uk{*>}njf-KmLKHLQMAjBL6XsusUz2k(Ew zU`nMH{9!h$>24xZdJ{0MEgQIK_b~xlYi^#usDj2}Pm8FwTzhxC9k{TsGmGybtaHls zAx)EiWd?>lNNA#!IreKYAGS(u9!1RJLuw7ApA|3)_jU}O(JW^;IgKc%LiKMYa)&&k zV#XyK18kZiU0!J4h_tL-0(*dnr&lmBXQV^HDr>>uJ(DQ5EXojj=jhD@lPDZasdop7Y-a$?e_OczfXweXZ4RWl~9ktgB2DaImb=D*yoX^2FWWhYdn38~ZQ&8?$mVJBW2F-30J;A=V^xD&uJ@ z=EMhdM?U=qi4zpImKu&LB1x<6H_EA|ud;M2uqso4KxIKo8S;W{mRyXh+8S%X5(x|K zA$aD+;E$N|Mf5QEwEk4~MTLeiK1myR^Ov1KpQ9t!_(+>)8ctJaWl;s*>W;PKvU{@|FoB4}PUqx;xzhPw?{fRvAF%fBTa}?Wl zg`QgN>Pg;s&>iAK&cLXsb;!2Z<+d8Xyi_hJF&@xHlGJH4r9A?Zl%+DW9__vaqQfZ^ zs6yDotdy~~+im`0PzQGot-;$PSAmOVRhFI+b>^V%bkw}mG$zw8pfx@qyu z%wa-y+lQD4WI-VG=0fh4fh@dn|kTrvm)0gObmJ`tKpf z5)V{IyEO@CCSP{MD7g8M5#>Lgvcr@@?VzoLzSHYZt#J+rX{aCf8&q*X?I<(0l}-Oq zwYHgFa#)5sw7i+`v7A;NX0(Joi>v9`3;g|QV4%#Nes z(tncg6sB~;SZYFT_Ics(EvYM0#SWHu$;6gg71%}39H9SeJ%pghj3HDwr`xy=UbGnH zu@5<%LHJRV1Qi&skS!K@z1&~pZS59#N^VIVA zZ7;3^%xUJLj#$b7x&1ekdo3y*H@1t#ia@a!8U=?DTo$vb>&gAQGaooc<-{(4pf6TGxuXv!Iz;~LD|-$4+)k47HX>%13MY^AqzH2u zj6#Lq*VJ0;Yd0?DCBYoJc%7?k_%b}trBX*F_SD4>7K2~SmO9ky%eeBsg^n2vtYDp5 zvsu+kse4ATIEitY-5b>vd$1cK;6$nDUW2QOGf>R5ULM?T?&RwZsN6veEu94fb>kdl zyr_JL;045MyjT^tuG;ty|0AMJKOo=cd_W#;AeDrxw>2%j9ztDu21;E5h1;H-ZVto@-|EB2 z?Cr;Ma7GB{!4N0u%qRvCQ}Vcw>Q(F>mU_B)|5$0b4ysWWq|P3YGNQ)c|6oc(=rGHc zocW*A_z`k;DqvPTvyvhh^uQiSlEt-SyRa+@C>nhcp1?vr{l44r76SaDmO~AGa_xIc zT?4P+0+Vn#gGCF>tf5u)H{eCocE1=H3MQpsj7PH~T?ySKQyxV}rjsJ{AdsfC`fWXZ zG^ce1q>YYi=V1Tvd?)q{h(`2~R%Sa>byK_~Kwy@OHq}DfH}c$^L~!Uef*&C*H_@8= z-*K&l@|KKXIB@);-GP8)D8t0I71p=pZA{3*#B3(qDMwj>$q;3ihFtZBn)@M-;?8!9 z0DjC|F2nOzCaTMoh*pX#n{9br@iG+pFA&kwx67H4wJZkZiXJWGBcSNIX3Fo+5x6sKSQe9{UBNsq1MF$Kw$S{$Q50O<0`XNZ}NZeX9Wk{s4N% zh@W3uBnv7kz12#_uSzBB*#6*B`;r>C1k& z{8{Y_u3Rce@)G+pT1li~t>r_BFGP-qdXZCs^(yMYElb!GbO{s?YgFWH6j+oJN8dUY z_T%7rzEsRhh?0@R4`7(~)tL|)+VV!8_tweyt^p%f1K8>Xrhl|xLTrG!*X8o0ds`fh zf#*UdNncPzohInND*E?4iWPCw@tre%;wVyln*RFfyXnIAX(L zEhGDK@?e^a%LsULJkgC87o(uDHo9o#IHxqCQZ3@T#dqz^xTXfbC6Z!gB&wWJtf)9F zDBcMnG&6HIX|+(-MBZJpM3cfi$qGGgu<*}6jeY}hk)=h+i}F*=4bH=%q$nVeB(H?5 zU_zmI2RoN?l=mS?P3$hus%my(Bvh(_5~vK)TJ&ayou?y#Vf6@PrMFlfpP%;`eoCIt zXz9X`g`Uz*N50VK6g5*kq9Hpbq*ZRShhPea%QE8d6LVj)7~Tu|nQ_(c{OVw#lNk83 zYJ?CYx1g{>*Nsdd?CAPGa+iz!E#0XF`k;zS_a}F<5;e2 zm((6B_!Q@Kb655=AC)c7VfC+a8Nx{W(oGN|v~CH_oKY(}f$S48wX=v2GYQSMTY*y4 zR?V04z#%8vcGxPEMQLIL-_MF5cPJx(Q4H4m+w`l-X3s!!C%-;;PIPFmh{CZ3cR{vGa&wo;@>K!ZV@7Yu~0{^YJ|>Rk57YUikb_haQ?V$!H@2|+opFd5=h*3@b| zhShobHkEk4uISr9or*uJ7_&Z3FLt@#M7~7#4X9{_00cBJ_h|Z!&9W4!(?WJN6w| zc9ogJ%@Xj-m2@iOLFj5eeB3b(QSXF7q9J@rU4xkp)T}Yabl`s+x+^6`#gGWZ5x6N9^+8QsUssCC7Hd~R!!*Py*CI(Ogw@ z5Ctg`tU%vfp}-dnr%p!$BSd6}dQ85C8+JqAOYt zJ64_rn{of=tH}m%lIY)>l7oFGBG23L7cu!OK43Zg>_5UyqXk;M86`(-l^6eOV zlrg(Wqlb{b5(7ZR-6$pung>j=pO6Yh_1Ff7GxaMHaeVxEcH05KRW1qW{DijK5I{UY z$p3qRSvm-UC2-8mLQ=85qgy4ihDZ{>VJ2h!(ZQtp?%dXyt=bag4YuE`?NFsprS4CF zLIBeP)&^DvR&slH+kZZPOeu^w8UDiyV~rMRfR4!~j1>XVQyEz#y>R1Qh_nMBLG?_n zWWtahb$zIaR9P1Z3B~Ptu#~C<#aj8awfMleYs2njRH3cko{=TNb^^J z`0UA5l9eulmOQ|&@q%=70rg#>h-+OpYLgKn4y%Kn0l<(^%+3!jLiRGEinX)(7vv%@ ztQ0`U_xV1qDxP0&QIOUNIHkYZ?}u`g%H?{s@;+w}Dy8jUs;$xLxM2K+-T6KHjP+mW z&70%BbFxdB=x@MOhcE^V=wL!;=r*SYPSW;7Dx}yN zP`A9z?r?y!&^gD3PKgdMb`*m z3)%Uq8Xlez4#rbPRdZWc8A0kVP$E)(&2R?R{kJzeGA7y8V@0v@)Nyil=^wXvI@hLI z^T9tlwU9_xhenkQmtE{>lb!K7V;Efh;OpjcW$B^Gajs7V)F@&>RLO$WF7pWDdSn%e zCTdH1f6$r8u2<(|G=Kt;o4?+wpScDvN)UB6N;OI+QiBS06()!* z0Z`GmG>|1_5mH1YW5poDs$*SKBq5!n7a!`83&r#-u-0n?6+tMl2<8A%GG&=fUne<| zWpbQ{0S?QoiSo^DE^o%a$GM{50OFba{5_iKRD}Ry>;A6y{R-{A|L(niyD6QW$|r2N z(*(-8Qqua7<_rNM8)T~dF~1wKZ(c(K40n~>yz89v+D-2-YUt=*R#WF(0m~l~k#p^d z=gtkkX&~Y~zY{M(t}DZ3$V&HgY1FAhH{R|pu3vrekM@qvo+rI4Zh2wDL(*LGG9oD( zU9?mVnWmRO8^^^R5w8sJ7%7iqjU`Ps>t3GbB-i=7bMQy~cXsv8_RbL=hi|o)yqV1u zm!bbbY@6M0r?ofstv4S?B_}CrX=v}x1Nd~>G+y~4RqnD0!oqTW)`Lva8m&Y=1p|+4 zG;o76*^}8=wIJwFG+q;O(_N~&YwzJD#=~QaF9ZS!h8PwW7H1M`$J_@#I9K98KoJr_ zVG}MCxX=ctAO&wit{J14jbmlMFZO*fsjwiApqnAA$rcyMO;7&}$P*Ys?6RzmmH(#uXk-lt zeQ#K-eV1j=Rzr-)-kwc89_M3-e`^m=B)a4R1BND$-wbQW)3SVJws(IaYI}iP_|rl6 zdup~UA-w=mEr2MYa)){=%+A+j(0aB4Ygo`biS?et?pw~rs-IAy@(M_BJ%>MJkY`8p zG=TC=2u^)p68a3EEgH1wP8t=O6u8sH424c6nmp=-$`ip*ra*RQhG3pMgy;CD?7pA5 z*}Q2HA39?yjOszSPz))u?mvw3pXGSitM=~YUH#CB1r?+l?zF|gK!E>kK!?L1o+1M& zlu-#KC>el+f)kqt2?;$2yVpP^2aQmK6J{m^6$oU^!X!=rQq%&@w;2OWh9S(GEQJ88 z(*QO*)7#J}rEI3gR~l+HnsSl$7elT-=xnN2`@J+b46J2SPB+psgrRWomJF#c*uD4S zY{LZ$nI>F)Rgp_Y4TMhDD$(k|Y!PbaU%|?uT3nfnjju)(YSlPzBGl7|Th7SgKl7^y6KpgtW2^S>1f`UQ z46lj#)z*2cdEn_t_uszs6B9&6!E0oo z1S&`E=7x%Th=xip0^5Q0M_188Bgvb&-cH~!fs}MXRW#=k`Pau?%+3(@#(B)$(p3i` zVp^Lfv2akxIw(tBZK0%}ef_u-ER^u82am?SW8QO{3gNG&Q{eWgi4=;>Ldk2it2YLF zQKLJa7TH*UxL5;J0{ll1!QOCdMA9&4EhYwUxJP$HZPe6VppfM zC^1y3%|uPWTaiYu)v1gt5{yYl?{4fZqb^32^vzG`cfZSn;P8B&voixiJw7T0cCstI zX$`UD@p$1A{2i-IfI3mARRemGs+WgZJHiy2`t%JyFypcBYp3Ih{w}mO{VxDZK(xP^ z-fB$IxNTCj1)M&oKQ?a%0HOCxxqf{>aK{Nh%5K4lfn!(mG$> z?~UYq>(<-pGVE{(Vy6Y+A(I@Vxmh|T@a6B|8Oirv$6WaY6+6Bve2L$=fbH*<&Z^KDMTYVqN`8T?E0vk-;bJ^?ut@jo~!?W9Us!UHakT;3H zma`|RUC=wkF~;#)Jbn}L`o)&#;`03Hu;y!hMS5TeER{^gWdg?6Ytqrd@RxzSPf3ZiFWpd8I|$9 zp%_P52L~p6S$;;Nx-3>9D3Q`S?*Mi={0`vG85N$Y0Nzj;VHPbUSnSU~uEC>M#aXC& zc5jgH@jtwc8HJ<=82;AN5B^%{?Fb4T_r@J4eUAya#;S+Fy8P4fG-~dUWqM(aHN9!U zcur9~Spu4APNcv(1K37MmJ1OC)OlLv_<3zG@$GY&s_~+3YDz( zZr=P|UuIKKL~bLJ9_4QOK(lelnTOtNa#Cy#j?#)!!f|3jqp1XGe@Oo8`OILT`kXbs zt;HD4M)g4XK1bz(Mh2oOjQ~1YAzp70)l7}5vF};UbEr}W;X8Ze(|(0$P&mn`k|gK2 zL7lETagR?lEfjynML?6O@Bqt9*GLlTs5^&$+%TAW`n@nIS49el9}tvE1S`uZ)Je%xTVib}&Anw+T}S`|>u8jggV? zPGz3K=q;2(2}dl`h@}pf#@NPueNRc;*LPt<8pQ$ypiJQN?!?ABAtL8pCs1SoZeVvd zT+K{@4e0%TbYxWk&A!I`fNwNIQfbMFRQoZZhQr#a!V1D#RZ`K;r2_xMJEz81~WJw2AS!Ag|y~$7) z|IW9&Ntty2^%y8*{XRr#j0LebNvvhe78R!4Ghi!C#LGC$Y)b%V_h&pU87m2Ksd>J< z=Kh1sk>jeBq^X;*Aq9zk$YJwGMUgkxG2(8fmS5pleF$McbL_k0F7Sw+0#}@EQAm%| zu3U;#?|3?MXCCb3Ded?Lvv~&8jWB-Wsq2nyv3oIC0aW#F%6+TV1g=i7Au8JPMYk+< z=n)-VJkhs`$s-+)`<5D!re1}vGTvR3PTt9GAcg2`POu^oj;~zteE02kXh0AuH$#+$ z2zq!vW%jnuDAE!PiJ2xohA3CUR$i5T7t}4CF?*vFS|{7uCRR;KaM$$xhiGaDWV|A^ zd{@dHN&BVly}5@8_|r5F7@h5M;5rAFF5LKV(x|{i*MV^(M4ceh1Sdx#F*zMkjTjOo zHBp#B_I<{331!>Vm{i)IX#Drck}qo&11b)`+3e+8A!spSDT+WCfr zFBm@>2_|6hXQ|A+6O7CxnhR+iwZmkLxCivBYXuQoi)yu1CT6Y0*IBi3$i?fOiNy*3 zj;eMIQU0ymHBJT0WT@jtme`&hjs%}Ncny;CAcB43bP)-5t*nuY9LxWb-N#3^{+MLc zK-3zMBRI=+PaFJQPbQ!cEAqglW?shBIK=+)3!0PKIp{?e*om930Fv^0w_mrZV$viUV^= z8YI>jYJf?n+*e#jHtf ze#ouAPT-e@BrTLgdGsq5aYeupMEhmw{^Hu&r`2LU2td6S@P&5DMMCOePP$D>LLK=f-IvAgbd}sq;X*i=XrNoLU=xuiTif1K^+ZZ z6-z6Ii+XC!r+m`7$P8c9Ed%;iDLl2!dD<=R+r~k6fQ#S-*t@aXt!RCP63k6&-;M_a?Nuh&H+A{cjoq>Tb=*C+g<~9 zP%RWC@)}LJq~-%~27+cgwe)B_OFqs~-XwYD;WG+%H92tM4@4ZPD{*f%w1u~TIcltn z#u^5U#wj9PCWn4L(YNSQw#oKlTLn-%_Q*D}dn4lQ?L`K+liP9L8BqBZhsHttZiUP& z=;clu5C~TTWc}jnk86avjkf{jQ}?=;GaYSNO&8RDy4A^S@2+~f_wm6gLgYH}IUIIC34JCwNgUj)2xV&BiaNPlFMqwO<{9r%;GuAv}@Tc(JR6qkL@>PP^uU2kq zTsq8)Iy(*23Q(rgm|c*AC4JFGqu-UGCps?u^@*fss%o5NCn@v%N=;^5xlK-@BqKz4 zuOTJF2ZEc8Q$Qglwd$}g@c=zh(&I0{{)sd!FrvS7Z)mWp4E3x_0#hr_f_fi97z{Dv zQuGg(kD(NM%9`jnF@UVE?TCG1e&!wpw9UVHF@wl8$J{CNbVv&&WhNu)|DWEMQ`BHz zX#x^j^02JPE>M4TsJtr=5EPwH{_z#gNbvagJr(H=ecK|52g{#``AL!ML^8YG7G&Zm zPHf&EE+y2@2i|)|AG77;glf2CgAtBRnfQr$F{Afmh=KlC&G+@VJA!`2siEI*E*>X% zdsHV}25zI;?bu(O>5SqQt^T;lV!wFssI*R36kIiqFubOc>>!+rpxtb*J6E;M3b zeT^NCA4Xi$62S~(^d!BM8)~vYxKU2|&hr0@zZ^o68$hhGhwVPZW_3OwbBY*)4@>uE z;5h*}&LyiaH+b0!gwQ@)}Rx$X_n>~5++{DBIvdeGnk5uJjK4+JNCM|Uhibil?QbJ zlarU|&ELu84PYdUX(mCYyH5c>{eOXM0kzSCGE%0eK^QCD6nUoP0Rf2fwJhjNFkz-x zyzfmx%1(*Z*dIKyU=FHrT(53-5 zQsz_tuW4cWt+PGu>Q?KsD|%1q zb#1O-mLg~E0eMR`6D&~;5?#b_RmEpzRNYQ{i$xyms=xZH9wWVNOC#GVA`XtH2U*scLh$?v-ZL``a&)D`lcV1GOv^v6b}VhfSaeDW_JPj|Bz0 zv_kG+@a*>)uh_{Ez!zmm)jQ`7ux#UUH?QfjZR_xNCrgUZ$5jb9pn@@5beM_YL-(qF zw=Qnt{L6j%&n_S;LK=a|m}hHBJVEEo2B)I<(Z{$otE`a56aJpJYcvS6dsfmIBi7cB zxLAxpT6gYjW(Kcs!uYzOlwJc35=^d6b-a+pigC8ni3 z?A*3gs`LhfQhuM8t$bc38AK^Kc@1FBf_b$-q+?LU?{JIr?)V~T$fV|0g#y9Z(y}h+ zN+yn`2&FHRYlbn=U_`uxhfqOBn`8UMtw39ymcxe_>p7qAo=MAjM%Z&{!jqGK9ak={ z0aAa0Lo0G_8C2ElHn2Q$XEj)<{R|uvRnoD@MQqYhXBBi39Ni^C>d|{>0)YRpc4*~y zJEN)Ja{P4L7~e^hKP1JAodjVW>F+0ik*o$B@h^5rTz?CDDmfhb4{1t@9AnvDwp9%- z&xk*aHMag8H4tDt?pvX?p@&wn-r2H&5kY4jm&cpv9Wf*23+_!Cw$Mt%9Rl!3kNn#f zzRhf*ABdePH=ZV7UYh1j3>{tv49s%aOjysPuy90XoVs;=oC}Ck$5f>GbAhBiOxPhj zUD3iNb2H@8$UA9^yGlIQpu&ErnOY_2y8ImhX=$+$5vwqew#yF23W*5pKAK5!;URLX z?+D3)2Xh$%0N}-4(P;Y)nYnc)lrXuFq-ZF!ee6aL5!cn(kZ?m2Bw#5v4{J9>cB{J=2>}k-G@7Tf4P9XRZIC0! z2yBnK@&^K$KpHBj!Bb;1EL>=70`p+-yEvTSG3N_5KcAwjCt+gCk49vrg@V zmy+8?J1x{y_m$C)CAf?)Bvjzg`OBefa^o^tf=X<)BN$oaPnFPBt-v;keF*C!g#d=I zGQcPSXoE^bG;_H>b1*-Ggu=OM<7 z*3)=}eLDWE(xmR`AJnYCpx0hKB$?!GUoK0CW|NH-L?9hQLq|5i@(!&uRa|upeJZ3q zzoMps&jEj|sc>B4iO5*x?g29lgOUb=UEag51IH$&83j@Hgs}P+X%f)xL{$@ zyv`1CLE2Z1F(@ddEFQGi>{eIOW@PUU+>MSD!g&)iO#wj^C}eQlK~;{Y+EIC%qw7CL+C0B#$UBGHSJ~{>#w;v+E{c*CEKUCAAQsQ8LZF zkFJQVe?Z$?Qp;~L8j09#F0GQ;#wMAQhe~JcEG-JraD&t+xw_6;Jr}&2?gf1d&Q+hl zhl9%v_{;ercsD8!-H_|qcdfo0H#N>*X9!-dec z`@cGr;|mNWb)$&EVA{H=`w`Y*$f~MyRTYOvROgNKMcuG#v^UeKijwZ)hV)%&F=vS#=8A00W z2_h&n_||StlOo|JiEtiv^`I)ju40s z^>NSYr6@YSS`;wFfGf_tkYlre?cM5BJL;$k~+fi(Be0ea}T>WgNhwgup6H4C|3goDdJnO3YaPhDgEtGO=aAeRx954uj1d z%Tl#R$SY=4GXM9HL$v@nv=I7{fNMOGX?Sgcn8&+4H^mvdxW>#R27Rk}zg*IQe#e1Osl9ZC}n*Hf8<)_z-{;$>UDmE{`{UjQW;5*2o6 zQa>WD!^cw0OQeWPEUfh!9<>nO?WqlfUfb%wc+$=m5D%yTcm@O{KoQ;Est8m{Hha@d zuG+SUCB+}mf;`41A~$5CXEsS8wUe5GoYAb+6a-F_lqQOG0T0d6Oc5Br#m*p+W6ay) zXBq9eY_Nx7z`>jB;_gVS4P2TBP-w&`88Z~9FIsltW6SUIa_Mh@(c<<1TLIf z$gN)uW7`1)w^kg!CQmlMY9>C`!J#aX0*~Gt9QXi4Il*iFuio^-0-0oY>+3T`sHX(( zA3nW4#CvMbCHB5JI;|GpZARl?2v3s*P~{*Tly;s|^HQcbtNLe`h6e8tQ5(`$-RRY3 zSCu02r(kpV5_n=l)n#IM`8Rj3>Vc2)nR6({@KWGZ9mL@VpSW4NJpd^9y$jhth==h~ zhWKrn^f$L-MfI@WXd|>P`XUfxt~1`_pjP~LYgWD`Gd|@jUa(yY-7{4T$a0zo9ly^D zis~)|rygw0oQ*&KELB!$hD#ttTCuPS5f0otAYXhkjbo)ipkK&a#_H`MMxOOBKnYGH zz5=VkJ&bZxsG$);t=lPr?({a%+B9kcH*jj?RnO=d0m7MwRpbjkqA0XbN8hKKX{r*u z-e<}I;^QIfk6`uQ*7ln4g-ys_wH00!SKc%PZG~6pgD=>{5aXk}Q*+>%m9^GCa=JyW z5l}_0yw&I`_4z7!R5hj-^KHhI!d4v9jpM8_+vss)7YHJ{KTrSm;dg*pqo0U#~!v zqu_hXO$uD>l?K8ew-Q@Bg{f zZJ5co+tL(AQrUK2T1s}bP|llj7cA=ClHgZ@qwCWV!LuXrTLiakHBr;=|0ReLAC|gv zb@^ZrSY(h+GFJgK63Vk=?fjdf(4qiu6G<>R^Av6_)_0 z;#+=WBoqsswqQ-hG}m-BojwubPr#Nv0YhU^>}*J7xvEVEXh8x7FJxZ0-Bk{mrQ!i; z)K!)dcA;PT>SX5Sq*Nf}`Be?lHe^WbZ0%gB$Az=AzSI)`}q^) z0^9mZo!p`?$6aIShs&=S!vLFg91?-3e?!V_sz6t!RN9P~>D2~?lY!EOn*{4D!_^x9 zBUSyY)PXMShjU@*5{HpTIKtCtj1fKp?@lNORg#Bg ziaS=&QEd5B#IEmWpswl#Yl#rxeRcj$HA90lQ0nck1BLUdM=I4xF!lOGr6D8$y5yHB zDt0Znx<##S?f2T<-cwn-5suEZYu@?zH1KBI>n8kU82eE~mTd)vL6>>Q?6))y#B%0D zUj|hCVM&NC(ig<0?u2GJFV)WNuPi;uL~E1D<1-srVJlgIrfNEiwwm0*tcFbTmTaz6 zG@{+-6-qiNqWd3HBHR*q>1?7 zyufWwk~3;_;e-Uh^NBAbs{ao7l9^52DqQMT38Ki@u789R!F>oEK14)KMwQjX+JqU~ zC{X$iD1-#6T{~e?DV&e~;9{PL-Vgx;*z1N)?jw=kT6wSGdgoWz$Q;|PxmE z_=G~xZM2zSMg~KZP4CA}5r5P;z86KHoYjZ)1HmH@+6u=J6JPUpz+*lGm`8$Y)aHns zNU~(h&=5D5%Fv;z3<7@;#k4X!9*f;kqkhfF$>xaT)1ijLn8sV_<2m%;1*TL@UWakY zVSm?$5nr@H5^3il%r#0_F4Y{Xbfyz*H!=5W2i>bl$1dCJJut0>A*fzGJw0IxTu2iK zfhO3oMP(B!J}AnjoD!aiN`{ZNR4z6cwM z-$yZUqlU)7nM+pYX33|sc&lrD07k{M8o?MRgESXx-UbfEQ?kL{S|3O3D?$mm$~t`( zd?o1W94Fji%FPr4??U;b^9X61aw~SjKglpJj=RxI9%uVrXXpI~idZF}_TLZCGTo1w z{ha6y%A6)C;QFd3!Ij#r7BrA2^cze>FipO7!F7z4@7L0D0(G>OEl&Q%VcoQXh~32C z@IFRoU?19QVSpUn+9cP$Ss8pDP<(Sf-RZWDowm>vEMS1R$`i^sDPl?vC7>Rc>q7mD zP@Seizc@`teL?rcF6ow)Yyz>}o<%1-w{chcL`D?f7JxGR(wxAUOG^@6*=uIRNOQ|M z#u-#Ti^MzxN26#Lh#qIPGa-|b49?`g*P1&jMJ+HPioDgwVR@edbDyp#Bi^KO(C(TM zF5ElF(&cw?m8H7GCV7U-vC+g?Oi#AWixs~;tQuNEvA3`&xypYp+Tq)VPhMRy_eU$B z<3Au>C2}Ge6a3jXKyke@NcReyw*$+P(grVBmgFEuuWgFfUWHcHYlr|;tJ_ZET7aDR z@Kt z;!=q7yoIZ(*~=|gCZc(rd@;oq+G0^%ev-`KpyCi~WB$6QmLCA< ztnv|Z1N>eGgZ9**ka%fA_&W$7rS~p}0zpY5Ab-{NgW^_wCH;c^RXcVDR#t=XsZeAT zRUr_t#D>)sRS#Nj#)&!@X{%j{Ue%+awSP31u#qrer`+?_<-xs~CfT9T2fZ}YZ>)Z^lkb*uhEXH5MmMxT zR&rddcqne7a>wvk5TObslt_2m?(@l6ZSY^dKhhsV}kgqUEL zOCnW@aRv}$Q%J}jEioqr!E8ulO6#9n0W~~&IMOB}gW6V#2Xh#DHGpi?*9*z0*siHn z5qU*NY2HzJNdVUX29U!~YYdLz*k%H%-+r`VRKtcUA%r z2-%c|RMWr+VF}e3`Xa1cq7o2W1dW^nq?zEBz<4|sgxu%uCK9+f7-Z%R3s`$`5fu1| z(C@N8&>l30W=ZjGR3hC@&)s=V^K1&(9g-0tSdRa0j8FDY#pJxGrvU+gwl%7+k%LR= zc~G?a8+2y55%4$sP91kF`$-~9gN;0`mPkH>!ONh|;b;1^**&D#Vb-WzJ6(;{F<^Nl zu@-l+Dm7N!3Ch85_=H8WebFF8Pof>)CJt!NaNWS)n>mD*p^EoXZ^)vwz7R}Xp3P4* zG6g8qA&UA7Bbh3Xj6AN~!ocS47gEU$<-sD+RwO|yiw!G9E1+$4ok zr%!19t!&_;r5y#DUG0B#D_&|!Zc(d(uh$O2SwXGnTtY+Z4biP1?+VSm-m)%1=5t?r z^^CPT8#iwA47A3*BY)rH&sITzm%ZoBmIyz{K@6}e?Zx~ zinEY=>H7LA9hXyYi6wS$DnSC96#zg-VWK4+GSHR5oa_r!M$WkQl60}0PxM%1VKJzh z!FEakwr1Z7A@>Mkn813wojf|+Qs1#5e6wrpsvsgnmP@#vk6hZYckBM*CD{3HWt znQj*V0x=n3$NY$-ibBkzIDAd0ZqIg_wG#?JjlEawnv)%p6JT{EREdb$72bf9L-uoX(9w5L5zub?y2=j@lW9MI}YU_fRcmU7zGGlZc`~MdM_$Ujrq0C&6dp4O# zd$NUTaL{%VYeecgArWJcoR*V^XI@-4$S>&8M?NOocOrJ@x2CMwWv^VEiPh-mArd*2oy;b5D8bPcJc-hrhQVZ2P+-fuv|5?dZwk4+R#KV>J z4`YJ?z|t*?W8*=VtWYJiqf#%=d}e?}y(6m}M4N;QbiiamjCX)LmMEUD4R{BJLYlL7 zu^R=Ga}u5!`lniAVP?L3JqJ8ci+XW@NVouMWW_#Oq|Gzq5U$^e|JL zx+}k;GYHb_4Qw8RF~-DeulxX?;ix?=g)Qj^YU2k=&wm8H7?KrdF=$3&aHOUI0@Zos zsh(Yg)OEVt$F?W$EfsxOwb~@l{I<@$LX1Ux7lh7BrRJVM96S^Y`hJ4qm&}!$yV5mS zZMqo=3XI^(jvhA})9Svx&D6M#MH-VEJ9j~BYn28b`(k!iWv+uPDkE?4vL6(`@s6 z5y}Ah-nEM9RkeZc=G~}7pZmc@9uwI$5QU7dy%16gUP*?Al9LMZHhnDsO1N6EYmtj5 zwDG<7c1F>%Hpr@$d|mec0m(w$=l2+5Dh^_Uo{4hPXD0=@nj^+dxOlEk;Hj>ab6Ar$ zTuh`sz{7+AM1~vCTlKq-o4_Jk^{AfAm-qzm;H8&u{am@bF%{bbFzGVV1GJU6nebOO zdRO10kj{qD$Fh^*0z`(%3 zz`($us;b6;bSg~QRy5PJ=<+|!RvI+Ck}`T}hW2 zg#b^o0jvSB0XpJ34EN|z$d82lFOsjh)|mA2G}nBlQRSa-f0)@56t2#Mrja3Mae^z{ zpXZ6y(WF>fn3n*jdC>vz#pAii(Ti?Tb*KqT)TTue^+^=O$L9piBcd-VCyLSypLRT_T5qqz{9OpfY!GG)iH3i!Y8i;jUcN<1ci5(d1h?{p!?8#M@m) zX5ipphz$--D27@~P}#CJ-X_IRqB23DA#h>PDh&ucqtiQeqHWu*Cb5LS{x`yL8e3=N zc9h2j@ZJ8z{uv|2Izs6H-ss0!)_4BP5!cpg-AkjS)6ydP|2V4S{|~kx=hR~AL{#`@5=m7v@1F1_Xm##2GlY)z z$6-EBYC5*+XbLbmcPAz+L7j?GyF~GC{IeSr*+XuQUeUVjvhP0eLxzS9#V32#-;)!k zmz?NnTjtlKdYLm)E;hOz%dT-!uR^p=tsibpZl{A5Lhr;wfIR^9Jgw*Y#||_2=$+=A zw{baTl$RD_UILtTfT&vJ^HSXOj$$SZC@k7BJhl{dyDYoCz0=%0%ISP78IW7DT^2n( z>-kzc9M9u)orXXfnbws%&w=JYXUDg$rwk7a4wVJr&Xf)k5SGiNA>yG_7%U8z?sg`% z19YAj2%5q3Xj=5QYa+;cOY;yMhwe}C zrd3JM`v*S~6tL!z5cLfzI4tbQ7;R;ZU6)4$t~m=r=ui)Hw>IAfvnP6vD?uTFZWtd( zY91YylxmNDAun<`&Ogo1Y@IfOz6!x;pa%qwunOoGqc1Q3*{ zi{ApZ(Q@(Wn$0K`g5e=ga-<1P(_4_Lq%&of{*EPeTKs7~O<*f}WzG2I%=Yv&73hO% ztd%O{`sY@N_Bz*_rlpt`?Lp>G%UonSc|4r;tk*wQ%`l&~8u^dwfDE^FxDG2sEsV%g z6iJ&&F~9hoCa1XugQ0w3{t0DV3#8#Q7q%jipc728P$&>?y~he#RaRe!8cTZ1K0>9P z6g!1Gp>U~y0+lZPDs9v@wj-RG`H*Q+kBW@r=zy8+9!hefHfkNDD5`mMsyn>wYFGeu zIK3M^LTjydLx%*l%7V!RMTQ|s{pFFuHJLGV7x_XJsl?C2rUgmDM6ps~c2gmdRFjMR zec4i#M30dP)oEUtBAB&ch~K9-6Nw@TwdR=#t4MrndPSO0bop(TYM~Mdt4m=MxVs9I z7VN@iEmTFSL?jEIU_3!EuG|VsE_JQuvd7C?v6u~jLTi9yBik}e4Yg5^nv$dfAgJ~9 zi+`>MDUQQ{m`j0+Z$II{avS7(Ul4r3noSQFeXr-1AlbbK+w`mqZ%TOxE<{I)f53qV z#uDTK5S}V~8~Ey6myfKBZFwm7J(C;M7WPEcGR+a(OgI>3-Mll|X)@Gc$%$PqJ8=_1 zPLKU_Lu-2PTXSht=Mi9F@C_I&5|vBDgfjUG1p=cyOdK2_u!la1qPOxF@yCjqB+36b*lZOfI6gOUy&=jHg&d?Mk@SLU&yJu$* z;DhP8+uao63`eF-_EuAq&NP2;x;e)*0 zD<+pi=`gE$Xgr~?xF(1esz~005N(mYoJV~SpaUR}2jVLCaVmJ3xldp}xRi@g&CQG9 zB(f*Q#D!E4{g0cJ9TF`()4FNWb}O04>rrgI%=TFH^_r=akFrf=xhza6_=f+hz2C|o z>fJWBWB{!T9!!Gv`XDXA>mC|K>ouf?WmuHT#>kNEar7*d%u9?tx*HC`#w_+T&z}oK z9oa_i@K|71`MDC(!6uDV29>B0X2g9dk$tycH6&pkmkr^8(xv(KSeTto<>D+3fd)bvbsX3UaX7jzV9hApGRdBT5jADSS z*c@cxE7=}TjK$e(XoJy+Vl8bXnI=rjV<0GeBjyB!MhsO0wHhdd`csT~<*-kXU(ju+ zOlUbCbj`WbAMkd*SOf(u!2*Wnkz(@p>=T&=q56?tOpT|MKzKBS8n5Ae=epo22E(Bw zVF??LZ0n-~g?rQMB*B3y`>daHOyT=mx$-uG){_?ui1u7_1Qfcp83dD($+&E%iCQB} z6stkDk&;F-iP8Q*myiOCq0w|1turB*1LI^(`p~{B5ey8 z6tkYlfJ=0)y3Z{Vrad1e9&IFI><`q;YIkg~YdzQ!br`bo1ir&IVO)tj%-HPwqDT|T zBC!RhS}GgZ3wL`NCD!9B{pt)naQx8RvMaUSZalo39qTu-C;xq3mm59iCm)83bcuQZ z@o_6Uo`D7ce;rjRj*b#0Qh*(Fe7`vlsUC~#Xz$^de7hn4K2N!Dz8>v zp^)s}IjBs+ZoV~Fy0d&)BLu;Duw1jY&b40LEE3|&H~?+NKc1Anaq4r4jyH@efvp&)&MxgY#6UPeNP;L8#MQ;1Wq}Q2gw`;qOdaUq3UywB4P`J{d zQ8OVNpxX77x&r8+vMXpbR;0xM>#O_<;Xo?zVDXc4E146d>&Qd0L1KGiRfuQ;-8DH; zlDP5~iF3sOfr|LT?TiN0AarW86wE$d9#IBn+XwqmLLfHbySTp0t=RKrM>D<*y?1Ty zgfyx9Z(Qoe3j;OUn-*t~;HyP2xEgAWwSd`2qE!bOd@3{EvtY_or#`7XSN!&|ioCf+ zn7QMFdqp(pZgEWVjx75tVgs){ z)7i7MFFKr8r8ECRd!>^Imq>mn8@@+DVR&@Ex19yb&L!$YHjV;;Bs4D#!Wt+Hcy(lc%G>cply@ieNlgQ0D4nXH`rp|pY!iHjd_zeFnRS#U}<*uoX&2WiVP$@1CTHaxptH% zpuqGuY{XK22NP)VYS00KeIu&kZ<)P(p@ph;ZK6N`ZuP}WGapxj4l?wClQneqoT~s_ zXJt1ESQ_#GbQPB$zF`)nv?B!rI=`@Be^( zb+7sv&RUmvfoKW3$?CEZ)e{Xq@o!bXs%YLiO>Vv^h-*z9v*w4&%T!3 zHsk)wgbyU4M|&K?a+kw>hvpl4Y6TzKA{gjnOtK*fTh?xRtMgU6d@~EpvH)=w>QOM| zA-0zTWkVbWaN7V7k>$iGr+R2eMaLH&Ru!6g}Wzg7ZKpqc&1yh2c983#s z!+K{FM|JX}8*C*LJr^q5bB24fS}0eO@MfiPNi~=_O~1INI=LA`H4&eKRI!8ERV5E4 z`t;0Xo-qUtDAp8%T_6Zeig^ddPNyL--lv+0p`PcsY0ZlReuAYWe_a(6a5vObQl3tj zMc5ZRYR?x#f#+H|^5#Dmh3;aMyNdThIyFkR_)99SnNS^?q;mH=&deDGgqRMN&;j%_ zX)Wj&0>ljR@u}LS9W0JhJ$r!hDwyLFXeV`B&w%0PO4uPdAa9zwSdI!-tnoYc`(5zE zUMgj2kh5$~4CQY`mLFbu+u$~>30WYzhd!%?ExI75FgI5CsvHTl?4DWWj(dwzj|iE%T?5ySOD= zNz#9K@IFK`GV?sR)a$I=09Ju9I3d}8oDLi&_1ivJX4WJRzM+Kwn*Ia%*nmMpM&0sm zQ+eC1B|Y0!O*ihRm{i=ru!%`BIGN+5f)o_8MMa4e+aC=7<~bpnf*mL%0!=z+rSDMQ zLtij?&Z%A^7(;e|LhPMsMZh^B#8pFaW4~BTC@I$WR)W^+0H^Mpu7|`Ht z;JtMWRP=42su(Z|Yr(3(hg)wokH5eGeNvEuga z)jTauSF50#*H|5Vf8dw~n+#v3obe>mOq!N0c2S4DydnQ$t_qsZT)db9!q8Sl7hA)d z1Q2#Gjt@iKQT?#&8(cezw}vP;Vf6M~OeABA1ViNl2_j!X zASduRH3{cHZ63?%9^SO-bdckNqlQ zUS9fW$PtECN5AytlDI!ohJKJLTq~Sb4cTM+S#k$r+#E&GJVctP+ECH^ON(Kd+r87A zCJ$Ii#A)0kMb1eQ3T*)5CMdokvM=42@z#C`r#$wKv-aGUnQ9_K$95FF8lBO_f+BnJO zn~6-b?3x>PB%%%RjY@ULlU@-PiAhqo3{!7D@>A27bDREy0(Ri^r>Mc`ZQb}TXVWRQ zd5bb^1NRTTEBw|S?a=D*&ic+px;P}kIemTTa)19m1&YM}SAa5*>+eUUkGmYw?`}t% zn73T$pk5wUuHi>yVkbb52=`;8W24Nm3;pJVY2 z%I%jYNZb50Xk5lP{(2!Ca-9Hm@`(WP_rn1&*ffd9U|KEm`Qi=s;@^Q_wRxnvW(qQE zS_QBbotLwKfR8}mQW@(PM%GfoMV5?~I=#apLjKb-I>rREgIbwL0w~gzVh--3BKTMU z+KZ`V6%(yr6$gq&I#bz;+R*uyaskMeM+#~IJ(=PN=~IT#vaa*wN;Osk)(jWh5?V^S z;npICMjxv|ZMCJS+tHH#&0lUi>lc4|8Wt1>V*WgEnH+ak!9aSV)F80G{A7Jyw7>OOz<1 z?zOX#z&7JVLfy$<;$YV3Ji|piUdEPl?C5Feo(=~K}KXQ-PC#NU%4$eanFdjZ$jY`Z9^9!`MA$OjLCmvuJC1iho@5}t8 z8~mmoVy5q~snIedoRb?Ew61_oWrfcK(fmmU7i3=*+q2JEw^ISa>)Tk*ChHc%dcE6n ztSnLUU9xXZBcGb@(RRkpKJFmOfBuyS`CBK&nr~m<`EP5@u=4Gz+ZkeBHOXJhF3`8oTCMQ@+z75k@{0>nwB~cwh*ZqBjz>9xQ+mH$oHT#N~VU z7zdOavXpAs`zg;Sj53XDyh;mP8crtauUNp3JJ61>m;{Mu7@F7*b*0lOPk$s9DORe0 zofuusK+EQBu+11jmu&`@K*}>nM=i4SB~pc60f=#ZE64*QhRN>Pj1m~Y`Ug!%J~coe+r#12?PZe-S$FDV{2&UdG}Dx#ce6XA#hewG%evXw7B)04 zt$~m6>B4KirUoVZNHGWOufhEtqxCjjxSH$8V@*J^c=Gb9HYnoi0VT-g$~dum-pkkr7xtV#4(*Q&_y?VJ=T1Iq5U@baSd{wxxCXVu~$x0MAI3N4CGb?bO}RuJBu= zP<~~}Dt>W6@|zLqw~_*Bw>BV?WcU!5xONGqLKhD;n+?T1Ejym$Th|tc34eB#2~0EO zns?4$WjdR*KohU*K!KPGgFIJkZ=TGyB%-bh(uM+$FYt;X_}Ut;00jqbCrtf*)dh%7rh(>`PM|m zosG?z34lk!41rtZP+y(M64c0O$)};lrcL_z-HW+AOjCIlZ(CL8uS?cESW zDn?U@87&R>u;!|>!xb@YG<3SSJzqgBi5A5KM~y4HA)S@_wv+5XH7`ksi3t7A?AOj^ z-&rnpy)!Sn5Ki*O7TN`p)GNBr0eW=3JFJBS<1sVkoZ>LqCW@w8n!s{D;d)=vXph||Z?#8t+%EiXgVbt8Eb*Tpsu@}O;{i-4v{Z`mAlh>t&|W6Dp+X}*An`t#ok^m>l-B&36bc5 zK<;o*eML?f)Eult5M*-ng6a<2{!}=%H1YAM^(LATBZ_AVpq?@)?-5?BpH>qqY8o%N zt^m;@_d@PG_s>U*l=>nbXNQOXDxV!1s2+W%*h0xk_`?@wM#zkbk_as^g7mBF-_BhRE1QvF&Q{@jz1i_ph`CAVqbh}DA1rhF&ey(9| zc{Dk#e5PMbGY^lR@&IX{p=z*|!c4z|C-E}87dzkGP-9OYzD*?8|2ZqJ9gCEzFp3`~ z>oUrWQqiJst_=>?j(=4$=Il!H3ozTp*TJrp1BxDxT7NNm{w9 zEt>n`(_JTB34QUWwBLUm^B+i9T*T5COM@&Ol%>|QEDF4LKmrBgJfwYD;$znL_`60& z+v{DxXvKz2z5f)+Bc3z;?WTcev0OwpdM`ecqCPtvz>dfQpX1rcH>^giMm^f}a492a zt=>dl$BWYb`GKJaQ=tYOKN-4^k+umJs`VQifMClBHESaufEw0|Lz_wwVCSq~5d~|B zfEgsO4M$+`J=(1mQ2_A`EjS7wgJJtsgK^M;K*Yott=p&CcXb zr28Op>4c%;L%6*b^$>MBFHVu3=z7lxo%ab}wUn=jjpEJ7t$O^H9D&yqzT`+%GZ|)} z1g^mN78mlCcuNE3>o&WAsymn&xQDEOF)IhHrzde68fpSLmsmruQcjzUoH;Qb*WbW0whoB3%W@ z{ZZ3H(4zHU)4+TSPaMP>tYdr>3*-3ciP;$T`!5D1pzOq0%8bHj)EedP44Rq4tAy2Z zMk6E|<($~=BUR6U1(1u<76mUp=v{eS*NBt$o-FIG_V2I6Pqqm6o$oK!n+j_q^?sLK z;ExY0P*=!G)9Qk%k8rr)gnWX@sPxw$<|c#FP%Br7C>!n$LozHm!hH|DD^qpUjr_g{ zyKOs=r{DOS|8+oLqhnUw8U^Gw@lJ%o3=_}Pit)VjT?-QVruH$q6ZL5=a4=m7L?Q^N z=XT(0Jhm7)f25;_#aYU+E30wFj=ky@37V?u#q&7r^2Z+9a2Y#&y>8J^KRpAs|H* zL0|nZ@b&`0lT6**KrI@h(1K+Q6CuQz+RDY8V2#o_%z&RW2-lytJZT8*NbmO#peK_A zJ(IA9ZE^w{gv+tok_NW^kR?!fM{lC!H(J(K~$$ znfy83rpJ%nyVGU3v%MJ*=$1I8Y2mW^$sl4~$lgky%#tH|sJ;_;s6C}z=OIlb1tgV( zYlIrTe+s&c5!6Tp#u{XIU;&mv3%_!vh_zS^y!b-KkbZO3)VVH9!MT>do)QzQW!`0BDJ;wOU)EqJgAH+ z5KUO1Qs+731<~CH8@NU2&=S;=|>Wex(Q>Lms6e(ZBFRi1F+h#2T*MAeVpeH<#9(rWWVdm?p zNbyNItV3mK^y99SPa4slFEJ2^x(U^yRWvUM2n9gvyl18d^Caq4ilf7UY*mDq2QEwz zY+eDj7iU5b6G4Vf-Pl#x>Zzh}NKAZIHb+>x@MrO%p`lcimXTh5lkb$hf0N33h-jfp zHBy}|dIqFn;Z0B}+=F1#I!c?1`O)N%3Jp)WzlH>W61Bt2{-0Crb^~}2j8F3{wtB@` zBq>O>fcjyFqbJ_=hCcGaTSzq0#40ybR<%G1HecBL7dK$DRInOuiP{EBJGAK_aKR6u zs@Gl&N_TJm3OE+K7XYsXjLjib6kwhf`S0nT6w?l$iwE2tzEE@JS(U6MkBR{R0*Ui| znS85)Jpg#$aNu5q2zYNPLP%ar6TlMb`C*~|;lw7g1;#zV+rgK$?+xLrowM03+TgGXM&YLyC0WKM)cCgS)`om1Cyx|A_1JtpZoWs4qfS)_0&3 zqzPu)MZ~?_oS?{XzhV2+X{lQh;)LfpJ)!H7pLPErIEk=eMEOx0dwzHoMP5+4Hj6~M zcDiK>cK(fak`553@%$E{yiWrYKRxLtx*L98p}s&x5PmDY`4KRaf{aq6$?ltr^~WAY z1+gkaaRbAF*Vei_2EZByO-A&yAkH}}UsS*IGN`eYM z8W^azVip+;sC^5lll@vvl+sZf#TkO|)^?`|YC2_1;*LTXFhqS<0yG8tZ1}2cr-iTx zDY2P%!aRitDDvH_Kz>0c4>&L@YCt!RZ;%OVP$EZRV2v&!ETiB0e*;W7Oism^4;KL4 z0FznMvQPmuX(p!QNJ9u8aYtZ^s!jmR=G^SS2SjD9$Vh^iz! zo9-e$_{=xHh=>#94UYe_6$vvajKz6lI-#-Do~0<-;?IaMteqjwUb3(;eorP^ePOCs z*M;cS4+V86F-JY0m~LZZKl%y`bYSXBtLG0F)O}5op16?27o{vm)V@j9{Qjf;9VIsl z44PUv;<=oEXvICmn>mYS4H^@rGM5;Zh4eTH@ZgPy1?y{=-~9w#rT%M1tH;jqMp&}b z{Yj)qjyX`pI6!pb*UTVe(Gg`kL1?J5RaI-W0+~UoIO!U;k}8CBEfT;QtZa8R?f8$f zCoz?TJhv`*;QNPwhDW3g3-kojG}YLMYdVA!Qny{0KJA|}cSFo2-7Jf~q~Rd{%NS24 zva_PY6(T#W628&&s^XHB!g#+6BN{`*aayV{eMXU(-Iu9d3bA-#sNc$HfAk;~ereJZ z4>cgF_C&f<^q}HgT-XH)2H;!<8kBtRbpZ)a2Yn#Tqt2r)+~cnFCJ=fg^W3U^U1@qj z(b$sN?3?u&Ion&;2f9kKaH$=%F;U}a7-w5rJkGu@H`_Nka*hOWi-I7mW0Ok0W+zGxkjYSSI=s(u*$+acQM@3ExEB&r zY}}bKSr^!h?g{brXQoOv>IZQ}=`VcdGFF(CzIDvXWcDpK$<3h0Czf8E1Xc+sx)NqXwnXDmIIR@&O~$rBa}gFl}@Jr^cnWrL9u zW6ie_h%1nTccB|_fHjR^G%ADU&BoJaa%pl7Sy=WztMyHQG!`e#{TSw`|FLfPS#Ra1nLx;g(p@Hm9s#2Y zow?yGGgNbv^&mIUMo+OUAx@4Na7LKinm0w?L0fAc(C9;@;+`7$07|>azKhQ`pdrht zvy9AQX`2`lcBSTVp0qKiYCv9VZIG(x4sGh=VCIVgE*{(liw*wEHSpW5$r>V-0hrOt zPAcRbL6PEwzh&=fMAG+%y=s3U&RI4#F}z2Y&_S6X5Igy~qV(k=$k@JPi{@&xjPZ(^ zR6}G+b~vH`G{bZGizN$Lg;^J> zJ^r@GT5kdcwfO_uTq6duaH(9f5DSRv>0{!Wlh6!U>joebQvVvNW*0rG@<&U5m>nE| z1#}^x=RP_iU9+aCVX09In2sHbkgzY3VC@g4SyW+SX9)=>PBL(LR7^Kan+jWkhyLaR z@!6ZMDUM618)oTW{N{hL{who^hnpj!bR4S+TN@mo7$6sPjXbCLZy(Q8tZhhSg{ zf6UZQkcR%gH_Jg#MIKOmoyujooV9vYIyWTYOu94c3v2-L)Nf9|M}4~zVa%v6gShj^ z-<|KorD2A;&5*uV_G#|TYk95lklNNm!W+`RWpA?H7*0yv4lau(q7LjfmvjB-$sU>o z*V&b5JI%X};wBwKG;wQF|^vri@l-zgGlcu)bSN0EbPL$QcY7&Y9&p`*X zE>xRI53jDOJw=6tc(PVm{&iCTdUSoEAjHT?)?zhZl&F5Uedjl1L3g-~#aYt39Cn(* zP05?fuEy$^laZz%-csd$$jJ%Tt4&y-OI>(Q*$z-y&4yAHatA98sUFkgjz5H`|ICoe z*ym~uiLUQNF-%6b^UqbK;A$&Ut*Ri?je7JYG`H*>aj5 z>SC1!`0tK&IKS-z*%fu}N>ll*&V3hp*V+;i>};~2NiZ+m`72NNeD`8xAQM=QIj3*> zrJN(rR~Wl^pqsGSxR_vdu_L7~M9~e`^-W~Xnw7>$LyGr(|3i>91@so{z@_Y#&kqW)g(rag zoAEp|oHSr|9hG&Ssqu0^PV^Cv7_% zwrquqq;z#`fDi0?zIg82{GZsyxGNC($N9l_zNj87oywPd&Mi^>65Folgme(=hKi9g zR2(*~5&rhn2F%jW`k(`ny#1DS+-&}mH)3xe3_6*FW)6FMv3bgKJV5Z2rqfmz^xe(0 z3A;LVIz8qm%=R6Z(b%CuW82>jw+n$J;Ot05)3D3$($)ZLuS5Q{895Tb+32Dv!f4qG z$xbqOTb>9o#rSirEECH*cy$z~S~D0{3RH{kS4~aVbgC(*-h7x_zPRc==}_bkcRjDi zN788MBU{UbQ-;Nn8WAFJ*e`%J>%*lB(Hwr1xgMe%aJ|!GW`Ul{Rt-s(=d%=XZy+MX zH)%uRrc5rOBjET2;VFTwcNqHijH~aF?slz7QdZ{u_9kb&f7 zu;5)wNdb6*9DtjzBOz#{+FnDAwB zsOmVO7-NGQrGGC<$SFj4qQpZwF z{Sh%B>vy)UtnO~Ke4FRD#^gT}9zjpAj9$}`ePw3!qpg0%^byHc^FqbnphH@`NF?b| zQ~N{|1Ynp7-(>AWiSz#i+LCo8H|``9Q%Ga5J@<`_%`jM*=tn^=!gJ(WfJU1DKF!lHr?cfOhnubKsQb#;VT5J0CMqAvx`6@j(vlA16IRD!m;fi)ii1Dm%!Jr0!nyp{1Cep&{H@dc{s zbyXON$7Fmb0}+b*NVnQQXAFkJt0@sjlD=#W&_w4Nawf2`lM^`?8=fr_tbtBwe_Ubo z3`We*)mjVbyF7ZQRHO+X#tf$*^?Lc(H+HqB5}M5gm7?Nnf!sz_}z3KP?3I7RKV*}*a10NceWM;`d07)1jf+-^Sv=+KjsP1Xf zVEpf4bYcwJDkkw(SoFRTlammtxL;)d&^PMci7$sr!?lC+6e4)r0*IuUXxkxd)C7NJ zum`ef9R#(~rY1T{zTs&cLoCMwz_5em`LjoKe%e+~L03h?c*8s?eFX%=Io$tVv*dB& z5kVMeLgwGS%t0!?Qb5AGdZCNCL)AMyJ_1|nSt_Kl?ENdW+}UYOvw(>XcnC% z?$u-E9$p^C2G^C_#9}zG4e2*?yQ(^b1FlqX{&mJ9{1^1!r%w7)ouHH~{y`t`44Ad9 z-qvVPaQ6G}KzP!qGM=r26j%K}(*e?8EEu*`tTJ4dDSCu(_S&zv@yBgz<+hl&YR})+ z8jSVRMb@Jn668SJ*nG@Th<0Ij$^a8N0x1}iAm`y6(hEMBFnQu!<&{%qR=1JEXPFyf zNsyOmIBnHEUlb19h;uQ06&`S-anS(#j@5+CGT!KEM-5(TMW%k0IF-%Uw#JRR-$e@a zJ*%qs)jtdk2Iys5&(!omD;maOuYKi^H;f3-s;lBM^B&sC1)6_+Rd97ye=ReZO{2F= zT205sd}4BzkbBg5Mv^c=Uo&5~{@WjzpfeXD@4-sId-T(Q86c2fV)f@B%48gws&e+5ck?OF`E0T#Vixsyd7DH?s9ydhoDI!7W$I}u-y^Gp@#G!I*I3URS-KW11u}hOFEmZ zl$LJ9Z5z+d&a1G`GK0CoBGI&Xe0fIhH5lIqTH%hogBa4P_!D=Rh(!hS)}bwR-ZqK)cLh0EMy*<`cY<0x)oH;awB1sE{8Ew=Zkl^z1Go62h1 zi6^cfh%Xjh%vmg>mNQ{a@Z^uj1frI~tl1MXI0HC2$(`mP0+&H1iNFz8ue>XPMPZXv ze#ap>mKZ*yo&FmtCMUAzxl6soK5;Lv!-^jpZ`=4gXmcJ1qu^epx+tUzOK4)z2GoxN zUfRc^kpSCApCVGe=GJjPS-nSuuqzTV5-qWD@)gfgc{z2yat*(za~C^kJVxpl(=gXT z&dSJ(Z)Nji-zn$38g}5@RuEEE`*>k6etdpTqxL(;yndcTOovxzSo^hWQz^4&7Y*+3 z2y}T6^U6dcsF>a&DKN5J^bmvs4lv5a;&-RXs%zhw^+Wp_oyyhl(5waxeClK*Mc^YA z?r{Qzeg5G)$tTHimqBiwA4WhNB>mVTUYj{8P0XNbasIL(&V=Hpn5*;H0&t4W>n(Nuj=p8vOXB-5CU1o%qInYr^nB=R~($@QMQ zbc@3{pZ_KV4Cp&25BzH)3!TWL?zMo+zSeaYrx(FduK(uQ;4;KP)LQh_;Y&J%=6PHvv=!H9$KN7FRjyEu1p3srR)Zh6T-I!-;A{DmT7ZdX2NoGS zp|UHLk4ikXD8Kp#M}5ICnP`jil}NnWYw_9V^vNlrgg#<+?F1Fy@8@9=#2>E6^adr{ zQ40XX0srEMo~Pm@Jp^CTVHc&9QDsia-;5$~I^!G;_EjX5`mx`F;$g)ST~$bA26`4E zP+iqpVOlVl>s0B}l6gs^T^b^x^>(X|oQK8r57m>_=({tDFJSpql9&bvjtQ_GX3EGP z%2b9?d{bCc^f3u;_J5Oc_w`&9LAroq$}0HVMReb8B7Qz%{E9-(4L-Et}t#sp-KC4kEEYq%Oz1b(QK zO{HHAHMz}R{!3#SIT{S%Z+ee9?!ds=^r~A6yxv1OZvsob;>jk|@k*qym^V;zJd!o%a08PsaVF6q-O*(^hg2T_;^ zf$>k(8B`Tzz6?t#cbK8%CY!&!U2CJvY*A7@Sx`3*57R{xf;I4U9_J zaN}=sd{Ux*Y~?ePK5{PLXJtluD2! zg9VZqDN{a6N|F6y$#0}S3TcD}^A@ee^O2jz##c>f(3KIc@!F|PDB*VsKa}b|K;cFm zUcXX3bS2_|Ga5f=63ez)gl%o*w{0z%hm8DHqRXF9F|cd^W7w#H4;y5YOP)ToLdmv; zuOZ#tU2@wZVV;69?g(u20(!OJB0w-lXxzZSz`#H!BO(Gz3JQTed2IqIbtBtayQvtx z%+}JDyZgM?Vz4|thV8!&RlOX=$Hxb)7e~-4mo76Z163;m7XlUnmF3C@&Shehq==p1 zWCsTd2FuboNUQ}AnJgs}!UM8t=xC1!iHXgFLK`F=6XlX0HWV3fW~z;)$u&ckgF}Or zVYozCn~cFcNI;W}nL#5p0?F8OG{91jtxc}7A;MCCxiDmi%K@L}as~!=Gcfe@Nqnm+ zWi_dk)x1ojG=Wea7+bJm-UcTMnM^4E`X^sM`}vaH`$G{2cTSi7;qt=bLitJ z4*rr$O3I%m6c4w3vH3~TrwIRx&s;PTn6H!#gM?b1+Ms55+nMz4T;na?>X$qXPThUd z8V^}43KIq^GWAe$P~F<)CkpBL+-q(nw_R&Y3-TJvfJ+8~EWeN!n@om61-wOJLKD=t zj^1F$`?lQPAeu2Z9101|TbKwd0YoNaRo*il&nmczx0LdTL}mdMwjxm?2#^H;sFYJ- zD?UR&aFFq`X+l;FIPieNgwb^v_5>6R&&gaKJR12OSnVIgOWOv&kbe(79Y=#@Y366& zTZAtCZ~t+O&DLktdAgL9yzD^*!>1wddiVNvkxbcj@J!O~yzYKJ7e+GLboJjs@4Do5 zU80oYe2s>;6)rD%z1{z`XPsx$+&^$67{31oow@ULt)VqfX+?!a0jj8|m|1>`NwlM> z&NiPk^zLGpQuqlV7~Xo|OmKI4e@n5mCv;r;1j>uZrmq{*vH6oqrx$*P!};!F5=p>> zSjXkY12y)h!_8YsmNRJad47YQ49o(dtTGa0q$#8ejD+nCg6UBykkIYAp^&{o7D+n9Ek@*A& zq=5MvYeRs9h9Qe|;t0fgqy%oQcO3*n>0&(?z>p^-9x~Tqa2angI__@ULf-kI>?6j) zainq-zhZU_IZn%-?Z*RwWbdYdhE>mO?iPJ_o^#(ReUZ`WIKFv)(#na}IocU&RmJ;$ z@^)sP7n|OD@4eTrVkJTnUn#>a4P^D2G)4v=IyrV$v|#|N&S`<@KW&OWE!s@bS2I^B z-p6C_QdV=*7?G5(s+mHTcR) znWO+CJ&Wgb1QBVC&iPl*2G_4aEbw9XaGQbM`R#dOm!E;SXc{yZiUb+bAkm5z)1-!J zxAzThZe^tudCv+YZhecdq_}>)bK5Fg^OStUB*ut=E5;~FkTKV>dQsCH)EV`0b>^a^ zVHICF?`W}k12bwLA2PYFzViBb6s5=2E4%M7`b)o9&ug-0banXmckA0fut zhmC`jRjrd!Me*sFL1eM2RaIxsmf|u6GD>Q6T&yq9t5L*PDhLg>Z_exgcJmn0c`OcW zLEtJ#aN{;K7V^yn=6zce@&ujl&Ia-ZOs*ISd|8NXyMsw=5AMV9oetQ$1bY~UogT5L zUi;N{8sj@=FbqT7buimIR_&3c?3|sj2D>vT+d64jSSc`$V}E?Ly;6y3nC)!UGzgk^ z>@anSt9(XWib?(x2RVR6U$h=^Fa z7?3m=p?TLA6`{K{(Azq%e)9S|=+5)H^Su2o+jsYzrL_{f8`hzBSP&S9 zjKt<19%=PB^icfoBb^tDtwg#Bk+wk!hp@yyN>{U&dYYtNk(}5;y`2$#Y6-I)lyYW+LO1|aVg}R4))z3O~}Ur?|2KONFqQ0GSCYZ zlJE0%j&>3Kjg*FbR-f^8v3Hw+>L)h20V0nX3qh#ju<-M-oqj&k3nS=s%=aub&!8yk z@Fj?}lvn2xw_l@$Pse6`i8STE^_1c3Zz-N$c=i$ma3)^D6>G5QiBZMZVdk941p_*Y^t}j+C)A;F%>_*F0$qr% z1f`{eEmXhm^b_d4g?iixFH%O^=1f1YfAbTE!Qe?`l%Q9sl#`TEBsq?w_`28pNE}L` zySl4W#@@N;NBev}A-DKoXy{M2`^N(Od>gd*eERnJbf8|~`*2_P={^gea9e16CITHD zb)L6L`mwy7haLPNy-N##Q^()_Adno%&-)0@pgh( zmga#IZ5ANSHhvswbVb*O7<4S3;dItza+TC{cN&FWu-y)IQDB5<0)TQl&Um3F^g`mu?e-Nq$wGQ~Th2j*{mdkuR|8?HoP>Rgo%=rHN%5mp1q_sft8Kp zr%(^4YvLmiA`P`f#Jj*I$AIO6C#>n0hPqca!KcmQkRBp|{!?-y#gJ8dix@D_bP|SGl zV_l90aiRduc;^upexlrI)oj*&mNd(dIpkgY4X@9He6xW*RQcm*0I^Uzk!~)}ej;;= zvhJzK%`5uH%EtGi3S_K!u7(LW?(0OB-wa}XgB0FuY*x}?JC~k6>|`k&zY!eldeACS*-cEc!~z%zkV#wBHBmc>p)|oADF;RJ z-X&&<@+W+GCw`&^ngMfQC9#AEaLSoMQOU~2Q^vzL7=c}<0CK2iX;uPPh+cy6U8Sw> z`=Lu`ic{F^_l^Ies(i4=@6kzCs*5kR?r_G_H`8_2EnzM+34Vx)ZBxN+mV2TAe}e0$ zs&?#n=p6V!w}SxX!nVavsaisj0J*UN>n3i05@jDPX8e|}$Sm)+dp>3G?$ta!)_`!t z#^ieuX5ZsG?M58zKW}34CV!JdaLuE<&~r}w<+3+0(HYd00*?=a%Tm(6WA;u6cqb@u z&qs++7zq3%>F1z|ndB$~*yCu8J&v+R-T~vZH8NuVD%D_UatMx! zFR+&tpz+PO{uF1dV#y;M)y8>j+YHkN?X_SZM^z{IlVa#=4trjfaMaN+`;qfr0!K1e z8wQUkoxUKRW}c_Iti?c&gPT z)VkPolF5oi($iwQ&JVP<4eGhQI|Kz2o9eE^jQSa%Yz?#}=zu?QE1RdvW;hAm(^hwZ zVRz3B{f!9#v?~ln#Kr7byzzgK-9XUR5L2Gu%ML-y2(-S%A}Rd9<^42TtXFm>seO?{{11Nq zVYEzK{8rexmMTv^u4~HTI<_v| z3#KG%z~!(N1rDvR_!9vRm@Q(>?EtX652T+Aksju5fc+4@-!6mW7%Mu9@I{eX(ok|&#J+29q@gV6kBD*1sMShWc z(XNwWZ}nmriw}NZ%X)JlJ_v`12~l&d^C+b@Lj#j<$OZ{*e1OPQ`;mzns;ODum2`k< zP9YQ4hVX-(^lt)p=FbJ{KkEJf4Rqd%g1qw5?40TK=kwKIVUga8&Y2w zTkVkNfq1S{4oNK`n5J@47|AVGtm>dT9iANY9$B4M$orsK7?Pm34$!=AVIZQyj@+_7 zacSmmeCLgDIO+Sx4R!;#7}wyE=^4q^m%7z0Ao!LPehw`D(nZ^*Wb-Br(`sD(n9ac- zkeuj31%d-kw2Ujpm9vqS0qD;4@&yO(m)I4$(W4R@uQv8`b0ku+n?@XY<3MLuuwtss zu6=;m_WXA)P&WhiYLc8|m5V3JOjbC(6{WPtjD!F@PP#dUl~YnY1!-ymvu-tY2Hi`v ziu#OwF5?>=DR>Pzh``tfX4gG~$1X=X%BvO8q)$$pf94wZP z)hqyzRGOnia8Xq6S#sj0nJ|Fx48reg?s^_?HkWrNPzsvuRvN~gO_7$t^6S5ny;$y` znQmu@;>S49W;aMh-b{i&rmh>ha?-VZ7g>crxsG}e@i-Q{vjSEO*b>v7Lh=LD3o8kQv50+F$1}@%o`mTa@L(R$X)TwxN*8^8lj4 zsr8hOU2zTDZiunrUa`58wHD#=Y4qeH5z{!S=M*Stp)kV90&WhU#9u_%&ge$OZ$R<) zpu8Yvl{s`ll4kpa-Xg>nuK?eQ#sj#Wm?b z9;6V9=)F21Jh!+@q_;Qp_(m6_DM&Znmb*Q2JvH?lc5|7YJQGtyu>t~ef56RhH|5CH zj8x-Dp##xHg^3VckG=g@zG%ktWnQ@aL^*5^2o#UQk(PJf4J_XM2kzPEsdGm2|JT~p2 z<~GyqhR1K{=i%5N$Cjz(xc)gulcbKovpIfiAhPvD&dgQzz-e$mK1RyRK;BP}s>R zm{9RVjemyxS55i ztsIrKEnX~}5X{gBgYF~?jg2(bE>QnbOw&emiFnGX8-AdS)|evJUCs`L{BRK(1w1^F z=$eTJno6O`pe~F=$8xj9%l_o2mqBfg@00*IQ%IM+_|n7`g>(~lTg{7CFlH|WfRs-y zs#(E0gN+u9>|{Qp*Z#A$G!JpxUC{sN1af=QIM~NL#!JiddY!dq;FEF;yWqqpcR-iL zJ-xUZw_ZrC5|*s1w5JDhDqZp?O_~yL2;f zc`ci0LPzCqK=$ zDI$uKOG1rL*QCs9-62vPY=?as-nMcwlc7oN3tjuny!#V>(pmtNT%;@ahjTFz zX5;C&DAue%lzoCWtBG&Wj+xdGN4ROC(V|zJ0Mvs6=TybP5K`@{MZX-Nuvh4=TM(vR zL}@Xmy z(s^EolOZ`{<0i9nfyHfceja3)4SN}k54dTJTX}Qj!63QB&RA(RIJg!3-OT7;V*$eD z^gfflUjb~e5UJRoX0|L|Zk?5YgVe~w+JhRauA}=_B@uC-s%DBdjxSj(U&?~BW|vEN zMjD4VB>MY64hN3qYUmJ+iCbZHN+JNxrqY~@p}xvE%^dN!3#rwtok96NmJ!5;3!uzzt?9l{mBj)KnUIjh zXd~;R;UXdXS00~hKDJj~h?RW_l>$q~2gaXlhC(96*lN^gkTkhCj;BXv!qximLTid1 zUyA4q(o_-KI$!>qKqnNg%{;DAm*3bD_x>3*mA#dlLMK8or)Do^Kk|!5PG(lcxZLW; zGH|sg*+4U+9Mh8Tq2>-BwqfNXEX4PH)7*rr7$QU!T2P7l=XzA{{2M!1v6pkUjf>vt zHA+up0|8aj^uI=3l%&5Z{Oq9d1R!kqEwbF|eO!kX|1P0j>S@KV=4Yw5Eb(7 z{wXOghnkT~8#2$^1E>0#Nai8Gw}Ze@N0(`1a*}o_L zr+3wpbF#s3`ZRvc(2Q`i4_)3dASzNEFz9(_F#P3WWNO?%b-u~Wyc9**=1@*$DXJp_ zHyMlFn@Ey|lTL|>boif6y4hk^P9Ofm_J#;Gwb;kU&W<=_pk8l2T0E)ffy)v?%`Y%= znweSdD?^O4vK0$aZhAvi?{JavBi7qI@^2c9jitYM!tNdLV;p1CEYFbfumX=F@P|a% zP5ecNC5mWM@G?4%-7A|%Aws)O;D=6A9U<_a!}pyF$weg?Q23$|M9nsUc26_PsB){W zSW2YT8ev3I@O!SJ4QUBNerXgw^aJzebf=<`Fk6qOa9BdCC;8Qj*vbaLcRA|{p%_yO zKJQLG6P^mY@tU2)gI%(m^zNVyZBH=!`t+ZP@!C?8FrKp{SuAnsfn(bcPI|{t~S^Z5Z0QEg`kG<%p!N zL#`6?Mx_=Qn6{G;9gpN)%=Wwrr*#BOdsG_fU^{54nE8u(3GJ~3v1JZ!P31C+A#P_P zB6z=rFp`Q0Fo}i^CD_#UVon+@ptAWH2#NX=j1D2sWK|`^*nlh5Dt^PA>w^ZnMOymo zwgI`2#O~l{tVZKs;^{wXohmdH7osU*>q zf96P3HU0XzjHh!5xQ0p&hCT3bLm#%Jd>NOZ52*!h(X8KY~D+vsV{D??D(jl2-RT{)tl&Hebvf7aFK?jM(D)$EYfsRofPdQunoN|Ezt1$6_bx+WnM8$!~ zC1~?TS&z4jYpQ93;7o72bS|=$?^8QZ5gtVA2=Z58PJxA3*S`QbkI{26-k3-mypEh<|~D&^mVZuI(&s z1c^aAmd13DSU8|5%iL{?vjMS<3We)56Z?g|ggM@zugWu-s%m=?vUaGUxu>I5xSJ#u zLXG6`#0YHy+oG#VSpd6A5<9cd06{>$ziCbo49TgEObb0}`*VpQT;7A~`4?qOGM(`i z=(KBZe3xbWEh1AtjnC1&wZmBxif#W?Y;q>Q;bLgpwv`WB2mYTb zIgy`J{;K5w_$>x7m5g{)2~Oz#8??I;tFzXL{Q2KkDx`y%UH~Sc?1p;xq-4zJ;R`7s zlW1=J#6n6MfA#`k?u|bnEKt+K{#58eeQHYk z{Rg;`U8eAU7t%(;|LiZW^I$~?6TvhjWq40SVo_Gf5pmgnhkvs6nJ)=6x(SA{Le3{7 z7bs&>82b%si#Y#iJ&Tg=Kamo|LpTl z4KZzvuz0j{GN))RCV#{?MJEwE6m9+2P)|Q~A+w57@3(w&>h@^m|CG7-_sYB##du}L zawb1dX%LH04+P=QP1<1q;G&$V9-C$A(xg<%oY@OIOjJ#IPBl>OtiKOU7$=dt5(a`B zYr=y$3`X?5+7mejp(Zrz_wtd|bi=*UN>)!Rc0uOTM6rv6?wE3E3SOHMjr&xi02-)z zQ&H?5pft^?VCCNsXYOqNt%Mq7>#H^4A&YKD`#H(&6@aOkSP6menY${lUQ2YzmQ58t zteU?G`>NNfKfS#A->1&T;Yq7?--BAK;%>6|TDAN~u2zQyJLuPx{0|NqkZW|!-KlCZ zHdPflbY-l2A{9!DLE6fh3PwX*Vi=BBOfk7;j=F5Oj*_<3`ja0wmw5RTB!`(F8q&}NYJVfr&6T`#j>-SfFQ+4mkOOm3s=HR|^qb}HR ztEw>j@8!5IeL+H(*fUhzxjH{fxx#g_PCbHZ*76Nl62UgEI720yck+z6L^lm% zhIN(&x5TGJ-LykasN$2#%fxjVmVaF+hQmq0|Ys3(wC3bsR$U$rQko=l! z)0ept#F^K9H&E0^QF)SWpxUjHaBR1A^YVmc`Bh9n=a9?={-po1gcc+(2tGRxM z&G$~jfjvqF&nFH!fekv*OsyGL9Y_10anZ3;DpLQ+!*zX6CoMzbq%}kTwk%&@PLV7s zw$ww#6N4;?oaBb=MQ^)RXZ5sn2n*DfaDzX7G`17P9!p}SQ9=cTiKCRJF+}QPK+*XC zmQ;X4qhqHh_&=EoU8#(~Fx#%iAUiuVkmN7c^YDV`Z7loTQBWz5OoA+B(0A{a2+E1;;wysqGt@60c{FO()|L^dxVnHAF}o7xQR z&$w~1JjG%wvoJeev1t{kdC|#733rEBQ%M@iC2oSdcng||h$f4^7w{(2qivsWDt44# zlY_X(n^6iVZJy-BU9OFQqzp7{n*=G%31QZWXO-a4A4%g@Hafnl6Hww&A+jPJdb#28 zFJ^)oeZK*t_QXQ%BdBNBdE{6WNLOg|SCa}R7hSx{qy%aXXzug>yO%6uac!h31;dtk z!$UyHD)oOL*%Y)j>yt%PClt9h!O7grGx+Z1^AF%XJ^mEU4~oBj)J1LmXRQ4-(05Qh zxk4@}1GXnv2xdNQpx8{<$E-d>;hC29T$HE{G{3qyoEbxP5lSmJ3%GFG&biiWL{$4L z3+C^ujFrDefkhMV+l=_y5x;<-DqyE!po~T%P`6?hBV`y3A0wJbxzJ=l-|poV$9t`1 zEQ4Z=>z{C+2vRG@D%c;Aor6ncqE{5_mbs4l>Bj=Cd+;HyiWn-^V4$SaaYa%q=irA=y)4v_+SGUNtUp;nT?N?!*a#j@0f&hWQ z<4V=qYH{PH0pTIpA?W7GZT+@Ft8sms6&)R5QTuJThTzPwI&3H__m@h2=FtUw8=fHT zZcICJ2p8tG?UgcvR*(GH3U?|LkKfB4O8h2f5zPo9+sM0!eX` z;><0%j5?mt=31hh6x?&NP|pK9P(Mb#F?E>F)o`H_Agi%;nQ72YXHCsoPz_3 zK`R_)1xayyZ$5;Sh*#2NNs>2}pmc6Zm<1h-SM!0&uWrtpnjgj9$lRCzfxu*D1L39C`MUcLc-CAs75!SC24K+NN&MG$2m|XL1eVaP3)St;UNiznfo$Z&w1plA6w&=&ELA4!spePYfGdzPl>%}15I(V5(=g75|k<|kI zU8bvY6^#0WjM!^o;S=T|4R)H0>88S7QAZLdZwtJ+<%!Zu+5 z2b9By?T#+=!p~u@XC%Z!`oAyxaJ?vB>RA9N(1+iK^4O#)bZU+6dj@5|Pr^KumzWi| z{D1;3JCaOc(oAM62;e%L6R2M45N306n^sX4vJ-{E6q>Aix6ZzX-;ep;(l|P=A9hrf+I}C5+W+diOr|XjA~c%fan8 zb$C>t@z(2A^H%zHILu$jfW_TJJcmL@?Wscq2f?#VjHqQboOa6v)2Fm5aXkv+CyErj z+0m_5EHaIxS6?1B2E2r}a?_uZ6lH=HF?4`&(?VGZwN`ZETBm5b0x#%tta$AhNg02n zImSsDTwXblu(O(M3yW?EJATa07q&`_zuF-$16E!LWUWj%I-r@~;Kr{%J%7xHhWDy& zLv#^t1mMrJGLZa_5|#59XJQ%E^>m{$F2YUJSyCu9O-iwaydn;{4r)VjWY#H%i6eiz za>RITjaMd)nSUXeykGz2U@4p{A|i(~a~;{)1JS1iKI{p68Wt3tMd>KMz(SJm@AN@Z z6=ymS9j*IUaCN~KXO`XkAzx#MwsibGJ-&q|XVu-`~G3;<4t?>-!AY;=R)_4Y5Z$2{VK>A| zZqUR+BC!fH{@Z_S8G=UNV|O z5{k5trvVgI4LSNtba)>|ES5DC zF69uZyyMXbEee5@SuJ>CiiPbnyg~dZtVzfarWHqNWp4>^z<;t@t_p=02Z8X+!&~1g z1!(R34Fb8i8q7-2DG|~g)|=8b52A&;qdFm&qhf0DVn%PEC(xZh&3cFhyrjIsnawnf z+l)N(FpBN{Lq!Tp*uq~%yL{Qqn%@WoY8Pvo$@cohWl~QToXE0Ta|~>w8K08 zuSc$d9}Kr_Nh{9DVrn?WWYOxiwHX4g*6IUJ$cOTBXqs2K%dJB+6{#A%wj7g(&3njT zOYG6A%VAHfoQ7WSZ<>Zy8>m71s0PSf4b6mc{E=mDU+FeYvrq2?UNvi7Wggz6`^KVN z<#s`O*5L1g4;j_jfUY_35ShvA4oxx=F}B^ALecms^*gJ{UTV=jxon&^8&eh8$8_Fn*Xc|2CR&5)do-)ZNK zu*6__;RqNhZLc%PcUVwHNSYZq(Bw(y<+?NrvTfP>4pQ9STSDml#PX{cp`x=5Xrz zoz+jgo;P@X$9BIC$M0Kol&{;?lw}(xGBVO1i#9U9as>4B)Ghj;v6*Y*=35g$1M|*evLz^|*GT1)8F4>)!B8 z=a1sboAziG1V@Dk!DH8QP_4IO_jwT7e1mpa^_wC-FrEK2F;Y6XS%sneqNgZiIiTduG@v2dXg@TBlwBn3@Xev!Va2q(g=za`M-lU z0Y1a!!L~lkT^14wQ~dqYbl*RFIQK>q>Zt^WFd8IH!)5vwoUnVU@m6{T2D0=$`9;P{ z8KsPSlp1^%R^29wu9YrMV{vmm&G6ICKB*lLbh85@ZW6sm<0VlACVOsjq!uxHG-|65E@gL$B#tB==n&v54}UNNFT?G+cX z5FB8!-S<(LTkc5AuS84&6RvpKwxS5!3mlQkth#Gf_latgX)e8jtbLi+{5#) zG?2Q6N_{96co*ht3fJ0nfR}r*ANf_Z>^CM}V60T_4G0RgC{T1}#>D+gN(?*bI$wA_ zlp~AzMV`_lp0U3gaz2&u)3PZZ9F2)+hqud5N4Gkl#{}Vzc)+pjweNAjJaq0xhf^fp zJ?0KKj?`pi-3R6m#)0ZFW=+e&M!{hdmf3YC`)1p3=z{*vZEg^UhgR=QppNk?m2$rF zm6FM`axiq0o5?Pypfzz~veiz5e@k_;*iF=k`{MwvVb?v9saYS@pTLT;hRMN`V=G|M zNc_JKjdbe@i^A?b&fXE4EVv1=b+$f1EXbWQWD;w>@@qRxoG1DS=pdn$V(6kC`W&#N zohNs|i4P=l>4Hxjv3Hrz8~&3NGBX8B{Y8rQITw7lUWiiZjNUacq*2j_c>Z&?Rgy{i zksyDO^!x0di^TuL4QaCDt^})?lF{PlNfiCGB@G0Ijg%S_^ud*u6hRvzp4nGr7{0R@ z%SH+&0YMyB35J<%fK-?_ogP&|H$=1#sm@f%-$omf8cQUxN{t^z1*4@E#f?1BDV?Nl z(uzw`tzSW?BPv|AQ}OHsqnxOA?crGbyx2h8zHc;a%WHiQfwasVi^Zv7uY!Xbz7I?0Ct zLHy1f-hexGw3yWWV}abV>QP05R}FaA{sFoT6Kp#((ZU3h_!&goIiWoboe6BKalR$q zh4h5Bc4-v2)H?OPbTgawNzgOh9&)0+=J0P*!^zTLfIdH-e|$~mD@E=JB@Ca)(A39$CPQ!4}eSDkzd*XU;=gLyJxN&1nir*>n1@}3V{M`xCt%u1_khTc7F zv;|rVos^Ilj!k}+rdD*TfHnlHGd`cY`W>=ek@x#IPjLkc2(%LMOErkAN@ZIu_zo#! z=p>!~LJsMex7;?l+aD9sVw>`^`t(g8_jV`7!S`5ddKFRC`$f@GD8q>T zSQPm|35GcY-32!^i{Y&`YQ6|Z^6Ja-bVR6dV=AEMSC9i?#;Dg7Kt;L8Tm`AZ-_Icj zFocRQruGET_|&rcaH%7S%H8F2gm{Zywiggo#Sv-CZ(A4_m;A*H*tw`KyO&Ho{GeTd% zN7(59Yedq%5u^_^AQOT~51SKCvMDq#!RN3GOIOnRfFr^APy9%uZ*Szwq*(wO?~^%j z`#2Q96IWUTF6;ps%?IP3jAksNd3)GVh#*qp+EH$%RZN%11!`yO?X3q_fR!>_Uhik~ z@w+4!KCsy;)0+ME^Dz#};-h`UbWl$D#DTGS3?q7j1w^rih2MlUHB;_H zgG76iUAzJgB#uR9;Ra2WeOE%nMypdD3hIM1h>WpW*|WY!a$DC)C&3%Jne3UB_Y!R^ z^IGjr^#T^mi(U;|t<=jjXRuv|LV>!hflUK(i$GW}CLerw2k^BbZ=P0>Z(fP}NF0xAuIhy@2JR zrtR)U5x8IfMrxLeK@Y5+M9SIX1>-@9(VO*xHF@IrUP}C;t<$EKYfXL=LWSOw@xPWa zI72J^oNwV?C!wTTYHPU}Jx+P^g2;L^3BR>k^R%PZ?+$GF#q{1$10O_54(XL?;Th?5nquo_D)<&{v39 z4z|ZXbA=;}T|ya9k{= zvY#)ufO$o*(7;_z17mq^gCdlKehMJfC7`WC7ASl4*AYj!u~4YtUz>1O_W+79uDxa zPnw(+5?%740_;4^P)JYR^==FO^w?1V4Sd|WwRV4fc_vUzC9W{k)LmJgvE+L{xT@dM zB}Bl;U^?ciBWCsSqDt6!@uJy_?Jb+LHnP~oE6_=C(?~!CBN3WrRTg^y6NNadAPG-2=0I?17e+Opai_2OJ;ej? z$w>`b$a~+PEPfx|IDV4)T6l{1EMr@YS~drwyBy8}G=W@Cf>cNPY{}8UW`9jNv0A00 zhzlWrT&?1s+6J~6)4y`2U(W$o~?TKO~CDSjtu>jOWUCkd|3Cc#d5p$$dcE}5^$A+# za&%{2UX(7T1PP`V5`fJfS0kr3Qjlz5XpJNr!cAT9$qcbkI?ygLe!?W(%FNg3oQ;{7 zn*$m~U1P<~w(6`~VoQq%r>%t&PPZfiF$Kd`kkgx+=&(Et;i9CwnT0;}eEU0C^UPLS zoiY|TI((?d2@NsQ*7D~H= z+h9>gn>VF#wvR}6OF(%87uR+=vOL@(hX9v*e_?(JIgvj*duGx^c&s}#dACqi#Kd%RvN(;jEbW>7H5152ABiD{Av zOzPeR_xJ+Z%M@G6IWUuVhUMd*Cm3@nmz`K>uaKy?-e^_fRL|BkJpS!WV`*p^n>Jmf zIF-F>2sFA&_fNzspaXuGlq<|t?-MMrz}^}T_$D0LHDwfSS9$r)d`jLQg8@%e0sb3n zJ7BtJD0-hsU#wG%4%es-bIj5DlLyfSg>F`ST6yr=z~ThQSUm2#IQ^k&jAs)hYSB#l zhV?XPJj0(Ju6Y}2M^VP!C7&Z;dNUu`kZP7O*CXdlCPo6y53p5Le(2FKHI6@+9S0

iT5~&+WJC~+%7!dL+IJeP3wSWSJm$*$C)D>%dJ_kMkISMw z-2YF){m0kLsc=OIt?JHa;waDn(aeiKX|soZmT+w!*V*rPn$^~HM%jac8XZiN!wdkW|5yRG?xXE4ktGC5FiCu~1SLxy zfVeTFgE&SYF(hr|w~+dNV0^rFh$EejY9b_w@9HI>(j4)*CiS$bdx2)be~gZTx5HS0 zCJ{%@>bs$d>#Z@{ss5#o_TDvvSvlKI*0PzHi9Xbk!v8jKZi|{VA`ug@*I2E+He85Q z9;u%p0}d*)_+Ezd2ORbpI_2xBfdbQNo|1nZQ1Vz3eG~#JIe*~MV_nrXCDC?@D2#3F zF+v|rpvz?X-J3j`sy|15k-zAa38P^uyQ<8@j7~K>w_`v79+k%m_;{_s{;gTNJWTb< zluBq?`G2|+<9*Cy#w`T;pZZRz7x^ut_-fG1?_dPZ^h03hR*&`gznJ&&x|&s%H^a_= z!2osT(6Q{fw~M`Rz_03=Ri<@aXEb}m;LiKG7Kpw;)Rl~W`^I0Ac2}!Gc`Mq8IAx5z z$#v6vQY8B9sMZ#|QFYn2!4{VR^%5H`A48layj9Eh_31il#EmG>IYZc zmh!_$E@)ul?;Qo$S(|Ml>syXD6ulLw&;N5K&PP5gTC475{PR@1U`}IhG}28zxD*Or zfiqvT!TnZk5JD>?p%?Yc>+t;;yjE$y-{xGpiqX_!M~CB3bSm|2;UAA12qBeT?$8mhZj(U$SHY2jwq`YbKK3 zV0!@!kTy976a#V62PUsO==#l$H-#4t7NOSdq{Tm+Jf1Ckkzg;BRP6VaV|tz$a$S6cE<$Gw<rIowHW3#qBY%Hr3rJ3E$gN z$Hk1K>&@rD8=ws80upIOwrnJB*I}yjzUrIW)@KA4%^-?);!`>2KiooydbZ%4ll4Z! zWtK(LjFE+U1$$$5OO!(hsPF&SbIn(HfaPaI$SeUR7$^q8m86x$6j$L1&#|*E?)~m{~y4osOhNm~`-2 zQVP|Gj&^xXD80C#BI%Zy30wt|9A96~wOxuY?OUEK|0?BvN2c+C=~(7t54u&0(@rb2 zzy7Q$`R7+xi1Anp78+Y5Rkff-a=iF4!y*KpcUpfDfL3yGptFtnF46Y!0uK3{d+KCA z6V$7@Syw32L(+9<^x(Dez*^rVaKsD>#l-N2uDoTrRgGeWNkPWi&+Bw#Lhzl%dI@v-Z>eW@@)*7=C zolvM%x|-659G#2Q5Nw+_i9}kc)fvMItUuL00{L$L0;YB_SxMpa<;ZgFr}XsFEy=qD zU%M`tJUsqo6ik%Bw(?yYJWdfL09l;4$qRdC8MUZ0>0(1+hS#|_v_!zW_DLq5DEJ_s zk+4}S0Nqo|{DWZ*4kFbqiZ5#t-+@}_00;K-4o_fzx}8~Deq7gOL|HBufYR4$e7xlj zRKq1B%GcB+y;Wau=Gtz&RAZkV3{MB;_T1Q>BDmncAFPP8I52yrEG*d{yjL!Zhtrd3 z$aSb$h+w5<7%HcMyq6^T2G%4w+*>quf|#yYh_tVefFUVKRaT-jc2kZRiIv9+SgB?X zSaDQSRjPg>V0SQ?=GhA6Jk5O#_#J!OiVbmJYh!Pbp_u+pyt}@dzUI5iHP9BhSDjH3 zn*R^OL>#lnvyO->TERNkXm#DT7IjCEgn&1&zPXZA!Ota}wI?4*T3(wVXvwW++U&-h zs#_*y2(QojvSO-Ihy@OUv7UH1l$ zKy~uz^s{|G7$%=;FiixEpSdkd-BB~zRjg+@G6#dt#w{ixhfi{=VlazO1VS@xeT1W3 zARlZWGS#Kp4mO!ykYyAd5Q8RqeaP~=wI_IhWQkOD%6&&b0G3?qgK}+DSS#9G^<8pp zNm8&I(7H=_q?W}?n7g*H$TnELS>LE=_Jst_^i8KOY8g8XHU*cs1; z4Z31rqd`^V@IsBa}$p_@ut9h8&T)n_>Gwu%nfW&P1H-$gNp;(0Ruar8| z!R737NTwn9;1+I2>Mdek{t$q?wPa;NR6=}*ppBKg#RpK!%IADb42Bbkf@Et?Mft@Y z-lWw*3nV$-v-^@Wdj)C`SZSPHlvb6(DH!c!%YwER2)HtUo(+I#|63!kS*n$CCdHf_ zs2h!p)Yw+bOEWnuc%h(LCm>OrS`>%gNh}MVa>Wx!A2I4|`1Ei~f6~uR&;DoR%TCK)vM!9`vEzWpLQl#1r zNx+r&+oXz%)W2dSLcYAQ`$2vboeGIB((ORG>WwN#{4rY^+A5NQy}BB)=rWk)-JXkJ zn+)T9UZp&^Y-S;O!hQ2Y`{GrG+THIq?##6@LRswWZ)O@#_0rYH4UCPb8Q8Cp?Ahw& z^Mj4w{TIi}q{Rl^CZoa_V?Bmb#26&{$>qTgh8GTXwS_nBU&7q}$(XPhgI7wJ5Da-j zji?D&hagIk4&tv;f|XQTQqx!3QiVo?exqg!O&Y~OZLl7>GnTw5o1qiPG>pvQQO-TxCU|8;6taI_uCyBCJWRo8}BodqTBt zht-@(K5-4((dhRRY0BNuYBIe12Z0Vh_>^m1ZVvu|O=Y1yH}4c|7T}}=4$7+tQ{{ZB zn`7;-1rVz)jFIF~LY^^N-%e)5a&mI*3z(1OZ@Ha`x*-7goe67i_?&L^%$d44J;ib_ zZK1o(5W={kGZLn6iYq3EUsOy-mTSohG<*hf0;l>2=- zUH~w;H)*8Cdn?5masjSv#*f-AdXZ*9qF`(JS|sutGsriA18YMJLO^WCk#}J+I;27K zvL?Wo5_Fa&_U~q4jyrNf$M#!igCo{rB!(^;SZuEh2|G&(Vb^&7u~LT;%IkS`k(^Q0 zoxHVT`OuUdRsVpsr;`T=+d14qEc*SRRmesV1;c{|H5TA3yfXX2P{KFEW zk+l7sw2ok+Nb@0xnUw6G2KS%D3JivYp54~5aJD;fAe!q$4ONNt&`%}hQosz>-o4KC-4o!}lIn!7n6=Y7#d2#KEC~0C zypGpv6&y^;=XXs?wCIyo&6d>uR`w0>_FOSE9v}s3fc;;YmtLXOx$CO;bhEQSzYuf` zHZ`sPQ(m#a)x*_!Qfu}$zfTq4_-1oVWr(5c)IG;yAYW zS?-gm9ChbbO?xTy@=BnI*UX$LtETl8+J|E;wi>G}A`5Mo#FMKz!z4NmvFtmzcG#kP z?XTNx%HKGX8T>knzLUTwgr7Y-sbD`}bs**27JC*2l^My*bovD^=WjYb0R#+1*tK=e zC0W>`qnP#ei?B%^aZL)cLz!lY0J*nRrZN#oRTt2bOtD^!_#h;G&k$t7x3ZZ=d0 zb}mL?4+ntEI90Xhz}#KnVYef$a8;rSV9ZAY5*0t6Jvl%)Lm->@+`Yz<#Dz?fZ;YnA z>DJ~y5L3-TSn6(BFOu5|YfNDj@MVe8)ZsMn#hGYbyxn=h3vT{$DZ_V)H5UIylJ|i* z-_$ymfjEFM57{}qz)ljZlSkrk2T4ZiFp`MH47yfmWVyQJKBU`%&zK-x1(uqs9NA)~5?IsZy$c%O_ekt$$eL!Tk?L90mS9*Z3k1o{?yUcHu2gqI)~0M3ma{eb z<=vtu^0scXX1cMDRz}4o;)VdZetf6=V;R@9#2QyNE7GYEMGOc19j=4v&hfvfl3HE` z3T7az;WPLCA4e{JbJzjzMV?Dru|^`(3OuVr58^IkD-6Jbdo$s_){OyCZcpMweLbEA zxzXa&ex75}55mM^r+VoFdx=sv`Qfq*iP3tsLm7iULQh`MAGj?LlrapYYGEE1_E3}E za?22&P??Fg-^`Mt9Jky6%xVBBh*Ho}T+RDh_)#^o7)3n1pwP!7{V${*WSs%To!uhr z=nwLUQ|>WCil>NrV8eypc{?`tB%Ljs1{v@Rp-Y?*h|-LiA0XDV{V3w1NSu?ql3E&; zA!PQ5=;39p)S+atl+sYlhzguI1Wt+0yvHvHL?9aiZ_NYuXx*4 zH6LT9x;nJnu~sUtp+^CxHJ2urTwcwjrU&mAlkO#NOStd@bOO5@P~VOvTo`ygdXe(k zEl}b;M=A{Ez?6lh4l_)-?lV%{BCu30CBEafBo;}T-8?z5d=#YcJfprz`Y|v@iZ9&# zRyW=-hkdEC9AJygK}c8$9aNx$oQzjz63+?8(rUEB7SuJ5Fct%BX5<$^@e=2SFQ33D zC<#tF2$9c7fPC9cty36uduWnf`082&g9z1U;u#RFd;~BpWZxm3<44)|P^>ecDgTpI zblqZ;$c%VOP>m8%z!ekX9?>#|F)DZXaRFH=il9iN&1a$E2^)?y?~6{=Z8kB*tG;Nm z{XHTKjfp#_Jb}o>M^Bd06goN`xV7S=5@!;%V$in<=4vaDtECzn*F0A*F)*MwLEwr> z7&$NzfYvS~nc(>H>M-E}{-t6#!-lxS_h?(Hai359Jf^!(N%rvAZR(lPCL6Ek6%H$& zuu94Yn$b#`F0o)Z12mHn;X)KLV6{Lw{W{8{n@C~D%)B_iW6FdkwK^rcY3yQV+F{g4 z&v*MJi8l3HZ8OZnUm=ugOs~E_9nRcL!UnuFUDA0zLA&?c2Zf%kmz(MYVr*!C-{a=w zHCnFnJI`L{uHgW?F!b%pJ#b>`ZCU>$R~Hd-Bv=@Z$WB_NWA0)#7f$ zj$>pEj$$hRVFAD+)Vj*e7zKlElDq^bj()w-)=?6q5wdOVn`JSRdwM(PU_39J;M2P0 zxOF9XK4X}7^11Fbi5`)1CopNiD4BhUYI>*2nj%44=#*2HrwXl?hz&_3Y{<+c?j&`+ zb=+-6Bf7bMs%=9AgMHN#wM&_Bc>5X_%@kXHNXqaTKsFdQyj^#T9-~RBoQ=qsbHk_( z={ZQTUw-47RXZy)cQ9SxUki$u{T!ABkKr?H^@|PYNdgy+p=!iBVykRfrCuUESR)J0 zV@E>Y)0SdBkh7u|yF$EBuzCP0Vu$7;v|Mn9AXY{xzA$Qm#2u1Yca%8H^<(k^Z{;dV zw=xl7_mKsb#h;tv)Cvi1A?pNvrbua!6#{GZL%J?A*4QmoP^_^FG9Y;q1x>s^eYT7* zfS)(~Fg&IO%PGMV{Ed+2NUZWo%<)Wc>I7kw5vFwBQMjO9eGPM4CPYN)242JyD_#k} zP=5nD1XMWjAX0m&`5W@oKQ@)(B86U|%_sGcc!FhfMVw>?BE| zQ%)P93p5P+u1l!ao&Cf!bu>>e!6REQ zLeJJ4qQ$M#)f>}O9QOrmmBr*rp-b*S66-0PJl`4CTQjjqmhMXOX@*t!0HqXVr)N(h zwlHU@;u)tg4Qj`3v-o?Uqm_jP05{UdxcS5_?@|{H0Cy=y0R|c|QX&G4kaRhF_?tHJ zMXHq;0LB9*D1VHD*Yd?HMB8?GMaiC${zM`QJT=f|h;jl7IFK2_Ql+(o`a4;YjaLfc zB{&%ll@QQYw1U)Pl_5Fu!{8PV(E}m0Kd|>FEr*(pK2I#%e zW-2SP%;wf$ddJF%v6vW@gzA9Yg*YDmQoqy98NnQR4?0D%RHbOooa#$B_3Df#w|;Wg zv4Ye83yXr29P{2d@w&%Wc9qQe+3O89aGU;;H|rQr2JxLR0%UVTcEk}8Zq%1^NsDD|v%FGD2uJvcUMU$464)#kEw zJRBYYe9wrHiFj#s=?)(of! zY=pURVU>)3O1d;=u|1)`aRa6$GK)f(OCL93&C7GHB>N%h8fL~4DR>vDs-uGlZL?(d zs!4fZfI@GM3uua_g6Z|AC8ld!lMPhUPe{_ua-qD ztu3&WUYw+<_LmhFO`!%#m<7F1KST`+Nq_pLTzs_7f{{s- z#wcPSf82gw)kS!>umo)BLjY=w1-SWZ*9%Uf)vv}uvO?PbPXE!?=s9ADvkNO4Ysm!# z*ZGn{h(HPh4d2lsm!muy1~!jcl!N18?RgI9&@a8isCSGD_JjllW{;Hz!X8d&9z=n9 zAIp%$Ftx)Byv9a(6j_zq2UK6!kabA_uDcd(ZN1M4Ja33r&)!vJ7N@n?U|61yI!vb3 z^p2K-q>5=sF2M+32;JK|RJ6T~LVgwm9WvRAepw0#9XoOM9k$qdba8xO+h*M^- zE%VEAi&840>Fx)+&S2^S1IbH}jp|)GKg~lO)c5 z=Q)91Y@Ac2;IN7ak;tUSZ|XisaEvJkcoZosc8@V}nPdKlb@|pJO7hpuQEw7TgJlmE z%dyST88?IaQDQY@h`*z8S}t0OG03@rBjnzBLN`E1Q_4Rf70yEDC90e>({FFZOS(Za zzuA6N#7BxvhB6xqj&#IDA>ka65r5_y=Y-l=>IBiG}ZSu&qIP;A^w+cG3Y;A`O`qR!>pKIgf93-Ra|mh z2X>j~?Ni+d(PNqReO#=3o=Tq#Uf_vvhh)W6qr9pJm_e;V>}i_>Ec1O(qpj^X0k(P> z%-W@;9rkn=<9J&ti0CHC1B7RA8sI8U<8*B-M!15KzVwP7o+rhl%DvWPWZw@&_&d{K zWYa?LZIQPguDo^BM8CrWBXj@{Tu&3&Q^~>PzSp!ms~o)uwgCGM0t-;vv0(Dt%$ijl ze>Sd%FX%!+UswY*UIP^v3$D3SATk}4rzJ@kP2zlnbwqnwy9EQfJIq^+Qj6Y3m3<(> z$M0fDbreXR-_v2!m0?g1jk0*!X$xl=NB ziKV&2XGSa<2P{{U*K@A%o<=0PQM(@=cy0|*ia-|9<{~N}P{z(Qvl)8o*!3C-edbTD z;g5>|KgS7ublXEBqF)B_0QSn!0w$^F8;VLjpuB}#73%HN768Oi{@yUv6?HYEzYny zWp*G0vG)EF;ZH?Eh}+6>x2XK*gTYx8Pl)z_jRh7+$*O}WKIF{QS`>8KWuJVG8(a5S zb99I#X=7eBv6PsJ_?#35tfpd#UvS0et8k)$TdvFF=~Q$T?|SWuuqriB{=0k`m`aI` z@&M)1xPsBT{)0uX*$L7mD>)HKhYp54Dno}4G8_DLn6RdE*(h)c!j)()BTa)!8=#?dG=2Y_ly0lz3w8Zp+(TydI%)@5Lb0mq*MxvB?7hb*VuI&3A7;j8}ZH zKXIV`wOjEz28C2n0^)6iH~Vg{?eI$ks&uGCu_G~A)}>j+Z^t3hv+{`B*kNH6?sKlH%a!L+oIs&Ky_|6 zIXCsSdX;NQJNzn5fAweuI(Jt=>&67&WM2zrLIc9kUQjYSg|CCV@?*@OCeIj$`Ht2=>GY{dlnUG}nLZTDdzokoT^0ql|E_m9R$Z6Zvc?C`kN%?>sL z+RIHZFkl9$i6$p)D;cI4v3MwXDNYX(rhgPImO%+)9?M%b&Q%Z?LhZ8a9N5b9QQL$5 z*X*peQ9lB%TUi2)wKm{8Gk+fg;x9TK)7W>CKt-rg>&p6Ou@XBr^7rlzwqZ{S^)Z~8 z98N_I1V|((Z?n@UX>S-w!Eb6%@Q0j5n{ypF`GI%>eYsF!9MDSf5!IDNVLxw$@=J7^ z!|#JrUcrOV1ud~j;OB|(;#donj(uS~`|GcG3l`lUdKfV9{32l?0d57@YZ!zk92k7--iGg z;f=g^5t}CIbw4W-3F7{Z%1GO8nj3@oW;1QIeK#8pYN1H-Z*6O~x_})EZj8<-B*D_( zl;ME=i*#23U@NyX(d|)7?PLU^q(0|pZDq?l0rzkE>L5IP1TTkb)K_$X`V_}RWj)n3 zsPf4wZ6%j8+UG+@YtVoEEUDUnW7yJz%;TL|jhx z4PITTAbU=0TvWT?SIYMQ)M#abl6PB$7MCk(A=E7IlJ<_{UMrF+F!VmLGaX&>jqDWx zrK{||3%z_3>Mwc<{|hY1K3s-$PfBmWQ<~gzLse^X zJ=siBrpFdc>tb^N)1Zz5s5VB~?M7P*>170wr|0IUG003YUkc43%Tse__^a+`;<)^6JcUNfqyZBIDqYZ1#)t--~>58uZGA6t;RZ1_S_wfqqWY~ zxTtOKb0^ZzDYeFNvo2rCCEQt3$G0kcfxG|ksQzr2q4ef<$uquU{tIopqxw2F%SfrFmJuXUlpix#C9aI_M%+5!*fS- zy>U(oana==&9^K1d@ceRHBjYgC61aPu?Oay^L-7>Yn%EtdGPE+<3x&GS>&$TKQj{= z%SCfxc!c|#%G!F5-sU<0TD@EnU%N+{H^+x5s0&+Io zT8(c@G4*3L6&4Zkcjz0qh06U1T6AP4Y_Mq$^cDdf~yp#d1V*(n^T+)8_S)J3=3}RrFGlTRg$K_d74TnaO zf&q!aBt|-cRP@i#h~iF!)C=~NMtMjIs0o`s4{zCHp8orP5h#j8duQAPUyeZ~k$7zC zq_eHz-M>tGRmU6W^}Kj4yu_MTivXYqW;8GW2;N#tKfZa$c$3P( z9+1LreR}KF^T8xE3T>#bM-5}#D$>#C+3XDCs(~Rw!#?gMEq^bzxFv#q1^LXk@YKxx ztY(yI<`5T&5cdoc*~gH+ii0=wjI}}LN=DhHq{T{Pu+tp}CL_OgVd28Iu9mdpb1=Ez z4w#x9pxZH~K|{s93TR#}r!PZ0x?3=_%9a|c#VM69tg51IQgp%hrzwyE!V zH#~BG(g_)Sy*%H$)7bR*iqT{(@7Ff3juC+H_5pkmPB!j3Rj^h6@!yfXAr1ZcbX@7ym=KJK$paC*opeCN}4FJ zKD^i>TrilM)r?CD9&$=@Mjq8|mJ0R=?H~|gxsxRblb@l<1!%dBFxyZ%O!+Cf|gr$PE`(KJU42^LHi!Fffq&psh z!kv(QVLN)F_KA2wHJqBbe~X}~?aQeB9*tbCgg{8~2`!0C+*f!l zF$Ou4>0(4OA_UrTM&jSk0nx`cDORh7h}rH;)@iw-m@-k_IIDAbgbe!dapB2m=FFjQ) zuyo<;QtULYylQK!YQJU)0-e#t=7#c`daRTy*i6|J5Ku@N5?kk-ewR2c+^|~+d*2wL z=n2{jz~<9&gZ|B?OYUsfzBPR>T!WKpn{51yx)7I2c^0dXE;5?t`-E;uYr=blxDQ>ad+0~4SnMLr z$KP zoKiy5b6|OY^~;lwQ7kXo+F!f_eWBtDPF0S7ruedCWw4=DA6m?-pW%~SiK8=+zV1fP z1#J`bn)&G|h}0nAM;qOP6de4*O}C*Ht3B@^U(m&^yf;m)Y&f+L>;X@bB6Aupo?g3t zA&@+J(1kc+U0!ruH#wz>ei8L4!+f&_BLr!IB3oeu0GL5mZu6O82ZrfS#9l5B4a_}s zRAC_$wA?4M`3g^ly?i&i=M2d04Q7v@dKdd(qG{~U1X`_=Ri<2vs>p_Tgb@ziBsuQ| z8|e}&gKB2E?QMLL4|g|EKp{Ce$X5P8bM(4VpD3v;`4*;h*u!h@&XSeOYhVZE{Rh7W z0Ztiu7-!mfD_&jgr|<)VaF%z+fKyd~l*qiPN|LB+3_|9~O6Q8FO6hnK?+q*fmIqIt z&aWx7t3>*s5~r!-giB|?=&f<~ivmjM3}`ahrr-3mTji^iGaAb=WpykvzpOdy&sy^eY}GnLX!sOSaLc%)-_c zgP#|CYyjM_O+hun6f_+JzmdDFI_;od&DW<6=@5=czILYdJzyPBS6L#}`BX}6?w+lV)RW+7C#!*4 zFJrE$4z2o-FSfdgW96vHqV;V~?}33tLeF0TB&Bclp1x~^?Gzfhpi@^125MX0>9XVr zd6_Mom^zUYCAn%(a=I5{Q&LcB)&k^KxIQAQUYc*zGZWOYnyVmu&k+0GgOUS&c6OBC zScBuUruP3*AHoF#lj-%)=^J}2yb#as34oPjNDzkqg|ldx zJq5A`afrCnd!Xv)!w(SUnE7atu%`nGGiTw`PW<|tg6Js=NcoFd@Hz)}_^SY7o9l@Q z5^wO267-nCv+y2|fMy+!G^cE0iMU7K0Q8GD3f1^ z!rLFDAmdMH+AQ<4ycSA;N=imu4e=jt$~{aVAaV>G6C1dANxx*=?!hx6vy;yrZ3{v~ z%`ZNH9od8NTVWy6Ds!p@7&oP|O62g0jOwm8(cR<+iZ18;gq%fS)wTHUtUHJmp zZhZLx`VTQhrcPRoege;*DC4}*LX;q#%^RP5-Rba~;b6xLOzwh2XKjLCE0z#Da2{Gu zCU=BfWF}+zTLV$=^cj?iAQBS-$|C5^W~bo#4ngoB_eeW)X-&64VX011Je49#iPT!v zBVLbSTRih&pFyX5c&ipCD+B5M+NC26Pj`5}6$i-JK zhsl21*)(cR@ES3ct=O*>Wxc$k?B*N`8gB(TG|lhM3jjR;#>_H^MmgqBB|&2Ak$KEj zKZPcOvUJsQ`VH%=?h>lv_CGKMjNgI7N$QoXx4ukfoi)edVj%&#k?AMut}@L_?F8f3 zKb-Ok4kJ3)8bfk#4n@;+v(;)9OcKbsZj_>sqziJZp^_%d&zq=-0nHSB!28-oI0JTc9lIn zB28ORfQvZ+(;qzodHP3NL+$S?YL?YN47N=d3J4y_CFF5|KHr^?=TeJ4)?y6bjsW?> z^}i?a6M>qkYZxJ)GCgZZ2eB7N!z6Zj9N zQ1k}Ve87*i84?HJ?>P0*_Si_bVJ8<;i0G&=)`u&%_rI}6jD)yAdn{@7L6Hrb5;78} z)uXwtQ^L8ApF9fq_&h4`B6f2=0d(u+S5)hWKFM=z63zcQ_#vG>OH^AeFyoX0o2GTs zBeE@#VrI1LzPVyVLmH|@6!BpAOq%;;ckpxVH8rywDoX3WSLkJjP9KEwJ0p_$YTi>~r_4<^IX#umu zk+E$Db1grkba~%U@+=>4XX-$Xl^e6A8Ch&AkHBM_+6&vwkLA(T5yUV%Hbc;{dB=AgF^ti z`85vL2m2X#BthcXU0O>!^!BF2UOqD#Q;{6{SHQLwBBfSW@BWR`26+sLLcTb?S9^lY zdR#Op4yXLxAng8wC3aM}@tcM5Dcfho#YQR#$Yyz3y(}OFzUoxP>+|q$T-t^rfCV3dhQ4GsW&gCO%4#Q3eDoo_cF@@ z8>fIL%$6i7TxA>Be}I1ut6>mPsRe~tKeUU0M`g$aQ+tMIl=N~14)Ov}mjfUp|FM%= ze<-A-6=Z>>YX8Y)M6PnI7rEyv83-&5Hc<`Ni*5ourXJr5P_ooW!iTbEBb8EyY32rE zYi{i_Ab`<;0o(HgYUmu{~-gz6%UI%Mfudr`@B20DBXWotdglM z_nWFvW?b@gg&>>6mrw*`i0m00fn~5Qg>Prrt2HzX8Y14;(noXf8T`yYDV{alqklA{ z>$rsm>C%q#LQ5bsPI7byF#A1RfZ6Xy>jOg#2x#CK?ERVbntw3){*z;km@g0{6BOsR zzdlEuC6K~$en><0tRW-yn@aW=zhsAuW8R+}A1r@R_I27F821i6gm=bHZeTXXgSaFA z*;BlYikVb1!snP;n!3+?hb(wa|2!q2INc;ydc4P=xhe4Fl~Ywi2x3ps&oev&WRE7^y0a) z5m)c6!hnNum9UIJKqom`dLVk$VwkBW2Hb>>{1SxS$TY*SrvQ%#|C`GsNmK__$hqWd znZAYYJ4h2qtKG_^*w7h6afvtG5SG!hY-NZ5JQD{!zl+t-PTEaeb){j)yg6Ul

  • _ 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 literal 0 HcmV?d00001 diff --git a/install.sh b/install.sh index 04f3f9a..4735faf 100755 --- a/install.sh +++ b/install.sh @@ -3,11 +3,11 @@ set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -if [ -f "$SCRIPT_DIR/codex-launcher_3.8.1_all.deb" ]; then - echo "Installing codex-launcher_3.8.1_all.deb ..." - sudo dpkg -i "$SCRIPT_DIR/codex-launcher_3.8.1_all.deb" +if [ -f "$SCRIPT_DIR/codex-launcher_3.9.7_all.deb" ]; then + echo "Installing codex-launcher_3.9.7_all.deb ..." + sudo dpkg -i "$SCRIPT_DIR/codex-launcher_3.9.7_all.deb" echo "" - echo "Installed v3.8.1 via .deb package." + echo "Installed v3.9.7 via .deb package." echo " translate-proxy.py -> /usr/bin/translate-proxy.py" echo " codex-launcher-gui -> /usr/bin/codex-launcher-gui" echo " cleanup-codex-stale -> /usr/bin/cleanup-codex-stale.sh" diff --git a/src/codex-launcher-gui b/src/codex-launcher-gui index 7118510..00606b6 100755 --- a/src/codex-launcher-gui +++ b/src/codex-launcher-gui @@ -26,7 +26,38 @@ model_catalog_json = "" """ CHANGELOG = [ - ("3.8.3", "2026-05-24", [ + ("3.9.7", "2026-05-25", [ + "Forward real Codebuff error messages to user (not generic 429)", + "Return HTTP 200 with Responses API format for rate limits so Codex displays message", + "Extract retryAfterMs from Codebuff 429 responses for accurate cooldown", + "RateLimitError carries upstream message through session + chat error paths", + "BrokenPipeError crash fix on 'all accounts exhausted' response", + "Fix 3 SyntaxWarnings for invalid escape sequences in docstrings", + "_codebuff_start_run returns actual error body instead of None", + ]), + ("3.9.6", "2026-05-25", [ + "Fix Gemini follow-up turns returning text-only instead of tool calls", + "Enforce latest user instruction as final Gemini content turn", + "Edit-intent detection with tool-use nudge for file modification requests", + "Debug logging: contents count, latest user text, final content preview", + "Thought signature preservation for Gemini 3 tool-call continuity", + "thought_signature field on all functionCall parts (snake_case)", + "Smart tool output compaction: old=3000, recent=20000 chars", + "Follow-through guardrail system instruction for autonomous agent behavior", + "Stream hang fix for function-call-only responses", + "Multi-account rotation for codebuff, Google OAuth, API keys", + "/v1/accounts endpoint for account pool status", + ]), + ("3.9.0", "2026-05-24", [ + "Multi-account rotation for OAuth providers (codebuff, Google, API keys)", + "Automatic failover: when one account hits rate limit, next is used", + "Codebuff: supports accounts[] array in credentials.json", + "Google OAuth: supports multiple token files (google-*-oauth-token-N.json)", + "API keys: comma-separated keys rotate on 429 errors", + "New /v1/accounts endpoint shows account pool status", + "Added x-codebuff-model and x-codebuff-instance-id headers", + ]), + ("3.8.4", "2026-05-24", [ "FIXED: Codebuff streaming — SSE events now reach Codex client", "Root cause: stream_buffered_events was never called for codebuff", "Codebuff stream uses buffered flushing (30ms / 4KB / urgent)", @@ -1706,7 +1737,7 @@ class LauncherWin(Gtk.Window): # header row hdr = Gtk.Box(spacing=8) vbox.pack_start(hdr, False, False, 0) - lbl = Gtk.Label(label="Codex Launcher v3.8.3") + lbl = Gtk.Label(label="Codex Launcher v3.9.7") lbl.set_use_markup(True) hdr.pack_start(lbl, False, False, 0) changelog_btn = Gtk.Button(label="Changelog") @@ -3495,7 +3526,7 @@ class EditEndpointDialog(Gtk.Dialog): auth_url = "https://codebuff.com/api/auth/cli/code" body = json.dumps({"fingerprintId": fingerprint_id}).encode() req = urllib.request.Request(auth_url, data=body, - headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.8.3"}) + headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.9.7"}) resp = urllib.request.urlopen(req, timeout=30) data = json.loads(resp.read()) login_url = data.get("loginUrl", "") or data.get("login_url", "") @@ -3520,7 +3551,7 @@ class EditEndpointDialog(Gtk.Dialog): time.sleep(2) try: poll_req = urllib.request.Request(poll_url, - headers={"User-Agent": "codex-launcher/3.8.3"}) + headers={"User-Agent": "codex-launcher/3.9.7"}) poll_resp = urllib.request.urlopen(poll_req, timeout=10) poll_data = json.loads(poll_resp.read()) user = poll_data.get("user") diff --git a/src/translate-proxy.py b/src/translate-proxy.py index b229c43..9597080 100755 --- a/src/translate-proxy.py +++ b/src/translate-proxy.py @@ -70,9 +70,9 @@ FIX 6: Double-wrapped arguments (nested {"cmd": "{\"cmd\": \"curl...\"}"}") FIX 7: _extract_field can't read values starting with \" Symptom: sandbox_permissions="allow_all" passes through unnormalized because - _extract_field sees val_start=\ (backslash) which != " or { → returns None + _extract_field sees val_start=\\ (backslash) which != \" or { → returns None Fix: Skip leading backslash before checking for " or { value type. - Location: _extract_field() leading-\ skip + Location: _extract_field() leading-backslash skip FIX 8: Adaptive probing caused format mismatch (REVERTED) Symptom: Probe system discovered OpenAI tool_calls+role=tool format but CC API couldn't @@ -335,10 +335,31 @@ def _codebuff_get_session(token, model): req = urllib.request.Request(url, data=body, headers={ "Content-Type": "application/json", "Authorization": f"Bearer {token}", - "User-Agent": "codex-launcher/3.9.0", + "User-Agent": "codex-launcher/3.9.7", "x-codebuff-model": model, }) - resp = urllib.request.urlopen(req, timeout=15) + try: + resp = urllib.request.urlopen(req, timeout=15) + except urllib.error.HTTPError as e: + err_body = e.read().decode()[:1000] + if e.code == 429: + retry_s = 120 + user_msg = "" + try: + err_data = json.loads(err_body) + retry_ms = err_data.get("retryAfterMs", 0) + if retry_ms: + retry_s = retry_ms / 1000 + user_msg = err_data.get("message", err_data.get("error", "")) + if isinstance(user_msg, dict): + user_msg = user_msg.get("message", "") + except Exception: + pass + if not user_msg: + user_msg = _sanitize_err_body(err_body) + raise RateLimitError(retry_s, user_msg) + print(f"[codebuff] session HTTP {e.code}: {err_body[:200]}", file=sys.stderr) + return None data = json.loads(resp.read()) instance_id = data.get("instanceId", data.get("data", {}).get("instance_id", "")) expires_at = data.get("remainingMs", 0) @@ -350,6 +371,8 @@ def _codebuff_get_session(token, model): print(f"[codebuff] session active, instance={instance_id[:8]}...", file=sys.stderr) return instance_id return None + except RateLimitError: + raise except Exception as e: print(f"[codebuff] session failed: {e}", file=sys.stderr) return None @@ -360,21 +383,31 @@ def _codebuff_start_run(token, agent_id): req = urllib.request.Request(url, data=body, headers={ "Content-Type": "application/json", "Authorization": f"Bearer {token}", - "User-Agent": "codex-launcher/3.9.0", + "User-Agent": "codex-launcher/3.9.7", }) try: resp = urllib.request.urlopen(req, timeout=15) data = json.loads(resp.read()) run_id = data.get("runId") print(f"[codebuff] started run {run_id} for agent {agent_id}", file=sys.stderr) - return run_id + return run_id, None except urllib.error.HTTPError as e: - err = e.read().decode()[:300] + err = e.read().decode()[:500] print(f"[codebuff] start run failed: HTTP {e.code}: {err}", file=sys.stderr) - return None + if e.code == 429: + retry_s = 120 + try: + err_data = json.loads(err) + retry_ms = err_data.get("retryAfterMs", 0) + if retry_ms: + retry_s = retry_ms / 1000 + except Exception: + pass + return None, ("rate_limit_error", 429, retry_s, _sanitize_err_body(err)) + return None, ("upstream_error", e.code, 0, _sanitize_err_body(err)) except Exception as e: print(f"[codebuff] start run error: {e}", file=sys.stderr) - return None + return None, ("proxy_error", 502, 0, str(e)) def _codebuff_finish_run(token, run_id, status="completed"): url = f"{_FREEBUFF_API_URL}/api/v1/agent-runs" @@ -383,7 +416,7 @@ def _codebuff_finish_run(token, run_id, status="completed"): req = urllib.request.Request(url, data=body, headers={ "Content-Type": "application/json", "Authorization": f"Bearer {token}", - "User-Agent": "codex-launcher/3.9.0", + "User-Agent": "codex-launcher/3.9.7", }) try: urllib.request.urlopen(req, timeout=10) @@ -392,6 +425,12 @@ def _codebuff_finish_run(token, run_id, status="completed"): # ═══════════════════════════════════════════════════════════════════ # Multi-account rotation system +class RateLimitError(Exception): + def __init__(self, retry_seconds, message=""): + self.retry_seconds = retry_seconds + self.message = message + super().__init__(f"rate-limited for {retry_seconds:.0f}s: {message}") + # ═══════════════════════════════════════════════════════════════════ class AccountPool: @@ -2804,7 +2843,7 @@ def _parse_commandcode_text_tool_calls(text): Delegates to _extract_args() for the arguments field (handles unescaped + escaped JSON). Delegates to _extract_field() for name/id/sandbox_permissions/justification - (with FIX 7 for leading-\ handling). + (with FIX 7 for leading-backslash handling). Normalizes sandbox_permissions to valid values (use_default|require_escalated|with_user_approval) [FIX 6] Prevents double-wrapped args: {"cmd": "{\"cmd\": \"curl...\"}"} @@ -5209,13 +5248,30 @@ class Handler(http.server.BaseHTTPRequestHandler): if attempt > 0: print(f"[codebuff] rotation attempt {attempt+1}/{n_accounts}, trying account {acct_id}", file=sys.stderr) - run_id = _codebuff_start_run(token, agent_id) + run_id, run_err = _codebuff_start_run(token, agent_id) if not run_id: - _fb_pool.mark_rate_limited(acct, 60) - last_err = ("upstream_error", 502, "Failed to start codebuff agent run. Check credentials and network.") + if run_err and run_err[0] == "rate_limit_error": + retry_s = run_err[2] + _fb_pool.mark_rate_limited(acct, retry_s) + last_err = ("rate_limit_error", run_err[1], f"Account {acct_id} rate-limited by Codebuff: {run_err[3]}") + else: + _fb_pool.mark_rate_limited(acct, 60) + last_err = ("upstream_error", run_err[1] if run_err else 502, + f"Failed to start agent run for {acct_id}: {run_err[3] if run_err else 'unknown error'}") continue - instance_id = _codebuff_get_session(token, model) + try: + instance_id = _codebuff_get_session(token, model) + except RateLimitError as rle: + retry_s = rle.retry_seconds + fb_msg = rle.message + mins = int(retry_s // 60) + user_msg = fb_msg if fb_msg else f"Daily session limit reached. Resets in {mins}m." + print(f"[codebuff] session 429 for {acct_id}, retry after {retry_s:.0f}s", file=sys.stderr) + _fb_pool.mark_rate_limited(acct, retry_s) + _codebuff_finish_run(token, run_id, "completed") + last_err = ("rate_limit_error", 429, user_msg) + continue input_data = body.get("input", "") instructions = body.get("instructions", "").strip() @@ -5249,7 +5305,7 @@ class Handler(http.server.BaseHTTPRequestHandler): headers = { "Content-Type": "application/json", "Authorization": f"Bearer {token}", - "User-Agent": "codex-launcher/3.9.0", + "User-Agent": "codex-launcher/3.9.7", "x-codebuff-model": model, } if instance_id: @@ -5266,14 +5322,22 @@ class Handler(http.server.BaseHTTPRequestHandler): _codebuff_finish_run(token, run_id, "failed") if e.code in (429, 426): reset_ms = 0 + fb_msg = "" try: err_json = json.loads(err_body) reset_ms = err_json.get("retryAfterMs", 0) + fb_msg = err_json.get("message", err_json.get("error", "")) + if isinstance(fb_msg, dict): + fb_msg = fb_msg.get("message", "") except Exception: pass duration = max(reset_ms / 1000, 120) if reset_ms else 120 + mins = int(duration // 60) + if not fb_msg: + fb_msg = _sanitize_err_body(err_body) + user_msg = f"{fb_msg} (resets in {mins}m)" if fb_msg else f"Rate limited. Resets in {mins}m." _fb_pool.mark_rate_limited(acct, duration) - last_err = ("upstream_error", e.code, _sanitize_err_body(err_body)) + last_err = ("rate_limit_error", e.code, user_msg) print(f"[codebuff] account {acct_id} got HTTP {e.code}, rotating", file=sys.stderr) continue if _is_reasoning_content_error(err_body): @@ -5357,13 +5421,38 @@ class Handler(http.server.BaseHTTPRequestHandler): return if last_err: - return self.send_json(last_err[1], {"error": {"type": last_err[0], "message": f"All {n_accounts} accounts exhausted. {last_err[2]}"}}) + msg = last_err[2] + resp_id = f"resp_{uuid.uuid4().hex[:24]}" + result = { + "id": resp_id, + "object": "response", + "created_at": int(time.time()), + "model": model, + "status": "completed", + "output": [{ + "id": f"msg_{uuid.uuid4().hex[:24]}", + "type": "message", + "role": "assistant", + "content": [{ + "type": "output_text", + "text": msg, + "annotations": [], + }], + "status": "completed", + }], + "usage": {"input_tokens": 0, "output_tokens": 0, "total_tokens": 0}, + } + try: + return self.send_json(200, result) + except (BrokenPipeError, ConnectionResetError, ConnectionAbortedError): + return def _fb_retry_thinking_disabled(self, body, model, token, agent_id, stream, tracker, input_data, instructions, original_error, acct=None): - run_id = _codebuff_start_run(token, agent_id) + run_id, run_err = _codebuff_start_run(token, agent_id) if not run_id: - return self.send_json(502, {"error": {"type": "upstream_error", - "message": "Failed to start codebuff agent run for retry."}}) + msg = run_err[3] if run_err else "unknown error" + return self.send_json(run_err[1] if run_err else 502, {"error": {"type": run_err[0] if run_err else "upstream_error", + "message": f"Failed to start agent run for retry: {msg}"}}) instance_id = _codebuff_get_session(token, model) messages = _fb_input_to_messages(input_data, instructions) _codebuff_hard_disable_reasoning(messages) @@ -5385,7 +5474,7 @@ class Handler(http.server.BaseHTTPRequestHandler): if body.get("tool_choice"): chat_body["tool_choice"] = body["tool_choice"] target = f"{_FREEBUFF_API_URL}/api/v1/chat/completions" - headers = {"Content-Type": "application/json", "Authorization": f"Bearer {token}", "User-Agent": "codex-launcher/3.9.0", "x-codebuff-model": model} + headers = {"Content-Type": "application/json", "Authorization": f"Bearer {token}", "User-Agent": "codex-launcher/3.9.7", "x-codebuff-model": model} if instance_id: headers["x-codebuff-instance-id"] = instance_id print(f"[codebuff] retry POST {target} model={model} stream={stream} run={run_id} (thinking disabled via DeepSeek native)", file=sys.stderr)