.gitignore
.. .. @@ -1,41 +1,45 @@ 1 -# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files2 -3 -# dependencies4 -node_modules/5 -6 -# Expo7 -.expo/8 -dist/9 -web-build/10 -expo-env.d.ts11 -12 -# Native13 -.kotlin/14 -*.orig.*15 -*.jks16 -*.p817 -*.p1218 -*.key19 -*.mobileprovision20 -21 -# Metro22 -.metro-health-check*23 -24 -# debug25 -npm-debug.*26 -yarn-debug.*27 -yarn-error.*28 -29 -# macOS1 +# Miscellaneous2 +*.class3 +*.log4 +*.pyc5 +*.swp30 6 .DS_Store 31 -*.pem7 +.atom/8 +.build/9 +.buildlog/10 +.history11 +.svn/12 +.swiftpm/13 +migrate_working_dir/32 14 33 -# local env files34 -.env*.local15 +# IntelliJ related16 +*.iml17 +*.ipr18 +*.iws19 +.idea/35 20 36 -# typescript37 -*.tsbuildinfo21 +# The .vscode folder contains launch configuration and tasks you configure in22 +# VS Code which you may wish to be included in version control, so this line23 +# is commented out by default.24 +#.vscode/38 25 39 -# generated native folders40 -/ios41 -/android26 +# Flutter/Dart/Pub related27 +**/doc/api/28 +**/ios/Flutter/.last_build_id29 +.dart_tool/30 +.flutter-plugins-dependencies31 +.pub-cache/32 +.pub/33 +/build/34 +/coverage/35 +36 +# Symbolication related37 +app.*.symbols38 +39 +# Obfuscation related40 +app.*.map.json41 +42 +# Android Studio will place build artifacts here43 +/android/app/debug44 +/android/app/profile45 +/android/app/release.metadata
.. .. @@ -0,0 +1,45 @@ 1 +# This file tracks properties of this Flutter project.2 +# Used by Flutter tool to assess capabilities and perform upgrades etc.3 +#4 +# This file should be version controlled and should not be manually edited.5 +6 +version:7 + revision: "ff37bef603469fb030f2b72995ab929ccfc227f0"8 + channel: "stable"9 +10 +project_type: app11 +12 +# Tracks metadata for the flutter migrate command13 +migration:14 + platforms:15 + - platform: root16 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f017 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f018 + - platform: android19 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f020 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f021 + - platform: ios22 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f023 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f024 + - platform: linux25 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f026 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f027 + - platform: macos28 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f029 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f030 + - platform: web31 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f032 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f033 + - platform: windows34 + create_revision: ff37bef603469fb030f2b72995ab929ccfc227f035 + base_revision: ff37bef603469fb030f2b72995ab929ccfc227f036 +37 + # User provided section38 +39 + # List of Local paths (relative to this file) that should be40 + # ignored by the migrate tool.41 + #42 + # Files that are not part of the templates will be ignored by default.43 + unmanaged_files:44 + - 'lib/main.dart'45 + - 'ios/Runner.xcodeproj/project.pbxproj'Notes/PAI.mddeleted file mode 100644
.. .. @@ -1,13 +0,0 @@ 1 ----2 -pai:3 - slug: "pailot"4 - registered: "2026-03-05"5 - last_indexed: null6 - status: active7 ----8 -9 -# pailot10 -11 -<!-- Everything below the YAML frontmatter is yours — PAI never modifies content here. -->12 -<!-- Use this file for project notes, decisions, preferences, or anything you want. -->13 -<!-- PAI only reads and updates the `pai:` block in the frontmatter above. -->Notes/SPEC-message-rewrite.md
.. .. @@ -0,0 +1,141 @@ 1 +# PAILot Message System Rewrite Spec2 +3 +## Problem4 +5 +The current message handling has accumulated race conditions from incremental fixes:6 +- `switchSession` is async — messages arriving during the async gap get overwritten by `loadAll`7 +- iOS kills the MQTT socket in background but the client reports "connected"8 +- File corruption from concurrent read/write on the same session file9 +- Notification tap triggers `switchSession` which reloads from disk, losing in-memory messages10 +- `addMessage` and `switchSession` compete on the same state and disk files11 +12 +## Architecture: Single Message Bus13 +14 +### 1. One MQTT topic for everything15 +16 +- **Server**: publish ALL outbound messages to `pailot/out` (DONE)17 +- **App**: subscribe to `pailot/out` + `pailot/sessions` + `pailot/status` + `pailot/control/out`18 +- Every message carries `type`, `sessionId`, `seq` in the payload19 +- Client routes by `sessionId` — never by topic20 +21 +### 2. MessageStore redesign22 +23 +Replace per-session debounced saves with a single append-only log:24 +25 +```26 +~/.../messages/log.jsonl — append-only, one JSON line per message27 +~/.../messages/index.json — { sessionId: [lineNumbers] } for fast lookup28 +```29 +30 +**Operations:**31 +- `append(message)` — append one line to log.jsonl (sync, atomic, no race)32 +- `loadSession(sessionId)` — read index, seek to lines, return messages33 +- `compact()` — rewrite log removing old messages (run on app start, not during use)34 +35 +**Benefits:**36 +- No per-session files — no file-level races37 +- Append-only — no read-modify-write cycle38 +- No debounce needed — each append is a single `writeAsStringSync` with `mode: FileMode.append`39 +40 +### 3. Connection state machine41 +42 +```43 +States: disconnected → connecting → connected → suspended → reconnecting → connected44 + ↑ |45 + └──────────────────────────┘46 +47 +Transitions:48 +- App launch: disconnected → connecting → connected49 +- App background: connected → suspended (keep client, mark state)50 +- App resume: suspended → reconnecting → connected (always force-reconnect)51 +- Connection lost: connected → reconnecting → connected (autoReconnect)52 +- User disconnect: any → disconnected53 +```54 +55 +**Key rule:** In `suspended` state, do NOT process buffered MQTT messages. Process them only after reconnect + catch_up completes. This prevents the race where a buffered message is added to state before `loadAll` overwrites it.56 +57 +### 4. Message routing (synchronous, no async gaps)58 +59 +```dart60 +void _onMessage(Map<String, dynamic> json) {61 + final type = json['type'] as String?;62 + final sessionId = json['sessionId'] as String?;63 + final currentId = _currentSessionId;64 +65 + if (type == 'text' || type == 'voice' || type == 'image') {66 + // Append to log immediately (sync)67 + MessageStore.append(Message.fromMqtt(json));68 +69 + // Display only if for current session70 + if (sessionId == currentId) {71 + _messages.add(Message.fromMqtt(json));72 + notifyListeners(); // or setState73 + } else {74 + _incrementUnread(sessionId);75 + }76 + }77 +}78 +```79 +80 +No async. No switchSession during message handling. No race.81 +82 +### 5. Session switching83 +84 +```dart85 +void switchSession(String sessionId) {86 + _currentSessionId = sessionId;87 + _messages = MessageStore.loadSession(sessionId); // sync read from index88 + notifyListeners();89 +}90 +```91 +92 +Synchronous. No async gap. No race with incoming messages.93 +94 +### 6. Resume flow95 +96 +```dart97 +void onResume() {98 + state = suspended;99 + // Kill old client (disable autoReconnect first)100 + _client?.autoReconnect = false;101 + _client?.disconnect();102 + _client = null;103 +104 + // Fast reconnect to last host105 + await _fastReconnect(connectedHost);106 +107 + // Now process: sync → sessions → catch_up108 + // catch_up messages go through same _onMessage path (append + display if current)109 + state = connected;110 +}111 +```112 +113 +### 7. Notification tap114 +115 +```dart116 +void onNotificationTap(String sessionId) {117 + if (sessionId != _currentSessionId) {118 + switchSession(sessionId); // sync, no async119 + }120 + // Message is already in the log from MQTT delivery or catch_up121 + // switchSession loads it122 +}123 +```124 +125 +## Migration path126 +127 +1. Create `MessageStoreV2` with append-only log128 +2. Create `ConnectionStateMachine` with explicit states129 +3. Rewrite `_handleIncomingMessage` to use sync append130 +4. Rewrite `switchSession` to be sync131 +5. Remove debounced saves, per-session file locks, merge protection132 +6. Test each step before moving to next133 +134 +## What stays the same135 +136 +- MQTT transport (mqtt_client package)137 +- aedes broker with loopback client on server138 +- Single `pailot/out` topic139 +- APNs push notifications140 +- Splash screen141 +- UI components (chat bubbles, drawer, settings)Notes/TODO.mddeleted file mode 100644
.. .. @@ -1,20 +0,0 @@ 1 -# PAILot TODO2 -3 -## Bugs4 -5 -- [ ] **Auto-scroll hijacks reading position** — `MessageList.tsx` fires `scrollToEnd` on every `onContentSizeChange` and on `messages.length` change. If you're scrolled up reading older messages, new incoming messages yank you to the bottom. Fix: only auto-scroll when already near the bottom (track scroll offset, threshold ~100px).6 -- [ ] **Text not selectable in message bubbles** — `MessageBubble.tsx` uses plain `<Text>` without `selectable={true}`. Cannot long-press to select/copy text from AI responses or own messages.7 -8 -## UX Improvements9 -10 -- [ ] **Show session name on each message** — Currently each bubble only shows the time (e.g. "13:42"). Since PAILot runs parallel sessions on one screen, each message should also display which session it came from or went to (e.g. "13:42 · whazaa" or "13:42 · AIBroker"). Requires: add `sessionId`/`sessionName` to the `Message` type, have the gateway include session info with each message, render it in `MessageBubble.tsx` next to the timestamp.11 -12 -## Features13 -14 -- [ ] **Multimodal upload (send images/photos/video/audio from phone)** — The app can *receive* images and voice, but there's no UI to *send* media from the phone to the AI session. Needs: image picker / camera access, new `WsOutgoing` type for images/files, gateway handler to route media to the active session, and backend support to process multimodal input.15 -- [ ] **Relay-based connectivity** — PAILot currently only works on the local network (WebSocket to `localhost:8765`). For use outside home network: self-hosted relay on a VPS with encrypted tunnel (Tailscale, cloudflared), or APNs push relay. See AIBroker `PLAN-adapter-architecture.md` sections on relay.16 -- [ ] **Session lifecycle from mobile** — List named PAI sessions, see which are running, launch/stop/switch from the phone. "Remote desktop for AI sessions." See AIBroker TODO.17 -18 ----19 -20 -*Created: 2026-03-05*PRIVACY.md
.. .. @@ -0,0 +1,63 @@ 1 +# Privacy Policy for PAILot2 +3 +**Last updated: April 1, 2026**4 +5 +## Overview6 +7 +PAILot is a voice-first AI communication client that connects to your own self-hosted AIBroker server. This privacy policy explains how PAILot handles your data.8 +9 +## Data Collection and Use10 +11 +**PAILot does not collect, transmit, or share your data with any third party.** The app communicates exclusively with your own AIBroker server, which you host and control.12 +13 +### What PAILot Accesses14 +15 +**Microphone**16 +PAILot requests microphone access to record voice messages. Recorded audio is transmitted only to your own AIBroker server. No audio is sent to any third-party service.17 +18 +**Camera and Photo Library**19 +PAILot requests camera and photo library access to allow you to attach images to messages. Images are transmitted only to your own AIBroker server.20 +21 +**Local Network**22 +PAILot uses Bonjour/mDNS (via the local network) to discover your AIBroker server on the local network. No network scanning data is transmitted outside your local network.23 +24 +**Push Notifications**25 +PAILot uses Apple Push Notification service (APNs) to receive notifications when messages arrive while the app is in the background. Your device token is transmitted only to your own AIBroker server, which uses it to send notifications via APNs on your behalf. The device token is not shared with any third party.26 +27 +### What PAILot Stores Locally28 +29 +**Messages**30 +Conversation messages are stored locally on your device in the app's Documents directory. This includes text content and image attachments you have received or sent. Audio messages are stored as temporary files and cleaned up after playback.31 +32 +**Settings and Preferences**33 +Connection settings (server address, port, authentication token) and app preferences are stored in the iOS Keychain (for the authentication token) and UserDefaults (for other settings).34 +35 +**No Analytics or Tracking**36 +PAILot contains no analytics SDKs, no tracking libraries, no advertising SDKs, and no crash-reporting services that transmit data to third parties.37 +38 +## iCloud Backup39 +40 +Message data stored in the Documents directory may be included in iCloud backups if iCloud Backup is enabled on your device. This data is encrypted by Apple as part of the standard iCloud Backup encryption. You can disable iCloud Backup for PAILot in iOS Settings.41 +42 +## Data Sharing43 +44 +PAILot does not share any data with third parties. All communication is between your device and your own self-hosted AIBroker server.45 +46 +## Your Control47 +48 +Because all data is stored locally on your device or on your own server, you have full control:49 +- Delete the app to remove all locally stored data50 +- Manage your AIBroker server to control server-side data51 +- Use iOS Settings to revoke microphone, camera, or notification permissions at any time52 +53 +## Children's Privacy54 +55 +PAILot is not directed at children under 13 and does not knowingly collect information from children.56 +57 +## Changes to This Policy58 +59 +If this policy changes in a meaningful way, the updated date at the top of this document will reflect the change.60 +61 +## Contact62 +63 +PAILot is a personal tool. For questions, contact the developer directly through the App Store listing.README.md
.. .. @@ -0,0 +1,17 @@ 1 +# pailot2 +3 +A new Flutter project.4 +5 +## Getting Started6 +7 +This project is a starting point for a Flutter application.8 +9 +A few resources to get you started if this is your first Flutter project:10 +11 +- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter)12 +- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)13 +- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources)14 +15 +For help getting started with Flutter development, view the16 +[online documentation](https://docs.flutter.dev/), which offers tutorials,17 +samples, guidance on mobile development, and a full API reference.TODO-appstore.md
.. .. @@ -0,0 +1,66 @@ 1 +# PAILot App Store Readiness Checklist2 +3 +Date: 2026-03-254 +Source: Security & Code Quality Review5 +6 +## CRITICAL (Must fix before submission)7 +8 +- [x] **C1: Remove NSAllowsArbitraryLoads** — ATS bypass, Apple will reject. Use NSAllowsLocalNetworking only *(fixed 2026-03-25)*9 +- [x] **C2: Add TLS to MQTT** — All conversations and auth token travel in plaintext. Set `client.secure = true`, configure TLS on AIBroker broker *(fixed 2026-03-25 — self-signed cert auto-generated at ~/.aibroker/tls/, onBadCertificate accepts it; TODO: pin cert fingerprint)*10 +- [x] **C3: Remove debug log files in production** — `mqtt_debug.log` and `_chatLog` write truncated message content to Documents. Wrap in `kDebugMode` or remove entirely *(fixed 2026-03-25)*11 +12 +## HIGH (Should fix before submission)13 +14 +- [x] **H1: Unbounded image cache** — `_imageCache` in message_bubble.dart grows without limit. Add LRU eviction (cap at 50) *(fixed 2026-03-25)*15 +- [x] **H2: Audio temp files never cleaned** — `_base64ToFile` creates .m4a files never deleted. Clean up after playback completes *(fixed 2026-03-25)*16 +- [x] **H3: TextEditingController leak** — Rename dialog in session_drawer.dart creates controller but never disposes it *(fixed 2026-03-25)*17 +- [x] **H4: Input validation on settings** — No validation on host IPs, port range, MAC format. Add regex validators *(fixed 2026-03-25)*18 +- [x] **H5: LifecycleObserver never removed** — AudioService.init() adds observer but dispose() doesn't remove it *(fixed 2026-03-25)*19 +- [ ] **H6: MQTT token in memory** — Acceptable for personal use, document as known limitation20 +21 +## MEDIUM (Improve before submission)22 +23 +- [x] **M1: Subnet scan hammers 254 hosts** — Batched in groups of 20 with early exit *(fixed 2026-03-25)*24 +- [x] **M2: No loadMore debounce** — Added isLoadingMore guard *(fixed 2026-03-25)*25 +- [x] **M3: NavigateNotifier global singleton** — Moved to `navigateNotifierProvider` (StateProvider) in providers.dart; NavigateNotifier class extracted to `lib/services/navigate_notifier.dart` *(fixed 2026-04-01)*26 +- [x] **M4: Unbounded _seenSeqs set** — Replaced O(n log n) sort-based eviction with FIFO List+Set pair; O(1) eviction by removing oldest entry from list front *(fixed 2026-04-01)*27 +- [x] **M5: Screenshots bloat iCloud backup** — Messages directory excluded from iCloud/iTunes backup via NSURLIsExcludedFromBackupKey (MethodChannel com.mnsoft.pailot/backup registered in SceneDelegate); screenshots are in-memory only (never persisted) *(fixed 2026-04-01)*28 +- [x] **M6: Unused import** — Already removed *(fixed 2026-03-25)*29 +- [x] **M7: Silent error swallowing** — Added debugPrint on config load failure *(fixed 2026-03-25)*30 +31 +## LOW (Nice-to-haves)32 +33 +- [x] **L1: PrivacyInfo.xcprivacy** — Created `ios/Runner/PrivacyInfo.xcprivacy` declaring UserDefaults (CA92.1), FileTimestamp (C617.1), DiskSpace (E174.1); added to Xcode project Copy Bundle Resources phase *(fixed 2026-04-01)*34 +- [x] **L2: Privacy policy** — Created `PRIVACY.md` at repo root; describes self-hosted server model, no third-party data collection *(fixed 2026-04-01)*35 +- [x] **L3: Unused dependencies** — Removed web_socket_channel and wakelock_plus *(fixed 2026-03-25)*36 +- [x] **L4: Unnecessary _http._tcp** — Removed from NSBonjourServices *(fixed 2026-03-25)*37 +- [x] **L5: Typing indicator timeout** — Auto-clear after 10s *(fixed 2026-03-25)*38 +- [x] **L6: Version number** — Already `1.0.0+1` in pubspec.yaml *(confirmed 2026-04-01)*39 +- [x] **L7: App icon** — All required sizes present (20x20 through 1024x1024, iPhone + iPad); Flutter-generated icons have no alpha channel *(confirmed 2026-04-01)*40 +41 +## APNs Push Notifications (implemented 2026-04-01)42 +43 +- [x] **APNs server side** — `src/apns/client.ts` in AIBroker: ApnsClient initialised from APNS_KEY_PATH/APNS_KEY_ID/APNS_TEAM_ID env vars, sandbox by default. Token storage in `~/.aibroker/apns-tokens.json`. `sendPush()` fires when `getMqttClientCount() == 0`.44 +- [x] **APNs Flutter side** — `lib/services/push_service.dart`: `push` package (3.3.3, no Firebase). Requests permission on app start, publishes token to `pailot/device/token` MQTT topic. Re-registers on reconnect.45 +- [x] **Entitlements** — `ios/Runner/Runner.entitlements` with `aps-environment=development`. All three build configs have `CODE_SIGN_ENTITLEMENTS` set.46 +- [x] **UIBackgroundModes** — `remote-notification` added to Info.plist.47 +- [x] **AppDelegate** — forwards UNUserNotificationCenter delegate methods to push plugin.48 +- [ ] **Provisioning profile** — APNs requires an explicit provisioning profile from Apple Developer portal that includes Push Notifications capability. Must update in Xcode before deployment. Switch `aps-environment` to `production` in entitlements for App Store builds.49 +50 +## App Store Requirements51 +52 +| Requirement | Status | Action |53 +|------------|--------|--------|54 +| NSMicrophoneUsageDescription | PASS | - |55 +| NSCameraUsageDescription | PASS | - |56 +| NSPhotoLibraryUsageDescription | PASS | - |57 +| NSLocalNetworkUsageDescription | PASS | - |58 +| NSBonjourServices | PASS | Fixed - removed _http._tcp |59 +| NSAppTransportSecurity | PASS | Fixed - removed NSAllowsArbitraryLoads |60 +| UIBackgroundModes: audio | PASS | - |61 +| UIBackgroundModes: remote-notification | PASS | Added 2026-04-01 |62 +| Push Notifications entitlement | PASS | Added Runner.entitlements 2026-04-01 |63 +| APNs provisioning profile | FAIL | Must update in Xcode / Developer Portal |64 +| Privacy Policy | PASS | Fixed L2 - PRIVACY.md created |65 +| PrivacyInfo.xcprivacy | PASS | Fixed L1 - declared UserDefaults/FileTimestamp/DiskSpace |66 +| TLS for network | PASS | Fixed C2 - self-signed cert, onBadCertificate=true |TODO.md
.. .. @@ -0,0 +1,71 @@ 1 +# PAILot Flutter - TODO2 +3 +## High Priority4 +5 +### MQTT Protocol Migration — NEXT MAJOR TASK6 +Replace ad-hoc WebSocket protocol with MQTT for reliable, ordered messaging.7 +8 +**Why:** Current protocol has no delivery guarantees, no message ordering, no offline queuing.9 +Messages get lost on daemon restart, duplicated on catch_up, and arrive out of order.10 +11 +**Server (AIBroker):**12 +- Embed MQTT broker (aedes) in daemon alongside existing WebSocket13 +- Topics: `pailot/{sessionId}/out` (server→app), `pailot/{sessionId}/in` (app→server)14 +- System topics: `pailot/sessions`, `pailot/status`, `pailot/typing/{sessionId}`15 +- QoS 1 (at-least-once) for messages, QoS 0 for typing indicators16 +- Retained messages for session list and last screenshot17 +- Clean session=false so broker queues messages for offline clients18 +- Bridge MQTT messages to/from existing AIBP routing19 +20 +**Flutter App:**21 +- Replace WebSocket client with mqtt_client package22 +- Subscribe to `pailot/+/out` for all session messages23 +- Publish to `pailot/{sessionId}/in` for user messages24 +- Message ID-based dedup (MQTT can deliver duplicates with QoS 1)25 +- Ordered by broker — no client-side sorting needed26 +- Offline messages delivered automatically on reconnect27 +28 +**Migration:**29 +- Phase 1: Add MQTT alongside WebSocket, dual-publish30 +- Phase 2: Flutter app switches to MQTT31 +- Phase 3: Remove WebSocket from PAILot gateway32 +33 +## Pending Features34 +35 +### File Transfer (send/receive arbitrary files)36 +- File picker in app (PDFs, Word docs, attachments, etc.)37 +- New `file` message type in WebSocket protocol38 +- Gateway handler to save received files and route to session39 +- Session can send files back via `pailot_send_file`40 +- Display file attachments in chat bubbles (icon + filename + tap to open)41 +42 +### Voice+Image Combined Message43 +- When voice caption is recorded with images, hold images on server until voice transcript arrives44 +- Deliver transcript + images together as one message to Claude45 +- Ensures voice prefix sets reply channel correctly46 +47 +### Push Notifications (iOS APNs) — NEXT SESSION with user at computer48 +- **Step 1**: User creates APNs key in Apple Developer Portal (needs login)49 +- **Step 2**: Save `.p8` key to `~/.aibroker/apns-key.p8`, add env vars (key ID, team ID)50 +- **Step 3**: Server-side APNs HTTP/2 sender (`src/daemon/apns.ts`) with JWT auth51 +- **Step 4**: App sends device token on WebSocket connect52 +- **Step 5**: Gateway buffers messages when no WS clients, sends push notification53 +- **Step 6**: App receives push → user taps → opens app → catch_up drains messages54 +- Optional: silent push to wake app briefly for critical messages55 +56 +### App Name Renaming (Runner → PAILot)57 +- Rename Xcode target from Runner to PAILot (like Glidr did)58 +- Update scheme names, bundle paths59 +60 +## Known Issues61 +62 +### Audio63 +- Background audio may not survive full app termination (only screen lock)64 +- Audio session category may conflict with phone calls65 +66 +### UI67 +- Launch image still uses default Flutter placeholder68 +- No app splash screen with PAILot branding69 +70 +### Navigation71 +- vi keys (0, G, dd) are sent as literal text paste — works for Claude Code but may not for other terminalsanalysis_options.yaml
.. .. @@ -0,0 +1,28 @@ 1 +# This file configures the analyzer, which statically analyzes Dart code to2 +# check for errors, warnings, and lints.3 +#4 +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled5 +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be6 +# invoked from the command line by running `flutter analyze`.7 +8 +# The following line activates a set of recommended lints for Flutter apps,9 +# packages, and plugins designed to encourage good coding practices.10 +include: package:flutter_lints/flutter.yaml11 +12 +linter:13 + # The lint rules applied to this project can be customized in the14 + # section below to disable rules from the `package:flutter_lints/flutter.yaml`15 + # included above or to enable additional rules. A list of all available lints16 + # and their documentation is published at https://dart.dev/lints.17 + #18 + # Instead of disabling a lint rule for the entire project in the19 + # section below, it can also be suppressed for a single line of code20 + # or a specific dart file by using the `// ignore: name_of_lint` and21 + # `// ignore_for_file: name_of_lint` syntax on the line or in the file22 + # producing the lint.23 + rules:24 + # avoid_print: false # Uncomment to disable the `avoid_print` rule25 + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule26 +27 +# Additional information about this file can be found at28 +# https://dart.dev/guides/language/analysis-optionsandroid/.gitignore
.. .. @@ -0,0 +1,14 @@ 1 +gradle-wrapper.jar2 +/.gradle3 +/captures/4 +/gradlew5 +/gradlew.bat6 +/local.properties7 +GeneratedPluginRegistrant.java8 +.cxx/9 +10 +# Remember to never publicly share your keystore.11 +# See https://flutter.dev/to/reference-keystore12 +key.properties13 +**/*.keystore14 +**/*.jksandroid/app/build.gradle.kts
.. .. @@ -0,0 +1,44 @@ 1 +plugins {2 + id("com.android.application")3 + id("kotlin-android")4 + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.5 + id("dev.flutter.flutter-gradle-plugin")6 +}7 +8 +android {9 + namespace = "com.tekmidian.pailot"10 + compileSdk = flutter.compileSdkVersion11 + ndkVersion = flutter.ndkVersion12 +13 + compileOptions {14 + sourceCompatibility = JavaVersion.VERSION_1715 + targetCompatibility = JavaVersion.VERSION_1716 + }17 +18 + kotlinOptions {19 + jvmTarget = JavaVersion.VERSION_17.toString()20 + }21 +22 + defaultConfig {23 + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).24 + applicationId = "com.tekmidian.pailot"25 + // You can update the following values to match your application needs.26 + // For more information, see: https://flutter.dev/to/review-gradle-config.27 + minSdk = flutter.minSdkVersion28 + targetSdk = flutter.targetSdkVersion29 + versionCode = flutter.versionCode30 + versionName = flutter.versionName31 + }32 +33 + buildTypes {34 + release {35 + // TODO: Add your own signing config for the release build.36 + // Signing with the debug keys for now, so `flutter run --release` works.37 + signingConfig = signingConfigs.getByName("debug")38 + }39 + }40 +}41 +42 +flutter {43 + source = "../.."44 +}android/app/src/debug/AndroidManifest.xml
.. .. @@ -0,0 +1,7 @@ 1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">2 + <!-- The INTERNET permission is required for development. Specifically,3 + the Flutter tool needs it to communicate with the running application4 + to allow setting breakpoints, to provide hot reload, etc.5 + -->6 + <uses-permission android:name="android.permission.INTERNET"/>7 +</manifest>android/app/src/main/AndroidManifest.xml
.. .. @@ -0,0 +1,40 @@ 1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">2 + <uses-permission android:name="android.permission.INTERNET"/>3 + <uses-permission android:name="android.permission.RECORD_AUDIO"/>4 + <uses-permission android:name="android.permission.CAMERA"/>5 + <uses-permission android:name="android.permission.VIBRATE"/>6 + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>7 + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>8 + <application9 + android:label="PAILot"10 + android:name="${applicationName}"11 + android:icon="@mipmap/ic_launcher">12 + <activity13 + android:name=".MainActivity"14 + android:exported="true"15 + android:launchMode="singleTop"16 + android:taskAffinity=""17 + android:theme="@style/LaunchTheme"18 + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"19 + android:hardwareAccelerated="true"20 + android:windowSoftInputMode="adjustResize">21 + <meta-data22 + android:name="io.flutter.embedding.android.NormalTheme"23 + android:resource="@style/NormalTheme"24 + />25 + <intent-filter>26 + <action android:name="android.intent.action.MAIN"/>27 + <category android:name="android.intent.category.LAUNCHER"/>28 + </intent-filter>29 + </activity>30 + <meta-data31 + android:name="flutterEmbedding"32 + android:value="2" />33 + </application>34 + <queries>35 + <intent>36 + <action android:name="android.intent.action.PROCESS_TEXT"/>37 + <data android:mimeType="text/plain"/>38 + </intent>39 + </queries>40 +</manifest>android/app/src/main/kotlin/com/tekmidian/pailot/MainActivity.kt
.. .. @@ -0,0 +1,5 @@ 1 +package com.tekmidian.pailot2 +3 +import io.flutter.embedding.android.FlutterActivity4 +5 +class MainActivity : FlutterActivity()android/app/src/main/res/drawable-v21/launch_background.xml
.. .. @@ -0,0 +1,12 @@ 1 +<?xml version="1.0" encoding="utf-8"?>2 +<!-- Modify this file to customize your launch splash screen -->3 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">4 + <item android:drawable="?android:colorBackground" />5 +6 + <!-- You can insert your own image assets here -->7 + <!-- <item>8 + <bitmap9 + android:gravity="center"10 + android:src="@mipmap/launch_image" />11 + </item> -->12 +</layer-list>android/app/src/main/res/drawable/launch_background.xml
.. .. @@ -0,0 +1,12 @@ 1 +<?xml version="1.0" encoding="utf-8"?>2 +<!-- Modify this file to customize your launch splash screen -->3 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">4 + <item android:drawable="@android:color/white" />5 +6 + <!-- You can insert your own image assets here -->7 + <!-- <item>8 + <bitmap9 + android:gravity="center"10 + android:src="@mipmap/launch_image" />11 + </item> -->12 +</layer-list>android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
.. .. @@ -0,0 +1,5 @@ 1 +<?xml version="1.0" encoding="utf-8"?>2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">3 + <background android:drawable="@color/ic_launcher_background"/>4 + <foreground android:drawable="@mipmap/ic_launcher_foreground"/>5 +</adaptive-icon>android/app/src/main/res/mipmap-hdpi/ic_launcher.pngBinary files differ
android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.pngBinary files differ
android/app/src/main/res/mipmap-mdpi/ic_launcher.pngBinary files differ
android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.pngBinary files differ
android/app/src/main/res/mipmap-xhdpi/ic_launcher.pngBinary files differ
android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.pngBinary files differ
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.pngBinary files differ
android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.pngBinary files differ
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.pngBinary files differ
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.pngBinary files differ
android/app/src/main/res/values-night/styles.xml
.. .. @@ -0,0 +1,18 @@ 1 +<?xml version="1.0" encoding="utf-8"?>2 +<resources>3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->4 + <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">5 + <!-- Show a splash screen on the activity. Automatically removed when6 + the Flutter engine draws its first frame -->7 + <item name="android:windowBackground">@drawable/launch_background</item>8 + </style>9 + <!-- Theme applied to the Android Window as soon as the process has started.10 + This theme determines the color of the Android Window while your11 + Flutter UI initializes, as well as behind your Flutter UI while its12 + running.13 +14 + This Theme is only used starting with V2 of Flutter's Android embedding. -->15 + <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">16 + <item name="android:windowBackground">?android:colorBackground</item>17 + </style>18 +</resources>android/app/src/main/res/values/colors.xml
.. .. @@ -0,0 +1,4 @@ 1 +<?xml version="1.0" encoding="utf-8"?>2 +<resources>3 + <color name="ic_launcher_background">#0A0A1A</color>4 +</resources>android/app/src/main/res/values/styles.xml
.. .. @@ -0,0 +1,18 @@ 1 +<?xml version="1.0" encoding="utf-8"?>2 +<resources>3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->4 + <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">5 + <!-- Show a splash screen on the activity. Automatically removed when6 + the Flutter engine draws its first frame -->7 + <item name="android:windowBackground">@drawable/launch_background</item>8 + </style>9 + <!-- Theme applied to the Android Window as soon as the process has started.10 + This theme determines the color of the Android Window while your11 + Flutter UI initializes, as well as behind your Flutter UI while its12 + running.13 +14 + This Theme is only used starting with V2 of Flutter's Android embedding. -->15 + <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">16 + <item name="android:windowBackground">?android:colorBackground</item>17 + </style>18 +</resources>android/app/src/profile/AndroidManifest.xml
.. .. @@ -0,0 +1,7 @@ 1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">2 + <!-- The INTERNET permission is required for development. Specifically,3 + the Flutter tool needs it to communicate with the running application4 + to allow setting breakpoints, to provide hot reload, etc.5 + -->6 + <uses-permission android:name="android.permission.INTERNET"/>7 +</manifest>android/build.gradle.kts
.. .. @@ -0,0 +1,24 @@ 1 +allprojects {2 + repositories {3 + google()4 + mavenCentral()5 + }6 +}7 +8 +val newBuildDir: Directory =9 + rootProject.layout.buildDirectory10 + .dir("../../build")11 + .get()12 +rootProject.layout.buildDirectory.value(newBuildDir)13 +14 +subprojects {15 + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)16 + project.layout.buildDirectory.value(newSubprojectBuildDir)17 +}18 +subprojects {19 + project.evaluationDependsOn(":app")20 +}21 +22 +tasks.register<Delete>("clean") {23 + delete(rootProject.layout.buildDirectory)24 +}android/gradle.properties
.. .. @@ -0,0 +1,2 @@ 1 +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError2 +android.useAndroidX=trueandroid/gradle/wrapper/gradle-wrapper.properties
.. .. @@ -0,0 +1,5 @@ 1 +distributionBase=GRADLE_USER_HOME2 +distributionPath=wrapper/dists3 +zipStoreBase=GRADLE_USER_HOME4 +zipStorePath=wrapper/dists5 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zipandroid/settings.gradle.kts
.. .. @@ -0,0 +1,26 @@ 1 +pluginManagement {2 + val flutterSdkPath =3 + run {4 + val properties = java.util.Properties()5 + file("local.properties").inputStream().use { properties.load(it) }6 + val flutterSdkPath = properties.getProperty("flutter.sdk")7 + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }8 + flutterSdkPath9 + }10 +11 + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")12 +13 + repositories {14 + google()15 + mavenCentral()16 + gradlePluginPortal()17 + }18 +}19 +20 +plugins {21 + id("dev.flutter.flutter-plugin-loader") version "1.0.0"22 + id("com.android.application") version "8.11.1" apply false23 + id("org.jetbrains.kotlin.android") version "2.2.20" apply false24 +}25 +26 +include(":app")app.jsondeleted file mode 100644
.. .. @@ -1,70 +0,0 @@ 1 -{2 - "expo": {3 - "name": "PAILot",4 - "slug": "pailot",5 - "version": "1.0.0",6 - "orientation": "portrait",7 - "icon": "./assets/icon.png",8 - "userInterfaceStyle": "automatic",9 - "newArchEnabled": true,10 - "scheme": "pailot",11 - "splash": {12 - "image": "./assets/icon.png",13 - "resizeMode": "contain",14 - "backgroundColor": "#0A0A0F"15 - },16 - "ios": {17 - "supportsTablet": true,18 - "bundleIdentifier": "org.mnsoft.pailot",19 - "appleTeamId": "7KU642K5ZL",20 - "infoPlist": {21 - "NSMicrophoneUsageDescription": "PAILot needs microphone access for voice input.",22 - "NSPhotoLibraryUsageDescription": "PAILot needs photo library access to send images.",23 - "NSCameraUsageDescription": "PAILot needs camera access to take photos.",24 - "UIBackgroundModes": [25 - "audio"26 - ]27 - }28 - },29 - "android": {30 - "adaptiveIcon": {31 - "backgroundColor": "#0A0A0F",32 - "foregroundImage": "./assets/android-icon-foreground.png",33 - "backgroundImage": "./assets/android-icon-background.png",34 - "monochromeImage": "./assets/android-icon-monochrome.png"35 - },36 - "package": "org.mnsoft.pailot",37 - "permissions": [38 - "RECORD_AUDIO",39 - "READ_MEDIA_IMAGES",40 - "CAMERA"41 - ]42 - },43 - "web": {44 - "favicon": "./assets/favicon.png",45 - "bundler": "metro"46 - },47 - "plugins": [48 - ["expo-splash-screen", {49 - "image": "./assets/icon.png",50 - "backgroundColor": "#0A0A0F",51 - "imageWidth": 20052 - }],53 - "expo-router",54 - [55 - "expo-audio",56 - {57 - "microphonePermission": "PAILot needs microphone access for voice input."58 - }59 - ],60 - "expo-secure-store",61 - [62 - "expo-image-picker",63 - {64 - "photosPermission": "PAILot needs photo library access to send images.",65 - "cameraPermission": "PAILot needs camera access to take photos."66 - }67 - ]68 - ]69 - }70 -}app/_layout.tsxdeleted file mode 100644
.. .. @@ -1,34 +0,0 @@ 1 -import "../global.css";2 -import { Stack } from "expo-router";3 -import { ConnectionProvider } from "../contexts/ConnectionContext";4 -import { ChatProvider } from "../contexts/ChatContext";5 -import { ThemeProvider, useTheme } from "../contexts/ThemeContext";6 -import { StatusBar } from "expo-status-bar";7 -8 -function InnerLayout() {9 - const { isDark, colors } = useTheme();10 - return (11 - <>12 - <StatusBar style={isDark ? "light" : "dark"} backgroundColor={colors.bg} />13 - <Stack14 - screenOptions={{15 - headerShown: false,16 - contentStyle: { backgroundColor: colors.bg },17 - animation: "slide_from_right",18 - }}19 - />20 - </>21 - );22 -}23 -24 -export default function RootLayout() {25 - return (26 - <ThemeProvider>27 - <ConnectionProvider>28 - <ChatProvider>29 - <InnerLayout />30 - </ChatProvider>31 - </ConnectionProvider>32 - </ThemeProvider>33 - );34 -}app/chat.tsxdeleted file mode 100644
.. .. @@ -1,363 +0,0 @@ 1 -import React, { useCallback, useEffect, useRef, useState } from "react";2 -import { ActionSheetIOS, Alert, KeyboardAvoidingView, Platform, Pressable, Text, View } from "react-native";3 -import { SafeAreaView } from "react-native-safe-area-context";4 -import { router } from "expo-router";5 -import { useChat } from "../contexts/ChatContext";6 -import { useConnection } from "../contexts/ConnectionContext";7 -import { useTheme } from "../contexts/ThemeContext";8 -import { MessageList } from "../components/chat/MessageList";9 -import { InputBar } from "../components/chat/InputBar";10 -import { CommandBar, TextModeCommandBar } from "../components/chat/CommandBar";11 -import { ImageCaptionModal } from "../components/chat/ImageCaptionModal";12 -import { StatusDot } from "../components/ui/StatusDot";13 -import { IncomingToast } from "../components/ui/IncomingToast";14 -import { SessionDrawer } from "../components/SessionDrawer";15 -import { playAudio, stopPlayback, isPlaying, onPlayingChange } from "../services/audio";16 -17 -interface StagedImage {18 - base64: string;19 - uri: string;20 - mimeType: string;21 -}22 -23 -export default function ChatScreen() {24 - const { messages, sendTextMessage, sendVoiceMessage, sendImageMessage, deleteMessage, clearMessages, isTyping, requestScreenshot, sessions, switchSession, loadMoreMessages, hasMoreMessages, incomingToast, dismissToast } =25 - useChat();26 - const { status } = useConnection();27 - const { colors, mode, cycleMode } = useTheme();28 - const themeIcon = mode === "dark" ? "🌙" : mode === "light" ? "☀️" : "📱";29 - const activeSessionName = sessions.find((s) => s.isActive)?.name ?? "PAILot";30 - const [isTextMode, setIsTextMode] = useState(false);31 - const [showSessions, setShowSessions] = useState(false);32 - const [audioPlaying, setAudioPlaying] = useState(false);33 - const [stagedImages, setStagedImages] = useState<StagedImage[]>([]);34 -35 - useEffect(() => {36 - return onPlayingChange((uri) => setAudioPlaying(uri !== null));37 - }, []);38 -39 - const handleToastTap = useCallback(() => {40 - if (incomingToast) {41 - switchSession(incomingToast.sessionId);42 - dismissToast();43 - }44 - }, [incomingToast, switchSession, dismissToast]);45 -46 - const handleScreenshot = useCallback(() => {47 - requestScreenshot();48 - }, [requestScreenshot]);49 -50 - const handleHelp = useCallback(() => {51 - sendTextMessage("/h");52 - }, [sendTextMessage]);53 -54 - const handleNavigate = useCallback(() => {55 - router.push("/navigate");56 - }, []);57 -58 - const handleClear = useCallback(() => {59 - clearMessages();60 - }, [clearMessages]);61 -62 - // Resolve picked assets into StagedImage array63 - const stageAssets = useCallback(async (assets: Array<{ base64?: string | null; uri: string; mimeType?: string | null }>) => {64 - const staged: StagedImage[] = [];65 - for (const asset of assets) {66 - const mimeType = asset.mimeType ?? (asset.uri.endsWith(".png") ? "image/png" : "image/jpeg");67 - let base64 = asset.base64 ?? "";68 - if (!base64 && asset.uri) {69 - const { readAsStringAsync } = await import("expo-file-system/legacy");70 - base64 = await readAsStringAsync(asset.uri, { encoding: "base64" });71 - }72 - if (base64) staged.push({ base64, uri: asset.uri, mimeType });73 - }74 - if (staged.length > 0) setStagedImages(staged);75 - }, []);76 -77 - const pickFromLibrary = useCallback(async () => {78 - try {79 - const ImagePicker = await import("expo-image-picker");80 - const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();81 - if (status !== "granted") {82 - Alert.alert("Permission needed", "Please allow photo library access in Settings.");83 - return;84 - }85 - const result = await ImagePicker.launchImageLibraryAsync({86 - mediaTypes: ["images"],87 - allowsMultipleSelection: true,88 - selectionLimit: 10,89 - quality: 0.7,90 - base64: true,91 - });92 - if (result.canceled || !result.assets?.length) return;93 - await stageAssets(result.assets);94 - } catch (err: any) {95 - Alert.alert("Image Error", err?.message ?? String(err));96 - }97 - }, [stageAssets]);98 -99 - const pickFromCamera = useCallback(async () => {100 - try {101 - const ImagePicker = await import("expo-image-picker");102 - const { status } = await ImagePicker.requestCameraPermissionsAsync();103 - if (status !== "granted") {104 - Alert.alert("Permission needed", "Please allow camera access in Settings.");105 - return;106 - }107 - const result = await ImagePicker.launchCameraAsync({108 - quality: 0.7,109 - base64: true,110 - });111 - if (result.canceled || !result.assets?.[0]) return;112 - await stageAssets([result.assets[0]]);113 - } catch (err: any) {114 - Alert.alert("Camera Error", err?.message ?? String(err));115 - }116 - }, [stageAssets]);117 -118 - const handlePickImage = useCallback(() => {119 - if (Platform.OS === "ios") {120 - ActionSheetIOS.showActionSheetWithOptions(121 - {122 - options: ["Cancel", "Take Photo", "Choose from Library"],123 - cancelButtonIndex: 0,124 - },125 - (index) => {126 - if (index === 1) pickFromCamera();127 - else if (index === 2) pickFromLibrary();128 - },129 - );130 - } else {131 - // Android: just open library (camera is accessible from there)132 - pickFromLibrary();133 - }134 - }, [pickFromCamera, pickFromLibrary]);135 -136 - const handleImageSend = useCallback(137 - (caption: string) => {138 - if (stagedImages.length === 0) return;139 - // Send each image as a separate message; caption on the first only140 - stagedImages.forEach((img, i) => {141 - sendImageMessage(img.base64, i === 0 ? caption : "", img.mimeType);142 - });143 - setStagedImages([]);144 - },145 - [stagedImages, sendImageMessage],146 - );147 -148 - const handleReplay = useCallback(async () => {149 - if (isPlaying()) {150 - stopPlayback();151 - return;152 - }153 - // Find the last assistant voice message, then walk back to the first chunk in that group154 - let lastIdx = -1;155 - for (let i = messages.length - 1; i >= 0; i--) {156 - if (messages[i].role === "assistant" && messages[i].type === "voice" && messages[i].audioUri) {157 - lastIdx = i;158 - break;159 - }160 - }161 - if (lastIdx === -1) return;162 -163 - // Walk back to find the start of this chunk group164 - let startIdx = lastIdx;165 - while (startIdx > 0) {166 - const prev = messages[startIdx - 1];167 - if (prev.role === "assistant" && prev.type === "voice" && prev.audioUri) {168 - startIdx--;169 - } else {170 - break;171 - }172 - }173 -174 - // Queue all chunks from start to last175 - await stopPlayback();176 - for (let i = startIdx; i <= lastIdx; i++) {177 - const m = messages[i];178 - if (m.audioUri) playAudio(m.audioUri);179 - }180 - }, [messages]);181 -182 - return (183 - <SafeAreaView style={{ flex: 1, backgroundColor: colors.bg }} edges={["top", "bottom"]}>184 - <KeyboardAvoidingView185 - style={{ flex: 1 }}186 - behavior={Platform.OS === "ios" ? "padding" : undefined}187 - keyboardVerticalOffset={0}188 - >189 - {/* Header */}190 - <View191 - style={{192 - flexDirection: "row",193 - alignItems: "center",194 - justifyContent: "space-between",195 - paddingHorizontal: 16,196 - paddingVertical: 12,197 - borderBottomWidth: 1,198 - borderBottomColor: colors.border,199 - }}200 - >201 - <View style={{ flexDirection: "row", alignItems: "center", flex: 1, gap: 10 }}>202 - <Pressable203 - onPress={() => setShowSessions(true)}204 - hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}205 - style={({ pressed }) => ({206 - width: 36,207 - height: 36,208 - alignItems: "center",209 - justifyContent: "center",210 - borderRadius: 18,211 - backgroundColor: pressed ? colors.bgTertiary : colors.bgTertiary + "80",212 - })}213 - >214 - <Text style={{ color: colors.textSecondary, fontSize: 18 }}>☰</Text>215 - </Pressable>216 - <Pressable217 - onPress={() => setShowSessions(true)}218 - style={{ flexDirection: "row", alignItems: "center", gap: 8, flex: 1 }}219 - hitSlop={{ top: 6, bottom: 6, left: 0, right: 6 }}220 - >221 - <Text222 - style={{223 - color: colors.text,224 - fontSize: 22,225 - fontWeight: "800",226 - letterSpacing: -0.5,227 - flexShrink: 1,228 - }}229 - numberOfLines={1}230 - >231 - {activeSessionName}232 - </Text>233 - <StatusDot status={status} size={8} />234 - </Pressable>235 - </View>236 -237 - <View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}>238 - <Pressable239 - onPress={cycleMode}240 - hitSlop={{ top: 6, bottom: 6, left: 6, right: 6 }}241 - style={({ pressed }) => ({242 - width: 36,243 - height: 36,244 - alignItems: "center",245 - justifyContent: "center",246 - borderRadius: 18,247 - backgroundColor: pressed ? colors.bgTertiary : colors.bgTertiary + "80",248 - })}249 - >250 - <Text style={{ fontSize: 15 }}>{themeIcon}</Text>251 - </Pressable>252 - <Pressable253 - onPress={() => router.push("/settings")}254 - hitSlop={{ top: 6, bottom: 6, left: 6, right: 6 }}255 - style={{256 - width: 36,257 - height: 36,258 - alignItems: "center",259 - justifyContent: "center",260 - borderRadius: 18,261 - backgroundColor: colors.bgTertiary,262 - }}263 - >264 - <Text style={{ fontSize: 15 }}>⚙️</Text>265 - </Pressable>266 - </View>267 - </View>268 -269 - {/* Message list */}270 - <View style={{ flex: 1, position: "relative" }}>271 - {/* Toast for other-session incoming messages */}272 - {incomingToast && (273 - <IncomingToast274 - sessionName={incomingToast.sessionName}275 - preview={incomingToast.preview}276 - onTap={handleToastTap}277 - onDismiss={dismissToast}278 - />279 - )}280 - {messages.length === 0 ? (281 - <View style={{ flex: 1, alignItems: "center", justifyContent: "center", gap: 16 }}>282 - <View283 - style={{284 - width: 80,285 - height: 80,286 - borderRadius: 40,287 - backgroundColor: colors.bgTertiary,288 - alignItems: "center",289 - justifyContent: "center",290 - borderWidth: 1,291 - borderColor: colors.border,292 - }}293 - >294 - <Text style={{ fontSize: 36 }}>🛩</Text>295 - </View>296 - <View style={{ alignItems: "center", gap: 6 }}>297 - <Text style={{ color: colors.text, fontSize: 20, fontWeight: "700" }}>298 - PAILot299 - </Text>300 - <Text301 - style={{302 - color: colors.textMuted,303 - fontSize: 14,304 - textAlign: "center",305 - paddingHorizontal: 40,306 - lineHeight: 20,307 - }}308 - >309 - Voice-first AI communicator.{"\n"}Tap the mic to start talking.310 - </Text>311 - </View>312 - </View>313 - ) : (314 - <MessageList messages={messages} isTyping={isTyping} onDeleteMessage={deleteMessage} onLoadMore={loadMoreMessages} hasMore={hasMoreMessages} />315 - )}316 - </View>317 -318 - {/* Command bar */}319 - {isTextMode ? (320 - <TextModeCommandBar321 - onScreenshot={handleScreenshot}322 - onNavigate={handleNavigate}323 - onPhoto={handlePickImage}324 - onHelp={handleHelp}325 - onClear={handleClear}326 - />327 - ) : (328 - <CommandBar329 - onScreenshot={handleScreenshot}330 - onNavigate={handleNavigate}331 - onPhoto={handlePickImage}332 - onClear={handleClear}333 - />334 - )}335 -336 - {/* Input bar */}337 - <InputBar338 - onSendText={sendTextMessage}339 - onVoiceRecorded={sendVoiceMessage}340 - onReplay={handleReplay}341 - isTextMode={isTextMode}342 - onToggleMode={() => setIsTextMode((v) => !v)}343 - audioPlaying={audioPlaying}344 - />345 -346 - </KeyboardAvoidingView>347 -348 - {/* Image caption modal — WhatsApp-style full-screen preview */}349 - <ImageCaptionModal350 - visible={stagedImages.length > 0}351 - images={stagedImages.map((img) => ({ uri: `data:${img.mimeType};base64,${img.base64}` }))}352 - onSend={handleImageSend}353 - onCancel={() => setStagedImages([])}354 - />355 -356 - {/* Session drawer — absolute overlay outside KAV */}357 - <SessionDrawer358 - visible={showSessions}359 - onClose={() => setShowSessions(false)}360 - />361 - </SafeAreaView>362 - );363 -}app/index.tsxdeleted file mode 100644
.. .. @@ -1,5 +0,0 @@ 1 -import { Redirect } from "expo-router";2 -3 -export default function Index() {4 - return <Redirect href="/chat" />;5 -}deleted file mode 100644
.. .. @@ -1,179 +0,0 @@ 1 -import React, { useEffect } from "react";2 -import { Image, Pressable, Text, View } from "react-native";3 -import { SafeAreaView } from "react-native-safe-area-context";4 -import { router } from "expo-router";5 -import * as Haptics from "expo-haptics";6 -import { useChat } from "../contexts/ChatContext";7 -8 -interface NavButton {9 - label: string;10 - key: string;11 - icon?: string;12 - flex?: number;13 -}14 -15 -const NAV_ROWS: NavButton[][] = [16 - // Row 1: Vi motion17 - [18 - { label: "0", key: "0" },19 - { label: "k", key: "k", icon: "↑" },20 - { label: "G", key: "G" },21 - { label: "dd", key: "dd" },22 - ],23 - // Row 2: Arrow keys24 - [25 - { label: "h", key: "h", icon: "←" },26 - { label: "j", key: "j", icon: "↓" },27 - { label: "l", key: "l", icon: "→" },28 - { label: "Esc", key: "escape" },29 - ],30 - // Row 3: Action keys31 - [32 - { label: "Tab", key: "tab" },33 - { label: "Enter", key: "enter", flex: 2 },34 - { label: "^C", key: "ctrl-c" },35 - ],36 -];37 -38 -export default function NavigateScreen() {39 - const { latestScreenshot, requestScreenshot, sendNavKey } = useChat();40 -41 - // Request a screenshot when entering navigation mode42 - useEffect(() => {43 - requestScreenshot();44 - }, [requestScreenshot]);45 -46 - function handleNavPress(key: string) {47 - Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);48 - sendNavKey(key);49 - }50 -51 - return (52 - <SafeAreaView style={{ flex: 1, backgroundColor: "#0A0A0F" }} edges={["top", "bottom"]}>53 - {/* Header */}54 - <View55 - style={{56 - flexDirection: "row",57 - alignItems: "center",58 - justifyContent: "space-between",59 - paddingHorizontal: 16,60 - paddingVertical: 10,61 - borderBottomWidth: 1,62 - borderBottomColor: "#2E2E45",63 - }}64 - >65 - <Pressable66 - onPress={() => router.back()}67 - hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}68 - style={{69 - width: 36,70 - height: 36,71 - alignItems: "center",72 - justifyContent: "center",73 - borderRadius: 18,74 - backgroundColor: "#1E1E2E",75 - }}76 - >77 - <Text style={{ color: "#E8E8F0", fontSize: 16 }}>←</Text>78 - </Pressable>79 - <Text style={{ color: "#E8E8F0", fontSize: 18, fontWeight: "700" }}>80 - Navigate81 - </Text>82 - <Pressable83 - onPress={() => requestScreenshot()}84 - hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}85 - style={{86 - paddingHorizontal: 12,87 - paddingVertical: 8,88 - borderRadius: 12,89 - backgroundColor: "#1E1E2E",90 - }}91 - >92 - <Text style={{ color: "#4A9EFF", fontSize: 14, fontWeight: "600" }}>93 - Refresh94 - </Text>95 - </Pressable>96 - </View>97 -98 - {/* Screenshot area */}99 - <View style={{ flex: 1, padding: 8 }}>100 - {latestScreenshot ? (101 - <Image102 - source={{ uri: `data:image/png;base64,${latestScreenshot}` }}103 - style={{104 - flex: 1,105 - borderRadius: 12,106 - backgroundColor: "#14141F",107 - }}108 - resizeMode="contain"109 - />110 - ) : (111 - <View112 - style={{113 - flex: 1,114 - alignItems: "center",115 - justifyContent: "center",116 - backgroundColor: "#14141F",117 - borderRadius: 12,118 - }}119 - >120 - <Text style={{ color: "#5A5A78", fontSize: 16 }}>121 - Loading screenshot...122 - </Text>123 - </View>124 - )}125 - </View>126 -127 - {/* Navigation buttons */}128 - <View129 - style={{130 - paddingHorizontal: 16,131 - paddingBottom: 12,132 - gap: 10,133 - }}134 - >135 - {NAV_ROWS.map((row, rowIdx) => (136 - <View137 - key={rowIdx}138 - style={{139 - flexDirection: "row",140 - gap: 10,141 - }}142 - >143 - {row.map((btn) => (144 - <Pressable145 - key={btn.key}146 - onPress={() => handleNavPress(btn.key)}147 - style={({ pressed }) => ({148 - flex: btn.flex ?? 1,149 - height: 56,150 - borderRadius: 14,151 - alignItems: "center",152 - justifyContent: "center",153 - backgroundColor: pressed ? "#4A9EFF" : "#1E1E2E",154 - borderWidth: 1.5,155 - borderColor: pressed ? "#4A9EFF" : "#2E2E45",156 - })}157 - >158 - {btn.icon ? (159 - <View style={{ alignItems: "center" }}>160 - <Text style={{ color: "#E8E8F0", fontSize: 20, fontWeight: "700" }}>161 - {btn.icon}162 - </Text>163 - <Text style={{ color: "#5A5A78", fontSize: 10, marginTop: 1 }}>164 - {btn.label}165 - </Text>166 - </View>167 - ) : (168 - <Text style={{ color: "#E8E8F0", fontSize: 16, fontWeight: "700" }}>169 - {btn.label}170 - </Text>171 - )}172 - </Pressable>173 - ))}174 - </View>175 - ))}176 - </View>177 - </SafeAreaView>178 - );179 -}app/settings.tsxdeleted file mode 100644
.. .. @@ -1,365 +0,0 @@ 1 -import React, { useCallback, useState } from "react";2 -import {3 - Alert,4 - Keyboard,5 - KeyboardAvoidingView,6 - Platform,7 - Pressable,8 - ScrollView,9 - Text,10 - TextInput,11 - TouchableWithoutFeedback,12 - View,13 -} from "react-native";14 -import { SafeAreaView } from "react-native-safe-area-context";15 -import { router } from "expo-router";16 -import { useConnection } from "../contexts/ConnectionContext";17 -import { useTheme } from "../contexts/ThemeContext";18 -import { StatusDot } from "../components/ui/StatusDot";19 -import { ServerConfig } from "../types";20 -import { sendWol, isValidMac } from "../services/wol";21 -import { wsClient } from "../services/websocket";22 -23 -export default function SettingsScreen() {24 - const { serverConfig, status, connect, disconnect, saveServerConfig } =25 - useConnection();26 - const { colors } = useTheme();27 -28 - const [host, setHost] = useState(serverConfig?.host ?? "");29 - const [localHost, setLocalHost] = useState(serverConfig?.localHost ?? "");30 - const [port, setPort] = useState(31 - serverConfig?.port ? String(serverConfig.port) : "8765"32 - );33 - const [macAddress, setMacAddress] = useState(serverConfig?.macAddress ?? "");34 - const [saved, setSaved] = useState(false);35 - const [waking, setWaking] = useState(false);36 -37 - const handleSave = useCallback(async () => {38 - const trimmedHost = host.trim();39 - const portNum = parseInt(port.trim(), 10);40 -41 - const trimmedLocal = localHost.trim();42 - if ((!trimmedHost && !trimmedLocal) || isNaN(portNum) || portNum < 1 || portNum > 65535) {43 - return;44 - }45 -46 - const trimmedMac = macAddress.trim();47 - const effectiveHost = trimmedHost || trimmedLocal;48 - const config: ServerConfig = {49 - host: effectiveHost,50 - port: portNum,51 - ...(trimmedLocal && trimmedHost ? { localHost: trimmedLocal } : {}),52 - ...(trimmedMac ? { macAddress: trimmedMac } : {}),53 - };54 - await saveServerConfig(config);55 - setSaved(true);56 - setTimeout(() => setSaved(false), 2000);57 - }, [host, localHost, port, macAddress, saveServerConfig]);58 -59 - const handleConnect = useCallback(() => {60 - if (status === "connected" || status === "connecting" || status === "reconnecting") {61 - disconnect();62 - } else {63 - connect();64 - }65 - }, [status, connect, disconnect]);66 -67 - const handleWake = useCallback(async () => {68 - const mac = macAddress.trim() || serverConfig?.macAddress;69 - if (!mac || !isValidMac(mac)) {70 - Alert.alert("Invalid MAC", "Enter a valid MAC address (e.g. 6a:8a:e7:b3:8e:5c)");71 - return;72 - }73 - setWaking(true);74 - try {75 - await sendWol(mac, host.trim() || serverConfig?.host);76 - Alert.alert("WoL Sent", "Magic packet sent. The Mac should wake in a few seconds.");77 - } catch (err) {78 - Alert.alert("WoL Failed", err instanceof Error ? err.message : String(err));79 - } finally {80 - setWaking(false);81 - }82 - }, [macAddress, host, serverConfig]);83 -84 - const isFormValid = (host.trim().length > 0 || localHost.trim().length > 0) && parseInt(port, 10) > 0;85 -86 - return (87 - <SafeAreaView style={{ flex: 1, backgroundColor: colors.bg }} edges={["top", "bottom"]}>88 - <KeyboardAvoidingView89 - style={{ flex: 1 }}90 - behavior={Platform.OS === "ios" ? "padding" : "height"}91 - >92 - <TouchableWithoutFeedback onPress={Keyboard.dismiss}>93 - <ScrollView94 - style={{ flex: 1 }}95 - contentContainerStyle={{ paddingBottom: 32 }}96 - keyboardShouldPersistTaps="handled"97 - >98 - {/* Header */}99 - <View100 - style={{101 - flexDirection: "row",102 - alignItems: "center",103 - paddingHorizontal: 16,104 - paddingVertical: 12,105 - borderBottomWidth: 1,106 - borderBottomColor: colors.border,107 - }}108 - >109 - <Pressable110 - onPress={() => router.back()}111 - hitSlop={{ top: 6, bottom: 6, left: 6, right: 6 }}112 - style={{113 - width: 36,114 - height: 36,115 - alignItems: "center",116 - justifyContent: "center",117 - borderRadius: 18,118 - backgroundColor: colors.bgTertiary,119 - marginRight: 12,120 - }}121 - >122 - <Text style={{ color: colors.text, fontSize: 16 }}>{"\u2190"}</Text>123 - </Pressable>124 - <Text style={{ color: colors.text, fontSize: 22, fontWeight: "800", letterSpacing: -0.5 }}>125 - Settings126 - </Text>127 - </View>128 -129 - <View style={{ paddingHorizontal: 16, marginTop: 24 }}>130 - {/* Connection status card */}131 - <View132 - style={{133 - backgroundColor: colors.bgTertiary,134 - borderRadius: 16,135 - padding: 16,136 - marginBottom: 24,137 - }}138 - >139 - <Text140 - style={{141 - color: colors.textSecondary,142 - fontSize: 11,143 - fontWeight: "500",144 - textTransform: "uppercase",145 - letterSpacing: 1.5,146 - marginBottom: 12,147 - }}148 - >149 - Connection Status150 - </Text>151 - <View style={{ flexDirection: "row", alignItems: "center", gap: 12 }}>152 - <StatusDot status={status} size={12} />153 - <Text style={{ color: colors.text, fontSize: 16, fontWeight: "500" }}>154 - {status === "connected"155 - ? "Connected"156 - : status === "connecting"157 - ? "Connecting..."158 - : status === "reconnecting"159 - ? "Reconnecting..."160 - : "Disconnected"}161 - </Text>162 - </View>163 - {serverConfig && (164 - <Text style={{ color: colors.textMuted, fontSize: 14, marginTop: 8 }}>165 - {wsClient.currentUrl || `ws://${serverConfig.host}:${serverConfig.port}`}166 - </Text>167 - )}168 - </View>169 -170 - {/* Server config */}171 - <Text172 - style={{173 - color: colors.textSecondary,174 - fontSize: 11,175 - fontWeight: "500",176 - textTransform: "uppercase",177 - letterSpacing: 1.5,178 - marginBottom: 12,179 - }}180 - >181 - Server Configuration182 - </Text>183 -184 - <View185 - style={{186 - backgroundColor: colors.bgTertiary,187 - borderRadius: 16,188 - overflow: "hidden",189 - marginBottom: 16,190 - }}191 - >192 - {/* Local Host (preferred when on same network) */}193 - <View194 - style={{195 - paddingHorizontal: 16,196 - paddingVertical: 12,197 - borderBottomWidth: 1,198 - borderBottomColor: colors.border,199 - }}200 - >201 - <Text style={{ color: colors.textMuted, fontSize: 11, marginBottom: 4 }}>202 - Local Address (optional)203 - </Text>204 - <TextInput205 - value={localHost}206 - onChangeText={setLocalHost}207 - placeholder="192.168.1.100"208 - placeholderTextColor={colors.textMuted}209 - autoCapitalize="none"210 - autoCorrect={false}211 - keyboardType="url"212 - style={{ color: colors.text, fontSize: 16, padding: 0 }}213 - />214 - </View>215 -216 - {/* Remote Host (fallback / external) */}217 - <View218 - style={{219 - paddingHorizontal: 16,220 - paddingVertical: 12,221 - borderBottomWidth: 1,222 - borderBottomColor: colors.border,223 - }}224 - >225 - <Text style={{ color: colors.textMuted, fontSize: 11, marginBottom: 4 }}>226 - Remote Address227 - </Text>228 - <TextInput229 - value={host}230 - onChangeText={setHost}231 - placeholder="myhost.example.com"232 - placeholderTextColor={colors.textMuted}233 - autoCapitalize="none"234 - autoCorrect={false}235 - keyboardType="url"236 - style={{ color: colors.text, fontSize: 16, padding: 0 }}237 - />238 - </View>239 -240 - {/* Port */}241 - <View242 - style={{243 - paddingHorizontal: 16,244 - paddingVertical: 12,245 - borderBottomWidth: 1,246 - borderBottomColor: colors.border,247 - }}248 - >249 - <Text style={{ color: colors.textMuted, fontSize: 11, marginBottom: 4 }}>250 - Port251 - </Text>252 - <TextInput253 - value={port}254 - onChangeText={setPort}255 - placeholder="8765"256 - placeholderTextColor={colors.textMuted}257 - keyboardType="number-pad"258 - style={{ color: colors.text, fontSize: 16, padding: 0 }}259 - />260 - </View>261 -262 - {/* MAC Address for Wake-on-LAN */}263 - <View style={{ paddingHorizontal: 16, paddingVertical: 12 }}>264 - <Text style={{ color: colors.textMuted, fontSize: 11, marginBottom: 4 }}>265 - MAC Address (Wake-on-LAN)266 - </Text>267 - <TextInput268 - value={macAddress}269 - onChangeText={setMacAddress}270 - placeholder="6a:8a:e7:b3:8e:5c"271 - placeholderTextColor={colors.textMuted}272 - autoCapitalize="none"273 - autoCorrect={false}274 - style={{ color: colors.text, fontSize: 16, padding: 0 }}275 - />276 - </View>277 - </View>278 -279 - {/* Save button */}280 - <Pressable281 - onPress={handleSave}282 - disabled={!isFormValid}283 - style={{284 - borderRadius: 16,285 - paddingVertical: 16,286 - alignItems: "center",287 - marginBottom: 12,288 - backgroundColor: isFormValid ? colors.accent : colors.bgTertiary,289 - }}290 - >291 - <Text292 - style={{293 - fontSize: 16,294 - fontWeight: "600",295 - color: isFormValid ? "#FFF" : colors.textMuted,296 - }}297 - >298 - {saved ? "Saved!" : "Save Configuration"}299 - </Text>300 - </Pressable>301 -302 - {/* Wake-on-LAN button */}303 - <Pressable304 - onPress={handleWake}305 - disabled={waking || (!macAddress.trim() && !serverConfig?.macAddress)}306 - style={{307 - borderRadius: 16,308 - paddingVertical: 16,309 - alignItems: "center",310 - marginBottom: 12,311 - backgroundColor:312 - macAddress.trim() || serverConfig?.macAddress313 - ? "#FF950033"314 - : colors.bgTertiary,315 - }}316 - >317 - <Text318 - style={{319 - fontSize: 16,320 - fontWeight: "600",321 - color:322 - macAddress.trim() || serverConfig?.macAddress323 - ? "#FF9500"324 - : colors.textMuted,325 - }}326 - >327 - {waking ? "Sending..." : "Wake Mac (WoL)"}328 - </Text>329 - </Pressable>330 -331 - {/* Connect/Disconnect button */}332 - <Pressable333 - onPress={handleConnect}334 - disabled={!serverConfig}335 - style={{336 - borderRadius: 16,337 - paddingVertical: 16,338 - alignItems: "center",339 - backgroundColor:340 - status === "connected"341 - ? colors.danger + "33"342 - : "#2ED57333",343 - }}344 - >345 - <Text346 - style={{347 - fontSize: 16,348 - fontWeight: "600",349 - color: status === "connected" ? colors.danger : "#2ED573",350 - }}351 - >352 - {status === "connected"353 - ? "Disconnect"354 - : status === "connecting" || status === "reconnecting"355 - ? "Reconnecting..."356 - : "Connect"}357 - </Text>358 - </Pressable>359 - </View>360 - </ScrollView>361 - </TouchableWithoutFeedback>362 - </KeyboardAvoidingView>363 - </SafeAreaView>364 - );365 -}assets/PAILot.ai
.. .. @@ -0,0 +1,1509 @@ 1 +%PDF-1.6 %âãÏÓ2 +1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[22 0 R]/Order 23 0 R/RBGroups[]>>/OCGs[22 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 47668/Subtype/XML/Type/Metadata>>stream3 +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>4 +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 10.0-c000 1.000000, 0000/00/00-00:00:00 ">5 + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">6 + <rdf:Description rdf:about=""7 + xmlns:dc="http://purl.org/dc/elements/1.1/"8 + xmlns:xmp="http://ns.adobe.com/xap/1.0/"9 + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"10 + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"11 + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"12 + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"13 + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"14 + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"15 + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"16 + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"17 + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"18 + xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">19 + <dc:format>application/pdf</dc:format>20 + <dc:title>21 + <rdf:Alt>22 + <rdf:li xml:lang="x-default">PAILot</rdf:li>23 + </rdf:Alt>24 + </dc:title>25 + <xmp:CreatorTool>Adobe Illustrator 30.2 (Macintosh)</xmp:CreatorTool>26 + <xmp:CreateDate>2026-03-21T16:14:39+01:00</xmp:CreateDate>27 + <xmp:ModifyDate>2026-03-21T16:14:39+01:00</xmp:ModifyDate>28 + <xmp:MetadataDate>2026-03-21T16:14:39+01:00</xmp:MetadataDate>29 + <xmp:Thumbnails>30 + <rdf:Alt>31 + <rdf:li rdf:parseType="Resource">32 + <xmpGImg:width>256</xmpGImg:width>33 + <xmpGImg:height>256</xmpGImg:height>34 + <xmpGImg:format>JPEG</xmpGImg:format>35 + <xmpGImg:image>/9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA
AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A4aufQpUqyZAsCrpkC1lX
TKy1lXTIFgVdMgWsq6ZWWBVkyBYFXTIFgUQmQLAq6ZWWBV0yBYFEJlZYlXTIFgVdMrLAq8eQLEoh
MrLEq6ZAsCiEyBYlEJlZYFXTKyxKV67pV68bXmlzy296gqwidk9QD/VI+LbMrTZ4g8MwDHz6OXpd
UYGidmP2H5nfmDprAW+u3fw7BJ3+sKKduMwkGZ+XsfSZOeOPw2+6ndRzTHVmOi/85Jea7UqmrWNt
qMQ6unK3lP8AshzT/hM1Go9kcEv7uUoH5j9f2t8dVLq9K8s/nx5C1pkhuLhtJu3oPTvQFjJPhMpM
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</xmpGImg:image>36 + </rdf:li>37 + </rdf:Alt>38 + </xmp:Thumbnails>39 + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>40 + <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>41 + <xmpMM:DocumentID>xmp.did:315ecc11-e4b0-4fcf-bed0-72cde1039292</xmpMM:DocumentID>42 + <xmpMM:InstanceID>uuid:bcafdf3a-792d-2e46-a4ea-c61edfb5e8d1</xmpMM:InstanceID>43 + <xmpMM:DerivedFrom rdf:parseType="Resource">44 + <stRef:instanceID>xmp.iid:4991ec66-af1b-4051-bde7-f0303643fbc8</stRef:instanceID>45 + <stRef:documentID>xmp.did:63c3b8d1-bb03-4762-9588-414086f0dea9</stRef:documentID>46 + <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>47 + <stRef:renditionClass>default</stRef:renditionClass>48 + </xmpMM:DerivedFrom>49 + <xmpMM:History>50 + <rdf:Seq>51 + <rdf:li rdf:parseType="Resource">52 + <stEvt:action>saved</stEvt:action>53 + <stEvt:instanceID>xmp.iid:41273b51-099a-4bd5-801b-1a44c629c86c</stEvt:instanceID>54 + <stEvt:when>2026-03-21T16:11:53+01:00</stEvt:when>55 + <stEvt:softwareAgent>Adobe Illustrator 30.2 (Macintosh)</stEvt:softwareAgent>56 + <stEvt:changed>/</stEvt:changed>57 + </rdf:li>58 + <rdf:li rdf:parseType="Resource">59 + <stEvt:action>saved</stEvt:action>60 + <stEvt:instanceID>xmp.iid:315ecc11-e4b0-4fcf-bed0-72cde1039292</stEvt:instanceID>61 + <stEvt:when>2026-03-21T16:14:39+01:00</stEvt:when>62 + <stEvt:softwareAgent>Adobe Illustrator 30.2 (Macintosh)</stEvt:softwareAgent>63 + <stEvt:changed>/</stEvt:changed>64 + </rdf:li>65 + </rdf:Seq>66 + </xmpMM:History>67 + <illustrator:StartupProfile>Web</illustrator:StartupProfile>68 + <illustrator:CreatorSubTool>AIRobin</illustrator:CreatorSubTool>69 + <illustrator:IsFileSavedViaInstantSave>False</illustrator:IsFileSavedViaInstantSave>70 + <illustrator:Type>Document</illustrator:Type>71 + <xmpTPg:NPages>1</xmpTPg:NPages>72 + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>73 + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>74 + <xmpTPg:MaxPageSize rdf:parseType="Resource">75 + <stDim:w>519.242588</stDim:w>76 + <stDim:h>519.260474</stDim:h>77 + <stDim:unit>Pixels</stDim:unit>78 + </xmpTPg:MaxPageSize>79 + <xmpTPg:PlateNames>80 + <rdf:Seq>81 + <rdf:li>Cyan</rdf:li>82 + <rdf:li>Magenta</rdf:li>83 + </rdf:Seq>84 + </xmpTPg:PlateNames>85 + <xmpTPg:SwatchGroups>86 + <rdf:Seq>87 + <rdf:li rdf:parseType="Resource">88 + <xmpG:groupName>Default Swatch Group</xmpG:groupName>89 + <xmpG:groupType>0</xmpG:groupType>90 + <xmpG:Colorants>91 + <rdf:Seq>92 + <rdf:li rdf:parseType="Resource">93 + <xmpG:swatchName>White</xmpG:swatchName>94 + <xmpG:mode>RGB</xmpG:mode>95 + <xmpG:type>PROCESS</xmpG:type>96 + <xmpG:red>255</xmpG:red>97 + <xmpG:green>255</xmpG:green>98 + <xmpG:blue>255</xmpG:blue>99 + </rdf:li>100 + <rdf:li rdf:parseType="Resource">101 + <xmpG:swatchName>Black</xmpG:swatchName>102 + <xmpG:mode>RGB</xmpG:mode>103 + <xmpG:type>PROCESS</xmpG:type>104 + <xmpG:red>0</xmpG:red>105 + <xmpG:green>0</xmpG:green>106 + <xmpG:blue>0</xmpG:blue>107 + </rdf:li>108 + <rdf:li rdf:parseType="Resource">109 + <xmpG:swatchName>RGB Red</xmpG:swatchName>110 + <xmpG:mode>RGB</xmpG:mode>111 + <xmpG:type>PROCESS</xmpG:type>112 + <xmpG:red>255</xmpG:red>113 + <xmpG:green>0</xmpG:green>114 + <xmpG:blue>0</xmpG:blue>115 + </rdf:li>116 + <rdf:li rdf:parseType="Resource">117 + <xmpG:swatchName>RGB Yellow</xmpG:swatchName>118 + <xmpG:mode>RGB</xmpG:mode>119 + <xmpG:type>PROCESS</xmpG:type>120 + <xmpG:red>255</xmpG:red>121 + <xmpG:green>255</xmpG:green>122 + <xmpG:blue>0</xmpG:blue>123 + </rdf:li>124 + <rdf:li rdf:parseType="Resource">125 + <xmpG:swatchName>RGB Green</xmpG:swatchName>126 + <xmpG:mode>RGB</xmpG:mode>127 + <xmpG:type>PROCESS</xmpG:type>128 + <xmpG:red>0</xmpG:red>129 + <xmpG:green>255</xmpG:green>130 + <xmpG:blue>0</xmpG:blue>131 + </rdf:li>132 + <rdf:li rdf:parseType="Resource">133 + <xmpG:swatchName>RGB Cyan</xmpG:swatchName>134 + <xmpG:mode>RGB</xmpG:mode>135 + <xmpG:type>PROCESS</xmpG:type>136 + <xmpG:red>0</xmpG:red>137 + <xmpG:green>255</xmpG:green>138 + <xmpG:blue>255</xmpG:blue>139 + </rdf:li>140 + <rdf:li rdf:parseType="Resource">141 + <xmpG:swatchName>RGB Blue</xmpG:swatchName>142 + <xmpG:mode>RGB</xmpG:mode>143 + <xmpG:type>PROCESS</xmpG:type>144 + <xmpG:red>0</xmpG:red>145 + <xmpG:green>0</xmpG:green>146 + <xmpG:blue>255</xmpG:blue>147 + </rdf:li>148 + <rdf:li rdf:parseType="Resource">149 + <xmpG:swatchName>RGB Magenta</xmpG:swatchName>150 + <xmpG:mode>RGB</xmpG:mode>151 + <xmpG:type>PROCESS</xmpG:type>152 + <xmpG:red>255</xmpG:red>153 + <xmpG:green>0</xmpG:green>154 + <xmpG:blue>255</xmpG:blue>155 + </rdf:li>156 + <rdf:li rdf:parseType="Resource">157 + <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>158 + <xmpG:mode>RGB</xmpG:mode>159 + <xmpG:type>PROCESS</xmpG:type>160 + <xmpG:red>193</xmpG:red>161 + <xmpG:green>39</xmpG:green>162 + <xmpG:blue>45</xmpG:blue>163 + </rdf:li>164 + <rdf:li rdf:parseType="Resource">165 + <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>166 + <xmpG:mode>RGB</xmpG:mode>167 + <xmpG:type>PROCESS</xmpG:type>168 + <xmpG:red>237</xmpG:red>169 + <xmpG:green>28</xmpG:green>170 + <xmpG:blue>36</xmpG:blue>171 + </rdf:li>172 + <rdf:li rdf:parseType="Resource">173 + <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>174 + <xmpG:mode>RGB</xmpG:mode>175 + <xmpG:type>PROCESS</xmpG:type>176 + <xmpG:red>241</xmpG:red>177 + <xmpG:green>90</xmpG:green>178 + <xmpG:blue>36</xmpG:blue>179 + </rdf:li>180 + <rdf:li rdf:parseType="Resource">181 + <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>182 + <xmpG:mode>RGB</xmpG:mode>183 + <xmpG:type>PROCESS</xmpG:type>184 + <xmpG:red>247</xmpG:red>185 + <xmpG:green>147</xmpG:green>186 + <xmpG:blue>30</xmpG:blue>187 + </rdf:li>188 + <rdf:li rdf:parseType="Resource">189 + <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>190 + <xmpG:mode>RGB</xmpG:mode>191 + <xmpG:type>PROCESS</xmpG:type>192 + <xmpG:red>251</xmpG:red>193 + <xmpG:green>176</xmpG:green>194 + <xmpG:blue>59</xmpG:blue>195 + </rdf:li>196 + <rdf:li rdf:parseType="Resource">197 + <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>198 + <xmpG:mode>RGB</xmpG:mode>199 + <xmpG:type>PROCESS</xmpG:type>200 + <xmpG:red>252</xmpG:red>201 + <xmpG:green>238</xmpG:green>202 + <xmpG:blue>33</xmpG:blue>203 + </rdf:li>204 + <rdf:li rdf:parseType="Resource">205 + <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>206 + <xmpG:mode>RGB</xmpG:mode>207 + <xmpG:type>PROCESS</xmpG:type>208 + <xmpG:red>217</xmpG:red>209 + <xmpG:green>224</xmpG:green>210 + <xmpG:blue>33</xmpG:blue>211 + </rdf:li>212 + <rdf:li rdf:parseType="Resource">213 + <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>214 + <xmpG:mode>RGB</xmpG:mode>215 + <xmpG:type>PROCESS</xmpG:type>216 + <xmpG:red>140</xmpG:red>217 + <xmpG:green>198</xmpG:green>218 + <xmpG:blue>63</xmpG:blue>219 + </rdf:li>220 + <rdf:li rdf:parseType="Resource">221 + <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>222 + <xmpG:mode>RGB</xmpG:mode>223 + <xmpG:type>PROCESS</xmpG:type>224 + <xmpG:red>57</xmpG:red>225 + <xmpG:green>181</xmpG:green>226 + <xmpG:blue>74</xmpG:blue>227 + </rdf:li>228 + <rdf:li rdf:parseType="Resource">229 + <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>230 + <xmpG:mode>RGB</xmpG:mode>231 + <xmpG:type>PROCESS</xmpG:type>232 + <xmpG:red>0</xmpG:red>233 + <xmpG:green>146</xmpG:green>234 + <xmpG:blue>69</xmpG:blue>235 + </rdf:li>236 + <rdf:li rdf:parseType="Resource">237 + <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>238 + <xmpG:mode>RGB</xmpG:mode>239 + <xmpG:type>PROCESS</xmpG:type>240 + <xmpG:red>0</xmpG:red>241 + <xmpG:green>104</xmpG:green>242 + <xmpG:blue>55</xmpG:blue>243 + </rdf:li>244 + <rdf:li rdf:parseType="Resource">245 + <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>246 + <xmpG:mode>RGB</xmpG:mode>247 + <xmpG:type>PROCESS</xmpG:type>248 + <xmpG:red>34</xmpG:red>249 + <xmpG:green>181</xmpG:green>250 + <xmpG:blue>115</xmpG:blue>251 + </rdf:li>252 + <rdf:li rdf:parseType="Resource">253 + <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>254 + <xmpG:mode>RGB</xmpG:mode>255 + <xmpG:type>PROCESS</xmpG:type>256 + <xmpG:red>0</xmpG:red>257 + <xmpG:green>169</xmpG:green>258 + <xmpG:blue>157</xmpG:blue>259 + </rdf:li>260 + <rdf:li rdf:parseType="Resource">261 + <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>262 + <xmpG:mode>RGB</xmpG:mode>263 + <xmpG:type>PROCESS</xmpG:type>264 + <xmpG:red>41</xmpG:red>265 + <xmpG:green>171</xmpG:green>266 + <xmpG:blue>226</xmpG:blue>267 + </rdf:li>268 + <rdf:li rdf:parseType="Resource">269 + <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>270 + <xmpG:mode>RGB</xmpG:mode>271 + <xmpG:type>PROCESS</xmpG:type>272 + <xmpG:red>0</xmpG:red>273 + <xmpG:green>113</xmpG:green>274 + <xmpG:blue>188</xmpG:blue>275 + </rdf:li>276 + <rdf:li rdf:parseType="Resource">277 + <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>278 + <xmpG:mode>RGB</xmpG:mode>279 + <xmpG:type>PROCESS</xmpG:type>280 + <xmpG:red>46</xmpG:red>281 + <xmpG:green>49</xmpG:green>282 + <xmpG:blue>146</xmpG:blue>283 + </rdf:li>284 + <rdf:li rdf:parseType="Resource">285 + <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>286 + <xmpG:mode>RGB</xmpG:mode>287 + <xmpG:type>PROCESS</xmpG:type>288 + <xmpG:red>27</xmpG:red>289 + <xmpG:green>20</xmpG:green>290 + <xmpG:blue>100</xmpG:blue>291 + </rdf:li>292 + <rdf:li rdf:parseType="Resource">293 + <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>294 + <xmpG:mode>RGB</xmpG:mode>295 + <xmpG:type>PROCESS</xmpG:type>296 + <xmpG:red>102</xmpG:red>297 + <xmpG:green>45</xmpG:green>298 + <xmpG:blue>145</xmpG:blue>299 + </rdf:li>300 + <rdf:li rdf:parseType="Resource">301 + <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>302 + <xmpG:mode>RGB</xmpG:mode>303 + <xmpG:type>PROCESS</xmpG:type>304 + <xmpG:red>147</xmpG:red>305 + <xmpG:green>39</xmpG:green>306 + <xmpG:blue>143</xmpG:blue>307 + </rdf:li>308 + <rdf:li rdf:parseType="Resource">309 + <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>310 + <xmpG:mode>RGB</xmpG:mode>311 + <xmpG:type>PROCESS</xmpG:type>312 + <xmpG:red>158</xmpG:red>313 + <xmpG:green>0</xmpG:green>314 + <xmpG:blue>93</xmpG:blue>315 + </rdf:li>316 + <rdf:li rdf:parseType="Resource">317 + <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>318 + <xmpG:mode>RGB</xmpG:mode>319 + <xmpG:type>PROCESS</xmpG:type>320 + <xmpG:red>212</xmpG:red>321 + <xmpG:green>20</xmpG:green>322 + <xmpG:blue>90</xmpG:blue>323 + </rdf:li>324 + <rdf:li rdf:parseType="Resource">325 + <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>326 + <xmpG:mode>RGB</xmpG:mode>327 + <xmpG:type>PROCESS</xmpG:type>328 + <xmpG:red>237</xmpG:red>329 + <xmpG:green>30</xmpG:green>330 + <xmpG:blue>121</xmpG:blue>331 + </rdf:li>332 + <rdf:li rdf:parseType="Resource">333 + <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>334 + <xmpG:mode>RGB</xmpG:mode>335 + <xmpG:type>PROCESS</xmpG:type>336 + <xmpG:red>199</xmpG:red>337 + <xmpG:green>178</xmpG:green>338 + <xmpG:blue>153</xmpG:blue>339 + </rdf:li>340 + <rdf:li rdf:parseType="Resource">341 + <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>342 + <xmpG:mode>RGB</xmpG:mode>343 + <xmpG:type>PROCESS</xmpG:type>344 + <xmpG:red>153</xmpG:red>345 + <xmpG:green>134</xmpG:green>346 + <xmpG:blue>117</xmpG:blue>347 + </rdf:li>348 + <rdf:li rdf:parseType="Resource">349 + <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>350 + <xmpG:mode>RGB</xmpG:mode>351 + <xmpG:type>PROCESS</xmpG:type>352 + <xmpG:red>115</xmpG:red>353 + <xmpG:green>99</xmpG:green>354 + <xmpG:blue>87</xmpG:blue>355 + </rdf:li>356 + <rdf:li rdf:parseType="Resource">357 + <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>358 + <xmpG:mode>RGB</xmpG:mode>359 + <xmpG:type>PROCESS</xmpG:type>360 + <xmpG:red>83</xmpG:red>361 + <xmpG:green>71</xmpG:green>362 + <xmpG:blue>65</xmpG:blue>363 + </rdf:li>364 + <rdf:li rdf:parseType="Resource">365 + <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>366 + <xmpG:mode>RGB</xmpG:mode>367 + <xmpG:type>PROCESS</xmpG:type>368 + <xmpG:red>198</xmpG:red>369 + <xmpG:green>156</xmpG:green>370 + <xmpG:blue>109</xmpG:blue>371 + </rdf:li>372 + <rdf:li rdf:parseType="Resource">373 + <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>374 + <xmpG:mode>RGB</xmpG:mode>375 + <xmpG:type>PROCESS</xmpG:type>376 + <xmpG:red>166</xmpG:red>377 + <xmpG:green>124</xmpG:green>378 + <xmpG:blue>82</xmpG:blue>379 + </rdf:li>380 + <rdf:li rdf:parseType="Resource">381 + <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>382 + <xmpG:mode>RGB</xmpG:mode>383 + <xmpG:type>PROCESS</xmpG:type>384 + <xmpG:red>140</xmpG:red>385 + <xmpG:green>98</xmpG:green>386 + <xmpG:blue>57</xmpG:blue>387 + </rdf:li>388 + <rdf:li rdf:parseType="Resource">389 + <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>390 + <xmpG:mode>RGB</xmpG:mode>391 + <xmpG:type>PROCESS</xmpG:type>392 + <xmpG:red>117</xmpG:red>393 + <xmpG:green>76</xmpG:green>394 + <xmpG:blue>36</xmpG:blue>395 + </rdf:li>396 + <rdf:li rdf:parseType="Resource">397 + <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>398 + <xmpG:mode>RGB</xmpG:mode>399 + <xmpG:type>PROCESS</xmpG:type>400 + <xmpG:red>96</xmpG:red>401 + <xmpG:green>56</xmpG:green>402 + <xmpG:blue>19</xmpG:blue>403 + </rdf:li>404 + <rdf:li rdf:parseType="Resource">405 + <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>406 + <xmpG:mode>RGB</xmpG:mode>407 + <xmpG:type>PROCESS</xmpG:type>408 + <xmpG:red>66</xmpG:red>409 + <xmpG:green>33</xmpG:green>410 + <xmpG:blue>11</xmpG:blue>411 + </rdf:li>412 + </rdf:Seq>413 + </xmpG:Colorants>414 + </rdf:li>415 + <rdf:li rdf:parseType="Resource">416 + <xmpG:groupName>Grays</xmpG:groupName>417 + <xmpG:groupType>1</xmpG:groupType>418 + <xmpG:Colorants>419 + <rdf:Seq>420 + <rdf:li rdf:parseType="Resource">421 + <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>422 + <xmpG:mode>RGB</xmpG:mode>423 + <xmpG:type>PROCESS</xmpG:type>424 + <xmpG:red>0</xmpG:red>425 + <xmpG:green>0</xmpG:green>426 + <xmpG:blue>0</xmpG:blue>427 + </rdf:li>428 + <rdf:li rdf:parseType="Resource">429 + <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>430 + <xmpG:mode>RGB</xmpG:mode>431 + <xmpG:type>PROCESS</xmpG:type>432 + <xmpG:red>26</xmpG:red>433 + <xmpG:green>26</xmpG:green>434 + <xmpG:blue>26</xmpG:blue>435 + </rdf:li>436 + <rdf:li rdf:parseType="Resource">437 + <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>438 + <xmpG:mode>RGB</xmpG:mode>439 + <xmpG:type>PROCESS</xmpG:type>440 + <xmpG:red>51</xmpG:red>441 + <xmpG:green>51</xmpG:green>442 + <xmpG:blue>51</xmpG:blue>443 + </rdf:li>444 + <rdf:li rdf:parseType="Resource">445 + <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>446 + <xmpG:mode>RGB</xmpG:mode>447 + <xmpG:type>PROCESS</xmpG:type>448 + <xmpG:red>77</xmpG:red>449 + <xmpG:green>77</xmpG:green>450 + <xmpG:blue>77</xmpG:blue>451 + </rdf:li>452 + <rdf:li rdf:parseType="Resource">453 + <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>454 + <xmpG:mode>RGB</xmpG:mode>455 + <xmpG:type>PROCESS</xmpG:type>456 + <xmpG:red>102</xmpG:red>457 + <xmpG:green>102</xmpG:green>458 + <xmpG:blue>102</xmpG:blue>459 + </rdf:li>460 + <rdf:li rdf:parseType="Resource">461 + <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>462 + <xmpG:mode>RGB</xmpG:mode>463 + <xmpG:type>PROCESS</xmpG:type>464 + <xmpG:red>128</xmpG:red>465 + <xmpG:green>128</xmpG:green>466 + <xmpG:blue>128</xmpG:blue>467 + </rdf:li>468 + <rdf:li rdf:parseType="Resource">469 + <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>470 + <xmpG:mode>RGB</xmpG:mode>471 + <xmpG:type>PROCESS</xmpG:type>472 + <xmpG:red>153</xmpG:red>473 + <xmpG:green>153</xmpG:green>474 + <xmpG:blue>153</xmpG:blue>475 + </rdf:li>476 + <rdf:li rdf:parseType="Resource">477 + <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>478 + <xmpG:mode>RGB</xmpG:mode>479 + <xmpG:type>PROCESS</xmpG:type>480 + <xmpG:red>179</xmpG:red>481 + <xmpG:green>179</xmpG:green>482 + <xmpG:blue>179</xmpG:blue>483 + </rdf:li>484 + <rdf:li rdf:parseType="Resource">485 + <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>486 + <xmpG:mode>RGB</xmpG:mode>487 + <xmpG:type>PROCESS</xmpG:type>488 + <xmpG:red>204</xmpG:red>489 + <xmpG:green>204</xmpG:green>490 + <xmpG:blue>204</xmpG:blue>491 + </rdf:li>492 + <rdf:li rdf:parseType="Resource">493 + <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>494 + <xmpG:mode>RGB</xmpG:mode>495 + <xmpG:type>PROCESS</xmpG:type>496 + <xmpG:red>230</xmpG:red>497 + <xmpG:green>230</xmpG:green>498 + <xmpG:blue>230</xmpG:blue>499 + </rdf:li>500 + <rdf:li rdf:parseType="Resource">501 + <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>502 + <xmpG:mode>RGB</xmpG:mode>503 + <xmpG:type>PROCESS</xmpG:type>504 + <xmpG:red>242</xmpG:red>505 + <xmpG:green>242</xmpG:green>506 + <xmpG:blue>242</xmpG:blue>507 + </rdf:li>508 + </rdf:Seq>509 + </xmpG:Colorants>510 + </rdf:li>511 + <rdf:li rdf:parseType="Resource">512 + <xmpG:groupName>Web Color Group</xmpG:groupName>513 + <xmpG:groupType>1</xmpG:groupType>514 + <xmpG:Colorants>515 + <rdf:Seq>516 + <rdf:li rdf:parseType="Resource">517 + <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>518 + <xmpG:mode>RGB</xmpG:mode>519 + <xmpG:type>PROCESS</xmpG:type>520 + <xmpG:red>63</xmpG:red>521 + <xmpG:green>169</xmpG:green>522 + <xmpG:blue>245</xmpG:blue>523 + </rdf:li>524 + <rdf:li rdf:parseType="Resource">525 + <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>526 + <xmpG:mode>RGB</xmpG:mode>527 + <xmpG:type>PROCESS</xmpG:type>528 + <xmpG:red>122</xmpG:red>529 + <xmpG:green>201</xmpG:green>530 + <xmpG:blue>67</xmpG:blue>531 + </rdf:li>532 + <rdf:li rdf:parseType="Resource">533 + <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>534 + <xmpG:mode>RGB</xmpG:mode>535 + <xmpG:type>PROCESS</xmpG:type>536 + <xmpG:red>255</xmpG:red>537 + <xmpG:green>147</xmpG:green>538 + <xmpG:blue>30</xmpG:blue>539 + </rdf:li>540 + <rdf:li rdf:parseType="Resource">541 + <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>542 + <xmpG:mode>RGB</xmpG:mode>543 + <xmpG:type>PROCESS</xmpG:type>544 + <xmpG:red>255</xmpG:red>545 + <xmpG:green>29</xmpG:green>546 + <xmpG:blue>37</xmpG:blue>547 + </rdf:li>548 + <rdf:li rdf:parseType="Resource">549 + <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>550 + <xmpG:mode>RGB</xmpG:mode>551 + <xmpG:type>PROCESS</xmpG:type>552 + <xmpG:red>255</xmpG:red>553 + <xmpG:green>123</xmpG:green>554 + <xmpG:blue>172</xmpG:blue>555 + </rdf:li>556 + <rdf:li rdf:parseType="Resource">557 + <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>558 + <xmpG:mode>RGB</xmpG:mode>559 + <xmpG:type>PROCESS</xmpG:type>560 + <xmpG:red>189</xmpG:red>561 + <xmpG:green>204</xmpG:green>562 + <xmpG:blue>212</xmpG:blue>563 + </rdf:li>564 + </rdf:Seq>565 + </xmpG:Colorants>566 + </rdf:li>567 + </rdf:Seq>568 + </xmpTPg:SwatchGroups>569 + <pdf:Producer>Adobe PDF library 18.00</pdf:Producer>570 + <pdfx:CreatorVersion>21.0.0</pdfx:CreatorVersion>571 + </rdf:Description>572 + </rdf:RDF>573 +</x:xmpmeta>574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 1/Kids[5 0 R]/Type/Pages>> endobj 5 0 obj <</ArtBox[0.0 0.0 519.243 519.26]/BleedBox[0.0 0.0 519.243 519.26]/Contents 24 0 R/CropBox[0.0 0.0 519.243 519.26]/LastModified(D:20260321161439+01'00')/MediaBox[0.0 0.0 519.243 519.26]/Parent 3 0 R/Resources<</ColorSpace<</CS0 25 0 R>>/ExtGState<</GS0 26 0 R>>/Properties<</MC0 22 0 R>>/Shading<</Sh0 27 0 R>>>>/Thumb 28 0 R/TrimBox[0.0 0.0 519.243 519.26]/Type/Page/PieceInfo<</Illustrator 8 0 R>>>> endobj 24 0 obj <</Filter/FlateDecode/Length 5871>>stream596 +HKWÍι ¼ÏSô¤-JÔßu § Xì!{÷!>ôöý¬êµìK`ß°ºY,Q©þòϯÇ|MÇ/ýz¼þûJGyævü?ËÙK;.û¥ÊQç9ä(ÚÆ!EÏÑÔì|\o¯¹^úYäÐ*gJÙ§ærJ3rî@IélÝq¦&ÈYf b.%åS`eXãc~{m¹g=çç}-F{N3÷sdq÷'p½1 O1ýZÜaaÙå¬&9DaCÂ6¶SÌu̳tÏRµu·iVcx×°äµi]Î>-SÏ¢#V1-EULTU.cEÃÏ$±Åb²J©ç(åÞòRòmù*Vûz}ýëøÕÈ¿ÿÿIIÅõHöï/O@%YºÚ>ßþxýòûñå·ïéøóûñ·ß__¿SQ=sª!±e«9_ÕL«ÇºêÚþ<fU§¾éÂêÐK Çmk[jÙw¯so[`ç;ÕbA¼âúÙk?²-dNó±$v§]19ËǰcÛµ!+ >©Ó³Í S)VÄÏ kNj2ËiqòÈgî¦Õ=ÒµÇ\¯<J>âK±Ó5[PvßËü(þ¸S"r2^ÃÇÑt³{© àv~";Ý*Å£Zk¶ÃÍ:ã?4lÇ!ÛߥmÇÒ0´ agÚÞÙ6ÛX5IÉ!7àë6 ys4Ûº©SËÛþöÚôJõ2y e~Þ Û597 +(¢fÚQºíý·×\èÉâ-gìG ¥7»Ýóº]ì¸Ý¢\ÌNm}E® .ày&Ë^:²ufí1bÏ4Æç·ÏñãqòWµöå¸ûoñß®ÉÞP¼Z^g«ã° ÍÒ$bíÂB:q;äqN}VÍOÀýIÈ¢È[\É^¾ã¨-Lm©¼&íg;KÑmy»LÉ£îÈõ@æ)èÁ^ÑSáÒe°k·èëmõ8Gcd7ZÚImvRÕÚQ²ÊSë}>yýOÜøÒ¬",±îYmº«íT=º©ò6åKj598 +ã¹¼0ÇØìºS,(¤×dÛ¾mL°IéݤÔG´¼äÆX`[½ºýp-Ñ väUÿêS¢Ç|8ר7(Ƥé! .ñ~599 +FÝgç\"OR Ög´ècÖ°S¿ÚtØÙx"©'ç3*9ü`¸GÔÑ+¤'öÿè"nke7gÊ+»ÏιF%Gâv, £¾0Ôê-wCXzt³ßKYÈØ\vÆ5&(¼ûûûíNFñ;R1ÊrcM»É° ÐàÍkõ(^ÁT,!É0è "b÷\GªFf÷ ÝPO*ÎÅÇ)ûr J¿m6Ä¥ íw(ux»7»ó±()àzýÌcg\c¢B×°-6±~;ce½Ãoa³ñ<èhåá²S®AI¡@z¡äÔð¸çf©|*ô_ (PeþÉ·Æ#±§L¹¡*pÖÌNx£u¬"®Fã+9µOnýÁ¹F%TrPFªü3l¾MRFS¨¨{·*ë\¯}vÎGPRYí¬ý6ë½1ã¢Ùñ6²Y«Ò ¥z;á'üûM600 +Z¡z0V¦BÝcg\c5¨³Q601 +Üße§q±®6õA¡5bE c÷Ù9 ¤èXê-#'ä+îÖfËí# LU¥ïd¬dÖí³s®QÉÁï¸@¾§Ð+³u§]!ã\ ( >ø3(1IQ°¢·602 +Vo°*ZcÌt«X¨è9?|zä<ö¤`¿øAE%iF.*~f.éÎõ¦X¨¨;·Omu¥\cB ;k¥R©"vQßå¹ Y9Ur¬dì>;ç2±2oÂÅØ3;±aH°3&µcE ³ëv603 +½)× NQl*C(f!7©W¦ÙJ¢MUib®×Ï<vÆ5&(:g¬PC¤/½7ù{f×I»` a÷èR$àIµPCåèJ¼&¤Âö$bE b÷Ù(פ¸REv½} m¸í í¶`³ãÊdf»7t b÷Ø×¤ë½QU¤N¸:³ÏìèÙÞTØ¢x"Ф->ÎÙkTrÄÀslÈ5â¶Õ604 +»fpÜȱ"×ëg>;ç:é!:´`ý#Á§tØÝÏÛÎÎO'¥+}òÎFÎvìQoys¸aµïÙØ[± Îo1°m:°µOäzÁ%ÃÅÛwP ò ÊdÏÈÚðíÒկŠSyKx"×ë§>}>8רà¨LæFµCðEYYúÑ}ÍÖIvò'wÁÜ>ùys.QÁQÞ(£PGacÍÎm6ª¥ÔNÝcg\c"Z¾#*TÁ+.ib#ã[ÏíÊçr'tE #ÍüðÙ(×FaMd*tfÜ¡Oæ½gp_óàgb¥ö+r½~æ3Y5*8zaÔÚ©£MrðÖÎs qÛsé¤XÈøø ÑokLPT¶¼æ7Ã{%ÔʪÏ7ÇÁÝmC ãñ \¢$ì¼ô[Fn(8á¤Î &G9«OêbE bsÙ× HE©"Ñ ßsIm6àÁç\ÈÄq'¼ç½)¡b Á=L¸:ÂmÃußû/ßàÃMaļÇ\àHåáóçMñ÷ G8STr%ΣÊÇåÎÆ@Åî±3®1A.Ru¦ñi?açÏÁïÝîw.V*~ðá)¹9×àÈÑ"£ß*â¾êÄ'ÛÜO>ÆUá @ ÔüôØ×Ná+àJ605 +NI;þø Ç×Û7ø Äx^<"5Â%"zÇcvjèz#È@ÚÛ¸m!Ç@Fþðùs606 +ÚðdÔI@»N$c(þ*6ôÎÆ@ÇîCªr607 +¢|#enÛ`2á"ÓЧÇηFdlÒÿ¯+Ùavï(&~$µÙ9ù0Ù(.JÕ9ÕÊ¡¢ÆUéA¸lèz&îFX)Ö~Q#3p!]÷C3gu>ï<fÁCm2×hd\kâ±Õv¥í¦Ff?cFß4sVhôYUéë<ݸ3×¹ï³aRâJf`£óDLé Íu`:kÆd*¬öÊÓØWè³u¢/*×ó¥²BÃXgz¹èÃ,h(O{_;oâ¸P#3ðqÆ9+4¤p,³êÂp±Ñ°¶YéØ1vae7â1J8÷¸Xiüeûo15môĸÁÕàÊ·ÑÚsM3g F»£Â}´NfÍèÄ,Ímõ11^°_1¯&|å¬ÐVïõò÷Ú_ðe+%E¯-âK1åDì¯Ú+]°êÕv¯¡ñÚ*0/¾ZoJd6ÎeÍÔ5êÜ_Ø`OåÓ`¬§ãE¹®fnbæÔN D< x«GD«PL)¡0x608 +¤ÎÒ4ù¯é¸ÌÀFçXßßÐÌY¡SQyÔʽÊßqVF4¥Bfà¢r°o|h~rBÁ.¬`á!L£ÂÚÐ]ÆÁ½Z4x8#G÷UL9!ÁS!<cvc"çOyK¿=~gàA¤}B\ñÞ#!â/¶ÖQÀ'ÃQÙZÕò0k0gÉø:ÚKTÄ\<´¡³B£óÆ7¶ eÖ]1QnlÍåİJ"à¢õ{¸û¦sB¢609 +©tåÄVD©ð¤K©¼åKÙï\|Ål9#ó#<h£&¡ìá´CPEÃDf`BYGßvm)§Ka¹¯;]ÊÞv_WïdoùRîíy Á#b¾4SVhD³®>¢WAL¿èC É~L%l$.ÎÁÝ9'$«»°¶y½ÜdVHåVµ¸ó±$#\d6¾bvÉEÉ´Fv£+Æx®ðäØÇH2_1fÎ610 + ¹Øµ[ø¶5²êÞÄü@1yñ+ØîÐ7¦]2%u EÄÎlÒoØLaÛ¾.å&^lBö|;óüüòQ,ÿ9sB¢°NFùÍjtuÀ611 +ÜÑOÞìÄw6Úu1#éZ6Í5¾¨´QnZ_WÊÄëþ¸rìE)Ø(}ì1fJ612 + ¥-5ºÐÈ*P¸'K^ÄÀ /AV W¡ùIê2g× 1ÏçÄPâý7B"1k[È©rBbTäj]¦! ¸,ܯÀJÌÀƺÅ+»fÊ613 +Æùñ½M°×:s2{i#ÀcÉ|1§fÎ614 + ã;êX3ÁX¬1fiM\1¶qß¡øø95SVhH3Førgæ»s¬÷®ãñbj$æùù3æÔLY§F¿9Sië°8£ÁÌØ ©Ñ xÌóóWí)%+à@-_L{àz`.ÕWãÃ<ÿ§Æ'+4J§oºø` ÿþlð!´¿¾Ýe<͵nÇ^qÿ±Þ¡S"1ÏÏ_!_msøpÅ ÄÀ®CãÇùeè¸uây~þ95?I!Q(á}Ç?2 $J½Ü^LÄ<dî=¦Ù?Y¡¡ YFøPS2cÅ(k^õ³Ý½%Ä3æK3eu ¿?¨ÑàcÖ^½q<8Z¯µÙ ÔV¨ççÏ»m9+4úMg6úàôâÉÎ+ °Øè±3Ê®ùI615 +]ÔÆ \ûËÿ íÀÂÉBw0pQY$ßSóó)aÃXywhyúÊ(ç»Üa#3°a¼«"ÆhëÕLY¡Áº\ 6DhÃOUo¿¾2nÀÆ¿ÑPÌ1.Ùä0IGn³dÊJ;Z|W£Pkg`cð}cXÍC3g FTwÙÂG /#K Fª¡øh¥î1§fÊ616 +«Ú(<ÓÅ×Ó1/ÃâÝÞÄCãÕµ3°qÆvÚ¯æ')$Øí ʦx)Mµ©öF,³Ä8rõ-BßPL)]¡ÎÞ)íÆÔYf*½{à\+52óée94sVhtLCÂGgÿokOLU 'T#n!Ø8CNÅ^Ò3617 +.*«uÄ+°.\¸ çdg`£rÖ#æK3e F¶V`ÿo:±Æú[ÂqUxg`ã1v¡BBx `Üyù½y¿·¬+fcg0£¤×´¤¹g ÆÅ¡Ù ã\ØjPÊ/Ë´ù èmi(d.oÂ7f\dÊ h<M:]4ÖeóO[|É©wü¯ÔÈl4[L4g¯fÊ618 + 6©zÇd>ôÆ®^À3æKóÊײó#æS¸Dº¨ù¸T6^;Â5{ÓÌI]Ã~ùBSWû½X1µûüߺ0{9íJÌ<`xÞ®Ah¦¤ÜÁÚ*môNÞÂ:fÇ£Ph<Z/Jd.XAÑyw`N Ê׫²íLå7u ÔM¿ê&.<5Zb3æL9!a1ß &L¹¦å]¬ë´_ بx8#NÅ619 +=?tú{³sÖuØ'æ³O×ìNÌ.N©±3¾ßMsÏ620 ++&OÂÇ\e¿·nq8Ue÷¸3ð1Ø©¼1q©³B£ñB^ñañciÚ¡Y/#Æ /Í 3è] |VL¹c<Zâ±[ü>2ÞtäS3g :áCÙÕË@ðøÊÀØâJ>2gråB3gu :"ÛCf¡ Ærâ¸óa*½P"3ÏÏ1fJ621 +x¾Ií³¬wæÄYÏPËÉbéÙ¸8B¾SNHT^Òh¢òhÈjN® !QZàFÌÀÅSytB3% Õø@i`2ã=(ÞÙ;%Ö430¡<ócºIæØÀeÝ&íÏ=~Sæ´:622 +kWìÄ"ÎfDdÁ#%$.6þLάÞ5:oå'î¡é`àã95sVh´q½é£ñU%~ 8#àuxâÊ&_Ðü|´ÈÃ/Íþtcô¯=QÌ©Åf"s(!Ø8B623 +ß/¡sBBÙĪûÌà:qW`¥Æ»92_1wÙ4sV׸~×l-×|êyt÷ádÂkÁqÇßÁy~þ¹V¯óQD6÷Ujü¿Êü½\Y_w l·~¿.}é«5M)+4jcÄuÓG]mIûÝÕ®Gûý624 +ýÀÞz«a¤Ja¸ûC¶çþÈPuÒØÙã¢$½ìuTÜ2Ö8&bf$ßõÍ&P]4g¯¢Ñ.QÑ|¦·fCQ5d,äÔæcf$;ÍÙ«hX«L#£]ÊBðݱ÷.µ»Èí80oÛW6«æâT$rîcï«Lè?á/mYpÊ}dr-90ÆÑæNsò*1öf×ãÃ8èêÈ$8ÔEcf$PÂbsÔ½æ/ÕÓÅ$£®¯'®]XfF¢8Ô´(N.EA.qÌèØLiا 'Ù÷ K_bµÉñìU4JÄ$DHi4,ßpÎy`7Ñ ·ØÝÒªys*£²$×ÃHtcGÜ·24°hÌq´IäÍÙ«háµáf£Yø¸B§éö!!H÷u3(q;±'ÑX{ ¤kcïV<PWX ]yúû£Þäd#Eoº³#/n<WXtþ¥m=0o"¡ÅB%[ñäô²ý4ÛçvþþlÍë¶VÆ «v·ü?3Ñáð¾põ.:WË{ä}ûöbÎϯÖ\_ÍãyÚ jC¡æ~ÚèÏ^ú;ùà .>XN¥-H¹Ø:Ê¥µCÚ#Ì¢å˨ã?0Eè'Æâø(÷.µ qè ºEuò11HÔç<+°625 +ÙÔâu(RqùÿT¹µ²°wü÷Wó{~×ËÕPû3×ËÇäg÷ÇèG626 +ÃÞøÓû¶£ü «ßHÂ<R@ËÌvÕawîTPTwò§P¹²ð[æ GjRáhÚ²£zà`fÉËö¾Éw&C 8y¶í·ó-KÔ½YI¸ùä>¿aø ÝãÇ? ÿÿ ÿÿ ø endstream endobj 28 0 obj <</BitsPerComponent 8/ColorSpace 29 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 64/Length 880/Width 64>>stream627 +85#1J4-mc,$uDF\-WqA:`(d1NN)Zr>Z`g_3,7ML[4;Ekg,L&ct+bUDHM/Bc<^>M)U628 +`%.b0muH*;LgM9PJ_1]cMjk`M@.!0""MVc:<P5!^aoL=\\bJZs_S\-R8d6fa^<e$U629 +(M*#i"5Z&cHh=/R0A*K;gZ.aiJQdn3#6$(V`/&u/PepGoi-p[So=q^2@g9LrPQS:=630 +@pj'i8/2645A1*WodB[S5d^<\5Q3@dh\c.;I-H/RIm%2(6&qOf:br+%j7?CQr6DRb631 +JCFPV"%N-ZnY>f.l0euCkRU$kqBN`HU#VaY)![_CFCjAYqB&uI9`OI[a2u^e2Z4qQ632 +Jc=?g?h!"qd-a+<"'>?"!Z^5*CS^t:4h>l#ii."`X+s3o5M#ZaFo2b3c[Qc2idc@S633 +kO=P-=8`:$OnQ2^r\9,QKAG/Z#/8so"8sl(p<[IA&cLB:i-/RaBsKeu?g>NJp_\s,634 +b"k+l^0.7gPR6U5oBh-"82r7B+$6-JY5!7J6&/s:dkc)oOpM+q*I:fe%-Te102aqc635 +aakhermj1--V<-jc\\P\q2YH5rlI/.!u0UdNu3E'I'3n[S:73C2[6!2E7UZ?aV_dl636 +T(W*nn6,K]2?l-h^@eZ%0CXVZJ*VTSX5D%`+7G6hY'SP]-bXFOop<sFeT5]`DWrfa637 +KBDeJTJm;CfNImi5U$E8oIj^D/,^FbY5[k7psf0/Ne*>leZDfGlOi)d"oUD`UOS@Y638 +iq(0@ebUfQc/=fboHbKoD/@*;r?H`IP#'##oisBO/3[1H;.ol,<<)Lm?93E75Lq_+639 +YMXHYBCW71][+M`ofUjOkO?[>U2(6g/b:PXKs1+8Hm\j![5J]5doUGS1\#e3H_6/p640 +#64c(rr<$!s8N0$#6GjY~> endstream endobj 8 0 obj <</LastModified(D:20260321161439+01'00')/Private 9 0 R>> endobj 9 0 obj <</AIMetaData 10 0 R/AIPrivateData1 11 0 R/AIPrivateData2 12 0 R/AIPrivateData3 13 0 R/ContainerVersion 12/CreatorVersion 30/NumBlock 3/RoundtripStreamType 2/RoundtripVersion 24>> endobj 10 0 obj <</Length 1557>>stream641 +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 30.2.1 %%For: (Nott, Matthias) () %%Title: (PAILot.svg) %%CreationDate: 21.03.2026 16:14 %%Canvassize: 16383 %%BoundingBox: 707 -846 1227 -326 %%HiResBoundingBox: 707.074770252821 -845.881486652068 1226.31735818324 -326.621012464111 %%DocumentProcessColors: Cyan Magenta %AI5_FileFormat 14.0 %AI12_BuildNumber: 1 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 707.074770252821 -845.881486652068 1226.31735818324 -326.621012464111 %AI3_TemplateBox: 960.5 -540.5 960.5 -540.5 %AI3_TileBox: 687.196064218028 -966.251249558089 1246.19606421803 -183.25124955809 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: 506.06067895579 -419.011484846167 2.1615429790394 0 8266.08092564465 8355.687044383 2548 1384 18 0 0 6 50 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 506.06067895579 -419.011484846167 2.1615429790394 2548 1384 18 0 0 6 50 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:560 -840 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 11 0 obj <</Length 65536>>stream642 +%AI24_ZStandard_Data(µ/ý XªpÁ8.àhÓÀüçy\¬á¯Ê<å` ÿU^LBÝdO1NSñ#c|ãk60PáBÌLNO(Sª®¶º-H.½ÍÝíý=V1ròró³aÄ[ckswFZµù9zú:{»»ñr¹òåËíïóõ÷÷ùûýÿÍ#õêׯaÓE<ÙÇ?uì°4((iÔp»yóÆc9¤2Ëe±sO=ºO?Ì1礣:ë:t¢D©h#nT=2ÈJ643 +-´¦L4iÚTS§ö7¥RQ+Ù©Ò 8P!ew"bBÁ(áÁP,¹ÂÁB@(($$@@&4ⱨ q($<ðP0EGPD°@ ¡8644 +645 +E646 + ÇÃ"óp ÄÆÆcá Æ(@ ÆDBGBÅB q(DÅ#b647 +#ñ`BÄ¢ñÀ Ph@("`¨ ¤ Y( µÂ"(@<0ÈG X qP4`áh<"( 4 `8 P¡á8±x¨ ñ Á(űp<`4h Pá¡ðÐh8,,C1aB90ÔÂB@b j@âñH@,Ôó=î|ÿ3OÁvX8hhuñ20ÇÄ @±0À:(Jw`â`8ÓÐg°¢¸."é©jíì¦#˪¼øæ0£#è§}?ê_H󱺺ÞYò§ïÝ÷fcKØaP,Ðh¡ °@³PQdx<4DÐ Á¢áÁP< ÔÀX<(NC_C1A ðGFâÁhàëá0 ¡ph$ð648 +DGEf¡0ÂñX0649 +àP@T`ÀLÂÃaEO?H²â!ïæ»¯x ó3@ÍÿvX4°é2@61~Å#Aa¢t`"àHL Ðp,H £±X<(p@!ç !Åã¡ xHLpÐÐÌBA4¤³Pap(PAE ÓçÀòHLp4b±ÖY(CñH a$&@C£Ñ@ ÇC1¡BFZX(w§¬xvÈbúùf_&x³á2»{²êCÇEëÖ¶$BÁÀb 1 x«3@Úa`@ã<0650 +³°PÒaP4`@Ea4LÒCAñH$Fc±à!äÑ@Ày aP@< ,,651 + Ç# Ç£¡ÁÑXåL,FcáP Á b"²Æ#áxDTp Æ#¡p X4 °(¯=]gsr'õ:õm÷£õ+;ýt.M«RY ûoáÚaIK,em¹=©^./·{9Åýà+e¹ôT!¥¬æ¶))ö?(¥_}K©\I¥LsêÔ!Ü¥+®S§P¥;\f(dò£ek©¥2ʰâThj% ÒI¨Ò.]½//×%*fö¹I_ ¬3<Åu|Éò3Ss³³x~<*jò«Ñ£Hí-n®î.o¯ï¯I«vm1>FNV^fnö£®±³µ×ÏÒâþn<¹ÂÏ×óè3)e'Kp§O&V2u652 +U*U«XµrõÊ$[·p¯6ë,´ÒR¸¥Q#Gå>ÅË]Ê653 +%Tì0uUYn£*j)»SÛׯòæ ¤J¥VZÈ,³~ùêÅk×.]¸n-¥TI654 +©£^½rÕªÕ*U¨N¤J'}òÔõ¥ Bè 5ê²^=úóÿ^°[Ͳ z9÷Ö¨Q×VòäÑÌU5ݹ11-J§4èï½x655 +òûûf>ÞK=,x¸l]²tìcÆù67·ç¶-jiiÇ<zcaddÅMÃU:gÞ»ðj¢ZV:滬&Þkä²à±` a( :0T:%âtû®õ[bH¦·b.®s'`Ú¾5º·§{b%â4,§a1»C9dµ÷ðÓ¼CÙ;ÕüÖÒ,1äÿó+ÇiX@´\@iÄh¢DZGtÐ9Ç?~úðÙ£';vQ&d1æ6lÖ¨Iæ²^}zôçÍÿû÷óïëçãßÛ/Wùqãïîíìëêéèçæ«U§F}Úô·wéæÞÖÎÆ¾¶^¬81âÃתMö¬Ù_ß^Þ]Ý\Ü[Û²TiR¤G¾º¶²®ª¦¢®TåI&DxÐà£cid\TLD<4\§.ºsæþüúøöôòðîì)Kì±7·6¶5µ4´3³ÒÀ ÊY1dÊìðòöúþΡ[g¨ÈèhŤ''jläRJsYÍrKcI+Ên>N{Ö×qmU1n©0¡ÁGwô5.bÈ3³qºíxßÔÑóϼÝm1 o5²LI]u)§}}¹ä¢9wú¸hÙlùïïönëXÖwù¤VaG©¦.ÿ¹-·¸Èý§l?ÿÉ?%µj¬Z»øô%eÑõÃÂo*ºÜæ¨bú§ik)t©¥Ò1ï]Ðt´Îg´ôeyòtv7Ä%ñ1®Km*EjÊ««âaáã{vËJ¨/+c¾9˱Jè¼wÙ=Ú ÓVªïÂú½¨÷N¡W´²À¡0¡í&ÿ!h±}/2»¾çÚ¦³â¿ºùvÂËìã:3?úvbbÈ>+òúæ~j;ß&Ì®Öjþÿׯ!i¸ïxêúÍüobȧe&k¿±ê÷YbHÛ¥ýkÚ¦j§&³¦9¶Yöçv#ó'V0¥dWR×ÃT[>>ÊÚÿ;L]ö/æ ¤®²Î¿Ó4%%tÒI/ÑiìUÅÒ×·åL©¢Ô:çìÑ[å[_W4ß^®ÍRá]]U\%%JôÎê¬Uû÷Å:a[+FÍk¼|yõ¨I8B¾¥Á"õ©4(¦·)YrëÅd¯Isʼ«ýý:þÞêê¸úÕ§", °"<sbE;×O¾ä4Ì´ÄÊÚns_ç1'V¬,pXHàX@Âü÷z|¦'o¶!תêm¬Ùù«xϦ®·®øé¾ê¿éiIöbb'¼~ã覆{bÈ%¾¡!¢õ¢»¢ûj®eîoâ¾ÖÚ!Ë}§è¾iÍo¶Ùú¢lËúÆÙ|¬ËÉù&¿=ÉFÚZs»â@*Å(óÞ§*èxâ:ê(tÐ9ÇSü8+BÆÙl9cå´)eòE³¬rÌ{ÞJ)¡cÞ»óÞk«¨656 +:żæ-K¥cÞ[Ö[657 +Ôåæòö(]ÑS>E^©ÉÉ%®<=MMÕVV]]^^ß66! !Ñ R¡a¡(05,WE\ýuôuÎô|Ì·DdÖÄÑä² 1Q00S, Bâ P<ÐËÿ§ÎlxíkÖËØöxRÛ×óóâþîީݧ6ãáñ¢ffÚ;Zþ¯5^>jÔUºw·Mw;QDÚï/iEò´QÄEÜg>¾´DÛÏúñììÐý=m{/ÑF6ÑïVôGþ½ScÆ}¾ÿ\¶×NL2hÅ;*{h>{´w+Þ¼ZYUÿÚ³PyoN4//mmÍ2ëóCÄ,ƨUV]Ò®S~þ+'5*£õ¶½hI PRÆ0rs7ûêUÌïOP¼\¤ö¬4ý«Ê̮غ4°bÅJ)gi¹^¸èrc9üüÜÊÊx©Õ«SS<¥©ÃZøRaD±¹*:z&øãÿ¯·¡³á"2¦cÝÚëµßºë3«ò©¢' ç½ý3k36Zúõî¾{ö)çñ&ðîßs/¯òeâý~ß뮽Ûüiömix®wÈ®èÍ¥¨Fý¥¤º¹jîëìEÚÚßÛçï÷ÿ£Wo;yöB/ÿæ &nw»gwg·oÞ)vçÝåÝ%¿îª='xÁã}Åù}k¦LXN&zRJ§ræÐ:]bv±»ÓT)BdHtÎùÓgO&6£ýÿ~"/ïí«íâÄ'y1x«|Z%çRÊRU|LV Em*¸;v0r~g½zö¨hͯÖü|©ßÆÿÖ¸ýÚjïlÈ{§¸¶Üêÿ¿üÙªfÆnØí5rÝý!¸\'ÈÝ]r0²¿%·HÂñ% ÷ñ9ç%owbÈÿªqo?ßj-³¥î)þ2§ßb'VX«J*ºåQ*ºÊº-\0¥ÎAÇ%L8å«£R®M µàZ%M¹JÏïÏ.ë{m2O§rÇe5ÑV¾ÒÉÉxk£Ê²©ÊòÅ»ðjAeé´bܪ!¨ÔQÕ©2efh £ A(ÂhÎî vnFTBHDAã(1B ÀÆ!¢R_,Wd'£xQã®´/ëÙEý¹[ùEÈ73â7ç´Ã}ù¹¾t¾7 Î×_nÿ{:¥B°\2-{¡8Ë&¡Ê Ʋ[7¯æP@¶.ÎWrW6××JoõöÖÔ Ìéma]z+¸àä!¶,·IT÷´µ>xZ¥ÐÐs¡ë$io&À`Áa«U~.¬Se9 ²4ÛâI¸!M-B§Öà/Ágh`5ÙaK~ß§¯Ójù?Àëv·üÎÛ¢|âý#ÔÔÎO!³Wví¢¦M¶R)jª?P7PiìY©EW§ÌgA} 2o¨ñ5l±ì5MyÚMÙ«»Fx¥%+Èg¾ºÓLÈó_Y0ǵ}nèh2'±Ù1'Ða]ýϾL«ÿâ7|Ï|.º*<é?)¨`Ä@+jdIzMñªáp¦%;V¶Ä¤I}ÞCAAØ*tö3enRÞ*ÐÄ»½òUÙ´ÉÅVi~lX0§Ýïáé¨R\¥&.0TD!íz-9¤¼Á_ïù$û<-÷aU]²NEiá ë3b´²I4g̦ßV«ÂÅü<«x]¦²±é±Ê/ú}K98[×-yÎ3'2_ÿ%>D«!ÒôÉÖ¦¾ÔÕº´ªöV𽺲iõeRu+ÉQö ÉS¤®¡úËÞ-"'ºä)@}0íP·ËãÙ£GÌI'WRæQTgüÝ`¥úùy~-adPÑÎÑÂ3A©[ÚZ!u658 +,HKª/OR¶q^iJÕ"Ëz\Ósd·ù0>wÍÛH5 8>»[Ô&>c¤¦O:ïK®gÓyYÌÙ2Õ·Üw+.'^¤}!CéJb<¶Ã2Ûo¬ÄNåä|k7JÒª!yæ¥q_z!ël£xÈ .Ê[ÄÖ&!1©Mychj óôk-,u ÕvßÈZ²Í¡Üâ3Îfñå2®°2NÓi2®Jõr2ÁæZd"Éi)XöVÉb±e¿OpÕZvN9 åÖS =ÏÈmêüãe²}cijKx6§ÖÎ[9<YfÇaÒ&fç¢÷¼Â±¸!ë659 +V=ÜR¸±L±EL%Ê3Ñ í§´Øª ¡YÈÏæm¤tõ`³2AKÔÊÔÝ[7ü($^U°Ô²±gºÍ4Z÷p±¦BRá¿¶¶¬¤Åoóù§èò÷æ`) $³× 1߯=jÔcÄj!ZÍO-ùl²VL«æöÜ´Û>³(àøoüGè ÀbÕ¿cX¢¾ÓÅ`éot²Á_¿S¸Å_|zÒ<u|n/'Ë6ÇØú3q7úO˼ëX)9µôG Õ O_%'èñ ³gûp°PTãâÝPp©FØT-ê[éßÈêä+¢åJx g¥$3S`¼*y°þNxwá×àaÁp½Lùer¤>D-¶ *%Õθ8@ Öé¢7B²J @J¡¬G©®a¥Ù¯Ò3MkW½JÛUëÙnÁ]Õy¶C½9ª,àH'%Ö¹ïîíT7ê¨+!ï`ÕÛ_ù/Õb~ZÊÄ5º¸Ð4CæyÒ'660 +yÌJÇ/Êk3'ä×'ÄÛPtsgÙ! «bQ¿À >r$0661 +úÃL@{ù¹ÎH~d!ˬ.ùiG:?Þ îüçÞ¼8ÊD ¢hÇ̧qÂÜÍ@2í¤<EÊÀTåNªa4bÍ x;»{vê"¨P"±^öȵÒ9<f}tHyãå;g°°¢,?Õ@:©yVk~ÅFîÅpµD¾p`58FÉÐ ;WÝÁPdÿ662 +âî×R£ÒÝ(7Y¤´¥aô_j¢ºdæÉm L±ÙzðÔRy³!pÝPþS-r£üE$¸X=ræ¯_¥Ãת`¿¶¤l°?qwþ¢t2º}¤W²ÑÞ7³² ? ±¡]~ÿ&¿õÛZdêBÛÏÎôÎØ!Ð îªD&0v'ºR~¤tÌÊCe³äõýðI%ÞÙ6Õ#·Ö+ªý_[öîeVj¦3d¶;fäÜn6Ïí¦ÑTÿø¡4o\˪D£¤Q3S(U0Î;jô|ªÑÞZ¡;?XUp£¶5¯?ÔCbØ;öÓÌLÓtR \w{¬!ãÌè3BÁêÌN>·°÷iéqÙcذcOù1Îl0z`Géùùx¨>Î}5¾Òì663 +ð% huØ«n Cß²5=§ºìP\×\"¥1ä\åÓ«.ò>çz?§¥8'2ÞíÂÛåUrxßQû W1ÕÈ[[Ù¦9õjm6AÃU¹öñEzªi¬J±ÛóT\ÛO>6§Ú@ÍÍsêÚú7'¢DJ´qЮCZ°¡\ TÿL3\%DéTQ-æù¢jðC)âì¨Î KAÝ<¤[â!¹ FþÜ\ɹT)bùó Ì+âþôiº\uíã6KLL¥'îTåÔfêÂÕ¶D \ÏЫv+ºÇ®E·E ÎzÚZ^¢ñÛ'¸ÕtOZ9èòkÐçÇ&òbóÈc[iC¢Ù³çB×àÄÉDÅ,×ÚqpeÌâõdOmOÑ=édÄøïnëÄ& ²ÿYÊ Ä f@¬Jîÿ·^HØën,Rj¥£óoËßß&êo×üg&ýÈþÂþ!-2À)̪)Úzi sÉIRR,X´ËJDn²5\54¥{Vé miI®ùÖ eÐÀ(R¢¿Þ£N£5z4gØ4 &QCг©þCzÌä(A¢eÍX¸ttLÜ"a[Jì³Ö¢°]RPÖ>ëý²Û0àpù´à¬/¯#häÝb `_ÞÀ&ÌP¡¸jéÆz óWÛT,<&pék¿þ£kÌ7SQuLypLùju¼3T-O¿e¢#î¹ÃíÒwŹä_ï°Ø²Zÿð} #pP=ßG÷ö!yG, nâТg¼ýäIY zwä{®ÿ¶ÝÃ!lO)m»¸ÝÛ ö¥Û=¡êâ#ß7dWCkÜ×îßÉå£xyD0A}épü/o¥à«Âý©ÄMRh¶«A¤ è ÌÌÌ Qñ8E3zw°4 vED¤ÃÀ2iÖ.«Ks: GmÎFëcuÀ4ÍÀ#?ù¶:³bMÎ WS¿µ)»úiêÖ6¿ø~ Ó±ô¶ùo -êã)-à¿Ìf¶âÙ8è¹ ,W¢Ûö°ÝôQ7àôBYÔ/Y>:Y×ãg*8Ý)>¿¥}²$bËeÓ6¾=®FMMkü*ZéÆÚø±ÆèGQÌàz cjÐè§f_Ô 8Dëÿ@ñ/Eÿ:Æ×Q×ÝÌ-ÑB|¨uG£(UÓ¸Æ|¢}ëD·©!m-Þ`q^ÍÌ5ËÑxÒjd)ÑË(S5«&ýíjï~{s âù[)}9Éç*tæ9È®2ÉEH¦NmXZ~N¹+åÍ«¨i1eë'ÝþÀ»Àq,$Jo;?GÕo×xB³®Ø1l8 ]tTjJì ÙÅÆ;[Ñy²WÚù7Ôb:h£EÈI$Éöå½ÜõMð<'Æ"½¨;²JÐweN®ÆDcÛ·3ýÂî¨Í¤Y<¥î_Üuø3Ü-«¤REÒe¹*5¯Tj7`¹+ûsN©;æäàÍLÙ»øBð=öRÊ'N/m?[ÈÕ@Ö*XnçÔ¢'õK7GØÐÙ!¸è&ǼôV<o 'Ðàôõ±ÚX<Ïk0MfK"|~½©0@jûÐW{¤©Q6<Ý\ñ!Çü@VFì¸Å1664 +*"LêNõD°NîõèðýUY]4!;(¤7LáÁTتB¹+äРç_ZÄÁpHi¥OZæÖd)ϺÄ2á]=Ïó³v´úD ÑR\×dGº¢-G' ^iâPdÅ·RìÖkaó·ßHiuF2*Ñ$=à D$d5yË2HyCÄó^ª9ufV£É¿è$¸üßúG©ý;<zý8±¥(¥¤ØQ¦öûÃÛ,¾)ñâÏN^(ã(6,Gñ[Qa1^Q÷5é3Üüjgº=æ®úæ5.¬´p° /Ú)ÿ¼¾Å B¥/aTÿ3²ôµ¦¯SÅÔ4yó§jÝx5 òD!«8Ùr].7Iö æ~D1Ê}ÑsÒøã%Àl¦æÅOÈÆQ ¦GÊ)y·«vq_® <¬îk9üðâ\ÔÐbV'HÉøãµe°*dGuTGtÓø ý&¡yPh6Öí×dBª#¥ÆûeBäÚMã#Õ]ÇTþA(Ü» @)õAmtð Õ?á®7ÃñòÇ]Ý|;ñÇ?ì7}P\åß =Æ:5' ,×sóô~Gæì@MõÈ pR´'çÆcèÆÄþ¹5zñÍ:¾ÙX0È¡âES± î þب|!Ö³YXû\6×½çÓ°)j¨Ü°E;X9ÂÈYÜ/ ¶Wkp1vÕ~ë!¶Ä2BzT6)ll ¤<ÇÔ665 +FñZ÷¸õ&QV MÈ v :Óg÷IT!s,4òC"dÞ¯f<=ýVЦ©H.º.çî»!uy]]Ó³ºf$D2½<Ó;Õgeñë%s¹ÃZÝ¿z±¡M{eó¼NÓAÉÌ.ɵ:l|,Õ¼¬Q¢i8}Vví¦ì+¯éå2ÅæxUY¡¶[HúÓÊfQRØö/ÎY}suç¶ûÌVh¹KPJ½Kã'xL¶¯?%l²EÌ666 +öTrDF8_%LwËÎüÌ667 +{HÑÓURå¬Rz668 +Mè§·+K¢ÂwzÔáùE\I¥ª ÔFmYh£µ½hc5÷èηÿ¼\ØÒ¾òÑç£íClnÙØxÛÓ <@ò>BiµoÁCN®¡ 2ÏÀä_J-Ùèav(ö©¯~ÊFǺ<Ò~gwWà ÿ ÷=ì}cG¶ºÆÖbì¼L{¬þuÎÙYÎ?,ÁW«}Sôb*+ÂqJÊ9íäðÁUÇ\`è íðuóGú}ï}k669 +/úD<@52cMÓI¤P{ò<MvÍz}U¯<z6ÑôâKïkI°{ìçU9Sÿ§o¨Î.þÉy£Élö3ß:a¸ô(9\2a?^üuòãõôÂçëwwÏÂb®ÜI`Y7xx a$ý8½ gþ+· K`^"ýWE¤¿öî5yk¿+£ßòû|×»{a÷ï&Ô»Á÷=â½âddx¿<K ]1H[g.è"á¸/âÿÊ[ÀVÔ|ÎêH:,ìÀ ¦Ö©ÔûtD ü¼dYôÁ6 tåOáÿx¿ª/s 9Ƽ¿êP¤Ù_éÌýµ$üa3á_¶!e¿Ó*ùüº§õùúþwy.ú_oË_9}jÖ£¹HÐÕ}ÈTm¦ó÷#Hµ´æ,záì=^|ÎÏÒ³Q;¯â/ЬD÷+ú< ìéÀðåz XÊxÂñpäLf¸y¯ß¸Ç»1ttJ48ÝÅS®T<ʤh5ùÌAö8ZIðÃaIvV£q7]W.ÎKÐ×4ÄUÄÃ=×e.È8½Z|õùG~8ö-gø¶ ïURø=;AÜÿÔ ÁÈï[eþ÷Â:z±ô Ûêúqü s7§Ü-8ÁùNRø9|bïy læíà`üÙéÆ/8Øoqdå@açÝ4G˦3;Ƨá¼tlͯæ"I·9Bò|XUµq`öSC¹Øöí:¿ÚwðJú6ýéZæ?Êafö¿($ºH²ø¶²[;0àØv-â&/åμKàou¯á a¢Y QæUçÙ³|Ìft)iÄEÌ#fÌ ôÁÛç¢ ¨µs#IQ£s¦#Ýå¼Þ`;;çßvÙq»A°¢ÿ¢köb7ÙØ½w²¡ Ln¶%\¼º«ÌDe1Ýeýï~ux»[ò®å_·ÒØ£@kã¨FŰBtoª¥¿J \ø\ÐæT¼,?ô »5®A¦&wM°ð}ð.öæùÅÿ#ïËÒQSªF670 +=²*LBnß³zT6? ÖÒÊðI¶õC_ì«è3þ{1:671 +¤¡}ÎÜ¢uw+ÕïÛZ°Úι¿°:öHÅìrÇÄÇáx w[ÿvív@Úp´Kr:V 7ü½á÷ì672 ++òÀºý¶vïëèàèÆ)]ªÌ©¯[®-Ñu>tÓ8M º[í°ç=ló¬°e!°E¯0zí¤[òméòr Uê«e6dàµ5ò2+²g673 +893~÷~ÎbR#)êIfÛ`æ!ÅËÈ(³þ·:ÏZ¢)kõ¬uWË#æÕJEÕzCµÊZH-Q«ÒV71 ÈÄyZ-9×ÇÄi¾"«»¤Õlb£e`L´d_²u¥UDa|ÕÑ×õ°jcÕ¨ºngÓ¹o%®;z_~v÷|¬ÕÈak.ö¹-¼·%ÂÛ·!ücLw¢pßX»°Ý·ý£ß¸ïH´²e߯üËs\èßTÌ|;ëÚ[v9ÏòvÖÛ£2ZúvºwHPÔm±ou%ß:µ'Ð674 +F[%X{G~]GpND_»:;Ã8Î:#³6oÖM<kù¤ùeͯ¬uïèþæ3ë=aQõ¬åGª¥IÅÆôÑØÐ2675 +ÇÚõkáZÑÕŵ=ÉRĨԨuË£°41õ¯¤YÖ`^ÙEñºÒ+s·r©ÀÚVzÏʦîJ-âWí*µo±OQ¾TÖØ<DiTökjÅÐÕu7ìr&ëm¥çnÍótª°L©ÓsïH"èà3°¨ïËrѵDµº(¸"öè6 jÇîm¬·;u»?!îÁæÀáý÷/±¬î:«cw׸dÊßµ~ìt´ô´/:£i\ÐÝ®b®â2è¦Ü¤[>®îIµ0-ýø1È{LAä³¾ ´ñI(>ÛPµM¸|À§ô{FÈ÷f1áÜ¢VÇ0«r"`ÎLz2fZU Ùø`ÅågTçñàj]°¥-¯P]^Ó7{f}Ï-§;Eõ󨝣¥½V)¯*:Liï-SͰ¬©ÑbKò676 +L÷zÝ3ìèRT¢Õ= AÎ.ox¥ÖÜmí3ô@z×øaÝKæ5Wz>e£ÀÂi$RØÒõjBíB¥ü űÚ3ú:ÓÓrçWk×/{Õ #¤"`üQ` |Ì}tÛâ$A'ôòçÝMÌ#aa]L]up0oiA9¦kKOg677 +?ôå¸OºñsF·ÿÁ¯Wu=Ñ4ËåEUä´ÄäUÃýÊYEF1¥oÉõü9°tc?& $Ã÷f~(üérj}@6¤ÿÎF"³ÿÉiTYN[fɸ©¦wÊZ´0Ñ,#ªÃúËËôî¥vpÒÙä?èÐPƽéäZõ] Yüe+2ç:ôÂrbÉß#³ÒÖ°l,à}ÑWÕw½L¯òGÄÕ-»oQd®Îé}®ü¼U[©i+ÛìnX«µn´ºeîÓ9YV±2¼aÕå¶ÀJÅW9òª¦®:ª[õµVÏ*éÆ*¼WµUÅUyªVÿ¨ vÏ[H8¢U\=GsöTË Zâ(ôP%#ÉD.F/¡ì¹°i ´m§1 ©4ûµ§Àú5cYT:r#BLb\ÆÉ·(|²¶Øf678 +c)Y«+YêIv¿È679 +ÊÿEëP½[}ÔÚ=Pt¯<%KíúÀ3»Æ-·`lÜvFò,Þi¡ÏeâIFÿ*A¾÷äºãª<eÝ J<Àÿ´lù$Ðòæ)0ÂNDóª³hÞËdg|Ã÷¤UdU]7]FM$jÉÚCÞ4áëÜíÂSFkÖ«ìÓ?jfpUÌÞ¶ÏZiðU¡bAQóg"þH:7§ õÑ?+/¿)¹aSñù͸¸Ó¬6ÅcÓþÒ×ÔÕù¸XsâRíÔu¿Ñ¨Wò§¥ÁjqhºÕ ¿Ãådl2¥;yûå&±AºÇcrV úÖ¶>Ñ|ebe(ó¡Ý¢¸P¸¼ß½'H°ÐÂF´Ó±ÀôÍ rX ®ýoAfÖÔÔ|ÃÐÇÁÐo²I+\Å¿5v¦Âq«êöÓå680 +ó¯9Ae0N1ïQòÀVVæàÛë$,w;Ùt¸i¤I@ ê> (Ê .?âá681 +S~Ó.TÙB·*Ê¿¢sAÒ682 +5#.3Qðܯö2±ø¡Aì·¯i¸ïO?¯âú·Ù55é¢t.Az6~¿à½ÄåÊâ=óXµ>]$ÏFŲ^Ãv¿ß5Mâ@÷]hKð+`:EHçÍ3ÌÐC5a¥OZ>Éã®·|'ZÚkrZ¹¦ýWdÐ}/¬I×n%µ9ä<ÌOQ´<¢åÁ¬s,"àm åÚ0¢k683 +NÜS³5EZFE±684 +Ëó®Ù3}¹Z#? ¸¸GÌd2Ir ¥JÓ}l¾GÈ<\¸có:BÌáôé§<Á}Sz¨ VJñ4i!(7µÏħêgà¤bdˬqÆ@1©¾ØÔb{5µ¾®Âçô'Gn_ç+§@§cµÑ·ÞU]V49`V]5X̼5¼wézò*6>ÇæÎàF³è#ºÍª¤'NA V\Ü#v^³*úÂ9d2L@-GúÊ å{<K¤Æ´=ØoÛ:N -{ÈáúkôO¥QÎ-iýÁ"ö%"J¢^rDï(ÿtë!;DbÌ¡ª¹Dö`ÛCå(Up©_JSj|óHªnT;UVV)¾·¥©wAá?Nì·3Ã%í2%Õêг6ùÉt- X"c¥þRª()yo685 +IøJbP&m¯$ê¬C4êI» 0i»(qU¥¥(ºY 6¬ÄêBµÑjèb±/º #1Õ¤ýTûÄö¯íØí2¸¯UÜè<r Ø8x¸&¹-uyÕ\]îfôÎou*7kò¢686 +D|ÎJ±ERÄf¸|\¿Â{ rîv & 'öÛ3I\ûy&Ö´ëùôöéÿê=PçzêP× :bC=%*¬E-F»g´:j]´¤¥Ò¤%§ÒâÊwðK½ò=iÊÓå h| à y:ïùFãì)%:õmËdeé^Ú½ LÆ1Zͨӿ,<ð¹óx÷ÆäÎÜ8 9W,>È#ÐNÝå£Gé¹Cë¶tÜò=ȩȿ]1;:ß *þuÈè´æÕ)ï*ê ,X]t/YqË}áj~áAz#^ *;õm¢=sâãò"ZéòfArmm¤{L!K}ZÏ.I8Ïí$à] 4Eúèh"3ó)ÆeTa\ÍYj§¿Zn(CüAº}½4)ñ0©ÉOä_ò±"Ó²»þ±¸Ý,¨ª¿·åVã×>ÛS.ØÕ¯5%{«À¾Lö687 +´c=?ùNÚpÈÈ(\Ç¿¬ ´z÷ïH¥¯HÖϲÈûâ*HÇ´Ã )©-+´¾¥ûßÊp`ÆÑØ\¹³é@Oª´4,þÑ¿¿dBÖè688 +Ðà ¶uoå·R`ñ9iK¯Ma zJÕÙÆ qì689 +s690 +Îãî1µ\×rFÓ´xO8ëýÆE^KJ×ôNÖ6Ã×éÙSÝà V¡¸e6ÌFhª@¾ ¥ê0«dFÜ´3¨gðÔSZqUbÎN-Pó5I±~yQ¦¦-¬Z³¯GÕZÚiÆ÷øÙ%êþtÂýSéÓÛÌ ö²kõѹgø691 +(ÿ)½þÁz«Úз¾«Â Åä hn,±ùP/0>3î¦Êxãò8ý!&ѨRñ¤lJò_£>µ¹i¢þ¼:SòëÎ!ö:DuÙ×D`pïÚMÆ8鮼ØRÍxÅÇϼ°/|*¥a Ü¿N®XÊt] §½Aÿè§ýEâ>@äÿ¥0Þì÷göÞ÷,bjüð^©tÔ>°7ʧéXLR¦$e*zCÈ&·y<U3ã5aBS*©ª¤qÎá?&¤X,³ZwíóYØÌÔá¼[±ø1N:¡¾æ6KE;(x¾DUgÚ þ¢¾Kj$¦÷ú°¦ÓÊ+÷692 +³LUõtéC3,CÆ%2þ=U/M35ØSëÁé:ïùD)ÐØ91x¬Î-é+(z^5öΩ693 +«¼ÒÕ^ØÞ_¹H*ÒÖTw5Kk69E=6v+³©n#Þ&!}(Å(îCÖµ÷[hi¢î¢i(6Q¯©=Z÷U¿U.#¥ÜÍE´4Ht&êAó×È"¬K+Rå$Ä·¹6+$w½Õ×#_uÄPËöôDå¬<ýª¶º]&TTì£!¢x^¯tf¬M}¡uÐ wïK6<øCJ$}VJYg¦3ÉAF \É|jHµ"¤{\1ìW\(v¸¦ÖdÎ;{0yPú>YR!S1ÒÂSZ.¥|&Æ«åüv¡¤å¦ÝGkå"¨A#ºi(êáÒ#óIyòÎ;X hæ$s¨-Tw0wQáËh¡ñ',]$¦ÂÔø¸ù3T-½¢)èªg²à£B¤ep>w}ñ¤ª$&è´ßLÍÉG¨/3!ëMÈue\W1¶Ç®2ÌØÆ´Ï\È×5«Ê(èyQ%ým¾:õD$®N<Om.< Ib¨fç|£²h»b^8ùGíö;}ù>òG`ñ;:Ĭcp¼ø³ áfEfåB.òɶXJg(ê÷cR¡¶o¤!HßTÕÔ[òëóCaD¦]LE84ÖiàMQ#hÝ4yÖp/±_¯ sg]ì ²5ÉB|.xFâøÂ dY¿Èká£",üº%£8$4|'FJqÜ» ÿ"0E694 +þNÇÒqB éÏ"È695 +Äy:ä7¤B±>eþÐ.¡ç|îÀ#TûT@ x*As+äQ]_1¹;øWÉõ§%2#áÐî+jÌÈÆò¾Ü*9z<NÊÛÂÙàÙéu:Äv0Óý2&;¸L´M*ö+¾ ²rìÉ«ðà,Ê 1S5ñp\¸Ï¦aãúÀëeã_Áí®Ï3¡V3áï%âè§ÐoL²Ï%XDg&ÈsÎëP.y´¬¼*#ä{!TÁÁ Gê(E4÷ïà PÕ lóèD§!í)|0b4÷õ'M¢³R°g*ê{RDï¶nç!B¸ Ï.qñçªÀÙId3ÇópMgétXîÉ© 4Oï696 +§¥÷ãaj²IÖú3¸&IÏÒÔXö¦ìÚÄ/ÕÈa<ɪ z륨öÚ[h~«yØWt¡jë'°ïØú¹ òyn¡-ùO¡>M¢ÛÁß"ZA¸nD*4+1yÅc)¾âË-²Ë9ÃX4¥Æ hYû697 +E$× |îàåE«ðá1"!¸²Â_up1äAl±<ø698 ++£(:á5?¨*òùÁ,}Èé ÄÅU?¢vd«¸âÁ<ÔkV¡ØyO1ÄM*7hÄ=aT2îë2´^Ð\á^6à· Þ¦ÈiÞ®Æ/Ø699 +äÊ~ÊM:kÔ¢}céYÑ µ¢¹5!)§WÕNJûÔLt*7P÷Ÿ³°¿adRÆ´¡NQû¨è·Hà7©Ðå700 +þ'xyñA>_4DÌô*©ðØX/SÈÜV¼ßzøG}5hNîÝ^§ÓhºOßá[?SåQp´rÊÃå<"ï¡rzCêÃÖßW¹ÈñIæafdsãËDÎØÐ©£_ͪ½$ 4£YhǪõv<Øì#ðu <©ÑÔ%¹çBÂh%;ÔlZhÕ/ÐDIè}uh*³Þ~[ß°¦HºÄ(\¢¦ìP'VÐ×Gpì ®2úxð÷¢Vè;ÐÇF§â#§FzÂä#à(Þù»zª=ÕOBB=Ë"êÉ;7X¸½4fꥪ¡¼øÁ:VúzÚ %ì_l/701 +ü>/ úú¡0?à\<¨®:t×"v`ιé'Æ¢1:¡¬" ñù9+DÐÁoþ@ÛëÔh¿702 +¿Y¸<öðÚ¥SRyµé;°é5Úv@o´½¦ìsεæHîP1ª|Kkg7DêS E¤Õ^¦¶F¹'×Cò ÞAÙ,±ÌZÃg}êP!!Éï "B"Ôè|9I`wЩ)ôÖ(®~*ç?T/§703 +ã]\TÛ¡lVäàAw {3é穵?\Ô}Î*Ãhh¤ü<¯ÿÀîú§jD<Òj´è;Ã@ßÁTE0µV?I¤'RÃÔ¸0ÁÞ?8½ þnô/̶ÛE ]i¢A'&³ OÕBmDкºß¨704 +8gET#XEuµY×ÎWäÐsÚh<X: î4óé7ÕÑgæmPøx°O÷À&Íær}P¤)'Gbáª<X?·¨¡ÈM9@á¨hJdsÙ(<°¥Á?(`²ÂÐHÔ=óró×='¯Ån×8¿«ÉDÔÜÃ705 + á> ¬Sóµ&x@1ÃzÀÛù:6"Âô©Ì; äTÏSï°Ü¨9¨¦Ê¢VmB$â@j6©,~¼ã½#°ÙÈÅøCÀÙÄ"L+°*D$þ¨$ÈìåÐz+Ô+L&½b£)GëðF_æ5a}9HvÀsoñâ+!½E ½t° ¡ûÕSø¨á²yHlpå >àXΧé\O :à¶¡/= âßËvQH£þð«~ΡèÀÁ pp¼ 7A* D706 + J0 %À d Ø @ à3a2p3àL7÷Ì¡"Fðt7xr@C}¯aM§¡j¼ß!¡&,qØÐÈWùÄ4IâHäE@wD&ò707 +Î4-嵺£"[@=¨OåÜT¨ À(@= rå`&ñDÒAKR)%¢C)¦O :0¿W Ã'¤×ÁX"Ûäàò0uÐ)Þu H¬¡|°¥!(Øfù|¬xP½Ãø`´ÇjM0T>æDBùÀ½©ä%Ã7(,çÄ<b*<øÁ=øL*L¤:Å708 +Åð`n(9xÅödd¡rð?\^BbxÐq^µ]^úCí s8X¥;Y"æ¶%ð@.l¹.j¸Ö àà´¯dfANUÎò4S ;¨yí?èG¥¼²ÛÃÐoÊå`óQ¤Psþ]ä%jØÊÁHØ9ù/¦Ás0tsäÅ/Kh¬Üe18y 9XåãN ó@Vaæ@îÚÂ=!rúÉ«*á&åàe×ä póàs@£rÈgHÂÐX ÄÑloâA ÅShÁr0%tópÒ2ãñYpñÀU>Ä)~Ä R<xÔ=8·O´A à äíAkF<Yªx0óõàù!;ì<xÜá=_/Ã?709 + Õ¶ñµDØ$8(qÂ#6¢ßã0Ùè´RªeQZ ó@ Ð Á \ " °à/XÀ 7A\ðÌ`)hÀb p710 +P Zp ÁA|À8Øà`*#+0?¸=GjjT°¡JùTNu¡ÇQ÷°ä$-Ýï/vTú $FèQU%87åÖÁcUÍ* 8'Î1ÁsÊ7È9õi" r!SÒçÉ¢3Úá£<ôòs Ek a<7IE©n yw«"Oì sÚ<tVÐ&ÇÂtI,dúÑ fjìÖNä³À0 _x711 +õ)Ñkâzý`©yÍ *ã?að@dd3¤ eEªè'x9çÁr£ÒíøCEç:;¥ðú-TgØ_áÑc! s¼!é9¯+:Æíê¯Zxþ¿H&F¯¢Ãlá^>æYæ,Qyö¶>®õ¸+tAAÖG#ݥצiÕAèÊ´© /6¡zÅﯫÎÄ712 +ÂZ\3³xíËda«;LBÙS-Ùa2ÚØ¢ Ui2i2á`ÐÆþ¤(D48wM713 +§HÇODòÌ÷² NèCKênî(Ê.#ü)Jh´kh2ù¯EDJC.<1áCq"æÜH áJnÈPùBAø]ä³Ñ¥ääK;úH80ÈËf ÎZòI3¡ØùÏPqED"J:zCO%âäµzäH:¦¡Ü'^%²$SÄU>¥G±Ìè$ #s¾RO714 +ÄPnDÚL¼ôæ`7lZ0ÕLP0Üð|4jÍD s¼9Ïñ¶@ã UÆóÚÁ:#³JMÆaóþ®©715 +ÄÖ~ØjÌ¡I';é QÚWD<ý1bS ñ yð>A¤8ã716 +ªc¼ *Z[f!"N(H¡&YÂØ¹bþ'Þ¢jwñv 9¢717 +é2¾Fô8B¢Le!ä ãr*£mN{¤¸@Cª4©"äò*j"Êc !íC2 -æõ`Ð9| ¢RiØØ õz<ÚÂËÄ4ky¸*>Ê4E;JæëM(V¹HB±Ì&¿HÓÿ~(Ô'¼{Æ#B§Z*718 +3ÓòO¥ù/s°Íü~>sÐ Ïô/D"BmR:q9ØÄF³ÏcãiHuPÕù*tGÿJËg´®¨ø&VµXNÎÃ{`79 ö.ñj;E(é§nêj¢.ÍD]²Eê5<¨ôs6ßÔ^Aî¨ù®/¬zpÏø YÌaì!=bÊWOyáæ}ð UùÀ#ª@s¤ªtù HEfµª·üU©·Ú|Þêkñ W¥FD<ª>Länàp<6)º)#>¯ù®([ù^¢Êwi!µKCa3±¼á719 +æLÃOlB¦=ÈÇù5Hò 33»q§J¢bafå|ª##720 +µ,ª3 ±,¦ÕùÈÔZÃñôyzªc0 c) ЬWÂÐÔTõK¡vP ¤®&¬ÛÄù8d>Qý ðPÅZЧeâù±¢âú!ûéÏä»Ïy'"L-PQµNôJeçLª"Öï ú`2UåoS7*}SðÌå"721 +6ê/ q<ÏAq%È@s0B´µZ©òBõ|àØ+t ¯Z3¾722 +ò ÒÀ «VUTB:McsñAm'çUÑA|0§ÆÁ >xËdpÆ+rö*NÑùB>/ìàiNíÅ2ÒTE0BèÍ¥¸ÝîÍëÕÇhÁWÐ<>Y:¸Lx8¼Ú¸-èɪÕA;31$!¡èÀâVë¡Ðr)TBÑt*é®)fQ$®723 +¢ qé¿% nXþ Þõñ×BüÎE?ËBg>.láÌ¥àÐ[ËõÆ|ÁCg~PÆÔº1öγa¨)úÇQÒ¡/B¸ØDg¡(êRS´,[JËB*YÒç¦Pfk-ýüh¤¤WH¡ÂfÏa½\¤þv éשÕ46= V&qè´Lt ִNÆDÉîhfdqµ!.l+S 7cxHsS]zD´æytN<ĵOM.5±ñ½'¬¤Çj¯£¢]9h#c«'S,)Q5LhÖ8õ¤8øEB¯ÄÖ"éï´3k»á?pùó(©'ìÌl}:=óLO[)¾Î4V ³TÌÅBsÄK°®æ1qH*5åãæ¯|øeÜú¬sÕ+Ä[ aÕÐ%ÒÓjùéQ uÀr=HDüj 1HDY724 +k©ëGIdátàÄ$8V#a8 ;¸hdH÷;*ÒÁЧ(.NmuË77Be.TUW6qæzgN©FN5×IC¨0Ã7_õ725 +eÉ @ j ÀpÀ\PÄ ARÐè^@°@!A726 +Hà¹A &