From ae9ca74ac66c3ec4401a49a48286f9a961c2b322 Mon Sep 17 00:00:00 2001 From: jrosh Date: Sat, 7 Jun 2025 16:14:00 +0200 Subject: [PATCH] upload to github --- .dockerignore | 30 ++++ .gitignore | 3 + Dockerfile | 57 ++++++++ LICENSE.txt | 21 +++ Makefile | 166 +++++++++++++++++++++ README.md | 160 ++++++++++++++++++++ beat-harvester.service | 24 +++ docker-compose.yaml | 21 +++ go.mod | 8 + main.go | 85 +++++++++++ screen1.png | Bin 0 -> 116480 bytes src/broadcast/broadcast.go | 90 ++++++++++++ src/config/config.go | 57 ++++++++ src/handlers/audio.go | 289 +++++++++++++++++++++++++++++++++++++ src/handlers/common.go | 90 ++++++++++++ src/handlers/handlers.go | 205 ++++++++++++++++++++++++++ src/handlers/video.go | 133 +++++++++++++++++ src/models/models.go | 26 ++++ src/static/favicon.ico | Bin 0 -> 15406 bytes src/static/index.html | 97 +++++++++++++ src/static/main.js | 228 +++++++++++++++++++++++++++++ src/static/styles.css | 243 +++++++++++++++++++++++++++++++ src/utils/utils.go | 100 +++++++++++++ 23 files changed, 2133 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 beat-harvester.service create mode 100644 docker-compose.yaml create mode 100644 go.mod create mode 100644 main.go create mode 100644 screen1.png create mode 100644 src/broadcast/broadcast.go create mode 100644 src/config/config.go create mode 100644 src/handlers/audio.go create mode 100644 src/handlers/common.go create mode 100644 src/handlers/handlers.go create mode 100644 src/handlers/video.go create mode 100644 src/models/models.go create mode 100644 src/static/favicon.ico create mode 100644 src/static/index.html create mode 100644 src/static/main.js create mode 100644 src/static/styles.css create mode 100644 src/utils/utils.go diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a1957e4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,30 @@ +# Ignore build artifacts +bin/ +release/ +downloads/ +temp/ +logs/ + +# Ignore version control +.git/ +.gitignore + +# Ignore documentation +*.md +LICENSE + +# Ignore IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Ignore OS files +.DS_Store +Thumbs.db + +# Ignore development files +Makefile +docker-compose.yml +.dockerignore \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab36831 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +bin/ +release/ +go.sum \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..df96ad5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +# Build stage +FROM golang:1.21-alpine AS builder + +WORKDIR /app + +# Install build dependencies +RUN apk add --no-cache git + +# Copy go mod files +COPY go.mod go.sum ./ +RUN go mod download + +# Copy source code +COPY . . + +# Build the application +RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o beat-harvester . + +# Runtime stage +FROM alpine:latest + +# Install runtime dependencies +RUN apk add --no-cache \ + python3 \ + py3-pip \ + ffmpeg \ + libwebp-tools \ + ca-certificates \ + tzdata + +# Install yt-dlp +RUN pip3 install --no-cache-dir yt-dlp + +# Create app user +RUN addgroup -g 1001 -S appgroup && \ + adduser -u 1001 -S appuser -G appgroup + +# Create directories +RUN mkdir -p /app/downloads /app/temp && \ + chown -R appuser:appgroup /app + +# Copy binary from builder +COPY --from=builder /app/beat-harvester /app/ + +# Switch to non-root user +USER appuser + +WORKDIR /app + +# Expose port +EXPOSE 3000 + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1 + +CMD ["./beat-harvester"] \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..91f2b41 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 jroshthen1 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3f3685e --- /dev/null +++ b/Makefile @@ -0,0 +1,166 @@ +# Makefile for Beat Harvester + +# Variables +APP_NAME := beat-harvester +VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") +BUILD_TIME := $(shell date -u '+%Y-%m-%d_%H:%M:%S') + +# Build flags +LDFLAGS := -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME) -s -w + +# Default target +.PHONY: all +all: build + +# Build the application +.PHONY: build +build: init + @echo "๐Ÿ”จ Building $(APP_NAME)..." + @mkdir -p bin + go build -ldflags "$(LDFLAGS)" -o bin/$(APP_NAME) . + +# Development server +.PHONY: dev +dev: + @echo "๐Ÿš€ Starting development server..." + go run . + +# Initialize Go module and dependencies +.PHONY: init +init: + @if [ ! -f go.mod ]; then \ + echo "Creating go.mod..."; \ + go mod init beat-harvester; \ + fi + @echo "๐Ÿ“ฆ Installing dependencies..." + go get github.com/gorilla/mux@v1.8.1 + go get github.com/gorilla/websocket@v1.5.1 + go mod tidy + +# Install dependencies +.PHONY: deps +deps: + @echo "๐Ÿ“ฆ Installing dependencies..." + go mod download + go mod verify + +# Clean build artifacts +.PHONY: clean +clean: + @echo "๐Ÿงน Cleaning..." + rm -rf bin/ release/ + go clean + +# Run tests +.PHONY: test +test: + @echo "Running tests..." + go test -v ./... + +# Format code +.PHONY: fmt +fmt: + @echo "Formatting code..." + go fmt ./... + +# Build for multiple platforms +.PHONY: build-all +build-all: + @echo "Building for all platforms..." + @mkdir -p bin + GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o bin/$(APP_NAME)-linux-amd64 . + GOOS=darwin GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o bin/$(APP_NAME)-darwin-amd64 . + GOOS=darwin GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o bin/$(APP_NAME)-darwin-arm64 . + GOOS=windows GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o bin/$(APP_NAME)-windows-amd64.exe . + +# Create release packages +.PHONY: package +package: build-all + @echo "๐Ÿ“ฆ Creating release packages..." + @mkdir -p release + tar -czf release/$(APP_NAME)-$(VERSION)-linux-amd64.tar.gz -C bin $(APP_NAME)-linux-amd64 + tar -czf release/$(APP_NAME)-$(VERSION)-darwin-amd64.tar.gz -C bin $(APP_NAME)-darwin-amd64 + tar -czf release/$(APP_NAME)-$(VERSION)-darwin-arm64.tar.gz -C bin $(APP_NAME)-darwin-arm64 + cd bin && zip ../release/$(APP_NAME)-$(VERSION)-windows-amd64.zip $(APP_NAME)-windows-amd64.exe + +# Docker commands +.PHONY: docker-build +docker-build: + @echo "๐Ÿณ Building Docker image..." + docker build -t $(APP_NAME):$(VERSION) . + +.PHONY: docker-run +docker-run: + @echo "๐Ÿณ Running Docker container..." + docker-compose up -d + +.PHONY: docker-stop +docker-stop: + @echo "Stopping Docker container..." + docker-compose down + +.PHONY: docker-logs +docker-logs: + docker-compose logs -f + +# Install system dependencies +.PHONY: install-deps-ubuntu +install-deps-ubuntu: + @echo "Installing system dependencies for Ubuntu/Debian..." + sudo apt update + sudo apt install -y python3 python3-pip ffmpeg webp + pip3 install --user yt-dlp + +.PHONY: install-deps-macos +install-deps-macos: + @echo "Installing system dependencies for macOS..." + brew install python3 ffmpeg webp + pip3 install yt-dlp + +# Check dependencies +.PHONY: check-deps +check-deps: + @echo "Checking system dependencies..." + @command -v yt-dlp >/dev/null 2>&1 || { echo "โŒ yt-dlp not found"; exit 1; } + @command -v ffmpeg >/dev/null 2>&1 || { echo "โŒ ffmpeg not found"; exit 1; } + @command -v ffprobe >/dev/null 2>&1 || { echo "โŒ ffprobe not found"; exit 1; } + @command -v dwebp >/dev/null 2>&1 || echo "โš ๏ธ dwebp not found (thumbnail cropping disabled)" + @echo "โœ… All required dependencies found" + +# Run the application +.PHONY: run +run: build check-deps + @echo "๐ŸŽต Starting Beat Harvester..." + ./bin/$(APP_NAME) + +# Show help +.PHONY: help +help: + @echo "Beat Harvester Build System" + @echo "==========================" + @echo "" + @echo "Available targets:" + @echo " build - Build the application" + @echo " build-all - Build for all platforms" + @echo " package - Create release packages" + @echo " dev - Start development server" + @echo " run - Build and run the application" + @echo " test - Run tests" + @echo " fmt - Format code" + @echo " clean - Clean build artifacts" + @echo "" + @echo "Docker commands:" + @echo " docker-build - Build Docker image" + @echo " docker-run - Run with docker-compose" + @echo " docker-stop - Stop docker-compose" + @echo " docker-logs - View container logs" + @echo "" + @echo "Dependencies:" + @echo " init - Initialize Go module" + @echo " deps - Install Go dependencies" + @echo " install-deps-* - Install system dependencies" + @echo " check-deps - Check system dependencies" + @echo "" + @echo "Environment variables:" + @echo " PORT - Server port (default: 3000)" + @echo " OUTPUT_PATH - Default music output path" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b4be20 --- /dev/null +++ b/README.md @@ -0,0 +1,160 @@ +# Beat harvester + +(another ytdlp gui) + +A music downloader app with a modern web interface. Built with Go for maximum performance and easy deployment. + +## Features + +- **Modern Web UI** - Clean, responsive interface with real-time updates +- **High-Quality Downloads** - Up to 320kbps - limited by origin, with automatic metadata embedding +- **Smart Thumbnails** - Auto-crop and embed album artwork +- **Mobile-Friendly** - Responsive design for all devices +- **Efficiency:** - Idle memory usage: ~5MB + +Screenshot: + +Screenshot of UI + +## Quick Start + +### 1. Build from Source + +```bash +# Clone repository +git clone https://github.com/JRoshthen1/beat-harvester.git +cd beat-harvester + +# Install system dependencies +make install-deps-ubuntu # Ubuntu/Debian +# or +make install-deps-centos # CentOS/RHEL +# or +make install-deps-macos # macOS + +# Build and run +make build +make run +``` + +### 2. Access the Web Interface + +Open your browser to `http://localhost:3000` + +## Prerequisites + +### System Dependencies + +The application requires these external tools: + +- **yt-dlp** - YouTube download tool +- **ffmpeg** - Audio processing +- **ffprobe** - Metadata extraction +- **dwebp** (optional) - Thumbnail processing + +## Building + +### Development Build + +```bash +# Install Go dependencies +make deps + +# Build for current platform +make build + +# Run with hot reload (if you have air installed) +make dev +``` + +### Production Builds + +```bash +# Build for all platforms +make build-all + +# Build for specific platforms +make build-linux # Linux (amd64 + arm64) +make build-darwin # macOS (amd64 + arm64) +make build-windows # Windows (amd64) + +# Create release packages +make package +``` + +## Deployment Options + +### 1. Standalone Server + +```bash +# Run directly +./beat-harvester + +# With custom configuration +PORT=8080 OUTPUT_PATH=/music ./beat-harvester + +# Background process +nohup ./beat-harvester > server.log 2>&1 & + +# Systemd +# see ./beat-harvester.service +``` + +## Configuration + +### Environment Variables + +| Variable | Default | Description +|---------------|---------------|-------------------------------- +| `PORT` | `3000` | Server port +| `OUTPUT_PATH` | `$HOME/Music` | Default music output directory + +## API Reference + +### Endpoints + +| Method | Endpoint | Description +|--------|---------------|---------------------- +| POST | /api/download | # Start a download +| GET | /api/health | # Health check +| WS | /ws | # WebSocket logs +| GET | / | # Frontend interface + +### Download Request + +```json +{ + "albumName": "My Album", + "ytLink": "https://youtube.com/watch?v=...", + "audioQuality": "0", + "audioFormat": "mp3", + "embedThumbnail": true, + "cropThumbnail": true, + "outputPath": "/custom/path" +} +``` + +### Download Response + +```json +{ + "success": true, + "message": "Operations complete!", + "fileName": "song.mp3", + "filePath": "/path/to/song.mp3", + "albumName": "My Album", + "originalTitle": "Original Song Title", + "audioQuality": "320kbps", + "audioFormat": "MP3" +} +``` + +## Acknowledgments + +- **yt-dlp** - Powerful YouTube downloader +- **FFmpeg** - Audio processing toolkit +- **Gorilla** - Go web toolkit + +--- + +**Note**: This tool is for downloading content you have the right to download. \ No newline at end of file diff --git a/beat-harvester.service b/beat-harvester.service new file mode 100644 index 0000000..cb1f27b --- /dev/null +++ b/beat-harvester.service @@ -0,0 +1,24 @@ +[Unit] +Description=Beat Harvester, minimal self-hosted music downloader +After=network.target + +[Service] +Type=simple +User=musicdl +Group=musicdl +WorkingDirectory=/opt/beat-harvester +ExecStart=/opt/beat-harvester/beat-harvester +Restart=always +RestartSec=10 +Environment=PORT=3000 +Environment=OUTPUT_PATH=/home/user/Music + +# Security settings +NoNewPrivileges=true +PrivateTmp=true +ProtectSystem=strict +# ProtectHome=true +ReadWritePaths=/home/user/Music + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..d93090e --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,21 @@ +version: '3.8' + +services: + beat-harvester: + build: . + container_name: beat-harvester + ports: + - "3000:3000" + environment: + - PORT=3000 + - OUTPUT_PATH=/app/downloads + volumes: + - ./downloads:/app/downloads + - ./temp:/app/temp + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3d991d4 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module beat-harvester + +go 1.16 + +require ( + github.com/gorilla/mux v1.8.1 + github.com/gorilla/websocket v1.5.1 +) diff --git a/main.go b/main.go new file mode 100644 index 0000000..7bc59b2 --- /dev/null +++ b/main.go @@ -0,0 +1,85 @@ +package main + +import ( + "context" + "embed" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/gorilla/mux" + "beat-harvester/src/config" + "beat-harvester/src/handlers" + "beat-harvester/src/utils" +) + +//go:embed src/static/* +var staticFS embed.FS + +func main() { + // Initialize configuration + cfg := config.Load() + + // Check dependencies + if err := utils.CheckDependencies(); err != nil { + log.Fatalf("Missing dependencies: %v", err) + } + + // Setup router + r := setupRoutes(cfg) + + // Create server + srv := &http.Server{ + Addr: ":" + cfg.Port, + Handler: r, + } + + // Start graceful shutdown handler + go handleGracefulShutdown(srv) + + log.Printf("Music Downloader Server starting on port %s", cfg.Port) + log.Printf("Default output path: %s", cfg.DefaultOutputPath) + log.Printf("Web interface: http://localhost:%s", cfg.Port) + + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("Server failed to start: %v", err) + } +} + +func setupRoutes(cfg *config.Config) *mux.Router { + r := mux.NewRouter() + + // Initialize handlers with config + h := handlers.New(cfg, staticFS) + + // API routes + api := r.PathPrefix("/api").Subrouter() + api.HandleFunc("/download", h.Download).Methods("POST") + api.HandleFunc("/health", h.Health).Methods("GET") + + // WebSocket route + r.HandleFunc("/ws", h.WebSocket) + + // Serve static files + r.PathPrefix("/").Handler(h.Static()) + + return r +} + +func handleGracefulShutdown(srv *http.Server) { + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + <-sigChan + + log.Println("Shutting down server...") + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + if err := srv.Shutdown(ctx); err != nil { + log.Fatalf("Server shutdown failed: %v", err) + } + log.Println("Server stopped") +} \ No newline at end of file diff --git a/screen1.png b/screen1.png new file mode 100644 index 0000000000000000000000000000000000000000..4927c4717cea062128a55a0dd0d0ae53e751cdc4 GIT binary patch literal 116480 zcmeAS@N?(olHy`uVBq!ia0y~yU^Zi5V6Nd{V_;zD>aq7`U|?V=cJd72;Nak>;YjIV zU|^6eag8Vm&QB{TPb^AhNYBg9P1P+^yf&VtB|=u5d>|YXOIn)}yswSA^xhj*Z^BZQHl&Sb0Qk*Sbmz8oG*3)Xsm{)?%#Ea_9TIGw=IjcF*?RwEO1cn`giOoiu&In=>`fXWqQ| zeD`_d`xoVYd^BuUGpqmV!Y=;(FqiFP6CT&3?1M*l{E^$YTY63X-e;$MHL7_I>X|J) z^d-n3?(Xsf<`XV|zQR!xbFNfDZ~ptBhTCh7J`1&NyD%|(Z}j!h?LQZuwYk@F>bNlL zddaws<8MPV{Qf0^&uH*cC>r|-Sw0T^sYJ*G{7M3n{yn4fK zNtX2rsp$p%tBwa=_3P>i@y&?3xk6}mz#j(f=@%*-*(dvlUzXmVUA#ZUwr`cH$v#oB z7YtF$v%FVJP4BvuwR+p_i*LOnJ$kR1a5M?nKHB=1tA?5Nx`!|O&y?*Uei=-y|{na;(rYGwL@ZyCLdzcqh&`^C6l{FCA0v-ND# zx-Op&S^COv70h8fM8sE}z1H}*sP@;)`N3cPzNmU^$PYLuI9tKa@sHotZAD_?3CX6j z_PO#mnFXu4=(7tsDVqlT-+1fOG#=BWY|o>=vqEIo27Z-jQV;gpa;^R;>ncCn*B6@p z2`XLZ^4;udP&4g<#pN9v9r|2XRq;5!y-{=e^O0k(bC;cPKT0ckwH})l$yY+#G?_)I^@0=$J>@!XUpWkC{l%#Px@{3sLcmJz9TB<{Qvr?8ED-F^(;LrWD zf7ATze>>wWe#hj?{LP#BWry%&exW%F=F~m=w<6DD!%cnHWs6qcy0q%pQl<04Qnyb} z@IKjddp1YYV+j_;DwURH^Wnkon{n&!(pyZEuKbA5P&4s5zWms9g>Ccy&+C12gH8C$ zdnWVN4?mx(eHW6Rdi!j!qxn}I3AgN+%2c?(E#{ni_8-|+`Ic8(?N%(Czw^X>^}?NsNCOIRoQqT;M1&&8)ulzUwSdO zwyt{8gOY?NY9S??vR!|7_IABL-UrGXU!B(#E?$>=W9r43OY{hJ?KSvi05l?#E6= z!c#7vUlPz@e2dxM?$$SNr^0o6YO1e0wjKU|yK?JW*Apk-2UocnBu5z~yB{yNF;Q%J z;i9rp@Ezwow)@+*cC4TNeB$)*tIuA?$REsnT*=&`pdp^gi z7B;7cPjanS8qToWsvRDG@oIJ;r(z2SlUDtgwj~d;KWuzFNy1vM^Sqty(XRF9w*9g? zY+xh5lXF$eG2Xd3zh`(OTY9ycy;sc9?>}hP9<9Frk)C)&}c2MzUZ*i z=7sC$UGAPT7R-p0(6L$T$BNys~%-+oR`6^HLf zdFIVA@&5e2dB@o$0S$+nbSo7%27YA;G*uIQ+%&Clr`Yn%&#zc`XE7W))Kuiu3JP73 zr2F#=Jo0ST)rg(=H*;03bLiH4ak3scA}^P)U-jtiW(w0da5UUJMem)8=~{apZw^J5 z#S8W>Up7%Gw)uiOZ?45`tNbmtZ_jLfe*4GdRjo`?=Bpm5-HOwwc+SQe>$LdQ7vps4 z9BYp4_9dlL`@2ClHcf17ymmu7bMxwlS@uU9R<0Lgx>oz?@E2ow-6sz_dP_p?E=~%1 z9Qo^h*g=Nni%n0}S}U~(yyCnyQR?u+{tt$k8SZD5&DV(v2P9u{d-`}qR?IrieS)(W zXy0C*6!duKHM@$r>ZaT3c_+z=IB_Vp{NiCYIlJ)x6`My%5^PZcb@JXJ^OR_ z+O_vtTST}%R4CqF{NhkY@1B)+Kq0a|pYx4-dde0zP*Smb{xwiKKUjC3+p1$vE%j{{ zTt42EwZ-k|l4G*p8h3uOb=%GVY3lEs7J)^bcY>8;7Ju5JYHBgx^U|iXHoNB^o1Odq z&@QGRjRXA3rgm~`3(IVCleK1bT|R&7k1NAUiD2dPN!h=fuV=Dd{$TH!(jwr*@lfAv zYJ_R;v-I00{+`@2;#{m9Z1*yI!i1zlqoc0wh`}=eqCS&-dxET8n_J z$cuNO?I%<3_%B&__u|D#=l1PB@AmYugjFlkoWe;rR#*fHGpTo++MRHC?)L2qw|{3^ zsigq2D?Z~*_?G*{f$IVoSXM-fM1hp=IPPXO|6QQr%8w;MiytNhJ-%mRBDq%3sU*#@ z+Q0YV2lpQ{Ot$=%`X#e1eo@udj)vu@S5^4?9x!`V&Z}(J^(H5v_u7gXS1Qh}<&O*h zw(@9(?*tQ&Rf;X{AwF3l^QxZ3Eo2Da@k2&hezFr|+@rrvjBD@4KaQIyIQ6y05&9`=0b)7z?p`-V-#*?$v^{B}7X@SAv$FFcEOWxWazu>Tl6NjM7tkv@^Rn*%Y z+qJkV1Uh$x$gM4$Ywd2lLD|gF^ea!wuSn_r6V5EXyg6d+lqpjS_w8sYc3mnWCSJU6 zOUvh@OGTzn4UUfXo_o}3?olV-Tv@TztebD1>2Q>6iWb~!%y zS;eoJyNtfKUjKP>$&0Y*Yj6IP+HSLL#^pZCX<`R^;%g7&FK?~3ja$DW>TK}!KYgNG zd+jfD?0b{B@6XXzmmj7A+`Iq(W4K@Y-lWWTMdl0>;b$K>7A;El@bFm_eO}~ODo@gt zAD%Hr+xQEYUAuO(^X1Py-*1%vJbdoi_bDrn%l!NI?r#ro<9g-Q;eVz{?vL{Jz3i_v z5Dw*`EMT-_4fO!A8Fw`C%-%E#JKOS`^=?c zRXleWY+5zz(Bu}e9>HSR+~s>ZqU_jD%N62l(*E5tQd$4eym{5- z=%4qC?VsGcUw`=JE{Eff6^4L{CfU97e&q*P zXSiibo&2)-nwRbNof8Dsa`5vn_O7w9oiy2Crq7%+r1t$~pcI8hv z?0Wvx#igfjgvl;>zFu?Ml^#Z(ZJu08RmU_hUA)%u>elQpOA0Q$UZG>_|L><)R%!b- zvsIRxo~X(xHr3l%cBYs%i93}j-P8Wr<75B1Kruh|mvh3lb=!9qDl|QL^0mx{Yu?) ziJ!yg8@=BjzhU`_TQ#i)I&&g^rPtZNTmR?VCKXqq%>trpo>yI%#P*&4IV($!x0AEG zu!QLQm4bbLCf@+Jhn-AU7G@j!2}$i-xa{)Fi>5QRm&f|7m%IC7+8h_36p>lW5{+hF zFyY<2^51)h%j{k$E)kc{*SISi8qV8vDX4_`%OO*ph+^@{X=)~RKN~iE^^PbD+g@Mm znR)y2rB`JicSp}lt4sX6Q_k+y?=$s3rGk9k?#X-8T=S`Y^^3giufw{&uTMO9$u#Fq z@svAzK2Hg`mN-MXv(I~pyO;m3FP`ej9|YWdXPjXDo8y*pM^|pa^x~4kT+`OvIrWWs zr;L5HOXXU(k{aSyLV75t5nhy(KTq-Yq_k)4BkK}1?`>Khq>aS+$ zTUHrr-~ZF{X61dw%b9E2vix#mPd<7oePfS#`{SRkQ?5$1xF5f4YC1PD^6`$GZ$5gm zb8bxWxN2-+{9pafkLk8oOmlp=&p+xcuRra3clP=TrPlw>eYO8H<=EweQ;eoxzxPjW z@nM;3pP$>B@J+~ks9gDJ?(>~1+u0&+{$KCDCa#J z=GazDX?8ENm>2Jq8Oi!obZSWC*{{zNqpX}aA1l1M=4FhH!o8nWQlWEGp8n~du|G-u zx8MBblPrSRQi@K_nZ4upC&xVTZ5yUN-SF)5Q=R)8+V>v!3l0c!T`T5Ub3KHOSN`ah z)9J?PLHbE^YafKJeYSGv{>Rz3zn}QBJn~=n$&k1ICz;>>Hz#y=@k#Bq$0RD$-|s2o z{wq3jiT<9Ii>F=&RYkHZ3+o;8>t;T^ePr3*^!Xa@M}@C{?)~*^o|GcPt|P~dE5CRw zQdVZ%V?O78Vp`St9X%^l=Wp10ieYb4X?J+xvrU#uW-{z;I4_>NXv;$7)vf%`PDM^U z^FKj+Ywo)1lKkIqu1L6EKmT!O{riPC3cIGo`Bny+K6OpE+?6lBdf$(p9W&2wc=LR+ z&8mv9$`Z@^s)xK{@;ZkLgP$J#IYs<=@t+TIVYP)lJ6QK8l+8)s{e-KypS$vpdhv~~ zFPQowXE$%07jyQKZTSStV|JT2ise1;y}$2F{q}i_uPJ_;)s^HYulMZB!`Pa?C)s)C ze2ty=_n?o_EVpMSRVlqHcek`F^GdcSS{~|qla)8?+7G3d4lijxRvMrzVW(s_K(N!{~h_wek%9Y-f4TBqksPRP!^V3+pz!t zFRx$K5f$q<=HAO%p1UtAWA<~ot+}(S++K>s)jxcnQ&u&9^3<+LOnp;D3Ucm;O{@LF z7`ff|Ro`850e^Pk-@e>bdD{Jz@! z$NunX6Ju9d*SLfRPAZ?GTj_ptQxoETzKfTup!_{`^)qPeEYCjsvy0VQ+B#lpqi|YrX#W2=q3rMbPH)b)^32+^=GTQ9 zx&H@G>)2c{TFE(O#lvu;@)bA#MJ*NIRQtU1nIQiGjeBRj`)yC}(bctn*T=KB$=N&p zVPm>j@s(wh^WIHA`a)&4u4L$&ySbB>NTj~GIXQcK>>A5AXY}&-UAiipc>G@0Z0-4- zd6CL5uV1^+S~u(a{MyFv-=B&pl2uPrt|dv9ZzFaNeZK{5T}=bHcK-ZyV6 ztt^aL-}=Y*|KpA7_mk3Hf2&vAZTw#GOZ4}WWp%b)dn{X&tO^%0*uUMTU&XUeaw8|W z-zb)`uhy@(n)~GQ77h*FzV2r}OP_c7TP|k4_PFNPOSyf24=;QZ`$yGXDu10}>BC8u z;*)CfmbTyi_=G9<>4#fq=VVE3ykM~0=h1Kedk3a8-tD-UwNk_K{L072Pu$zt%sacR z=+NXFS>HadzrW|`wxHkUi^b+1+VOI_L289mXW~|oxmJh1eSLj%!t0Z6HVLo%uAPv} zsP?}d6IkN+bl$;34Zl|UxoNKc_e)$%X8qR6Ubl+tKI`UKw+3noPLaEPWKpZM#jOzI zTMH^q@BjI=eesXyxi7!I=9EA2W1?Zro<)liZLNM*e=CeSuX2~=id@q3eOAA)FnJw~xoRUwXT2vTLdQp)a0~CFfgCV63gW zpsP3Qgu&cZlbHJ6{Aw%zzq{wIDlcbS+`(t%;+sC7`Yn0eq-MqB-34;*<<@S^cGuk_ zy*MrI*p(iaSD(IZs(ER}_gsAIZ_T8$kta6S-*#H)>z2_ae`xFXJIC%6?)6-8I{o*h z{~u2szd7Z_SJ?}z4u7uvcD8WO-wPazqVg?tmiHI$v9l1meCg%n6@l~WyNuh+yVy^+ z&)aW#&;9Z9-u8QJe+~YgneKkN|0r`v&1Ua~4BuB)$h2nkx`kX5jj>IT%$M1guwe54 zuR;5EuADM8{;7GbciubGxv$laEYSU0Vmz;AjntHBQ*M`fU0!zggzV)u)A$*etBeaG z#4e|ueag7E$(Z%pHtS1%+X6Q|OSU_=@y6a_-`HaxZ^+l5TFX~FDR2Mx>Nz*J&DYv* zbN8~(^*qlRmbu{?_kzOwmNHJ1dXc{G+1shl-?|z5bP89#x;nqmH!FF2joS5?4{YCU zH%?gGd;fs6X-fT`8M)?mM_M=HfQe}&HasESa@G=-1|l|Ut%{m zzw()+h35=3?(UwRe65hjR9Yncz3TC_4kvE;BR>S!md~FZCvM#H``-_p`?6xqY!c=E z4|o2amt0u)IWDr8f5U#JU&nXft6IDDtba`IY-y?6Y+IH@{`prQo>Vq1;;YZn{|_ei z^jn_3y8phH@8PU3#nv|p&YZfT$a{N}+{4YO?6d3Qkd6$&N$uY{?i4QUR$u4Ln1WaH(;t&@58^9 z;z1e;3DRF`7d9x^_bn|y? zRLrDK-rapeXL<3f%lkiUzAm<*;%Zo#oRx3lRA2vFBHmf&Se-;>@r@nw44qNJe5?^el%uX|;wV8z}$?{a$a$Ngm+_grCEJWcs`@vM4j<5{oQ zzqnd9ReipJ@qOltl#Ac5p3dqua+ISJaesxn26<_3b5GH(ictyx!R_9`SSBspOIl9!ds zEtAU)OoiHbmic#^b*0?cP;%yUSM=WXCstVazO(#&KZ@_~^yp>(uea{VvX~d$Q0i5+ z`h8~c`tF&=R?GgDa(>6t8hWQoerM%3BLV4OdQdVs!e^ zHO*k+YyH>no-{3=X!F!d@9m3V#nQW;>Sw#Q9=&_@+ab2QNA%@q`b4#Sek)z2tE&Ee zW7Wt1Kb|UoFFwEewr1Ju?!Q`EvhsGTj!vGl;6RPE?fkjbpJdnRsa1XT%zZT{JoM@f z{l%_=@~_wI&Qem-JNEB~6kF(2Gtbxvw#RPAZtih={$t+XIqPlDoO{!Dedg~;rb=@! zDqnsTpB}QY`nzD(xp&F!XRjFg6!u6>zWC3)IZC{0i-znnL9w*F%DZKsjb5+GeUxxF-G|34{xx=fkv%FG3~O*#XEduv^!Hg3G=XE)zuQF8LFH#HJh zLqm3ocHX@d60&7)NyPkpORC?_=8;^*KRc81;8D3nhIQ@nImg~)AA3-inta?mZtl^#S$qj0bC++pdoNO@`Psjo z@9OWLzSh6Kq3n0vH+kEWGZ$&Sikect?#Ti7`qX<^Y@jtTQ-GjI?S>5z>=eg;@p9I{NwqDME5+LNebI$cru5W3@2^Sc1((^I} zoo7sVd8o$rY|qUnOXltku)Pp@d&>4pW}>NUxA)H5-t@mNG$DAa@8K(@Cg1JK%!`kI zSy~-qp|+sxt@oKKq_HJ9<(^DidbCthA)V@0lRxR3eR;wT?#H3GHb?XV1T}O8p z-J9*%m8qS3Y0eQXr%8u1{H*nt-IWWSaOT0s^J-T#L@rEv*m^`QW0I7n$OAjk{>2<= zyVeCqr!U;JODwzkuw-1?JNxFHk@6oeZF?qkUa(m|ecf*J>lukIZW%ZB*?-w2KEbWuD8)QpGNp?6P;*lG_$r^ZF7EpM0~C#>+<50aoZ>CKNEfYuIv-bDd|H(5vF6+lw{C?$`yeg~ZGvi)r zwq#bGUE0$d#rN*?L8H=+zwOflPwo4gE@SonuE+b-+qG9cPDmY9_#F1lL`Bo>Xx+ZZ zkV6~WerGRg?@#csaN&`4OnV|;6P%i0yRDi3+LK#%MdYU$b_ITH^x>Ji{cK~cWyG>A zIkW$=M{V=H-?nX|jOB^M_Ucl%``|ZArR;n~ zLGq6S-mY!?`@3(uj%coQT#nYulWN!I=Jr|TJn;SVSpWKV`@iQ|@2&LG2aPUWtIIq;^E$tAzg%v<`BB1W-qY6>MRn^@%QdtAYu*2Uk6Xv?p+(f?*39zQ(;t@E1S@CWsc37x$(H~0$R++C zf7aZcoTqW$cK-M6H>XRQmCBxFWq!MVxAF46gr2u&zy6AxR=;!k!ozuK7fu{J!Vq;w zz|Gud!Lb!L4}U6EHOtLgc74X@A1hwM)&dAFVf&({`u*0ky=J%E*00X~KhtRH&6*!C z|A{T0w9UuXNOE@C{JdyB{m1vSyWgCV{_Va=p3VKrWQ?5I1eDi-!`S$7C zKb}kpC{0u6w!3ve(_fBDrKzvHN)%GJtq9dvz^Y8b` zE7cFTsV3eEzi`FUSZC*-?^7?cl?yFsQ|Lt#=&Zv}UFJCl8w)cqU_2St5y??$(6x;mz>HFtj zV|zsDP1P6^n_ib<6K!|6utFtoyeE}Be{FsT(7YH0wVLf885f% zVZr(-nvEA1|7Kfoqh;^4ThGk-|Mtwi?w1Lmoch0S8&WfTbwX?NlJ1p?-{_fFHM?d(Tc6*oD=h&F8>-sw{@-(Bb->rN>ym;VAMf>C z$na2gS6)Csh|9N$i{IR-pYVA3raEVRfwW3qEDpmFb277$Fm720X_S(B?TTe8e znRTmbtNL=K_M-cj%Qrp$X#Q62QfA29#K+6uZ~7SAe%(D~$L4Ql5+UOA9wa1M>t9xS zY5zJfuIdldu5CNc+ckR2)y%N`Jum&@$z$vpQdj2QKHFqow)wzME>D?ibNl@#BR>fq z?AYks8MTY?_`a>0Wd@69y>e_f%y<&;$nMPHhdY;L1Rj>OzvBOO!|g??1uNTgKcDG6 zo0}|G!nxU4?BlP4x0aQ@XpR1P+&KED`{g7xp~<@gD)-H}mL5Lqh57fmyuY8)_mnQF zY&o&wZ2IX%|2H00Yx}VyLhICRxk?lM9ewdN_2%FIms-2>p4<>uIcNR-s+sHWXC?16 zyQb-4?3q<_(tiG%w#)l>+0T#*xqLpvC(CB}!(%5OeakUg`9>)!U4m`-r_Yu7C!e4B zouL^0{mtS9D^4s;J*}mEqxuEM&gJK}{D^g_U=d7|t!(f~XyM=6x%|D1)11rNE82FR z_IUUA?BO#dj~lz+UR+dFeDtyXqic2V;Dc-hsF((69I(}rb6z;9 zYn7H*?cOfk-J7HT_+8#&<{o!WT(nqi|ANe4GuPU!w0${i%7d#Bf0bvg*aE+}(bE>rTGjBQNd96*fW?PZ*?Qc(u z7A=_ZNve0o4?UIA*M9#OD$leiG!n1)C@4QG?U0O|V@Qb(XJ_n-d&aH%{<2RpeaNII zIo+>`JAUKr-TjXb+V4F#M^`&yPYv_z&BYdV+h%lGF&C%E+`aV6$Ru0FIPL6%ONpMj zbsJ{x>QBg#H@5D(bxz;-a`_Q~9Qm;IrIM#!*r}P_-h0mFzTwOg?mx~Avu1!zHQRDF zT>8e8xraM9ADwc0%h?TU3S-Q&*)F$R<<w5dfKGdgG%-QSy!WfI!Rqy6nPr7k+ ze`(=+rI+@f6`%ReJG@JO|FhM-yKh#1F{yNYdL`nl%dsO9ZfsTG`}<4kj}sGnP@<8r)b(YN5|9gX1FHT;y@22X? zj~|&9P2L!__Q@QZyGkn=J39N)JpR|MRWoIXoh&4IVY&IojT>k9s3|EQ@_c!1s<&Ei zddxEe&#V>!ryn!AE}#FiA+SGf$Ik5&{x6&FSnbJM5o6OPt)six*S)&LsRe@bAcRt)k6M z9F;~+%6F7`<*Z_SvX}yATXcl;GkRpm{CnkdyR*0FN=0Lrvgs;0=Y@+5HqSg*`+LGY z?WueIF!3-yN=`oc;&%6G{W&h*pFAnMKJnIG>Feiq9Ql5bOR+`3H)PLpx2r4DWuq>% z$M|P0SbM~6l9c|0C2lPCzLz~-Uu=$EH{;~Gzw8?$)-L(_#_`&N#xHNKnO=Cvsn{ZZ zGCk!*fZ@u(nXA5EF)1*#dEV)(p=MgQJSj-ICH>H$Gd(gk6DBsZvssBKwg@cZT~&AU z?egBTMNW+8Zm65B)mxGEKJx11>-?U*@_sRjEgWS<`Mm|bCMC;-x;%U5&kKHR|4!ZX z!6jy^(Av%3L67A^`xk?jSG1UyJbIOG7k6R*Vv~8QrU}+b!d;ioI~lGloW1IJ0Ec3Y zyIWRE_L7Cp?&@pno*9ZhE?OVZV7%;_cvxZk!prKWK^hJmiY)?%+|*@Peyk8)buakx z0_L+~Vv{_3@2~tdM@q5fMNG;Pw;gU$RwXPc63194UD7Mmu zo|GbJcAb6Iw32DnS$7`KUBVWnVz#QRO?72qf7kKAqcd6r4*DH^pJ}T!-NSxj8=vgl zl3$S?s;090mmizx8)_1I|IJ*Bm4&l?RXIT>b)3@@nJm@6Qeyh|$x<0o8v`LuRSec} zczUBnK&j!$rx)s%F3j~>p=O$wf9UUwrj-E=#)+@?-3;wH-EX*Z$8R~#nX-bQwHXCY zlcc^^yq_oK?$^b>!r|ydsq^O7EZ?sz6kt*0QfzX+a6el4x{Lk9ws#>;g-ee4{}$o$ z+-$`Q8PY|(b3%NxLUcqJ949)kICeO7JWy0N zJ!A@UkA|A5T(F_ue-+aOAxW1{PM#H@BeI}q2FM{Cbqi-*X}Mx+%KPU+PM3<=s&5T{ zMW(OX{eIhon}UihNsut!bveW4%EBAg{419n+y4EEMUcYAK#;RqnQU%NStXt;xf0|n z7meVr^Q6AFWCbxZ`saYE*z1+ttR6wiEg#k`kYAXo0``&EzGYcKi<1^IaJYcg#R#nW zer1O)hu$qmfkoh?Qyud5!3v4+g#B;$0+JTL^5_-eDwx}Ig+tM0^^;kk5I%H0WY6+r ze_NeChN-0c{JXzomAIm&$b(%IZb0J6Y{iT#7Bw5+G&R_)R&)4cleG8|$dDHT-|xpe zaa>%rVE=Zvb?tRZyt*~MN0%I{T^OTrK+;~#476b2^`2IysQ=5s4#{X2;rbx?wVVCN z6cMfu5dtk5EgW)2LCP`8Ae~o>eU9$9vitfi{_i(-ScIQ^A3Q5WS7gD7nThHV+^jF= zM1Eq=`}xiJPQi0!n_qQ&Vzckd&iQekN&=|Z`*f#UHWy3 z>AZB)=*o}t+IKvhcReEZ<=nSh&VGzB(7632|J}~lg>_s1#C(|Z&xu3v&XQMOj6>hA z%v^AReR03AbnCY(eIi^1u>$W~=ACcr-5J5lFxPnY_QE5V?m2ZCl=!WWIcEO+YVQB8 zxu<`ASuxcvc)5Ymsdj0jqm!%_*f+C%QMvc#@Y^k3%5`Us`n(J~Jx^8p#5!IVo`vqk zKZLi0{I%11;^E949}FHadiUvJh>7TX(Abfz5R2liOaA%kx$8t9RbAA7#be289Z~&5 zs*NZ2_ZIV0{hMCs|4)9{S3DzV(~gh(@(p*_i-^=8-fUmhfA`r(o1fd?8))un%a5z; zn!a7C=l{RYf1WJzva5Y(dCx}XWUF~xT=^QeyA5)isO7`0w89e^Y+%>EyevF5l*!spY?a;z$bbhN8UZ z&-eWNSXDMp(YJ4^MZf9-Z#ee+Z||Cwav<{iIwseG&7Ir;I`k32iSxXJCSRQWjj|H-@S z->r~edh4hCyMN#Q8+@O4w)^~&qGvA*`2^h~4;M@goOoLNef^>I=wgfLOeH(rX3gSt z&#!R@b(oy{d^5l9=$__@KD+A7F5cdka`P#!Ub^hePw(rlIHlEb^ zS;Kw0{JdiE9DQR;#TJ2osSiF+ao}S85m9SkC$%xqaOKB2w_BNZzyU(BK^jx@l<(%Yf`zLpGr{N-CEvoLhe#uo~u4rdo0{qt<9YL12Q*%hbLjrRJR?w@l_9)onCHeg4udU%fpLaQn9OZxXsI!*i z{OPoh+3St+m;3IP63vO)G;h|y#S-&E-0!VZJrg~z{aw-Tn_P?kU-;(|cyQfZ%PU(; z-?%(iVCDdoPEB);FW*qz%4Ag@bXkYt{6F+D{A7}gJ zpIq}XmN0GU-`RZs&lf?tIkS3Bu6TH)v-m~sTIbiNw(Okjx$@q5b?^Qp`Au%yU*3Pr zZ@+Ky?)9?|-jU9KzOB$OK{w_8!Ovyw+BG+}{&|(o|M|z8k~3|7zK2+CKAutjbN}t) zj%z$#e)E={Sdo1G)YmyHF2AUK>3gUAtLmMa?>t6_OFmtzIn1X%vv*#7m+)1#XY*`5 zO_?R8r6gPY|EA5~D|c-^{WyHbP)Fv}rpSFa)%1$>pVfTl%iH_St*+#;fzpb! z_rLB=`Legcdil3wJTt0$pKrUJ|K#23_Q`K9-1v1fSLc2#<3#75-~8nsOk|gPx^i_@ z;x@63X{p&hkKAoF~ zXT6a+)>CM$)B#aepbQS^IEL~6UkLNDiq{QnzN zQY5~panq$BuM&@(<-QDGCM9+8UU*b}Nqb+NZRXxxiH}sKElTo|GIrCQ6qgx$q2a{~ z4ig@p?ydVI8ob}8`*(M#crh-EAFMFk$hmfj+tsr_!aUxvBs{#(Ci^7v;EG#E=gU{jus8p^u4k?Ew_wY(6z$Ve zQ=W(hq<&G~_f97L+{*<=FRB{yoO$+Z-2v3_NBl1`rR-+gJ(Z<{8y zxbD7k^S*Mu7J<1lyF7b;bC-T|Vmw!&2`Y~#Ix)&Fdi7$B_N%^)d8aE&bmz!1w_jSn zaCvsfv&nny`#;T%z7c5HbR|q|{k@NZ|GzJ<{i0=mVwsa{@b-%_78*RdI#a)_Q`Qq){(cucE{A-=cQYAT)gx5$M?!t8-Ll`SAL3)xpcQBaA$vh*|xIJ``k`V ziHymxI=F5QSJJPZr|a6E87T=Fe1AO4dfDWeOA4!wr+qu_oA|9j-u`izchajnCwaeb zG~tjwQCc2*=);n%GQFDl+qbtE=0rHP-#ZiN{Or?b_w-`N^IY3%_qFg(&r5NyQ<*8u zKKV_~(LiQNTLYQJFC>0*zj|JmS-AMez5e%4R!xjuX|ts@|J$^SsV`h>zMsr5Uir4y zDA9R_wR-QNTK5y`oo6D;KR#G`_d>&l9?d%@JIy(#UC#NHrFyzdbju!b&)3I#*yWzw z%VhS{xp&@Nx-al9T8m2%^Nlju+|Sa7|LyC0HsAWs8G~8x%{Kn6zHG%~!1M1< z`^9@aQ7ls&U;Z+$c=Ep5W9QGzdHZ*z|LzP8-uZmup9kx|8=D@JFRbb`oxXj3T_@{Q z;h!hF%Z==;E-B7f zx*1K+=4Y>36<@YpzURGq$d6jD$g4bhzRHPzeA2!dS!~PFZFk!9 zuQ2pmRM^v*CwKfYItJ>G2so4*aHYvAKl{l}jO(~N=L$56-0P2?|I;-5 zT1KDiWhcLiV^{Zl_$0GP=+RP%DC?9Kw;k?MF+XOBa25C$>{qw-0QGW~1UR&VI$XYq zhMX$9t(NK($=J^`KeznjkFMz7nk@oOf^3Q(O1;(hFF&?7;f@bTi_P=fzcX#(P8@f7 zY-#Gmq1ZID<_AZ7md*Z}8A3lETAKdzJsIMYb?13f(&A5XtE6VHDg<|IIQ|E3%wO?p z@3ncXkMBlpbu9Al&0juWvoy>i;Oi4nCzjm{=D$&db+R7Wn!eN5Xl1f_?34uB0D;m$ z`tf7ltO;5o0<&rlmkCLWPL|RXxuEDMu*h7J?M2(vSy9}krDAJ#^<6x93)Bt&pytcG z`J_uqg+$=P#2F^SYwg&MDt|(puHo$DwXy!xQYVNgC9i5qKkR<(U(5&wFaJu$Cdu zinVJOpUYb69<)Zq1f)-V=2^8zi{Dye1tFWRQAx@9#WY;;N7Xf>YKW=fmYB!^+uyVfddjF$Kj(ui+czdE$zu1TU=ZfXF2Lz`pS{>Sb z^$cih%fpxw7YWmaQ*Qidyj>gGzrw2dc=y2@Yt+^p^^b`ONS$lEFmPu;!~f=uuXgoZ z0}Xl9C7I3M@ao^3u4l?Y8VVH_H(5?kTvs^v^P8oqmU+`D_4VMs>!UvgLCirK2d=NqwBN|-v5?{WkADYeuL>%459##= z*>k9|@x1lqf4&(#ez!%ltv7zGUdRx-QYM-?)hR?x06gB|=W^9u!cl+Ng zTgN=L{0mdqo?q_M=H}$eh86Am#~&|KcBkTY&!V?FGxpDP+S~i%ZrHhR+vA_CUAxrp zUhKT1nk@p0ltbRUUU7&0bAF7ju=Ld1$J+Ae2QMyCUJ=!AQz85F3G2UYy9``rZR$&o z-+TJh<8@_acWd|7&j>nZT>efa=q%rUgH;yA9|V40owq((|BiRr*#M*9=-+Yf%b#2c zs++Pftd`p zvtpkrFDT04ox&M7)1hWT-yYxj2K84JyRr_wuuJ2+zpF@s^O)zpU&n9f=&W(<_ep=H zyWL3Xxo_O*`RDrcC43}AbAEo;mYMm5#r*rphu!^l$-iF~tubVtQFr>Rj~{n_x%5ZX z+dmTS8SzcMo~Sr&-^{-k`sE*mc*<^UPAfdVcJhnBeRKJr>niTv!FE@~|5uCl&WBw- zlYAJazNvZ7%GWkivfyZrl3l!e|L^zdUYpvUKB%eNzssEezIo@5WfnPc^;Z|yWM7cn zH|xLV?7q3jh3qG+G{19V%f5?e6QjR>e)w7XWW^)BV{R`+*8H)~zaDdX@#bB{SzmY8 zd^qcwiLuj~YrZ_X{-x%@Zy(P~ z8=lpjns3+p_?$G4UCsW!*YZ2(nApzGonLcclPzn+BB72IjTduemCrgI+;;TL|1AAV z(X^mraYxUFr%uda`=a#i-P)uVSN9rB&3WD&c6-CbR_E^jhyL6Zy&|=dXI7=OdB5(% z$>RI7E-vGbySit}y!}o4_eRUtKe~9n^7muiIh$v7%Gk8C=Sy7Jbk_a2iGGgliAB@v z4hI!$O|N^;x2xtSQ*`^^Dc0^5|K5H3)w0|%H2SShi-6LR6}Q+w$1h|^KeR`-S>JPE z!?gb*`xefRJ^Y9F;+eV^%Xv7g&x)_#e|XiMgJ)h|?|yl|zU#C}^C#K&AEt}m?3q2& z@y)Wsb1t%9K0fL2!#($SUZ$&7e@yz+cK@vKea}Tj$9Mn9y=i9jex{3)_3a&6%UYN| zSG@cA^XV6jh=bYd<77qrTU>L?*BAeZKp@dH0o5$vX9~bD!mV zJ-)}is6oQ*?l0jysU)^lH;X?6o5|{>pE?rpsei7*y8lPZWRs3xfB*XfbD8?xBa6#< z4pbE={;$cG+*?;6%dC7W)8w_G*_w5UpAP#MCyFz#zS@#@GV$l}-!Do}^Y2tXd*~o* z{o~EO$`v0j$$kBtaQKqso$V8H-L+>L>CHN{*m8#Px}~dM1|0U{?J}!9bm>vxo$p^n zc181V{*m8(D|5eT&4)_P$M0&pJY%^cKVP%4yLDss`?wiAuGJ^kNu8Ry_l!jA+O3Im z&ib_)epq$<$4MF9y&1CqtKLfY_3WLc`1ibZ=H{i-`t4REhoaT)WB(@eFaPJU&{ck}3T!O^gZ|3{cB~0U z)I|Cn(uIE=-|*;0qMx{!!T+nZ3=!Gcp8D%rUlp&3{~;;uKV`9WXvooJ!IzUQoPFgt z{$Jzgb+fK-d8(26C!W*&Vv}bZ_uH>!>#@?gXsdBm@!*wnW;y#(`Cnh_|FVNQVvSVG z_a*tO4$gX%^@1rwN-Cl2_4z9&U+&ppJ$)8;o5dSX5oUM3gpbpjr}Up!P!Css-1Tm4 zdD+_KmK7$AhTr)VuB9{`6rUjam5=@WE1ox({lsrhIrN}M$nO6O<1^Faj@;-`*|JAj zM%Tvq>FxC!SPuj>8?Iq#mOJ|~b=l{a_YQ~jzC7H>yp?CCk*IKQXK(A|<9?H^e(_bg zF;p>qoG7(5cT2qMy~K0;J32nv9=hm}cC`;%cJh6@}FA23hABj%J<6I>uG;I&YD}X zg@ae?`#~o8=ow6gTTXBPes#qihPKQ5x$YbDG){|F;{{ZGHZHPT$pw z&prB(tUEDqyPeamgSu;?KAB(p_Fs&@&s-tT#Qgt@D5I#I%T?0~#A>I%eVP!bc{B9z z&Q;qb&)r!hUd7U8o8{t->;7SYvfPceviN4Hv76f|KYdyx86VJ#Boux zbjOm-*?TWEh;Rk8O>g>mDC>`f_rbrj&)BZ2S$3uI+muz-i?U+wiC@oWi0xaG{`cjt zPtns(dA(v-9qQiQp>k;5=Zra1!g6EUne0 z)3-g`G|R|qRmldC4Y{{DtN1+Bn+lSW7d*%@vHGd0qpSPz>%oE>z z`1My2wy)Z$$J-W%ys%o@Znk0dD*NWDTQOQ&)|I@Ubi9#SmG7jZZ0Oa8CGtgv#p}-; zDbksKY01AYm%nYw`)&D(Vez&}TE|;7(lnBd{Wg4BeD+Feuj1Kvt3=#>E!a2b-iBF= zpITkGvoU||-z0XPMW-+J=IE|Cyy9%~zlUaR#ukGJ*BOorY=i+5`OU-zYMQv5f1h13k<$}OhCAF z-e%U)1=oYJqb=4ReLw55NoncAxvc_=Hh@VBO3&|G3Zp(yZC-)R4Sh82e zpEOmTWGL*{UzZt@_rK>S_x^;ZvvTLWo^|xZloQL|W__%EA^v(tFOSfwq8oeM({C){ zd8GO9LR+&-kDUL035)&tx;sA#OHMAC<@>s9Q~ql%yZDWB7j2n&$D~-`W12AMN2}^- zbq5wbl|Ioab?n6#3!&Wy=dCZ6D0r&VrgAHduW!Bl$upXgQ}QE^{Ar!P+0K00N%Q!_ zJJy-G@^6u-DqElY{L%NwA5XQm&Aaqss%7Jvd6hLEw_pGHVD;5CcjHe#IGtv+u3Z1u z((E_?A0^vGZfnXno2!s^L*v(xTl;n&_UO`0J3C8CZ%3lm%RnhN*JNp)CDFGSc8TYv zJZ$g&k#sf8Z|0>Fb0)aXpZC)5_ImG{{9i|9p057M{Uhh7pVqJVlV^>81@8V^eC@bT z+O-WTJ`I5rFMCO6xdfirwbZ&}j#+af>*~l21(w-nG7oB8^xa|%dfuf8bMob`a&--u z`d2mn`S(Pp^-0^_U6eG_Y!&8?f7;8c9kKVF#KXsW>Aya_E6FbGNqW7$JW8hX*t+F`A7PoUyc+}G z-ktDL_VhFvcjv|b_CNdLv|0Mu^^AXBr*6K_jk|g4OG8=J;(t3&X3Pb-@Y#^l>p7V^C#~SE3D?~I{o6Z z@x}bxpUrQtiq6#Q*?n!^k0$eJZiSa?gJ0g0e6MES75V*qeUQQ9_A{~p_1Oz|=e}5R zdHYHMCkuUy?;I8{{!F;W{neXNkcYJf^d~J`a+V7GCRD78u^}RdlXa8a%!voaN;^8!Up$rVN*-%zp6sp~(Jnb&(g&rop=d8jKk=LtcFgj&e@(ntZlT zW2?Ux>toTh$(*Z0^Z&PkdP*-0R)-$X`INl<(&A|0JG1MaU4NCn@Ve;g=f{_@SxvdI zqJ|};*V}brq=tf#P0y+*?*)eioH!J%T31DJPkiWgXP2x?$XoB#QsKY<*d;x_Jy9x@ zzr{I5tL;W$muYQ^i$toZsZkclgFj|mT@@S_=saapXYVRyQ(lo*_LZf-W`=)1y;Zbo z#tn^97Lnyy(VEjbD`t8c3(E?g`*}&rGY=Fp@*AT{&rJ^#lojmr{)Drf)4|@f4YhuIqoJTE7*2(%`Mk(4#gG@yRg-Mp=(<= zbxAE!KGey>&;9F=tx?e8b6GaA3(p_tshxdch0oQM>0YdlgVlVMjg*=`6d0TGipQ^B zms~PW4dmTDewSZ$e{pGRpC}>R>S@ec8YDcyiE*LE0Z-l?bHHKL=WDt!Qe%PcEVi_> zK0Z@s&RB86pJrR;D|PUNsur`jhU# zakN&*sbhkYc-Fi4R_Z4=rq|Pux^4A zZxxgVcdHc@K~{i{Svm04uSld}Wy7`cMl^B=7o}EVE z06Dti*7-nFz5Aasjw~w{<6_wAp1tS5>fa(=yecgMjcV7!6mKcFGFe>*WvSXe-xooz za<(c$2CRO}|56(ABrNIiZ}tMVgPuYxid8OLtQ-%+i~M^F`b~Dg0+C-k_u$hb%ZmN% zgMV6@YR%sR4#$6w@3**dv9c7j<`!vg@NefLEIH>c& zecw}v-W`YRuZLCIvvr3FOKXZa1hl*m)D!_7|InfE{QDBOm3jTA_*3~~oGpEGte$@{ z))Wzt;yJbLZ@+rnO^3uM3h(N^1+McmYz#bkt@8ZmL#LFK*v>xvIsdH6-8UzHW&e2g zba_Q(_T10$vx9d&{6Fv6wtvgQrd_u*`@h}h>&eKVXEq1t=e_H8PrR`~?thPZ{l=D< z%N}(fuK%7X#e60A`O^3M4_57Ezi#)Lr#vk~M6bS;{eLkBcf+zozJ9fx*A_Wb<$JA3B6jpO0rn*P5ve%{_m_IK?9+8X9gm?-s7F0()}=Hd11>=pZT zoi!F_URm^A^o#tVdjdZmUpnBhFd=7!lz4;NpBX!As-2iZWS<=_H!D2X@XGmg#p~Hh zJs<31KEL(0^~qxJIkNm)YJgikTk01j%OGZxM^$EjavY>$7w_3&ZMWd)QX{2o4d&f1 z=A6EH^3VSI1LjNL$@z2twySBqzh{51@Km-dqMNHv&i?b~tM8N*Rau}>D81mFpu*<= z`FpX)-AkA9%KX1Ovs3sHXCTwTy9;-Sa7|exx+>u2u7LMt+y9mAetRu;WzKe|XpMj+ z0e4JycyoAqbnHHRruM%_gTSJcNpoh}+&{l*w`bbB+H*V0-_1!sxAVNozHYmOwfCQ< zYss^OE|<(*vQm`m!Ytzt$2!;C{cpeRebj;Pv-fcRE!O=Qru^{ny5yoIolQU9{`v9P z$V|pl>GmtPfZ1|BbL=_;C+1Dq*f(ANcjw+?b~ZmhzWq{eW$wNB^7DDuE1tEvzhq44 ze7wAV-#Pt4H!I)D8OzysE=phX_~~)EN8P99S^sdlw)pv+goEt&jqAg?+Qjbe__j`3 z^7<)JUT)3Z|DVj>Ir~Pf6?bF57T>%}VTRwsyeISS9Wz_Uemw&jj*;w-J@KSuvlBUI+@BZy?`fa$@s-yjn_EUd|Gk!c6M1`Dl&57K*Ybts zAOBpL_Je;{^YnZU)t4ShN57S=x-lc{-Tb>3PyZGE>SGnfQ97m4R_p7fEr|ww7SX|K zER#jJc6>R0Z0W1c?DihT7}Hg<#eHuN3*DK%G1m6NhDkH$wYpw6VBM;4g5iOu2Y0!} z1Yfr*v1#6BORg`p)~;UHR_>u7C-vZof5(2tpid_~&a3L~WsucgF24Wt-0sshM`!sJ zO%uJNH!tHV&#_A@!?nd$^JOG#P11eI()0A4`lVUhm*lIL3w@V+RPrtJo1Fjh6|>E^ z?lwK)aeCtQi$ZhH=r*>@w*Bzlrpwy;dX_S%@U4<5ji5s${lK~6IrP6e8- zn{{!^B^3wbDSZD-_te-JW?4Pk>^Wzv(~4<_XD+ch(6GI{xW_HobE#3W;?J}L1=Dt@ zaGOT$jC}n3Rf?M0*3qCjqA5-OI5b?@0lw3ch5Qd;O!EeU-p@> zoxRO&Kl#|nM=E}E^pafM#k-P{Epl1UK5%U~e^fqRqPfcW^S_BExBnaa|4WxW{(r{l zO^p3UhChm)iJR>C<^O!;>563mJ+=F?b95^1+hBUN>)?KN=G(h2URx=zI6JJc>a|wb?sD}zmh-3VnEb{w z_x$AZTX&Ysmzyhb@APEZ*+G%N-et>Vzw|82;pr6PJwNa7%gZs3FD0*hc=4x~+Lrr= z-ZUHPL{+sIZr^VIKivCH*1ZbNS;bqq=Ir)+^fNQ}>15D&e4qEq#C~w5UgCX7M8q??2 z>ph#U8hxYmTI;#Lw;o1c)DHWca^TGG9p6uVYq3l(e)K`}lCNWlY$fym9jo>2rurVq z_{Xz<7rz~w_R85|8`k+eWU;mHo$*-Rvg(hDd;jqQ8_nyD=Q(a~_+6dl!aR{r+(~!W z9-VBTiGHh8Rx)0ASO3T3YM|AlTGLZ48IK+Gs*9h_kNC8C-D^?1XNT5*{k;Ez_OJiX zw=Zm7_xa!Ly?W*jic`|3d-7_O*yd<0Io!ITHS+sR= zQ{=_te$-a-)|PI6XnII6{9}m3vDWyoe}-F>)l5YH+^7h#Eo>DqP2Aqulc7?yP|V4* z@5iN*BTv(>s+c@CS*!Y)OJ=&zDVCr<=setwrY`M@bAfsat)X|qMb$x_1v`sJB8vqU zC7$r!*XZHSy-;Oo+^ist1zw?df`jiJ?d(Lz^P7*U$-eL%FMdEU-Xps-bT-M?uC4z@%^jr<*)Uqk9Ct+cDj0z z67Rki5iU@(xkcdll-;@q-`OwKIxaYU{?!cu4z5`rLSL16L9(pYf}$KJj>P^a+=eXy z?Wev+X^T%dlyxs$O;aR6U8b;WBjXFJh*IuW*EFu~vk_~;zAU?316p+Z%!Idxjako6 zEoQEdgbDN1I^G_xDOLBUJ28f?dTML>)Y4&Rx+|YcYeq$2 zzGv3X1QV-wDoX{NI4%b0h-v?HO*1OyE+{TLbo6A4|s7p_<_BdNR9L7v|;0~AowMpC>c#l^?Y-gJoyvtwB2=f`#C&I+q* zfnV#gU4NZ+OT3b>W%;M7MA7Nn9+ z{|brKdAUzALS)2mO*nhJwW}mZwu^O2`f+7DQUAD9rj-tlk6pVU|3E}+=EpA+mZm## zD7w@dOYv4z?Fb0S$vdJEA|pO;ag4*O6$L+UKK&kUy4Wt1zvYzr`raEQKW8p33wp}c zeRhYX^#R=!Q0XaKP;3@>V@0R0=F&DBGnr<~q>T*HcY=fCM3wDXrD`}s_b+F=5@Ws6 zjotKEQFQlJt<7N9G8;;E*=hO6hWl)}o!&z-$Yy!%>C zdG>axua}Zt5@;v%^I1Ho194-9a-Xh@;lf5X?<@wMQzpB#K$-i}Nxm6ZV$Rr2nss;n z-Lv)AM9qHGeLb>%$F8&YBW8vF;y#`D&vt|K`MmH2F=@7^BLA!L*KFcm8g-MQcD=gp zqgM6*#|yppz6Hh8;tADRT2~JwYDDpG=M>=zSQfjj&@*W9ZTBGNf~>za+f=5==RVu` z?P_#Ia`DHX_apl1&;RZJ>$AsqRphHVv7fBl+x=5l{NDNYe0t)y3bpd>&C&Ny8NYvY zIC}o$^LJj!t(aV2A=>?Y$%PyD{bR%K{)&74=1}^M=bxEFrf!b7{C!i-(Zo%s_vv*l zuFQ@JzqO5Psq1XRJv*${PSc;AWM+Gr)8F5|sfmd*@9y;M_z0Jr!msDoy!;k!FLHFk z_P+4yJzYs+pYB|l*HUS|c&5LF?Xo@R*EQ|kbLX;Xd4Bz$zkfe|=U?#F`Lw1-#DV0) zw}qu1cstAvwAuT^=j^%mrmbhXik9Es&mVg8x)aAmgB+6u*+HJZe~>ND6+(68L1t z3STbPEB#7I+txiRIM%xD#mef)-O6&a&%AwcQfFp)Lt=1S(4^}T7KZhVGaoO%aQUQ| zbw(16M6@}XAlg*+?wy-4P9n2 zB#ZFtdaJ0awoaLn(pP67b$!9VJO7`GB~3oR>HF4%y1IAV-@<3Fe6i&JM@{b8)*WeVe%R$j=(nMp3+x=t*6hw+J9ceE9c3)S-0{%R{Cv9c3m^$YUcw6d#9>9hs1w# zdDX35{`vFTwVd49XLaqT)=bK~_m8Vt=}?B{2i0w&at{`J%5r}EeC)LKjCYsgQm;nJ zo=CiXd-6*eIlq+Ed@=UFMWz|wH#FTN|9|`Hlqc(#>m=U$x6nuOUEn7D)1J@tPbB<# z686VPx5M-P)HnK{muGX%`eXaj>cz|dsYOS4p5^{gziVZGHq1Do@7Yed*dM>mj1$ss z8^=oic%NGnf7VQFieA0(`ycFgcm0{0o5o;#d;VLu|Ka=z8|S1Q3{HM2^Q=FDyyzhnLuGSw9#qUhbzJJeW8Q+BC_tw8l2>3m%rDaR%k;(NF0`f}MEnoBW ze(-L=NAey8zpZD^Uba|${j;kp_jd4nQQdL7bk9!1y-V(P%PlNl9njSLha;m{wfv58 zt6kv1AFNvv|42ulu-twz>dW7zJxu?q*08TtcH-cAeNZ=EcEOTXvA%kf#uFO~tnBvm zC~;YSdd$p|E89^Y;N7-AZqt`@MSq0VT-YAU3mjdMKD{uk{HXo{NwyNM&)gq*KPNrB zlCbRG`X#(ibW_rfu%yjjdo%m)(xVCMpJcdDv*Y1@^^R`qgWoULUStTK|NMr4^zoIw`WLQGIQQ}J zK^x(@ZfTdo;&|sB&fWZMQrM0@|NCd2?dx6MVY##aeSYVG7v-$R^Xpm)*Y-5{otjkn zM%rjS*8YB0mV}?un?VH<5lg=-jD-!7Pr7bt*%?+0lLy@;PPV8IfEO{eag1LD6 z#;-l1*_YDHB(M3j@LlcvL{}fK z&f9SZ9zWh)QM+66bmR9O&x7UvZGEZ2>0Y09;@0t>=Z|g5UbQLW(-)s-F8dCzJF@x6 z`(G1Q*KUsd^5yLxsh?`M&&^4FzMuKWvu*VojKY^|e3Zyc-v2b@Qe>Ik+cSUW+Rm(f zz|$F>7Wn7e>ofk>v+sWYdpAb%=lr>II(!xC{>G~8{lvGLi?PSW_5-_N;d09#|0H_a z?H}~*KVJCxk;J6QeH))V)SJPOeA;?uwNmHicDn^%_5D9z%rjmvdD|z+v_H3I_s7pX z^5SCbjg3XZKOG9cXl>iFZ<1i#>z~#0uerFn&HI0S)$`yrdRn(vi*54Pd3L&TW67I~ zZJVdcINPdEb8efd<9$w{^#1cN_Y3UH>nmq%n5g{m{)S1mX$s}atG|6uJ)`iw``7+Q z`}Ce2ILF+=C+Cyl`d(w2aE*ywkC<-M1*IkG_4>XcUyi)rX{gljZFAC$Z&ys5coHoC zFmAW6Y_sy>r@IZOMMfUN%?wjp3gg}v$vXA-^A~oxk1}q;DJ?xVYA+k*VhAU z&axC;%U94&mR+69ZoF%{_t)DNMNz!xRAvn+oIL?$+nA@IX4PsEh$}nqxOyXJINcJe0%dB z{r(X%>Cvegt@u6N_Sad8AJ-n{G-*6|mUsH2jA?6mA1?ddCYWF%X!9&?-RG#&pZ=y! zHc(b%W)}>NaF{4KN9osPYlX%eF4=E?&)dA_-*?`ai%XU7uB&X1U3pR^ev^uqdga+7 z&9A?1z}5oz@%)!Iw%W1yVax33mwT<%(&z9de2_lWp;su=y|JNE{Jq`InVy^fAAZ50 ztoT^{Le*I%Gx1qBH&>|s6IK&=Xw-6j+k6EzwP%0!PrjIMa7S{%jJ4;#9y+f+p)CAw zxAEkCPdDFYz7ciR@CuIvL-2zDx&8a?t*7Ox?7wWB&c%ze7j|s$)K;&XefXu}b)ySc9ZoEH{c_tkcd_ebcjpN>U72|&c(DzhmOqaCY%73n5<6jH6&0Y54`pLluME)5b z>@GbWwkc()cJjKc&c-xQ7jpN%m}8$rKk`)l$YYa35oC^&jH z_~fsz;)|~9B;RkymUzTBRX#x3&6%;1_38h-0|^&4z7m&9HxijNKfYEgWn+LUN`#QlScWd z52t3;%G~%TIJt&l?&pv5`>(8WPGzoTm{VAK)i9c&*YZ9VdOdV-D`w z8a-q8joF&PQOP=Sr!U(ob8vH8|JPr1`|%nrtxW&@;boI%%{w)7@$4C&A5|#%sQwKV zW?RfyqCI0*;aiot_I39UuG;zfg;B1}Khs}z9KvsRZ+ZA-+S)4xM`I-QTKf0R?VL9| zqIieI=9^6ipOn0mp8S+!|GAqdZ{AP4q-ZoLj5#hP`x#eVOvSZ8JzFP^rz@j090Wzn z{12ON6BM4U7Nl{YagtQ8*CeU-CtdT`pS#GsafYUn`T3rM*X7sm_$zbj+Qui(rrqnF z;8;_`7iK#<_Ws{96Zai{k$Fm4`SjGXWci29*Ov!u$Wz|Psvhy_r%YLDwCDd~xr@!q z3@&X>@xOM1^^CvN=_&ipsqQx@O+Iz?X3g&#^@UQlv;2~eC;WX@_%D0rfhXVG91cHU zrCAdHnMwc6yR)IS?1uZUhs~=m6s}#~x2TeLTcYjewww3!R3h1z-zzsb{L}hfZL0C# z^}8oM+hLIKg`uqev!?atH6rtV%sfBMB>hOoG>M+TE&Vr6&#ylgAG7Y}gYNpzli%1+ z;eQrW)P1KT>-qU_s@k4w6}DgeI_Y}-w|n|O5eowds%6yOQl9!4oF? zWaYigJ}Gc;tNHfikH-BUsz3DJxp0cX&$-gpYTAw+J3jwU`o8BV$MaKWQAZ6~zRYoX zWULcV(DHu&eXr#U|9(8+GJW>)$Gg{$r|_t<~n`o3@b z#3M=v=A7)j>#n8SvS9h#CmCLb35vD9ZKkPjTNu1V*zxbL$D3=+iv2{JEqkw=nKb!$ z(F^luX?M;p3SRD&z9#AB_k#)B{(WNi?5pAwa?)^l%H7Mf(KKjbLzhWV(&7V-E2eav zJ}(k!eshV1@soM(1^;*0Gycn+@$G8im$2&}KTN%NNAjh=$Nc4ybGaiP{dn4^$MS1i z(yL4J_WZt9!o+RsXXoCQ{Q08f*0S}FH&6d}_)zjno!Q$bYcK0rq_Tcv zQPo4Hb3HSi_J3{;5w^|SBli7=SWIy#x6j1MGhWPgIPm3ViN@Yi*Ux)rNwY5rHb^k~ z8+%96YN`IsoriZ+`h1qkRnC82zURv+|2Nu9J-IV}2KYZZ$MaxU;Jk*$3AgPYHQ!sk zV`nnMLFao1f3D20*fpKAC-BbK_rFh8?_{sDYvifZ?_JUHEMwWcGZjm0xz}+Xv`=Em zcX|C~?pHNo{=4qc^6^dT|9e*Ya;%%xRveJM=iiP_f%$gApelqX}JIlpyulR3d>j`IXG@pF$Pggddy~lTjdZxu{A8%evi}`#kM@@FF>-q%@ zRW=h(ti8YQ)KocB%VS&LS1;F=dverHd#0SITgvh3pQ|G^?9_PQf8;k(ersvjVtmaa>%kG_A&=Rrh+@8J(r+0aU z7xFOL=34rH;XP(vq7wgW?*aAi+YWL_+`e<@?b^OcRZnGmK5OmwUGMcfihIT>_3pTZ zPZwFgc=q1&a|2&beGOl`*2(8w-|G*{{yqHRGw*`Wb8k!hx>WIb8`LH&znu3+tu1{U%TnN^?&o&=X=YmZkxT) zQb|t{mMb}V;>@-#^A8c%pJ(o^vE*;Np7Ukp^8aUe_dYLn{=)C`nQ6_&8jCa@_j$L^ z{yrS@%KV;}Xwi$ko_FT`5LzAo+CSO#;)5wKez&Dte#vLMKjpZ3bo{dRqWGC19(DVK z^YYlfoGG<2d}Fw0|NS$?v8(jl6k7rgzg*(Ow0D;2iG68zx3lr~PWm4c5gb&sKmKLS z=b!rn-@Tu{>WiIYbit7pHZ9J@g-O=sU!)R`xgA~N#>E#ch1)2FOv)}?E&y}D6M=|$+j7Y1*PR<4X_)lY8M1y6NyFlMcP z5SSpdtRRS)caw;3V{?F}sDIql-{589P9fftX1QJ5u)R;~YMnIeV~3}6&aeD2Ps%h& z7&NG~LcYk~cc};`^Qt(Ri1VGj&G&;B`^?U9=VAr9V$sWqOO`#m(z{wtSeo5GE61yM zht|IJ%N8!)(EDr6Ee+605bvAMtKaWz?2BcK|1T0%7xq<9t8=y7yN#OR@6P(MAG=z# zpgQZ+75<$L+uuJ;cWY+sUfQ&Nk2uKcvynPsJ#B8k?tMSK?30!p>#>Bg$yZ_$9vcUM zd@$8NE-_orPwi9pnO@m8&{&zu6Y-gag+cG4>!sUNOnYBE;+*=+d+pU9^X3Ja>4+p; zo;mB-dj)r0kq3`*l&rT0q~(H~SCzIg;^aBqBUkf;q@{Zg=GaXMPR?23#PK|2$Ep{5 zyqUKqCM|yT$yjvt{FMhMaErU198f z7T(NL&s@tXYIz> zOO|DodgO>$a7+#Q`9zf0^YVcel7;1_kKVnybmL)%RKUNz8?B1YW+YsC=+wcc;_0ir z%1-aLj%)C$zglXhStS#c?+1fC%u%Q*UF+YgtY)&nN21{8>GP*{ojKxmv>LS6Cd6-& zlwwQrMD7^^iyBR4E^(W<zox9emQ6`kw`D~iXhLLXou&}mjSqYGZ}Bzt$q{+g*nPu7 zFLX9&?+u6In;EN`eU5jn{^osgO6LAmp1o4CD&MbgR3~mXHvLqU1@_Ua8wEdSD#sOx zWKGtcK7VR$1+S1adwkuqj@(@>Dxjg+7J;i-MyJnc&-Jn-v0DMc6G8-ICvV~nL{l;CFWIDL-n|nX z%w3w{boJ>x=_yL;Csadvy+dDp4KJ%>JbF~@PKzT`kTOTEHr(J!QSbD^8vXpbk zf=QvS&rRR>oVDaSbK^#X6Z=iEH`zaD&YC+vKBQ;%YNzcJKo;_yIeXP5F0e4UJ#f)U z9sBG(J3=%>0w%h7<%n21>MhKQSrxQ>eOI^c4h!!jP=+;O5l!puw&JwhR$A4eq(on)CNu+pGBnDSJ?#@_x;s%4Su0;yGh3$ zT#M}R>9Y!6e8JXql^E9w4`vm!t~m;#L6&Ch%CWkjBoS!aI%(FbmEzND&)%@O@M*J} zY4GC(XN5qc|H_u;+cqqJ*)l6Yg=fS3r|GFzlam&|vNc^5w6$^7F;$T6L~bjyGZS(= zjwNgj^@lh~-D9$*h(bI!=oA%>K-<=1-e$8`?(Aug-#1BiHKcUX3}Y=wXmNBi=CpkULf$A5^guugvLaQgh4>}AXP-t36H zwqyN_Ywrca(!#HBC@(awOa0uQoDp}n?8}{udzCq6uZv3z+6oT;w>``&X!eii;JQeU zo7>ys#q$%Ne@rprI&fCKgKsaJQRyXxTh&+htUts4tl<6rYm@HP2%O(ruWakJKI5F7 z;+EXS&Ks7mwcjh~#F6-2L~@OW5ZjIPg$-S0X@`%vEnK|VCiJ)0)g4l8iaA!B*VWHW zm7jkg=w1G-+oFHoJ`B97X1ZYV)?{w$BJbaqCY{*DyV0k+BjiVLOIwO+;o0y%k5}(q z5^Xw*b?cH~Z|zR?q?`Yq%Pd-)Jmc#hU7jy1Pp9l?dw)Q>vUI`OCNU?DhXx_CuUAM- zuibbs!kddVWT~ep*M@32p2|0cZU4VJhQ*jK(s`u|JW&itV+J{@;Z(B^AKZ{Zi2LSEzbFB{fx+*KBG$#!S;kC)5$E{Qf_ zYQJ+byS)7PafWA4boYF|^gYLFcW-{(d-wOZZ%^F!B3JI;LzOMk=XxI&>fEmBDruI# zdpzd&-{4!1_tlzh-?x3TlI)2)2TmKCH5kswj<0H)$bRqXLwUbNrMoAdpD)!iec9y7 z3f}wwx6ONdJm|#L*bn`0PMq)*o_Xi6xNzl~y3g`^DV!Kd46{3MTOAf*XIxW_Z(c!c7D6s+mx?~ z#uX(gU%oDu5KB5RYg_l#-(2Tyn|`F;|8!2i-9snG?e#g`#OF!Vjzyh++xu+qugkk7 zXCyDWIVFL0&5^uLwQGwWUfpfK*Va_$Wv7be_LLK$;fA%B60CMFD@^#he$T(db)QZh zSu8I1q8t&e-l4zDR+^21~G+ZIr zL4KX&gLX#k%xZpt;Iva`YD$E&H!YSh-6gH~Ol8~Ixo6w6FJEl3GT!FTu}&&O@8FmH zSuDcGzAW8)ed+Yf;xqIAy#9JWqEJD$|Jz>4Ylo-bNw)s+ac=+5cMgs>l~24hU47&I z#fgowdo;Xkj~&vVzF{}ViMwaN$FEWPwZ{7H@xJH3R+ze8B_LIO@4>`PBH zxPq#p%!LfBlcZK$?&)=Mce~OkbG&<}@sEqgCI8*s87Zy2(A@6y+uZC=m3yY%;Js~; z*9HpT)7n!`I3}K%TRdy+YyJtB7ptHBqGGnLf1!i9fZ@ZuxP5vu$>;d)RsE4Rdp0G< z_4A7(9sBO(L`a@Lwl;l+P)_ROX)Zc!@oapV{n87*@9q80KFi=`SXXzKr0l%Y&F}M- zKR*!ki{5qNS&YXqfn{fQ&3=7&?HgUYQ{DBcg4M5h(rPUB6v?`OK6oX~M&G_(^x?5d zW;1lzzI@3L%RhS{i{sI%ndSzjcN&(iohkf3^6W~{*Eg&aMbuYiy1RB27oE7y=v@3~ z&*``z-iqH9NeZmqetb8>&Z$p2CgxoE;9zz}_LfWD-Va_@cD{++-`=zE@Q&0on%DCE z7hKqC8h+Pg?H4)exktLcWj%ZF>Z^=4%X7WSl`mH+{+Q@~zCZ5KT3^pKzg{btmu1EO zis((NUH^Rk_b*43@6Ny6e=f1UOh*0knv!z;Wfzz%c0PD2?XbEdp{;**$Nt?`^Z7Xy zTLNY{8JmU%o34Aca^su(2h+0j7CzDG<+aGz?3I>#FYT-Q@r}FqA3RidyZ+#w)B%~( zw|djP-ktA^JbOETo%8v#hdcbIc1@1gmZY4E?GNA1Wth8WvG$Ko$9Y}md#T@F6#s+i*`Y&|jy$|` zewl(&)D)gQv3Fw(C$t{TVeInoKI`aycy*|D)A{GQY(8!qQc@=5T|GGI#Gml_sdYEY zo-Lg;Wo~G5SgfD=dSoci{hD;gnE#+F_S z8@giBk``aM7&vcL?b56mt%CFq$^FKEcDGv=9k$=G*Z1tZc^X!GrhZNLo|cq)OfJbi zXQsWFOxo9PJZ-%njvPPD@G>kY*ysYMgSMZ#>S?Z2u>&&~{W3Pm5w$=5{=x0}Yv*j7 zm0`O>e{FBWQ<2a6qmHzx2(NX&d*&=NQ-RgSp6m5{DkP;CqGs|uT%6t7^-3N{zJ@fL$=7Y;jKAk5zJI&;!Ss-Cl5L=u-u;dW5I$;vmcd|WWW6X zN{nmsqnq2Fs#I>Z(sQ%wk#V~HmD{qYM)3T83Ge%1c~6ebKUDiC_|E;+?8(3N9v@hy zVy1Vmp?bf;ovzKER<%8QD{Ct@-aavF>tdO+i={8Ge}8D-&EFnTzghX^`&3Td_j>d( z;@q>>GyeQGNG`IDIc4MSfB#7J`jpGI3UlvT2W`yC`yz2e)SkEG{j-Yf36pmBTh9OQ zw58laIsZlfYu9Sii-|uR7G2YOc;nyw%8$LlB_+M-r@z@4uo={ZxZhd%>z)EbSNZ3M z#`P2LZ!~>aCns@f(uplh@8nF1gFf~Kb11qj4$k;FbFnDb3XjJ+eAAs6dp)>Vuk=_u z$Nid9y(r5pdhv6)gtL7)C1>ZZvsLn*EXBb4Ur)Bv;Dw0%{bRc-IAp7>`+M^JC#d$B zc3&?(v0J>^>GXaP-YpUq4d>3OrcckF{*ULAw(aSji9Y)tYgMsY3U2>pZa2GJVtwA* zkL#Y^xFupZtKO#AHhDK|qQ&O^(Co#QGw#kw$miYijAzelMY-8mnkW2G)|t7z<$kzJ zvC8e~cHvtNdK+KaAp2C3L#|MLy}fDY#n|WvvubDkWq*9~Gsn{FFS09NE{&FaQeEim zBfIX&GQC!roAUnaq80WozjKiJaP36~=MN0)q%XHIOpocyi8(BP`rG6H$G%4*mebPb z&pFe<7ndS`@7SsrA$Ov_Klv5OZ?Jgt>!toH3`*joTqQhj>}_q`um9-!*UlYVULE}U z-FJyUuQ}-0Nkt8#gg}LsVwsHr4z62%%iD%Dr?0dMPX62*EB1Tm`emDDX#Lw8w~x2# z=l$2Ib^AW-=Jvm=|Ht=w<@>vK(?!2N^*DDz?ZWoR=C}SgX89#$?tIRzI$PRWO|eBF z)N=MT=LO-1_k2IMtK3vdO7;KF4}zP+%4|RW+#mSy{^=EOzL$D&e(|c$D44q4>FUf` zr*B6d7UwV6Fmsl-#>@*h8k)_(<6wPGT&z=`pJ-*$3Ti%b%uP4&g~E0DQ0bLfF`%(1 zfo%&8L@YlfAkwj#bEVS8z^@J~1gF=EaBXmOIJMQ&gjY&;UELhZaPu-5Cl19UPbWDs z^6p*yE51wZ`{f(zuJ3k(dqFE^F{REGl`_7$CBUJ1Ldx5%(y)J24r?Rp@j?>#X(TUM?d6qJ?H+CpY%5vpI zC&tnc``Xl1=X%-2 zS!QeoIZH9eYoXy}5v~<==51{^XK#?z6j@;8{U%9n?_0-Z_x=c6&a0g9vfTFY-un9a z-=DuzTDPDu$>{yxiPm|Q6JEzhIR@3rD4jOkSMwur*}ZT2bzNJp9p=kgSiqitre?xQ zWBcUXI9Gmy%|8zxpHcQ%XI}igIR5lCQ-$~clfQoVj{*N*neL_MW_u@`+uU#P_1g3w z&phUC5Br(-XxgVEx%@_N8|UB5-Zw}0MasL#6W;yyXTLD|^zx4#Yvf{eV3pi(=E{mqiNBZbytrtp{kqDRN9Nm|dUa!Q z&TZqq=kw(Jt+yZJJJ%>_!_n8ZMAxxGN?M&oe7?c0Ero~gU*EZLKmYEBFLvg{?`pF3 z6sS9TwI}Pbv-JPA{JqcKxxY4>_@uq+;hhK7;!YMKt!-vO8VjE7UKN|P_=4lMsowr# zq0*X#SGOl0_uG_sH|*0Vt@%-f<>jd#E-<>dZe3HAyi6nS$8TGn((RLKODyyEePyri z*L}SDscmI$k^x(`*l+RkkL$Jh3Y69gsIM2;#lL&j%*ob|^G~E5t)KV&vF*E$&->>mL_G+!tA64J8oD?3vsEX&=GimorC%u`yZMyIMm+$UZojfhL z<=rD!m*tE;`*U^n*6=QPUR?5$zh+N@d}oxx-}Nus7oNJjU zwUX;x_+;GYFDiN%x!Ll=^Y?%9Z`$=O7k&6h{G_Px`qX0^0`8bxC{B+2cKQ9Ejmm9H zVwmSC2J*}`X?@8Y^&rSGoBQ%(i?TO5mUFul)xUq5ORN++y0X$Z9iX+{9E^{pS45h7@rM}{P5}j$FmbBt(;eq&RaC=v)B2E%;?v;ruMhwy}Ju9KfhQ1@w?)? zjH^f1K3`h&D1yf_O3l^O@_MVlA{$MS0QcV8;k{c#e0w#Ge`|^)G(Sxby0$aQdi(pu zvAeIuRKMNf^?z&b?XDNH)!7?EndjxMe=_YMqeQ8(dbzxk>vo~tFN)*-W?H**)x5Ob zV7+i!h1uEPP2u(33q3wBsQoP_@l~cz-uu|3`dP|_VH?zno>bUPTQXVZ>@~wSw~PCJ z?%aIC>(Q?LHy+-a$e3$$qPzduZTamJ;|?ln*=(8czq*`rc5>;V-(Qw4kC$t|_W#`K z_iI(oF}=8{GRO47s`ClUd?e3K2ryRPrvGs6`t1`}I{*8}y63C2$;O>|E?an&9d1G`u%s0JUo=(<|B3b$;7)I zCd(#I39g$hb#L#l3s*&pzQ0NGw@dI%I{nS%%rOPF*o&Vg`DcAOGq>jBMWHganVI*D zg#Ndrp1B)Z6PUBHd;f#0|8t*OOzhd2#v!{!Vp{!A!})oq-L7Ab_<7R3X5S}`muGJo z?Wni#>tv7k@bP%fR_*m->l;q>`(J#gTC?km!OMMjXBw57gn!NNtgg~}S#cpRApVx= zb%)}`rT-uLNLcsW)7`QvnT>1G>rWS#76CD_ zn3u_2U0s%CI?JX-n>~B=Vsr5cy}s1LuOhfUB)o|2H(0%0+m-#`@DFsni!jpVJ`{-b&kG?-rQQT*{!?KxbovPjX6b&D}QginPahS=GKkMJ648D zr|tX1;-@BCTxjUJcTUIO=T3dHw#N#+^Lb{MPs}lWU|+?ie?F(b_?6VW`aj{{!mSRJ zJnO2Sm)bFz^KOh!Vq$ief6WPbO?8V22}`H@3%ZKQp1nD_L2Tg`{}TlO1(=18P1#{`~E2Li)Bo!y1$G|B`Jc9{GIP zK0e(q=Owew#x-%G&USGDgsxOt9an#8`}3qH-b{G0D!{gwL_zqN#CUG*s}WPBL8{=>7j5Iz|{=l(P4 zm!G+u*F7 zhM}c#Uzb1sx$ctIzawXb@^9}*b}tCl-g!2JBhan&`xTROZ`O%$?bvfyBjjCVjMq~q z#zoK8sLc00&XqCm><5+ZEk3e5b}g(^bwrD^1YH&|PWo(gLgSL*)*R>R?WQ>vm2-UA zg-?8XeM)yP|A)Vg$!pAy2elZ#z12Rwk}>;73)`c0jn7_nNiT@jnQ>ZPYj4Ar9;Ol= zmNu3LEE($>TYhCsnC z=FNX2r<%l{e|+N7{2#y0GapG2NwVB-ySAgrN%rh=_2A=gAN*aq`^Ue>84ia}?$*72 zcGv9e+q>fS=$>tkYqq+abGvNOcG+hxAM%pcszvd>@%^Ei95VM!PtKWLZH5*z1e6^V z1a*5dHZFCH@a}J&ckopC{N&V`>C!<#o_^aWENp%z>5}nz()n{vhnNfm`Yn~4b+jw4 zWaPyB{8;$bY*O~_xsRsX)_*!UZ|MTbjB8me{dSf!=bhEM5n^h%Jfif=Uhf}YmixZ( zJ+bUW)w;vHBG1GZzrML7{dK|zHJc;6yu9BhB>dr>s={GvnVz-i)aO-)WaDd=uAII@ zb)%rulvM^R11GL3T)FVqkz*IRSr@Dpnw9Grw3tKtru+X#_1Tj)W~kjNdEKyoqrm)U zQghBK{L2w+*%>saVp@uJ#=N)+>+FQCCBaK3^0xPFNO2bPTkCGT#F?*nT7Gh78Q-pr zqO!Ml1%0c?heH_L2oUCCqHpm|7;Hvk6RDJGpA2y8Wd;# zP~m<)x!vCfPV@VNHhF|-)Mu~6g0`pTA zeGU~g$)4(}a{K1=RmnV=&g}BNx8#M@ck#S-|FG=poXBsc`e|E^TPMm#7aiRCmZ5En zNrG+ovhd3nx{WQiJZ1R!-2RT)#fA0df3B@lulw0wlk%$b`o^zsbgpRs{SdAH`DWuX z@q)7ddf%4Cc0`}Qd209ioTk2sEx#-#&z;aL$@@NSo#_6&*jt86`psAW>v|Z_*XBLl zj)!N(kF^K(dh1u2-9G(n@#)IGXSNS&T4bGvpze%$Xl%oAN@?nw0?eQ@@I;M@-z4oW9}d}nE6Yu{d$ z+x)RyU&(B(M8UDchg+6aK6sq!aQX6$Kd=2?OmzIRud3pz;r7cHyw~SSi4_Td+w?QT z?$^$HCT*AY#|wOZuDa#w+Rm!SDgE=+?5Rgu%NK;stle2U_r&AN)dG1wDTgneJ<|4lnZM}#I_bmh zMZcH$ZFwNVy?@^E_?x;f#cCc3t+V_oC>U{MWA5vjzi$gon|meW?)xmcJCbG{$E}E;?Z-TV+YUb{3^C~FXjn7o|AR> z%I)^cCzm(e-GBaJ{cYcpR~Po2IeO1ycIWou^A8N}1byH1Vtum7`}>nOXq{WW>io=E zTQ>dr%$4k|cF$_kIXfxN-P;OJ6dOFYo^H!5rJSeea(U6K2=`-`Oy4rS{pZdf_s2j} zv^-f=C6pq;$OwO|N7}aH4n?h=Pir>F?-$Td%J7(%@0I*gGV|RNsDNGziVDB zVVWhdHrhSp*9>9xq{xj)%-hfI*|$y+G+w~>G$)F$F>Y)1`@J!n-^I4JvCRszx~Ba% zf31(MA@7#Y$_F>qKcBR)KkTJ?=-2&jYhRs8-}<2A^!covv(>_E9Im#oErBe@aA6Ku z@oVOWsgs(sRy`;;yIqmIx&Qsjjf|dIIfu@k?fvn?WzO8w_t(`q#>6PSd-sl4Vyb`> zhhmP~!iAv0fxqi~rvG-CYP#}i`d7EBJ6`$s$Hm^*QKxNP_Ga}L!*}o2@yJ;%U|bBE zV|AH3cYRXuMSbace{21FPdz@wz42y+=B!h_VH0)igFSC=TbprvTWE4SXf~>&YI#=B zWs~Cx;wzoSXUJs!jGR1cW#CruMmGViz!#^@mj*QGmY2S4mfcg)uxfEVXcaSLMbjfA zjVV_;vaT4eWSp&HmNiFVdfI_qS_^MZgRS%k&d5-1Wy;yP`jmXmcVjc(te=s410e$$ z9Z{<`1vng@Ub=0+6C>}w%~30?)>)~Utul*p-So!?G!(Pwq3ONvS8k*)WC%^qT2(%? z)AzA_hni_{u>RSgt?R*q8+wzSzF+ZJ$PoQ*RT{rpOqhaKQ0anoNkPgW*@rJu1eUI; z^2l0n%^2jkAPt9`yxbr!n`D~B);;TpKM?8f$$KO6V}sh(KWpxRj=})VgX@MyYAkr@ zxsV}xRc*{xkDQR)EnOk8b!x{0K(6ZZ;bOhg*JW%vT|SssX!bFC0pF};#{{`qU-Zg1 zfuc+1jH+c1vx;e-Rq$np-J32yVqDcXDbxpaTMmb!Opnvm^Q)F+#qh3>d%se1eV3%P zDPM~SS3ud}vW?Xsw{`qd0*BbH<4bcsHmGg>vnFn~3V0!fqD<^#9mmN|jN9(?<~~}b zvT>qd=Gm3E!XfJ%4ozGc_1EXBKqp%8dsvd3RjA^)~M6Vep6) zX!t10{p!>7ZA;$-ZQ%})Rb4&f%8E1lq;l-c=11!5s~=pHm}Nfm`#gEq52^9?rAA>j zCu}$KFaEl_`MuoB*2MSycmDojE4t$`uG066Wpgab;7h1Tvxf9>TTwO!Lo@J#;tJO9(cZ!BVe_e|8D zFWvgT@8+Ff_x!%BGyn86xcS2-nMae`?UO3~ywm&r~18y`=$=u*EaW?Y@N|A4o)(Z$Ba_InR)wa@&~GsEY;?dQmO zq9=RIb$#N`J3g6L zIP!9(&p$F%FO>gnQ9gVBv-#YUIHe3b6(yyAJa*u_H~0952W!{f`2V;6%>Cd0-`p*) zm=gN!z{mI2lkah}csMm&nEgddHY9*W^mkJH=~sHwV#BY?e|xt}Yu7HVuGCUi=@U#| z6PJ2$?``K}6!P#`Kl#j=-@lbPS!PU`>9f<=a{lv!$5YboRo^q)nf`8XdJ$)abxZYs zlh#H%HMRN$U5k?}wJKY24pFbBc_1+l;tB?{4L_WQz6W z-Z*7=n$`bGmiMX65uYwj*SRyhTkdvS-$C}7n_mb#v$|!n^xyR9_kPa&nrXH6H~#|v z9L|;d&pv)CdD^ltad(8pregcnU2XN#7xv_be_grNu+3Zlwdm@iAf?YZH+6=HSfs!qoMcu zX75Gk*~tdWH>NqOg)Pu2HMjOw+>##u%i_n$T>{Tvq^$jA?r-~B&EMv?n*W|3%+lRo z+3vefbJm`@m(}X)YuD##b)n_$=T?U9->}ML){X^6m$sjKzVxMW

