From 3e74aca988443d4899250c155eef348ee6798183 Mon Sep 17 00:00:00 2001 From: Mitya Date: Thu, 11 Jun 2026 17:31:03 +0300 Subject: [PATCH] feat(seo): public read mode, bot dynamic rendering & Lighthouse/bundle gates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make public content crawlable and link-previewable, and gate the build on SEO/quality benchmarks so it cannot silently regress. See ADR-0010 and ADR-0011. Crawlability (frontend): - AdaptiveShell picks the layout per request: AppShell for authed users, a lightweight crawlable PublicShell (sign-in CTAs, no realtime socket) for guests on routes marked handle.public, redirect to /login otherwise. - Public routes: /:handle (+ replies/media/likes/followers/following) and /:handle/status/:postId (+ photo). Private accounts, DMs, notifications, bookmarks and settings stay auth-gated. No backend authz change — the read endpoints were already OptionalAuthGuard. Dynamic rendering (backend + nginx): - New SeoModule: GET /seo/prerender (server-rendered OG + Twitter Card + JSON-LD for non-JS social scrapers), DB-backed /seo/sitemap.xml, host-aware /seo/robots.txt. nginx maps crawler/social user-agents to an internal prerender location; humans get the SPA index.html. Client metadata (complement): - component uses React 19 native metadata hoisting for per-route title/description/canonical/OG/Twitter; helpers in lib/seo.ts. Benchmark gates (CI): - Lighthouse CI (lighthouserc.cjs) against the dockerized stack with deterministic seeded content (scripts/seed-lighthouse.mjs). Gates SEO=1.0, A11y=0.9, Best Practices=0.9 (error); Performance=0.8 (warn) due to CI CPU variance. Desktop preset. - size-limit brotli budgets on always-loaded chunks (app entry <=25kB, react-vendor <=95kB) as a standalone job; Vite manualChunks for the vendor split. - @lhci/cli is dev-only; tmp pinned via root overrides to clear a high advisory. Also adds robots.txt, site.webmanifest, OG/app icons, and assorted accessibility/performance/security-header fixes across components. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/ci.yml | 70 + .gitignore | 8 + README.md | 10 +- backend/src/app.module.ts | 2 + backend/src/modules/seo/seo.controller.ts | 67 + backend/src/modules/seo/seo.module.ts | 19 + backend/src/modules/seo/seo.service.ts | 383 +++ backend/tests/unit/seo/seo.service.spec.ts | 225 ++ ...-seo-crawlability-and-dynamic-rendering.md | 54 + docs/adr/0011-seo-benchmark-gates.md | 54 + docs/adr/README.md | 2 + frontend/index.html | 39 +- frontend/nginx.conf | 87 +- frontend/package.json | 17 +- frontend/public/apple-touch-icon.png | Bin 0 -> 19558 bytes frontend/public/icon-192.png | Bin 0 -> 21915 bytes frontend/public/icon-512.png | Bin 0 -> 109753 bytes frontend/public/og-default.png | Bin 0 -> 67939 bytes frontend/public/robots.txt | 22 + frontend/public/site.webmanifest | 15 + frontend/src/app/AdaptiveShell.tsx | 46 + frontend/src/app/AppShell.tsx | 12 +- frontend/src/app/PublicShell.tsx | 152 + frontend/src/app/router.tsx | 28 +- frontend/src/components/Badge.tsx | 2 +- frontend/src/components/Button.test.tsx | 3 +- frontend/src/components/Button.tsx | 4 +- frontend/src/components/ConfirmDialog.tsx | 2 +- frontend/src/components/FollowButton.tsx | 2 +- frontend/src/components/IconButton.tsx | 2 +- frontend/src/components/MediaGrid.tsx | 2 +- frontend/src/components/PostCard.tsx | 1 - frontend/src/components/Seo.tsx | 68 + frontend/src/components/Tabs.tsx | 2 +- frontend/src/components/Toast.tsx | 1 + .../src/features/composer/PostComposer.tsx | 2 +- .../features/messaging/ConversationRow.tsx | 2 +- .../src/features/messaging/DmComposer.tsx | 2 +- .../src/features/messaging/MessageBubble.tsx | 2 +- .../notifications/NotificationItem.tsx | 2 +- frontend/src/index.css | 31 + frontend/src/lib/seo.ts | 25 + frontend/src/pages/ComposeDmModal.tsx | 2 +- frontend/src/pages/HomePage.tsx | 4 +- frontend/src/pages/LoginPage.tsx | 8 +- frontend/src/pages/PostPage.tsx | 25 + frontend/src/pages/ProfilePage.tsx | 15 + frontend/src/pages/RegisterPage.tsx | 8 +- frontend/src/pages/SettingsPage.tsx | 4 +- frontend/src/pages/VerifyEmailPage.tsx | 2 +- frontend/src/styles/tokens.css | 13 +- frontend/vite.config.ts | 20 +- lighthouserc.cjs | 49 + package-lock.json | 3011 ++++++++++++++++- package.json | 4 + scripts/seed-lighthouse.mjs | 53 + 56 files changed, 4577 insertions(+), 108 deletions(-) create mode 100644 backend/src/modules/seo/seo.controller.ts create mode 100644 backend/src/modules/seo/seo.module.ts create mode 100644 backend/src/modules/seo/seo.service.ts create mode 100644 backend/tests/unit/seo/seo.service.spec.ts create mode 100644 docs/adr/0010-seo-crawlability-and-dynamic-rendering.md create mode 100644 docs/adr/0011-seo-benchmark-gates.md create mode 100644 frontend/public/apple-touch-icon.png create mode 100644 frontend/public/icon-192.png create mode 100644 frontend/public/icon-512.png create mode 100644 frontend/public/og-default.png create mode 100644 frontend/public/robots.txt create mode 100644 frontend/public/site.webmanifest create mode 100644 frontend/src/app/AdaptiveShell.tsx create mode 100644 frontend/src/app/PublicShell.tsx create mode 100644 frontend/src/components/Seo.tsx create mode 100644 frontend/src/lib/seo.ts create mode 100644 lighthouserc.cjs create mode 100644 scripts/seed-lighthouse.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c188faf..32cefe9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -229,3 +229,73 @@ jobs: - uses: actions/checkout@v4 - name: Build all images run: NODE_VERSION=$(cat .nvmrc) docker compose build + + # ── 6. Bundle-size budget (size-limit on the built frontend) ───────────────── + bundle-size: + name: Bundle Size Budget + needs: lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: npm + - run: npm ci + - name: Build frontend + run: npm run -w frontend build + - name: Check bundle-size budget + run: npm run -w frontend size + + # ── 7. Lighthouse benchmarks (SEO / a11y / best-practices / perf gate) ─────── + lighthouse: + name: Lighthouse Benchmarks + needs: e2e + runs-on: ubuntu-latest + env: + JWT_ACCESS_SECRET: e2e_ci_access_secret_32chars_long + JWT_REFRESH_SECRET: e2e_ci_refresh_secret_32chars_long + LH_BASE_URL: http://localhost:18080 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: npm + - run: npm ci + + - name: Start Dockerized stack + env: + FRONTEND_PORT: "18080" + WEB_ORIGIN: "http://localhost:18080" + run: | + NODE_VERSION=$(cat .nvmrc) docker compose -f docker-compose.yml -f docker-compose.e2e.yml up -d --build --wait + timeout-minutes: 15 + + - name: Dump stack logs on failure + if: failure() + run: | + NODE_VERSION=$(cat .nvmrc) FRONTEND_PORT=18080 WEB_ORIGIN=http://localhost:18080 \ + docker compose -f docker-compose.yml -f docker-compose.e2e.yml ps -a || true + docker logs tweeter-backend-1 --tail 400 2>&1 || true + + - name: Run database migrations + run: | + docker exec -w /app/backend tweeter-backend-1 \ + npx typeorm migration:run -d dist/infra/database/data-source.js + + - name: Seed public content for Lighthouse + run: node scripts/seed-lighthouse.mjs + + - name: Run Lighthouse CI + run: npx lhci autorun + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: lighthouse-results + path: .lighthouseci/ + + - name: Tear down stack + if: always() + run: docker compose -f docker-compose.yml -f docker-compose.e2e.yml down -v diff --git a/.gitignore b/.gitignore index 06273f8..247fba7 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,11 @@ tests/e2e/tour/.auth/ playwright-report/ test-results/ tests/node_modules + +# Lighthouse CI run artifacts +.lighthouseci/ +.lighthouse-urls.json + +# Local verification artifacts +.playwright-mcp/ +a11y-*.png diff --git a/README.md b/README.md index 2417c8d..462e93c 100644 --- a/README.md +++ b/README.md @@ -122,10 +122,17 @@ make test-e2e # boots the stack, runs migrations, runs Playwright, te # Per-package, if you prefer: npm run test -w backend # npm run test:coverage -w backend for coverage npm run test -w frontend + +# SEO / quality benchmarks (Lighthouse + bundle-size) +npm run -w frontend size # bundle-size budget (size-limit) +node scripts/seed-lighthouse.mjs # seed a public profile + post (stack must be up) +npx lhci autorun # Lighthouse: SEO / a11y / best-practices / perf ``` Coverage is gated at **80% lines** in CI. The pipeline runs the layers in order — -`lint → unit → integration → e2e → build` (see [.github/workflows/ci.yml](.github/workflows/ci.yml)). +`lint → unit → integration → e2e → build`, plus a **bundle-size** budget and a +**Lighthouse** gate (SEO 100, a11y/best-practices ≥ 90, performance reported) — see +[.github/workflows/ci.yml](.github/workflows/ci.yml) and [ADR-0011](docs/adr/0011-seo-benchmark-gates.md). ## 🗄️ Migrations @@ -150,6 +157,7 @@ The load-bearing engineering decisions are recorded as ADRs (see the [decision l - **Secure sessions** — a short-lived access JWT (in memory) plus a **rotating** refresh token in an httpOnly/Secure/SameSite cookie, with a Redis denylist enforced in the auth guard so logout revokes immediately. → [ADR-0003](docs/adr/0003-auth-strategy.md), [ADR-0009](docs/adr/0009-session-revocation-denylist.md) - **Media pipeline** — presigned direct-to-storage uploads (MinIO/S3), async processing into variants, then attachment to posts. - **Search without extra infrastructure** — PostgreSQL full-text search + `pg_trgm` fuzzy matching behind a `SearchPort`, swappable for a dedicated engine later. → [ADR-0005](docs/adr/0005-search-approach.md) +- **SEO without an SSR rewrite** — public profiles/posts are crawlable; nginx routes social scrapers (which don't run JS) to a backend **dynamic-rendering** layer that emits Open Graph / Twitter Card / JSON-LD, plus a DB-backed `sitemap.xml` and host-aware `robots.txt`. Per-route metadata for the human/Googlebot path uses **React 19 native metadata** (no extra dependency). → [ADR-0010](docs/adr/0010-seo-crawlability-and-dynamic-rendering.md) ## 📂 Project structure diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 8a46beb..796b18f 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -19,6 +19,7 @@ import { NotificationsModule } from './modules/notifications/notifications.modul import { SearchModule } from './modules/search/search.module'; import { HashtagsModule } from './modules/hashtags/hashtags.module'; import { ReportsModule } from './modules/reports/reports.module'; +import { SeoModule } from './modules/seo/seo.module'; import { AllExceptionsFilter } from './common/filters/all-exceptions.filter'; import { LoggingInterceptor } from './common/interceptors/logging.interceptor'; import { NOTIFICATION_PORT } from './modules/users/notification.port'; @@ -56,6 +57,7 @@ import { ViewerFlagsAdapter } from './modules/engagement/viewer-flags.adapter'; HashtagsModule, SearchModule, ReportsModule, + SeoModule, ], providers: [ { diff --git a/backend/src/modules/seo/seo.controller.ts b/backend/src/modules/seo/seo.controller.ts new file mode 100644 index 0000000..c17e261 --- /dev/null +++ b/backend/src/modules/seo/seo.controller.ts @@ -0,0 +1,67 @@ +import { Controller, Get, Headers, Res } from '@nestjs/common'; +import type { FastifyReply } from 'fastify'; +import { SeoService } from './seo.service'; + +/** + * SeoController — crawler-facing endpoints. + * + * GET /api/v1/seo/prerender ← nginx routes bot requests for public content + * routes here (X-Original-URI carries the path) + * GET /api/v1/seo/sitemap.xml ← nginx maps /sitemap.xml here + * GET /api/v1/seo/robots.txt ← nginx maps /robots.txt here + * + * No auth guard: these are public by design and only ever reached via nginx. + */ +@Controller('seo') +export class SeoController { + constructor(private readonly seoService: SeoService) {} + + private baseUrl( + proto: string | undefined, + fwdHost: string | undefined, + host: string | undefined, + ): string { + const scheme = (proto ?? 'http').split(',')[0].trim() || 'http'; + const h = (fwdHost ?? host ?? 'localhost').split(',')[0].trim() || 'localhost'; + return `${scheme}://${h}`; + } + + @Get('prerender') + async prerender( + @Headers('x-original-uri') originalUri: string | undefined, + @Headers('x-forwarded-proto') proto: string | undefined, + @Headers('x-forwarded-host') fwdHost: string | undefined, + @Headers('host') host: string | undefined, + @Res({ passthrough: true }) reply: FastifyReply, + ): Promise { + const baseUrl = this.baseUrl(proto, fwdHost, host); + const { html, status } = await this.seoService.renderPath(originalUri ?? '/', baseUrl); + void reply.status(status).type('text/html; charset=utf-8'); + return html; + } + + @Get('sitemap.xml') + async sitemap( + @Headers('x-forwarded-proto') proto: string | undefined, + @Headers('x-forwarded-host') fwdHost: string | undefined, + @Headers('host') host: string | undefined, + @Res({ passthrough: true }) reply: FastifyReply, + ): Promise { + const baseUrl = this.baseUrl(proto, fwdHost, host); + const xml = await this.seoService.buildSitemap(baseUrl); + void reply.type('application/xml; charset=utf-8'); + return xml; + } + + @Get('robots.txt') + robots( + @Headers('x-forwarded-proto') proto: string | undefined, + @Headers('x-forwarded-host') fwdHost: string | undefined, + @Headers('host') host: string | undefined, + @Res({ passthrough: true }) reply: FastifyReply, + ): string { + const baseUrl = this.baseUrl(proto, fwdHost, host); + void reply.type('text/plain; charset=utf-8'); + return this.seoService.buildRobots(baseUrl); + } +} diff --git a/backend/src/modules/seo/seo.module.ts b/backend/src/modules/seo/seo.module.ts new file mode 100644 index 0000000..68bd6da --- /dev/null +++ b/backend/src/modules/seo/seo.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; +import { PostsModule } from '../posts/posts.module'; +import { UsersModule } from '../users/users.module'; +import { SeoController } from './seo.controller'; +import { SeoService } from './seo.service'; + +/** + * SeoModule — server-rendered crawler artifacts (dynamic rendering for + * social scrapers, sitemap.xml, robots.txt). + * + * Imports PostsModule + UsersModule for PostsService/UsersService and the + * re-exported Post/User repositories (via their exported TypeOrmModule). + */ +@Module({ + imports: [PostsModule, UsersModule], + controllers: [SeoController], + providers: [SeoService], +}) +export class SeoModule {} diff --git a/backend/src/modules/seo/seo.service.ts b/backend/src/modules/seo/seo.service.ts new file mode 100644 index 0000000..011ff80 --- /dev/null +++ b/backend/src/modules/seo/seo.service.ts @@ -0,0 +1,383 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { PostsService } from '../posts/posts.service'; +import { UsersService } from '../users/users.service'; +import { Post } from '../posts/post.entity'; +import { User } from '../users/user.entity'; +import type { PostDto } from '../posts/dto/post.dto'; +import type { ProfileDto } from '../users/dto/profile.dto'; + +const SITE_NAME = 'PULSE'; +const DEFAULT_OG_IMAGE = '/og-default.png'; +const SITEMAP_MAX_URLS = 2000; + +interface MetaDocument { + title: string; + description: string; + canonical: string; + image: string; + type: 'website' | 'article' | 'profile'; + card: 'summary' | 'summary_large_image'; + jsonLd?: Record; + bodyHtml: string; + noindex?: boolean; +} + +/** + * SeoService — renders crawler-facing artifacts that the SPA cannot + * provide to non-JS clients: server-rendered Open Graph / Twitter Card / + * JSON-LD documents for public posts & profiles (dynamic rendering), plus + * a DB-backed sitemap.xml and a host-aware robots.txt. + */ +@Injectable() +export class SeoService { + private readonly logger = new Logger(SeoService.name); + + constructor( + private readonly postsService: PostsService, + private readonly usersService: UsersService, + @InjectRepository(Post) private readonly postRepo: Repository, + @InjectRepository(User) private readonly userRepo: Repository, + ) {} + + // ── HTML escaping ────────────────────────────────────────────────────────── + + private escapeHtml(value: string): string { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + private escapeXml(value: string): string { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + private truncate(text: string, max = 160): string { + const clean = text.replace(/\s+/g, ' ').trim(); + if (clean.length <= max) return clean; + return clean.slice(0, max - 1).trimEnd() + '…'; + } + + /** Make a possibly-relative asset URL absolute against the request origin. */ + private absoluteUrl(baseUrl: string, maybeUrl: string | null | undefined): string { + if (!maybeUrl) return `${baseUrl}${DEFAULT_OG_IMAGE}`; + if (maybeUrl.startsWith('http://') || maybeUrl.startsWith('https://')) return maybeUrl; + return `${baseUrl}${maybeUrl.startsWith('/') ? '' : '/'}${maybeUrl}`; + } + + // ── Document renderer ─────────────────────────────────────────────────────── + + private renderDocument(doc: MetaDocument): string { + const t = this.escapeHtml(doc.title); + const d = this.escapeHtml(doc.description); + const robots = doc.noindex ? 'noindex, nofollow' : 'index, follow'; + const jsonLdScript = doc.jsonLd + ? `` + : ''; + + return ` + + + + +${t} + + + + + + + + + + + + + +${jsonLdScript} + + +${doc.bodyHtml} +

View on ${SITE_NAME}

+ + +`; + } + + // ── Profile rendering ──────────────────────────────────────────────────────── + + async renderProfile(handle: string, baseUrl: string): Promise<{ html: string; status: number }> { + const clean = handle.startsWith('@') ? handle.slice(1) : handle; + let profile: ProfileDto; + try { + const result = await this.usersService.getProfile(clean, null); + profile = result.user; + } catch { + return { html: this.renderNotFound(baseUrl, `@${clean}`), status: 404 }; + } + + const canonical = `${baseUrl}/@${profile.handle}`; + const title = `${profile.displayName} (@${profile.handle})`; + const description = profile.bio + ? this.truncate(profile.bio) + : `The latest posts from ${profile.displayName} (@${profile.handle}) on ${SITE_NAME}.`; + const image = this.absoluteUrl(baseUrl, profile.avatarUrl); + + const jsonLd: Record = { + '@context': 'https://schema.org', + '@type': 'ProfilePage', + dateCreated: profile.createdAt, + mainEntity: { + '@type': 'Person', + name: profile.displayName, + alternateName: `@${profile.handle}`, + ...(profile.bio ? { description: profile.bio } : {}), + image, + url: canonical, + interactionStatistic: [ + { + '@type': 'InteractionCounter', + interactionType: 'https://schema.org/FollowAction', + userInteractionCount: profile.counts.followers, + }, + ], + }, + }; + + const bodyHtml = `
+

${this.escapeHtml(profile.displayName)} @${this.escapeHtml(profile.handle)}

+${profile.bio ? `

${this.escapeHtml(profile.bio)}

` : ''} +

${profile.counts.followers} Followers · ${profile.counts.following} Following · ${profile.counts.posts} Posts

