Your settings are saved locally in your browser and never sent to any server.
- -From d00dbb50460b264735cd079a13b442ddb2fb3d22 Mon Sep 17 00:00:00 2001
From: Aidan Park Your settings are saved locally in your browser and never sent to any server.
+
+새 탭에서 실행합니다:
+
```bash
openclaw gateway
```
+
+
> 게이트웨이를 중지하려면 `Ctrl+C`를 누르세요. `Ctrl+Z`는 프로세스를 종료하지 않고 일시 중지만 시키므로, 반드시 `Ctrl+C`를 사용하세요.
### 7단계: PC에서 대시보드 접속
-PC 브라우저에서 OpenClaw를 관리하려면 폰에 SSH 연결을 설정해야 합니다. 먼저 [Termux SSH 접속 가이드](docs/termux-ssh-guide.ko.md)를 참고하여 SSH를 설정하세요.
+PC 브라우저에서 OpenClaw를 관리하려면 폰에 SSH 연결을 설정해야 합니다. 먼저 [Termux SSH 접속 가이드](docs/termux-ssh-guide.ko.md)를 참고하여 SSH를 설정하세요. `sshd`도 별도 탭에서 실행합니다 (6단계와 같은 방법).
SSH가 준비되면, 폰의 IP 주소를 확인합니다. Termux에서 다음을 실행하고 `wlan0` 항목의 `inet` 주소를 확인하세요 (예: `192.168.0.100`).
diff --git a/README.md b/README.md
index 7012577..ca2cc1b 100644
--- a/README.md
+++ b/README.md
@@ -105,11 +105,7 @@ pkg update -y && pkg install -y curl
### Step 4: Install OpenClaw
> **Tip: Use SSH for easier typing**
-> From this step on, you can type commands from your computer keyboard instead of the phone screen.
-> Run the following on your phone first, then connect from your PC with `ssh -p 8022
+
+In the new tab, run:
+
```bash
openclaw gateway
```
+
+
> To stop the gateway, press `Ctrl+C`. Do not use `Ctrl+Z` — it only suspends the process without terminating it.
### Step 7: Access the Dashboard from Your PC
-To manage OpenClaw from your PC browser, you need to set up an SSH connection to your phone. See the [Termux SSH Setup Guide](docs/termux-ssh-guide.md) to configure SSH access first.
+To manage OpenClaw from your PC browser, you need to set up an SSH connection to your phone. See the [Termux SSH Setup Guide](docs/termux-ssh-guide.md) to configure SSH access first. Open another new tab on the phone for `sshd` (same method as Step 6).
Once SSH is ready, find your phone's IP address. Run the following in Termux and look for the `inet` address under `wlan0` (e.g. `192.168.0.100`).
diff --git a/docs/termux-ssh-guide.ko.md b/docs/termux-ssh-guide.ko.md
index 060f458..ab9868a 100644
--- a/docs/termux-ssh-guide.ko.md
+++ b/docs/termux-ssh-guide.ko.md
@@ -35,27 +35,13 @@ Retype new password: 1234 ← 같은 비밀번호 다시 입력
> **중요**: `sshd`는 SSH가 아닌, 폰의 Termux 앱에서 직접 실행하세요.
-게이트웨이가 이미 탭 1에서 실행 중이라면 새 탭이 필요합니다. 하단 메뉴바의 **햄버거 아이콘(☰)**을 탭하거나, 화면 왼쪽 가장자리에서 오른쪽으로 스와이프하면 (하단 메뉴바 위 영역) 사이드 메뉴가 나타납니다. **NEW SESSION**을 눌러 새 탭을 추가하세요.
-
-
-
-새 탭에서 실행합니다:
-
```bash
sshd
```
아무 메시지 없이 프롬프트(`$`)가 다시 나오면 정상입니다.
-권장 탭 구성:
-
-- **탭 1**: `openclaw gateway` — 게이트웨이 실행
-
-
-
-- **탭 2**: `sshd` — 컴퓨터에서 SSH 접속용
-
-
+
## 4단계: IP 주소 확인
diff --git a/docs/termux-ssh-guide.md b/docs/termux-ssh-guide.md
index 3a94bb4..a2600d0 100644
--- a/docs/termux-ssh-guide.md
+++ b/docs/termux-ssh-guide.md
@@ -35,27 +35,13 @@ Retype new password: 1234 ← type the same password again
> **Important**: Run `sshd` directly in the Termux app on your phone, not via SSH.
-If the gateway is already running in Tab 1, you'll need a new tab. Tap the **hamburger icon (☰)** on the bottom menu bar, or swipe right from the left edge of the screen (above the bottom menu bar) to open the side menu. Then tap **NEW SESSION**.
-
-
-
-In the new tab, run:
-
```bash
sshd
```
If the prompt (`$`) returns with no error message, it's working.
-Recommended tab setup:
-
-- **Tab 1**: `openclaw gateway` — Run the gateway
-
-
-
-- **Tab 2**: `sshd` — Allow SSH access from your computer
-
-
+
## Step 4: Find the Phone's IP Address
From 7acf75b3ff6cfa5118ca2570a8309f2195beade7 Mon Sep 17 00:00:00 2001
From: AidanPark
-## Update
+## CLI Reference
+
+After installation, the `oa` command is available for managing your installation:
-If you already have OpenClaw on Android installed and want to apply the latest patches and environment updates:
+| Option | Description |
+|--------|-------------|
+| `oa --update` | Update OpenClaw and Android patches |
+| `oa --uninstall` | Remove OpenClaw on Android |
+| `oa --status` | Show installation status and diagnostics |
+| `oa --version` | Show version |
+| `oa --help` | Show available options |
+
+## Update
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
This single command updates both OpenClaw (`openclaw update`) and the Android compatibility patches from this project. Safe to run multiple times.
-> If the `oaupdate` command is not available (older installations), run it with curl:
+> If the `oa` command is not available (older installations), run it with curl:
> ```bash
> curl -sL myopenclawhub.com/update | bash && source ~/.bashrc
> ```
@@ -213,7 +223,7 @@ This single command updates both OpenClaw (`openclaw update`) and the Android co
## Uninstall
```bash
-bash ~/.openclaw-android/uninstall.sh
+oa --uninstall
```
This removes the OpenClaw package, patches, environment variables, and temp files. Your OpenClaw data (`~/.openclaw`) is optionally preserved.
@@ -247,6 +257,7 @@ However, **once the gateway is running, there's no difference**. The process sta
openclaw-android/
├── bootstrap.sh # curl | bash one-liner installer (downloader)
├── install.sh # One-click installer (entry point)
+├── oa.sh # Unified CLI (installed as $PREFIX/bin/oa)
├── update.sh # Thin wrapper (downloads and runs update-core.sh)
├── update-core.sh # Lightweight updater for existing installations
├── uninstall.sh # Clean removal
@@ -333,6 +344,7 @@ Adds an environment variable block to `~/.bashrc`.
- `CXXFLAGS="-include .../termux-compat.h"` — Force-include C/C++ compatibility shim for native module builds
- `GYP_DEFINES="OS=linux ..."` — Override node-gyp OS detection for Android
- `CPATH="...glib-2.0..."` — Provide glib header paths for sharp builds
+ - `CLAWDHUB_WORKDIR="$HOME/.openclaw/workspace"` — Direct clawhub to install skills into OpenClaw's workspace instead of the default `~/skills/`
- Creates an `ar → llvm-ar` symlink if missing (Termux provides `llvm-ar` but many build systems expect `ar`)
After running `setup-env.sh`, `install.sh` re-exports all environment variables in the current process. Since `setup-env.sh` runs as a subprocess, its exports don't propagate to the parent. This re-export ensures Step 5's `npm install` inherits the correct build environment (CFLAGS, CXXFLAGS, GYP_DEFINES, etc.).
@@ -386,9 +398,9 @@ All items pass → PASSED. Any failure → FAILED with reinstall instructions.
Runs `openclaw update` to ensure the latest version. On completion, displays the OpenClaw version and instructs the user to run `openclaw onboard` to start setup.
-## Lightweight Updater Flow — `oaupdate` / `update.sh`
+## Lightweight Updater Flow — `oa --update`
-Running `oaupdate` (or `curl ... update.sh | bash`) downloads `update-core.sh` from GitHub and executes the following 7 steps. Unlike the full installer, it skips environment checks, path setup, and verification — focusing only on refreshing patches, environment variables, and the OpenClaw package.
+Running `oa --update` (or `oaupdate` for backward compatibility) downloads `update-core.sh` from GitHub and executes the following 7 steps. Unlike the full installer, it skips environment checks, path setup, and verification — focusing only on refreshing patches, environment variables, and the OpenClaw package.
### [1/7] Pre-flight Check
@@ -420,7 +432,7 @@ Downloads the latest patch files and scripts from GitHub.
| `termux-compat.h` | C/C++ build compatibility header | Warning |
| `spawn.h` | POSIX spawn stub (skipped if exists) | Warning |
| `systemctl` | systemd stub for Termux | Warning |
-| `update.sh` | Install/update `oaupdate` command | Warning |
+| `oa.sh` | Unified CLI (`oa` command) | Warning |
| `build-sharp.sh` | sharp native module build script | Warning |
Only `setup-env.sh` is required — all other failures are non-critical.
@@ -442,7 +454,8 @@ Installs or updates `clawhub`, the CLI tool for searching and installing OpenCla
- If `clawhub` is not installed, installs it via `npm install -g clawdhub`
- On Node.js v24+ in Termux, the `undici` package is not bundled with Node.js. If `undici` is missing, it's installed directly into clawhub's directory (`$(npm root -g)/clawdhub`)
-- Both operations are non-critical — failures print a warning but don't stop the update
+- Migrates skills from `~/skills/` to `~/.openclaw/workspace/skills/` if they were installed before `CLAWDHUB_WORKDIR` was configured. Existing skills at the correct location are preserved
+- All operations are non-critical — failures print a warning but don't stop the update
### [7/7] Building sharp (image processing)
diff --git a/bootstrap.sh b/bootstrap.sh
old mode 100755
new mode 100644
index ae17096..174a370
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -41,6 +41,7 @@ FILES=(
"scripts/build-sharp.sh"
"tests/verify-install.sh"
"update.sh"
+ "oa.sh"
)
# Download all files
@@ -73,10 +74,11 @@ echo ""
bash "$INSTALL_DIR/install.sh"
# Keep uninstall.sh accessible, clean up the rest
-# (oaupdate command is already installed by install.sh)
+# (oa and oaupdate commands are already installed by install.sh)
cp "$INSTALL_DIR/uninstall.sh" "$HOME/.openclaw-android/uninstall.sh"
chmod +x "$HOME/.openclaw-android/uninstall.sh"
rm -rf "$INSTALL_DIR"
-echo "Uninstaller saved at: ~/.openclaw-android/uninstall.sh"
-echo "To update later: oaupdate && source ~/.bashrc"
+echo "To update later: oa --update && source ~/.bashrc"
+echo "To check status: oa --status"
+echo "For help: oa --help"
diff --git a/docs/troubleshooting.ko.md b/docs/troubleshooting.ko.md
index ab84a97..730f56d 100644
--- a/docs/troubleshooting.ko.md
+++ b/docs/troubleshooting.ko.md
@@ -131,7 +131,7 @@ Error: Cannot find module '/data/data/com.termux/files/home/.openclaw-lite/patch
업데이터를 실행하면 환경변수 블록이 갱신됩니다:
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
또는 수동으로 수정:
@@ -188,10 +188,10 @@ Reason: global update
bash ~/.openclaw-android/scripts/build-sharp.sh
```
-또는 `openclaw update` 대신 `oaupdate`를 사용하면, 필요한 환경변수를 자동으로 설정하고 sharp 빌드까지 처리합니다:
+또는 `openclaw update` 대신 `oa --update`를 사용하면, 필요한 환경변수를 자동으로 설정하고 sharp 빌드까지 처리합니다:
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
## `clawhub` 실행 시 "Cannot find package 'undici'" 에러
@@ -209,7 +209,7 @@ Node.js v24+ Termux 환경에서는 `undici` 패키지가 Node.js에 번들되
업데이터를 실행하면 `clawhub`와 `undici` 의존성이 자동으로 설치됩니다:
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
또는 수동으로 수정:
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index f6daa28..8118a3d 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -131,7 +131,7 @@ The `NODE_OPTIONS` environment variable in `~/.bashrc` still references the old
Run the updater to refresh the environment variable block:
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
Or manually fix it:
@@ -188,10 +188,10 @@ After the update, manually rebuild `sharp` using the provided script:
bash ~/.openclaw-android/scripts/build-sharp.sh
```
-Alternatively, use `oaupdate` instead of `openclaw update` — it sets the required environment variables and rebuilds sharp automatically:
+Alternatively, use `oa --update` instead of `openclaw update` — it sets the required environment variables and rebuilds sharp automatically:
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
## `clawhub` fails with "Cannot find package 'undici'"
@@ -209,7 +209,7 @@ Node.js v24+ on Termux doesn't bundle the `undici` package, which `clawhub` depe
Run the updater to automatically install `clawhub` and its `undici` dependency:
```bash
-oaupdate && source ~/.bashrc
+oa --update && source ~/.bashrc
```
Or fix it manually:
diff --git a/install.sh b/install.sh
index 0227913..e5a92f7 100644
--- a/install.sh
+++ b/install.sh
@@ -4,14 +4,16 @@
set -euo pipefail
GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
BOLD='\033[1m'
NC='\033[0m'
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+OA_VERSION="0.8"
echo ""
echo -e "${BOLD}========================================${NC}"
-echo -e "${BOLD} OpenClaw on Android - Installer${NC}"
+echo -e "${BOLD} OpenClaw on Android - Installer v${OA_VERSION}${NC}"
echo -e "${BOLD}========================================${NC}"
echo ""
echo "This script installs OpenClaw on Termux without proot-distro."
@@ -55,6 +57,7 @@ export CFLAGS="-Wno-error=implicit-function-declaration"
export CXXFLAGS="-include $HOME/.openclaw-android/patches/termux-compat.h"
export GYP_DEFINES="OS=linux android_ndk_path=$PREFIX"
export CPATH="$PREFIX/include/glib-2.0:$PREFIX/lib/glib-2.0/include"
+export CLAWDHUB_WORKDIR="$HOME/.openclaw/workspace"
# ─────────────────────────────────────────────
step 5 "Installing OpenClaw"
@@ -76,6 +79,11 @@ else
echo -e "${GREEN}[OK]${NC} spawn.h already exists"
fi
+# Install oa CLI command (oa.sh → $PREFIX/bin/oa)
+cp "$SCRIPT_DIR/oa.sh" "$PREFIX/bin/oa"
+chmod +x "$PREFIX/bin/oa"
+echo -e "${GREEN}[OK]${NC} oa command installed"
+
# Install oaupdate command (update.sh wrapper → $PREFIX/bin/oaupdate)
cp "$SCRIPT_DIR/update.sh" "$PREFIX/bin/oaupdate"
chmod +x "$PREFIX/bin/oaupdate"
@@ -139,6 +147,9 @@ echo ""
echo "Next step:"
echo " Run 'openclaw onboard' to start setup."
echo ""
-echo "To update: oaupdate && source ~/.bashrc"
-echo "To uninstall: bash ~/.openclaw-android/uninstall.sh"
+echo -e "${BOLD}Manage with the 'oa' command:${NC}"
+echo " oa --update Update OpenClaw and patches"
+echo " oa --status Show installation status"
+echo " oa --uninstall Remove OpenClaw on Android"
+echo " oa --help Show all options"
echo ""
diff --git a/oa.sh b/oa.sh
new file mode 100644
index 0000000..790e600
--- /dev/null
+++ b/oa.sh
@@ -0,0 +1,225 @@
+#!/usr/bin/env bash
+# oa - Unified CLI for OpenClaw on Android
+# Installed to $PREFIX/bin/oa
+set -euo pipefail
+
+OA_VERSION="0.8"
+
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BOLD='\033[1m'
+NC='\033[0m'
+
+REPO_BASE="https://raw.githubusercontent.com/AidanPark/openclaw-android/main"
+OPENCLAW_DIR="$HOME/.openclaw-android"
+
+# ── Help ──────────────────────────────────────
+
+show_help() {
+ echo ""
+ echo -e "${BOLD}oa${NC} — OpenClaw on Android CLI v${OA_VERSION}"
+ echo ""
+ echo "Usage: oa [option]"
+ echo ""
+ echo "Options:"
+ echo " --update Update OpenClaw and Android patches"
+ echo " --uninstall Remove OpenClaw on Android"
+ echo " --status Show installation status"
+ echo " --version, -v Show version"
+ echo " --help, -h Show this help message"
+ echo ""
+}
+
+# ── Version ───────────────────────────────────
+
+show_version() {
+ echo "oa v${OA_VERSION} (OpenClaw on Android)"
+
+ # Check latest version from GitHub (short timeout to avoid hanging)
+ local latest
+ latest=$(curl -sfL --max-time 3 "$REPO_BASE/oa.sh" 2>/dev/null \
+ | grep -m1 '^OA_VERSION=' | cut -d'"' -f2) || true
+
+ if [ -n "${latest:-}" ]; then
+ if [ "$latest" = "$OA_VERSION" ]; then
+ echo -e " ${GREEN}Up to date${NC}"
+ else
+ echo -e " ${YELLOW}v${latest} available${NC} — run: oa --update"
+ fi
+ fi
+}
+
+# ── Update ────────────────────────────────────
+
+cmd_update() {
+ if ! command -v curl &>/dev/null; then
+ echo -e "${RED}[FAIL]${NC} curl not found. Install it with: pkg install curl"
+ exit 1
+ fi
+
+ mkdir -p "$OPENCLAW_DIR"
+ local LOGFILE="$OPENCLAW_DIR/update.log"
+
+ local TMPFILE
+ TMPFILE=$(mktemp "${PREFIX:-/tmp}/tmp/update-core.XXXXXX.sh" 2>/dev/null) \
+ || TMPFILE=$(mktemp /tmp/update-core.XXXXXX.sh)
+ trap 'rm -f "$TMPFILE"' EXIT
+
+ if ! curl -sfL "$REPO_BASE/update-core.sh" -o "$TMPFILE"; then
+ echo -e "${RED}[FAIL]${NC} Failed to download update-core.sh"
+ exit 1
+ fi
+
+ bash "$TMPFILE" 2>&1 | tee "$LOGFILE"
+
+ echo ""
+ echo -e "${YELLOW}Log saved to $LOGFILE${NC}"
+}
+
+# ── Uninstall ─────────────────────────────────
+
+cmd_uninstall() {
+ local UNINSTALL_SCRIPT="$OPENCLAW_DIR/uninstall.sh"
+
+ if [ ! -f "$UNINSTALL_SCRIPT" ]; then
+ echo -e "${RED}[FAIL]${NC} Uninstall script not found at $UNINSTALL_SCRIPT"
+ echo ""
+ echo "You can download it manually:"
+ echo " curl -sL $REPO_BASE/uninstall.sh -o $UNINSTALL_SCRIPT && chmod +x $UNINSTALL_SCRIPT"
+ exit 1
+ fi
+
+ bash "$UNINSTALL_SCRIPT"
+}
+
+# ── Status ────────────────────────────────────
+
+cmd_status() {
+ echo ""
+ echo -e "${BOLD}========================================${NC}"
+ echo -e "${BOLD} OpenClaw on Android — Status${NC}"
+ echo -e "${BOLD}========================================${NC}"
+
+ echo ""
+ echo -e "${BOLD}Version${NC}"
+ echo " oa: v${OA_VERSION}"
+
+ if command -v openclaw &>/dev/null; then
+ echo " OpenClaw: $(openclaw --version 2>/dev/null || echo 'error')"
+ else
+ echo -e " OpenClaw: ${RED}not installed${NC}"
+ fi
+
+ if command -v node &>/dev/null; then
+ echo " Node.js: $(node -v 2>/dev/null)"
+ else
+ echo -e " Node.js: ${RED}not installed${NC}"
+ fi
+
+ if command -v npm &>/dev/null; then
+ echo " npm: $(npm -v 2>/dev/null)"
+ else
+ echo -e " npm: ${RED}not installed${NC}"
+ fi
+
+ if command -v clawhub &>/dev/null; then
+ echo " clawhub: $(clawhub --version 2>/dev/null || echo 'installed')"
+ else
+ echo -e " clawhub: ${YELLOW}not installed${NC}"
+ fi
+
+ echo ""
+ echo -e "${BOLD}Environment${NC}"
+ echo " PREFIX: ${PREFIX:-not set}"
+ echo " TMPDIR: ${TMPDIR:-not set}"
+ echo " NODE_OPTIONS: $([ -n "${NODE_OPTIONS:-}" ] && echo "set" || echo "not set")"
+ echo " CONTAINER: ${CONTAINER:-not set}"
+ echo " CLAWDHUB_WORKDIR: ${CLAWDHUB_WORKDIR:-not set}"
+
+ echo ""
+ echo -e "${BOLD}Paths${NC}"
+ local CHECK_DIRS=("$OPENCLAW_DIR" "$HOME/.openclaw" "${PREFIX:-}/tmp")
+ for dir in "${CHECK_DIRS[@]}"; do
+ if [ -d "$dir" ]; then
+ echo -e " ${GREEN}[OK]${NC} $dir"
+ else
+ echo -e " ${RED}[MISS]${NC} $dir"
+ fi
+ done
+
+ echo ""
+ echo -e "${BOLD}Patches${NC}"
+ local CHECK_FILES=(
+ "$OPENCLAW_DIR/patches/bionic-compat.js"
+ "$OPENCLAW_DIR/patches/termux-compat.h"
+ "${PREFIX:-}/include/spawn.h"
+ )
+ for file in "${CHECK_FILES[@]}"; do
+ if [ -f "$file" ]; then
+ echo -e " ${GREEN}[OK]${NC} $(basename "$file")"
+ else
+ echo -e " ${RED}[MISS]${NC} $(basename "$file")"
+ fi
+ done
+
+ echo ""
+ echo -e "${BOLD}Configuration${NC}"
+ if grep -qF "OpenClaw on Android" "$HOME/.bashrc" 2>/dev/null; then
+ echo -e " ${GREEN}[OK]${NC} .bashrc environment block present"
+ else
+ echo -e " ${RED}[MISS]${NC} .bashrc environment block not found"
+ fi
+
+ echo ""
+ echo -e "${BOLD}Disk${NC}"
+ if [ -d "$OPENCLAW_DIR" ]; then
+ echo " ~/.openclaw-android: $(du -sh "$OPENCLAW_DIR" 2>/dev/null | cut -f1)"
+ fi
+ if [ -d "$HOME/.openclaw" ]; then
+ echo " ~/.openclaw: $(du -sh "$HOME/.openclaw" 2>/dev/null | cut -f1)"
+ fi
+ local AVAIL_MB
+ AVAIL_MB=$(df "${PREFIX:-/}" 2>/dev/null | awk 'NR==2 {print int($4/1024)}') || true
+ echo " Available: ${AVAIL_MB:-unknown}MB"
+
+ echo ""
+ echo -e "${BOLD}Skills${NC}"
+ local SKILLS_DIR="${CLAWDHUB_WORKDIR:-$HOME/.openclaw/workspace}/skills"
+ if [ -d "$SKILLS_DIR" ]; then
+ local count
+ count=$(find "$SKILLS_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l) || true
+ echo " Installed: $count"
+ echo " Path: $SKILLS_DIR"
+ else
+ echo " No skills directory found"
+ fi
+
+ echo ""
+}
+
+# ── Main dispatch ─────────────────────────────
+
+case "${1:-}" in
+ --update)
+ cmd_update
+ ;;
+ --uninstall)
+ cmd_uninstall
+ ;;
+ --status)
+ cmd_status
+ ;;
+ --version|-v)
+ show_version
+ ;;
+ --help|-h|"")
+ show_help
+ ;;
+ *)
+ echo -e "${RED}Unknown option: $1${NC}"
+ echo ""
+ show_help
+ exit 1
+ ;;
+esac
diff --git a/scripts/setup-env.sh b/scripts/setup-env.sh
old mode 100755
new mode 100644
index 3fb4aa6..fdef330
--- a/scripts/setup-env.sh
+++ b/scripts/setup-env.sh
@@ -27,6 +27,7 @@ export CFLAGS=\"-Wno-error=implicit-function-declaration\"
export CXXFLAGS=\"-include $COMPAT_HEADER\"
export GYP_DEFINES=\"OS=linux android_ndk_path=\$PREFIX\"
export CPATH=\"\$PREFIX/include/glib-2.0:\$PREFIX/lib/glib-2.0/include\"
+export CLAWDHUB_WORKDIR=\"\$HOME/.openclaw/workspace\"
${MARKER_END}"
# Create .bashrc if it doesn't exist
@@ -56,6 +57,7 @@ echo " CFLAGS=\"-Wno-error=...\" (Clang implicit-function-declaration fix)"
echo " CXXFLAGS=\"-include ...termux-compat.h\" (native build fixes)"
echo " GYP_DEFINES=\"OS=linux ...\" (node-gyp Android override)"
echo " CPATH=\"...glib-2.0...\" (sharp header paths)"
+echo " CLAWDHUB_WORKDIR=\"\$HOME/.openclaw/workspace\" (clawhub skill install path)"
# Source for current session
export TMPDIR="$PREFIX/tmp"
@@ -67,6 +69,7 @@ export CFLAGS="-Wno-error=implicit-function-declaration"
export CXXFLAGS="-include $COMPAT_HEADER"
export GYP_DEFINES="OS=linux android_ndk_path=$PREFIX"
export CPATH="$PREFIX/include/glib-2.0:$PREFIX/lib/glib-2.0/include"
+export CLAWDHUB_WORKDIR="$HOME/.openclaw/workspace"
# Create ar symlink if missing (Termux provides llvm-ar but not ar)
if [ ! -e "$PREFIX/bin/ar" ] && [ -x "$PREFIX/bin/llvm-ar" ]; then
diff --git a/uninstall.sh b/uninstall.sh
old mode 100755
new mode 100644
index 8c69a64..a72c4c3
--- a/uninstall.sh
+++ b/uninstall.sh
@@ -31,7 +31,14 @@ else
echo -e "${YELLOW}[SKIP]${NC} openclaw not installed"
fi
-# 2. Remove oaupdate command
+# 2. Remove oa and oaupdate commands
+if [ -f "$PREFIX/bin/oa" ]; then
+ rm -f "$PREFIX/bin/oa"
+ echo -e "${GREEN}[OK]${NC} Removed $PREFIX/bin/oa"
+else
+ echo -e "${YELLOW}[SKIP]${NC} $PREFIX/bin/oa not found"
+fi
+
if [ -f "$PREFIX/bin/oaupdate" ]; then
rm -f "$PREFIX/bin/oaupdate"
echo -e "${GREEN}[OK]${NC} Removed $PREFIX/bin/oaupdate"
diff --git a/update-core.sh b/update-core.sh
index 87ff779..a296239 100644
--- a/update-core.sh
+++ b/update-core.sh
@@ -11,10 +11,11 @@ NC='\033[0m'
REPO_BASE="https://raw.githubusercontent.com/AidanPark/openclaw-android/main"
OPENCLAW_DIR="$HOME/.openclaw-android"
+OA_VERSION="0.8"
echo ""
echo -e "${BOLD}========================================${NC}"
-echo -e "${BOLD} OpenClaw on Android - Updater${NC}"
+echo -e "${BOLD} OpenClaw on Android - Updater v${OA_VERSION}${NC}"
echo -e "${BOLD}========================================${NC}"
echo ""
@@ -152,14 +153,22 @@ else
echo -e "${YELLOW}[WARN]${NC} Failed to update systemctl stub (non-critical)"
fi
-# Download update.sh (thin wrapper) and install as oaupdate command
-if curl -sfL "$REPO_BASE/update.sh" -o "$PREFIX/bin/oaupdate"; then
- chmod +x "$PREFIX/bin/oaupdate"
- echo -e "${GREEN}[OK]${NC} oaupdate command updated"
+# Download oa.sh (unified CLI) and install as oa command
+if curl -sfL "$REPO_BASE/oa.sh" -o "$PREFIX/bin/oa"; then
+ chmod +x "$PREFIX/bin/oa"
+ echo -e "${GREEN}[OK]${NC} oa command updated"
else
- echo -e "${YELLOW}[WARN]${NC} Failed to update oaupdate (non-critical)"
+ echo -e "${YELLOW}[WARN]${NC} Failed to update oa command (non-critical)"
fi
+# Install oaupdate as a thin wrapper that delegates to oa --update (backward compatibility)
+cat > "$PREFIX/bin/oaupdate" << 'WRAPPER'
+#!/usr/bin/env bash
+exec oa --update "$@"
+WRAPPER
+chmod +x "$PREFIX/bin/oaupdate"
+echo -e "${GREEN}[OK]${NC} oaupdate command updated (→ oa --update)"
+
# Download build-sharp.sh
SHARP_TMPFILE=""
if SHARP_TMPFILE=$(mktemp "$PREFIX/tmp/build-sharp.XXXXXX.sh" 2>/dev/null); then
@@ -191,6 +200,7 @@ export CFLAGS="-Wno-error=implicit-function-declaration"
export CXXFLAGS="-include $HOME/.openclaw-android/patches/termux-compat.h"
export GYP_DEFINES="OS=linux android_ndk_path=$PREFIX"
export CPATH="$PREFIX/include/glib-2.0:$PREFIX/lib/glib-2.0/include"
+export CLAWDHUB_WORKDIR="$HOME/.openclaw/workspace"
# ─────────────────────────────────────────────
step 5 "Updating OpenClaw Package"
@@ -262,12 +272,41 @@ else
echo -e "${GREEN}[OK]${NC} undici already available"
fi
+# Migrate skills installed to wrong path before CLAWDHUB_WORKDIR was set
+# Previous versions of clawhub defaulted to ~/skills/ instead of ~/.openclaw/workspace/skills/
+OLD_SKILLS_DIR="$HOME/skills"
+CORRECT_SKILLS_DIR="$HOME/.openclaw/workspace/skills"
+if [ -d "$OLD_SKILLS_DIR" ] && [ "$(ls -A "$OLD_SKILLS_DIR" 2>/dev/null)" ]; then
+ echo ""
+ echo "Migrating skills from ~/skills/ to ~/.openclaw/workspace/skills/..."
+ mkdir -p "$CORRECT_SKILLS_DIR"
+ for skill in "$OLD_SKILLS_DIR"/*/; do
+ [ -d "$skill" ] || continue
+ skill_name=$(basename "$skill")
+ if [ ! -d "$CORRECT_SKILLS_DIR/$skill_name" ]; then
+ if mv "$skill" "$CORRECT_SKILLS_DIR/$skill_name" 2>/dev/null; then
+ echo -e " ${GREEN}[OK]${NC} Migrated $skill_name"
+ else
+ echo -e " ${YELLOW}[WARN]${NC} Failed to migrate $skill_name"
+ fi
+ else
+ echo -e " ${YELLOW}[SKIP]${NC} $skill_name already exists in correct location"
+ fi
+ done
+ # Remove old directory if empty
+ if rmdir "$OLD_SKILLS_DIR" 2>/dev/null; then
+ echo -e "${GREEN}[OK]${NC} Removed empty ~/skills/"
+ else
+ echo -e "${YELLOW}[WARN]${NC} ~/skills/ not empty after migration — check manually"
+ fi
+fi
+
# ─────────────────────────────────────────────
step 7 "Building sharp (image processing)"
if [ "$OPENCLAW_UPDATED" = false ]; then
echo -e "${GREEN}[SKIP]${NC} openclaw unchanged — sharp rebuild not needed"
- rm -f "$SHARP_TMPFILE"
+ [ -n "$SHARP_TMPFILE" ] && rm -f "$SHARP_TMPFILE"
elif [ -n "$SHARP_TMPFILE" ]; then
bash "$SHARP_TMPFILE"
rm -f "$SHARP_TMPFILE"
@@ -284,6 +323,12 @@ echo ""
# Show OpenClaw update status
openclaw update status 2>/dev/null || true
+echo ""
+echo -e "${BOLD}Manage with the 'oa' command:${NC}"
+echo " oa --update Update OpenClaw and patches"
+echo " oa --status Show installation status"
+echo " oa --uninstall Remove OpenClaw on Android"
+echo " oa --help Show all options"
echo ""
echo -e "${YELLOW}Run this to apply changes to the current session:${NC}"
echo ""
From 5adc8617439c7b9676fc48274ab9ef63473655fb Mon Sep 17 00:00:00 2001
From: AidanPark
+
+Signal 9 (SIGKILL)는 어떤 프로세스도 가로채거나 차단할 수 없습니다 — Android가 OS 수준에서 종료한 것입니다.
+
+## 요구사항
+
+- **Android 12 이상** (Android 11 이하는 해당 없음)
+- **Termux**에 `android-tools` 설치 (OpenClaw on Android에 포함)
+
+## 1단계: Wake Lock 활성화
+
+알림 바를 내려서 Termux 알림을 찾으세요. **Acquire wakelock**을 탭하면 Android가 Termux를 중단시키는 것을 방지할 수 있습니다.
+
+
+
+
+
+
+## 3단계: ADB 설치 (아직 설치하지 않은 경우)
+
+Termux에서 `android-tools`를 설치합니다:
+
+```bash
+pkg install -y android-tools
+```
+
+> OpenClaw on Android를 설치했다면 `android-tools`가 이미 포함되어 있습니다.
+
+## 4단계: ADB 페어링
+
+1. **무선 디버깅** 설정에서 **페어링 코드로 기기 페어링** (Pair device with pairing code) 탭
+2. **Wi-Fi 페어링 코드**와 **IP 주소 및 포트**가 표시된 다이얼로그가 나타남
+
+
+
+3. Termux에서 화면에 표시된 포트와 코드를 사용하여 페어링 명령을 실행합니다:
+
+```bash
+adb pair localhost:<페어링_포트> <페어링_코드>
+```
+
+예시:
+
+```bash
+adb pair localhost:39555 269556
+```
+
+
+
+`Successfully paired`가 표시되면 성공입니다.
+
+## 5단계: ADB 연결
+
+페어링 후 **무선 디버깅** 메인 화면으로 돌아가세요. 상단에 표시된 **IP 주소 및 포트**를 확인합니다 — 이 포트는 페어링 포트와 다릅니다.
+
+
+
+Termux에서 메인 화면에 표시된 포트로 연결합니다:
+
+```bash
+adb connect localhost:<연결_포트>
+```
+
+예시:
+
+```bash
+adb connect localhost:35541
+```
+
+`connected to localhost:35541`이 표시되면 성공입니다.
+
+> 페어링 포트와 연결 포트는 다릅니다. `adb connect`에는 무선 디버깅 메인 화면에 표시된 포트를 사용하세요.
+
+## 6단계: Phantom Process Killer 비활성화
+
+다음 명령을 실행하여 Phantom Process Killer를 비활성화합니다:
+
+```bash
+adb shell "settings put global settings_enable_monitor_phantom_procs false"
+```
+
+설정이 적용되었는지 확인합니다:
+
+```bash
+adb shell "settings get global settings_enable_monitor_phantom_procs"
+```
+
+출력이 `false`이면 Phantom Process Killer가 성공적으로 비활성화된 것입니다.
+
+
+
+## 참고 사항
+
+- 이 설정은 **재부팅해도 유지**됩니다 — 한 번만 하면 됩니다
+- 이 과정을 완료한 후 무선 디버깅을 켜둘 필요는 없습니다. 꺼도 됩니다
+- 일반 앱 동작에는 영향을 주지 않습니다 — Termux의 백그라운드 프로세스가 종료되는 것만 방지합니다
+- 폰을 초기화하면 이 과정을 다시 수행해야 합니다
+
+## 추가 참고
+
+일부 제조사(삼성, 샤오미, 화웨이 등)는 자체적으로 공격적인 배터리 최적화를 적용하여 백그라운드 앱을 종료시킬 수 있습니다. Phantom Process Killer를 비활성화한 후에도 프로세스가 종료되는 경우, [dontkillmyapp.com](https://dontkillmyapp.com)에서 기기별 가이드를 확인하세요.
diff --git a/docs/disable-phantom-process-killer.md b/docs/disable-phantom-process-killer.md
new file mode 100644
index 0000000..4b29790
--- /dev/null
+++ b/docs/disable-phantom-process-killer.md
@@ -0,0 +1,125 @@
+# Disable Phantom Process Killer (Android 12+)
+
+Android 12 and above includes a feature called **Phantom Process Killer** that automatically terminates background processes. This can cause Termux processes like `openclaw gateway`, `sshd`, and `ttyd` to be killed without warning.
+
+## Symptoms
+
+If you see this message in Termux, Android has forcibly killed the process:
+
+```
+[Process completed (signal 9) - press Enter]
+```
+
+
+
+Signal 9 (SIGKILL) cannot be caught or blocked by any process — Android terminated it at the OS level.
+
+## Requirements
+
+- **Android 12 or higher** (Android 11 and below are not affected)
+- **Termux** with `android-tools` installed (included in OpenClaw on Android)
+
+## Step 1: Acquire Wake Lock
+
+Pull down the notification bar and find the Termux notification. Tap **Acquire wakelock** to prevent Android from suspending Termux.
+
+
+
+
+
+
+## Step 3: Install ADB (if not already installed)
+
+In Termux, install `android-tools`:
+
+```bash
+pkg install -y android-tools
+```
+
+> If you installed OpenClaw on Android, `android-tools` is already included.
+
+## Step 4: Pair with ADB
+
+1. In **Wireless debugging** settings, tap **Pair device with pairing code**
+2. A dialog will show the **Wi-Fi pairing code** and **IP address & Port**
+
+
+
+3. In Termux, run the pairing command using the port and code shown on screen:
+
+```bash
+adb pair localhost:
+
+You should see `Successfully paired`.
+
+## Step 5: Connect with ADB
+
+After pairing, go back to the **Wireless debugging** main screen. Note the **IP address & Port** shown at the top — this is different from the pairing port.
+
+
+
+In Termux, connect using the port shown on the main screen:
+
+```bash
+adb connect localhost:
+
+## Notes
+
+- This setting **persists across reboots** — you only need to do this once
+- You do **not** need to keep Wireless debugging enabled after completing these steps. You can turn it off
+- This does not affect normal app behavior — it only prevents Android from killing background processes in Termux
+- If you factory reset your phone, you will need to repeat this process
+
+## Further Reading
+
+Some manufacturers (Samsung, Xiaomi, Huawei, etc.) apply additional aggressive battery optimization that can kill background apps. If you still experience process termination after disabling Phantom Process Killer, check [dontkillmyapp.com](https://dontkillmyapp.com) for device-specific guides.
diff --git a/docs/images/signal9/01-signal9-killed.png b/docs/images/signal9/01-signal9-killed.png
new file mode 100644
index 0000000000000000000000000000000000000000..e20176d0ed10138386f2707f33728c802f909de7
GIT binary patch
literal 131372
zcmeFYX&{tg*fu;Rq(UVrV@b-ErLtw0v1J?E5JEzBlbx}pWDR94yRq*(S*Iw=Aluku
zvNQIv4`$wbdY|Wc-{<}Qe81oC^M{7+>%PzXyw3ADj`O&}wY5}eFEL*Nfk3p+R26kW
zpbJkxAexsKsen(Mm_tW^f4sAUK(yU-RTS>L^00Gs7qD{%fxJ^UzS?Ntm|zZpdO_)~
z^j?94aL_$P2A{jPd@uHW!S^e-m2btK=dyC4G`M>0S;QUW+skEwPYrag{d&v8^HSdH
zlajm224x=pH*@(8(yO2SHM`o28l`1X<;dxf2H}duK+;vtd^Mq_Zx-ND)tU48Dsqf?-DC$$Yi(@TrGC+xqK8k)U`|9+2@asA2s?MCT zh3dkuyx5u%_fd^L{y!xhjvqB`$}O2H%Tu!ZHu}82WQdbqTG)Sn?b0zvuWs6Nq33na zSJ4tt9S7!74dcS+O3z1(XiC10&W@^-Qi`F)u8Hl7^*h3x8tS6zhCPivcRcgg%_hL( zyBkv*OsxDYbrLUJ6 zx%^4~voziJr@rCP=aclQbdhwrkG(Hmrm5wnkXJc{*}TKZ7=F|fK>-)vqL_h>R*vSD zocyAmul}7sx!h2m1&@ZK*!$pd=G9oKKwr`;Qs=qkbF1fCg5tkde9!y->rQ9p(4D6h z0o!$dO*pDJTsTa##s|I+bPRmh*IJ`5%eW*=(?buQ{yte@-5wQH1!fR88&{mTQMu~) zL{gfkS>jYL*h|s>r$Ua2mF9wUXOLUiZmdI(!2EAzBc%joO%)TRB<22}&wsImeT}LO z7l=uVbPFqv@MYa%HV31={7rjv*FxeEPo)4&(v5WYXqCnL+XS%(&NEd$JVx9Saz>wC zeRh3loxb%0uJJ)vJjXM4&@iBvVl{acn+vsiZliD0+<&E4x=HEPWq8kbgN;((dMz6X z8`gehYqu(2w|F HT9b*>LC%1I4o&Iv)y!L0%E#{ZLQHo!tz0`AAj?pE;nfUSu z@{7Lb1bIk%Gvy{b?~nLxHRZ#pbvYwGon)A#&-XQXmD|-Nnd=)rG^ye7;G{9OyDVyQ z_X@U4R*LkC`3q0=8BIiWoy?~VIL)i;U++9T+}^%6#aUW=srExHdrSwbzxJ~3m`=Hl zdB7Dn{`v9UknbVH`Sp3tsH&(BQ5n!}t&3WO^mT{F4)*qma6#uFlOdDW&<|;iC)x8c zrlpOg9!?+Y+J^tS6IPkzK9EEZ9rGGnMh6q486$yZcKNkT?((cAQcF^nQk13~rjX@7 z{rjFKp7kW;VNdujdbwCg)r@D8V{c)f-@Lc++Z*2Fp+AdXdg5AA5bWkOt*)s4eE4=z z=g8VvYPsoZ{Tj-98b>$=-xU8nZG~NLwnh|Nez(dztLxr4csl$eTI#h|<7P5;gUwhN zBkU;bcbq=o;&3> `qzw#3_e*0|4riDj r=RsFctN1Ipl6Ct^}Ws3r>Qab zU|&ft9>1(7U{=?RE-?PCxKn-S&Yf*;o;xnxvDFuXDDSELe!p<;_3Qh~si9AVb2x;r zSXg!GxV}++t%M Q9mEp<)mN$G*{Sp}zdWWMM0ZomKxS7UT;f&*6o9h4$ z1Xh)0a{BiJXhnRG3=M&g0vP_U{^ iGJl{Jb!iXV}X<3 zQd`YB>Czdb)8)9*`WeY7cyVc6(P=U{Fb}^YX+cz9? >{ekxo$D*t1QqIMJ~e!nK`jzE-62jp}|`-x~V2 zH-UJ+58G<^+_}YY 0(NF4rgi%WsG zN_>6d@(TCWCcT?zK9x}Bhb}+!GXl-g%9jZR9`|%BTo#D$1s2m`Ms$kvFBrLY-_JfP z+FU#QtSLS%f?j59d0oGh5lE~#9fr!uG;FtBj$2GLDZB4KA0@6O*su`05U;28j1;)p zupEsB?g0{ms3oFEhormMqYiOov$e>T=TR2}e1|del>}TdH+P1gtLvDl*L|UuJze~4 zD0^Kl`Ic%(^5X8NyK*Eq1S*fCU${?1FJAUm!Aw=x-N<{py~5CVv4K{6LV1oy!Cgdo z0K5DB$+uLiDk=h{URZyx_|Yh{gtb*_V&hs_WWXCNVy$!mcrhAuPyW8Gd60(fAELZl zBki?zf+Yp$6F>eYKWO0De)id(C2n`|xQ(gx>c-mcf}Qx!+_KyxGs$Bt=?uH@S%vKx z3QmZYIr{s)n?7LseWKqK9OeJm8Xdn7B|f8S<~{piA&8nyRr%ws&!=O7XNLM*Adsy= zQ^&iitZGdY;MZ|yhgi9Woeppuz3fq@z@pUB7t0}KdUJzJ>IY(h fy79Y+Gp;LO zF@A}Cj9xZ%7#wxx={n_9f1gt&T7$S8NaQ{qj0uPzMAe$EqHPZKB>13 5D9DD&P^LPH_R33YyED+QoUw;bc~Q8=~Y|rncq`2eumJq_**KoE$*Hm zEeEOG|6++7*jQGtKaW_!`H32V3LcYJ2a8>M3X0>6CC?mMj^-lm=Fz}rnbxIYti9v# z?X8e{vi;uy2f@Y_q|UKN;UoFd-fWea-+s$d*zS$)hqqSda9}2BQPtzKpUXY-hu8M6 z;*XmtnO;1cEHAT8G8Jn$m~@CUC*qR^z0`_C-dvEBOGn@e_vXq4!-=&Z&@HsS&sePi zqr6P`;i@&J_=mx%s6J-d$f2~>m@g?H%&uOcJ!D43=)QqF*70~xUgopY@c~?a>z&!& z%+cgnYhtSZ!GunE6cF>r$2&2BsU_d$BD%#<$9*fU`lM0M+y@!>sSvt^d{fk&g|lQgjB2zKaYK{#G@bBY$?&VV#c#hCY zLI-947Q@Qx_T}0L=JS)9jzy6lu=#=>^dp)oGYscwH6>Pa;)d9y%+GL!CI@ (8+8d|7eFrybSXleZWT;+Whql)Gc!+k% xaDv}!#LGP-_3^n#j``C3&hQO#qBT(Y-s8MYkZXs$M7J5 zI;Ym`bWgj14^=23fq_i5LZ_=)5i3~&ZpyY@v1Y?;U{MirSJClFoXPh8mb- S &@cx8H$=6_OI?M(pVQ$zF=z3Gigad=3i?4%yIN*S(a(B zevfnO@H3K8|6SnOSYXrv&1B1KDaksYC~z_qV*0RFv6QQN#CN-V|F}O;_87R0FLX{i zoL{)WwVk>cTP03v5UA9ze6mWJZrV4vL110>75It%kJ>13qnBfmi~QCP!*r!62E=$) zgy;0wC0aI5!E3Y)m5XazH>a7zB{0hE;-@V!e*#W6x|P9BHx}V4>K#Q@@U8dy0cjR@ zt@m0L8YHQ#cgqXuUXt=WJuXgXPn=HAEEnfDpmj{U^TQGF&@nvi9i;My?Y|l=dVUB- zdvD$OFnIGyFuHK^?+4YIbE4xR7tg*G>oRtT*}MM!WKhq6WLl(Smu=2XFx+K3k|sQ& zUrqj5IUT{vtY9f*&&;&4>#jD<4rwSlBJ4RAjCf=H51nqG6tH(})J>HQUN#!8aSca^ zmb4s9)*@017L9wtSLX`Djdz!(d62VGYh_K&Rlg @;j$*a910&<~!gyrGN>f?*PpaLW3!ptFSj0&757`YSSdlxc1LC>zuzqFvP}ent z#<*Xi)87H ihD`QQHndgHM=eX*HRQw ziY;fIzU *tN z_&Gd>dY1zGSW2ya`GWz&-YRTGc3NED{XMk@D>)BgMIF(sDZejgqFXiBYB-RFi}oEB zClLHX98}py-%Ryznm+Q6YmdN$ERMK1ER`i_Tz8V*$VQN!9vYygrO<_Fd9(JNFI5v0 z$ZN?C5f$a10N-Q{%}q4s`|7jwHTx81+r}gMciauKxTa8iIk}%6B+pv(mk<(k*M6Oc z`Ml)w6`DH#e*4tQ1n-tWQLZDDK*eDg^Y3eQOq#OBNi&gfMP14!)Ao=MR8dk8a~8j- zG-E08)q_dgZ6wu=N_ue0E!TOJ98mIJHQvpd&Qp%A3O|V~0NR6xqY e|Jj!`2_bbPv9Q$dsUh$kO_3c|O QAsEs0V_g<6Y+f3%~`pyg}3 zuv`w#1An`3(f#wRJ`0}(PU83F2VSsoU@r?bU(Fq3Wczq?p9|~OFH=1>Wf>z=wSgO9 zSvnoI$&+{p#N?PNg6rsCI7D)WL&7{I1q`|0eEFgi1y 3%kZyg%|P58Dj{K(S(;}kOsw;yz&5g$cp8HhYYehwi4p6zXy>(H{0~Kt~>d4F7{0ogPgK?CDq$zG{ z(Ayt9vOj6`2YXWDo{n*22eKMiPv3-VG168RsBIZRXGhe g>Y7U>X3tRRRZ zXDGV& zPEN^O>sR8Ma2(ISL~0#=oXsj~)obl-^qW^?ICaR3wWVMl zDkcMvsqi?ctc0%+a^|Wml(nd =7%N4!K-&=j *xqosy6 zlJk|JFHdvyakR+pto4s`X!Ap^EED6(F1gQ@@p;k#a-i>jGpR10G?k*wnmA&7qRwgV zv|PsVtcAzsn{uj{QG|}O(N8yH@A3^p1B&L6%9olnN~XCThauPYsRpqYhLZ!2`c9fQ z9)4}MnD!VCd53)VFvWhMBFYtEO7g*E`Oa%6vfZ+a_08a}aI+6XC?82DhQtOpGnsi? zNOp$G+BBg*GFNgz(^G#N4s8bI4{fw$L@xr&@$2uxYg{j3KFQdJ>kK%3=AtqQ6~C_@ z6DSlfQB?a`%{kgt7(}rgT?&!Ai!*+0(k}!+T^@7Oll5w-L3)5H?A(D5LMg#p^9%FR z{J<%#;R_cf{h)NVnwnD5k2pSIV|epU$6&x?tlzGZkBk(jS0)uzM)@VvdmCt8d%MHp zJu<{+Rkj8vE1GJL+<6H`DbjK=Z>4?G-7fx+96g%kUn+oWc zT-=4^fX$FR_u-eB)aQL<*wFE!t_z}Xj;OMneN(-0rn4j}+NXVMeMZWR0itH(hc@8X z_@i`IkAm4>iPoW=-oUm(OvZg*GAs|1jMJQiIpw5;@)AB`Zrwm5HfqO)!buzUemIw` z`IlfWjQ8N?xh#Zt@G0@z(jd-z10llSv|hD(_fmlQpnppmj|Y&_=pm7sj-(M9QnKcD zd5{{C)>gHg`7Q$Hd`(7XOvy~&PJgYc{K(8_F(H>B+rT<0i7%P5!BB)fluKV%-Nl=p z`EK^{6L%N 7rydN9w9I?KAW4~%(`%a2VPwK>$ zJmY*vROC|J;3WzBfr~zS^|po9q;!N5MEmrFzwHep=vL}Fyf#F3yyoE_2()K6F|@Xw zEqTs7JKB@+=x*z0NEA(D`Uw>sEx1zVfe8OkRH*YrzsO$RYM$4-T-2brE#>s@>^X42 zWI{g8usDLQo6C)^7usVqT3=8DRb+UGYUufmlVzgJZt4Duq z%{IQTw12TBX=lEZ8=yp5p< zq-C%Q3bI _mW8LZnn~bx$iuYI3@EI!qy^fjW zlmu}$Q_~9UoQzmEEfh+nL)m! @@KBenzNzI zN5(K$umPyMI5xXZr6Nk%avfzXr{*@!yto%&1gQs9JJy9@%jb_Z_HNr<{MbKs`M_gJ z#|$M0dP%@1=#ntgq(t=*4u072p?2=87da_ZbO5AC+%U>g^VVtQTIj31R)8$>eFjUF zk+B+7EN$_FE1kORVRP@=FKq8NtUOr>z%1ALZDrk0dhr;o7aGFgaP-CqJ|{2J93!>) zZHTQ6seD!7L-8y+*+G*QEDOz~qQ|~hY$^6{EyBFHPQ1CVakx6Y{r?DtqTB^z9mPE> z(n@xWR+ANh AD_QR$D<5m;vBZP=?8oTw{>=ZQLaWEQ+I!mgUbk sbbzpw1iLW~ED7%B)IyiiU~5a`Gmj-RGv(bIp; zcSZ@q#I!%R?GstR6dr=~TU9rYKu=o5X&U2k@7B3RHyA?-K=OgRQI}hF?H}w1u_IrF zKD)6)OC_dBZ{T=5+!O@CGfS*P_+W4SEwzP?XCDO-XTH 7({4hL>ryp3DXV zaAB5D7Ak%k+h?pix@@QNpeguF^q!0(_H~MrYpCiPd{m8p1Cetffb?Gg(~$OB3tv4$ z(Lb#<`HWtfd8iu*twPYy% zGsr&kRjdwZC9qD{K8cYLh95C`%4pli3Lt+GmNxphuKB~=)dR%r?r0XZIFT@1*sM&4 z{VS}!Td;a7cnq^MboM?Fj-;a1yaC3Krg1AC8Zn>G?ug37 Zfp7~b0xX&_3sVo}gPT a(RV#loRr@yQEn%5&});Mr{nwXfee{#Xv&0+ zXAQ`5Ffl8CCrwQ6&QDq_<%EZiI4{7C0EkH>A|3qV_LvbuMHNf5{`)@rY$M-hcN6zJ zx*YyoEMjBWe^Zx%B`bZ4b}CUU%mj;`LI2>8!w~7@lIgsp{cpC*bCE*7(SzC>$WXgc z;O7}Ufz0;e^Yw^9=F|NTF&UUQm2(jf@}~CW`FpSB`zo;xe=?U*WCJ9e^?mdb4bA$A zL&Sd|bi@c*6_i>u@m@RqTOc}8mf}xX%~$cEiZK4+k#$j^E}2`Qnty7?XE-jT`-r^- zkOLl|m-}Q-)&<&~6lKKG%;M)sHS+7sa~>=n7@bw`PVL_Se=wW8tQd6zaorM}np3i@ zoSCkKL)>Zv D4B24boa*!M0QB9eDxCDVE`3-9R-pdR^;|DCi0eAmbdl}JxP5VH)tPb> zbAr>@y?u+O5aiLB$f1hut&+zah5mt>JO2y&0L*UJxIomP z#Y3M v6H=jfVAs^N)M@85X; PnR}!9^Et) z0lN#WzRS6vwN9zR1ld UUVB+La^D%h`(pcDR8H zFjru&pqFaLUquQatNbWJ`R45J&^Q|FELMz(n5#5p@gKAtCupo+h#r1V`Zyx|Yq=85 z{6u={`|NPhKzj$1x!)sSII}`=!_3~*u4N}+N^q<-329>oCz#uO^S(Cq7D;%Tz$QVg z7D^`d(#@7mdLu()EZC>j3479567jG)YuTrmG(km&9lsTP|BdKgN50Pi9R8n$>7R5k z?7E*L?Or`ZDFGLxq&;`h+QB-`Q&`b~j@DO4uU-Vmw~*)KBZm0K3fkZVLo k6CW4b%&p&^S z5PcIi69@ntf4HY@B=LZ+T> r#4LkXBe<5Nx4%=E;GIxs2Y_r%&*ntrb33pL zYhZ@Po6B^-Y<7J18bTlYZ$;nPQ!Ui(tlX;nFAxOCj%m*5kw27c<*0z!DowK5+B1C7 z^iEAxSU-1hNtK!;TVHxG&VG4!aRN|0O%5Cm+ea^xjx$JKwUC9E)xFt)sg~R1V(D}< z*gkWRXfIO^VbX!&{e2+eAt|;VH%?@R8A`~5;0;kdu^0DaxYS4P8J}#_n T2pRYrUqp)WB?sH4j! _xGx(>k&$Lt7W2r zy{JrN*a5L6sg=Ce1Blk!Aq}^Hyc&vNmTYwTdzE&OO$OoK^U$f`>|kp6uq0HpF;quZ zYES8Z4sYOpw0-ytk53&u6=a&u>^<$Dcbz!8voCSy39WT!KVE;Y)fbd6G3F-=bYK66 zdCjn;_2E?JS+nW_rWl-J){DMh%flOJ0ptC_eBXnu|H`9AyD*;NV%PVdIaQRolR~O( zM=tL>e*@;j!<)vfCa-5=EtDMF!_dxSnFAs+rUQ?Wbsx-yp$ m|`$;^5)YhxLc3=O+R z+l4Giwz?oli=2Bo!_aBK0b6hW$WCp!zktMC7^iVa@dcbmrUV*esoKJ`m#MP{ccO2( z&QI&1 Q?F&>oC6-g;K7z%|7A>-xPw_n;+>9?YqH1J}6g|$1 ziWIbFAwHz7hzw8&m>XPc2{B0HEw%}MrZeJpmie9zz4=tM`F_bl{+35V)*i7%><5a9 zFI+5>qs5*)pGge3x8cWP?LJhjWXNb}uEl10Yn=$=7IumVSiqQkuVZl#yciYaSTCuP zX~yQ$Q&*Qgx*w+{$;(&H+V_Q3u*j^*hu5*VK35r(F{ZorEwD5bZM}!7@ad(2UHVn(XEr3f$BpmrGM!|@p%~gWmU #^U^wPm*0Tc4Hy!K8{2-8al+(|ywOWVa{mdWv z^jygfeb}+*N)NIN>Q$aU{gv;bCSxcnWHw 4v0b+hG=DwpUM~CUXP9kQL~aP} z6a|uRI?$o2zj=lqNeBt~MEXlD7k1zjfqU%fGbP_*xaW0ps^r(MTCbn}4@82D3p(E$ z7u6cn8YhePhZws_88!Jn)J}qw{>f5%vt0`JFRnRB&S#X_yS-9f0BP4Ns he_j+Pv z^kgh+em58&=67n+0A?Av*3Xs*QRnB(_DHJtTmD 6Xzy`DUfOZ34f-rHSV9t ~n0MCyAD^sCS#aHbcAP^>(qm 6z4+koOfc7-Ko7%g zjbPYse`x{OHVO3u3 )|s~)oRgrJR|l=qTU~zao?P%$7?V!Mptm@UFO8x?ayuwd^uS+%G;GLm z`xs(=q#QCZu-(w_FNlWQJqd-6e+p;dR`wCl#4VT$HRk~%4&dv(e9gJ - zfk*9D0JQr!6lu$krJ$Goqybn(8UR~P9GSAB<5XHyYK$YeZcN)|M keDH|x#*%qrPU9ZTnMt6QjKyo6m1VO%Hup9gKhu!Q4 zCM{Hw@SKa&zsmr;wQl{$A5eI7B!R2E)g27Ec{t+>_iS%juj)}=-QWkDQWM0(X)p75 z*{hDdwv4k`>p-VTwuo8djFHyu>WJsnL+*V~3jYCLAFrIK^j}W%Lb{V5HWx`NK$ce4 zLwtdefAr9lk=L|G^;tRK0^#w$GyY|euMINs&1F7h!KJox1sSQlx?+BCcmTk{@c(+E zC&Z)qYVan6UPeR>ZUeB5o&&j^pA6Z1K`$+NV8J$4$qs-k0?QuTIYI@XzC^&$CM8t| z%$eK)3IPIT>I3lxpg`*Mn+(7ur-P8{WO37|LorMFA;?}4Ko@j y8< z^g&PcYF-ML_>8wDekldcMXrH*!1O`c6%h3E7;*@wW?_TbD)}VYzi%mqy2VJ_p>p>C z>()!LRNLPY%Nk^nxaPEe2Jv75sA -sM7Ek7yYBzIgn)0V~0O+%wBIcOs35cBxA(HGL#Kj zmd0OTPRu`KovUc4i^Si!Eo!e{$KL*t{N5*lm!)q(?*jM`RaQ4r0lUcrk!<;kFMFmc z^zH9E$GbyFZR^4kU7ZfVJDne9u<{MSCR42{N=@PVHW~g0R;Nch0riPTQ&?hRtC`V# z;h(`Y46&@9;~XiD!okd@fI%&~<|*J3rh+;9`}~k+iP7?4Ze=MhoPYGm5##jNmT(mE zZ8iiv6u8!O%fJjB30zc+uRU>i;c!BE!pA%}2m)9E)A?hF*nDaNSV8)9yIlwI6&Ui0 zO&QWE$g%=YAzx? JFjjMU j{8J-w{zO%un;f{&h#@i2FMfo?H(mlzQ+p5<-nC9ud?kHitT zZ%466Jm%xnhJ>fx(_LJ_GJBODKVu6#-KlxZs=#>PT>0wUh@rVA*}!Ktl=I9EPGRCQ zGW zIqrR?A`420+4G^vxb#?abB-We@Pa3|3+Dv5IFqa(%}Y( Gl(cS4p Gb848gJe3R8FNXeoQbfyw` |N zrIV*0c!bZnYr@aTc1vk%I*El(j)9`h$N#w@KR+A`Y79ORF&Xp*wsf|;%n$v7xrJeU zUfQht*XjY61WydJ5|>u$m&LW5sk*4D2(5JC-%qlwNe*QVTt+X0D3N|eU8#Qf?$x1O zS%D|OCaHGa`wGZn+V^(=6y1xDy7lNTnp13D@0Cm%eU@_4z)DTO?1|MBY<6$4Tb?y0 zZ@j?wMQ-=Mmu~lW<<}1F4j@ o7aHFWzw0(MYAAOW&%apYt^ z(WwO{z7)aCVm3f? %p$v7I0ZCA+j zhF6fCU+ZA!BLGGmCvM zrkdglpc+_Zsf$ip6o H<_zQ#+g_Z95CDv^pN81KWh5vh6G23UCchkwns);(g;XI{9+Jzn4 zh$zWUSh6e|MYr+@RkRtaIhepAY7^71_aTa_wZFBuYD*;z;1FA}S1mg}cGqRN4?Uak z+&9}ffn}L-aEPcxK*_B_n{V=JrQ411O9|;1K1}Wl1~^~9L3Kv$I+zcJD{`)%;?CMg zzaGhVode@Bou5>xV=%b0e(5o;P}jy>$j=~xFR+|Xl>^W9x+W{vyZzvJIRkZHKm$RD zg8Ok! ObDOAd%%W3ydw^v~kwsR-zJ^UvDz^>GWmp%+% z$sq3K|Labn<)_3$RDa!vXF6+DQFdt>xGTWTUU3-=2{Ubc(@rbiTj%hn +Cc6YVKT$@&@of#SX;VPM_<9!Yzo~}- zjZQ|bz7lXd+DwgT&UC!HEcnIQ(2#HyF|^qO?wTLG0rrS47V(#+ij4wtzeTcD3^2*X z@U-xOHT^RDzglBs8fjTx8HNIu-6s3MR;AGwZha-GdRh|q)&4WG5_Xgk2{%k(V zS>C*Ky3opb Xm)i0Xd~%PCiaE7L*1f~ zU^BJ@-U{{ K&_n9-Q18Ya_ThZ-}iv5_#e50alCr* zH;FTz3EzUG*)%J4mcOYDcUs<=D46^{SUm5Lozn2kQDnzoa8d{g+)TkEg?1eU+k)PR z2W7Vwi!G0~XN`QQ*}Px=XB*`}K3d{v(~cs;%(MFRE1`bIFnJe1dCn(|S_N?!7+EI( zLAz%oK8v-y4Yp=v?H9a;@5L Q=4l% zvCGIa{5Xv|qijo9T7j5i!tsmA!L3{*TKg{W3PA!$+6INKk0)CwIaW^g^ovvZAAuh3 z(5MMm2%mC_c>4jqYaJg?x(iY+c0&K&BVaytuFGJ5rI)nibTR9g#jmj*P+V+|cbEJs zW=VO#l8kNt-r}s>d(Zz?TRdW(j=187CjB!a4|*(p3wZqyYyx`V#80DYI_v>Q76j6C zN#^xn*A!_j;Lg5Zz2?-l56qwP#is%2qHjE52>8sPau7C;a)bGhSD~z)s)qVH1@)mq zTL5a(7`~yx?(ZHybC3K&p-~bXHL)L|<&X#P;DHDh*=ewZt5u?TMgp|{|LslwqU+g_ z=_)C$n?%RQn 06(fQpf{zORy%Wm@NgIqG8 7@7{ z6su8ol?`Ox=k;%-C5bQQ))rr-1FAHdjEh^AeU{V2)r5xkc5bPP6^Xss!yQd-W7{Rs z=x%j~L;stl#Op{$x-_5zwv%rc7?-G6`|N{nElq!UY^_$8#;6V4=iAl0lb_aVhPBk; ze@0kO$mV{M9Ndvupp!i$0=tL>)V@8EQ1f;hPe!6IW+34z*}W2<&nxD)SlCOhZe<^@ zDll?n 9!ud{JO{vrD{L z-YU6`>O1{i0mP tNnZ);S<`4~AZlDYaXf}h1>Wf)ug&m1MFuv5KrLUG4u zWZ8nTtWFP?R xA^b+MimVVVv()6)|@dZ R^pqNG=rBP+zl$d$_F@J`Wb>}1vxO5uW*>c?w{cdaZOvT zQfoBV4Q^^5J$?rOOerIB$qk{B`HTfF7fV6+PjJu)Sbyp1EHE3uA(Az`wk$eNNl z@j9X;SbI^s9ll3Y+!{Ne+O~d9c1_|}X(~c47Yr&gGDoe|s}C1F7A5lu>oD3t7W`0= z{zU)*4LT6aCI;e;DlI$n)Nh-6jKEe0cv`$r86y~SI^sm$s1A3Ig^<`rbquu3j1#tY z0o{MJ>UwNIbw?C9>42vRm}pdEdC$)3m_miPpDcWWR7u-kt=^@lB+w#AXNT2(lby@F z*^C7WE8 p3OJvoO#Sz{^>6PGjku_j(s1! z?GrK1;c^M#LcZHtMewBwwZUiHX*Y7I>&AllLaY14OyWC-hX)v-(vO^SzKA&)BeKiW zuP5)$lZVO~y$)YACLRWxiN3jDUobdqzCSbYkhMh)mcDoID4aW8br|#D=T?#pz{<4B zP(*?|UiYjN(O9ymvhQVJ#5SZH$Jmw`KL1F&rni`{0O4A8Sa4WmiR9ijE*f9%AKoCp z8A-dppYi~(M3O1VE&=+1BzBoR%5cg=0MvJA7q)BJ44{{8@@$dqI`d6k1B2(+)Uvu2 z{Tpq3{q4*%% >U|63$!mEr+rOZPoSE-t zSY-iU=M|pGPsKb$vYN2fysL#jnvdZIS{tGYINGCfa{dd^ajz)I^1lm6+{uFQ0u$>5 zSk=~db)l9Uxnm T?Z(~1~c!{tdw3nf2{=UbUhg)4;&0mG TE-5d4T^glqy?FMwC*k<5(l)!3)9O<~fn`}c)pm<5B7>vBM_>`IzV|%QbB#tRe z`U#ZXPXXx}0R+3M0foy-KDd>-e=Fz%E2IM}pvf!fl2_m-AA)L3?}%a+ bh&)-SsF4F+fFKHWO-d+=DF z9Mn(Oow}?!%Y!(dTYXlFT~7BE>?xLzG D9C&jxqjSoA zSThc2<&S&-)g?}jxD!(d2uPgdV_8z^-`vR~J2K8$Sk2GS0z}>H8k1$RQ01-~#Z@l_ z988NNmz_zWeqD8e1oBxcvO+Ly#>cltR RJh>y#-M=qQ-@UJq5e}w(v zNYde|yq;sP^looAi(BvKbc%jCk{`YadnR}c9Gi#*&OVAa0PSVCd;OF+Lq65^0?_X4 z-sk=PP&C`K3iIL6l09D7!vaT~Y+NVp@~s26$Q*I6UVeUZ>MYOa?7;US>2%j7qY%AW z_cSXGpDf!ts`j8Xo=ruwxd7{(P)-$3#>W!CxNdl>3Cj(=$U0S_iKRU=v0n4do=r-= z1%nRmiyuFBlpy;zN&er@QRkc#{2=|HX4gnG^_*~TYK;T*3Ux#aSzL@IyIlBsk_vfF znv3 +b`Ey?SgC=vT?ucuUbn=VBeYf1wi%#Xh8$w e?A%fHS^ye30z-L z5FY|8Y^M6k=>exQfGLfk%5{HgWq1vj)2!8=WLfCy2}tlYXQg8 xjb)k#jd}4VCaK8Fa1mvf>ssVU3 zZdWszcp5@DV+Liy$r)cT^gT *5#W1?8_-!fX) C(1G1ojZFC= zE6P1dv#ZD=ZYweUGUE*oVI+P(hvUy1-0NRS7OON-v@prN;1gt|pqdbxZ`Tk-fF(L- zoWd-Ga7FqA_e@?6{jY%lry3@WMU^@~-}fIq&gFLD*uxlzqgqq{0(1v%G2g`*^Kpp6 zT&o;?Ig1UP^+*M3*M3|qac8{`MLZZWFcIME#EoGo{HZubpIb)pw3KO~cRTx(xjPM= z0Vtd3x+fI~NQVD|y*Cepa{d3tRVOWIM^T(oXd;v)VuX;bA;y{|vTxZl#;8P#t;iA? zh8V^&b~OwtOQ_J;#T1DdG+``bEYEf8ob&m7zTe;Te4pq4pT9beS?>F~uj_ihU)z<_ zGFCO@<^KGjE_ru*UB`icfV#r0mwsw}B0L8>jlUTlmr$xZ-krDjmP_j8nJ8L*sY)Gv z80SzZ_6^j%HdSjt0v6j=?g&eD`D!SF$8f1nzZ#1*!a}xFy*}rX@9}zCK-LbLOqI_e zJ&J;#tW{#nCcjiIL2&6KM*FXC@5;yW#_%J&@HhpJ{*uBSkw3MW18imJAqDsUmF+eT z=2I7qvw}#03zrKD@4o^_NEQ=FBF^iXHHi@2v%Su#0`ydZ3XC0D%Dun~_;efzP!c)X zlOq`j1vfgWxYZ~$HHXV{XW|TH+pzv*Yv%zyiTyc=w4Q@j4f8l4th+s=44Ap=?H|3; z1uud2u!KO8>}csPb;v&3YWb)EJ7%1#|ER5WWp>GKp~tMF%|x>m-`8UjEU% M%IgSZ0tk)=?2;49+9g_8g+Km$GmVgr(FW31t1ef)$KB|~`09Rv|T%RfNG9yIGm zcJgE!7&pO`k5OVqAS2+6uuHA;P8CJUE5{6NfY8(>iSdD|5BM3+vW22-ss#o7hNEPb z?l@~8=KbrImF;UZRKbdBgxdf2J&MGHncSEUzC2br^8%<8f2ygj3r)5 >G9B+<3lHl2Ql;=3pe}vJer?f*OuljP=t^GXnr3pPSw2 ag+Q-8dji4eU*t N^m*DF&`hL&hP(mKU)t69y3aFMUiNh! zqPqK?L}LWM&EcFKU}wnGO8 ~6iRet=B_IbyoP@4e33rv4y{S$;oK?^2U8seA@Hr09P?aRDv zO^g0rC4Xjkx!UUr0^8MkU7mKFr*xNhZpXpASr~U|=aUO^uw`XUC6#~X$@9&5B6wk% zG=q9 oERM6zwZn-Jfcd~Muax+6Vo3I4U-(EGqFVN8 zE+BIPHn1>iGUTXkH|}MBolxBfPLkr*ArL6@MYN7Mwj9T$j7Rd{%K%vZE^y4m>~fk@ z%^is2>#D<=Uf7AtX+@J QyDW{jLhVx}dQj>`rj6Qtd;)a&<3_xJxwJX=879UoJ++Z;KZ Qlk2G*0>px)= zFJj6%3Un=kWp5B7v+s8rJ}<-ZlW$Hqxm1@u{oz~kjgn(V<*(_k!tkR>kzx^sB6kr| zl#i@l=0pp$8Fp-LhJy{bD4m_E?CPYgT%~|L(`KX26qcwb*|JysOZA?eu17E;y#gx( z$r(@daA~_f_RlyE?%+HqNY49nK>SSo=7{|KQc*9pa%`4nqq-`TcP98@R*v?R3rSfp zAdX1J_#ddNZO|HCGJ$YP@U3}lbCEfP%JjQ-$s)*ca-Nwwalk#ehP^G_SsqPd(%JT6 z_C3BY;nwZ=$O}_I5z9OWDtGeg>R_VS7vdI<-15Jt$AwO?i4>puST$l6e4^w>s=E_w zLADvMmm+R}TZNN%k%GJ9F_!k{^^fw6LgZT#?hj6`fB)t 7$BYZ~phi6Zkq`Ad z7HPf*5B`+1-kcwBqu$T)6EFO(O8&PCa1@h3E;COAo@m{N{9!e@eQ4VauoDAs9@5Ek z*`L<4)U;UE$%vd;I1eBeyo%JJ70 $&c>2fgR^>II(O15|!V{xR*` zxY<-pSjW}-NZDNDF*^-^QmySV60M{_O1#3fwqpl3r+gdi3KC`&?C~to773=fxTUB} zKM?$v)nYDKBg1J+4W`lr35S8Jl<`N%Ll1Q3{7wDdBgB^9J31Y#*Vze{#? K5uzl|JUnT>n)T}S4=jGUpDSMKfdiUUtRIja%yniZEz6wGnoS&TqsUBfT+V33D zC}LiX!%l-2 YDX|_K zD#|j{{C!DgeRuX*ZfU^>wf);ebxhPyUiD$RwAnYx{N%2nosv_o$+!EyXT!sYG#ct* zcB~Riw^|+`WD>-;cs*jBRMsvD4P{X24=e(8Bzy=1beUT0MA{ ztGRP}fTdGe9Z()*DF<%-3{x-+j9kj%sw3yo-y)r_6??f@eC%8+{Zy9Pa0$S@)~1PV zrr1uTl?-TpwP*nWR@hB~LbrPQ+(Sn_xTy>|Y_I<+9Eb>*3q4Vv6wdbb_y?;gw3sFS z+DG`nVqP5(zo RN!sT61)?ZpHJ(au{h_6dhFjh^iRPa-;}op5cS z?O=1-8TpahW1v0-%QKF8ygpSk^V^xKvLe<6G*&5hiE-B&YlW~0MOhmp^ZWauD`Bzl zp?w0*jCudJS_6uouUY_l1^G!)4u1c_&sSqvOvBh?vADl5Vq=%j+BK;WrqrDi5p&{1 zYW=Z~8^1v7o}*zc+nq(fegG1;F0L<>ymV=`K|Y>2P_jEi8?_L+%OfrdQfLeSvrbu9 zpNezph5y`Nfmb)d)e}Uyv@Xw%S&_QvKd$hjKvqrC+CJ1^DUfq%23LGYCGUsNR8X>% zldyGzkhp*%27_nhouCxEza$yCt+BFN^Zdtd)_A)`<2#I <~23=6OGM&I^FJ1Yz)DXBf;?r_0n@LJN zD>b>eJb2>}sW)0cjsQv?P-0VpGer$j59L?@lKp8Q#0V7lei}fw`WtlD9+9`Es#u4I zF8dZjp*ihAKmwvgOSVC|CXM_oZ+FP}enxioRfqBSR kLdI^GJkrB+z!Fd*m@vVaaVd5wljTf1}i;O8$P>qiMRY$ zw>8;xaLuNQ;vZ~U-D2jUc?~D_c2GM}f33IRUXhN&% n6OnqfPG45{M) z50 68pQ-$RC8sYjo`wZ zcotXY*(aD?Qi8ga?XT&i@izRDom7?Mx20;2KHzsXFi0F|Qn9Kd#Y3&;UlS2Fn(=-d z1i gd_QL4Hq)0+p zr*ASQ?BDJ{hoXUt>qPb3EWLo3%X6G?IP#a{d(b+5x#p@2#6nrhZvf+&Hco*vzdFM40*|WFhnsn*=Jqo*sSW6=)r^(2l8aX!`xD4Ihv2s$hQC=G_qx z)1&{5 8U1Fk0+(DK7AzgE_!U?&4eg+oyF4lnA|ypHe+n5BgD8uLmH bzpgsxu52di 2MW2NaombW_zyGnmS zVHNsaMT`~$R$4p^ct`lvCkob!j)U#wlEyU?A0tIb9ks$VN>r~8!@gM$fmBw`?5U*= z&?fo^2P>)6C831#?&TlfjyhL#&Ll~oT6V|%Vi5?D8M-0;uSx0msi=0Y&2{@+deDeY zeGr`&H?j>VD|EyRO@s^xR;Ed)8 K&-6nU?Po-NsZZ7a4*DFvB;ZV)NeSVQ5!@!H5mvpd(hz-8 z{~SU0R=SQBK y4zB3W}ERGH3-W{`ycUSqSdO+mP^!!^4|#u6GRPkAx%aecZDUCWCp1f zY0kX`yT$hPPc|(T(HMS|@o(o_fi^EbbjMXC+DmA+Ya3h6+NF_yZ{#D(^rm
UV|?#lB0wRgucf5XLKpEs9@ z1OI#oPXLO(3;@NK850m4EK$*^ZiH1LNyd#uiE=0IMpaK(J;lwj0-~sAI3~|P%QBy} zf0wv*(GUpN(8T~lp);#{kPO&+t>D=(XjKd~y)ND5E)SX-_Z9Y+{}F4h_nHma&JlVF zYH)0}X_r8mbU@B@J;}_^zYwUFjOuV+y%x>}BVikB(|)7(9@&(4G5>Xk0QQz1iUkB_ z2*9xwARPM{gk%3epE+*=ulM=|y|) 61Z}Tq{@*t%65C@8iFIOKpV# w;9fS@2#`spMhmGZ9f6~7R}h05_iLX7(R|i}9L(hU z)l(t$GjEd D9dw%#SJ`n6OS!@mJ(lKdof$I)AtNO1zI!suUbZi3i3gX*b^!2l3@*;n%~ z5hohJsvR}D5y*Gi8j}nQkcO45d{@YFGW5Y_te!Ht0$90DL1hD~m` zDb+RC!|RU-swzT(nw)HlQ4A?kS?m`9 eNfyC&~G+sGW5 _I2b zD}?sOPF$J_(vq1j{unl)jR(X)K(NA>TN*3FVF2^nC{5rRzUc)y1djyAf(u}tFFX)n zrZm~Z3Isa8o8$EAZm`zt1gA$zwYaS;N!_nIzp?}}$)2oN@ize>uVCVh_UF$4LCc#4Ez Km$=7?3v zckkTaMlm46l%bHvGXJ52nU8JKy;r!^3rm{?j8N9;&nDv1Vy?y#W!KpJ{{pm+>rLD% z))o-Ww7G~=H}?l(W1|@W;axG~qfk6U& 54m+@vN6#@If6`=!yj&vq$-k(fOXhUG_GHMR6-^IP`Bm2TwivY_ z$Y;<(-u)#vETlMwCnn36g4_OvBNyWiOVpcj+)>}eBmux_YO%`)EGU{Zu Ju2{0Mmqn zyfHzZBVD?GkXpHMf}Xaqj`LWb<|9U^%(e(@w`6JK0VB)jHZQ!PD#A1urVA$*=eCu1 zwa(5oF>D|9*@Q>}M#aD;X5Ou&nq@Lz+`*kLRmW`=`*so48Fb=4%*yRc=OQ5V#D zbbkZQG z`f&mrk%52Me1FOQDhIc+Ao+r-NB0_hf(F0_B`G8Xd(XS}%k%=+`|jFD*vc`wmeePO z1&Lj_w6F{tGviGJE@Xl2tO1^_h)^udBX0`bU-yPnu;L{Mx$~k0@_gf#@f@tk`;GhK z?`oKQ+au%jA;qKShYOf?^O$;@&x(iD$)_HZrrcBF(pQbX&0nEV`FWCe; =hzJd*=Q^ zw<($}_`V#kn&aI$p8?Emv~ 76$%1DucZ3kFD~1ZELySq8O`Ew$Y?XjJ3FVGri$YKhSj`vrbz z&Z8n^cOW3 EzJ=;`1Lns;C`HoXo z_T>HIQ~$c=>3zH97JJsvX-*TU&X9RplIZ6O0J{F98jrJmLHF$x3<}m-ag}A@hry0> zX~Yxg%-`@*(F!XW&rem|GzS1mOz?t-!d2=uubQu({|Srt8&>;e2>JVN>yJ&p-j3&m zMmFDKS;K_2%6ut(pA@s=|6%z*FE6bd3T1AabBj035OPtjwLNE;xC 71^MV07&`e z8ss*DOBsaCdJ{1lzp?R{0x4ZC#C*XEKlwH|5#~5viWt^#afvX+{0a{Fc(uEr4GZ{^ zn#M>(vJKj{*V4U6A};B? $GPt&I=2-_E=8SE%>?J*l`AI`!xM;31Wz=R^0*Ha6jYSUUhkl z2DEW`bd&7{2N+XYT?f@a^n1t#W4 ?9YSPjnmo+s+_dntVSh$!WL^23g#%#N&)5_ z TIQEfn^&Sg=kR z4BxX*Dgi5u{Tl(r@N##o*G ;{ zg7{;jKrZqauxoyG3v=`CX4qTxy#zDpk;MI1c>Qb-a{N&Pm}$?)&D>uh_yryLGhzJt zDghy&53`z60p2H?!DH;6N!OT>1njN+kQ^Rh0~T~-D8z+kW#xR@6gi`VQ)UOm*>y-o z)w%w^h=af3cel5i88(+0dU|NLM;aH4t!9CCUbFr4o|A0<*N=7?rJe228Xg-epsET6 zP>msJF#$ZN=;ul4B_`h}QT>ljYM4Ct#_@aXy^l1rmeZ~7?sxe;bXCa_7zGca@W+Kr zEdTB``R??*%72EBp@1Ml&*|SAIMj_uO41;KxgM$6F|zZvL4Ccm*jvK6-16zICgb<= zxg3BKSwirl)%dO}LYvoj>|o6%x_-wQm_ba(SKk96_bP<(X?2}@^aex`CX6q %^%t%^$22OZ)jY1~8g#@b-O^Z9!7`E>o-856owW#E_l z3wNiPeW^Y}3 {IwKKM;P-1kx}5iA4YRj3 zY7HzEwXvSIXj!n30N3UjzQy*R0)zE&&h1MT5MjSFR<8wgq7g9m{Rd?KUoTQ&sf?vI zegF0D46L@w6Ll90L``FjsPF 7%2dDgICe{6`A| zi$JV(Zt#D1rGI1grUI}28)hF<#$}kul^eP-L%RJF#JA>Ftj^8dFD`ogTXdbB*13=L ze3k}=b7)=!bUG8tfSwxza5JEGYPjtO;^UAm7Vo65=R9)cnfg4-1~?6+&rC{*`s%tF zWqkYaQL4?_`hVc}VwB^uEq4J4xh?H2K7_#W;5KL#%Yqeh^`FOk3d`67Dn$x3@R|ee zR8XH9k>pU!$-g-Y`;NV#_y@r8gNelPM}K-AsPX-A+tgosi07?!n=PBtSxCdxNx5^& z#}sn79>de;X}g}0Z=9LB_6qp_oLJq0FI}2F1&3{!~{$Cbmcj4r7IbNvz*>(#o;90*gNc>g>I3 }LGS2 1n#;T(IEnOs6VP& zns5( 99TEZlXU=xshr!hsK7Yz&htRapj`p?=^jzaFZnJHo~1&%)l1Efuj|B z0j=?Dyau$$*-Rjnl-2WI8UP#i9B=CFFB7MsgkdLkzE7j7c$eaZz-e>i6`)WT1NhRZ z5 &Z7bl@@V-;?^z3(Bc zqV_q04)9RKgUY `T2_I(*P6&CGha zQt8=9TpQ(ryFusSQIK-#I%GXKwTPy~_}r!!+njN%Pey``vu9>DF*j_(V>N8?=O0e- zgprN BTuy zFO&kV_9%YVLn=DD27FTF;mj8s t}ep-iTmdL%Yi~Qh})#t4>?f?XMo) %~>YbIl(Z&)hhN+k* zJ!I)(s;A(NwKs ?g{-Zz=7%lQar4eUK0Mbs@>Errpq}_bshsC>IMy3;OLh2m z3p01{tdzjbjZ}GJ7@Y9wsSTm+v|d5TC)Z1Qsw0=8w{!7*=Q)nie{LQLRZ+)?N2jZ) z7#*Q(S9!^bSWegIVA3OCva8#00Xx^#wqG|?4x)(<%(c3I%#OP14j+bc595itLlag* zR3M(p4j^yk@K2NwNAi)nJ|_qxk9NzMibPB`pDwm~fR%UY_W7ukY3iwx{+Vg-cAR*z zC@D@JBduv%NNX*`2IkG-@EmS8`pN)>QuKZz>aMl3;+?kDg!Xg!*a`Wz@=jyT zHLI37Cyq|a#o-HtqcL?vd>r9W^Fn(b?sE7XjrQ`>4r{zgoi*2j|1Yq`&bZrMI>JO# z67-^=L_i&H!pvM7vnGsORs64e= sHc>hL2cQI`9Zzy`*iCmeK;8lUi>+HZ4u{Czg2)2O)iMr_W+9%V z;NJ}u2@)K4O0_rB38ZKKk1v5 vY90eBba=YRZ_c M9{OJBtPOcH9yX7QC)v3 zy!Rc!F8iV|SP+Ir>OGSm1l@#YiVycu5E`z7G7f*%vaTtZYrL)H&k4a?IFLDIK9QJo z1)O#pVE1E2ADH5}zCph9X|M^m2?1cMR^dS$^u=`)Q*5BqXGU*--QhRNI^4WO1wq#} zwX~~a zCMxSwP#F|bqBDXtwK#PV9APn6{7g@>(j-2X2BnCO@9;bDZy(_WAUDan4#=Ua em%+yAP+hNY_M~g*TR4MziqvT_`cxAKS7t`K>Fm&GxFM90Z4} zP{W4U)iZOyVr!?$A_NEyf87eJT)oX((fLQ8Gl%h|vdjYE)vr66wj;tHVOA&^SLc{| z+ny58 gZ(uiOfiNq6T3%+*$JxLv+Y7)5La*K3zohBU|89ef)z|Q0PFDP2**a|If%4a ze4x5|9KR7q8~gAeH;&z~1O6oa*4tg7!cv|y)EkM;KESF!zR}C_8GR(im$9_aXWM~U zD6k!8REB*Q5!UG?mVt_6LZy$Xixmj%alAfMd+XcVY2XRb#0*2q^s*(82Hr|SMh2`( zf`E;tAVOK%ix$U~)5MvzsZgNy|FD#e;##L6!rI#VcvgT*^64=kRj Ix5LC zy%USZw8(r5R+;$875!3f+fRAxm}!6vXp-P@D63}WAMb?MZ`BR+*|G=w;+5Z3fOtwL zh!?^XyIEE4^^bMs-kokM5Y(^)i ldg +fyP65}s3bJVWJKia+$146v$+~W>2OjUWXMNs{zRE~1 ynfWF_(Cke7>z-7y|sCYHtWrV&LJL2~*yJRa6YSjbY2P-Hihzcbh$S zEafJ~j5#h&4`|jA7?PhE6;0ro&3Fmj VQRopI_J-4cH{sNrdsrx1MPjpEr5Ibe#dIF4!YWb;-kkWn{(WL||&|k2I?% zrT`)AiF$Lo>%9#lv#Gi&YlIL8uA%a_%O%c~03|MrfVrKzZU=P}P0{kCE(*`X+@C#5 zIbytgs8n3q8}nGanEjceifikKv=ow|gK?r3c#%WLpo1)qp&_J7hxBM%0)XXB6P+>b zE%3$ClZcnQYh%SCVA `Mc%m$=;*PH4Yk a&dhdSbY zA*AD9xUZjK#yHGwOMr(EZCp|IQyMY*OtD^c U*Xi>1A zXUvUa=DRx96M?rWH~Xl{Kt0$;=GS~cg273miRrNpdmm8m{4kcV)JXcYeNBiaw`F0l zbaz1Yn!5}bDv}o6(ykO_?~4Xk0rk=eYpPnhySJ79*_ElMRiIo<|4ncd3GL!5JqnE( zP-8b?y4Q^vk5j}xGvZWu`xx =eAN>O@-JQ#F;t=t;(u-;`wzTXLbcgma7BNaH!~ zC3jb${E#|}TlGowC9wIyPIBq8wme{t?WeFI=RLn8VbrL%(n#UCRQ;;&QwEe4Gxu;W z)vXXO$4Ba?w-~h7uZ~Ocw+Fmanx3 l!JZ&}Ed_HN6 zRf|s#w2b#MQKVF=D`dzNwMoa;1Is90+?Y2fWyHj4oHgmZLC+mhPaKAhYii9-o3ZkG zo%6oWo#Yz@F~%F~J)YMQ9Sc`U9r!jZ_Rtjik>j%Oq3jj*afq;gir}>l!%UuE!G9RW zggj_MXb`dIW^s=fix?61``cwag``l4O@QdIM}5z5Qy_;4d`DB{+FBs#0LYH@)qx|` z7hoB=oH4GE>`K|VZWXG1#TwgcF^EuAldRVEJP!z_^PWhE%Z074j&AL4o;pn`8KTIn z{X&B}!eH(&nc<29)1>C`{BkD~DD@Hy N7u z-{lDnUQ=Yhy-?R}f%WvUGQprRqJ?80PK{@5*|_6Clssv@3W<%&Wt&-#uTcUQWFH2j zZK$_iQWH{ImOJ6Vke!~O9I$-2hq`yHCNcx$)HnIY_}l=*h!6S3XGIqr{@1V#f0z3X zAKjG{?LoK=bLCEifQkd^rEW!&88`>;Bw4q90<^z%+6|zePXC@C#jbqQp#Tb*HMzeo z=AWB3ZZ$5q(@fvH&9<>d< (Ul=(w+@3kU>_vi7_v5{ohg#JY2q2R3$MaY;_t@=OFiT@NB|9E) z^2g9dpkn0&16*bDOTi8QqMw&;CFsN`RecPop_sXrD+?Pe5gEaT6H6MrL0kdWakS bXxL8k#~!c};pXyoO*!Jjsqk}YxDi~}eIg4d$FL#M2CR{X~u4!1a0>RFB%h{k_lLSt)XO7# zBxL0*^p|i;E;Ts=lmr`9UHG85RI%AYxDme497`GiUFvwiShibD$dQT{fK0Bv{W(t< z!?VaYKiS;G$ 1q zcJp{h!=jRxAJWc6k2!+Y;mn*1s>6$#z`)dlI3iIRl2ef?8yOuzPVJKV*~h6$1>b3@ z@2{bH09KO(2@AtEEeW$}5YGk*{oXYsPFF)ePS*ET1Sz=LUl{eE$|}_wwC)d=U9xMv zrV{gwO(mq(^OlTl6gDTAeA_IgHjy0ob;n-H &aVoven`VeY?V9E$b>;4LZrA{ zb0bsqm95|^8hjI~?dCAKW*-GTi+&cU(_%`zaQovxr6YgpnLRi-PVaLzsGP~~i2)9z zxZ5&k^`;g?Mzdq)NJVD3S1sO&69t8lVfbWlnTU@}le4)UX$r(E#Pe~h{-fD+He>1b ztPv7p9iB8H^6B1w)>IVsWE1mBA{FB9k9;-6wLN!|np{wLU|`)UNivA&zdSU~av_DS zF|<|px1WcndKnM j_qUonZw4KLq|s$($>`>In${#bGk&+rD1=s#a|^WoM74>!XuiEKRZER1A0 z@u&d=3|W2eqokz#6tRhJ|BU))NN2a%owi3&=I9<)yqgzW)i!G!0G+DW 4dg|a!(}M zWG&rh5VrYLp9D{J9IUtx$w@v;BkOaKiAN|Rs!z;`K}us)i8%`^`)9kff`@z0WE)L~ zHiGHgGf)MC6V|Uvc_#Y3KmOp*IOH#E@>Maao}75pXEO1hW1T%Do1kS(v6x&)NU?bU zJC2d(YXYuk?Dw>tb@z;%1=?)}&mz#W!}S>bJJ9j5I*jDF+#!?d7iASn6EEV-bIq2P z-cj_0d-F1%3wrccw5F(OqC4^kr>!*^Gi)%M3&%7updsXU3 Wh0A zC*O9E`mvn8=B4@-cOq9%*hi48G-TSO-9x426!|iT2M(SZe&*ioBe{gAg(Q$S$+S<} zJxf%^>}WP&l>}{bUauTT3hupyCm6t~o$yit*Jmst+i9zxv9rz{O|%fFyVNLy5#OLI zG^n5d+Q`I!r{5r;9bkHXpDNeb-|~0FN8~O*!r{kZ?!UTH!uq?}t?K16js6IrsMvf4 zP6*ibzl{^Q1&q%8?Rzgym;AmB(BZ5`k +q`kf(&hU`itxgcLw$>08oN4X4*deukvgOa z+cyQNbESKR8wRFeYx?sF;xnp(hb*^gy6tOD!9S{MKOa7Ai+n3-awL|vHfIzN%e;oX zYGIk~S3CnMAiUoykOSC6*FZY@L+x=ufPIsEBlW!V)!Aw&8}Q`tMc~bhs(rk<95iMK zE9E8w#oX$}3dqBOBA@6hs#W`>Kz*MX*_#{w4E2S`gQ;Wv`?Z8$&k%tY!h1K>%%J+k z$LQK5XC75+PbGat_z8hV0q{fAiHwmml7e>!wQKW||DGvXY1&cV=rKVZQsP(*1!gZa zCgSBF0V)v2=F`$NqHXE{jBq-rgQ&gz>WJi3gP$N6;n{cXwY7f6?B^frp4rO6AXG^G z9I38r>dd;+RdSC#Rup(@UuQ{>t&UP27=%|^RLIy|8ybJEwn%hp>I!m~afwqO%cdWt z s;jEtv^6&`G9A>$v%i@8HQqQ!5$5zNLtI1`2d*GPauTpMPHx%Rd%!{V1450|0cgS*@WdQhHgrvufR!>~W88e=z3%J)uVB zo6mtI!De$g;d~9(1|5FNAFcOvA$Nh#jcXu3_^hELLcGEQP%|ISf}o_62Hj=eIQ%g| z&kCb>ZAu}F%X7fQcvQru`|nj&*+{{ND^!%cG))OO7zpZ(*VopMl)fO$h#UX?#6o9x zYAT|5GOZ%Y&(>@)8t);QPifT>F1kvE%v73TL?j@jCLaC?Z8Fn>iA%0pVq}gty#l*@ zJg0>L4a6 -pzA9*2s~F#Iu0MzB>%It@kIX6mhWRj`Zdo$&}xhue;A0l zTc^5V@@JB9
|qtphFURA2~3s{0+SC=jEOJ;A-NE3+j7 z<`j5#Qmbrep{y7bMV!O+qi5oGtCaRC5pL3hba_4G-uAI14+tYCu1F!rpXKx@P7JQE z{pv#iR!Hbto?7SL CcIpv>yE1+s@^kjnDbql~ViSgT2Xxe(#A6C2F$tRM& zwSV4w^M!ragU|jN*{q*qE6v)gv*LdjQPG?yjgyDGa9StUN>;R9nrrn0KFhE1oYl(n zlFfhEB&O@QzmKMcFkEE@><;jZWu^Wi!dz6Fm_9$UW5#my)7U|sa}wQ?nLiiiCpv=M z10rFF^Uk02+a9jY8u1docR%<1Q-HZV&lsN4dcI8vK>T+&bS|rz$mS~a1O|8g$?iJ} z; Uoo zT*F3qO)q!{l=g6QpiXHjSi&YCHaY`N7nLiv)#5qj_N9lSb4-|YH6NYcg4$i|HwkE_ zqP1rd;BHeC?SK&1{Uptx(%R-ZW{HR&*+H xi>{ $@;|g_z^ljk; zY|0jnJKvyU`VT!m4u>~!^y01$4obNS!Vonjtq3R}={ND)8{SiDi1MWR=FkDVaGrSO zlo50%;ISGSfmgKQ BaxY`}KACHY0?Z_Hr-X znt?J41kpiGfMv5S51#+w2>I*ccN}znw%Ae
=~}eGvSO-OE#4N>Hi!$@_;bur!@4I$Km=Xd&a-%{r_V;k3y>3PQ>s z@b37TH6O45-Gt(S%9m; H7}QNv7Wr4snSM-3s0%y5gqV1Hgxo zU*P~3r;2^KH1}<9*eml5z)kwZgLg5+sT~9smWE3$v2mDQZFavHcvZs{JwAWvpp_`W z6)5^vhv5kDaEaaxh#YtsrzC9R(%A?+LKizr$FegPy5Rr%#<3utYBX{kI(y}F$N+fp z;|0ijAxg{sw1ZcmyAm)qPEuf(|L>pI55PR|c@WQ|!x#rCJrccU4%+$(kau7)TzK_Q zHWcQy2Kbv+6_ENe0I4ZDJoe8AIn1Ur(0KF3r*Y_$8`aGmU6(+hp4v85`a&AyMLwNf zsH};MZ~};JYxTe=C^HP^-UDivuB)F-_rA=xSPg}JPlMdDHYmS))vpe$8w2wlsu|WG zZD{}xU&z0?=9L5v+^T&6d3@P`NJ?1)bV87oxljh{gLAy^U B8+wg32-=8WP!>kEXbn%j zk%lv*KT#2wxdaxbTh4^~Jl5Nj`ZrY=gExkbi=B5b^UQ{qw{^3M8ESoNkP9h<${tBB zv~mOw@rR|N$qfhS*nr&Hn`%3Te_7?7;H88pf*=W)cNPR6PJ}C(MtF5X#u!V5E B^Mv>Un27F3=P)@POn|s?g1~c~&4tWF4P3H) n!p)BP({8?=4)LUr5lCc&;&BR^d z>EnZ*`FJR5T|c<>-X6C*CC~pf8HlEBHaZ&lLWhwwJ&DrG+Nm%hD17eeItarCH1I27 z!l5sKdpm{@1_QtHa`pWv5VL>4FINcCAUazLasK9H{x=Z%5-+u+qSCf3UeGz2J5vAn zRuiw;$zWxbr`KI`66b7AgBc&X*h9qhtVPV#cf~}&e(hEMb!mNL<+__R)b*~1vheR$ z_LyGxX?l6I9LOjfH;E%#wmp=-31<&<{McAv>y`rf+yufNx$CiGrDn_BCLlzkK3(jJ z19{*dRYevTjfgugVvwyd zV l&bCBvXFtu`&6?s^0rRndHxj$Tztg;_?8Zl;H3<))8 z{d(}C`HC{JUr=;nY4N&N;fu!tr&kTwQ1adPSqUsS#RMI);6De>Flep0$40wdH)6yh z(4z-+jyR5=wvW)F+@X7$=c$_^Eha(1E{L?xJ5URb>+t{HHDMg&8AaIr4kTS!d^gq< z$&C_tC{YJKT$JWXc_qaM$Z@3hAdoeTqhG@!7f)U%US=sP 08 zS9{8sJdYzDLQiT4x1DL?b9)#yej7S54E{6jQ&Ea2p^&YWpm+B5$<{Go$#m7UX(vYB zNntn$v(48D2G#ZM=*G~&j)lyRn-8&;A{SYy444T{26wy6*d8<%(fu&Sa!_N7<_gN) z&!2cGAnahti-Pn*`XR0N?xU2&nU_CMOQy&kR$dN!prr9*Q-kgYQEgMn1zAqyGt6h# z6y|0b0x=yoaAN(aKGh#GaFb$ed^0#6`4>@Dg3SDUjL5w@sjUhNRms{TT>9Ch=>c}m zJ RdPXU@tI zfZ3O5ZtDo1%w?A{)hxC4*{ m=fgkC&vay*Z(lHZefEhE<}bCIJg^_NfK9< zWzMbI-3=UD1CE&Q+m=qpD$(;|17<`m5PQ~q!zd$D`5BW72cigf)j}s*?ExG1HYlh! z=C$04xNN75DsTU?!XbmUSs&ogI!SYik?R$oOI&y voS z9h=jJc|&!Ga)+ykksd#_{bxMoIiuSilDSB;T{punhbN6?$E*#>3kzJA%?%;^vVzVj z00 l?1+mP jClFe5;bsX8zkNdFSKm_VHV{0OYqNbi;WmDilb=}=f!1z>Qv)92H}GI znkHe>Y^FKbGNuni+42^&ap(-WT91*!@F4Y@q FqJ^iEx4Zs514mTp6>M8mIs@yoA zfWh xT}XZ!DsD- zAEiVK@6C35Oc#a5PTY86zAAX#jeb2!sn1z;D9J`7ng*Q^q?2oCn*Br|yGE`JTp$O} zNv;E^jls9rAFd7BT*x}vE7*vIxnGEdQS-yZx)rylxoIQI3L*wF?l`Sy;L0kD21+{F zGj1 3-G>KWh2E*n7{gsIs LLCu1C@du@12E(!Zn|z$5$9Y|5N6ObboF&DFI#XV-85Ej4l_$g3Evh{Q*mkR9 zsNcHIrdhI>_F9@0KP7W1T$;p?^J6nsKc=;j70r?>+Ln!M>L^?@E=O9IyZXlIGs`=! zbk2xmJ#r)=rNtFZSb$WEE8Z3iOO-!LqL|40{JjR1l jraCyZq=l0e2a%hT_AkdBZVl~P^M#BhFO6(? z7Tj%bzmnsSLj5{C!T8G!!wWr{B{BWz0RI6cl%)RFti3|(u8a0?tLo=fZ6h*e)ELVB z&@D_gM`t)T=lWk3;u2<0s?*HOL80;Q+q-jfUym`f|H#WAy8W|~6G{pChfChN8_co_ z7(@z>RMb)PeP2;$)_$-PjPrVJtJVK=JN!@^$;W_`@9Cjs)LV*^nMUsel$1kW17zaF zC4#Wkdw~u`?UlSjo0Iclo-f93D<#2H8n?=)O6U#z%h%G8yhTOLqQiTSmTJ~7RTGPH zr;{ZADCV`ligd5a gyb)vdMxa~YSC))Afx(gwrh;W+ zGTkMFCF)c)un76-RKSq WC zrWG%Oj$v}Q@Ol(y8O7EE!jx|G9Fs~2pM1=s^$DvmC~u{^Oe)PvsKGbh>^@=G2u+s( zU>$T>5T C{$0H6ykk`q$WARwD%k*O%not;q% g9P_61ST=CuCj z?wWU8qL?MGG@{+0P*t%Ezj(NFo90!#`x)RnbacTww$c)*WFrf0q&1E)q{J0+NhDM^ zno ?XNBh>;_1B*89#F=3N56wvb-qmfLUF2A~tv zF59=OfTWV0M&0BIMPx(j(9wpcXAqsKxKBiaO+9LLfxHtg=+O&PwLDmOZZb~lRUNp0 zOb)&|ciH7`6JS*m&6(K(tQb@aPJCW!)EeHPuGg}Q#^zVY2;oFT?9EmQer=7_t _^XO830hY#hNtD6tq{NQ1Y4;cZ_XUN==~;t*$A&EjMl_Xf6NHJ zcSkt>lOq EglFfQ{PuY0mY70&_E@^!PxLb@y6 zxj}540(=w4*zig=x+@qyc#1kFp@*AvDksf)A>q#Bow#;7S_4uLlLiKH=UBgr5*N0F zcXWoZqw7n~ki^B!sv=ohFPDTh-Z!mQxP)wVX*ViA47a*{Q0pI=!p&ne1>cps8HjfY zU)rPV* McZ2p8MqNNXF(h_=)Vyap}_Ymf~i(1t7 zAdVxR$iHIRVSIMR(I)l%X`9Q|D8f-pnI =1S}mx?XyNg7DL-1+e{jMw)nOwCLs=|wx~wI5ukk0K*29`Er^sZ(aA(JJ~m!j3FF zu%68`*_IG10$F%)Uc|Z%_Fhd~Iw-$3dI~GZCKc_Nkt7g*SdsM{)tDGwCpayScntc! z?Ll fX=ka{jRjwz6ne%AQyFb%?+j`DRn zwCvq-`=_|e0`^)Ho|);}132Z4jTB*$r@HeIB*LV9&Ed{&d9zYeAT>t!4>J@yg);%u z>G05q(c byG*1TT&{^U7xl!=j$CjOIP4$>G=9$Ied&Y>WeViIqQW+VcXM{ zM+=&4tv`Lyg907}^dC2BU6KhaGHF5b*g7%E+tW2ANf>{+m&U>NsWytFnW=6ymy(@` z#_hN7AG120SfFlbjnS)h?>7B&s=CRk{O(DTFz}{WkMqXQoSzVPdaDzt`ubGIldp&d zskX+`Tw#fr|J&EALrbnO!A>PNKI-rp6W7jj=ni+4o&owxzWN^zfVLwdnCqcLGVkga zbLpt0V;ib2AeU_P9?7}=&Cw^| d`rs$25nQXXXCynDg@LGhJ4XcZu kV1X8@Z
_eS;uN z{4=u8j=`Ipj&%!r&-_oZh3;C`{{S0CJN&Bv*K2+a57=M8wdOkX0uPLBg&MG^TYgVt zpxDhKZ=gl3uW1&dgZ1u&N4JRf#RqGdPwW;(DlAf0bjw^kgx(?E4U1jIBZQ=`oY+T6 z{GmHmtfxjgQZ7LUI;uGMefw-m!Mykol4=M1FT03o+}t)XT+nGC0?F+zd^o*kC??=X zFrZD@aIis+*G%*q6_|bp)zefd9TlTwy+Df`=^n(uE6++5WmlRkiF;Bf#EqRfnPLYz zce5Ams}G;rq0@s6!|5}Ixn>;GmJAqr>K=gI4!B-@eMW{><%)VD`BCY*_Y?1(nPp#K zu6?#rB$hjkIQeu}QegzfdmZtOePl^t$;Z rg$e86db=X zHIBkd;(8+ghzq8a_9~HX0*_uQE^Rm(>lnA;t53cC?x*_>QZH56?!%o-D8Fg(#l}=x z>cp+W)p>Er^^`|8_x{WO_le&G?Ls$Z=!)L&W)2#GaS_?=fbmC#F0;d1d^*E;o@rfl z9ubYejsZH8X8O;im!RJpB?lkY@lL$zQUELu56z2dIy)dLz*PUiQN#($6P%dr)Q-Df z^#q#{`zGE1Ur#VLu|={b)#Tgcbtj*R<9MJOp&|Ok3O?sVtnfPtNnmpLzI!jTh#)Gzz3ult@OHcM%y!>(Ul722LE2d$KT+=Ig{+TRhzkFN%#v9M zqQ1We6z@r15ab8pVkF@~a&^6@X*8=NjAw;`pRozanSry$s4$#|`T^fa*akRzsxq}8 z1o?`pU*>qtEGUuw$nWpw4@FSJK0MO=TdfPw3);AZe6xBR0gWkvHvS18SS?CGGH44z zq!F2=tV}gw#=vF8pxY8}wa=SeT7gf|Ic4&&A`wCj8< 4O|-&P 4tE%PGJtWgQC>)fv n`* zj;MhOmqE=AW$z;^B$9F#zUp6~;h=qn+*<^OrW1qwd(;PEB#Llr1PQJ1M3h1!BhZCP zT43ak9hh|Az5tuetGyh101w}M0yfJezxQV(3q<;?(-kZ3cHo(e3|XDSw);+8RKNVO z6wwq-K6XiuuuJ@itTXK&5lQplfAmCll{{e+)LW 0#5_k=98aXdrxWbN`7p}K_1x oktY~!;q z+0-%8h+ltEQp?ln{c{)RWG$GHy){k(nPePH$K(G}iIyGuY!u`=j3#mQt|IcbS?KeG z YgB5k-2mRiYgeP^EZ zt_gC@GI$?mM@i$d3q@pK>Km6zI_kQM-YnWw2MM0}rP&!vH#_49W&0PQ0XFDqtVYV+ zMglCM?*7BbX+cM&Jm=K6@;zM-S5Df@1GWPCZe8lO$$@3ec@3oA9sV +4yWbGu(QuoQ_9+)x`}U;7mxn7fquo%?3>{=CziTG1!^wJK z>P(7D!NyL@8rOY;5Nl*KSzL1u% OV3FMRfO|48Ixm2M;ym|Yit72z9eu}M@$Jo# z-MVWF9{zVx9CL8k&N9L_-v8=pHdQMN4lPTTXT=G`swo9*Pw(YBlLZ*&bEQ_`0Z?_y zO1Nq5tgM%26kUWA*1m{iY^}4>WCcH6xzX1oA2ar>>lTi5GnHV{b2pXeZe|k3sYz0A z^Xg`~Yr6=X296@D2n67`HifsQEDZ91K1s#9`q&WoeMibwAFBa0AjB6x+*}9H*>Ynn zBK1^fF*vx*)Q6}|{?#O?UBU_IA)yk()S<~vJ!6#SX1##?i 1huxBU!kZRCg0 zGu_Wzla;NrZnC(^m7!+lU3EP_n%T)vM&Ih#DAyj|?RX;JC4T?;ZN`vsw9rMv$Wk#X zw`tZ9!)^}uiC6Y)-Uj{Q(`oy|gTA!K$vf}V5R1UIOE4W1iAOT69fQg5r>vL p`~Dam%^y<=r$u>e&@$7#l&Qh4$m?ck%;RX5+{%;0Jg5N#f}cHuuz zy3hd9x{b_a7&>G+r7Di|k*Ad2&>b%N8F-!U-dq>QuC;Fh&MPo& zK#5q<=M7X&CA}NdZmO7|An|oL&Dp?l`h$L oB^XEZaDC}$^1@|v;3yAN?Zt(3y$tRIE0BsNawlrMEg z7576CAqbE|T~Zr^;StwKzdJ!|bPpBB(@V?bPj0%W^Ep9U%na<(BWn%1xIQW2<3PLd z$P5U+z|Xhp0#R xHbOF@h#>F&` zl0Hx2N`=ws1ttt#RH=f=Y5ZMAly2BG5iHlt#tJzd3J*$tSj)UFKD3;=NC!7oCv>kn z@0iEGLI0wlB+o|5bc dS=V;&Rq4!J)}>sY@<~ ztm6Q}OjzyHS)gw_$g