From 1605939e2a61bf629baf53a8bcb354694c4aea69 Mon Sep 17 00:00:00 2001 From: Illia Polosukhin Date: Wed, 4 Feb 2026 09:16:03 -0800 Subject: [PATCH] Add Telegram Bot API channel as WASM module Implements a loadable WASM channel for Telegram following the existing Slack channel pattern: - Webhook-based message receiving at /webhook/telegram - Private chat and group chat support (with @mention filtering) - Reply threading via reply_to_message_id - User name extraction from Telegram user objects - Bot token injection by host (never exposed to WASM) Files: - channels-src/telegram/src/lib.rs - Main implementation - channels-src/telegram/Cargo.toml - Dependencies - channels-src/telegram/telegram.capabilities.json - Permissions - channels-src/telegram/build.sh - Build script To use: copy telegram.wasm and telegram.capabilities.json to ~/.near-agent/channels/ and configure telegram_bot_token secret. Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 2 +- channels-src/telegram/Cargo.lock | 401 +++++++++++++ channels-src/telegram/Cargo.toml | 24 + channels-src/telegram/build.sh | 43 ++ channels-src/telegram/src/lib.rs | 548 ++++++++++++++++++ .../telegram/telegram.capabilities.json | 42 ++ channels-src/telegram/telegram.wasm | Bin 0 -> 190063 bytes 7 files changed, 1059 insertions(+), 1 deletion(-) create mode 100644 channels-src/telegram/Cargo.lock create mode 100644 channels-src/telegram/Cargo.toml create mode 100755 channels-src/telegram/build.sh create mode 100644 channels-src/telegram/src/lib.rs create mode 100644 channels-src/telegram/telegram.capabilities.json create mode 100644 channels-src/telegram/telegram.wasm diff --git a/CLAUDE.md b/CLAUDE.md index ba2887cb..6ae73405 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -351,7 +351,7 @@ Inspired by [OpenClaw](https://github.com/openclaw/openclaw), the workspace prov ### Key Principles -1. **"Memory is files, not RAM"** - If you want to remember something, write it explicitly +1. **"Memory is database, not RAM"** - If you want to remember something, write it explicitly 2. **Flexible structure** - Create any directory/file hierarchy you need 3. **Self-documenting** - Use README.md files to describe directory structure 4. **Hybrid search** - Combines FTS (keyword) + vector (semantic) via Reciprocal Rank Fusion diff --git a/channels-src/telegram/Cargo.lock b/channels-src/telegram/Cargo.lock new file mode 100644 index 00000000..a6e5c3ac --- /dev/null +++ b/channels-src/telegram/Cargo.lock @@ -0,0 +1,401 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "spdx" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3" +dependencies = [ + "smallvec", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "telegram-channel" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "wit-bindgen", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasm-encoder" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e913f9242315ca39eff82aee0e19ee7a372155717ff0eb082c741e435ce25ed1" +dependencies = [ + "leb128", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185dfcd27fa5db2e6a23906b54c28199935f71d9a27a1a27b3a88d6fee2afae7" +dependencies = [ + "anyhow", + "indexmap", + "serde", + "serde_derive", + "serde_json", + "spdx", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d07b6a3b550fefa1a914b6d54fc175dd11c3392da11eee604e6ffc759805d25" +dependencies = [ + "ahash", + "bitflags", + "hashbrown 0.14.5", + "indexmap", + "semver", +] + +[[package]] +name = "wit-bindgen" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a2b3e15cd6068f233926e7d8c7c588b2ec4fb7cc7bf3824115e7c7e2a8485a3" +dependencies = [ + "wit-bindgen-rt", + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b632a5a0fa2409489bd49c9e6d99fcc61bb3d4ce9d1907d44662e75a28c71172" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7947d0131c7c9da3f01dfde0ab8bd4c4cf3c5bd49b6dba0ae640f1fa752572ea" +dependencies = [ + "bitflags", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4329de4186ee30e2ef30a0533f9b3c123c019a237a7c82d692807bf1b3ee2697" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177fb7ee1484d113b4792cc480b1ba57664bbc951b42a4beebe573502135b1fc" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b505603761ed400c90ed30261f44a768317348e49f1864e82ecdc3b2744e5627" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.220.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae2a7999ed18efe59be8de2db9cb2b7f84d88b27818c79353dfc53131840fe1a" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "zerocopy" +version = "0.8.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57cf3aa6855b23711ee9852dfc97dfaa51c45feaba5b645d0c777414d494a961" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a616990af1a287837c4fe6596ad77ef57948f787e46ce28e166facc0cc1cb75" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" diff --git a/channels-src/telegram/Cargo.toml b/channels-src/telegram/Cargo.toml new file mode 100644 index 00000000..d33266e5 --- /dev/null +++ b/channels-src/telegram/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "telegram-channel" +version = "0.1.0" +edition = "2021" +description = "Telegram Bot API channel for NEAR Agent" +license = "MIT OR Apache-2.0" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# WIT bindgen for WASM component model +wit-bindgen = "0.36" + +# Serialization +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +[profile.release] +# Optimize for size +opt-level = "s" +lto = true +strip = true +codegen-units = 1 diff --git a/channels-src/telegram/build.sh b/channels-src/telegram/build.sh new file mode 100755 index 00000000..531ab762 --- /dev/null +++ b/channels-src/telegram/build.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# Build the Telegram channel WASM component +# +# Prerequisites: +# - Rust with wasm32-wasip2 target: rustup target add wasm32-wasip2 +# - wasm-tools for component creation: cargo install wasm-tools +# +# Output: +# - telegram.wasm - WASM component ready for deployment +# - telegram.capabilities.json - Capabilities file (copy alongside .wasm) + +set -euo pipefail + +cd "$(dirname "$0")" + +echo "Building Telegram channel WASM component..." + +# Build the WASM module +cargo build --release --target wasm32-wasip2 + +# Convert to component model (if not already a component) +# wasm-tools component new is idempotent on components +WASM_PATH="target/wasm32-wasip2/release/telegram_channel.wasm" + +if [ -f "$WASM_PATH" ]; then + # Create component if needed + wasm-tools component new "$WASM_PATH" -o telegram.wasm 2>/dev/null || cp "$WASM_PATH" telegram.wasm + + # Optimize the component + wasm-tools strip telegram.wasm -o telegram.wasm + + echo "Built: telegram.wasm ($(du -h telegram.wasm | cut -f1))" + echo "" + echo "To install:" + echo " mkdir -p ~/.near-agent/channels" + echo " cp telegram.wasm telegram.capabilities.json ~/.near-agent/channels/" + echo "" + echo "Then add your bot token to secrets:" + echo " # Set TELEGRAM_BOT_TOKEN in your environment or secrets store" +else + echo "Error: WASM output not found at $WASM_PATH" + exit 1 +fi diff --git a/channels-src/telegram/src/lib.rs b/channels-src/telegram/src/lib.rs new file mode 100644 index 00000000..e4d97f88 --- /dev/null +++ b/channels-src/telegram/src/lib.rs @@ -0,0 +1,548 @@ +// Telegram API types have fields reserved for future use (entities, reply threading, etc.) +#![allow(dead_code)] + +//! Telegram Bot API channel for NEAR Agent. +//! +//! This WASM component implements the channel interface for handling Telegram +//! webhooks and sending messages back via the Bot API. +//! +//! # Features +//! +//! - Webhook-based message receiving +//! - Private chat (DM) support +//! - Group chat support with @mention triggering +//! - Reply threading support +//! - User name extraction +//! +//! # Security +//! +//! - Bot token is injected by host during HTTP requests +//! - WASM never sees raw credentials +//! - Optional webhook secret validation by host + +// Generate bindings from the WIT file +wit_bindgen::generate!({ + world: "sandboxed-channel", + path: "../../wit/channel.wit", +}); + +use serde::{Deserialize, Serialize}; + +// Re-export generated types +use exports::near::agent::channel::{ + AgentResponse, ChannelConfig, Guest, HttpEndpointConfig, IncomingHttpRequest, + OutgoingHttpResponse, PollConfig, +}; +use near::agent::channel_host::{self, EmittedMessage}; + +// ============================================================================ +// Telegram API Types +// ============================================================================ + +/// Telegram Update object (webhook payload). +/// https://core.telegram.org/bots/api#update +#[derive(Debug, Deserialize)] +struct TelegramUpdate { + /// Unique update identifier. + update_id: i64, + + /// New incoming message. + message: Option, + + /// Edited message. + edited_message: Option, + + /// Channel post (we ignore these for now). + channel_post: Option, +} + +/// Telegram Message object. +/// https://core.telegram.org/bots/api#message +#[derive(Debug, Deserialize)] +struct TelegramMessage { + /// Unique message identifier. + message_id: i64, + + /// Sender (empty for channel posts). + from: Option, + + /// Chat the message belongs to. + chat: TelegramChat, + + /// Message text. + text: Option, + + /// Original message if this is a reply. + reply_to_message: Option>, + + /// Bot command entities (for /commands). + entities: Option>, +} + +/// Telegram User object. +/// https://core.telegram.org/bots/api#user +#[derive(Debug, Deserialize)] +struct TelegramUser { + /// Unique user identifier. + id: i64, + + /// True if this is a bot. + is_bot: bool, + + /// User's first name. + first_name: String, + + /// User's last name. + last_name: Option, + + /// Username (without @). + username: Option, +} + +/// Telegram Chat object. +/// https://core.telegram.org/bots/api#chat +#[derive(Debug, Deserialize)] +struct TelegramChat { + /// Unique chat identifier. + id: i64, + + /// Type of chat: private, group, supergroup, or channel. + #[serde(rename = "type")] + chat_type: String, + + /// Title for groups/channels. + title: Option, + + /// Username for private chats. + username: Option, +} + +/// Message entity (for parsing @mentions, commands, etc.). +/// https://core.telegram.org/bots/api#messageentity +#[derive(Debug, Deserialize)] +struct MessageEntity { + /// Type: mention, bot_command, etc. + #[serde(rename = "type")] + entity_type: String, + + /// Offset in UTF-16 code units. + offset: i64, + + /// Length in UTF-16 code units. + length: i64, + + /// For "mention" type, the mentioned user. + user: Option, +} + +/// Telegram API response wrapper. +#[derive(Debug, Deserialize)] +struct TelegramApiResponse { + /// True if the request was successful. + ok: bool, + + /// Error description if not ok. + description: Option, + + /// Result on success. + result: Option, +} + +/// Response from sendMessage. +#[derive(Debug, Deserialize)] +struct SentMessage { + message_id: i64, +} + +// ============================================================================ +// Channel Metadata +// ============================================================================ + +/// Metadata stored with emitted messages for response routing. +#[derive(Debug, Serialize, Deserialize)] +struct TelegramMessageMetadata { + /// Chat ID where the message was received. + chat_id: i64, + + /// Original message ID (for reply_to_message_id). + message_id: i64, + + /// User ID who sent the message. + user_id: i64, + + /// Whether this is a private (DM) chat. + is_private: bool, +} + +/// Channel configuration from capabilities file. +#[derive(Debug, Deserialize)] +struct TelegramConfig { + /// Bot username (without @) for mention detection in groups. + #[serde(default)] + bot_username: Option, + + /// Whether to respond to all group messages (not just mentions). + #[serde(default)] + respond_to_all_group_messages: bool, + + /// Whether to use polling instead of webhooks. + #[serde(default)] + polling_enabled: bool, + + /// Polling interval in milliseconds (if polling enabled). + #[serde(default = "default_poll_interval")] + poll_interval_ms: u32, +} + +fn default_poll_interval() -> u32 { + 30000 // 30 seconds (minimum allowed) +} + +// ============================================================================ +// Channel Implementation +// ============================================================================ + +struct TelegramChannel; + +impl Guest for TelegramChannel { + fn on_start(config_json: String) -> Result { + let config: TelegramConfig = serde_json::from_str(&config_json) + .map_err(|e| format!("Failed to parse config: {}", e))?; + + channel_host::log(channel_host::LogLevel::Info, "Telegram channel starting"); + + if let Some(ref username) = config.bot_username { + channel_host::log( + channel_host::LogLevel::Info, + &format!("Bot username: @{}", username), + ); + } + + // Configure polling if enabled + let poll = if config.polling_enabled { + Some(PollConfig { + interval_ms: config.poll_interval_ms.max(30000), // Enforce minimum + enabled: true, + }) + } else { + None + }; + + Ok(ChannelConfig { + display_name: "Telegram".to_string(), + http_endpoints: vec![HttpEndpointConfig { + path: "/webhook/telegram".to_string(), + methods: vec!["POST".to_string()], + require_secret: false, // Telegram doesn't use signing secrets by default + }], + poll, + }) + } + + fn on_http_request(req: IncomingHttpRequest) -> OutgoingHttpResponse { + // Parse the request body as UTF-8 + let body_str = match std::str::from_utf8(&req.body) { + Ok(s) => s, + Err(_) => { + return json_response(400, serde_json::json!({"error": "Invalid UTF-8 body"})); + } + }; + + // Parse as Telegram Update + let update: TelegramUpdate = match serde_json::from_str(body_str) { + Ok(u) => u, + Err(e) => { + channel_host::log( + channel_host::LogLevel::Error, + &format!("Failed to parse Telegram update: {}", e), + ); + // Still return 200 to prevent Telegram from retrying + return json_response(200, serde_json::json!({"ok": true})); + } + }; + + // Handle the update + handle_update(update); + + // Always respond 200 quickly (Telegram expects fast responses) + json_response(200, serde_json::json!({"ok": true})) + } + + fn on_poll() { + // Polling mode: call getUpdates API + // For now, we focus on webhook mode. Polling can be added later. + channel_host::log( + channel_host::LogLevel::Debug, + "Polling tick (not implemented yet)", + ); + } + + fn on_respond(response: AgentResponse) -> Result<(), String> { + // Parse metadata to get chat info + let metadata: TelegramMessageMetadata = serde_json::from_str(&response.metadata_json) + .map_err(|e| format!("Failed to parse metadata: {}", e))?; + + // Build sendMessage payload + let mut payload = serde_json::json!({ + "chat_id": metadata.chat_id, + "text": response.content, + "parse_mode": "Markdown", + }); + + // Reply to the original message for context + payload["reply_to_message_id"] = serde_json::Value::Number(metadata.message_id.into()); + + let payload_bytes = serde_json::to_vec(&payload) + .map_err(|e| format!("Failed to serialize payload: {}", e))?; + + // Make HTTP request to Telegram API + // The bot token is injected into the URL by the host + let headers = serde_json::json!({ + "Content-Type": "application/json" + }); + + let result = channel_host::http_request( + "POST", + "https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage", + &headers.to_string(), + Some(&payload_bytes), + ); + + match result { + Ok(http_response) => { + if http_response.status != 200 { + let body_str = String::from_utf8_lossy(&http_response.body); + return Err(format!( + "Telegram API returned status {}: {}", + http_response.status, body_str + )); + } + + // Parse Telegram response + let api_response: TelegramApiResponse = + serde_json::from_slice(&http_response.body).map_err(|e| { + format!("Failed to parse Telegram response: {}", e) + })?; + + if !api_response.ok { + return Err(format!( + "Telegram API error: {}", + api_response.description.unwrap_or_else(|| "unknown".to_string()) + )); + } + + channel_host::log( + channel_host::LogLevel::Debug, + &format!( + "Sent message to chat {}: message_id={}", + metadata.chat_id, + api_response.result.map(|r| r.message_id).unwrap_or(0) + ), + ); + + Ok(()) + } + Err(e) => Err(format!("HTTP request failed: {}", e)), + } + } + + fn on_shutdown() { + channel_host::log(channel_host::LogLevel::Info, "Telegram channel shutting down"); + } +} + +// ============================================================================ +// Update Handling +// ============================================================================ + +/// Process a Telegram update and emit messages if applicable. +fn handle_update(update: TelegramUpdate) { + // Handle regular messages + if let Some(message) = update.message { + handle_message(message); + } + + // Optionally handle edited messages the same way + if let Some(message) = update.edited_message { + handle_message(message); + } +} + +/// Process a single message. +fn handle_message(message: TelegramMessage) { + // Skip messages without text + let text = match message.text { + Some(t) if !t.is_empty() => t, + _ => return, + }; + + // Skip messages without a sender (channel posts) + let from = match message.from { + Some(f) => f, + None => return, + }; + + // Skip bot messages to avoid loops + if from.is_bot { + return; + } + + let is_private = message.chat.chat_type == "private"; + + // For group chats, check if the bot was mentioned + // TODO: Read bot_username from config and check mentions + // For now, process all messages in private chats and groups + if !is_private { + // In groups, only respond if there's a bot mention or command + // This is a simplified check - proper implementation would use entities + let has_command = text.starts_with('/'); + let has_mention = text.contains('@'); + + if !has_command && !has_mention { + channel_host::log( + channel_host::LogLevel::Debug, + &format!("Ignoring group message without mention: {}", text), + ); + return; + } + } + + // Build user display name + let user_name = if let Some(ref last) = from.last_name { + format!("{} {}", from.first_name, last) + } else { + from.first_name.clone() + }; + + // Build metadata for response routing + let metadata = TelegramMessageMetadata { + chat_id: message.chat.id, + message_id: message.message_id, + user_id: from.id, + is_private, + }; + + let metadata_json = + serde_json::to_string(&metadata).unwrap_or_else(|_| "{}".to_string()); + + // Clean the message text (strip bot mentions and commands) + let cleaned_text = clean_message_text(&text); + + if cleaned_text.is_empty() { + return; + } + + // Emit the message to the agent + channel_host::emit_message(&EmittedMessage { + user_id: from.id.to_string(), + user_name: Some(user_name), + content: cleaned_text, + thread_id: None, // Telegram doesn't have threads in the same way + metadata_json, + }); + + channel_host::log( + channel_host::LogLevel::Debug, + &format!( + "Emitted message from user {} in chat {}", + from.id, message.chat.id + ), + ); +} + +/// Clean message text by removing bot commands and @mentions at the start. +fn clean_message_text(text: &str) -> String { + let mut result = text.trim().to_string(); + + // Remove leading /command + if result.starts_with('/') { + if let Some(space_idx) = result.find(' ') { + result = result[space_idx..].trim_start().to_string(); + } else { + // Just a command with no text + return String::new(); + } + } + + // Remove leading @mention + if result.starts_with('@') { + if let Some(space_idx) = result.find(' ') { + result = result[space_idx..].trim_start().to_string(); + } else { + // Just a mention with no text + return String::new(); + } + } + + result +} + +// ============================================================================ +// Utilities +// ============================================================================ + +/// Create a JSON HTTP response. +fn json_response(status: u16, value: serde_json::Value) -> OutgoingHttpResponse { + let body = serde_json::to_vec(&value).unwrap_or_default(); + let headers = serde_json::json!({"Content-Type": "application/json"}); + + OutgoingHttpResponse { + status, + headers_json: headers.to_string(), + body, + } +} + +// Export the component +export!(TelegramChannel); + +// ============================================================================ +// Tests +// ============================================================================ + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_clean_message_text() { + assert_eq!(clean_message_text("/start hello"), "hello"); + assert_eq!(clean_message_text("@bot hello world"), "hello world"); + assert_eq!(clean_message_text("/start"), ""); + assert_eq!(clean_message_text("@botname"), ""); + assert_eq!(clean_message_text("just text"), "just text"); + assert_eq!(clean_message_text(" spaced "), "spaced"); + } + + #[test] + fn test_parse_update() { + let json = r#"{ + "update_id": 123, + "message": { + "message_id": 456, + "from": { + "id": 789, + "is_bot": false, + "first_name": "John", + "last_name": "Doe" + }, + "chat": { + "id": 789, + "type": "private" + }, + "text": "Hello bot" + } + }"#; + + let update: TelegramUpdate = serde_json::from_str(json).unwrap(); + assert_eq!(update.update_id, 123); + + let message = update.message.unwrap(); + assert_eq!(message.message_id, 456); + assert_eq!(message.text.unwrap(), "Hello bot"); + + let from = message.from.unwrap(); + assert_eq!(from.id, 789); + assert_eq!(from.first_name, "John"); + } +} diff --git a/channels-src/telegram/telegram.capabilities.json b/channels-src/telegram/telegram.capabilities.json new file mode 100644 index 00000000..23a4af65 --- /dev/null +++ b/channels-src/telegram/telegram.capabilities.json @@ -0,0 +1,42 @@ +{ + "type": "channel", + "name": "telegram", + "description": "Telegram Bot API channel for receiving and responding to Telegram messages", + "capabilities": { + "http": { + "allowlist": [ + { "host": "api.telegram.org", "path_prefix": "/bot" } + ], + "credentials": { + "telegram_bot": { + "secret_name": "telegram_bot_token", + "location": { "type": "url_path", "placeholder": "{TELEGRAM_BOT_TOKEN}" }, + "host_patterns": ["api.telegram.org"] + } + }, + "rate_limit": { + "requests_per_minute": 30, + "requests_per_hour": 1000 + } + }, + "secrets": { + "allowed_names": ["telegram_*"] + }, + "channel": { + "allowed_paths": ["/webhook/telegram"], + "allow_polling": true, + "min_poll_interval_ms": 30000, + "workspace_prefix": "channels/telegram/", + "emit_rate_limit": { + "messages_per_minute": 100, + "messages_per_hour": 5000 + } + } + }, + "config": { + "bot_username": null, + "respond_to_all_group_messages": false, + "polling_enabled": false, + "poll_interval_ms": 30000 + } +} diff --git a/channels-src/telegram/telegram.wasm b/channels-src/telegram/telegram.wasm new file mode 100644 index 0000000000000000000000000000000000000000..be4c20b97ec92c5bdaff097f37e3bb5f361341f4 GIT binary patch literal 190063 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≶C6wHTIDG8`jlDugI{q4!oYkr=Dj>K{$`r4AGMmz zO_Y{}W^pO|uiQTuCw2_1ZWlFY3WPJt%6H$Z@hYzdroZ>wlPUMV|BLqcOZni}1rA|G z^3|nVQ{V5u&fa}JGk47`YrsG7c7u?qeEF>3zDJz< z?swSZ_hk;aTht7~rA}k`jONqWWz#fnjxo9+{g#6^h~E;qx@eH>T4VOn4-DkU-GO{AXutB^Qj5A?~Lzh>tmAoCqvKE8{O72`>_xbx|Y2OAh{Y zn9(bn%vd*zw!HLMw>JS**H&ogAR8sDZ?F>Bxvgl^`GfQhvG2=kp|KMVMOaT4mK4S1 z>B2a>i~bPehk+{ZA9Am@6+h$a~?OhD;Ix|D5XwA1263L~lS(q$6B3!OXw)wo7LQZN>FyUQn z&n(|{RC11+`~1e{-3vR)tjvpr9V!J(%^30DrZWd^AvUbFeHzb#Fv0z{#BPt`_9uZ5XfW~0g+atoc ziP)2gCa)O*Kv!iuISMlLg|_A0Aozxf>P9g4ujf}+TLEOpU1pv!-RThd7u!`sJ@|w; zlM&I2$mIbc)jQ$|XnPC|Rk!I3*-o*PJ{r-;@9W1$1g8b`OqbgQGnX3@*^?W|>MkRU zBI$jpmG%+Sl8Cw4{&IT2zaS@hPwpUiJsYW zqS#n`DlyG8;U)GdEix7?l|>8M(;hVvagJ<>O54MzT9shf$nGl9^=&qL068b3Nvdh* zM|lV7f>TEFg_lvkr~ z;mbr{(p4>xvH2Jm6kZLqno>m8n4u|+L$RbpeJ+|91As>IO}v#C8&4l;|+VogUL5)f(*HTVw%N|jLd8I^sxaWqW- z4Ok;4a(%@z27{Kx;+LTt>u=szCj@7K5FO-zmDtGzXPulZm_Rp=IyStivuTd~q!*@K zEg;H_PG~!<*uI=|?Nt$-E(#1B3bS}3`pm_uND6L#Qqfe{Va#Lcdy6tm?nFjh)`noI zpj2ZCc+sYMt_*X^SpgOnzdcky6VHOFNo(7jumpRO-g$%bn!JfEH-+B~=07*-W!hr8A3d2{;Ln#lx=+xmC zv@Ul!nGLLRDz+M80D?aD2O$8#79SOW;1jtWGA@j!cMCRfqLp$YjZJ?A;yUx+-H*7Z zXzy?D&At=q;=Zl4;bg-#E(NB=n%7d5ez|Y%HP-2$mwjSuOT5@^#a?YM?rFZ*WiMW7 zFRY39g?qzp;ze7Lu}U=GR=6v9$=vGYjV1&gf{N&gyou=F0RK_5s1*#{mVfcQ@C&dS z{u$6X{F^}|B9P#0#mEa_!e0nX@(v0Dz+O+v$7*P+&Vi=Vosp z(~-~*X|%%p-?c+|S8ARgJY=h|Jzs4(fCFXELHh6~^3W1%xI;>yCE+0-&){X)ERgW+ zRII~MrFyimn+BY|&vl+86IJ4Yxl4X0U&umLnT$2Xv{}=8XSKZL=0?lUtzlH8gEwRa zSm4U=Zk2!i^Bb@Qb}_$;aWyERB-Wk6sA<<4o9xY!*1#J#%s1=NY-CP$=>qZSNv+S{ z=mnwig4;w0Gy7Y0nk(|&qiIczb##L8>xkQlWAob$wen*QMrmV?0f8!z&};`e#7c+)<&MLlg(6Zh2DYk0K}Bzr5PA>~A^bD9sWaG_DsHMXgpOJ)ALC=% zRSQLk2`b4$ENE`Apug5@aqRG&jf00bFvKQBjVwGw%}>_(# z(Gdaj8VsK7UJb`dr+rSqq8S~7kWV%9*t}+b!4%|kX@(OCpL;Vu^_-i*il!N8#tz;d zN7|`*y?N7fZiX;N^@b2%L#KuE#VG7E^P1sIT;%F=LE3VZ&yjD+C*NnXnIM5F*^KGd zpDO>R_gne??DD;-^6&KWE3?aYr^-L%iU1v%g^a=XR7|+^YU9}!{44N|5-1;JiC0gS-a}*pL_W^_(bG5UL*>k z+Bs;{i~!}4yeLNieqz+#ujo$uUvhW6|GQ_CA8_R$=KgJwn(_G>xXE~A%F)Fj4vEJe zll9Da{Gs2p_aFL!QD+Aa{$qR)T3ERIm7|1tS1J3vv!ldr+95Xqua+iT?=2Sx;xr1`$0 zWi!!~uVh_oKM*Qp@VK<5CiU{~(2_1-=qlP+*#DkKkNkrE8@*xwv)}mo-+lGZe*4+i z-B~Q`KmFU!KBM3N=FY?Xdg8?2eBo0+^VVN|B54-Wn?rB7d%qk>M~)ufSU+_4XyKLe zQVFtrtyuVp2g>|*fzea@mC`u*MIk?~zTMZUcZU>}CIe2^Ym&jI1%0+}_CHw`+hhvr z<`VSXR}vy9f(R9xP*@}y}4w2p1Td6Sp#JcMp+_j)}Yft#0a;^$(g+wCrN zrTXMi*^VISLh%}395lLE^kP)v8(*?+d{M-u?qQ@D$|=_>uvR5)N*YEWnq&_&Yq`|#aM|&fX(U8`jzLua@vu{=XYQ2Q`09~NovUt+{F?)t0}85W95jXJqW7Gfx#U9CS6`& z7to4@Zb9+v$I9b8wdOdnnA4Xj#nvc}iUEU7&FAAEPKJvTM^_&i2=)FNE#a&#|Vu zej+%+_>C9DgFktrCHkzi8cwPP$%K-iH#Ud}F;&LzHOiEkkVTl{wiw zDh9RCz(9Xu#wkm;l$9Khyo;KJ{lR|{?x~Z7>hMC^wozxNVhgVjg^Z~d*g|WMt^Kh@$X6o%%bQBGg3U6C zVTyKCe*>jz286yw&5*!A?^$@#@DZ3~L&X@#14FrLT&ylcNrm!0g5*3XczdQV|07 zDAS|wNRxv&)hUt3pV93cWiU%ZxWgtuhA<(GD0inpW@JMjUXt3jEkvI~UOwWg@_nLd z*e|O^*w6iMlC5C&LL}-dXND4Fb9GWGoQx9{y{r5&N$(G{JhRgU12y4UYSnJeBFE*J z?~B%&V8rH@j+&a4X>modql5n>(~@z%fDKV6X4T-A@0R{#G;Z`0Mx{{l2k-8Xkq`3@ADJ)Z)(>J}F0a_slL2~?n=RInWU;o7uz zMOBITaa5%YQbHpE0 zj4}o2x2rd}o!PxT>;4BY_8C2*gh(r)qy3DIhY8Q15prHg5QvJXJl|@*Br3$frhwSh z-h|Cu*jw+W1WUf(lcui=(A9mBUnCi(*}igHKqZTwz_l&HWzn-t6M>;VqOeGMYhz5) zuE|?406@ME?FrhQ1M&a=XCq-F6i8U}NOnwQjZv39h`6^iJ|O|E{&=mudoOCsotHB= ztoC@HoOb9rO^pAwW!#lcg3qqij>$z(bD0)_3^+-Mq>S@a2U99WR?JOh>qc^V0PI!y zO$ySGIv)J7dV-c#95I4;7$^jv{CKT->1)G~p06G=8wa&*E;E`zLe6fc7nQo~TRZO) z?BD~$m=H9d(8vqi@gCXB)sj?cYcm?#tWPHR-0q-}!EdSliP~%VXQMiXu1)(Pw+QLh zJ`o)u#B0uSiqI`{icEFO!Lq*1>eeQ0JLOMRxar7u=M9PGz7@J` zjt`xJMF4AC6<0Z}N&<7`HFIg4(;G**GguyUN@OrpmowN#&~tMcY@aX1ItPit$nEd| zCK;&8BQe1R0-4lfH_=6CqEdp$F>~S?)@@L&0Aj2Si>A6V3QfNNZ;(QcKOaR-V>4dKg}ryMk?7pA|#mw z%c3C%cLsgKcZd5^k#Nh8Svz#3&5RXudt^rUXbFo@1f^(; z23!=Yt1~dd>d6wDUer8Zroa5;UHNt79*v>&VKa_0mBk$|S2EGn?^f8H^DT`gTICh1 zWyf2Q9^tIK8N6E>Lo#krJu+CUJZQSB(;aM#MfjL~adhe#f_(5LFJqrI3xLBQQ0dLl)O!TgfnwkBaE#OW2ae)>v z-I`|s3oL_fmIb^?+YKojmAXsWP3As9RUzjlhQz#{u^Jl}{h4I}E3D21>qHgRdaaqj zeXKHSP#C$=2Q>^20`$cm4+a#k-<5nIOR_ld0n-QwTo9NNPZvOh9YO z%@L`CkLF-7T0RS)!D_dp;(=C$N{p_6j1P|KuwZmmmIVpgCv6keZQmPmjJ%q536}Wg zUpF`=LXnie|EC-4tVvYX{{_K;`Jw&g>ELrd6G08)Z3Dd7tResZ>^Jh1X)2aWT}wNs zMoiFMy~ibvN+9lOv>DT&n{uW;!<=zq=X->0nDAS(BIZe*BEb=;lda}Mqe&i6m?=Zi z2FfHIX7bkIpG7+e>0opS4Kx1xG4j_@w=jW&Qm%jAJ#n{C zAxjZIL>bPI{6T*4#rON=6#}B%ki+h^d@2M!o~#c3RD;D(c}+xOeEwH#?Dz6sbAj@h z)y>U=b~8Av575>b>k6(zsFNFDlygu$&9I?0jbX8X*@B{p`!NJ#l$YkqW1n)I;|zdk zH{bC<49a#h9u(Z=<-MBD@Qb;Q!&e@C(tBzR0f7=$sb4x&#DY~kb0GnD?-iWF+HMI0 zb_Ov=hc;Cs<TTlUIu++u|m6u?wk83E=*P~cZXc34x!t6(Z$;?x%9H_nulBT zkvsuX2>Mx|TDAi7dcuD|p7wVHlR%?IwB<@m6$|JUMhRU zgHPx|$(G0~cy!FPJp-z@gWuAt!9Btdm4lpPi<-Rb&W;n`puCA7oE*})Y}B@Pnvgc? zTLR%XJk$(U8jcKWEx({lS)2`SUkwU}t})XJJHuFsIptF2MZh3iyFC1q#*&+R?WUqE zI;$M2na&}pMjp5hKe1udz=$iX$BE_XFY6(+lHE44Qy54YExU)1BCkF?JjTNil6XY; z^_Y1>jH2=NiNLar92y&qh$G7hDedo+_e7&L((vjo?1!-Q2i)WYLHdX)nA6S3ql)reY{F}Y}oY=ODrpmv2)AC!V%74Ji&*|@As{C(m zT7S$QUgPKYH!Z(1RsWxO`8oKRj@A52FF%JKreie^|DoakyJnBqbgbs@c=>I!%TLE@ ze%8yscy{^eSk0e)+~B!-cKPX8&5wHdU9-zi$7=ppFF%KVreihFc=Q3C-0S@lEi&40H56;Mk28hhVx{~^T2)=tv!Gw!m#0fHkfV-}3a9$yB8wvomjEZ4 z1DB5ONZoE{?vSBx!H!zUP+xFtD$gg;v+4U3IY7ONvyJkB!(WPSRAO3N$v27C4sFsLI?Db4IdU&QqPV zv%ud#g`@*4$aKW1L>MaWF@k`AEp&qJ$^5jJOp`b_3D|jQ9S8s>C4PmB*yHLq-@KS_ zY{JL{T!yG|pBtxDU_HmKbDV( zooF>|4ZbMGBi_pgj94UEfmC->%4ic1Y zh2x9j=~v)ytaPIuc*`gPuClAvSgSLOYyi;%{tnb}@=M4m2bJbEm0JA@ZVB(1mF6KV zlITmiwWv$SHeNIM3?_rWU{}GavG>!x@CStFaJWeektVbbk?U)NNQ;IUyOE7@h6_1w zMH|#4gb~kX2irKOl4VoreE0-cJ|VU9r1@hrq&d%mG`}JN1l#tX3{FcDpnO9_%UiQd zaaJ> z7yd$V4F1B}XZn(O0;>AWUsi7v6U4#=T2Zs^gc*LWc&Gh%?6Q6P;fkMROF{Clmy`YG z6Jj|*KAn$!V!x)g_P;}ic_ za`k%KsAHro;UJ~Ko(P*?lXX$2Z}34brKI4?YZ4C4DPKwOEz67?)#OJ)=yZAowwtgyfPx}x*&{%6y>?_|<1MN4pk zpX$)HW_^{&u`fUdPYIJRfeAhsTcQXcLw6bcs@amp1# zA;G7G^(7cgMQm`4(QE~<{DDrHS$RkVpiguEvK7T4F8Elt4`(sJdjJZ`9H&yWb1uJ!x!cPTeT~kWooUy}_*p z2og_GF-jaLE!Dk6XL9JE0!t|t&r5*(Nys_)N<_aUK&Ws%8@SYZUUX=R^XAq_VsYh< zl_K>!ZUt&`pS@hfb(pC_j@z0Mx_E&HCpO1h3(0iebR{0Ue zb>jPvDDh966PIT{vVm&{0wCS}i*gbMc}+4U7OBD)N;!<0xj+%P&k(2qWeh0wo>Av* z0hF_c{vXDtUCu7Ao&EL^(yHjZog-uZX|AMlCWcJSHNp%J*)|d z1Mo-mse)j%qnxVp10vVB^eq!Nbg)H0TF)4Jxq$f-_W}`>$_5RTul~fC^qkQ&U1{OB zAV_r6!cg|sdxtO0T8HvzBOGs6>Li$q$N&115F_?gM|O;d-68v%xpnwOYrjo_S6$`Pzi z5`I8p_i4YP5|^yEH8bTWfA_2o&Pwbkc6*&t9DUs${EZ1B#NR|FlgIx`-Ie*>mMfx} z$)wJU%txMiq}4jx*LSB&e&P9#Pk7y^Md-xg_0YClASbGRoIFNsI|%6C=d@&~ql zFiNf>;+^#+kjx;M|$ zt<=|Fe5ECE(9QY}D5)dYvwhO_VTA=93a!*DEV59dj}FKv$=20Ymgfm9k?u~C@=JgD z!9V8^91H-TO_b>{(JCz_9k+~UUBeZ0&o*lj5lA+Dn;*olc%$NUF90~v_c0T!_u*rxe)!af~%e&VP6Bi7w%X8_0+qG}W1kz4JpezO1NLhp4 z0@?_r-?RVR>)-Z?xBT_*e(E<4eIGb#4Y7C7(!9EU|5rZt@JB!WhR=NM&y!b4saQHB z*6AA+g+AT&r43jLq#&mC>7M<+efllW{L-&}_N%+u;o+6N;mbeujeGAo_u$vH=>y%4 zQOwL#qm6|w{{f#$#A5t~THo$+u>}Hv3KgaPThDfJA?UN+Q`?>zxYk)`KMuj@N^BiHy81dyIQ+ayjeI9?`RN zdUh5G%5tB%iusA;3d^*N)-@CthXq8)VuUB3=6E7#na3l_mp@`#2jT;1T z6wDM1wy74zcwN5@7uRJX0MXYIx-yXbbyW=oL|wfb>Wj$P5H@S%fa2$65W~a@1exxr z*2s;~4J2F|Pe;=MrGc1l=xJER0Y}QtE>&s4v&KQ%mWVura8ON&`)tf>yN`OtjGGgI z<79=fDs$l$O^_X+%cY06ltzoo+D(H}mT-mik^ER(AR#yLfop0CoPTIo6VC}8{5pfL z34xNy!A#rF@AVB#w%V3ET6ec}X2E9r+wfhAbaH7{ZdkcN@ScM-fEAqyd55_QSE4sB z4ie6Vg(VT6)l6kxM_9oc{GGS*=B%Dtuq2Z20>*WWWl17!`=o(^gbPoq1hY@t7Pc5I z0`gEF8dsvR&;u$<2=Ex;B7MYcCVhx-G49iv&phd)#UGPPk?FEZ`h@B|LW?$iRYPJa z7gjjUNl4)sIpL&;+Y%cnQNnW^=#vQH>7F<>_#xY7M@z;Ym>kA}sA-dOqMf1W2G*?Q z2=gxx@f>#DeU!MAI@L0`&jRkLzhLsiW#_P^RWE5lTR0?gB@o2pHUye5OhgJLAyUYW z+LEE{sr$52pE^IsLPu6qPF-Cxz`cM7*rz;$!kzCm(1lHy;FAvTf&LuETp18*m#A2Du=%2dTbp0s6X zwxP3OTRwcyP#$w`|B!R}QZjf@=5*3K($3q;q!X7x8Ntv{psd=C76mp5Q8FB1V#>)! zHHb3yaaT8{?`%)$*v75^#55KO>W(tsWl% zgv@>m^irf4*^4uIP7;|>9kaRZNy5+gZAy?5-(jdj+{`lsr)DioCma)8Ib}l`j6>UU z8!pIoyFWLJm`&ObOdBT(khI+qw7)cAobb-Xpe^eqr_2dS$$pJEw z(CSSwRp5Z3XICZES7p^g3i|)gBj@m3WF)$Rn zQEX9kEl-w?4bE)Wf1K4-VqKZfApX{?9H^E%J{&9XyLb(4XR20?F|#N%Z8V0^pRT$C zJQG~OW*$P7@Xv=E`mp!utZBi3u)xESRT(A-3$-MDV5TG- z?EkO_FfnBhhdXGoS-^0 z@G@vR8hFfqf~krbGeLE{8>hOU7=&hJv;gI{+Jph)j6qfl^}{@CTCEQPvDN$k8}&VV z9_kCzj7WXhFk#NJ1RaVclirBChPTQVy&H}#t$x2Maf&PCB*I9KbkneNWa|EoWcdg| z=}DZCV_KMSZH^r4#kPyAccQW3V0|)CwTz~TG}Xp5P5 zq72n7WvFghhU!+#P@OYbWlq5Rn>8m;hH6wbGz5*Nfm0gEsj1DAQ|IxNRog0m{zgfv z{5-Y^nIkVFg(tn=&1;o^A(%tH(P!+=kt=`B^kBIWj$*_@r`LZ^E;=ysWbz|m?!H5} z6xcYn13Da`8x~V>YJ)LbB$MpXUjBGsN~i-z<89?L=>epYT-D5I4ZB#9(l($JJHAFI zJS@nDmKa-d4$Gv@GCq3@6-mG}NZG~Zeb5jxpmRr&`g|10)bXpvEIx|oZFYPV|M9I( zj^o_(!E4T>Z^`~o{r8if_}G)r{KaQ2zA@SVrq{pYXHK5D=hrV2W5T|_-{7RCz7>Jv zn+c{U*wS2>LA&4gLU3*sGZT#1hG7aOg2Bgv)NPq*qr}H}b-$Y7llRqPTGT8Z{mBcZcl%Moo+iL10 zMn!D!TKvY!>?B;MReq}Z)d-hlf7EJ>g#;};6pYUbBdRO9sLEeUfuf&JoYaCy92EoXb3FGGr_(NI{b(^O3kp+pGBR>Ljc+}$Jk^am+dQw7Z9$r ztVz11#mYTkFj21{q>WI~;o$s5-`dQsw_}rceclDKNP6FvfMg-waaPTeDFZ}dR?_>G zw4QA+0nU8DY=G)-ZB7-s4u66?C68=-v{1$zn3>@~5yG z;ub)Om^gzilHQlcZ2d6_WBB!+YVnqupf$eUsfcRyoh-E?+b{BA|0SCrSpJgZ3PV2` zS$t|_PM!m#jN-_g_;>XZ_a)VZaruYfex@1+R$KK3R;7tx8$^XYbGAB@Q>~DyHKRJ4 z2tte0D#;Ro0zSct@XW|S=m9Y&%BIep6g1zZbU##Ql;PsD$ zMdKAy_nw;L7KWk(*9<)OXX07DGnaqUcy=K;1J6h_rel+MMw-1>Oe{Qu$q6Lmyp?F3 zMl#Qu>{R!BuCqGC$5V+0& zL^p*M!KD47-?J^wR&o5I$!^$VKeyIZnyEzFqV_a-qU$C+U$ zdQK-X6g&X7-9YjPHyRMHRpqaL8$K!XnkRzVHB2OepzMV`1T6>*MLCC4#eYE^x2ju_*< zpf>}%yVgVUgUcO-hF-Jr#g;=Aj4!W>SAucp4ksgaOHRWCeq!p+JDd7fGyXg}oEj8< zvBn`C+$Y5|c)k86y)MrN@6vtm+*N6>;fqgeB_J55|CJ#7QN>3nLn0!GpNId4exkX{ zWdEVP*-`!Ec76RY$kBS^5r1MVTK?#P^3?nP`2Fo$l_SeOEh)`jH!q~yGk-%3JtWPe zRJ5Vz1f5_ZFqx|#t(BkSF`o{R@LuY=>?wU&|NOWBEg_WavXg#W9=a}jJlr-b6EJ7} zW0gK#-#($+9P7F~qwh37eZp?^iRiXfe#U=et!YAa+KYu>XX8gtHVUzn-o zP-Xb`X@48a7Sd(wb~Jdv!z)(H>#0Zh+nwDjJQ2mAZz2ZDI~*}TA;I^VKjN#01;MO9I=xsf|&nX&TVJ_NldnY1WW@`;S~;;da9md0FX~si#k*+ zU@7X50@i|j0}Gr55%4oK$TtLekQG|oAuRd!+eS-F_JpTmiH;kRiZ+LMf+#$Ji$k)W z5uPs*W<(~xC)C6OqT=_-ilmrVag5-#2Dk+%!xA_X#vU<@;pE1b{#y3bluw)m5OaTP z;Ri4+GcJ2380B2!%tz$Tl*E_w2_&OsB%HkHNL<2yFS8Rs=sjKEq1bB7MuqoL>Gokp zHQX?f^V2%HhbC;y0|oS#og8_yZDih*MZ#{q>pUZK-ghtaF_sue$oCaXLv#egt1^Oy zkAP5nQT(^1+S4Jd8WU2cmWQy&bWEcb07Tq;`=bYZC@Pe2WR;c+c>mP1&)T`L?ec{} z>g_)~YOUQadWQgSTPwedeJoUMn2J)A5gfxN@VNN0PUu!7TV77N^!7FWUU}n=+x*np zh~|h=c3nxsb})2x{xxBdoG28s&hu0_ZwxvRzHF$48J>AoLydu^ zki01tISWP&>4vQ<00J_g1*Kyv@``UkpSsD)%J!i^<3D?Qv#Qi#C!Qh`F2H2N|s z^ktxsB~ielpjB4KKp{}$7=_sHKp_N?ib8alNCg-`v`zc$b}kBR%2RlpWBk;MF)rsP zE6K+Gyl~+lxTHU#2qS-b%TZ|3ml4Hi1Y;%i7+93s$he?MtPJHkTqe6=nYK1kvG}0M zM1RP&P@T9b$bX55DD0!C%If;OM$^s=h-f}!f~lTys0NTiS;G)0XL;M`%h_6Z5>Q9)J~`>a6+OD{Qx-WPW+*rOO?{ zVno#t@1kG81PD}=C<6ud!r-9c+!kctSwK))EP0jUjc_L^2H=YAu?x*8V28($5WTy8 z)ybg3B~U7pkx>l2MIG*TlaHQhaDoA7(nQpu_ipqm%Bm(3uq~91_ynYmmOv}EQy>n6 zuvMUs%@8$O)h7T)KgG!Q+)yB7)g~yfqAA-jSgFWZvbJUs3+FD_J~iP}*{9*xqJ?)s6Ac<(LD2s%Zag$YOH<1J?Xx{KGayBE^PN9Hz zM5U-X$ye~qq2~%2$!RUO){q{M1yR50Y@v_^nh-_L^U_$r&sg#Zq_|+Dlj}*$_!zS#puaVrb2T zmE#duWktS@>40nn0AJI_OpyR~iwu9$_c}>JLK>>8ENFWpQt$~2B*1Ig&!QNhqjY6I z%Me8s8-CrfAd4B)VKK9_V6nukrU0fNwNj0XYPI)5{+ng`VG^M+JPZ_64d`8E`N?XI zLdEUMC4g()hPI;*M*9K~qYePAfX0w*UV;%cV;{mr*oSO{lzj-!kU_&GP`RWeS7st| z;=N{ZFSuQ{u1q{ifpRwiwPHeSmk^CD=J-?tB%PqMeLl&DzyYn%A~iyF4i~aZ+k@lM&-5ij8W%k?7q~If+KIHN#>EnZ$$<=1>P1UFhoZ}T zbdkwkH;jd1K*+?w@dZ6BN-WVG-qoO?8p3FkM!y+szOS#;LvF7zBS| zl*|dyB4h@jXdeVGZW%I!DPBkn&0s2Ek@CZ|f+QnWUq!6x~xmoQp0^dUqm; zFMte}Qb@E}DJ{3YMRN z2oVAm5pL$)a4}u^Hn3bxI=k?jsIf+MUn_G;CBS&C{sT`pYkv@jmgOJnElghF1DeRD8k$sMDr%5+@x^311p39@OuKq z968VmBVwPM-=+FIcwtnpfs4hX&;7po9NHrB63?ZoRFMo$c2<#TUos1b4|qVO?SPLfJ?#)XPpQ) zFVssNe?l?jcil;QLE60V0$&0qAQY*|1*4-#N7i(M^@3{@oGzcUT0m)eLg2aWf~%?^i6`@DK}Nd*k%@ODs9EKdFk~N)!z2hr z7?i`3p+zj2%qx1nfIlpyhI>Z@ppQ zw9%Lq9l<6nfGXu3rVaH5uOMs+x@_8@Lp_nW(1`|F{~!=vnhX$o@riF?(#A$hw12C_!5FGlHG%qd9i3gQPSzqJAm3vP@l4DQc z(>4g_OfM_rd@3KW@hP~n4}^Ded`m3JK9EpCh}zj;c;hK+wmT$25tnGWb3qCUjSC2e z9-~)uoAY}o^1C6DrSzHv#b3tn);&O)a)Ge=5=au{sS6f9=ND-%ue24M z3)C(4G08orb&IWxiyFi=u3-ct8m8^q4{A%&yn#cm${mORWR$=8kY2Tc1V z3hB~$uY5}XwS$Wz6n0=HiCKMV-`B{bsIEyEV{<`M9j`s@H)IT%Q zNy~kzy!N`6N@c1@Cf0m^^Z-|ue1Sx@Yx!2IC>Wq^jU3f!4cIirI_a6P3P5w~V7OaT z-)%Jk)PIj{+@czkDxO;GKfb0ojq4)S$yy3MlvGB>9xO9PAKy~go)zqM%V5KM-XU4& z$uCK9EBz|fp`MxoI64QJxX=QQ;mOKDkyXzi20`thAoZh!hH9*-Mgz6{jb^+zK(7rY zb#D-X^Lpd83K33ULV`_KO?pX9OO&z3*sc*l*;LvqbRT-bqJR)I(v>0*MTW@*qMlt% zEqOjPM)H}dJ&pqu(zz%@9VPm*^FUv4u5pLaHCqYDu{Ji3FhfuVsCYzR^Pw%^c`Z@{ zUX>M~;$Wi%^5Gp>u4HX3ND-Lz#xqg{%C1_FA_(hu7;TV<$_NE~#5ZQY*l#|NebRUP z#O4veQn`SPYQ|kaaujGDVUSbRq+Nk0s4)d^_<ndx64OFV$ns(pGb;~fW#Bn9Nlc7&9yX|#|LjG#H`y{(^im{AkSC1pTIU_4HzcC$DSW--r@ z7Aj-(<>lnMruBv)%)LbnL+`L$DC|4^?K!7wBB&~yy@)bRbOU8&U z+b8y#E%c`5U*m&^<;#bW4l~iARWweA!SdxzphKT*No4XYSiU~tswZR@N{8mqiI#8G zVRhXJ&Mn_2ftj3mo(L?PM_{pIQv_CHVVuC~!Kz^&BN51@QgFe1ahV~nSos;*Sz$AX z=*rzHNJH=-%U6?jDnKNm)9q!E`<{9@+ww#q=w$gKPQ;zStzXupTfUn7<8BLHl@zZE z!N_=3a`&nr0Ntwss_o;QY)vw+H!?9sS7~WU(7DZPPWjtLrlB#(&1OU_$oR1W)B|sB z=Mq2?fRHk(9}}1cajN9*Q~{SrT$yG$rd4GG<08QFky8a}BO{n{wGqrvxDhOEAi>gX zPkmRjVjb~DK##!*dZcXync2LKrC#q&0-s$_0OLR^Hdv{K>2fE{6A3F5Q9ez(WW*98 z{SU436WoB}H4D5h_gF_|j1F$zK|K%H0*`q`wXs64tyv(k4cEPgwKvHG6e1k}`AjO& zss<4Ap_PSggv_;AEM)K;dq^wzw4AIJa>h*9!x=9oZQ@b7s{Ox}B$$LMRS-}SP!YunR;1Vk1rY^BY+wUy zSP)bc0Tmml{Ie%Py}j?}{h#k`-*x@hAFkw_-7`D8J2N{wJ3D9jIU_=)6rOR+bKMb< z1&#Tz&?Jjw414JgC>*f@S;a&UO*B#n;ErCXjGXOY6%!+P2Q=}_Y;3C)sE&Q?jREA|Mz#M00xW>yuRxH)vlx&$jZi|Xch3V=E>@S+QS?Mq^gRAAZ&l&cp>P^NV{L<%=n=)F zDiJKNy)c7euNReI@mlC*Vhk2kKFqYpq=s6?UqeE>P{2Eq)Lv8`is6Akyc5i=n{iTy zd2OSh+zND$tZzO5u#69Q`6nPqD$M0r7ob_=J1wHccnGwYI)V^jjkb`g=2b^QrZ%>) z#5hbr(gV>NM6_N-5BTKZh0S0?1nU3_6hPXNXob*08KP7JLWuf;L>CXmtu3K*Bi zXy*Zy0BfFi_AR0X+E5^fE&$phB>{+dJ93~RaZnuDr|1IyE~Jn!+W>|La*iRbflOr} zEaq{J;Hj7aLH-fF2$eMjlm(PSV+1IMejo`5(IHg`0n#rB9aIAs6vPaWFv`#m1_|#E zLP6^k9weL{jv&!C)ZZZC^dF?kl6jCs9wboV?~w2>=3pp-y1{DaQ3MeN`vz+)YVYQ-7qJC zqX|O>7d*5SbzPF*ZgC_*Xqyf5t^rRd_?d8?EHI0JSdOM6xM21G5xjbcpO6QAHo`!F z*9ZhId=MVXA&<{;0%AD=feY3V%(stl@F)U`U$jB^_whajZ3Ms&LP0lpxPg%h@o1<$ zVEJLkv;Q1l*j@_-$AJNblo&>RcnAmxFcPq~g3y9a0?I)Sa@?Wz^Yf6_LVGk&g3ldH zoscm|G}rRLc`6H36#BQ;eCS^)g$Iq=I1Y_E`d8>*YJ~?48s#T6D49Q?G1Y?JnFqbW zqbzhC6b;&0LfyhThstC9Lt*-eHrNpeNY#SY=Jf`_^4i2xE=VKtU{j!e6n^mUz$X76 zz=H7wURpeGY@D~?s)P{?EkQkiFj@ix^~2E%5d4Z7k4N2tCSkn;-359G;(y?WuTijW zqvby89I_uFHct#`1iW=LQZ+bq5rBf2i;;+q!9gh0(5ZBM6fkfACH(wML) z!G_cq0g!y_ z&;X5qKRb)2S8FH@0~xECPc?u9GN5t8mr5jnkRCtB0uh-11haR6G9ca{o#V77BU*#1 z#b_-EQw^du((wdt1m?X5x#D-9FJCaSk+fk_1k*8^jIC9G&_LQ>u-F}}L!h~+JPO(2 z-HGwmbC4&6d~(=RS>7r1kT(%6V6Z$D6vBr`^9~3ey1*hI%{wr=@`#SSl-L+1Tcc*9 zR`bH2wSRQ74)I7+hUH0R?{o!loMVcpL$o?*(W=omv=W_~lD;ZaD3bST9q=Fgg4T0az@kbG4J@9&3U7^-#++n)Ul|NQ=o{}b!5aM^ zAv8Sj){3Ya3=jn%Kqm6C!UcI@u|+%@K|ElBb>z>xu%CCdaa2fDS6EMEL!<`wyW|P98!HhG+PoNYsO_8kznY?9BIDZNAYZ@T(mzW?^NE;x711kzk ze}oi<>$pq!~cN!>7n4w&zQakc)p#BF$bHC@z{GXKzTH>)nIJm;29eG7(dYPMohy@ zd;X*et;BqK=ww=+S;#l`k&VFv{>6-c4Gc3c5BL{9{xvY-1vCPwNni<|M2I1T2yi6* zjUhzL?gKi(Xh)-m$4uniMphwGw`$ODASXs^!avd)it>qpNXsV(rtg4T{PDr#0I~rQ zLokepU=$p05)(y-yus?S1}*8}#c)w=j4$Itj(CXYpL&2z5|{$wziSW779~M(QQlz~ zQnd(&s3-OUzcmQWS+pj`R>%8zt7C8>V0Z8$2FgHtW~k%WaSN5fa~LrRf#Hju zB0})HU=78PIJV(IDFDszm{QC(zh@$* zB7+OeTx_yO+G!=sP9O%nd6v&@Y^43m!7Pe_^JX<@#4n!mEFkD&glION$43|@JZ}xZ zGdw35e?TFD;1LVSIbcQc%dp!FNY&5@?^uvE5R)Gf1_K*47^@f&1}et!P@szWq(m4n znqp`oM45Pj6rdl`2K=>Sk{M{?8NU@sL2r)1X1W@@&XIyPq~RH)gj15>%t%UB5;|WW z5g!7};Vor~fCu*CKRn9GOoHfSL652=q+?TH3MQl^C4uf270nvJgL@6V2rs&}10TiU za2U)`N(h4WhkM^H4F&>GZa zdKBUejgmm;&V&|o0~jAi(t!^Nkt{0h_lG>z{Hz#8QZ$Rn z0T%qs`Y8lqF=KgGdLmjO)tYaPx!w*GT2uNI@9wJ>N5P5=l=2!qYx2B5(b zN#);+kDfmeVVdl(HKHsYV#A+^xge#`yhxCMzfiyyI`R)$fA*dg62hTFX{1h3L-;US&#vu}JzG)VqR?B8;D zW%S0&pgsUAf!KU;{G&EL9%ufT_>Z6d*-7AE0IC47k2fl4NOe#nBLgsD9~Vp*FPKsa zpfk~oKtss@Z0dm7D~#XN-%~Q!Guv1OpT@n1JNn0SUNi-k`)JvlTC%W3u<8n zV``aAjSGmS2ZK8O`!nbejJcjBBh`)%?bfk9K)n>%qZM2I+~m*3=V}71dmXf2M9S9 z7E}(94+#k+Fp?g^rBK+6&@gTwUw4U6plk@&3`_$oAC$yjo}&kR2nzbFq-esA2qjrV zLqs=zoET^t!{`JZ)&X7rTc>|M0y6O*;r}mxaR22G{OjER;6wc5Lqeb5>iiqk5NV>R zpqbfBpxiQTZEgP`u%DQexfWpV&?p+{W+o*r47iL$2dVnNpaihNczi~zN7FDBsc<$= zFhG9IDGZpJIRM0A(C8G31}eenO)Wosq~7qUO!k_*T_kY{X_=XN24?mS3!GdQ)97n+*XLJXXu8;Z zt;4UnMp;ErNJLat!N}CC?9jdY!o~#~$^=Es=Y=rxH%hYt8U_Y^gNDD2xqEEeuB|ge z!*gdz>E3+@%c^S6UK9`&lT$Ubv|n=I;Po3Nf{IFN)8<*e>>nJv)J&pGoi<%#j)|G0 z(;`=QPcLs@zvY3!^pFTnd~)jAedR}vp1*nc2$R+Ic++yVm1H7Gix@)0>u9H~QYGq1 zs*u!$Cy{59?MM={(#i$YN$MmGAp=ntqJdbtv9P>|&_r{4Q(~}?u&z9L3Q?Jiw=y9u zBJO`%!xO4C(j z6@*=&Dm!sSK@kB*p&7z4qBiqp37C^b1eOTk$x=kJsE-gqHE5EfkVx8rPpFr=D3u?WHX@LIa?yNY z?%cFbA{?P;Ifq19FGO%JZ6xI~T_+0&q_xi`&zpje)*>pA2&s;{llRU}F28478O%hGaOC;^EiK@6JNm!5| zA&|B$;~q(xC{Bzc1;9BFcu6sm3G`P(NRvdEm+m2^N)#cR2&xDO3#N@^3gGZWGFd=? zASfUtC@d|aBC05+BrYW(CP|Va%E(L*md7iQCgK%|N`lIG6~bhB3UM}33tR@eBt3#Y z{vhcPp`279G(s39e<%DPjtN)AC#+k)M|Y|By4(VlE(ytni$=d`>sb2v2Xtqy&)cx^ z(6QROOU+lVKJMuq!;!E7U~Fb?vB1ecGY=k~tgUOl+S=CBi~Bh|%+dH*PNQdT*uL{h zYn!2lkHhmKq8Z#1{IEpS=9)Mt6Xn!NmD)in(lnlE=s%PTDN`}Fz8SX$JI$4?|CGg&IC z0m&(ck2u$zl~zK=8-(`YAl2S8t1_qfdV+%_g`+^Pbp)oC2Zr-|g|K*P{93?<))f3Vx zJ0WF~fOLALL|O%TvQWATQBep_(jgg;1mS-#3kXV!xJt?hdI}OrDk8!}A)+9-lZiwz z5}7C}fR~UXy9g=^E)^sQD2Ta|Y>8T+(WC_=#mq>m(*h__r0{8JE#y^4iAn;iz7u@} z<%K5-Be4sIA)+MUBRHGvAfibE;UMaXYLb)$M2TsY@JL55ZCGe7QIa^1Y$7z9ylPB( zqL7ZX7IBK?6v?z)(yDFpqH;NfWF4|O2--y9v~y})v9u1QbSZM$GvW8Uh{nR{ezIw& zh0?m@%!wibCPEHEVgg*zNkm_gk8oPXL=_Qv;YFmhwE`9U#1u$+rKI!+(*?!Ipfw68bT*Y4O6M&v$7dA&)WCZZ!eV3d4js)A zd_Ms137VaFa}Z|IjNhY$Du)8=D$F1OAS{8VKq3y8L89O`kOOi46H0J03Y5uWl)%Y@ znv~hIbW3Kl4g_iv%ARUY8hxsT`#~|}9skS-FEYhgUHqAGg#^`9XW}zcU6p4} zA0|C>u`(!in?!x)J`_&%Sj>9nvGXj|6W2!dqTed@!abO>6!)~$`*8OZ-~OIw%Wl4+ z`cZHLena?Fe_S+95T^xp2m$`^j-tA9Qg}MZ0)c=hO~p@AUM6ZLER3H>!VAMpN1jbI z7oIf{Pceo9Bq89rpa?+~Z-$DKgaAZ@poAw7OkqkS!4a@T{3HSqFN)G+0Km%<p(8qJj$u%771#H{oUz#!mAco7Q0l>jOd+O0?+SVmoJlF{~5C)o& z2>1XZfdpj1@5B>@L=kTA{qi1?*s@$ZD0XT5XgjglZU1Ojzj@K4_pBG zLlxn1z<&cWnWzB06_AA8M;rNI75(iqo<$&Fk9fa-gZh^l{~r8! zCI5itKX~*H(EsOIRIrIzk#s5(e0bPu4KtppY&JE4{{Z<1znni>qoI3Hn1;}srHF^mji z=IHdH&En z%EVT&94-yZWU%<_FDk{3!HJHfCj9c-QLzQ$PhS_6$@7+hla(GHO$TDoA`||{8u)9O z&7(KWNdIGX{bf1&Yt8j%eg7FJHiOHe^4!hP^r%)*hu2#J}boaouVA932 z9dI?6{xL$#7MJ$aIHAef7FTj_^-_aaTU?7vXw-!YTb#v)z#i{swpO{P;#H5x*|`pO zcl0PNwAz(9oQ*%w(OHGtS#j>3lKrRBzb+b#95N&%Buq>PLlg2G<8TC@{&VPMzN5u;Yq@+VcY~ z4#cE;ueaa);jqg2GMj2MXZ~|aLfcoFu=&c2rM9OPcFjLlDnIK^>+SifPCJIPR|z`q z_iK7LGuXoMrJ|DYh(FtrTJrQ_{Ko^12`v*pbsT@>xG1^Jr+H9%!7e}Bp_&MX1S`z5pPuyZ#8q^R*JjOcK1}Ytg~^kxZKrIs~zVeX1Y0- zF;eMr(6;Myx=OdphQhlsd-lpNK6PfngmsG+EtZy*=cz{(+HW@O zd9%2O4(>|A{Y~W^kxHgKd#&Emr zGgDYHVz-;>y)*Q_J$KyHT{If@t`l;vqP{~_+-$Q$M_MXEw$sWl~h104Q9QW`W{>q&A=!FMo#p$(^ zHmP{NayTLX;o%a`Jre^T4Z3A{UY!(wr{ZOur{#p%v}@7tJSFZKTKu>^%}d55A=2 zH1}BJ$C>kPE*pjb$r1?S1J#Ry6 z$9U;c37-oZT5n$a+4{U=f7w6HAl|1cKUPx5`moP+#d1ddt8O3564{IWdlY;ZwQ{cmPs^Oko~s#T&i2z?(7L%qpX!(N(7Mhsb+g|xH<{N;PpiSr~`GK<%yN%PS!=u-<*Kqu(@yV9;hAkVY9e(+mwr0&#F@qDI@3f3kvvD^Q zGyU~~4&gG3dr#7X?&5mKCaG-?%A^bixPQDEwExv><1&46aNC|NK_0S1%LQC)D;KMo#uWAatF$@zo`)+)d9uekf_akW6#+bXLdvU38kFTVOJ8i&f_UV%&W!b zFhe#xKO*stV&;Nyj)0FNr8hNPXrHl`!QhE-k@c%h@NZs)FB&?Kbz$1%2wg9Y;jMA* z5p@yzda0f{5#<7@-yesciaIF z+HBQla5>WW^p}FEgzu44Ior*=rszk#S!{Eq;!sG`i{~5biD3a7rjBk!2yHzQR8FDC@d>)QzGYJ*-r}mb9}?iqUPR$u~WfT%&DscG$h4WJY_G zH_1((c_zBA&|o`@GZ-!1g}X4VZ0ZUxS!+F=jovFFd^UWqtb~_T5jmrGgDX>@~xMYpyW2uq*UN-mG-G!4?fj;;eTeaBjpdyQ$l4 z#7XyHlj^rca&B@jt5rWO<&fMGDxQ0HaIy|8Em9d2<;u2v>RJ(F&7GLY^=!Qz!`-#@ z*6Z~772M#lM*U-A&$x3NIH_HWgEe~Qq+;si=9kM~2;*O^DHx-+;#QE)dX<)VBN8Hy&sVOaQ_2W-}@R(_KC^UY* zZuyCvO*`X5mperpCf$z5fAYI-qb!)PY7RGbLigMRy^=DWMdIuPiIrlb6t7cVh!O1arH`v^|Ldc*wwCFWHNe8G-7CFfI#A|*464spRy-9*c|jp z8u4h0SR+)BWHPI%xkBV((&b^!X)p1wNnhR-gjBlfB%5zhIv=qyI9bGE%29#1t;vgW zXZp1iwk99_Tx|MXg_yD<2A4Cp$2f(!30J+ZIo!&*lUG)zmbAQC{o(qv)IaUR|I8W*wj%#2&<6`N z0sGm0u>n9#_y2oV@~eV1s(}xI7b^uj^WYE|Pl00~2)6dH-|;;+%zZiz zz<0-DVN8^07I-2cNQcX2MPmDTJYR%{UyLq%w9rM*VJ0O6neTri7HvZ z#b)bhF_?j zFLwjB?+M=KUxnH9;24MogMI8s286Ld4}$4*8f=_H69FmgZ^F7TCW=YHmcbgDSf&|l zSM##Xpea1&AomT*|4D-J2Yk|Cy+*CXI6(;vWWr)41T9s-G$h5FOG z9ZiKul?YJVNI75*@L(NX!w^#w1EUZV(>X!9rc}Kkx?V`IiJ_4$ea@Va;5or2dWOLv z^x&YMuJT_#&hZGX{{~Fs;bH%ERKMJ3p4<=?9vUnm6f}nd zk1%5-n$E^T$6;wp$`YrV{8zTfgDw>;s5NffQ zkqHnY4?&_3%t?(nTxI{Xe z#bo_#7YD*1=^Q#e0tFt%K=?5|0*kIkbs&R~`qSpZYK5ICN+bmPqqs~~3_F+(oBf;w zdOX-^Sfm)%dn}Iz1VMxhX0tdPEgC%*q92iY1{JYEG*E0OLKa13CSchR^UpKYP(A1= z)DnXthv6v*3|29V8TyM^SfD36CK{vz+8q-ejS0%%tx1HBAK4H^k3zfzSpZ8Fi4Y6o zCfPjmB?dx5VKWe7suO`+*tnu-usHm?ng1{-crlMWr#~{MdGw77gH1=EKu8Ek6$}zK z7`<5RHZpyGi<$Z-oFKASxN#=!6a6@t%mx zjbS30qRkWG^_DVY28k-lOhu{?xX09jP+v6W(OLsF;CJAE;#D*?QYVheVMOceXlrA4 zIxHTq*gWOW#-e&-K-W)yZD8ib%lu%04@ATfp7MZng<;iTa!17CEH zz7zOqakxsrR}Q{n@D=6XqqHP^(K7@)9lj>;RfMksd=acLd_~}k@S!{ei@pe_EPRFF zs|;V1hhXI4i}0d4&^>}f_vnl2_;)^wADun-?O5DcqGa8K9j{(ZJ0@)O*`lp{cV(YP zE_K7PIMrNYjCjW8%L?k@gJ(YOY@f!myM6O{;#buwy9f;qd12h8@Qk3={_XnxBDP;c zpS!fj+N+P^Uo~1Dys_!C^$xYQcfH;w5cYhKl)exj<7OMtVdrI#Yi+;vP^GdkPYNJL0ULv`OD6Rvo#lm#Vk9E2CYy)7Hz%%I%v<>fpTOwd`pTA+HTJ97D`|mRIDd zRJ9F|adcb#2Uboyjl7Nr-&++fXf^Ndxq>hkweFb3^RhSWA-y_a7w1dpF86hRE`G@9 z8hOu6Ik^=X+dTC&{FdAy&da`Px6D_3Lt6W!;`=h0jah|1L=wDTRX<%DGM2BfpIv5p z&Up(n==oMHt1*s$Yrag2))Who(Y#cZoYb(9v|`bnXAMGLB(Zl-4c|>LElqQ|_~ydc zWEGd}O1t^C*;gn*r$Ua8&Dg7Us8dc+wr{koHVC(S?A^jsR}NI=SFYH3=%htplVu!B zElH~QghK1ZJ5!uZPD*-So4ws5wPYv$lVf} z44!7IcV5VS^oOVPhLN1z-e(6kSqxpBQJYfXX_#;-xW+IhX?oFPZv&lmo);GGnL90G zqw>)@c@}>3ZTYcX*VYY8jZ@q4`q9-335VpCI|L}i#ID_3y79^+#r`!nMnsMLWn|xu zET~x-GC8zA?Q3i1u)I%Mf=aKF)yuRQ&uUiP_C9PZd|fYJDyQJ+>Hg!l1P6;(i(39T zE?0i?(TjtVv#x~WLR(wwpKQDPY}3;X2Se*^0&&)*9qXQ|NBL>iwLFb-kGI;e;QHZ- z%pA_=z7cQ7u%d#G%TgcgS`+RXv(NO17JhkRLUDc$vB<{lia=&meEP?GovA0vGtBQC zSSi%o((z2c?M6UgJ53~~V4KsV(djo*OP`witxgs2+*UI1-j8+u$(4IfCk{+32Xdgs}J-s$T-Ms^*EQgXsyT6uAs z)b8k`eW#n1g-dr>S8p>sf44bTMLqOO(84Rk+rjvzFLvKLH^f?PS8emR34Z)E!N_aW z*{D#evB&14%r`lotruq}KC?Yj_yNzpVaFDm9c=@e#pHu}>={D! zx|#Lv85y(U$C_R1UG$v#=l1q%(9{jR8oul^y0!f91P95&;&VpNHpeMvXRiKKyj5Ys z8B1oS&q~j3jo#_p^C?|RU$(93)p_t*Y0l!UjwYqNZuu(GzXu zMa~K9>q9SDe~g=7@~9-k^IJ*hP=BEEg0JP8J!|aPr*>Yn=+FsLc>|fd5s&*+x zLq+eh*{W&RR&zVot%@+(q#vAombT*at~+H}Tl9#89b^87-_$#w$`W!f`}RG9kdgZF zeu!3SP}$Yc+bh4THw8ao-wZsv&*ISIw2Y`ppM7>+n{N~UMtr@yJawPY3+~YBbNAi6 zLY73oT9$BQ-QwRlMy`_Ow>G z^tw-A26s(o`KU!1bvfaT#M9+PY>q>=g)JDb%1j)0383ZPR{C zVNr{@($#@DPPoP7o=r}>R0C?SQs#Y}l@pY;DR0NXD)!2gDIV*O8_pUHH92luK6UXn z>aIS$$xXvw)0-dPE$r{cjgV<6AHJH*m7cqf)OBaQ)!B^4%cD)^uagr!Y=77Bm}`Z4 zQEaY&;=qIT_m>K9?^5rmGQXm*ukCKxm+X$-G?C8zi+azht|yAz`E+Q}ec^GtWM$LFNsyca$Lvu~Y=|Cl?kt8iPZx1#PBZr!Sv9s0U?vSt_X zM<&lTatnW6nrnIXSaHs~3)^N~YkFb#sJG^zoMhm~qBG~eEH{&?nE80W^h24`$IreT zs{Z77SB~o?*|9+(URWyTT3zVfdUzt|dx;tW%LH{}2eeq*gN6iNrjoA*TZ4M4t zEnebpF(MK{Ix*Axh0Ky!(tG!x6npfdv0GB48bZ?q>ff1(5@nmOk7H`QNonUr(qK);Ww%0B+*QxbKMz#ul-L>&n zZ^r(hWcA3(ho%iqH4dNcpRf=5w-z-mT$53gr=MH9E@H9t$MmF=yDDgOeM_A~Oo2U~ z>^`^(vF%X2lswk zVxD^I5^29?mYnbBi;gcWCafM@HLCXVA;)>^wvP`2#Jxi*_SU|6di!SJybC98)kqCk z7F{o!UMxudx?XQ`b8lf^Tiuvjbm{_!xOd<0Y?u80j@rI^&Vj+V>t0v?Xj$c+#H_t~ z`FwsvpZ0#*kCnk;$|8*VuSYq}dlOr~TWHOjvg80&eus;Y-vP1Ga{{N=GkPUQl$(M? zKC~@fz;vAcuIcfnFWnzTt`9cteYnQACe|#%?_tzdm8UVj4l|3s&}D_Q=D4jnH`RN> zyDcZ`KBfAs3q5~e_JF3g_uJ%>aPFW&jg^Vx!@@@@OHaD&Yb<-y)#K`*BvU(~2bS~B zA2x=_P3r9|DSD-#+VZuQax^aRhW=od`tl9hGOCZbvaKSg)5glns!pA%^-`a(u{d4) zMPNg_jN;VijL5fJK8-z-%HOf&QpMoM^%sJNCyiLHzj`9$dv#F+=h*S2V+X$E>(-a_ zoTVi>-0XV%(EsMA6G@dl5}(eAYwlSaamdUjap*?G&W$IurE8q3n%%G5-Wqu!%PuZ3 zv7NT_UQO9b!G_B#UafOViX;aFWwRGl(K=P;OKbUWzuf%E>`>eGdluq7TiX*1Rwcxr zTyv+X(Ph1q>X_5Dz;_F;Nf~96>gQAXGNpU{=~#aOvmiZATw93SM>7yEzN{;ko>jDy>EiZ3e9Tv)iUUGGrlhu{r_OVUs7 z(w8Uf5=p*8A3AGj`>9>tY3!7OgR}NNOZg)F>tcJCyoOt?3tdguw{0Iyr=9P3wn8VX zad}TpbknNDJ;_6hd|m2haAN&Er`K-CUF}lD`Xbf-MKIj#^%0Hg!Rg&~>x?`_KCdCI z>3w*7Z^h9EueCE@U*}fZ&t_d&>=1FdW#i6`GPo=2M9r_&Jy#HTkXU19tYB5gY!$9A zf3!2Zz^7M^tSS{QVspLv^`S8?8!G13D+J{gVT3XCfqBZ!EfYeEQ^rf>m2? z9z5tUVIPi?q7%<)QNO-?Rf~pLZV2vfp1D`Sh*s*SJtO*(I%&8y?5hz53126jymn^n zwpoeQ?8RrZ(mQLWm;NYg$X?JQ^{Lxv_~;A$)9SmgbPj7JU%fAGtLI;0`QmMJ9qdi3 zSh#K|Oy=ga1swV^YeVan;6?jll3E>4J$uO5UaRzM-nk=LSCk3c)gHLnHHJ}(TdS76 z8r{=qT~QF){=VsqrA;xrdt|?&a71n3r7cQ#L$B=4zVS#h@EW=Abag%D%7wb@KAgt{ zlX>%}hN`~}Ge2J5Hx)lq^m&$8?0KWYDfA;E?CO%Qt=r4;H$~f>Va!{$UZO|nOJn0k z>CEFG&)|b!AjVtIwP!L)8 zYIGlcw!SI&LG!c#_qByn1%1{_RGIjuIPO?#{Hijc-|@)NCHI<#cKT*$*{Mz3Iz##4 zBYNJKNPE4WFA;K*4PS^ZT~$?=#&$<8^A8deDjaom;0`O3-rhj`i%mU1e6H zD4yD%w`QK)*MWh(8I|fJ-LN)y#o2kjHRZ2!_jPKK=h`%t1yt+l(LJXfz2Tf7a7|`- zqp@_uyZ}#yytJF5J?GZltLyGyO4Q8Sd9383#LmNqTf>*F6S+-`Aw6!1akKOFU1k4X zd%eK9jjQEGWkTDBhPpcjEGAy8Udeg8BO-8hQHQgG=b}k5`+RR|T+BK>eeR-XTgso% zH#)B%&G}dsqPuYSeT(*r)Ri}zyDf`nTK&i)mO1nm1#HWVf0*Ae=Vm>d4>`t?Z)mSBK0is@k@7Mr?4|<}#;!2@`NHyL>LB9CJ^SsdMue_nvq@(DTTO$2-H6 zJNpitlwwXAI$bU|Vw#2n(@@$S*ZOjY&5U0}o&PwrZ=&z582l$IUd>%;;cJdQ*LkMFpAaH%lppUY`-Pi+m#)6v#CL=>Mre--NI&< z<(p4B1wGg@w?A{9wCJGuJKuV0*T~KKg)@14^3zn%Cv zboiU?Ld_Gc>7A|7*@bPd)AYW{F8>^0vu8cQ`A|Z}w9V9{I^ecUMop&qzUz&&HQ-wfJ)tP&VK6V>SU)$ z{k{5;H=pzB_W}$2s9;&zvuwE8P6z z#Gy3_Vdu0L-LE`q_BlzlKuYA(LcH-#Ny&SD!iJC3PZs8W*mWT@(|v-($%Qr(w4a?} z9Tj-LpRRE&$CV{~{cP?Xdu_X#Y|F1d%GIxlj=eeJ*l8-apOOFhT>IPl)*mk(Dm&-+ zO4xBuZP|a)$T}c;jjrzIFF7J%df!^9nbL9BD=d;~jb@8Cem`rI*xO#%(6LCFL5eNV zw>ZU!JVLHF&XPQKp>e@B%L7w0=PS>zymZiAl|AQCTASo-x?;DtLd~tReJ)lLs7-gw zpDbR#g(;KKH(gJtQpJ}h(z!R<0)BYE(H7VL`0#y9X@B^dO8!W<{E;5{YuakZU(>El ze@&|o|0SJPwDm7(%Gq;&Nozz5{3ZRBu=)42RgG=!?`f(1cVGRUp7k@HrzI-X zOz*t+GhI;0)Q``~{+T|xRK!v~?9k72>D%kA%8hr%(U*V_s6{)4$TP3l+ z@zc&bPesoztGcw4m!=GnpD!|!Q8d29OKU_nD?e@WdXo8xm)5`RCmm^4BsyUmmbOZr zdqPg|%F5O)=drZZ?uC?xj&(|n^+QRwZ z(RTaCg#9}$rsP6A{B^bA>GmC)Z6(O-XCA@9Dc`e?MHekvd3TA!(1!;&E9rpPF0r|i zH`G7Oj=h(IYY87^h~(^d#|;ctZ<46MCE6#F#9!xyrS(ZgXAOb~CEY`t$RX!(+Sc-logs zr?1*KWlf^QyDtrwH;1WpzMryJJbbpIo7U$ergeljxvbaM3hZKcANVr7T`0V1TC`~I zkCW~0^KTlxC)lfPQdlwq zj}Owb*F3!)w_0qD`JzqRb>8Ic9`?K*+0vz1>oI>e}<6bunA|TW;Fsx%Aa5>^-OQcEHVI#^}YndV7N3b}bwT zE-OE{=!?pzdVu}%!tg=vyhB%Cw4peur_vQ#6gDWZ`WGiksZ}X;g-_m-UGPkIx zxqod*bYM-&`aN?!+Im$deJiVK$u*%rK6-88Oxu9{)68Y=j~vPRA=hbeO+mKU;9iY$)iXxwW)Ez=;sI7`H3$(1^QNASE>n`C${&kccpccHKo@5ubqZ^J z^nR&)K$GFT(Q8LQ^z`X-eYBtLX^U%mS{<1YCw5e49V@YTU6beV)}Hya&5}DtqeS~H zjklfJ`XsM%dHovediD7)B`@Kgr))XCv|6)&L;qXvXYQZQZ(nZlX@?!rgwFP@lcx{NcWLp@*f*_ofN>-0SaKAFV_iz(3erc%90|yP}ty)qpcXzkXki)|IqSv=B-01GTt8_&$x^m*K$X)tVi_cd{ zu0GmDYK~~@CfbihH0Tz)A5f9Ys&UA8m?=NzFqoA3sx5e1D19PL<^?k#SMKoQcj+nT z11=`j zRht|j=)mw<`f{5$<7nUd_?S7yYqm7$Xq8?#oS{NH*5QWBj7UDYGG6%owtZ9U{c}Ul z>j$^GI=`{s^3=hosJ6!H%h)J>KP5z=e(Sv^^FzI^)nkb^t!0+}{pVUwuAMNsckh$j zzO*azYd0C=j~PYIVKplZO?_5(zwC6TwZGkboakxQ{>b~Yr0%@v-N2ReIWK--oflQyp@ zb5}`lS|AY4c>GY}f&ECu#;{<8oe#4~#Ey*{T|2*YRNKt;&%AxezVXubWgD}WWgS0c zU%PSYT2cL)Rqu_$-XEMK+Zh&D8JRamn|j2KFnDYFeKFh3or3z4C&#`Gry6FQ7JRj! z{)JuY%L8}HE}bFlJ0KjiBa$K?P+A}~!8nX~Lozq9DZA{U5zV(ZLT!p#+L|qz4?Gqu zX#9Tku|UM3StXJ6HB#lR5>lCKAdcwyaw{n*aHcq4uGyEF^LcEWs5KM~O z6LcE3QWNiwTE^)N60^pfyhjJljofP+k@Orb&kSww*RCxeFlo#9>OQM>^YM}`BYr1m zZO)*+U&-|??0S-8Valb()b@NG*e1Q=YoWrM-1)c8$n^Q2F2{S_FisqhIelI2WW@%v z6CxKpp9WQyE4)aZT`FHK9O$eUv32Fr!kte7Vi)XqE_%A;`|1?mx5+z*W|OIVr7UYX4dfZ*j*n zD<4nmb0Sl&YaXl$KPZjar^$w1&ox8Gb6UzgMu=R#|dq9!^Gu1pW@cl#F+e*$?-=BFAc99|2FS#lbsvqfnP-x^(ek! zaOXkVNce;tAv1Z!M3u(F5tnX$KW#s;e67&3-COsvw>5vVx0tbXmq*pw;$X`I*_654 z7G}kN>h`EKN}b!5e@Nrn`L2WVCzZpOX6_bk`f%s{_o4PBDy4huqUg3Sec~_H>?)de z;@G}kC)#dVYIM;ly2IIl$&bZ%`&(rDB#3=e8(aG3^+C^D0;j|d-Mg0E6*DHk>3vSS zjrzNT!ma1}Jlq=|)#$ug>mK!1S}a{#eU`@Ho!*iCQDrS*^7&Fby_6DS_T`_=wqqpY znO{Ba`U5*Ru0K(EXmit}^ee{Uo-<6>e~x~tAiHwdy}NF8(B{*&r?)xe=Jj8X=SFSb zR9AbzBgESK$nhDtEw@?{O~M&B`x=&LKis8v{u_B^u|T)A+Ixi$-*SkPztlhPpKRxQ zyL_NaXKqE)^w=tuS2Nn*WqF3Tn~QdEkKVaAwR^={FK$c_oqT!q0+-BCFRkoPk+)>( z&NZ7Hd`P9^E5B%*yu7-T!Tcg{%dPetzSC&VvmGa<6YQ7mTg5R@pgIuF_h$wkwUK8# z?=8Ulf9)g;&DbCBcV~Mm<@&Jo$6Lx3a z$?R(m!b#q84%56S?0q>*=*8anmFL~;sjG|)#k9Y!TKnX>*S6?`*OHFelwLl&eM7aV zRczpaoF5PUH?8?v(P+3&;^w9=ZQ(!M48Oej?DfIcS?1#DPZ{LL?o(EN@Ri@{6umBS zP9nRhqpZ*8=sV?eev7ny&QDy-6`MedRvFmymh&WmHS{=0`sKQL&A0BZE-af}Y43Hd zYwa`bR$~FDgJ(7xDRj=Bw>he~_QIuX73o*Tq^|4L>qlBjWQ!l(JtneYkD7?p#;rS4 zTYOSwoR&MET38`=v-%uynwjq8Essu>bgOnqX3`GZX{)Dj9v@nWSgk_{1A5U`b*+5w{`*nss$)Q5zt<$DJ|LU-a>Yja; zs};PQ%T&Ld8Gddf(4*R#7qYV=P-dFZhxpdMjKjCn6a#G{l4f^a&{eSMQTG)ro%}^6 zYuTqo$G`1xQ$4J^;L42ZEurt{JbgUZ?%=-rN!v${?M=oHT5XlzzxI`Ykhb+sm#l%n z%^H*QT&ng6txec)v3tg>GqvvzyxZe_ZEb(&sgDnjaYGqLqz=;+8ah54*ibxku;8`F$s!hCHs^h%$w?il zcapT*cW}|7*t&Pd=alX$MeUs6x&Btb6Zh9|FGWpRLv6{_^!(DjJ%YRO_c+bj|Jw3Mg``%-0dx6d*TYsme!}2KHde?pKG|(OwCl?;?)x^rv-r*a#}1!Yf78^92dy6ew@)s-`TPry z{c6kK&UQNY`~M?XT>7?3C*723&q# z{CAi9F8=G&*EXGT!5iOP{oMy={Q1uJe^^zs@}Ad~;})O&?b;zP#cw>c+tzi^FW&IX zyY$3SuCrT4o_o<{zZ?6~ani)Ql6$(>`aWy@eA7Ya{m+=Qez{iuWazVJ+b7&MchPA3 zRU5yY)AmK>naS@PN+S*9RyVio6&~8N>bi@5bNj`cKA*C@^0ZT$Pi;EviR6`a-kTQI z*1z&%$qO^TEB!$h{=EE!6~jI<-1uI!>ZHg1_~-FQICXyS-pNn@^Yr6y|INcMJ-hu- z{lgPBytb@nd&inVUz_#6zwn$pfB*U@<>K8tZ;-DVvAlNR?R!ptyz{qTM29~8;{Bgq z9~~NQs{Pk9+xHy2PB>!Ehbs=A6Brl0S9pBDIi_IyA1b$={g$Nv`%7oud-b{_o||%C z_0j9L9)6Df$m>R*J>%-o>JR@|_gv}A?|%JyXx!(=oO$z(OQk!SAKSU|p2r86Z+kb= z|Fyd&L@pgSbWz(OR~N5d^W9bQyDyGiY@So`Q1L&{6+*uax2=4r{`|z!(cg`HZFlhU z?cbbr`ytiXm>^GAw+geV( zw@uhS<+jLcV-C4;(9;)xwP@Z$!psx5eGTh(w0{*I%(GOo6q?1 zp_%_u9v%LL^V!e48gKZ;$=!GU>GVT4b!H3-9H{U?!H}7^Q5;H zSFO@bKk5CCyKb5P*7r}&s(zyQP4SptA9LBGA5177veZ}huV*e_zN>oOrcJw!y=eGs z{R{tEetNz2&FQ=6S`YfX@ves_o$>rr{kzV8{^B5Bx(s%0KWgx#WwkRJC;jc1-CwVN z=djARcCK0z-TBSdx7Q9k?bX-Is%KsF>0OQ*!WuI z&KdD1pC2>rnIk3hJImg9Zq~_b&*(OOeQ~&~`JBe`^UwV1+mV0yi|)HG1D8HO^4Bk| zkKXakXIE}}Xi1mJ|Hy`|N4$EkZSk$kj`3Ab)-SK^c;xAG@91YKx%g7sMOQw2{o6+@ z*>aO@+tlfc{2y!#-nC-&)dO5FelR0^!zG5bEu%hvW!aXGuQ|*0!o6#29(-im=bucq zCEtJKMrNA7(ssw)6`#!8@qXFPz%$Hzu6v%X^_4|$Ke?x&>8xer6ECvm{nqT7S-Z4j z@7SGdp6xEW|LtE*ncX^U_W2vmJNfYk-#l`|>J2COo5%P+9z5pD@9%i!kFQIA?3{R0 z&D*zMvTfiWpPRV6ZOe7W`Phd!pg#%c8sR`7?SBUNsh?2APhDi8@_yE8e%8V>t@&B2 z`QKake*=O38`|)*O3;4;f&Q-zeOC29t1SJjh5wf@8CKqk!|8B2+zyY!>+m`Jj)3A& z6ve5y6u070yoyipD*>m&sW_cZm(%U^IK57v)9(zp94^J>bh%t^m&fIG`CNWi!0m7= zZl~MjcDp@puiNMLy8|AFNAWm4E|1&e@pwHxkKYsUI=qV4>2-PCUXR!7^?Ci?fY0Gm zd`_Rs=k|GgUZ2nB_XYe8zv6fLU4FOU0~l_JMi(6*4{Xt+t*R*!3?9=|8UGEk|C991jde|v({BJ zBeHMewku>lWhK*bo|7!4VC|0M)VZ}A88oqJu)2cjifYe7&Bz! z52klu0q7L(%pzUdIxIIax7=fs$y5)fZ&}x_uwahy9c#`Q*Rd&0(^CA@SdcRNA~PU0 zTbc!G48R;SJ2oZ9&W;_6%S19JWh?|cvy@3ysv?b4nz0xQ7PJ~;GnXugbl}K5)dG!d z>KHMfY=Y9JW$akZ9t}oj?W!Fg*%+$4Bh1N^42DqZ6$~Anz%|XY=5Q=OnsP*Outki_ z&A7Z#B8?DS_PA9WiCd;_GLcJCRx;Vit|2X4nq{3;HCOD2!a9@9grOfS1XW8gy3>Gn zpXr^jyX(LWCNP79p<4_FnpwPu=~xukbHvz07{BquASr*=y)J~t0(4d3hepHD2=@h%HQxf%7-L6~bzf^ZiGw9TzhoR(Aar_XM^^{VV@Pp~Xpkxs#S{0F zWSi8*4#(9RbK6yGFwLfu?p&cNS?WHCO#jRjdm3!Oa4!v=&&kg$R!d9QN=?eJDJM8> zG{_OjK$?gr!V9QtQVHou-i1;vO814_I*v{mw4&pX`6<)j>|Ru;XQs?MvpZtS`jz;g zS`=Ejy=GQ}X7c7zCrz8jvQ!vhl?lvfOU?Q<%MLP2D6&H#R1kPB^{Tlkn~`G@%BI4o zcy22US?MAJn8AWm6L7Ic1SfvbO)ls?Nf<)n@&d?8-g)*a5i6K-Y8rP*vJ zjxYYb?quC)HcJQym#{7RtAq*SMBz(43$A?mer9S5XIymi*>Y<}XhQU!9a`kZ9AH@&X0Qdw`z1knaBQ*d%!K3ovhCKM7 zJa}{-JSGpe=fRD6Fm5_d|55!8xHX^ynH)X?zZ(8-_;v6ff=_0KU%^qm8axCU$-Gd5 z#{dR1*%PA7%@5y%Pv(Yu;ghMMAjzCRe(+fYJOnVsyWkIkKQ$HK2A^oV5kAp{@T0%i z0Mqj}_>}$&_(kxw`kzE3@lS(a&V%0tOlFQs%4zAStyJzIIyucZhz94Y6aIAwC;t5a zpYS?Fuli@fC%(S`pZHT|Q0dhIpXlv^)8xpFXAhhg?lZ)bJc~w|<9iT@LGTd3M9=qu z4AD{hBiwv&0mKuo|AX|U@Mi!fI$Q@wW}#aC3-l^qu0p&O;rGBN)6-|*lNson@TvSS z;S>F|@E=q0WhOOTi>LbOPvaXsYwhymIRG~nZZz@{{x?Bbh+Z1J5isEyE|PhFS_u3I zpKO@;tie%(YNo2e7w5s3q~Nnr9?{`a_|ymg0H4~Y>4|lKEr2(|Cw#WTC%(P~A4T*? zw+rE<548LfQ|-9{1fc%)J>scfQ(K6S8ccnI`o-gAs=Q9cGqp#9kH<5Wy9e>qZXM2A zx4|C)pYYXSFJMY{6nyG0d;81mSMZNU{ltTht5m*d_YtDFZ=!)j=d%DWgzrZ=WL}&N*JZ(D^5O}mc&$D3?IpG6=m9dD2Vaxl zzXM(h_+dEGkB3&vY#IDDNKF0dAAnDXzaH{Wa;w2dppg)%H2esJf%>TyZ$>1wTZ6xq z)cjg~vrwJ`@fzG8FzH7PUV~@KuhF9pLPRvwV6DGt@MhFU{QG*K%of1c`Zu+i{{Dh- zjqtwK-3;ru$>Kj^mQu3s4HMj`y zp;@pVFzHAwp6VN$1)rFgza22?IW2uB_?QhR0cY3Wl^4G#4?Z;yJ}nPkoChz-gI@$p zdYk?ra@>uB|G*fT9RdG3IKuB>IHEhHA$n!QL=Ou4G$}JWqj@}B5RRUk;Y#c>I}*Mo zW3vDs1vp=(9z!_D&oqAmp0zp;$20M5B3$;EGzsuzxG8Yi=?QnLlj4l{hn01yHF0{z+5U#2U+c! zDwF;+cp9Fk!_9y@25u%C*VFKih5H2@wd0p?C8&eim|y2Dz=7zmg^xfw!r^%McKGzC z)i(>z=OCQg9)$D4Z3IkXg%(coKsx1kxCaqO`e_t+qdboSw zo`u^E_b%M`aOF*)H(VoJ5N;0KHE?&qJp;E5?j5*~;eLSY=fHdiPJufV?ijdV!7YMY z4tFWsO>lpQdkpSPxDVmJf)hc9V`4Ht!i!BR!umY6D2iJdg}VCl)Y9N2Ak;i)v*Gjo=KAIq`No9kp+8G`hTv4q@ksESy|Gd=(}Z&lbAbY_S_Z zQui77)pg^K&DN6#U+5OP5krqW1`tbyz(YO?VB#0XeiF_(F{m3%5T8MG7RcD>{JA*$ zK7IVjcwpA(Dw`AUvS)=t6nSD=zo~l|O|(i*s;LK_fNeIuTV;=Rb}T$8v#kN~=lO8% zlX~z>Do1Tz4jih3Lx=2Yn%*nxm%+i#Pb~peV{s-_Y8CN76|t(kYIxMXaH`2m%+Ene zqg1#ZbtmBHq1KMrNjVK@jJC$3^X&W(A0`yeSyMQtnnx;}r@n9=e#jJ#VX-IXFG{vD zp{%8a_Cx8?+(q-_EiJ`StfE_RFb`cv$&5qtIf+eD+NDxiM6Duub!n~)9D3d=}WqgueJbHf^.sn6s~jIRaA>o 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 G^Zx+OY8re1 literal 0 HcmV?d00001