+
`; + + return { + html: this.renderDocument({ + title, + description, + canonical, + image, + type: 'profile', + card: 'summary', + jsonLd, + bodyHtml, + noindex: profile.isPrivate, + }), + status: 200, + }; + } + + // ── Post rendering ──────────────────────────────────────────────────────────── + + async renderPost(postId: string, baseUrl: string): Promise<{ html: string; status: number }> { + let post: PostDto; + try { + post = await this.postsService.findOne(postId, null); + } catch { + return { html: this.renderNotFound(baseUrl, 'this post'), status: 404 }; + } + if (post.deleted) { + return { html: this.renderNotFound(baseUrl, 'this post'), status: 404 }; + } + + const canonical = `${baseUrl}/@${post.author.handle}/status/${post.id}`; + const title = `${post.author.displayName} on ${SITE_NAME}`; + const description = post.text + ? this.truncate(post.text) + : `A post by ${post.author.displayName} (@${post.author.handle}) on ${SITE_NAME}.`; + + const readyMedia = post.media.find((m) => m.status === 'ready'); + const mediaUrl = + readyMedia?.variants.large ?? readyMedia?.variants.medium ?? readyMedia?.variants.poster; + const image = this.absoluteUrl(baseUrl, mediaUrl ?? post.author.avatarUrl); + const card: 'summary' | 'summary_large_image' = mediaUrl ? 'summary_large_image' : 'summary'; + + const jsonLd: Record = { + '@context': 'https://schema.org', + '@type': 'SocialMediaPosting', + url: canonical, + datePublished: post.createdAt, + ...(post.text ? { articleBody: post.text, headline: this.truncate(post.text, 110) } : {}), + author: { + '@type': 'Person', + name: post.author.displayName, + alternateName: `@${post.author.handle}`, + url: `${baseUrl}/@${post.author.handle}`, + }, + ...(mediaUrl ? { image } : {}), + interactionStatistic: [ + { + '@type': 'InteractionCounter', + interactionType: 'https://schema.org/LikeAction', + userInteractionCount: post.counts.likes, + }, + { + '@type': 'InteractionCounter', + interactionType: 'https://schema.org/ShareAction', + userInteractionCount: post.counts.reposts, + }, + { + '@type': 'InteractionCounter', + interactionType: 'https://schema.org/ReplyAction', + userInteractionCount: post.counts.replies, + }, + ], + }; + + const bodyHtml = `
+
+

${this.escapeHtml(post.author.displayName)} @${this.escapeHtml(post.author.handle)}

+${post.text ? `

${this.escapeHtml(post.text)}

` : ''} +

+

${post.counts.likes} Likes · ${post.counts.reposts} Reposts · ${post.counts.replies} Replies

+
+
`; + + return { + html: this.renderDocument({ + title, + description, + canonical, + image, + type: 'article', + card, + jsonLd, + bodyHtml, + }), + status: 200, + }; + } + + private renderNotFound(baseUrl: string, what: string): string { + return this.renderDocument({ + title: `Not found / ${SITE_NAME}`, + description: `We couldn't find ${what} on ${SITE_NAME}.`, + canonical: baseUrl, + image: `${baseUrl}${DEFAULT_OG_IMAGE}`, + type: 'website', + card: 'summary', + bodyHtml: `

Not found

We couldn't find ${this.escapeHtml(what)}.

`, + noindex: true, + }); + } + + // ── Dynamic-rendering dispatcher ─────────────────────────────────────────────── + + /** + * Given the original request path (from nginx `X-Original-URI`), render the + * matching crawler document. Falls back to a generic site document. + */ + async renderPath( + originalPath: string, + baseUrl: string, + ): Promise<{ html: string; status: number }> { + // Strip query string and trailing slash. + const path = originalPath.split('?')[0].replace(/\/+$/, '') || '/'; + const segments = path.split('/').filter(Boolean); + + // /:handle/status/:postId (handle may be url-encoded "@handle") + const statusIdx = segments.indexOf('status'); + if (statusIdx === 1 && segments[2]) { + return this.renderPost(decodeURIComponent(segments[2]), baseUrl); + } + // /:handle (and tabs: /:handle/replies, /:handle/media, …) + if (segments.length >= 1 && segments[0] !== 'status') { + const handle = decodeURIComponent(segments[0]); + // Only treat as a profile when it looks like a handle (skip app routes). + if (/^@?[A-Za-z0-9_]{1,30}$/.test(handle)) { + return this.renderProfile(handle, baseUrl); + } + } + + return { + html: this.renderDocument({ + title: 'PULSE — Microblogging, in real time', + description: + 'PULSE is a real-time microblogging platform. Follow people, share posts, and join the conversation as it happens.', + canonical: baseUrl + path, + image: `${baseUrl}${DEFAULT_OG_IMAGE}`, + type: 'website', + card: 'summary_large_image', + bodyHtml: `

${SITE_NAME}

Microblogging, in real time.