4o)g0QEzr&3_ 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�)CDZUr&q}Wi& zKfkVE%IUlpt_Nq%>Aok*9L@Lm*hkJcw+k6IZ)BCVa!EYm?08R(@Py<-be+-3BQiZ@Golx38J>=bc^hUby1J zxqUy9pB@pvT(R&$zm9Fiq{XM}j$d3pFFi5P&VK)I!;AXwRNkIQ+_tY=G*D`RYw_j% z{Kb!sB<|Z~`Rq<@hTVz2E7QKb5i8oZcatms#5-$r&DZXlvj6VQtwx=z7KyKU`u@HA zqhHm>g#9$t`_hG{U)c1?vTm(M$61B9DOcUkRS8PR@9f7^fyfW!PYZQ4UvF(ZHu`e&2)^{4;$UgVTB~62Q{fpDj#NR)gS-)Q0`}_Lp$5nPaTOYc(&%1ql zf%g69A7%>c%-+?X$zOAH<*Uol+uG~zR;g>RpL6v7araQU`Bp-A|G4%SJl@Xy^T+1f z8R4^C8Hy#lexAQ0vuRRlb#w0fZZXG@3dPDv zH%uafm-{_^xBI=Csp-@!S3=(H`<=JUZ|^W^)D2d*_`~A~SbgMQhK=_zxFjJ0%#_J`LIDX?^%%e*5RsvGs|CjlavC zInslk{VTEhIs5VE?5sB_4QgQ;4$J0qh8wtC_&ZJWi{;MAdtJlUgw?b8{Fko|4)*l5 zJ@HX^|A*r#^;Y&f8hr2jsAfFe%OmsI>b5qIgo*6kYpYUpXFPBaR$VIo=bnAv!t(nL zyLq*5hB3Z~)R|Le`+oZ$c6&SXDIB~CGmcy{Oj$Pn7*m3sYgL(clzK?t$CeWL^AfMW z@A)?W@3!lQBXlEp*`$j@c_nzPcI9o^sNWFh)~VSsAt5x#|6yKdXXlxDwzE5h)r|@t zxjZ{F(>W<=(QoFBViV#ed?GR!Y~Syky}`f!c<}CZPyT(JDB*nggTB^+PuD)BKj@A= zaqg_z;{#UvYTtQHI`>l=&apV=sK&v)kU%PT|VKx++opWm1@i(4{B z&D3j>py2OW;U6P@8Wfw&w);72%8|G)9Qy__jg*~ zWZ$3LSC~;!URo7u%&5FP!aS_@VxvR8O6~phZM{eO%jo&V88=eDd}iM;sn%$2&|Rl*uk?Rv<{KQ|Es^`C zyKi1~hqB6L#W11S%W@7hFxGrH$X@f~Vf&Z&_wO4!zBno}jYUw1r|rn>9rYm+bKn28 zZDw-h=2KjuG5?U&sW~q#-7N~1F>RQzJ5$fwzjQ%#bn;t$fkWOJh4ocUB3uVnKPoZ^ z(VuCk)5`QFJMJp?_3ar8H@2*==-764_Qf@!`tN@2l+~~OYyRt(q{pu3%KuDrl*`Mr z{XXy5)>DzltNKf_?&s%(TPi97_rK<++%xR$Jj*0m_y2H9jX}q=vsMOAFFViC-Lu3r z`N|HJYkIfcSjGDO{NPwTdA6|d<$2k4KF_}P|97ZvZf({ME3)_+@AGbgM^ci~TI>H4 z<4-BR=@PH3KO>cwCGNg|`r1EFo9!>{blZPs{ax9bFJb=sY9F{>o922+&9Zm;uVaG3 z*QeXd@11u3-oABN8@II9%KI*J-u$d&Z$1BHySj)e#X`fxZ~OI@cU;p| zlFhhi`sK{}orzzBmaY3YC)*}y(#a!#ZcqAA^hj{ue$6HCmPhd$KHj7$Q=e#?A1C!> z-iMZOt2(Ru>hJs&YbGxKt{!r4apA7tf!{bL#V~fFR|p z4-rAh`ktT(AB_Xylcjc71jhLBTwVWf`HtDEva?c_9J{*2AG~Jxy`r+|x5C^YW-m3f z-Ur>Dy_dOJcQiweMm?1N^OZ-hzly1NLEsE7RkKy|I6@x>O_hOcH(vgsbIGyVLd_{R zOq%rju3WjfCuYYwrEHg$0$ca@#-Of|?fO0EQ=>?rA0VWC#;Cei<9rm@dpn=#6f=L zO}{h$(A|)?&6V5w->YU;^6s+;3Qqs56~BYGqN{iLN;9wE$;%uQt}YLqx$|gCJDZTq zgZ7IW`CptY4kc|2ippEI;f71W0{h0sx?U|gh40G+&OJW!`?C2;tDwbN=Y8x~pFG>y zyDB@&=8X7cDgCqyCQVF#IX{>OrLC$tygg#=i+y`j!4MiU@wJYr@;(#=KCGu|?>? z%YqgG(-VI+TRuomx?(Z4+{g9v(Iv~yfqF;M3#P41kK5x8TIHQ#l(J-5ppDEjX(8!Q z|CUvSE4})rgL+RbzgOO357yV)>Yh_mxMbP6XIFPSXqj#ZIKa9m^VLj{idjaX?pYyA z&wbfED`v)x6}y%lJ6vN3>Gyw#vda5yaZP>M{FO7Vgs?qWbj0oI5;wOjsdbH|Cvt6k z-9X8iLs3t`v-k8$bJ4Tnpo=aQK%KIM5~0iIS91#aZ$` zN0%)7#xQ5XjTN)5obd2HY-*q;32}FUk?8NX1!+OS=I6!uKO9}MtWy+npl?8YsrxbB zz2cf851dNbFLj{1t7fXSu+;9Ax7a`5+acqVlk#h3?b+2;jV28};BDhhSI&3uu73Wa z^xq3hUhX4}Ah#WB-c$5zCfsp-Rl(eMmsy#~Ftbh#6n5*EzWRQp!t;K>Oao~-k5c=s zjh($l)fJ40oc=>gQzXIue%ES7a1vY+&~W*rM=!`=m%n><>@M%?%Fa4)&mrqu=xfiM z5Z^4D6WYrmCl_!iwixeNxn8-IDQ3k-$14+WXl!gZTOl>Q>y3s;0pohPl@q;PKoi<> zON-K7p5Bl;7Z!ij^eA&p;jfwDeOF8x)~kY#YshfAvt!+{?%mZ>bKW!<{Z6T0$Pk^Q zVs`4yLh*o~5i4b8cbgoH1#Lf=rKTyOpjYOYwD{F5(BZ& zbY*8PFl=SYSve6Dj};Tb{p^Dwivc+F9~rkY=`C=Xv5xc5`Ki+RHldG$CZ1|#dSU}w zfN>~%<(>0^mfPC0Gvc>?M0TSn*M~>JpaCt8*2-G>!{51CZ#-IlAx_Kh>Ek6?IaaTZ zfrI&C#HI6rosX5x_E`iicKEFKFuRqh=A#T~m;a&9HH-QezRKt==4QQdYfExxuMqq3 zlSuJgAqYxA@3;?{#$R|TpxU=*dd8wwrYAz+<9*#%-jM{kYxC~)QOVoidgmZQ&lj>E zzkpTt{_15*e72t{ZDq>Ijan!uJyoOF^u~gs9KA=byK_9FkHjz2e>CIipZmW{cTM{~ zPtu#a`hC>pw0k@L8(+IT+1+l(d_l$D{)<(Q#Q*)e!qnHo|9q#U`NhpE_i#sC{#o|x z^%*<4!%LPgFHToqyj)qxiQ{4Do)ylQTuj$^KkimGKS8 zzgk@{^zb*O{mZ5qKEBRW)SdmF$-P}_hM8JZVQllOdo$vz^M2hvs;u+uZG7?h`_}_+ z)$x>tRt3sf(@PWycF(qWOd?ayCTzkhTrZ=q>k3Ad#5zVu&vzRKwE zE&e=1^Uup=^GuAHt~q_vnRooUcUhsv@;L`?Y~z_(Vq4zhqY%M-$~fZR&;38EYT2IM z(2J>z%-K8l&!;o8e?H8QkJzZ*e21%kkx-T4*NM@R7tc67yQW(6@o`m|%=zU?8g1Y9 zwtw6mee8nnrk=0zHs|kOpLY56y!6Vd5|vr=jz79S@A>1qjy*MRBA0z#w?a8gyM2Fs ztNOFFOG!_z@@U^Uu;{K@o9#cH@1?7MhAj==kgAt|=H{`FZCB5pEuYqe?E7D&>Ylytz?@Te zcDi@IxiRfo%I4yW;(PWhNy}D(_;yBK-O$ z$BBr&9Z!$0ePO>q_@krve&4C7bC+o>6JC6*|9RVKE8%Ii6PC_D`{?&!Q~oH<*U$cX zRc&6!vrnb*n=|_bO($mE8BZJ+&#nd#p{v*kB_Jo+*{ z&NApS!@e+$1J27AE!p$!-oA?r+xa=u5B5E>nqNLG>00#i8~R9j_zG{^hlPd)S!% zF2UiK&9c28w3qu9#{53C*oQCfcsGCj;cvm}9@_0?S8J=BWx{={TW(uPSZ@9j`|rn5 z#;1n{@Wz*EL?!XV>2SWo%K!-2FW_+52C@ue`f%S*>oH8~?t1HvQO}T}iS9FK=r6 zv5GlbeEGOwzVZ7D8D`(&?(I6ne>Q8`qD4K|SoJ?Wo0aqJ&1pyfbyXABO*D9D7q@R` z?o$(oY^!HeeBbDEEk6DuJGHl0z{$k5?5knO8m$Gdt{4}TFJy?Gb!yW?D`=tRdwO%Y zyYW7E4(a|`Cr%h&|Ibu^yZi6z_{<*f1-={F6ir$Tc>UUsUEVg6@vM-Gz=Gt1Sr^au zu9Qm3ynBix!)0rhBL}<28GV)WF%EwF_^RYi->;nY)by6ooRiObRNL-2$?^nl>Em~E zR#w?3dX{Iay4g?5${D4+|F7j{RF_Sg#<)1l$1hIOitW*(*^l`%91B%kvIFLvpJ}7L zCHwpbM?;;TPZeHoTb6vYVn&hfw1v*M1QYHCm#?|@%3P)QM&H}c)u!(+oV@$fSpHnx z@pE6CPOZKAy^}FGlhrCz{|eK~3zmV`%s3TW3L3r~+;j10XRm(W6^#pfyno#C=v8uJ zGVwZf{_X3v&4(oJE4TEAi*9(GV!3gl-;9HqCJ9#4b z)h*=E&7pouziEaCuTLP)?!RHjwyx^)J)YB{axlWNWCxq8Ys&K|g_8}c=KXu3*yoxk zB`XxV{3bDb`Z~2L4{0ag zpG)NL9bfoEx^j0kI~#A#L4W(XNngX`g{EF>`Vu<(#QLv7mpNV=_atttj;Je=TyHb~ zWWy5$uD+)iAI@W+X;GxG_S#y74!szq;dlS!FXp8$zTRbw(zrO0&BV6->;3a? z`L~1F9BMiC?<}*NwwyvvcFaPC>qQS`m&AWKf4Fas z;pY!GJm&4RnianM$fn;Zmj35YZ_HN?&CcPIS@Wm-Lx$ecUd~hNjVG%gElzvy=qKp= z{p0q}7iOeoNMss+wEOpdTH}_jGHD<0%%8bEN&L7+(hb$KhDl2fFWJ4LK0@i>P3y=V zZxjTZe@%!u{$YaHwdU&oW#-qvdLQ`zMK5g4t#gURB87@lj-wYNlhd|Hw)*3>Ma6?O5ela4@jg$wur|wNCbDXRD_Rarr+jTeJnO^;rZDTF(c6DX?0w+*; z74eZFbsd{@NZ;C*m4Bbx^rg;@EMM_v&k{FKdv~AP(O2n*1nYeBV|%B6@>s|aZ!=+Q zH>c?w*^P`d<|h6Aos~2v(8d9zbe&==Q;f%4C&q0SJKLWdS-2J8K^ zLgrSntrFwfuvJiAZe!rHtPPG&Z-68f_qa4)zZ~;}>0$Sr381ZD%Rg_OCaG4&%UB3l8~+3>yZ=Umoa6BRL+Mh->-mt=JZ1%e$AydF5=f(IeY)k-kz;&XCvyX z%4^ds=b3eY#?b%jKm>?k-nX zra$m)Wy<+DQBWEZ@V+2R4uyky&`S4TtiLt$#)>`b+)R!Bf>-t)`Wy1DWra=D<$`ze zYcp@KNzJ&iV$Ow%hgSnY{Yq%xD6u*2dH=kJds~@u3@sL01_m=%f7>?$;`)jyt7>IK z9|z5?J-(Jv*$h-(ePn&Kx|InWE;epQO-;4@Z9ngOzj9^&t)t92@A{3xn|Za4gL?xH zS1;keR`5+;`|72mx2{aQvBD~7u@dA|IF5&PSLX_d?!Kqhf6Zjhs#d0)jT4cbrf(+; z>dgqOQ*LFFxxAy-<70!{WG6yq!TV?g1r5dY_EmfL& ze(~g&m23X~(4F_QMs;?-sPLQ%eR`b>XIwJdtngGsY_|TUq^-Lw{k9ihvWr^#=mFXL1VD!Kk;tE8@4$YCa z>vs>ps{3|Yj^q1EZu$RTgOqev{>i@e zTSqtRuxx#O&q-Y!KAGlkKEGec{YuSE`)1x9xz&8K(xHsI$r{1=^8W87OzqYSIdv>^ zeR^?L+vjCYjN2q^s;<2DQQG?`auEG+SZ%Z}~Ta z|IPeAN}^BhT)blXhRUaPi`aP6U7~xxtmUr!+?^|O%i_#acJWV-X8%vU`cFw|_t*3% z2ez?1pQjkl9{j4l^5xw5k@J^b-u0j1*O6%xe%-c-o40X}aN9N>`71JuRp(CWof*+M z>F(_taXgB5e;XSFspnqwiTh{O>b&LYr`7G3U9C@D^0#|%xVP2x+z-~@5+#Z4x4p{T z^bX4YHcY(4vhJO<@5jd8nxF6db2Qif+#_`D?C+^x(qbiRJel6M^DPK&VT&?2+3aRm z_{Zbd);$SUQ3*=UZe@#RGMfCK#TF%E0J^VTUtpRjLPQeACt_Vi5Z+LuJ$S6}?Bgeii zFReOLzOD7johnxA>FXaxw7R`HVO{a{o?J^-!_lsz5eK(TmA1&dmSOqOZ{F-%a{nK# z-ShQ^&NZ2s^Q*R8ykoLNzO!4bu;enIk(yhfO{%_YOTo(xaxIaUXZ+s3c#6=;8PWOA z+VuX-c=Y+^?}K7ye|GiWVVr*J&hc(mgD3x%OT2sEp11Bmir2D7l{5XP!PWwNu#YTw zW>9@;?HBKLc59?Kh2K4XI{UT|LxS(|Ih#8Fx+Z>+s9$^5)GR8aS}o>!`;^e%C%^e8 z-B}wf@gTl(&i)mzExy0=e^I&oicjTEQJzK@^M2)>x!T8k=J@zbVARQ6bGv}ccwx_u zbg6zGj%5{(pW9d@3yUw^$F_D_<^Dby=DCNi%74u2>)ZHP;$Ok%fTW!)$+x1U9_09iOv-!IB4qvnpp0+vOHNbD?%41&_vtC+Qti)($o;1Hr=J|zLk{ugG z7q6E*bnN`K&-?Z5lPwppnk7G2`~CCtz}6>XuM#>Igm$0u%yHCx)L~jsm{hFCw8k`_ zx4o~?ug=d-EcW=Gdb@sGi~YygxKExjTPXbKYVnd*0jF9mf7@)SR;HZ7`lQEG?*}i= zidpsP-D6Rq1%W|zdGdL(BFBEnDc0;+)ex(Gx|4TpE^qV1vc0o3 zLcCY-z?8H5CbL57W`}%mMuDXdy<%oPlKvPzrb!zoPE{5R(++bMxHz#fW6C7Z za$dn7Q&T6+i@xdE-)qvakaaqr-=p2inQMN1U;jkJ@yd#SF+w~MN*$e74u~Axa63OW zX7#Jb3zN-UCM7gnHv9I`>6)qUr7IHiHai_Dt zUL)2d%nY6hD-T}uI=Nn8-?#5h3s+`%#R!T|aANemcv*Py&8czcuD|YmUv2%m&+Nw}&O4SV^6%H3PWgFTfAiv4p|wn2mbH&WQkmZ+r}Z9Lrsmvzujlo~ zmgd{vKmA-Szj=ACWp%J$lA()XQi-{fY4B5FQ*HL=|GLHdwjSJ6Z=EUD+re0?E!_9{ z$K~WJ0#WN@kA0jv|8qU--j`B=Znru!^6GwBRrSbttS;3)5%Ed#{L@l3ty*#EF2xm( z6WX?~eB-!X=E{7(`?9Iu|1D1Fcz9}|td{t7>1gAk6rue!)jemu!-Z{^@Ge|dbBX`` zFUQ=$E+ohQOJTL2st_0>1yj@o z%W!SJbaVIWroi)MOOyY)2XZL391i*O$@h0<^+JZ|JK=WjT&z2`1*YfUJI>8|<>?7Y zWB&f$Co@+st}OM^+3i2=^Orqy+V)0tr`=%g|9B@?`Nd=rrD6G^E=gsk4 zt1Z7Jt*82fW1amf=7~R7u8Ave*|cMw&!5B1fA;xj^k!?dC{A`0n!0a(^Uu01uWTES z=eT~^qm(iVGZ z&$rq=4I965yqk5Wcbd%O{qxVJMkY$@WnOLA?arNkAvF1=ptQridtY^8_H;74nyuS= zK+k8-GImbIr7{t_C$(zxPx5u{FD{KfctqWG()?W$UF~(BwBI-4d}-3L`<;|y(?O4R z&+@|m8(frpB;QzNEPKDi+jG^&by*pOn&o~k-A*^el&!nlocck7?W#p&pB%I9AE9^E zpUTu?g^s=CJ^ka`@~La?&Gs*uf3IX$!52Rc#g@r8UcA=0{57+xl_}?<+^lVvZFR5y z0v(%M=I>8yl%&V_!x+vCzt|6?=!_HlZ}is??x zYai*n?u`HOI+)ucDD>UV<#W^&U4$pi40efGQd?gw`}M_M?~4~4E^Gacn_4_YyFUD` z^yO9c&)&Q@Ia}txcH8~=_csTZ#`bpaUw+Jcl2pO<5EE6uUA7@USt0YPo|UTah+F@E z&hd>o#;^IN&YceKb}d>NXu7a*S&YU3vFmD}t2&SWytc6m-gDl)E!1c2QD#sV?BVAr zFaCk{#o3qyI(2G4VhYk&uyS{?#&mY|UP2 z#RKZ@R@}KcYpVGFQ;*+hi#%B5ySqx6ukdk4FSyGGZZUxraa?p+dC&YyPR%+0oDlna z;(>-M3okoPxd`qscW|$W(sAHoy>h&=vllWgWnS>28ZzfuGqWo@Ye|5E^Ug%ASwi7Q zSY`A@80-w97C+JiPXc|=5S=Xb+jOcE<2Dn!jUP`8|V8i3;%cgWbnlho1h>K@VJH3l_g0* z$@Y=qhi@)nlabuGvNT@gwr4eH_OX5Thew}5*9C9{E{|F^PjlmpsC~B+F-tM z<4$|7cTXa<)~yVjdFpu($SsG$cUJiNF4nx^zDHptqrr{uN%`RE?2O*)a}&VfYVEO* z;kZWOgmdZ2D;wK-KqCa|L53?Y%2rMUO;fgr2NwGFzT)h?Z1yN-tBPsD`HtSVYqd^% zT(a!ty48>X4AoLI)w{+rS!zZ8kz=p9SXWs5^?BOjb`|2#ixH3ze9%xeNoqy*5w}TF z^2=XUf`%VjKBNX|9LVGK$Xc*XP}(zVj?2}HQlaM;E8*#I_wLI3vgfMJ{}VE0zxbb= z;-L&lU+b`E=*4ngr z`ujgW=jZmkb$g-M_Omyd?!7Lr`7~Xzd6dYN0 zuJj4lI}HWT-o5$(Uv0FU&L_V;p8xU8bM2coYi2xXDJ${hIXY$AOjgb18!D{q+#@$d zm_5#o`<+w@8+C+kd>qg$8fuRo{K9$t`jpKV{o z>-#$AC%%s6P;BWnHTC*anNb1mXk`e&O>(>F*wk}!Vj zf9Jmau1{))a}~cX5mXi{tN$o-UQctuU0(lBzf9L&=>IeQ_`KLNC!am8c-ou&B4Wm= z?VF!%DmkCYb*8Sx<=BO^7hC_N#;E1ne8b#8xoX1Q?q{FAuCKP3lYGeDXkMK1`bX!o zcU?Y{@$|r)>6KY^V!CerX%+XR#NKEst@{1+&&O?LZ~ncKuDdnU+u^q2o!`qfd3tvK z;L^YOk2^kJ+krphbnoT=M|@8x;y{Vy=B5@=5OxXc-dWe^U5rf#m{wX{#^I& z+_L1;`poy6x2)hT-%}>M)cD`I?doeB#6HijpYijD@e}{`pEF+Y-}(Mas_RzFDc-mK z8*_4{S{*rg_NQunkGUoE|J6jTA3 z&Dg1HGBakaU48P8QGmY)S zpJ<~8pDz0BS!Di}Y3&l-KQpGM=O@)i^89W4rgX4qQfYDer%(Lu+SU&lUd)O5%Dvia zaVNKya_#GyxLJ0ST`dE*bZwZlxn9+{{+561+P}AU&UcDEy#I8-vF+Sz{vhpOwV1ls z)pWg}^zSr|#g~^dzYtm2DCYBNL7JIKP zd0jbsYw499-RgqM`4&A=60=Gle)_n0XI6x@((Bc?SIpM5nCX|s+F;+v=yqz8U$DsK z&cMgViw~#HQ&Ec%a#=1-SH~-#tpp(*UJpH_ue@?DR<_J&c8qIUb%JcM#$!(qJPqN z4F2a7u&D4Q#)Q|;`nqTO_H`eeH_uwRLSu31!R|df)n?oNE;5LV^tN7hHgtAp(i`Xc zhyUcn{(XN|@^7c^{4K(+FJhHyAOCgcP^_7@O7y~#fQGwo=G28vp6{<_DyOJyde2{3 zNlB!)=+wEC;04Y(&i4{aEX>s&x=%lS%(&#d%{AShZRX<5%UCB`JQ7=W|8{@cwzzy< z1@(A#XOm7{CWa6BH=8V&Q>H$d7``rC)lBN5C#Or6)X~JL-G6yMcB=erjt>xEY&e;7 ztmfh)kKPX-0!%&`JbfO#sMsuXGh{caeM?8e?1PD09}5||xC$n-d{DPC<6(Av@?7-R z4z90maWkbH3s07K^Bg;`KV`?ZyAr0`^iMik-Hfh(cKGJ&8#CiPe%^e*JHt!+RsQ80 zUFS|VE{Npd|IU7DrNL}z(Uk&D9O0V-MIE?UE0(*dmkvP#)hOU-oEJm;yB znb%iy2YO$dv^$@5^Y$-K8tX1fF#6nlW1YDmxQNAVvET(wUE_s|gNt5?>@-b_{;3*s zYW{z_8Hd(fo@24EeSX^C=~M3iJ3h;^c7{wysp%_It8Z-_iJaMyPJC5lAksmdUa80@j@fJz3W^Kdfb+i<&2-@C*zaTAt2T+q>l1wk@k9D|Vf2IbNjJEUcCx8glBSaAm~B zjvg*|<0oOqGR*>$*mxr6*yKL^^GkK=VoR}X=SlOVvUARHKVYyw7j^2{o`PR~JKH^D zoh){J5Z-qqC{o68{dU>IHz!)0ebzBYz=>n)4Gob6EHmrUw!5jBCKzuFEO2M^%xbY_ zi8pGrZh!OmZs|;&`roN#Tf7&AI%qEUpR*|EKDeV1{ zkoEhn>B#)}7i;I6?ReeHuqD!eV(7BPKUsyPRxHG_k@Mtukgv6 z8(!1ixj*`Fu;g=la_^n>7w&}@6tB0f+4EPUIIgC%SN73|(|(T+ybR*-d9X^l?Sd1t ztzDzbV>LdRsH11rf8z9x^P zSW>QkFHlqD!VPgw2HjbS{5HpmxA!ja58_y=&NsPg&xD30`(jKtsJfXbvHL&jbJXS3 zv^zAb_h-reB!%bK&S$%*9T6^3oBGuL|Dido)+ajO9r;nc%)ltB8KdvDRywo#YpqRX zvc1)h^o<|4=Pt?o$g}I2+`sp2DNJ)V#vc=l`S>CE&(~f5N;=Joi|#x2iLhPX_C4dD zL9JBqZkABL+-%H#SWM26R^u0|Hh$^gRmgu|C8l@pNTZZ1d(TPb9s8;!e}A8MOlIbh z8P)F|-7<4C*p_%HH~EF!+KKyel~+DIykpbvpYvD$D3v(Y>nzk^kiH@DCRg3Pd6CIo z@ytIzLlo<_THUyW9c=yUzh#< z-U$m`k`xr|z1Yj-;fd~?{mXt$et)Ze{q-M_+kaMkO}4Une@^0&Lr&kxGx{oeYG-oa znwCDBdp~4a^}7n)_qN8<#EiPVITUBjfp0~@h<9Dd(u?o*tn{~y)=jx7CCm;(AYbJ?sZJ6Ed9Hg@`^N?q+ z{<@VDAx^M6E`9Ba#tru3i(fX+;`wTSG*-lhu|WmAY*1j)By$y0t|I3k=2Ja4OfF88 zijNIeR))xJTE=!~+LZ>O&R!MMysCw>SIEU5eqj}{Htdv7nvZCjPT1-v*-jjaHEqip zFD58lxZl6P!JdbWd28L&?iEU{OmChYTf$~D?}o*+D?8>jiL))piwUh+@;v`)sgIiR z(q&wSoS8d$xQ}FnWL#S&;KcEeMGS5GsN<&DAn)$3R8ZkpGxIH3a%`cR$esxOC(53^ z>zYrdEIX8=sAm--1nL{woz5^35R(CIytHIp%D}?<>-34Ut}$~!#||z37_i>=pfH0+ zkn)-^?WN1Ol9ZajV`&#vBzoDBl$tb6Lld?}*~<1gm0a=93VAwH_OrwJwT;TA;x@jA zuPz2v0C5i6|1T@IJ^onJcqS+R)RmwOm9xYaUv#L*P)JqVyxjR?RN4BKg{M4vlWGn4 z+n+qU7Y&NW51wIflJ<7I`grp^Xm_YX<18uAEaYrf_8*C>CLCD?inH4{U#8FNKHF<+ z!RpVTP-y9K($uuK|76nEQyIMiP916|GfWaDuFO~wui@a>Rlf{B)?AD-@I!5%D@jSl`8@obn`rNuH3lT?HTmg`pFKE{363Q@4Y=1He|he zGoxErT5{z_%}<7X;Lcyqm4-=*I}J8wF7oU>JUjfuD~tZFk1Hi6gCuKaif}ose3@># zQ)6RbzPq+(4BtfP{I#YC!zne>2a}4lzPsQf!@H}v8=KZu!-`{@^dUxe5Xd-*w!X&D&HE$I*C6{8T0P6Pn_PrC^{#0`_!pl zO1p20*E9RuT$#wQ`szM^@h?h#vL_ujGh8dVR=0a{+Vxn+R{T_)NbdJ(TIYU5(^gDVa5mFXla-`RV_gyX6VdSMUD+_zOu>Wb4r)7>tv zrzLc{>Vy1mB+gsK{%oaold+jm@Z)p6q5e-4V=I{3>;NkyAcz z!N#X|-G5%LnfoU=tvK`7avS4%>92ls*KB-V^pyYDq>c4<{k1cWZ7p6laqZPjkAAA( zD86(z#$-qA?sseVe19=NB0)3Z*qhCTdwy_?;hRJ_|z=fbZ~Y-Z=@pT4!G`{&Qv)+M{$guKUq+&L!rOHhTKh-c_x+V`xDS*(@;bM8)#2P^ zwx_ejKAn5yJH^U$&Q(*MwWf+oZt_^OKK5VoV8!t{Z~ne@uFqd7WR)m%Su9yvBF~XvepkNP1S&{aTYUfl9A- zsrQE@;#X8H&}x$k{q0ry@ml`ZH}@(htZ8C;b0zW8+4U>xy+Vu{N%c?)-NopSR@%{n3$R+ZobJN-P||dWm~dD@Uhf}w8Lq+OBP=I z5;^^1K)>}`dExZfBPVUYZ&-Zd?y@!}F7}X3RX6?4JF(}9uPYF<0hRuXT*SB>PELyY zsjt%_DIKY?pxf+?loy+nX!a|Q&8mqvznSsh{Vz95b?P2PVTF~nD0w?GH0^owa)AN zqoPCf+P0keXI>QRKRh7){=*GsQ;Bc;=9vAq@;lXi=z0dHVvB&{q*kVYKi@W=dwnTy zUumwuRrVj3^!UwIox8H4D$&Hc=wsFT%U=YmqU6nI|Ns6%a{jjS)&Fvnl0F>~4sO=e z(P`JpK5^QQyKeU;sb61D@$9a>x^vt9v-j<^6V81NKGE}gzZHjKOUIPGN2e<8t#5j6 zYoc$wCAYcs_Z!!Yj0KtV43|BtG``$-X6KBx=S}S&S4Q48-+Qh8bzR=?Z(4%QzH{28 zI$nIgp|E{^>;Ay&hM{xPLpCmRd6M*fS8htLoM&4Ls4c{)E+@tnkh5oT$qLSxhV6@1 z!ZJ{YSQwZ7p4o>Yrh|rrU8d-W2v~*k>+IOY#9_9oZkgNB0Acng#?Z#!5@U_Xpw$n$ zU#r|$A(0irXW|tv+tmg#->IX(_2akAE`MxzHR^sxW|aQqG+QONV%3|B$*W*%0ha7< zQm+M7Y#r-V<@Hq+oq1b6v(7F09l1lgRCXqKQ;>_(r{BKUWKa0;cD2tEFqQ9{o*;bd zZTiLKNh>@zbT2x+;&%S5Ka%boiZ142_V1em<1`ckop~pmDBT+U&hpFoD<${OU)4Bc zlDbXJLoD|ATeGCtHc$cb^iCdg_q-YL^JM;R%&O+<+b{>T@PRimntKtrUnss>x-`5YhOhyufF=UeqUgieYd=kx3J-^ zWe+_zC2o(*$oTT-P`Pwl$wmREj+TX)^H_@~<%AhsmU*#jp1?viGZ7gDjfkMtCv-#} z^uA9Jp4`f`Nau;#lzmnre5PD}C)qqMA4t0B>AP`qm+iHupsG{pl2EDVbC1^myXM^{bONcwRYwMdcNAYUFOr1#Z?B--CuTnp9hL zPb6De-B8I|!8xnTbnDWhTCMBg#N#6LMQd-TR2IX^)wvrcwlY0(SCRv_N?SgO$h2ri z1g(CdEApWC>h-ow0S$|$?EUL=br)!6YhuT)f5xU=OQ^&N2!4b?ctj80$raig1b^E-n)?w?eKj z{rSgg?O7d0o~j@zfsG4aN%&mdWuqjK6Eb&g;BS@{*1^JUEH)~j5<^7_;+}=i)~3Ie z?&wEz&^I5Yg5NW9%E$&mHD4TXnBW>{?r_^Ud4mL!gJsC^;Tv z?A8$x*f{t2@wFL@-k=h|V?QVjIUQ+R_1GZv^(WmU35!4F^d6crcO|DYliVawYzq0h zTx;#qNj)B*b^qYw{fuAJa#9vH=q-apmB7PEtxUVPZFfvRT|OHWK)w%?H@&dRJKRw! z>BOPvvi*S>k51Ku!>97RpEfRBwb``sYh*)sg7}<<39|#f9?Dqu=52c7oZzYTa7yFu+#g3lp>{wA&TwvY*IAiUDqf+9#-1jfNk$c75V*_a7Y?o7Q zbGOKD-D{~w7(dn4O+$8vznO2SiL_5{N$VWpj_^@w!spHo@(;6%J1nc^x!M(~Qm9C?~Y$&n$&MEYg;Yi+T<8S|ipuUs5)e6xLX~V)43# zo?;@PFg*0cjOUfqERD4*4j=g(r(F|RX(M}|o3-L`>dy43`L@Ad4`od2Fg7ie%D8o^ zK;_{k=_{s|E7xaDC;*+`+j8(y&F=EFRn8l4pLdvhk^K~ZwDY1HYt!GZ{BCO&r}}8> z#n2`14}6|Eo5x+qA}O{LWZ^D$(8W&IME8{)bbESJs#W!okME4x+F!m4fm4|dBnK{h zwKjcX_JY@GIZv#!cFh1+ZB8mi!b{y`)7tA*+AOT*JWCLE7wz_Qc@Wbkne`+~2o$H^ z7k}dLxOz(|db;T=b}eq!BmFDRT~bM?2PGvXw~)DOJr%n2MIQ7vb+fC0To>}zI`lP2 zXG;f5=y9u6*Ff3LCP;hCC959`>u%YOjw*1-{yRCrj)3C z@Zzj^kSCm68a6r4z0u2^yyr9DA%3&Y9RUm;D?U0cy!xmW9J*~fA`5PvtDSU|c~79x zl@m^k4{z+ffAmvnZ_e$vOO_n!P25u7`tq~AY5no%-=hro{=0mf`R%-{+I`9QXV;ZI ze0s2y9aP+kaIwUY}lJ`)@nO$|4+febAsz<2=7@TAKYVgmSwMZwD*bCi?vtW%3pQu>Z_MKuWsZwW!yhg{_mca zS>O0QSA6_Cp+$<*^sdg8l5278%T=!YsMGim@Hm%U+wSJcZvNVb%hy#be-+_=wXpP! z6K{)DPRN_%1vAqa@_9B2r1>W1ysO^kc2$1a;oB3LKX1aF zdcU)SoS$yulj1PD(NZ#L z>OLczDLf_u-&&=o1_;ZSy)QrM)7v7o|G(x!H>X~6p{$H`&Q87Sr+csXxbM8^{5L7@ zuLaHj-6QRO%zss1yz?5(Rqc!Y;!7W{&FBg;x^m0gKMFQK+f z40!zC=KZaL6VLZOc3NI5*S@IE!tj;8{8=`!oThb_2lcx2mS){w88y9JRWwh(zfB^m zsnXA>_xoEFaNN&2!f!hFOK;1pY2TRdE}#F`YsJTZ3F0kM4V#=z?Y_&)hseJ6h;1~x zUAZA}tN!7IZ+v`bl(uf%`M;Ivk^hl>%hj~DBV{Arc?pu;LVeTtrS&!a_EF|S&sK8WWytqOmseOOu0*>^^}$a`+q5X9eftWh>t;qZwv%tQX(O!R{+J#y#kpG)nX6^W;yvehChopT` z2#=}k{qQw$^Za#A$pz17ZQWS8NLNIl=f$3xzwa+?nU&EZHQ)Eg-Sw{)9y@ZxB(|Zk zliS2xjZMs0bnV~!3stWCxT$hzq1v0*p%5pZ3fOhVpsV{;;Yx`tn_K(WM=;+tcp{eU zc~gGVjo2M`KjjMt)*65R zualIH?An#NfbsI{-(C{k?4X`s@TYd2ZKkUKoEYOgR%Bk@*D}lFow3luW1scaOLLYx z-tJzwb5G8K#eKDx`=gIl( z#(Og4`|WnjXMQ`q^{S4D%=Px-w69AxZ0Gf^Wv;#^`)Kj@?i*1Tzim~^;9GXzw2_-D z@p$(AkKg~BnU!~QMhU6kvFYPJeq&>_&z)YqQ~V(t6HnUN{o6F_7N7UQ?Y8n#f9ooE zw$GpJbokWSKQCV%zOv0G|KyW){{F{Lra0SF-xf35!I160uBu2xc-6O$Pxe~hczW$c z@wtj;bEZ4)ialJibA?^Z;l6zS4=0;lh4Tzy)R{bOG?2Gp;Z z$MuHCa-qKYy^He$Gv`HptH0l{F!PD1%0lK}4R(J%eN3+W(IyjQazTc#Dm80H`>PxA z_n+BVU$Xf8>tB!0*UP$g{m#n&w>6ZCcfz(w#0q8cI(UPWs@f*DxZ9`BqQ1K_BRX9SJMxFS$*u&X6>p8w;r}^S*f~` zUER;uk$uu}Q3K88cR$PWFFCBd&BQvhY{jpAQ+%VdGS8eycvQJ~$J=v_U$+0g=jVO? z;iKx~h5t_4o>(^VQIhz{zg0%b=M2xxo7%OscD7Jf&0bJ#Bb3$mr$6bC#GO`4J)Sj< z5-+wy-e1VpG;d?z$3+?5Pk$wa&u)>j*Pj&dxOloy)-I(h7baPHn6^(&dB#{)66}6? z&5Ru@(}F+0w)!1udh_E&zj^=9xfCxkc)e`l9OEV8&wcbBzEt&{Fzx8g^yQP^ta#YC!amGkvJ|L{$*u}9vjhm((+e|%UbzU=D3 zDbjAmH(PAZ%?&*B?0fbHpPUyW^QL&O3p`wYKT^`(aJr`R_fOBJmHmCZ?&<31<{v{_ zJ9X{nXTQ@+xw55k&X=E3cDJs7y0v(_=iCYBcgW>!(_6pf!4I82d&O4$`|FRsR`FNg zZ(mloqj7qeR7PJ(+C95@o7=uUek0sn@$52NzOBRjNaq=ImIwYk>o%|InS!cb@05ql zJ3pRdP~-nF-L*m z`FQh@*Q<+?CQ72#39?fTZb-?9h(Gh_ZJv)$f!T+%hlKcMOZ`;7^m1Y2#_eskejC2| zEt`Jy)P#qc4@?X$8A;p=S6-?x)8}l;{d2dTSuRU^XJwXGFsbehL!HG*u`9E?OAGp+ z-QwF&vHNuKtvS3k#{V}g-xfIU7K6vTgCCFID12{ohW)d*hFT|Qu(9W-%jV~rkLtwT zYsmCnS}^18@8`WH){mE^O^k^@x2cjnBARip|B1!(uiO7GE!(?oUj62Mv(Af83+iue zTx_(Vx_aZhGaoK$zHrk$eP4gsk*Ar9^Ipr@ML%!5qSMBI?Uvl6>yN*D12@V3#ZNl0 z(5*7@OJd0G_@e=j1wBl7AMJJj*d1|Gev^Uz9Rc&}69OL32Gz=0ty28*_8S}J+;`jV z)SA7*@Zh8zRZr&XU81wof`V_k1kZkZW|P_}-U~r%mt-YeyT0-Fg3f7Eo$jwOY2$Bu zZ?BuS{PwvIftp`lPVc#zlki>d`Nh~It4Ql|^?12WMh_?b>+#MHpECdPhUJx6t95f1 zt$e#uGxy7tX-U>a+>x(t#JDY&eDiDBluLWtBlq4{sdbW54(_x2_boSkYV|8$zl{}d zGj*4%Pi~7|5nn!|S5&lS`zpatMKeQQJk2#aabJGjDYq=%4ND?6R@y+HBT)Qs7*S#eoID}u_tyVN( z^FL4@=CodT$FmbFlA6LZJ3&-v&5lwz67*LJfB&&s-E;oG|< zM|#_~_2)NTc4psv&UG%Q#Md`B-W}Pp#Gu5@?653vPE_2XW3?0P&8BlQ=LQ5H?pxIN z{M?$=DgRctYn(li_^h+f?0VDx#~G^%ADNg2ZGP*1ecIi1W@nGBcwGJ9fI@1Bz25&q zdA1uq9xo3XCa<~oe?c9e=)x4HY| z!!)l`z85ZSwn%GX_1%2w`;0grOUwSipYzTu^V-|3t_)kAd|&13`?D`6PreYdHRtA? zD;uwGO*tk%y>DG+ipVpgr%!77q#rt5H!)Iw7L>t$#!XAxar4q(izA-{>)aFhe?=W! zldx@1BpWS%YMoeU& zt!EcWOlC=y*1DN4G2^wirloaj+^&OtzE`jOwmQG8oA>>@)Wbg%d%kXRnlxw96#oA)tK_Pl!cP4tHD^?YT2Dz8^R zHCVU5t@<^eTuq97s@j6cnH7&e#+Yi({&?8bY;A7B-A`WUB)Sdr6ldajYMNs(t^;7p;ts^Wed5-(aowQYE zFIaKQ$*+;Q{aw=Y+q)y8-#(Vg_zo^2H}aT9>D+(a|4Kg9-I*)M^a_i4@MWc*_ZvG6 zXRdtdaP$0?BY#3XS4<389Jj)-@Zy5Ei~Vl5&Aw$8o1XM&iQoO!$wE5InEQ0Tz5Z)4 z$J8%tPT8g3X$E(mE_+qLs~skrbWvSYrfA!~ivP!NS1ej({(R0f*Tg!bDraTu>C-=4 z+|7RTj+*^U)6kq-xkgnpCilM1Dqw!2o1UC$w|CR)8(TL1{A_CX>-ZXtr-%Ei4Ii;< z%Feqi!^hTFAY<9lY^~F9@L#{#$COn2bC$O4imaORZcP*0{9-P1&N`+IhFL*uWt%7V zX5U^D@@!4gV>WU1c{5J#*k~4}XS`x<&Z3KRUH)~*Ju$P;yd8Py()n*6PJW7#x;5>N zj8l=?lMC0AHs$+9&Te>=^!k<8EVZWwSwZ}7vQJy=sSrM|Dq8gJi%!*d?`133bWQz# z_vG&R<}y2DW@SmO%q^O5&wh5Io_Od{(KUb4zHXWv!dr*Eiv=qFYe+PwPf)Ht)echQ`tcJX=(kDcDuDUvls-0iu`)_7s9|kZ-cqm=AIabWUcDBAUXW_!f4(75lSIdR6`d)lnxNIh* z`k$p&_u2l^bFI2%YCZcpvdmXWWZ5VcimhebE>;XFnhZt#LKm2NtoXQZZj03Y-#rd1 zK4$D}J@lH-I!}G!GY(EullXR_teWWx3ztQ=NclSTI$85CzWE`~K3jW+etX}-b9J0Y zyH+h!Yn!|DNoAJyAM-d+q4?^_67LlsH{X8HzxZ>&Wl2ucIw@YmD?jcp1vzWq=}7^T zD^#wqT+eyp#M==1v)fQG-@ZF)0cY{^hg@I8bIy3I_;`ES`ROgfSxVLqrUpDtpD!r2 zqx!!;r|H_a)wg|1>feF7Ms7}^p^viA*=spB>My$2dRO^M!>iM_>Pag)wM3nJwN$SB z$i4jBTjk1@Kl59p@@KPF$Q%TXFTA%?1&=r^)(ZXYbTr`c^IBD(SNFQ6tyrkmbM~*k z$bzgDoxZWZ0>ihpNbS%4RnyrrYuf+G0grPxD>Qk}s8wFb#%b!YqO(0BfDDr8N;w zXD_}Leo%OU*QxivkjfPo*Fh- za-}6NAznJT-*Z~Py4&IkMzpPSc0G-@M^*_; zX--pF4e6{uL0k3uPoF!N@M%ZNwDoJ#f4@`nIu$FyCX{u{R%79^$!6Anmbc70_w8lv zW)@CUa3cF%CX{8>QM!WjiOg%U-Zgtl*m_SUKl+=$m{~g)e~>i z51Ot%c4NcqrrwrWd{cN$>!7oEE-D@?IQ`zFXGN9xf`e|;Lbo*V*0YPbE3K{tmM?Rg z8o(U;Q4$m&9xK3;0v-x?zZjdY>U{hC#*v;DklWrL5(P~rbjU<%DC|hPI%{R7;NApf zV^dkEj)2~pWokRpLS?0A1#+1QWrf__2=Zvl2Tv#8f-7@YX1-j1f*oYTk@r5mt00@d zlwwx(6en7`~;^~H&tW=6r68S=WsyI()k$x?a(vg46R(%eUl}-g{;pZ#pL^e|$}n7>wIZxsX^G_C=_FNIusgu%tk1dN7{qqpC?@g$g?S_eV=CzcrSzgJp ze%6UBvs`#g=gLj*N3(wpj+3E4D{#I2_%jwE9%2cUaJ_GvIxkfoT^@ zH%+=E8ok8*Xyh!tOobz9p>tQhblLsbtKt2|&btb+FK0rQW8`^WZJe-bq1#ml;U7M} z-3OX_FBzL|ycu(ryTM{k638Vj0S=4q)rsBXPFga#m8ph9;l`1NjP8}isp;U13z~N8 z@W_ySz2Zl#saDr{)wzE^%IARQS%a0@q-H{vYit)i7NLIR{ac=z=Y|5)?*|Jz#Fu^& zx_{8^W`OXsR%uhMZ_~R>!4p&(3ufz!2$VCuIA;-U;~>Trurd>D!;PR)g(X=l0>2hN zI;b!5!1s8<)9I-`A@osiUf#BV2J^T3o+$J2Tb!C*ZWp{b zX}+g#qp`)72j^qVpHIJ2c)j*c<@NlX&-u@Pcs0FxWp~lZb-n8gf5-1%WTo_WMo7&s zmh!!OWXm1ao3FUBqeXw)_12QK9_QB)J96aDE!bYN@sWJ_$Nv1-d4FYoblkuDQA;}3 zF0QshHviw>#CN+Mo8KvXp1GgE45n5(w=?rHk2vrErT$Dd^0cg%Zy2WrG=)dsaBKgY-Y>zc-!rYJX|eZDJFjVetp~jnqarZr&}jl&gxE& zKT~L1S}^_7+0*Ag-g*@^Y4dNxbqfS#WcyF7xqq_#{GLPNN7cf7-X!ZkS{Lk9S)IvQ z{q=ceO0E%eTI}i6zh)mV?YB#e-YUHOw%dQn>BWB~n>`k`{N%Si`Rv}|4dLOJuB4kZ zo3C5EDTBS=c9YES4V!oVZL)h4@j+|7-c9$tjNk0k3!av4mYBCJF)a5GCi2#>lhF_~Rd6RsEfDMK_|@??Kybf9q9u zKV8lLaKzeoPUUA&pL1VDvtvbSZTr*j-}KnY=*c?y=fyY060=t(hvYu#UH*LImOFlB z?=SLX{FpTBvfQI($*&@QAN#!LSFY+T)-zW;W9rXaij-v>^8I)zyyC^r*eO?|Br3jz z#?)uU%lzwG{r2a&o2RPJpMAV}Z*NAG)#7t|C&~N2?k)9axc>UfG=}7Y7pKE3Q&Uw{ zrRP7MxHWm_lWCGmbiS9J*-(5>zVh7%4mOF@D-rF57ybQG9Zna{R6SGwq0sCJzw*j` z^Ol{;3i994lkNYudvTp*{qA(lna7t02M77T)4X1oc+Gszhd)W%uFcFi$!z&|)&GZQ z4yBlsbDsYHIse(ZTm{qR{K-{QH(n}K%<>ijPf1_u++m3E9`0z)1W~~!Hr@NDiP^5;!zLpzvx%A~0yh@0;I#Vk2XzIlq?0if7zk2aq zkrY`o_jtFp`-g7(xsLUG2LCszS030hf&;EaWuRPr7@43mI)|X~^UJa7Z^*O)fyJq<3*`F_M zNDA2ar&6veTQ|AhXx_5a{0~JJRo>M-F{#>J_VL-_{)ckcK1N7g*Gnrr_0#6d1q&Go zlPji4{*otK)oUDmPi?(Z9JVf<;kw17?)>>KyPVsP?cMYB#OfNOZ+_?A^GZCOl0NTH z?e&VZjF`jUKHfauyz}ojVUL4LzTFo8d4ArXGxNG}w?K3M&%>fi zMD(9MY`04~+j+gv=k9fz?`5{>cfLj+Tb6w#zkW9R{P;5+_vg7DJ5~AT{;Hb1ef4Io zno{d#WzDe?VVt4YHO=O{{q!dVKV`*@tqy(#av!%>zD5;BfO_$i_Ge0;Kn-*rR2>f`>xZ{cwNq>$@%rA6SKj}dBmOM^!GzOIS0nvY_iCCR3)od@ z{?~8EqS>zOVRX??1cqdxDO%TwE++ze=7@f4-VwuTj{(e@gN1 zRyl8ec|}HR(SJwgD&{IP<>O*McDy}v_MGW#joZ-&i~DuI+C0f|cpvGv_w=!4vXV0Y zH#e$eJG|GNV^PBRdiM4!GAEZI2VDz@O1`iompS_M z>4N{C-|H|e;9R`YKDBN3rPA9PGs-lbgKX?yUfWW#Mxx>1L)G)2_P;z{bouROi79XX zn>!xQZmRI7H4Rf0FRM-b`y%a|#pWA(Y$qqz-mM&Ny|IITQ)V>V@%vUc zj89Ls?#xuapLFqB)|q{Ot@p<{Tc#z;ct*T1u2QkB^)1MZ?2)^FN8OWIB0S<`)7!0c zs%>WUDfY;|nt9N~Yy0M-rn9_{r7mKgnY_#>aQ^9MN$S4Q`7>OT7FtJJmMb57av_axqKJG&Kcd=wPvo`DR==MwaQVuK`DLo*^DcgVvA<;Ze)csHQNNrvC**FH*R7SA9`}0D zg2OYSmizx_@-lz3@YoyQw(HAozdQZ;CeLM-%O)4t=N?g%-+v{-|mk;Nz;`vbZ_4IGU=C-TP-oHI^;A&bZ_x6j=(hp=U{W{6OaO-0KiDge_ zmMvd*w|-0R{pVjf?wvn)<>sHl8+zCBZyb8Hv;OJY#Ooh_d$YN}{haL7p(pa+d6K}2 zs^5`c{N0kyZc|TM@p1QusO^6;dySfB?LGbTy!Psob1i!n#kiT>c~bs=%D1?{V!{9M z>ZZLsa<&56Rx=NCZCw9r#!^pb$ysxbemIn6H*((Lb*v4UqK3uhF0>mBZ&eT;wo9KZX__k*7>&A#jB zTwgN56lHpLMry?Z(Ec%fY7~d_1i2v&K+*m96KA9G%4P z|Dt@n?UdU>Hs!@y<{emb@5n6KwTBBfuWa14tIDeGjhlMG zn-p5J`E2mo$oOLmccuL5vFnQzk3X?xP3;?-Crd>)H<`xgFT2IEIE(r8wiLrf22)e! zAHSLw?QN&r9=7q(>$_KGKhTRlI(>GvK~02J)Qsz^&nNRei9NC=Hn&LZfAP71tn&BEud$Th^b5216uHBA)1}Fuqb!mj1b+w=H=^rosJ)wbhE!R{qCW+>R%5rrOYYN zw7>UT$p23jC!18{WBufBCnM+W=X%1Qx?*R;+QV%VR=!-)FVXS(ux*dTwZaR}W{vrXqx)otrD zVOuxw%sAqC>;L14_w|%Z-?0Aqb?Nkur73#)|6el3ZF@0eiQ%U|t9P#Q=X@&D)>vJM{N`c=D}Wm301x zOSttMJ`1%*y|DFv(k87{`S7Rvj^nwG=B1m|Vo&(~{p?}?EvT;OgXp~9ci$I8=SFN& zFaCQz+U~>RhY}T5_Vbzh|9{Sm*_{7`z4he1^n+D%4}BGvdvepg{`~H?&b8M+o|$Lc z7vh`##&!DUm-EkmI=z%{)93b}3+Ed%nKzeNzyJSOd7D{7-i#%^e;Cbqz8d*1dTyYQ zDe8acznEyL74x}$U6HjVB{lNl+1FJKzg=2=*>?80iAJTV|God`0*|}Y?!F%RtN7m>Nt^$F7T@{1sWbEa@l5-jlOCG!=Ds=_ zv+HlA+|KXDmo{@t%nEO~`z+VbRXKOk_tzg!Es>2o*XZ|=UH|i;OJlXnw`-_BT zN}1&S>sY>D>hR+7c|Oaklvx#9^mUyDcmCC}bJ>vdcG~PP%?sQ`zatBL-FNA||7~1b z^KaGHkJI*lot+zY&A7j6-&0HBia+nwUDrH1wpA+hfJoKmipXb~Dx}&PhhhH*_`z>dk?aN%QIp6N1g|z>!>9hMj z%h|OG#OBu?)mwMUYP0vPU5|JD%$W6jcBILzdxuvooO$;D!mT@NxBZlRxHx}BZt>%F z=i^o0&JQrWQZX;&b9v(RGgr0*Bpd^6H+j5fdIvY_il}V@f@vc4M=zh(SsG%TnX|?C z%N*^Q*J7Q0Rd#;=^e}n-$K1JX7hkBZSxPo<4ZvUgGziQr)NruI{W6lf6y5S+Hb&=AN4e30c0_`N5!T9hd(cx zCM65xgxCtMx+Z#jiFYe#%iZ=xzs}D4H~Z}q&#!4&4y}#x;_T9*_QA^BtStUwT%hqg zm!8tox6g-M{mRW+ak=%NTG>K3m##T1pivPG1-HqX8<##x&vID$F|kHRP64!L*+MTC zw6)^y+*QV=;NoOe_wLQy`(hM(o;Do55#sz%;eGi+hS154t4b@UC;Bekvr%e$;t}Zb z@twTQpN?f2ty#HIPu1sD+pHbJixqRHH21DjcY4aOa2CUFuZ?=T8=eO|UUfWkSBMs9 z%YcW5+5?l=D?46kZg_rV*BpZt5?MCQ+NS>_)<1ip)pgMAYAaJx&F{zMO3X!uwuZ>2@>I=`qT}%;Pi}9eFC@b=A6J(d7-MZ{{9<>dDu>ihWI1ENHM@pwsVaE7LCVY#sI^A9n^g$h`ja z*eLnp3Q!QaJOPEB*xokh{i42NTmc=cF892O*q&%CU$bS#)cb2w|2H=8xcd&0PLIfT zA9b34@28A)q0IAng;L4x{T-#A7gf1gkGLN`ySwk5cuAWIpZ)V!*Hz}Q zt$G0~*R}uqHU&JFp>%3m?dGobf8RpZobKppXp5NF%5-JU+L!m5xXltj)H5EbSjbR% z?9s%_XT`Z9wkK|ejK7vl+*z%h_z2$`! zjYoP;)h>;T)!rX1eJD(-Z=-nO;ZX6SXETE(XDrH5c^`6YL*^N)=Sg*cE*DGYa2BdZ zu^o@A6aH@d&1Apb(ZVmqRbs~Pcg)@V`SJGtU2RhXum7EAnY?(nU$@YBR#@8o9R?}eeid3%cNe%?-QEL%1G@ymmf+v8nc3ZLJ2N%U9Vt|^Zr z>de$iVuaYt55yo@vM3Ki`O0clrC4)solqE!n-Q zCWr5wQZDxP=uE45-1;(}*Oo1vGP5C7;`tq;&f4>PkIj-2-lFnllc-KiS%Xz}yx-0m zrM+*YZ|wTG|IB@k3|oo%cPHP(U6jiDQfIvL+m@<(wI8*;d@g)eFM1TvEPG%4;hBuJ z=N@ec-1kh`E+$m;*VIMdpL|*EzxdD6-#=cbsm~NX|NP6r%r()mZ%gM#^>@Y;em&_U zG4*&C`@6?q|FR`4zJKQRj&~8?VqtXu+H1Ne0uGb36*#Hcm6(P z!}nIx@%?<4yIlA0&NupH^X!b2|G68|Cs%7EzSJ)M`D(+}*B?XKizn$;&Z+r(^^C{r zg^H%VoBHQHy?=j-^SjPFRlip*k+C@7Xxtw-wRq=q`|20ApRLx-%2>GUWaHurLI3l2 z1!Ah5I`Z`2?NioUaKG?Vx4}G@r~f$qpENth&8o6!hK|UESc{wg&n|z%ZsIQA_GIeD z^j7K3S<3M`>=#}JT1dRUCmOP~q`R=;y_iWr`29Z(fd{`wuX<7XrZvVuv%gI=|6^+M z>3^m{?taN17Ot;YzG-Xd<`miab?=s~N}cX{f71>Qo#sz7FR9(IkU6-Mp&e?ez5RU3_CfwK6~!QjeXxX_49hqD7eQEX7kbgp5D2HXY1b`zi;Dpx9#Vi-Txwv)qF8I zZ+`wp#>(T>w)?j8v;EtgE?q4*{f7O+dHZYKosXToQ+;1jq|UnkSaABq$NTFaH~MG2 zD1Z6h@>p8ayn`*m)f?Zo?*H&i?!`^>xfas%I22t%R+vW%ANcK{bnY6(CriE&j>>8y>vH>UL`{mOLK{GY=p9et^7n$vvEbOXy$X72yH`;{LTZ*F6b&c5~b z;DU;$xA$yP>pv+z_tcNr&k><{P4iCQ__*Qa+)a!9mPf{)ITt(kdg%7Q!D8<;7VkLZ zdFg@ij+7|H-*z{=f&<*slO&{~B%=ZI>i_8gzbzGpU83}!`n<-?QR*bwupJg zQZh^GZbV7JlP8mmKZNA%$>mZjn-s%-;zDWA-Yw5pE>U)0H@!B(=%k-^dh|-pG~J^| zxAJgqvfnCayI21HL5KIZFMFIkyX@fsM=8e5+d7m^TU2FPZJk->we3pMqh&9CGnOip4qM#LTabDoy+Um3?fuIS zu|}QJIA^tVGflt_FRQob*2J{kp>@zupw} zUYS?xvEJf{qfbn)?~GllKjII*yPI>fTJmw5WyG$96SsVvUKD#@|L5=a-+Sxt9p_&B z$$o;CaRotw=9==if*UuXVOdPK>uekc4ppd!p=gExOt2XjjbaMZC^I+}P zc8!yAF8SOclC~Nr);>z;l%B+FmnGHJZMi2|_kTr}>DMZ$y;Yf0cJQ!OWWRr{WN`3` zZiLP9bKmXe@UdM_n>>5*!G$HizInb+nJOlH;iAsky@?^eEcP|bydo-p%x)0_yXzJ8 z=acW3be#7UUKNv)s=heT+wuRs8;n~-iq=?HzV2NAvw!KeO@ixSYXKU%-~AU1-uFYg zJA3#2^ScEW?auz$vbO6FpBbo;JmL2FU2WHzKN|Zho!>kA;_|u2Gk8v2uRUb` z%yW*N($wbarePU|1-&c=iM83qATB?WVUdde|(NH+k|`T z8ytI!cN8DWv#WdOd`kWQ4DVyhFK4?jp1gj~<^SK+6;F@m&-i_@V%`4dVp*>yd#w5~ zDLvl8W$${k-sUxTLk@)Q-`zbkb@$I7_wzR_I&|CgS=#kK=0E-&o4unvNcr0ot9`$| z7xl~%iu;>kbNybav8kKZw5#hse?P4Dh5yfn*x7bZzMi~Z^nGsd%8g4de0jV2&*l}k zs;e1Nqa$Y5$nO97)o_Yj#4&IE8sCZ6Yh@ms=Kucj^zHX)H}*AOk-EC$?>^^UH}{s= z+s~>s-)|XnaM}0ykI(jM@0Fi#Ud3pe(U-C3k9#&{zJ{gbwu`k!W(^RwDmtG5XJTl3>hvtH)&zHED!%QoBw*%`TPOV0l1 zU67f3Y~`(q>6zanK6__IUiz7#z*4XuFZN{bmhk}ql4iPbBDH0}|+|NE)v!^-d z&zJ17<1gda8n^jBKa#lf$+GLh%e(WtR(Pi05xrg%n9RFvi}Rk}R}wi*ojUUTuHHT$ zA|qbrcsTLREvZ+>POYnXw!LyH`^r_zKE6A$B=PR-KlgVH8N_YOo1n)Jg1+!TkUbf6ibaX6uxPM%h02AByF0kW`33H+oD&hU4t!galFV9T(^pUBB%4{+ZC&rg z1D(2Ug71#3(qH}RHt*my(YkM~2~r@~&h(2*YV%zu zCZ&HRGAiyL!b~I^+1-x@z}jtJ(Ssvjqq>pAo07rQd6j9urii>&=IrR~(Eb=qE_lTKz# zn<*vgzV&Xw1d&gQzwd9joUr)KrgMds!NLtQ?$oI*T((>L#nj`MzsI@fZR%r_SoZV( zP3!j`G*)fnzi+(zrmxvvb0)=w+Zmb^WF4721O);EGPSziGS?jZ)}*m$pV$#5F#$){ ziAug%EP;YcTBV{ICfutoo2+YmU!GGSA(%5!`1w9P*0kqyKF={SKA%6Y_?!X<(;@{0 zX3Ob%lV{e=INB*BxH7W*Rtzf$w7w2B<64pU>fD#jm!|xz+V*Je`<%clSDGfr<>pkr zTjFHM^exx@SYAuWfGQ^xJ;@-R<60S0$eLXGLfKzB4_1-h(Rr;%7VuHosAbgJ(8;4i^sowR#X?go{qw0f6aj$dhclQPb1O%**)Oz~sq?tyR)`ERqv$BFM<@e7z zUmh)Dy3I?KcU`|U>y@4Rm?oU;x^?uMvt@YmwOI%BTE6GB+)`OIQSbBhX|*adVlpq* zGrWz_nPDpRsXs3@J!IQgEp9%RQdx)R42;Hn8DEay+^Ng8Fg1RcX{j57i@W`v;O(Ds zU2=BDH;T*5HvaJOw?TgFk#iE9p)daWyjiMjdAXy<<<-PonI7Yb)$jPrTz+53%~|es z{f^(-Lq{FMgR%u!7`u-)>7^RF?Ya5$gG*V>H_-&!q{VsvS>o-*&pbW7^XS_N(kHvl zmld51a%=oHw<58N*<1Xdr{mJKYj~6#m6u=oek3Vu&i;J`-dD8ZdRJXMbZTkXY3gn>Y%a0@$@gyJV zn6_j7J@;iiD`pk`FD@6{|3$s;>1l-wL1X?+x%Em_rOZ|KcNpW(YMyg_o8&E`utU&n ziMk>C`c5gs752ivC2wq~(SI4feQn9I$nRv# z;LX!jp;~XQWbwS5UDy%r)xRTU+WdFNex816E0^+R;_8{-e;S?%@9+F^=eNxH-?@qR z`VD{B8uWgAHucQ^&_&OMm0w;u*OFHy(fWMb$CuACbQak!e%9ky?c$%2ov!n-`p2K$ zhfgFX&oH|qU%QZR`k7pvh^iSrdtTT*Ec~@gdg7cpCvJY_?f&m`bl=y2Wjq{*H@`Lh zk+OVq{!^`Q%Q{=y{8NtHJ)1Fid)IP1yB+`VszSnJnO#SIl1CO)``^%K@6NcoxxP4X(&mC<#~ShZi_7nEhUwpQ z&XMejD#$#&Bb`lXf%$_6le~{izrWFZ@4c7@TwGkGGk;ZR2bpp0SbD^qQ~GxB)~N@@ z+_&l8Dq)S5+q12$vxRxLCj-lG2d7%2PTLH}bG?uH>ls|`%xYQCXYKKBYL$1VOP;Pv zzJ{ejYVpq;y?t}tJ{*X(6OoHK9`73dNxUHEX7_|Ed)J)b8MbOpUDMraohQ>a9od;` zE_LMn(<$czqNd4g-d=uSr>8y}Yvx4{O_}?j&BcpPcmJFc9K5;pO;b$?-?tmtCQH=h z51PNsJ@c|tVfUtwPReJFaX)>cuz*|oX!iPh?JN?D%|0Cb^?Av=xO2~zFE^+w(5dVF z_W7tf=M2>wo4@5Bnp^ba%iqpQfvp_2IP7-l|Ql z+}7qr3-aUr^!{`;hkdza8p6U~H{n>jn8Ew)IWkuEXZJijdvpI6o>bOHA|fIp?`*D{ zac!{Ozb($vbLwNWT#U=$(!{%&PZJj9K9^CtcT%I+YT>c7 zqRCNKY7Tz>s=h*w1;>xy?p?Nc{<4KUO_K#5%_%JUw7|e{rjmo6hmz-2K7Gb>q3dT| zbvbbQ_~eFX$uqC91y~19dEO#+;rc3BE-o%EbA{k_kE7ICeQSHJT`8J-C1B>c?XH2z zr{%Wj^2fEVTJ-Jhkp*&ob8hVFobg9!dT4>#mirE~mi|AttTyxL<(_p4I|OdrncMW@ zbjobU3tN*e1eo)!`#0O9Sgx}5TSW$ogWHEJx8z!r*F4wxIUJw6ubAJu!#h*tB-6Wv ziaV@4zsOt>nLA&4-MzaRbH16+jBB(=Up}d)XXl9yomH#qjl~_NIW85tc=F?kmC+}> zC!FAvY=3i)Z-vK=DUB}<*Ct07y?A`L#m1=P*!#RklO!iNiiNJ|n*B&>6KnUTKv$W@nGT*k!emwE7@yF^(4(Ak9 zb(`PJ7yInJspr^X`S4n+pJy*!*z)1{JQW_kx*w9kH-qohE?)C(OVv7_MG>7Fl_t)b z<9Da?edGpf@shY7*~MNiy$$OEB@$;z{Ii@N>viU);DvRIT;C*4kLvpxY%C?RryV!9B$tg4g!5+f9>*`Y!F2 zt+L6_rNH6c!CGAz&%W2k8r&2_j(s?PE_sP(!wdJ{A9i>2_p4gRyP3HZKY66^tFKaE zvTOH@t^Km9iQLxu`A5FYR@P}sm#+G5wBccplbcyW~vK&*sy)RIXGS z`M#HSeyt>2R#w&b*3Mt>stcQSuhdpA7454HtKTn9=s33SEjNqhjnHKqFO*80ef^(T zUyg5D#WwvY=c4-`OS*o|EC1(rEcmyKzRjhc@_p9rcAs^Q%c_0+l`VVHjTX*x!tljDc*=hbheBV;uL>%+uJm7TZBg-*6 z!^zh#Z?fE*srfo-_U8*v;!H|1Jsg^^`OK~}zj%9J;@+*X+)H%6<@P>ZnjWv9U?#hH zO8mhOW`$|r3+Gk*&g-eb60y7Q#c&LE?vDM#PE=QsR% z^5vNmri(7CYyo*5&b(SDT$x!F-c|BVWnEO%H#eS!l%=+pXYoDy`P=y-D~q6( zZ<^cch;KUa#}Cd)>6`!U`A74A&i~Iyl+|r+3vP6tA#{)9xk9~^xbMTI-wfZx?3(!a zc9`(zFPHb+(UZR^cy8U#wy%+DDJ*;5)pe-f-T(Z+&o@Db4@@jmp1uG6<=ghO=-k?K3)wchmR}aj-PNSa9~bR%U~y7D(3Ved@yd*|3DX&2TdPMo-Tp^$dl!Z-AO-+YnkA&?H4mPjth+ZUS&b7f!Qcya2 zZe7}H<|AU)uY@c;kmZ)+^-rho)Rp#*UXX^SrbBB3ehW$q2zs%G6ODl(SXfmcNKDS0&*mI0jGd)IK^_(5&>_ z{jH(Rxu!wMtKTjS5c{{!PNyza=pLUElfp@(CItm9CZh?(FO6otY>%9yAvkeX>GHE+ zC;kXec>S+s?d|XH7r(i_d3*OSi@$63v8n$nUF3FP-&>7&H8m{E>}ARk>D9&++TGrp z<9K%bca*EH;!s?5YUxBBu}|DwC(fRC&o@Xgk__yekZvL{b7Jo`$HOekXKf9>n#J>3 zee2q-<~mb#{dx9HPhWoi+3QyR%UdSB4Ug{Vm4EVA{QaSGY^Q~#d!PKxEWbY~cWdl^ zEcW{)YQcdx0`*!uIO!(Kc$(; z#ORwKeyG~aDOc#C$Mm1sr|pD%)@^xV-%zF}c1DW#r~CFz##*eV@7Kc7pBy?}t@YO0$>ktLOjye{+lS zvrVVBxU7A2b%odL2v3(LH@~ItJCClh$X~g^CUo^ipZs6a@_8ORZ+#0oqi6SDWp?K0 z+1FO2zWV0>;p>&QBS)SnTD>&*^O<>mPLJFF^?UD$cokQ#Yq#>cC}=mocFC`oZ>>Kb z5@DaF_h)j`tj((=G`lgOJbkoo{vYn&Tl>~*U1ysZEU#?3AV(zNec)r+7YAD3 z+6zxry|mzd#Vyvq&Pi1ac9y>*_AB#EPL@!1+j8XZ7dxX=hpRom=kMmU#3chJ(Eu6m2^#D}1kXIR2e^sA-{X8IsOpI7=07Fo z=i=8@iFg;}9lo)g{XzH&_qE2wKYr(TdQ9NtoqwWZ_w0*S`J(={H4?%KZ2d|9QuzDk zo;ql`Lo%;@+6PA$u5+@-4L>{DUrM^H@g=A0?lkisCYN?4UD_&lY6@dw#kN|u`EN?T zt&KT)&*WlNrJQW#pNsFdZ0ApKTQTqS{6ybXo;dtjrn<&v zT6oR6UB<@K+lxQ_+-ET|4`9`DrCx zwKEU*B^Up+$=)$_n}=R%zxCbu^PG;KSpTCYep#qv&x`XbER!$DT@=1`OVay~oZbI- z2Fso~SJstq9E%ZMw<@@1dxo@lPh83T4;Hm|dp-R8p1k?hcC>z3*jgKh4{s0scy9Gj z`hoYubLS&BSo1FbhThp-6*O<&v&HcVPTe(+f{O}so}IPdEWTm)hEHF2Ke3+l-R;=t zS53?_=2m^arK3LW%*`glKdEuKg?)=Pt(c;I2>pHQbS*aMa@Lt{pPX5zpPC5o^HbtX zEnT@zef^%B6Q5YfI!?=Y^mf*xx-Z;fac>S=n@|0&t=Ttqzns9@?SYZG`Af||NTe*S z6JL0-;iS(CjY--&9|-K8=pXJnG5zmZo?XkBE7MAfSr*IYJ+cg|+c$BAQ+}17oPYfC z8ZOznC+_TP$>&RXZ1y5GZTnu2lqRY3$KqVp#~d+hcb{?pyUJ#J>n1r<-(!2veeiz& z`C^^8+r2CG?HXB@E$M8n7nLlgwO-z*e2Qm9^N#vsDenx`CrwzRwj-5C{_MRjLB{3V zoGZ6=YTGeJ@zsAde4V`K#qT2?yS5lFoGs_}aA$7KE=#HIt*;`Tc^*Bibl&;rn9?`N z?%M~J-sf4CJ?+!8eF<`M_a}c_TVwI#Sx%U`hr+LDU4OO@JG$NHzisHBuRrZ>_s@cG zFVSEA2fqcFacwBga=)P=&3dKyRdMnR4~q@6SsXU-t6Wi^e4|Sg~8)%~q^wAr_O%h=oW(tL|5pOo@P_OfCPzy7^@na}xF8ESZRyLmnQF>n9Q8PR)> zFFTo|xLZMfZnNz-Dc+SQ-9PwNNf%csomiK%=K{y(k4{rRhnl|gX$Q>$|6sUjRnO$g zz%9N_|KZ|d{!jNd1gW1kl2V*^zwVybu4;?o`T70N-~BC-y47;x{QVT)Nz%<}`yDeZ zo&D;wxTXEd7M=ZeRA;x;#*K0FrbwQA)zNKI{Bs`v_37^mRz&kBZaJL4=hsI;o^^XG zbHnPJ{QfwtVez<_^Jh(i% zV$+n3CK!2K-kxSqT#;Lsv@uz|$}lHK;<@Q4`jkI?VwCMMcIN2KU%T&HeE1-- zYp1(V;DtHW(eX-2rHq?WcJ2Jnu*hulgFCA8=3RdnwcB+6^bd!8&qP&7c)$Kwb1P_< zROt0(@1CDdO%MD&@7Nwa#+*GBGi|f~tKHFT_qSi=cErs~QSa(phy3(grIj6R>U9dc z8ks%YKTX)A9J%v@N}+Mw;rFk8dWM}AW}GTv_@mbPW!EOncB?o3 z8coa8gu`dw*3Wr$M`CMgbFN`j^69ss#Vc&1E-sG`-c)zr>x$@B#TOiJr2NE>2j|=t zJ%9B_BQc{6p5Rf3rF<##pKOm;_Vhk^_|cU%MgB770#}xk7kA$*Q=B{{NBGu+0=Ms3 zPJf;iORNrdpUNek?w+z>gNFS3ruT}!mC_cgPk;Ao;-dKQ&^afsHu!y1V=+pw+d1#O z6z}twH=7Gj*`Gc3G`mw?Lv%pn0zxv;{?OYG%8J*j= zQrD|5`*7Rm5J#Kr=W4;{eC!>LC3!tO(m5sDZ}E%9{$i`+ms1b;1UZSx#jSgBC2mIW z<*ws?i9Gdhv@G{}J#AD~?6crL@yq1W(XbtyOqPq-ZI9bIiZ^!&gq!ZZ!o+7cRo}m) zo?;H?R1A+!Z>ezm)V$u_`KM&!~B-edykTD2i?_^7*m1;)f^oJSY-Ax z6^6~6IMGmCa-wVKSNkZn2AyUvkwT$IflKog?H!d4=gVxW-pw_6_9xy9n>!a7nl_uq z70K;1%CNa}^6u_AKQ})&%HJ-{-@+dL_L%bX$&=rAP2bJ1$e6b|Mtj9#o(_&xr?#~8 z=rn7D)g*<*-+^Yq&H*o>1iLHZi<~_ z%FxuakL#)DFPl$uZ3=`PF0fuYu{@+cbXDEW6KcX~*1Tm64_@^}TXtVs`X}a7?A{My zjJp_`_N@N6LTB-wQ}O&yw_jYV@N~(fcY+QLTmpALd_SjZxtC{o>?sAy(~}wW83jJR zwd$!;%=)64nZfjTBRdPb{hywdBJ4FTHnlc_j9a&h-+GhNHR0r)-LtRkZu|ISuiu;7 zp;@{Qd;f+{J6l=Vk(YOavCNUTD_5UiG9~cn+3k$hOtn z+ccKPm0VR543Bf!cIK1FD?3pOk5g`prgMKx+rg~QpL0`k+trf!WdM? z_|2BxcvZ9DNk4_`c$SZ1lA-f_F8@AuVb_V4xpU_w?>-+~k}Rv$%~K|2nl;rUY!zep zefNU`y|K5&If_%KdXIp zHU(QB^Lgj$JiU#@B;)Lsm*v8H-%4MLo^7m@x-manN8k206XV90GnN`%I}mde%ZSi~ zsh_U7iY9j0b=KVqd1m6Ru3Th0|EO&mwioP#u-EW+yUo}Z!XQOI$U25s{&NDSD zrGIM49y@IR$u%hM?-E%w2xg;v)^0tO;qKK=W6>;^wfy@O|#Ycy^~>bs&V$ac?Z_av^BK6 zF?nOMr1es*Y3dvi86H1^{U6FcaDVtre@BYWk=H%K&T4&&6SJ&Zr{8@cdvDI(>{S8x zRwd`y-kE;Vc)7sjpoZAW%etpm%y+dr$M|)zjrqy>KVtk-Ecd z^bDm-xA~}UdH*$SNtFKipw`!kcTaA*<>9_QQr_^xk^0J7@2IQSbDqdQI{r4%=g;}g zPrUn9^sRfgd5h7pwNp;6o7!IaZKdQHBMyrwzmI>DgqJNkyXKwM#Oce*mwKf8KU%dk zW>bT-k=y=tK9$en_DE%P{`gh$u}bl9;kLQ8Ejt-s|6I3b(}IfFi;MXS`?p*BGTU&} z9Gp5Ocy{ELZ1df1eh;RKTThs>P}$#0*P7qql+EeFcF#TkqTG#yzHfeXd%x!-hJ%O^ zui2-3@_l>`?u=wsvh#biX1nraTj7rFD>81pFLZ0Se0=+me0yhb=8S@tsi*&|o%E{I z6fJ9MYU&MgH{;sS_Ti6ld)B=!E6J4`T?2!ogU_#-u6+8b?EY`d9NhG#w#I19?dj=J z5dZ)7vFqNfbMLrb+)4K^4dT49UG|{B+x#_qcWFn-y6M~#)%|%~H)c%&n`^;lv6?*( za<@#96S%P{k@xSr*WL~F22s|$mTsMilhY>EJ`7nqqfR;My_(5{^ z**f;|Uo#cCN<~fO6c1(y>rY6@J0<-7i`u8D>n&q0?%DCHE7p2m?RM_p@&9KXZnMty z$z-|1elBI#57XjpcXo)K?n~=Gx8Qtd|BqJ@rfR3T&Y9%Ab9#1@m;L1X z{7S=3(-xtXn%%SdZ(MN?OkSOKU+`VTnXS_VK4e^-?`U_@ta63-UFxgk=96Yti|&0^R{ytl5t~5s?BxH~#guZru1smxnsM;F?V-Cr zZ~uJaQX0nK^wDHTp^fDlhURAGtv%GGF z$S-Z1#!wxOU%-fKSnPJ8oz|z#Xos-8b&+>MyQVHrsTyc+J0<)fy9Lb*QSXo(HUvCWMU)c2i${oR+O16I8Z^;{dul~Oh zK3CXu+n(9eb=|U8sb{_7E{k3M>EB`A>=)eIlqu9zv)SMMuVY=lnM|2=Sgb>E~|?c_CcJ}uEvvWq$}?TJ;*T<~z@6~mm5 zPm5G@R`p+;Ri&P_W1V*PhuSs0VPXN-uH3PEb@__%#r5i!<6bn!CMmt-`?ul|151f+ z+owM-1bTLA#e^>Z@vb|#q^?$D`u&I_cF7+t_5P+A#D3xSgz#0TU>vy>RIg<)A)CuE^FL6e9rZyJUw(Y$Ey7B zbl%kJPkuR1em{-hY-QQ=&NoEWzGFvu-4u1F@1I|Cxn2Q#C`2^6=SqXn%9Z>vzr&I; zwd6OhoP7CwPU(YtX;}}gO#|*Po6osp=gJcnSq^S$x|XuV$_`%+9JieN_@z;Tnx-N* zzrJiIdh_-olcUhfmoq&YZf3ZIO)u^2tf;;{v1AE@q=A}h;Dd*aegYF*_^bMAoAlU3 z71w2zt#o|+tjkbWR#;*A@=0n}&%BancoK8T$hV`{b0Y zbr#^9(Q4hkDbPVzZJ+NQos4w>mhV@b>y(PFb!OORS@HkvA~pv#>*Gz!`dP^jwe0}ky4XMeEO+5bz6r{^oA$$=|{h>o%#6;gWjIq zb1RG$+6+>%EY#=QyC$W{?qdfhs6XBtj;3;M4fwFXAhHQmxt`j7@74NkF^SPKd$#Fh zoeF!hspfCt!)1?)PX6~^o&Iyz{q=v;ls|u56nE8h(<#uL)3sBewNn8B0UFO9yq}%5 zbdIF(HU$m_CMKtq=Id4evk9#G(jfzS`zfY5kP;(!^l(<@0Z@S`l~+k_9w0G_Kg4a%0>& zC{Yn{-szKzH*tQqq*PIT1E%o&k-D#H;oK_XRc8e}wT(p?!RR0wnQsA`9+FI4F zl=X@ubaqo&YxW^GLDR1?OATR07@u-u3_UFNR%@nMxbNjFr)JHXyPGi!=Ai@%4LhSpaLw{3Rb61;fh^#xnY9Ui}ExOR}S zHcxJ)VPW|#8;JYY{j_{qVc4}|rShF$B3rcY2yEPV_1Y%T0)ZPz$u}1HnkyyTFB9>% zvukQ(-YvLh_3laMmqzNd-TAN3Z)@8k5c>2o=c0!40EUCPQ35wiMAk20h_ShI(dveB z$I~-0dy_j%Y7*4+zZLBAWs3D(?O8nY(l##Z$J5(UR@j}sd9!rxso(tOI{AJZw}zC= z|0k9#9iEtQCynKL^^AYN0-Ev+PAAm*nX_{ZUz;gBuq#k2X4`f19JlJl_TTY! zjlXU37rVZi=JWHu%dM*yQkN`9xP4>Q{^ahmySLmJuW6Ld-guO&`E8d}^xV2-E?IfJ zGuNz$&9R>nd}$IBQ7iSXiOX=jvT8WT$do2?;YI)E;%E`4)B8%YU-d9_^wm`?&wF~i zBSK|$CLU`x%e+lke`0pMo zTb1=yFhonGo3;C*%ffpO3-2*(>T!D>kQa1tBWv{b@-&3tWtvgeMQAFnX?$+BUUs_B{XZxu<^NL0GqsZ+a*!j|?=Wcvq zKS9&qY+=IP>1!-9cO9Ljc_%K%G$^^-uI?An^w2f zdk1#Coc}Xd=uBk$d+f5_3wfc-%pXqPJpN0zaE8ob3ByII@0Nd`sL8x4?au!@u}Ad( zb|(Kc;)ptOra9;K{EoQ04fpuV4}=$Y6$kFVA;ij&*TVbK^UT5QMQ%K=&L62`Gt;^6 zy^AN~?M82#1HXFHHU35f-@HAsG{<_s+|IA;m6=I>^N-~i6)*k2rLRwvOS<%R^~;Id z`u;~(v2Bi3uDbuctDEE3H0PN{3OwhxoqsTS?zw$aSKpYuY~jz2l{U97`83YecCFV* zeE2R!<>LIn;$sVJ7pZUAYCP?SZOy+}l{jYg&kpSho8oHv?p3Ns>`md{_~TOcAC0PQ zd98Q9h0ok=EH25|@2LMdtGign_oCp1L(^a6i*I_jsB0R=giLh)S~aG;x$?=+IOKzp zFAGX%U6f}DvHLQ|X5K!(pCVRP6L;2fo?i6+(f(jnu|0dcWh4*u?Vevh^Fn<6!PHZK z1u7>xZBLlBv7LXvmBX^o_x=volQhov^BtVA`cPj{^hc+?tl9D!Y!}=saumyRV#1kwsD`QHzDCAzunJg z29XsPY9CcpS-&*QkUjA?nf3IybS1`B*B<{YDzf_=7v=4sn$*6g z$HmSKsIgr++wkStY73KU%j5Z9yj=a+_M3^e=if`qZEAUNsd;+(&kdjU&tC99MXf~S z|={5MBl zr<$|9FYGwCUT(#cmyIkleO|=){`vg&dQK<%5r$uWvkukD{i{gNeYST!U-I>(`gQ+n zj=kQWuK4m@;nKkkIRnX$F!u^Z#^cjpcFU(Mh1r8Gp6>H3+Syz>p}{S}iA z1l+4#C%)S+$31!Lf47hO(`!0yCib1vmpHC``sbGfgUk0eh20Ab+f&@NS^wPf+9T~X zm8&W~aO5T0{QJUC^R?>DU7tT&zety*mp|LsZjv*{w7;Hf%ND63`?I$EoB1~!dGqA( z_VNjZrDw7;HReBS{~lhn@ z=hYq2yWf9*Z|=ppHceM=Pdj9q^6tXy=x7mBvp3Cm)h=Jz7X7k*<%*TzC&KoH*`c#7PwN#esXV+JMHGuKJLEUH9<#g)ve5D#?_WK z89c`GZH_HGu~_C#;T#=Ki>ed(2ekVcX=(54*qjO?V=9?vCW#54ShZ zbU|8~8drL*xGe99!~K18Vt$CSueVyR`DbH}VPJE7T9&4DN~GItv6KDU`ioxvW6Ce* zOsHKXk2Wvm9eGxz>QZ)wGGCohe|%8Pi~p}=W-*oJqRkd@*1nbS{3iS1dfSC$C+SD^ z7B0^3eUgH8w_KC7{Qp|2?6tJfySwZeYb_7VZ@qTn5v5N@rvCJwN>Q`n?0M*M6NJ#l$ZBygv5qw;b_9 z@zss@?A#;f-<>0O_VSG%*ZSv}SO`BU_Vx5Atp4%I+IZ!4$>$F36X$wH{AXOb^tZF@ zp%08|+iE2GSv@+gKYsqcWBX|axq=_F-+%tAn5S+yjgO_u`trKd&L%b=nJ@Cnc-Yj= zYFk@-k)`cJ#(XEUyfT#o6CC!KE>%z6q^{I#`Pcd81{M|@l7en0zovu6s+rm*ub zzs~+R%e3S4{M_R|mzw?PcJJ86QSn8>tvmU3#9Vb|%_B>9-M=!=v;9-y1yG+gROW2f zi5uVDE+2fzu|G9RT3^eFy+` zRs8oS*Kq!np5w>%zCZTz37=4r{)gK)AAaH8{QQSv^}CmEkN%r~?qSJy3AL}^9>2w`cpUdLu2viS~6d{&SWIUw-~g^-F(g*eUDiwvM2S z6(5>SemrM>_WqpX?T?=K>KE|Vzt8YFd}Z^Ti>DnF17}|sE1$Z4t4&vjZ3#>Jw#757 zSMu*GTs=cJ)$Qu1xI^6LhS?7jb=DsLoaw#thgDenrPJ!u;vf56ijeSDf9~<`#Olrb zS8n%jTDDA0=o*u0c66p}_G06>+`uau(ySrU(fhV(b>3PmTKmgX_4W6)F0p~qO??N} zJuE4-Il3+Op85{tcgI@W;B{^}exmzU3s<<`=%V4J`KBecqKe ziB~gbPsl5WZ=Q9(O($)cVx!}iEAc78oGIL8g3R98x#C8iC(Rb}a;BH8S38ow&p5dJ z$(>}K+0|U?`vq>5@;$#gF;b`Yar(IkW4CD&<{p;#>tp>Tt-j{XxhWPpMqV8W? z60J`4dMsHk?#_9}O?gvP?~4~**>zTuLMPfPl7dbN);DR(`9;n-KfzH?L3L?E087a| zIT1CrV3rfCo+>MEJycZ{47Zrz_V)e4otvc{WsNURI>D&CMe~HhU4`bHB_~uC>1BI% zqs3R;(zpV8(Y^M>4fR4oE#3E^>sZK$ZTYkdGh59>Db(mFNMb~16Hb?Qc_$h zAaL=u?}}9$YrM=-CQMUrUZbw=@7~bOak4#Pd=9-hF&)p=8{J^8%Dt#bY&m+v3CyO#Hb5Z_dnD|xF}S=p5>jJN2^&iTSp zZn)ufGf#@SzKyZ4=O%_CwNA~xk`Doar@HsCs!Y;T7jcgZzN}GHcJSU&(fsRaJhQE) zIyN+`2tL(vS~hjH!NvkC6P#>cSbpQ&B@xoHW7W;jWzQ8JJ3Xy6+T(ixAaCw$Z!}NdE;%NsaeNyk<_p3XElSloU zQTj2nTfQ?+3h(v%u<#^!8ukC9M;=>5*6VD}zdgB6QSQgtjP6r=8B0nZpPw7~_2I^- z%~#wVgSl_sm&`javPJvGjjRV=d2?g*t#|FZk(4~;m3y?w`mPnV)`lzA^IwcMFSJ;> zVux3g@xs6Fmd|~tZ{|AZ@h*kV2TlpyZab#h{9%pNX6t|1w%z07;Vl>B<}UjYB(i7L z#R&Pcs)xVws=oM>A@rzs+mkNQxwRiIc1AGV3~BKc5MW_+U+*v{G%Y3NjH_EpVCdsV zp{t7zEDuazP4E2iRp#^y176mX&wu>B&iiJ$092U@>Ok(slrFKI)jdiTDFgZ=E6CbT}7zZ z?yAb<>E5$`9=l@xUB2PLgVybv85T*~&8srntjbbdE;Cu_N6x?KGrwM___}{RuwKRb zqG`)I+2(>hlX@Sxoe$Kt*!k|j*F}dH>Mq{3e50Py*Q_fZUS3O96v{_Ed7G3wiT`i3 z_mN|go}H%;EiYGZ`J3HQ^vX3nSEz7i=aJKEIlg-*z3pR~^*z5uQE#P+K6IutsMOGX z^WO&chy8quogc~ZJvr@RxpGN0i@*XV7xO=Ri#`3eH=Jy_>DMf)uw&QbvZI#U&FoHF zi3{e(=esz(ecNef&F<_cb#mtNpHDx#)@=FUZ5O?#Np|{ri|gh$bW$hGdFt6PouT7L znXKD>fvsOZMn3x+eqjH9fj{5!9v!)=u_$G)Ew3Vvr1+VWsop<|Zt9(r(%2cXwpYA! z%M_=YKQaOgrHkckZk*l!=cC50WXs)+>$k@_#V4&-{l)*U@cl97W~+t&|KQ!u8(z}@3DYHsN)ye&kAbYVusoB z)?V}Gl*Qfacxmn)!E)a0%e&Ns!%H8zE+=-HxHBrbJ-CM- zu5$fq)u8h(j}5=7KI79nkh9*|Zfm3eGv;DH4OEib7P*PZ2j}s z&gO2r)}_op^YQXOn}5gZU(A<0d@lc*z)R~1&)@UAiVL``FqtX2HtFW(KjMqlF4ea= zcI|NOOq*gZLrvBjQ_W-jy`Ha+e_UC4%V*Y6^yCcjR#TuVhm?YwQC}q|$^~6I*v##yB<~&pA9tX-w|IS!#{?B)wh|iq3{?N%y z?Wy+9C(BoKovCg&eEG4$s3_=U*2R7~#^*miZ|6Ak|GUutw-X%ptQ1JT6}q(H`d$8y zOMZWsv6vt07eBRE@t4Z4%;1@qb>{Y*_*%2=uhFEf|E$?XZe4zM(9@*+`*HPe;dUOA zCvMf-B5T_Ba2k`&x4tKT{t2H{_0=_baZGD!NE=%*qD-DSq(&vf{_lxd3d^N{^s==zDg1l=D9sQFnUcWt& za-QXp@5&vbEtiyYMa9qW2)wevcxN`3SDc5%rMxGTx7@GmSn)+WP^t6C-Rg&%6X(qP z9QyI=B|jYr-tS7Cx2S={DgVN#kBuNC*=osGrO4I(n;Nv{WNi2 zZ5G>R9;Uu&!8QADw5&XF>&KSGy;JMNWUP&L70YBlOO4t7;{J?`rMA5%E#?*`oj6ix z;^Vvg!zSsyhi7m8{@nP*+Mem&(bo!o&Rn^tC|po#?!3MC|1`Hm-)#2FaX8O@Ym@n> zH(O0Jf|T~Z58YhgA|=08E6#q#&j0TBZr3L#i7veMNoVo@3=SjSm;bK>SN!@JwBx6@ zUKB%~-uqk681L<1Idfoj%I5}ejA8ssr`P=0$9jJ6A1mgwS{?UKEtmFvkb2Ziv(uqQVICWEV-o=8i@5A}I&E*zuX;+!@QYZ4aV`Ol!>ZuRvtGz4h*7myO z{9C$cSzKWJEibg4C2`0*OJ*)pQ0LE$QnP&d^15uleYPoE(D4ZY<~ydZ?B`Xx{i37l zeE*yk?0h>9tyOw(@u%WE$w$XKpLUA`E-qjf{P@iN>FqI+ zeX6xBu zb1VOIgqlxi@ipo^|D3;PxAFNu^U~AI&Tl?%ynoAj7se(9jwS_;>6eSx-B)ki`ey-K zRIcVM50MLVth;7LIts8j3bdFlxO?`>mY78h?k1mldYO{~E-#rIl^5{%&z4$4vDpgvCeGv!dQE$eog*4L0D`?y%DV1*}nTn=S3vE!$GV&7ZTyV#UR* zMGR}tU5Rm8{e2qP4TnrGzVhi6%X}XBT1@6f%+hUA89Z+J)jvYG__0}&?(A~WC zurSCI+g9GS4ZggqlSwA?Y03HLTaKq^&D!(Fr~Br4Jx`GZM}MEnREhb0HtFHq!aEg@ zId<*J&W+7IT@<*Enra!uRg*<`<|cY*M0i;dcNu+!LNle5gOb7{I$#5@nLJ9&-0o69}al<^R8KPO}O^^<~x_) z*Azr``3kTs+)Hih&SKA9T$i1@G-%SM=Chrt&$ILrd1T$* ztk8S0*2qnDuC4U9iMd}FUO(db<@>f|W2u!kyC$yHT-q1yU8G#|L#3_F<3_>ZjDHi? z&JLPT)t~IrA}*v*U81xgL0LZk^nr`=_S5hDD!#mjQDbN74aV$ab=%}ly1z4=`g8H! zliKTCT^Bz1peAIrcFO!aXQy3m?Aej)k-WNp$>oJN-rmSwdu7Jzm4@NXtCC8}cRyP9 zi?RO6-`~3?O^j?_9dqKGzg=2zR&Ve+1=U>k{QZHanoldu3AnZ1OFj9m_nvz^s`1vk z$JIERF3ii=xPS4{84lW@xH#6>E5>fB6zDKH^Xt8=vMMI0yB3=(MKx885`~{#wEx3k z*{aAg?QQbgX+CS@438ZBy6o`BT9MTadXrXu=T&>%JXIxhmBLO1arF(E^?Yfy63Kb8 z9uo{_PS&)(F@ecr-w_{a*Qi5B9eZW$CjJy&75V*S99QUpqoU5|9Iw^=HooS)=<-e} z4bNL=zPF#ATh(=`&Zh5d*5f~&;HTz>5NQu220vDMz@6W$wGh%b61R_vZH9m*!JvwQmIsv5bHoioMr&pqnA z&X@FA=J4eHs!e}h@?PQj$J~E}HE2R$$DNz3#ZI*w8=w3>{q4^L*_+#z&CPHWU}1cF z?n=hQG9lKOb$ScZqM|P~xG>Jjo^Wl^)wUf^R5DGEh$X82PO#Bb)tZ#8VawEgQe(s7 zY0EbJc2L`T;>VXaeRjr^KYf0?>4@US?!+N0zgowDhoclF8)! zSx3*jRDSvH?VRYSjkkAB6V5;D`DDUU^}V%UOJ*C*-oX6-nSB19v)->mAEkX;rf}M4 zc>+IE+xf(YI|5>yniRF$qe72rq;9Oesx@u@{D$i%7)#bH_iC%VJTv*uG5fgM_WC{h z<{yYodbyH$?{244tF~9Zym~z%(xT_%-jWA)9kbh(ef+nn{^Pad?HWav-@i6YI{&W! z-ow4JH>dN@3klcit391Qf6w{wO2a!Bg4^}7Y&M$S|9Cz8-&uC|)gN3}?r%*gk2zKL z@m+WRr%TbCKmO)%%zb5TTIBBL|K914^!g9yzwdi^Tr2tRbaB4q%a$4E_en?>7lDeh z;#oVLZ^=!c-*{P=)#5XEwfcE@QJDSlrj+jdOJYmDcc;B+;qWTUQ+fI)!?{Skq(bMg z&7_-Kl)Jg_&s;tA$(%KRTsgUZcHaNs8l-SItylfo8!f)+D-_r-=(F{$*WI^f<<(a; zLFeN>Ilc7H`Tvh&*&nVq^J-_BRkJLdpQrr3#Afz6k;(B{N0(OX6uW&_$^Pq^HG8$9 zl#kmq5s^?eg#!-n9%_XwFf*U7wV&@s+0(~n8k1h{Y5w@witTCX5)ET{)(zsKfr}cl zRvujR`N&6QQ=xZ^byuD|No2gTDyFFP@5kv1XV)$M+;Th8W)s`_d3iVbyiUZ~RZJC4 z3TlWF{&|#dd8A&@X+zOy#+gywvU7Q?;^nU_dbI0tYTBga{f7#iLId_D%_z>VKeH`? ziP!#mFu%j6gXcH51iNaj2z~NA{NiJ-x4&M0`*Jw8DXMTiSCc}9`)=tg8Tx?^b5Ap8 z{aoI7`?0a9?i7s$scfeEr@AomF6Wmz^rWzH&b=S9?M1q!XO${1CLap<75@I=?p$@v z{afbiR0`i(&AspWKC=mT7SA*)XJIr-SiNA;G12nmyEmu&QGS_bclPG1)6&sJ?_JKn zW1KTTV!~b~&XVaHnO9wH3Y|1Tg_Hk(z@8GbkdT~dQ6Z7fzq~$j^lt9~y@kEEjtdyI zIQ|O$6O(p)O1`4Xl6McwotG=b_^4?W6>TVy_Fms5yXGWsN|JnQ&zWO7%YzJ`&o*dd zd(7pLH}^$Iw8Oltgad14f4ukGFn|C4Nk4q7g%*TN3x4_7zk#oSU(sg4NBLSWSJqAI z_1O*x$hn;mog{HWF?mOEhMo4muZE}hdoPQzE&m_2_6Cm|Ps5YTjPbGyrUl15b$4** zOwm8&w0GTygKI2u&ac|lE%aTFd57Jh@8Z9uIbPP=Ui>#bUUHLvc^g01apx3O0hWj6 zo@cI@bgBJr-OqQT)7UJkX4$f>xBU`5IekW_GUt}%7t;@w{8|uDlq1c4b>g3O z)7dL$D$lsWx@49KUykpp*@6?S4He1^A|oZIgsoa}b-CpntC@wx>B(DnD@=cr?Cp5h z>rFpH5quOt_b!up-++&hFldS4XoIH)LD9i<@^PBrJCA#sYbZ_T}^Dwe8;5 z@}t~dMHf?9Ym^(Tdz`GxJuFHLIfWgzIw^wi?Y^F#Ai6UVy?4$Bjh> zkKc7A7qHh?u~t9)?clzte@*hwbzf^tYwY;#O=P-vYg@+G9f;iByDItR9h*v2G1ShBk%N=;)XkGdLMZe6I`v+^w z*(ZnI6AV4;6vTD&bFEmv?GKKLk(D8uqBoZQO8Py^h5c=&?e%~EuHQX$h;M%3hme=5 z%a1nyGuKZ!@XRHMOW$sxYHRPK{_>Ddhc2EeW>$6-Xt~d&TlXTkEpcA*7(}u{SO?NtlAUTZk#Y{O3lNs8&=GF(Nk6A zw=8MvmVZjy!;~v8TArHyNciRq=d@4Tt-C7zE&U&K^O?SgqX5fu&l@j)oK{SaHhN#J z!s+1Tv}?)XknM{e9y%``XSY4*(WW51fAd4~+gA(PZY(nozHDqvD!Yx@Ico@yCC-s;Q=blo~z+H>{xj+uO*w)Epa>}AHasdwJ7nLf9$40I^o z-PYLK=HH|?e`Ti4M2!VYS6-2cKD@twYnjaTb$^cdna#_%V<%Q@x^rdbSt0-33#Lu{ z@X=dkOPLI)>Ah{sZb#qS9wHAsKL2Yx_w9#|@9xODvU#h{R(pY3?kop2Lyq|PDrXq2 zX=A;5q_J0Q{>sd)&D#POtz`i>sNZk7asOhH&xLD3tQMDAkegycU-t6)hZvo!B~7GJyI%N0t24d5ny z)3L1}2l|RU==eN|9n|K&b@!9;L=A@modai&9a(o&K{Nc0-?f`R|3qYPyQ+eEBE70Y ztR`J*hqI~zcqMLRe4IHe%sN9_^_JHTqx{IEp8l5h`8_Hp`^w>iD zIX2T%{PLFl6Oz7`?KrD&db`A_eWi69cooWJ&+j$wPjQ$&dC!*% zUVgDl?ZWkRrbJIWI`MCP{>JNU3YRON9X=xZuiN}vNY`x_0T#y{F}r^syq0ryG zZ*TOtY4zu&WP7cAEH?cPhrC_qLPa67I|j4rQ(i9_(5a zDfX_|<+3x~-p+EN`hnQnY;)$!rOfUy6jOXWYf-`l@lTXLr9j#I5~ z{ya%GTYAmnsaD9PvJc;+m)h*mImEg2@2V1`Yx|D8J{wRJy|{Z{Z@bdA&!=|Pv|nGS zz|r(A!!)qr*zbh53V{vEd~9Y>c7joTYahBSYS`xD@32BT-E6(mQWv$HLpHzKez}yXNks&a298J9gYFvDnw2BznQs=P->U%MWjbDhj#G`sNY)=kfw{SAHVdJ^sT9QY&>9b4<1{^8J_nz$cUJxjU&czEd@ zUY)J7uk&yGqq6`E&$=lG@i;%vr>A=Cv*N4&B6fdSlp)_w;qyGF9;V;FS2At2 zN7Prj`_qpVJeM^$IAGeMYI|l${{JcKCmrFLrogd3@oiqf;;Sx<1!o=S-rk#elKIG| z&1!E|gjlz@hHc_MHksFB-NG*%I%>)X`=aI@ddJLQw9j_;;`2TW{?t@!Tgu#wXx{nj z4!4))OZ8KnQbNbi9BjOzQgc@B^v_SKHdX!0st?9pn-*)cDypLAM{L=t^ZOq>>gui! zSMzz_JA31_HO(JY(q~^bp+SVvvS+!7Nsm`|bw>%QtBj)X`XOJz=IrQYg1!zxV@p`$1$Erp8^?R2-UpRHi zPVFUYs%FnUzWU|%7x_K!w@yp8=YO(*Du94wa-4LmiK z&%=}M>OysIq>WZ}YjDqQdf&CY;$6yH(euqu9=W|ec>d?_dnHe#|FutdD^09@m6>x? zwSt%H;g3nve{OkIqucl4>b4N2z4ni%ZcRGoCcv`x@++U-w#-d_ejKkRDSi36?{d#^ z@mZ6@{3nDx&XU+0Z<4I;60oUQS@XHO^d#$rhm$3rO+2$qHuA=~{54^diZ^`{SJil; zUUyjBvyo@E>AV@6S6jp^YLao-FJZB7+mB6RL90J|+E$T#Hv5f#nWihk_9V_7#Z1$_`?@6ZQZ#uz^= z+|24gK~=65)1-8){7d?jkJ=vSpEbuury**p_quiV|Ady@EG?N=VBPJ0?ZM5doh_vu|Co<6XtfnNM!?e!YHAUEqHg z6W5!DC`Ye9b`FP*C!X0VbEB}wdKv!_>%;9AkJav(ns&T2he39C-}8IyZHtqR9G%v@ zohRXV*e_%EVCkZ1qCJ6=Bd@HN@@_ZaVYO0m*m`^89J^!vp}D{JiLf|c5L;WfY}zrMCX$zxBk~L@)3_e)Z3p%bGGxYA*<=^>aV@a_qgul%HSN`+2-`bt$ zwg=2s{Gl(8apdpaHqhTq+m$~t3DGsh*yN&L*q{`O_~zv`5H zv%I``!C{UxKe?vL=lmiX0h8zVzdU31@9VGq6<^Oj-ShRFTi^VArQLfOjkSd04yPL) z-8Hp-?{7_QzF7fFyVV2#hDvI!;@b3PLGF`2m-`o{PdI(7Na$TGTS0A${`B{W3QPWf zb@`qB_4+&ojzgkb9IkIp&9n?`5S}*w?;?)BN6Xi3O0HHBV&w=|{wZW!sM7e&elV4y|e2s=?MdsrL4X zO{-sMg(%gTPq!1(W^10g3hMq z%1m5C;LU;v%Nd2`M-6v0+wX1K`=NG$@=f<^8*8pt?US;b-!3oJcl7SmIr{bw*4%Zw zy0Ij0UX}Id-y*>wvs|ZlK7LV{!T*}SKlS1z_7i6`UE^0NonFvC>&)Na>IZT{e*CG7 z-iwTHd_7stmz{1ccfRjs`Ntp3%qMk=mOE*#*srN29Jz6)e7XHM2GcV0lFZkYySS`?^sZ9#_Q&@>vu@PLRaUS}wJOizU;E(h9WJSP0)9(h`4}C2 zoL=yKZluUm(SS?YOv=uFpYB(ETVeNC_!+zS=aLjfSNCh5u08v*>tO$#xtZO`KVSY! zDeBVK`~PA8J2A1cA3e>>z4XPDDlhzh*2;5Zj)&L6s|N#F90g2P-L(yFzU+MYS9sW^ zzukOsdr!Un`u@t6)z7omrMkSUP!HXE>-DRh_4>8*-1k1IeR`-`OY474dQNat_N0Z$ z%S{vYIj`3h`V`+hH;X&+;w^)ndfHLq&{?9vg_Wl4CM}ax&iOV1Bx6jEv zx##N@Ung%5kAjmuTS^|LzkHOxv3R}b^si@B*zNybx>{8f^;h-6KVepjqOVUFL4&(x zLY+*vv^e*_==9+`qpbRm{nD!2X@{%ad!M$QU|`y_>SXqTZ(Tgw42;wJ-|s#YCR7zJ zp5A(c?Ia8D{<*Ejt5%d1D`$QcJEE-Bq`>jEq3hdnB`NR8`{&P@t#M%DvQ$@L6Q{}H zy0>~?XN6?-t$ld^c$9Ttc6eQqy0pJZ&F?Q!WTxjNb(9ezi>dZTYrh z+cM5qY-UNzmU&utxiHS+a)b2kHkMsaz4+?>%FMYlXMO(i_PvX;5G#k1GV6|;Gj42^ zPviUz+Z(xNvi|(Dr&>Pq*|tiiJ<9IJHcAr~e31IKZ~wfI-&41TGt50Z*YEN_r>?8F zADT7m+)vW@eeLJLZ3?kpV&=)uJ9LS^KQa4l0%&CO*;TXp*7%ufudnPneO^y>5_`rZ zwe?Y3q^BFNoU-IiLUGc~owvM*>o`q9?>MDs{Y{!-u#MenGi!5u-i!+JqDL_fPyQdG*2N*&jDDf7o=(;Dnlx*;}QxUQ7Qx$=f!EFXc$Cvs7Sd zXVLk(nj$CvhTZc#@9vGPU)9qUW!=TqeCY7PH(b{n-kiQ*f9J67M5{Gbwm)avKZv*9 zw9(9lNqr*c{z}8geR~ftU#=&A@n-P8C!JHo_&uss;*;d(xL%Z&pP=DZ0h)@tP!zvh z_WU&qPi~%^EmpyocgVUfV(?|X-1LQ|WmjR^XRRQwltXG~7T5n^EaGzJ(7Ap5mhQ|5 z+oX=}*S_tKe`|y>#;OFrm-e~FuI;%h#IeXx&oANfKbbSX436EgnxK#@XLbK51A_vC zr;B5VQP%aiiluoEUMq`AEJ`=p-LBtW%pJgJS)=q>J!JE{$$LdsDYWyYuK1|2dcS4s z)xG+c(~mruKC|KUfrUF%YESMG-n!%4yn{WBjZ5C2%>Q(Al8Wf!nA0Bu{C8Dq+ZgRp z)($%5X?8WHG~W5X#XCOx1C#yVE{PC7x8$ZE%j?Z2zx1GVt@v+Fls{@)KbOrtXywPZ zUMjmQp5E`QI9u6fAGYV@RHlnZzy{FN7he0qji5OrYdka-M;v4 zmyS}PgY(wElC#UU{yDQ#eBA>c0$rp(mBB?8n>Ml)f88lQCFqj>6k!vUzM0L;D?NYA zvK0%M#2;i)EmoK)y5m=*#h=oHt-7=(}*0;Yc|F^JBUT7^_ zs-+qx8eSfLph?BE;`i@`>ibV_RxuJQ*%mU%=i-vkioj&k;IL%(K%FbP5v%)K>c8uS z{N2+U#2R39bCZ(rg^RVPat`tBIkV}9Q4E{z6M5s`o1WWpud3EvzAxT)&raj*|7+E1 zd)RME|7X6$d|i0YOY2X{?#4?J#Qmq2B;1+bK4I6N%CPj;FHG|_xAWXRul>8rVCHXw z*5#E&k$mFM(k7X2c(+{f%iTYG^06~EZY)mwToh+(Ia@qEMrhlrq$!(j?8{Pal})Pr z_K&fo=l=N#FKsP9eJfsb?rZ9&OX)8H-`lQS{CkRJiR}lY`rDz6GFCG>8SP%!Ec)?x zNl}>HH&*p24tZ7I!H$U#bIVY&c)AG$lg)2jG7SF1k>}I#tY%$B+x^|Ap^sv>}9jf+c9P{f~kn-Fu z=+ybW8asupY^Ej3oy@s4vGn6i-mR17OrE-5!%@-xqx3!xu9O>VJ|3A9>zg)T@Q2FU zXS0*1O6)!=WWI)b`SzvB%vZqEF?XU_16EsZeOerp&3l9=l(F@Y^T#ElV6U4ML58=F4Q__}XbSni&JH2In-GLPF#Ekvop4GD(XT@-9 zC2YO2sJ#4njh)fSy~4IuH&5DRA6m33WHy)KF_uMgwyif8+cR!e>$~mv{H@o~iM=wK z8y;DI5o=oYY28ZZY=bKTH*LB1@@1Vl9~c?hy?tL-gP+hR(R_}ni-cE7Jo|Pm{@gML zzGug(j|KlYIeo?_-IkULrN1#<3xfspmNkc5E%#lq^v&&=$Bl)T3*NDunLqt{QH1vRq`+}@UGH~OnM)~iw`~9O=91Ixe?eQ!{3nO&mKJ83ZWB`>s=G2n z#NpkMh8qV{Qd0w>RxS#g|E%Cu%CWO^d#}E0irLh!%Nn*yh+oL`pV~5)(8cAGf4tnk z+~R)v6svEkXI^Aon`@fLIAsnCpW87b-F5n9k&5Z()x1I%gem1D$y^M(aDCpR{n4k^ zyA_+JBs)5Te7AZJ!SNf+cNpPaJ^-5MP0j1osHa? zx#$1r3wK|>@#|rhkXPsgn-}$;o!D~xRF;02^l;Z5q^`&^hp&jPh_u`q1&*e)jGgl@ z_oZjgd6yLJ`Tc(Jg-+e&S7**T_V&gm^?2^{S1o=WlMcCB7$6>Rzg_l~s_P2z`{7r) z!LvDcH=g79)z#KF_gc$dm6+d04bP@pXA7;*ZCJnwoz7V|>)p=T?Q_+ChX~rL3(fv` zM^@qB()%w@A6-6iZ6?qE>=I+PwY++aww%G2ErM61|6uMH-ulqe&QevZn6pVC#`n;< z_fbzQyq~RIAN_BQmxo8pF0rUxA2yeK+Fe1B}s?#BVA51iiBTfW}R2(%6<>YnM}u6@gNn9sUTzT210vx=3? zt$Cvn6h1lrCFVXua*!$?I1v z9&O+E#|Nxzp=pN;k@B!iahWTW;dHNX)` zQ;_8fThgQ6F0ruJ@<*LkX78P5!?CQ)}#apW4V^@ERT7O@m+41~?85uRTd)953 zdg}c0OCG0BWNzF6>T)cs4V-(gzQ}KX*y_{grNUQ~OBdq#*R4?}y+1VGQnwpt* zRQ{@1bv8{T^ytwSO|xffcP$DCPF}cal~BIEzFVw)hkAU)>aB-GL7f9_(A?tltox=p zHT9u+6$j7Wk<4p!_V{xxJ$ufT6S@WKqS{-s_ebjNG47MjmvIdLzU_D6Ls`pNp26v# z+g&feShxGvH>=1)QPHQLHM@8ETX;>q*>g7SaMH#J^Cq9ZrE6_D>yPm|y<^Y#_es87 z^nBBscXfXM-Q3?<^!)z+jp_8ie9r!Rx8(g#avq<&N3!U3(zJcw`270{OVf5tzW`g* z)nYU^-R=;xvhD1Dkt?}XzfF8z`EzD_WztEJs=4~NQU&Vk-lZv>i|^MBvUe0ixpK)iC+;x@q$}T^Ms`dwHJXGgF^7*Sb~c*oDL+eXpACX(fkT zy16+~{$`kbmG2yv`h07%#S>30mcBVF=+%!c-gzzj^N(B*;FQjjIBUPDG}vfrouQA! zZRWW*n+`g=f4k=^b82m=%(N%2M_QyiKW<7i_IUFC{)vA*Ssz}W{c(e_A~IJZMVNDT z*~GA=L5Qg$-c?%{Y0T*AvM5rUyYTLzpEY;C>+DeN`}C=(Z%JBEP@wCnl_6E%-^Arh z{sOHBJ380Xd$q&2lI6b+Jm2&2ZRQ!NUE*&v<3G7{ZT6n}LCR#-InMu&F0L;Qm{V%A zb9F|!{h_ba zIh=m03$dES-1ZZB;K9rWORGgmF;Q!iHeVDLcy(;%+0`DJ6FFxa^#6OvenOK+aYK%L z_V$#duN{hd>&#{Q-Y?=$Lo%jodz&bGi>nICX=m;bk*6-_c$Qx+auyyo9Ck+ARkeC7)_ z$EPvrF}FXO^hNcx-<3zVs@aU$*e2~$-+ytr=d{#4Ha3zXQVwouV$Hu?5>2E&e)@E1 z!3~2~DT{WMA3Xck>;9V6GbUgAaDDsa4KI~<{FXPC-1k@X(b9`H{{l2l-aL4OMPtUd z^$+&`P&%ZJ+S||!@%VSA;QHL2*8$y+UV7f_XGx82w1Nxp&U>$DbFRKD(!)Sj>MPA7xXRz8?X3TYH`hMxde@lGQ?575Wx~y#)$6C)%GaFe%W=)QXc!CJ?0ma5E<6>q*zIP+6DhC$14%|g zZ&p0jd}GI;@c8y->tAPDy6^kpnYiNCILWR#$F_UN2CkUDIx_!uJ#aE!-Fm#^e(G`= z2F~*TeG#96I%d_{KeS(aFy)1x`&_Ti(4$xHif&Nw6uS4X?#0RDw@yTPO>#NjS9fNn zon&a}#3j3|j~_kS8m;EP=gro(3ATS;D1?5R?CZK!G*HZp^}eY8$2%u?Not;a%vNW= za?aHL+Jl^`6K2ob+urGTJW}3d?oB=Gia%2qU)fQX`h_EYPf3~EJ+qc8PtR|*igsUL z>Af@cMO~bw(9shb!uRd=H_czQmxF)JYu(qocvBP3%1zr_JR#_Nf>SDkb-J1U^Q)6L zR~8;qZCs`0rrG^=wOP;&#cAp9xbWfe+Z#=O=aTQ#CZE&i}uF6_M356J7)WpVd;)NFSy;;Gw)t& zi+S9G*){oUb{|ay8NBRv+gG(u(d^&&=y`c3^a$5YiJ+&h4 z#oeZwuYaa*)z&{}aXNdw{H_YwWow>qotz%|<eU@RJ z8>4j!5AQ0dincOySbI+W>zku{Lm9Tt3XZl@-+ImAOn_*BhK-2-tr;7AX2$qNPLS+oAx zkK^+vMlip4d&8^#S;niQ>oz=j?SK4{OwrqhC?CIl?96|^>|p(stZi_$bXNAI8+(~A zd{r?xFulXF`^B23Cz0GU=bbR^toaqHo_7B~%jcLb%N@^(uRUpayL{`P<)?jhqO4fY zpL$&L`=pf7dV#HbS9A!mhIsRe%~iL$Ih!wTX^Ob!f+>^d1-kv^{vh=}{J68z#J>`y zx8)_n)-K-NKTo#zZ%UYG$a;xqcW%pX)}7&S`23aM8B?D$&rj!E-W3wC`o#J5i`@6J zo@QZ@IAI&p%5~-0v!JKX+jp~UJ^SgR(nI+h6DO>=U9mxb!S_Q!4?DRN^7;;QHeKNB zaAADgTwJ%(;>XvOpoZ-4-1FBu_6I-KLG3)&P5@1KnF~eknEd|ROuhMv6ZdfTzH+$w zvcxM_VW+!sp@!_ApZcZ!7^$Xe<8{#~8o?Di-3I_2iRNttJw z7#Oyt8b!ujf|X0fe*6Qr%V`pd!n%`89TO8CAzTGf2LJIm*O zbLRH)r^}bF7mSxZc=vB!-k0|2GDdCI?aw}cy2Lx9DP7=W!@6}Gt3_uY>|osRyW~K4 zI_uUskF@NWth@pqxJInFF1qQ2272e$B+Y1Lp$OL}u9G(3B-bCE-n`rXpkC^8HdCQ@ zu}K|<%L*Tayi|RD*}>z#;*V!<)SpgL&EDi+zV3D6(;E}dr1gXgupAV8ZkPXd&%ZTc z=~;7@KTXfMb@!9;bARJ3x9YXw$)M%mGM)=;d+mgmU1o2clziJ_McV%q zoX_rBuArr&ic6Gj`g8kbOn`^)F8$=B#TIj94$4m6^*~h4$NaRd zjg3O@TKSsj?{}{0JL_4U?EhwY$MSyr946zLpBU8mZ=L+@UjJmlKfZUnt!J$H)VCr_ zY*NsPdG9w@ygBIJapu%wuayV%8tt--zWcvztoE?5ox-Zqc`o6)di>-aiM%hr>phuR zcXdZa$fmT)qQ}#$PW`)6a9lS={z7AifW6cI*!VtoK?qZkKYq}SAgB4!enQyYX-WG}SZC>&yRZp72z~p5 z@l*T?qw4`-fvyev?HT|5V-T5s&DKXmOvo$3Lu1vdqDLiF#%^n6yQ z-BZ1FB52*$2WfR7){KKYC8c%wa-`%Z&sbS_Y2Wkx1qHWyeDBt8wNF+C&nj*G@%G#e zi|y8HXU>#T7rl6fHEu!vw|hH1L@qEL@#zJx9&|b_+{v_MN#$hrExVtlD+M}ei)n!L zHZ9Pd_2ykhX~5+_y;qO@>+{XN_$0J@#!ASXT?X&D_pdY5_D4(0UU4Yq&6y=reYjkt zlj+C;$h_IYr=2d0QW{qjd(Yg+*lK)7PM8&Jr~*gS!kIH?rCr=q8}^((CrY7iqK1R@ zQIq6GCvKx%j?)>-c=E#Uty76tG{1Sl$PwH%UzTAS$dK{={go|z&v|oP7By^h=E-V_ z|L`GLvS_iotZmcE4O4=mYJbM>FEp=MydXhKZ`p$-a=W+I*6&vVS-OAG$#;Dbb!D16 zL;F@`YTepXG*@K0#Fdyvw2tiU%I|$LXP2zp{PXal%#!P|wbh}IQrtf)=0`k^A-k_qdq;|)nXFBg}N2U7zZr{>F zn*H;S9p^i6I_t2)Y>yjTy0>Ue{WN*^%_6G_g4=mB3(jh1dmBb~>;FEyW|E5Ws^4o{ zetuI^tv4^b%C^JePQ3kt{yp{a;YLQ;1yi|i{ycd+$7^ljsnA7B-adG1?p0Y3*&^(f z?V4rTseNB{eVJytSweB_ms}f>jdR1VJzZ>4UBIWj;P~76=PM7YofB!Az1-{5^!FcK zgDQ9L`Q3Uf=tRVCq4nF#B%~7ke@;>lnzgU~_5Jrv$>(D0*pvbtig#^m^aU>$RSIl) z&@rze!2DcJoU2!-&yAMKFZ}ineu*57slOw3s|v4n=P4}Q`?8=${;1Z1?vz)x%_n~) zsCrJ-^3XeRlr!hn{N_mcV>6=Jg;IRn-rnL~e}%WEb_tX77oW86AD$NEF={Ea`=|VC z$+}j%X}Xi>lM4%ZOyyF)nlIn5>wD_29*I9j!Ud8RBGZ@XN0u)VyME7jhM~cPFSb8@ zcV(T~n(FiJZ+f5j8`Z5Z3?``*)?SZ1(&F>L;g`8eTJD2W*B5vFJP~g5zf36TM##LM zr+NJBc6EiUmv|Rr(y6dnGCW?p+U|$Q&~BhK9ov$i~pE7 zC8jO>x<`%h^v|ER*&N^hq_nXo%Amh+-qb4<6+wF{E#>8O8XF$o*VZa?di*V=G(D)5$d-zinS~h2_t$icYp= z_S`+4*S`;^H!uN>t6>P@T7c-Xi9c%ntoB(CoPyR>#!K0fR`#bQlIOZ5?vce_o6 zvUl?3S1ZZy+dVnwz2lwA%+U_Z@=I3=-4S`{=R72-tY3? z#9|lLP0}~F`>VxlcK`7G?~&3)ntz&lC%?XzaC4p1lL;^X{M~o)jYVCX9KU1gqW$}ht!s$X`F-{0>HQJG=k4x%y--nPSJ8g_E zvFClm>>c*2nCCiuc~k$sbf53k&aUV)vU_twBx^Rji97fDW2Husa^H0MGgnl(cifxi zTsCjsy1kbxN?)>Z*+|9hUv^P{toHXm;}=FCg3_!Q_r&3(9Dk??((cXtG50Sd;QDfRp(dKJ#hMGchhN?o2ydi``J zU*C7zrMAmHJ&(M*A#`QMiIr=r%9WR|Mcwgsjkiqo{k}hS7kgWx*Y5ZoVfo?X?;MZp zGo|Sd+En>oJ%91fIwI&i!vTjMEkEy=Uh(LC(i?q_?cSgBfnF-^^ChRo>`##t_U50M z^>tCUhvEG_JNvp;{y#3;`ak7nUr>nUgxT|EwSRp({bq*b+XsJUz7VsXzvH#i%ixcy z^}n7gu3`99z<&Ke*n!rL8@nqGtW{3jms#`cQMk%(zLJXl-Es|V8AiWnhHd>PdizVG zFZWSBA=ZrLGtzVd4zEd(?@^bY5aaw(Fv7>JNp`DE>s@w+l$z=?_xUp&e*R1gBx&Y$ zS}1qF;QrHomJCAg{>g59vQ)tIcio}-sOFOw=Jr`l6>s>q zJ;PsTwFhY*RJOh_2xL4wQ^Ih*acldH!e7B}ylQ2g+1E~+d_p>Rq6q_ZEr8-_rmEks z0+Z8)%O0doJ39TLQHJ9G88>H(pPTVgF6Q|BG;d!K=-?z%XVyCijp8S!Q^}5NijV=!wHkN$9n#fU5ut)iJ zK`?w$9B8lF3A=KT7nZ8p71`1h0l25KJ+vOmk*vEC&AI8WN? z)u-o?bJs4uzGvwjqZ0e|Z>$f6-wx{h@~s=Lh z`2752p>=h#1uIW2*tM^pA+)sMpV{@&ir(0nKc90>ssFZKo5#put==M?9Ik!Z^B(P- zTxvXH(sABDbwQTe^1qvey%fxCtNDeS`!?HUSZ$6i`|v~CeP!X>Q!fPfRd|*%_qNIL ztJrw+f4sNbUXk~g@c$VyXOEQ|6=>c*x?5jP?YjB2^yxecFR%ML z)RfhK;nNJ3Oa7>OyKKHu`#ScxXZgFeCOESj8y;YvdFa?#2a6T)T~B`0*=Lq-*#BH0 zZ+6JBQ|kMlOu5_rVq@*ggqBlreWxOrcLdJdGwuJI^{O@Bg8wAGP>Z{>Px>yiGUv^m z^X{BmED`oG{$JRVMX%~=|1q4)i95GiJ^k~e9`7i*))cQ1O5PsvsIBzjmu)3E4N-IbU)}7kUd@nY zx_n!WU)I{j84I-*1XO6u+hUkJ(`e_cO zTzy^IRP9}tVcfwZGyJdoIb&*W7&ld7`;McklRB(-Ea12(As*)H5a^QFb~C*}GHw35 zUwJy;x379te6RRb$km_Me$U&UcBN<8#zX%NzMGkCy3Jmd&OY~@ zpoIIP>?b0k7Xm|_)fa3J3w}G#Ya!eHin~2?YZ*VMml`};kocu$&BIe?mCN&+;}uG; z2HzG*y!Ak9fl9ske6yd)t6tm1dCE#vPVRZ_oWFSK*4cly@!hJfdU34R{j-0<>*$gT zw{P5@t$)5v$A-+x_SBA=lnFzo40i0)!>7h`}ZA}yKAFz;l-b?51uWkv`_MRYyIcE z-{LaXsSfAoo&Q}GRFU-BK55-`zwZ33e9`Os?_*G)<5Y9& zbKiC@ym};M@62Dz@(#F$FBjj=z3KC(7pw9YNMDeCwc@*LRKnuT>$mpKns#j88~Yq@$T#1eWz8U-n|pUh>ekJ(G%W8<{IEIW zD*va`ok`dzIP`;ql*<7batm1H$J zhr0LK%)049%jcEzxauuf-a4&s;ggiz5>`6heP;EQcjv}d6czo__t0HFrTLhsp$qec z%=P&SyVpqUUD|2p&*>Wb^-A@@xyDnb@vi@T>vjIdown_LucUh75{{i}TV*c!=;Xsk z%I{O2Oi-E^RW4lmdtc}7Icq*C&v^KA()sUIE7!kWvggkJ9Tuy%v?zZ4x+Ns^;?K3h zGjD8~^n7*qOyir!&vjMUa9QPU{hHFRnXIvZS9|G})qPU7-7o(ankoPP8~(2P$NM#_ zJ}hF~S9|u&Y3(H^c%Mw!Tp!pHJ%9bgS$7v}>R(|HS2aGL@Xey%v-a81jKf@-r>-8D z>i_YD*{p9fIyCoAy!FfN+MmCS@1jcVzuSG_@ZWd8gI_k5eY*CAF!@qb-jF@NP0ICm z&EG9wF{OHX&7plAZ%;3(d3Di8%jZk!M0=69+qeI3jQ;n5=l{Bwj8!j`x^)=B^%lFi zRZpq7`R&sCow;AP@BB2Uxnq{u!PmT1$!~8*yE{8tKFvEY)ju-O*p%0H%hhX-HFcGw z6J8uVV_RJHzUgPhtKz_rpcd{ABE4xR=It$+KL3EL`?XC!{_X#C;?h}@*9*S(?TmQ+ zdFz%3r_QT$pSV?TzyEFF*7MwV?|w;1oy?k1x%fo?hI@Om{f%$Bw*LEd>R7k7#nC?)9JV7M2b}J zPyF=e^30z8yYts2Y_;p2tj@Q5*&~U4r3{tuUYKDY3;HOuvP{1uzm&AzsE^~?`FDeL#zZmHYVyxD(uL$|v5#U0BhF+ZDg?(B@+b#~k3E;&4IoBreTC)qbO$(;9NN=5h2*~MRLkyHE5Fz#2;-pb!w9{Sk+ zE?TA^e|lP*OS6dcipZJzeo`#r%TD`hAP5Zv;r)ubH#GCP2Ww zb{5;*rN%oSy_&3f*M7FS{I8yM$Mnpq&Ocq${dvWz?8S#n=LV z-D&Z@cg_dL&kd}#id=fU_@-rXW@h=s*?T93Z?F33W6_%JFYWL5^Iy;R*i(l*tt+2* zibwpuRs3d0m7TflJf>Hl?al=pLd@Oe0kT|edf`?|Bnw;%I&zqyxE@^_}p9*}S4 zPpR(T)5rJT;Ld%W$NR$WZs{@F+q*~7{>gH8(Ez(5=KAV|ys|HDZku$qb^l}Q_xDrc z#256=I8`54Ws~gQx3p&e$(a2QG`8*iD4|~?c3k4XkE-vCJB}IV|BEq;-92;FGRI#! ze$taP92%V_uZr9K?Noo#W-Z@Nrc25>Y>tZ>c61rpSr}M{Juqax{q^2|wzf|%9e@8- z46(AZ`fgJZWaFlKbfWq>?+4*h&iuCBmCpB`{oHzzlSQ@Q=jKIMb?SQG2Hvq?{r&RH zt`*YLZy%lb`+Ramnce%m_@3+HHiCJXFQ43HcfW9X<(c2=rXOo&YuB4k=CAu|Aw4=DR)2pV@a*=LmF}LV%@xqi z1aF*D^L>RZ0N757YhLXmm>$HD~8p&u&((OYlv;@;(2__T^$n{yOejGxPJ$$MwBiUv%%( z^Gc6Ba47oylZ)BQRQFEsJN;X4`@LU#@9_&Bi=3Y=QY;p8e&y1@byeq6*8Te1>LcZ{ z`X9*m(ioUu0pi?f1Kz>@p@-U;3$I@gw)& z`=?Py_kDi2_}Sk5h5pUQWbbd?X?H&_>`rO9RnG>N@}Gq;St=+Vo z%<0-LplPHR5kIS9g;;MmrtG#cl$l)caN&vatSg#ot*mJ(Q3qx6=DvUY?soX5aP||A zR%F+o{1Kk_{OH5wMPD^9&!~9dCl>o(B)aNAs6lhLp3StE&Zi?S_Vvo<+n=1|AH~=! z*go%^Df`pF7`v9z`kn35w@KH(y&GC3bN&AtmrbiyWk`gz?PhXNPJi?=ruv=5u32}V z>@@#;rFpjHr|Zi%KQ{mV*>U>+851{)Z&LVe`0lA!-mD+2^4FgQ*llddt&cszt@btZ z=j9zQR=p3rbnV!MKY916zZizS`(#w~t1_lOO)^*3vL~midAEG5`{Zn$^g9Kd?qzQm zEmQ4x%1!=LJF8y8{?ErkpZOtYX5G$9JgFx?;pj&0{KqZ7zP`D_HM1Z=`25|UI`d1u z{XKPf#^m+SJ{hjw@w(Gj<YuaBHl!RaE8F*5!)fDQ}gzjR_i(6 z+tqIW=ci%Z?Pp)*pG%#c^LhElr-!?DR9{q@w{G^)%KMp%7v+g0cNNX7`nL3pbp^-M z-@J>f(z)$o(>?yOiP?V^`L6dqDQw9vKil@dcE7mm|6H!Uv(e}I8hIZ@>0X&|Uj6&! z{PlZ2XWGp!5NhYW{K3a^rlqd_NBeTyGtTcr9(p}sy7oQi!Aw{F4PUw^=vTdR&iwgB zbY9(~#A#Q29^YvG_2_p@kJTq9J?a07-|aFRS1^94ytvmo@@qeDiujvnQ^oDo>krlK zxKOxzRYm#7%{Ddny<+a$cQ)U#(v4sH@bS0In6lflcWl=;*6#^hIK$jefW@(c|L(UA zt>h`jE5upf81dS7=gl@%{43}&fBLb9olH7xDKZY^QHoBQ^K+~y4b-aj?wy`^toyts1ReaO`9KuUY*Rrxc z$&j)OXFNW)UNStci0kqvn+lr=bLYE<*D~L2*uJo@N;~~~mGM{Ky7fWf%f-vz$DWw_ zT~_bUMV7MlzvrlNzrGwDo%#0LrMnj$tIPQ-Y%&_QFKlF!zi`>fJItpCW(7PFG5c7Zb*XvPqGL)r@_YRDN=&(p>d21G2D`{H0`1OM#)n9oI>F4A07k9TWe7Gp*f6yj|8s95# zbkqJPi9cAlrACE!tM8SNH_LvsC||Iv>C;v2OMf;YODpP;WxL(0Y->$@`9`*ssnZOW z?3)+%z2aGHfx>LL`j&RN_>Xll$g6RhIFz9w}V2dqszmc!qPg#;3Pw+uuE#@PF6L|8`X@Qg+|2nJ;?! zY*O1Y?j{9}l@3CzMmu_0Bx_kDJ7r4{_^ z?^~$z-{F+^{-aH=`=4!2?ceZb>+_q1U!VSYbfK(`=l=1}{W;5STQ{AZ-=A>rsJOwl zb&Y+pKj#>fGyShCWYvBidn`ZCrfrp!_}P6@m!)?V*7kosdE>KXd6b^2@M(#%k2S~M zMV&YHUt{=IF!uYSyW1zK&!2Z@ZFqhE`nvsdPRSiG?W_F!eACNYXG2U~CHEJ~tTvuz z86I=+#U&xDX|_ko){EbZ^Sk}0^^VzYS${wA_cs5Gawlek*8Wa$0d-tfupY^uUiMa0 z{^$?wP+?Y!3SZw_F1;ViV*9tnzW=*kE}%tjOZ@l$46<{pi+mzKpI@4}GX0^e z_eB#1Uf$k&^$b?CmVG_vy`}MI#``+mj5eze+tZ8+uj(th$1gE63qYpL) zhF)NB6wV3_IJY1!WUIHpBZv17R)4?$KzsLF(28FXm!p-69VBtA%X!+Mn)h`<#Ucjvq>U>YR~&K^VqGGuzHVjU0g#NNfJ~nX zSHQvtDy#hNE#uIf8#1SNl}=WO%$`%FlfYBAO-Cc7o1Xn~VbnUuzjouvBgufjH33*IcL_;^D_)We*>#SEDOrUFkkg4#dF zS3XQ{0$U~7^x3u7SeRAfVPLt@noTPL3qNRG@=Q!y@v0DXIwVWthQ}bsPO{ql=wDy2 z3Rl2#iKhl4kQLAzuM|6(f_!EjI?vP@dBbB7!&9DDu7bN=u7GB6nxw|;?YDEcgJ+NpR-9-_ zU;o*)_pGq7v@7osg⪙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 fuUf?R;6JmIL*K{nUmZLQ3=9mOu6{1-oD!M 0 { + mutex.Lock() + for _, conn := range brokenConnections { + delete(connections, conn) + conn.Close() + } + mutex.Unlock() + } + + // Also log to console for debugging + log.Printf("[BROADCAST] %s", message) +} + +// AddConnection registers a new WebSocket connection +func AddConnection(conn *websocket.Conn) { + mutex.Lock() + defer mutex.Unlock() + connections[conn] = true + log.Println("WebSocket client connected") + + // Only send welcome message if this is the first connection + connectionCount := len(connections) + if connectionCount == 1 { + // Send welcome message after adding connection + go func() { + time.Sleep(100 * time.Millisecond) // Small delay to ensure connection is ready + Log("Client connected to logs") + }() + } else { + // For reconnections, just send a brief reconnection notice + go func() { + time.Sleep(100 * time.Millisecond) + Log("๐Ÿ”„ Reconnected to logs") + }() + } +} + +// RemoveConnection unregisters a WebSocket connection +func RemoveConnection(conn *websocket.Conn) { + mutex.Lock() + defer mutex.Unlock() + delete(connections, conn) + log.Printf("WebSocket client disconnected") +} + +// GetConnectionCount returns the number of active connections +func GetConnectionCount() int { + mutex.RLock() + defer mutex.RUnlock() + return len(connections) +} \ No newline at end of file diff --git a/src/config/config.go b/src/config/config.go new file mode 100644 index 0000000..c62cff4 --- /dev/null +++ b/src/config/config.go @@ -0,0 +1,57 @@ +package config + +import ( + "os" + "path/filepath" +) + +// Config holds application configuration +type Config struct { + Port string + DefaultOutputPath string + TempDir string +} + +// Constants for supported formats and quality mappings +var ( + AudioFormats = []string{"mp3", "flac", "m4a", "wav"} + VideoFormats = []string{"mp4", "webm", "mkv"} + + AudioQuality = map[string]string{ + "0": "320kbps", + "2": "256kbps", + "5": "128kbps", + "9": "64kbps", + } + + VideoQuality = map[string]string{ + "1080p": "bestvideo[height<=1080]+bestaudio/best[height<=1080]", + "720p": "bestvideo[height<=720]+bestaudio/best[height<=720]", + "480p": "bestvideo[height<=480]+bestaudio/best[height<=480]", + "worst": "worst", + } +) + +// Load creates and returns application configuration +func Load() *Config { + cfg := &Config{ + Port: "3000", + TempDir: "temp", + } + + // Load from environment + if port := os.Getenv("PORT"); port != "" { + cfg.Port = port + } + + if outputPath := os.Getenv("OUTPUT_PATH"); outputPath != "" { + cfg.DefaultOutputPath = outputPath + } else { + // Set default to user home directory + Music + if homeDir, err := os.UserHomeDir(); err == nil { + cfg.DefaultOutputPath = filepath.Join(homeDir, "Music") + } + } + + return cfg +} \ No newline at end of file diff --git a/src/handlers/audio.go b/src/handlers/audio.go new file mode 100644 index 0000000..063b943 --- /dev/null +++ b/src/handlers/audio.go @@ -0,0 +1,289 @@ +package handlers + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "beat-harvester/src/config" + "beat-harvester/src/models" + "beat-harvester/src/utils" + "beat-harvester/src/broadcast" +) + +// processAudioDownload handles the complete audio download workflow +func (h *Handler) processAudioDownload(req models.DownloadRequest) models.DownloadResponse { + broadcast.Log("๐ŸŽต Starting audio download process...") + + // Extract or use provided album name + albumName, err := h.getAlbumName(req) + if err != nil { + broadcast.Log(fmt.Sprintf("โŒ Failed to extract video info: %v", err)) + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Failed to extract video info: %v", err), + } + } + + broadcast.Log(fmt.Sprintf("๐Ÿ“ Using album name: %s", albumName)) + + // Setup paths + paths := h.setupDownloadPaths(albumName, req.OutputPath) + defer func() { + broadcast.Log("๐Ÿงน Cleaning up temporary files...") + os.RemoveAll(paths.TempDir) + }() + + broadcast.Log(fmt.Sprintf("๐Ÿ“ Created directories: %s", paths.AlbumDir)) + broadcast.Log(fmt.Sprintf("๐ŸŽต Starting audio download: %s", req.YtLink)) + + // Download audio with yt-dlp + if err := h.downloadAudio(req, paths.TempDir); err != nil { + broadcast.Log(fmt.Sprintf("โŒ Audio download failed: %v", err)) + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Audio download failed: %v", err), + } + } + + // Process cover art if requested + coverArtPath := "" + if req.EmbedThumbnail { + coverArtPath = h.processCoverArt(paths.TempDir, req.CropThumbnail) + } + + // Get original title and setup final file paths + tempAudioPath := filepath.Join(paths.TempDir, "temp_audio.mp3") + originalTitle := h.extractAudioTitle(tempAudioPath) + if originalTitle == "" { + originalTitle = albumName + } + + broadcast.Log(fmt.Sprintf("๐Ÿ“ Original title: %s", originalTitle)) + + finalFileName := utils.SanitizeFilename(originalTitle) + outputFile := filepath.Join(paths.TempDir, "output."+req.AudioFormat) + finalFile := filepath.Join(paths.AlbumDir, finalFileName+"."+req.AudioFormat) + + // Process final audio file with metadata and cover art + if err := h.processAudioMetadata(tempAudioPath, coverArtPath, outputFile, albumName); err != nil { + broadcast.Log(fmt.Sprintf("โŒ Audio processing failed: %v", err)) + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Audio processing failed: %v", err), + } + } + + // Move to final location + broadcast.Log("๐Ÿ“ Moving file to final location...") + if err := os.Rename(outputFile, finalFile); err != nil { + broadcast.Log(fmt.Sprintf("โŒ Failed to move final file: %v", err)) + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Failed to move final file: %v", err), + } + } + + return models.DownloadResponse{ + Success: true, + Message: "Audio download completed successfully!", + FileName: finalFileName + "." + req.AudioFormat, + FilePath: finalFile, + AlbumName: albumName, + OriginalTitle: originalTitle, + AudioQuality: config.AudioQuality[req.AudioQuality], + AudioFormat: strings.ToUpper(req.AudioFormat), + } +} + +// downloadAudio downloads audio using yt-dlp +func (h *Handler) downloadAudio(req models.DownloadRequest, tempDir string) error { + broadcast.Log("๐ŸŽต Downloading audio with yt-dlp...") + + tempAudioPath := filepath.Join(tempDir, "temp_audio.mp3") + args := []string{ + "-f", "ba", + "-x", + "--audio-format", "mp3", + "--audio-quality", req.AudioQuality, + "--embed-metadata", + "-o", tempAudioPath, + } + + // Add thumbnail download for cover art + if req.EmbedThumbnail { + broadcast.Log("๐Ÿ–ผ๏ธ Adding thumbnail download...") + insertPoint := len(args) - 2 + args = append(args[:insertPoint], append([]string{"--write-thumbnail"}, args[insertPoint:]...)...) + } + + args = append(args, req.YtLink) + + broadcast.Log(fmt.Sprintf("๐Ÿ”ง Running: yt-dlp %s", strings.Join(args, " "))) + + cmd := exec.Command("yt-dlp", args...) + cmd.Dir = tempDir + + // Capture both stdout and stderr + output, err := cmd.CombinedOutput() + if err != nil { + broadcast.Log(fmt.Sprintf("โŒ yt-dlp failed: %v", err)) + if len(output) > 0 { + broadcast.Log(fmt.Sprintf("โŒ yt-dlp output: %s", string(output))) + } + return err + } + + if len(output) > 0 { + broadcast.Log(fmt.Sprintf("โœ… yt-dlp output: %s", string(output))) + } + + // Verify the file was created + if !utils.FileExists(tempAudioPath) { + broadcast.Log(fmt.Sprintf("โŒ Expected audio file not found: %s", tempAudioPath)) + return fmt.Errorf("audio file was not created at expected path: %s", tempAudioPath) + } + + broadcast.Log("โœ… Audio download completed successfully") + return nil +} + +// processCoverArt converts and processes cover art from WebP to JPEG +func (h *Handler) processCoverArt(tempDir string, cropThumbnail bool) string { + webpFile := utils.FindWebPFile(tempDir) + if webpFile == "" { + broadcast.Log("โš ๏ธ No WebP thumbnail found") + return "" + } + + broadcast.Log(fmt.Sprintf("๐Ÿ–ผ๏ธ Found thumbnail: %s", webpFile)) + broadcast.Log("๐Ÿ–ผ๏ธ Converting cover art...") + + webpPath := filepath.Join(tempDir, webpFile) + coverArtPath := filepath.Join(tempDir, "cover.jpg") + + var cmd *exec.Cmd + if _, err := exec.LookPath("dwebp"); err == nil { + // Use dwebp if available + broadcast.Log("๐Ÿ”ง Using dwebp for conversion") + if cropThumbnail { + cmd = exec.Command("dwebp", + "-crop", "280", "0", "720", "720", + "-resize", "512", "512", + webpPath, "-o", coverArtPath) + } else { + cmd = exec.Command("dwebp", webpPath, "-o", coverArtPath) + } + } else { + // Fallback to ffmpeg + broadcast.Log("๐Ÿ”ง Using ffmpeg for conversion") + if cropThumbnail { + cmd = exec.Command("ffmpeg", "-i", webpPath, + "-vf", "crop=720:720:280:0,scale=512:512", + "-y", coverArtPath) + } else { + cmd = exec.Command("ffmpeg", "-i", webpPath, "-y", coverArtPath) + } + } + + // Capture output for debugging + output, err := cmd.CombinedOutput() + if err != nil { + broadcast.Log(fmt.Sprintf("โš ๏ธ Failed to convert cover art: %v", err)) + if len(output) > 0 { + broadcast.Log(fmt.Sprintf("โš ๏ธ Conversion output: %s", string(output))) + } + return "" + } + + if utils.FileExists(coverArtPath) { + broadcast.Log("โœ… Cover art converted successfully") + return coverArtPath + } + + broadcast.Log("โš ๏ธ Cover art file not created") + return "" +} + +// processAudioMetadata embeds cover art and metadata into the audio file +func (h *Handler) processAudioMetadata(inputPath, coverArtPath, outputPath, albumName string) error { + broadcast.Log("๐ŸŽ›๏ธ Processing final audio file with metadata...") + + args := []string{"-i", inputPath} + + // Add cover art input if available + if coverArtPath != "" && utils.FileExists(coverArtPath) { + broadcast.Log("๐Ÿ–ผ๏ธ Adding cover art to audio file") + args = append(args, "-i", coverArtPath) + } + + // Add metadata + args = append(args, + "-metadata", "album="+albumName, + "-metadata", "description=", + "-metadata", "synopsis=") + + // Configure streams and encoding + if coverArtPath != "" && utils.FileExists(coverArtPath) { + args = append(args, + "-map", "0:0", // Map audio stream + "-map", "1:0", // Map cover art + "-c:a", "copy", // Copy audio without re-encoding + "-id3v2_version", "3", // Use ID3v2.3 + "-metadata:s:v", "title=Album cover", + "-metadata:s:v", "comment=Cover (front)") + } else { + args = append(args, "-c:a", "copy") + } + + args = append(args, "-y", outputPath) + + broadcast.Log(fmt.Sprintf("๐Ÿ”ง Running: ffmpeg %s", strings.Join(args, " "))) + + cmd := exec.Command("ffmpeg", args...) + output, err := cmd.CombinedOutput() + + if err != nil { + broadcast.Log(fmt.Sprintf("โŒ FFmpeg failed: %v", err)) + if len(output) > 0 { + broadcast.Log(fmt.Sprintf("โŒ FFmpeg output: %s", string(output))) + } + return err + } + + if len(output) > 0 { + broadcast.Log(fmt.Sprintf("โœ… FFmpeg output: %s", string(output))) + } + + // Verify output file was created + if !utils.FileExists(outputPath) { + broadcast.Log(fmt.Sprintf("โŒ Expected output file not found: %s", outputPath)) + return fmt.Errorf("output file was not created at expected path: %s", outputPath) + } + + broadcast.Log("โœ… Audio metadata processing completed") + return nil +} + +// extractAudioTitle extracts the title from an audio file +func (h *Handler) extractAudioTitle(audioPath string) string { + if !utils.FileExists(audioPath) { + broadcast.Log(fmt.Sprintf("โš ๏ธ Audio file not found for title extraction: %s", audioPath)) + return "" + } + + cmd := exec.Command("ffprobe", "-v", "quiet", "-show_entries", "format_tags=title", "-of", "csv=p=0", audioPath) + output, err := cmd.Output() + if err != nil { + broadcast.Log(fmt.Sprintf("โš ๏ธ Failed to extract title: %v", err)) + return "" + } + + title := strings.TrimSpace(string(output)) + if title != "" { + broadcast.Log(fmt.Sprintf("๐Ÿ“ Extracted title: %s", title)) + } + return title +} \ No newline at end of file diff --git a/src/handlers/common.go b/src/handlers/common.go new file mode 100644 index 0000000..8f24591 --- /dev/null +++ b/src/handlers/common.go @@ -0,0 +1,90 @@ +package handlers + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "beat-harvester/src/models" + "beat-harvester/src/utils" + "beat-harvester/src/broadcast" +) + +// DownloadPaths holds the directory paths for a download operation +type DownloadPaths struct { + AlbumDir string + TempDir string +} + +// getAlbumName extracts or returns the album name for the download +func (h *Handler) getAlbumName(req models.DownloadRequest) (string, error) { + if req.AlbumName != "" { + broadcast.Log(fmt.Sprintf("๐Ÿ“ Using provided album name: %s", req.AlbumName)) + return req.AlbumName, nil + } + + broadcast.Log("๐Ÿ“ Extracting video title...") + title, err := h.extractVideoInfo(req.YtLink) + if err != nil { + broadcast.Log(fmt.Sprintf("โŒ Failed to extract title: %v", err)) + return "", err + } + + broadcast.Log(fmt.Sprintf("๐Ÿ“ Extracted title: %s", title)) + return title, nil +} + +// setupDownloadPaths creates and returns the necessary directory paths +func (h *Handler) setupDownloadPaths(albumName, outputPath string) DownloadPaths { + sanitizedAlbumName := utils.SanitizeFilename(albumName) + baseOutputPath := outputPath + if baseOutputPath == "" { + baseOutputPath = h.config.DefaultOutputPath + } + + albumDir := filepath.Join(baseOutputPath, sanitizedAlbumName) + tempDir := filepath.Join(albumDir, h.config.TempDir) + + broadcast.Log(fmt.Sprintf("๐Ÿ“ Album directory: %s", albumDir)) + broadcast.Log(fmt.Sprintf("๐Ÿ“ Temp directory: %s", tempDir)) + + // Create directories + if err := os.MkdirAll(tempDir, 0755); err != nil { + broadcast.Log(fmt.Sprintf("โŒ Failed to create directories: %v", err)) + } else { + broadcast.Log("โœ… Directories created successfully") + } + + return DownloadPaths{ + AlbumDir: albumDir, + TempDir: tempDir, + } +} + +// extractVideoInfo gets video title using yt-dlp +func (h *Handler) extractVideoInfo(url string) (string, error) { + broadcast.Log("๐Ÿ” Extracting video information...") + + cmd := exec.Command("yt-dlp", "--get-title", "--no-warnings", url) + + // Capture both stdout and stderr for better debugging + output, err := cmd.CombinedOutput() + if err != nil { + broadcast.Log(fmt.Sprintf("โŒ Failed to get video title: %v", err)) + if len(output) > 0 { + broadcast.Log(fmt.Sprintf("โŒ yt-dlp output: %s", string(output))) + } + return "", err + } + + title := strings.TrimSpace(string(output)) + if title == "" { + broadcast.Log("โš ๏ธ Empty title received, using fallback") + return "Unknown", nil + } + + broadcast.Log(fmt.Sprintf("โœ… Video title extracted: %s", title)) + return title, nil +} \ No newline at end of file diff --git a/src/handlers/handlers.go b/src/handlers/handlers.go new file mode 100644 index 0000000..35d2494 --- /dev/null +++ b/src/handlers/handlers.go @@ -0,0 +1,205 @@ +package handlers + +import ( + "embed" + "encoding/json" + "fmt" + "io/fs" + "log" + "net/http" + "time" + + "github.com/gorilla/websocket" + "beat-harvester/src/config" + "beat-harvester/src/models" + "beat-harvester/src/utils" + "beat-harvester/src/broadcast" +) + +// Handler contains all HTTP handlers and their dependencies +type Handler struct { + config *config.Config + staticFS embed.FS + upgrader websocket.Upgrader +} + +// New creates a new handler instance +func New(cfg *config.Config, staticFS embed.FS) *Handler { + return &Handler{ + config: cfg, + staticFS: staticFS, + upgrader: websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true // Allow all origins in development + }, + ReadBufferSize: 1024, + WriteBufferSize: 1024, + }, + } +} + +// Health returns the application health status +func (h *Handler) Health(w http.ResponseWriter, r *http.Request) { + response := map[string]interface{}{ + "status": "OK", + "timestamp": time.Now().Format(time.RFC3339), + "config": map[string]interface{}{ + "defaultOutputPath": h.config.DefaultOutputPath, + "audioFormats": config.AudioFormats, + "videoFormats": config.VideoFormats, + }, + "connections": broadcast.GetConnectionCount(), + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(response) +} + +// WebSocket handles WebSocket connections for real-time logging +func (h *Handler) WebSocket(w http.ResponseWriter, r *http.Request) { + conn, err := h.upgrader.Upgrade(w, r, nil) + if err != nil { + log.Printf("WebSocket upgrade failed: %v", err) + return + } + defer conn.Close() + + // Register connection + broadcast.AddConnection(conn) + defer broadcast.RemoveConnection(conn) + + // Set up ping/pong to keep connection alive + conn.SetReadDeadline(time.Now().Add(60 * time.Second)) + conn.SetPongHandler(func(string) error { + conn.SetReadDeadline(time.Now().Add(60 * time.Second)) + return nil + }) + + // Start ping ticker + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + + // Handle incoming messages and keep connection alive + done := make(chan struct{}) + + go func() { + defer close(done) + for { + _, _, err := conn.ReadMessage() + if err != nil { + if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { + log.Printf("WebSocket error: %v", err) + } + break + } + } + }() + + for { + select { + case <-done: + return + case <-ticker.C: + conn.SetWriteDeadline(time.Now().Add(10 * time.Second)) + if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil { + return + } + } + } +} + +// Download handles download requests and starts the download process +func (h *Handler) Download(w http.ResponseWriter, r *http.Request) { + var req models.DownloadRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + log.Printf("Failed to decode request: %v", err) + http.Error(w, "Invalid request body", http.StatusBadRequest) + return + } + + // Validate request + if err := h.validateDownloadRequest(&req); err != nil { + log.Printf("Request validation failed: %v", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + log.Printf("Starting download for: %s", req.YtLink) + broadcast.Log(fmt.Sprintf("๐Ÿš€ Download request received: %s", req.YtLink)) + + // Process download asynchronously + go func() { + defer func() { + if r := recover(); r != nil { + log.Printf("Download panic recovered: %v", r) + broadcast.Log(fmt.Sprintf("โŒ Download failed with panic: %v", r)) + } + }() + + var response models.DownloadResponse + + if req.DownloadVideo { + broadcast.Log("๐Ÿ“น Processing as video download") + response = h.processVideoDownload(req) + } else { + broadcast.Log("๐ŸŽต Processing as audio download") + response = h.processAudioDownload(req) + } + + // Broadcast completion status + if response.Success { + broadcast.Log(fmt.Sprintf("โœ… Download completed: %s", response.FileName)) + broadcast.Log(fmt.Sprintf("๐Ÿ“ Saved to: %s", response.FilePath)) + } else { + broadcast.Log(fmt.Sprintf("โŒ Download failed: %s", response.Error)) + } + + log.Printf("Download completed: Success=%v, Error=%s", response.Success, response.Error) + }() + + // Return immediate response + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]interface{}{ + "success": true, + "message": "Download started", + }) +} + +// Static serves the embedded static files +func (h *Handler) Static() http.Handler { + staticSubFS, err := fs.Sub(h.staticFS, "src/static") + if err != nil { + log.Fatal("Failed to create static sub filesystem:", err) + } + return http.FileServer(http.FS(staticSubFS)) +} + +// validateDownloadRequest validates the download request parameters +func (h *Handler) validateDownloadRequest(req *models.DownloadRequest) error { + if req.YtLink == "" { + return fmt.Errorf("YouTube URL is required") + } + + if !utils.IsValidYouTubeURL(req.YtLink) { + return fmt.Errorf("invalid YouTube URL format") + } + + // Set defaults and validate formats + if req.DownloadVideo { + if !utils.Contains(config.VideoFormats, req.AudioFormat) { + req.AudioFormat = "mp4" // Default for video + } + if req.AudioQuality == "" { + req.AudioQuality = "1080p" // Default video quality + } + } else { + if !utils.Contains(config.AudioFormats, req.AudioFormat) { + req.AudioFormat = "mp3" // Default for audio + } + if req.AudioQuality == "" { + req.AudioQuality = "0" // Default to best audio quality + } + } + + return nil +} \ No newline at end of file diff --git a/src/handlers/video.go b/src/handlers/video.go new file mode 100644 index 0000000..f810e75 --- /dev/null +++ b/src/handlers/video.go @@ -0,0 +1,133 @@ +package handlers + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "beat-harvester/src/config" + "beat-harvester/src/models" + "beat-harvester/src/utils" + "beat-harvester/src/broadcast" +) + +// processVideoDownload handles the complete video download workflow +func (h *Handler) processVideoDownload(req models.DownloadRequest) models.DownloadResponse { + // Extract or use provided album name + albumName, err := h.getAlbumName(req) + if err != nil { + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Failed to extract video info: %v", err), + } + } + + // Setup paths + paths := h.setupDownloadPaths(albumName, req.OutputPath) + defer os.RemoveAll(paths.TempDir) // Cleanup + + broadcast.Log(fmt.Sprintf("๐ŸŽฌ Starting video download: %s", req.YtLink)) + + // Download video with yt-dlp + videoFile, err := h.downloadVideo(req, paths.TempDir) + if err != nil { + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Video download failed: %v", err), + } + } + + // Extract title and setup final paths + videoPath := filepath.Join(paths.TempDir, videoFile) + originalTitle := h.extractVideoTitle(videoPath) + if originalTitle == "" { + originalTitle = albumName + } + + finalFileName := utils.SanitizeFilename(originalTitle) + finalFile := filepath.Join(paths.AlbumDir, finalFileName+"."+req.AudioFormat) + + // Move video to final location + if err := os.Rename(videoPath, finalFile); err != nil { + return models.DownloadResponse{ + Success: false, + Error: fmt.Sprintf("Failed to move video file: %v", err), + } + } + + return models.DownloadResponse{ + Success: true, + Message: "Video download completed successfully!", + FileName: finalFileName + "." + req.AudioFormat, + FilePath: finalFile, + AlbumName: albumName, + OriginalTitle: originalTitle, + AudioQuality: h.getVideoQualityLabel(req.AudioQuality), + AudioFormat: strings.ToUpper(req.AudioFormat), + } +} + +// downloadVideo downloads video using yt-dlp +func (h *Handler) downloadVideo(req models.DownloadRequest, tempDir string) (string, error) { + broadcast.Log("๐ŸŽฌ Downloading video...") + + tempVideoPath := filepath.Join(tempDir, "temp_video.%(ext)s") + formatSelector := h.getVideoFormatSelector(req.AudioQuality) + + args := []string{ + "-f", formatSelector, + "--embed-metadata", + "-o", tempVideoPath, + req.YtLink, + } + + cmd := exec.Command("yt-dlp", args...) + if err := cmd.Run(); err != nil { + broadcast.Log(fmt.Sprintf("โŒ yt-dlp video download failed: %v", err)) + return "", err + } + + // Find the downloaded video file + videoFile := utils.FindVideoFile(tempDir) + if videoFile == "" { + broadcast.Log("โŒ Downloaded video file not found") + return "", fmt.Errorf("downloaded video file not found") + } + + return videoFile, nil +} + +// getVideoFormatSelector returns the appropriate format selector for yt-dlp +func (h *Handler) getVideoFormatSelector(quality string) string { + if selector, exists := config.VideoQuality[quality]; exists { + return selector + } + return config.VideoQuality["1080p"] // Default to 1080p +} + +// getVideoQualityLabel returns a human-readable quality label +func (h *Handler) getVideoQualityLabel(quality string) string { + qualityLabels := map[string]string{ + "1080p": "1080p", + "720p": "720p", + "480p": "480p", + "worst": "360p or lower", + } + + if label, exists := qualityLabels[quality]; exists { + return label + } + return "Best available" +} + +// extractVideoTitle extracts the title from a video file +func (h *Handler) extractVideoTitle(videoPath string) string { + cmd := exec.Command("ffprobe", "-v", "quiet", "-show_entries", "format_tags=title", "-of", "csv=p=0", videoPath) + output, err := cmd.Output() + if err != nil { + return "" + } + return strings.TrimSpace(string(output)) +} \ No newline at end of file diff --git a/src/models/models.go b/src/models/models.go new file mode 100644 index 0000000..7158d32 --- /dev/null +++ b/src/models/models.go @@ -0,0 +1,26 @@ +package models + +// DownloadRequest represents the download request payload +type DownloadRequest struct { + AlbumName string `json:"albumName"` + YtLink string `json:"ytLink"` + AudioQuality string `json:"audioQuality"` + AudioFormat string `json:"audioFormat"` + EmbedThumbnail bool `json:"embedThumbnail"` + CropThumbnail bool `json:"cropThumbnail"` + OutputPath string `json:"outputPath"` + DownloadVideo bool `json:"downloadVideo"` +} + +// DownloadResponse represents the download response +type DownloadResponse struct { + Success bool `json:"success"` + Message string `json:"message"` + FileName string `json:"fileName"` + FilePath string `json:"filePath"` + AlbumName string `json:"albumName"` + OriginalTitle string `json:"originalTitle"` + AudioQuality string `json:"audioQuality"` + AudioFormat string `json:"audioFormat"` + Error string `json:"error,omitempty"` +} \ No newline at end of file diff --git a/src/static/favicon.ico b/src/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..820b5a65d74de0b280fa1b2d232c2e798bd83d96 GIT binary patch literal 15406 zcmZQzU}Rus5D);-3Je)63=C!r3=9ei5Wa>W1H(KP1_lEI2tPxOf#H}a1A_(w1A_oa z9Roz10SEXO6ja9$68iIRXz2g{FdP#8|9@!6|Nr43|Nn<7o-PbCrA!t7l?*nkegug zNcJQr{r{hn^Z##N-v9q;Y5)I+gY<_%-4Xu(Z$!lZe>pi2H846k=|9M95dOPs_y7NY z{`~*{?d$*lfB*dd|LWEM|I?;H!T{v{{QUoa|Ns5}|1S*x`~QFEPN?~z|Nrma{r~@= zgAjg9%>TdBr~Uu`^Y{P%6DNbk{^sWY2ZQ9K|6sp^-G}6Ukp6=Z{UCXeoBpp~`~Uyr z$6)>c;rf#yd{B6WhC|{eJpBLv-8=vPKX?%AACP`X z4A%1xq!(mHcqmxUKdAj6y&$_m_-|w5|NsC0{r?{o`Trj%Tw(gbdO>zW-4F81?pMb=|Gs$fA8Z%M{eS-d{|~YsWG^^fK-7WVx_kHkzfk}G2e}s%ZePFu z|37;+#J_p@|3Sh3KM~@8ko!RTK<)+6;P3~T|NHmq|G$uspKv}nK0tW@l}WG>6Uy+eN1NG}ViiPC;b~#6HY42Np+C4_6x(_y2!O3ns3u z{r?|S1`^|MP&tmx3?#9CAU4P@a9NM!zKRM^O@f5MH4}pW;luy`yLSEmpPLIQ`$26D zxSOE)qN@v`9#Ttzs|OT8P(4sq_8(SegTn)44zm4UzWo0WvJZrR{YKUP>(~GPbLYa{ z0M`#P17`of|B!YAsO^9amzF~FIn>=Cy~y^1!U!Y=!eL?m{}&Ye|G#3z|NmdVLfrE2 z-~a!!W}&$uUqUK~e)Y0~;SH{Bhb3>d!rV2(lSczM}gP z+5Q4t><5*f$2*FDknKlz8z|ne`5PvNZ2!-n z|Nnpg4#A-M15_r0>;$DPP@Z427R_#`pP=@Gl)=Iu#eFclu+hl*A7mE@gA)UY@&Et- zZ{Pm^KXT;%|MGG)yOHV@sQq9aNdCv{-yrFMxg|FC|Nr`WOk7j*|39do3F^OBxf z2{))5iWng?vG@m}AF17g)tqo>`-p&>;r&)Z>R|Gy_JaB!|3X4ug8IS;x53oHXk472YDHy2C%f#Vp`2WA4f0n`r#g$G;@ zC|=O@;f+&V?nD&_+3_zp7(W!c>FAQGRP1Af`Y;!dJ+K*^^fX9U4;Ta?+z+o4(A@tQG+y!i`Tze<2XV0`db0gZ#00@&EszIbe`lY#81B9UZvcgiSv# zF?9Fe#_oQ2-2p0>KzZ@hY4F@X$oXIl$`|;?8tLVJT;Y#io`L3#4j%?P9ZZ1Y;KT{s zd5voBM=OKT!ylLXvBh6%DkP79Jpdh7tEj}DE+}4f!RK~*G z52_bH@q*-6aNZ{}{eaaX>BVX%OdjMeu=~%$Z2yn5{DkR2r$K9Z9z1~S2ai{S{DiJ< z^-8!JFax>##FjSE_2c4$-G3G~s!qE5LFU5dV89Oh|NlQ|UIZkLjN#!At!Ri9t`B!VR3QoO$D4-mxF6(i5XP$?ROjBm4|Noj0PL2Y8tnh0$3 zOi=fOlz}nH?#Gh0KzV`K@CT_yc0Wkpx^;*)D98_&F8%)xYG)&>gRv=aKRExx%t5C? z?jSn-hyVW%N;Ad9ko8C4`B-phLe{`cngo$Yw*$nd!2Kxc09!cXb3ZH}g62cp+W!CF zzyJUL_wOO=l%Y-sQ=s{K&{zPv`LMEs9QVWQ2KgTsMh|~bn1cEupgtoEgXX_M=>zOg zBmyJ`S_idb2kvl(*-MW5VS4e<|Ipo!?AUSY+V9C=cVMvMFzO_UQqcD4hOvI zu+(pO)#LCpOb>W}43ZjR%0iglAxskvXQVK}vSx!c{V=l-aYvqhOmnd24|sZpsV9LZ zRxhq}LacrQX$Lg-h_a^&Lp>raVPOEuKQK1AG>RD%_~lOuZM z!{D_KAt6&h>o;I)Q2qx61^*8XIfODN53>tKqnU%#KD0EAJ1#Ku7cMjZg@*hCxec^l V1GMJkzmE?W$nB$eGz2IK0RYEc1@-^{ literal 0 HcmV?d00001 diff --git a/src/static/index.html b/src/static/index.html new file mode 100644 index 0000000..a4cf5c7 --- /dev/null +++ b/src/static/index.html @@ -0,0 +1,97 @@ + + + + + + + Beat Harvester + + + + +

+ ๐Ÿ”Œ Connecting... +
+ +
+

๐ŸŽต Beat Harvester

+ +
+
+ + +
+ +
+ + +
+ +
+
+ โ–ถ +

Advanced Options

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+ + +
+
+
+ + +
+ +
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/static/main.js b/src/static/main.js new file mode 100644 index 0000000..a5ff855 --- /dev/null +++ b/src/static/main.js @@ -0,0 +1,228 @@ + +let ws = null; +let isConnected = false; +let reconnectAttempts = 0; +let maxReconnectAttempts = 5; +let isPageVisible = true; + +// WebSocket connection +function connectWebSocket() { + // Don't try to connect if page is not visible + if (!isPageVisible) { + return; + } + + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const wsUrl = `${protocol}//${window.location.host}/ws`; + + console.log('Attempting WebSocket connection...'); + ws = new WebSocket(wsUrl); + + ws.onopen = function () { + console.log('WebSocket connected'); + isConnected = true; + reconnectAttempts = 0; + updateConnectionStatus(); + }; + + ws.onclose = function (event) { + console.log('WebSocket disconnected:', event.code, event.reason); + isConnected = false; + updateConnectionStatus(); + + // Only attempt to reconnect if the page is visible and we haven't exceeded max attempts + if (isPageVisible && reconnectAttempts < maxReconnectAttempts) { + reconnectAttempts++; + const delay = Math.min(1000 * Math.pow(2, reconnectAttempts), 30000); // Exponential backoff, max 30s + console.log(`Reconnecting in ${delay}ms (attempt ${reconnectAttempts}/${maxReconnectAttempts})`); + setTimeout(connectWebSocket, delay); + } + }; + + ws.onerror = function (error) { + console.error('WebSocket error:', error); + isConnected = false; + updateConnectionStatus(); + }; + + ws.onmessage = function (event) { + try { + const data = JSON.parse(event.data); + handleWebSocketMessage(data); + } catch (e) { + console.error('Failed to parse WebSocket message:', e); + } + }; +} + +function updateConnectionStatus() { + const statusEl = document.getElementById('connectionStatus'); + if (isConnected) { + statusEl.textContent = '๐ŸŸข Connected'; + statusEl.className = 'connection-status connected'; + } else { + statusEl.textContent = '๐Ÿ”ด Disconnected'; + statusEl.className = 'connection-status disconnected'; + } +} + +function handleWebSocketMessage(data) { + if (data.type === 'log') { + addLogEntry(data.timestamp, data.message); + showLogsContainer(); + } +} + +function addLogEntry(timestamp, message) { + const logsList = document.getElementById('logsList'); + const logEntry = document.createElement('div'); + logEntry.className = 'log-entry'; + logEntry.innerHTML = `[${timestamp}]${message}`; + logsList.appendChild(logEntry); + + // Auto-scroll to bottom + const logsContainer = document.getElementById('logsContainer'); + logsContainer.scrollTop = logsContainer.scrollHeight; +} + +function showLogsContainer() { + document.getElementById('logsContainer').classList.add('show'); +} + +function showStatus(message, type = 'info') { + const statusDiv = document.getElementById('statusMessage'); + statusDiv.textContent = message; + statusDiv.className = `status ${type}`; + statusDiv.style.display = 'block'; +} + +function toggleAdvanced() { + const content = document.getElementById('advancedContent'); + const icon = document.querySelector('.toggle-icon'); + + content.classList.toggle('expanded'); + icon.classList.toggle('expanded'); +} + +// Handle video/audio toggle +document.getElementById('downloadVideo').addEventListener('change', function () { + const isVideo = this.checked; + const formatSelect = document.getElementById('audioFormat'); + const qualitySelect = document.getElementById('audioQuality'); + const qualityLabel = document.getElementById('qualityLabel'); + const downloadBtn = document.getElementById('downloadBtn'); + const audioOnlyOptions = document.getElementById('audioOnlyOptions'); + + if (isVideo) { + // Video mode + formatSelect.innerHTML = ` + + + + `; + qualitySelect.innerHTML = ` + + + + + `; + qualityLabel.textContent = 'Video Quality'; + downloadBtn.textContent = '๐ŸŽฌ Download Video'; + audioOnlyOptions.style.display = 'none'; + + } else { + // Audio mode + formatSelect.innerHTML = ` + + + + + `; + qualitySelect.innerHTML = ` + + + + + `; + qualityLabel.textContent = 'Audio Quality'; + downloadBtn.textContent = '๐ŸŽต Download Audio'; + audioOnlyOptions.style.display = 'block'; + } +}); + +document.getElementById('downloadForm').addEventListener('submit', async function (e) { + e.preventDefault(); + + const formData = new FormData(e.target); + const data = Object.fromEntries(formData.entries()); + + // Add checkbox values + data.embedThumbnail = document.getElementById('embedThumbnail').checked; + data.cropThumbnail = document.getElementById('cropThumbnail').checked; + data.downloadVideo = document.getElementById('downloadVideo').checked; + + const downloadBtn = document.getElementById('downloadBtn'); + + downloadBtn.disabled = true; + downloadBtn.textContent = 'Starting...'; + showStatus('Sending request to server...', 'info'); + + try { + const response = await fetch('/api/download', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data) + }); + + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || 'Download failed'); + } + + showStatus('Download started! Check logs below for progress.', 'success'); + + } catch (error) { + console.error('Download error:', error); + showStatus('Download failed: ' + error.message, 'error'); + } finally { + downloadBtn.disabled = false; + downloadBtn.textContent = data.downloadVideo ? '๐ŸŽฌ Download Video' : '๐ŸŽต Download Audio'; + } +}); + +// Initialize the application +document.addEventListener('DOMContentLoaded', function () { + console.log('๐ŸŽต Music Downloader - Initializing...'); + connectWebSocket(); + + // Initialize video/audio toggle + document.getElementById('downloadVideo').dispatchEvent(new Event('change')); + + console.log('โœ… Application initialized'); +}); + +// Handle page visibility changes +document.addEventListener('visibilitychange', function () { + isPageVisible = !document.hidden; + + if (isPageVisible) { + console.log('Page became visible'); + // Reset reconnection attempts when page becomes visible + reconnectAttempts = 0; + // Only reconnect if we're not connected + if (!isConnected) { + console.log('Reconnecting due to page visibility change'); + connectWebSocket(); + } + } else { + console.log('Page became hidden'); + // Optionally close the connection when page is hidden to prevent unnecessary reconnection attempts + if (ws && isConnected) { + console.log('Closing WebSocket due to page becoming hidden'); + ws.close(1000, 'Page hidden'); + } + } +}); diff --git a/src/static/styles.css b/src/static/styles.css new file mode 100644 index 0000000..a420321 --- /dev/null +++ b/src/static/styles.css @@ -0,0 +1,243 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + padding: 20px; +} + +.container { + max-width: 800px; + margin: 0 auto; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + border-radius: 20px; + padding: 40px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); +} + +h1 { + text-align: center; + color: #2d3748; + margin-bottom: 30px; + font-size: 2.5rem; + font-weight: 700; +} + +.form-group { + margin-bottom: 25px; +} + +label { + display: block; + margin-bottom: 8px; + font-weight: 600; + color: #4a5568; + font-size: 1.1rem; +} + +input[type="text"], +input[type="url"], +select { + width: 100%; + padding: 15px; + border: 2px solid #e2e8f0; + border-radius: 10px; + font-size: 16px; + transition: all 0.3s ease; + background: white; +} + +input[type="text"]:focus, +input[type="url"]:focus, +select:focus { + outline: none; + border-color: #667eea; + box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); +} + +.advanced-options { + background: #f8fafc; + border-radius: 12px; + padding: 20px; + margin: 20px 0; + border: 1px solid #e2e8f0; +} + +.advanced-header { + display: flex; + align-items: center; + cursor: pointer; + margin-bottom: 15px; +} + +.advanced-header h3 { + color: #4a5568; + margin-left: 10px; +} + +.toggle-icon { + transition: transform 0.3s ease; +} + +.toggle-icon.expanded { + transform: rotate(90deg); +} + +.advanced-content { + display: none; +} + +.advanced-content.expanded { + display: block; +} + +.row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 20px; +} + +.checkbox-group { + display: flex; + align-items: center; + margin-bottom: 15px; +} + +.checkbox-group input[type="checkbox"] { + width: auto; + margin-right: 10px; + transform: scale(1.2); +} + +.download-btn { + width: 100%; + padding: 18px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 12px; + font-size: 18px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + text-transform: uppercase; + letter-spacing: 1px; +} + +.download-btn:hover { + transform: translateY(-2px); + box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3); +} + +.download-btn:disabled { + background: #a0aec0; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.status { + margin-top: 20px; + padding: 15px; + border-radius: 8px; + font-weight: 500; + display: none; +} + +.status.success { + background: #c6f6d5; + color: #22543d; + border: 1px solid #9ae6b4; +} + +.status.error { + background: #fed7d7; + color: #742a2a; + border: 1px solid #fc8181; +} + +.status.info { + background: #bee3f8; + color: #2a4365; + border: 1px solid #90cdf4; +} + +.logs-container { + margin-top: 30px; + background: #2d3748; + border-radius: 12px; + padding: 20px; + max-height: 300px; + overflow-y: auto; + font-family: 'Courier New', monospace; + font-size: 14px; + line-height: 1.5; + display: none; +} + +.logs-container.show { + display: block; +} + +.log-entry { + color: #e2e8f0; + margin-bottom: 5px; +} + +.log-timestamp { + color: #a0aec0; + margin-right: 10px; +} + +.connection-status { + position: fixed; + top: 20px; + right: 20px; + padding: 10px 15px; + border-radius: 8px; + font-size: 0.9rem; + font-weight: 500; + z-index: 1000; +} + +.connection-status.connected { + background: #c6f6d5; + color: #22543d; + border: 1px solid #9ae6b4; +} + +.connection-status.disconnected { + background: #fed7d7; + color: #742a2a; + border: 1px solid #fc8181; +} + +@media (max-width: 768px) { + .container { + padding: 20px; + margin: 10px; + } + + .row { + grid-template-columns: 1fr; + } + + h1 { + font-size: 2rem; + } + + .connection-status { + position: relative; + top: auto; + right: auto; + margin-bottom: 20px; + display: inline-block; + } +} \ No newline at end of file diff --git a/src/utils/utils.go b/src/utils/utils.go new file mode 100644 index 0000000..7d704c1 --- /dev/null +++ b/src/utils/utils.go @@ -0,0 +1,100 @@ +package utils + +import ( + "fmt" + "log" + "os" + "os/exec" + "regexp" + "strings" +) + +// CheckDependencies verifies that required external tools are available +func CheckDependencies() error { + dependencies := []string{"yt-dlp", "ffmpeg", "ffprobe"} + + for _, dep := range dependencies { + if _, err := exec.LookPath(dep); err != nil { + return fmt.Errorf("missing dependency: %s", dep) + } + } + + // Check for dwebp (optional, for thumbnail processing) + if _, err := exec.LookPath("dwebp"); err != nil { + log.Println("โš ๏ธ Warning: dwebp not found, thumbnail cropping will be disabled") + } + + return nil +} + +// SanitizeFilename removes invalid characters for filenames +func SanitizeFilename(filename string) string { + re := regexp.MustCompile(`[<>:"/\\|?*]`) + return strings.TrimSpace(re.ReplaceAllString(filename, "_")) +} + +// IsValidYouTubeURL validates YouTube URL formats +func IsValidYouTubeURL(url string) bool { + patterns := []string{ + `^https?://(www\.)?youtube\.com/watch\?v=[\w-]+`, + `^https?://youtu\.be/[\w-]+`, + `^https?://(www\.)?youtube\.com/playlist\?list=[\w-]+`, + } + + for _, pattern := range patterns { + if matched, _ := regexp.MatchString(pattern, url); matched { + return true + } + } + return false +} + +// Contains checks if a slice contains a specific item +func Contains(slice []string, item string) bool { + for _, s := range slice { + if s == item { + return true + } + } + return false +} + +// FindWebPFile finds a WebP file in the given directory +func FindWebPFile(dir string) string { + files, err := os.ReadDir(dir) + if err != nil { + return "" + } + + for _, file := range files { + if strings.HasSuffix(strings.ToLower(file.Name()), ".webp") { + return file.Name() + } + } + return "" +} + +// FindVideoFile finds a video file in the given directory +func FindVideoFile(dir string) string { + files, err := os.ReadDir(dir) + if err != nil { + return "" + } + + videoExtensions := []string{".mp4", ".webm", ".mkv", ".avi", ".mov"} + for _, file := range files { + fileName := strings.ToLower(file.Name()) + for _, ext := range videoExtensions { + if strings.HasSuffix(fileName, ext) && strings.Contains(fileName, "temp_video") { + return file.Name() + } + } + } + return "" +} + +// FileExists checks if a file exists +func FileExists(filename string) bool { + _, err := os.Stat(filename) + return !os.IsNotExist(err) +} \ No newline at end of file