`, + }), + status: 200, + }; + } + + // ── sitemap.xml ───────────────────────────────────────────────────────────── + + async buildSitemap(baseUrl: string): Promise { + const [users, posts] = await Promise.all([ + this.userRepo.find({ + where: { isPrivate: false }, + order: { createdAt: 'DESC' }, + take: SITEMAP_MAX_URLS, + select: { handle: true, updatedAt: true }, + }), + this.postRepo + .createQueryBuilder('p') + .innerJoin('p.author', 'a') + .select('p.id', 'id') + .addSelect('p.created_at', 'createdAt') + .addSelect('a.handle', 'handle') + .where('p.deleted_at IS NULL') + .andWhere('a.deleted_at IS NULL') + .andWhere('a.is_private = false') + .andWhere('p.reply_to_id IS NULL') + .andWhere('p.repost_of_id IS NULL') + .orderBy('p.created_at', 'DESC') + .limit(SITEMAP_MAX_URLS) + .getRawMany<{ id: string; createdAt: Date; handle: string }>(), + ]); + + const urls: string[] = [`${baseUrl}/`]; + const lastmods: (string | null)[] = [null]; + + for (const u of users) { + urls.push(`${baseUrl}/@${u.handle}`); + lastmods.push(u.updatedAt ? new Date(u.updatedAt).toISOString() : null); + } + for (const p of posts) { + urls.push(`${baseUrl}/@${p.handle}/status/${p.id}`); + lastmods.push(p.createdAt ? new Date(p.createdAt).toISOString() : null); + } + + const entries = urls + .map((loc, i) => { + const lm = lastmods[i]; + return ` \n ${this.escapeXml(loc)}${lm ? `\n ${lm}` : ''}\n `; + }) + .join('\n'); + + return `\n\n${entries}\n\n`; + } + + // ── robots.txt ──────────────────────────────────────────────────────────────── + + buildRobots(baseUrl: string): string { + return [ + '# robots.txt for PULSE', + 'User-agent: *', + 'Allow: /', + 'Disallow: /api/', + 'Disallow: /compose', + 'Disallow: /messages', + 'Disallow: /notifications', + 'Disallow: /bookmarks', + 'Disallow: /settings', + 'Disallow: /search', + 'Disallow: /verify-email', + '', + `Sitemap: ${baseUrl}/sitemap.xml`, + '', + ].join('\n'); + } +} diff --git a/backend/tests/unit/seo/seo.service.spec.ts b/backend/tests/unit/seo/seo.service.spec.ts new file mode 100644 index 0000000..dc08e51 --- /dev/null +++ b/backend/tests/unit/seo/seo.service.spec.ts @@ -0,0 +1,225 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { SeoService } from '../../../src/modules/seo/seo.service'; +import type { PostsService } from '../../../src/modules/posts/posts.service'; +import type { UsersService } from '../../../src/modules/users/users.service'; +import type { PostDto } from '../../../src/modules/posts/dto/post.dto'; +import type { ProfileDto } from '../../../src/modules/users/dto/profile.dto'; + +const BASE = 'https://pulse.example'; + +function makePost(overrides: Partial = {}): PostDto { + return { + id: '123', + author: { + id: 'u1', + handle: 'ada', + displayName: 'Ada Lovelace', + avatarUrl: '/media/ada.jpg', + isVerified: true, + isPrivate: false, + }, + text: 'Hello world from the analytical engine', + createdAt: '2026-01-01T00:00:00.000Z', + entities: { mentions: [], hashtags: [], urls: [] } as unknown as PostDto['entities'], + media: [], + counts: { replies: 2, reposts: 3, likes: 10, bookmarks: 1 }, + viewer: { liked: false, reposted: false, bookmarked: false }, + replyToId: null, + replyPolicy: 'everyone', + quoteOf: null, + repostOf: null, + repostedBy: null, + deleted: false, + ...overrides, + }; +} + +function makeProfile(overrides: Partial = {}): ProfileDto { + return { + id: 'u1', + handle: 'ada', + displayName: 'Ada Lovelace', + bio: 'First programmer', + location: 'London', + website: null, + avatarUrl: '/media/ada.jpg', + bannerUrl: null, + isVerified: true, + isPrivate: false, + counts: { followers: 100, following: 50, posts: 42 }, + viewer: null, + createdAt: '2026-01-01T00:00:00.000Z', + ...overrides, + } as ProfileDto; +} + +describe('SeoService', () => { + let postsService: { findOne: ReturnType }; + let usersService: { getProfile: ReturnType }; + let postRepo: { createQueryBuilder: ReturnType }; + let userRepo: { find: ReturnType }; + let service: SeoService; + + beforeEach(() => { + postsService = { findOne: vi.fn() }; + usersService = { getProfile: vi.fn() }; + postRepo = { createQueryBuilder: vi.fn() }; + userRepo = { find: vi.fn() }; + service = new SeoService( + postsService as unknown as PostsService, + usersService as unknown as UsersService, + postRepo as never, + userRepo as never, + ); + }); + + describe('renderPost', () => { + it('renders OG, Twitter Card, canonical, and JSON-LD for a public post', async () => { + postsService.findOne.mockResolvedValue(makePost()); + const { html, status } = await service.renderPost('123', BASE); + + expect(status).toBe(200); + expect(html).toContain(''); + expect(html).toContain('og:title'); + expect(html).toContain('Hello world from the analytical engine'); + expect(html).toContain(``); + expect(html).toContain('"@type":"SocialMediaPosting"'); + expect(html).toContain('"interactionType":"https://schema.org/LikeAction"'); + expect(html).toContain('content="index, follow"'); + }); + + it('uses summary_large_image and media URL when the post has ready media', async () => { + postsService.findOne.mockResolvedValue( + makePost({ + media: [ + { + id: 'm1', + type: 'image', + status: 'ready', + variants: { large: '/media/large.jpg' }, + altText: null, + width: 1200, + height: 630, + }, + ], + }), + ); + const { html } = await service.renderPost('123', BASE); + expect(html).toContain('content="summary_large_image"'); + expect(html).toContain(`${BASE}/media/large.jpg`); + }); + + it('returns 404 + noindex for a deleted post', async () => { + postsService.findOne.mockResolvedValue(makePost({ deleted: true })); + const { html, status } = await service.renderPost('123', BASE); + expect(status).toBe(404); + expect(html).toContain('noindex'); + }); + + it('returns 404 when the post is not found', async () => { + postsService.findOne.mockRejectedValue(new Error('not found')); + const { status } = await service.renderPost('999', BASE); + expect(status).toBe(404); + }); + + it('escapes HTML in post text to prevent injection', async () => { + postsService.findOne.mockResolvedValue(makePost({ text: '' })); + const { html } = await service.renderPost('123', BASE); + expect(html).not.toContain(''); + expect(html).toContain('<script>'); + }); + }); + + describe('renderProfile', () => { + it('renders profile meta + ProfilePage JSON-LD', async () => { + usersService.getProfile.mockResolvedValue({ user: makeProfile() }); + const { html, status } = await service.renderProfile('@ada', BASE); + expect(status).toBe(200); + expect(html).toContain('Ada Lovelace (@ada)'); + expect(html).toContain('First programmer'); + expect(html).toContain('"@type":"ProfilePage"'); + expect(html).toContain(``); + }); + + it('sets noindex for a private profile', async () => { + usersService.getProfile.mockResolvedValue({ user: makeProfile({ isPrivate: true }) }); + const { html } = await service.renderProfile('ada', BASE); + expect(html).toContain('noindex'); + }); + + it('returns 404 when the profile does not exist', async () => { + usersService.getProfile.mockRejectedValue(new Error('not found')); + const { status } = await service.renderProfile('ghost', BASE); + expect(status).toBe(404); + }); + }); + + describe('renderPath', () => { + it('dispatches /@handle/status/:id to the post renderer', async () => { + postsService.findOne.mockResolvedValue(makePost()); + await service.renderPath('/@ada/status/123', BASE); + expect(postsService.findOne).toHaveBeenCalledWith('123', null); + }); + + it('dispatches /@handle to the profile renderer', async () => { + usersService.getProfile.mockResolvedValue({ user: makeProfile() }); + await service.renderPath('/@ada', BASE); + expect(usersService.getProfile).toHaveBeenCalledWith('ada', null); + }); + + it('dispatches a profile tab (/@handle/replies) to the profile renderer', async () => { + usersService.getProfile.mockResolvedValue({ user: makeProfile() }); + await service.renderPath('/@ada/replies', BASE); + expect(usersService.getProfile).toHaveBeenCalledWith('ada', null); + }); + + it('falls back to a generic site document for the root path', async () => { + const { html, status } = await service.renderPath('/', BASE); + expect(status).toBe(200); + expect(html).toContain('PULSE — Microblogging'); + expect(postsService.findOne).not.toHaveBeenCalled(); + expect(usersService.getProfile).not.toHaveBeenCalled(); + }); + }); + + describe('buildSitemap', () => { + it('emits a valid urlset with profile and post URLs', async () => { + userRepo.find.mockResolvedValue([ + { handle: 'ada', updatedAt: new Date('2026-01-02T00:00:00Z') }, + ]); + const qb = { + innerJoin: vi.fn().mockReturnThis(), + select: vi.fn().mockReturnThis(), + addSelect: vi.fn().mockReturnThis(), + where: vi.fn().mockReturnThis(), + andWhere: vi.fn().mockReturnThis(), + orderBy: vi.fn().mockReturnThis(), + limit: vi.fn().mockReturnThis(), + getRawMany: vi + .fn() + .mockResolvedValue([ + { id: '123', createdAt: new Date('2026-01-01T00:00:00Z'), handle: 'ada' }, + ]), + }; + postRepo.createQueryBuilder.mockReturnValue(qb); + + const xml = await service.buildSitemap(BASE); + expect(xml).toContain(''); + expect(xml).toContain('${BASE}/@ada`); + expect(xml).toContain(`${BASE}/@ada/status/123`); + expect(xml).toContain(''); + }); + }); + + describe('buildRobots', () => { + it('allows crawling, disallows private routes, and points to the sitemap', () => { + const robots = service.buildRobots(BASE); + expect(robots).toContain('User-agent: *'); + expect(robots).toContain('Allow: /'); + expect(robots).toContain('Disallow: /messages'); + expect(robots).toContain('Disallow: /settings'); + expect(robots).toContain(`Sitemap: ${BASE}/sitemap.xml`); + }); + }); +}); diff --git a/docs/adr/0010-seo-crawlability-and-dynamic-rendering.md b/docs/adr/0010-seo-crawlability-and-dynamic-rendering.md new file mode 100644 index 0000000..ffbdf36 --- /dev/null +++ b/docs/adr/0010-seo-crawlability-and-dynamic-rendering.md @@ -0,0 +1,54 @@ +# ADR-0010: SEO Crawlability — Public Read Mode + Bot Dynamic Rendering, React 19 Native Metadata + +- **Date**: 2026-06-11 +- **Status**: Accepted +- **Deciders**: SEO initiative, lead architect, human gate + +## Context and Problem Statement + +PULSE shipped as a pure client-side React SPA in which **every content route sat behind `AuthGuard`** and redirected unauthenticated visitors to `/login`. Combined with CSR, this meant search engines and social scrapers saw `frontend` over an empty `
` and then a login redirect. For a microblogging platform whose primary distribution channel is *shared links*, this is the worst possible posture: zero organic indexing and zero rich link previews (Twitter/Slack/iMessage/Facebook). An SEO audit found no document metadata, no `robots.txt`/`sitemap.xml`, no structured data, and no benchmark tooling. + +Two problems had to be solved together: (1) making content **crawlable** at all, and (2) producing **correct metadata for non-JS scrapers**, which never execute the SPA's JavaScript and therefore cannot benefit from any client-rendered `` tags. + +## Decision Drivers + +- Social scrapers (Twitterbot, facebookexternalhit, Slackbot, LinkedInBot, Discordbot, WhatsApp) **do not run JavaScript**. Client-injected OG tags are invisible to them — link previews require server-rendered HTML. +- Googlebot renders JS but with delay and budget; server-rendered metadata is strictly better for it too. +- The product is a Twitter/X-style platform where public posts/profiles are the natural model (confirmed with the product owner). Private accounts must remain protected. +- The existing backend already exposed public reads: `GET /posts/:id`, `GET /users/:handle`, etc. all use `OptionalAuthGuard` (returns public data with no token, personalizes when authed). The crawlability blocker was purely the **frontend** `AuthGuard` redirect. +- Introducing full SSR/SSG to a mature CSR app is a large, risky re-architecture; the team wanted the SEO win without rewriting the rendering model. +- React 19 is already in use and natively hoists ``/`<meta>`/`<link>` to `<head>` — per-route metadata needs no new dependency. + +## Considered Options + +| Option | Pros | Cons | Verdict | +|--------|------|------|---------| +| **Dynamic rendering**: nginx routes known bot user-agents to a backend that returns server-rendered OG/JSON-LD HTML; humans keep the SPA | No SPA re-architecture; leverages existing `PostsService`/`UsersService`; correct previews for non-JS scrapers; isolated, low blast radius | Two render paths to maintain; UA list needs occasional updates; bot/human divergence must stay honest (same canonical content) | **Selected** | +| Full SSR (e.g. migrate to a React framework with server rendering) | Single render path; best-in-class SEO | Large rewrite of a working CSR app; high risk; weeks of work; out of scope | Rejected | +| Build-time prerendering (SSG) | Simple static output | Content is dynamic and per-user; cannot prerender arbitrary posts/profiles | Rejected | +| Client-only meta via React 19 (no server layer) | Zero infra | Invisible to non-JS social scrapers — fails the single highest-value SEO feature (link previews) | Rejected as sole solution (kept as a complement) | + +## Decision Outcome + +**Chosen**: A two-layer approach. + +1. **Public read mode (frontend).** Profile and post routes (`/:handle`, its tabs, `/:handle/status/:postId`, the photo route) are moved out from under the hard auth redirect into an **`AdaptiveShell`** layout element that renders `AppShell` for authenticated users, a lightweight crawlable `PublicShell` (sign-in CTAs, no realtime socket) for guests on routes marked `handle.public`, and redirects guests to `/login` on every other (private) route. Keeping all routes under one layout element avoids remounting the shell when an authed user opens a modal. Privacy is preserved: `ProfilePage` already renders a "protected" lock for private accounts to non-followers, and DMs/notifications/bookmarks/settings stay auth-gated. No backend authorization change was required — the read endpoints were already `OptionalAuthGuard`. + +2. **Dynamic rendering (backend + nginx).** A new `SeoModule` exposes `GET /api/v1/seo/prerender` (reads the original path from nginx's `X-Original-URI`), `GET /api/v1/seo/sitemap.xml` (DB-backed), and `GET /api/v1/seo/robots.txt` (host-aware absolute Sitemap URL). nginx detects crawler/social user-agents via a `map $http_user_agent $is_bot` and, in the SPA-fallback `@app` location, rewrites bot requests to an internal `/__prerender` location proxied to the backend; humans get `index.html`. The prerender document carries full Open Graph + Twitter Card (`summary_large_image`) + JSON-LD (`SocialMediaPosting` for posts, `ProfilePage`+`Person` for profiles) with absolute image URLs and HTML-escaped content. + +3. **Client metadata (complement).** A `<Seo>` component uses React 19 native metadata hoisting to set per-route `<title>`/description/canonical/OG/Twitter for the human + Googlebot-JS path. Helpers live in `lib/seo.ts` so the component file stays fast-refresh clean. + +**Positive Consequences**: +- Shared post/profile links render rich previews everywhere, including non-JS scrapers. +- Public content is indexable and present in a real, DB-backed `sitemap.xml`. +- No rewrite of the CSR rendering model; the change is additive and isolated. +- Private content remains protected; only explicitly public routes are crawlable. + +**Negative Consequences / Risks**: +- Two render paths (SPA + prerender) must stay content-consistent; mitigated by both deriving from the same services and canonical URLs. +- The bot user-agent list is a maintenance item; unknown bots fall back to the SPA shell (degraded but not broken). +- `prerender` adds backend load for crawler traffic; bounded and cacheable at the edge if needed. + +## Follow-ups +- Benchmark enforcement is covered by [ADR-0011](0011-seo-benchmark-gates.md). +- Consider edge-caching `/__prerender` and `/sitemap.xml` responses if crawler volume grows. diff --git a/docs/adr/0011-seo-benchmark-gates.md b/docs/adr/0011-seo-benchmark-gates.md new file mode 100644 index 0000000..f0f4ab8 --- /dev/null +++ b/docs/adr/0011-seo-benchmark-gates.md @@ -0,0 +1,54 @@ +# ADR-0011: SEO Benchmark Gates — Lighthouse CI + Bundle-Size Budget + +- **Date**: 2026-06-11 +- **Status**: Accepted +- **Deciders**: SEO initiative, lead architect, human gate + +## Context and Problem Statement + +"Improve all benchmarks" presupposes benchmarks exist. PULSE had **none**: no Lighthouse CI, no web-vitals collection, no bundle-size budget, no SEO scoring of any kind. Without a measured, enforced baseline, the SEO/quality work done in [ADR-0010](0010-seo-crawlability-and-dynamic-rendering.md) (plus performance, header, and accessibility fixes) would silently regress on the next feature PR. The product owner asked that the benchmarks **gate the build** (fail on regression), not merely report. + +## Decision Drivers + +- The four Lighthouse categories — Performance, Accessibility, Best Practices, SEO — are the industry-standard web-quality benchmark and run on the rendered page. +- The gate must be **reproducible in CI**. Lighthouse needs a real, crawlable URL; PULSE content is dynamic, so the run requires deterministic seeded content. +- Performance scores in CI containers are **noisy** (shared-CPU throttling varies run to run); gating hard on a flaky metric produces false failures and erodes trust in the gate. +- SEO is the category most under our direct control (meta, robots, sitemap, semantic HTML) and our headline deliverable — it should be the hardest gate. +- A separate, cheap **bundle-size budget** catches JS-weight regressions without needing the full stack. + +## Considered Options + +| Option | Pros | Cons | Verdict | +|--------|------|------|---------| +| Lighthouse CI (`@lhci/cli`) against the dockerized stack with seeded content + `size-limit` budget, gating in CI | Standard tooling; runs the real prod-like stack; per-category thresholds; artifacts on every run | Adds a full stack boot to CI (~minutes); needs a seed step | **Selected** | +| Report-only (collect scores as artifacts, never block) | Simplest; no flakiness | No enforcement — regressions merge silently; fails the product owner's explicit "gate the build" requirement | Rejected | +| Gate every category hard at 100/100/95/80 | Maximal strictness | Perf flakiness in CI containers → frequent false failures; brittle gate gets disabled in practice | Rejected (see threshold split below) | + +## Decision Outcome + +**Chosen**: Lighthouse CI via a JS config (`lighthouserc.cjs`) plus a `size-limit` budget, both enforced as CI jobs. + +**Reproducibility**: A `lighthouse` CI job boots the same dockerized stack as the e2e job (`docker-compose.e2e.yml`, `FRONTEND_PORT=18080`), runs migrations, then `scripts/seed-lighthouse.mjs` registers a demo user and one public post via the API and writes the crawlable URLs to `.lighthouse-urls.json`. `lighthouserc.cjs` reads that file (falling back to `/login`) and audits `/login`, the public profile, and the public post. The **desktop preset** is used to reduce performance-metric variance. + +**Threshold split** (the core of this decision): + +| Category | Level | minScore | Rationale | +|----------|-------|----------|-----------| +| SEO | `error` (gate) | 1.00 | Fully under our control; the headline deliverable | +| Accessibility | `error` (gate) | 0.90 | Strong gate, with margin for single-audit variance | +| Best Practices | `error` (gate) | 0.90 | Strong gate, with margin | +| Performance | `warn` | 0.80 | Container CPU variance makes a hard gate flaky; reported, not blocking | + +Gating the deterministic categories (SEO/A11y/Best Practices) honours "gate the build" while warning on the genuinely noisy metric (Performance) keeps the gate trustworthy rather than flaky. Expected real scores are higher than the gate floors (≈100 SEO, ≈100 BP, ≈95 A11y, ≈85 Perf desktop); the floors carry operational margin and can be tightened once CI baselines are observed. Results upload as artifacts (`.lighthouseci/`) on every run. + +**Bundle-size budget**: `size-limit` (`@size-limit/file`) enforces brotli budgets on the always-loaded chunks — app entry ≤ 25 kB and `react-vendor` ≤ 95 kB — in a standalone `bundle-size` CI job (no stack boot). Vendor chunking (see Vite `manualChunks`) keeps framework code in long-cacheable chunks separate from app code. + +**Positive Consequences**: +- SEO/quality posture cannot silently regress; PRs that drop a gated category fail CI. +- Performance is tracked without inflicting flaky failures. +- Bundle weight is bounded cheaply and independently of the Lighthouse job. + +**Negative Consequences / Risks**: +- The `lighthouse` job adds a full stack boot to CI; mitigated by running it in parallel with `build` (both `needs: e2e`). +- `@lhci/cli` is a dev-only dependency with transitive advisories (old `inquirer`/`tmp`); production deps remain clean (`npm audit --omit=dev`) and `tmp` is pinned via a root `overrides` to clear the high-severity advisory. +- Seeded content is created fresh per run (unique handle), so scores are reproducible without depending on prior DB state. diff --git a/docs/adr/README.md b/docs/adr/README.md index dd5396b..71afb4d 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -13,3 +13,5 @@ One file per significant decision (MADR format). Produced by the `adr` agent dur | [ADR-0007](0007-nestjs-dev-compiler.md) | NestJS Dev-Container Compiler — nest start --watch Instead of tsx watch | Accepted | Smoke-test retrospective, lead architect | 2026-06-08 | | [ADR-0008](0008-redis-eviction-policy.md) | Redis Eviction Policy — noeviction Instead of allkeys-lru | Accepted | Smoke-test retrospective, lead architect | 2026-06-08 | | [ADR-0009](0009-session-revocation-denylist.md) | Session Revocation on Logout — Redis Denylist Checked in AuthGuard | Accepted | Smoke-test retrospective, lead architect | 2026-06-08 | +| [ADR-0010](0010-seo-crawlability-and-dynamic-rendering.md) | SEO Crawlability — Public Read Mode + Bot Dynamic Rendering, React 19 Native Metadata | Accepted | SEO initiative, lead architect, human gate | 2026-06-11 | +| [ADR-0011](0011-seo-benchmark-gates.md) | SEO Benchmark Gates — Lighthouse CI + Bundle-Size Budget | Accepted | SEO initiative, lead architect, human gate | 2026-06-11 | diff --git a/frontend/index.html b/frontend/index.html index 0fca6f0..b4f4c19 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,9 +2,44 @@ <html lang="en"> <head> <meta charset="UTF-8" /> - <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>frontend + + + PULSE — Microblogging, in real time + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/frontend/nginx.conf b/frontend/nginx.conf index 05345ea..81b6ef0 100644 --- a/frontend/nginx.conf +++ b/frontend/nginx.conf @@ -1,3 +1,11 @@ +# Crawler / social-scraper detection. conf.d/*.conf is included in the http +# context, so this map is valid here. Bots get server-rendered OG/JSON-LD +# (dynamic rendering); humans get the SPA. +map $http_user_agent $is_bot { + default 0; + "~*(googlebot|bingbot|yandex|duckduckbot|baiduspider|twitterbot|facebookexternalhit|facebot|linkedinbot|slackbot|telegrambot|discordbot|whatsapp|embedly|quora link preview|pinterest|redditbot|applebot|skypeuripreview|vkshare|outbrain|nuzzel|bitlybot|google page speed|developers\.google\.com/\+/web/snippet)" 1; +} + server { listen 8080; server_name _; @@ -20,15 +28,24 @@ server { application/atom+xml image/svg+xml; - # Cache hashed assets aggressively (Vite includes hash in filenames) - location /assets/ { + # Cache hashed assets aggressively (Vite includes hash in filenames). + # `^~` stops the regex static-asset location below from overriding this. + location ^~ /assets/ { expires 1y; add_header Cache-Control "public, immutable"; try_files $uri =404; } - # Cache public static files (favicon, manifest, etc.) for a shorter period - location /public/ { + # PWA manifest — explicit content-type (not always in mime.types). + location = /site.webmanifest { + default_type application/manifest+json; + expires 7d; + add_header Cache-Control "public"; + } + + # Root-level static assets (favicon, icons, OG image, fonts) emitted by Vite + # from public/ at the web root. Cache for a week. + location ~* \.(?:png|svg|ico|jpe?g|gif|webp|avif|woff2?)$ { expires 7d; add_header Cache-Control "public"; try_files $uri =404; @@ -41,6 +58,21 @@ server { add_header Content-Type text/plain; } + # SEO discovery files — served dynamically by the backend so the sitemap is + # DB-backed and both files carry a host-aware absolute Sitemap URL. + location = /sitemap.xml { + proxy_pass http://backend:3000/api/v1/seo/sitemap.xml; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + } + location = /robots.txt { + proxy_pass http://backend:3000/api/v1/seo/robots.txt; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + } + # API proxy -> backend (same-origin keeps SameSite cookies + avoids CORS) location /api/ { proxy_pass http://backend:3000; @@ -64,18 +96,51 @@ server { proxy_read_timeout 86400; } - # SPA fallback — all other paths serve index.html - # This allows React Router's history API to handle client-side navigation + # Internal: server-rendered crawler document (Open Graph / Twitter / JSON-LD). + # Reached only via the @app rewrite for bot user-agents. + location /__prerender { + internal; + proxy_pass http://backend:3000/api/v1/seo/prerender; + proxy_set_header Host $host; + proxy_set_header X-Original-URI $request_uri; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + } + + # SPA fallback. Real files are served directly; unknown paths fall through to + # @app, which serves index.html to humans and the prerender to crawlers. location / { - try_files $uri $uri/ /index.html; + try_files $uri $uri/ @app; + } + + location @app { + # Crawlers/social scrapers get server-rendered metadata instead of the + # empty SPA shell. rewrite-in-if is one of nginx's safe `if` uses. + if ($is_bot) { + rewrite ^ /__prerender last; + } # Prevent caching the entry point so browsers always get the latest version add_header Cache-Control "no-cache, no-store, must-revalidate"; add_header Pragma no-cache; add_header Expires 0; + # Security headers — repeated here because nginx suppresses inherited + # add_header directives when a location defines its own. This is the + # document Lighthouse audits, so CSP + HSTS live here. + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options DENY always; + add_header Referrer-Policy strict-origin-when-cross-origin always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), browsing-topics=()" always; + add_header Cross-Origin-Opener-Policy same-origin always; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header Content-Security-Policy "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; img-src 'self' data: blob: https: http:; media-src 'self' blob: https: http:; font-src 'self' https://fonts.gstatic.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self'; connect-src 'self' ws: wss:; form-action 'self'" always; + try_files /index.html =404; } - # Security headers - add_header X-Content-Type-Options nosniff; - add_header X-Frame-Options DENY; - add_header Referrer-Policy strict-origin-when-cross-origin; + # Security headers for proxied + non-@app responses (API, socket, sitemap, + # robots, prerender). The @app HTML document repeats these and adds CSP/HSTS. + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options DENY always; + add_header Referrer-Policy strict-origin-when-cross-origin always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), browsing-topics=()" always; + add_header Cross-Origin-Opener-Policy same-origin always; } diff --git a/frontend/package.json b/frontend/package.json index cf3d1a1..a78f639 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,8 +11,21 @@ "lint": "eslint . --max-warnings 0", "test": "vitest run", "test:watch": "vitest", - "test:coverage": "vitest run --coverage" + "test:coverage": "vitest run --coverage", + "size": "size-limit" }, + "size-limit": [ + { + "name": "App entry (always loaded)", + "path": "dist/assets/index-*.js", + "limit": "25 kB" + }, + { + "name": "React framework vendor", + "path": "dist/assets/react-vendor-*.js", + "limit": "95 kB" + } + ], "dependencies": { "@hookform/resolvers": "^5.4.0", "@tanstack/react-query": "^5.101.0", @@ -27,6 +40,7 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@size-limit/file": "^12.1.0", "@tailwindcss/vite": "^4.3.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -44,6 +58,7 @@ "globals": "^17.6.0", "jsdom": "^29.1.1", "prettier": "^3.8.3", + "size-limit": "^12.1.0", "tailwindcss": "^4.3.0", "typescript": "~6.0.2", "typescript-eslint": "^8.60.1", diff --git a/frontend/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b2151f0cbf79fb0b4ec7cecbfdbe84769bdd25 GIT binary patch literal 19558 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 VeYYX?j*$QW002ovPDHLkV1lc3qxJv* literal 0 HcmV?d00001 diff --git a/frontend/public/icon-192.png b/frontend/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..7195797258ef28f9d25870a02300f4b476271fad GIT binary patch literal 21915 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%0A&;zW(=E8|~ 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icon-512.png b/frontend/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..073ad3594727ce695ed93a98d140fadcdd24abe1 GIT binary patch literal 109753 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 literal 0 HcmV?d00001 diff --git a/frontend/public/og-default.png b/frontend/public/og-default.png new file mode 100644 index 0000000000000000000000000000000000000000..20d25773754969518b648ba51f522b3221cb9360 GIT binary patch literal 67939 zcmeFZi9ghD_XmuKOrixvMfELZZ6UHRA<52I#*$pIst?{m)koNJzGYpSv^b1~D<(6Ff8 zxvfh>L!VDWL+8bG5PYH~?{5nJqqkMiP@thHh=y!iGJyBIR(EtYXlVQ{(a?lEp`qCX zAB9ZP(0E>@p&{L;p^Zwg-( zzItAknU|MW+U=o@r0#8%{oBDine%oY9xjq1BHrHK!rnK8o!x9juHCwIOXTWxk?Yrm zz!gI7zD^#NK0;3J7pQ~$8RxdOyOkT<#RKl_#7iF6@`1Cbhs^o&&9k=x z(wDNXX7@dwqT z)l6?PQRnBrJ*$ggtz)63XOpM-?|)L6M>mViL?QqEIptcd5SqwmAvAPMy#Mvjumdff zpam;yl+yoeKzcUbng>Vz`v&s;>n0&IO+8DGU(hVu5GB~iuy&n{8b{U61nnAShGM1`_{ z;Nc&5_;+9P4?O$>5C0bA`~wgFz{5ZA@NWh|4YB`;9{!0Q{ylsA|4l9ydH*jxm8g>E zWz)WV5^4+&i-=&J9XhA1xGHu+pZ8_eRVz4@IS9FI+bj3KM z)oyV>$L=sPGIHFRHTH&XScD|q1_#g z=^PvrV#Qap>&AR%XZ{)-I60^ACnYX4;%(Sf?b6y4x8%6c=J{tvHHS*@2C-v!dnYFY zbtM$P08$7|=pfZcVA2WgahP`|X0V=_AJ3uPaYfDoC`~s=m|_HboxZMVdf}p5?AN>O zM^uFRnSIjY%DcagepIQqu!qAH)L@nWmf+Xy$|=zaX3_48{^6$@9Xos{9<>^$d4@pB z5rd$QeJ`=G$rinNEh{Q2>c+*0x(D{yHgqoTGo&aY@@{3U*@clWTt0(&nPXu$0t1C# z{K2+$Gmyj2U%0)spTiH|qjz&eS$x72mbH7UhlO23Ae=8d1&5m-f&2N9zM@c?s8_ze zzPLq{u35?e@^X$&o4w=g>_xGw%laa!;l{C^CT*sS`)PW|-4Gf9%+tvF^HlVxX<#lH zMphJ=_T&Yn6A~qf93^Q}eTIIr(mvw?7)`=ztz8;{ASr0)pkr+uesH^6BUq|NVzj2uTGD!?q|_5ySqoTJ8<63?nmhl$%gZiOHvWBI8>FIZZ2{4MVN5 zSX@qdhG7&|$nVxoG-Gt|!sake+U;Ld$8{hBflk%8yXW>nt{?tL#w^}*r%?mph_FMr zE4PNf^A$+wc-FukTD>%7$S)*pX!$`~MCIx7!{Ib<{s)pPk8%5Jq@m+u=dF>2c{%Nkm_ph&bV_KnQr&0s&orm z&sX0EUB4+9^mKodPMwnvi9Pz|4&R?W@(fMIL7k{ErfSh^3*0 zny_$2Deo`Y`%s1Xg#C@G9Bh=ejNhWR02D35?PTp$_^WxkSl`qr%kHncfoR8*9-Dtt z#*pVY#CG4h{eGtb)u^uP@QS?5-rPJmP_rO>eY}7IO$ihD}a!=$a1yUV@!x{}&JcbK6;yJYZO3{7+>h6(cgmU&noXBsF(CyET zuE_b1G6XS(Ga6ef*iz>r&npA4u*1FIPK-LP@r9RGVHoB|4EAVe{h=|KWd1OJX?zgCr<20c6{b;rIyQz%FH$tj>(_qFV5A-iNi_G#WMrKWUdDb}p<`fR81KtYjPMidx@m9Yq!P_| z*3KyiT3-I$(K>Bt-)4v10mqoi%GONXEnaR0x>8zp4vr~%=Tu24VYs!g+B6Ksb(*Vf zyVmsP>tw%Fv$QqtKyd>dD8@+VnMy;r*wrp);`JUxEH{x^>r67_U(*BH6L^A0OJ!gE zI#0OpK~&D`V2izc#gbOn){3x|Y4I5%qO#Y55=H8;K^*IT7x?{XrQN?GXTtN^LXg`b`NiHV8%oy^{c3Wa?feSE3LT&Mxym8g=uOWiJ)P`Ztc z4WuBd12dhPlbfY^ymJHqcIT&1Th3m7^UWT5KM}LSO`}8a`DL`2*b-LyB_X+5jQGyV0oH0?gpYLboq zn9$kCePK2n`=;}PY@CjE-4n%C%MsXUttfks03#9Ar_r7)XGfhwySs0CVm(o%1qR$n zNo45O(9qK5X&U;XGEG&^J20^BqBD|QR0kd+$6%U*T71pCvNE8n9{4G1JWKS3xFst0 zV1>(&I(vc5KTHDA1Eb-luP6Q$;yVMkMPnOg}O4; z;|&a;8QoboSBP=76C#_H2EM>flUOJG_tjK>xDpIIKlW2|{{tU0GVuR&F_IaG_ry*l zLVKX>T8^aM5gu$=*&;9~ak_UQNg@_Ot1#sY%KXn_KkjWDm*F|vwu(atNI!&~>!jb; zt`~ejyQKNfQUO4|8$$os5{oM`cJVax-zp~zsN4B?-1#CB{%P=Fhy~~5%%pxczJYl> zjQtbd-y(QPwYj+*7%B)frURtuC}W1AIeBXuH?Pp_@7z4+H^^vCFSI3KcgoNn;fVjb zTyn{_er59amo>Rp{zrWxYgQb@^(_WIa5xKVO#X~1HxES12<*20t1#sg4}h=y;rgw8 z_aw~r4J&ELVR{B%nrQL1r+c+*cX>kYVd>$4JtJCg`!O(_0aQP2yq+UZw!4yX$U&-L z_RPVBf}V+u{hfd53*?y~p0&(GopSWCZ{NS`Ts^6)?p`iiy%7c#hZeD0bbk6AL|hbG z)9D%i4j_!}@WGWNslD{t+P4vq;N0kyUkUgIf(`8FwDvalzBq4()cv)et%O!XPMkRL zu?%URI=Ft1G5iY39h*^Ln89^2V0Eowft6kp_P)Ga^^8yo|2N2$YTl2|^SgC8_7=Fa zb2RUCQ9T==yAack$p!$ibQW6@W71BguyD+S?d9_s-PD%y^IOy`gfOG7(;KP-IV_glB0v@?k zSd!-gAyejO-uBy64b_D4szN9DPZZJ-5M^FtPZ9XL`~_!vD*5CZ;>Gkimj|Jn zWd}v{S;Eu#arn^Ir|;~CH;!Kv{3cl>*T3&WdCNfrQRq-HB}A1)V{4P4rzcjnd?Qmg zoYCAzto$klL=PE{L+0sUkgTwxMGg=A6j@VC5MhyoY}vT^`iO(nXxt?Z?6_@C6P7B) zg;(;t3wkLi0o*SnslP$SlS|8w3jH;5hk%Dqb1|wMF!b0VA%skHX4YG>HW|;t{uW!) zik@I(S~sX+FfMiqNPlgVa~DLS#X@1N;f#)3)3}sG-{Bsc&V6`elVAWt>&cHEqblsW zP7TVP{cuiZrbc{ut`CtRM(U7E@NZMAJoC+h??s0~tqys3c@W?U0~FKTG?J6u)XcED z;I&Y5WToK6#cz-IabFG$yUcyV88QWvoCGv zfB-=7@Hi1I+l|WDG=e}tO0E9sU7P7X2Ca*Mu`G`N+V`a$cX(eqc;-I1D2a3zbB58! zcXN8|eU8RSUQAGtNy}k6tu?%|X%xkx!R2%9J)ahjU7&k2$S7WTAKk|uP}2p#vADz5 zE>C?zkXa4Bl=)0G0Z$<&m7^NX^KM2_nk)41i4xzDID3KVuHH6ePJ)_DK!716va6x7CM`>yvaQCz zv&UXMpdn6Cr|YU@mv%e7%yZ<1C)V4Sr%@aS^;p|wjUakm0WNDHrbZ_ay=at)MB0l= zZz`_w?7pA#_ZBraU4`jIgvOcF}69xwXtZfaKuu@@-2L#3& zc316~sa80D>|1Lqu*0ai{!Pp(s~5Js{133@W-qwYv-v31;2Z3nr*tF3Y8)IKHi-j! z9ktuiz;;}I!Kiz)eOW$atU)JDgR0=$f-mDa^Vu(41i_Io%3VzMR#w=UF~GC~Dq!Wb zbaO>5O_hddS?J?Lu0*j7_dxVUo$u`Yd~glB@BXZqlEZLCL71N z%Lv5mjj&UIgCHf%?;#&v_pL?!b^-I$qnKk*dgE*R*tj?Fg|YVs51zg9?v6Ikw1!|6 zHS?}v1jr$Kl0I>te0Wu(<(XS+4|l>2lb#~j@7de(<*M$mii*p5FJG-XA5wGWP*;!G z$N5IFFy>l*VSc^6w&OC~0qJKTg-2#t#rLge0ZcYdu09k>)h22zFR)ymw`*pdY3(N_ zgUsnulkwYTJ44SVVHG+zch&34J#3 zoz8K}T1FMqz~0mr@_ zwa^KdFo$7U4D^zO*GyMPrigh*2bam5tgP&oQn8BDbW9cM@3XgFd+S%oA( zhoRN+3+91>kI>#Zzk$AyJ#LFi2+g#kX(>NdN1fT37?hwBNZr8rJXB_yhLxU(m@VI7 z-3b!LbeoOVf~mj4Rh`VXIg`42N8i39z{AwlAq2I#_4Gi|{XoVMw5&8f)yaycC={pg zFmqA-*SmQC94)|EC8nfws|0AUo*mGWK3l!8+D-%XsapQ($u10c>Sd@=I&S>Pirjq9 z@URsIk?Y{>ytbn?Zoa?!>vjM;qc4q8=gL$8;}v1kzIpaL zH|=#bk|JJ9NzohgWsJ5{E$Os65UtTY>HT171Ol9fa@aMqazEI>?10}bS#({jv5b$; z-a6;cS4_MwIp{zHS7@TFcn$&c!8;R~;}M=0R|+~FtlRxX0VXbhCzfcyjl-kQ!A;!0!!1{-{_~F3w!(i;~~=a@DVA zB_QaR-6WV&^9)-0zvu*Q_L)tdD=(8`PFvxBd^C^_aj6p)(5N=jcSqU}%s_>4xQ z$w}9u=6Rx~(-gj|ft|^_oOk={%mf;E6K?`9SoIn(@~ZDH;Ro zj1^PTP^FlFrr!JaydQtnJ}@iuFo-YDvkP$37jS@V{%qjUT(U0Vpkw-w6C#CK@Eh`s z(o$K(Vs*MxRAOY*jd-aG2znaj_QT%Kxf^>A^q z`;5npbJ~*Af_qcvcfbYi$0lcI4fM=VCR{|ZYhyTe+3t>xM}Sd0RM-MP>~o4T%JK=` zn!By88Fo zDJbgs5qnGct4*T>$;o9(uiJ12;KF1RUqUD|ewY{nd){|ag!`R5^upS}EK_?MTheRaHbw|6dn^0%??5yDgKb**Loa+ov_d?T8h$Fj56b)U1po>0_fT{M!*RLN0?lcF( z;jS%@+(}l}izS^D2ND_sEGXqiq$(xreE1Q}(m>w`O%#^{rGq3DzHn@bbRGzdZSA6` zfG(|T3~yq&kvT{`m{oXvcKz(jzr#(6HjSjdpQ#p$UEK%bIpF6eG+U^2*t!}e!H$@D zy9Fbyl1w!mE>vZeuT>ddPgvH|gG1<;9){LTuM`lHBv(d3ZaGz*9o5VN!mrQkoywF& zdPCUmR}!E4Q*p_Z*AA5{NhtH!+RQeASr|$eZ*+xj&a)xMDtWz5Me)AfkWtLf-CkW;1+MDsX_g)H@3{F@%B$U?eOj)De-FkZ%5*dOw7CHgi%VL?lZSh zXDd#>IJo}Kc|WlC2{l3+?Jd^LaB zHLI($J)^KgH*lv%4({uz6CN&1_(i4c(+e6U-@S@>c%E&J_`Xp5Sd_u%Vd& z#{4-8Nn|JpGdqh2Aj@coxdd;t1o_0Qs>nPZjyAW*LwLSh)x5Hd$bg@uYEib}OaI26 z5jU#ouS0pco{^Tc_LSK(+5MaZ@~U=z=AE!#o3(4d3Ve|n@7d_-Xp6nz!E?v!a1qOE z)muXbC$9wToZHV4^US($?Vtn);x5crw|UEv7%O{+DQ#8%?0)~#`;if-qU;f@H<>!+ z$XY}jrery=F^D@F_TZ-k>-IK@# zFyor(10n|y1e-9^)6trdsvNNo(i0Qkwe5tb$f(+80PVhL-cIlPKK7&!7qBpknCnx2dA%R zS$R+ymC$042v;(M@lZ7M;S2dL%_+e6cKn!mb1;?FMzdk^5HOv}n&ss;Hk?`ddd3b6 z16IcKv=kZ2+W?!fUS02y0&C};W@r>ZN0w+=|90{b)*}^~V&d3` z(1}SFs$MvgpGjL=Oqp)NMQy0*s$RHT@aD^Svu9 z_ZrXWySm&-sV?Htm!xuh=HSk?MHfDbeqCasM<0Y6*ko=lHOUW)Iu6d^9VVvR9HtDPq_a{N2n|17nkmhT>1T$)d=myI6OT zWH+trpjVzdP=S;`tK8q|DF_!QKd|OEa8NIt>n>14+o8{!(BHndv$t)*b=nuXU6Ef^ zwgd}POcR}DX;z^Lb>wiFH?tVn;KUnzZ)R9^6yy*g#a&2MnB*VnI2{WRfQgrN+DNf z3e{^6dAB43+X9ETmMr!@qzoX=oE@D6@a7%+=1p(J)9o3>G++uK3=Nf+7q;6QFszQz zy~P{`Sq_)msRqtxi7-FseNN_o1I`)3@5S7Zt@h?HqrK_qJ-wVSfedbtW#{Uh%Km5O zU3HSjeu3(lpSVzh?Y06 zUw!_9>aiBi(ypb=I}hy|$BURjt&}1ON#zD+2AR%Pd)=sbY!(t3AR-|Z3Up^| zY;1b98OA*Nq^P<$8{2$Q#=kqSOM#SX-ixVmQ~1{sj6u{NqZ(gDd590){HBYyi_81$ z)_3+k4~@ig2Np>Wc8Z7goD&mL0S(T1cgE4d-=CZ8`G!sD`=Jvccri&d5i)Y_=-;l; z4L!575*^&J>wvmr;rwH6F1MIYfNx?Yb+}A<>zra%co3oV1Rh%2f^%y}{T8J$z zFRH4yFqj%7RLeHc&3$P(No3bRuk$$9DgPW09S|R_x1!Dt`YOzk6E;oWVUiJh!(Dx- z2@*u&4%VLdU10||zk8iGI_J&I#-I+RFLy&2jQH3l(kP;w0+d1Qiwu<{ik4~q_0mfH zI5YF$UaEBQj*U~0CL|JKkANG5vU}#C5W1e$QSS~*cXxL`W!Eqdo@e}iTr7f-41AZ^ zBI_y^NaJ|W7DDJkLh`yfmL2ccJX#xJoVfMi5XW(5idlSO7~HEKzfnHFOgSyUt4`m~ zSU!^b-i^qts-jw9z#1>Ig8U1b1`ABJ_ZQFI-EA--8dyG!7`oXf@-Gh;Vo<4V2 z(8U`IH^`b8`r|0@)5!%N_$W)X6&!wqo=|EP+jcV&cMeGZ)qgC|ZRCbfo-iQ-eGato zfV$fAhLENUFEs(dn^yZdUs6iSz)UCm_VpahtOoJj_DBw<|Hp>!)_u(*0)R(zYJ*Z9 z69c?*O8;|P>Y7SJ1eo?lD(Bgcgn4d_XAk0PTb+X8D+N!*#AFZ(-H9MA{bc%V?!wDT zI?xHhudl8bnV4jP%`f_x8Oso*_1xaiYg6CQp=>QSHZeBq?%#gX&+)K0VyVd4X?n4P^vGi~UUoLiO@?a9vY@qQ zI%D1EItBcP82ayCjyGdJF`BBT7frGPvjx>o_Ax@FS+yVR_h{TZ*}!z42YTGx+_sAZ z(-XAx+ZRB>$v(=6@c)g-^wJxg-)Y<|G~{c=yp}{I`Lix^SQOArqyH|Y1cf15fSwGv z&L(<*Y+=KW^xZQ?e#M)}{HtC!MHZF}1{k{lF$@b`3z4ndDNX-*9z=fX&BB^fbqkQ$ zzr0UGJEy?8OC&(5T^&LcHaaP^c*JKtr^TSw-V8CxNVExv`;6DoQjbt)7i2OPs>;mZ z`OQv#5>4oH5RNo{v&__^D2ggwWD{iYX4PWHVg^sjl;K+FN;yweL79M{TKez=d ze`3E$vBfEWcQUtnFoEYzoPQY~pKYX5(5T+j<)70URBTv*2@tWUYTN#`U5enzMWVHp zeZ$^WpO%OZS~^d87L(~45Hu-&Un--#oj9K#)7uRV_yRjR231XIh+yg|Xl~ZnSt-v0 z8|)h@4NKEW7m;)5t_=5%?R^F`)>I{xQvt{-B2r!7Mj&-F*RQ@KQziUyn)U0zD& zchY6>KmS@(R+^5%ED`G`peC5yTzfZCY{UbdJXuYcdpHt_ioNqSHYO{OF8J<*Zl;1d^DN3YFl} z`Rk+s2!k+<5%&K6M1kwo#SP&t7euPg4~x?pP9Td)?wvuTl=*EWf|@tF#lX~iJ}`SK zValB~_eB7Zm7alhrOiwr!WFLYz4FN_LX6{&*Vh3)?6_*IEX9XyE8e&DHjG+{f}*la ze$NW!9l?v7bXnPWaA{eWXCL!bPC%7BG5yq97II;sOkR-VQ(L)WYOtGXn#)(1P-$7!41%*_^0=}Y5tvgL zW?ZoA(}b3&jEvg)&gSrMiZA~!!^ne_7@RmnRPpigd5?^+k2TcaE*co8o7O6gg*FK^ z;V>@sMCe=RY<8R|4iwetVe?!)wwoza8WH3PK(2)MK|j;Ht$VR>FI zVSRIjs&PR8vd zF(C;T3o+mqL21Y0vBogi3Q5b%!yg#4`wiTpy;jRWN4y#S_KsNe6IZ&MtN}_T4E%-!tc@&ERS|n2NHrvc%L{lw9y0BPK7; zU+bAlgrk(D(H7$tr%C*D;OvC#K8`~Hj$1MKQtTUaSDS{g7qNPU_M4&}$7;KIH%PJM zfB0~(!0r{|D5(e`fol97`{ZK?E*~1G@YtvF3FzcxkC_g#_B$h zaw0Npt+Aa+b@%5OJw?xjZ*-klGe+GtXMo$_iW>TcU;K^B)VyZBJdRSiGS zrNN3+YR1j>jXpHl2)%ywxTGQv#hTdGwL`V9erS?0#PK&fUF} z^PJ8*49B$HygrDVy$MEt9m8j2vld~oQwUE<=5g7skco3Ir|4FzeGOn{4$1_nNWZFf0!dpLX~}^!m7AUOcII>3?JhXzw?NV^*81#qQ3X^ z4W`9qY1S40!kJ0r+A8e~PUX;dHJpM|i)3I$pbbQ}c9~M=tbrAbp44T`vA}=BKA6X7 zAk58@nTfT>i&XW6V|V zO1wk{)5|BKP9Q&JbV?nzv<%WI^}Xe{xSVzqF_v!Ol-pvUVSp80GuN~CwqWee|IFDc zD!tf`>hn(aDqF*x-f~Y~D;Y73ZlH3q!>XXyQSJpZf|43Y7=$Vk<3?UA5Y-$VhU`tx zOpMF2dEwT2?a}6tNILV+Yx8rv&9dvcu$Ne`WcB0?D^qR(0VKY&&x*&76=S1WddWNr zzKt*G?luf8So!_qs1GguAe&2Ft2+9rzA-!j1Ff)!IU>08!+J7~e@RS9lJUB{TyL$l zLo^c1y037DTz-P~2)7QVy9quy+X37O#ynLD{d2weWs3gWcuwu>1sRoHgTGV1QP~N$ zI~M?=i*gB4+qhiZK=OMPs*k)M6xw|gT2VW}R~kVK@+d9WYL3DTG7hb*BhN~gIC~a) z1?a`pgAy_VuBViel4VDHsmsv;3g|;PUWC7ZM*mtr+qZ+j|2L*c`puG9=DlUC!`8XEfLnP`-ou+u+Ee3#l$sX7$A;D6T@tq&0S<_I?d_x|0V)QFr{ zKFhe9N->mO;e`U)?)I>L`)44vyK*ebWHv{!*~oG%^t0{VzmChIqCJg4-7umz+^2ZQ zwFc^r&db}%ic)*Ng^tUT2F-o5Jl|&1p1(GS~^Zk|7 zd23+)p_*#}=A~mH!LJgu^Nit3{cf!)K5pI8%5*aLF*sr>kF$g&$ME$B`TTr*=KvLH zB(gxndo9g}LR!mjGJ`~hVZ#^4f5DZXhvPsgtyv*K64VU~JM;<{#Wn$j(?oKZHJ;58 zv*>yUd?C4tRKI!9;a3{|0Dm#BgQ?Z=3`c=`Lpk@Ff;rZ&oZ!cDxv-N8xm@PDs=7Xh zs?>vm^eGFFX+5v^SlUE{Jw6(?sKj+L2xa#cFtx<->+2t;?p=9)W)v6m0 zH3;Sb?H4QO?4|dQ865Wk9jH#cJ@%T2sc@cPZRvuI&saxI?$wX7&)5T=m##d(@CI5X;^}8Zmk9HR}Kz3NJ&X?oSyeznFU<$=A{bPG+!OdSD^K? zls)Ma&f!0pTc%|F_r1)jd*hM8dcJC>Ok^L*Z3*mNctio>guj6Pt7WKJP_}Q7e;Bvj zcWT8;a%dMeFBiq*w^EQu^vIcxpu-W)pEzXy3$MQ-jzs!+mW`Nrk#S|I!B(JVU;mi`ZM$x9B10s| zX)N@z2h{_08xj4nPr*Tm#WDBUnYm=-_asjDdAVD+N^M@9|I7b)_&$>iiu?jrPhY>F zz+;7aP1sG}P&$Nh=*W&f$&6JhHZ^?aucDS0XU*oOKKY4Ct)9D?$-}dKf29~F_|0Uk zF1#rN5#}kj(%5{c7y3<+rP3#Nqwbc7qZB)n@S_@4P%5}7j^H*2K9E3|>8kpQVXSZO6O2{)51ak#H^$0r1kE$5X;abVt_CVSxa$HosQh1kggtpF+_C8jS)Wu-p3)#c z=8~b*Uq;Wo?Jd66CiqC_UL*=j40n>-yRhcm#h8>aGy9b=1==d>e{SevFO?CXs7b_?b-^Ccusblkjdu<|a$82;2Bq*@n9nJ65TD`M*(t9DX2 z%olva(EIG86R+aWZMu?fr$dg z0`T{F+T3Tq*8V*wS2ls?F&SD=WyveXCZ%TP$^X#&jmGLRNJ*B(=9{?Y9DsW{>1KG< z)a>r|ovCm+cFo((R^mi=lq@J0o95g%56zm$S{{CefUJI=&m|r?U5Iy(!nrM;SKN#- zS~S|vEcD52{+Q2xH!9C%K(f8dMIm!P7M{n~nV2SEg>+f52!^+2-^RmX3JRfq{=&qF zxAsKclX&O@z1D-9>_dYeWaD@aUOqq=4q|=eHL2ij8!g^?6S2}(h~PZ!v-<;jG(`(j zW?|(a@FktxkeQ(;q>&QgTn8AC=|1hf(w@>yEY3}i3Yq`OWCmOrMhH0Ce>#sh)Hi@; zVp22!X=Uda@I&^i$i{=Fcf~s$nnu%eB!e9GXI=u@Hsjf1*Ec&L#ADB%h#=r^su@fr zOil>t!u+#I$Z2dz$@^sa7w@D4KQ?2QZeizpp7i&N2wl+wF`J*r$`x!*gB-^*Y$mAWD#wO*k#{!hrux5b&^;Tg?0i;k8W8~@Wp9eG})L&>2!!kpg6fT+o?c(ln z^7TyYzmn`Qt&THuY11rQZt(i-A_2&VnW;I0K+lv)Tlz{#!|1K~K81tRm!^j9Up^6G z#Dac_M@IVd9o>A`3qMHR>1@#X?1@Y^rF5dzIMWT@lz{!#Sy;OAq+E6*e_J^FEuwF0 zyW3gc8Wz90`g%|;jLf;57XaM#uX#U0>8>WDFG&B6aTLg}U7Y6V;0r9fJLBoTOF`0*ns88x4g8y{mC}%Thda~*l7AXa zT%4psKP^)+Fz5zdH>St+MnEOH2;rXr#2W9M_8#`iz+&jbOS~9pD#Jew3^6x1>uzjx zBm6kZ<+n)}7N(3WRAO$ti+Q2%`8dnQ;tKrS%;*mRaF}7}iK37Y1}U7Ua2O7v zA-cpUio>RK^-SU?DV^Wx#L2DCE%^t>iSvmNa|e_Ip3vb$Tv!ALVKbgRyQa~qxiRkX zxr`u*?-9!>A9)R`2}M;^xoNM?$rPWTZQ^*4iH_5k9H0x8CjRt!U%3-FMBhI(stTjn zScg&w`+qQp{o&>PrUJj5#F9GB)%aDSoEVHHPU~a@_Imx)j>3!;L(sga}9Lw_9iIo$R63#+YJdZv>(bYS!FqYW7>>+(yg`lXsO3W4-># z5Yn377GI#`{<%$FA#zLZgSY#gZ#YN^ufQ=^Y1nTdKh;9p$O+*T!9*d$N`wX_5&U&dGnf?f+860urNa>vCi@FtZ|NP z1RnpyS#uV`@Yp_|rlgq~4LAD;*~?y~NH z%Tje9A?6H-ai0@Oe$KJ@#>I3FLyn@7{L9tJ%f>o7Q(+a&bKYMyo1Vi4O1}50MQJ?u z;q$X;^bbwCraJHHG@Zp0wAN|G(Rr8b3PU|W57*t|qZySHPtJGZn~os#V@3aa44bh= z`L7@I)97MM8xW=4Do#0;h^tJgd~y)Owo-wwU;Kho?Ad*f7(y1aOBST-N|_aOkd{Y% zu;Fot=?oa=i%=lBt+wOWv3ZXlAcl(?N-hrb^s~A9{ev7x9x%A56_&xN@F-{u!V<3b z2}kErUyH(v=7K=O_!n+&oKZ2t+1V%Dpkf|yvgC*^M81sKh1s&~#pzkfVMd9#5QuMW z+Q*cq9NM+GTVdpHaY4+l)}#QCIe4to)x5Ho3i2b?zZ&0fRw`n0rYICunn z73ipT&K@#b7P?WkGE9Ep?}CiVOI){fkDR*okpir8O# zul#_iDO)d)u;(PV8-e10ga&Y_on50Q6meG_ccF!XbN{^J;uj7GGR`TM-hKcB-BKn* z6D;0_7PX-VM->t(J2{sYmx`>3*}{?)?&lhicolH=e{EdtD>PcHOPtX7N_q^IB50`e zEUB9Q(M@3%&nTQ(zRD~j#qC^s*N-RWebBa3Ql+gTs9X|>R5?r8(dtc zIwF5g3?fmH@3w4Zkizd)e}pe+nl*io1+9X<2(=qGIyv!078P@#e>CE{RB21?P4GpR z{qa&gNKW($1PR%y2d$^MA9a+JVqW9?T>GG#7?W3C;f3Sdk@94o73)I6ljyJmd?(}xiZiD#2x-Mui_3!g$=_|*h~X4aJt{rq$mWTHp1~J zw-+AIh)cPd^1U#|}fp6zOePrrq3?o6)$(P8ylYj9C z-jKf_X4Zb@Yi;3c-Pqoo2+(5gXDt>FDk6vYTI>oX*UGr0E?(!*bJt7y^}8hOX;UIr zQddBrsmj&+vjI3LPd@9fK$365b%6L#M?+J~WpVISGs_<&|BoLp096XbwESYfhu-2- zkp_R+c6_%oUH&K=C#8}58Tv4mXrG;&ti*Cy<`Z5Ml9-TktKOhx_gtgSPY$2 z2K6uBN-Sb?7|^`-LAHBpvs}_}3)&vPUl5T3<2CKK4>Ksa@u`#%Ea;6?`2#4w zL-0+M9NKg1Y*NluEI?>E?}t6IoVV?(qMP=7YX&Lg;N)}^YeMR7Z4G)=wsbp{aw+-Z zUVp*MN=kcV&Wp^A19RT9Z-$zeW|hciAPetql=?>8K2P|BzZBHF>Eo)%7i$>x2}I^ z7J`~pUU`?A>ipBGCWvqKQ2yZ8pOk~6q0hK+xpW^$`~->@%7J2!|(=X>Y^hkyjAIdDdXzu3=k zdV1RL+RYE2C!CU|)B8!%PJ4nbC+^R}CL`PBwib?4yz39P_XnXi&o5L`z~3iYUgE^> zIgLx+5)XFIXbMk8KDoegxD;XCj6~&j<|0aGf_LvkLOH*OnFf`VvOf?L!-9$qft|?#z3~@gzGsA+P4@f^ zJ7vRoShTMZ)mX?SW$f~qa4Q2YMeB+PtRr%Hr?D(=M3xUlhG6b_5I=z6PS#my|F;K* zzkt9+_D7U01sXoQl6QI`)LB6MoF*jjYt@{V^C7#k6^T^#VUwg1c7Y)g_O@qc=1s~b z&Q7^1erRiZsRR@=93hsK?CBx`LdA$MF+xP1e^|o=hfQV7QcK2}px~&E4&6K_qfE?0 z{$j<+Igii2OQ(`f{?=eA(7rkumX+!C>!GTDvEiDdul0A$cc*(EF(A;FBnJhh{G#2X z#{=hlY^15}OgrQ-)cJ?qHEL>Q3(nB8^s0r3**iGusi`GkhOZRs4XIS%HJzFgc$k&T zc~QNj2c-s5o_H3VkZ=#Az?9|}Mz|31s?WzAwCxKZD_ruxq5EkVH&orR59Nzt_mwZzTVGsCi#&VlK%! z6LyP7ZvGVRl8d6Z*4k{DftFZOAZjkhy=BY4_15Ut@P^zT+n~gT%DucrcyPh z!c6bptGidP-sg;PKg*^P>+Niov@Lg{L{j$S{yw%m0K1~H!7GlI=wKBacZ8pZb?|IJ z?3V_M7T_SK`)q))aYvl;WN9egex#IvScoMyhqWZ?ayZ;qaE>4rQ0AY`PACH{D){`TCofe2S5+%>vb{`GwnTrTLf=iHu~@)S^X@goA71_c_*8-D; zRN8hC&8qDf)dn84M57Vig1uGMqDTnN-i3ZAP9EVY7S%2^IOnbXzK?P1}$#x*GH zEc4Vt;umm#LVBCC7)yiAMtBxgLWI1vmcet}mnD#8SL3U+Ez2Cef6?zGNH9*@nllj= zKz=ZQi*h8i8Ki^8Vngw2wH+M%r*`guxO^qB(e>PrL~oH&lVu(BbqMROZEd>SREvMh zUw;5r(s$Jyl639t>@mYgT(8zMSk~;hw*gmjpDJEFk=JAXiaS9fg<(x(#HGAo<9Tm6erul%3b1FAh8fKWq|C6FzJSk6?II|m-e(0)5 zwZohGTcQ7}RmYdk5!5dFblLL-wIs1xKMi0AAVG3w#_;C$w)%iY9S>ejgO><3&47yj zFiPv#;3_RVGSa#E>`tm))YnGYZv(ZJ0fKmV z;&~klGCripO6``6I zr{fc56QZqBJzk{MJeyA#_LI-YSoX>>O3#|ygU*ISM3 zqxA~SUggs`HN-EW1$xP23+q6E;|}z%nhZ$*^x2hXQYCS>wiYS^X>X92syQy_A$K%>}{2IObjIF zcz4o`Q~O3}6*IGp>m~ZLkC3LPG>S@S2Mwe8EvEz=dyEhMCq|9yn^hVxg=T&XZjq|U zJ%+K63TRDDO~m^IWz&f|30xy1LvJ?&8mv)%E2H0IRv?HeMNK1e(UY%EgwkvnoXFhpeght5B~0S zgJYo#8zS1okfGW&;vFg4{#>DE1zL@1g}Emd;u2JUP;_=YXDH(0v3|id3!zZY^ZT%h*U~LIyJJp;^+3-4okcrc)K18cHp+hHT1dI$-J^u5NH zzvZum5in3#HIJ~stoKTDWP&&%DyLO~v2v&Y-G=eH!@l+uBoI~vW-3PD3$EC{u7D`{ zexoE8mBrB|v8{onB!>>%doKW2rpVIQH&+)hvI%X$rh6vZb6k(0(U5Eb=G$y#mfwF` zXt}G;%zy3I|MFtKxsT=HY)9_IjEk5_`1IqQgD{gU%Q{hH6^ZmbOZ&9g|R6)e*q3v__%oyo)v=^Q%Lv}n zv@&dKQ^wgN#Nvk83?b5Eb9(1@S2_0-Sa-LxZ+|YKA{J`Be-l-;x@<6#AM|Bd8(Z)z`Vo@#4Wj&I2df$&7%CvIo#nN-T5nx%DBI8BrO~ z?L{KW-QSDr?^UbBzvI7pz_!o6!kic+0%rGfMO>uo<`D;IBEzlz z>g8+OaR^{@_DCl^xI30DX)(Cwt!wm`R}oy=6GVH$+Zv&0MPesKUm9&1>Cm=cTbn@x zMiDC)YVy!KuPes2z|cM=1wq?mOOYJy73(*kTLaenLl9e92fp*a8E53rUx!1|acPa1 z95edFT+$NH74A5BY&7q-2jy7C?~!@@tTkVY7EQU+pMoNJRh4XED$QQm((;?ZeZFwg z>iAjA^D7DT5MTALPiU+k@ts6Urs#x5;%RM4ROt^GZciN(B4Qd?oT(iSgYBgDLP?0N zTu#VFZkBs(w@z5WrCT7yv5A_Sk(Sr3qP zRrsfB{3fseBQ8TP#HAX3((d1d6-&70kK1&~k%nd`N(Y?Y(G&BGy2EAsQ?*o9mUB+e zQl^zmZS5WZM=tfHf^1Yt?#3}OYf)uGe{5`C?jxW^C3E}NA?Ez9|kL>a0z9z%Xm4d(>HM#L-!Fj*j zFv;Lqr>0FN;jMZr5bms!|Ep7OgIJ6sJ1ait3exl8;s<5Ayeve++*y6Bmfc!cJ4SNj z;We}cto!%B!qG6lQrnkZ>wG_$9^1oyfAPexlx?WMC7 z>?i1`!#`qw9>lV)-0PCkt|M?H0N?wXpWzAYGezfg{Nooptm3~IFzWLY3+Bui8E_sz}JcRSQN2W7c@x#Nl&ga^$Bn0|N?<@03GZZ}tWMG?Y;Pk-3n z)8x`&pdb2m)K^+ro?Wje+Vjliztk3f_%ujI?}4g5jr>;Tt+bgO{N=H4Zrwj)MP7`R z&VwO)t%fH;(9-IzA?a(H+4p%v$X7>6`I?buafzvmmwRk)cJWg{ zTcn%Ma*I!G1|E^uC--@q}CTp1ZdP$a;OVPkOm5oN^zhHkL+@n`30Kg(nEBCoQuE zWfQ-Gvs6esCy4p6M^zUwgD*6P``GIz_bmQEP_NxIoa2e&@(3e6j3&(-T=TdNrl}X` z4E#fH?!tY%#%}pVx~|c~7Vp#*k6xKj19zgKK-B$nv5esrVK}X(?Or{W#36DIOs_TrkMS zd;5G{bF)6usmJpmuPOa)A*s+TNf~#L)OXhTlUEZ{e=0fBd3EhJmU~)(E4e3-a%gxc zP6Ka}dr>uyOvhU0`^}f~Y5e$!=CyMs;jOv9d;nUHH!i`gp@+R()~FdhU!SRG2%A}A zZ`DDKs(8qSr?XY_TKH#tFykkn1NBQNlTN$FV*k48E_hBjqbV;O)+wm|rfafPnHA%0 zxr*Z!-fvuL#QZ6!Po=-vQd0)r8XOl(NywK^+a3MUsK=zQtF5DwEO{W2q}m3x&j#Fy zM({Rix2il&MU@BN2nqX0;g&ay(nCCu>3_R3Pqra8Ic?Z93G~h$>E$jhrr%U`qBb&I zG`#Mu4;+E&i>WyUqVuMF=h3px>*}rLaw(l;awoJ#RYr6~X-}yk6ejasyPxn7hmYhcnLY4c@?(FjQy!oO+z9!=MX-R9V=gZb_eU@u_l4VQ zt!HZa5@wmO0No3`SV407zuj@@mqcb{c>|?NiS-AcX~n|VoDDelcutcXIRxr_w1ISR z)a3_>3dO1lG{-WaFK3Ar?}&0X8pHl%)HOOJC*q z{uL8WloU!rU}1Vk(IvgQb8A>(T#x=Pwd>VFX4d;z{i$(dIJM*EAAmu>-ConPN-XSz zSQ#1C=H=erEAA!U%X5+B>x+?7&zaFWg0{DVQdT$@!8@o;oQ_v)MKyFhh#Y+*_Ll|( z(&C!jEdGHPI_i7gP?ws7k^E5mu#5(tCwv!uY&(1#K`ZqmNqp=4*7=t_U=u&T&|`En z9itbq!55xfUlchQr9`%X6$>(9Fs=AKh+@qx3oeXwr7w3&1ul!cH&ZD3A~$pJbY>Sh zKjO4Fm|sv))r>H27}6F<0<||Zt7JrJOvvW|*cqDHtzB&(0$u}mxaqURPc0V+)!KN^ zzj&j=OQ4-^+gqRV1322E)Qyk}n!Ll5Zj6*06V;VDJ>1usZ+_=~`qJHG@75dH@!cHm zA8qh?p$%_TnlN8!1I`CX@%A&EyG3gb)EXZX@^1Yrp2{#iv84w5Rb^DOh2^fhC##w5 zoaW`@Xsnx54-QkIOePa&4Q>Z4EGTNlFJnD-y<$%~ZNJT~Pf;?5jqMM1;G=#^0MHR7 z-`2T&^jGZAEiadKYHLr8C}1Y!4{|s2LViSa$(k)+>pU5)NM0A?}@LBW*HPHvn}HW7l7Xg@s^XKwQ$hkcfo%hEIzK4 z`jttLK<0{rj4B)s8IgEZKJ|0pUmD44qLRC|Ah&CX`kz<~qOF1FdD!yDUw&$zaO)7} zmjDJ13TJ2Cg0e=**Tf8F`S*suk{H@l0ls8Hjt{%`7}*aE4;uvKsQ4Mq+nK-J^abf- z^G#ZXlf@p(d;w9NsY2)e(aDk<>M2bD7`u#}bB*{Gz%!4Q#}C%r%SQPN`2i)U;swiK z5iX=%2Gk$y=j%@kf%7-YHy#zz-2ePRmE`sIPK4`?ce#UPPlh4@$q% zWY{z>$N4TrJWMmTNjqbnrA@Lo! zY52sA`sWXhR+J%%7<- z;wlKAJ`&epNb^KW4=4^O^Qv5v^jW3Sl`o~LBE^rZLU;L2%y^+>=_5??8D#Gl_0SO1 zbZL-+lT|&#iur)CPJ}!=;bse}P44pxjDbVC!JR5{QN{SKAChk6+z0C&pC;7JJ&^GO zA@QtZ?7p5nXK^?8lSc!+mI?*dZCCzUOoNw%@xq{>Wom=yUSJd_Ng^HFp6fGd%_bq) zUbUjnbxJZ7)aGk^j3t_Qo#c4AUH|JD@`^`GXleY%$m}pd-R=c;PK=562N36;P@3>9 zG-+&3PPDI=HgQNAkcD+rEzO+&nrti6~Wak5u2Z&^2w`_pV;GE!Iz%&tP(gE3-!E>}G+{&lC!BzA80)0Q74 z4B0?zWP8Dve5#z(YB5M15Og=>a(cFM$pZ&t3h)eZLzxLPB#xko~P=x>hV~P9RSJm<&JZ+XM&a) zlq;*iR4*@X-)Jg*(GN=K<^-CcN9`U*hM1I9>Urq^4R8zI=b<7fi*VO}#l#zOZxK)Q zL1Tzp#ib~rByjXbyu_2@QfTj4)iYT3juW2RF^-M=!)ohfrff#_nqur`UIqaNtcB;; zuN99I6WV&PCv*e5;=l{ORGj$SibHqq4g>R1iDnvz(u3pljf^Q2IwIzM9hUw4AM*ac z{DF&|C`C_VC0gDcRh?@TWaCNyF}eJAAflpFv7hxX!3wW9G_0iDBX8tNyo-YPvW8lr z<%tnr>rh6u$vwu2D&VV3=8uDAzyCm9n5ip5ETep&R>^mB`f1yU(CZA(_a9>f5k<&^ zGU(UJ2Z2^E1l`$RseOX4?j!)u*u~(OoOrr+dz@tgn%KaQPTPvD1ff?XHD=0gyu%+^ zk7^jrwF|m+?y^x%pRU*z5cqbh{t+_-$nY=S!oJi1h|Z~OaHnpI0uiTT>=5?#amhE$ z$Bf#J;)(ODwA{elB}Vtd>MY{2uzx`@&AvF1<~@i+)x$%hS5l-cVafuQV9Pxi=iVcVUEe}6(z8J( zfNqXWfkv945M=!4A{+@&e(SYYWv2qO1s60X!bWR`6WcT&6H*IC0|+^i!!iTrrm&BT z%YDFGiamcqC+>8Y^ynoJR3oq<;-cf767B9UwiUSIMBL@YK3q5=Xvh(M;-4~s*ze_A z@3m@W!vlZx|0{FX$A&k-IhNTXKT@@*(RQQTbKX|p%-#}%wuf#@A~md?^Ig5RD$b>u z-S$wT0)M8ci5-gjh|+b7<8rJ;9+22vfN= z#d|kvRb7dON;jS8ymS!5A<%`)FB#i2wmY7~*uln9_`t5 z#}i6-MvUwE+VyUsZtS#HzEq70^k8rh?Cr#$8MckM9x;z(A7QS5P3FjmPR5S}AkeC- z7LNF;K`Y|_qi<{=mtgQc;x)h0Hy8*EJ8NCFdEKQA?NUv>j*>@lLmxOqzPNw%C-jK| zEtyFbTACk=+kT<$ilTG7t+TSGBG~Noe2G}GpHBBuz5EK-WfFD_`#)6<`bCxV{XF)s z@GrPRn)+UkqW};;yTc3s?$D0 zA0^+jG-BJDaIJ>V5Ipe#AB*Yfzx%L%R*UQf7hWk)HrW_ydGRv|B!e=>A<;Rn=sdp!i6(X$!Yto=( z^xd7@!cb}0TOEi4E`l(Q-73O_xeKN`Xw7Kn_8 zk7#>WZpsweizOE0_G0>LaIP7_g#yu9iTu8Kz2!MtpR>MwMHt0?M*Zaxx`W{&WZn+` z@U|Bs!ALp|`(Fkpi6EFNDJM4*2vOz;Kt7(IDQOOSJj#Db;bdc+VxSpql1GUJ=rPmV z#84>;%J?QT$z&N^&jkSgqsW=rJ*R)pUs(Y;pPO@v`x|(ZL*BU#I$y%6p0al@Xar1q zMQt-Yc$?3r4m9A!a{aLYxg3MZB=FQ62A=RNwZa}kZtC_UlTI3KtLPDoi!f?Mp5w%2pj|E@)#K#=RE+j(I` zi$2p|#5K7>J+pG)Gv-VIqDMaONx!Uf1smF9S)#ZuTJfGN-;_}FzAq+xB64z8#7zA? z^*^*H(Li2_MymRQRq7;l$lA@dgbi%_g(sVUKQhhC56cx3cgd14)K_6+?P4n@??6@f z)WkXKpGCwuV>txBraa4vE={8y3Qn^6vHj}mjUc*@znOsq2j!eFWEL~CtV}n zgH;`B@Bi}8P2^W&K%lw8`g#JzJWbZW=$i~Axe&D<9(ns!#C!E&-6^~_9D>ljsUY5R znxPjd`+C6#x-+S>=+WfHALncFa#zFSHiho)0BA7F=>%PLiQrXx=~76oD`s5b^Y*@) zDR2CLq9X-}46wsjmoUE=+769jN29k$bZ0~HKwfc9eR?*P`MEh|WnV}H+qX+rzr4z~ zx^h`)ep#f^n;88HGT4~#%3$~5KVm@+;w*QcMCbnLSWFn7+^W?h`20fRI#oBm=nvSv z4(5EjB-^2zGMC(7Li2Qxf@}acdVWyX6(|zhuiyXyMok)omiM`T{&fPuvF&U`;?-@a z-dmJuvtFl6C_>w>&EPTFnB_+Wgtm6UYo@cQTsVzTmq*<%|FEo20I~+JPh&C(eBsGg zknXz#g=KEaS6M>XXWuZd7w;TEk61V3IZ;I1DJ9hr8(}4As|S0^IzNG7ODqdAB=~&% z%RjEj3^5%>f}tr4!0WNS|4T{~Dy#G2{Uw?9`ie6Nyb$isLrthk?G8&VzW-)VA?-;Z zS%}>fqi7XOFq>sa3}r|$^g!ISL)T*aP;ciIb2w0tT^mH!gF;UAkjvB0rNsWUlkdQW z^9T4mB_4^a?5Kf_3QiRq8ZqD`Fl551IM+Y6Llrk;e2J=K(y=00XKwz~?xJi8EC4nJoyUX)q_NAd9@> zY6S|e-}e$i|DqC{5mu>VLa1;Y2*kK?JCv!sZ(x6*y{xO92d@5+=?ZpxRfAUjAvf{A zXk>k<*St-5sV^6#Iek?N-ZCQn;(;0}h?e6-M%IHC)n9=7%Q!@Ou>GzommmeY#6DFo z65Ld;EP@i~|7VJa=KGWt{V8Cu(Ex|m#UMgFKl|k~xqUJEH3RW9Xw7>W)jgU>LZgi%s489<{lB@#V6HdVe zX5vTzX@RP5D|+&V4d*{DzzAByF=fs**!xBz?X@;A_4hkhcqi^yvfTo#97Yp@pq-*h z6r_t6-n=yWgp`ODcKf{ybA`V_%^zH3;$B7(8$&hXuLTI>bNi3ZfaZ5wiu60GIrYc2 zeN^B4VO|m+KeX+s*Zb-z5x9BU09L*py~xqOmK6WMDEtD(_VIEsEKolBN^?hj;tUA< z$rT`sRh7*y?LySyBufa7dOfsvAg1pC&kLMZi!I{w4d6pf_2#9Al)62Pa~Cq-c=m+DVMX;-+nOfA0czUH^rqn5u?>9uguWT1?Fx$J?%+S13=f)hO0rP|ep{*3F+0Q}Ud(~UWCR#*7yXb}FF4l6-WBF(mYETR^ zc|lL9My-F^&djp!75O0$T(g;bB8(DNgYNjKy`?9nV5$7>I?12it7|&s-$GV&UO1Tcxf+^ zbqe|u0%1tK`uo%hSx<->S%_O}7zu1!5zaK|8doQL6z)R~;aE7~GJihrbjpA(5l+eU zs@I(X(LXK_uGK~)wf>DESRiGTcdHx>s=rrE&51TG3xiI70i`iT5-=E~i6yGzx=y=U z=F}y^g{P>GHM@$jy#p-cmnWrOJcp9hPF^Pvda+gB#TOrp?QD0^&$1TF*7!(u*G0uz zekXLRPv%b~M)cpa0Mc^y2ZYHsv-bODLSu*k&pvXh!7mZ|5~NTdO?v;0!M;2g^srLx z*SocQljE~dqz!xInc9KtH<%T3pGFGg8IH+QNA$j)vghTE}L?*KCUinlYx za>qGm;-S^$WnRUu{Q8a!(x%NP%p1bZ3ijGhkWEndd1S~@ z=ObI*C1!})5)~c78b~qdoa2QkOA{b8*l|z^Yv1}vUh<`6c?M%@31lHvSUb53KZMz_ zR{&6sWOpk@Qam=pAtsCdZ!O_Qe%t}mj9BiRnEROUmv`dx<(=!9D1-1Aw29BQgP!aP zYLPJXuO#pP&$5NGcuMR#)I^r#$VU{@G)twoRs3>PgH5fC3alGl!9-v7DSU^BkqvR?go@l3=Hf1;{LFu z_cP$6cR1(iJ)4Y-4J)gU_UE#8N5&zad>08*t z*LAmr2$?{9wnA>WK*u_Bq+yAUX7`12XWo-n2-{UERMD#7#pY?EY#q&-DklVa}@8 zTTR~|s7Z5lt-%dvtjG+cD`9@7>lq0=IP2-jdXLwBptT1@xS1nWn12Ls>gEBjPRs@WA3u}_neSX! zAor3wK^5sl0ort-5oF+ znxnn!KOxOx6x69|gX(V@g4q8)0G}1GZ=hjdPIzbuCzn=_I%@mG6aU`pujtM-8B;d2 ztpE@;s(x9pu(|ulS7yO&pM1v&=3!nUU^K^exmVYo`1U7KV+)r0YDD%#dpo?+-y-I? zFA1a6FipqT>M%Cduwrn|jg>{#qRjC|zYQ?V4|`}FKDVcgNlACT4$wkhj^r5TYeKyc zFW=u3V?+m}#yw*Mn9Kmic2l4<4X-HY1{2Jz0hTHvX_z(?kmSIH(2Ho(uR@AiHE33y zG>G~mnn9xQyhDQQt}53K~&%e9RnlX8yz=Ck2I=GuWg|DFdq}KPQ$UZGP?&8b#dT z1bj=fF8ym+_kJ^F#5_stQ#-$OSPXO2k2JrgnXMVBq#K`9p%d6j^ip6wUr$oM@DfmP zjB5W!MUF+ zqSWNm(n>p)V}TBL4SKNPAh~<+w6~*@CW2-|-U$q$G8d(=u^P?TJXfr)yW4VYqscqu zAP;^fVM-rd&kocR=^j`OzkbG=8a*8A(JM?MfhnpqLJfGjxSsJo4#O zAx6pYgL&;kC|R0#Iw6A1 zm-YhyM|vT}?L(Eq&$Hwyo-PDo5Q|Mhc>K58Am}tZ&NIedJ8e90ukQm#BHcm9+DypT z)-eX;#@|ViG(f4ePG5w>FRZ;{`p6f|EfPnVfLS~LLG>IdX4sf{hY4r)T!DVvzK6+0 z$qq-Vaw7)uGe+Y95_&~2%JqaO8CtMW;5+Bp*|8DwC=1*4-n9#R>*?hm?p9f|pi+-x z1ZhRzXMa3^p}yw{FZHuY-r^`{V!n@GC#{UkQw6vWgn{^k(WCSntQ)jnk$GVzY0`ReS5ts zPOuPvQ;^@7G#a9#9G^vRT-B^$~O+V{9$_qO7kLVmycm&mscH{Pr9Qgw? zXIWGOZdm}E2KRUJ-NN(79Tq%7Sdn5b@gl(iGUIgJb|$LOqPJ9PsU z8wH=t5+{sxWx`CtoPj8g_G(*$=IaQ6 z7{OTfkm!+du>L16+)lk{0Uv2MA?!@!PnT?VM9poUphs0YPT&Pm{`u$c`1eSL(b?D^ z{jk$BF`HnYPD;xH{85C7co3_U404x*xe3La#{CFk6dRa&=;#bvAm%<0$E*4p92@*i zcl-gkp2X3${D*u{?^+meLdbNH3uaQTXgFDc^=)vec|4wN_)h2%GZP^$+wUZ&<*juE z=~56O=USMs`WsH1)5yo8NqO1XVvzP7$h1hpKdeQ%W zt2OHR=Jzv9?3{f9zKh-7pZ(_LYbb-J`8<&#DToDJeH;78vf>S`BN-sqp;Foz8AIUt zJJyOj%wKmqHMF{y*4^JQODzE!wVwRp+#an+yHLo?_{BX7K>Q3TH7uwVtjzd-rmzXec)3Ge814uHJ;*O}S&{9%up#EAoplT@BUY+21Gqef4ns zQ$${$jp#b&>aFL*+nPT!#orP#YfQL;?Z!#G#Ro5{+x>=!cy*nJYc)rbg}V(exxUKI03Jy-w)*)|=P8c(Y-nCt@}x&Yh~yFr5)l^1DTp{S1xzrEX@BXLf2{D0uA6 z2n0Hw8d$ej7?dlE06Y3rZz-(%Os3v1DjYcMotX8ZRwIppg%?uUC(F5#rW=PmY0^HO~94G96O-Ac`nQcylb*5-8(>vNT8N z&<1WP=M*PhZa>GSb*i`N<>B-??2M2x#LMQedA!$}y1wDtGTa5< zv_S%C^rAW@$yEfso;Jad^D$KES{5|s#Hi1Y=*NVYA+`BHns&MBN~IJ;$-N3kh>8Y$ zs=9GZl0|4F!`ZTxMDk3yPGT^46!M3BFS2?Mm|WHT`~A`h&y!;PKy>C%e`cQqONI=+ zfTV{eH3nNEua!7}m8Vt=JE6;HEPXY<(k-KbL#rBx$>+9~+{K`MC@ptZLY^o?ta>u- z#scFFT75FKtws}u%SKyB`NCBu*(`{k>PhFeq-LGdN>|S1@JvWp2f3+MTE1&<)#VIU zrwEib#^M9wAE4le{85P?l+K;3hO9G9()(yT;>0_g#uv6_pNdTK6_lm?x8>4C(Xi3B z4gzmWvN=b_fN|A{BV!%AXSd(=i-^U_Y|En-&zY@(nH`On*ydV+siBg6;B*C&4#+{$ zLA(6E;0uET?QVGcJ0!I_x=-^~c8}&UNY z=;SS?uE}X^@lFS45o-`8HEDEPfo?)YVc5{KDWKOBQ)275Cw28T#Fp6oBHt?r(RwQ7g=-r}xJ|AtHge4VT(kuGbFOu!q?YO3iO0_h z3r7j$t8NOZ7`A@fGS@-SBC;;Znr0zd#pd*?yeF6PyL548a zBHB>qE^{hXY>v5DV!XXzlKeF^p(;bV2E3^r`)>YDEdc}X?q9=p_wVUQp7We^){ECKb=siH2RnV#oizQ7NGsCRA=c|&VY6j*01nRRk#XQ6$JL<7&@iCA21Y%(1zGl2 zxM3id&P(UJAP>oUi@V@>pu|b^j6@`G=6s-gadJMfJyyt4SC%Q>tHZL#AqAy@{%M>x z<;NgPZLnfDY5X4p+ZX0)&;VrY*B8#!Z*q zUj*_OYpm@~#J^~@nZHHLmT_t#KMj3EX+ljQ;G1^bS(-DXQhj@=h*v)KtY?kfR{W;} z|Er4mHW+mO*TJwA7_=Pr@As>=#FnPXa{ zBve91VB3gI5>!)1J^+!8f;)-Q-_>Z+?@)1OIg;Ty;;s!n&@=GQCdO!R*s$TVf49_f z(svsw57p<6TlL!M)lcFb#swIqb!6eLnQ>h6h?dqxb9Ak{00(`;*H3x){bk$2XLrQ{ zW+SDAr;r-~zve@!?XE+E?E$wI3#qpVFq5>+4+Ai%Ov<|%4u0-S)vV3Y$tq%~rZf5b z-X99^ZLz1jN8mj~~>;7%7F^Hdy@HJu6AX2X#PB7MHu7EYDRG z$&`M+nqu2#4Do`&8lGDa-!i4LmCZ?#L&nE7w$A$y7c^Vv#fv{zwy3sO?|TQGFA9h( z8;ZdHuV(mx29YUQzo+EE(DWiT)Y$Kzu;0AeVj|Sd-!urerQe#X@L)<#>ZuU;K~EOI zR9!;mq~d0Pg<56Z58#%GQu&4ws_74L;$$g?(@zklxU%O`U*Y@?!QDxvJ}EuiXbe7k z&UnYc%!iBz`AS3hI}+=g6hxiT!7LS|4%>-Y_CnTo8HDIE65U>r5GOX;nv4}2_U}dqgFTA82KBXsRqzwLV4c@P8&brnGFtH%Q*i{cs-+2Sgk57y zsX%^%tapK4yveZxPY5tVfY(SSU8|C-DMFWS=*sHA z<^2`FxK@X|vXot1q_WS%)2ED!=K|9d?o7Ynl2nGAK*Pe+s$)d^ZI_M1_)X%et6kf$ z0ep=qg!}#c%*;Z^hlakB9UVC)?Li@1s_@4v2JBu__m}-IOAxfR#6vCdz-7HkujhGo zvo2Ay-#b8QbVd+=Bx>Yej2{|yoT(t)1i)Tf{gruZJAi}F*S#}yk+1Qzt(vUYqqyQl zcq*UK=@@tGO4Ny2dEP81(?C)~3&caJ?w-jv@5x8i;bxkx?aiL>(#4tByGz4Q`MmIjO+D$>m7I=pE!0txv^@wtv&zmGz#p?bc;C} z@87UP1&s-w?E_|zKv%{ilB!6iSmI`&DH<-qC7RS$OwM4DvSEQ>5c>pV2gw!xAB)B! zY21~H_w^Lo1zloPgTZ_32^4sz;jhW&)em!d1r7;xo()5%H1?qrqrulGS=w1*pzeUukxkm&u-WQu5 zYFKP{S|nZ?DW?AozT1#_p)akN{Ab_E*id|D&#a`S2HTV7ERyqWDX;)!YnKLfZ4dh1V6|G)+8X zd0!1YhX|iTjw+xGeQph62fp^CPA?tmBf{9tOYrOa!6UT;iaW4mRoeWquyfB1OpO$L z!UA?W&T_2HcJRV@1Jgm^gPM83GB>D+x>gUL2k$Qa9n+@Ywd^wjk;a|# z%q5$yx1&F$TT@}JTEQLdLckKR&;)pIn?01Iyrr`8e)m(e?Pjl$+k4nD?Jg zlizJUE_LkvF#xta?ngE zq~&V=CY|`1mDl@po`z$}|Nfa6<_9sjuX#Z#sA#SHo*n}ittBe`G`ZmpexMe$eeDgI zp_3$K3s)lxF9Tq>69YgRp>V{a1CzSLa=|B?D8_)jeOBA|hX{K&;&;s&5SJljc#VB1 zklwMlF`XeD_kL(7Owo9+%V_ppo2byB5I0NUBcE*_K?#6<7~BIHK*R<|Rvut~zO5yFJ?N=F(`wJp7gX5aC>4tH|X%cS7#lU6xS`sVdJ%*r!g zL6f8LPn|*@33**nfro!!(!UXr$tL+8*&rXDRa~VAR<*Z&jeKT&1{f%oUJ)D zd}0ps~}b4v9v$Xm@-tXmJ8st1>yU^PQB(#S|95jM5+lyope!`V{LNwcz~V)7_Q_c*5)sVwlX{X+E# z?hJD#E??^a0`=M6WL6ho+x;RzuctIwZryx?wJ<)((fNw(YJd{S9kY05c632NJPCo^ zKT0J>Xzy@T82CN2U^n0JHxuig^sWAPTs4M3hV_^7Wt1u*nC%U2RKA44#FNEyu3a+AS}j4u^GCKi@B!w29xBagoo6ZTE5B zQRh8sJ9~56l|d=e|0n_Iydy}vxFjO^`Z}ls1(=Y=YF6Ol-P>lnRmPn%8qlveqI@mS zG3S`WjK|p{U=LTgtEA!P(vJ9QjcYp3#|B@$mbf*k|v31krMlRw_un?vhXxf5>7wQuX`m*82=J3iTxeSd$2Wx0Dt2 zl=ZfwrgkintVbNwf9GXsseQ-hz-n?rtd0cY*9J<&9`#N!)` z@m8u2PX780V2E3?n8&&hA0_j5oqdN~FuGT#G-|Lf9Z-EO#cLDTh0J{3EuBnIt_UM| zm5@LcukW06fArc+c(Kiog1Q(Cv!j$#D;&H&3{0VG~sEkRo@jOn`~8Ah@S9FIV^ z=Z@c>y^pFTvoei9lkWqI7+^Yg7r;VmTkoF4D#yC09Zow}I*Mtq@C=c+i$B3Ir_#SP za0e@P%b6#0>4$)Sa$1f>cah6!OMKrilbXso$QUgDCD``NJIa`B!(8d%!ooV=&RBV` z${iz91~qjRmv6r$Znn+?LYOixq$zh&g1d<yhx?*Wh7t@GTvC zK{ws^gKVzh0Ejs@VTm&eh3pL6A98lgeO;W>7I^CKvgq#P{OZ@e`B=)ZSm6(Tce#v2 zVi)_WZdawLi2ZF8%`pA}ZF@pcYApwR#+Nrz3l?N4X1iK+m9+=PC}i%a*{&R+ zr%=8q1L-eQMlNsDO5l!JZOHBlC)xoGRq3@)xDzg+3oh{BVe=6&nykZ zPmChk2C^I^s4F_-OX5iHrZaf52tNd%tW)ZAnwT%U3mDi21kuk2%;Ko$>E=np!K+nI zhZp8OJ zPl`Nq9523wc*#v!yl5j*Nl&5g13xmNTFoAtx|Ya5g4?MWI}EmjJdb!+f1V$6PWHLr zAZK3a=4e8uE%nbEarm-_c^4%4V(%ZNZmDkB$uOsd!=hy2|3jlf*fD6-r^sFJKfpjl8b*dN?rffW z`oF!I;$rhKnt( z+snaa>_?kvPe|i6S+2|d-$1~w&}x*#Pf(6P9_Ioc<>wz;`W`owxrQeMhkZ6Q&m7Wn zMTa2GjUbwWUfcupAXlPq{4BSjMM*drHY%y!x#$H#4 zgGtb^RH+(!n5vtuRoET<>q$#;0wbg$da>E^qWHip1W61Qm! za?b}4)vS0p-+ZFR-ZOfh;(yQI)GBd;xOvi9o|{V4gw{Pi6&V=4)BU5($t!RSB(NNx zb;)$#<$RSrHQmxW*Ko?oHc|J7Fam4+{+mH^r2U2Buddb#OZt9k3J8Q`J!NPtJ5Twp z5@+gZPpyry!$>8BKn7dA5~7n1%W5k%Rg$}27sP&of9uzXAkL(prtH6i>FXDxpHM`s zP=*x{(=>Dg$4yPEdXIz_cq+Hz>fDs+RzLW*`c*z9vq}c6*QpDi4S1J**kcW-8DZ2p z6X^Ix^enqX(E5~;08AO}F(-lsFiPA!x=)yR~3kf_CbT!ttM)nvNv0i^li z_RKHJJ9<+_SBn2k2RkNf;-JIpWW&{}pO_~=MBBX{_BqkA3ZkR1O19_h_9B+N63f)6 zlV3)>nai?aG>V)3*vM;brL|Tu4Hk6LbaPN{8RN4HUZ7x)kzV{9IBs)}5>?v4#W3j7 zibX4W>B)txZN$~pHpi~!NoOyWu29>zcmW5$TDrr26g3ts?$Ann*8XbtPY&bp8;h?0 z{4?%PPG$et8aS=9zQZ2|Z&B*!VwM4Pe`u9yxa%40${JCpmnR<)y>S27g;QfX=G}(* zLr)s*Y0~~Ea@+AsLLa9b@wrVePIIBV{QzY(M$IMo5glR5PzA^=Y(2zdMYP|QVrPio zp^d4&X^Rtre10IQEpJ5+Vv$rPi@q1`iCca1_~$N>;S?ftVgrk@87;JNjx@8{!)^=> zllQUtP@rYO#DbNLSbZ@!dMV(7MoxYt5$kj)bzYiSt*yM=lo`t6(dIpRwM*?C@hH`y z>yqV_=eCRG^e2e!D2Y;e;V{%X+$sp~>GgbTl2w{u>X9Lvd)R}K1-crnL++gof1$Tb zLY~Y|(ZHEZ>laSA(~niZk8-RA-PV|ls!e+nmfG3=h*A;QuF#{ zhB3}2B6mzX2mP-ass zbj1b)RVHQuEraj8;!6lAI2j21PgCEI?|%f?5?mHb!2KV&gz6#9ZL#vUKjs{`3w>V~ zBCuIy7Sez}OI-09VD%$Kyb3q`s&bb(^RvEQL~vXf`$&B+I=^ZJfrvqN(aIyP?S6{o z>ZM7?ecX~VGUKPVjx%+*ecGRMKlh%Fjj#~5lcXmJqtP|dT+l83XER0{{*0dO4hW>R$yC2HFPY{m<47*L+3pNs!;XJw#^m-9}Tf?QJ zb+9rFfd+YDDVZ#AFuJYHgkXIb!pbd1+%wYaes49W%MRjiditfvfo>gt{td4XMlw6N zcJ#nqFZ99CGV(_FEYs#zQp)R8;MFeW_SKJTVIdm$Z#@fUN#bJq8ytLK&+z2XO$c&4`F1y8beNgB4sEi6!!Pi^C z+F!$|Z~f@~&pxRtDbL;}FPqZ3P3gO1Ro!7MR^)K_1y`3EsKmQXf zWW?~XZ^6W)x0J~i&Ho*T`4H)TH#0pB@u1Vb+Iyc*uGPMLMSUxy=zb*7`MBA;Kxwp! zMb(EUIe6a%Du9ic;(bw<)VVjZ6NPhCFI_SjX|BEx1=!l`GF1s5TAcpiah@7Q zeT;RHQa_SGZ-#@NH({*=4Sq!t-&K(U8#Z9k&ho9=r~aMo0LLVkM=CLFxVcT>h-! z(?ibk-2{Qz{ich`)6Qa(iq&2b>||CpZc?yK3?}QWcOWG&QOJ9Y=ECS{3{fyQM{ zZeAwpaHbbn-n28` z@vQbaA%2Fs;$b6?*}tqKs^?6rKm z#rK2h1UO^SrHAfz=h+?SL_A}4)tszRonK%tl@PC-tcF2ZM@rYQi(QC4dSB}MXk_O6 z+xSp8^n&<$!Dz0B@#c$1_@YhpLcP&kec;k;wS|9d0UiHj*W%|kTcnS4@F1-lb-%bQ#TV1Pu8fXTJT zD#s5Fg8E1K5q}3cSnI4hCYZD8dYk{$m(JwhT_lW9&88{P_}L4cq|&~ERO=10uY@nZ zcTUXEQ48xIq$a+OgBFqN@WMyaljbeCS>kx+wD-yimC}9j(7o2)g{f~IP~gR!Rgz`5 zehYqy-7^7~s>$rWo?x4Jv(ewwLvXjV>}|Eihmn^H*Yj8DA9j>0!^=Fs@A`h+6z2YQ zhloSE0b=pm9m{B@xpVT0ltxvhygfL>|1yEx`!*zgIwV$8@2$gNO(A+(^JYYI#&45< zx()TsNY;0d`XQQg1vv1iRnC8W22ifCI9Xw5z%5Zu+?^7AS)H=S=9&Z%%_{qk!{SXL zg*g3akVj87K%ai4#a{bp4}By~XN`jkgqahnrc#-^BxPf*nXJ^@9FyMTD_ZTdkC>f1 zR&=DJDq=NG>X3%692KBUnvQBwUAe)c!R@bHMxH zaJ2L8`48!~^7Rr*n!L1e(VQQA&AvUN!>3UK>o;BLLXI#~89uNULJcb}^VM2bY$FX% zW%Z8eCcZek2%Roh)gH62Rv^RZzVL|?UnPLp(fM|y+nqF1=KRj((nn1_o437j+{3eD zrM{7{lxW+xu-0@Am&NIqp7}>)>2rlML)}o+FNIAMvaYhGdcJJZByDQp@bgKJkwe$4 zPFG$kd925`@dyg<#qqiD`l#+YdBc7=K zK^NNH;f>^knuHR~t7l>pdGjP%{?c6Rd5^V{A{___Hc|3xv=O>6<59Q>(-iLx)%t-x z^%SKLYCK(FCTX`8HFp6;w#DvOBB%}KIKMINs-tR%3nzC^@1n0CM-vMeKp`#jEtkfZ z%_>aQ%ckLh)j_79a*me64=AR&jb=0p_WN;e6zj$gE6NUkK|tpDm4G_(Bz+hp))a*s z1}%JQld~DPx?RdWx*7g%9qsc??HnrcDYVI{`iuDsHA_!MJrTW4KSF@%1FWX~4&cRG%E+kKP1#UzdCLSB_nwK*EjUqGFqA&*8X|~xqY5V)9 zKrMWg@rAVtzw=m=f|2XwOv%eY;HC)O$xB>A86%X2nqX#ZBpEr>T*|=E$w2zsYtBqi zCcx}Ej%t{|G(csgB2P{3*Hku5RSH0*FXhVM$Cr-HAxrt&Cno3sO&DSFR=0T! zNE9R}eb`DqRF|3r3BEUxZoIn4*Sul_u(+6D_@(b|%R#%jjXP68F>CX1QuOnG3z<(a zkJXDD;c_YmbzT)PkZu~@lRf$5ha6=p7cSrz?EGZj1N{u%Bd4*H-&mhCu1HtW1*dvO zKR0D-fxYs`d*JGFGvM>G@Z-EMTdf05=?w1X8!ummLwoZim^ZR2=m98SlEB7Xe8vC7 zm?v#MM>HT^FYYFKChS4Rto5;>(Bq#0r-sk7Qlvy1v|u{GUCQ#A$;}og6XF|aL)x_r zf0?94_kQCOX}16A?J%Y4K!f~M=t1U};^BXWsItMW3}QNyj4f9@r|q#EsHV!>KK}dJ zYXktuxAV^YPGXuiN-;cniZ}`a?fg&c?q=ZCS8^GBsj@HxRgx#fe6W~W8#g-+A2QHC zm#Y+!#Y4h1RGe;7enhFSZ~j3>&1(ZPU`ivrpKf%;D3viiCpCzS}!OO!nLY z*fx@D9b3>6E8{YIg)->3Ntacx6>n6v>{SR=UBt{S%G;!4?v7?gQn3aQu!cmlXDdmG z_Jf@dD#n8;L<^(cB{ zz7pA!Xy(Q^%N(v`F;eARObg+@ITkoqQBbYyHAZx-_)bSvoz z%*LkINuMAqan;xqe~1o!qeYLU88P_gJy1T_ix{4rdE1rce<=FhQ|57$j(w3pr0;I~-Rc!QBtxDz!J;!#YCNr8a?W8s#2pBc~ ze*6A}x^%hkwV?~fo7AY~5C8TEBbcrBh2~KG0V&{sJ6CTg5sPIh7cCYc=ZwJ=O5moHjOv2Fl1XBZV*K7p4;GAHQ@f zb}Tc#e`ct2uAagF&}5}2dFn-d(2VGd0+`ul21Pl35N`};r}BdbY}i#>qXq+P(ejD^ zQNpp&z}TrIO#ylvKf1Vx8Y4*u;B1wfWXeDxz`Q<2`=>=7uGB><$@KPl{A@_I=1g8f zVpX=Cevy84bu2rD*hg3Kyax<&cBPP4lL3sos50aO@gBKyQ5FZ+UX zXcTD|l#T;6upK_wAOhVOFJ%GnZMn>H$ULu#=X8AN(RaCYKfxk87vaJbS71bMNXUUJ z7UcxLhyF#sJirhw6Xx=Pgv_z1rg@?!A`1@CH2A@_df1u3NV-))J!og!D&_VIu^&Diu?IYZDMpYU1N?J-syYt@8 zYOcp_Y(1`-c3dWl6PVm+;2UWl%)NMQ+{2Wv*r;K?!G2J=nloB6l5!zUtypJK-u>&; zJ^XU9p+#rS#S4ZmeBGrXzqO!v1CD?ck+Eo{$ruHShar0LSVQM>W5INF2-Ue7qxo|2F}(Cc{uN;Su}kw0hf~K}u`|P* zh{poGKmG`#f6rDQG5cPFjrq};Kj?%`Rx7=hos?`@DdY8BheR0*j)dFR2~`?S*PgYf zAQi{h3)bVEvM&o67hX(l3Pob#8!`^11QySJiEt!bDKArYbHrFvCE) zC|N_l>Bau|nZ}$;Q+Wq;@?GiupT=kaI+57CsLOVhAE0d8`@4eY3d z?*s6~W;x)pYt69=;RNp6Zgj_9?8G{0xcXNvY6fa(Buh+e zou-&iu^CRtE~1neB?#>$&f$Pd`h{f`X^{yvPM#`F{wrN*Rt(UCUMbm0`xDwdaV+7N z#SMsVzz2bI8^_j^vy+)fc`1C(Dw*ddRj&Ht6br{U& zq9EMHamCRQWdePKEqON&Q`Xie6)8lsbDSSBQMSK{KX!Ub*I8GC?6w`&@Z{Hb_9Z|^ zYr3Y7g#)WCR4e-dHCU>3m-Bv#;b8pQ?X{equM&2%%V6wMt~h>ZZBwnskE0V^#xPJvX1JZMXs-FPA>caMTh{}#4qnD258*XJlq^S>;bu{XJQIi z3^<7eix6`W5T8Q{5VfUjKe_N6bH!0@dJtEq-m(n(a`p|IJGdY#$thWOjoB)} zk5r|@0JH9qK>Q|WAtUD(^5Rl^@ar3O2l9qu_FrH!hA+KD5zAyDq_3eKr|F)r-jaV# za`j?@efs|cn9*-2-KY|1@b&LZ<~>YRJr=Et>|I{0Jo#}6E(pC06Ik(^1G4ZZi)&$>)W!i0`p$W-vZNRio!fDBh=g^t32KD3)G@t=Y%Es1QfWIY&E70 zv3pitei*m^g*`5Yyg2Mn9(%DSR1BUIVCY*q7MGT%bi#4R2Uly%I&FR-QlThHG*Em1 z30*gO8O*Mc7V0Jn|4=&H!_;h98rxziVB-H`)+dGBd+i5$c6u!WWw@>|;h0(Zodcg$ zM@ywEQLZt7h&6Dq9$18cPpBr7@ns&bWF#`)kq^gDHjU&1tE)gkwUlmau&BzjYE;S zpIVyTLxZfd2K8yOS^+xYl#*4}yYdRs*6^!&tm1EW#Ta1i{gE+ate|#rmv}$7>`bf> zc+yLONq_wiO|@f)UNJCQ`6z9;C}i3I`j=+>DsT7FdgR<-V(l4^GJ|D&wj+gTKq#NsSSc9 zYRe-l=eV=pH?8s`@;_ByJB(V1JXo4BK#rYEEN5lvSx7I-WauSZdqNMmDR51m!H6J4 zI=oi@wIyDPsyH%y@tXw~>)WY5rQX!xvvb)aZ{Lj`*t&`#q7fr4p)_lXb`s+Q{ttHb z47)ibFrU;Phg_QFZ%gY%a0d-icXU1qR#z2sk;yDOIl~(EF&WP&-PcJ(T+*DMvkEk~ zP6qSgmw$YfN<#XdYt;NCq|LHMzh#jaDox-}r=J(`4p=$On#&dqFc(+$NTtQ=%26nK z=mg50C}Sxp!Dca&iG~chlQompRqS>)aZW0Kn}TPrRpujF-vO-2_LaO9rVL)rP>&{6 zYc-k97D#wLZL|}27_|_`bC=jXoeGn6rb&;V#?ib%WLCtpstJWv{4{M-`(hZHoXmNt z(g+`qjA5UXXEe(!FHpS5*NrV0>&+T@<2`9Hj!KQ<{$(G<*fvRd9io=ttSQkB_A9u3|kZ(3~cE19M;z?Z` zk|S_VRWAfkGf0TPD6x0!RnGq(xx7R$+12ah)b8-_$hA}s&td5&KDKexd)wieMlwQH z_~!+%IFX(X zuw~uVaB_8oAxOtM#;eG4Ce011T^e63i`_dao;r(!^+7v%61UnRQ1DCYI9PDmuAO@jYp1z#V) zOrF&rVRPiG9P)_0%OHg>aisz#i{Wl3R#C?*tkM&eLHFa=NP-{+|3)2)gi`Ocz!!#o520ZkBIIl>B%A&_fXJAnC?8n(h13``bz6+ za!<$VgH`+Db#pW#UP=n^@l}n6QW6Q7-hpDSa4lUe3955jqBPIbUC{Ew(jD|Ptvq)Q zyAe16-jhi^J)}Vp0h}&rhQOYCMBAD&h%E+R7AnS&nmKrb;3tnt(vM-9qs2qI2&r z3pK1c{yDu|F8-80_VPmMmpw2;-}B+^nj_a!o#;)7CBum`BpI)~H0Z2DbC#BKIU;Q6+T~Xc4`a(Am}88LAX7zjLTTevnn38 zHwQJzQSOE_3^bcC1&W?$lV4OxCt(p|zw@o=kR(k7?>LZN0uV)BR+I^<>LVS+a^N ztxVzb3enmjgXf0tnuT+|?KQd`_Vv#;A^d{g+1a&T%TLQz>p$$;yL(!nDT+LEvBklm zFbu%eYfDq_d2iK5ri7$Kh($8E#x;SOB*}Cxrnt=PoL!yRV9Gspw5*ieJgu}Tq=Rd9}$pjg$C&d|6Kz>Xb&c~l9T z>I_9rDA3TrBHR6WI_C1wMrECPeq!z9EIp{Y4e`>l+*)!MB&ztUkd%uzWpe^vJbNA+ z;aFU6p)$`FJw_y1?Kac?cBqA9!C#N(3=ep^dX2vQl*t|NU1LTCE-_oNy2_QzmEoC0 zp+;G33gq}dDBX$mj8yD5niF*Unerj;|>Bw`Ta_@`@Z%vC1FGHx*L`! z95pxZN5%XE$obY8lI}BoQIuj*zIq4_zbD8N2rXvZU;5s@tn~geq+mf^3+gn#H)V{t zNJOEX^wM91C1H#RE;OfvLrf}fkWo-#U6)Pw-oK@)>@8+xS-g<78}%oyI`0De^>DU} zJf*Mi^5}LemWuK*@H`4+H6z;@$Hh&af!D3Ku6o`Yo859?d-0n@A*0Jf~b~mf0#k+TGl&(?W zd3{g_>`-1_ixOY-6;f(^Km+O4@Cymv|Cq$C#!C;LnMS=7EvBD(Ro-5U+&jrCx}=k} z=b&M#m_PGFq-}jktAFrRX$ekBp!kl}cV`T%R&#trgeLh^KDQgr3C_MRZZ`Tvp60T? zyv*J&2&R-M*c}_zx=qZx-(voVIfo{I*?b(}1W2Py5SWiWx!9dVo!$sRvsW(Y+?YI& zrf2sPc=|n$kTt-Mdfw|7>P5ouOtlzilG-Lw=c6rUvttEYb?qK`Sw*!-|B=YQU%lxx z9;ZA4Df#8(A1ef;*m^Ig7de%+f6dcCE#+X7tEuNfKHYnIt(5&P1+F5*O5Uzzm`=6w z6N`*n{iTwYm#D=B9m$nGz3`_*>FP>4^lDZl_*rc-P1U7kJ9F1y7%sUAQ97%Ao#2Z6 zcK}B+fDq6e#7sS6^|SR_gb(94w#hRZFY8Z(uWg;PV;)p$`CcG zJj7QQljQ+78z7r4CF{7UhNixSHJ*_U-nDL0=!&Q6L?se*tt-qLV!Xh3{MIhKUOXpj zzM*J^J_w(sDo(-Kd_t|JPQZY&wMQqmsHR-*JV5Qm)%cVXOJlQ;&s>RGi?0fzKEd>A zRbfQ(-vEHUCxJl)=RH9A_x>?KvSR{inhK&VB)_+`m2NtEtyZb4San7RK3}3WQWWXD zeT9{Lj9+&eYxTMJYHKh%X+4HqhC!COU#J4943bI-gJ%i%{ieIbQ$L>Yo zD0Tx#gt||xXD_CMJaG7f*Cz_a;9XzZts94S)i{3*x92AeZOKG|5+Mc2WRi}PH7>p) zaP9e;UT^DY|1nPx4R}>CX#sN^iW}hj%Uc`Uv&IW`cT?6W{rnOxE*a7NJn{y<9VC0k zCNpZ{@pP`TV?jpi6?XoUc`L-OXANylxshBeK6ow{;iv5Vj&LUiYN0x5P}HUP%sglu z!+*qn8F1!5^h5&AZq?rnC?_qp?!*Jp1H1 z`Z^UtBk%Q0CfIAuF@(YFdJTkn1r?YH&fu{dcrQr--63I^Q3^~Wr+lsFY+W$O=(CjT zX@00RtKT>*v0kZD?s1VX#jl#^E^0bF{qpVCiQRO>#t5aI0%+H9%JWCXNpa!$B-ZZy z5iScBkj1gyjo6FQ$hsKSS*U(mLPd3N&$x`bY_ZZV@9_U|wnHOUhLfL5ZaE~j;7N)CB|Ar1lyrLX>cbD`tH>X4;d5*12c^NsI<5Gz# zw@^DU9?gsV1pVI9q|2lHUo<>8y$Cq}>_DEBtEVfQLa~fc>{WW)7mCcwvNM;k+;HF# z->h9`^}-c?d+MC{V)H&`EpXe(0nf^+%+D-nDQuT1p%^>veXn>oQ)qOMjFmcz>lC~E zowsp;AGsJM#hpku(QUpW(W&8dK#7ZXo%T={PqyI0F|YBtOprrn3GdAi!5qmPg+*tP zyYfDjvcO6Zy|E(h^%~^E)J9|!!yXZGy+{BOzr3?@Qpv$&`N3+@Smx$~wEwa5jF{66 z^}YRCZzKK&=SAIX(BGL==Y60=nGR&qWAJaqIsjuwVR=Ya(1f>`hoofH?#mu$3kw|t zkHaoSiWq){-C618138Eki#=Rf*q-9dtF?bm6RdbwixqdHrrh%fyIK+GEKy<~Q0U>k z_|Aka1LOdxzfaAqr^bmicJY;A^G_Wht5EHFBtcWxO|cSkEK^c?Zv_ZLgay{vQVZ{6 z8GX3AB0@ihA zJHAN2Ti;p1fwlP~tY(g=?Slf@InF6zr46f$Ue@8ibc zeO6!%FODZ+)qZ^6?C%~R5Z71oj(AyfChX>)FDQ>%YxEp+TOA6ytwpWp zF4l6Ej`~!GNphFTd4{eQngG0ZPQIk-Y#ABwnOi5Rnnr|3hrZ8vZjkNIW2lGlI#_uX z6h^@Fc|=;1FMA{W5Jz_~BhoFsQQ-5-$Y2)%oC0k-vXQRNI;l?O20%N(*uKjJV(a}f z?(wEIC2yGALz|I$l%v$Ms)H(}vHHOaky#^2o0F3Y6vMn;uhHDhT+Zf>=5%jhZ}7Sb zoWi6`xMAOn1O&*9-O9k&qE{SqYSm=~Es0c8PlO zD5|~`ol+=C>+X^noGyB@@8GC>g&)hJyoIsnNn2cRsPItIYJJ)l$`B59R=aYMboDs{ z0D`nM-#1W&XkPrO67F&EIVzSSF; zZ9RyTnT--?ThfX;)m(BFjyn5D3tL)aH4PZC5>TCRa-!A{+mvd5EH=oYB=*pivIG&D zx`nmOQ+~>xLv>3;;-YuXNOLH+5}~M^&fyA@B@+%BiTLk;7E4DIkCzFG=H3!3AnF63>64+54CVHM6w~x9T+Z5q(4QFOC>mg~soVbwXs; zA1A)wL<{yH-}f{AZ>No!ZW!BvT^iMkN=!e3zXk73Ff8Uza@UY6?VU?07_w4#2Q)5@o%Q*q%2Ao>vrNWZ z8D{96{N~Hg5y)#$zy$5IkEDJ;N+wFm5#(UAjIEI2_6AAQ{(}(5FzpoItSsu;da!mf z30QECO>M{w*4|mJv`#7iCc3%&KGw=cZ$+L${(VMfAy$6sYh7eVqfF&cNjAr(UtZ2- zpIApfMivBPv?l!UbiXNWEVJ4t&5aQDaW4_o<)ArJDs?V9?FP73u4G%t&nkkR-2C+T zS8hOzXPdX*LsJk}+H5*J>In5lJ;q8H28csc=jVn`T8u z(&~^FZ;7w8v=)rA7^`hnrLh9eEt=H5sP+n3hKd3arZHtAT@w_{8NWDs)SehB47dnc zb{E7I>wsCU!$cp%k$yK{v7=C3vQa{UgJ2aC)(j`?5V1KqTjo5UUQN$~i@;EV{*LT1WL%)gs(6do6Lzw^TCxId5et=joJ;-pNZZU@OdvHOi4=M1-dtQ$WAp*u)wfo0bbV^p%><@cerx(mGt3DHP&Bt0pqFHfz>_Iepr^3 zg8~vo_Y>C(*sx!8^3kws)xrJP%VHCd1PSc@h<$2Y9g7TuN0NLD(9f5_veT7js{25v zmdlyN>g<54mU3NmRu0GDYVcm>*#EBgFuu<87@X8OE+OuJ^<8J|clHY<28=mwPV}+! z_%n4m95c`KpD!mhR5!XeX%*81Cu!2dfd*>Sk0fB)+#JeVT_`TCDi&!23ha{k*fAL6 z-p`y6u1MH}6{IReZTWlJ=kT9fwntxQwH6E3m2mYJ)}Qj`M9>F%QyCObe1b-P^MVOR zlZuf#d=#E{QWZ<_k`-AY0uc-uAf6+CP54ni?V*ffTJV6reY+`hxiq9Xop;fLbl+WW zzgHVLPnwb*9dhhrT3j8=YX4A~Y%<~?(Ml&o>%ZDI7bcCeXim$5)xLsz;ka>+6`y$( zRMYY`8i+(=3<>#SxLDy_=V%iL zIMmHuIk}R!A)SY1F3!M^G%#@3fJ4H8!W>K|>EJoi66ZEx;og7kvb=MR_M00Tm$6To zVXFE1=JPQ@d2bh6vT@M3+^y&^*rmx@MDMbr;NJc9|03q--$%U&L=Izlfr6)i1*!kNe8MqZ7a$8@XL}O4!^OdKy&=H?p~Nom1}wUJ*Og9 zMIXsbU4F~Dz!PQ6h2U75+x+X({s5em1-h_Ldc3MFf0N~Jqiv=T%;zn8|7nxb-+ohZ ziTIAdBBKTg(%|-CgNSz$>p^i&fL%D}I$5i4){jV$vemXA^=&g%`Sqcnp3Hhl%!75SWpO8g4zo8!Pho{*LiE2}PDr&0@?nOIu?o*H;~tqN zySsB3S=cHfL~3OtQ{yTKM36!@Z}>Q>kL_)Gu)bybxHfg(ZcUT_kF<1PIw>gQOI4h} zbgqlxJQ`0@_d3DaYDX%F&HiJ?WGC9rzZ zl;v<=>w@b`Yg{I)mo$gu=r-C&<}50<;QDcH;rbuH zWz6rnSnT!&$f&`;3j(m#BT{CV^|ZOA?uAKh?q=z1*M^0s+3NcoC>}$Uu3rv=QxPK0 zmVBwRknK?traDW+eX^(0B6#0tq?CuRv_u)Ynb+70Q{wf)pz1QfT9R^ODynUj}r14m-xT0j9nw-WyywOFVkfd%v+DjrrmcAjO3P zJm3X(y9z`(%G!4%h>@*i)$Bq`DImWNeHPPInik5A8%UY9|8J^q}bxkIMsfwchsIedzwi^#6% zZxWaqZ0kWaHOR&!*axLPtxnY_SBTD}z zF`k69Hdy}Ww?hL;ilWson`xU6<2)VdujT?dwLFsG%rhg;n~Ira(p`ywo>4S(3@{;PemSg_UUNm?`iWI-J^N+2(2dHJudZ_|f znA5tKt9o}l+IGp2eClibyHu7?A1Trlde`K~C-_(UoVqQyznrH_Wo`nd`^B<9hX#D# z-HHzV7=8J#%;J;<_@K@v63pJ&47dD=fO^!@5mlU4OC&n4C$%eT1 zzZ!6OdK<#jLPp=KA4QF`u7rGf!`ws2GZ?b3_1L%&C!7jbm zwV7TF&Jv(1SE!8cq!5E=&()-#Y&sgy>e2oJ3pQBwtb#nDxAhEOT#2_9QjMU(v4vLD zPp;5!)qPwTrZ3_B7;u4Wn`gphUCqPbIYM?s>4X?0N=WXVh`<(>g3qcS5j&T$S>Fnw ziUE#XY1GJghmuIOXt}x#)nhgCFQkjBVT_}^_b76L)EK_3avMaGRd>U@EHdmrKNew4 zq-==)NWGO~))4tj&z{mDb&PLgUWX+PPS5h>Goj3|i_x+#K`OhC+dj2cTZ>f-`loDd z$HE=LruQ%Z&lupniMT9TIc7+ADV0mtSFnHLV|m23cq+{WHCm@Y9fo*Jd2R}hjUSZxdf4%5%9PWms% z9RDnxHbd)-I_nsg`TrBvWBh?@BY$_gcyNt>HU_K*d|3RJf`vh5oUuNUE zqW2c>8b0e>rKT)}wgK*;26t#7HHfX2D07-pmm5+pcikW6wAz#lHucOoL+u>fEF)_f z4M2r0`A71|Bjfysnd)5TB+fj2^G2N9DG{QygyJT6hxVOy8@M)97bUPpmM?r)(%PN8 z?rGfGq%<&vyEFYXiu)hFhEGwkTC$kNlKPQ$8pMjqzkUrf-rG1D;-bm)&6F80RaUDA zeJ-{}Paz|)d9^zTcK9g)XpJM?B?gojs@d=^TOauvi{_3+y@-Ll;ggvx;HeJ;u7m<7 z(%3#E`L3A9P~aEnw7ZG)wHOli3umdgr?-#XE5+Zm{b?b?)>>T?pWt8sXTz2H@O;`& zhCe6FYC>9$-mzAcGoa^Cw5<*p1qKVZ-l3k^)zmOR57e8W8H-*(YBFc2xHKz)UZ|P3Mif*S)FH310JQ&~pZzF;^q9TWxg(c8$A=DN3;<(v&7;r58~tf`IfYy?27Z3euznLYH6w zg;nViP`V^El@%C6q-7y%T<6SJ8cb@ALnA&g(fjIrrSjNpin;?#$eo`OG*x z$tbaP>hF|H*LS|~9{RwdOCKFv&C5x9IpSP+?5Dn)mg14wm|2ExPGBue*C!pOF&-5` zqM1{k%1$4k^5vbGaD^Rq5Lk7L z8*?uPI1n+v@6I!BA*k=GAv}Y+pC^v>yAvxW>*RPf>ls=O)mE$$x)4fb zEB&$9Mn8;RjPbmAmAuqX2dA0rH=s!di@f(Stum{-H4-qAj0+QlmpD5%E z(ba}uTd(cLMR`RjLc5A7^(f#0zdMs6hwm2Uq#mOJ4%$u}(<%ud8KpGMqKa&)znV?H zYsM+~X`eT^LxI*eh)hTv*VN_AXT1iH)q$GQx9CB_jXpqOS=;2+`4#W3Y0{_9dXU_v zyQ#csrD8T8Eguv^^kwH|F-d&~sac!ssKMdiO=r3|+S<_=DR_BLZ<^K!^H32JTI0CrYTVHENXI?F_&A~Ft(1)#qzC7BOMiFXo9R_?a6hW zFsx>c7<9d2W2ky;U4pxD#oKm{KdSBNQDXt~pt$Bs)G_BbtS)LZfIBmu`KfO12Bhk#ME&HY323v0#-^uMJQxp~vb?QfbYjp3{WjE#Xffy&Y(9Pv^dgw_!+p7(-jB=oO;T5$jESR`Z-lG>>*;izzZYbVgJv zFD@>bdf_cKpT>-+Q;Knrf31U2!bghuH?^>tS-Pua;0UWv70cL%B|%Og*FaV;e}1JS++)-8LLt+L{pjO za&9ch!`zGqt=FQd_`z?t+!b;-m@l?U=U(%UhCOths=wXB;@GBa?<<|%G7IxpHf>*= zVQ`TMhvUL!1fZAyp>jMh$D>)lvKarcx3#@%K^$r7lOC#Js6gGY76zNU%oA2_`nkyg z&>&ClVMGhn6Lk-vFfx6q@(5GmkkT+4dh>~OpmT<&HQJ_-P&spC>Jv98hNnEuSNJfI z2UcFg4*H|h@XhiL`MW4zg`2>U`&W&X{5PZb>w@tDDHfLa)U3PDf$}L@OLdfQ%X|F1 zA$xhpGt@zy(uegjpJ#iW3oOZ2CQ<6!XZ#p~yLlQkNZ8sQK67(V%CcVM^>$ea*jay$ z*Q*RVw8`FPHly}=rF`(0h!01_j^1b8X(mdbGa$@wLI*ppLrXOev|HUWiMyRmJr6UL zzTQJtkeetjemy3N+%jBpS@Woyj3q^@9DVUsp3JqWbOr$MQ5aj=(oB*v%iC?ySJhsY zyQzrSk}pZ=;^{E_yT$rE-6?6RD)mS_&zOc+3`acAgJ$7*JDl`!p_&OwnWV4vo!irW zUmS)ig3eD?64wo*vPa%C4ucxgyG`>53i|}wi5FiTb8v!tfu7m8ORZ{b?mg1p5TApo zhB^;)K9a+IW!JoC%WHET*bO&+egP6Y>cjsbA%9d-kjea9fW^f4_7Xk*#^FebmYxdE z<(AZ0{7=EUg3#cr#QgAm|2IWc+eW?CGSa(;lJeMemt1K3^%OZN47_9K_HGL^WhVC`ZI!YMWB-{s(nn~!(!loNlR(B<*%k8

;72_IAvL6kfB)3a(leO8Yc(|>pmjz&q7TM1=B z@Iph%-6ydk+;xO2vG5@?A}mHo-ZDLAN+l zRl)#zCKVm`l?Dcuy(=c92We>BTXS3jyQGghx<@Cb`a$r<)~&zWy8Xj9{5*tvs5(m6 z^m}(kSZx_O7`awI09nbAK1f&r9ddXt4_q2kp+)5a;&`P4iez=}*{x)u3>+sSuw6Mk zz?$NIcbi6v0s+z-9#ezXxA4U=hL?w;*QPttFG>q;O8c0z3HpA3BxH3gp2EH(uZKdC}68435#d z?FlU41}oo-l2;J#x~EbJt!zIwf~q`cr9Ip?epXp)?=heTtc-G@EnpmexyRaEB#mp| z;DN~|fw5ybfEh|gJ%25(p?b+uH}Fju1k$j)qgAsmGpa6D-R8k<{T7s6o zR|Z18cPHHGf#kkil)$3%G;d=fxziFF32tmp(P|EUwp#+Q73d_t{4Vh>evZ5o1_Cqm z1|(Yt+qOZGr1XYLbw@PQ?HqxP`tqb%GhP@ZX-KOgmycN-Aklp6shH7=C}hW+LJSeA zh%SuW)zf8rad>0Mx_7DZP~F@%qWco;X6YcKI6@cEzdV5R5Qt0e2V~!7hf<);&b?Cc zyj?J@N#P$I-2az?Hv#c$RI^nxoG`ifaNB(8!awx~2r!wc0*-f=k(Dm(pRKcLljIK$%-1Mc0lc=Omsx6A`X=2uv?xm(?=$oiyUQ1h$RmUTlXyt0&wn=m)uUw1c z#y-m>eh%Y(Pq~;igA65Mo?G1enYCkn8Mc-&`Ie74jC)lZUGc+$@!R1nX7}e+%}tOV zkpNLXO00T3YsbDv!{_E?H;B7`y~LPvNllHBr!^s}lk4 z*r`|u>JOaWJb_C=j;%J6CYG|!5Eld|qXhvyjH=vGM|^9_NQfDVk%MIhu9zQPKb(G! z=NNsG_Sya!o?C77Q|uZ`G(uLa%rxW08jZ2baeb1=yFN$f{16Vx9KAw^#3VP3hg8C? z%zDzaJsjW$nsZS;aTZ~`+2mJswgLq($aS!;hTsd^gG@KYir=AIVY%}K0(hk_-IB!& zTL!-8&{PI@=$qa2Oj_ZlcT#h#Qy2VEtO1+iO=^Z(BjgSwqmtF(+HuCv)^KU5qU5Q( z`g8MHYrO?Jvkx_SC)D=*!@V0P1+dlvnSE4w}?-tIG^~pVI!oUJ{_}NW?ioqJSYUTv~BrX z+yf8bYaH;^QeG=QwDdYA9bv)pLUDFmmi<7)Q*|EK9NMUBlU0Bh=9vVmlqYlmoI)pM5;O$GzB%9QslH#~ zM8RxwE|jj1l7k&07`{))!E}gKz9>HvVZcf2*KMFuS5=vpO|I=uGb)@ul#+@_)b-A& zh1&~QX27J>V9eprTH5vNz~=L^5n#5<#jZ_M7GoRTd#3fxavT9(-JRyZj8F2o4jTte{cj+dC_K))rq1(P4?kPal9?abcT zQ{UmZa>Qkr>cV=pF}}0edyLWalhUxSQsNr8JGAYKQo|R9*!Pt!anU)39DekFO7=4{ z&E&Nq!)JMOocL@V-={UhO)reU9mu+mHgTH$m7Yr z-rA>nuGWX6sQ%-_eHvncbN1j1Kl?!NI5!gf}QDu zz1|VFF#2py3o;Hh#%AH{CX5P8_o`y8SX`OdRD@-Fv4trutm#H2SEsk~=$Bv(kqFYCYrKt?S}f`MK;ZRHT{MP=-Vhfuh6qJpnAtrBPDl0;l^-Q z@JF8mB&cm(N^|IDXri47kbv`?*|?mqc9W3${=^D=Jh-xJboNQ7hJHdWmR9TPsk0?InRnm!2j4f&m!5KE#P z@zh;nyePz2zd>os$aeJg)q<;_A?q(CHY0oo#Z`M!{LP~8E>`QO4)wLp z#PalypRKUSQ#d(@v7r5j=A{eKT*(YrJ0kdqsbxUR>n5Z~UTRV)lron=aH1lO+v^x$ z?rkS_ZK(JM7v`Ffp)Y0QUDpwV2xy|+mRToVEJn*A<(VatbUlJ4pTcf+qQM|)5Kv(6 zzm~G8d(icz_8rai#LOpq>ZoVDI+&r0g9h=P{MbA6I*!d*h@C7WX}bhh|CgIuH6?Dx z55N1S9*`QIHlL*(b+afq6F@#!RoWg(25pS*6m-Un9OpM9;ZMwbz%cQWBDD%N^X>(T zF2JkBt~L*a+(gjM9}~PO#_sy%SyhF+4RDd0a*KorFDKo3?7d@Cm@yS66T3^CZTfQz z*@AB?y8?o#x1DOzHtbHCA6UG~#dRyKbiwr`1P$I)j~7HuRv7=NBf(0{cbaue>4Fmc z;Y+KehPBbEhl)s+?H5UXKC~Gn$9*b!G+Si{2g+wLc0$1c0&@qF zEN+~+VSZczPhsD~6r}Cd5AwBsY~8=hMReO%OngYxJd4=(*1V+u8WEar>pXr9Dt?BzGf-KPAw~w%@ zpI-b@r&q-qMbmfxnm+poQj|bPpifYK-=)i0664j1P?Z{NTUPoe6Y9$cfkX z&#V41F4`iPF9OGOk3)XUeP8?OOwkB|p1*@%{_DRmz|!dk9|-(O{9ow57~mHJ{E`5_ zB)~5f@Jj{!vH{NY`p<(i8z6b1eT|6de1fWito|>1;3q5T$J6>{5dPmb2#-!yhJ-H> z5fRnjIw>fY{U{N$ecpT6VoFB>7gjNHMGQ2*!rDjAdUE;WV9*)M(@{7xlaG;-*q^`G + } + + if (isAuthenticated) { + return + } + + // Guest: allow only routes explicitly marked public. + const isPublicRoute = matches.some((m) => (m.handle as RouteHandle | undefined)?.public) + if (isPublicRoute) { + return + } + + const returnTo = encodeURIComponent(location.pathname + location.search) + return +} diff --git a/frontend/src/app/AppShell.tsx b/frontend/src/app/AppShell.tsx index b295bed..f058aa1 100644 --- a/frontend/src/app/AppShell.tsx +++ b/frontend/src/app/AppShell.tsx @@ -142,7 +142,7 @@ function ComposeButton({ compact }: { compact?: boolean }) { width: '44px', height: '44px', borderRadius: 'var(--radius-full)', - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', display: 'flex', alignItems: 'center', @@ -166,7 +166,7 @@ function ComposeButton({ compact }: { compact?: boolean }) { width: '100%', padding: '0.75rem 1rem', borderRadius: 'var(--radius-full)', - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', fontFamily: 'var(--font-body)', fontWeight: 'var(--font-weight-semibold)', @@ -338,7 +338,7 @@ function NavRail({ compact }: { compact: boolean }) { minWidth: '16px', height: '16px', borderRadius: 'var(--radius-full)', - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', fontSize: '10px', fontWeight: 700, @@ -659,7 +659,7 @@ function MobileTopBar() { width: '36px', height: '36px', borderRadius: 'var(--radius-full)', - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', display: 'flex', alignItems: 'center', @@ -827,6 +827,9 @@ export function AppShell() { return ( <> + + Skip to content + {/* Desktop & tablet layout */}

+ pulse + + ) +} + +export function PublicShell() { + const location = useLocation() + const returnTo = encodeURIComponent(location.pathname + location.search) + const loginHref = `/login?returnTo=${returnTo}` + + return ( + <> + + Skip to content + + +
+
+ + + +
+ +
+ +
+ + +
+ + ) +} diff --git a/frontend/src/app/router.tsx b/frontend/src/app/router.tsx index a55a3d5..5e4e3af 100644 --- a/frontend/src/app/router.tsx +++ b/frontend/src/app/router.tsx @@ -6,8 +6,7 @@ import React, { Suspense } from 'react' import { createBrowserRouter, Outlet } from 'react-router-dom' -import { AppShell } from './AppShell' -import { AuthGuard } from './AuthGuard' +import { AdaptiveShell } from './AdaptiveShell' import { GuestGuard } from './GuestGuard' import { RouteErrorBoundary } from './RouteErrorBoundary' import { FullPageSpinner } from '@/components/FullPageSpinner' @@ -67,13 +66,12 @@ export const router = createBrowserRouter([ errorElement: , }, - // ── App shell (auth-protected) ───────────────────────── + // ── App shell ────────────────────────────────────────── + // AdaptiveShell renders AppShell for authed users, PublicShell for + // guests on routes marked `handle.public`, and redirects guests to + // /login on every other (private) route. { - element: ( - - - - ), + element: , errorElement: , children: [ { @@ -156,9 +154,10 @@ export const router = createBrowserRouter([ ), }, - // ── Profile routes ────────────────────────────────── + // ── Profile routes (public) ───────────────────────── { path: '/:handle', + handle: { public: true }, element: ( @@ -167,6 +166,7 @@ export const router = createBrowserRouter([ }, { path: '/:handle/replies', + handle: { public: true }, element: ( @@ -175,6 +175,7 @@ export const router = createBrowserRouter([ }, { path: '/:handle/media', + handle: { public: true }, element: ( @@ -183,6 +184,7 @@ export const router = createBrowserRouter([ }, { path: '/:handle/likes', + handle: { public: true }, element: ( @@ -191,6 +193,7 @@ export const router = createBrowserRouter([ }, { path: '/:handle/followers', + handle: { public: true }, element: ( @@ -199,24 +202,27 @@ export const router = createBrowserRouter([ }, { path: '/:handle/following', + handle: { public: true }, element: ( ), }, - // ── Post / thread ─────────────────────────────────── + // ── Post / thread (public) ────────────────────────── { path: '/:handle/status/:postId', + handle: { public: true }, element: ( ), }, - // ── Photo lightbox (modal route) ──────────────────── + // ── Photo lightbox (modal route, public) ──────────── { path: '/:handle/status/:postId/photo/:idx', + handle: { public: true }, element: ( diff --git a/frontend/src/components/Badge.tsx b/frontend/src/components/Badge.tsx index ba297cc..300bb48 100644 --- a/frontend/src/components/Badge.tsx +++ b/frontend/src/components/Badge.tsx @@ -33,7 +33,7 @@ const VARIANT_COLORS: Record = { color: 'var(--color-warning)', }, accent: { - bg: 'var(--color-accent)', + bg: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', }, } diff --git a/frontend/src/components/Button.test.tsx b/frontend/src/components/Button.test.tsx index bb0acd9..112c578 100644 --- a/frontend/src/components/Button.test.tsx +++ b/frontend/src/components/Button.test.tsx @@ -12,7 +12,8 @@ describe('Button', () => { it('applies primary variant by default', () => { render() const btn = screen.getByTestId('btn') - expect(btn).toHaveStyle({ background: 'var(--color-accent)' }) + // Primary uses the deeper accent surface so the light label meets WCAG AA. + expect(btn).toHaveStyle({ background: 'var(--color-accent-strong)' }) }) it('applies secondary variant', () => { diff --git a/frontend/src/components/Button.tsx b/frontend/src/components/Button.tsx index fcc5d70..39c114f 100644 --- a/frontend/src/components/Button.tsx +++ b/frontend/src/components/Button.tsx @@ -23,7 +23,7 @@ export interface ButtonProps extends ButtonHTMLAttributes { const VARIANT_STYLES: Record = { primary: { - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', border: 'none', }, @@ -145,7 +145,7 @@ export const Button = forwardRef(function Button pointer-events: none; } .pulse-btn:not(:disabled):hover.variant-primary { - background: var(--color-accent-hover); + background: var(--color-accent-strong-hover); } .pulse-btn:not(:disabled):hover.variant-secondary { background: var(--color-surface-raised); diff --git a/frontend/src/components/ConfirmDialog.tsx b/frontend/src/components/ConfirmDialog.tsx index fed6bb1..828860f 100644 --- a/frontend/src/components/ConfirmDialog.tsx +++ b/frontend/src/components/ConfirmDialog.tsx @@ -104,7 +104,7 @@ export function ConfirmDialog({ style={{ padding: '0.5rem 1.25rem', borderRadius: 'var(--radius-full)', - background: danger ? 'var(--color-danger)' : 'var(--color-accent)', + background: danger ? 'var(--color-danger)' : 'var(--color-accent-strong)', color: danger ? '#fff' : 'var(--color-accent-contrast)', fontFamily: 'var(--font-body)', fontSize: 'var(--text-sm)', diff --git a/frontend/src/components/FollowButton.tsx b/frontend/src/components/FollowButton.tsx index dda63c8..8aa5c86 100644 --- a/frontend/src/components/FollowButton.tsx +++ b/frontend/src/components/FollowButton.tsx @@ -280,7 +280,7 @@ export function FollowButton({ disabled={isLoading} style={{ ...btnBase, - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', border: 'none', opacity: isLoading ? 0.7 : 1, diff --git a/frontend/src/components/IconButton.tsx b/frontend/src/components/IconButton.tsx index 535d421..3f0fe75 100644 --- a/frontend/src/components/IconButton.tsx +++ b/frontend/src/components/IconButton.tsx @@ -38,7 +38,7 @@ const VARIANT_STYLES: Record = { border: '1px solid var(--color-border)', }, accent: { - background: 'var(--color-accent)', + background: 'var(--color-accent-strong)', color: 'var(--color-accent-contrast)', border: 'none', }, diff --git a/frontend/src/components/MediaGrid.tsx b/frontend/src/components/MediaGrid.tsx index eb84b7a..1ce09b3 100644 --- a/frontend/src/components/MediaGrid.tsx +++ b/frontend/src/components/MediaGrid.tsx @@ -198,7 +198,7 @@ function MediaItem({ > {altText} setLoadFailed(true)} width={item.width ?? undefined} diff --git a/frontend/src/components/PostCard.tsx b/frontend/src/components/PostCard.tsx index 7956091..3ca7e40 100644 --- a/frontend/src/components/PostCard.tsx +++ b/frontend/src/components/PostCard.tsx @@ -366,7 +366,6 @@ export function PostCard({ post, noNavigate = false, embedded = false }: PostCar