openvibers/afresume Commits

Full redesign for 2026: OpenVibe network era

OP OpenVibers committed 19 Sept 2026 · 0a56a40d8d · 128 files, +3337 −3019

- New visual system: night palette with electric blue / ember / mint, aurora canvas hero,
  kinetic name reveal, scramble role rotator, floating pill nav with section spy, custom
  cursor, spotlight + tilt cards, magnetic buttons, count-up metrics, scroll-filled timeline,
  bento network showcase with animated architecture diagram, filterable project grid,
  light theme, Lenis smooth scroll. GSAP/Splitting/Swiper/Lottie/tsparticles dropped.
- Content rewritten around what exists now: OpenVibe (7 services, 20+ domains) replaces
  every Hobo-era reference; PowerChat contract role (developer API platform, payments
  program) added; Amazon Data Analyst dated 2024 - Mar 2026; 13 new project case notes.
- Single source of truth: src/data/profile.json + content collections feed the site and
  resume/build_resume.py, which regenerates public/Alex_Frison_Resume_Sep_2026.pdf.
- Fresh screenshots of the live OpenVibe sites (webp), new AF mark + favicon + OG image,
  sitemap integration, README rewritten for the GitHub Pages workflow; legacy nginx
  deploy scripts removed.

Changes

ddiff --git a/.gitignore b/.gitignore
iindex 7452216..a8e5719 100644
---- a/.gitignore
++++ b/.gitignore
@@@ -6,5 +6,3 @@ dist/
*.log
.DS_Store
__pycache__/
--Alex_Frison_Resume.pdf
--fontawesome-webfont.ttf
ddiff --git a/README.md b/README.md
iindex b5f6e03..3a26319 100644
---- a/README.md
++++ b/README.md
@@@ -1,71 +1,55 @@
# alexfrison.net
--Personal site & portfolio for Alex Frison. Built with [Astro](https://astro.build/),
--fully static, **zero CDN dependencies** in production (every JS/CSS/font is
--vendored under `public/assets/vendor/`).
++Personal site, portfolio and resume for Alex Frison. Built with [Astro](https://astro.build/),
++fully static, **zero CDN dependencies** in production (fonts, icons and the one JS library are
++vendored under `public/assets/vendor/`). Deployed to GitHub Pages on every push to `main`
++(`.github/workflows/deploy.yml`), served at https://alexfrison.net via the `public/CNAME` file.
## Quick start
```bash
npm install
--npm run vendor:fetch # downloads pinned libraries into public/assets/vendor/
npm run dev # http://localhost:4321
npm run build # outputs dist/
npm run preview # preview the built site
++npm run vendor:fetch # re-download pinned vendor libraries (only needed after editing the list)
++npm run resume:pdf # regenerate public/Alex_Frison_Resume_Sep_2026.pdf (needs python3 + reportlab)
```
--## Customizing
++## Where the content lives
--- **Portrait:** drop a transparent PNG at `public/assets/img/alex-cutout.png`
-- (~700×900). The hero will use it automatically; until then a styled
-- placeholder is shown.
--- **Resume PDF:** place at `public/Alex_Frison_Resume.pdf`.
--- **Content:** all resume entries, projects, and skills are content
-- collections under `src/content/`. Edit JSON / MDX, rebuild.
--- **OG image:** `public/assets/img/og.png` (1200×630 recommended).
++Everything the site and the PDF say comes from one set of files, so they never drift:
--## Deploy (self-hosted Nginx)
++| What | Where |
++|---|---|
++| Name, pitch, contact, metrics, network tiles, "open to" | `src/data/profile.json` |
++| Roles / experience | `src/content/experience/*.json` (sorted by `order`) |
++| Skill groups | `src/content/skills/*.json` |
++| Projects and case notes | `src/content/projects/*.mdx` (frontmatter + body) |
++| Site screenshots for the network section | `public/assets/img/sites/*.webp` |
++| Portrait | `public/assets/img/me-cut1.png`, `me-cut2.png` |
--```nginx
--server {
-- listen 443 ssl http2;
-- server_name alexfrison.net www.alexfrison.net;
++Edit JSON or MDX, run `npm run build`, and push. To refresh the PDF after a content change run
++`npm run resume:pdf` and commit the regenerated file (the filename is read from
++`profile.resumePdf`, so bump it there when you want a new dated version).
-- root /var/www/alexfrison.net/dist;
-- index index.html;
++## Structure
-- # gzip + brotli
-- gzip on;
-- gzip_types text/plain text/css application/javascript application/json image/svg+xml;
-- brotli on;
-- brotli_types text/plain text/css application/javascript application/json image/svg+xml;
++- `src/layouts/Base.astro`: head, SEO and JSON-LD, theme boot, smooth scroll (Lenis), reveal
++ animations, custom cursor, spotlight and tilt cards, magnetic buttons.
++- `src/components/`: `Hero` (aurora canvas, kinetic name, scramble rotator), `Metrics` (count-up),
++ `Marquee`, `Now`, `Network` (bento + architecture diagram), `ProjectGrid` (filterable),
++ `Timeline`, `Skills`, `Contact`, `Nav`, `Footer`.
++- `src/pages/`: `index`, `resume`, `portfolio`, `portfolio/[slug]`, `404`.
++- `resume/build_resume.py`: reportlab PDF builder driven by the same content files.
++- `scripts/fetch-vendor.mjs`: downloads the pinned vendor files.
-- # immutable cache for vendored assets
-- location /assets/vendor/ {
-- add_header Cache-Control "public, max-age=31536000, immutable";
-- try_files $uri =404;
-- }
-- location /_astro/ {
-- add_header Cache-Control "public, max-age=31536000, immutable";
-- try_files $uri =404;
-- }
++## Deploy
-- # HTML: no cache
-- location / {
-- add_header Cache-Control "no-cache";
-- try_files $uri $uri/ $uri.html /404.html;
-- }
--}
--```
--
--Build, then sync `dist/` to the server:
--
--```bash
--npm run build
--rsync -avz --delete dist/ user@host:/var/www/alexfrison.net/dist/
--```
++Push to `main`. The workflow builds with Node 20 and publishes `dist/` to GitHub Pages. The custom
++domain is configured in the repository's Pages settings and pinned by `public/CNAME`.
## License
--Code: MIT. Vendored libraries retain their own licenses — see
--`public/assets/vendor/README.md`.
++Code: MIT. Vendored libraries retain their own licenses, see `public/assets/vendor/README.md`.
++Content, copy and images are © Alex Frison.
ddiff --git a/astro.config.mjs b/astro.config.mjs
iindex 7beee48..851c3f5 100644
---- a/astro.config.mjs
++++ b/astro.config.mjs
@@@ -1,9 +1,10 @@
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
++import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://alexfrison.net',
output: 'static',
trailingSlash: 'ignore',
-- integrations: [mdx()],
++ integrations: [mdx(), sitemap()],
});
ddiff --git a/build_resume_v13.py b/build_resume_v13.py
ddeleted file mode 100644
iindex 29c1d8d..0000000
---- a/build_resume_v13.py
++++ /dev/null
@@@ -1,595 +0,0 @@
--"""
--build_resume_v13.py — Alex Frison resume (2026 edition).
--
--Improvements over v12:
--- Pulls the rich detail that lives on alexfrison.net (SOX/IRDR work,
-- Anthropic SQL copilot, autonomous root-cause bot, OpenVibe 15-microservice
-- kernel, HoboQuest custom engine, GameServerStats LLC scale, Verizon
-- district-level recognition).
--- New "Impact at a glance" metrics strip on page 1 (recruiter-skim friendly).
--- Tighter typography, denser content, fewer wasted bands of blank space.
--- Page 1 = pitch + first three roles (recent + revenue-relevant).
--- Page 2 = remaining roles, six featured projects with live URLs, full
-- technical stack, education + links footer.
--- Same palette so it stays visually consistent with the site.
--
--Run:
-- cd /opt/repos/alexfrison.net && python build_resume_v13.py
--Outputs:
-- Alex_Frison_Resume.pdf (next to the script)
--"""
--
--from reportlab.pdfbase import pdfmetrics
--from reportlab.pdfbase.ttfonts import TTFont
--from reportlab.lib.pagesizes import letter
--from reportlab.lib.colors import HexColor, white
--from reportlab.pdfgen import canvas
--from reportlab.platypus import Paragraph
--from reportlab.lib.styles import ParagraphStyle
--
--pdfmetrics.registerFont(TTFont('FA', 'fontawesome-webfont.ttf'))
--
--PAGE_W, PAGE_H = letter
--
--# --- palette ----------------------------------------------------------------
--BG = HexColor('#eef2f7')
--BLUE = HexColor('#4f84d6')
--BLUE_DARK = HexColor('#2a4f90')
--BLUE_LINE = HexColor('#7ea8ee')
--BLUE_SOFT = HexColor('#5f92de')
--TEXT = HexColor('#34548f')
--SUBTLE = HexColor('#5a73a8')
--SHADOW = HexColor('#d9dee8')
--CARD_BG = HexColor('#f8fbff')
--ACCENT_GOLD = HexColor('#c98b1f') # used only for metric numerals
--
--# --- styles -----------------------------------------------------------------
--BODY = ParagraphStyle('Body', fontName='Helvetica', fontSize=9.6, leading=11.4,
-- textColor=TEXT, spaceAfter=0)
--COMPANY = ParagraphStyle('Company', fontName='Helvetica-Bold', fontSize=9.6,
-- leading=11, textColor=BLUE)
--LOCATION = ParagraphStyle('Location', fontName='Helvetica-Oblique', fontSize=8.6,
-- leading=10, textColor=SUBTLE)
--BULLET = ParagraphStyle('Bullet', fontName='Helvetica', fontSize=8.6,
-- leading=10.0, textColor=TEXT)
--STACK = ParagraphStyle('Stack', fontName='Helvetica-Oblique', fontSize=8.2,
-- leading=10, textColor=SUBTLE)
--CARD_TITLE = ParagraphStyle('CardTitle', fontName='Helvetica-Bold', fontSize=10.7,
-- leading=12, textColor=BLUE_DARK)
--CARD_DESC = ParagraphStyle('CardDesc', fontName='Helvetica', fontSize=8.35,
-- leading=9.6, textColor=TEXT)
--PRODUCT_TITLE = ParagraphStyle('ProductTitle', fontName='Helvetica-Bold',
-- fontSize=10.0, leading=11.2, textColor=BLUE_DARK)
--URL_STYLE = ParagraphStyle('URL', fontName='Helvetica', fontSize=8.4,
-- leading=9.2, textColor=BLUE)
--LEARN = ParagraphStyle('Learn', fontName='Helvetica', fontSize=8.7,
-- leading=10, textColor=TEXT)
--EXP_TITLE = ParagraphStyle('ExpTitle', fontName='Helvetica-Bold', fontSize=13.4,
-- leading=15.4, textColor=BLUE_DARK)
--METRIC_NUM = ParagraphStyle('MetricNum', fontName='Helvetica-Bold', fontSize=22,
-- leading=24, textColor=BLUE_DARK, alignment=1)
--METRIC_LBL = ParagraphStyle('MetricLbl', fontName='Helvetica', fontSize=7.8,
-- leading=9.2, textColor=TEXT, alignment=1)
--
--# --- content ---------------------------------------------------------------
--PROFILE = (
-- "Data analyst and systems architect with 10+ years building and shipping "
-- "production systems. <b>1,000+ SOX-compliance IRDRs personally researched "
-- "at Amazon ICQA</b>; built an Anthropic SQL copilot and autonomous "
-- "root-cause-analysis agent in daily use. Solo architect of a "
-- "<b>15-microservice open-source platform kernel</b> (OpenVibe), a "
-- "live-streaming stack (OpenVibe Live), and a 14-service identity network. "
-- "Previously <b>district top performer &rarr; Assistant Manager at Verizon "
-- "Wireless</b>, coaching 4&ndash;8 reps."
--)
--
--METRICS = [
-- ('1,000+', 'SOX IRDRs hand-researched', '\uf002'),
-- ('15', 'OpenVibe microservices shipped', '\uf233'),
-- ('200K+', 'Live game servers tracked', '\uf11b'),
-- ('20+', 'Amazon TamperMonkey/<br/>Python scripts','\uf085'),
-- ('10+', 'Years running my own LLC', '\uf0b1'),
--]
--
--TOP_FEATURE_CARDS = [
-- ('\uf201', 'Analytics /<br/>Data', [
-- 'SQL, Power Query, Excel, dashboards',
-- 'SOX-compliant IRDR research + LLM agents',
-- ]),
-- ('\uf085', 'Robotics /<br/>AFM', [
-- 'Amazon Robotics (ARS) floor monitor',
-- 'Pod / drive / workstation troubleshooting',
-- ]),
-- ('\uf07a', 'Sales /<br/>Leadership', [
-- 'Top performer; district-level recognition',
-- 'Assistant Manager; coached 4&ndash;8 reps',
-- ]),
-- ('\uf03d', 'Product /<br/>Engineering', [
-- 'OpenVibe: 15-service platform kernel',
-- 'OpenVibe Live, HoboQuest, OpenVibe Network',
-- ]),
--]
--
--EXPERIENCE = [
-- {
-- 'title': 'Data Analyst — ICQA',
-- 'date': '2024 - March 2026',
-- 'company': 'Amazon · PAE2, Arlington WA',
-- 'bullets': [
-- 'Own SOX-compliance IRDR workflow &mdash; <b>hand-researched 1,000+ inventory mismatches</b>, authored reporting satisfying Sarbanes-Oxley audit trails.',
-- 'Authored an Anthropic-powered <b>SQL copilot</b> + an <b>autonomous root-cause-analysis agent</b> that plans, gathers evidence, and writes complete IRDRs end-to-end &mdash; collapsing hours of manual research per defect into seconds.',
-- ],
-- 'stack': 'SQL · Excel / Power Query · Python · Anthropic API · TamperMonkey · SOX Compliance',
-- },
-- {
-- 'title': 'Amnesty Floor Monitor (AFM) — Amazon Robotics',
-- 'date': '2023 - 2024',
-- 'company': 'Amazon · Robotics launch site',
-- 'bullets': [
-- 'Monitored Amazon Robotics (ARS) automation during launch-stage operations &mdash; enforced amnesty zones, cleared obstructions, kept pod and drive-unit flow safe.',
-- 'Investigated recurring pod, drive, and workstation defects on the floor; documented patterns and escalated to RME and ops leadership to drive process improvements.',
-- ],
-- 'stack': 'Amazon Robotics · AFM protocols · Floor safety · Hardware diagnosis',
-- },
-- {
-- 'title': 'Assistant Manager / Sales Representative',
-- 'date': '2020 - 2023',
-- 'company': 'Verizon Wireless',
-- 'bullets': [
-- 'Consistently ranked among <b>top performers in the district</b> &mdash; hit and exceeded monthly quotas across smartphones, plans, accessories, device protection, financing, and Verizon Visa offers.',
-- 'Promoted to Assistant Manager; mentored and coached a team of 4&ndash;8 reps through weekly 1-on-1s, floor coaching, and monthly workshops on objection handling, upselling, and customer retention. Led store opens / closes, inventory, escalations, and daily huddles.',
-- ],
-- 'stack': 'Consultative Sales · Team Leadership · Coaching · Retail Ops · Quota Attainment · Customer Retention',
-- },
-- {
-- 'title': 'Founder · Systems Architect · Principal Engineer',
-- 'date': '2022 - Present',
-- 'company': 'OpenVibe Network',
-- 'bullets': [
-- 'Sole architect and engineer on <b>OpenVibe</b> &mdash; a 15-microservice open-source platform kernel: distributed event bus, OIDC/OAuth2 identity, media object store, live ingest + restream, real-time chat, billing ledger, AI/search backbone. Self-hosted alternative to Twitch + YouTube + Patreon + Discord. 16 phases documented, 11+ shipped.',
-- '<b>OpenVibe Live</b>: live-streaming platform from scratch &mdash; WebRTC SFU, HLS, multi-destination RTMP restream (OBS &rarr; Twitch / YouTube / Kick), auto-recorded VODs, clip detection, chat, voice channels, analytics, moderation, and an embedded in-stream browser game. Fully open source.',
-- '<b>HoboQuest</b> (browser MMORPG) + <b>OpenVibe Network</b> (SSO + OAuth2 across 14 services): custom isomorphic engine with Source-Engine-style client prediction, 4 live game instances; shared themes, notifications, cross-domain sessions.',
-- ],
-- 'stack': 'TypeScript · Node.js · Express · PostgreSQL / SQLite · Redis · WebRTC · WebSockets · OAuth2 / OIDC · FFmpeg · Lua · C#',
-- },
-- {
-- 'title': 'Founder · Developer · Systems Admin',
-- 'date': '2015 - Present',
-- 'company': 'GameServerStats, LLC',
-- 'bullets': [
-- 'Built analytics platforms tracking <b>200,000+ live game servers</b>; #1 Google result for several major titles, licensed to third-party sites under written agreement.',
-- 'Self-built and collocated 1U / 2U servers in datacenters; designed ingestion, dashboards, DDoS resilience, and ran the entire LLC &mdash; licenses, taxes, partner relations &mdash; for 10+ years.',
-- ],
-- 'stack': 'Node.js · PHP · Python · MongoDB · MySQL · Redis · NGINX · Linux',
-- },
-- {
-- 'title': 'Earlier Technical &amp; Business Experience',
-- 'date': '2012 - 2015',
-- 'company': 'Devolved · GModStore · eBay',
-- 'bullets': [
-- 'Built multiplayer game systems, in-game economies, and digital products sold through ScriptFodder / GModStore.',
-- 'Created graphics, support docs, e-commerce listings, moderation workflows; ran online communities at scale.',
-- ],
-- 'stack': 'Lua · PHP · MySQL · Photoshop · Source Engine',
-- },
--]
--
--PROJECTS = [
-- ('\uf135', 'OpenVibe',
-- 'github.com/openvibe',
-- '15-microservice open-source platform kernel &mdash; identity, event bus, media store, live ingest, billing, AI/search. Sole architect across 16 phases.',
-- 'https://github.com/HoboStreamer/OpenVibe-Temporary-MonoRepo'),
-- ('\uf0eb', 'Autonomous IRDR Root-Cause Bot',
-- 'Internal Amazon tool',
-- 'Autonomous agent that plans, gathers evidence, and files SOX-compliant IRDRs end-to-end &mdash; built on 1,000+ hand-researched reports.',
-- 'https://alexfrison.net/portfolio'),
-- ('\uf1c0', 'Amazon SQL Copilot',
-- 'Internal Amazon tool',
-- 'Anthropic-powered SQL assistant that auto-discovers tables / FKs / semantics and streams runnable, table-aware SQL for ICQA analysts.',
-- 'https://alexfrison.net/portfolio'),
-- ('\uf11b', 'HoboQuest',
-- 'hobo.quest',
-- 'Browser MMORPG with custom isomorphic engine &mdash; Source-Engine-style client prediction, pixel canvas, 4 live game instances. 100% open source.',
-- 'https://hobo.quest'),
--]
--
--CORE_STACK = [
-- ('\uf201', 'Analytics / Data',
-- 'SQL · Excel + Power Query + VBA · Python (pandas) · Dashboards · ICQA reporting · Root-cause analysis · Anthropic / LLM tool-use agents'),
-- ('\uf121', 'Engineering / Web',
-- 'JavaScript / TypeScript · Node.js · Express · Python · PHP · React · Vue · REST APIs · HTML5 / CSS · WebSockets / WebRTC · OAuth2 / OIDC'),
-- ('\uf233', 'Systems / Infrastructure',
-- 'Linux · NGINX · PostgreSQL / MySQL / MongoDB / Redis · Cloudflare · DDoS resilience · Self-built 1U / 2U servers'),
-- ('\uf085', 'Robotics · Game Dev · Leadership',
-- 'ARS robotics support · Electro-mechanical troubleshooting · Lua / C# / C++ · Source Engine · Team coaching'),
--]
--
--LINKS = [
-- ('\uf0ac', 'alexfrison.net', 'https://alexfrison.net'),
-- ('\uf0e0', '[email protected]', 'mailto:[email protected]'),
-- ('\uf095', '(425) 367-3997', 'tel:+14253673997'),
-- ('\uf08c', 'linkedin.com/in/fris', 'https://www.linkedin.com/in/fris/'),
--]
--
--
--# --- primitives ------------------------------------------------------------
--def round_rect(c, x, y, w, h, r, fill, stroke=BLUE_LINE, stroke_width=1,
-- shadow=True, shadow_dx=4, shadow_dy=-4):
-- if shadow:
-- c.setFillColor(SHADOW)
-- c.setStrokeColor(SHADOW)
-- c.roundRect(x + shadow_dx, y + shadow_dy, w, h, r, fill=1, stroke=0)
-- c.setFillColor(fill)
-- c.setStrokeColor(stroke)
-- c.setLineWidth(stroke_width)
-- c.roundRect(x, y, w, h, r, fill=1, stroke=1)
--
--
--def para(c, html, style, x, top, width, height=400):
-- p = Paragraph(html, style)
-- _, h = p.wrap(width, height)
-- p.drawOn(c, x, top - h)
-- return h
--
--
--def draw_icon_circle(c, x, y, size, glyph, fg=BLUE, bg=CARD_BG,
-- font_size=15, stroke=BLUE_LINE):
-- c.setFillColor(bg)
-- c.setStrokeColor(stroke)
-- c.setLineWidth(1.0)
-- c.circle(x + size / 2, y + size / 2, size / 2, fill=1, stroke=1)
-- c.setFont('FA', font_size)
-- c.setFillColor(fg)
-- c.drawCentredString(x + size / 2, y + size / 2 - font_size * 0.34, glyph)
--
--
--def section_header(c, x, y, w, text, glyph, h=26):
-- round_rect(c, x, y, w, h, h / 2, BLUE, stroke=BLUE, stroke_width=0.8,
-- shadow=True)
-- draw_icon_circle(c, x + 8, y + (h - 20) / 2, 20, glyph, fg=white,
-- bg=BLUE_SOFT, font_size=11, stroke=BLUE_SOFT)
-- c.setFont('Helvetica-Bold', 13)
-- c.setFillColor(white)
-- c.drawString(x + 36, y + (h - 13) / 2 + 1, text)
--
--
--def chip_width(text):
-- return pdfmetrics.stringWidth(text, 'Helvetica-Bold', 8.9) + 28
--
--
--def draw_chip(c, x, y, text, glyph, h=20):
-- w = chip_width(text)
-- c.setFillColor(BLUE_SOFT)
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.8)
-- c.roundRect(x, y, w, h, h / 2, fill=1, stroke=1)
-- c.setFont('FA', 10)
-- c.setFillColor(white)
-- c.drawString(x + 9, y + 5, glyph)
-- c.setFont('Helvetica-Bold', 8.9)
-- c.drawString(x + 22, y + 6, text)
-- return w
--
--
--def draw_header(c, x, y, w, h):
-- round_rect(c, x, y, w, h, 26, BLUE, stroke=BLUE, stroke_width=0.8,
-- shadow=True)
-- c.setFillColor(white)
-- c.setFont('Helvetica-Bold', 30)
-- c.drawString(x + 22, y + h - 42, 'Alex Frison')
--
-- role_style = ParagraphStyle('role', fontName='Helvetica-Bold',
-- fontSize=10.4, leading=12.2, textColor=white)
-- role = ('Data Analyst &nbsp;&middot;&nbsp; Software Engineer &nbsp;&middot;&nbsp; '
-- 'Systems Architect')
-- para(c, role, role_style, x + 24, y + h - 50, 340, 14)
--
-- subtitle_style = ParagraphStyle('subtitle', fontName='Helvetica',
-- fontSize=9.0, leading=11.0,
-- textColor=white)
-- subtitle = ('Versatile builder across analytics, robotics support, '
-- 'retail sales leadership, and full-stack platforms. '
-- 'Pacific Northwest based &mdash; open to hybrid, remote, on-site.')
-- para(c, subtitle, subtitle_style, x + 24, y + h - 64, 340, 30)
--
-- # role chips, two rows
-- row1 = [('\uf201', 'Analytics / BI'),
-- ('\uf121', 'Full Stack Eng'),
-- ('\uf085', 'Robotics / AFM')]
-- row2 = [('\uf07a', 'Sales Leadership'),
-- ('\uf0b1', 'Product Builder'),
-- ('\uf135', 'Systems Architect')]
-- cx = x + 24
-- for glyph, text in row1:
-- cx += draw_chip(c, cx, y + 36, text, glyph) + 8
-- cx = x + 24
-- for glyph, text in row2:
-- cx += draw_chip(c, cx, y + 12, text, glyph) + 8
--
-- # contact panel
-- cp_w, cp_h = 212, 92
-- cp_x, cp_y = x + w - cp_w - 18, y + h - cp_h - 16
-- round_rect(c, cp_x, cp_y, cp_w, cp_h, 16, BLUE_SOFT,
-- stroke=BLUE_LINE, stroke_width=0.9, shadow=False)
--
-- # three rows: phone / email / web
-- items = [
-- ('\uf095', '+1 (425) 367-3997', 'tel:+14253673997'),
-- ('\uf0e0', '[email protected]', 'mailto:[email protected]'),
-- ('\uf0ac', 'alexfrison.net', 'https://alexfrison.net'),
-- ('\uf041', 'Seattle / Arlington, WA', None),
-- ]
-- row_h = (cp_h - 16) / len(items)
-- for i, (glyph, text, link) in enumerate(items):
-- cy = cp_y + cp_h - 8 - (i + 1) * row_h
-- draw_icon_circle(c, cp_x + 10, cy + (row_h - 18) / 2, 18, glyph,
-- fg=white, bg=BLUE_SOFT, font_size=10,
-- stroke=HexColor('#a8c4ee'))
-- c.setFillColor(white)
-- c.setFont('Helvetica-Bold', 9.3)
-- c.drawString(cp_x + 36, cy + (row_h - 9) / 2 + 1, text)
-- if link:
-- c.linkURL(link, (cp_x, cy, cp_x + cp_w, cy + row_h),
-- relative=0, thickness=0)
--
--
--def top_feature_card(c, x, y, w, h, glyph, title_html, bullets):
-- round_rect(c, x, y, w, h, 16, CARD_BG, shadow=True)
-- draw_icon_circle(c, x + 12, y + h - 38, 24, glyph, fg=BLUE, bg=CARD_BG,
-- font_size=12)
-- para(c, title_html, ParagraphStyle('ft', parent=CARD_TITLE, fontSize=10.6,
-- leading=11.8),
-- x + 46, y + h - 11, w - 56, 26)
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.7)
-- c.line(x + 14, y + h - 46, x + w - 14, y + h - 46)
-- html = '<br/>'.join(f'&bull;&nbsp; {b}' for b in bullets)
-- para(c, html, ParagraphStyle('fb', parent=CARD_DESC, fontSize=8.0,
-- leading=9.2),
-- x + 14, y + h - 52, w - 28, 60)
--
--
--def metric_strip(c, x, y, w, h, metrics):
-- round_rect(c, x, y, w, h, 14, CARD_BG, shadow=True)
-- n = len(metrics)
-- col_w = w / n
-- ICON_BG = HexColor('#ddeaf8')
-- r_icon = 14 # radius → 28 pt diameter
-- for i, (num, lbl, glyph) in enumerate(metrics):
-- col_x = x + i * col_w
-- if i > 0:
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.7)
-- c.line(col_x, y + 8, col_x, y + h - 8)
-- # icon circle — left side, vertically centred
-- ic_cx = col_x + 8 + r_icon # circle centre x
-- ic_cy = y + h / 2 # circle centre y
-- c.setFillColor(ICON_BG)
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.9)
-- c.circle(ic_cx, ic_cy, r_icon, fill=1, stroke=1)
-- c.setFont('FA', 14)
-- c.setFillColor(BLUE)
-- c.drawCentredString(ic_cx, ic_cy - 5, glyph)
-- # number — right of icon, upper area, centred in text zone
-- tx = col_x + 8 + r_icon * 2 + 6 # left edge of text
-- label_w = col_w - (tx - col_x) - 4 # text zone width
-- c.setFont('Helvetica-Bold', 18)
-- c.setFillColor(BLUE_DARK)
-- c.drawCentredString(tx + label_w / 2, y + h - 22, num)
-- # label — below number, centred in same text zone
-- para(c, lbl, METRIC_LBL, tx, y + h - 24, label_w, 28)
--
--
--def draw_experience(c, x, y_top, title, date, company, bullets, stack,
-- rule_gap=8, width=None):
-- if width is None:
-- width = PAGE_W - x - 34
-- title_w = width - 110
-- h = para(c, title, EXP_TITLE, x, y_top, title_w, 22)
-- c.setFont('Helvetica-Bold', 10.8)
-- c.setFillColor(BLUE)
-- c.drawRightString(x + width, y_top - 1, date)
-- y = y_top - max(h, 14) - 4
-- ch = para(c, company, COMPANY, x, y, width, 14)
-- y -= ch + 2
-- bullet_html = '<br/>'.join(f'&bull;&nbsp; {b}' for b in bullets)
-- bh = para(c, bullet_html, BULLET, x + 8, y, width - 8, 200)
-- y -= bh + 3
-- sh = para(c, '<font name="FA">\uf013</font>&nbsp; ' + stack, STACK,
-- x + 8, y, width - 8, 30)
-- bottom = y - sh - rule_gap
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.6)
-- c.line(x, bottom, x + width, bottom)
-- return bottom - 12
--
--
--def product_card(c, x, y, w, h, glyph, title, url, desc, link):
-- round_rect(c, x, y, w, h, 14, CARD_BG, shadow=True)
-- draw_icon_circle(c, x + 10, y + h - 28, 22, glyph, fg=BLUE, bg=CARD_BG,
-- font_size=11)
-- tx = x + 38
-- para(c, title, ParagraphStyle('pt', parent=PRODUCT_TITLE, fontSize=10.5,
-- leading=11.4),
-- tx, y + h - 8, w - (tx - x) - 10, 16)
-- para(c, f'<u>{url}</u>',
-- ParagraphStyle('pu', parent=URL_STYLE, fontSize=8.0, leading=9.0),
-- tx, y + h - 22, w - (tx - x) - 10, 14)
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.5)
-- c.line(x + 12, y + h - 34, x + w - 12, y + h - 34)
-- _pd_s = ParagraphStyle('pd', parent=CARD_DESC, fontSize=8.4, leading=9.6)
-- _, _pd_h = Paragraph(desc, _pd_s).wrap(w - 24, h - 42)
-- _pd_vp = max(0.0, (h - 42 - _pd_h) / 2.0)
-- para(c, desc, _pd_s, x + 12, y + h - 38 - _pd_vp, w - 24, _pd_h + 2)
-- c.linkURL(link, (x, y, x + w, y + h), relative=0, thickness=0)
--
--
--def core_card(c, x, y, w, h, glyph, title, desc):
-- round_rect(c, x, y, w, h, 12, CARD_BG, shadow=True)
-- draw_icon_circle(c, x + 10, y + h - 28, 22, glyph, fg=BLUE, bg=CARD_BG,
-- font_size=11)
-- para(c, title,
-- ParagraphStyle('ct2', parent=CARD_TITLE, fontSize=10.0, leading=11.2),
-- x + 40, y + h - 8, w - 50, 18)
-- c.setStrokeColor(BLUE_LINE)
-- c.setLineWidth(0.5)
-- c.line(x + 12, y + h - 32, x + w - 12, y + h - 32)
-- _cd_s = ParagraphStyle('cd2', parent=CARD_DESC, fontSize=8.4, leading=9.6)
-- _, _cd_h = Paragraph(desc, _cd_s).wrap(w - 24, h - 40)
-- _cd_vp = max(0.0, (h - 40 - _cd_h) / 2.0)
-- para(c, desc, _cd_s, x + 12, y + h - 36 - _cd_vp, w - 24, _cd_h + 2)
--
--
--def links_strip(c, x, y, w, h, links):
-- round_rect(c, x, y, w, h, h / 2, CARD_BG, shadow=False)
-- cx = x + 14
-- for glyph, text, url in links:
-- draw_icon_circle(c, cx, y + (h - 18) / 2, 18, glyph, fg=BLUE,
-- bg=CARD_BG, font_size=10)
-- c.setFont('Helvetica-Bold', 9.2)
-- c.setFillColor(BLUE_DARK)
-- c.drawString(cx + 24, y + h / 2 - 3, text)
-- tw = pdfmetrics.stringWidth(text, 'Helvetica-Bold', 9.2)
-- link_w = 24 + tw + 20
-- c.linkURL(url, (cx - 4, y, cx + link_w, y + h),
-- relative=0, thickness=0)
-- cx += link_w + 6
--
--
--# --- pages -----------------------------------------------------------------
--def build(path):
-- c = canvas.Canvas(path, pagesize=letter)
-- c.setTitle('Alex Frison Resume')
-- c.setAuthor('Alex Frison')
-- c.setSubject('Resume — Data Analyst · Software Engineer · Systems Architect')
--
-- margin = 18
--
-- # ---- page 1 ----
-- c.setFillColor(BG)
-- c.rect(0, 0, PAGE_W, PAGE_H, fill=1, stroke=0)
--
-- header_h = 152
-- header_y = PAGE_H - margin - header_h
-- draw_header(c, margin, header_y, PAGE_W - 2 * margin, header_h)
--
-- # top feature cards
-- gap = 10
-- card_w = (PAGE_W - 2 * margin - gap * 3) / 4
-- card_h = 92
-- top_y = header_y - 8 - card_h
-- for i, card in enumerate(TOP_FEATURE_CARDS):
-- cx = margin + i * (card_w + gap)
-- top_feature_card(c, cx, top_y, card_w, card_h, *card)
--
-- # metrics strip
-- ms_h = 52
-- ms_y = top_y - 4 - ms_h
-- metric_strip(c, margin, ms_y, PAGE_W - 2 * margin, ms_h, METRICS)
--
-- # profile (compact)
-- prof_header_y = ms_y - 4 - 24
-- section_header(c, margin, prof_header_y, PAGE_W - 2 * margin,
-- 'PROFILE', '\uf2c0', h=24)
-- # profile box — auto-height based on measured text
-- _prof_style = ParagraphStyle('_pp', parent=BODY, fontSize=9.0, leading=10.8)
-- _prof_para = Paragraph(PROFILE, _prof_style)
-- _, _prof_text_h = _prof_para.wrap(PAGE_W - 2 * margin - 28, 400)
-- prof_box_h = int(_prof_text_h) + 18 # 9pt top + 9pt bottom pad
-- prof_box_y = prof_header_y - 4 - prof_box_h
-- round_rect(c, margin, prof_box_y, PAGE_W - 2 * margin, prof_box_h, 12,
-- CARD_BG, shadow=False)
-- para(c, PROFILE, _prof_style,
-- margin + 14, prof_box_y + prof_box_h - 9,
-- PAGE_W - 2 * margin - 28, prof_box_h - 18)
--
-- # experience header
-- exp_y = prof_box_y - 8 - 24
-- section_header(c, margin, exp_y, PAGE_W - 2 * margin, 'EXPERIENCE',
-- '\uf0b1', h=24)
-- cur_y = exp_y - 10
-- for e in EXPERIENCE[:3]:
-- cur_y = draw_experience(c, margin + 12, cur_y, e['title'], e['date'],
-- e['company'], e['bullets'], e['stack'],
-- width=PAGE_W - 2 * margin - 24)
--
-- # page footer removed to avoid bottom-overlap; pagination is visually obvious.
--
-- c.showPage()
--
-- # ---- page 2 ----
-- c.setFillColor(BG)
-- c.rect(0, 0, PAGE_W, PAGE_H, fill=1, stroke=0)
--
-- y = PAGE_H - margin - 4
-- section_header(c, margin, y - 24, PAGE_W - 2 * margin,
-- 'EXPERIENCE (CONT.)', '\uf0b1', h=24)
-- y -= 36
-- for e in EXPERIENCE[3:5]:
-- y = draw_experience(c, margin + 12, y, e['title'], e['date'],
-- e['company'], e['bullets'], e['stack'],
-- width=PAGE_W - 2 * margin - 24)
--
-- # selected products
-- section_header(c, margin, y - 10, PAGE_W - 2 * margin,
-- 'SELECTED PROJECTS · LIVE EXAMPLES', '\uf0c1', h=24)
-- y -= 6
-- pw = (PAGE_W - 2 * margin - 10) / 2
-- ph = 72
-- for idx, prj in enumerate(PROJECTS):
-- col = idx % 2
-- row = idx // 2
-- px = margin + col * (pw + 10)
-- py = y - 6 - row * (ph + 6) - ph
-- product_card(c, px, py, pw, ph, *prj)
-- rows = (len(PROJECTS) + 1) // 2
-- y = y - 6 - rows * (ph + 6) - 22
--
-- # core stack
-- section_header(c, margin, y - 4, PAGE_W - 2 * margin,
-- 'CORE TECHNICAL STACK', '\uf1c0', h=24)
-- y -= 6
-- cw = (PAGE_W - 2 * margin - 10) / 2
-- ch = 72
-- for i in range(len(CORE_STACK)):
-- col = i % 2
-- row = i // 2
-- cx = margin + col * (cw + 10)
-- cy = y - 6 - row * (ch + 6) - ch
-- g, t, d = CORE_STACK[i]
-- core_card(c, cx, cy, cw, ch, g, t, d)
-- n_rows = (len(CORE_STACK) + 1) // 2
-- y = y - 6 - n_rows * (ch + 6) - 22
--
-- # education + links
-- section_header(c, margin, y - 4, PAGE_W - 2 * margin,
-- 'EDUCATION · LEARNING · ELSEWHERE', '\uf19d', h=24)
-- y -= 6
-- edu_text = ('<b>Snohomish High School, WA</b> &mdash; AP Statistics, '
-- 'Calculus, English, Creative Writing, Spanish. Self-taught '
-- 'systems builder since age 12 &mdash; analytics, '
-- 'infrastructure, graphics, photography, hardware, and '
-- 'practical problem solving.')
-- _, _edu_h = Paragraph(edu_text, LEARN).wrap(PAGE_W - 2 * margin - 28, 60)
-- edu_h = int(_edu_h) + 14
-- round_rect(c, margin, y - edu_h, PAGE_W - 2 * margin, edu_h, 12, CARD_BG,
-- shadow=False)
-- para(c, edu_text, LEARN, margin + 14, y - 7, PAGE_W - 2 * margin - 28, _edu_h)
-- y -= edu_h + 8
--
-- links_strip(c, margin, y - 34, PAGE_W - 2 * margin, 34, LINKS)
--
-- c.setFont('Helvetica', 7.5)
-- c.setFillColor(SUBTLE)
-- c.drawCentredString(PAGE_W / 2, 6,
-- 'Alex Frison · Resume 2026 · alexfrison.net')
--
-- c.showPage()
-- c.save()
--
--
--if __name__ == '__main__':
-- build('Alex_Frison_Resume.pdf')
-- print('Wrote Alex_Frison_Resume.pdf')
ddiff --git a/deploy/deploy.sh b/deploy/deploy.sh
ddeleted file mode 100755
iindex 7b15ac7..0000000
---- a/deploy/deploy.sh
++++ /dev/null
@@@ -1,72 +0,0 @@
--#!/usr/bin/env bash
--# deploy.sh — Build & deploy alexfrison.net to Nginx static hosting
--# Usage: ./deploy/deploy.sh [--skip-build]
--# Requirements on server: git, node >=18, npm, nginx
--
--set -euo pipefail
--
--REPO_URL="[email protected]:HoboStreamer/AFResume.git"
--SITE_DIR="/var/www/alexfrison.net"
--NGINX_CONF="/etc/nginx/sites-available/alexfrison.net"
--NGINX_ENABLED="/etc/nginx/sites-enabled/alexfrison.net"
--DOMAIN="alexfrison.net"
--
--# ── Helper ────────────────────────────────────────────────────────────────────
--info() { echo -e "\033[1;34m[INFO]\033[0m $*"; }
--ok() { echo -e "\033[1;32m[OK]\033[0m $*"; }
--error() { echo -e "\033[1;31m[ERROR]\033[0m $*" >&2; exit 1; }
--
--# ── 1. Clone or pull ──────────────────────────────────────────────────────────
--if [[ -d "$SITE_DIR/.git" ]]; then
-- info "Pulling latest from origin/main..."
-- git -C "$SITE_DIR" pull origin main
--else
-- info "Cloning $REPO_URL → $SITE_DIR..."
-- sudo mkdir -p "$SITE_DIR"
-- sudo chown "$USER":"$USER" "$SITE_DIR"
-- git clone "$REPO_URL" "$SITE_DIR"
--fi
--
--# ── 2. Install deps & build ───────────────────────────────────────────────────
--if [[ "${1:-}" != "--skip-build" ]]; then
-- info "Installing npm dependencies..."
-- npm --prefix "$SITE_DIR" ci --prefer-offline
--
-- info "Building Astro site..."
-- npm --prefix "$SITE_DIR" run build
--
-- ok "Build complete → $SITE_DIR/dist"
--fi
--
--# ── 3. Install nginx config ───────────────────────────────────────────────────
--if [[ ! -f "$NGINX_CONF" ]]; then
-- info "Installing nginx config..."
-- sudo cp "$SITE_DIR/deploy/nginx.conf" "$NGINX_CONF"
-- sudo ln -sf "$NGINX_CONF" "$NGINX_ENABLED"
-- ok "Nginx config installed."
--else
-- info "Nginx config already present at $NGINX_CONF — skipping copy."
-- info "To update it manually: sudo cp $SITE_DIR/deploy/nginx.conf $NGINX_CONF"
--fi
--
--# ── 4. Test & reload nginx ────────────────────────────────────────────────────
--info "Testing nginx config..."
--sudo nginx -t
--
--info "Reloading nginx..."
--sudo systemctl reload nginx
--ok "Nginx reloaded."
--
--# ── 5. SSL reminder ───────────────────────────────────────────────────────────
--if [[ ! -d "/etc/letsencrypt/live/$DOMAIN" ]]; then
-- echo ""
-- echo " ┌─────────────────────────────────────────────────────────┐"
-- echo " │ SSL cert not found. Run certbot to finish setup: │"
-- echo " │ │"
-- echo " │ sudo apt install certbot python3-certbot-nginx │"
-- echo " │ sudo certbot --nginx -d $DOMAIN -d www.$DOMAIN │"
-- echo " └─────────────────────────────────────────────────────────┘"
-- echo ""
--fi
--
--ok "Deploy complete. Visit https://$DOMAIN"
ddiff --git a/deploy/nginx.conf b/deploy/nginx.conf
ddeleted file mode 100644
iindex 299cdfc..0000000
---- a/deploy/nginx.conf
++++ /dev/null
@@@ -1,55 +0,0 @@
--server {
-- listen 80;
-- listen [::]:80;
-- server_name alexfrison.net www.alexfrison.net;
--
-- # Redirect HTTP → HTTPS (remove this block if not using SSL)
-- return 301 https://$host$request_uri;
--}
--
--server {
-- listen 443 ssl http2;
-- listen [::]:443 ssl http2;
-- server_name alexfrison.net www.alexfrison.net;
--
-- # --- SSL (certbot will fill these in) ---
-- ssl_certificate /etc/letsencrypt/live/alexfrison.net/fullchain.pem;
-- ssl_certificate_key /etc/letsencrypt/live/alexfrison.net/privkey.pem;
-- include /etc/letsencrypt/options-ssl-nginx.conf;
-- ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
--
-- # --- Root ---
-- root /var/www/alexfrison.net/dist;
-- index index.html;
--
-- # --- Gzip ---
-- gzip on;
-- gzip_vary on;
-- gzip_proxied any;
-- gzip_comp_level 6;
-- gzip_types text/plain text/css text/xml application/json application/javascript
-- application/xml+rss application/atom+xml image/svg+xml;
--
-- # --- Astro static output: try file, then .html, then 404 ---
-- location / {
-- try_files $uri $uri/ $uri.html =404;
-- }
--
-- # --- Long-lived cache for hashed assets ---
-- location ~* \.(js|css|woff2?|ttf|eot|otf|svg|png|jpg|jpeg|webp|gif|ico|avif)$ {
-- expires 1y;
-- add_header Cache-Control "public, immutable";
-- access_log off;
-- }
--
-- # --- Custom 404 ---
-- error_page 404 /404.html;
-- location = /404.html {
-- internal;
-- }
--
-- # --- Security headers ---
-- add_header X-Frame-Options "SAMEORIGIN" always;
-- add_header X-Content-Type-Options "nosniff" always;
-- add_header Referrer-Policy "strict-origin-when-cross-origin" always;
--}
ddiff --git a/package-lock.json b/package-lock.json
iindex f87f9a4..03d47a2 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,18 +1,20 @@
{
"name": "alexfrison-net",
-- "version": "1.0.0",
++ "version": "2.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "alexfrison-net",
-- "version": "1.0.0",
++ "version": "2.0.0",
"dependencies": {
"@astrojs/mdx": "^3.1.9",
-- "@astrojs/sitemap": "^3.2.1",
"@fortawesome/fontawesome-free": "^7.2.0",
"astro": "^4.16.18",
"sharp": "^0.33.5"
++ },
++ "devDependencies": {
++ "@astrojs/sitemap": "^3.2.1"
}
},
"node_modules/@astrojs/compiler": {
@@@ -94,14 +96,25 @@
}
},
"node_modules/@astrojs/sitemap": {
-- "version": "3.7.2",
-- "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.2.tgz",
-- "integrity": "sha512-PqkzkcZTb5ICiyIR8VoKbIAP/laNRXi5tw616N1Ckk+40oNB8Can1AzVV56lrbC5GKSZFCyJYUVYqVivMisvpA==",
++ "version": "3.2.1",
++ "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.2.1.tgz",
++ "integrity": "sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==",
++ "dev": true,
"license": "MIT",
"dependencies": {
-- "sitemap": "^9.0.0",
++ "sitemap": "^8.0.0",
"stream-replace-string": "^2.0.0",
-- "zod": "^4.3.6"
++ "zod": "^3.23.8"
++ }
++ },
++ "node_modules/@astrojs/sitemap/node_modules/zod": {
++ "version": "3.25.76",
++ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
++ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
++ "dev": true,
++ "license": "MIT",
++ "funding": {
++ "url": "https://github.com/sponsors/colinhacks"
}
},
"node_modules/@astrojs/telemetry": {
@@@ -1826,6 +1839,7 @@
"version": "24.12.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
"integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
++ "devOptional": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.16.0"
@@@ -1835,6 +1849,7 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
"integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
++ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@@ -1951,6 +1966,7 @@
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
++ "dev": true,
"license": "MIT"
},
"node_modules/argparse": {
@@@ -5504,9 +5520,10 @@
}
},
"node_modules/sax": {
-- "version": "1.6.0",
-- "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
-- "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
++ "version": "1.6.1",
++ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
++ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
++ "dev": true,
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=11.0.0"
@@@ -5620,24 +5637,32 @@
"license": "MIT"
},
"node_modules/sitemap": {
-- "version": "9.0.1",
-- "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz",
-- "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==",
++ "version": "8.0.3",
++ "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.3.tgz",
++ "integrity": "sha512-9Ew1tR2WYw8RGE2XLy7GjkusvYXy8Rg6y8TYuBuQMfIEdGcWoJpY2Wr5DzsEiL/TKCw56+YKTCCUHglorEYK+A==",
++ "dev": true,
"license": "MIT",
"dependencies": {
-- "@types/node": "^24.9.2",
++ "@types/node": "^17.0.5",
"@types/sax": "^1.2.1",
"arg": "^5.0.0",
"sax": "^1.4.1"
},
"bin": {
-- "sitemap": "dist/esm/cli.js"
++ "sitemap": "dist/cli.js"
},
"engines": {
-- "node": ">=20.19.5",
-- "npm": ">=10.8.2"
++ "node": ">=14.0.0",
++ "npm": ">=6.0.0"
}
},
++ "node_modules/sitemap/node_modules/@types/node": {
++ "version": "17.0.45",
++ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
++ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==",
++ "dev": true,
++ "license": "MIT"
++ },
"node_modules/source-map": {
"version": "0.7.6",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
@@@ -5688,6 +5713,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz",
"integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==",
++ "dev": true,
"license": "MIT"
},
"node_modules/string-width": {
@@@ -5867,6 +5893,7 @@
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
++ "devOptional": true,
"license": "MIT"
},
"node_modules/unified": {
@@@ -6275,6 +6302,7 @@
"resolved": "https://registry.npmjs.org/zod/-/zod-4.4.1.tgz",
"integrity": "sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==",
"license": "MIT",
++ "peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
ddiff --git a/package.json b/package.json
iindex fef8e69..de52bc9 100644
---- a/package.json
++++ b/package.json
@@@ -1,19 +1,22 @@
{
"name": "alexfrison-net",
-- "version": "1.0.0",
++ "version": "2.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview --host",
-- "vendor:fetch": "node scripts/fetch-vendor.mjs"
++ "vendor:fetch": "node scripts/fetch-vendor.mjs",
++ "resume:pdf": "python3 resume/build_resume.py"
},
"dependencies": {
"@astrojs/mdx": "^3.1.9",
-- "@astrojs/sitemap": "^3.2.1",
"@fortawesome/fontawesome-free": "^7.2.0",
"astro": "^4.16.18",
"sharp": "^0.33.5"
++ },
++ "devDependencies": {
++ "@astrojs/sitemap": "^3.2.1"
}
}
ddiff --git a/public/Alex_Frison_Resume_May_2026_v2.pdf b/public/Alex_Frison_Resume_May_2026_v2.pdf
ddeleted file mode 100644
iindex 37e2658..0000000
BBinary files a/public/Alex_Frison_Resume_May_2026_v2.pdf and /dev/null differ
ddiff --git a/public/Alex_Frison_Resume_Sep_2026.pdf b/public/Alex_Frison_Resume_Sep_2026.pdf
nnew file mode 100644
iindex 0000000..82e5cc3
BBinary files /dev/null and b/public/Alex_Frison_Resume_Sep_2026.pdf differ
ddiff --git a/public/assets/img/og.png b/public/assets/img/og.png
nnew file mode 100644
iindex 0000000..2ad9685
BBinary files /dev/null and b/public/assets/img/og.png differ
ddiff --git a/public/assets/img/projects/amazon-sql-copilot.png b/public/assets/img/projects/amazon-sql-copilot.png
ddeleted file mode 100755
iindex 5734c17..0000000
BBinary files a/public/assets/img/projects/amazon-sql-copilot.png and /dev/null differ
ddiff --git a/public/assets/img/projects/amazon-sql-copilot.webp b/public/assets/img/projects/amazon-sql-copilot.webp
nnew file mode 100644
iindex 0000000..9c8a983
BBinary files /dev/null and b/public/assets/img/projects/amazon-sql-copilot.webp differ
ddiff --git a/public/assets/img/projects/hobo-maps.png b/public/assets/img/projects/hobo-maps.png
ddeleted file mode 100644
iindex 6f74bb0..0000000
BBinary files a/public/assets/img/projects/hobo-maps.png and /dev/null differ
ddiff --git a/public/assets/img/projects/hobo-quest.png b/public/assets/img/projects/hobo-quest.png
ddeleted file mode 100644
iindex df94f8e..0000000
BBinary files a/public/assets/img/projects/hobo-quest.png and /dev/null differ
ddiff --git a/public/assets/img/projects/hobo-tools.png b/public/assets/img/projects/hobo-tools.png
ddeleted file mode 100644
iindex 1c6ff0b..0000000
BBinary files a/public/assets/img/projects/hobo-tools.png and /dev/null differ
ddiff --git a/public/assets/img/projects/hobostreamer.png b/public/assets/img/projects/hobostreamer.png
ddeleted file mode 100644
iindex 3a49634..0000000
BBinary files a/public/assets/img/projects/hobostreamer.png and /dev/null differ
ddiff --git a/public/assets/img/projects/inbound-pull.png b/public/assets/img/projects/inbound-pull.png
ddeleted file mode 100755
iindex 4941a68..0000000
BBinary files a/public/assets/img/projects/inbound-pull.png and /dev/null differ
ddiff --git a/public/assets/img/projects/inbound-pull.webp b/public/assets/img/projects/inbound-pull.webp
nnew file mode 100644
iindex 0000000..f76ed8b
BBinary files /dev/null and b/public/assets/img/projects/inbound-pull.webp differ
ddiff --git a/public/assets/img/projects/irdr-bot-1.png b/public/assets/img/projects/irdr-bot-1.png
ddeleted file mode 100755
iindex 3c99018..0000000
BBinary files a/public/assets/img/projects/irdr-bot-1.png and /dev/null differ
ddiff --git a/public/assets/img/projects/irdr-bot-1.webp b/public/assets/img/projects/irdr-bot-1.webp
nnew file mode 100644
iindex 0000000..9042232
BBinary files /dev/null and b/public/assets/img/projects/irdr-bot-1.webp differ
ddiff --git a/public/assets/img/projects/openvibe-maps.svg b/public/assets/img/projects/openvibe-maps.svg
ddeleted file mode 100644
iindex 559594d..0000000
---- a/public/assets/img/projects/openvibe-maps.svg
++++ /dev/null
@@@ -1,14 +0,0 @@
--<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
-- <defs>
-- <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0a1018"/><stop offset="1" stop-color="#14253b"/></linearGradient>
-- <linearGradient id="ac" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#4cc9b0"/><stop offset="1" stop-color="#f4a261"/></linearGradient>
-- </defs>
-- <rect width="800" height="500" fill="url(#bg)"/>
-- <g stroke="#4cc9b0" stroke-opacity="0.18" fill="none">
-- <path d="M0 100 L800 100 M0 200 L800 200 M0 300 L800 300 M0 400 L800 400"/>
-- <path d="M100 0 L100 500 M250 0 L250 500 M400 0 L400 500 M550 0 L550 500 M700 0 L700 500"/>
-- </g>
-- <circle cx="400" cy="250" r="70" fill="none" stroke="#f4a261" stroke-width="3"/>
-- <circle cx="400" cy="250" r="6" fill="#f4a261"/>
-- <text x="50%" y="80%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="700" font-size="56" fill="url(#ac)">OpenVibe Maps</text>
--</svg>
ddiff --git a/public/assets/img/projects/openvibe-quest.svg b/public/assets/img/projects/openvibe-quest.svg
ddeleted file mode 100644
iindex df80733..0000000
---- a/public/assets/img/projects/openvibe-quest.svg
++++ /dev/null
@@@ -1,11 +0,0 @@
--<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
-- <defs>
-- <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0a1018"/><stop offset="1" stop-color="#14253b"/></linearGradient>
-- <linearGradient id="ac" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#7aa2f7"/><stop offset="1" stop-color="#4cc9b0"/></linearGradient>
-- </defs>
-- <rect width="800" height="500" fill="url(#bg)"/>
-- <polygon points="0,400 200,260 360,340 540,200 720,300 800,260 800,500 0,500" fill="#1c3654" opacity="0.6"/>
-- <polygon points="0,440 180,340 380,400 560,300 760,360 800,340 800,500 0,500" fill="#16314f"/>
-- <text x="50%" y="40%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="700" font-size="64" fill="url(#ac)">OpenVibe</text>
-- <text x="50%" y="52%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="500" font-size="28" fill="#8aa0b6">Quest</text>
--</svg>
ddiff --git a/public/assets/img/projects/openvibe-streamer.svg b/public/assets/img/projects/openvibe-streamer.svg
ddeleted file mode 100644
iindex 5e7ec7b..0000000
---- a/public/assets/img/projects/openvibe-streamer.svg
++++ /dev/null
@@@ -1,11 +0,0 @@
--<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
-- <defs>
-- <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#0a1018"/><stop offset="1" stop-color="#14253b"/></linearGradient>
-- <linearGradient id="ac" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#f4a261"/><stop offset="1" stop-color="#e76f51"/></linearGradient>
-- </defs>
-- <rect width="800" height="500" fill="url(#bg)"/>
-- <circle cx="200" cy="120" r="160" fill="#f4a261" opacity="0.14"/>
-- <circle cx="640" cy="380" r="130" fill="#e76f51" opacity="0.14"/>
-- <text x="50%" y="48%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="700" font-size="64" fill="url(#ac)">OpenVibe</text>
-- <text x="50%" y="60%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="500" font-size="28" fill="#8aa0b6">Streamer</text>
--</svg>
ddiff --git a/public/assets/img/projects/openvibe-tools.svg b/public/assets/img/projects/openvibe-tools.svg
ddeleted file mode 100644
iindex ad1396d..0000000
---- a/public/assets/img/projects/openvibe-tools.svg
++++ /dev/null
@@@ -1,17 +0,0 @@
--<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500">
-- <defs>
-- <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
-- <stop offset="0" stop-color="#0a1018"/>
-- <stop offset="1" stop-color="#14253b"/>
-- </linearGradient>
-- <linearGradient id="ac" x1="0" y1="0" x2="1" y2="0">
-- <stop offset="0" stop-color="#4cc9b0"/>
-- <stop offset="1" stop-color="#7aa2f7"/>
-- </linearGradient>
-- </defs>
-- <rect width="800" height="500" fill="url(#bg)"/>
-- <circle cx="600" cy="120" r="180" fill="#4cc9b0" opacity="0.12"/>
-- <circle cx="160" cy="380" r="140" fill="#7aa2f7" opacity="0.12"/>
-- <text x="50%" y="48%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="700" font-size="64" fill="url(#ac)">OpenVibe</text>
-- <text x="50%" y="60%" text-anchor="middle" font-family="Space Grotesk, sans-serif" font-weight="500" font-size="28" fill="#8aa0b6">Tools</text>
--</svg>
ddiff --git a/public/assets/img/sites/community.webp b/public/assets/img/sites/community.webp
nnew file mode 100644
iindex 0000000..a38648e
BBinary files /dev/null and b/public/assets/img/sites/community.webp differ
ddiff --git a/public/assets/img/sites/games.webp b/public/assets/img/sites/games.webp
nnew file mode 100644
iindex 0000000..c940fc0
BBinary files /dev/null and b/public/assets/img/sites/games.webp differ
ddiff --git a/public/assets/img/sites/live.webp b/public/assets/img/sites/live.webp
nnew file mode 100644
iindex 0000000..d30f312
BBinary files /dev/null and b/public/assets/img/sites/live.webp differ
ddiff --git a/public/assets/img/sites/media.webp b/public/assets/img/sites/media.webp
nnew file mode 100644
iindex 0000000..3132f30
BBinary files /dev/null and b/public/assets/img/sites/media.webp differ
ddiff --git a/public/assets/img/sites/network.webp b/public/assets/img/sites/network.webp
nnew file mode 100644
iindex 0000000..d3e895a
BBinary files /dev/null and b/public/assets/img/sites/network.webp differ
ddiff --git a/public/assets/img/sites/tools.webp b/public/assets/img/sites/tools.webp
nnew file mode 100644
iindex 0000000..d4a56d2
BBinary files /dev/null and b/public/assets/img/sites/tools.webp differ
ddiff --git a/public/assets/vendor/README.md b/public/assets/vendor/README.md
iindex fd50b79..51f5b88 100644
---- a/public/assets/vendor/README.md
++++ b/public/assets/vendor/README.md
@@@ -5,11 +5,7 @@ dependencies**. Re-fetch with `npm run vendor:fetch`.
| Library | Version | License |
|---|---|---|
--| GSAP + ScrollTrigger | 3.12.5 | GreenSock Standard "No Charge" License (free for non-commercial; see https://gsap.com/standard-license/) |
| Lenis | 1.1.13 | MIT |
--| Splitting.js | 1.0.6 | MIT |
--| tsparticles (slim) | 3.5.0 | MIT |
--| Swiper | 11.1.14 | MIT |
--| Lottie-web (light) | 5.12.2 | MIT |
++| Font Awesome Free (CSS + webfonts) | 6.x | CC BY 4.0 / SIL OFL 1.1 / MIT |
| Inter | 5.1.0 | SIL OFL 1.1 |
| Space Grotesk | 5.1.0 | SIL OFL 1.1 |
ddiff --git a/public/assets/vendor/gsap/ScrollTrigger.min.js b/public/assets/vendor/gsap/ScrollTrigger.min.js
ddeleted file mode 100644
iindex cceb2b9..0000000
---- a/public/assets/vendor/gsap/ScrollTrigger.min.js
++++ /dev/null
@@@ -1,11 +0,0 @@
--/*!
-- * ScrollTrigger 3.12.5
-- * https://gsap.com
-- *
-- * @license Copyright 2024, GreenSock. All rights reserved.
-- * Subject to the terms at https://gsap.com/standard-license or for Club GSAP members, the agreement issued with that membership.
-- * @author: Jack Doyle, [email protected]
-- */
--
--!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).window=e.window||{})}(this,function(e){"use strict";function _defineProperties(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function r(){return Ce||"undefined"!=typeof window&&(Ce=window.gsap)&&Ce.registerPlugin&&Ce}function z(e,t){return~Le.indexOf(e)&&Le[Le.indexOf(e)+1][t]}function A(e){return!!~t.indexOf(e)}function B(e,t,r,n,o){return e.addEventListener(t,r,{passive:!1!==n,capture:!!o})}function C(e,t,r,n){return e.removeEventListener(t,r,!!n)}function F(){return De&&De.isPressed||Ie.cache++}function G(r,n){function dd(e){if(e||0===e){o&&(Se.history.scrollRestoration="manual");var t=De&&De.isPressed;e=dd.v=Math.round(e)||(De&&De.iOS?1:0),r(e),dd.cacheID=Ie.cache,t&&i("ss",e)}else(n||Ie.cache!==dd.cacheID||i("ref"))&&(dd.cacheID=Ie.cache,dd.v=r());return dd.v+dd.offset}return dd.offset=0,r&&dd}function J(e,t){return(t&&t._ctx&&t._ctx.selector||Ce.utils.toArray)(e)[0]||("string"==typeof e&&!1!==Ce.config().nullTargetWarn?console.warn("Element not found:",e):null)}function K(t,e){var r=e.s,n=e.sc;A(t)&&(t=ke.scrollingElement||Pe);var o=Ie.indexOf(t),i=n===Fe.sc?1:2;~o||(o=Ie.push(t)-1),Ie[o+i]||B(t,"scroll",F);var a=Ie[o+i],s=a||(Ie[o+i]=G(z(t,r),!0)||(A(t)?n:G(function(e){return arguments.length?t[r]=e:t[r]})));return s.target=t,a||(s.smooth="smooth"===Ce.getProperty(t,"scrollBehavior")),s}function L(e,t,o){function Cd(e,t){var r=ze();t||n<r-s?(a=i,i=e,l=s,s=r):o?i+=e:i=a+(e-a)/(r-l)*(s-l)}var i=e,a=e,s=ze(),l=s,n=t||50,c=Math.max(500,3*n);return{update:Cd,reset:function reset(){a=i=o?0:i,l=s=0},getVelocity:function getVelocity(e){var t=l,r=a,n=ze();return!e&&0!==e||e===i||Cd(e),s===l||c<n-l?0:(i+(o?r:-r))/((o?n:s)-t)*1e3}}}function M(e,t){return t&&!e._gsapAllow&&e.preventDefault(),e.changedTouches?e.changedTouches[0]:e}function N(e){var t=Math.max.apply(Math,e),r=Math.min.apply(Math,e);return Math.abs(t)>=Math.abs(r)?t:r}function O(){(Ae=Ce.core.globals().ScrollTrigger)&&Ae.core&&function _integrate(){var e=Ae.core,r=e.bridge||{},t=e._scrollers,n=e._proxies;t.push.apply(t,Ie),n.push.apply(n,Le),Ie=t,Le=n,i=function _bridge(e,t){return r[e](t)}}()}function P(e){return Ce=e||r(),!Te&&Ce&&"undefined"!=typeof document&&document.body&&(Se=window,Pe=(ke=document).documentElement,Me=ke.body,t=[Se,ke,Pe,Me],Ce.utils.clamp,Be=Ce.core.context||function(){},Oe="onpointerenter"in Me?"pointer":"mouse",Ee=k.isTouch=Se.matchMedia&&Se.matchMedia("(hover: none), (pointer: coarse)").matches?1:"ontouchstart"in Se||0<navigator.maxTouchPoints||0<navigator.msMaxTouchPoints?2:0,Re=k.eventTypes=("ontouchstart"in Pe?"touchstart,touchmove,touchcancel,touchend":"onpointerdown"in Pe?"pointerdown,pointermove,pointercancel,pointerup":"mousedown,mousemove,mouseup,mouseup").split(","),setTimeout(function(){return o=0},500),O(),Te=1),Te}var Ce,Te,Se,ke,Pe,Me,Ee,Oe,Ae,t,De,Re,Be,o=1,qe=[],Ie=[],Le=[],ze=Date.now,i=function _bridge(e,t){return t},n="scrollLeft",a="scrollTop",Ye={s:n,p:"left",p2:"Left",os:"right",os2:"Right",d:"width",d2:"Width",a:"x",sc:G(function(e){return arguments.length?Se.scrollTo(e,Fe.sc()):Se.pageXOffset||ke[n]||Pe[n]||Me[n]||0})},Fe={s:a,p:"top",p2:"Top",os:"bottom",os2:"Bottom",d:"height",d2:"Height",a:"y",op:Ye,sc:G(function(e){return arguments.length?Se.scrollTo(Ye.sc(),e):Se.pageYOffset||ke[a]||Pe[a]||Me[a]||0})};Ye.op=Fe,Ie.cache=0;var k=(Observer.prototype.init=function init(e){Te||P(Ce)||console.warn("Please gsap.registerPlugin(Observer)"),Ae||O();var o=e.tolerance,a=e.dragMinimum,t=e.type,i=e.target,r=e.lineHeight,n=e.debounce,s=e.preventDefault,l=e.onStop,c=e.onStopDelay,u=e.ignore,f=e.wheelSpeed,d=e.event,p=e.onDragStart,g=e.onDragEnd,h=e.onDrag,v=e.onPress,b=e.onRelease,m=e.onRight,y=e.onLeft,x=e.onUp,w=e.onDown,_=e.onChangeX,T=e.onChangeY,S=e.onChange,k=e.onToggleX,E=e.onToggleY,D=e.onHover,R=e.onHoverEnd,q=e.onMove,I=e.ignoreCheck,z=e.isNormalizer,Y=e.onGestureStart,H=e.onGestureEnd,X=e.onWheel,W=e.onEnable,V=e.onDisable,U=e.onClick,j=e.scrollSpeed,G=e.capture,Q=e.allowClicks,Z=e.lockAxis,$=e.onLockAxis;function cf(){return xe=ze()}function df(e,t){return(se.event=e)&&u&&~u.indexOf(e.target)||t&&he&&"touch"!==e.pointerType||I&&I(e,t)}function ff(){var e=se.deltaX=N(me),t=se.deltaY=N(ye),r=Math.abs(e)>=o,n=Math.abs(t)>=o;S&&(r||n)&&S(se,e,t,me,ye),r&&(m&&0<se.deltaX&&m(se),y&&se.deltaX<0&&y(se),_&&_(se),k&&se.deltaX<0!=le<0&&k(se),le=se.deltaX,me[0]=me[1]=me[2]=0),n&&(w&&0<se.deltaY&&w(se),x&&se.deltaY<0&&x(se),T&&T(se),E&&se.deltaY<0!=ce<0&&E(se),ce=se.deltaY,ye[0]=ye[1]=ye[2]=0),(ne||re)&&(q&&q(se),re&&(h(se),re=!1),ne=!1),ie&&!(ie=!1)&&$&&$(se),oe&&(X(se),oe=!1),ee=0}function gf(e,t,r){me[r]+=e,ye[r]+=t,se._vx.update(e),se._vy.update(t),n?ee=ee||requestAnimationFrame(ff):ff()}function hf(e,t){Z&&!ae&&(se.axis=ae=Math.abs(e)>Math.abs(t)?"x":"y",ie=!0),"y"!==ae&&(me[2]+=e,se._vx.update(e,!0)),"x"!==ae&&(ye[2]+=t,se._vy.update(t,!0)),n?ee=ee||requestAnimationFrame(ff):ff()}function jf(e){if(!df(e,1)){var t=(e=M(e,s)).clientX,r=e.clientY,n=t-se.x,o=r-se.y,i=se.isDragging;se.x=t,se.y=r,(i||Math.abs(se.startX-t)>=a||Math.abs(se.startY-r)>=a)&&(h&&(re=!0),i||(se.isDragging=!0),hf(n,o),i||p&&p(se))}}function mf(e){return e.touches&&1<e.touches.length&&(se.isGesturing=!0)&&Y(e,se.isDragging)}function nf(){return(se.isGesturing=!1)||H(se)}function of(e){if(!df(e)){var t=fe(),r=de();gf((t-pe)*j,(r-ge)*j,1),pe=t,ge=r,l&&te.restart(!0)}}function pf(e){if(!df(e)){e=M(e,s),X&&(oe=!0);var t=(1===e.deltaMode?r:2===e.deltaMode?Se.innerHeight:1)*f;gf(e.deltaX*t,e.deltaY*t,0),l&&!z&&te.restart(!0)}}function qf(e){if(!df(e)){var t=e.clientX,r=e.clientY,n=t-se.x,o=r-se.y;se.x=t,se.y=r,ne=!0,l&&te.restart(!0),(n||o)&&hf(n,o)}}function rf(e){se.event=e,D(se)}function sf(e){se.event=e,R(se)}function tf(e){return df(e)||M(e,s)&&U(se)}this.target=i=J(i)||Pe,this.vars=e,u=u&&Ce.utils.toArray(u),o=o||1e-9,a=a||0,f=f||1,j=j||1,t=t||"wheel,touch,pointer",n=!1!==n,r=r||parseFloat(Se.getComputedStyle(Me).lineHeight)||22;var ee,te,re,ne,oe,ie,ae,se=this,le=0,ce=0,ue=e.passive||!s,fe=K(i,Ye),de=K(i,Fe),pe=fe(),ge=de(),he=~t.indexOf("touch")&&!~t.indexOf("pointer")&&"pointerdown"===Re[0],ve=A(i),be=i.ownerDocument||ke,me=[0,0,0],ye=[0,0,0],xe=0,we=se.onPress=function(e){df(e,1)||e&&e.button||(se.axis=ae=null,te.pause(),se.isPressed=!0,e=M(e),le=ce=0,se.startX=se.x=e.clientX,se.startY=se.y=e.clientY,se._vx.reset(),se._vy.reset(),B(z?i:be,Re[1],jf,ue,!0),se.deltaX=se.deltaY=0,v&&v(se))},_e=se.onRelease=function(t){if(!df(t,1)){C(z?i:be,Re[1],jf,!0);var e=!isNaN(se.y-se.startY),r=se.isDragging,n=r&&(3<Math.abs(se.x-se.startX)||3<Math.abs(se.y-se.startY)),o=M(t);!n&&e&&(se._vx.reset(),se._vy.reset(),s&&Q&&Ce.delayedCall(.08,function(){if(300<ze()-xe&&!t.defaultPrevented)if(t.target.click)t.target.click();else if(be.createEvent){var e=be.createEvent("MouseEvents");e.initMouseEvent("click",!0,!0,Se,1,o.screenX,o.screenY,o.clientX,o.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(e)}})),se.isDragging=se.isGesturing=se.isPressed=!1,l&&r&&!z&&te.restart(!0),g&&r&&g(se),b&&b(se,n)}};te=se._dc=Ce.delayedCall(c||.25,function onStopFunc(){se._vx.reset(),se._vy.reset(),te.pause(),l&&l(se)}).pause(),se.deltaX=se.deltaY=0,se._vx=L(0,50,!0),se._vy=L(0,50,!0),se.scrollX=fe,se.scrollY=de,se.isDragging=se.isGesturing=se.isPressed=!1,Be(this),se.enable=function(e){return se.isEnabled||(B(ve?be:i,"scroll",F),0<=t.indexOf("scroll")&&B(ve?be:i,"scroll",of,ue,G),0<=t.indexOf("wheel")&&B(i,"wheel",pf,ue,G),(0<=t.indexOf("touch")&&Ee||0<=t.indexOf("pointer"))&&(B(i,Re[0],we,ue,G),B(be,Re[2],_e),B(be,Re[3],_e),Q&&B(i,"click",cf,!0,!0),U&&B(i,"click",tf),Y&&B(be,"gesturestart",mf),H&&B(be,"gestureend",nf),D&&B(i,Oe+"enter",rf),R&&B(i,Oe+"leave",sf),q&&B(i,Oe+"move",qf)),se.isEnabled=!0,e&&e.type&&we(e),W&&W(se)),se},se.disable=function(){se.isEnabled&&(qe.filter(function(e){return e!==se&&A(e.target)}).length||C(ve?be:i,"scroll",F),se.isPressed&&(se._vx.reset(),se._vy.reset(),C(z?i:be,Re[1],jf,!0)),C(ve?be:i,"scroll",of,G),C(i,"wheel",pf,G),C(i,Re[0],we,G),C(be,Re[2],_e),C(be,Re[3],_e),C(i,"click",cf,!0),C(i,"click",tf),C(be,"gesturestart",mf),C(be,"gestureend",nf),C(i,Oe+"enter",rf),C(i,Oe+"leave",sf),C(i,Oe+"move",qf),se.isEnabled=se.isPressed=se.isDragging=!1,V&&V(se))},se.kill=se.revert=function(){se.disable();var e=qe.indexOf(se);0<=e&&qe.splice(e,1),De===se&&(De=0)},qe.push(se),z&&A(i)&&(De=se),se.enable(d)},function _createClass(e,t,r){return t&&_defineProperties(e.prototype,t),r&&_defineProperties(e,r),e}(Observer,[{key:"velocityX",get:function get(){return this._vx.getVelocity()}},{key:"velocityY",get:function get(){return this._vy.getVelocity()}}]),Observer);function Observer(e){this.init(e)}k.version="3.12.5",k.create=function(e){return new k(e)},k.register=P,k.getAll=function(){return qe.slice()},k.getById=function(t){return qe.filter(function(e){return e.vars.id===t})[0]},r()&&Ce.registerPlugin(k);function Ca(e,t,r){var n=ct(e)&&("clamp("===e.substr(0,6)||-1<e.indexOf("max"));return(r["_"+t+"Clamp"]=n)?e.substr(6,e.length-7):e}function Da(e,t){return!t||ct(e)&&"clamp("===e.substr(0,6)?e:"clamp("+e+")"}function Fa(){return Ge=1}function Ga(){return Ge=0}function Ha(e){return e}function Ia(e){return Math.round(1e5*e)/1e5||0}function Ja(){return"undefined"!=typeof window}function Ka(){return He||Ja()&&(He=window.gsap)&&He.registerPlugin&&He}function La(e){return!!~l.indexOf(e)}function Ma(e){return("Height"===e?T:Ne["inner"+e])||Je["client"+e]||We["client"+e]}function Na(e){return z(e,"getBoundingClientRect")||(La(e)?function(){return Ot.width=Ne.innerWidth,Ot.height=T,Ot}:function(){return wt(e)})}function Qa(e,t){var r=t.s,n=t.d2,o=t.d,i=t.a;return Math.max(0,(r="scroll"+n)&&(i=z(e,r))?i()-Na(e)()[o]:La(e)?(Je[r]||We[r])-Ma(n):e[r]-e["offset"+n])}function Ra(e,t){for(var r=0;r<g.length;r+=3)t&&!~t.indexOf(g[r+1])||e(g[r],g[r+1],g[r+2])}function Ta(e){return"function"==typeof e}function Ua(e){return"number"==typeof e}function Va(e){return"object"==typeof e}function Wa(e,t,r){return e&&e.progress(t?0:1)&&r&&e.pause()}function Xa(e,t){if(e.enabled){var r=e._ctx?e._ctx.add(function(){return t(e)}):t(e);r&&r.totalTime&&(e.callbackAnimation=r)}}function mb(e){return Ne.getComputedStyle(e)}function ob(e,t){for(var r in t)r in e||(e[r]=t[r]);return e}function qb(e,t){var r=t.d2;return e["offset"+r]||e["client"+r]||0}function rb(e){var t,r=[],n=e.labels,o=e.duration();for(t in n)r.push(n[t]/o);return r}function tb(o){var i=He.utils.snap(o),a=Array.isArray(o)&&o.slice(0).sort(function(e,t){return e-t});return a?function(e,t,r){var n;if(void 0===r&&(r=.001),!t)return i(e);if(0<t){for(e-=r,n=0;n<a.length;n++)if(a[n]>=e)return a[n];return a[n-1]}for(n=a.length,e+=r;n--;)if(a[n]<=e)return a[n];return a[0]}:function(e,t,r){void 0===r&&(r=.001);var n=i(e);return!t||Math.abs(n-e)<r||n-e<0==t<0?n:i(t<0?e-o:e+o)}}function vb(t,r,e,n){return e.split(",").forEach(function(e){return t(r,e,n)})}function wb(e,t,r,n,o){return e.addEventListener(t,r,{passive:!n,capture:!!o})}function xb(e,t,r,n){return e.removeEventListener(t,r,!!n)}function yb(e,t,r){(r=r&&r.wheelHandler)&&(e(t,"wheel",r),e(t,"touchmove",r))}function Cb(e,t){if(ct(e)){var r=e.indexOf("="),n=~r?(e.charAt(r-1)+1)*parseFloat(e.substr(r+1)):0;~r&&(e.indexOf("%")>r&&(n*=t/100),e=e.substr(0,r-1)),e=n+(e in H?H[e]*t:~e.indexOf("%")?parseFloat(e)*t/100:parseFloat(e)||0)}return e}function Db(e,t,r,n,o,i,a,s){var l=o.startColor,c=o.endColor,u=o.fontSize,f=o.indent,d=o.fontWeight,p=Xe.createElement("div"),g=La(r)||"fixed"===z(r,"pinType"),h=-1!==e.indexOf("scroller"),v=g?We:r,b=-1!==e.indexOf("start"),m=b?l:c,y="border-color:"+m+";font-size:"+u+";color:"+m+";font-weight:"+d+";pointer-events:none;white-space:nowrap;font-family:sans-serif,Arial;z-index:1000;padding:4px 8px;border-width:0;border-style:solid;";return y+="position:"+((h||s)&&g?"fixed;":"absolute;"),!h&&!s&&g||(y+=(n===Fe?q:I)+":"+(i+parseFloat(f))+"px;"),a&&(y+="box-sizing:border-box;text-align:left;width:"+a.offsetWidth+"px;"),p._isStart=b,p.setAttribute("class","gsap-marker-"+e+(t?" marker-"+t:"")),p.style.cssText=y,p.innerText=t||0===t?e+"-"+t:e,v.children[0]?v.insertBefore(p,v.children[0]):v.appendChild(p),p._offset=p["offset"+n.op.d2],X(p,0,n,b),p}function Ib(){return 34<at()-st&&(D=D||requestAnimationFrame(Z))}function Jb(){v&&v.isPressed&&!(v.startX>We.clientWidth)||(Ie.cache++,v?D=D||requestAnimationFrame(Z):Z(),st||U("scrollStart"),st=at())}function Kb(){y=Ne.innerWidth,m=Ne.innerHeight}function Lb(){Ie.cache++,je||h||Xe.fullscreenElement||Xe.webkitFullscreenElement||b&&y===Ne.innerWidth&&!(Math.abs(Ne.innerHeight-m)>.25*Ne.innerHeight)||c.restart(!0)}function Ob(){return xb(ne,"scrollEnd",Ob)||Pt(!0)}function Rb(e){for(var t=0;t<j.length;t+=5)(!e||j[t+4]&&j[t+4].query===e)&&(j[t].style.cssText=j[t+1],j[t].getBBox&&j[t].setAttribute("transform",j[t+2]||""),j[t+3].uncache=1)}function Sb(e,t){var r;for(Qe=0;Qe<Tt.length;Qe++)!(r=Tt[Qe])||t&&r._ctx!==t||(e?r.kill(1):r.revert(!0,!0));S=!0,t&&Rb(t),t||U("revert")}function Tb(e,t){Ie.cache++,!t&&rt||Ie.forEach(function(e){return Ta(e)&&e.cacheID++&&(e.rec=0)}),ct(e)&&(Ne.history.scrollRestoration=w=e)}function Yb(){We.appendChild(_),T=!v&&_.offsetHeight||Ne.innerHeight,We.removeChild(_)}function Zb(t){return Ve(".gsap-marker-start, .gsap-marker-end, .gsap-marker-scroller-start, .gsap-marker-scroller-end").forEach(function(e){return e.style.display=t?"none":"block"})}function gc(e,t,r,n){if(!e._gsap.swappedIn){for(var o,i=$.length,a=t.style,s=e.style;i--;)a[o=$[i]]=r[o];a.position="absolute"===r.position?"absolute":"relative","inline"===r.display&&(a.display="inline-block"),s[I]=s[q]="auto",a.flexBasis=r.flexBasis||"auto",a.overflow="visible",a.boxSizing="border-box",a[ft]=qb(e,Ye)+xt,a[dt]=qb(e,Fe)+xt,a[bt]=s[mt]=s.top=s.left="0",Et(n),s[ft]=s.maxWidth=r[ft],s[dt]=s.maxHeight=r[dt],s[bt]=r[bt],e.parentNode!==t&&(e.parentNode.insertBefore(t,e),t.appendChild(e)),e._gsap.swappedIn=!0}}function jc(e){for(var t=ee.length,r=e.style,n=[],o=0;o<t;o++)n.push(ee[o],r[ee[o]]);return n.t=e,n}function mc(e,t,r,n,o,i,a,s,l,c,u,f,d,p){Ta(e)&&(e=e(s)),ct(e)&&"max"===e.substr(0,3)&&(e=f+("="===e.charAt(4)?Cb("0"+e.substr(3),r):0));var g,h,v,b=d?d.time():0;if(d&&d.seek(0),isNaN(e)||(e=+e),Ua(e))d&&(e=He.utils.mapRange(d.scrollTrigger.start,d.scrollTrigger.end,0,f,e)),a&&X(a,r,n,!0);else{Ta(t)&&(t=t(s));var m,y,x,w,_=(e||"0").split(" ");v=J(t,s)||We,(m=wt(v)||{})&&(m.left||m.top)||"none"!==mb(v).display||(w=v.style.display,v.style.display="block",m=wt(v),w?v.style.display=w:v.style.removeProperty("display")),y=Cb(_[0],m[n.d]),x=Cb(_[1]||"0",r),e=m[n.p]-l[n.p]-c+y+o-x,a&&X(a,x,n,r-x<20||a._isStart&&20<x),r-=r-x}if(p&&(s[p]=e||-.001,e<0&&(e=0)),i){var C=e+r,T=i._isStart;g="scroll"+n.d2,X(i,C,n,T&&20<C||!T&&(u?Math.max(We[g],Je[g]):i.parentNode[g])<=C+1),u&&(l=wt(a),u&&(i.style[n.op.p]=l[n.op.p]-n.op.m-i._offset+xt))}return d&&v&&(g=wt(v),d.seek(f),h=wt(v),d._caScrollDist=g[n.p]-h[n.p],e=e/d._caScrollDist*f),d&&d.seek(b),d?e:Math.round(e)}function oc(e,t,r,n){if(e.parentNode!==t){var o,i,a=e.style;if(t===We){for(o in e._stOrig=a.cssText,i=mb(e))+o||re.test(o)||!i[o]||"string"!=typeof a[o]||"0"===o||(a[o]=i[o]);a.top=r,a.left=n}else a.cssText=e._stOrig;He.core.getCache(e).uncache=1,t.appendChild(e)}}function pc(r,e,n){var o=e,i=o;return function(e){var t=Math.round(r());return t!==o&&t!==i&&3<Math.abs(t-o)&&3<Math.abs(t-i)&&(e=t,n&&n()),i=o,o=e}}function qc(e,t,r){var n={};n[t.p]="+="+r,He.set(e,n)}function rc(c,e){function Ck(e,t,r,n,o){var i=Ck.tween,a=t.onComplete,s={};r=r||u();var l=pc(u,r,function(){i.kill(),Ck.tween=0});return o=n&&o||0,n=n||e-r,i&&i.kill(),t[f]=e,t.inherit=!1,(t.modifiers=s)[f]=function(){return l(r+n*i.ratio+o*i.ratio*i.ratio)},t.onUpdate=function(){Ie.cache++,Ck.tween&&Z()},t.onComplete=function(){Ck.tween=0,a&&a.call(i)},i=Ck.tween=He.to(c,t)}var u=K(c,e),f="_scroll"+e.p2;return(c[f]=u).wheelHandler=function(){return Ck.tween&&Ck.tween.kill()&&(Ck.tween=0)},wb(c,"wheel",u.wheelHandler),ne.isTouch&&wb(c,"touchmove",u.wheelHandler),Ck}var He,s,Ne,Xe,Je,We,l,c,Ve,Ue,Ke,u,je,Ge,f,Qe,d,p,g,Ze,$e,h,v,b,m,y,E,x,w,_,T,S,et,tt,D,rt,nt,ot,it=1,at=Date.now,R=at(),st=0,lt=0,ct=function _isString(e){return"string"==typeof e},ut=Math.abs,q="right",I="bottom",ft="width",dt="height",pt="Right",gt="Left",ht="Top",vt="Bottom",bt="padding",mt="margin",yt="Width",Y="Height",xt="px",wt=function _getBounds(e,t){var r=t&&"matrix(1, 0, 0, 1, 0, 0)"!==mb(e)[f]&&He.to(e,{x:0,y:0,xPercent:0,yPercent:0,rotation:0,rotationX:0,rotationY:0,scale:1,skewX:0,skewY:0}).progress(1),n=e.getBoundingClientRect();return r&&r.progress(0).kill(),n},_t={startColor:"green",endColor:"red",indent:0,fontSize:"16px",fontWeight:"normal"},Ct={toggleActions:"play",anticipatePin:0},H={top:0,left:0,center:.5,bottom:1,right:1},X=function _positionMarker(e,t,r,n){var o={display:"block"},i=r[n?"os2":"p2"],a=r[n?"p2":"os2"];e._isFlipped=n,o[r.a+"Percent"]=n?-100:0,o[r.a]=n?"1px":0,o["border"+i+yt]=1,o["border"+a+yt]=0,o[r.p]=t+"px",He.set(e,o)},Tt=[],St={},W={},V=[],U=function _dispatch(e){return W[e]&&W[e].map(function(e){return e()})||V},j=[],kt=0,Pt=function _refreshAll(e,t){if(!st||e||S){Yb(),rt=ne.isRefreshing=!0,Ie.forEach(function(e){return Ta(e)&&++e.cacheID&&(e.rec=e())});var r=U("refreshInit");Ze&&ne.sort(),t||Sb(),Ie.forEach(function(e){Ta(e)&&(e.smooth&&(e.target.style.scrollBehavior="auto"),e(0))}),Tt.slice(0).forEach(function(e){return e.refresh()}),S=!1,Tt.forEach(function(e){if(e._subPinOffset&&e.pin){var t=e.vars.horizontal?"offsetWidth":"offsetHeight",r=e.pin[t];e.revert(!0,1),e.adjustPinSpacing(e.pin[t]-r),e.refresh()}}),et=1,Zb(!0),Tt.forEach(function(e){var t=Qa(e.scroller,e._dir),r="max"===e.vars.end||e._endClamp&&e.end>t,n=e._startClamp&&e.start>=t;(r||n)&&e.setPositions(n?t-1:e.start,r?Math.max(n?t:e.start+1,t):e.end,!0)}),Zb(!1),et=0,r.forEach(function(e){return e&&e.render&&e.render(-1)}),Ie.forEach(function(e){Ta(e)&&(e.smooth&&requestAnimationFrame(function(){return e.target.style.scrollBehavior="smooth"}),e.rec&&e(e.rec))}),Tb(w,1),c.pause(),kt++,Z(rt=2),Tt.forEach(function(e){return Ta(e.vars.onRefresh)&&e.vars.onRefresh(e)}),rt=ne.isRefreshing=!1,U("refresh")}else wb(ne,"scrollEnd",Ob)},Q=0,Mt=1,Z=function _updateAll(e){if(2===e||!rt&&!S){ne.isUpdating=!0,ot&&ot.update(0);var t=Tt.length,r=at(),n=50<=r-R,o=t&&Tt[0].scroll();if(Mt=o<Q?-1:1,rt||(Q=o),n&&(st&&!Ge&&200<r-st&&(st=0,U("scrollEnd")),Ke=R,R=r),Mt<0){for(Qe=t;0<Qe--;)Tt[Qe]&&Tt[Qe].update(0,n);Mt=1}else for(Qe=0;Qe<t;Qe++)Tt[Qe]&&Tt[Qe].update(0,n);ne.isUpdating=!1}D=0},$=["left","top",I,q,mt+vt,mt+pt,mt+ht,mt+gt,"display","flexShrink","float","zIndex","gridColumnStart","gridColumnEnd","gridRowStart","gridRowEnd","gridArea","justifySelf","alignSelf","placeSelf","order"],ee=$.concat([ft,dt,"boxSizing","max"+yt,"max"+Y,"position",mt,bt,bt+ht,bt+pt,bt+vt,bt+gt]),te=/([A-Z])/g,Et=function _setState(e){if(e){var t,r,n=e.t.style,o=e.length,i=0;for((e.t._gsap||He.core.getCache(e.t)).uncache=1;i<o;i+=2)r=e[i+1],t=e[i],r?n[t]=r:n[t]&&n.removeProperty(t.replace(te,"-$1").toLowerCase())}},Ot={left:0,top:0},re=/(webkit|moz|length|cssText|inset)/i,ne=(ScrollTrigger.prototype.init=function init(E,O){if(this.progress=this.start=0,this.vars&&this.kill(!0,!0),lt){var A,n,p,D,R,B,q,I,L,Y,F,e,H,N,X,W,V,U,t,j,b,G,Q,m,Z,y,$,x,r,w,_,ee,o,g,te,re,ne,C,i,T=(E=ob(ct(E)||Ua(E)||E.nodeType?{trigger:E}:E,Ct)).onUpdate,S=E.toggleClass,a=E.id,k=E.onToggle,oe=E.onRefresh,P=E.scrub,ie=E.trigger,ae=E.pin,se=E.pinSpacing,le=E.invalidateOnRefresh,M=E.anticipatePin,s=E.onScrubComplete,h=E.onSnapComplete,ce=E.once,ue=E.snap,fe=E.pinReparent,l=E.pinSpacer,de=E.containerAnimation,pe=E.fastScrollEnd,ge=E.preventOverlaps,he=E.horizontal||E.containerAnimation&&!1!==E.horizontal?Ye:Fe,ve=!P&&0!==P,be=J(E.scroller||Ne),c=He.core.getCache(be),me=La(be),ye="fixed"===("pinType"in E?E.pinType:z(be,"pinType")||me&&"fixed"),xe=[E.onEnter,E.onLeave,E.onEnterBack,E.onLeaveBack],we=ve&&E.toggleActions.split(" "),_e="markers"in E?E.markers:Ct.markers,Ce=me?0:parseFloat(mb(be)["border"+he.p2+yt])||0,Te=this,Se=E.onRefreshInit&&function(){return E.onRefreshInit(Te)},ke=function _getSizeFunc(e,t,r){var n=r.d,o=r.d2,i=r.a;return(i=z(e,"getBoundingClientRect"))?function(){return i()[n]}:function(){return(t?Ma(o):e["client"+o])||0}}(be,me,he),Pe=function _getOffsetsFunc(e,t){return!t||~Le.indexOf(e)?Na(e):function(){return Ot}}(be,me),Me=0,Ee=0,Oe=0,Ae=K(be,he);if(Te._startClamp=Te._endClamp=!1,Te._dir=he,M*=45,Te.scroller=be,Te.scroll=de?de.time.bind(de):Ae,D=Ae(),Te.vars=E,O=O||E.animation,"refreshPriority"in E&&(Ze=1,-9999===E.refreshPriority&&(ot=Te)),c.tweenScroll=c.tweenScroll||{top:rc(be,Fe),left:rc(be,Ye)},Te.tweenTo=A=c.tweenScroll[he.p],Te.scrubDuration=function(e){(o=Ua(e)&&e)?ee?ee.duration(e):ee=He.to(O,{ease:"expo",totalProgress:"+=0",inherit:!1,duration:o,paused:!0,onComplete:function onComplete(){return s&&s(Te)}}):(ee&&ee.progress(1).kill(),ee=0)},O&&(O.vars.lazy=!1,O._initted&&!Te.isReverted||!1!==O.vars.immediateRender&&!1!==E.immediateRender&&O.duration()&&O.render(0,!0,!0),Te.animation=O.pause(),(O.scrollTrigger=Te).scrubDuration(P),w=0,a=a||O.vars.id),ue&&(Va(ue)&&!ue.push||(ue={snapTo:ue}),"scrollBehavior"in We.style&&He.set(me?[We,Je]:be,{scrollBehavior:"auto"}),Ie.forEach(function(e){return Ta(e)&&e.target===(me?Xe.scrollingElement||Je:be)&&(e.smooth=!1)}),p=Ta(ue.snapTo)?ue.snapTo:"labels"===ue.snapTo?function _getClosestLabel(t){return function(e){return He.utils.snap(rb(t),e)}}(O):"labelsDirectional"===ue.snapTo?function _getLabelAtDirection(r){return function(e,t){return tb(rb(r))(e,t.direction)}}(O):!1!==ue.directional?function(e,t){return tb(ue.snapTo)(e,at()-Ee<500?0:t.direction)}:He.utils.snap(ue.snapTo),g=ue.duration||{min:.1,max:2},g=Va(g)?Ue(g.min,g.max):Ue(g,g),te=He.delayedCall(ue.delay||o/2||.1,function(){var e=Ae(),t=at()-Ee<500,r=A.tween;if(!(t||Math.abs(Te.getVelocity())<10)||r||Ge||Me===e)Te.isActive&&Me!==e&&te.restart(!0);else{var n,o,i=(e-B)/N,a=O&&!ve?O.totalProgress():i,s=t?0:(a-_)/(at()-Ke)*1e3||0,l=He.utils.clamp(-i,1-i,ut(s/2)*s/.185),c=i+(!1===ue.inertia?0:l),u=ue.onStart,f=ue.onInterrupt,d=ue.onComplete;if(n=p(c,Te),Ua(n)||(n=c),o=Math.round(B+n*N),e<=q&&B<=e&&o!==e){if(r&&!r._initted&&r.data<=ut(o-e))return;!1===ue.inertia&&(l=n-i),A(o,{duration:g(ut(.185*Math.max(ut(c-a),ut(n-a))/s/.05||0)),ease:ue.ease||"power3",data:ut(o-e),onInterrupt:function onInterrupt(){return te.restart(!0)&&f&&f(Te)},onComplete:function onComplete(){Te.update(),Me=Ae(),O&&(ee?ee.resetTo("totalProgress",n,O._tTime/O._tDur):O.progress(n)),w=_=O&&!ve?O.totalProgress():Te.progress,h&&h(Te),d&&d(Te)}},e,l*N,o-e-l*N),u&&u(Te,A.tween)}}}).pause()),a&&(St[a]=Te),i=(i=(ie=Te.trigger=J(ie||!0!==ae&&ae))&&ie._gsap&&ie._gsap.stRevert)&&i(Te),ae=!0===ae?ie:J(ae),ct(S)&&(S={targets:ie,className:S}),ae&&(!1===se||se===mt||(se=!(!se&&ae.parentNode&&ae.parentNode.style&&"flex"===mb(ae.parentNode).display)&&bt),Te.pin=ae,(n=He.core.getCache(ae)).spacer?X=n.pinState:(l&&((l=J(l))&&!l.nodeType&&(l=l.current||l.nativeElement),n.spacerIsNative=!!l,l&&(n.spacerState=jc(l))),n.spacer=U=l||Xe.createElement("div"),U.classList.add("pin-spacer"),a&&U.classList.add("pin-spacer-"+a),n.pinState=X=jc(ae)),!1!==E.force3D&&He.set(ae,{force3D:!0}),Te.spacer=U=n.spacer,r=mb(ae),m=r[se+he.os2],j=He.getProperty(ae),b=He.quickSetter(ae,he.a,xt),gc(ae,U,r),V=jc(ae)),_e){e=Va(_e)?ob(_e,_t):_t,Y=Db("scroller-start",a,be,he,e,0),F=Db("scroller-end",a,be,he,e,0,Y),t=Y["offset"+he.op.d2];var u=J(z(be,"content")||be);I=this.markerStart=Db("start",a,u,he,e,t,0,de),L=this.markerEnd=Db("end",a,u,he,e,t,0,de),de&&(C=He.quickSetter([I,L],he.a,xt)),ye||Le.length&&!0===z(be,"fixedMarkers")||(function _makePositionable(e){var t=mb(e).position;e.style.position="absolute"===t||"fixed"===t?t:"relative"}(me?We:be),He.set([Y,F],{force3D:!0}),y=He.quickSetter(Y,he.a,xt),x=He.quickSetter(F,he.a,xt))}if(de){var f=de.vars.onUpdate,d=de.vars.onUpdateParams;de.eventCallback("onUpdate",function(){Te.update(0,0,1),f&&f.apply(de,d||[])})}if(Te.previous=function(){return Tt[Tt.indexOf(Te)-1]},Te.next=function(){return Tt[Tt.indexOf(Te)+1]},Te.revert=function(e,t){if(!t)return Te.kill(!0);var r=!1!==e||!Te.enabled,n=je;r!==Te.isReverted&&(r&&(re=Math.max(Ae(),Te.scroll.rec||0),Oe=Te.progress,ne=O&&O.progress()),I&&[I,L,Y,F].forEach(function(e){return e.style.display=r?"none":"block"}),r&&(je=Te).update(r),!ae||fe&&Te.isActive||(r?function _swapPinOut(e,t,r){Et(r);var n=e._gsap;if(n.spacerIsNative)Et(n.spacerState);else if(e._gsap.swappedIn){var o=t.parentNode;o&&(o.insertBefore(e,t),o.removeChild(t))}e._gsap.swappedIn=!1}(ae,U,X):gc(ae,U,mb(ae),Z)),r||Te.update(r),je=n,Te.isReverted=r)},Te.refresh=function(e,t,r,n){if(!je&&Te.enabled||t)if(ae&&e&&st)wb(ScrollTrigger,"scrollEnd",Ob);else{!rt&&Se&&Se(Te),je=Te,A.tween&&!r&&(A.tween.kill(),A.tween=0),ee&&ee.pause(),le&&O&&O.revert({kill:!1}).invalidate(),Te.isReverted||Te.revert(!0,!0),Te._subPinOffset=!1;var o,i,a,s,l,c,u,f,d,p,g,h,v,b=ke(),m=Pe(),y=de?de.duration():Qa(be,he),x=N<=.01,w=0,_=n||0,C=Va(r)?r.end:E.end,T=E.endTrigger||ie,S=Va(r)?r.start:E.start||(0!==E.start&&ie?ae?"0 0":"0 100%":0),k=Te.pinnedContainer=E.pinnedContainer&&J(E.pinnedContainer,Te),P=ie&&Math.max(0,Tt.indexOf(Te))||0,M=P;for(_e&&Va(r)&&(h=He.getProperty(Y,he.p),v=He.getProperty(F,he.p));M--;)(c=Tt[M]).end||c.refresh(0,1)||(je=Te),!(u=c.pin)||u!==ie&&u!==ae&&u!==k||c.isReverted||((p=p||[]).unshift(c),c.revert(!0,!0)),c!==Tt[M]&&(P--,M--);for(Ta(S)&&(S=S(Te)),S=Ca(S,"start",Te),B=mc(S,ie,b,he,Ae(),I,Y,Te,m,Ce,ye,y,de,Te._startClamp&&"_startClamp")||(ae?-.001:0),Ta(C)&&(C=C(Te)),ct(C)&&!C.indexOf("+=")&&(~C.indexOf(" ")?C=(ct(S)?S.split(" ")[0]:"")+C:(w=Cb(C.substr(2),b),C=ct(S)?S:(de?He.utils.mapRange(0,de.duration(),de.scrollTrigger.start,de.scrollTrigger.end,B):B)+w,T=ie)),C=Ca(C,"end",Te),q=Math.max(B,mc(C||(T?"100% 0":y),T,b,he,Ae()+w,L,F,Te,m,Ce,ye,y,de,Te._endClamp&&"_endClamp"))||-.001,w=0,M=P;M--;)(u=(c=Tt[M]).pin)&&c.start-c._pinPush<=B&&!de&&0<c.end&&(o=c.end-(Te._startClamp?Math.max(0,c.start):c.start),(u===ie&&c.start-c._pinPush<B||u===k)&&isNaN(S)&&(w+=o*(1-c.progress)),u===ae&&(_+=o));if(B+=w,q+=w,Te._startClamp&&(Te._startClamp+=w),Te._endClamp&&!rt&&(Te._endClamp=q||-.001,q=Math.min(q,Qa(be,he))),N=q-B||(B-=.01)&&.001,x&&(Oe=He.utils.clamp(0,1,He.utils.normalize(B,q,re))),Te._pinPush=_,I&&w&&((o={})[he.a]="+="+w,k&&(o[he.p]="-="+Ae()),He.set([I,L],o)),!ae||et&&Te.end>=Qa(be,he)){if(ie&&Ae()&&!de)for(i=ie.parentNode;i&&i!==We;)i._pinOffset&&(B-=i._pinOffset,q-=i._pinOffset),i=i.parentNode}else o=mb(ae),s=he===Fe,a=Ae(),G=parseFloat(j(he.a))+_,!y&&1<q&&(g={style:g=(me?Xe.scrollingElement||Je:be).style,value:g["overflow"+he.a.toUpperCase()]},me&&"scroll"!==mb(We)["overflow"+he.a.toUpperCase()]&&(g.style["overflow"+he.a.toUpperCase()]="scroll")),gc(ae,U,o),V=jc(ae),i=wt(ae,!0),f=ye&&K(be,s?Ye:Fe)(),se?((Z=[se+he.os2,N+_+xt]).t=U,(M=se===bt?qb(ae,he)+N+_:0)&&(Z.push(he.d,M+xt),"auto"!==U.style.flexBasis&&(U.style.flexBasis=M+xt)),Et(Z),k&&Tt.forEach(function(e){e.pin===k&&!1!==e.vars.pinSpacing&&(e._subPinOffset=!0)}),ye&&Ae(re)):(M=qb(ae,he))&&"auto"!==U.style.flexBasis&&(U.style.flexBasis=M+xt),ye&&((l={top:i.top+(s?a-B:f)+xt,left:i.left+(s?f:a-B)+xt,boxSizing:"border-box",position:"fixed"})[ft]=l.maxWidth=Math.ceil(i.width)+xt,l[dt]=l.maxHeight=Math.ceil(i.height)+xt,l[mt]=l[mt+ht]=l[mt+pt]=l[mt+vt]=l[mt+gt]="0",l[bt]=o[bt],l[bt+ht]=o[bt+ht],l[bt+pt]=o[bt+pt],l[bt+vt]=o[bt+vt],l[bt+gt]=o[bt+gt],W=function _copyState(e,t,r){for(var n,o=[],i=e.length,a=r?8:0;a<i;a+=2)n=e[a],o.push(n,n in t?t[n]:e[a+1]);return o.t=e.t,o}(X,l,fe),rt&&Ae(0)),O?(d=O._initted,$e(1),O.render(O.duration(),!0,!0),Q=j(he.a)-G+N+_,$=1<Math.abs(N-Q),ye&&$&&W.splice(W.length-2,2),O.render(0,!0,!0),d||O.invalidate(!0),O.parent||O.totalTime(O.totalTime()),$e(0)):Q=N,g&&(g.value?g.style["overflow"+he.a.toUpperCase()]=g.value:g.style.removeProperty("overflow-"+he.a));p&&p.forEach(function(e){return e.revert(!1,!0)}),Te.start=B,Te.end=q,D=R=rt?re:Ae(),de||rt||(D<re&&Ae(re),Te.scroll.rec=0),Te.revert(!1,!0),Ee=at(),te&&(Me=-1,te.restart(!0)),je=0,O&&ve&&(O._initted||ne)&&O.progress()!==ne&&O.progress(ne||0,!0).render(O.time(),!0,!0),(x||Oe!==Te.progress||de||le)&&(O&&!ve&&O.totalProgress(de&&B<-.001&&!Oe?He.utils.normalize(B,q,0):Oe,!0),Te.progress=x||(D-B)/N===Oe?0:Oe),ae&&se&&(U._pinOffset=Math.round(Te.progress*Q)),ee&&ee.invalidate(),isNaN(h)||(h-=He.getProperty(Y,he.p),v-=He.getProperty(F,he.p),qc(Y,he,h),qc(I,he,h-(n||0)),qc(F,he,v),qc(L,he,v-(n||0))),x&&!rt&&Te.update(),!oe||rt||H||(H=!0,oe(Te),H=!1)}},Te.getVelocity=function(){return(Ae()-R)/(at()-Ke)*1e3||0},Te.endAnimation=function(){Wa(Te.callbackAnimation),O&&(ee?ee.progress(1):O.paused()?ve||Wa(O,Te.direction<0,1):Wa(O,O.reversed()))},Te.labelToScroll=function(e){return O&&O.labels&&(B||Te.refresh()||B)+O.labels[e]/O.duration()*N||0},Te.getTrailing=function(t){var e=Tt.indexOf(Te),r=0<Te.direction?Tt.slice(0,e).reverse():Tt.slice(e+1);return(ct(t)?r.filter(function(e){return e.vars.preventOverlaps===t}):r).filter(function(e){return 0<Te.direction?e.end<=B:e.start>=q})},Te.update=function(e,t,r){if(!de||r||e){var n,o,i,a,s,l,c,u=!0===rt?re:Te.scroll(),f=e?0:(u-B)/N,d=f<0?0:1<f?1:f||0,p=Te.progress;if(t&&(R=D,D=de?Ae():u,ue&&(_=w,w=O&&!ve?O.totalProgress():d)),M&&ae&&!je&&!it&&st&&(!d&&B<u+(u-R)/(at()-Ke)*M?d=1e-4:1===d&&q>u+(u-R)/(at()-Ke)*M&&(d=.9999)),d!==p&&Te.enabled){if(a=(s=(n=Te.isActive=!!d&&d<1)!=(!!p&&p<1))||!!d!=!!p,Te.direction=p<d?1:-1,Te.progress=d,a&&!je&&(o=d&&!p?0:1===d?1:1===p?2:3,ve&&(i=!s&&"none"!==we[o+1]&&we[o+1]||we[o],c=O&&("complete"===i||"reset"===i||i in O))),ge&&(s||c)&&(c||P||!O)&&(Ta(ge)?ge(Te):Te.getTrailing(ge).forEach(function(e){return e.endAnimation()})),ve||(!ee||je||it?O&&O.totalProgress(d,!(!je||!Ee&&!e)):(ee._dp._time-ee._start!==ee._time&&ee.render(ee._dp._time-ee._start),ee.resetTo?ee.resetTo("totalProgress",d,O._tTime/O._tDur):(ee.vars.totalProgress=d,ee.invalidate().restart()))),ae)if(e&&se&&(U.style[se+he.os2]=m),ye){if(a){if(l=!e&&p<d&&u<q+1&&u+1>=Qa(be,he),fe)if(e||!n&&!l)oc(ae,U);else{var g=wt(ae,!0),h=u-B;oc(ae,We,g.top+(he===Fe?h:0)+xt,g.left+(he===Fe?0:h)+xt)}Et(n||l?W:V),$&&d<1&&n||b(G+(1!==d||l?0:Q))}}else b(Ia(G+Q*d));!ue||A.tween||je||it||te.restart(!0),S&&(s||ce&&d&&(d<1||!tt))&&Ve(S.targets).forEach(function(e){return e.classList[n||ce?"add":"remove"](S.className)}),!T||ve||e||T(Te),a&&!je?(ve&&(c&&("complete"===i?O.pause().totalProgress(1):"reset"===i?O.restart(!0).pause():"restart"===i?O.restart(!0):O[i]()),T&&T(Te)),!s&&tt||(k&&s&&Xa(Te,k),xe[o]&&Xa(Te,xe[o]),ce&&(1===d?Te.kill(!1,1):xe[o]=0),s||xe[o=1===d?1:3]&&Xa(Te,xe[o])),pe&&!n&&Math.abs(Te.getVelocity())>(Ua(pe)?pe:2500)&&(Wa(Te.callbackAnimation),ee?ee.progress(1):Wa(O,"reverse"===i?1:!d,1))):ve&&T&&!je&&T(Te)}if(x){var v=de?u/de.duration()*(de._caScrollDist||0):u;y(v+(Y._isFlipped?1:0)),x(v)}C&&C(-u/de.duration()*(de._caScrollDist||0))}},Te.enable=function(e,t){Te.enabled||(Te.enabled=!0,wb(be,"resize",Lb),me||wb(be,"scroll",Jb),Se&&wb(ScrollTrigger,"refreshInit",Se),!1!==e&&(Te.progress=Oe=0,D=R=Me=Ae()),!1!==t&&Te.refresh())},Te.getTween=function(e){return e&&A?A.tween:ee},Te.setPositions=function(e,t,r,n){if(de){var o=de.scrollTrigger,i=de.duration(),a=o.end-o.start;e=o.start+a*e/i,t=o.start+a*t/i}Te.refresh(!1,!1,{start:Da(e,r&&!!Te._startClamp),end:Da(t,r&&!!Te._endClamp)},n),Te.update()},Te.adjustPinSpacing=function(e){if(Z&&e){var t=Z.indexOf(he.d)+1;Z[t]=parseFloat(Z[t])+e+xt,Z[1]=parseFloat(Z[1])+e+xt,Et(Z)}},Te.disable=function(e,t){if(Te.enabled&&(!1!==e&&Te.revert(!0,!0),Te.enabled=Te.isActive=!1,t||ee&&ee.pause(),re=0,n&&(n.uncache=1),Se&&xb(ScrollTrigger,"refreshInit",Se),te&&(te.pause(),A.tween&&A.tween.kill()&&(A.tween=0)),!me)){for(var r=Tt.length;r--;)if(Tt[r].scroller===be&&Tt[r]!==Te)return;xb(be,"resize",Lb),me||xb(be,"scroll",Jb)}},Te.kill=function(e,t){Te.disable(e,t),ee&&!t&&ee.kill(),a&&delete St[a];var r=Tt.indexOf(Te);0<=r&&Tt.splice(r,1),r===Qe&&0<Mt&&Qe--,r=0,Tt.forEach(function(e){return e.scroller===Te.scroller&&(r=1)}),r||rt||(Te.scroll.rec=0),O&&(O.scrollTrigger=null,e&&O.revert({kill:!1}),t||O.kill()),I&&[I,L,Y,F].forEach(function(e){return e.parentNode&&e.parentNode.removeChild(e)}),ot===Te&&(ot=0),ae&&(n&&(n.uncache=1),r=0,Tt.forEach(function(e){return e.pin===ae&&r++}),r||(n.spacer=0)),E.onKill&&E.onKill(Te)},Tt.push(Te),Te.enable(!1,!1),i&&i(Te),O&&O.add&&!N){var v=Te.update;Te.update=function(){Te.update=v,B||q||Te.refresh()},He.delayedCall(.01,Te.update),N=.01,B=q=0}else Te.refresh();ae&&function _queueRefreshAll(){if(nt!==kt){var e=nt=kt;requestAnimationFrame(function(){return e===kt&&Pt(!0)})}}()}else this.update=this.refresh=this.kill=Ha},ScrollTrigger.register=function register(e){return s||(He=e||Ka(),Ja()&&window.document&&ScrollTrigger.enable(),s=lt),s},ScrollTrigger.defaults=function defaults(e){if(e)for(var t in e)Ct[t]=e[t];return Ct},ScrollTrigger.disable=function disable(t,r){lt=0,Tt.forEach(function(e){return e[r?"kill":"disable"](t)}),xb(Ne,"wheel",Jb),xb(Xe,"scroll",Jb),clearInterval(u),xb(Xe,"touchcancel",Ha),xb(We,"touchstart",Ha),vb(xb,Xe,"pointerdown,touchstart,mousedown",Fa),vb(xb,Xe,"pointerup,touchend,mouseup",Ga),c.kill(),Ra(xb);for(var e=0;e<Ie.length;e+=3)yb(xb,Ie[e],Ie[e+1]),yb(xb,Ie[e],Ie[e+2])},ScrollTrigger.enable=function enable(){if(Ne=window,Xe=document,Je=Xe.documentElement,We=Xe.body,He&&(Ve=He.utils.toArray,Ue=He.utils.clamp,x=He.core.context||Ha,$e=He.core.suppressOverwrites||Ha,w=Ne.history.scrollRestoration||"auto",Q=Ne.pageYOffset,He.core.globals("ScrollTrigger",ScrollTrigger),We)){lt=1,(_=document.createElement("div")).style.height="100vh",_.style.position="absolute",Yb(),function _rafBugFix(){return lt&&requestAnimationFrame(_rafBugFix)}(),k.register(He),ScrollTrigger.isTouch=k.isTouch,E=k.isTouch&&/(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent),b=1===k.isTouch,wb(Ne,"wheel",Jb),l=[Ne,Xe,Je,We],He.matchMedia?(ScrollTrigger.matchMedia=function(e){var t,r=He.matchMedia();for(t in e)r.add(t,e[t]);return r},He.addEventListener("matchMediaInit",function(){return Sb()}),He.addEventListener("matchMediaRevert",function(){return Rb()}),He.addEventListener("matchMedia",function(){Pt(0,1),U("matchMedia")}),He.matchMedia("(orientation: portrait)",function(){return Kb(),Kb})):console.warn("Requires GSAP 3.11.0 or later"),Kb(),wb(Xe,"scroll",Jb);var e,t,r=We.style,n=r.borderTopStyle,o=He.core.Animation.prototype;for(o.revert||Object.defineProperty(o,"revert",{value:function value(){return this.time(-.01,!0)}}),r.borderTopStyle="solid",e=wt(We),Fe.m=Math.round(e.top+Fe.sc())||0,Ye.m=Math.round(e.left+Ye.sc())||0,n?r.borderTopStyle=n:r.removeProperty("border-top-style"),u=setInterval(Ib,250),He.delayedCall(.5,function(){return it=0}),wb(Xe,"touchcancel",Ha),wb(We,"touchstart",Ha),vb(wb,Xe,"pointerdown,touchstart,mousedown",Fa),vb(wb,Xe,"pointerup,touchend,mouseup",Ga),f=He.utils.checkPrefix("transform"),ee.push(f),s=at(),c=He.delayedCall(.2,Pt).pause(),g=[Xe,"visibilitychange",function(){var e=Ne.innerWidth,t=Ne.innerHeight;Xe.hidden?(d=e,p=t):d===e&&p===t||Lb()},Xe,"DOMContentLoaded",Pt,Ne,"load",Pt,Ne,"resize",Lb],Ra(wb),Tt.forEach(function(e){return e.enable(0,1)}),t=0;t<Ie.length;t+=3)yb(xb,Ie[t],Ie[t+1]),yb(xb,Ie[t],Ie[t+2])}},ScrollTrigger.config=function config(e){"limitCallbacks"in e&&(tt=!!e.limitCallbacks);var t=e.syncInterval;t&&clearInterval(u)||(u=t)&&setInterval(Ib,t),"ignoreMobileResize"in e&&(b=1===ScrollTrigger.isTouch&&e.ignoreMobileResize),"autoRefreshEvents"in e&&(Ra(xb)||Ra(wb,e.autoRefreshEvents||"none"),h=-1===(e.autoRefreshEvents+"").indexOf("resize"))},ScrollTrigger.scrollerProxy=function scrollerProxy(e,t){var r=J(e),n=Ie.indexOf(r),o=La(r);~n&&Ie.splice(n,o?6:2),t&&(o?Le.unshift(Ne,t,We,t,Je,t):Le.unshift(r,t))},ScrollTrigger.clearMatchMedia=function clearMatchMedia(t){Tt.forEach(function(e){return e._ctx&&e._ctx.query===t&&e._ctx.kill(!0,!0)})},ScrollTrigger.isInViewport=function isInViewport(e,t,r){var n=(ct(e)?J(e):e).getBoundingClientRect(),o=n[r?ft:dt]*t||0;return r?0<n.right-o&&n.left+o<Ne.innerWidth:0<n.bottom-o&&n.top+o<Ne.innerHeight},ScrollTrigger.positionInViewport=function positionInViewport(e,t,r){ct(e)&&(e=J(e));var n=e.getBoundingClientRect(),o=n[r?ft:dt],i=null==t?o/2:t in H?H[t]*o:~t.indexOf("%")?parseFloat(t)*o/100:parseFloat(t)||0;return r?(n.left+i)/Ne.innerWidth:(n.top+i)/Ne.innerHeight},ScrollTrigger.killAll=function killAll(e){if(Tt.slice(0).forEach(function(e){return"ScrollSmoother"!==e.vars.id&&e.kill()}),!0!==e){var t=W.killAll||[];W={},t.forEach(function(e){return e()})}},ScrollTrigger);function ScrollTrigger(e,t){s||ScrollTrigger.register(He)||console.warn("Please gsap.registerPlugin(ScrollTrigger)"),x(this),this.init(e,t)}ne.version="3.12.5",ne.saveStyles=function(e){return e?Ve(e).forEach(function(e){if(e&&e.style){var t=j.indexOf(e);0<=t&&j.splice(t,5),j.push(e,e.style.cssText,e.getBBox&&e.getAttribute("transform"),He.core.getCache(e),x())}}):j},ne.revert=function(e,t){return Sb(!e,t)},ne.create=function(e,t){return new ne(e,t)},ne.refresh=function(e){return e?Lb():(s||ne.register())&&Pt(!0)},ne.update=function(e){return++Ie.cache&&Z(!0===e?2:0)},ne.clearScrollMemory=Tb,ne.maxScroll=function(e,t){return Qa(e,t?Ye:Fe)},ne.getScrollFunc=function(e,t){return K(J(e),t?Ye:Fe)},ne.getById=function(e){return St[e]},ne.getAll=function(){return Tt.filter(function(e){return"ScrollSmoother"!==e.vars.id})},ne.isScrolling=function(){return!!st},ne.snapDirectional=tb,ne.addEventListener=function(e,t){var r=W[e]||(W[e]=[]);~r.indexOf(t)||r.push(t)},ne.removeEventListener=function(e,t){var r=W[e],n=r&&r.indexOf(t);0<=n&&r.splice(n,1)},ne.batch=function(e,t){function Cp(e,t){var r=[],n=[],o=He.delayedCall(i,function(){t(r,n),r=[],n=[]}).pause();return function(e){r.length||o.restart(!0),r.push(e.trigger),n.push(e),a<=r.length&&o.progress(1)}}var r,n=[],o={},i=t.interval||.016,a=t.batchMax||1e9;for(r in t)o[r]="on"===r.substr(0,2)&&Ta(t[r])&&"onRefreshInit"!==r?Cp(0,t[r]):t[r];return Ta(a)&&(a=a(),wb(ne,"refresh",function(){return a=t.batchMax()})),Ve(e).forEach(function(e){var t={};for(r in o)t[r]=o[r];t.trigger=e,n.push(ne.create(t))}),n};function tc(e,t,r,n){return n<t?e(n):t<0&&e(0),n<r?(n-t)/(r-t):r<0?t/(t-r):1}function uc(e,t){!0===t?e.style.removeProperty("touch-action"):e.style.touchAction=!0===t?"auto":t?"pan-"+t+(k.isTouch?" pinch-zoom":""):"none",e===Je&&uc(We,t)}function wc(e){var t,r=e.event,n=e.target,o=e.axis,i=(r.changedTouches?r.changedTouches[0]:r).target,a=i._gsap||He.core.getCache(i),s=at();if(!a._isScrollT||2e3<s-a._isScrollT){for(;i&&i!==We&&(i.scrollHeight<=i.clientHeight&&i.scrollWidth<=i.clientWidth||!ie[(t=mb(i)).overflowY]&&!ie[t.overflowX]);)i=i.parentNode;a._isScroll=i&&i!==n&&!La(i)&&(ie[(t=mb(i)).overflowY]||ie[t.overflowX]),a._isScrollT=s}!a._isScroll&&"x"!==o||(r.stopPropagation(),r._gsapAllow=!0)}function xc(e,t,r,n){return k.create({target:e,capture:!0,debounce:!1,lockAxis:!0,type:t,onWheel:n=n&&wc,onPress:n,onDrag:n,onScroll:n,onEnable:function onEnable(){return r&&wb(Xe,k.eventTypes[0],se,!1,!0)},onDisable:function onDisable(){return xb(Xe,k.eventTypes[0],se,!0)}})}function Bc(e){function zq(){return o=!1}function Cq(){i=Qa(p,Fe),S=Ue(E?1:0,i),f&&(T=Ue(0,Qa(p,Ye))),l=kt}function Dq(){v._gsap.y=Ia(parseFloat(v._gsap.y)+b.offset)+"px",v.style.transform="matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, "+parseFloat(v._gsap.y)+", 0, 1)",b.offset=b.cacheID=0}function Jq(){Cq(),a.isActive()&&a.vars.scrollY>i&&(b()>i?a.progress(1)&&b(i):a.resetTo("scrollY",i))}Va(e)||(e={}),e.preventDefault=e.isNormalizer=e.allowClicks=!0,e.type||(e.type="wheel,touch"),e.debounce=!!e.debounce,e.id=e.id||"normalizer";var n,i,l,o,a,c,u,s,f=e.normalizeScrollX,t=e.momentum,r=e.allowNestedScroll,d=e.onRelease,p=J(e.target)||Je,g=He.core.globals().ScrollSmoother,h=g&&g.get(),v=E&&(e.content&&J(e.content)||h&&!1!==e.content&&!h.smooth()&&h.content()),b=K(p,Fe),m=K(p,Ye),y=1,x=(k.isTouch&&Ne.visualViewport?Ne.visualViewport.scale*Ne.visualViewport.width:Ne.outerWidth)/Ne.innerWidth,w=0,_=Ta(t)?function(){return t(n)}:function(){return t||2.8},C=xc(p,e.type,!0,r),T=Ha,S=Ha;return v&&He.set(v,{y:"+=0"}),e.ignoreCheck=function(e){return E&&"touchmove"===e.type&&function ignoreDrag(){if(o){requestAnimationFrame(zq);var e=Ia(n.deltaY/2),t=S(b.v-e);if(v&&t!==b.v+b.offset){b.offset=t-b.v;var r=Ia((parseFloat(v&&v._gsap.y)||0)-b.offset);v.style.transform="matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, "+r+", 0, 1)",v._gsap.y=r+"px",b.cacheID=Ie.cache,Z()}return!0}b.offset&&Dq(),o=!0}()||1.05<y&&"touchstart"!==e.type||n.isGesturing||e.touches&&1<e.touches.length},e.onPress=function(){o=!1;var e=y;y=Ia((Ne.visualViewport&&Ne.visualViewport.scale||1)/x),a.pause(),e!==y&&uc(p,1.01<y||!f&&"x"),c=m(),u=b(),Cq(),l=kt},e.onRelease=e.onGestureStart=function(e,t){if(b.offset&&Dq(),t){Ie.cache++;var r,n,o=_();f&&(n=(r=m())+.05*o*-e.velocityX/.227,o*=tc(m,r,n,Qa(p,Ye)),a.vars.scrollX=T(n)),n=(r=b())+.05*o*-e.velocityY/.227,o*=tc(b,r,n,Qa(p,Fe)),a.vars.scrollY=S(n),a.invalidate().duration(o).play(.01),(E&&a.vars.scrollY>=i||i-1<=r)&&He.to({},{onUpdate:Jq,duration:o})}else s.restart(!0);d&&d(e)},e.onWheel=function(){a._ts&&a.pause(),1e3<at()-w&&(l=0,w=at())},e.onChange=function(e,t,r,n,o){if(kt!==l&&Cq(),t&&f&&m(T(n[2]===t?c+(e.startX-e.x):m()+t-n[1])),r){b.offset&&Dq();var i=o[2]===r,a=i?u+e.startY-e.y:b()+r-o[1],s=S(a);i&&a!==s&&(u+=s-a),b(s)}(r||t)&&Z()},e.onEnable=function(){uc(p,!f&&"x"),ne.addEventListener("refresh",Jq),wb(Ne,"resize",Jq),b.smooth&&(b.target.style.scrollBehavior="auto",b.smooth=m.smooth=!1),C.enable()},e.onDisable=function(){uc(p,!0),xb(Ne,"resize",Jq),ne.removeEventListener("refresh",Jq),C.kill()},e.lockAxis=!1!==e.lockAxis,((n=new k(e)).iOS=E)&&!b()&&b(1),E&&He.ticker.add(Ha),s=n._dc,a=He.to(n,{ease:"power4",paused:!0,inherit:!1,scrollX:f?"+=0.1":"+=0",scrollY:"+=0.1",modifiers:{scrollY:pc(b,b(),function(){return a.pause()})},onUpdate:Z,onComplete:s.vars.onComplete}),n}var oe,ie={auto:1,scroll:1},ae=/(input|label|select|textarea)/i,se=function _captureInputs(e){var t=ae.test(e.target.tagName);(t||oe)&&(e._gsapAllow=!0,oe=t)};ne.sort=function(e){return Tt.sort(e||function(e,t){return-1e6*(e.vars.refreshPriority||0)+e.start-(t.start+-1e6*(t.vars.refreshPriority||0))})},ne.observe=function(e){return new k(e)},ne.normalizeScroll=function(e){if(void 0===e)return v;if(!0===e&&v)return v.enable();if(!1===e)return v&&v.kill(),void(v=e);var t=e instanceof k?e:Bc(e);return v&&v.target===t.target&&v.kill(),La(t.target)&&(v=t),t},ne.core={_getVelocityProp:L,_inputObserver:xc,_scrollers:Ie,_proxies:Le,bridge:{ss:function ss(){st||U("scrollStart"),st=at()},ref:function ref(){return je}}},Ka()&&He.registerPlugin(ne),e.ScrollTrigger=ne,e.default=ne;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}});
--
ddiff --git a/public/assets/vendor/gsap/gsap.min.js b/public/assets/vendor/gsap/gsap.min.js
ddeleted file mode 100644
iindex 14dd0a4..0000000
---- a/public/assets/vendor/gsap/gsap.min.js
++++ /dev/null
@@@ -1,11 +0,0 @@
--/*!
-- * GSAP 3.12.5
-- * https://gsap.com
-- *
-- * @license Copyright 2024, GreenSock. All rights reserved.
-- * Subject to the terms at https://gsap.com/standard-license or for Club GSAP members, the agreement issued with that membership.
-- * @author: Jack Doyle, [email protected]
-- */
--
--!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).window=t.window||{})}(this,function(e){"use strict";function _inheritsLoose(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}function _assertThisInitialized(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t){return"string"==typeof t}function s(t){return"function"==typeof t}function t(t){return"number"==typeof t}function u(t){return void 0===t}function v(t){return"object"==typeof t}function w(t){return!1!==t}function x(){return"undefined"!=typeof window}function y(t){return s(t)||r(t)}function P(t){return(i=yt(t,ot))&&ze}function Q(t,e){return console.warn("Invalid property",t,"set to",e,"Missing plugin? gsap.registerPlugin()")}function R(t,e){return!e&&console.warn(t)}function S(t,e){return t&&(ot[t]=e)&&i&&(i[t]=e)||ot}function T(){return 0}function ea(t){var e,r,i=t[0];if(v(i)||s(i)||(t=[t]),!(e=(i._gsap||{}).harness)){for(r=gt.length;r--&&!gt[r].targetTest(i););e=gt[r]}for(r=t.length;r--;)t[r]&&(t[r]._gsap||(t[r]._gsap=new Vt(t[r],e)))||t.splice(r,1);return t}function fa(t){return t._gsap||ea(Mt(t))[0]._gsap}function ga(t,e,r){return(r=t[e])&&s(r)?t[e]():u(r)&&t.getAttribute&&t.getAttribute(e)||r}function ha(t,e){return(t=t.split(",")).forEach(e)||t}function ia(t){return Math.round(1e5*t)/1e5||0}function ja(t){return Math.round(1e7*t)/1e7||0}function ka(t,e){var r=e.charAt(0),i=parseFloat(e.substr(2));return t=parseFloat(t),"+"===r?t+i:"-"===r?t-i:"*"===r?t*i:t/i}function la(t,e){for(var r=e.length,i=0;t.indexOf(e[i])<0&&++i<r;);return i<r}function ma(){var t,e,r=dt.length,i=dt.slice(0);for(ct={},t=dt.length=0;t<r;t++)(e=i[t])&&e._lazy&&(e.render(e._lazy[0],e._lazy[1],!0)._lazy=0)}function na(t,e,r,i){dt.length&&!L&&ma(),t.render(e,r,i||L&&e<0&&(t._initted||t._startAt)),dt.length&&!L&&ma()}function oa(t){var e=parseFloat(t);return(e||0===e)&&(t+"").match(at).length<2?e:r(t)?t.trim():t}function pa(t){return t}function qa(t,e){for(var r in e)r in t||(t[r]=e[r]);return t}function ta(t,e){for(var r in e)"__proto__"!==r&&"constructor"!==r&&"prototype"!==r&&(t[r]=v(e[r])?ta(t[r]||(t[r]={}),e[r]):e[r]);return t}function ua(t,e){var r,i={};for(r in t)r in e||(i[r]=t[r]);return i}function va(t){var e=t.parent||I,r=t.keyframes?function _setKeyframeDefaults(i){return function(t,e){for(var r in e)r in t||"duration"===r&&i||"ease"===r||(t[r]=e[r])}}(Z(t.keyframes)):qa;if(w(t.inherit))for(;e;)r(t,e.vars.defaults),e=e.parent||e._dp;return t}function xa(t,e,r,i,n){void 0===r&&(r="_first"),void 0===i&&(i="_last");var a,s=t[i];if(n)for(a=e[n];s&&s[n]>a;)s=s._prev;return s?(e._next=s._next,s._next=e):(e._next=t[r],t[r]=e),e._next?e._next._prev=e:t[i]=e,e._prev=s,e.parent=e._dp=t,e}function ya(t,e,r,i){void 0===r&&(r="_first"),void 0===i&&(i="_last");var n=e._prev,a=e._next;n?n._next=a:t[r]===e&&(t[r]=a),a?a._prev=n:t[i]===e&&(t[i]=n),e._next=e._prev=e.parent=null}function za(t,e){t.parent&&(!e||t.parent.autoRemoveChildren)&&t.parent.remove&&t.parent.remove(t),t._act=0}function Aa(t,e){if(t&&(!e||e._end>t._dur||e._start<0))for(var r=t;r;)r._dirty=1,r=r.parent;return t}function Ca(t,e,r,i){return t._startAt&&(L?t._startAt.revert(ht):t.vars.immediateRender&&!t.vars.autoRevert||t._startAt.render(e,!0,i))}function Ea(t){return t._repeat?Tt(t._tTime,t=t.duration()+t._rDelay)*t:0}function Ga(t,e){return(t-e._start)*e._ts+(0<=e._ts?0:e._dirty?e.totalDuration():e._tDur)}function Ha(t){return t._end=ja(t._start+(t._tDur/Math.abs(t._ts||t._rts||X)||0))}function Ia(t,e){var r=t._dp;return r&&r.smoothChildTiming&&t._ts&&(t._start=ja(r._time-(0<t._ts?e/t._ts:((t._dirty?t.totalDuration():t._tDur)-e)/-t._ts)),Ha(t),r._dirty||Aa(r,t)),t}function Ja(t,e){var r;if((e._time||!e._dur&&e._initted||e._start<t._time&&(e._dur||!e.add))&&(r=Ga(t.rawTime(),e),(!e._dur||Ot(0,e.totalDuration(),r)-e._tTime>X)&&e.render(r,!0)),Aa(t,e)._dp&&t._initted&&t._time>=t._dur&&t._ts){if(t._dur<t.duration())for(r=t;r._dp;)0<=r.rawTime()&&r.totalTime(r._tTime),r=r._dp;t._zTime=-X}}function Ka(e,r,i,n){return r.parent&&za(r),r._start=ja((t(i)?i:i||e!==I?xt(e,i,r):e._time)+r._delay),r._end=ja(r._start+(r.totalDuration()/Math.abs(r.timeScale())||0)),xa(e,r,"_first","_last",e._sort?"_start":0),bt(r)||(e._recent=r),n||Ja(e,r),e._ts<0&&Ia(e,e._tTime),e}function La(t,e){return(ot.ScrollTrigger||Q("scrollTrigger",e))&&ot.ScrollTrigger.create(e,t)}function Ma(t,e,r,i,n){return Qt(t,e,n),t._initted?!r&&t._pt&&!L&&(t._dur&&!1!==t.vars.lazy||!t._dur&&t.vars.lazy)&&f!==Rt.frame?(dt.push(t),t._lazy=[n,i],1):void 0:1}function Ra(t,e,r,i){var n=t._repeat,a=ja(e)||0,s=t._tTime/t._tDur;return s&&!i&&(t._time*=a/t._dur),t._dur=a,t._tDur=n?n<0?1e10:ja(a*(n+1)+t._rDelay*n):a,0<s&&!i&&Ia(t,t._tTime=t._tDur*s),t.parent&&Ha(t),r||Aa(t.parent,t),t}function Sa(t){return t instanceof Xt?Aa(t):Ra(t,t._dur)}function Va(e,r,i){var n,a,s=t(r[1]),o=(s?2:1)+(e<2?0:1),u=r[o];if(s&&(u.duration=r[1]),u.parent=i,e){for(n=u,a=i;a&&!("immediateRender"in n);)n=a.vars.defaults||{},a=w(a.vars.inherit)&&a.parent;u.immediateRender=w(n.immediateRender),e<2?u.runBackwards=1:u.startAt=r[o-1]}return new $t(r[0],u,r[1+o])}function Wa(t,e){return t||0===t?e(t):e}function Ya(t,e){return r(t)&&(e=st.exec(t))?e[1]:""}function _a(t,e){return t&&v(t)&&"length"in t&&(!e&&!t.length||t.length-1 in t&&v(t[0]))&&!t.nodeType&&t!==h}function cb(r){return r=Mt(r)[0]||R("Invalid scope")||{},function(t){var e=r.current||r.nativeElement||r;return Mt(t,e.querySelectorAll?e:e===r?R("Invalid scope")||a.createElement("div"):r)}}function db(t){return t.sort(function(){return.5-Math.random()})}function eb(t){if(s(t))return t;var p=v(t)?t:{each:t},_=jt(p.ease),m=p.from||0,g=parseFloat(p.base)||0,y={},e=0<m&&m<1,T=isNaN(m)||e,b=p.axis,w=m,x=m;return r(m)?w=x={center:.5,edges:.5,end:1}[m]||0:!e&&T&&(w=m[0],x=m[1]),function(t,e,r){var i,n,a,s,o,u,h,l,f,d=(r||p).length,c=y[d];if(!c){if(!(f="auto"===p.grid?0:(p.grid||[1,U])[1])){for(h=-U;h<(h=r[f++].getBoundingClientRect().left)&&f<d;);f<d&&f--}for(c=y[d]=[],i=T?Math.min(f,d)*w-.5:m%f,n=f===U?0:T?d*x/f-.5:m/f|0,l=U,u=h=0;u<d;u++)a=u%f-i,s=n-(u/f|0),c[u]=o=b?Math.abs("y"===b?s:a):K(a*a+s*s),h<o&&(h=o),o<l&&(l=o);"random"===m&&db(c),c.max=h-l,c.min=l,c.v=d=(parseFloat(p.amount)||parseFloat(p.each)*(d<f?d-1:b?"y"===b?d/f:f:Math.max(f,d/f))||0)*("edges"===m?-1:1),c.b=d<0?g-d:g,c.u=Ya(p.amount||p.each)||0,_=_&&d<0?Yt(_):_}return d=(c[t]-c.min)/c.max||0,ja(c.b+(_?_(d):d)*c.v)+c.u}}function fb(i){var n=Math.pow(10,((i+"").split(".")[1]||"").length);return function(e){var r=ja(Math.round(parseFloat(e)/i)*i*n);return(r-r%1)/n+(t(e)?0:Ya(e))}}function gb(h,e){var l,f,r=Z(h);return!r&&v(h)&&(l=r=h.radius||U,h.values?(h=Mt(h.values),(f=!t(h[0]))&&(l*=l)):h=fb(h.increment)),Wa(e,r?s(h)?function(t){return f=h(t),Math.abs(f-t)<=l?f:t}:function(e){for(var r,i,n=parseFloat(f?e.x:e),a=parseFloat(f?e.y:0),s=U,o=0,u=h.length;u--;)(r=f?(r=h[u].x-n)*r+(i=h[u].y-a)*i:Math.abs(h[u]-n))<s&&(s=r,o=u);return o=!l||s<=l?h[o]:e,f||o===e||t(e)?o:o+Ya(e)}:fb(h))}function hb(t,e,r,i){return Wa(Z(t)?!e:!0===r?!!(r=0):!i,function(){return Z(t)?t[~~(Math.random()*t.length)]:(r=r||1e-5)&&(i=r<1?Math.pow(10,(r+"").length-2):1)&&Math.floor(Math.round((t-r/2+Math.random()*(e-t+.99*r))/r)*r*i)/i})}function lb(e,r,t){return Wa(t,function(t){return e[~~r(t)]})}function ob(t){for(var e,r,i,n,a=0,s="";~(e=t.indexOf("random(",a));)i=t.indexOf(")",e),n="["===t.charAt(e+7),r=t.substr(e+7,i-e-7).match(n?at:tt),s+=t.substr(a,e-a)+hb(n?r:+r[0],n?0:+r[1],+r[2]||1e-5),a=i+1;return s+t.substr(a,t.length-a)}function rb(t,e,r){var i,n,a,s=t.labels,o=U;for(i in s)(n=s[i]-e)<0==!!r&&n&&o>(n=Math.abs(n))&&(a=i,o=n);return a}function tb(t){return za(t),t.scrollTrigger&&t.scrollTrigger.kill(!!L),t.progress()<1&&Ct(t,"onInterrupt"),t}function wb(t){if(t)if(t=!t.name&&t.default||t,x()||t.headless){var e=t.name,r=s(t),i=e&&!r&&t.init?function(){this._props=[]}:t,n={init:T,render:he,add:Wt,kill:ce,modifier:fe,rawVars:0},a={targetTest:0,get:0,getSetter:ne,aliases:{},register:0};if(Ft(),t!==i){if(pt[e])return;qa(i,qa(ua(t,n),a)),yt(i.prototype,yt(n,ua(t,a))),pt[i.prop=e]=i,t.targetTest&&(gt.push(i),ft[e]=1),e=("css"===e?"CSS":e.charAt(0).toUpperCase()+e.substr(1))+"Plugin"}S(e,i),t.register&&t.register(ze,i,_e)}else At.push(t)}function zb(t,e,r){return(6*(t+=t<0?1:1<t?-1:0)<1?e+(r-e)*t*6:t<.5?r:3*t<2?e+(r-e)*(2/3-t)*6:e)*St+.5|0}function Ab(e,r,i){var n,a,s,o,u,h,l,f,d,c,p=e?t(e)?[e>>16,e>>8&St,e&St]:0:zt.black;if(!p){if(","===e.substr(-1)&&(e=e.substr(0,e.length-1)),zt[e])p=zt[e];else if("#"===e.charAt(0)){if(e.length<6&&(e="#"+(n=e.charAt(1))+n+(a=e.charAt(2))+a+(s=e.charAt(3))+s+(5===e.length?e.charAt(4)+e.charAt(4):"")),9===e.length)return[(p=parseInt(e.substr(1,6),16))>>16,p>>8&St,p&St,parseInt(e.substr(7),16)/255];p=[(e=parseInt(e.substr(1),16))>>16,e>>8&St,e&St]}else if("hsl"===e.substr(0,3))if(p=c=e.match(tt),r){if(~e.indexOf("="))return p=e.match(et),i&&p.length<4&&(p[3]=1),p}else o=+p[0]%360/360,u=p[1]/100,n=2*(h=p[2]/100)-(a=h<=.5?h*(u+1):h+u-h*u),3<p.length&&(p[3]*=1),p[0]=zb(o+1/3,n,a),p[1]=zb(o,n,a),p[2]=zb(o-1/3,n,a);else p=e.match(tt)||zt.transparent;p=p.map(Number)}return r&&!c&&(n=p[0]/St,a=p[1]/St,s=p[2]/St,h=((l=Math.max(n,a,s))+(f=Math.min(n,a,s)))/2,l===f?o=u=0:(d=l-f,u=.5<h?d/(2-l-f):d/(l+f),o=l===n?(a-s)/d+(a<s?6:0):l===a?(s-n)/d+2:(n-a)/d+4,o*=60),p[0]=~~(o+.5),p[1]=~~(100*u+.5),p[2]=~~(100*h+.5)),i&&p.length<4&&(p[3]=1),p}function Bb(t){var r=[],i=[],n=-1;return t.split(Et).forEach(function(t){var e=t.match(rt)||[];r.push.apply(r,e),i.push(n+=e.length+1)}),r.c=i,r}function Cb(t,e,r){var i,n,a,s,o="",u=(t+o).match(Et),h=e?"hsla(":"rgba(",l=0;if(!u)return t;if(u=u.map(function(t){return(t=Ab(t,e,1))&&h+(e?t[0]+","+t[1]+"%,"+t[2]+"%,"+t[3]:t.join(","))+")"}),r&&(a=Bb(t),(i=r.c).join(o)!==a.c.join(o)))for(s=(n=t.replace(Et,"1").split(rt)).length-1;l<s;l++)o+=n[l]+(~i.indexOf(l)?u.shift()||h+"0,0,0,0)":(a.length?a:u.length?u:r).shift());if(!n)for(s=(n=t.split(Et)).length-1;l<s;l++)o+=n[l]+u[l];return o+n[s]}function Fb(t){var e,r=t.join(" ");if(Et.lastIndex=0,Et.test(r))return e=Dt.test(r),t[1]=Cb(t[1],e),t[0]=Cb(t[0],e,Bb(t[1])),!0}function Ob(t){var e=(t+"").split("("),r=Lt[e[0]];return r&&1<e.length&&r.config?r.config.apply(null,~t.indexOf("{")?[function _parseObjectInString(t){for(var e,r,i,n={},a=t.substr(1,t.length-3).split(":"),s=a[0],o=1,u=a.length;o<u;o++)r=a[o],e=o!==u-1?r.lastIndexOf(","):r.length,i=r.substr(0,e),n[s]=isNaN(i)?i.replace(Bt,"").trim():+i,s=r.substr(e+1).trim();return n}(e[1])]:function _valueInParentheses(t){var e=t.indexOf("(")+1,r=t.indexOf(")"),i=t.indexOf("(",e);return t.substring(e,~i&&i<r?t.indexOf(")",r+1):r)}(t).split(",").map(oa)):Lt._CE&&It.test(t)?Lt._CE("",t):r}function Qb(t,e){for(var r,i=t._first;i;)i instanceof Xt?Qb(i,e):!i.vars.yoyoEase||i._yoyo&&i._repeat||i._yoyo===e||(i.timeline?Qb(i.timeline,e):(r=i._ease,i._ease=i._yEase,i._yEase=r,i._yoyo=e)),i=i._next}function Sb(t,e,r,i){void 0===r&&(r=function easeOut(t){return 1-e(1-t)}),void 0===i&&(i=function easeInOut(t){return t<.5?e(2*t)/2:1-e(2*(1-t))/2});var n,a={easeIn:e,easeOut:r,easeInOut:i};return ha(t,function(t){for(var e in Lt[t]=ot[t]=a,Lt[n=t.toLowerCase()]=r,a)Lt[n+("easeIn"===e?".in":"easeOut"===e?".out":".inOut")]=Lt[t+"."+e]=a[e]}),a}function Tb(e){return function(t){return t<.5?(1-e(1-2*t))/2:.5+e(2*(t-.5))/2}}function Ub(r,t,e){function Jm(t){return 1===t?1:i*Math.pow(2,-10*t)*H((t-a)*n)+1}var i=1<=t?t:1,n=(e||(r?.3:.45))/(t<1?t:1),a=n/N*(Math.asin(1/i)||0),s="out"===r?Jm:"in"===r?function(t){return 1-Jm(1-t)}:Tb(Jm);return n=N/n,s.config=function(t,e){return Ub(r,t,e)},s}function Vb(e,r){function Rm(t){return t?--t*t*((r+1)*t+r)+1:0}void 0===r&&(r=1.70158);var t="out"===e?Rm:"in"===e?function(t){return 1-Rm(1-t)}:Tb(Rm);return t.config=function(t){return Vb(e,t)},t}var F,L,l,I,h,n,a,i,o,f,d,c,p,_,m,g,b,O,k,M,C,A,z,E,D,B,Y,j,q={autoSleep:120,force3D:"auto",nullTargetWarn:1,units:{lineHeight:""}},V={duration:.5,overwrite:!1,delay:0},U=1e8,X=1/U,N=2*Math.PI,G=N/4,W=0,K=Math.sqrt,J=Math.cos,H=Math.sin,$="function"==typeof ArrayBuffer&&ArrayBuffer.isView||function(){},Z=Array.isArray,tt=/(?:-?\.?\d|\.)+/gi,et=/[-+=.]*\d+[.e\-+]*\d*[e\-+]*\d*/g,rt=/[-+=.]*\d+[.e-]*\d*[a-z%]*/g,it=/[-+=.]*\d+\.?\d*(?:e-|e\+)?\d*/gi,nt=/[+-]=-?[.\d]+/,at=/[^,'"\[\]\s]+/gi,st=/^[+\-=e\s\d]*\d+[.\d]*([a-z]*|%)\s*$/i,ot={},ut={suppressEvents:!0,isStart:!0,kill:!1},ht={suppressEvents:!0,kill:!1},lt={suppressEvents:!0},ft={},dt=[],ct={},pt={},_t={},mt=30,gt=[],vt="",yt=function _merge(t,e){for(var r in e)t[r]=e[r];return t},Tt=function _animationCycle(t,e){var r=Math.floor(t/=e);return t&&r===t?r-1:r},bt=function _isFromOrFromStart(t){var e=t.data;return"isFromStart"===e||"isStart"===e},wt={_start:0,endTime:T,totalDuration:T},xt=function _parsePosition(t,e,i){var n,a,s,o=t.labels,u=t._recent||wt,h=t.duration()>=U?u.endTime(!1):t._dur;return r(e)&&(isNaN(e)||e in o)?(a=e.charAt(0),s="%"===e.substr(-1),n=e.indexOf("="),"<"===a||">"===a?(0<=n&&(e=e.replace(/=/,"")),("<"===a?u._start:u.endTime(0<=u._repeat))+(parseFloat(e.substr(1))||0)*(s?(n<0?u:i).totalDuration()/100:1)):n<0?(e in o||(o[e]=h),o[e]):(a=parseFloat(e.charAt(n-1)+e.substr(n+1)),s&&i&&(a=a/100*(Z(i)?i[0]:i).totalDuration()),1<n?_parsePosition(t,e.substr(0,n-1),i)+a:h+a)):null==e?h:+e},Ot=function _clamp(t,e,r){return r<t?t:e<r?e:r},kt=[].slice,Mt=function toArray(t,e,i){return l&&!e&&l.selector?l.selector(t):!r(t)||i||!n&&Ft()?Z(t)?function _flatten(t,e,i){return void 0===i&&(i=[]),t.forEach(function(t){return r(t)&&!e||_a(t,1)?i.push.apply(i,Mt(t)):i.push(t)})||i}(t,i):_a(t)?kt.call(t,0):t?[t]:[]:kt.call((e||a).querySelectorAll(t),0)},Pt=function mapRange(e,t,r,i,n){var a=t-e,s=i-r;return Wa(n,function(t){return r+((t-e)/a*s||0)})},Ct=function _callback(t,e,r){var i,n,a,s=t.vars,o=s[e],u=l,h=t._ctx;if(o)return i=s[e+"Params"],n=s.callbackScope||t,r&&dt.length&&ma(),h&&(l=h),a=i?o.apply(n,i):o.call(n),l=u,a},At=[],St=255,zt={aqua:[0,St,St],lime:[0,St,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,St],navy:[0,0,128],white:[St,St,St],olive:[128,128,0],yellow:[St,St,0],orange:[St,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[St,0,0],pink:[St,192,203],cyan:[0,St,St],transparent:[St,St,St,0]},Et=function(){var t,e="(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3,4}){1,2}\\b";for(t in zt)e+="|"+t+"\\b";return new RegExp(e+")","gi")}(),Dt=/hsl[a]?\(/,Rt=(k=Date.now,M=500,C=33,A=k(),z=A,D=E=1e3/240,g={time:0,frame:0,tick:function tick(){yl(!0)},deltaRatio:function deltaRatio(t){return b/(1e3/(t||60))},wake:function wake(){o&&(!n&&x()&&(h=n=window,a=h.document||{},ot.gsap=ze,(h.gsapVersions||(h.gsapVersions=[])).push(ze.version),P(i||h.GreenSockGlobals||!h.gsap&&h||{}),At.forEach(wb)),m="undefined"!=typeof requestAnimationFrame&&requestAnimationFrame,p&&g.sleep(),_=m||function(t){return setTimeout(t,D-1e3*g.time+1|0)},c=1,yl(2))},sleep:function sleep(){(m?cancelAnimationFrame:clearTimeout)(p),c=0,_=T},lagSmoothing:function lagSmoothing(t,e){M=t||1/0,C=Math.min(e||33,M)},fps:function fps(t){E=1e3/(t||240),D=1e3*g.time+E},add:function add(n,t,e){var a=t?function(t,e,r,i){n(t,e,r,i),g.remove(a)}:n;return g.remove(n),B[e?"unshift":"push"](a),Ft(),a},remove:function remove(t,e){~(e=B.indexOf(t))&&B.splice(e,1)&&e<=O&&O--},_listeners:B=[]}),Ft=function _wake(){return!c&&Rt.wake()},Lt={},It=/^[\d.\-M][\d.\-,\s]/,Bt=/["']/g,Yt=function _invertEase(e){return function(t){return 1-e(1-t)}},jt=function _parseEase(t,e){return t&&(s(t)?t:Lt[t]||Ob(t))||e};function yl(t){var e,r,i,n,a=k()-z,s=!0===t;if((M<a||a<0)&&(A+=a-C),(0<(e=(i=(z+=a)-A)-D)||s)&&(n=++g.frame,b=i-1e3*g.time,g.time=i/=1e3,D+=e+(E<=e?4:E-e),r=1),s||(p=_(yl)),r)for(O=0;O<B.length;O++)B[O](i,b,n,t)}function gn(t){return t<j?Y*t*t:t<.7272727272727273?Y*Math.pow(t-1.5/2.75,2)+.75:t<.9090909090909092?Y*(t-=2.25/2.75)*t+.9375:Y*Math.pow(t-2.625/2.75,2)+.984375}ha("Linear,Quad,Cubic,Quart,Quint,Strong",function(t,e){var r=e<5?e+1:e;Sb(t+",Power"+(r-1),e?function(t){return Math.pow(t,r)}:function(t){return t},function(t){return 1-Math.pow(1-t,r)},function(t){return t<.5?Math.pow(2*t,r)/2:1-Math.pow(2*(1-t),r)/2})}),Lt.Linear.easeNone=Lt.none=Lt.Linear.easeIn,Sb("Elastic",Ub("in"),Ub("out"),Ub()),Y=7.5625,j=1/2.75,Sb("Bounce",function(t){return 1-gn(1-t)},gn),Sb("Expo",function(t){return t?Math.pow(2,10*(t-1)):0}),Sb("Circ",function(t){return-(K(1-t*t)-1)}),Sb("Sine",function(t){return 1===t?1:1-J(t*G)}),Sb("Back",Vb("in"),Vb("out"),Vb()),Lt.SteppedEase=Lt.steps=ot.SteppedEase={config:function config(t,e){void 0===t&&(t=1);var r=1/t,i=t+(e?0:1),n=e?1:0;return function(t){return((i*Ot(0,.99999999,t)|0)+n)*r}}},V.ease=Lt["quad.out"],ha("onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt",function(t){return vt+=t+","+t+"Params,"});var qt,Vt=function GSCache(t,e){this.id=W++,(t._gsap=this).target=t,this.harness=e,this.get=e?e.get:ga,this.set=e?e.getSetter:ne},Ut=((qt=Animation.prototype).delay=function delay(t){return t||0===t?(this.parent&&this.parent.smoothChildTiming&&this.startTime(this._start+t-this._delay),this._delay=t,this):this._delay},qt.duration=function duration(t){return arguments.length?this.totalDuration(0<this._repeat?t+(t+this._rDelay)*this._repeat:t):this.totalDuration()&&this._dur},qt.totalDuration=function totalDuration(t){return arguments.length?(this._dirty=0,Ra(this,this._repeat<0?t:(t-this._repeat*this._rDelay)/(this._repeat+1))):this._tDur},qt.totalTime=function totalTime(t,e){if(Ft(),!arguments.length)return this._tTime;var r=this._dp;if(r&&r.smoothChildTiming&&this._ts){for(Ia(this,t),!r._dp||r.parent||Ja(r,this);r&&r.parent;)r.parent._time!==r._start+(0<=r._ts?r._tTime/r._ts:(r.totalDuration()-r._tTime)/-r._ts)&&r.totalTime(r._tTime,!0),r=r.parent;!this.parent&&this._dp.autoRemoveChildren&&(0<this._ts&&t<this._tDur||this._ts<0&&0<t||!this._tDur&&!t)&&Ka(this._dp,this,this._start-this._delay)}return(this._tTime!==t||!this._dur&&!e||this._initted&&Math.abs(this._zTime)===X||!t&&!this._initted&&(this.add||this._ptLookup))&&(this._ts||(this._pTime=t),na(this,t,e)),this},qt.time=function time(t,e){return arguments.length?this.totalTime(Math.min(this.totalDuration(),t+Ea(this))%(this._dur+this._rDelay)||(t?this._dur:0),e):this._time},qt.totalProgress=function totalProgress(t,e){return arguments.length?this.totalTime(this.totalDuration()*t,e):this.totalDuration()?Math.min(1,this._tTime/this._tDur):0<this.rawTime()?1:0},qt.progress=function progress(t,e){return arguments.length?this.totalTime(this.duration()*(!this._yoyo||1&this.iteration()?t:1-t)+Ea(this),e):this.duration()?Math.min(1,this._time/this._dur):0<this.rawTime()?1:0},qt.iteration=function iteration(t,e){var r=this.duration()+this._rDelay;return arguments.length?this.totalTime(this._time+(t-1)*r,e):this._repeat?Tt(this._tTime,r)+1:1},qt.timeScale=function timeScale(t,e){if(!arguments.length)return this._rts===-X?0:this._rts;if(this._rts===t)return this;var r=this.parent&&this._ts?Ga(this.parent._time,this):this._tTime;return this._rts=+t||0,this._ts=this._ps||t===-X?0:this._rts,this.totalTime(Ot(-Math.abs(this._delay),this._tDur,r),!1!==e),Ha(this),function _recacheAncestors(t){for(var e=t.parent;e&&e.parent;)e._dirty=1,e.totalDuration(),e=e.parent;return t}(this)},qt.paused=function paused(t){return arguments.length?(this._ps!==t&&((this._ps=t)?(this._pTime=this._tTime||Math.max(-this._delay,this.rawTime()),this._ts=this._act=0):(Ft(),this._ts=this._rts,this.totalTime(this.parent&&!this.parent.smoothChildTiming?this.rawTime():this._tTime||this._pTime,1===this.progress()&&Math.abs(this._zTime)!==X&&(this._tTime-=X)))),this):this._ps},qt.startTime=function startTime(t){if(arguments.length){this._start=t;var e=this.parent||this._dp;return!e||!e._sort&&this.parent||Ka(e,this,t-this._delay),this}return this._start},qt.endTime=function endTime(t){return this._start+(w(t)?this.totalDuration():this.duration())/Math.abs(this._ts||1)},qt.rawTime=function rawTime(t){var e=this.parent||this._dp;return e?t&&(!this._ts||this._repeat&&this._time&&this.totalProgress()<1)?this._tTime%(this._dur+this._rDelay):this._ts?Ga(e.rawTime(t),this):this._tTime:this._tTime},qt.revert=function revert(t){void 0===t&&(t=lt);var e=L;return L=t,(this._initted||this._startAt)&&(this.timeline&&this.timeline.revert(t),this.totalTime(-.01,t.suppressEvents)),"nested"!==this.data&&!1!==t.kill&&this.kill(),L=e,this},qt.globalTime=function globalTime(t){for(var e=this,r=arguments.length?t:e.rawTime();e;)r=e._start+r/(Math.abs(e._ts)||1),e=e._dp;return!this.parent&&this._sat?this._sat.globalTime(t):r},qt.repeat=function repeat(t){return arguments.length?(this._repeat=t===1/0?-2:t,Sa(this)):-2===this._repeat?1/0:this._repeat},qt.repeatDelay=function repeatDelay(t){if(arguments.length){var e=this._time;return this._rDelay=t,Sa(this),e?this.time(e):this}return this._rDelay},qt.yoyo=function yoyo(t){return arguments.length?(this._yoyo=t,this):this._yoyo},qt.seek=function seek(t,e){return this.totalTime(xt(this,t),w(e))},qt.restart=function restart(t,e){return this.play().totalTime(t?-this._delay:0,w(e))},qt.play=function play(t,e){return null!=t&&this.seek(t,e),this.reversed(!1).paused(!1)},qt.reverse=function reverse(t,e){return null!=t&&this.seek(t||this.totalDuration(),e),this.reversed(!0).paused(!1)},qt.pause=function pause(t,e){return null!=t&&this.seek(t,e),this.paused(!0)},qt.resume=function resume(){return this.paused(!1)},qt.reversed=function reversed(t){return arguments.length?(!!t!==this.reversed()&&this.timeScale(-this._rts||(t?-X:0)),this):this._rts<0},qt.invalidate=function invalidate(){return this._initted=this._act=0,this._zTime=-X,this},qt.isActive=function isActive(){var t,e=this.parent||this._dp,r=this._start;return!(e&&!(this._ts&&this._initted&&e.isActive()&&(t=e.rawTime(!0))>=r&&t<this.endTime(!0)-X))},qt.eventCallback=function eventCallback(t,e,r){var i=this.vars;return 1<arguments.length?(e?(i[t]=e,r&&(i[t+"Params"]=r),"onUpdate"===t&&(this._onUpdate=e)):delete i[t],this):i[t]},qt.then=function then(t){var i=this;return new Promise(function(e){function Co(){var t=i.then;i.then=null,s(r)&&(r=r(i))&&(r.then||r===i)&&(i.then=t),e(r),i.then=t}var r=s(t)?t:pa;i._initted&&1===i.totalProgress()&&0<=i._ts||!i._tTime&&i._ts<0?Co():i._prom=Co})},qt.kill=function kill(){tb(this)},Animation);function Animation(t){this.vars=t,this._delay=+t.delay||0,(this._repeat=t.repeat===1/0?-2:t.repeat||0)&&(this._rDelay=t.repeatDelay||0,this._yoyo=!!t.yoyo||!!t.yoyoEase),this._ts=1,Ra(this,+t.duration,1,1),this.data=t.data,l&&(this._ctx=l).data.push(this),c||Rt.wake()}qa(Ut.prototype,{_time:0,_start:0,_end:0,_tTime:0,_tDur:0,_dirty:0,_repeat:0,_yoyo:!1,parent:null,_initted:!1,_rDelay:0,_ts:1,_dp:0,ratio:0,_zTime:-X,_prom:0,_ps:!1,_rts:1});var Xt=function(i){function Timeline(t,e){var r;return void 0===t&&(t={}),(r=i.call(this,t)||this).labels={},r.smoothChildTiming=!!t.smoothChildTiming,r.autoRemoveChildren=!!t.autoRemoveChildren,r._sort=w(t.sortChildren),I&&Ka(t.parent||I,_assertThisInitialized(r),e),t.reversed&&r.reverse(),t.paused&&r.paused(!0),t.scrollTrigger&&La(_assertThisInitialized(r),t.scrollTrigger),r}_inheritsLoose(Timeline,i);var e=Timeline.prototype;return e.to=function to(t,e,r){return Va(0,arguments,this),this},e.from=function from(t,e,r){return Va(1,arguments,this),this},e.fromTo=function fromTo(t,e,r,i){return Va(2,arguments,this),this},e.set=function set(t,e,r){return e.duration=0,e.parent=this,va(e).repeatDelay||(e.repeat=0),e.immediateRender=!!e.immediateRender,new $t(t,e,xt(this,r),1),this},e.call=function call(t,e,r){return Ka(this,$t.delayedCall(0,t,e),r)},e.staggerTo=function staggerTo(t,e,r,i,n,a,s){return r.duration=e,r.stagger=r.stagger||i,r.onComplete=a,r.onCompleteParams=s,r.parent=this,new $t(t,r,xt(this,n)),this},e.staggerFrom=function staggerFrom(t,e,r,i,n,a,s){return r.runBackwards=1,va(r).immediateRender=w(r.immediateRender),this.staggerTo(t,e,r,i,n,a,s)},e.staggerFromTo=function staggerFromTo(t,e,r,i,n,a,s,o){return i.startAt=r,va(i).immediateRender=w(i.immediateRender),this.staggerTo(t,e,i,n,a,s,o)},e.render=function render(t,e,r){var i,n,a,s,o,u,h,l,f,d,c,p,_=this._time,m=this._dirty?this.totalDuration():this._tDur,g=this._dur,v=t<=0?0:ja(t),y=this._zTime<0!=t<0&&(this._initted||!g);if(this!==I&&m<v&&0<=t&&(v=m),v!==this._tTime||r||y){if(_!==this._time&&g&&(v+=this._time-_,t+=this._time-_),i=v,f=this._start,u=!(l=this._ts),y&&(g||(_=this._zTime),!t&&e||(this._zTime=t)),this._repeat){if(c=this._yoyo,o=g+this._rDelay,this._repeat<-1&&t<0)return this.totalTime(100*o+t,e,r);if(i=ja(v%o),v===m?(s=this._repeat,i=g):((s=~~(v/o))&&s===v/o&&(i=g,s--),g<i&&(i=g)),d=Tt(this._tTime,o),!_&&this._tTime&&d!==s&&this._tTime-d*o-this._dur<=0&&(d=s),c&&1&s&&(i=g-i,p=1),s!==d&&!this._lock){var T=c&&1&d,b=T===(c&&1&s);if(s<d&&(T=!T),_=T?0:v%g?g:v,this._lock=1,this.render(_||(p?0:ja(s*o)),e,!g)._lock=0,this._tTime=v,!e&&this.parent&&Ct(this,"onRepeat"),this.vars.repeatRefresh&&!p&&(this.invalidate()._lock=1),_&&_!==this._time||u!=!this._ts||this.vars.onRepeat&&!this.parent&&!this._act)return this;if(g=this._dur,m=this._tDur,b&&(this._lock=2,_=T?g:-1e-4,this.render(_,!0),this.vars.repeatRefresh&&!p&&this.invalidate()),this._lock=0,!this._ts&&!u)return this;Qb(this,p)}}if(this._hasPause&&!this._forcing&&this._lock<2&&(h=function _findNextPauseTween(t,e,r){var i;if(e<r)for(i=t._first;i&&i._start<=r;){if("isPause"===i.data&&i._start>e)return i;i=i._next}else for(i=t._last;i&&i._start>=r;){if("isPause"===i.data&&i._start<e)return i;i=i._prev}}(this,ja(_),ja(i)))&&(v-=i-(i=h._start)),this._tTime=v,this._time=i,this._act=!l,this._initted||(this._onUpdate=this.vars.onUpdate,this._initted=1,this._zTime=t,_=0),!_&&i&&!e&&!s&&(Ct(this,"onStart"),this._tTime!==v))return this;if(_<=i&&0<=t)for(n=this._first;n;){if(a=n._next,(n._act||i>=n._start)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0<n._ts?(i-n._start)*n._ts:(n._dirty?n.totalDuration():n._tDur)+(i-n._start)*n._ts,e,r),i!==this._time||!this._ts&&!u){h=0,a&&(v+=this._zTime=-X);break}}n=a}else{n=this._last;for(var w=t<0?t:i;n;){if(a=n._prev,(n._act||w<=n._end)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0<n._ts?(w-n._start)*n._ts:(n._dirty?n.totalDuration():n._tDur)+(w-n._start)*n._ts,e,r||L&&(n._initted||n._startAt)),i!==this._time||!this._ts&&!u){h=0,a&&(v+=this._zTime=w?-X:X);break}}n=a}}if(h&&!e&&(this.pause(),h.render(_<=i?0:-X)._zTime=_<=i?1:-1,this._ts))return this._start=f,Ha(this),this.render(t,e,r);this._onUpdate&&!e&&Ct(this,"onUpdate",!0),(v===m&&this._tTime>=this.totalDuration()||!v&&_)&&(f!==this._start&&Math.abs(l)===Math.abs(this._ts)||this._lock||(!t&&g||!(v===m&&0<this._ts||!v&&this._ts<0)||za(this,1),e||t<0&&!_||!v&&!_&&m||(Ct(this,v===m&&0<=t?"onComplete":"onReverseComplete",!0),!this._prom||v<m&&0<this.timeScale()||this._prom())))}return this},e.add=function add(e,i){var n=this;if(t(i)||(i=xt(this,i,e)),!(e instanceof Ut)){if(Z(e))return e.forEach(function(t){return n.add(t,i)}),this;if(r(e))return this.addLabel(e,i);if(!s(e))return this;e=$t.delayedCall(0,e)}return this!==e?Ka(this,e,i):this},e.getChildren=function getChildren(t,e,r,i){void 0===t&&(t=!0),void 0===e&&(e=!0),void 0===r&&(r=!0),void 0===i&&(i=-U);for(var n=[],a=this._first;a;)a._start>=i&&(a instanceof $t?e&&n.push(a):(r&&n.push(a),t&&n.push.apply(n,a.getChildren(!0,e,r)))),a=a._next;return n},e.getById=function getById(t){for(var e=this.getChildren(1,1,1),r=e.length;r--;)if(e[r].vars.id===t)return e[r]},e.remove=function remove(t){return r(t)?this.removeLabel(t):s(t)?this.killTweensOf(t):(ya(this,t),t===this._recent&&(this._recent=this._last),Aa(this))},e.totalTime=function totalTime(t,e){return arguments.length?(this._forcing=1,!this._dp&&this._ts&&(this._start=ja(Rt.time-(0<this._ts?t/this._ts:(this.totalDuration()-t)/-this._ts))),i.prototype.totalTime.call(this,t,e),this._forcing=0,this):this._tTime},e.addLabel=function addLabel(t,e){return this.labels[t]=xt(this,e),this},e.removeLabel=function removeLabel(t){return delete this.labels[t],this},e.addPause=function addPause(t,e,r){var i=$t.delayedCall(0,e||T,r);return i.data="isPause",this._hasPause=1,Ka(this,i,xt(this,t))},e.removePause=function removePause(t){var e=this._first;for(t=xt(this,t);e;)e._start===t&&"isPause"===e.data&&za(e),e=e._next},e.killTweensOf=function killTweensOf(t,e,r){for(var i=this.getTweensOf(t,r),n=i.length;n--;)Nt!==i[n]&&i[n].kill(t,e);return this},e.getTweensOf=function getTweensOf(e,r){for(var i,n=[],a=Mt(e),s=this._first,o=t(r);s;)s instanceof $t?la(s._targets,a)&&(o?(!Nt||s._initted&&s._ts)&&s.globalTime(0)<=r&&s.globalTime(s.totalDuration())>r:!r||s.isActive())&&n.push(s):(i=s.getTweensOf(a,r)).length&&n.push.apply(n,i),s=s._next;return n},e.tweenTo=function tweenTo(t,e){e=e||{};var r,i=this,n=xt(i,t),a=e.startAt,s=e.onStart,o=e.onStartParams,u=e.immediateRender,h=$t.to(i,qa({ease:e.ease||"none",lazy:!1,immediateRender:!1,time:n,overwrite:"auto",duration:e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale())||X,onStart:function onStart(){if(i.pause(),!r){var t=e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale());h._dur!==t&&Ra(h,t,0,1).render(h._time,!0,!0),r=1}s&&s.apply(h,o||[])}},e));return u?h.render(0):h},e.tweenFromTo=function tweenFromTo(t,e,r){return this.tweenTo(e,qa({startAt:{time:xt(this,t)}},r))},e.recent=function recent(){return this._recent},e.nextLabel=function nextLabel(t){return void 0===t&&(t=this._time),rb(this,xt(this,t))},e.previousLabel=function previousLabel(t){return void 0===t&&(t=this._time),rb(this,xt(this,t),1)},e.currentLabel=function currentLabel(t){return arguments.length?this.seek(t,!0):this.previousLabel(this._time+X)},e.shiftChildren=function shiftChildren(t,e,r){void 0===r&&(r=0);for(var i,n=this._first,a=this.labels;n;)n._start>=r&&(n._start+=t,n._end+=t),n=n._next;if(e)for(i in a)a[i]>=r&&(a[i]+=t);return Aa(this)},e.invalidate=function invalidate(t){var e=this._first;for(this._lock=0;e;)e.invalidate(t),e=e._next;return i.prototype.invalidate.call(this,t)},e.clear=function clear(t){void 0===t&&(t=!0);for(var e,r=this._first;r;)e=r._next,this.remove(r),r=e;return this._dp&&(this._time=this._tTime=this._pTime=0),t&&(this.labels={}),Aa(this)},e.totalDuration=function totalDuration(t){var e,r,i,n=0,a=this,s=a._last,o=U;if(arguments.length)return a.timeScale((a._repeat<0?a.duration():a.totalDuration())/(a.reversed()?-t:t));if(a._dirty){for(i=a.parent;s;)e=s._prev,s._dirty&&s.totalDuration(),o<(r=s._start)&&a._sort&&s._ts&&!a._lock?(a._lock=1,Ka(a,s,r-s._delay,1)._lock=0):o=r,r<0&&s._ts&&(n-=r,(!i&&!a._dp||i&&i.smoothChildTiming)&&(a._start+=r/a._ts,a._time-=r,a._tTime-=r),a.shiftChildren(-r,!1,-Infinity),o=0),s._end>n&&s._ts&&(n=s._end),s=e;Ra(a,a===I&&a._time>n?a._time:n,1,1),a._dirty=0}return a._tDur},Timeline.updateRoot=function updateRoot(t){if(I._ts&&(na(I,Ga(t,I)),f=Rt.frame),Rt.frame>=mt){mt+=q.autoSleep||120;var e=I._first;if((!e||!e._ts)&&q.autoSleep&&Rt._listeners.length<2){for(;e&&!e._ts;)e=e._next;e||Rt.sleep()}}},Timeline}(Ut);qa(Xt.prototype,{_lock:0,_hasPause:0,_forcing:0});function ac(t,e,i,n,a,o){var u,h,l,f;if(pt[t]&&!1!==(u=new pt[t]).init(a,u.rawVars?e[t]:function _processVars(t,e,i,n,a){if(s(t)&&(t=Kt(t,a,e,i,n)),!v(t)||t.style&&t.nodeType||Z(t)||$(t))return r(t)?Kt(t,a,e,i,n):t;var o,u={};for(o in t)u[o]=Kt(t[o],a,e,i,n);return u}(e[t],n,a,o,i),i,n,o)&&(i._pt=h=new _e(i._pt,a,t,0,1,u.render,u,0,u.priority),i!==d))for(l=i._ptLookup[i._targets.indexOf(a)],f=u._props.length;f--;)l[u._props[f]]=h;return u}function gc(t,r,e,i){var n,a,s=r.ease||i||"power1.inOut";if(Z(r))a=e[t]||(e[t]=[]),r.forEach(function(t,e){return a.push({t:e/(r.length-1)*100,v:t,e:s})});else for(n in r)a=e[n]||(e[n]=[]),"ease"===n||a.push({t:parseFloat(t),v:r[n],e:s})}var Nt,Gt,Wt=function _addPropTween(t,e,i,n,a,o,u,h,l,f){s(n)&&(n=n(a||0,t,o));var d,c=t[e],p="get"!==i?i:s(c)?l?t[e.indexOf("set")||!s(t["get"+e.substr(3)])?e:"get"+e.substr(3)](l):t[e]():c,_=s(c)?l?re:te:Zt;if(r(n)&&(~n.indexOf("random(")&&(n=ob(n)),"="===n.charAt(1)&&(!(d=ka(p,n)+(Ya(p)||0))&&0!==d||(n=d))),!f||p!==n||Gt)return isNaN(p*n)||""===n?(c||e in t||Q(e,n),function _addComplexStringPropTween(t,e,r,i,n,a,s){var o,u,h,l,f,d,c,p,_=new _e(this._pt,t,e,0,1,ue,null,n),m=0,g=0;for(_.b=r,_.e=i,r+="",(c=~(i+="").indexOf("random("))&&(i=ob(i)),a&&(a(p=[r,i],t,e),r=p[0],i=p[1]),u=r.match(it)||[];o=it.exec(i);)l=o[0],f=i.substring(m,o.index),h?h=(h+1)%5:"rgba("===f.substr(-5)&&(h=1),l!==u[g++]&&(d=parseFloat(u[g-1])||0,_._pt={_next:_._pt,p:f||1===g?f:",",s:d,c:"="===l.charAt(1)?ka(d,l)-d:parseFloat(l)-d,m:h&&h<4?Math.round:0},m=it.lastIndex);return _.c=m<i.length?i.substring(m,i.length):"",_.fp=s,(nt.test(i)||c)&&(_.e=0),this._pt=_}.call(this,t,e,p,n,_,h||q.stringFilter,l)):(d=new _e(this._pt,t,e,+p||0,n-(p||0),"boolean"==typeof c?se:ae,0,_),l&&(d.fp=l),u&&d.modifier(u,this,t),this._pt=d)},Qt=function _initTween(t,e,r){var i,n,a,s,o,u,h,l,f,d,c,p,_,m=t.vars,g=m.ease,v=m.startAt,y=m.immediateRender,T=m.lazy,b=m.onUpdate,x=m.runBackwards,O=m.yoyoEase,k=m.keyframes,M=m.autoRevert,P=t._dur,C=t._startAt,A=t._targets,S=t.parent,z=S&&"nested"===S.data?S.vars.targets:A,E="auto"===t._overwrite&&!F,D=t.timeline;if(!D||k&&g||(g="none"),t._ease=jt(g,V.ease),t._yEase=O?Yt(jt(!0===O?g:O,V.ease)):0,O&&t._yoyo&&!t._repeat&&(O=t._yEase,t._yEase=t._ease,t._ease=O),t._from=!D&&!!m.runBackwards,!D||k&&!m.stagger){if(p=(l=A[0]?fa(A[0]).harness:0)&&m[l.prop],i=ua(m,ft),C&&(C._zTime<0&&C.progress(1),e<0&&x&&y&&!M?C.render(-1,!0):C.revert(x&&P?ht:ut),C._lazy=0),v){if(za(t._startAt=$t.set(A,qa({data:"isStart",overwrite:!1,parent:S,immediateRender:!0,lazy:!C&&w(T),startAt:null,delay:0,onUpdate:b&&function(){return Ct(t,"onUpdate")},stagger:0},v))),t._startAt._dp=0,t._startAt._sat=t,e<0&&(L||!y&&!M)&&t._startAt.revert(ht),y&&P&&e<=0&&r<=0)return void(e&&(t._zTime=e))}else if(x&&P&&!C)if(e&&(y=!1),a=qa({overwrite:!1,data:"isFromStart",lazy:y&&!C&&w(T),immediateRender:y,stagger:0,parent:S},i),p&&(a[l.prop]=p),za(t._startAt=$t.set(A,a)),t._startAt._dp=0,t._startAt._sat=t,e<0&&(L?t._startAt.revert(ht):t._startAt.render(-1,!0)),t._zTime=e,y){if(!e)return}else _initTween(t._startAt,X,X);for(t._pt=t._ptCache=0,T=P&&w(T)||T&&!P,n=0;n<A.length;n++){if(h=(o=A[n])._gsap||ea(A)[n]._gsap,t._ptLookup[n]=d={},ct[h.id]&&dt.length&&ma(),c=z===A?n:z.indexOf(o),l&&!1!==(f=new l).init(o,p||i,t,c,z)&&(t._pt=s=new _e(t._pt,o,f.name,0,1,f.render,f,0,f.priority),f._props.forEach(function(t){d[t]=s}),f.priority&&(u=1)),!l||p)for(a in i)pt[a]&&(f=ac(a,i,t,c,o,z))?f.priority&&(u=1):d[a]=s=Wt.call(t,o,a,"get",i[a],c,z,0,m.stringFilter);t._op&&t._op[n]&&t.kill(o,t._op[n]),E&&t._pt&&(Nt=t,I.killTweensOf(o,d,t.globalTime(e)),_=!t.parent,Nt=0),t._pt&&T&&(ct[h.id]=1)}u&&pe(t),t._onInit&&t._onInit(t)}t._onUpdate=b,t._initted=(!t._op||t._pt)&&!_,k&&e<=0&&D.render(U,!0,!0)},Kt=function _parseFuncOrString(t,e,i,n,a){return s(t)?t.call(e,i,n,a):r(t)&&~t.indexOf("random(")?ob(t):t},Jt=vt+"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert",Ht={};ha(Jt+",id,stagger,delay,duration,paused,scrollTrigger",function(t){return Ht[t]=1});var $t=function(D){function Tween(e,r,i,n){var a;"number"==typeof r&&(i.duration=r,r=i,i=null);var s,o,u,h,l,f,d,c,p=(a=D.call(this,n?r:va(r))||this).vars,_=p.duration,m=p.delay,g=p.immediateRender,T=p.stagger,b=p.overwrite,x=p.keyframes,O=p.defaults,k=p.scrollTrigger,M=p.yoyoEase,P=r.parent||I,C=(Z(e)||$(e)?t(e[0]):"length"in r)?[e]:Mt(e);if(a._targets=C.length?ea(C):R("GSAP target "+e+" not found. https://gsap.com",!q.nullTargetWarn)||[],a._ptLookup=[],a._overwrite=b,x||T||y(_)||y(m)){if(r=a.vars,(s=a.timeline=new Xt({data:"nested",defaults:O||{},targets:P&&"nested"===P.data?P.vars.targets:C})).kill(),s.parent=s._dp=_assertThisInitialized(a),s._start=0,T||y(_)||y(m)){if(h=C.length,d=T&&eb(T),v(T))for(l in T)~Jt.indexOf(l)&&((c=c||{})[l]=T[l]);for(o=0;o<h;o++)(u=ua(r,Ht)).stagger=0,M&&(u.yoyoEase=M),c&&yt(u,c),f=C[o],u.duration=+Kt(_,_assertThisInitialized(a),o,f,C),u.delay=(+Kt(m,_assertThisInitialized(a),o,f,C)||0)-a._delay,!T&&1===h&&u.delay&&(a._delay=m=u.delay,a._start+=m,u.delay=0),s.to(f,u,d?d(o,f,C):0),s._ease=Lt.none;s.duration()?_=m=0:a.timeline=0}else if(x){va(qa(s.vars.defaults,{ease:"none"})),s._ease=jt(x.ease||r.ease||"none");var A,S,z,E=0;if(Z(x))x.forEach(function(t){return s.to(C,t,">")}),s.duration();else{for(l in u={},x)"ease"===l||"easeEach"===l||gc(l,x[l],u,x.easeEach);for(l in u)for(A=u[l].sort(function(t,e){return t.t-e.t}),o=E=0;o<A.length;o++)(z={ease:(S=A[o]).e,duration:(S.t-(o?A[o-1].t:0))/100*_})[l]=S.v,s.to(C,z,E),E+=z.duration;s.duration()<_&&s.to({},{duration:_-s.duration()})}}_||a.duration(_=s.duration())}else a.timeline=0;return!0!==b||F||(Nt=_assertThisInitialized(a),I.killTweensOf(C),Nt=0),Ka(P,_assertThisInitialized(a),i),r.reversed&&a.reverse(),r.paused&&a.paused(!0),(g||!_&&!x&&a._start===ja(P._time)&&w(g)&&function _hasNoPausedAncestors(t){return!t||t._ts&&_hasNoPausedAncestors(t.parent)}(_assertThisInitialized(a))&&"nested"!==P.data)&&(a._tTime=-X,a.render(Math.max(0,-m)||0)),k&&La(_assertThisInitialized(a),k),a}_inheritsLoose(Tween,D);var e=Tween.prototype;return e.render=function render(t,e,r){var i,n,a,s,o,u,h,l,f,d=this._time,c=this._tDur,p=this._dur,_=t<0,m=c-X<t&&!_?c:t<X?0:t;if(p){if(m!==this._tTime||!t||r||!this._initted&&this._tTime||this._startAt&&this._zTime<0!=_){if(i=m,l=this.timeline,this._repeat){if(s=p+this._rDelay,this._repeat<-1&&_)return this.totalTime(100*s+t,e,r);if(i=ja(m%s),m===c?(a=this._repeat,i=p):((a=~~(m/s))&&a===ja(m/s)&&(i=p,a--),p<i&&(i=p)),(u=this._yoyo&&1&a)&&(f=this._yEase,i=p-i),o=Tt(this._tTime,s),i===d&&!r&&this._initted&&a===o)return this._tTime=m,this;a!==o&&(l&&this._yEase&&Qb(l,u),this.vars.repeatRefresh&&!u&&!this._lock&&this._time!==s&&this._initted&&(this._lock=r=1,this.render(ja(s*a),!0).invalidate()._lock=0))}if(!this._initted){if(Ma(this,_?t:i,r,e,m))return this._tTime=0,this;if(!(d===this._time||r&&this.vars.repeatRefresh&&a!==o))return this;if(p!==this._dur)return this.render(t,e,r)}if(this._tTime=m,this._time=i,!this._act&&this._ts&&(this._act=1,this._lazy=0),this.ratio=h=(f||this._ease)(i/p),this._from&&(this.ratio=h=1-h),i&&!d&&!e&&!a&&(Ct(this,"onStart"),this._tTime!==m))return this;for(n=this._pt;n;)n.r(h,n.d),n=n._next;l&&l.render(t<0?t:l._dur*l._ease(i/this._dur),e,r)||this._startAt&&(this._zTime=t),this._onUpdate&&!e&&(_&&Ca(this,t,0,r),Ct(this,"onUpdate")),this._repeat&&a!==o&&this.vars.onRepeat&&!e&&this.parent&&Ct(this,"onRepeat"),m!==this._tDur&&m||this._tTime!==m||(_&&!this._onUpdate&&Ca(this,t,0,!0),!t&&p||!(m===this._tDur&&0<this._ts||!m&&this._ts<0)||za(this,1),e||_&&!d||!(m||d||u)||(Ct(this,m===c?"onComplete":"onReverseComplete",!0),!this._prom||m<c&&0<this.timeScale()||this._prom()))}}else!function _renderZeroDurationTween(t,e,r,i){var n,a,s,o=t.ratio,u=e<0||!e&&(!t._start&&function _parentPlayheadIsBeforeStart(t){var e=t.parent;return e&&e._ts&&e._initted&&!e._lock&&(e.rawTime()<0||_parentPlayheadIsBeforeStart(e))}(t)&&(t._initted||!bt(t))||(t._ts<0||t._dp._ts<0)&&!bt(t))?0:1,h=t._rDelay,l=0;if(h&&t._repeat&&(l=Ot(0,t._tDur,e),a=Tt(l,h),t._yoyo&&1&a&&(u=1-u),a!==Tt(t._tTime,h)&&(o=1-u,t.vars.repeatRefresh&&t._initted&&t.invalidate())),u!==o||L||i||t._zTime===X||!e&&t._zTime){if(!t._initted&&Ma(t,e,i,r,l))return;for(s=t._zTime,t._zTime=e||(r?X:0),r=r||e&&!s,t.ratio=u,t._from&&(u=1-u),t._time=0,t._tTime=l,n=t._pt;n;)n.r(u,n.d),n=n._next;e<0&&Ca(t,e,0,!0),t._onUpdate&&!r&&Ct(t,"onUpdate"),l&&t._repeat&&!r&&t.parent&&Ct(t,"onRepeat"),(e>=t._tDur||e<0)&&t.ratio===u&&(u&&za(t,1),r||L||(Ct(t,u?"onComplete":"onReverseComplete",!0),t._prom&&t._prom()))}else t._zTime||(t._zTime=e)}(this,t,e,r);return this},e.targets=function targets(){return this._targets},e.invalidate=function invalidate(t){return t&&this.vars.runBackwards||(this._startAt=0),this._pt=this._op=this._onUpdate=this._lazy=this.ratio=0,this._ptLookup=[],this.timeline&&this.timeline.invalidate(t),D.prototype.invalidate.call(this,t)},e.resetTo=function resetTo(t,e,r,i,n){c||Rt.wake(),this._ts||this.play();var a,s=Math.min(this._dur,(this._dp._time-this._start)*this._ts);return this._initted||Qt(this,s),a=this._ease(s/this._dur),function _updatePropTweens(t,e,r,i,n,a,s,o){var u,h,l,f,d=(t._pt&&t._ptCache||(t._ptCache={}))[e];if(!d)for(d=t._ptCache[e]=[],l=t._ptLookup,f=t._targets.length;f--;){if((u=l[f][e])&&u.d&&u.d._pt)for(u=u.d._pt;u&&u.p!==e&&u.fp!==e;)u=u._next;if(!u)return Gt=1,t.vars[e]="+=0",Qt(t,s),Gt=0,o?R(e+" not eligible for reset"):1;d.push(u)}for(f=d.length;f--;)(u=(h=d[f])._pt||h).s=!i&&0!==i||n?u.s+(i||0)+a*u.c:i,u.c=r-u.s,h.e&&(h.e=ia(r)+Ya(h.e)),h.b&&(h.b=u.s+Ya(h.b))}(this,t,e,r,i,a,s,n)?this.resetTo(t,e,r,i,1):(Ia(this,0),this.parent||xa(this._dp,this,"_first","_last",this._dp._sort?"_start":0),this.render(0))},e.kill=function kill(t,e){if(void 0===e&&(e="all"),!(t||e&&"all"!==e))return this._lazy=this._pt=0,this.parent?tb(this):this;if(this.timeline){var i=this.timeline.totalDuration();return this.timeline.killTweensOf(t,e,Nt&&!0!==Nt.vars.overwrite)._first||tb(this),this.parent&&i!==this.timeline.totalDuration()&&Ra(this,this._dur*this.timeline._tDur/i,0,1),this}var n,a,s,o,u,h,l,f=this._targets,d=t?Mt(t):f,c=this._ptLookup,p=this._pt;if((!e||"all"===e)&&function _arraysMatch(t,e){for(var r=t.length,i=r===e.length;i&&r--&&t[r]===e[r];);return r<0}(f,d))return"all"===e&&(this._pt=0),tb(this);for(n=this._op=this._op||[],"all"!==e&&(r(e)&&(u={},ha(e,function(t){return u[t]=1}),e=u),e=function _addAliasesToVars(t,e){var r,i,n,a,s=t[0]?fa(t[0]).harness:0,o=s&&s.aliases;if(!o)return e;for(i in r=yt({},e),o)if(i in r)for(n=(a=o[i].split(",")).length;n--;)r[a[n]]=r[i];return r}(f,e)),l=f.length;l--;)if(~d.indexOf(f[l]))for(u in a=c[l],"all"===e?(n[l]=e,o=a,s={}):(s=n[l]=n[l]||{},o=e),o)(h=a&&a[u])&&("kill"in h.d&&!0!==h.d.kill(u)||ya(this,h,"_pt"),delete a[u]),"all"!==s&&(s[u]=1);return this._initted&&!this._pt&&p&&tb(this),this},Tween.to=function to(t,e,r){return new Tween(t,e,r)},Tween.from=function from(t,e){return Va(1,arguments)},Tween.delayedCall=function delayedCall(t,e,r,i){return new Tween(e,0,{immediateRender:!1,lazy:!1,overwrite:!1,delay:t,onComplete:e,onReverseComplete:e,onCompleteParams:r,onReverseCompleteParams:r,callbackScope:i})},Tween.fromTo=function fromTo(t,e,r){return Va(2,arguments)},Tween.set=function set(t,e){return e.duration=0,e.repeatDelay||(e.repeat=0),new Tween(t,e)},Tween.killTweensOf=function killTweensOf(t,e,r){return I.killTweensOf(t,e,r)},Tween}(Ut);qa($t.prototype,{_targets:[],_lazy:0,_startAt:0,_op:0,_onInit:0}),ha("staggerTo,staggerFrom,staggerFromTo",function(r){$t[r]=function(){var t=new Xt,e=kt.call(arguments,0);return e.splice("staggerFromTo"===r?5:4,0,0),t[r].apply(t,e)}});function oc(t,e,r){return t.setAttribute(e,r)}function wc(t,e,r,i){i.mSet(t,e,i.m.call(i.tween,r,i.mt),i)}var Zt=function _setterPlain(t,e,r){return t[e]=r},te=function _setterFunc(t,e,r){return t[e](r)},re=function _setterFuncWithParam(t,e,r,i){return t[e](i.fp,r)},ne=function _getSetter(t,e){return s(t[e])?te:u(t[e])&&t.setAttribute?oc:Zt},ae=function _renderPlain(t,e){return e.set(e.t,e.p,Math.round(1e6*(e.s+e.c*t))/1e6,e)},se=function _renderBoolean(t,e){return e.set(e.t,e.p,!!(e.s+e.c*t),e)},ue=function _renderComplexString(t,e){var r=e._pt,i="";if(!t&&e.b)i=e.b;else if(1===t&&e.e)i=e.e;else{for(;r;)i=r.p+(r.m?r.m(r.s+r.c*t):Math.round(1e4*(r.s+r.c*t))/1e4)+i,r=r._next;i+=e.c}e.set(e.t,e.p,i,e)},he=function _renderPropTweens(t,e){for(var r=e._pt;r;)r.r(t,r.d),r=r._next},fe=function _addPluginModifier(t,e,r,i){for(var n,a=this._pt;a;)n=a._next,a.p===i&&a.modifier(t,e,r),a=n},ce=function _killPropTweensOf(t){for(var e,r,i=this._pt;i;)r=i._next,i.p===t&&!i.op||i.op===t?ya(this,i,"_pt"):i.dep||(e=1),i=r;return!e},pe=function _sortPropTweensByPriority(t){for(var e,r,i,n,a=t._pt;a;){for(e=a._next,r=i;r&&r.pr>a.pr;)r=r._next;(a._prev=r?r._prev:n)?a._prev._next=a:i=a,(a._next=r)?r._prev=a:n=a,a=e}t._pt=i},_e=(PropTween.prototype.modifier=function modifier(t,e,r){this.mSet=this.mSet||this.set,this.set=wc,this.m=t,this.mt=r,this.tween=e},PropTween);function PropTween(t,e,r,i,n,a,s,o,u){this.t=e,this.s=i,this.c=n,this.p=r,this.r=a||ae,this.d=s||this,this.set=o||Zt,this.pr=u||0,(this._next=t)&&(t._prev=this)}ha(vt+"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger",function(t){return ft[t]=1}),ot.TweenMax=ot.TweenLite=$t,ot.TimelineLite=ot.TimelineMax=Xt,I=new Xt({sortChildren:!1,defaults:V,autoRemoveChildren:!0,id:"root",smoothChildTiming:!0}),q.stringFilter=Fb;function Ec(t){return(ye[t]||Te).map(function(t){return t()})}function Fc(){var t=Date.now(),o=[];2<t-Oe&&(Ec("matchMediaInit"),ge.forEach(function(t){var e,r,i,n,a=t.queries,s=t.conditions;for(r in a)(e=h.matchMedia(a[r]).matches)&&(i=1),e!==s[r]&&(s[r]=e,n=1);n&&(t.revert(),i&&o.push(t))}),Ec("matchMediaRevert"),o.forEach(function(e){return e.onMatch(e,function(t){return e.add(null,t)})}),Oe=t,Ec("matchMedia"))}var me,ge=[],ye={},Te=[],Oe=0,Me=0,Pe=((me=Context.prototype).add=function add(t,i,n){function Gw(){var t,e=l,r=a.selector;return e&&e!==a&&e.data.push(a),n&&(a.selector=cb(n)),l=a,t=i.apply(a,arguments),s(t)&&a._r.push(t),l=e,a.selector=r,a.isReverted=!1,t}s(t)&&(n=i,i=t,t=s);var a=this;return a.last=Gw,t===s?Gw(a,function(t){return a.add(null,t)}):t?a[t]=Gw:Gw},me.ignore=function ignore(t){var e=l;l=null,t(this),l=e},me.getTweens=function getTweens(){var e=[];return this.data.forEach(function(t){return t instanceof Context?e.push.apply(e,t.getTweens()):t instanceof $t&&!(t.parent&&"nested"===t.parent.data)&&e.push(t)}),e},me.clear=function clear(){this._r.length=this.data.length=0},me.kill=function kill(i,t){var n=this;if(i?function(){for(var t,e=n.getTweens(),r=n.data.length;r--;)"isFlip"===(t=n.data[r]).data&&(t.revert(),t.getChildren(!0,!0,!1).forEach(function(t){return e.splice(e.indexOf(t),1)}));for(e.map(function(t){return{g:t._dur||t._delay||t._sat&&!t._sat.vars.immediateRender?t.globalTime(0):-1/0,t:t}}).sort(function(t,e){return e.g-t.g||-1/0}).forEach(function(t){return t.t.revert(i)}),r=n.data.length;r--;)(t=n.data[r])instanceof Xt?"nested"!==t.data&&(t.scrollTrigger&&t.scrollTrigger.revert(),t.kill()):t instanceof $t||!t.revert||t.revert(i);n._r.forEach(function(t){return t(i,n)}),n.isReverted=!0}():this.data.forEach(function(t){return t.kill&&t.kill()}),this.clear(),t)for(var e=ge.length;e--;)ge[e].id===this.id&&ge.splice(e,1)},me.revert=function revert(t){this.kill(t||{})},Context);function Context(t,e){this.selector=e&&cb(e),this.data=[],this._r=[],this.isReverted=!1,this.id=Me++,t&&this.add(t)}var Ce,Ae=((Ce=MatchMedia.prototype).add=function add(t,e,r){v(t)||(t={matches:t});var i,n,a,s=new Pe(0,r||this.scope),o=s.conditions={};for(n in l&&!s.selector&&(s.selector=l.selector),this.contexts.push(s),e=s.add("onMatch",e),s.queries=t)"all"===n?a=1:(i=h.matchMedia(t[n]))&&(ge.indexOf(s)<0&&ge.push(s),(o[n]=i.matches)&&(a=1),i.addListener?i.addListener(Fc):i.addEventListener("change",Fc));return a&&e(s,function(t){return s.add(null,t)}),this},Ce.revert=function revert(t){this.kill(t||{})},Ce.kill=function kill(e){this.contexts.forEach(function(t){return t.kill(e,!0)})},MatchMedia);function MatchMedia(t){this.contexts=[],this.scope=t,l&&l.data.push(this)}var Se={registerPlugin:function registerPlugin(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];e.forEach(function(t){return wb(t)})},timeline:function timeline(t){return new Xt(t)},getTweensOf:function getTweensOf(t,e){return I.getTweensOf(t,e)},getProperty:function getProperty(i,t,e,n){r(i)&&(i=Mt(i)[0]);var a=fa(i||{}).get,s=e?pa:oa;return"native"===e&&(e=""),i?t?s((pt[t]&&pt[t].get||a)(i,t,e,n)):function(t,e,r){return s((pt[t]&&pt[t].get||a)(i,t,e,r))}:i},quickSetter:function quickSetter(r,e,i){if(1<(r=Mt(r)).length){var n=r.map(function(t){return ze.quickSetter(t,e,i)}),a=n.length;return function(t){for(var e=a;e--;)n[e](t)}}r=r[0]||{};var s=pt[e],o=fa(r),u=o.harness&&(o.harness.aliases||{})[e]||e,h=s?function(t){var e=new s;d._pt=0,e.init(r,i?t+i:t,d,0,[r]),e.render(1,e),d._pt&&he(1,d)}:o.set(r,u);return s?h:function(t){return h(r,u,i?t+i:t,o,1)}},quickTo:function quickTo(t,i,e){function $x(t,e,r){return n.resetTo(i,t,e,r)}var r,n=ze.to(t,yt(((r={})[i]="+=0.1",r.paused=!0,r),e||{}));return $x.tween=n,$x},isTweening:function isTweening(t){return 0<I.getTweensOf(t,!0).length},defaults:function defaults(t){return t&&t.ease&&(t.ease=jt(t.ease,V.ease)),ta(V,t||{})},config:function config(t){return ta(q,t||{})},registerEffect:function registerEffect(t){var i=t.name,n=t.effect,e=t.plugins,a=t.defaults,r=t.extendTimeline;(e||"").split(",").forEach(function(t){return t&&!pt[t]&&!ot[t]&&R(i+" effect requires "+t+" plugin.")}),_t[i]=function(t,e,r){return n(Mt(t),qa(e||{},a),r)},r&&(Xt.prototype[i]=function(t,e,r){return this.add(_t[i](t,v(e)?e:(r=e)&&{},this),r)})},registerEase:function registerEase(t,e){Lt[t]=jt(e)},parseEase:function parseEase(t,e){return arguments.length?jt(t,e):Lt},getById:function getById(t){return I.getById(t)},exportRoot:function exportRoot(t,e){void 0===t&&(t={});var r,i,n=new Xt(t);for(n.smoothChildTiming=w(t.smoothChildTiming),I.remove(n),n._dp=0,n._time=n._tTime=I._time,r=I._first;r;)i=r._next,!e&&!r._dur&&r instanceof $t&&r.vars.onComplete===r._targets[0]||Ka(n,r,r._start-r._delay),r=i;return Ka(I,n,0),n},context:function context(t,e){return t?new Pe(t,e):l},matchMedia:function matchMedia(t){return new Ae(t)},matchMediaRefresh:function matchMediaRefresh(){return ge.forEach(function(t){var e,r,i=t.conditions;for(r in i)i[r]&&(i[r]=!1,e=1);e&&t.revert()})||Fc()},addEventListener:function addEventListener(t,e){var r=ye[t]||(ye[t]=[]);~r.indexOf(e)||r.push(e)},removeEventListener:function removeEventListener(t,e){var r=ye[t],i=r&&r.indexOf(e);0<=i&&r.splice(i,1)},utils:{wrap:function wrap(e,t,r){var i=t-e;return Z(e)?lb(e,wrap(0,e.length),t):Wa(r,function(t){return(i+(t-e)%i)%i+e})},wrapYoyo:function wrapYoyo(e,t,r){var i=t-e,n=2*i;return Z(e)?lb(e,wrapYoyo(0,e.length-1),t):Wa(r,function(t){return e+(i<(t=(n+(t-e)%n)%n||0)?n-t:t)})},distribute:eb,random:hb,snap:gb,normalize:function normalize(t,e,r){return Pt(t,e,0,1,r)},getUnit:Ya,clamp:function clamp(e,r,t){return Wa(t,function(t){return Ot(e,r,t)})},splitColor:Ab,toArray:Mt,selector:cb,mapRange:Pt,pipe:function pipe(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return function(t){return e.reduce(function(t,e){return e(t)},t)}},unitize:function unitize(e,r){return function(t){return e(parseFloat(t))+(r||Ya(t))}},interpolate:function interpolate(e,i,t,n){var a=isNaN(e+i)?0:function(t){return(1-t)*e+t*i};if(!a){var s,o,u,h,l,f=r(e),d={};if(!0===t&&(n=1)&&(t=null),f)e={p:e},i={p:i};else if(Z(e)&&!Z(i)){for(u=[],h=e.length,l=h-2,o=1;o<h;o++)u.push(interpolate(e[o-1],e[o]));h--,a=function func(t){t*=h;var e=Math.min(l,~~t);return u[e](t-e)},t=i}else n||(e=yt(Z(e)?[]:{},e));if(!u){for(s in i)Wt.call(d,e,s,"get",i[s]);a=function func(t){return he(t,d)||(f?e.p:e)}}}return Wa(t,a)},shuffle:db},install:P,effects:_t,ticker:Rt,updateRoot:Xt.updateRoot,plugins:pt,globalTimeline:I,core:{PropTween:_e,globals:S,Tween:$t,Timeline:Xt,Animation:Ut,getCache:fa,_removeLinkedListItem:ya,reverting:function reverting(){return L},context:function context(t){return t&&l&&(l.data.push(t),t._ctx=l),l},suppressOverwrites:function suppressOverwrites(t){return F=t}}};ha("to,from,fromTo,delayedCall,set,killTweensOf",function(t){return Se[t]=$t[t]}),Rt.add(Xt.updateRoot),d=Se.to({},{duration:0});function Jc(t,e){for(var r=t._pt;r&&r.p!==e&&r.op!==e&&r.fp!==e;)r=r._next;return r}function Lc(t,a){return{name:t,rawVars:1,init:function init(t,n,e){e._onInit=function(t){var e,i;if(r(n)&&(e={},ha(n,function(t){return e[t]=1}),n=e),a){for(i in e={},n)e[i]=a(n[i]);n=e}!function _addModifiers(t,e){var r,i,n,a=t._targets;for(r in e)for(i=a.length;i--;)(n=(n=t._ptLookup[i][r])&&n.d)&&(n._pt&&(n=Jc(n,r)),n&&n.modifier&&n.modifier(e[r],t,a[i],r))}(t,n)}}}}var ze=Se.registerPlugin({name:"attr",init:function init(t,e,r,i,n){var a,s,o;for(a in this.tween=r,e)o=t.getAttribute(a)||"",(s=this.add(t,"setAttribute",(o||0)+"",e[a],i,n,0,0,a)).op=a,s.b=o,this._props.push(a)},render:function render(t,e){for(var r=e._pt;r;)L?r.set(r.t,r.p,r.b,r):r.r(t,r.d),r=r._next}},{name:"endArray",init:function init(t,e){for(var r=e.length;r--;)this.add(t,r,t[r]||0,e[r],0,0,0,0,0,1)}},Lc("roundProps",fb),Lc("modifiers"),Lc("snap",gb))||Se;$t.version=Xt.version=ze.version="3.12.5",o=1,x()&&Ft();function vd(t,e){return e.set(e.t,e.p,Math.round(1e4*(e.s+e.c*t))/1e4+e.u,e)}function wd(t,e){return e.set(e.t,e.p,1===t?e.e:Math.round(1e4*(e.s+e.c*t))/1e4+e.u,e)}function xd(t,e){return e.set(e.t,e.p,t?Math.round(1e4*(e.s+e.c*t))/1e4+e.u:e.b,e)}function yd(t,e){var r=e.s+e.c*t;e.set(e.t,e.p,~~(r+(r<0?-.5:.5))+e.u,e)}function zd(t,e){return e.set(e.t,e.p,t?e.e:e.b,e)}function Ad(t,e){return e.set(e.t,e.p,1!==t?e.b:e.e,e)}function Bd(t,e,r){return t.style[e]=r}function Cd(t,e,r){return t.style.setProperty(e,r)}function Dd(t,e,r){return t._gsap[e]=r}function Ed(t,e,r){return t._gsap.scaleX=t._gsap.scaleY=r}function Fd(t,e,r,i,n){var a=t._gsap;a.scaleX=a.scaleY=r,a.renderTransform(n,a)}function Gd(t,e,r,i,n){var a=t._gsap;a[e]=r,a.renderTransform(n,a)}function Jd(t,e){var r=this,i=this.target,n=i.style,a=i._gsap;if(t in ar&&n){if(this.tfm=this.tfm||{},"transform"===t)return dr.transform.split(",").forEach(function(t){return Jd.call(r,t,e)});if(~(t=dr[t]||t).indexOf(",")?t.split(",").forEach(function(t){return r.tfm[t]=yr(i,t)}):this.tfm[t]=a.x?a[t]:yr(i,t),t===pr&&(this.tfm.zOrigin=a.zOrigin),0<=this.props.indexOf(cr))return;a.svg&&(this.svgo=i.getAttribute("data-svg-origin"),this.props.push(pr,e,"")),t=cr}(n||e)&&this.props.push(t,e,n[t])}function Kd(t){t.translate&&(t.removeProperty("translate"),t.removeProperty("scale"),t.removeProperty("rotate"))}function Ld(){var t,e,r=this.props,i=this.target,n=i.style,a=i._gsap;for(t=0;t<r.length;t+=3)r[t+1]?i[r[t]]=r[t+2]:r[t+2]?n[r[t]]=r[t+2]:n.removeProperty("--"===r[t].substr(0,2)?r[t]:r[t].replace(hr,"-$1").toLowerCase());if(this.tfm){for(e in this.tfm)a[e]=this.tfm[e];a.svg&&(a.renderTransform(),i.setAttribute("data-svg-origin",this.svgo||"")),(t=Be())&&t.isStart||n[cr]||(Kd(n),a.zOrigin&&n[pr]&&(n[pr]+=" "+a.zOrigin+"px",a.zOrigin=0,a.renderTransform()),a.uncache=1)}}function Md(t,e){var r={target:t,props:[],revert:Ld,save:Jd};return t._gsap||ze.core.getCache(t),e&&e.split(",").forEach(function(t){return r.save(t)}),r}function Od(t,e){var r=De.createElementNS?De.createElementNS((e||"http://www.w3.org/1999/xhtml").replace(/^https/,"http"),t):De.createElement(t);return r&&r.style?r:De.createElement(t)}function Pd(t,e,r){var i=getComputedStyle(t);return i[e]||i.getPropertyValue(e.replace(hr,"-$1").toLowerCase())||i.getPropertyValue(e)||!r&&Pd(t,mr(e)||e,1)||""}function Sd(){(function _windowExists(){return"undefined"!=typeof window})()&&window.document&&(Ee=window,De=Ee.document,Re=De.documentElement,Le=Od("div")||{style:{}},Od("div"),cr=mr(cr),pr=cr+"Origin",Le.style.cssText="border-width:0;line-height:0;position:absolute;padding:0",Ye=!!mr("perspective"),Be=ze.core.reverting,Fe=1)}function Td(t){var e,r=Od("svg",this.ownerSVGElement&&this.ownerSVGElement.getAttribute("xmlns")||"http://www.w3.org/2000/svg"),i=this.parentNode,n=this.nextSibling,a=this.style.cssText;if(Re.appendChild(r),r.appendChild(this),this.style.display="block",t)try{e=this.getBBox(),this._gsapBBox=this.getBBox,this.getBBox=Td}catch(t){}else this._gsapBBox&&(e=this._gsapBBox());return i&&(n?i.insertBefore(this,n):i.appendChild(this)),Re.removeChild(r),this.style.cssText=a,e}function Ud(t,e){for(var r=e.length;r--;)if(t.hasAttribute(e[r]))return t.getAttribute(e[r])}function Vd(e){var r;try{r=e.getBBox()}catch(t){r=Td.call(e,!0)}return r&&(r.width||r.height)||e.getBBox===Td||(r=Td.call(e,!0)),!r||r.width||r.x||r.y?r:{x:+Ud(e,["x","cx","x1"])||0,y:+Ud(e,["y","cy","y1"])||0,width:0,height:0}}function Wd(t){return!(!t.getCTM||t.parentNode&&!t.ownerSVGElement||!Vd(t))}function Xd(t,e){if(e){var r,i=t.style;e in ar&&e!==pr&&(e=cr),i.removeProperty?("ms"!==(r=e.substr(0,2))&&"webkit"!==e.substr(0,6)||(e="-"+e),i.removeProperty("--"===r?e:e.replace(hr,"-$1").toLowerCase())):i.removeAttribute(e)}}function Yd(t,e,r,i,n,a){var s=new _e(t._pt,e,r,0,1,a?Ad:zd);return(t._pt=s).b=i,s.e=n,t._props.push(r),s}function _d(t,e,r,i){var n,a,s,o,u=parseFloat(r)||0,h=(r+"").trim().substr((u+"").length)||"px",l=Le.style,f=lr.test(e),d="svg"===t.tagName.toLowerCase(),c=(d?"client":"offset")+(f?"Width":"Height"),p="px"===i,_="%"===i;if(i===h||!u||gr[i]||gr[h])return u;if("px"===h||p||(u=_d(t,e,r,"px")),o=t.getCTM&&Wd(t),(_||"%"===h)&&(ar[e]||~e.indexOf("adius")))return n=o?t.getBBox()[f?"width":"height"]:t[c],ia(_?u/n*100:u/100*n);if(l[f?"width":"height"]=100+(p?h:i),a=~e.indexOf("adius")||"em"===i&&t.appendChild&&!d?t:t.parentNode,o&&(a=(t.ownerSVGElement||{}).parentNode),a&&a!==De&&a.appendChild||(a=De.body),(s=a._gsap)&&_&&s.width&&f&&s.time===Rt.time&&!s.uncache)return ia(u/s.width*100);if(!_||"height"!==e&&"width"!==e)!_&&"%"!==h||vr[Pd(a,"display")]||(l.position=Pd(t,"position")),a===t&&(l.position="static"),a.appendChild(Le),n=Le[c],a.removeChild(Le),l.position="absolute";else{var m=t.style[e];t.style[e]=100+i,n=t[c],m?t.style[e]=m:Xd(t,e)}return f&&_&&((s=fa(a)).time=Rt.time,s.width=a[c]),ia(p?n*u/100:n&&u?100/n*u:0)}function be(t,e,r,i){if(!r||"none"===r){var n=mr(e,t,1),a=n&&Pd(t,n,1);a&&a!==r?(e=n,r=a):"borderColor"===e&&(r=Pd(t,"borderTopColor"))}var s,o,u,h,l,f,d,c,p,_,m,g=new _e(this._pt,t.style,e,0,1,ue),v=0,y=0;if(g.b=r,g.e=i,r+="","auto"===(i+="")&&(f=t.style[e],t.style[e]=i,i=Pd(t,e)||i,f?t.style[e]=f:Xd(t,e)),Fb(s=[r,i]),i=s[1],u=(r=s[0]).match(rt)||[],(i.match(rt)||[]).length){for(;o=rt.exec(i);)d=o[0],p=i.substring(v,o.index),l?l=(l+1)%5:"rgba("!==p.substr(-5)&&"hsla("!==p.substr(-5)||(l=1),d!==(f=u[y++]||"")&&(h=parseFloat(f)||0,m=f.substr((h+"").length),"="===d.charAt(1)&&(d=ka(h,d)+m),c=parseFloat(d),_=d.substr((c+"").length),v=rt.lastIndex-_.length,_||(_=_||q.units[e]||m,v===i.length&&(i+=_,g.e+=_)),m!==_&&(h=_d(t,e,f,_)||0),g._pt={_next:g._pt,p:p||1===y?p:",",s:h,c:c-h,m:l&&l<4||"zIndex"===e?Math.round:0});g.c=v<i.length?i.substring(v,i.length):""}else g.r="display"===e&&"none"===i?Ad:zd;return nt.test(i)&&(g.e=0),this._pt=g}function de(t){var e=t.split(" "),r=e[0],i=e[1]||"50%";return"top"!==r&&"bottom"!==r&&"left"!==i&&"right"!==i||(t=r,r=i,i=t),e[0]=Tr[r]||r,e[1]=Tr[i]||i,e.join(" ")}function ee(t,e){if(e.tween&&e.tween._time===e.tween._dur){var r,i,n,a=e.t,s=a.style,o=e.u,u=a._gsap;if("all"===o||!0===o)s.cssText="",i=1;else for(n=(o=o.split(",")).length;-1<--n;)r=o[n],ar[r]&&(i=1,r="transformOrigin"===r?pr:cr),Xd(a,r);i&&(Xd(a,cr),u&&(u.svg&&a.removeAttribute("transform"),Or(a,1),u.uncache=1,Kd(s)))}}function ie(t){return"matrix(1, 0, 0, 1, 0, 0)"===t||"none"===t||!t}function je(t){var e=Pd(t,cr);return ie(e)?wr:e.substr(7).match(et).map(ia)}function ke(t,e){var r,i,n,a,s=t._gsap||fa(t),o=t.style,u=je(t);return s.svg&&t.getAttribute("transform")?"1,0,0,1,0,0"===(u=[(n=t.transform.baseVal.consolidate().matrix).a,n.b,n.c,n.d,n.e,n.f]).join(",")?wr:u:(u!==wr||t.offsetParent||t===Re||s.svg||(n=o.display,o.display="block",(r=t.parentNode)&&t.offsetParent||(a=1,i=t.nextElementSibling,Re.appendChild(t)),u=je(t),n?o.display=n:Xd(t,"display"),a&&(i?r.insertBefore(t,i):r?r.appendChild(t):Re.removeChild(t))),e&&6<u.length?[u[0],u[1],u[4],u[5],u[12],u[13]]:u)}function le(t,e,r,i,n,a){var s,o,u,h=t._gsap,l=n||ke(t,!0),f=h.xOrigin||0,d=h.yOrigin||0,c=h.xOffset||0,p=h.yOffset||0,_=l[0],m=l[1],g=l[2],v=l[3],y=l[4],T=l[5],b=e.split(" "),w=parseFloat(b[0])||0,x=parseFloat(b[1])||0;r?l!==wr&&(o=_*v-m*g)&&(u=w*(-m/o)+x*(_/o)-(_*T-m*y)/o,w=w*(v/o)+x*(-g/o)+(g*T-v*y)/o,x=u):(w=(s=Vd(t)).x+(~b[0].indexOf("%")?w/100*s.width:w),x=s.y+(~(b[1]||b[0]).indexOf("%")?x/100*s.height:x)),i||!1!==i&&h.smooth?(y=w-f,T=x-d,h.xOffset=c+(y*_+T*g)-y,h.yOffset=p+(y*m+T*v)-T):h.xOffset=h.yOffset=0,h.xOrigin=w,h.yOrigin=x,h.smooth=!!i,h.origin=e,h.originIsAbsolute=!!r,t.style[pr]="0px 0px",a&&(Yd(a,h,"xOrigin",f,w),Yd(a,h,"yOrigin",d,x),Yd(a,h,"xOffset",c,h.xOffset),Yd(a,h,"yOffset",p,h.yOffset)),t.setAttribute("data-svg-origin",w+" "+x)}function oe(t,e,r){var i=Ya(e);return ia(parseFloat(e)+parseFloat(_d(t,"x",r+"px",i)))+i}function ve(t,e,i,n,a){var s,o,u=360,h=r(a),l=parseFloat(a)*(h&&~a.indexOf("rad")?sr:1)-n,f=n+l+"deg";return h&&("short"===(s=a.split("_")[1])&&(l%=u)!==l%180&&(l+=l<0?u:-u),"cw"===s&&l<0?l=(l+36e9)%u-~~(l/u)*u:"ccw"===s&&0<l&&(l=(l-36e9)%u-~~(l/u)*u)),t._pt=o=new _e(t._pt,e,i,n,l,wd),o.e=f,o.u="deg",t._props.push(i),o}function we(t,e){for(var r in e)t[r]=e[r];return t}function xe(t,e,r){var i,n,a,s,o,u,h,l=we({},r._gsap),f=r.style;for(n in l.svg?(a=r.getAttribute("transform"),r.setAttribute("transform",""),f[cr]=e,i=Or(r,1),Xd(r,cr),r.setAttribute("transform",a)):(a=getComputedStyle(r)[cr],f[cr]=e,i=Or(r,1),f[cr]=a),ar)(a=l[n])!==(s=i[n])&&"perspective,force3D,transformOrigin,svgOrigin".indexOf(n)<0&&(o=Ya(a)!==(h=Ya(s))?_d(r,n,a,h):parseFloat(a),u=parseFloat(s),t._pt=new _e(t._pt,i,n,o,u-o,vd),t._pt.u=h||0,t._props.push(n));we(i,l)}var Ee,De,Re,Fe,Le,Ie,Be,Ye,qe=Lt.Power0,Ve=Lt.Power1,Ue=Lt.Power2,Xe=Lt.Power3,Ne=Lt.Power4,Ge=Lt.Linear,We=Lt.Quad,Qe=Lt.Cubic,Ke=Lt.Quart,Je=Lt.Quint,He=Lt.Strong,$e=Lt.Elastic,Ze=Lt.Back,tr=Lt.SteppedEase,er=Lt.Bounce,rr=Lt.Sine,ir=Lt.Expo,nr=Lt.Circ,ar={},sr=180/Math.PI,or=Math.PI/180,ur=Math.atan2,hr=/([A-Z])/g,lr=/(left|right|width|margin|padding|x)/i,fr=/[\s,\(]\S/,dr={autoAlpha:"opacity,visibility",scale:"scaleX,scaleY",alpha:"opacity"},cr="transform",pr=cr+"Origin",_r="O,Moz,ms,Ms,Webkit".split(","),mr=function _checkPropPrefix(t,e,r){var i=(e||Le).style,n=5;if(t in i&&!r)return t;for(t=t.charAt(0).toUpperCase()+t.substr(1);n--&&!(_r[n]+t in i););return n<0?null:(3===n?"ms":0<=n?_r[n]:"")+t},gr={deg:1,rad:1,turn:1},vr={grid:1,flex:1},yr=function _get(t,e,r,i){var n;return Fe||Sd(),e in dr&&"transform"!==e&&~(e=dr[e]).indexOf(",")&&(e=e.split(",")[0]),ar[e]&&"transform"!==e?(n=Or(t,i),n="transformOrigin"!==e?n[e]:n.svg?n.origin:kr(Pd(t,pr))+" "+n.zOrigin+"px"):(n=t.style[e])&&"auto"!==n&&!i&&!~(n+"").indexOf("calc(")||(n=br[e]&&br[e](t,e,r)||Pd(t,e)||ga(t,e)||("opacity"===e?1:0)),r&&!~(n+"").trim().indexOf(" ")?_d(t,e,n,r)+r:n},Tr={top:"0%",bottom:"100%",left:"0%",right:"100%",center:"50%"},br={clearProps:function clearProps(t,e,r,i,n){if("isFromStart"!==n.data){var a=t._pt=new _e(t._pt,e,r,0,0,ee);return a.u=i,a.pr=-10,a.tween=n,t._props.push(r),1}}},wr=[1,0,0,1,0,0],xr={},Or=function _parseTransform(t,e){var r=t._gsap||new Vt(t);if("x"in r&&!e&&!r.uncache)return r;var i,n,a,s,o,u,h,l,f,d,c,p,_,m,g,v,y,T,b,w,x,O,k,M,P,C,A,S,z,E,D,R,F=t.style,L=r.scaleX<0,I="deg",B=getComputedStyle(t),Y=Pd(t,pr)||"0";return i=n=a=u=h=l=f=d=c=0,s=o=1,r.svg=!(!t.getCTM||!Wd(t)),B.translate&&("none"===B.translate&&"none"===B.scale&&"none"===B.rotate||(F[cr]=("none"!==B.translate?"translate3d("+(B.translate+" 0 0").split(" ").slice(0,3).join(", ")+") ":"")+("none"!==B.rotate?"rotate("+B.rotate+") ":"")+("none"!==B.scale?"scale("+B.scale.split(" ").join(",")+") ":"")+("none"!==B[cr]?B[cr]:"")),F.scale=F.rotate=F.translate="none"),m=ke(t,r.svg),r.svg&&(M=r.uncache?(P=t.getBBox(),Y=r.xOrigin-P.x+"px "+(r.yOrigin-P.y)+"px",""):!e&&t.getAttribute("data-svg-origin"),le(t,M||Y,!!M||r.originIsAbsolute,!1!==r.smooth,m)),p=r.xOrigin||0,_=r.yOrigin||0,m!==wr&&(T=m[0],b=m[1],w=m[2],x=m[3],i=O=m[4],n=k=m[5],6===m.length?(s=Math.sqrt(T*T+b*b),o=Math.sqrt(x*x+w*w),u=T||b?ur(b,T)*sr:0,(f=w||x?ur(w,x)*sr+u:0)&&(o*=Math.abs(Math.cos(f*or))),r.svg&&(i-=p-(p*T+_*w),n-=_-(p*b+_*x))):(R=m[6],E=m[7],A=m[8],S=m[9],z=m[10],D=m[11],i=m[12],n=m[13],a=m[14],h=(g=ur(R,z))*sr,g&&(M=O*(v=Math.cos(-g))+A*(y=Math.sin(-g)),P=k*v+S*y,C=R*v+z*y,A=O*-y+A*v,S=k*-y+S*v,z=R*-y+z*v,D=E*-y+D*v,O=M,k=P,R=C),l=(g=ur(-w,z))*sr,g&&(v=Math.cos(-g),D=x*(y=Math.sin(-g))+D*v,T=M=T*v-A*y,b=P=b*v-S*y,w=C=w*v-z*y),u=(g=ur(b,T))*sr,g&&(M=T*(v=Math.cos(g))+b*(y=Math.sin(g)),P=O*v+k*y,b=b*v-T*y,k=k*v-O*y,T=M,O=P),h&&359.9<Math.abs(h)+Math.abs(u)&&(h=u=0,l=180-l),s=ia(Math.sqrt(T*T+b*b+w*w)),o=ia(Math.sqrt(k*k+R*R)),g=ur(O,k),f=2e-4<Math.abs(g)?g*sr:0,c=D?1/(D<0?-D:D):0),r.svg&&(M=t.getAttribute("transform"),r.forceCSS=t.setAttribute("transform","")||!ie(Pd(t,cr)),M&&t.setAttribute("transform",M))),90<Math.abs(f)&&Math.abs(f)<270&&(L?(s*=-1,f+=u<=0?180:-180,u+=u<=0?180:-180):(o*=-1,f+=f<=0?180:-180)),e=e||r.uncache,r.x=i-((r.xPercent=i&&(!e&&r.xPercent||(Math.round(t.offsetWidth/2)===Math.round(-i)?-50:0)))?t.offsetWidth*r.xPercent/100:0)+"px",r.y=n-((r.yPercent=n&&(!e&&r.yPercent||(Math.round(t.offsetHeight/2)===Math.round(-n)?-50:0)))?t.offsetHeight*r.yPercent/100:0)+"px",r.z=a+"px",r.scaleX=ia(s),r.scaleY=ia(o),r.rotation=ia(u)+I,r.rotationX=ia(h)+I,r.rotationY=ia(l)+I,r.skewX=f+I,r.skewY=d+I,r.transformPerspective=c+"px",(r.zOrigin=parseFloat(Y.split(" ")[2])||!e&&r.zOrigin||0)&&(F[pr]=kr(Y)),r.xOffset=r.yOffset=0,r.force3D=q.force3D,r.renderTransform=r.svg?zr:Ye?Sr:Mr,r.uncache=0,r},kr=function _firstTwoOnly(t){return(t=t.split(" "))[0]+" "+t[1]},Mr=function _renderNon3DTransforms(t,e){e.z="0px",e.rotationY=e.rotationX="0deg",e.force3D=0,Sr(t,e)},Pr="0deg",Cr="0px",Ar=") ",Sr=function _renderCSSTransforms(t,e){var r=e||this,i=r.xPercent,n=r.yPercent,a=r.x,s=r.y,o=r.z,u=r.rotation,h=r.rotationY,l=r.rotationX,f=r.skewX,d=r.skewY,c=r.scaleX,p=r.scaleY,_=r.transformPerspective,m=r.force3D,g=r.target,v=r.zOrigin,y="",T="auto"===m&&t&&1!==t||!0===m;if(v&&(l!==Pr||h!==Pr)){var b,w=parseFloat(h)*or,x=Math.sin(w),O=Math.cos(w);w=parseFloat(l)*or,b=Math.cos(w),a=oe(g,a,x*b*-v),s=oe(g,s,-Math.sin(w)*-v),o=oe(g,o,O*b*-v+v)}_!==Cr&&(y+="perspective("+_+Ar),(i||n)&&(y+="translate("+i+"%, "+n+"%) "),!T&&a===Cr&&s===Cr&&o===Cr||(y+=o!==Cr||T?"translate3d("+a+", "+s+", "+o+") ":"translate("+a+", "+s+Ar),u!==Pr&&(y+="rotate("+u+Ar),h!==Pr&&(y+="rotateY("+h+Ar),l!==Pr&&(y+="rotateX("+l+Ar),f===Pr&&d===Pr||(y+="skew("+f+", "+d+Ar),1===c&&1===p||(y+="scale("+c+", "+p+Ar),g.style[cr]=y||"translate(0, 0)"},zr=function _renderSVGTransforms(t,e){var r,i,n,a,s,o=e||this,u=o.xPercent,h=o.yPercent,l=o.x,f=o.y,d=o.rotation,c=o.skewX,p=o.skewY,_=o.scaleX,m=o.scaleY,g=o.target,v=o.xOrigin,y=o.yOrigin,T=o.xOffset,b=o.yOffset,w=o.forceCSS,x=parseFloat(l),O=parseFloat(f);d=parseFloat(d),c=parseFloat(c),(p=parseFloat(p))&&(c+=p=parseFloat(p),d+=p),d||c?(d*=or,c*=or,r=Math.cos(d)*_,i=Math.sin(d)*_,n=Math.sin(d-c)*-m,a=Math.cos(d-c)*m,c&&(p*=or,s=Math.tan(c-p),n*=s=Math.sqrt(1+s*s),a*=s,p&&(s=Math.tan(p),r*=s=Math.sqrt(1+s*s),i*=s)),r=ia(r),i=ia(i),n=ia(n),a=ia(a)):(r=_,a=m,i=n=0),(x&&!~(l+"").indexOf("px")||O&&!~(f+"").indexOf("px"))&&(x=_d(g,"x",l,"px"),O=_d(g,"y",f,"px")),(v||y||T||b)&&(x=ia(x+v-(v*r+y*n)+T),O=ia(O+y-(v*i+y*a)+b)),(u||h)&&(s=g.getBBox(),x=ia(x+u/100*s.width),O=ia(O+h/100*s.height)),s="matrix("+r+","+i+","+n+","+a+","+x+","+O+")",g.setAttribute("transform",s),w&&(g.style[cr]=s)};ha("padding,margin,Width,Radius",function(e,r){var t="Right",i="Bottom",n="Left",o=(r<3?["Top",t,i,n]:["Top"+n,"Top"+t,i+t,i+n]).map(function(t){return r<2?e+t:"border"+t+e});br[1<r?"border"+e:e]=function(e,t,r,i,n){var a,s;if(arguments.length<4)return a=o.map(function(t){return yr(e,t,r)}),5===(s=a.join(" ")).split(a[0]).length?a[0]:s;a=(i+"").split(" "),s={},o.forEach(function(t,e){return s[t]=a[e]=a[e]||a[(e-1)/2|0]}),e.init(t,s,n)}});var Er,Dr,Rr,Fr={name:"css",register:Sd,targetTest:function targetTest(t){return t.style&&t.nodeType},init:function init(t,e,i,n,a){var s,o,u,h,l,f,d,c,p,_,m,g,v,y,T,b,w=this._props,x=t.style,O=i.vars.startAt;for(d in Fe||Sd(),this.styles=this.styles||Md(t),b=this.styles.props,this.tween=i,e)if("autoRound"!==d&&(o=e[d],!pt[d]||!ac(d,e,i,n,t,a)))if(l=typeof o,f=br[d],"function"===l&&(l=typeof(o=o.call(i,n,t,a))),"string"===l&&~o.indexOf("random(")&&(o=ob(o)),f)f(this,t,d,o,i)&&(T=1);else if("--"===d.substr(0,2))s=(getComputedStyle(t).getPropertyValue(d)+"").trim(),o+="",Et.lastIndex=0,Et.test(s)||(c=Ya(s),p=Ya(o)),p?c!==p&&(s=_d(t,d,s,p)+p):c&&(o+=c),this.add(x,"setProperty",s,o,n,a,0,0,d),w.push(d),b.push(d,0,x[d]);else if("undefined"!==l){if(O&&d in O?(s="function"==typeof O[d]?O[d].call(i,n,t,a):O[d],r(s)&&~s.indexOf("random(")&&(s=ob(s)),Ya(s+"")||"auto"===s||(s+=q.units[d]||Ya(yr(t,d))||""),"="===(s+"").charAt(1)&&(s=yr(t,d))):s=yr(t,d),h=parseFloat(s),(_="string"===l&&"="===o.charAt(1)&&o.substr(0,2))&&(o=o.substr(2)),u=parseFloat(o),d in dr&&("autoAlpha"===d&&(1===h&&"hidden"===yr(t,"visibility")&&u&&(h=0),b.push("visibility",0,x.visibility),Yd(this,x,"visibility",h?"inherit":"hidden",u?"inherit":"hidden",!u)),"scale"!==d&&"transform"!==d&&~(d=dr[d]).indexOf(",")&&(d=d.split(",")[0])),m=d in ar)if(this.styles.save(d),g||((v=t._gsap).renderTransform&&!e.parseTransform||Or(t,e.parseTransform),y=!1!==e.smoothOrigin&&v.smooth,(g=this._pt=new _e(this._pt,x,cr,0,1,v.renderTransform,v,0,-1)).dep=1),"scale"===d)this._pt=new _e(this._pt,v,"scaleY",v.scaleY,(_?ka(v.scaleY,_+u):u)-v.scaleY||0,vd),this._pt.u=0,w.push("scaleY",d),d+="X";else{if("transformOrigin"===d){b.push(pr,0,x[pr]),o=de(o),v.svg?le(t,o,0,y,0,this):((p=parseFloat(o.split(" ")[2])||0)!==v.zOrigin&&Yd(this,v,"zOrigin",v.zOrigin,p),Yd(this,x,d,kr(s),kr(o)));continue}if("svgOrigin"===d){le(t,o,1,y,0,this);continue}if(d in xr){ve(this,v,d,h,_?ka(h,_+o):o);continue}if("smoothOrigin"===d){Yd(this,v,"smooth",v.smooth,o);continue}if("force3D"===d){v[d]=o;continue}if("transform"===d){xe(this,o,t);continue}}else d in x||(d=mr(d)||d);if(m||(u||0===u)&&(h||0===h)&&!fr.test(o)&&d in x)u=u||0,(c=(s+"").substr((h+"").length))!==(p=Ya(o)||(d in q.units?q.units[d]:c))&&(h=_d(t,d,s,p)),this._pt=new _e(this._pt,m?v:x,d,h,(_?ka(h,_+u):u)-h,m||"px"!==p&&"zIndex"!==d||!1===e.autoRound?vd:yd),this._pt.u=p||0,c!==p&&"%"!==p&&(this._pt.b=s,this._pt.r=xd);else if(d in x)be.call(this,t,d,s,_?_+o:o);else if(d in t)this.add(t,d,s||t[d],_?_+o:o,n,a);else if("parseTransform"!==d){Q(d,o);continue}m||(d in x?b.push(d,0,x[d]):b.push(d,1,s||t[d])),w.push(d)}T&&pe(this)},render:function render(t,e){if(e.tween._time||!Be())for(var r=e._pt;r;)r.r(t,r.d),r=r._next;else e.styles.revert()},get:yr,aliases:dr,getSetter:function getSetter(t,e,r){var i=dr[e];return i&&i.indexOf(",")<0&&(e=i),e in ar&&e!==pr&&(t._gsap.x||yr(t,"x"))?r&&Ie===r?"scale"===e?Ed:Dd:(Ie=r||{})&&("scale"===e?Fd:Gd):t.style&&!u(t.style[e])?Bd:~e.indexOf("-")?Cd:ne(t,e)},core:{_removeProperty:Xd,_getMatrix:ke}};ze.utils.checkPrefix=mr,ze.core.getStyleSaver=Md,Rr=ha((Er="x,y,z,scale,scaleX,scaleY,xPercent,yPercent")+","+(Dr="rotation,rotationX,rotationY,skewX,skewY")+",transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective",function(t){ar[t]=1}),ha(Dr,function(t){q.units[t]="deg",xr[t]=1}),dr[Rr[13]]=Er+","+Dr,ha("0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY",function(t){var e=t.split(":");dr[e[1]]=Rr[e[0]]}),ha("x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective",function(t){q.units[t]="px"}),ze.registerPlugin(Fr);var Lr=ze.registerPlugin(Fr)||ze,Ir=Lr.core.Tween;e.Back=Ze,e.Bounce=er,e.CSSPlugin=Fr,e.Circ=nr,e.Cubic=Qe,e.Elastic=$e,e.Expo=ir,e.Linear=Ge,e.Power0=qe,e.Power1=Ve,e.Power2=Ue,e.Power3=Xe,e.Power4=Ne,e.Quad=We,e.Quart=Ke,e.Quint=Je,e.Sine=rr,e.SteppedEase=tr,e.Strong=He,e.TimelineLite=Xt,e.TimelineMax=Xt,e.TweenLite=$t,e.TweenMax=Ir,e.default=Lr,e.gsap=Lr;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}});
--
ddiff --git a/public/assets/vendor/lottie/lottie_light.min.js b/public/assets/vendor/lottie/lottie_light.min.js
ddeleted file mode 100644
iindex e83ba9c..0000000
---- a/public/assets/vendor/lottie/lottie_light.min.js
++++ /dev/null
@@@ -1 +0,0 @@
--"undefined"!=typeof navigator&&function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).lottie=e()}(this,(function(){"use strict";var t="",e=!1,i=-999999,s=function(){return t};function a(t){return document.createElement(t)}function r(t,e){var i,s,a=t.length;for(i=0;i<a;i+=1)for(var r in s=t[i].prototype)Object.prototype.hasOwnProperty.call(s,r)&&(e.prototype[r]=s[r])}function n(t){function e(){}return e.prototype=t,e}var o=function(){function t(t){this.audios=[],this.audioFactory=t,this._volume=1,this._isMuted=!1}return t.prototype={addAudio:function(t){this.audios.push(t)},pause:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].pause()},resume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].resume()},setRate:function(t){var e,i=this.audios.length;for(e=0;e<i;e+=1)this.audios[e].setRate(t)},createAudio:function(t){return this.audioFactory?this.audioFactory(t):window.Howl?new window.Howl({src:[t]}):{isPlaying:!1,play:function(){this.isPlaying=!0},seek:function(){this.isPlaying=!1},playing:function(){},rate:function(){},setVolume:function(){}}},setAudioFactory:function(t){this.audioFactory=t},setVolume:function(t){this._volume=t,this._updateVolume()},mute:function(){this._isMuted=!0,this._updateVolume()},unmute:function(){this._isMuted=!1,this._updateVolume()},getVolume:function(){return this._volume},_updateVolume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].volume(this._volume*(this._isMuted?0:1))}},function(){return new t}}(),h=function(){function t(t,e){var i,s=0,a=[];switch(t){case"int16":case"uint8c":i=1;break;default:i=1.1}for(s=0;s<e;s+=1)a.push(i);return a}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(e,i){return"float32"===e?new Float32Array(i):"int16"===e?new Int16Array(i):"uint8c"===e?new Uint8ClampedArray(i):t(e,i)}:t}();function l(t){return Array.apply(null,{length:t})}function p(t){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p(t)}var f=!0,d=null,m=null,c="",u=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),g=Math.pow,y=Math.sqrt,v=Math.floor,b=(Math.max,Math.min),_={};!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],i=e.length;for(t=0;t<i;t+=1)_[e[t]]=Math[e[t]]}(),_.random=Math.random,_.abs=function(t){if("object"===p(t)&&t.length){var e,i=l(t.length),s=t.length;for(e=0;e<s;e+=1)i[e]=Math.abs(t[e]);return i}return Math.abs(t)};var k=150,P=Math.PI/180,A=.5519;function S(t){!!t}function x(t,e,i,s){this.type=t,this.currentTime=e,this.totalTime=i,this.direction=s<0?-1:1}function w(t,e){this.type=t,this.direction=e<0?-1:1}function D(t,e,i,s){this.type=t,this.currentLoop=i,this.totalLoops=e,this.direction=s<0?-1:1}function C(t,e,i){this.type=t,this.firstFrame=e,this.totalFrames=i}function M(t,e){this.type=t,this.target=e}function T(t,e){this.type="renderFrameError",this.nativeError=t,this.currentTime=e}function F(t){this.type="configError",this.nativeError=t}var E,I=(E=0,function(){return c+"__lottie_element_"+(E+=1)});function L(t,e,i){var s,a,r,n,o,h,l,p;switch(h=i*(1-e),l=i*(1-(o=6*t-(n=Math.floor(6*t)))*e),p=i*(1-(1-o)*e),n%6){case 0:s=i,a=p,r=h;break;case 1:s=l,a=i,r=h;break;case 2:s=h,a=i,r=p;break;case 3:s=h,a=l,r=i;break;case 4:s=p,a=h,r=i;break;case 5:s=i,a=h,r=l}return[s,a,r]}function V(t,e,i){var s,a=Math.max(t,e,i),r=Math.min(t,e,i),n=a-r,o=0===a?0:n/a,h=a/255;switch(a){case r:s=0;break;case t:s=e-i+n*(e<i?6:0),s/=6*n;break;case e:s=i-t+2*n,s/=6*n;break;case i:s=t-e+4*n,s/=6*n}return[s,o,h]}function R(t,e){var i=V(255*t[0],255*t[1],255*t[2]);return i[1]+=e,i[1]>1?i[1]=1:i[1]<=0&&(i[1]=0),L(i[0],i[1],i[2])}function z(t,e){var i=V(255*t[0],255*t[1],255*t[2]);return i[2]+=e,i[2]>1?i[2]=1:i[2]<0&&(i[2]=0),L(i[0],i[1],i[2])}function O(t,e){var i=V(255*t[0],255*t[1],255*t[2]);return i[0]+=e/360,i[0]>1?i[0]-=1:i[0]<0&&(i[0]+=1),L(i[0],i[1],i[2])}!function(){var t,e,i=[];for(t=0;t<256;t+=1)e=t.toString(16),i[t]=1===e.length?"0"+e:e}();var N=function(){return d},B=function(){return m},q=function(t){k=t},j=function(){return k};function W(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}function X(t){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},X(t)}var H=function(){var t,i,s=1,a=[],r={onmessage:function(){},postMessage:function(e){t({data:e})}},n={postMessage:function(t){r.onmessage({data:t})}};function o(i){if(window.Worker&&window.Blob&&e){var s=new Blob(["var _workerSelf = self; self.onmessage = ",i.toString()],{type:"text/javascript"}),a=URL.createObjectURL(s);return new Worker(a)}return t=i,r}function h(){i||(i=o((function(t){if(n.dataManager||(n.dataManager=function(){function t(a,r){var n,o,h,l,p,d,m=a.length;for(o=0;o<m;o+=1)if("ks"in(n=a[o])&&!n.completed){if(n.completed=!0,n.hasMask){var c=n.masksProperties;for(l=c.length,h=0;h<l;h+=1)if(c[h].pt.k.i)s(c[h].pt.k);else for(d=c[h].pt.k.length,p=0;p<d;p+=1)c[h].pt.k[p].s&&s(c[h].pt.k[p].s[0]),c[h].pt.k[p].e&&s(c[h].pt.k[p].e[0])}0===n.ty?(n.layers=e(n.refId,r),t(n.layers,r)):4===n.ty?i(n.shapes):5===n.ty&&f(n)}}function e(t,e){var i=function(t,e){for(var i=0,s=e.length;i<s;){if(e[i].id===t)return e[i];i+=1}return null}(t,e);return i?i.layers.__used?JSON.parse(JSON.stringify(i.layers)):(i.layers.__used=!0,i.layers):null}function i(t){var e,a,r;for(e=t.length-1;e>=0;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)s(t[e].ks.k);else for(r=t[e].ks.k.length,a=0;a<r;a+=1)t[e].ks.k[a].s&&s(t[e].ks.k[a].s[0]),t[e].ks.k[a].e&&s(t[e].ks.k[a].e[0]);else"gr"===t[e].ty&&i(t[e].it)}function s(t){var e,i=t.i.length;for(e=0;e<i;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function a(t,e){var i=e?e.split("."):[100,100,100];return t[0]>i[0]||!(i[0]>t[0])&&(t[1]>i[1]||!(i[1]>t[1])&&(t[2]>i[2]||!(i[2]>t[2])&&null))}var r,n=function(){var t=[4,4,14];function e(t){var e,i,s,a=t.length;for(e=0;e<a;e+=1)5===t[e].ty&&(s=void 0,s=(i=t[e]).t.d,i.t.d={k:[{s:s,t:0}]})}return function(i){if(a(t,i.v)&&(e(i.layers),i.assets)){var s,r=i.assets.length;for(s=0;s<r;s+=1)i.assets[s].layers&&e(i.assets[s].layers)}}}(),o=(r=[4,7,99],function(t){if(t.chars&&!a(r,t.v)){var e,s=t.chars.length;for(e=0;e<s;e+=1){var n=t.chars[e];n.data&&n.data.shapes&&(i(n.data.shapes),n.data.ip=0,n.data.op=99999,n.data.st=0,n.data.sr=1,n.data.ks={p:{k:[0,0],a:0},s:{k:[100,100],a:0},a:{k:[0,0],a:0},r:{k:0,a:0},o:{k:100,a:0}},t.chars[e].t||(n.data.shapes.push({ty:"no"}),n.data.shapes[0].it.push({p:{k:[0,0],a:0},s:{k:[100,100],a:0},a:{k:[0,0],a:0},r:{k:0,a:0},o:{k:100,a:0},sk:{k:0,a:0},sa:{k:0,a:0},ty:"tr"})))}}}),h=function(){var t=[5,7,15];function e(t){var e,i,s=t.length;for(e=0;e<s;e+=1)5===t[e].ty&&(i=void 0,"number"==typeof(i=t[e].t.p).a&&(i.a={a:0,k:i.a}),"number"==typeof i.p&&(i.p={a:0,k:i.p}),"number"==typeof i.r&&(i.r={a:0,k:i.r}))}return function(i){if(a(t,i.v)&&(e(i.layers),i.assets)){var s,r=i.assets.length;for(s=0;s<r;s+=1)i.assets[s].layers&&e(i.assets[s].layers)}}}(),l=function(){var t=[4,1,9];function e(t){var i,s,a,r=t.length;for(i=0;i<r;i+=1)if("gr"===t[i].ty)e(t[i].it);else if("fl"===t[i].ty||"st"===t[i].ty)if(t[i].c.k&&t[i].c.k[0].i)for(a=t[i].c.k.length,s=0;s<a;s+=1)t[i].c.k[s].s&&(t[i].c.k[s].s[0]/=255,t[i].c.k[s].s[1]/=255,t[i].c.k[s].s[2]/=255,t[i].c.k[s].s[3]/=255),t[i].c.k[s].e&&(t[i].c.k[s].e[0]/=255,t[i].c.k[s].e[1]/=255,t[i].c.k[s].e[2]/=255,t[i].c.k[s].e[3]/=255);else t[i].c.k[0]/=255,t[i].c.k[1]/=255,t[i].c.k[2]/=255,t[i].c.k[3]/=255}function i(t){var i,s=t.length;for(i=0;i<s;i+=1)4===t[i].ty&&e(t[i].shapes)}return function(e){if(a(t,e.v)&&(i(e.layers),e.assets)){var s,r=e.assets.length;for(s=0;s<r;s+=1)e.assets[s].layers&&i(e.assets[s].layers)}}}(),p=function(){var t=[4,4,18];function e(t){var i,s,a;for(i=t.length-1;i>=0;i-=1)if("sh"===t[i].ty)if(t[i].ks.k.i)t[i].ks.k.c=t[i].closed;else for(a=t[i].ks.k.length,s=0;s<a;s+=1)t[i].ks.k[s].s&&(t[i].ks.k[s].s[0].c=t[i].closed),t[i].ks.k[s].e&&(t[i].ks.k[s].e[0].c=t[i].closed);else"gr"===t[i].ty&&e(t[i].it)}function i(t){var i,s,a,r,n,o,h=t.length;for(s=0;s<h;s+=1){if((i=t[s]).hasMask){var l=i.masksProperties;for(r=l.length,a=0;a<r;a+=1)if(l[a].pt.k.i)l[a].pt.k.c=l[a].cl;else for(o=l[a].pt.k.length,n=0;n<o;n+=1)l[a].pt.k[n].s&&(l[a].pt.k[n].s[0].c=l[a].cl),l[a].pt.k[n].e&&(l[a].pt.k[n].e[0].c=l[a].cl)}4===i.ty&&e(i.shapes)}}return function(e){if(a(t,e.v)&&(i(e.layers),e.assets)){var s,r=e.assets.length;for(s=0;s<r;s+=1)e.assets[s].layers&&i(e.assets[s].layers)}}}();function f(t){0===t.t.a.length&&t.t.p}var d={completeData:function(i){i.__complete||(l(i),n(i),o(i),h(i),p(i),t(i.layers,i.assets),function(i,s){if(i){var a=0,r=i.length;for(a=0;a<r;a+=1)1===i[a].t&&(i[a].data.layers=e(i[a].data.refId,s),t(i[a].data.layers,s))}}(i.chars,i.assets),i.__complete=!0)}};return d.checkColors=l,d.checkChars=o,d.checkPathProperties=h,d.checkShapes=p,d.completeLayers=t,d}()),n.assetLoader||(n.assetLoader=function(){function t(t){var e=t.getResponseHeader("content-type");return e&&"json"===t.responseType&&-1!==e.indexOf("json")||t.response&&"object"===X(t.response)?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):null}return{load:function(e,i,s,a){var r,n=new XMLHttpRequest;try{n.responseType="json"}catch(t){}n.onreadystatechange=function(){if(4===n.readyState)if(200===n.status)r=t(n),s(r);else try{r=t(n),s(r)}catch(t){a&&a(t)}};try{n.open(["G","E","T"].join(""),e,!0)}catch(t){n.open(["G","E","T"].join(""),i+"/"+e,!0)}n.send()}}}()),"loadAnimation"===t.data.type)n.assetLoader.load(t.data.path,t.data.fullPath,(function(e){n.dataManager.completeData(e),n.postMessage({id:t.data.id,payload:e,status:"success"})}),(function(){n.postMessage({id:t.data.id,status:"error"})}));else if("complete"===t.data.type){var e=t.data.animation;n.dataManager.completeData(e),n.postMessage({id:t.data.id,payload:e,status:"success"})}else"loadData"===t.data.type&&n.assetLoader.load(t.data.path,t.data.fullPath,(function(e){n.postMessage({id:t.data.id,payload:e,status:"success"})}),(function(){n.postMessage({id:t.data.id,status:"error"})}))})),i.onmessage=function(t){var e=t.data,i=e.id,s=a[i];a[i]=null,"success"===e.status?s.onComplete(e.payload):s.onError&&s.onError()})}function l(t,e){var i="processId_"+(s+=1);return a[i]={onComplete:t,onError:e},i}return{loadAnimation:function(t,e,s){h();var a=l(e,s);i.postMessage({type:"loadAnimation",path:t,fullPath:window.location.origin+window.location.pathname,id:a})},loadData:function(t,e,s){h();var a=l(e,s);i.postMessage({type:"loadData",path:t,fullPath:window.location.origin+window.location.pathname,id:a})},completeAnimation:function(t,e,s){h();var a=l(e,s);i.postMessage({type:"complete",animation:t,id:a})}}}(),Y=function(){var t=function(){var t=a("canvas");t.width=1,t.height=1;var e=t.getContext("2d");return e.fillStyle="rgba(0,0,0,0)",e.fillRect(0,0,1,1),t}();function e(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.loadedFootagesCount===this.totalFootages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function i(){this.loadedFootagesCount+=1,this.loadedAssets===this.totalImages&&this.loadedFootagesCount===this.totalFootages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function s(t,e,i){var s="";if(t.e)s=t.p;else if(e){var a=t.p;-1!==a.indexOf("images/")&&(a=a.split("/")[1]),s=e+a}else s=i,s+=t.u?t.u:"",s+=t.p;return s}function r(t){var e=0,i=setInterval(function(){(t.getBBox().width||e>500)&&(this._imageLoaded(),clearInterval(i)),e+=1}.bind(this),50)}function n(t){var e={assetData:t},i=s(t,this.assetsPath,this.path);return H.loadData(i,function(t){e.img=t,this._footageLoaded()}.bind(this),function(){e.img={},this._footageLoaded()}.bind(this)),e}function o(){this._imageLoaded=e.bind(this),this._footageLoaded=i.bind(this),this.testImageLoaded=r.bind(this),this.createFootageData=n.bind(this),this.assetsPath="",this.path="",this.totalImages=0,this.totalFootages=0,this.loadedAssets=0,this.loadedFootagesCount=0,this.imagesLoadedCb=null,this.images=[]}return o.prototype={loadAssets:function(t,e){var i;this.imagesLoadedCb=e;var s=t.length;for(i=0;i<s;i+=1)t[i].layers||(t[i].t&&"seq"!==t[i].t?3===t[i].t&&(this.totalFootages+=1,this.images.push(this.createFootageData(t[i]))):(this.totalImages+=1,this.images.push(this._createImageData(t[i]))))},setAssetsPath:function(t){this.assetsPath=t||""},setPath:function(t){this.path=t||""},loadedImages:function(){return this.totalImages===this.loadedAssets},loadedFootages:function(){return this.totalFootages===this.loadedFootagesCount},destroy:function(){this.imagesLoadedCb=null,this.images.length=0},getAsset:function(t){for(var e=0,i=this.images.length;e<i;){if(this.images[e].assetData===t)return this.images[e].img;e+=1}return null},createImgData:function(e){var i=s(e,this.assetsPath,this.path),r=a("img");r.crossOrigin="anonymous",r.addEventListener("load",this._imageLoaded,!1),r.addEventListener("error",function(){n.img=t,this._imageLoaded()}.bind(this),!1),r.src=i;var n={img:r,assetData:e};return n},createImageData:function(e){var i=s(e,this.assetsPath,this.path),a=W("image");u?this.testImageLoaded(a):a.addEventListener("load",this._imageLoaded,!1),a.addEventListener("error",function(){r.img=t,this._imageLoaded()}.bind(this),!1),a.setAttributeNS("http://www.w3.org/1999/xlink","href",i),this._elementHelper.append?this._elementHelper.append(a):this._elementHelper.appendChild(a);var r={img:a,assetData:e};return r},imageLoaded:e,footageLoaded:i,setCacheType:function(t,e){"svg"===t?(this._elementHelper=e,this._createImageData=this.createImageData.bind(this)):this._createImageData=this.createImgData.bind(this)}},o}();function G(){}G.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var i=this._cbs[t],s=0;s<i.length;s+=1)i[s](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var i=0,s=this._cbs[t].length;i<s;)this._cbs[t][i]===e&&(this._cbs[t].splice(i,1),i-=1,s-=1),i+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var K=function(){function t(t){for(var e,i=t.split("\r\n"),s={},a=0,r=0;r<i.length;r+=1)2===(e=i[r].split(":")).length&&(s[e[0]]=e[1].trim(),a+=1);if(0===a)throw new Error;return s}return function(e){for(var i=[],s=0;s<e.length;s+=1){var a=e[s],r={time:a.tm,duration:a.dr};try{r.payload=JSON.parse(e[s].cm)}catch(i){try{r.payload=t(e[s].cm)}catch(t){r.payload={name:e[s].cm}}}i.push(r)}return i}}(),J=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,i=this.compositions.length;e<i;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].data.xt&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}return null}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),U={};function Z(t){return Z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Z(t)}var Q=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.firstFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=I(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.isSubframeEnabled=f,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface=J(),this.imagePreloader=new Y,this.audioController=o(),this.markers=[],this.configAnimation=this.configAnimation.bind(this),this.onSetupError=this.onSetupError.bind(this),this.onSegmentComplete=this.onSegmentComplete.bind(this),this.drawnFrameEvent=new x("drawnFrame",0,0,0),this.expressionsPlugin=N()};r([G],Q),Q.prototype.setParams=function(t){(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e="svg";t.animType?e=t.animType:t.renderer&&(e=t.renderer);var i=U[e];this.renderer=new i(this,t.rendererSettings),this.imagePreloader.setCacheType(e,this.renderer.globalData.defs),this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||void 0===t.loop||!0===t.loop?this.loop=!0:!1===t.loop?this.loop=!1:this.loop=parseInt(t.loop,10),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!Object.prototype.hasOwnProperty.call(t,"autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,this.initialSegment=t.initialSegment,t.audioFactory&&this.audioController.setAudioFactory(t.audioFactory),t.animationData?this.setupAnimation(t.animationData):t.path&&(-1!==t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),H.loadAnimation(t.path,this.configAnimation,this.onSetupError))},Q.prototype.onSetupError=function(){this.trigger("data_failed")},Q.prototype.setupAnimation=function(t){H.completeAnimation(t,this.configAnimation)},Q.prototype.setData=function(t,e){e&&"object"!==Z(e)&&(e=JSON.parse(e));var i={wrapper:t,animationData:e},s=t.attributes;i.path=s.getNamedItem("data-animation-path")?s.getNamedItem("data-animation-path").value:s.getNamedItem("data-bm-path")?s.getNamedItem("data-bm-path").value:s.getNamedItem("bm-path")?s.getNamedItem("bm-path").value:"",i.animType=s.getNamedItem("data-anim-type")?s.getNamedItem("data-anim-type").value:s.getNamedItem("data-bm-type")?s.getNamedItem("data-bm-type").value:s.getNamedItem("bm-type")?s.getNamedItem("bm-type").value:s.getNamedItem("data-bm-renderer")?s.getNamedItem("data-bm-renderer").value:s.getNamedItem("bm-renderer")?s.getNamedItem("bm-renderer").value:function(){if(U.canvas)return"canvas";for(var t in U)if(U[t])return t;return""}()||"canvas";var a=s.getNamedItem("data-anim-loop")?s.getNamedItem("data-anim-loop").value:s.getNamedItem("data-bm-loop")?s.getNamedItem("data-bm-loop").value:s.getNamedItem("bm-loop")?s.getNamedItem("bm-loop").value:"";"false"===a?i.loop=!1:"true"===a?i.loop=!0:""!==a&&(i.loop=parseInt(a,10));var r=s.getNamedItem("data-anim-autoplay")?s.getNamedItem("data-anim-autoplay").value:s.getNamedItem("data-bm-autoplay")?s.getNamedItem("data-bm-autoplay").value:!s.getNamedItem("bm-autoplay")||s.getNamedItem("bm-autoplay").value;i.autoplay="false"!==r,i.name=s.getNamedItem("data-name")?s.getNamedItem("data-name").value:s.getNamedItem("data-bm-name")?s.getNamedItem("data-bm-name").value:s.getNamedItem("bm-name")?s.getNamedItem("bm-name").value:"","false"===(s.getNamedItem("data-anim-prerender")?s.getNamedItem("data-anim-prerender").value:s.getNamedItem("data-bm-prerender")?s.getNamedItem("data-bm-prerender").value:s.getNamedItem("bm-prerender")?s.getNamedItem("bm-prerender").value:"")&&(i.prerender=!1),i.path?this.setParams(i):this.trigger("destroy")},Q.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,i,s=this.animationData.layers,a=s.length,r=t.layers,n=r.length;for(i=0;i<n;i+=1)for(e=0;e<a;){if(s[e].id===r[i].id){s[e]=r[i];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(a=t.assets.length,e=0;e<a;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,H.completeAnimation(this.animationData,this.onSegmentComplete)},Q.prototype.onSegmentComplete=function(t){this.animationData=t;var e=N();e&&e.initExpressions(this),this.loadNextSegment()},Q.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,H.loadData(i,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},Q.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},Q.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},Q.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},Q.prototype.configAnimation=function(t){if(this.renderer)try{this.animationData=t,this.initialSegment?(this.totalFrames=Math.floor(this.initialSegment[1]-this.initialSegment[0]),this.firstFrame=Math.round(this.initialSegment[0])):(this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.firstFrame=Math.round(this.animationData.ip)),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.frameMult=this.animationData.fr/1e3,this.renderer.searchExtraCompositions(t.assets),this.markers=K(t.markers||[]),this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded(),this.isPaused&&this.audioController.pause()}catch(t){this.triggerConfigError(t)}},Q.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.isLoaded?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},Q.prototype.checkLoaded=function(){if(!this.isLoaded&&this.renderer.globalData.fontManager.isLoaded&&(this.imagePreloader.loadedImages()||"canvas"!==this.renderer.rendererType)&&this.imagePreloader.loadedFootages()){this.isLoaded=!0;var t=N();t&&t.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play()}},Q.prototype.resize=function(t,e){var i="number"==typeof t?t:void 0,s="number"==typeof e?e:void 0;this.renderer.updateContainerSize(i,s)},Q.prototype.setSubframe=function(t){this.isSubframeEnabled=!!t},Q.prototype.gotoFrame=function(){this.currentFrame=this.isSubframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame(),this.trigger("drawnFrame")},Q.prototype.renderFrame=function(){if(!1!==this.isLoaded&&this.renderer)try{this.expressionsPlugin&&this.expressionsPlugin.resetFrame(),this.renderer.renderFrame(this.currentFrame+this.firstFrame)}catch(t){this.triggerRenderFrameError(t)}},Q.prototype.play=function(t){t&&this.name!==t||!0===this.isPaused&&(this.isPaused=!1,this.trigger("_play"),this.audioController.resume(),this._idle&&(this._idle=!1,this.trigger("_active")))},Q.prototype.pause=function(t){t&&this.name!==t||!1===this.isPaused&&(this.isPaused=!0,this.trigger("_pause"),this._idle=!0,this.trigger("_idle"),this.audioController.pause())},Q.prototype.togglePause=function(t){t&&this.name!==t||(!0===this.isPaused?this.play():this.pause())},Q.prototype.stop=function(t){t&&this.name!==t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},Q.prototype.getMarkerData=function(t){for(var e,i=0;i<this.markers.length;i+=1)if((e=this.markers[i]).payload&&e.payload.name===t)return e;return null},Q.prototype.goToAndStop=function(t,e,i){if(!i||this.name===i){var s=Number(t);if(isNaN(s)){var a=this.getMarkerData(t);a&&this.goToAndStop(a.time,!0)}else e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier);this.pause()}},Q.prototype.goToAndPlay=function(t,e,i){if(!i||this.name===i){var s=Number(t);if(isNaN(s)){var a=this.getMarkerData(t);a&&(a.duration?this.playSegments([a.time,a.time+a.duration],!0):this.goToAndStop(a.time,!0))}else this.goToAndStop(s,e,i);this.play()}},Q.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,i=!1;e>=this.totalFrames-1&&this.frameModifier>0?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(i=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(i=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),i&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},Q.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.timeCompleted=this.totalFrames,this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.timeCompleted=this.totalFrames,this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},Q.prototype.setSegment=function(t,e){var i=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?i=t:this.currentRawFrame+this.firstFrame>e&&(i=e-t)),this.firstFrame=t,this.totalFrames=e-t,this.timeCompleted=this.totalFrames,-1!==i&&this.goToAndStop(i,!0)},Q.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"===Z(t[0])){var i,s=t.length;for(i=0;i<s;i+=1)this.segments.push(t[i])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},Q.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},Q.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},Q.prototype.destroy=function(t){t&&this.name!==t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=null,this.onLoopComplete=null,this.onComplete=null,this.onSegmentStart=null,this.onDestroy=null,this.renderer=null,this.expressionsPlugin=null,this.imagePreloader=null,this.projectInterface=null)},Q.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},Q.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},Q.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},Q.prototype.setLoop=function(t){this.loop=t},Q.prototype.setVolume=function(t,e){e&&this.name!==e||this.audioController.setVolume(t)},Q.prototype.getVolume=function(){return this.audioController.getVolume()},Q.prototype.mute=function(t){t&&this.name!==t||this.audioController.mute()},Q.prototype.unmute=function(t){t&&this.name!==t||this.audioController.unmute()},Q.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection,this.audioController.setRate(this.playSpeed*this.playDirection)},Q.prototype.getPath=function(){return this.path},Q.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var i=t.p;-1!==i.indexOf("images/")&&(i=i.split("/")[1]),e=this.assetsPath+i}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},Q.prototype.getAssetData=function(t){for(var e=0,i=this.assets.length;e<i;){if(t===this.assets[e].id)return this.assets[e];e+=1}return null},Q.prototype.hide=function(){this.renderer.hide()},Q.prototype.show=function(){this.renderer.show()},Q.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},Q.prototype.updateDocumentData=function(t,e,i){try{this.renderer.getElementByPath(t).updateDocumentData(e,i)}catch(t){}},Q.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new x(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"drawnFrame":this.drawnFrameEvent.currentTime=this.currentFrame,this.drawnFrameEvent.totalTime=this.totalFrames,this.drawnFrameEvent.direction=this.frameModifier,this.triggerEvent(t,this.drawnFrameEvent);break;case"loopComplete":this.triggerEvent(t,new D(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new w(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new C(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new M(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new x(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new D(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new w(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new C(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new M(t,this))},Q.prototype.triggerRenderFrameError=function(t){var e=new T(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)},Q.prototype.triggerConfigError=function(t){var e=new F(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)};var $=function(){var t={},e=[],i=0,s=0,r=0,n=!0,o=!1;function h(t){for(var i=0,a=t.target;i<s;)e[i].animation===a&&(e.splice(i,1),i-=1,s-=1,a.isPaused||f()),i+=1}function l(t,i){if(!t)return null;for(var a=0;a<s;){if(e[a].elem===t&&null!==e[a].elem)return e[a].animation;a+=1}var r=new Q;return d(r,t),r.setData(t,i),r}function p(){r+=1,u()}function f(){r-=1}function d(t,i){t.addEventListener("destroy",h),t.addEventListener("_active",p),t.addEventListener("_idle",f),e.push({elem:i,animation:t}),s+=1}function m(t){var a,h=t-i;for(a=0;a<s;a+=1)e[a].animation.advanceTime(h);i=t,r&&!o?window.requestAnimationFrame(m):n=!0}function c(t){i=t,window.requestAnimationFrame(m)}function u(){!o&&r&&n&&(window.requestAnimationFrame(c),n=!1)}return t.registerAnimation=l,t.loadAnimation=function(t){var e=new Q;return d(e,null),e.setParams(t),e},t.setSpeed=function(t,i){var a;for(a=0;a<s;a+=1)e[a].animation.setSpeed(t,i)},t.setDirection=function(t,i){var a;for(a=0;a<s;a+=1)e[a].animation.setDirection(t,i)},t.play=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.play(t)},t.pause=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.pause(t)},t.stop=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.stop(t)},t.togglePause=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.togglePause(t)},t.searchAnimations=function(t,e,i){var s,r=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),n=r.length;for(s=0;s<n;s+=1)i&&r[s].setAttribute("data-bm-type",i),l(r[s],t);if(e&&0===n){i||(i="svg");var o=document.getElementsByTagName("body")[0];o.innerText="";var h=a("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",i),o.appendChild(h),l(h,t)}},t.resize=function(){var t;for(t=0;t<s;t+=1)e[t].animation.resize()},t.goToAndStop=function(t,i,a){var r;for(r=0;r<s;r+=1)e[r].animation.goToAndStop(t,i,a)},t.destroy=function(t){var i;for(i=s-1;i>=0;i-=1)e[i].animation.destroy(t)},t.freeze=function(){o=!0},t.unfreeze=function(){o=!1,u()},t.setVolume=function(t,i){var a;for(a=0;a<s;a+=1)e[a].animation.setVolume(t,i)},t.mute=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.mute(t)},t.unmute=function(t){var i;for(i=0;i<s;i+=1)e[i].animation.unmute(t)},t.getRegisteredAnimations=function(){var t,i=e.length,s=[];for(t=0;t<i;t+=1)s.push(e[t].animation);return s},t}(),tt=function(){var t={getBezierEasing:function(t,i,s,a,r){var n=r||("bez_"+t+"_"+i+"_"+s+"_"+a).replace(/\./g,"p");if(e[n])return e[n];var o=new l([t,i,s,a]);return e[n]=o,o}},e={};var i=.1,s="function"==typeof Float32Array;function a(t,e){return 1-3*e+3*t}function r(t,e){return 3*e-6*t}function n(t){return 3*t}function o(t,e,i){return((a(e,i)*t+r(e,i))*t+n(e))*t}function h(t,e,i){return 3*a(e,i)*t*t+2*r(e,i)*t+n(e)}function l(t){this._p=t,this._mSampleValues=s?new Float32Array(11):new Array(11),this._precomputed=!1,this.get=this.get.bind(this)}return l.prototype={get:function(t){var e=this._p[0],i=this._p[1],s=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===i&&s===a?t:0===t?0:1===t?1:o(this._getTForX(t),i,a)},_precompute:function(){var t=this._p[0],e=this._p[1],i=this._p[2],s=this._p[3];this._precomputed=!0,t===e&&i===s||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;s<11;++s)this._mSampleValues[s]=o(s*i,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],a=this._mSampleValues,r=0,n=1;10!==n&&a[n]<=t;++n)r+=i;var l=r+(t-a[--n])/(a[n+1]-a[n])*i,p=h(l,e,s);return p>=.001?function(t,e,i,s){for(var a=0;a<4;++a){var r=h(e,i,s);if(0===r)return e;e-=(o(e,i,s)-t)/r}return e}(t,l,e,s):0===p?l:function(t,e,i,s,a){var r,n,h=0;do{(r=o(n=e+(i-e)/2,s,a)-t)>0?i=n:e=n}while(Math.abs(r)>1e-7&&++h<10);return n}(t,r,r+i,e,s)}},t}(),et={double:function(t){return t.concat(l(t.length))}},it=function(t,e,i){var s=0,a=t,r=l(a);return{newElement:function(){return s?r[s-=1]:e()},release:function(t){s===a&&(r=et.double(r),a*=2),i&&i(t),r[s]=t,s+=1}}},st=it(8,(function(){return{addedLength:0,percents:h("float32",j()),lengths:h("float32",j())}})),at=it(8,(function(){return{lengths:[],totalLength:0}}),(function(t){var e,i=t.lengths.length;for(e=0;e<i;e+=1)st.release(t.lengths[e]);t.lengths.length=0}));var rt=function(){var t=Math;function e(t,e,i,s,a,r){var n=t*s+e*a+i*r-a*s-r*t-i*e;return n>-.001&&n<.001}var i=function(t,e,i,s){var a,r,n,o,h,l,p=j(),f=0,d=[],m=[],c=st.newElement();for(n=i.length,a=0;a<p;a+=1){for(h=a/(p-1),l=0,r=0;r<n;r+=1)o=g(1-h,3)*t[r]+3*g(1-h,2)*h*i[r]+3*(1-h)*g(h,2)*s[r]+g(h,3)*e[r],d[r]=o,null!==m[r]&&(l+=g(d[r]-m[r],2)),m[r]=d[r];l&&(f+=l=y(l)),c.percents[a]=h,c.lengths[a]=f}return c.addedLength=f,c};function s(t){this.segmentLength=0,this.points=new Array(t)}function a(t,e){this.partialLength=t,this.point=e}var r,n=(r={},function(t,i,n,o){var h=(t[0]+"_"+t[1]+"_"+i[0]+"_"+i[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]).replace(/\./g,"p");if(!r[h]){var p,f,d,m,c,u,v,b=j(),_=0,k=null;2===t.length&&(t[0]!==i[0]||t[1]!==i[1])&&e(t[0],t[1],i[0],i[1],t[0]+n[0],t[1]+n[1])&&e(t[0],t[1],i[0],i[1],i[0]+o[0],i[1]+o[1])&&(b=2);var P=new s(b);for(d=n.length,p=0;p<b;p+=1){for(v=l(d),c=p/(b-1),u=0,f=0;f<d;f+=1)m=g(1-c,3)*t[f]+3*g(1-c,2)*c*(t[f]+n[f])+3*(1-c)*g(c,2)*(i[f]+o[f])+g(c,3)*i[f],v[f]=m,null!==k&&(u+=g(v[f]-k[f],2));_+=u=y(u),P.points[p]=new a(u,v),k=v}P.segmentLength=_,r[h]=P}return r[h]});function o(t,e){var i=e.percents,s=e.lengths,a=i.length,r=v((a-1)*t),n=t*e.addedLength,o=0;if(r===a-1||0===r||n===s[r])return i[r];for(var h=s[r]>n?-1:1,l=!0;l;)if(s[r]<=n&&s[r+1]>n?(o=(n-s[r])/(s[r+1]-s[r]),l=!1):r+=h,r<0||r>=a-1){if(r===a-1)return i[r];l=!1}return i[r]+(i[r+1]-i[r])*o}var p=h("float32",8);return{getSegmentsLength:function(t){var e,s=at.newElement(),a=t.c,r=t.v,n=t.o,o=t.i,h=t._length,l=s.lengths,p=0;for(e=0;e<h-1;e+=1)l[e]=i(r[e],r[e+1],n[e],o[e+1]),p+=l[e].addedLength;return a&&h&&(l[e]=i(r[e],r[0],n[e],o[0]),p+=l[e].addedLength),s.totalLength=p,s},getNewSegment:function(e,i,s,a,r,n,h){r<0?r=0:r>1&&(r=1);var l,f=o(r,h),d=o(n=n>1?1:n,h),m=e.length,c=1-f,u=1-d,g=c*c*c,y=f*c*c*3,v=f*f*c*3,b=f*f*f,_=c*c*u,k=f*c*u+c*f*u+c*c*d,P=f*f*u+c*f*d+f*c*d,A=f*f*d,S=c*u*u,x=f*u*u+c*d*u+c*u*d,w=f*d*u+c*d*d+f*u*d,D=f*d*d,C=u*u*u,M=d*u*u+u*d*u+u*u*d,T=d*d*u+u*d*d+d*u*d,F=d*d*d;for(l=0;l<m;l+=1)p[4*l]=t.round(1e3*(g*e[l]+y*s[l]+v*a[l]+b*i[l]))/1e3,p[4*l+1]=t.round(1e3*(_*e[l]+k*s[l]+P*a[l]+A*i[l]))/1e3,p[4*l+2]=t.round(1e3*(S*e[l]+x*s[l]+w*a[l]+D*i[l]))/1e3,p[4*l+3]=t.round(1e3*(C*e[l]+M*s[l]+T*a[l]+F*i[l]))/1e3;return p},getPointInSegment:function(e,i,s,a,r,n){var h=o(r,n),l=1-h;return[t.round(1e3*(l*l*l*e[0]+(h*l*l+l*h*l+l*l*h)*s[0]+(h*h*l+l*h*h+h*l*h)*a[0]+h*h*h*i[0]))/1e3,t.round(1e3*(l*l*l*e[1]+(h*l*l+l*h*l+l*l*h)*s[1]+(h*h*l+l*h*h+h*l*h)*a[1]+h*h*h*i[1]))/1e3]},buildBezierData:n,pointOnLine2D:e,pointOnLine3D:function(i,s,a,r,n,o,h,l,p){if(0===a&&0===o&&0===p)return e(i,s,r,n,h,l);var f,d=t.sqrt(t.pow(r-i,2)+t.pow(n-s,2)+t.pow(o-a,2)),m=t.sqrt(t.pow(h-i,2)+t.pow(l-s,2)+t.pow(p-a,2)),c=t.sqrt(t.pow(h-r,2)+t.pow(l-n,2)+t.pow(p-o,2));return(f=d>m?d>c?d-m-c:c-m-d:c>m?c-m-d:m-d-c)>-1e-4&&f<1e-4}}}(),nt=i,ot=Math.abs;function ht(t,e){var i,s=this.offsetTime;"multidimensional"===this.propType&&(i=h("float32",this.pv.length));for(var a,r,n,o,l,p,f,d,m,c=e.lastIndex,u=c,g=this.keyframes.length-1,y=!0;y;){if(a=this.keyframes[u],r=this.keyframes[u+1],u===g-1&&t>=r.t-s){a.h&&(a=r),c=0;break}if(r.t-s>t){c=u;break}u<g-1?u+=1:(c=0,y=!1)}n=this.keyframesMetadata[u]||{};var v,b,_,k,A,S,x,w,D,C,M=r.t-s,T=a.t-s;if(a.to){n.bezierData||(n.bezierData=rt.buildBezierData(a.s,r.s||a.e,a.to,a.ti));var F=n.bezierData;if(t>=M||t<T){var E=t>=M?F.points.length-1:0;for(l=F.points[E].point.length,o=0;o<l;o+=1)i[o]=F.points[E].point[o]}else{n.__fnct?m=n.__fnct:(m=tt.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,n.__fnct=m),p=m((t-T)/(M-T));var I,L=F.segmentLength*p,V=e.lastFrame<t&&e._lastKeyframeIndex===u?e._lastAddedLength:0;for(d=e.lastFrame<t&&e._lastKeyframeIndex===u?e._lastPoint:0,y=!0,f=F.points.length;y;){if(V+=F.points[d].partialLength,0===L||0===p||d===F.points.length-1){for(l=F.points[d].point.length,o=0;o<l;o+=1)i[o]=F.points[d].point[o];break}if(L>=V&&L<V+F.points[d+1].partialLength){for(I=(L-V)/F.points[d+1].partialLength,l=F.points[d].point.length,o=0;o<l;o+=1)i[o]=F.points[d].point[o]+(F.points[d+1].point[o]-F.points[d].point[o])*I;break}d<f-1?d+=1:y=!1}e._lastPoint=d,e._lastAddedLength=V-F.points[d].partialLength,e._lastKeyframeIndex=u}}else{var R,z,O,N,B;if(g=a.s.length,v=r.s||a.e,this.sh&&1!==a.h)if(t>=M)i[0]=v[0],i[1]=v[1],i[2]=v[2];else if(t<=T)i[0]=a.s[0],i[1]=a.s[1],i[2]=a.s[2];else{var q=lt(a.s),j=lt(v);b=i,_=function(t,e,i){var s,a,r,n,o,h=[],l=t[0],p=t[1],f=t[2],d=t[3],m=e[0],c=e[1],u=e[2],g=e[3];return(a=l*m+p*c+f*u+d*g)<0&&(a=-a,m=-m,c=-c,u=-u,g=-g),1-a>1e-6?(s=Math.acos(a),r=Math.sin(s),n=Math.sin((1-i)*s)/r,o=Math.sin(i*s)/r):(n=1-i,o=i),h[0]=n*l+o*m,h[1]=n*p+o*c,h[2]=n*f+o*u,h[3]=n*d+o*g,h}(q,j,(t-T)/(M-T)),k=_[0],A=_[1],S=_[2],x=_[3],w=Math.atan2(2*A*x-2*k*S,1-2*A*A-2*S*S),D=Math.asin(2*k*A+2*S*x),C=Math.atan2(2*k*x-2*A*S,1-2*k*k-2*S*S),b[0]=w/P,b[1]=D/P,b[2]=C/P}else for(u=0;u<g;u+=1)1!==a.h&&(t>=M?p=1:t<T?p=0:(a.o.x.constructor===Array?(n.__fnct||(n.__fnct=[]),n.__fnct[u]?m=n.__fnct[u]:(R=void 0===a.o.x[u]?a.o.x[0]:a.o.x[u],z=void 0===a.o.y[u]?a.o.y[0]:a.o.y[u],O=void 0===a.i.x[u]?a.i.x[0]:a.i.x[u],N=void 0===a.i.y[u]?a.i.y[0]:a.i.y[u],m=tt.getBezierEasing(R,z,O,N).get,n.__fnct[u]=m)):n.__fnct?m=n.__fnct:(R=a.o.x,z=a.o.y,O=a.i.x,N=a.i.y,m=tt.getBezierEasing(R,z,O,N).get,a.keyframeMetadata=m),p=m((t-T)/(M-T)))),v=r.s||a.e,B=1===a.h?a.s[u]:a.s[u]+(v[u]-a.s[u])*p,"multidimensional"===this.propType?i[u]=B:i=B}return e.lastIndex=c,i}function lt(t){var e=t[0]*P,i=t[1]*P,s=t[2]*P,a=Math.cos(e/2),r=Math.cos(i/2),n=Math.cos(s/2),o=Math.sin(e/2),h=Math.sin(i/2),l=Math.sin(s/2);return[o*h*n+a*r*l,o*r*n+a*h*l,a*h*n-o*r*l,a*r*n-o*h*l]}function pt(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,i=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==nt&&(this._caching.lastFrame>=i&&t>=i||this._caching.lastFrame<e&&t<e))){this._caching.lastFrame>=t&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var s=this.interpolateValue(t,this._caching);this.pv=s}return this._caching.lastFrame=t,this.pv}function ft(t){var e;if("unidimensional"===this.propType)e=t*this.mult,ot(this.v-e)>1e-5&&(this.v=e,this._mdf=!0);else for(var i=0,s=this.v.length;i<s;)e=t[i]*this.mult,ot(this.v[i]-e)>1e-5&&(this.v[i]=e,this._mdf=!0),i+=1}function dt(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t;this.lock=!0,this._mdf=this._isFirstFrame;var e=this.effectsSequence.length,i=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)i=this.effectsSequence[t](i);this.setVValue(i),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function mt(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function ct(t,e,i,s){this.propType="unidimensional",this.mult=i||1,this.data=e,this.v=i?e.k*i:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=s,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=dt,this.setVValue=ft,this.addEffect=mt}function ut(t,e,i,s){var a;this.propType="multidimensional",this.mult=i||1,this.data=e,this._mdf=!1,this.elem=t,this.container=s,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var r=e.k.length;for(this.v=h("float32",r),this.pv=h("float32",r),this.vel=h("float32",r),a=0;a<r;a+=1)this.v[a]=e.k[a]*this.mult,this.pv[a]=e.k[a];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=dt,this.setVValue=ft,this.addEffect=mt}function gt(t,e,i,s){this.propType="unidimensional",this.keyframes=e.k,this.keyframesMetadata=[],this.offsetTime=t.data.st,this.frameId=-1,this._caching={lastFrame:nt,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=e,this.mult=i||1,this.elem=t,this.container=s,this.comp=t.comp,this.v=nt,this.pv=nt,this._isFirstFrame=!0,this.getValue=dt,this.setVValue=ft,this.interpolateValue=ht,this.effectsSequence=[pt.bind(this)],this.addEffect=mt}function yt(t,e,i,s){var a;this.propType="multidimensional";var r,n,o,l,p=e.k.length;for(a=0;a<p-1;a+=1)e.k[a].to&&e.k[a].s&&e.k[a+1]&&e.k[a+1].s&&(r=e.k[a].s,n=e.k[a+1].s,o=e.k[a].to,l=e.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&rt.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+o[0],r[1]+o[1])&&rt.pointOnLine2D(r[0],r[1],n[0],n[1],n[0]+l[0],n[1]+l[1])||3===r.length&&(r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])&&rt.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],r[0]+o[0],r[1]+o[1],r[2]+o[2])&&rt.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],n[0]+l[0],n[1]+l[1],n[2]+l[2]))&&(e.k[a].to=null,e.k[a].ti=null),r[0]===n[0]&&r[1]===n[1]&&0===o[0]&&0===o[1]&&0===l[0]&&0===l[1]&&(2===r.length||r[2]===n[2]&&0===o[2]&&0===l[2])&&(e.k[a].to=null,e.k[a].ti=null));this.effectsSequence=[pt.bind(this)],this.data=e,this.keyframes=e.k,this.keyframesMetadata=[],this.offsetTime=t.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=i||1,this.elem=t,this.container=s,this.comp=t.comp,this.getValue=dt,this.setVValue=ft,this.interpolateValue=ht,this.frameId=-1;var f=e.k[0].s.length;for(this.v=h("float32",f),this.pv=h("float32",f),a=0;a<f;a+=1)this.v[a]=nt,this.pv[a]=nt;this._caching={lastFrame:nt,lastIndex:0,value:h("float32",f)},this.addEffect=mt}var vt={getProp:function(t,e,i,s,a){var r;if(e.sid&&(e=t.globalData.slotManager.getProp(e)),e.k.length)if("number"==typeof e.k[0])r=new ut(t,e,s,a);else switch(i){case 0:r=new gt(t,e,s,a);break;case 1:r=new yt(t,e,s,a)}else r=new ct(t,e,s,a);return r.effectsSequence.length&&a.addDynamicProperty(r),r}};function bt(){}bt.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){var t;this._mdf=!1;var e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var _t=it(8,(function(){return h("float32",2)}));function kt(){this.c=!1,this._length=0,this._maxLength=8,this.v=l(this._maxLength),this.o=l(this._maxLength),this.i=l(this._maxLength)}kt.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var i=0;i<e;)this.v[i]=_t.newElement(),this.o[i]=_t.newElement(),this.i[i]=_t.newElement(),i+=1},kt.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},kt.prototype.doubleArrayLength=function(){this.v=this.v.concat(l(this._maxLength)),this.i=this.i.concat(l(this._maxLength)),this.o=this.o.concat(l(this._maxLength)),this._maxLength*=2},kt.prototype.setXYAt=function(t,e,i,s,a){var r;switch(this._length=Math.max(this._length,s+1),this._length>=this._maxLength&&this.doubleArrayLength(),i){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o;break;default:r=[]}(!r[s]||r[s]&&!a)&&(r[s]=_t.newElement()),r[s][0]=t,r[s][1]=e},kt.prototype.setTripleAt=function(t,e,i,s,a,r,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(i,s,"o",n,o),this.setXYAt(a,r,"i",n,o)},kt.prototype.reverse=function(){var t=new kt;t.setPathData(this.c,this._length);var e=this.v,i=this.o,s=this.i,a=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],s[0][0],s[0][1],i[0][0],i[0][1],0,!1),a=1);var r,n=this._length-1,o=this._length;for(r=a;r<o;r+=1)t.setTripleAt(e[n][0],e[n][1],s[n][0],s[n][1],i[n][0],i[n][1],r,!1),n-=1;return t},kt.prototype.length=function(){return this._length};var Pt,At=((Pt=it(4,(function(){return new kt}),(function(t){var e,i=t._length;for(e=0;e<i;e+=1)_t.release(t.v[e]),_t.release(t.i[e]),_t.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1}))).clone=function(t){var e,i=Pt.newElement(),s=void 0===t._length?t.v.length:t._length;for(i.setLength(s),i.c=t.c,e=0;e<s;e+=1)i.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return i},Pt);function St(){this._length=0,this._maxLength=4,this.shapes=l(this._maxLength)}St.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(l(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},St.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)At.release(this.shapes[t]);this._length=0};var xt,wt,Dt,Ct,Mt=(xt={newShapeCollection:function(){return wt?Ct[wt-=1]:new St},release:function(t){var e,i=t._length;for(e=0;e<i;e+=1)At.release(t.shapes[e]);t._length=0,wt===Dt&&(Ct=et.double(Ct),Dt*=2),Ct[wt]=t,wt+=1}},wt=0,Ct=l(Dt=4),xt),Tt=function(){var t=-999999;function e(t,e,i){var s,a,r,n,o,h,l,p,f,d=i.lastIndex,m=this.keyframes;if(t<m[0].t-this.offsetTime)s=m[0].s[0],r=!0,d=0;else if(t>=m[m.length-1].t-this.offsetTime)s=m[m.length-1].s?m[m.length-1].s[0]:m[m.length-2].e[0],r=!0;else{for(var c,u,g,y=d,v=m.length-1,b=!0;b&&(c=m[y],!((u=m[y+1]).t-this.offsetTime>t));)y<v-1?y+=1:b=!1;if(g=this.keyframesMetadata[y]||{},d=y,!(r=1===c.h)){if(t>=u.t-this.offsetTime)p=1;else if(t<c.t-this.offsetTime)p=0;else{var _;g.__fnct?_=g.__fnct:(_=tt.getBezierEasing(c.o.x,c.o.y,c.i.x,c.i.y).get,g.__fnct=_),p=_((t-(c.t-this.offsetTime))/(u.t-this.offsetTime-(c.t-this.offsetTime)))}a=u.s?u.s[0]:c.e[0]}s=c.s[0]}for(h=e._length,l=s.i[0].length,i.lastIndex=d,n=0;n<h;n+=1)for(o=0;o<l;o+=1)f=r?s.i[n][o]:s.i[n][o]+(a.i[n][o]-s.i[n][o])*p,e.i[n][o]=f,f=r?s.o[n][o]:s.o[n][o]+(a.o[n][o]-s.o[n][o])*p,e.o[n][o]=f,f=r?s.v[n][o]:s.v[n][o]+(a.v[n][o]-s.v[n][o])*p,e.v[n][o]=f}function i(){var e=this.comp.renderedFrame-this.offsetTime,i=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime,a=this._caching.lastFrame;return a!==t&&(a<i&&e<i||a>s&&e>s)||(this._caching.lastIndex=a<e?this._caching.lastIndex:0,this.interpolateShape(e,this.pv,this._caching)),this._caching.lastFrame=e,this.pv}function s(){this.paths=this.localShapeCollection}function a(t){(function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var i,s=t._length;for(i=0;i<s;i+=1)if(t.v[i][0]!==e.v[i][0]||t.v[i][1]!==e.v[i][1]||t.o[i][0]!==e.o[i][0]||t.o[i][1]!==e.o[i][1]||t.i[i][0]!==e.i[i][0]||t.i[i][1]!==e.i[i][1])return!1;return!0})(this.v,t)||(this.v=At.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function n(){if(this.elem.globalData.frameId!==this.frameId)if(this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t,e;this.lock=!0,this._mdf=!1,t=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k;var i=this.effectsSequence.length;for(e=0;e<i;e+=1)t=this.effectsSequence[e](t);this.setVValue(t),this.lock=!1,this.frameId=this.elem.globalData.frameId}else this._mdf=!1}function o(t,e,i){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var a=3===i?e.pt.k:e.ks.k;this.v=At.clone(a),this.pv=At.clone(this.v),this.localShapeCollection=Mt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s,this.effectsSequence=[]}function h(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function l(e,a,r){this.propType="shape",this.comp=e.comp,this.elem=e,this.container=e,this.offsetTime=e.data.st,this.keyframes=3===r?a.pt.k:a.ks.k,this.keyframesMetadata=[],this.k=!0,this.kf=!0;var n=this.keyframes[0].s[0].i.length;this.v=At.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,n),this.pv=At.clone(this.v),this.localShapeCollection=Mt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=t,this.reset=s,this._caching={lastFrame:t,lastIndex:0},this.effectsSequence=[i.bind(this)]}o.prototype.interpolateShape=e,o.prototype.getValue=n,o.prototype.setVValue=a,o.prototype.addEffect=h,l.prototype.getValue=n,l.prototype.interpolateShape=e,l.prototype.setVValue=a,l.prototype.addEffect=h;var p=function(){var t=A;function e(t,e){this.v=At.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=Mt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=vt.getProp(t,e.p,1,0,this),this.s=vt.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}return e.prototype={reset:s,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var e=this.p.v[0],i=this.p.v[1],s=this.s.v[0]/2,a=this.s.v[1]/2,r=3!==this.d,n=this.v;n.v[0][0]=e,n.v[0][1]=i-a,n.v[1][0]=r?e+s:e-s,n.v[1][1]=i,n.v[2][0]=e,n.v[2][1]=i+a,n.v[3][0]=r?e-s:e+s,n.v[3][1]=i,n.i[0][0]=r?e-s*t:e+s*t,n.i[0][1]=i-a,n.i[1][0]=r?e+s:e-s,n.i[1][1]=i-a*t,n.i[2][0]=r?e+s*t:e-s*t,n.i[2][1]=i+a,n.i[3][0]=r?e-s:e+s,n.i[3][1]=i+a*t,n.o[0][0]=r?e+s*t:e-s*t,n.o[0][1]=i-a,n.o[1][0]=r?e+s:e-s,n.o[1][1]=i+a*t,n.o[2][0]=r?e-s*t:e+s*t,n.o[2][1]=i+a,n.o[3][0]=r?e-s:e+s,n.o[3][1]=i-a*t}},r([bt],e),e}(),f=function(){function t(t,e){this.v=At.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=vt.getProp(t,e.ir,0,0,this),this.is=vt.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=vt.getProp(t,e.pt,0,0,this),this.p=vt.getProp(t,e.p,1,0,this),this.r=vt.getProp(t,e.r,0,P,this),this.or=vt.getProp(t,e.or,0,0,this),this.os=vt.getProp(t,e.os,0,.01,this),this.localShapeCollection=Mt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}return t.prototype={reset:s,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,i,s,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,f=2*Math.PI*o/(2*a),d=2*Math.PI*h/(2*a),m=-Math.PI/2;m+=this.r.v;var c=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<a;t+=1){i=n?l:p,s=n?f:d;var u=(e=n?o:h)*Math.cos(m),g=e*Math.sin(m),y=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),v=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(u,g,u-y*s*i*c,g-v*s*i*c,u+y*s*i*c,g+v*s*i*c,t,!0),n=!n,m+=r*c}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),i=2*Math.PI/e,s=this.or.v,a=this.os.v,r=2*Math.PI*s/(4*e),n=.5*-Math.PI,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=s*Math.cos(n),l=s*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),f=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(h,l,h-p*r*a*o,l-f*r*a*o,h+p*r*a*o,l+f*r*a*o,t,!0),n+=i*o}this.paths.length=0,this.paths[0]=this.v}},r([bt],t),t}(),d=function(){function t(t,e){this.v=At.newElement(),this.v.c=!0,this.localShapeCollection=Mt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=vt.getProp(t,e.p,1,0,this),this.s=vt.getProp(t,e.s,1,0,this),this.r=vt.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}return t.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],i=this.s.v[0]/2,s=this.s.v[1]/2,a=b(i,s,this.r.v),r=a*(1-A);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+i,e-s+a,t+i,e-s+a,t+i,e-s+r,0,!0),this.v.setTripleAt(t+i,e+s-a,t+i,e+s-r,t+i,e+s-a,1,!0),0!==a?(this.v.setTripleAt(t+i-a,e+s,t+i-a,e+s,t+i-r,e+s,2,!0),this.v.setTripleAt(t-i+a,e+s,t-i+r,e+s,t-i+a,e+s,3,!0),this.v.setTripleAt(t-i,e+s-a,t-i,e+s-a,t-i,e+s-r,4,!0),this.v.setTripleAt(t-i,e-s+a,t-i,e-s+r,t-i,e-s+a,5,!0),this.v.setTripleAt(t-i+a,e-s,t-i+a,e-s,t-i+r,e-s,6,!0),this.v.setTripleAt(t+i-a,e-s,t+i-r,e-s,t+i-a,e-s,7,!0)):(this.v.setTripleAt(t-i,e+s,t-i+r,e+s,t-i,e+s,2),this.v.setTripleAt(t-i,e-s,t-i,e-s+r,t-i,e-s,3))):(this.v.setTripleAt(t+i,e-s+a,t+i,e-s+r,t+i,e-s+a,0,!0),0!==a?(this.v.setTripleAt(t+i-a,e-s,t+i-a,e-s,t+i-r,e-s,1,!0),this.v.setTripleAt(t-i+a,e-s,t-i+r,e-s,t-i+a,e-s,2,!0),this.v.setTripleAt(t-i,e-s+a,t-i,e-s+a,t-i,e-s+r,3,!0),this.v.setTripleAt(t-i,e+s-a,t-i,e+s-r,t-i,e+s-a,4,!0),this.v.setTripleAt(t-i+a,e+s,t-i+a,e+s,t-i+r,e+s,5,!0),this.v.setTripleAt(t+i-a,e+s,t+i-r,e+s,t+i-a,e+s,6,!0),this.v.setTripleAt(t+i,e+s-a,t+i,e+s-a,t+i,e+s-r,7,!0)):(this.v.setTripleAt(t-i,e-s,t-i+r,e-s,t-i,e-s,1,!0),this.v.setTripleAt(t-i,e+s,t-i,e+s-r,t-i,e+s,2,!0),this.v.setTripleAt(t+i,e+s,t+i-r,e+s,t+i,e+s,3,!0)))},getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:s},r([bt],t),t}();var m={getShapeProp:function(t,e,i){var s;return 3===i||4===i?s=(3===i?e.pt:e.ks).k.length?new l(t,e,i):new o(t,e,i):5===i?s=new d(t,e):6===i?s=new p(t,e):7===i&&(s=new f(t,e)),s.k&&t.addDynamicProperty(s),s},getConstructorFunction:function(){return o},getKeyframedConstructorFunction:function(){return l}};return m}(),Ft=function(){var t=Math.cos,e=Math.sin,i=Math.tan,s=Math.round;function a(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function r(i){if(0===i)return this;var s=t(i),a=e(i);return this._t(s,-a,0,0,a,s,0,0,0,0,1,0,0,0,0,1)}function n(i){if(0===i)return this;var s=t(i),a=e(i);return this._t(1,0,0,0,0,s,-a,0,0,a,s,0,0,0,0,1)}function o(i){if(0===i)return this;var s=t(i),a=e(i);return this._t(s,0,a,0,0,1,0,0,-a,0,s,0,0,0,0,1)}function l(i){if(0===i)return this;var s=t(i),a=e(i);return this._t(s,-a,0,0,a,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e){return this._t(1,e,t,1,0,0)}function f(t,e){return this.shear(i(t),i(e))}function d(s,a){var r=t(a),n=e(a);return this._t(r,n,0,0,-n,r,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,i(s),1,0,0,0,0,1,0,0,0,0,1)._t(r,-n,0,0,n,r,0,0,0,0,1,0,0,0,0,1)}function m(t,e,i){return i||0===i||(i=1),1===t&&1===e&&1===i?this:this._t(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1)}function c(t,e,i,s,a,r,n,o,h,l,p,f,d,m,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=i,this.props[3]=s,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=f,this.props[12]=d,this.props[13]=m,this.props[14]=c,this.props[15]=u,this}function u(t,e,i){return i=i||0,0!==t||0!==e||0!==i?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,i,1):this}function g(t,e,i,s,a,r,n,o,h,l,p,f,d,m,c,u){var g=this.props;if(1===t&&0===e&&0===i&&0===s&&0===a&&1===r&&0===n&&0===o&&0===h&&0===l&&1===p&&0===f)return g[12]=g[12]*t+g[15]*d,g[13]=g[13]*r+g[15]*m,g[14]=g[14]*p+g[15]*c,g[15]*=u,this._identityCalculated=!1,this;var y=g[0],v=g[1],b=g[2],_=g[3],k=g[4],P=g[5],A=g[6],S=g[7],x=g[8],w=g[9],D=g[10],C=g[11],M=g[12],T=g[13],F=g[14],E=g[15];return g[0]=y*t+v*a+b*h+_*d,g[1]=y*e+v*r+b*l+_*m,g[2]=y*i+v*n+b*p+_*c,g[3]=y*s+v*o+b*f+_*u,g[4]=k*t+P*a+A*h+S*d,g[5]=k*e+P*r+A*l+S*m,g[6]=k*i+P*n+A*p+S*c,g[7]=k*s+P*o+A*f+S*u,g[8]=x*t+w*a+D*h+C*d,g[9]=x*e+w*r+D*l+C*m,g[10]=x*i+w*n+D*p+C*c,g[11]=x*s+w*o+D*f+C*u,g[12]=M*t+T*a+F*h+E*d,g[13]=M*e+T*r+F*l+E*m,g[14]=M*i+T*n+F*p+E*c,g[15]=M*s+T*o+F*f+E*u,this._identityCalculated=!1,this}function y(t){var e=t.props;return this.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}function v(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function b(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function _(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e];return t}function k(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function P(t,e,i){return{x:t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]}}function A(t,e,i){return t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12]}function S(t,e,i){return t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13]}function x(t,e,i){return t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]}function w(){var t=this.props[0]*this.props[5]-this.props[1]*this.props[4],e=this.props[5]/t,i=-this.props[1]/t,s=-this.props[4]/t,a=this.props[0]/t,r=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/t,n=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/t,o=new Ft;return o.props[0]=e,o.props[1]=i,o.props[4]=s,o.props[5]=a,o.props[12]=r,o.props[13]=n,o}function D(t){return this.getInverseMatrix().applyToPointArray(t[0],t[1],t[2]||0)}function C(t){var e,i=t.length,s=[];for(e=0;e<i;e+=1)s[e]=D(t[e]);return s}function M(t,e,i){var s=h("float32",6);if(this.isIdentity())s[0]=t[0],s[1]=t[1],s[2]=e[0],s[3]=e[1],s[4]=i[0],s[5]=i[1];else{var a=this.props[0],r=this.props[1],n=this.props[4],o=this.props[5],l=this.props[12],p=this.props[13];s[0]=t[0]*a+t[1]*n+l,s[1]=t[0]*r+t[1]*o+p,s[2]=e[0]*a+e[1]*n+l,s[3]=e[0]*r+e[1]*o+p,s[4]=i[0]*a+i[1]*n+l,s[5]=i[0]*r+i[1]*o+p}return s}function T(t,e,i){return this.isIdentity()?[t,e,i]:[t*this.props[0]+e*this.props[4]+i*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+i*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+i*this.props[10]+this.props[14]]}function F(t,e){if(this.isIdentity())return t+","+e;var i=this.props;return Math.round(100*(t*i[0]+e*i[4]+i[12]))/100+","+Math.round(100*(t*i[1]+e*i[5]+i[13]))/100}function E(){for(var t=0,e=this.props,i="matrix3d(";t<16;)i+=s(1e4*e[t])/1e4,i+=15===t?")":",",t+=1;return i}function I(t){return t<1e-6&&t>0||t>-1e-6&&t<0?s(1e4*t)/1e4:t}function L(){var t=this.props;return"matrix("+I(t[0])+","+I(t[1])+","+I(t[4])+","+I(t[5])+","+I(t[12])+","+I(t[13])+")"}return function(){this.reset=a,this.rotate=r,this.rotateX=n,this.rotateY=o,this.rotateZ=l,this.skew=f,this.skewFromAxis=d,this.shear=p,this.scale=m,this.setTransform=c,this.translate=u,this.transform=g,this.multiply=y,this.applyToPoint=P,this.applyToX=A,this.applyToY=S,this.applyToZ=x,this.applyToPointArray=T,this.applyToTriplePoints=M,this.applyToPointStringified=F,this.toCSS=E,this.to2dCSS=L,this.clone=_,this.cloneFromProps=k,this.equals=b,this.inversePoints=C,this.inversePoint=D,this.getInverseMatrix=w,this._t=this.transform,this.isIdentity=v,this._identity=!0,this._identityCalculated=!1,this.props=h("float32",16),this.reset()}}();function Et(t){return Et="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Et(t)}var It={};function Lt(){$.searchAnimations()}It.play=$.play,It.pause=$.pause,It.setLocationHref=function(e){t=e},It.togglePause=$.togglePause,It.setSpeed=$.setSpeed,It.setDirection=$.setDirection,It.stop=$.stop,It.searchAnimations=Lt,It.registerAnimation=$.registerAnimation,It.loadAnimation=function(t){return $.loadAnimation(t)},It.setSubframeRendering=function(t){!function(t){f=!!t}(t)},It.resize=$.resize,It.goToAndStop=$.goToAndStop,It.destroy=$.destroy,It.setQuality=function(t){if("string"==typeof t)switch(t){case"high":q(200);break;default:case"medium":q(50);break;case"low":q(10)}else!isNaN(t)&&t>1&&q(t);j()>=50?S(!1):S(!0)},It.inBrowser=function(){return"undefined"!=typeof navigator},It.installPlugin=function(t,e){"expressions"===t&&(d=e)},It.freeze=$.freeze,It.unfreeze=$.unfreeze,It.setVolume=$.setVolume,It.mute=$.mute,It.unmute=$.unmute,It.getRegisteredAnimations=$.getRegisteredAnimations,It.useWebWorker=function(t){e=!!t},It.setIDPrefix=function(t){c=t},It.__getFactory=function(t){switch(t){case"propertyFactory":return vt;case"shapePropertyFactory":return Tt;case"matrix":return Ft;default:return null}},It.version="5.12.2";var Vt="",Rt=document.getElementsByTagName("script"),zt=Rt[Rt.length-1]||{src:""};Vt=zt.src?zt.src.replace(/^[^\?]+\??/,""):"",function(t){for(var e=Vt.split("&"),i=0;i<e.length;i+=1){var s=e[i].split("=");if(decodeURIComponent(s[0])==t)return decodeURIComponent(s[1])}}("renderer");var Ot=setInterval((function(){"complete"===document.readyState&&(clearInterval(Ot),Lt())}),100);try{"object"===("undefined"==typeof exports?"undefined":Et(exports))&&"undefined"!=typeof module||"function"==typeof define&&define.amd||(window.bodymovin=It)}catch(t){}var Nt=function(){var t={},e={};return t.registerModifier=function(t,i){e[t]||(e[t]=i)},t.getModifier=function(t,i,s){return new e[t](i,s)},t}();function Bt(){}function qt(){}function jt(){}Bt.prototype.initModifierProperties=function(){},Bt.prototype.addShapeToModifier=function(){},Bt.prototype.addShape=function(t){if(!this.closed){t.sh.container.addDynamicProperty(t.sh);var e={shape:t.sh,data:t,localShapeCollection:Mt.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},Bt.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=i,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},Bt.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},r([bt],Bt),r([Bt],qt),qt.prototype.initModifierProperties=function(t,e){this.s=vt.getProp(t,e.s,0,.01,this),this.e=vt.getProp(t,e.e,0,.01,this),this.o=vt.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},qt.prototype.addShapeToModifier=function(t){t.pathsData=[]},qt.prototype.calculateShapeEdges=function(t,e,i,s,a){var r=[];e<=1?r.push({s:t,e:e}):t>=1?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,o,h=[],l=r.length;for(n=0;n<l;n+=1){var p,f;if(!((o=r[n]).e*a<s||o.s*a>s+i))p=o.s*a<=s?0:(o.s*a-s)/i,f=o.e*a>=s+i?1:(o.e*a-s)/i,h.push([p,f])}return h.length||h.push([0,0]),h},qt.prototype.releasePathsData=function(t){var e,i=t.length;for(e=0;e<i;e+=1)at.release(t[e]);return t.length=0,t},qt.prototype.processShapes=function(t){var e,i,s,a;if(this._mdf||t){var r=this.o.v%360/360;if(r<0&&(r+=1),(e=this.s.v>1?1+r:this.s.v<0?0+r:this.s.v+r)>(i=this.e.v>1?1+r:this.e.v<0?0+r:this.e.v+r)){var n=e;e=i,i=n}e=1e-4*Math.round(1e4*e),i=1e-4*Math.round(1e4*i),this.sValue=e,this.eValue=i}else e=this.sValue,i=this.eValue;var o,h,l,p,f,d=this.shapes.length,m=0;if(i===e)for(a=0;a<d;a+=1)this.shapes[a].localShapeCollection.releaseShapes(),this.shapes[a].shape._mdf=!0,this.shapes[a].shape.paths=this.shapes[a].localShapeCollection,this._mdf&&(this.shapes[a].pathsData.length=0);else if(1===i&&0===e||0===i&&1===e){if(this._mdf)for(a=0;a<d;a+=1)this.shapes[a].pathsData.length=0,this.shapes[a].shape._mdf=!0}else{var c,u,g=[];for(a=0;a<d;a+=1)if((c=this.shapes[a]).shape._mdf||this._mdf||t||2===this.m){if(h=(s=c.shape.paths)._length,f=0,!c.shape._mdf&&c.pathsData.length)f=c.totalShapeLength;else{for(l=this.releasePathsData(c.pathsData),o=0;o<h;o+=1)p=rt.getSegmentsLength(s.shapes[o]),l.push(p),f+=p.totalLength;c.totalShapeLength=f,c.pathsData=l}m+=f,c.shape._mdf=!0}else c.shape.paths=c.localShapeCollection;var y,v=e,b=i,_=0;for(a=d-1;a>=0;a-=1)if((c=this.shapes[a]).shape._mdf){for((u=c.localShapeCollection).releaseShapes(),2===this.m&&d>1?(y=this.calculateShapeEdges(e,i,c.totalShapeLength,_,m),_+=c.totalShapeLength):y=[[v,b]],h=y.length,o=0;o<h;o+=1){v=y[o][0],b=y[o][1],g.length=0,b<=1?g.push({s:c.totalShapeLength*v,e:c.totalShapeLength*b}):v>=1?g.push({s:c.totalShapeLength*(v-1),e:c.totalShapeLength*(b-1)}):(g.push({s:c.totalShapeLength*v,e:c.totalShapeLength}),g.push({s:0,e:c.totalShapeLength*(b-1)}));var k=this.addShapes(c,g[0]);if(g[0].s!==g[0].e){if(g.length>1)if(c.shape.paths.shapes[c.shape.paths._length-1].c){var P=k.pop();this.addPaths(k,u),k=this.addShapes(c,g[1],P)}else this.addPaths(k,u),k=this.addShapes(c,g[1]);this.addPaths(k,u)}}c.shape.paths=u}}},qt.prototype.addPaths=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)e.addShape(t[i])},qt.prototype.addSegment=function(t,e,i,s,a,r,n){a.setXYAt(e[0],e[1],"o",r),a.setXYAt(i[0],i[1],"i",r+1),n&&a.setXYAt(t[0],t[1],"v",r),a.setXYAt(s[0],s[1],"v",r+1)},qt.prototype.addSegmentFromArray=function(t,e,i,s){e.setXYAt(t[1],t[5],"o",i),e.setXYAt(t[2],t[6],"i",i+1),s&&e.setXYAt(t[0],t[4],"v",i),e.setXYAt(t[3],t[7],"v",i+1)},qt.prototype.addShapes=function(t,e,i){var s,a,r,n,o,h,l,p,f=t.pathsData,d=t.shape.paths.shapes,m=t.shape.paths._length,c=0,u=[],g=!0;for(i?(o=i._length,p=i._length):(i=At.newElement(),o=0,p=0),u.push(i),s=0;s<m;s+=1){for(h=f[s].lengths,i.c=d[s].c,r=d[s].c?h.length:h.length+1,a=1;a<r;a+=1)if(c+(n=h[a-1]).addedLength<e.s)c+=n.addedLength,i.c=!1;else{if(c>e.e){i.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(d[s].v[a-1],d[s].o[a-1],d[s].i[a],d[s].v[a],i,o,g),g=!1):(l=rt.getNewSegment(d[s].v[a-1],d[s].v[a],d[s].o[a-1],d[s].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,h[a-1]),this.addSegmentFromArray(l,i,o,g),g=!1,i.c=!1),c+=n.addedLength,o+=1}if(d[s].c&&h.length){if(n=h[a-1],c<=e.e){var y=h[a-1].addedLength;e.s<=c&&e.e>=c+y?(this.addSegment(d[s].v[a-1],d[s].o[a-1],d[s].i[0],d[s].v[0],i,o,g),g=!1):(l=rt.getNewSegment(d[s].v[a-1],d[s].v[0],d[s].o[a-1],d[s].i[0],(e.s-c)/y,(e.e-c)/y,h[a-1]),this.addSegmentFromArray(l,i,o,g),g=!1,i.c=!1)}else i.c=!1;c+=n.addedLength,o+=1}if(i._length&&(i.setXYAt(i.v[p][0],i.v[p][1],"i",p),i.setXYAt(i.v[i._length-1][0],i.v[i._length-1][1],"o",i._length-1)),c>e.e)break;s<m-1&&(i=At.newElement(),g=!0,u.push(i),o=0)}return u},r([Bt],jt),jt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amount=vt.getProp(t,e.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},jt.prototype.processPath=function(t,e){var i=e/100,s=[0,0],a=t._length,r=0;for(r=0;r<a;r+=1)s[0]+=t.v[r][0],s[1]+=t.v[r][1];s[0]/=a,s[1]/=a;var n,o,h,l,p,f,d=At.newElement();for(d.c=t.c,r=0;r<a;r+=1)n=t.v[r][0]+(s[0]-t.v[r][0])*i,o=t.v[r][1]+(s[1]-t.v[r][1])*i,h=t.o[r][0]+(s[0]-t.o[r][0])*-i,l=t.o[r][1]+(s[1]-t.o[r][1])*-i,p=t.i[r][0]+(s[0]-t.i[r][0])*-i,f=t.i[r][1]+(s[1]-t.i[r][1])*-i,d.setTripleAt(n,o,h,l,p,f,r);return d},jt.prototype.processShapes=function(t){var e,i,s,a,r,n,o=this.shapes.length,h=this.amount.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(r=this.shapes[i]).localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,s=0;s<a;s+=1)n.addShape(this.processPath(e[s],h));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)};var Wt=function(){var t=[0,0];function e(t,e,i){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new Ft,this.pre=new Ft,this.appliedTransformations=0,this.initDynamicPropertyContainer(i||t),e.p&&e.p.s?(this.px=vt.getProp(t,e.p.x,0,0,this),this.py=vt.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=vt.getProp(t,e.p.z,0,0,this))):this.p=vt.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=vt.getProp(t,e.rx,0,P,this),this.ry=vt.getProp(t,e.ry,0,P,this),this.rz=vt.getProp(t,e.rz,0,P,this),e.or.k[0].ti){var s,a=e.or.k.length;for(s=0;s<a;s+=1)e.or.k[s].to=null,e.or.k[s].ti=null}this.or=vt.getProp(t,e.or,1,P,this),this.or.sh=!0}else this.r=vt.getProp(t,e.r||{k:0},0,P,this);e.sk&&(this.sk=vt.getProp(t,e.sk,0,P,this),this.sa=vt.getProp(t,e.sa,0,P,this)),this.a=vt.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=vt.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=vt.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}return e.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(e){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||e){var i;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var s,a;if(i=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),a=this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),a=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/i,0)):(s=this.p.pv,a=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){s=[],a=[];var r=this.px,n=this.py;r._caching.lastFrame+r.offsetTime<=r.keyframes[0].t?(s[0]=r.getValueAtTime((r.keyframes[0].t+.01)/i,0),s[1]=n.getValueAtTime((n.keyframes[0].t+.01)/i,0),a[0]=r.getValueAtTime(r.keyframes[0].t/i,0),a[1]=n.getValueAtTime(n.keyframes[0].t/i,0)):r._caching.lastFrame+r.offsetTime>=r.keyframes[r.keyframes.length-1].t?(s[0]=r.getValueAtTime(r.keyframes[r.keyframes.length-1].t/i,0),s[1]=n.getValueAtTime(n.keyframes[n.keyframes.length-1].t/i,0),a[0]=r.getValueAtTime((r.keyframes[r.keyframes.length-1].t-.01)/i,0),a[1]=n.getValueAtTime((n.keyframes[n.keyframes.length-1].t-.01)/i,0)):(s=[r.pv,n.pv],a[0]=r.getValueAtTime((r._caching.lastFrame+r.offsetTime-.01)/i,r.offsetTime),a[1]=n.getValueAtTime((n._caching.lastFrame+n.offsetTime-.01)/i,n.offsetTime))}else s=a=t;this.v.rotate(-Math.atan2(s[1]-a[1],s[0]-a[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(this.appliedTransformations=0,this.pre.reset(),!this.a.effectsSequence.length&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},r([bt],e),e.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},e.prototype._addDynamicProperty=bt.prototype.addDynamicProperty,{getTransformProperty:function(t,i,s){return new e(t,i,s)}}}();function Xt(){}function Ht(){}function Yt(t,e){return 1e5*Math.abs(t-e)<=Math.min(Math.abs(t),Math.abs(e))}function Gt(t){return Math.abs(t)<=1e-5}function Kt(t,e,i){return t*(1-i)+e*i}function Jt(t,e,i){return[Kt(t[0],e[0],i),Kt(t[1],e[1],i)]}function Ut(t,e,i,s){return[3*e-t-3*i+s,3*t-6*e+3*i,-3*t+3*e,t]}function Zt(t){return new Qt(t,t,t,t,!1)}function Qt(t,e,i,s,a){a&&oe(t,e)&&(e=Jt(t,s,1/3)),a&&oe(i,s)&&(i=Jt(t,s,2/3));var r=Ut(t[0],e[0],i[0],s[0]),n=Ut(t[1],e[1],i[1],s[1]);this.a=[r[0],n[0]],this.b=[r[1],n[1]],this.c=[r[2],n[2]],this.d=[r[3],n[3]],this.points=[t,e,i,s]}function $t(t,e){var i=t.points[0][e],s=t.points[t.points.length-1][e];if(i>s){var a=s;s=i,i=a}for(var r=function(t,e,i){if(0===t)return[];var s=e*e-4*t*i;if(s<0)return[];var a=-e/(2*t);if(0===s)return[a];var r=Math.sqrt(s)/(2*t);return[a-r,a+r]}(3*t.a[e],2*t.b[e],t.c[e]),n=0;n<r.length;n+=1)if(r[n]>0&&r[n]<1){var o=t.point(r[n])[e];o<i?i=o:o>s&&(s=o)}return{min:i,max:s}}function te(t,e,i){var s=t.boundingBox();return{cx:s.cx,cy:s.cy,width:s.width,height:s.height,bez:t,t:(e+i)/2,t1:e,t2:i}}function ee(t){var e=t.bez.split(.5);return[te(e[0],t.t1,t.t),te(e[1],t.t,t.t2)]}function ie(t,e,i,s,a,r){var n,o;if(n=t,o=e,2*Math.abs(n.cx-o.cx)<n.width+o.width&&2*Math.abs(n.cy-o.cy)<n.height+o.height)if(i>=r||t.width<=s&&t.height<=s&&e.width<=s&&e.height<=s)a.push([t.t,e.t]);else{var h=ee(t),l=ee(e);ie(h[0],l[0],i+1,s,a,r),ie(h[0],l[1],i+1,s,a,r),ie(h[1],l[0],i+1,s,a,r),ie(h[1],l[1],i+1,s,a,r)}}function se(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function ae(t,e,i,s){var a=[t[0],t[1],1],r=[e[0],e[1],1],n=[i[0],i[1],1],o=[s[0],s[1],1],h=se(se(a,r),se(n,o));return Gt(h[2])?null:[h[0]/h[2],h[1]/h[2]]}function re(t,e,i){return[t[0]+Math.cos(e)*i,t[1]-Math.sin(e)*i]}function ne(t,e){return Math.hypot(t[0]-e[0],t[1]-e[1])}function oe(t,e){return Yt(t[0],e[0])&&Yt(t[1],e[1])}function he(){}function le(t,e,i,s,a,r,n){var o=i-Math.PI/2,h=i+Math.PI/2,l=e[0]+Math.cos(i)*s*a,p=e[1]-Math.sin(i)*s*a;t.setTripleAt(l,p,l+Math.cos(o)*r,p-Math.sin(o)*r,l+Math.cos(h)*n,p-Math.sin(h)*n,t.length())}function pe(t,e){var i,s,a,r,n=0===e?t.length()-1:e-1,o=(e+1)%t.length(),h=t.v[n],l=t.v[o],p=(i=h,a=[(s=l)[0]-i[0],s[1]-i[1]],r=.5*-Math.PI,[Math.cos(r)*a[0]-Math.sin(r)*a[1],Math.sin(r)*a[0]+Math.cos(r)*a[1]]);return Math.atan2(0,1)-Math.atan2(p[1],p[0])}function fe(t,e,i,s,a,r,n){var o=pe(e,i),h=e.v[i%e._length],l=e.v[0===i?e._length-1:i-1],p=e.v[(i+1)%e._length],f=2===r?Math.sqrt(Math.pow(h[0]-l[0],2)+Math.pow(h[1]-l[1],2)):0,d=2===r?Math.sqrt(Math.pow(h[0]-p[0],2)+Math.pow(h[1]-p[1],2)):0;le(t,e.v[i%e._length],o,n,s,d/(2*(a+1)),f/(2*(a+1)))}function de(t,e,i,s,a,r){for(var n=0;n<s;n+=1){var o=(n+1)/(s+1),h=2===a?Math.sqrt(Math.pow(e.points[3][0]-e.points[0][0],2)+Math.pow(e.points[3][1]-e.points[0][1],2)):0,l=e.normalAngle(o);le(t,e.point(o),l,r,i,h/(2*(s+1)),h/(2*(s+1))),r=-r}return r}function me(t,e,i){var s=Math.atan2(e[0]-t[0],e[1]-t[1]);return[re(t,s,i),re(e,s,i)]}function ce(t,e){var i,s,a,r,n,o,h;i=(h=me(t.points[0],t.points[1],e))[0],s=h[1],a=(h=me(t.points[1],t.points[2],e))[0],r=h[1],n=(h=me(t.points[2],t.points[3],e))[0],o=h[1];var l=ae(i,s,a,r);null===l&&(l=s);var p=ae(n,o,a,r);return null===p&&(p=n),new Qt(i,l,p,o)}function ue(t,e,i,s,a){var r=e.points[3],n=i.points[0];if(3===s)return r;if(oe(r,n))return r;if(2===s){var o=-e.tangentAngle(1),h=-i.tangentAngle(0)+Math.PI,l=ae(r,re(r,o+Math.PI/2,100),n,re(n,o+Math.PI/2,100)),p=l?ne(l,r):ne(r,n)/2,f=re(r,o,2*p*A);return t.setXYAt(f[0],f[1],"o",t.length()-1),f=re(n,h,2*p*A),t.setTripleAt(n[0],n[1],n[0],n[1],f[0],f[1],t.length()),n}var d=ae(oe(r,e.points[2])?e.points[0]:e.points[2],r,n,oe(n,i.points[1])?i.points[3]:i.points[1]);return d&&ne(d,r)<a?(t.setTripleAt(d[0],d[1],d[0],d[1],d[0],d[1],t.length()),d):r}function ge(t,e){var i=t.intersections(e);return i.length&&Yt(i[0][0],1)&&i.shift(),i.length?i[0]:null}function ye(t,e){var i=t.slice(),s=e.slice(),a=ge(t[t.length-1],e[0]);return a&&(i[t.length-1]=t[t.length-1].split(a[0])[0],s[0]=e[0].split(a[1])[1]),t.length>1&&e.length>1&&(a=ge(t[0],e[e.length-1]))?[[t[0].split(a[0])[0]],[e[e.length-1].split(a[1])[1]]]:[i,s]}function ve(t,e){var i,s,a,r,n=t.inflectionPoints();if(0===n.length)return[ce(t,e)];if(1===n.length||Yt(n[1],1))return i=(a=t.split(n[0]))[0],s=a[1],[ce(i,e),ce(s,e)];i=(a=t.split(n[0]))[0];var o=(n[1]-n[0])/(1-n[0]);return r=(a=a[1].split(o))[0],s=a[1],[ce(i,e),ce(r,e),ce(s,e)]}function be(){}function _e(t){for(var e=t.fStyle?t.fStyle.split(" "):[],i="normal",s="normal",a=e.length,r=0;r<a;r+=1)switch(e[r].toLowerCase()){case"italic":s="italic";break;case"bold":i="700";break;case"black":i="900";break;case"medium":i="500";break;case"regular":case"normal":i="400";break;case"light":case"thin":i="200"}return{style:s,weight:t.fWeight||i}}r([Bt],Xt),Xt.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=vt.getProp(t,e.c,0,null,this),this.o=vt.getProp(t,e.o,0,null,this),this.tr=Wt.getTransformProperty(t,e.tr,this),this.so=vt.getProp(t,e.tr.so,0,.01,this),this.eo=vt.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Ft,this.rMatrix=new Ft,this.sMatrix=new Ft,this.tMatrix=new Ft,this.matrix=new Ft},Xt.prototype.applyTransforms=function(t,e,i,s,a,r){var n=r?-1:1,o=s.s.v[0]+(1-s.s.v[0])*(1-a),h=s.s.v[1]+(1-s.s.v[1])*(1-a);t.translate(s.p.v[0]*n*a,s.p.v[1]*n*a,s.p.v[2]),e.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),e.rotate(-s.r.v*n*a),e.translate(s.a.v[0],s.a.v[1],s.a.v[2]),i.translate(-s.a.v[0],-s.a.v[1],s.a.v[2]),i.scale(r?1/o:o,r?1/h:h),i.translate(s.a.v[0],s.a.v[1],s.a.v[2])},Xt.prototype.init=function(t,e,i,s){for(this.elem=t,this.arr=e,this.pos=i,this.elemsData=s,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[i]);i>0;)i-=1,this._elements.unshift(e[i]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},Xt.prototype.resetElements=function(t){var e,i=t.length;for(e=0;e<i;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},Xt.prototype.cloneElements=function(t){var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},Xt.prototype.changeGroupRender=function(t,e){var i,s=t.length;for(i=0;i<s;i+=1)t[i]._render=e,"gr"===t[i].ty&&this.changeGroupRender(t[i].it,e)},Xt.prototype.processShapes=function(t){var e,i,s,a,r,n=!1;if(this._mdf||t){var o,h=Math.ceil(this.c.v);if(this._groups.length<h){for(;this._groups.length<h;){var l={it:this.cloneElements(this._elements),ty:"gr"};l.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,l),this._groups.splice(0,0,l),this._currentCopies+=1}this.elem.reloadShapes(),n=!0}for(r=0,s=0;s<=this._groups.length-1;s+=1){if(o=r<h,this._groups[s]._render=o,this.changeGroupRender(this._groups[s].it,o),!o){var p=this.elemsData[s].it,f=p[p.length-1];0!==f.transform.op.v?(f.transform.op._mdf=!0,f.transform.op.v=0):f.transform.op._mdf=!1}r+=1}this._currentCopies=h;var d=this.o.v,m=d%1,c=d>0?Math.floor(d):Math.ceil(d),u=this.pMatrix.props,g=this.rMatrix.props,y=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var v,b,_=0;if(d>0){for(;_<c;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),_+=1;m&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,m,!1),_+=m)}else if(d<0){for(;_>c;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),_-=1;m&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-m,!0),_-=m)}for(s=1===this.data.m?0:this._currentCopies-1,a=1===this.data.m?1:-1,r=this._currentCopies;r;){if(b=(i=(e=this.elemsData[s].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=1===this._currentCopies?this.so.v:this.so.v+(this.eo.v-this.so.v)*(s/(this._currentCopies-1)),0!==_){for((0!==s&&1===a||s!==this._currentCopies-1&&-1===a)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(g[0],g[1],g[2],g[3],g[4],g[5],g[6],g[7],g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]),this.matrix.transform(y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15]),this.matrix.transform(u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15]),v=0;v<b;v+=1)i[v]=this.matrix.props[v];this.matrix.reset()}else for(this.matrix.reset(),v=0;v<b;v+=1)i[v]=this.matrix.props[v];_+=1,r-=1,s+=a}}else for(r=this._currentCopies,s=0,a=1;r;)i=(e=this.elemsData[s].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,r-=1,s+=a;return n},Xt.prototype.addShape=function(){},r([Bt],Ht),Ht.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=vt.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},Ht.prototype.processPath=function(t,e){var i,s=At.newElement();s.c=t.c;var a,r,n,o,h,l,p,f,d,m,c,u,g=t._length,y=0;for(i=0;i<g;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(o=0===i?t.v[g-1]:t.v[i-1],l=(h=Math.sqrt(Math.pow(a[0]-o[0],2)+Math.pow(a[1]-o[1],2)))?Math.min(h/2,e)/h:0,p=c=a[0]+(o[0]-a[0])*l,f=u=a[1]-(a[1]-o[1])*l,d=p-(p-a[0])*A,m=f-(f-a[1])*A,s.setTripleAt(p,f,d,m,c,u,y),y+=1,o=i===g-1?t.v[0]:t.v[i+1],l=(h=Math.sqrt(Math.pow(a[0]-o[0],2)+Math.pow(a[1]-o[1],2)))?Math.min(h/2,e)/h:0,p=d=a[0]+(o[0]-a[0])*l,f=m=a[1]+(o[1]-a[1])*l,c=p-(p-a[0])*A,u=f-(f-a[1])*A,s.setTripleAt(p,f,d,m,c,u,y),y+=1):(s.setTripleAt(a[0],a[1],n[0],n[1],r[0],r[1],y),y+=1):(s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],y),y+=1);return s},Ht.prototype.processShapes=function(t){var e,i,s,a,r,n,o=this.shapes.length,h=this.rd.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(r=this.shapes[i]).localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,s=0;s<a;s+=1)n.addShape(this.processPath(e[s],h));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},Qt.prototype.point=function(t){return[((this.a[0]*t+this.b[0])*t+this.c[0])*t+this.d[0],((this.a[1]*t+this.b[1])*t+this.c[1])*t+this.d[1]]},Qt.prototype.derivative=function(t){return[(3*t*this.a[0]+2*this.b[0])*t+this.c[0],(3*t*this.a[1]+2*this.b[1])*t+this.c[1]]},Qt.prototype.tangentAngle=function(t){var e=this.derivative(t);return Math.atan2(e[1],e[0])},Qt.prototype.normalAngle=function(t){var e=this.derivative(t);return Math.atan2(e[0],e[1])},Qt.prototype.inflectionPoints=function(){var t=this.a[1]*this.b[0]-this.a[0]*this.b[1];if(Gt(t))return[];var e=-.5*(this.a[1]*this.c[0]-this.a[0]*this.c[1])/t,i=e*e-1/3*(this.b[1]*this.c[0]-this.b[0]*this.c[1])/t;if(i<0)return[];var s=Math.sqrt(i);return Gt(s)?s>0&&s<1?[e]:[]:[e-s,e+s].filter((function(t){return t>0&&t<1}))},Qt.prototype.split=function(t){if(t<=0)return[Zt(this.points[0]),this];if(t>=1)return[this,Zt(this.points[this.points.length-1])];var e=Jt(this.points[0],this.points[1],t),i=Jt(this.points[1],this.points[2],t),s=Jt(this.points[2],this.points[3],t),a=Jt(e,i,t),r=Jt(i,s,t),n=Jt(a,r,t);return[new Qt(this.points[0],e,a,n,!0),new Qt(n,r,s,this.points[3],!0)]},Qt.prototype.bounds=function(){return{x:$t(this,0),y:$t(this,1)}},Qt.prototype.boundingBox=function(){var t=this.bounds();return{left:t.x.min,right:t.x.max,top:t.y.min,bottom:t.y.max,width:t.x.max-t.x.min,height:t.y.max-t.y.min,cx:(t.x.max+t.x.min)/2,cy:(t.y.max+t.y.min)/2}},Qt.prototype.intersections=function(t,e,i){void 0===e&&(e=2),void 0===i&&(i=7);var s=[];return ie(te(this,0,1),te(t,0,1),0,e,s,i),s},Qt.shapeSegment=function(t,e){var i=(e+1)%t.length();return new Qt(t.v[e],t.o[e],t.i[i],t.v[i],!0)},Qt.shapeSegmentInverted=function(t,e){var i=(e+1)%t.length();return new Qt(t.v[i],t.i[i],t.o[e],t.v[e],!0)},r([Bt],he),he.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amplitude=vt.getProp(t,e.s,0,null,this),this.frequency=vt.getProp(t,e.r,0,null,this),this.pointsType=vt.getProp(t,e.pt,0,null,this),this._isAnimated=0!==this.amplitude.effectsSequence.length||0!==this.frequency.effectsSequence.length||0!==this.pointsType.effectsSequence.length},he.prototype.processPath=function(t,e,i,s){var a=t._length,r=At.newElement();if(r.c=t.c,t.c||(a-=1),0===a)return r;var n=-1,o=Qt.shapeSegment(t,0);fe(r,t,0,e,i,s,n);for(var h=0;h<a;h+=1)n=de(r,o,e,i,s,-n),o=h!==a-1||t.c?Qt.shapeSegment(t,(h+1)%a):null,fe(r,t,h+1,e,i,s,n);return r},he.prototype.processShapes=function(t){var e,i,s,a,r,n,o=this.shapes.length,h=this.amplitude.v,l=Math.max(0,Math.round(this.frequency.v)),p=this.pointsType.v;if(0!==h)for(i=0;i<o;i+=1){if(n=(r=this.shapes[i]).localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,s=0;s<a;s+=1)n.addShape(this.processPath(e[s],h,l,p));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},r([Bt],be),be.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amount=vt.getProp(t,e.a,0,null,this),this.miterLimit=vt.getProp(t,e.ml,0,null,this),this.lineJoin=e.lj,this._isAnimated=0!==this.amount.effectsSequence.length},be.prototype.processPath=function(t,e,i,s){var a=At.newElement();a.c=t.c;var r,n,o,h=t.length();t.c||(h-=1);var l=[];for(r=0;r<h;r+=1)o=Qt.shapeSegment(t,r),l.push(ve(o,e));if(!t.c)for(r=h-1;r>=0;r-=1)o=Qt.shapeSegmentInverted(t,r),l.push(ve(o,e));l=function(t){for(var e,i=1;i<t.length;i+=1)e=ye(t[i-1],t[i]),t[i-1]=e[0],t[i]=e[1];return t.length>1&&(e=ye(t[t.length-1],t[0]),t[t.length-1]=e[0],t[0]=e[1]),t}(l);var p=null,f=null;for(r=0;r<l.length;r+=1){var d=l[r];for(f&&(p=ue(a,f,d[0],i,s)),f=d[d.length-1],n=0;n<d.length;n+=1)o=d[n],p&&oe(o.points[0],p)?a.setXYAt(o.points[1][0],o.points[1][1],"o",a.length()-1):a.setTripleAt(o.points[0][0],o.points[0][1],o.points[1][0],o.points[1][1],o.points[0][0],o.points[0][1],a.length()),a.setTripleAt(o.points[3][0],o.points[3][1],o.points[3][0],o.points[3][1],o.points[2][0],o.points[2][1],a.length()),p=o.points[3]}return l.length&&ue(a,f,l[0][0],i,s),a},be.prototype.processShapes=function(t){var e,i,s,a,r,n,o=this.shapes.length,h=this.amount.v,l=this.miterLimit.v,p=this.lineJoin;if(0!==h)for(i=0;i<o;i+=1){if(n=(r=this.shapes[i]).localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,s=0;s<a;s+=1)n.addShape(this.processPath(e[s],h,p,l));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)};var ke=function(){var t={w:0,size:0,shapes:[],data:{shapes:[]}},e=[];e=e.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var i=127988,s=["d83cdffb","d83cdffc","d83cdffd","d83cdffe","d83cdfff"];function r(t,e){var i=a("span");i.setAttribute("aria-hidden",!0),i.style.fontFamily=e;var s=a("span");s.innerText="giItT1WQy@!-/#",i.style.position="absolute",i.style.left="-10000px",i.style.top="-10000px",i.style.fontSize="300px",i.style.fontVariant="normal",i.style.fontStyle="normal",i.style.fontWeight="normal",i.style.letterSpacing="0",i.appendChild(s),document.body.appendChild(i);var r=s.offsetWidth;return s.style.fontFamily=function(t){var e,i=t.split(","),s=i.length,a=[];for(e=0;e<s;e+=1)"sans-serif"!==i[e]&&"monospace"!==i[e]&&a.push(i[e]);return a.join(",")}(t)+", "+e,{node:s,w:r,parent:i}}function n(t,e){var i,s=document.body&&e?"svg":"canvas",a=_e(t);if("svg"===s){var r=W("text");r.style.fontSize="100px",r.setAttribute("font-family",t.fFamily),r.setAttribute("font-style",a.style),r.setAttribute("font-weight",a.weight),r.textContent="1",t.fClass?(r.style.fontFamily="inherit",r.setAttribute("class",t.fClass)):r.style.fontFamily=t.fFamily,e.appendChild(r),i=r}else{var n=new OffscreenCanvas(500,500).getContext("2d");n.font=a.style+" "+a.weight+" 100px "+t.fFamily,i=n}return{measureText:function(t){return"svg"===s?(i.textContent=t,i.getComputedTextLength()):i.measureText(t).width}}}function o(t){var e=0,i=t.charCodeAt(0);if(i>=55296&&i<=56319){var s=t.charCodeAt(1);s>=56320&&s<=57343&&(e=1024*(i-55296)+s-56320+65536)}return e}function h(t){var e=o(t);return e>=127462&&e<=127487}var l=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};l.isModifier=function(t,e){var i=t.toString(16)+e.toString(16);return-1!==s.indexOf(i)},l.isZeroWidthJoiner=function(t){return 8205===t},l.isFlagEmoji=function(t){return h(t.substr(0,2))&&h(t.substr(2,2))},l.isRegionalCode=h,l.isCombinedCharacter=function(t){return-1!==e.indexOf(t)},l.isRegionalFlag=function(t,e){var s=o(t.substr(e,2));if(s!==i)return!1;var a=0;for(e+=2;a<5;){if((s=o(t.substr(e,2)))<917601||s>917626)return!1;a+=1,e+=2}return 917631===o(t.substr(e,2))},l.isVariationSelector=function(t){return 65039===t},l.BLACK_FLAG_CODE_POINT=i;var p={addChars:function(t){if(t){var e;this.chars||(this.chars=[]);var i,s,a=t.length,r=this.chars.length;for(e=0;e<a;e+=1){for(i=0,s=!1;i<r;)this.chars[i].style===t[e].style&&this.chars[i].fFamily===t[e].fFamily&&this.chars[i].ch===t[e].ch&&(s=!0),i+=1;s||(this.chars.push(t[e]),r+=1)}}},addFonts:function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);if(!document.body)return this.isLoaded=!0,t.list.forEach((function(t){t.helper=n(t),t.cache={}})),void(this.fonts=t.list);var i,s=t.list,o=s.length,h=o;for(i=0;i<o;i+=1){var l,p,f=!0;if(s[i].loaded=!1,s[i].monoCase=r(s[i].fFamily,"monospace"),s[i].sansCase=r(s[i].fFamily,"sans-serif"),s[i].fPath){if("p"===s[i].fOrigin||3===s[i].origin){if((l=document.querySelectorAll('style[f-forigin="p"][f-family="'+s[i].fFamily+'"], style[f-origin="3"][f-family="'+s[i].fFamily+'"]')).length>0&&(f=!1),f){var d=a("style");d.setAttribute("f-forigin",s[i].fOrigin),d.setAttribute("f-origin",s[i].origin),d.setAttribute("f-family",s[i].fFamily),d.type="text/css",d.innerText="@font-face {font-family: "+s[i].fFamily+"; font-style: normal; src: url('"+s[i].fPath+"');}",e.appendChild(d)}}else if("g"===s[i].fOrigin||1===s[i].origin){for(l=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),p=0;p<l.length;p+=1)-1!==l[p].href.indexOf(s[i].fPath)&&(f=!1);if(f){var m=a("link");m.setAttribute("f-forigin",s[i].fOrigin),m.setAttribute("f-origin",s[i].origin),m.type="text/css",m.rel="stylesheet",m.href=s[i].fPath,document.body.appendChild(m)}}else if("t"===s[i].fOrigin||2===s[i].origin){for(l=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),p=0;p<l.length;p+=1)s[i].fPath===l[p].src&&(f=!1);if(f){var c=a("link");c.setAttribute("f-forigin",s[i].fOrigin),c.setAttribute("f-origin",s[i].origin),c.setAttribute("rel","stylesheet"),c.setAttribute("href",s[i].fPath),e.appendChild(c)}}}else s[i].loaded=!0,h-=1;s[i].helper=n(s[i],e),s[i].cache={},this.fonts.push(s[i])}0===h?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},getCharData:function(e,i,s){for(var a=0,r=this.chars.length;a<r;){if(this.chars[a].ch===e&&this.chars[a].style===i&&this.chars[a].fFamily===s)return this.chars[a];a+=1}return("string"==typeof e&&13!==e.charCodeAt(0)||!e)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",e,i,s)),t},getFontByName:function(t){for(var e=0,i=this.fonts.length;e<i;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},measureText:function(t,e,i){var s=this.getFontByName(e),a=t;if(!s.cache[a]){var r=s.helper;if(" "===t){var n=r.measureText("|"+t+"|"),o=r.measureText("||");s.cache[a]=(n-o)/100}else s.cache[a]=r.measureText(t)/100}return s.cache[a]*i},checkLoadedFonts:function(){var t,e,i,s=this.fonts.length,a=s;for(t=0;t<s;t+=1)this.fonts[t].loaded?a-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,e.offsetWidth!==i?(a-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,e.offsetWidth!==i&&(a-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==a&&Date.now()-this.initTime<5e3?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)},setIsLoaded:function(){this.isLoaded=!0}};return l.prototype=p,l}();function Pe(t){this.animationData=t}function Ae(){}Pe.prototype.getProp=function(t){return this.animationData.slots&&this.animationData.slots[t.sid]?Object.assign(t,this.animationData.slots[t.sid].p):t},Ae.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}};var Se,xe=(Se={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return Se[t]||""});function we(t,e,i){this.p=vt.getProp(e,t.v,0,0,i)}function De(t,e,i){this.p=vt.getProp(e,t.v,0,0,i)}function Ce(t,e,i){this.p=vt.getProp(e,t.v,1,0,i)}function Me(t,e,i){this.p=vt.getProp(e,t.v,1,0,i)}function Te(t,e,i){this.p=vt.getProp(e,t.v,0,0,i)}function Fe(t,e,i){this.p=vt.getProp(e,t.v,0,0,i)}function Ee(t,e,i){this.p=vt.getProp(e,t.v,0,0,i)}function Ie(){this.p={}}function Le(t,e){var i,s=t.ef||[];this.effectElements=[];var a,r=s.length;for(i=0;i<r;i+=1)a=new Ve(s[i],e),this.effectElements.push(a)}function Ve(t,e){this.init(t,e)}function Re(){}function ze(){}function Oe(t,e,i){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.footageData=e.imageLoader.getAsset(this.assetData),this.initBaseData(t,e,i)}function Ne(t,e,i){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.initBaseData(t,e,i),this._isPlaying=!1,this._canPlay=!1;var s=this.globalData.getAssetsPath(this.assetData);this.audio=this.globalData.audioController.createAudio(s),this._currentTime=0,this.globalData.audioController.addAudio(this),this._volumeMultiplier=1,this._volume=1,this._previousVolume=null,this.tm=t.tm?vt.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0},this.lv=vt.getProp(this,t.au&&t.au.lv?t.au.lv:{k:[100]},1,.01,this)}function Be(){}r([bt],Ve),Ve.prototype.getValue=Ve.prototype.iterateDynamicProperties,Ve.prototype.init=function(t,e){var i;this.data=t,this.effectElements=[],this.initDynamicPropertyContainer(e);var s,a=this.data.ef.length,r=this.data.ef;for(i=0;i<a;i+=1){switch(s=null,r[i].ty){case 0:s=new we(r[i],e,this);break;case 1:s=new De(r[i],e,this);break;case 2:s=new Ce(r[i],e,this);break;case 3:s=new Me(r[i],e,this);break;case 4:case 7:s=new Ee(r[i],e,this);break;case 10:s=new Te(r[i],e,this);break;case 11:s=new Fe(r[i],e,this);break;case 5:s=new Le(r[i],e,this);break;default:s=new Ie(r[i],e,this)}s&&this.effectElements.push(s)}},Re.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){var t=B();if(t){var e=t("layer"),i=t("effects"),s=t("shape"),a=t("text"),r=t("comp");this.layerInterface=e(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var n=i.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(n),0===this.data.ty||this.data.xt?this.compInterface=r(this):4===this.data.ty?(this.layerInterface.shapeInterface=s(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=a(this),this.layerInterface.text=this.layerInterface.textInterface)}},setBlendMode:function(){var t=xe(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,i){this.globalData=e,this.comp=i,this.data=t,this.layerId=I(),this.data.sr||(this.data.sr=1),this.effectsManager=new Le(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},ze.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var i,s=this.dynamicProperties.length;for(i=0;i<s;i+=1)(e||this._isParent&&"transform"===this.dynamicProperties[i].propType)&&(this.dynamicProperties[i].getValue(),this.dynamicProperties[i]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}},Oe.prototype.prepareFrame=function(){},r([Ae,Re,ze],Oe),Oe.prototype.getBaseElement=function(){return null},Oe.prototype.renderFrame=function(){},Oe.prototype.destroy=function(){},Oe.prototype.initExpressions=function(){var t=B();if(t){var e=t("footage");this.layerInterface=e(this)}},Oe.prototype.getFootageData=function(){return this.footageData},Ne.prototype.prepareFrame=function(t){if(this.prepareRenderableFrame(t,!0),this.prepareProperties(t,!0),this.tm._placeholder)this._currentTime=t/this.data.sr;else{var e=this.tm.v;this._currentTime=e}this._volume=this.lv.v[0];var i=this._volume*this._volumeMultiplier;this._previousVolume!==i&&(this._previousVolume=i,this.audio.volume(i))},r([Ae,Re,ze],Ne),Ne.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek())>.1)&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},Ne.prototype.show=function(){},Ne.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},Ne.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},Ne.prototype.resume=function(){this._canPlay=!0},Ne.prototype.setRate=function(t){this.audio.rate(t)},Ne.prototype.volume=function(t){this._volumeMultiplier=t,this._previousVolume=t*this._volume,this.audio.volume(this._previousVolume)},Ne.prototype.getBaseElement=function(){return null},Ne.prototype.destroy=function(){},Ne.prototype.sourceRectAtTime=function(){},Ne.prototype.initExpressions=function(){},Be.prototype.checkLayers=function(t){var e,i,s=this.layers.length;for(this.completeLayers=!0,e=s-1;e>=0;e-=1)this.elements[e]||(i=this.layers[e]).ip-i.st<=t-this.layers[e].st&&i.op-i.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},Be.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:default:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 6:return this.createAudio(t);case 13:return this.createCamera(t);case 15:return this.createFootage(t)}},Be.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},Be.prototype.createAudio=function(t){return new Ne(t,this.globalData,this)},Be.prototype.createFootage=function(t){return new Oe(t,this.globalData,this)},Be.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},Be.prototype.includeLayers=function(t){var e;this.completeLayers=!1;var i,s=t.length,a=this.layers.length;for(e=0;e<s;e+=1)for(i=0;i<a;){if(this.layers[i].id===t[e].id){this.layers[i]=t[e];break}i+=1}},Be.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},Be.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},Be.prototype.buildElementParenting=function(t,e,i){for(var s=this.elements,a=this.layers,r=0,n=a.length;r<n;)a[r].ind==e&&(s[r]&&!0!==s[r]?(i.push(s[r]),s[r].setAsParent(),void 0!==a[r].parent?this.buildElementParenting(t,a[r].parent,i):t.setHierarchy(i)):(this.buildItem(r),this.addPendingElement(t))),r+=1},Be.prototype.addPendingElement=function(t){this.pendingElements.push(t)},Be.prototype.searchExtraCompositions=function(t){var e,i=t.length;for(e=0;e<i;e+=1)if(t[e].xt){var s=this.createComp(t[e]);s.initExpressions(),this.globalData.projectInterface.registerComposition(s)}},Be.prototype.getElementById=function(t){var e,i=this.elements.length;for(e=0;e<i;e+=1)if(this.elements[e].data.ind===t)return this.elements[e];return null},Be.prototype.getElementByPath=function(t){var e,i=t.shift();if("number"==typeof i)e=this.elements[i];else{var s,a=this.elements.length;for(s=0;s<a;s+=1)if(this.elements[s].data.nm===i){e=this.elements[s];break}}return 0===t.length?e:e.getElementByPath(t)},Be.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new ke,this.globalData.slotManager=function(t){return new Pe(t)}(t),this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}};var qe="transformEFfect";function je(){}function We(t,e,i){this.data=t,this.element=e,this.globalData=i,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var a,r,n=this.globalData.defs,o=this.masksProperties?this.masksProperties.length:0;this.viewData=l(o),this.solidPath="";var h,p,f,d,m,c,u=this.masksProperties,g=0,y=[],v=I(),b="clipPath",_="clip-path";for(a=0;a<o;a+=1)if(("a"!==u[a].mode&&"n"!==u[a].mode||u[a].inv||100!==u[a].o.k||u[a].o.x)&&(b="mask",_="mask"),"s"!==u[a].mode&&"i"!==u[a].mode||0!==g?f=null:((f=W("rect")).setAttribute("fill","#ffffff"),f.setAttribute("width",this.element.comp.data.w||0),f.setAttribute("height",this.element.comp.data.h||0),y.push(f)),r=W("path"),"n"===u[a].mode)this.viewData[a]={op:vt.getProp(this.element,u[a].o,0,.01,this.element),prop:Tt.getShapeProp(this.element,u[a],3),elem:r,lastPath:""},n.appendChild(r);else{var k;if(g+=1,r.setAttribute("fill","s"===u[a].mode?"#000000":"#ffffff"),r.setAttribute("clip-rule","nonzero"),0!==u[a].x.k?(b="mask",_="mask",c=vt.getProp(this.element,u[a].x,0,null,this.element),k=I(),(d=W("filter")).setAttribute("id",k),(m=W("feMorphology")).setAttribute("operator","erode"),m.setAttribute("in","SourceGraphic"),m.setAttribute("radius","0"),d.appendChild(m),n.appendChild(d),r.setAttribute("stroke","s"===u[a].mode?"#000000":"#ffffff")):(m=null,c=null),this.storedData[a]={elem:r,x:c,expan:m,lastPath:"",lastOperator:"",filterId:k,lastRadius:0},"i"===u[a].mode){p=y.length;var P=W("g");for(h=0;h<p;h+=1)P.appendChild(y[h]);var A=W("mask");A.setAttribute("mask-type","alpha"),A.setAttribute("id",v+"_"+g),A.appendChild(r),n.appendChild(A),P.setAttribute("mask","url("+s()+"#"+v+"_"+g+")"),y.length=0,y.push(P)}else y.push(r);u[a].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[a]={elem:r,lastPath:"",op:vt.getProp(this.element,u[a].o,0,.01,this.element),prop:Tt.getShapeProp(this.element,u[a],3),invRect:f},this.viewData[a].prop.k||this.drawPath(u[a],this.viewData[a].prop.v,this.viewData[a])}for(this.maskElement=W(b),o=y.length,a=0;a<o;a+=1)this.maskElement.appendChild(y[a]);g>0&&(this.maskElement.setAttribute("id",v),this.element.maskedElement.setAttribute(_,"url("+s()+"#"+v+")"),n.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}je.prototype={initTransform:function(){var t=new Ft;this.finalTransform={mProp:this.data.ks?Wt.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_localMatMdf:!1,_opMdf:!1,mat:t,localMat:t,localOpacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,i=0,s=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;i<s;){if(this.hierarchy[i].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}i+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),i=0;i<s;i+=1)e.multiply(this.hierarchy[i].finalTransform.mProp.v)}this.finalTransform._matMdf&&(this.finalTransform._localMatMdf=this.finalTransform._matMdf),this.finalTransform._opMdf&&(this.finalTransform.localOpacity=this.finalTransform.mProp.o.v)},renderLocalTransform:function(){if(this.localTransforms){var t=0,e=this.localTransforms.length;if(this.finalTransform._localMatMdf=this.finalTransform._matMdf,!this.finalTransform._localMatMdf||!this.finalTransform._opMdf)for(;t<e;)this.localTransforms[t]._mdf&&(this.finalTransform._localMatMdf=!0),this.localTransforms[t]._opMdf&&!this.finalTransform._opMdf&&(this.finalTransform.localOpacity=this.finalTransform.mProp.o.v,this.finalTransform._opMdf=!0),t+=1;if(this.finalTransform._localMatMdf){var i=this.finalTransform.localMat;for(this.localTransforms[0].matrix.clone(i),t=1;t<e;t+=1){var s=this.localTransforms[t].matrix;i.multiply(s)}i.multiply(this.finalTransform.mat)}if(this.finalTransform._opMdf){var a=this.finalTransform.localOpacity;for(t=0;t<e;t+=1)a*=.01*this.localTransforms[t].opacity;this.finalTransform.localOpacity=a}}},searchEffectTransforms:function(){if(this.renderableEffectsManager){var t=this.renderableEffectsManager.getEffects(qe);if(t.length){this.localTransforms=[],this.finalTransform.localMat=new Ft;var e=0,i=t.length;for(e=0;e<i;e+=1)this.localTransforms.push(t[e])}}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var i,s=!0,a=this.comp;s;)a.finalTransform?(a.data.hasMask&&e.splice(0,0,a.finalTransform),a=a.comp):s=!1;var r,n=e.length;for(i=0;i<n;i+=1)r=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},mHelper:new Ft},We.prototype.getMaskProperty=function(t){return this.viewData[t].prop},We.prototype.renderFrame=function(t){var e,i=this.element.finalTransform.mat,a=this.masksProperties.length;for(e=0;e<a;e+=1)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&this.viewData[e].invRect.setAttribute("transform",i.getInverseMatrix().to2dCSS()),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var r=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+s()+"#"+this.storedData[e].filterId+")")),r.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},We.prototype.getMaskelement=function(){return this.maskElement},We.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},We.prototype.drawPath=function(t,e,i){var s,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,s=1;s<a;s+=1)r+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[s][0]+","+e.i[s][1]+" "+e.v[s][0]+","+e.v[s][1];if(e.c&&a>1&&(r+=" C"+e.o[s-1][0]+","+e.o[s-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),i.lastPath!==r){var n="";i.elem&&(e.c&&(n=t.inv?this.solidPath+r:r),i.elem.setAttribute("d",n)),i.lastPath=r}},We.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null};var Xe=function(){var t={};return t.createFilter=function(t,e){var i=W("filter");i.setAttribute("id",t),!0!==e&&(i.setAttribute("filterUnits","objectBoundingBox"),i.setAttribute("x","0%"),i.setAttribute("y","0%"),i.setAttribute("width","100%"),i.setAttribute("height","100%"));return i},t.createAlphaToLuminanceFilter=function(){var t=W("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1"),t},t}(),He=function(){var t={maskType:!0,svgLumaHidden:!0,offscreenCanvas:"undefined"!=typeof OffscreenCanvas};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),/firefox/i.test(navigator.userAgent)&&(t.svgLumaHidden=!1),t}(),Ye={},Ge="filter_result_";function Ke(t){var e,i,a="SourceGraphic",r=t.data.ef?t.data.ef.length:0,n=I(),o=Xe.createFilter(n,!0),h=0;for(this.filters=[],e=0;e<r;e+=1){i=null;var l=t.data.ef[e].ty;if(Ye[l])i=new(0,Ye[l].effect)(o,t.effectsManager.effectElements[e],t,Ge+h,a),a=Ge+h,Ye[l].countsAsEffect&&(h+=1);i&&this.filters.push(i)}h&&(t.globalData.defs.appendChild(o),t.layerElement.setAttribute("filter","url("+s()+"#"+n+")")),this.filters.length&&t.addRenderableComponent(this)}function Je(){}function Ue(){}function Ze(){}function Qe(t,e,i){this.assetData=e.getAssetData(t.refId),this.assetData&&this.assetData.sid&&(this.assetData=e.slotManager.getProp(this.assetData)),this.initElement(t,e,i),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function $e(t,e){this.elem=t,this.pos=e}function ti(){}Ke.prototype.renderFrame=function(t){var e,i=this.filters.length;for(e=0;e<i;e+=1)this.filters[e].renderFrame(t)},Ke.prototype.getEffects=function(t){var e,i=this.filters.length,s=[];for(e=0;e<i;e+=1)this.filters[e].type===t&&s.push(this.filters[e]);return s},Je.prototype={initRendererElement:function(){this.layerElement=W("g")},createContainerElements:function(){this.matteElement=W("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t=null;if(this.data.td){this.matteMasks={};var e=W("g");e.setAttribute("id",this.layerId),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e)}else this.data.tt?(this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var i=W("clipPath"),a=W("path");a.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var r=I();if(i.setAttribute("id",r),i.appendChild(a),this.globalData.defs.appendChild(i),this.checkMasks()){var n=W("g");n.setAttribute("clip-path","url("+s()+"#"+r+")"),n.appendChild(this.layerElement),this.transformedElement=n,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+s()+"#"+r+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._localMatMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.localMat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.localOpacity)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new We(this.data,this,this.globalData),this.renderableEffectsManager=new Ke(this),this.searchEffectTransforms()},getMatte:function(t){if(this.matteMasks||(this.matteMasks={}),!this.matteMasks[t]){var e,i,a,r,n=this.layerId+"_"+t;if(1===t||3===t){var o=W("mask");o.setAttribute("id",n),o.setAttribute("mask-type",3===t?"luminance":"alpha"),(a=W("use")).setAttributeNS("http://www.w3.org/1999/xlink","href","#"+this.layerId),o.appendChild(a),this.globalData.defs.appendChild(o),He.maskType||1!==t||(o.setAttribute("mask-type","luminance"),e=I(),i=Xe.createFilter(e),this.globalData.defs.appendChild(i),i.appendChild(Xe.createAlphaToLuminanceFilter()),(r=W("g")).appendChild(a),o.appendChild(r),r.setAttribute("filter","url("+s()+"#"+e+")"))}else if(2===t){var h=W("mask");h.setAttribute("id",n),h.setAttribute("mask-type","alpha");var l=W("g");h.appendChild(l),e=I(),i=Xe.createFilter(e);var p=W("feComponentTransfer");p.setAttribute("in","SourceGraphic"),i.appendChild(p);var f=W("feFuncA");f.setAttribute("type","table"),f.setAttribute("tableValues","1.0 0.0"),p.appendChild(f),this.globalData.defs.appendChild(i);var d=W("rect");d.setAttribute("width",this.comp.data.w),d.setAttribute("height",this.comp.data.h),d.setAttribute("x","0"),d.setAttribute("y","0"),d.setAttribute("fill","#ffffff"),d.setAttribute("opacity","0"),l.setAttribute("filter","url("+s()+"#"+e+")"),l.appendChild(d),(a=W("use")).setAttributeNS("http://www.w3.org/1999/xlink","href","#"+this.layerId),l.appendChild(a),He.maskType||(h.setAttribute("mask-type","luminance"),i.appendChild(Xe.createAlphaToLuminanceFilter()),r=W("g"),l.appendChild(d),r.appendChild(this.layerElement),l.appendChild(r)),this.globalData.defs.appendChild(h)}this.matteMasks[t]=n}return this.matteMasks[t]},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+s()+"#"+t+")")}},Ue.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},r([Ae,n({initElement:function(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initTransform(t,e,i),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderLocalTransform(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],Ze),r([Re,je,Je,Ue,ze,Ze],Qe),Qe.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=W("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},Qe.prototype.sourceRectAtTime=function(){return this.sourceRect},ti.prototype={addShapeToModifiers:function(t){var e,i=this.shapeModifiers.length;for(e=0;e<i;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;t>=0&&!this.shapeModifiers[t].processShapes(this._isFirstFrame);t-=1);}},searchProcessedElement:function(t){for(var e=this.processedElements,i=0,s=e.length;i<s;){if(e[i].elem===t)return e[i].pos;i+=1}return 0},addProcessedElement:function(t,e){for(var i=this.processedElements,s=i.length;s;)if(i[s-=1].elem===t)return void(i[s].pos=e);i.push(new $e(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}};var ei={1:"butt",2:"round",3:"square"},ii={1:"miter",2:"round",3:"bevel"};function si(t,e,i){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=i,this.lvl=e,this._isAnimated=!!i.k;for(var s=0,a=t.length;s<a;){if(t[s].mProps.dynamicProperties.length){this._isAnimated=!0;break}s+=1}}function ai(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this._mdf=!1,this.closed=!0===t.hd,this.pElem=W("path"),this.msElem=null}function ri(t,e,i,s){var a;this.elem=t,this.frameId=-1,this.dataProps=l(e.length),this.renderer=i,this.k=!1,this.dashStr="",this.dashArray=h("float32",e.length?e.length-1:0),this.dashoffset=h("float32",1),this.initDynamicPropertyContainer(s);var r,n=e.length||0;for(a=0;a<n;a+=1)r=vt.getProp(t,e[a].v,0,0,this),this.k=r.k||this.k,this.dataProps[a]={n:e[a].n,p:r};this.k||this.getValue(!0),this._isAnimated=this.k}function ni(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=vt.getProp(t,e.o,0,.01,this),this.w=vt.getProp(t,e.w,0,null,this),this.d=new ri(t,e.d||{},"svg",this),this.c=vt.getProp(t,e.c,1,255,this),this.style=i,this._isAnimated=!!this._isAnimated}function oi(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=vt.getProp(t,e.o,0,.01,this),this.c=vt.getProp(t,e.c,1,255,this),this.style=i}function hi(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.style=i}function li(t,e,i){this.data=e,this.c=h("uint8c",4*e.p);var s=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=h("float32",s),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=s,this.initDynamicPropertyContainer(i),this.prop=vt.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}function pi(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.initGradientData(t,e,i)}function fi(t,e,i){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.w=vt.getProp(t,e.w,0,null,this),this.d=new ri(t,e.d||{},"svg",this),this.initGradientData(t,e,i),this._isAnimated=!!this._isAnimated}function di(){this.it=[],this.prevViewData=[],this.gr=W("g")}function mi(t,e,i){this.transform={mProps:t,op:e,container:i},this.elements=[],this._isAnimated=this.transform.mProps.dynamicProperties.length||this.transform.op.effectsSequence.length}si.prototype.setAsAnimated=function(){this._isAnimated=!0},ai.prototype.reset=function(){this.d="",this._mdf=!1},ri.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,i=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<i;e+=1)"o"!==this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},r([bt],ri),r([bt],ni),r([bt],oi),r([bt],hi),li.prototype.comparePoints=function(t,e){for(var i=0,s=this.o.length/2;i<s;){if(Math.abs(t[4*i]-t[4*e+2*i])>.01)return!1;i+=1}return!0},li.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},li.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,i,s,a=4*this.data.p;for(e=0;e<a;e+=1)i=e%4==0?100:255,s=Math.round(this.prop.v[e]*i),this.c[e]!==s&&(this.c[e]=s,this._cmdf=!t);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;e<a;e+=1)i=e%2==0?100:1,s=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==s&&(this.o[e-4*this.data.p]=s,this._omdf=!t);this._mdf=!t}},r([bt],li),pi.prototype.initGradientData=function(t,e,i){this.o=vt.getProp(t,e.o,0,.01,this),this.s=vt.getProp(t,e.s,1,null,this),this.e=vt.getProp(t,e.e,1,null,this),this.h=vt.getProp(t,e.h||{k:0},0,.01,this),this.a=vt.getProp(t,e.a||{k:0},0,P,this),this.g=new li(t,e.g,this),this.style=i,this.stops=[],this.setGradientData(i.pElem,e),this.setGradientOpacity(e,i),this._isAnimated=!!this._isAnimated},pi.prototype.setGradientData=function(t,e){var i=I(),a=W(1===e.t?"linearGradient":"radialGradient");a.setAttribute("id",i),a.setAttribute("spreadMethod","pad"),a.setAttribute("gradientUnits","userSpaceOnUse");var r,n,o,h=[];for(o=4*e.g.p,n=0;n<o;n+=4)r=W("stop"),a.appendChild(r),h.push(r);t.setAttribute("gf"===e.ty?"fill":"stroke","url("+s()+"#"+i+")"),this.gf=a,this.cst=h},pi.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var i,a,r,n=W("mask"),o=W("path");n.appendChild(o);var h=I(),l=I();n.setAttribute("id",l);var p=W(1===t.t?"linearGradient":"radialGradient");p.setAttribute("id",h),p.setAttribute("spreadMethod","pad"),p.setAttribute("gradientUnits","userSpaceOnUse"),r=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=this.stops;for(a=4*t.g.p;a<r;a+=2)(i=W("stop")).setAttribute("stop-color","rgb(255,255,255)"),p.appendChild(i),f.push(i);o.setAttribute("gf"===t.ty?"fill":"stroke","url("+s()+"#"+h+")"),"gs"===t.ty&&(o.setAttribute("stroke-linecap",ei[t.lc||2]),o.setAttribute("stroke-linejoin",ii[t.lj||2]),1===t.lj&&o.setAttribute("stroke-miterlimit",t.ml)),this.of=p,this.ms=n,this.ost=f,this.maskId=l,e.msElem=o}},r([bt],pi),r([pi,bt],fi);var ci=function(t,e,i,s){if(0===e)return"";var a,r=t.o,n=t.i,o=t.v,h=" M"+s.applyToPointStringified(o[0][0],o[0][1]);for(a=1;a<e;a+=1)h+=" C"+s.applyToPointStringified(r[a-1][0],r[a-1][1])+" "+s.applyToPointStringified(n[a][0],n[a][1])+" "+s.applyToPointStringified(o[a][0],o[a][1]);return i&&e&&(h+=" C"+s.applyToPointStringified(r[a-1][0],r[a-1][1])+" "+s.applyToPointStringified(n[0][0],n[0][1])+" "+s.applyToPointStringified(o[0][0],o[0][1]),h+="z"),h},ui=function(){var t=new Ft,e=new Ft;function i(t,e,i){(i||e.transform.op._mdf)&&e.transform.container.setAttribute("opacity",e.transform.op.v),(i||e.transform.mProps._mdf)&&e.transform.container.setAttribute("transform",e.transform.mProps.v.to2dCSS())}function s(){}function a(i,s,a){var r,n,o,h,l,p,f,d,m,c,u=s.styles.length,g=s.lvl;for(p=0;p<u;p+=1){if(h=s.sh._mdf||a,s.styles[p].lvl<g){for(d=e.reset(),m=g-s.styles[p].lvl,c=s.transformers.length-1;!h&&m>0;)h=s.transformers[c].mProps._mdf||h,m-=1,c-=1;if(h)for(m=g-s.styles[p].lvl,c=s.transformers.length-1;m>0;)d.multiply(s.transformers[c].mProps.v),m-=1,c-=1}else d=t;if(n=(f=s.sh.paths)._length,h){for(o="",r=0;r<n;r+=1)(l=f.shapes[r])&&l._length&&(o+=ci(l,l._length,l.c,d));s.caches[p]=o}else o=s.caches[p];s.styles[p].d+=!0===i.hd?"":o,s.styles[p]._mdf=h||s.styles[p]._mdf}}function r(t,e,i){var s=e.style;(e.c._mdf||i)&&s.pElem.setAttribute("fill","rgb("+v(e.c.v[0])+","+v(e.c.v[1])+","+v(e.c.v[2])+")"),(e.o._mdf||i)&&s.pElem.setAttribute("fill-opacity",e.o.v)}function n(t,e,i){o(t,e,i),h(t,e,i)}function o(t,e,i){var s,a,r,n,o,h=e.gf,l=e.g._hasOpacity,p=e.s.v,f=e.e.v;if(e.o._mdf||i){var d="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(d,e.o.v)}if(e.s._mdf||i){var m=1===t.t?"x1":"cx",c="x1"===m?"y1":"cy";h.setAttribute(m,p[0]),h.setAttribute(c,p[1]),l&&!e.g._collapsable&&(e.of.setAttribute(m,p[0]),e.of.setAttribute(c,p[1]))}if(e.g._cmdf||i){s=e.cst;var u=e.g.c;for(r=s.length,a=0;a<r;a+=1)(n=s[a]).setAttribute("offset",u[4*a]+"%"),n.setAttribute("stop-color","rgb("+u[4*a+1]+","+u[4*a+2]+","+u[4*a+3]+")")}if(l&&(e.g._omdf||i)){var g=e.g.o;for(r=(s=e.g._collapsable?e.cst:e.ost).length,a=0;a<r;a+=1)n=s[a],e.g._collapsable||n.setAttribute("offset",g[2*a]+"%"),n.setAttribute("stop-opacity",g[2*a+1])}if(1===t.t)(e.e._mdf||i)&&(h.setAttribute("x2",f[0]),h.setAttribute("y2",f[1]),l&&!e.g._collapsable&&(e.of.setAttribute("x2",f[0]),e.of.setAttribute("y2",f[1])));else if((e.s._mdf||e.e._mdf||i)&&(o=Math.sqrt(Math.pow(p[0]-f[0],2)+Math.pow(p[1]-f[1],2)),h.setAttribute("r",o),l&&!e.g._collapsable&&e.of.setAttribute("r",o)),e.e._mdf||e.h._mdf||e.a._mdf||i){o||(o=Math.sqrt(Math.pow(p[0]-f[0],2)+Math.pow(p[1]-f[1],2)));var y=Math.atan2(f[1]-p[1],f[0]-p[0]),v=e.h.v;v>=1?v=.99:v<=-1&&(v=-.99);var b=o*v,_=Math.cos(y+e.a.v)*b+p[0],k=Math.sin(y+e.a.v)*b+p[1];h.setAttribute("fx",_),h.setAttribute("fy",k),l&&!e.g._collapsable&&(e.of.setAttribute("fx",_),e.of.setAttribute("fy",k))}}function h(t,e,i){var s=e.style,a=e.d;a&&(a._mdf||i)&&a.dashStr&&(s.pElem.setAttribute("stroke-dasharray",a.dashStr),s.pElem.setAttribute("stroke-dashoffset",a.dashoffset[0])),e.c&&(e.c._mdf||i)&&s.pElem.setAttribute("stroke","rgb("+v(e.c.v[0])+","+v(e.c.v[1])+","+v(e.c.v[2])+")"),(e.o._mdf||i)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w._mdf||i)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))}return{createRenderFunction:function(t){switch(t.ty){case"fl":return r;case"gf":return o;case"gs":return n;case"st":return h;case"sh":case"el":case"rc":case"sr":return a;case"tr":return i;case"no":return s;default:return null}}}}();function gi(t,e,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,i),this.prevViewData=[]}function yi(t,e,i,s,a,r){this.o=t,this.sw=e,this.sc=i,this.fc=s,this.m=a,this.p=r,this._mdf={o:!0,sw:!!e,sc:!!i,fc:!!s,m:!0,p:!0}}function vi(t,e){this._frameId=i,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,e.d&&e.d.sid&&(e.d=t.globalData.slotManager.getProp(e.d)),this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}r([Re,je,Je,ti,Ue,ze,Ze],gi),gi.prototype.initSecondaryElement=function(){},gi.prototype.identityMatrix=new Ft,gi.prototype.buildExpressionInterface=function(){},gi.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},gi.prototype.filterUniqueShapes=function(){var t,e,i,s,a=this.shapes.length,r=this.stylesList.length,n=[],o=!1;for(i=0;i<r;i+=1){for(s=this.stylesList[i],o=!1,n.length=0,t=0;t<a;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(s)&&(n.push(e),o=e._isAnimated||o);n.length>1&&o&&this.setShapesAsAnimated(n)}},gi.prototype.setShapesAsAnimated=function(t){var e,i=t.length;for(e=0;e<i;e+=1)t[e].setAsAnimated()},gi.prototype.createStyleElement=function(t,e){var i,a=new ai(t,e),r=a.pElem;if("st"===t.ty)i=new ni(this,t,a);else if("fl"===t.ty)i=new oi(this,t,a);else if("gf"===t.ty||"gs"===t.ty){i=new("gf"===t.ty?pi:fi)(this,t,a),this.globalData.defs.appendChild(i.gf),i.maskId&&(this.globalData.defs.appendChild(i.ms),this.globalData.defs.appendChild(i.of),r.setAttribute("mask","url("+s()+"#"+i.maskId+")"))}else"no"===t.ty&&(i=new hi(this,t,a));return"st"!==t.ty&&"gs"!==t.ty||(r.setAttribute("stroke-linecap",ei[t.lc||2]),r.setAttribute("stroke-linejoin",ii[t.lj||2]),r.setAttribute("fill-opacity","0"),1===t.lj&&r.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&r.setAttribute("fill-rule","evenodd"),t.ln&&r.setAttribute("id",t.ln),t.cl&&r.setAttribute("class",t.cl),t.bm&&(r.style["mix-blend-mode"]=xe(t.bm)),this.stylesList.push(a),this.addToAnimatedContents(t,i),i},gi.prototype.createGroupElement=function(t){var e=new di;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=xe(t.bm)),e},gi.prototype.createTransformElement=function(t,e){var i=Wt.getTransformProperty(this,t,this),s=new mi(i,i.o,e);return this.addToAnimatedContents(t,s),s},gi.prototype.createShapeElement=function(t,e,i){var s=4;"rc"===t.ty?s=5:"el"===t.ty?s=6:"sr"===t.ty&&(s=7);var a=new si(e,i,Tt.getShapeProp(this,t,s,this));return this.shapes.push(a),this.addShapeToModifiers(a),this.addToAnimatedContents(t,a),a},gi.prototype.addToAnimatedContents=function(t,e){for(var i=0,s=this.animatedContents.length;i<s;){if(this.animatedContents[i].element===e)return;i+=1}this.animatedContents.push({fn:ui.createRenderFunction(t),element:e,data:t})},gi.prototype.setElementStyles=function(t){var e,i=t.styles,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||i.push(this.stylesList[e])},gi.prototype.reloadShapes=function(){var t;this._isFirstFrame=!0;var e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},gi.prototype.searchShapes=function(t,e,i,s,a,r,n){var o,h,l,p,f,d,m=[].concat(r),c=t.length-1,u=[],g=[];for(o=c;o>=0;o-=1){if((d=this.searchProcessedElement(t[o]))?e[o]=i[d-1]:t[o]._render=n,"fl"===t[o].ty||"st"===t[o].ty||"gf"===t[o].ty||"gs"===t[o].ty||"no"===t[o].ty)d?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],a),t[o]._render&&e[o].style.pElem.parentNode!==s&&s.appendChild(e[o].style.pElem),u.push(e[o].style);else if("gr"===t[o].ty){if(d)for(l=e[o].it.length,h=0;h<l;h+=1)e[o].prevViewData[h]=e[o].it[h];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,a+1,m,n),t[o]._render&&e[o].gr.parentNode!==s&&s.appendChild(e[o].gr)}else"tr"===t[o].ty?(d||(e[o]=this.createTransformElement(t[o],s)),p=e[o].transform,m.push(p)):"sh"===t[o].ty||"rc"===t[o].ty||"el"===t[o].ty||"sr"===t[o].ty?(d||(e[o]=this.createShapeElement(t[o],m,a)),this.setElementStyles(e[o])):"tm"===t[o].ty||"rd"===t[o].ty||"ms"===t[o].ty||"pb"===t[o].ty||"zz"===t[o].ty||"op"===t[o].ty?(d?(f=e[o]).closed=!1:((f=Nt.getModifier(t[o].ty)).init(this,t[o]),e[o]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"===t[o].ty&&(d?(f=e[o]).closed=!0:(f=Nt.getModifier(t[o].ty),e[o]=f,f.init(this,t,o,e),this.shapeModifiers.push(f),n=!1),g.push(f));this.addProcessedElement(t[o],o+1)}for(c=u.length,o=0;o<c;o+=1)u[o].closed=!0;for(c=g.length,o=0;o<c;o+=1)g[o].closed=!0},gi.prototype.renderInnerContent=function(){var t;this.renderModifiers();var e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},gi.prototype.renderShape=function(){var t,e,i=this.animatedContents.length;for(t=0;t<i;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},gi.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},yi.prototype.update=function(t,e,i,s,a,r){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this._mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this._mdf.sw=!0,n=!0),this.sc!==i&&(this.sc=i,this._mdf.sc=!0,n=!0),this.fc!==s&&(this.fc=s,this._mdf.fc=!0,n=!0),this.m!==a&&(this.m=a,this._mdf.m=!0,n=!0),!r.length||this.p[0]===r[0]&&this.p[1]===r[1]&&this.p[4]===r[4]&&this.p[5]===r[5]&&this.p[12]===r[12]&&this.p[13]===r[13]||(this.p=r,this._mdf.p=!0,n=!0),n},vi.prototype.defaultBoxWidth=[0,0],vi.prototype.copyData=function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},vi.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},vi.prototype.searchProperty=function(){return this.searchKeyframes()},vi.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},vi.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},vi.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,i=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{var s;this.lock=!0,this._mdf=!1;var a=this.effectsSequence.length,r=t||this.data.d.k[this.keysIndex].s;for(s=0;s<a;s+=1)r=i!==this.keysIndex?this.effectsSequence[s](r,r.t):this.effectsSequence[s](this.currentData,r.t);e!==r&&this.setCurrentData(r),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},vi.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,i=0,s=t.length;i<=s-1&&!(i===s-1||t[i+1].t>e);)i+=1;return this.keysIndex!==i&&(this.keysIndex=i),this.data.d.k[this.keysIndex].s},vi.prototype.buildFinalText=function(t){for(var e,i,s=[],a=0,r=t.length,n=!1,o=!1,h="";a<r;)n=o,o=!1,e=t.charCodeAt(a),h=t.charAt(a),ke.isCombinedCharacter(e)?n=!0:e>=55296&&e<=56319?ke.isRegionalFlag(t,a)?h=t.substr(a,14):(i=t.charCodeAt(a+1))>=56320&&i<=57343&&(ke.isModifier(e,i)?(h=t.substr(a,2),n=!0):h=ke.isFlagEmoji(t.substr(a,4))?t.substr(a,4):t.substr(a,2)):e>56319?(i=t.charCodeAt(a+1),ke.isVariationSelector(e)&&(n=!0)):ke.isZeroWidthJoiner(e)&&(n=!0,o=!0),n?(s[s.length-1]+=h,n=!1):s.push(h),a+=h.length;return s},vi.prototype.completeTextData=function(t){t.__complete=!0;var e,i,s,a,r,n,o,h=this.elem.globalData.fontManager,l=this.data,p=[],f=0,d=l.m.g,m=0,c=0,u=0,g=[],y=0,v=0,b=h.getFontByName(t.f),_=0,k=_e(b);t.fWeight=k.weight,t.fStyle=k.style,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),i=t.finalText.length,t.finalLineHeight=t.lh;var P,A=t.tr/1e3*t.finalSize;if(t.sz)for(var S,x,w=!0,D=t.sz[0],C=t.sz[1];w;){S=0,y=0,i=(x=this.buildFinalText(t.t)).length,A=t.tr/1e3*t.finalSize;var M=-1;for(e=0;e<i;e+=1)P=x[e].charCodeAt(0),s=!1," "===x[e]?M=e:13!==P&&3!==P||(y=0,s=!0,S+=t.finalLineHeight||1.2*t.finalSize),h.chars?(o=h.getCharData(x[e],b.fStyle,b.fFamily),_=s?0:o.w*t.finalSize/100):_=h.measureText(x[e],t.f,t.finalSize),y+_>D&&" "!==x[e]?(-1===M?i+=1:e=M,S+=t.finalLineHeight||1.2*t.finalSize,x.splice(e,M===e?1:0,"\r"),M=-1,y=0):(y+=_,y+=A);S+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&C<S?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=x,i=t.finalText.length,w=!1)}y=-A,_=0;var T,F=0;for(e=0;e<i;e+=1)if(s=!1,13===(P=(T=t.finalText[e]).charCodeAt(0))||3===P?(F=0,g.push(y),v=y>v?y:v,y=-2*A,a="",s=!0,u+=1):a=T,h.chars?(o=h.getCharData(T,b.fStyle,h.getFontByName(t.f).fFamily),_=s?0:o.w*t.finalSize/100):_=h.measureText(a,t.f,t.finalSize)," "===T?F+=_+A:(y+=_+A+F,F=0),p.push({l:_,an:_,add:m,n:s,anIndexes:[],val:a,line:u,animatorJustifyOffset:0}),2==d){if(m+=_,""===a||" "===a||e===i-1){for(""!==a&&" "!==a||(m-=_);c<=e;)p[c].an=m,p[c].ind=f,p[c].extra=_,c+=1;f+=1,m=0}}else if(3==d){if(m+=_,""===a||e===i-1){for(""===a&&(m-=_);c<=e;)p[c].an=m,p[c].ind=f,p[c].extra=_,c+=1;m=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=y>v?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var E,I,L,V,R=l.a;n=R.length;var z=[];for(r=0;r<n;r+=1){for((E=R[r]).a.sc&&(t.strokeColorAnim=!0),E.a.sw&&(t.strokeWidthAnim=!0),(E.a.fc||E.a.fh||E.a.fs||E.a.fb)&&(t.fillColorAnim=!0),V=0,L=E.s.b,e=0;e<i;e+=1)(I=p[e]).anIndexes[r]=V,(1==L&&""!==I.val||2==L&&""!==I.val&&" "!==I.val||3==L&&(I.n||" "==I.val||e==i-1)||4==L&&(I.n||e==i-1))&&(1===E.s.rn&&z.push(V),V+=1);l.a[r].s.totalChars=V;var O,N=-1;if(1===E.s.rn)for(e=0;e<i;e+=1)N!=(I=p[e]).anIndexes[r]&&(N=I.anIndexes[r],O=z.splice(Math.floor(Math.random()*z.length),1)[0]),I.anIndexes[r]=O}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=b.ascent*t.finalSize/100},vi.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var i=this.copyData({},this.data.d.k[e].s);i=this.copyData(i,t),this.data.d.k[e].s=i,this.recalculate(e),this.setCurrentData(i),this.elem.addDynamicProperty(this)},vi.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},vi.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},vi.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var bi=function(){var t=Math.max,e=Math.min,i=Math.floor;function s(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=vt.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?vt.getProp(t,e.e,0,0,this):{v:100},this.o=vt.getProp(t,e.o||{k:0},0,0,this),this.xe=vt.getProp(t,e.xe||{k:0},0,0,this),this.ne=vt.getProp(t,e.ne||{k:0},0,0,this),this.sm=vt.getProp(t,e.sm||{k:100},0,0,this),this.a=vt.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}return s.prototype={getMult:function(s){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var a=0,r=0,n=1,o=1;this.ne.v>0?a=this.ne.v/100:r=-this.ne.v/100,this.xe.v>0?n=1-this.xe.v/100:o=1+this.xe.v/100;var h=tt.getBezierEasing(a,r,n,o).get,l=0,p=this.finalS,f=this.finalE,d=this.data.sh;if(2===d)l=h(l=f===p?s>=f?1:0:t(0,e(.5/(f-p)+(s-p)/(f-p),1)));else if(3===d)l=h(l=f===p?s>=f?0:1:1-t(0,e(.5/(f-p)+(s-p)/(f-p),1)));else if(4===d)f===p?l=0:(l=t(0,e(.5/(f-p)+(s-p)/(f-p),1)))<.5?l*=2:l=1-2*(l-.5),l=h(l);else if(5===d){if(f===p)l=0;else{var m=f-p,c=-m/2+(s=e(t(0,s+.5-p),f-p)),u=m/2;l=Math.sqrt(1-c*c/(u*u))}l=h(l)}else 6===d?(f===p?l=0:(s=e(t(0,s+.5-p),f-p),l=(1+Math.cos(Math.PI+2*Math.PI*s/(f-p)))/2),l=h(l)):(s>=i(p)&&(l=t(0,e(s-p<0?e(f,1)-(p-s):f-s,1))),l=h(l));if(100!==this.sm.v){var g=.01*this.sm.v;0===g&&(g=1e-8);var y=.5-.5*g;l<y?l=0:(l=(l-y)/g)>1&&(l=1)}return l*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,i=this.o.v/e,s=this.s.v/e+i,a=this.e.v/e+i;if(s>a){var r=s;s=a,a=r}this.finalS=s,this.finalE=a}},r([bt],s),{getTextSelectorProp:function(t,e,i){return new s(t,e,i)}}}();function _i(t,e,i){var s={propType:!1},a=vt.getProp,r=e.a;this.a={r:r.r?a(t,r.r,0,P,i):s,rx:r.rx?a(t,r.rx,0,P,i):s,ry:r.ry?a(t,r.ry,0,P,i):s,sk:r.sk?a(t,r.sk,0,P,i):s,sa:r.sa?a(t,r.sa,0,P,i):s,s:r.s?a(t,r.s,1,.01,i):s,a:r.a?a(t,r.a,1,0,i):s,o:r.o?a(t,r.o,0,.01,i):s,p:r.p?a(t,r.p,1,0,i):s,sw:r.sw?a(t,r.sw,0,0,i):s,sc:r.sc?a(t,r.sc,1,0,i):s,fc:r.fc?a(t,r.fc,1,0,i):s,fh:r.fh?a(t,r.fh,0,0,i):s,fs:r.fs?a(t,r.fs,0,.01,i):s,fb:r.fb?a(t,r.fb,0,.01,i):s,t:r.t?a(t,r.t,0,0,i):s},this.s=bi.getTextSelectorProp(t,e.s,i),this.s.t=e.s.t}function ki(t,e,i){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=i,this._animatorsData=l(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(i)}function Pi(){}ki.prototype.searchProperties=function(){var t,e,i=this._textData.a.length,s=vt.getProp;for(t=0;t<i;t+=1)e=this._textData.a[t],this._animatorsData[t]=new _i(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={a:s(this._elem,this._textData.p.a,0,0,this),f:s(this._elem,this._textData.p.f,0,0,this),l:s(this._elem,this._textData.p.l,0,0,this),r:s(this._elem,this._textData.p.r,0,0,this),p:s(this._elem,this._textData.p.p,0,0,this),m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=s(this._elem,this._textData.m.a,1,0,this)},ki.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var i,s,a,r,n,o,h,l,p,f,d,m,c,u,g,y,v,b,_,k=this._moreOptions.alignment.v,P=this._animatorsData,A=this._textData,S=this.mHelper,x=this._renderType,w=this.renderedLetters.length,D=t.l;if(this._hasMaskedPath){if(_=this._pathData.m,!this._pathData.n||this._pathData._mdf){var C,M=_.v;for(this._pathData.r.v&&(M=M.reverse()),n={tLength:0,segments:[]},r=M._length-1,y=0,a=0;a<r;a+=1)C=rt.buildBezierData(M.v[a],M.v[a+1],[M.o[a][0]-M.v[a][0],M.o[a][1]-M.v[a][1]],[M.i[a+1][0]-M.v[a+1][0],M.i[a+1][1]-M.v[a+1][1]]),n.tLength+=C.segmentLength,n.segments.push(C),y+=C.segmentLength;a=r,_.v.c&&(C=rt.buildBezierData(M.v[a],M.v[0],[M.o[a][0]-M.v[a][0],M.o[a][1]-M.v[a][1]],[M.i[0][0]-M.v[0][0],M.i[0][1]-M.v[0][1]]),n.tLength+=C.segmentLength,n.segments.push(C),y+=C.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,o=this._pathData.f.v,d=0,f=1,l=0,p=!0,u=n.segments,o<0&&_.v.c)for(n.tLength<Math.abs(o)&&(o=-Math.abs(o)%n.tLength),f=(c=u[d=u.length-1].points).length-1;o<0;)o+=c[f].partialLength,(f-=1)<0&&(f=(c=u[d-=1].points).length-1);m=(c=u[d].points)[f-1],g=(h=c[f]).partialLength}r=D.length,i=0,s=0;var T,F,E,I,L,V=1.2*t.finalSize*.714,N=!0;E=P.length;var B,q,j,W,X,H,Y,G,K,J,U,Z,Q=-1,$=o,tt=d,et=f,it=-1,st="",at=this.defaultPropsArray;if(2===t.j||1===t.j){var nt=0,ot=0,ht=2===t.j?-.5:-1,lt=0,pt=!0;for(a=0;a<r;a+=1)if(D[a].n){for(nt&&(nt+=ot);lt<a;)D[lt].animatorJustifyOffset=nt,lt+=1;nt=0,pt=!0}else{for(F=0;F<E;F+=1)(T=P[F].a).t.propType&&(pt&&2===t.j&&(ot+=T.t.v*ht),(L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars)).length?nt+=T.t.v*L[0]*ht:nt+=T.t.v*L*ht);pt=!1}for(nt&&(nt+=ot);lt<a;)D[lt].animatorJustifyOffset=nt,lt+=1}for(a=0;a<r;a+=1){if(S.reset(),W=1,D[a].n)i=0,s+=t.yOffset,s+=N?1:0,o=$,N=!1,this._hasMaskedPath&&(f=et,m=(c=u[d=tt].points)[f-1],g=(h=c[f]).partialLength,l=0),st="",U="",K="",Z="",at=this.defaultPropsArray;else{if(this._hasMaskedPath){if(it!==D[a].line){switch(t.j){case 1:o+=y-t.lineWidths[D[a].line];break;case 2:o+=(y-t.lineWidths[D[a].line])/2}it=D[a].line}Q!==D[a].ind&&(D[Q]&&(o+=D[Q].extra),o+=D[a].an/2,Q=D[a].ind),o+=k[0]*D[a].an*.005;var ft=0;for(F=0;F<E;F+=1)(T=P[F].a).p.propType&&((L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars)).length?ft+=T.p.v[0]*L[0]:ft+=T.p.v[0]*L),T.a.propType&&((L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars)).length?ft+=T.a.v[0]*L[0]:ft+=T.a.v[0]*L);for(p=!0,this._pathData.a.v&&(o=.5*D[0].an+(y-this._pathData.f.v-.5*D[0].an-.5*D[D.length-1].an)*Q/(r-1),o+=this._pathData.f.v);p;)l+g>=o+ft||!c?(v=(o+ft-l)/h.partialLength,q=m.point[0]+(h.point[0]-m.point[0])*v,j=m.point[1]+(h.point[1]-m.point[1])*v,S.translate(-k[0]*D[a].an*.005,-k[1]*V*.01),p=!1):c&&(l+=h.partialLength,(f+=1)>=c.length&&(f=0,u[d+=1]?c=u[d].points:_.v.c?(f=0,c=u[d=0].points):(l-=h.partialLength,c=null)),c&&(m=h,g=(h=c[f]).partialLength));B=D[a].an/2-D[a].add,S.translate(-B,0,0)}else B=D[a].an/2-D[a].add,S.translate(-B,0,0),S.translate(-k[0]*D[a].an*.005,-k[1]*V*.01,0);for(F=0;F<E;F+=1)(T=P[F].a).t.propType&&(L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars),0===i&&0===t.j||(this._hasMaskedPath?L.length?o+=T.t.v*L[0]:o+=T.t.v*L:L.length?i+=T.t.v*L[0]:i+=T.t.v*L));for(t.strokeWidthAnim&&(H=t.sw||0),t.strokeColorAnim&&(X=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(Y=[t.fc[0],t.fc[1],t.fc[2]]),F=0;F<E;F+=1)(T=P[F].a).a.propType&&((L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars)).length?S.translate(-T.a.v[0]*L[0],-T.a.v[1]*L[1],T.a.v[2]*L[2]):S.translate(-T.a.v[0]*L,-T.a.v[1]*L,T.a.v[2]*L));for(F=0;F<E;F+=1)(T=P[F].a).s.propType&&((L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars)).length?S.scale(1+(T.s.v[0]-1)*L[0],1+(T.s.v[1]-1)*L[1],1):S.scale(1+(T.s.v[0]-1)*L,1+(T.s.v[1]-1)*L,1));for(F=0;F<E;F+=1){if(T=P[F].a,L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars),T.sk.propType&&(L.length?S.skewFromAxis(-T.sk.v*L[0],T.sa.v*L[1]):S.skewFromAxis(-T.sk.v*L,T.sa.v*L)),T.r.propType&&(L.length?S.rotateZ(-T.r.v*L[2]):S.rotateZ(-T.r.v*L)),T.ry.propType&&(L.length?S.rotateY(T.ry.v*L[1]):S.rotateY(T.ry.v*L)),T.rx.propType&&(L.length?S.rotateX(T.rx.v*L[0]):S.rotateX(T.rx.v*L)),T.o.propType&&(L.length?W+=(T.o.v*L[0]-W)*L[0]:W+=(T.o.v*L-W)*L),t.strokeWidthAnim&&T.sw.propType&&(L.length?H+=T.sw.v*L[0]:H+=T.sw.v*L),t.strokeColorAnim&&T.sc.propType)for(G=0;G<3;G+=1)L.length?X[G]+=(T.sc.v[G]-X[G])*L[0]:X[G]+=(T.sc.v[G]-X[G])*L;if(t.fillColorAnim&&t.fc){if(T.fc.propType)for(G=0;G<3;G+=1)L.length?Y[G]+=(T.fc.v[G]-Y[G])*L[0]:Y[G]+=(T.fc.v[G]-Y[G])*L;T.fh.propType&&(Y=L.length?O(Y,T.fh.v*L[0]):O(Y,T.fh.v*L)),T.fs.propType&&(Y=L.length?R(Y,T.fs.v*L[0]):R(Y,T.fs.v*L)),T.fb.propType&&(Y=L.length?z(Y,T.fb.v*L[0]):z(Y,T.fb.v*L))}}for(F=0;F<E;F+=1)(T=P[F].a).p.propType&&(L=P[F].s.getMult(D[a].anIndexes[F],A.a[F].s.totalChars),this._hasMaskedPath?L.length?S.translate(0,T.p.v[1]*L[0],-T.p.v[2]*L[1]):S.translate(0,T.p.v[1]*L,-T.p.v[2]*L):L.length?S.translate(T.p.v[0]*L[0],T.p.v[1]*L[1],-T.p.v[2]*L[2]):S.translate(T.p.v[0]*L,T.p.v[1]*L,-T.p.v[2]*L));if(t.strokeWidthAnim&&(K=H<0?0:H),t.strokeColorAnim&&(J="rgb("+Math.round(255*X[0])+","+Math.round(255*X[1])+","+Math.round(255*X[2])+")"),t.fillColorAnim&&t.fc&&(U="rgb("+Math.round(255*Y[0])+","+Math.round(255*Y[1])+","+Math.round(255*Y[2])+")"),this._hasMaskedPath){if(S.translate(0,-t.ls),S.translate(0,k[1]*V*.01+s,0),this._pathData.p.v){b=(h.point[1]-m.point[1])/(h.point[0]-m.point[0]);var dt=180*Math.atan(b)/Math.PI;h.point[0]<m.point[0]&&(dt+=180),S.rotate(-dt*Math.PI/180)}S.translate(q,j,0),o-=k[0]*D[a].an*.005,D[a+1]&&Q!==D[a+1].ind&&(o+=D[a].an/2,o+=.001*t.tr*t.finalSize)}else{switch(S.translate(i,s,0),t.ps&&S.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:S.translate(D[a].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[D[a].line]),0,0);break;case 2:S.translate(D[a].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[D[a].line])/2,0,0)}S.translate(0,-t.ls),S.translate(B,0,0),S.translate(k[0]*D[a].an*.005,k[1]*V*.01,0),i+=D[a].l+.001*t.tr*t.finalSize}"html"===x?st=S.toCSS():"svg"===x?st=S.to2dCSS():at=[S.props[0],S.props[1],S.props[2],S.props[3],S.props[4],S.props[5],S.props[6],S.props[7],S.props[8],S.props[9],S.props[10],S.props[11],S.props[12],S.props[13],S.props[14],S.props[15]],Z=W}w<=a?(I=new yi(Z,K,J,U,st,at),this.renderedLetters.push(I),w+=1,this.lettersChangedFlag=!0):(I=this.renderedLetters[a],this.lettersChangedFlag=I.update(Z,K,J,U,st,at)||this.lettersChangedFlag)}}},ki.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},ki.prototype.mHelper=new Ft,ki.prototype.defaultPropsArray=[],r([bt],ki),Pi.prototype.initElement=function(t,e,i){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,i),this.textProperty=new vi(this,t.t,this.dynamicProperties),this.textAnimator=new ki(t.t,this.renderType,this),this.initTransform(t,e,i),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},Pi.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)},Pi.prototype.createPathShape=function(t,e){var i,s,a=e.length,r="";for(i=0;i<a;i+=1)"sh"===e[i].ty&&(s=e[i].ks.k,r+=ci(s,s.i.length,!0,t));return r},Pi.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},Pi.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},Pi.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},Pi.prototype.applyTextPropertiesToMatrix=function(t,e,i,s,a){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[i]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[i])/2,0,0)}e.translate(s,a,0)},Pi.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},Pi.prototype.emptyProp=new yi,Pi.prototype.destroy=function(){},Pi.prototype.validateText=function(){(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)};var Ai,Si={shapes:[]};function xi(t,e,i){this.textSpans=[],this.renderType="svg",this.initElement(t,e,i)}function wi(t,e,i){this.initElement(t,e,i)}function Di(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initFrame(),this.initTransform(t,e,i),this.initHierarchy()}function Ci(){}function Mi(){}function Ti(t,e,i){this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?l(this.layers.length):[],this.initElement(t,e,i),this.tm=t.tm?vt.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function Fi(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=W("svg");var i="";if(e&&e.title){var s=W("title"),a=I();s.setAttribute("id",a),s.textContent=e.title,this.svgElement.appendChild(s),i+=a}if(e&&e.description){var r=W("desc"),n=I();r.setAttribute("id",n),r.textContent=e.description,this.svgElement.appendChild(r),i+=" "+n}i&&this.svgElement.setAttribute("aria-labelledby",i);var o=W("defs");this.svgElement.appendChild(o);var h=W("g");this.svgElement.appendChild(h),this.layerElement=h,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",contentVisibility:e&&e.contentVisibility||"visible",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!(e&&!1===e.hideOnTransparent),viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||"",id:e&&e.id||"",focusable:e&&e.focusable,filterSize:{width:e&&e.filterSize&&e.filterSize.width||"100%",height:e&&e.filterSize&&e.filterSize.height||"100%",x:e&&e.filterSize&&e.filterSize.x||"0%",y:e&&e.filterSize&&e.filterSize.y||"0%"},width:e&&e.width,height:e&&e.height,runExpressions:!e||void 0===e.runExpressions||e.runExpressions},this.globalData={_mdf:!1,frameNum:-1,defs:o,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}return r([Re,je,Je,Ue,ze,Ze,Pi],xi),xi.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=W("text"))},xi.prototype.buildTextContents=function(t){for(var e=0,i=t.length,s=[],a="";e<i;)t[e]===String.fromCharCode(13)||t[e]===String.fromCharCode(3)?(s.push(a),a=""):a+=t[e],e+=1;return s.push(a),s},xi.prototype.buildShapeData=function(t,e){if(t.shapes&&t.shapes.length){var i=t.shapes[0];if(i.it){var s=i.it[i.it.length-1];s.s&&(s.s.k[0]=e,s.s.k[1]=e)}}return t},xi.prototype.buildNewText=function(){var t,e;this.addDynamicProperty(this);var i=this.textProperty.currentData;this.renderedLetters=l(i?i.l.length:0),i.fc?this.layerElement.setAttribute("fill",this.buildColor(i.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),i.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(i.sc)),this.layerElement.setAttribute("stroke-width",i.sw)),this.layerElement.setAttribute("font-size",i.finalSize);var s=this.globalData.fontManager.getFontByName(i.f);if(s.fClass)this.layerElement.setAttribute("class",s.fClass);else{this.layerElement.setAttribute("font-family",s.fFamily);var a=i.fWeight,r=i.fStyle;this.layerElement.setAttribute("font-style",r),this.layerElement.setAttribute("font-weight",a)}this.layerElement.setAttribute("aria-label",i.t);var n,o=i.l||[],h=!!this.globalData.fontManager.chars;e=o.length;var p=this.mHelper,f=this.data.singleShape,d=0,m=0,c=!0,u=.001*i.tr*i.finalSize;if(!f||h||i.sz){var g,y=this.textSpans.length;for(t=0;t<e;t+=1){if(this.textSpans[t]||(this.textSpans[t]={span:null,childSpan:null,glyph:null}),!h||!f||0===t){if(n=y>t?this.textSpans[t].span:W(h?"g":"text"),y<=t){if(n.setAttribute("stroke-linecap","butt"),n.setAttribute("stroke-linejoin","round"),n.setAttribute("stroke-miterlimit","4"),this.textSpans[t].span=n,h){var v=W("g");n.appendChild(v),this.textSpans[t].childSpan=v}this.textSpans[t].span=n,this.layerElement.appendChild(n)}n.style.display="inherit"}if(p.reset(),f&&(o[t].n&&(d=-u,m+=i.yOffset,m+=c?1:0,c=!1),this.applyTextPropertiesToMatrix(i,p,o[t].line,d,m),d+=o[t].l||0,d+=u),h){var b;if(1===(g=this.globalData.fontManager.getCharData(i.finalText[t],s.fStyle,this.globalData.fontManager.getFontByName(i.f).fFamily)).t)b=new Ti(g.data,this.globalData,this);else{var _=Si;g.data&&g.data.shapes&&(_=this.buildShapeData(g.data,i.finalSize)),b=new gi(_,this.globalData,this)}if(this.textSpans[t].glyph){var k=this.textSpans[t].glyph;this.textSpans[t].childSpan.removeChild(k.layerElement),k.destroy()}this.textSpans[t].glyph=b,b._debug=!0,b.prepareFrame(0),b.renderFrame(),this.textSpans[t].childSpan.appendChild(b.layerElement),1===g.t&&this.textSpans[t].childSpan.setAttribute("transform","scale("+i.finalSize/100+","+i.finalSize/100+")")}else f&&n.setAttribute("transform","translate("+p.props[12]+","+p.props[13]+")"),n.textContent=o[t].val,n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve")}f&&n&&n.setAttribute("d","")}else{var P=this.textContainer,A="start";switch(i.j){case 1:A="end";break;case 2:A="middle";break;default:A="start"}P.setAttribute("text-anchor",A),P.setAttribute("letter-spacing",u);var S=this.buildTextContents(i.finalText);for(e=S.length,m=i.ps?i.ps[1]+i.ascent:0,t=0;t<e;t+=1)(n=this.textSpans[t].span||W("tspan")).textContent=S[t],n.setAttribute("x",0),n.setAttribute("y",m),n.style.display="inherit",P.appendChild(n),this.textSpans[t]||(this.textSpans[t]={span:null,glyph:null}),this.textSpans[t].span=n,m+=i.finalLineHeight;this.layerElement.appendChild(P)}for(;t<this.textSpans.length;)this.textSpans[t].span.style.display="none",t+=1;this._sizeChanged=!0},xi.prototype.sourceRectAtTime=function(){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var t=this.layerElement.getBBox();this.bbox={top:t.y,left:t.x,width:t.width,height:t.height}}return this.bbox},xi.prototype.getValue=function(){var t,e,i=this.textSpans.length;for(this.renderedFrame=this.comp.renderedFrame,t=0;t<i;t+=1)(e=this.textSpans[t].glyph)&&(e.prepareFrame(this.comp.renderedFrame-this.data.st),e._mdf&&(this._mdf=!0))},xi.prototype.renderInnerContent=function(){if(this.validateText(),(!this.data.singleShape||this._mdf)&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){var t,e;this._sizeChanged=!0;var i,s,a,r=this.textAnimator.renderedLetters,n=this.textProperty.currentData.l;for(e=n.length,t=0;t<e;t+=1)n[t].n||(i=r[t],s=this.textSpans[t].span,(a=this.textSpans[t].glyph)&&a.renderFrame(),i._mdf.m&&s.setAttribute("transform",i.m),i._mdf.o&&s.setAttribute("opacity",i.o),i._mdf.sw&&s.setAttribute("stroke-width",i.sw),i._mdf.sc&&s.setAttribute("stroke",i.sc),i._mdf.fc&&s.setAttribute("fill",i.fc))}},r([Qe],wi),wi.prototype.createContent=function(){var t=W("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},Di.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},Di.prototype.renderFrame=function(){},Di.prototype.getBaseElement=function(){return null},Di.prototype.destroy=function(){},Di.prototype.sourceRectAtTime=function(){},Di.prototype.hide=function(){},r([Re,je,Ue,ze],Di),r([Be],Ci),Ci.prototype.createNull=function(t){return new Di(t,this.globalData,this)},Ci.prototype.createShape=function(t){return new gi(t,this.globalData,this)},Ci.prototype.createText=function(t){return new xi(t,this.globalData,this)},Ci.prototype.createImage=function(t){return new Qe(t,this.globalData,this)},Ci.prototype.createSolid=function(t){return new wi(t,this.globalData,this)},Ci.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.svgElement.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)",this.svgElement.style.contentVisibility=this.renderConfig.contentVisibility),this.renderConfig.width&&this.svgElement.setAttribute("width",this.renderConfig.width),this.renderConfig.height&&this.svgElement.setAttribute("height",this.renderConfig.height),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),void 0!==this.renderConfig.focusable&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var i=W("clipPath"),a=W("rect");a.setAttribute("width",t.w),a.setAttribute("height",t.h),a.setAttribute("x",0),a.setAttribute("y",0);var r=I();i.setAttribute("id",r),i.appendChild(a),this.layerElement.setAttribute("clip-path","url("+s()+"#"+r+")"),e.appendChild(i),this.layers=t.layers,this.elements=l(t.layers.length)},Ci.prototype.destroy=function(){var t;this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var e=this.layers?this.layers.length:0;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},Ci.prototype.updateContainerSize=function(){},Ci.prototype.findIndexByInd=function(t){var e=0,i=this.layers.length;for(e=0;e<i;e+=1)if(this.layers[e].ind===t)return e;return-1},Ci.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!==this.layers[t].ty){e[t]=!0;var i=this.createItem(this.layers[t]);if(e[t]=i,N()&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(i),i.initExpressions()),this.appendElementInPos(i,t),this.layers[t].tt){var s="tp"in this.layers[t]?this.findIndexByInd(this.layers[t].tp):t-1;if(-1===s)return;if(this.elements[s]&&!0!==this.elements[s]){var a=e[s].getMatte(this.layers[t].tt);i.setMatte(a)}else this.buildItem(s),this.addPendingElement(i)}}},Ci.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,i=this.elements.length;e<i;){if(this.elements[e]===t){var s="tp"in t.data?this.findIndexByInd(t.data.tp):e-1,a=this.elements[s].getMatte(this.layers[e].tt);t.setMatte(a);break}e+=1}}},Ci.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){var e;null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var i=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=i-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<i;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},Ci.prototype.appendElementInPos=function(t,e){var i=t.getBaseElement();if(i){for(var s,a=0;a<e;)this.elements[a]&&!0!==this.elements[a]&&this.elements[a].getBaseElement()&&(s=this.elements[a].getBaseElement()),a+=1;s?this.layerElement.insertBefore(i,s):this.layerElement.appendChild(i)}},Ci.prototype.hide=function(){this.layerElement.style.display="none"},Ci.prototype.show=function(){this.layerElement.style.display="block"},r([Re,je,Ue,ze,Ze],Mi),Mi.prototype.initElement=function(t,e,i){this.initFrame(),this.initBaseData(t,e,i),this.initTransform(t,e,i),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},Mi.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var i,s=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),i=s-1;i>=0;i-=1)(this.completeLayers||this.elements[i])&&(this.elements[i].prepareFrame(this.renderedFrame-this.layers[i].st),this.elements[i]._mdf&&(this._mdf=!0))}},Mi.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},Mi.prototype.setElements=function(t){this.elements=t},Mi.prototype.getElements=function(){return this.elements},Mi.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},Mi.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},r([Ci,Mi,Je],Ti),Ti.prototype.createComp=function(t){return new Ti(t,this.globalData,this)},r([Ci],Fi),Fi.prototype.createComp=function(t){return new Ti(t,this.globalData,this)},Ai=Fi,U["svg"]=Ai,Nt.registerModifier("tm",qt),Nt.registerModifier("pb",jt),Nt.registerModifier("rp",Xt),Nt.registerModifier("rd",Ht),Nt.registerModifier("zz",he),Nt.registerModifier("op",be),It}));
ddiff --git a/public/assets/vendor/splitting/splitting-cells.css b/public/assets/vendor/splitting/splitting-cells.css
ddeleted file mode 100644
iindex 1c9017f..0000000
---- a/public/assets/vendor/splitting/splitting-cells.css
++++ /dev/null
@@@ -1,56 +0,0 @@
--.splitting.cells img { width: 100%; display: block; }
--
--@supports ( display: grid ) {
-- .splitting.cells {
-- position: relative;
-- overflow: hidden;
-- background-size: cover;
-- visibility: hidden;
-- }
--
-- .splitting .cell-grid {
-- background: inherit;
-- position: absolute;
-- top: 0;
-- left: 0;
-- width: 100%;
-- height: 100%;
-- display: grid;
-- grid-template: repeat( var(--row-total), 1fr ) / repeat( var(--col-total), 1fr );
-- }
--
-- .splitting .cell {
-- background: inherit;
-- position: relative;
-- overflow: hidden;
-- }
--
-- .splitting .cell-inner {
-- background: inherit;
-- position: absolute;
-- visibility: visible;
-- /* Size to fit the whole container size */
-- width: calc(100% * var(--col-total));
-- height: calc(100% * var(--row-total));
-- /* Position properly */
-- left: calc(-100% * var(--col-index));
-- top: calc(-100% * var(--row-index));
-- }
--
-- /* Helper variables for advanced effects */
-- .splitting .cell {
-- --center-x: calc((var(--col-total) - 1) / 2);
-- --center-y: calc((var(--row-total) - 1) / 2);
--
-- /* Offset from center, positive & negative */
-- --offset-x: calc(var(--col-index) - var(--center-x));
-- --offset-y: calc(var(--row-index) - var(--center-y));
--
-- /* Absolute distance from center, only positive */
-- --distance-x: calc( (var(--offset-x) * var(--offset-x)) / var(--center-x) );
--
-- /* Absolute distance from center, only positive */
-- --distance-y: calc( (var(--offset-y) * var(--offset-y)) / var(--center-y) );
-- }
--}
--
ddiff --git a/public/assets/vendor/splitting/splitting.css b/public/assets/vendor/splitting/splitting.css
ddeleted file mode 100644
iindex b7d2792..0000000
---- a/public/assets/vendor/splitting/splitting.css
++++ /dev/null
@@@ -1,66 +0,0 @@
--/* Recommended styles for Splitting */
--.splitting .word,
--.splitting .char {
-- display: inline-block;
--}
--
--/* Psuedo-element chars */
--.splitting .char {
-- position: relative;
--}
--
--/**
-- * Populate the psuedo elements with the character to allow for expanded effects
-- * Set to `display: none` by default; just add `display: block` when you want
-- * to use the psuedo elements
-- */
--.splitting .char::before,
--.splitting .char::after {
-- content: attr(data-char);
-- position: absolute;
-- top: 0;
-- left: 0;
-- visibility: hidden;
-- transition: inherit;
-- user-select: none;
--}
--
--/* Expanded CSS Variables */
--
--.splitting {
-- /* The center word index */
-- --word-center: calc((var(--word-total) - 1) / 2);
--
-- /* The center character index */
-- --char-center: calc((var(--char-total) - 1) / 2);
--
-- /* The center character index */
-- --line-center: calc((var(--line-total) - 1) / 2);
--}
--
--.splitting .word {
-- /* Pecent (0-1) of the word's position */
-- --word-percent: calc(var(--word-index) / var(--word-total));
--
-- /* Pecent (0-1) of the line's position */
-- --line-percent: calc(var(--line-index) / var(--line-total));
--}
--
--.splitting .char {
-- /* Percent (0-1) of the char's position */
-- --char-percent: calc(var(--char-index) / var(--char-total));
--
-- /* Offset from center, positive & negative */
-- --char-offset: calc(var(--char-index) - var(--char-center));
--
-- /* Absolute distance from center, only positive */
-- --distance: calc(
-- (var(--char-offset) * var(--char-offset)) / var(--char-center)
-- );
--
-- /* Distance from center where -1 is the far left, 0 is center, 1 is far right */
-- --distance-sine: calc(var(--char-offset) / var(--char-center));
--
-- /* Distance from center where 1 is far left/far right, 0 is center */
-- --distance-percent: calc((var(--distance) / var(--char-center)));
--}
ddiff --git a/public/assets/vendor/splitting/splitting.min.js b/public/assets/vendor/splitting/splitting.min.js
ddeleted file mode 100644
iindex b369cf4..0000000
---- a/public/assets/vendor/splitting/splitting.min.js
++++ /dev/null
@@@ -1,37 +0,0 @@
--!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):n.Splitting=t()}(this,function(){"use strict"
--var u=document,l=u.createTextNode.bind(u)
--function d(n,t,e){n.style.setProperty(t,e)}function f(n,t){return n.appendChild(t)}function p(n,t,e,r){var i=u.createElement("span")
--return t&&(i.className=t),e&&(!r&&i.setAttribute("data-"+t,e),i.textContent=e),n&&f(n,i)||i}function h(n,t){return n.getAttribute("data-"+t)}function m(n,t){return n&&0!=n.length?n.nodeName?[n]:[].slice.call(n[0].nodeName?n:(t||u).querySelectorAll(n)):[]}function o(n){for(var t=[];n--;)t[n]=[]
--return t}function g(n,t){n&&n.some(t)}function c(t){return function(n){return t[n]}}var a={}
--function n(n,t,e,r){return{by:n,depends:t,key:e,split:r}}function e(n){return function t(e,n,r){var i=r.indexOf(e)
--if(-1==i)r.unshift(e),g(a[e].depends,function(n){t(n,e,r)})
--else{var u=r.indexOf(n)
--r.splice(i,1),r.splice(u,0,e)}return r}(n,0,[]).map(c(a))}function t(n){a[n.by]=n}function v(n,r,i,u,o){n.normalize()
--var c=[],a=document.createDocumentFragment()
--u&&c.push(n.previousSibling)
--var s=[]
--return m(n.childNodes).some(function(n){if(!n.tagName||n.hasChildNodes()){if(n.childNodes&&n.childNodes.length)return s.push(n),void c.push.apply(c,v(n,r,i,u,o))
--var t=n.wholeText||"",e=t.trim()
--e.length&&(" "===t[0]&&s.push(l(" ")),g(e.split(i),function(n,t){t&&o&&s.push(p(a,"whitespace"," ",o))
--var e=p(a,r,n)
--c.push(e),s.push(e)})," "===t[t.length-1]&&s.push(l(" ")))}else s.push(n)}),g(s,function(n){f(a,n)}),n.innerHTML="",f(n,a),c}var s=0
--var i="words",r=n(i,s,"word",function(n){return v(n,"word",/\s+/,0,1)}),y="chars",w=n(y,[i],"char",function(n,e,t){var r=[]
--return g(t[i],function(n,t){r.push.apply(r,v(n,"char","",e.whitespace&&t))}),r})
--function b(t){var f=(t=t||{}).key
--return m(t.target||"[data-splitting]").map(function(a){var s=a["🍌"]
--if(!t.force&&s)return s
--s=a["🍌"]={el:a}
--var n=e(t.by||h(a,"splitting")||y),l=function(n,t){for(var e in t)n[e]=t[e]
--return n}({},t)
--return g(n,function(n){if(n.split){var t=n.by,e=(f?"-"+f:"")+n.key,r=n.split(a,l,s)
--e&&(i=a,c=(o="--"+e)+"-index",g(u=r,function(n,t){Array.isArray(n)?g(n,function(n){d(n,c,t)}):d(n,c,t)}),d(i,o+"-total",u.length)),s[t]=r,a.classList.add(t)}var i,u,o,c}),a.classList.add("splitting"),s})}function N(n,t,e){var r=m(t.matching||n.children,n),i={}
--return g(r,function(n){var t=Math.round(n[e]);(i[t]||(i[t]=[])).push(n)}),Object.keys(i).map(Number).sort(x).map(c(i))}function x(n,t){return n-t}b.html=function(n){var t=(n=n||{}).target=p()
--return t.innerHTML=n.content,b(n),t.outerHTML},b.add=t
--var T=n("lines",[i],"line",function(n,t,e){return N(n,{matching:e[i]},"offsetTop")}),L=n("items",s,"item",function(n,t){return m(t.matching||n.children,n)}),k=n("rows",s,"row",function(n,t){return N(n,t,"offsetTop")}),A=n("cols",s,"col",function(n,t){return N(n,t,"offsetLeft")}),C=n("grid",["rows","cols"]),M="layout",S=n(M,s,s,function(n,t){var e=t.rows=+(t.rows||h(n,"rows")||1),r=t.columns=+(t.columns||h(n,"columns")||1)
--if(t.image=t.image||h(n,"image")||n.currentSrc||n.src,t.image){var i=m("img",n)[0]
--t.image=i&&(i.currentSrc||i.src)}t.image&&d(n,"background-image","url("+t.image+")")
--for(var u=e*r,o=[],c=p(s,"cell-grid");u--;){var a=p(c,"cell")
--p(a,"cell-inner"),o.push(a)}return f(n,c),o}),H=n("cellRows",[M],"row",function(n,t,e){var r=t.rows,i=o(r)
--return g(e[M],function(n,t,e){i[Math.floor(t/(e.length/r))].push(n)}),i}),O=n("cellColumns",[M],"col",function(n,t,e){var r=t.columns,i=o(r)
--return g(e[M],function(n,t){i[t%r].push(n)}),i}),j=n("cells",["cellRows","cellColumns"],"cell",function(n,t,e){return e[M]})
--return t(r),t(w),t(T),t(L),t(k),t(A),t(C),t(S),t(H),t(O),t(j),b})
ddiff --git a/public/assets/vendor/swiper/swiper-bundle.min.css b/public/assets/vendor/swiper/swiper-bundle.min.css
ddeleted file mode 100644
iindex 53b5c80..0000000
---- a/public/assets/vendor/swiper/swiper-bundle.min.css
++++ /dev/null
@@@ -1,13 +0,0 @@
--/**
-- * Swiper 11.1.14
-- * Most modern mobile touch slider and framework with hardware accelerated transitions
-- * https://swiperjs.com
-- *
-- * Copyright 2014-2024 Vladimir Kharlampidi
-- *
-- * Released under the MIT License
-- *
-- * Released on: September 12, 2024
-- */
--
--@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next svg,.swiper-button-prev svg{width:100%;height:100%;object-fit:contain;transform-origin:center}.swiper-rtl .swiper-button-next svg,.swiper-rtl .swiper-button-prev svg{transform:rotate(180deg)}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-lock{display:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:'prev'}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:'next'}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);top:var(--swiper-pagination-top,auto);left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:var(--swiper-pagination-bullet-border-radius,50%);background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:var(--swiper-pagination-right,8px);left:var(--swiper-pagination-left,auto);top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,rgba(0,0,0,.25));position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:var(--swiper-pagination-progressbar-size,4px);height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move;touch-action:none}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active{pointer-events:auto}.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube .swiper-slide-next+.swiper-slide{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden}
\\ No newline at end of file
ddiff --git a/public/assets/vendor/swiper/swiper-bundle.min.js b/public/assets/vendor/swiper/swiper-bundle.min.js
ddeleted file mode 100644
iindex b1694e1..0000000
---- a/public/assets/vendor/swiper/swiper-bundle.min.js
++++ /dev/null
@@@ -1,14 +0,0 @@
--/**
-- * Swiper 11.1.14
-- * Most modern mobile touch slider and framework with hardware accelerated transitions
-- * https://swiperjs.com
-- *
-- * Copyright 2014-2024 Vladimir Kharlampidi
-- *
-- * Released under the MIT License
-- *
-- * Released on: September 12, 2024
-- */
--
--var Swiper=function(){"use strict";function e(e){return null!==e&&"object"==typeof e&&"constructor"in e&&e.constructor===Object}function t(s,a){void 0===s&&(s={}),void 0===a&&(a={}),Object.keys(a).forEach((i=>{void 0===s[i]?s[i]=a[i]:e(a[i])&&e(s[i])&&Object.keys(a[i]).length>0&&t(s[i],a[i])}))}const s={body:{},addEventListener(){},removeEventListener(){},activeElement:{blur(){},nodeName:""},querySelector:()=>null,querySelectorAll:()=>[],getElementById:()=>null,createEvent:()=>({initEvent(){}}),createElement:()=>({children:[],childNodes:[],style:{},setAttribute(){},getElementsByTagName:()=>[]}),createElementNS:()=>({}),importNode:()=>null,location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function a(){const e="undefined"!=typeof document?document:{};return t(e,s),e}const i={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState(){},pushState(){},go(){},back(){}},CustomEvent:function(){return this},addEventListener(){},removeEventListener(){},getComputedStyle:()=>({getPropertyValue:()=>""}),Image(){},Date(){},screen:{},setTimeout(){},clearTimeout(){},matchMedia:()=>({}),requestAnimationFrame:e=>"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0),cancelAnimationFrame(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function r(){const e="undefined"!=typeof window?window:{};return t(e,i),e}function n(e){return void 0===e&&(e=""),e.trim().split(" ").filter((e=>!!e.trim()))}function l(e,t){return void 0===t&&(t=0),setTimeout(e,t)}function o(){return Date.now()}function d(e,t){void 0===t&&(t="x");const s=r();let a,i,n;const l=function(e){const t=r();let s;return t.getComputedStyle&&(s=t.getComputedStyle(e,null)),!s&&e.currentStyle&&(s=e.currentStyle),s||(s=e.style),s}(e);return s.WebKitCSSMatrix?(i=l.transform||l.webkitTransform,i.split(",").length>6&&(i=i.split(", ").map((e=>e.replace(",","."))).join(", ")),n=new s.WebKitCSSMatrix("none"===i?"":i)):(n=l.MozTransform||l.OTransform||l.MsTransform||l.msTransform||l.transform||l.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,"),a=n.toString().split(",")),"x"===t&&(i=s.WebKitCSSMatrix?n.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=s.WebKitCSSMatrix?n.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function c(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function p(){const e=Object(arguments.length<=0?void 0:arguments[0]),t=["__proto__","constructor","prototype"];for(let a=1;a<arguments.length;a+=1){const i=a<0||arguments.length<=a?void 0:arguments[a];if(null!=i&&(s=i,!("undefined"!=typeof window&&void 0!==window.HTMLElement?s instanceof HTMLElement:s&&(1===s.nodeType||11===s.nodeType)))){const s=Object.keys(Object(i)).filter((e=>t.indexOf(e)<0));for(let t=0,a=s.length;t<a;t+=1){const a=s[t],r=Object.getOwnPropertyDescriptor(i,a);void 0!==r&&r.enumerable&&(c(e[a])&&c(i[a])?i[a].__swiper__?e[a]=i[a]:p(e[a],i[a]):!c(e[a])&&c(i[a])?(e[a]={},i[a].__swiper__?e[a]=i[a]:p(e[a],i[a])):e[a]=i[a])}}}var s;return e}function u(e,t,s){e.style.setProperty(t,s)}function m(e){let{swiper:t,targetPosition:s,side:a}=e;const i=r(),n=-t.translate;let l,o=null;const d=t.params.speed;t.wrapperEl.style.scrollSnapType="none",i.cancelAnimationFrame(t.cssModeFrameID);const c=s>n?"next":"prev",p=(e,t)=>"next"===c&&e>=t||"prev"===c&&e<=t,u=()=>{l=(new Date).getTime(),null===o&&(o=l);const e=Math.max(Math.min((l-o)/d,1),0),r=.5-Math.cos(e*Math.PI)/2;let c=n+r*(s-n);if(p(c,s)&&(c=s),t.wrapperEl.scrollTo({[a]:c}),p(c,s))return t.wrapperEl.style.overflow="hidden",t.wrapperEl.style.scrollSnapType="",setTimeout((()=>{t.wrapperEl.style.overflow="",t.wrapperEl.scrollTo({[a]:c})})),void i.cancelAnimationFrame(t.cssModeFrameID);t.cssModeFrameID=i.requestAnimationFrame(u)};u()}function h(e){return e.querySelector(".swiper-slide-transform")||e.shadowRoot&&e.shadowRoot.querySelector(".swiper-slide-transform")||e}function f(e,t){void 0===t&&(t="");const s=[...e.children];return e instanceof HTMLSlotElement&&s.push(...e.assignedElements()),t?s.filter((e=>e.matches(t))):s}function g(e){try{return void console.warn(e)}catch(e){}}function v(e,t){void 0===t&&(t=[]);const s=document.createElement(e);return s.classList.add(...Array.isArray(t)?t:n(t)),s}function w(e){const t=r(),s=a(),i=e.getBoundingClientRect(),n=s.body,l=e.clientTop||n.clientTop||0,o=e.clientLeft||n.clientLeft||0,d=e===t?t.scrollY:e.scrollTop,c=e===t?t.scrollX:e.scrollLeft;return{top:i.top+d-l,left:i.left+c-o}}function b(e,t){return r().getComputedStyle(e,null).getPropertyValue(t)}function y(e){let t,s=e;if(s){for(t=0;null!==(s=s.previousSibling);)1===s.nodeType&&(t+=1);return t}}function E(e,t){const s=[];let a=e.parentElement;for(;a;)t?a.matches(t)&&s.push(a):s.push(a),a=a.parentElement;return s}function x(e,t){t&&e.addEventListener("transitionend",(function s(a){a.target===e&&(t.call(e,a),e.removeEventListener("transitionend",s))}))}function S(e,t,s){const a=r();return s?e["width"===t?"offsetWidth":"offsetHeight"]+parseFloat(a.getComputedStyle(e,null).getPropertyValue("width"===t?"margin-right":"margin-top"))+parseFloat(a.getComputedStyle(e,null).getPropertyValue("width"===t?"margin-left":"margin-bottom")):e.offsetWidth}function T(e){return(Array.isArray(e)?e:[e]).filter((e=>!!e))}function M(e){return t=>Math.abs(t)>0&&e.browser&&e.browser.need3dFix&&Math.abs(t)%90==0?t+.001:t}let C,P,L;function I(){return C||(C=function(){const e=r(),t=a();return{smoothScroll:t.documentElement&&t.documentElement.style&&"scrollBehavior"in t.documentElement.style,touch:!!("ontouchstart"in e||e.DocumentTouch&&t instanceof e.DocumentTouch)}}()),C}function z(e){return void 0===e&&(e={}),P||(P=function(e){let{userAgent:t}=void 0===e?{}:e;const s=I(),a=r(),i=a.navigator.platform,n=t||a.navigator.userAgent,l={ios:!1,android:!1},o=a.screen.width,d=a.screen.height,c=n.match(/(Android);?[\s\/]+([\d.]+)?/);let p=n.match(/(iPad).*OS\s([\d_]+)/);const u=n.match(/(iPod)(.*OS\s([\d_]+))?/),m=!p&&n.match(/(iPhone\sOS|iOS)\s([\d_]+)/),h="Win32"===i;let f="MacIntel"===i;return!p&&f&&s.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(`${o}x${d}`)>=0&&(p=n.match(/(Version)\/([\d.]+)/),p||(p=[0,1,"13_0_0"]),f=!1),c&&!h&&(l.os="android",l.android=!0),(p||m||u)&&(l.os="ios",l.ios=!0),l}(e)),P}function A(){return L||(L=function(){const e=r(),t=z();let s=!1;function a(){const t=e.navigator.userAgent.toLowerCase();return t.indexOf("safari")>=0&&t.indexOf("chrome")<0&&t.indexOf("android")<0}if(a()){const t=String(e.navigator.userAgent);if(t.includes("Version/")){const[e,a]=t.split("Version/")[1].split(" ")[0].split(".").map((e=>Number(e)));s=e<16||16===e&&a<2}}const i=/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent),n=a();return{isSafari:s||n,needPerspectiveFix:s,need3dFix:n||i&&t.ios,isWebView:i}}()),L}var $={on(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;const i=s?"unshift":"push";return e.split(" ").forEach((e=>{a.eventsListeners[e]||(a.eventsListeners[e]=[]),a.eventsListeners[e][i](t)})),a},once(e,t,s){const a=this;if(!a.eventsListeners||a.destroyed)return a;if("function"!=typeof t)return a;function i(){a.off(e,i),i.__emitterProxy&&delete i.__emitterProxy;for(var s=arguments.length,r=new Array(s),n=0;n<s;n++)r[n]=arguments[n];t.apply(a,r)}return i.__emitterProxy=t,a.on(e,i,s)},onAny(e,t){const s=this;if(!s.eventsListeners||s.destroyed)return s;if("function"!=typeof e)return s;const a=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[a](e),s},offAny(e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return!s.eventsListeners||s.destroyed?s:s.eventsListeners?(e.split(" ").forEach((e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach(((a,i)=>{(a===t||a.__emitterProxy&&a.__emitterProxy===t)&&s.eventsListeners[e].splice(i,1)}))})),s):s},emit(){const e=this;if(!e.eventsListeners||e.destroyed)return e;if(!e.eventsListeners)return e;let t,s,a;for(var i=arguments.length,r=new Array(i),n=0;n<i;n++)r[n]=arguments[n];"string"==typeof r[0]||Array.isArray(r[0])?(t=r[0],s=r.slice(1,r.length),a=e):(t=r[0].events,s=r[0].data,a=r[0].context||e),s.unshift(a);return(Array.isArray(t)?t:t.split(" ")).forEach((t=>{e.eventsAnyListeners&&e.eventsAnyListeners.length&&e.eventsAnyListeners.forEach((e=>{e.apply(a,[t,...s])})),e.eventsListeners&&e.eventsListeners[t]&&e.eventsListeners[t].forEach((e=>{e.apply(a,s)}))})),e}};const k=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};const O=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};const D=(e,t)=>{if(!e||e.destroyed||!e.params)return;const s=t.closest(e.isElement?"swiper-slide":`.${e.params.slideClass}`);if(s){let t=s.querySelector(`.${e.params.lazyPreloaderClass}`);!t&&e.isElement&&(s.shadowRoot?t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`):requestAnimationFrame((()=>{s.shadowRoot&&(t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`),t&&t.remove())}))),t&&t.remove()}},G=(e,t)=>{if(!e.slides[t])return;const s=e.slides[t].querySelector('[loading="lazy"]');s&&s.removeAttribute("loading")},H=e=>{if(!e||e.destroyed||!e.params)return;let t=e.params.lazyPreloadPrevNext;const s=e.slides.length;if(!s||!t||t<0)return;t=Math.min(t,s);const a="auto"===e.params.slidesPerView?e.slidesPerViewDynamic():Math.ceil(e.params.slidesPerView),i=e.activeIndex;if(e.params.grid&&e.params.grid.rows>1){const s=i,r=[s-t];return r.push(...Array.from({length:t}).map(((e,t)=>s+a+t))),void e.slides.forEach(((t,s)=>{r.includes(t.column)&&G(e,s)}))}const r=i+a-1;if(e.params.rewind||e.params.loop)for(let a=i-t;a<=r+t;a+=1){const t=(a%s+s)%s;(t<i||t>r)&&G(e,t)}else for(let a=Math.max(i-t,0);a<=Math.min(r+t,s-1);a+=1)a!==i&&(a>r||a<i)&&G(e,a)};var B={updateSize:function(){const e=this;let t,s;const a=e.el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:a.clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:a.clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(b(a,"padding-left")||0,10)-parseInt(b(a,"padding-right")||0,10),s=s-parseInt(b(a,"padding-top")||0,10)-parseInt(b(a,"padding-bottom")||0,10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t,s){return parseFloat(t.getPropertyValue(e.getDirectionLabel(s))||0)}const s=e.params,{wrapperEl:a,slidesEl:i,size:r,rtlTranslate:n,wrongRTL:l}=e,o=e.virtual&&s.virtual.enabled,d=o?e.virtual.slides.length:e.slides.length,c=f(i,`.${e.params.slideClass}, swiper-slide`),p=o?e.virtual.slides.length:c.length;let m=[];const h=[],g=[];let v=s.slidesOffsetBefore;"function"==typeof v&&(v=s.slidesOffsetBefore.call(e));let w=s.slidesOffsetAfter;"function"==typeof w&&(w=s.slidesOffsetAfter.call(e));const y=e.snapGrid.length,E=e.slidesGrid.length;let x=s.spaceBetween,T=-v,M=0,C=0;if(void 0===r)return;"string"==typeof x&&x.indexOf("%")>=0?x=parseFloat(x.replace("%",""))/100*r:"string"==typeof x&&(x=parseFloat(x)),e.virtualSize=-x,c.forEach((e=>{n?e.style.marginLeft="":e.style.marginRight="",e.style.marginBottom="",e.style.marginTop=""})),s.centeredSlides&&s.cssMode&&(u(a,"--swiper-centered-offset-before",""),u(a,"--swiper-centered-offset-after",""));const P=s.grid&&s.grid.rows>1&&e.grid;let L;P?e.grid.initSlides(c):e.grid&&e.grid.unsetSlides();const I="auto"===s.slidesPerView&&s.breakpoints&&Object.keys(s.breakpoints).filter((e=>void 0!==s.breakpoints[e].slidesPerView)).length>0;for(let a=0;a<p;a+=1){let i;if(L=0,c[a]&&(i=c[a]),P&&e.grid.updateSlide(a,i,c),!c[a]||"none"!==b(i,"display")){if("auto"===s.slidesPerView){I&&(c[a].style[e.getDirectionLabel("width")]="");const r=getComputedStyle(i),n=i.style.transform,l=i.style.webkitTransform;if(n&&(i.style.transform="none"),l&&(i.style.webkitTransform="none"),s.roundLengths)L=e.isHorizontal()?S(i,"width",!0):S(i,"height",!0);else{const e=t(r,"width"),s=t(r,"padding-left"),a=t(r,"padding-right"),n=t(r,"margin-left"),l=t(r,"margin-right"),o=r.getPropertyValue("box-sizing");if(o&&"border-box"===o)L=e+n+l;else{const{clientWidth:t,offsetWidth:r}=i;L=e+s+a+n+l+(r-t)}}n&&(i.style.transform=n),l&&(i.style.webkitTransform=l),s.roundLengths&&(L=Math.floor(L))}else L=(r-(s.slidesPerView-1)*x)/s.slidesPerView,s.roundLengths&&(L=Math.floor(L)),c[a]&&(c[a].style[e.getDirectionLabel("width")]=`${L}px`);c[a]&&(c[a].swiperSlideSize=L),g.push(L),s.centeredSlides?(T=T+L/2+M/2+x,0===M&&0!==a&&(T=T-r/2-x),0===a&&(T=T-r/2-x),Math.abs(T)<.001&&(T=0),s.roundLengths&&(T=Math.floor(T)),C%s.slidesPerGroup==0&&m.push(T),h.push(T)):(s.roundLengths&&(T=Math.floor(T)),(C-Math.min(e.params.slidesPerGroupSkip,C))%e.params.slidesPerGroup==0&&m.push(T),h.push(T),T=T+L+x),e.virtualSize+=L+x,M=L,C+=1}}if(e.virtualSize=Math.max(e.virtualSize,r)+w,n&&l&&("slide"===s.effect||"coverflow"===s.effect)&&(a.style.width=`${e.virtualSize+x}px`),s.setWrapperSize&&(a.style[e.getDirectionLabel("width")]=`${e.virtualSize+x}px`),P&&e.grid.updateWrapperSize(L,m),!s.centeredSlides){const t=[];for(let a=0;a<m.length;a+=1){let i=m[a];s.roundLengths&&(i=Math.floor(i)),m[a]<=e.virtualSize-r&&t.push(i)}m=t,Math.floor(e.virtualSize-r)-Math.floor(m[m.length-1])>1&&m.push(e.virtualSize-r)}if(o&&s.loop){const t=g[0]+x;if(s.slidesPerGroup>1){const a=Math.ceil((e.virtual.slidesBefore+e.virtual.slidesAfter)/s.slidesPerGroup),i=t*s.slidesPerGroup;for(let e=0;e<a;e+=1)m.push(m[m.length-1]+i)}for(let a=0;a<e.virtual.slidesBefore+e.virtual.slidesAfter;a+=1)1===s.slidesPerGroup&&m.push(m[m.length-1]+t),h.push(h[h.length-1]+t),e.virtualSize+=t}if(0===m.length&&(m=[0]),0!==x){const t=e.isHorizontal()&&n?"marginLeft":e.getDirectionLabel("marginRight");c.filter(((e,t)=>!(s.cssMode&&!s.loop)||t!==c.length-1)).forEach((e=>{e.style[t]=`${x}px`}))}if(s.centeredSlides&&s.centeredSlidesBounds){let e=0;g.forEach((t=>{e+=t+(x||0)})),e-=x;const t=e>r?e-r:0;m=m.map((e=>e<=0?-v:e>t?t+w:e))}if(s.centerInsufficientSlides){let e=0;g.forEach((t=>{e+=t+(x||0)})),e-=x;const t=(s.slidesOffsetBefore||0)+(s.slidesOffsetAfter||0);if(e+t<r){const s=(r-e-t)/2;m.forEach(((e,t)=>{m[t]=e-s})),h.forEach(((e,t)=>{h[t]=e+s}))}}if(Object.assign(e,{slides:c,snapGrid:m,slidesGrid:h,slidesSizesGrid:g}),s.centeredSlides&&s.cssMode&&!s.centeredSlidesBounds){u(a,"--swiper-centered-offset-before",-m[0]+"px"),u(a,"--swiper-centered-offset-after",e.size/2-g[g.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map((e=>e+t)),e.slidesGrid=e.slidesGrid.map((e=>e+s))}if(p!==d&&e.emit("slidesLengthChange"),m.length!==y&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),h.length!==E&&e.emit("slidesGridLengthChange"),s.watchSlidesProgress&&e.updateSlidesOffset(),e.emit("slidesUpdated"),!(o||s.cssMode||"slide"!==s.effect&&"fade"!==s.effect)){const t=`${s.containerModifierClass}backface-hidden`,a=e.el.classList.contains(t);p<=s.maxBackfaceHiddenSlides?a||e.el.classList.add(t):a&&e.el.classList.remove(t)}},updateAutoHeight:function(e){const t=this,s=[],a=t.virtual&&t.params.virtual.enabled;let i,r=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>a?t.slides[t.getSlideIndexByData(e)]:t.slides[e];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)(t.visibleSlides||[]).forEach((e=>{s.push(e)}));else for(i=0;i<Math.ceil(t.params.slidesPerView);i+=1){const e=t.activeIndex+i;if(e>t.slides.length&&!a)break;s.push(n(e))}else s.push(n(t.activeIndex));for(i=0;i<s.length;i+=1)if(void 0!==s[i]){const e=s[i].offsetHeight;r=e>r?e:r}(r||0===r)&&(t.wrapperEl.style.height=`${r}px`)},updateSlidesOffset:function(){const e=this,t=e.slides,s=e.isElement?e.isHorizontal()?e.wrapperEl.offsetLeft:e.wrapperEl.offsetTop:0;for(let a=0;a<t.length;a+=1)t[a].swiperSlideOffset=(e.isHorizontal()?t[a].offsetLeft:t[a].offsetTop)-s-e.cssOverflowAdjustment()},updateSlidesProgress:function(e){void 0===e&&(e=this&&this.translate||0);const t=this,s=t.params,{slides:a,rtlTranslate:i,snapGrid:r}=t;if(0===a.length)return;void 0===a[0].swiperSlideOffset&&t.updateSlidesOffset();let n=-e;i&&(n=e),t.visibleSlidesIndexes=[],t.visibleSlides=[];let l=s.spaceBetween;"string"==typeof l&&l.indexOf("%")>=0?l=parseFloat(l.replace("%",""))/100*t.size:"string"==typeof l&&(l=parseFloat(l));for(let e=0;e<a.length;e+=1){const o=a[e];let d=o.swiperSlideOffset;s.cssMode&&s.centeredSlides&&(d-=a[0].swiperSlideOffset);const c=(n+(s.centeredSlides?t.minTranslate():0)-d)/(o.swiperSlideSize+l),p=(n-r[0]+(s.centeredSlides?t.minTranslate():0)-d)/(o.swiperSlideSize+l),u=-(n-d),m=u+t.slidesSizesGrid[e],h=u>=0&&u<=t.size-t.slidesSizesGrid[e],f=u>=0&&u<t.size-1||m>1&&m<=t.size||u<=0&&m>=t.size;f&&(t.visibleSlides.push(o),t.visibleSlidesIndexes.push(e)),k(o,f,s.slideVisibleClass),k(o,h,s.slideFullyVisibleClass),o.progress=i?-c:c,o.originalProgress=i?-p:p}},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,a=t.maxTranslate()-t.minTranslate();let{progress:i,isBeginning:r,isEnd:n,progressLoop:l}=t;const o=r,d=n;if(0===a)i=0,r=!0,n=!0;else{i=(e-t.minTranslate())/a;const s=Math.abs(e-t.minTranslate())<1,l=Math.abs(e-t.maxTranslate())<1;r=s||i<=0,n=l||i>=1,s&&(i=0),l&&(i=1)}if(s.loop){const s=t.getSlideIndexByData(0),a=t.getSlideIndexByData(t.slides.length-1),i=t.slidesGrid[s],r=t.slidesGrid[a],n=t.slidesGrid[t.slidesGrid.length-1],o=Math.abs(e);l=o>=i?(o-i)/n:(o+n-r)/n,l>1&&(l-=1)}Object.assign(t,{progress:i,progressLoop:l,isBeginning:r,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),r&&!o&&t.emit("reachBeginning toEdge"),n&&!d&&t.emit("reachEnd toEdge"),(o&&!r||d&&!n)&&t.emit("fromEdge"),t.emit("progress",i)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,slidesEl:a,activeIndex:i}=e,r=e.virtual&&s.virtual.enabled,n=e.grid&&s.grid&&s.grid.rows>1,l=e=>f(a,`.${s.slideClass}${e}, swiper-slide${e}`)[0];let o,d,c;if(r)if(s.loop){let t=i-e.virtual.slidesBefore;t<0&&(t=e.virtual.slides.length+t),t>=e.virtual.slides.length&&(t-=e.virtual.slides.length),o=l(`[data-swiper-slide-index="${t}"]`)}else o=l(`[data-swiper-slide-index="${i}"]`);else n?(o=t.filter((e=>e.column===i))[0],c=t.filter((e=>e.column===i+1))[0],d=t.filter((e=>e.column===i-1))[0]):o=t[i];o&&(n||(c=function(e,t){const s=[];for(;e.nextElementSibling;){const a=e.nextElementSibling;t?a.matches(t)&&s.push(a):s.push(a),e=a}return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&!c&&(c=t[0]),d=function(e,t){const s=[];for(;e.previousElementSibling;){const a=e.previousElementSibling;t?a.matches(t)&&s.push(a):s.push(a),e=a}return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&0===!d&&(d=t[t.length-1]))),t.forEach((e=>{O(e,e===o,s.slideActiveClass),O(e,e===c,s.slideNextClass),O(e,e===d,s.slidePrevClass)})),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{snapGrid:a,params:i,activeIndex:r,realIndex:n,snapIndex:l}=t;let o,d=e;const c=e=>{let s=e-t.virtual.slidesBefore;return s<0&&(s=t.virtual.slides.length+s),s>=t.virtual.slides.length&&(s-=t.virtual.slides.length),s};if(void 0===d&&(d=function(e){const{slidesGrid:t,params:s}=e,a=e.rtlTranslate?e.translate:-e.translate;let i;for(let e=0;e<t.length;e+=1)void 0!==t[e+1]?a>=t[e]&&a<t[e+1]-(t[e+1]-t[e])/2?i=e:a>=t[e]&&a<t[e+1]&&(i=e+1):a>=t[e]&&(i=e);return s.normalizeSlideIndex&&(i<0||void 0===i)&&(i=0),i}(t)),a.indexOf(s)>=0)o=a.indexOf(s);else{const e=Math.min(i.slidesPerGroupSkip,d);o=e+Math.floor((d-e)/i.slidesPerGroup)}if(o>=a.length&&(o=a.length-1),d===r&&!t.params.loop)return void(o!==l&&(t.snapIndex=o,t.emit("snapIndexChange")));if(d===r&&t.params.loop&&t.virtual&&t.params.virtual.enabled)return void(t.realIndex=c(d));const p=t.grid&&i.grid&&i.grid.rows>1;let u;if(t.virtual&&i.virtual.enabled&&i.loop)u=c(d);else if(p){const e=t.slides.filter((e=>e.column===d))[0];let s=parseInt(e.getAttribute("data-swiper-slide-index"),10);Number.isNaN(s)&&(s=Math.max(t.slides.indexOf(e),0)),u=Math.floor(s/i.grid.rows)}else if(t.slides[d]){const e=t.slides[d].getAttribute("data-swiper-slide-index");u=e?parseInt(e,10):d}else u=d;Object.assign(t,{previousSnapIndex:l,snapIndex:o,previousRealIndex:n,realIndex:u,previousIndex:r,activeIndex:d}),t.initialized&&H(t),t.emit("activeIndexChange"),t.emit("snapIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&(n!==u&&t.emit("realIndexChange"),t.emit("slideChange"))},updateClickedSlide:function(e,t){const s=this,a=s.params;let i=e.closest(`.${a.slideClass}, swiper-slide`);!i&&s.isElement&&t&&t.length>1&&t.includes(e)&&[...t.slice(t.indexOf(e)+1,t.length)].forEach((e=>{!i&&e.matches&&e.matches(`.${a.slideClass}, swiper-slide`)&&(i=e)}));let r,n=!1;if(i)for(let e=0;e<s.slides.length;e+=1)if(s.slides[e]===i){n=!0,r=e;break}if(!i||!n)return s.clickedSlide=void 0,void(s.clickedIndex=void 0);s.clickedSlide=i,s.virtual&&s.params.virtual.enabled?s.clickedIndex=parseInt(i.getAttribute("data-swiper-slide-index"),10):s.clickedIndex=r,a.slideToClickedSlide&&void 0!==s.clickedIndex&&s.clickedIndex!==s.activeIndex&&s.slideToClickedSlide()}};var N={getTranslate:function(e){void 0===e&&(e=this.isHorizontal()?"x":"y");const{params:t,rtlTranslate:s,translate:a,wrapperEl:i}=this;if(t.virtualTranslate)return s?-a:a;if(t.cssMode)return a;let r=d(i,e);return r+=this.cssOverflowAdjustment(),s&&(r=-r),r||0},setTranslate:function(e,t){const s=this,{rtlTranslate:a,params:i,wrapperEl:r,progress:n}=s;let l,o=0,d=0;s.isHorizontal()?o=a?-e:e:d=e,i.roundLengths&&(o=Math.floor(o),d=Math.floor(d)),s.previousTranslate=s.translate,s.translate=s.isHorizontal()?o:d,i.cssMode?r[s.isHorizontal()?"scrollLeft":"scrollTop"]=s.isHorizontal()?-o:-d:i.virtualTranslate||(s.isHorizontal()?o-=s.cssOverflowAdjustment():d-=s.cssOverflowAdjustment(),r.style.transform=`translate3d(${o}px, ${d}px, 0px)`);const c=s.maxTranslate()-s.minTranslate();l=0===c?0:(e-s.minTranslate())/c,l!==n&&s.updateProgress(e),s.emit("setTranslate",s.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]},translateTo:function(e,t,s,a,i){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===s&&(s=!0),void 0===a&&(a=!0);const r=this,{params:n,wrapperEl:l}=r;if(r.animating&&n.preventInteractionOnTransition)return!1;const o=r.minTranslate(),d=r.maxTranslate();let c;if(c=a&&e>o?o:a&&e<d?d:e,r.updateProgress(c),n.cssMode){const e=r.isHorizontal();if(0===t)l[e?"scrollLeft":"scrollTop"]=-c;else{if(!r.support.smoothScroll)return m({swiper:r,targetPosition:-c,side:e?"left":"top"}),!0;l.scrollTo({[e?"left":"top"]:-c,behavior:"smooth"})}return!0}return 0===t?(r.setTransition(0),r.setTranslate(c),s&&(r.emit("beforeTransitionStart",t,i),r.emit("transitionEnd"))):(r.setTransition(t),r.setTranslate(c),s&&(r.emit("beforeTransitionStart",t,i),r.emit("transitionStart")),r.animating||(r.animating=!0,r.onTranslateToWrapperTransitionEnd||(r.onTranslateToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.wrapperEl.removeEventListener("transitionend",r.onTranslateToWrapperTransitionEnd),r.onTranslateToWrapperTransitionEnd=null,delete r.onTranslateToWrapperTransitionEnd,r.animating=!1,s&&r.emit("transitionEnd"))}),r.wrapperEl.addEventListener("transitionend",r.onTranslateToWrapperTransitionEnd))),!0}};function X(e){let{swiper:t,runCallbacks:s,direction:a,step:i}=e;const{activeIndex:r,previousIndex:n}=t;let l=a;if(l||(l=r>n?"next":r<n?"prev":"reset"),t.emit(`transition${i}`),s&&r!==n){if("reset"===l)return void t.emit(`slideResetTransition${i}`);t.emit(`slideChangeTransition${i}`),"next"===l?t.emit(`slideNextTransition${i}`):t.emit(`slidePrevTransition${i}`)}}var Y={slideTo:function(e,t,s,a,i){void 0===e&&(e=0),void 0===s&&(s=!0),"string"==typeof e&&(e=parseInt(e,10));const r=this;let n=e;n<0&&(n=0);const{params:l,snapGrid:o,slidesGrid:d,previousIndex:c,activeIndex:p,rtlTranslate:u,wrapperEl:h,enabled:f}=r;if(!f&&!a&&!i||r.destroyed||r.animating&&l.preventInteractionOnTransition)return!1;void 0===t&&(t=r.params.speed);const g=Math.min(r.params.slidesPerGroupSkip,n);let v=g+Math.floor((n-g)/r.params.slidesPerGroup);v>=o.length&&(v=o.length-1);const w=-o[v];if(l.normalizeSlideIndex)for(let e=0;e<d.length;e+=1){const t=-Math.floor(100*w),s=Math.floor(100*d[e]),a=Math.floor(100*d[e+1]);void 0!==d[e+1]?t>=s&&t<a-(a-s)/2?n=e:t>=s&&t<a&&(n=e+1):t>=s&&(n=e)}if(r.initialized&&n!==p){if(!r.allowSlideNext&&(u?w>r.translate&&w>r.minTranslate():w<r.translate&&w<r.minTranslate()))return!1;if(!r.allowSlidePrev&&w>r.translate&&w>r.maxTranslate()&&(p||0)!==n)return!1}let b;n!==(c||0)&&s&&r.emit("beforeSlideChangeStart"),r.updateProgress(w),b=n>p?"next":n<p?"prev":"reset";const y=r.virtual&&r.params.virtual.enabled;if(!(y&&i)&&(u&&-w===r.translate||!u&&w===r.translate))return r.updateActiveIndex(n),l.autoHeight&&r.updateAutoHeight(),r.updateSlidesClasses(),"slide"!==l.effect&&r.setTranslate(w),"reset"!==b&&(r.transitionStart(s,b),r.transitionEnd(s,b)),!1;if(l.cssMode){const e=r.isHorizontal(),s=u?w:-w;if(0===t)y&&(r.wrapperEl.style.scrollSnapType="none",r._immediateVirtual=!0),y&&!r._cssModeVirtualInitialSet&&r.params.initialSlide>0?(r._cssModeVirtualInitialSet=!0,requestAnimationFrame((()=>{h[e?"scrollLeft":"scrollTop"]=s}))):h[e?"scrollLeft":"scrollTop"]=s,y&&requestAnimationFrame((()=>{r.wrapperEl.style.scrollSnapType="",r._immediateVirtual=!1}));else{if(!r.support.smoothScroll)return m({swiper:r,targetPosition:s,side:e?"left":"top"}),!0;h.scrollTo({[e?"left":"top"]:s,behavior:"smooth"})}return!0}return r.setTransition(t),r.setTranslate(w),r.updateActiveIndex(n),r.updateSlidesClasses(),r.emit("beforeTransitionStart",t,a),r.transitionStart(s,b),0===t?r.transitionEnd(s,b):r.animating||(r.animating=!0,r.onSlideToWrapperTransitionEnd||(r.onSlideToWrapperTransitionEnd=function(e){r&&!r.destroyed&&e.target===this&&(r.wrapperEl.removeEventListener("transitionend",r.onSlideToWrapperTransitionEnd),r.onSlideToWrapperTransitionEnd=null,delete r.onSlideToWrapperTransitionEnd,r.transitionEnd(s,b))}),r.wrapperEl.addEventListener("transitionend",r.onSlideToWrapperTransitionEnd)),!0},slideToLoop:function(e,t,s,a){if(void 0===e&&(e=0),void 0===s&&(s=!0),"string"==typeof e){e=parseInt(e,10)}const i=this;if(i.destroyed)return;void 0===t&&(t=i.params.speed);const r=i.grid&&i.params.grid&&i.params.grid.rows>1;let n=e;if(i.params.loop)if(i.virtual&&i.params.virtual.enabled)n+=i.virtual.slidesBefore;else{let e;if(r){const t=n*i.params.grid.rows;e=i.slides.filter((e=>1*e.getAttribute("data-swiper-slide-index")===t))[0].column}else e=i.getSlideIndexByData(n);const t=r?Math.ceil(i.slides.length/i.params.grid.rows):i.slides.length,{centeredSlides:s}=i.params;let l=i.params.slidesPerView;"auto"===l?l=i.slidesPerViewDynamic():(l=Math.ceil(parseFloat(i.params.slidesPerView,10)),s&&l%2==0&&(l+=1));let o=t-e<l;if(s&&(o=o||e<Math.ceil(l/2)),a&&s&&"auto"!==i.params.slidesPerView&&!r&&(o=!1),o){const a=s?e<i.activeIndex?"prev":"next":e-i.activeIndex-1<i.params.slidesPerView?"next":"prev";i.loopFix({direction:a,slideTo:!0,activeSlideIndex:"next"===a?e+1:e-t+1,slideRealIndex:"next"===a?i.realIndex:void 0})}if(r){const e=n*i.params.grid.rows;n=i.slides.filter((t=>1*t.getAttribute("data-swiper-slide-index")===e))[0].column}else n=i.getSlideIndexByData(n)}return requestAnimationFrame((()=>{i.slideTo(n,t,s,a)})),i},slideNext:function(e,t,s){void 0===t&&(t=!0);const a=this,{enabled:i,params:r,animating:n}=a;if(!i||a.destroyed)return a;void 0===e&&(e=a.params.speed);let l=r.slidesPerGroup;"auto"===r.slidesPerView&&1===r.slidesPerGroup&&r.slidesPerGroupAuto&&(l=Math.max(a.slidesPerViewDynamic("current",!0),1));const o=a.activeIndex<r.slidesPerGroupSkip?1:l,d=a.virtual&&r.virtual.enabled;if(r.loop){if(n&&!d&&r.loopPreventsSliding)return!1;if(a.loopFix({direction:"next"}),a._clientLeft=a.wrapperEl.clientLeft,a.activeIndex===a.slides.length-1&&r.cssMode)return requestAnimationFrame((()=>{a.slideTo(a.activeIndex+o,e,t,s)})),!0}return r.rewind&&a.isEnd?a.slideTo(0,e,t,s):a.slideTo(a.activeIndex+o,e,t,s)},slidePrev:function(e,t,s){void 0===t&&(t=!0);const a=this,{params:i,snapGrid:r,slidesGrid:n,rtlTranslate:l,enabled:o,animating:d}=a;if(!o||a.destroyed)return a;void 0===e&&(e=a.params.speed);const c=a.virtual&&i.virtual.enabled;if(i.loop){if(d&&!c&&i.loopPreventsSliding)return!1;a.loopFix({direction:"prev"}),a._clientLeft=a.wrapperEl.clientLeft}function p(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}const u=p(l?a.translate:-a.translate),m=r.map((e=>p(e)));let h=r[m.indexOf(u)-1];if(void 0===h&&i.cssMode){let e;r.forEach(((t,s)=>{u>=t&&(e=s)})),void 0!==e&&(h=r[e>0?e-1:e])}let f=0;if(void 0!==h&&(f=n.indexOf(h),f<0&&(f=a.activeIndex-1),"auto"===i.slidesPerView&&1===i.slidesPerGroup&&i.slidesPerGroupAuto&&(f=f-a.slidesPerViewDynamic("previous",!0)+1,f=Math.max(f,0))),i.rewind&&a.isBeginning){const i=a.params.virtual&&a.params.virtual.enabled&&a.virtual?a.virtual.slides.length-1:a.slides.length-1;return a.slideTo(i,e,t,s)}return i.loop&&0===a.activeIndex&&i.cssMode?(requestAnimationFrame((()=>{a.slideTo(f,e,t,s)})),!0):a.slideTo(f,e,t,s)},slideReset:function(e,t,s){void 0===t&&(t=!0);const a=this;if(!a.destroyed)return void 0===e&&(e=a.params.speed),a.slideTo(a.activeIndex,e,t,s)},slideToClosest:function(e,t,s,a){void 0===t&&(t=!0),void 0===a&&(a=.5);const i=this;if(i.destroyed)return;void 0===e&&(e=i.params.speed);let r=i.activeIndex;const n=Math.min(i.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/i.params.slidesPerGroup),o=i.rtlTranslate?i.translate:-i.translate;if(o>=i.snapGrid[l]){const e=i.snapGrid[l];o-e>(i.snapGrid[l+1]-e)*a&&(r+=i.params.slidesPerGroup)}else{const e=i.snapGrid[l-1];o-e<=(i.snapGrid[l]-e)*a&&(r-=i.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,i.slidesGrid.length-1),i.slideTo(r,e,t,s)},slideToClickedSlide:function(){const e=this;if(e.destroyed)return;const{params:t,slidesEl:s}=e,a="auto"===t.slidesPerView?e.slidesPerViewDynamic():t.slidesPerView;let i,r=e.clickedIndex;const n=e.isElement?"swiper-slide":`.${t.slideClass}`;if(t.loop){if(e.animating)return;i=parseInt(e.clickedSlide.getAttribute("data-swiper-slide-index"),10),t.centeredSlides?r<e.loopedSlides-a/2||r>e.slides.length-e.loopedSlides+a/2?(e.loopFix(),r=e.getSlideIndex(f(s,`${n}[data-swiper-slide-index="${i}"]`)[0]),l((()=>{e.slideTo(r)}))):e.slideTo(r):r>e.slides.length-a?(e.loopFix(),r=e.getSlideIndex(f(s,`${n}[data-swiper-slide-index="${i}"]`)[0]),l((()=>{e.slideTo(r)}))):e.slideTo(r)}else e.slideTo(r)}};var R={loopCreate:function(e){const t=this,{params:s,slidesEl:a}=t;if(!s.loop||t.virtual&&t.params.virtual.enabled)return;const i=()=>{f(a,`.${s.slideClass}, swiper-slide`).forEach(((e,t)=>{e.setAttribute("data-swiper-slide-index",t)}))},r=t.grid&&s.grid&&s.grid.rows>1,n=s.slidesPerGroup*(r?s.grid.rows:1),l=t.slides.length%n!=0,o=r&&t.slides.length%s.grid.rows!=0,d=e=>{for(let a=0;a<e;a+=1){const e=t.isElement?v("swiper-slide",[s.slideBlankClass]):v("div",[s.slideClass,s.slideBlankClass]);t.slidesEl.append(e)}};if(l){if(s.loopAddBlankSlides){d(n-t.slides.length%n),t.recalcSlides(),t.updateSlides()}else g("Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");i()}else if(o){if(s.loopAddBlankSlides){d(s.grid.rows-t.slides.length%s.grid.rows),t.recalcSlides(),t.updateSlides()}else g("Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");i()}else i();t.loopFix({slideRealIndex:e,direction:s.centeredSlides?void 0:"next"})},loopFix:function(e){let{slideRealIndex:t,slideTo:s=!0,direction:a,setTranslate:i,activeSlideIndex:r,byController:n,byMousewheel:l}=void 0===e?{}:e;const o=this;if(!o.params.loop)return;o.emit("beforeLoopFix");const{slides:d,allowSlidePrev:c,allowSlideNext:p,slidesEl:u,params:m}=o,{centeredSlides:h}=m;if(o.allowSlidePrev=!0,o.allowSlideNext=!0,o.virtual&&m.virtual.enabled)return s&&(m.centeredSlides||0!==o.snapIndex?m.centeredSlides&&o.snapIndex<m.slidesPerView?o.slideTo(o.virtual.slides.length+o.snapIndex,0,!1,!0):o.snapIndex===o.snapGrid.length-1&&o.slideTo(o.virtual.slidesBefore,0,!1,!0):o.slideTo(o.virtual.slides.length,0,!1,!0)),o.allowSlidePrev=c,o.allowSlideNext=p,void o.emit("loopFix");let f=m.slidesPerView;"auto"===f?f=o.slidesPerViewDynamic():(f=Math.ceil(parseFloat(m.slidesPerView,10)),h&&f%2==0&&(f+=1));const v=m.slidesPerGroupAuto?f:m.slidesPerGroup;let w=v;w%v!=0&&(w+=v-w%v),w+=m.loopAdditionalSlides,o.loopedSlides=w;const b=o.grid&&m.grid&&m.grid.rows>1;d.length<f+w?g("Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters"):b&&"row"===m.grid.fill&&g("Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`");const y=[],E=[];let x=o.activeIndex;void 0===r?r=o.getSlideIndex(d.filter((e=>e.classList.contains(m.slideActiveClass)))[0]):x=r;const S="next"===a||!a,T="prev"===a||!a;let M=0,C=0;const P=b?Math.ceil(d.length/m.grid.rows):d.length,L=(b?d[r].column:r)+(h&&void 0===i?-f/2+.5:0);if(L<w){M=Math.max(w-L,v);for(let e=0;e<w-L;e+=1){const t=e-Math.floor(e/P)*P;if(b){const e=P-t-1;for(let t=d.length-1;t>=0;t-=1)d[t].column===e&&y.push(t)}else y.push(P-t-1)}}else if(L+f>P-w){C=Math.max(L-(P-2*w),v);for(let e=0;e<C;e+=1){const t=e-Math.floor(e/P)*P;b?d.forEach(((e,s)=>{e.column===t&&E.push(s)})):E.push(t)}}if(o.__preventObserver__=!0,requestAnimationFrame((()=>{o.__preventObserver__=!1})),T&&y.forEach((e=>{d[e].swiperLoopMoveDOM=!0,u.prepend(d[e]),d[e].swiperLoopMoveDOM=!1})),S&&E.forEach((e=>{d[e].swiperLoopMoveDOM=!0,u.append(d[e]),d[e].swiperLoopMoveDOM=!1})),o.recalcSlides(),"auto"===m.slidesPerView?o.updateSlides():b&&(y.length>0&&T||E.length>0&&S)&&o.slides.forEach(((e,t)=>{o.grid.updateSlide(t,e,o.slides)})),m.watchSlidesProgress&&o.updateSlidesOffset(),s)if(y.length>0&&T){if(void 0===t){const e=o.slidesGrid[x],t=o.slidesGrid[x+M]-e;l?o.setTranslate(o.translate-t):(o.slideTo(x+Math.ceil(M),0,!1,!0),i&&(o.touchEventsData.startTranslate=o.touchEventsData.startTranslate-t,o.touchEventsData.currentTranslate=o.touchEventsData.currentTranslate-t))}else if(i){const e=b?y.length/m.grid.rows:y.length;o.slideTo(o.activeIndex+e,0,!1,!0),o.touchEventsData.currentTranslate=o.translate}}else if(E.length>0&&S)if(void 0===t){const e=o.slidesGrid[x],t=o.slidesGrid[x-C]-e;l?o.setTranslate(o.translate-t):(o.slideTo(x-C,0,!1,!0),i&&(o.touchEventsData.startTranslate=o.touchEventsData.startTranslate-t,o.touchEventsData.currentTranslate=o.touchEventsData.currentTranslate-t))}else{const e=b?E.length/m.grid.rows:E.length;o.slideTo(o.activeIndex-e,0,!1,!0)}if(o.allowSlidePrev=c,o.allowSlideNext=p,o.controller&&o.controller.control&&!n){const e={slideRealIndex:t,direction:a,setTranslate:i,activeSlideIndex:r,byController:!0};Array.isArray(o.controller.control)?o.controller.control.forEach((t=>{!t.destroyed&&t.params.loop&&t.loopFix({...e,slideTo:t.params.slidesPerView===m.slidesPerView&&s})})):o.controller.control instanceof o.constructor&&o.controller.control.params.loop&&o.controller.control.loopFix({...e,slideTo:o.controller.control.params.slidesPerView===m.slidesPerView&&s})}o.emit("loopFix")},loopDestroy:function(){const e=this,{params:t,slidesEl:s}=e;if(!t.loop||e.virtual&&e.params.virtual.enabled)return;e.recalcSlides();const a=[];e.slides.forEach((e=>{const t=void 0===e.swiperSlideIndex?1*e.getAttribute("data-swiper-slide-index"):e.swiperSlideIndex;a[t]=e})),e.slides.forEach((e=>{e.removeAttribute("data-swiper-slide-index")})),a.forEach((e=>{s.append(e)})),e.recalcSlides(),e.slideTo(e.realIndex,0)}};function q(e,t,s){const a=r(),{params:i}=e,n=i.edgeSwipeDetection,l=i.edgeSwipeThreshold;return!n||!(s<=l||s>=a.innerWidth-l)||"prevent"===n&&(t.preventDefault(),!0)}function F(e){const t=this,s=a();let i=e;i.originalEvent&&(i=i.originalEvent);const n=t.touchEventsData;if("pointerdown"===i.type){if(null!==n.pointerId&&n.pointerId!==i.pointerId)return;n.pointerId=i.pointerId}else"touchstart"===i.type&&1===i.targetTouches.length&&(n.touchId=i.targetTouches[0].identifier);if("touchstart"===i.type)return void q(t,i,i.targetTouches[0].pageX);const{params:l,touches:d,enabled:c}=t;if(!c)return;if(!l.simulateTouch&&"mouse"===i.pointerType)return;if(t.animating&&l.preventInteractionOnTransition)return;!t.animating&&l.cssMode&&l.loop&&t.loopFix();let p=i.target;if("wrapper"===l.touchEventsTarget&&!function(e,t){const s=t.contains(e);if(!s&&t instanceof HTMLSlotElement)return[...t.assignedElements()].includes(e);return s}(p,t.wrapperEl))return;if("which"in i&&3===i.which)return;if("button"in i&&i.button>0)return;if(n.isTouched&&n.isMoved)return;const u=!!l.noSwipingClass&&""!==l.noSwipingClass,m=i.composedPath?i.composedPath():i.path;u&&i.target&&i.target.shadowRoot&&m&&(p=m[0]);const h=l.noSwipingSelector?l.noSwipingSelector:`.${l.noSwipingClass}`,f=!(!i.target||!i.target.shadowRoot);if(l.noSwiping&&(f?function(e,t){return void 0===t&&(t=this),function t(s){if(!s||s===a()||s===r())return null;s.assignedSlot&&(s=s.assignedSlot);const i=s.closest(e);return i||s.getRootNode?i||t(s.getRootNode().host):null}(t)}(h,p):p.closest(h)))return void(t.allowClick=!0);if(l.swipeHandler&&!p.closest(l.swipeHandler))return;d.currentX=i.pageX,d.currentY=i.pageY;const g=d.currentX,v=d.currentY;if(!q(t,i,g))return;Object.assign(n,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),d.startX=g,d.startY=v,n.touchStartTime=o(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,l.threshold>0&&(n.allowThresholdMove=!1);let w=!0;p.matches(n.focusableElements)&&(w=!1,"SELECT"===p.nodeName&&(n.isTouched=!1)),s.activeElement&&s.activeElement.matches(n.focusableElements)&&s.activeElement!==p&&("mouse"===i.pointerType||"mouse"!==i.pointerType&&!p.matches(n.focusableElements))&&s.activeElement.blur();const b=w&&t.allowTouchMove&&l.touchStartPreventDefault;!l.touchStartForcePreventDefault&&!b||p.isContentEditable||i.preventDefault(),l.freeMode&&l.freeMode.enabled&&t.freeMode&&t.animating&&!l.cssMode&&t.freeMode.onTouchStart(),t.emit("touchStart",i)}function V(e){const t=a(),s=this,i=s.touchEventsData,{params:r,touches:n,rtlTranslate:l,enabled:d}=s;if(!d)return;if(!r.simulateTouch&&"mouse"===e.pointerType)return;let c,p=e;if(p.originalEvent&&(p=p.originalEvent),"pointermove"===p.type){if(null!==i.touchId)return;if(p.pointerId!==i.pointerId)return}if("touchmove"===p.type){if(c=[...p.changedTouches].filter((e=>e.identifier===i.touchId))[0],!c||c.identifier!==i.touchId)return}else c=p;if(!i.isTouched)return void(i.startMoving&&i.isScrolling&&s.emit("touchMoveOpposite",p));const u=c.pageX,m=c.pageY;if(p.preventedByNestedSwiper)return n.startX=u,void(n.startY=m);if(!s.allowTouchMove)return p.target.matches(i.focusableElements)||(s.allowClick=!1),void(i.isTouched&&(Object.assign(n,{startX:u,startY:m,currentX:u,currentY:m}),i.touchStartTime=o()));if(r.touchReleaseOnEdges&&!r.loop)if(s.isVertical()){if(m<n.startY&&s.translate<=s.maxTranslate()||m>n.startY&&s.translate>=s.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(u<n.startX&&s.translate<=s.maxTranslate()||u>n.startX&&s.translate>=s.minTranslate())return;if(t.activeElement&&t.activeElement.matches(i.focusableElements)&&t.activeElement!==p.target&&"mouse"!==p.pointerType&&t.activeElement.blur(),t.activeElement&&p.target===t.activeElement&&p.target.matches(i.focusableElements))return i.isMoved=!0,void(s.allowClick=!1);i.allowTouchCallbacks&&s.emit("touchMove",p),n.previousX=n.currentX,n.previousY=n.currentY,n.currentX=u,n.currentY=m;const h=n.currentX-n.startX,f=n.currentY-n.startY;if(s.params.threshold&&Math.sqrt(h**2+f**2)<s.params.threshold)return;if(void 0===i.isScrolling){let e;s.isHorizontal()&&n.currentY===n.startY||s.isVertical()&&n.currentX===n.startX?i.isScrolling=!1:h*h+f*f>=25&&(e=180*Math.atan2(Math.abs(f),Math.abs(h))/Math.PI,i.isScrolling=s.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&s.emit("touchMoveOpposite",p),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling||"touchmove"===p.type&&i.preventTouchMoveFromPointerMove)return void(i.isTouched=!1);if(!i.startMoving)return;s.allowClick=!1,!r.cssMode&&p.cancelable&&p.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&p.stopPropagation();let g=s.isHorizontal()?h:f,v=s.isHorizontal()?n.currentX-n.previousX:n.currentY-n.previousY;r.oneWayMovement&&(g=Math.abs(g)*(l?1:-1),v=Math.abs(v)*(l?1:-1)),n.diff=g,g*=r.touchRatio,l&&(g=-g,v=-v);const w=s.touchesDirection;s.swipeDirection=g>0?"prev":"next",s.touchesDirection=v>0?"prev":"next";const b=s.params.loop&&!r.cssMode,y="next"===s.touchesDirection&&s.allowSlideNext||"prev"===s.touchesDirection&&s.allowSlidePrev;if(!i.isMoved){if(b&&y&&s.loopFix({direction:s.swipeDirection}),i.startTranslate=s.getTranslate(),s.setTransition(0),s.animating){const e=new window.CustomEvent("transitionend",{bubbles:!0,cancelable:!0,detail:{bySwiperTouchMove:!0}});s.wrapperEl.dispatchEvent(e)}i.allowMomentumBounce=!1,!r.grabCursor||!0!==s.allowSlideNext&&!0!==s.allowSlidePrev||s.setGrabCursor(!0),s.emit("sliderFirstMove",p)}if((new Date).getTime(),i.isMoved&&i.allowThresholdMove&&w!==s.touchesDirection&&b&&y&&Math.abs(g)>=1)return Object.assign(n,{startX:u,startY:m,currentX:u,currentY:m,startTranslate:i.currentTranslate}),i.loopSwapReset=!0,void(i.startTranslate=i.currentTranslate);s.emit("sliderMove",p),i.isMoved=!0,i.currentTranslate=g+i.startTranslate;let E=!0,x=r.resistanceRatio;if(r.touchReleaseOnEdges&&(x=0),g>0?(b&&y&&i.allowThresholdMove&&i.currentTranslate>(r.centeredSlides?s.minTranslate()-s.slidesSizesGrid[s.activeIndex+1]-("auto"!==r.slidesPerView&&s.slides.length-r.slidesPerView>=2?s.slidesSizesGrid[s.activeIndex+1]+s.params.spaceBetween:0)-s.params.spaceBetween:s.minTranslate())&&s.loopFix({direction:"prev",setTranslate:!0,activeSlideIndex:0}),i.currentTranslate>s.minTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=s.minTranslate()-1+(-s.minTranslate()+i.startTranslate+g)**x))):g<0&&(b&&y&&i.allowThresholdMove&&i.currentTranslate<(r.centeredSlides?s.maxTranslate()+s.slidesSizesGrid[s.slidesSizesGrid.length-1]+s.params.spaceBetween+("auto"!==r.slidesPerView&&s.slides.length-r.slidesPerView>=2?s.slidesSizesGrid[s.slidesSizesGrid.length-1]+s.params.spaceBetween:0):s.maxTranslate())&&s.loopFix({direction:"next",setTranslate:!0,activeSlideIndex:s.slides.length-("auto"===r.slidesPerView?s.slidesPerViewDynamic():Math.ceil(parseFloat(r.slidesPerView,10)))}),i.currentTranslate<s.maxTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=s.maxTranslate()+1-(s.maxTranslate()-i.startTranslate-g)**x))),E&&(p.preventedByNestedSwiper=!0),!s.allowSlideNext&&"next"===s.swipeDirection&&i.currentTranslate<i.startTranslate&&(i.currentTranslate=i.startTranslate),!s.allowSlidePrev&&"prev"===s.swipeDirection&&i.currentTranslate>i.startTranslate&&(i.currentTranslate=i.startTranslate),s.allowSlidePrev||s.allowSlideNext||(i.currentTranslate=i.startTranslate),r.threshold>0){if(!(Math.abs(g)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=s.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&s.freeMode||r.watchSlidesProgress)&&(s.updateActiveIndex(),s.updateSlidesClasses()),r.freeMode&&r.freeMode.enabled&&s.freeMode&&s.freeMode.onTouchMove(),s.updateProgress(i.currentTranslate),s.setTranslate(i.currentTranslate))}function _(e){const t=this,s=t.touchEventsData;let a,i=e;i.originalEvent&&(i=i.originalEvent);if("touchend"===i.type||"touchcancel"===i.type){if(a=[...i.changedTouches].filter((e=>e.identifier===s.touchId))[0],!a||a.identifier!==s.touchId)return}else{if(null!==s.touchId)return;if(i.pointerId!==s.pointerId)return;a=i}if(["pointercancel","pointerout","pointerleave","contextmenu"].includes(i.type)){if(!(["pointercancel","contextmenu"].includes(i.type)&&(t.browser.isSafari||t.browser.isWebView)))return}s.pointerId=null,s.touchId=null;const{params:r,touches:n,rtlTranslate:d,slidesGrid:c,enabled:p}=t;if(!p)return;if(!r.simulateTouch&&"mouse"===i.pointerType)return;if(s.allowTouchCallbacks&&t.emit("touchEnd",i),s.allowTouchCallbacks=!1,!s.isTouched)return s.isMoved&&r.grabCursor&&t.setGrabCursor(!1),s.isMoved=!1,void(s.startMoving=!1);r.grabCursor&&s.isMoved&&s.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);const u=o(),m=u-s.touchStartTime;if(t.allowClick){const e=i.path||i.composedPath&&i.composedPath();t.updateClickedSlide(e&&e[0]||i.target,e),t.emit("tap click",i),m<300&&u-s.lastClickTime<300&&t.emit("doubleTap doubleClick",i)}if(s.lastClickTime=o(),l((()=>{t.destroyed||(t.allowClick=!0)})),!s.isTouched||!s.isMoved||!t.swipeDirection||0===n.diff&&!s.loopSwapReset||s.currentTranslate===s.startTranslate&&!s.loopSwapReset)return s.isTouched=!1,s.isMoved=!1,void(s.startMoving=!1);let h;if(s.isTouched=!1,s.isMoved=!1,s.startMoving=!1,h=r.followFinger?d?t.translate:-t.translate:-s.currentTranslate,r.cssMode)return;if(r.freeMode&&r.freeMode.enabled)return void t.freeMode.onTouchEnd({currentPos:h});const f=h>=-t.maxTranslate()&&!t.params.loop;let g=0,v=t.slidesSizesGrid[0];for(let e=0;e<c.length;e+=e<r.slidesPerGroupSkip?1:r.slidesPerGroup){const t=e<r.slidesPerGroupSkip-1?1:r.slidesPerGroup;void 0!==c[e+t]?(f||h>=c[e]&&h<c[e+t])&&(g=e,v=c[e+t]-c[e]):(f||h>=c[e])&&(g=e,v=c[c.length-1]-c[c.length-2])}let w=null,b=null;r.rewind&&(t.isBeginning?b=r.virtual&&r.virtual.enabled&&t.virtual?t.virtual.slides.length-1:t.slides.length-1:t.isEnd&&(w=0));const y=(h-c[g])/v,E=g<r.slidesPerGroupSkip-1?1:r.slidesPerGroup;if(m>r.longSwipesMs){if(!r.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(y>=r.longSwipesRatio?t.slideTo(r.rewind&&t.isEnd?w:g+E):t.slideTo(g)),"prev"===t.swipeDirection&&(y>1-r.longSwipesRatio?t.slideTo(g+E):null!==b&&y<0&&Math.abs(y)>r.longSwipesRatio?t.slideTo(b):t.slideTo(g))}else{if(!r.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(i.target===t.navigation.nextEl||i.target===t.navigation.prevEl)?i.target===t.navigation.nextEl?t.slideTo(g+E):t.slideTo(g):("next"===t.swipeDirection&&t.slideTo(null!==w?w:g+E),"prev"===t.swipeDirection&&t.slideTo(null!==b?b:g))}}function W(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:a,allowSlidePrev:i,snapGrid:r}=e,n=e.virtual&&e.params.virtual.enabled;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses();const l=n&&t.loop;!("auto"===t.slidesPerView||t.slidesPerView>1)||!e.isEnd||e.isBeginning||e.params.centeredSlides||l?e.params.loop&&!n?e.slideToLoop(e.realIndex,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0):e.slideTo(e.slides.length-1,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&(clearTimeout(e.autoplay.resizeTimeout),e.autoplay.resizeTimeout=setTimeout((()=>{e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.resume()}),500)),e.allowSlidePrev=i,e.allowSlideNext=a,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}function j(e){const t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function U(){const e=this,{wrapperEl:t,rtlTranslate:s,enabled:a}=e;if(!a)return;let i;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const r=e.maxTranslate()-e.minTranslate();i=0===r?0:(e.translate-e.minTranslate())/r,i!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}function K(e){const t=this;D(t,e.target),t.params.cssMode||"auto"!==t.params.slidesPerView&&!t.params.autoHeight||t.update()}function Z(){const e=this;e.documentTouchHandlerProceeded||(e.documentTouchHandlerProceeded=!0,e.params.touchReleaseOnEdges&&(e.el.style.touchAction="auto"))}const Q=(e,t)=>{const s=a(),{params:i,el:r,wrapperEl:n,device:l}=e,o=!!i.nested,d="on"===t?"addEventListener":"removeEventListener",c=t;r&&"string"!=typeof r&&(s[d]("touchstart",e.onDocumentTouchStart,{passive:!1,capture:o}),r[d]("touchstart",e.onTouchStart,{passive:!1}),r[d]("pointerdown",e.onTouchStart,{passive:!1}),s[d]("touchmove",e.onTouchMove,{passive:!1,capture:o}),s[d]("pointermove",e.onTouchMove,{passive:!1,capture:o}),s[d]("touchend",e.onTouchEnd,{passive:!0}),s[d]("pointerup",e.onTouchEnd,{passive:!0}),s[d]("pointercancel",e.onTouchEnd,{passive:!0}),s[d]("touchcancel",e.onTouchEnd,{passive:!0}),s[d]("pointerout",e.onTouchEnd,{passive:!0}),s[d]("pointerleave",e.onTouchEnd,{passive:!0}),s[d]("contextmenu",e.onTouchEnd,{passive:!0}),(i.preventClicks||i.preventClicksPropagation)&&r[d]("click",e.onClick,!0),i.cssMode&&n[d]("scroll",e.onScroll),i.updateOnWindowResize?e[c](l.ios||l.android?"resize orientationchange observerUpdate":"resize observerUpdate",W,!0):e[c]("observerUpdate",W,!0),r[d]("load",e.onLoad,{capture:!0}))};const J=(e,t)=>e.grid&&t.grid&&t.grid.rows>1;var ee={init:!0,direction:"horizontal",oneWayMovement:!1,swiperElementNodeName:"SWIPER-CONTAINER",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,eventsPrefix:"swiper",enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:5,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,loop:!1,loopAddBlankSlides:!0,loopAdditionalSlides:0,loopPreventsSliding:!0,rewind:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,maxBackfaceHiddenSlides:10,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-blank",slideActiveClass:"swiper-slide-active",slideVisibleClass:"swiper-slide-visible",slideFullyVisibleClass:"swiper-slide-fully-visible",slideNextClass:"swiper-slide-next",slidePrevClass:"swiper-slide-prev",wrapperClass:"swiper-wrapper",lazyPreloaderClass:"swiper-lazy-preloader",lazyPreloadPrevNext:0,runCallbacksOnInit:!0,_emitClasses:!1};function te(e,t){return function(s){void 0===s&&(s={});const a=Object.keys(s)[0],i=s[a];"object"==typeof i&&null!==i?(!0===e[a]&&(e[a]={enabled:!0}),"navigation"===a&&e[a]&&e[a].enabled&&!e[a].prevEl&&!e[a].nextEl&&(e[a].auto=!0),["pagination","scrollbar"].indexOf(a)>=0&&e[a]&&e[a].enabled&&!e[a].el&&(e[a].auto=!0),a in e&&"enabled"in i?("object"!=typeof e[a]||"enabled"in e[a]||(e[a].enabled=!0),e[a]||(e[a]={enabled:!1}),p(t,s)):p(t,s)):p(t,s)}}const se={eventsEmitter:$,update:B,translate:N,transition:{setTransition:function(e,t){const s=this;s.params.cssMode||(s.wrapperEl.style.transitionDuration=`${e}ms`,s.wrapperEl.style.transitionDelay=0===e?"0ms":""),s.emit("setTransition",e,t)},transitionStart:function(e,t){void 0===e&&(e=!0);const s=this,{params:a}=s;a.cssMode||(a.autoHeight&&s.updateAutoHeight(),X({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e,t){void 0===e&&(e=!0);const s=this,{params:a}=s;s.animating=!1,a.cssMode||(s.setTransition(0),X({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:Y,loop:R,grabCursor:{setGrabCursor:function(e){const t=this;if(!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;t.isElement&&(t.__preventObserver__=!0),s.style.cursor="move",s.style.cursor=e?"grabbing":"grab",t.isElement&&requestAnimationFrame((()=>{t.__preventObserver__=!1}))},unsetGrabCursor:function(){const e=this;e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.isElement&&(e.__preventObserver__=!0),e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="",e.isElement&&requestAnimationFrame((()=>{e.__preventObserver__=!1})))}},events:{attachEvents:function(){const e=this,{params:t}=e;e.onTouchStart=F.bind(e),e.onTouchMove=V.bind(e),e.onTouchEnd=_.bind(e),e.onDocumentTouchStart=Z.bind(e),t.cssMode&&(e.onScroll=U.bind(e)),e.onClick=j.bind(e),e.onLoad=K.bind(e),Q(e,"on")},detachEvents:function(){Q(this,"off")}},breakpoints:{setBreakpoint:function(){const e=this,{realIndex:t,initialized:s,params:a,el:i}=e,r=a.breakpoints;if(!r||r&&0===Object.keys(r).length)return;const n=e.getBreakpoint(r,e.params.breakpointsBase,e.el);if(!n||e.currentBreakpoint===n)return;const l=(n in r?r[n]:void 0)||e.originalParams,o=J(e,a),d=J(e,l),c=e.params.grabCursor,u=l.grabCursor,m=a.enabled;o&&!d?(i.classList.remove(`${a.containerModifierClass}grid`,`${a.containerModifierClass}grid-column`),e.emitContainerClasses()):!o&&d&&(i.classList.add(`${a.containerModifierClass}grid`),(l.grid.fill&&"column"===l.grid.fill||!l.grid.fill&&"column"===a.grid.fill)&&i.classList.add(`${a.containerModifierClass}grid-column`),e.emitContainerClasses()),c&&!u?e.unsetGrabCursor():!c&&u&&e.setGrabCursor(),["navigation","pagination","scrollbar"].forEach((t=>{if(void 0===l[t])return;const s=a[t]&&a[t].enabled,i=l[t]&&l[t].enabled;s&&!i&&e[t].disable(),!s&&i&&e[t].enable()}));const h=l.direction&&l.direction!==a.direction,f=a.loop&&(l.slidesPerView!==a.slidesPerView||h),g=a.loop;h&&s&&e.changeDirection(),p(e.params,l);const v=e.params.enabled,w=e.params.loop;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),m&&!v?e.disable():!m&&v&&e.enable(),e.currentBreakpoint=n,e.emit("_beforeBreakpoint",l),s&&(f?(e.loopDestroy(),e.loopCreate(t),e.updateSlides()):!g&&w?(e.loopCreate(t),e.updateSlides()):g&&!w&&e.loopDestroy()),e.emit("breakpoint",l)},getBreakpoint:function(e,t,s){if(void 0===t&&(t="window"),!e||"container"===t&&!s)return;let a=!1;const i=r(),n="window"===t?i.innerHeight:s.clientHeight,l=Object.keys(e).map((e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:n*t,point:e}}return{value:e,point:e}}));l.sort(((e,t)=>parseInt(e.value,10)-parseInt(t.value,10)));for(let e=0;e<l.length;e+=1){const{point:r,value:n}=l[e];"window"===t?i.matchMedia(`(min-width: ${n}px)`).matches&&(a=r):n<=s.clientWidth&&(a=r)}return a||"max"}},checkOverflow:{checkOverflow:function(){const e=this,{isLocked:t,params:s}=e,{slidesOffsetBefore:a}=s;if(a){const t=e.slides.length-1,s=e.slidesGrid[t]+e.slidesSizesGrid[t]+2*a;e.isLocked=e.size>s}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}},classes:{addClasses:function(){const e=this,{classNames:t,params:s,rtl:a,el:i,device:r}=e,n=function(e,t){const s=[];return e.forEach((e=>{"object"==typeof e?Object.keys(e).forEach((a=>{e[a]&&s.push(t+a)})):"string"==typeof e&&s.push(t+e)})),s}(["initialized",s.direction,{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:a},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:r.android},{ios:r.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides},{"watch-progress":s.watchSlidesProgress}],s.containerModifierClass);t.push(...n),i.classList.add(...t),e.emitContainerClasses()},removeClasses:function(){const{el:e,classNames:t}=this;e&&"string"!=typeof e&&(e.classList.remove(...t),this.emitContainerClasses())}}},ae={};class ie{constructor(){let e,t;for(var s=arguments.length,i=new Array(s),r=0;r<s;r++)i[r]=arguments[r];1===i.length&&i[0].constructor&&"Object"===Object.prototype.toString.call(i[0]).slice(8,-1)?t=i[0]:[e,t]=i,t||(t={}),t=p({},t),e&&!t.el&&(t.el=e);const n=a();if(t.el&&"string"==typeof t.el&&n.querySelectorAll(t.el).length>1){const e=[];return n.querySelectorAll(t.el).forEach((s=>{const a=p({},t,{el:s});e.push(new ie(a))})),e}const l=this;l.__swiper__=!0,l.support=I(),l.device=z({userAgent:t.userAgent}),l.browser=A(),l.eventsListeners={},l.eventsAnyListeners=[],l.modules=[...l.__modules__],t.modules&&Array.isArray(t.modules)&&l.modules.push(...t.modules);const o={};l.modules.forEach((e=>{e({params:t,swiper:l,extendParams:te(t,o),on:l.on.bind(l),once:l.once.bind(l),off:l.off.bind(l),emit:l.emit.bind(l)})}));const d=p({},ee,o);return l.params=p({},d,ae,t),l.originalParams=p({},l.params),l.passedParams=p({},t),l.params&&l.params.on&&Object.keys(l.params.on).forEach((e=>{l.on(e,l.params.on[e])})),l.params&&l.params.onAny&&l.onAny(l.params.onAny),Object.assign(l,{enabled:l.params.enabled,el:e,classNames:[],slides:[],slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===l.params.direction,isVertical:()=>"vertical"===l.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,cssOverflowAdjustment(){return Math.trunc(this.translate/2**23)*2**23},allowSlideNext:l.params.allowSlideNext,allowSlidePrev:l.params.allowSlidePrev,touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:l.params.focusableElements,lastClickTime:0,clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,startMoving:void 0,pointerId:null,touchId:null},allowClick:!0,allowTouchMove:l.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),l.emit("_swiper"),l.params.init&&l.init(),l}getDirectionLabel(e){return this.isHorizontal()?e:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[e]}getSlideIndex(e){const{slidesEl:t,params:s}=this,a=y(f(t,`.${s.slideClass}, swiper-slide`)[0]);return y(e)-a}getSlideIndexByData(e){return this.getSlideIndex(this.slides.filter((t=>1*t.getAttribute("data-swiper-slide-index")===e))[0])}recalcSlides(){const{slidesEl:e,params:t}=this;this.slides=f(e,`.${t.slideClass}, swiper-slide`)}enable(){const e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))}disable(){const e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))}setProgress(e,t){const s=this;e=Math.min(Math.max(e,0),1);const a=s.minTranslate(),i=(s.maxTranslate()-a)*e+a;s.translateTo(i,void 0===t?0:t),s.updateActiveIndex(),s.updateSlidesClasses()}emitContainerClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=e.el.className.split(" ").filter((t=>0===t.indexOf("swiper")||0===t.indexOf(e.params.containerModifierClass)));e.emit("_containerClasses",t.join(" "))}getSlideClasses(e){const t=this;return t.destroyed?"":e.className.split(" ").filter((e=>0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass))).join(" ")}emitSlidesClasses(){const e=this;if(!e.params._emitClasses||!e.el)return;const t=[];e.slides.forEach((s=>{const a=e.getSlideClasses(s);t.push({slideEl:s,classNames:a}),e.emit("_slideClass",s,a)})),e.emit("_slideClasses",t)}slidesPerViewDynamic(e,t){void 0===e&&(e="current"),void 0===t&&(t=!1);const{params:s,slides:a,slidesGrid:i,slidesSizesGrid:r,size:n,activeIndex:l}=this;let o=1;if("number"==typeof s.slidesPerView)return s.slidesPerView;if(s.centeredSlides){let e,t=a[l]?Math.ceil(a[l].swiperSlideSize):0;for(let s=l+1;s<a.length;s+=1)a[s]&&!e&&(t+=Math.ceil(a[s].swiperSlideSize),o+=1,t>n&&(e=!0));for(let s=l-1;s>=0;s-=1)a[s]&&!e&&(t+=a[s].swiperSlideSize,o+=1,t>n&&(e=!0))}else if("current"===e)for(let e=l+1;e<a.length;e+=1){(t?i[e]+r[e]-i[l]<n:i[e]-i[l]<n)&&(o+=1)}else for(let e=l-1;e>=0;e-=1){i[l]-i[e]<n&&(o+=1)}return o}update(){const e=this;if(!e||e.destroyed)return;const{snapGrid:t,params:s}=e;function a(){const t=e.rtlTranslate?-1*e.translate:e.translate,s=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(s),e.updateActiveIndex(),e.updateSlidesClasses()}let i;if(s.breakpoints&&e.setBreakpoint(),[...e.el.querySelectorAll('[loading="lazy"]')].forEach((t=>{t.complete&&D(e,t)})),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),s.freeMode&&s.freeMode.enabled&&!s.cssMode)a(),s.autoHeight&&e.updateAutoHeight();else{if(("auto"===s.slidesPerView||s.slidesPerView>1)&&e.isEnd&&!s.centeredSlides){const t=e.virtual&&s.virtual.enabled?e.virtual.slides:e.slides;i=e.slideTo(t.length-1,0,!1,!0)}else i=e.slideTo(e.activeIndex,0,!1,!0);i||a()}s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t){void 0===t&&(t=!0);const s=this,a=s.params.direction;return e||(e="horizontal"===a?"vertical":"horizontal"),e===a||"horizontal"!==e&&"vertical"!==e||(s.el.classList.remove(`${s.params.containerModifierClass}${a}`),s.el.classList.add(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.slides.forEach((t=>{"vertical"===e?t.style.width="":t.style.height=""})),s.emit("changeDirection"),t&&s.update()),s}changeLanguageDirection(e){const t=this;t.rtl&&"rtl"===e||!t.rtl&&"ltr"===e||(t.rtl="rtl"===e,t.rtlTranslate="horizontal"===t.params.direction&&t.rtl,t.rtl?(t.el.classList.add(`${t.params.containerModifierClass}rtl`),t.el.dir="rtl"):(t.el.classList.remove(`${t.params.containerModifierClass}rtl`),t.el.dir="ltr"),t.update())}mount(e){const t=this;if(t.mounted)return!0;let s=e||t.params.el;if("string"==typeof s&&(s=document.querySelector(s)),!s)return!1;s.swiper=t,s.parentNode&&s.parentNode.host&&s.parentNode.host.nodeName===t.params.swiperElementNodeName.toUpperCase()&&(t.isElement=!0);const a=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let i=(()=>{if(s&&s.shadowRoot&&s.shadowRoot.querySelector){return s.shadowRoot.querySelector(a())}return f(s,a())[0]})();return!i&&t.params.createElements&&(i=v("div",t.params.wrapperClass),s.append(i),f(s,`.${t.params.slideClass}`).forEach((e=>{i.append(e)}))),Object.assign(t,{el:s,wrapperEl:i,slidesEl:t.isElement&&!s.parentNode.host.slideSlots?s.parentNode.host:i,hostEl:t.isElement?s.parentNode.host:s,mounted:!0,rtl:"rtl"===s.dir.toLowerCase()||"rtl"===b(s,"direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===s.dir.toLowerCase()||"rtl"===b(s,"direction")),wrongRTL:"-webkit-box"===b(i,"display")}),!0}init(e){const t=this;if(t.initialized)return t;if(!1===t.mount(e))return t;t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.loop&&t.virtual&&t.params.virtual.enabled?t.slideTo(t.params.initialSlide+t.virtual.slidesBefore,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.params.loop&&t.loopCreate(),t.attachEvents();const s=[...t.el.querySelectorAll('[loading="lazy"]')];return t.isElement&&s.push(...t.hostEl.querySelectorAll('[loading="lazy"]')),s.forEach((e=>{e.complete?D(t,e):e.addEventListener("load",(e=>{D(t,e.target)}))})),H(t),t.initialized=!0,H(t),t.emit("init"),t.emit("afterInit"),t}destroy(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);const s=this,{params:a,el:i,wrapperEl:r,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),a.loop&&s.loopDestroy(),t&&(s.removeClasses(),i&&"string"!=typeof i&&i.removeAttribute("style"),r&&r.removeAttribute("style"),n&&n.length&&n.forEach((e=>{e.classList.remove(a.slideVisibleClass,a.slideFullyVisibleClass,a.slideActiveClass,a.slideNextClass,a.slidePrevClass),e.removeAttribute("style"),e.removeAttribute("data-swiper-slide-index")}))),s.emit("destroy"),Object.keys(s.eventsListeners).forEach((e=>{s.off(e)})),!1!==e&&(s.el&&"string"!=typeof s.el&&(s.el.swiper=null),function(e){const t=e;Object.keys(t).forEach((e=>{try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}}))}(s)),s.destroyed=!0),null}static extendDefaults(e){p(ae,e)}static get extendedDefaults(){return ae}static get defaults(){return ee}static installModule(e){ie.prototype.__modules__||(ie.prototype.__modules__=[]);const t=ie.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach((e=>ie.installModule(e))),ie):(ie.installModule(e),ie)}}function re(e,t,s,a){return e.params.createElements&&Object.keys(a).forEach((i=>{if(!s[i]&&!0===s.auto){let r=f(e.el,`.${a[i]}`)[0];r||(r=v("div",a[i]),r.className=a[i],e.el.append(r)),s[i]=r,t[i]=r}})),s}function ne(e){return void 0===e&&(e=""),`.${e.trim().replace(/([\.:!+\/])/g,"\\$1").replace(/ /g,".")}`}function le(e){const t=this,{params:s,slidesEl:a}=t;s.loop&&t.loopDestroy();const i=e=>{if("string"==typeof e){const t=document.createElement("div");t.innerHTML=e,a.append(t.children[0]),t.innerHTML=""}else a.append(e)};if("object"==typeof e&&"length"in e)for(let t=0;t<e.length;t+=1)e[t]&&i(e[t]);else i(e);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update()}function oe(e){const t=this,{params:s,activeIndex:a,slidesEl:i}=t;s.loop&&t.loopDestroy();let r=a+1;const n=e=>{if("string"==typeof e){const t=document.createElement("div");t.innerHTML=e,i.prepend(t.children[0]),t.innerHTML=""}else i.prepend(e)};if("object"==typeof e&&"length"in e){for(let t=0;t<e.length;t+=1)e[t]&&n(e[t]);r=a+e.length}else n(e);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update(),t.slideTo(r,0,!1)}function de(e,t){const s=this,{params:a,activeIndex:i,slidesEl:r}=s;let n=i;a.loop&&(n-=s.loopedSlides,s.loopDestroy(),s.recalcSlides());const l=s.slides.length;if(e<=0)return void s.prependSlide(t);if(e>=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides[t];e.remove(),d.unshift(e)}if("object"==typeof t&&"length"in t){for(let e=0;e<t.length;e+=1)t[e]&&r.append(t[e]);o=n>e?n+t.length:n}else r.append(t);for(let e=0;e<d.length;e+=1)r.append(d[e]);s.recalcSlides(),a.loop&&s.loopCreate(),a.observer&&!s.isElement||s.update(),a.loop?s.slideTo(o+s.loopedSlides,0,!1):s.slideTo(o,0,!1)}function ce(e){const t=this,{params:s,activeIndex:a}=t;let i=a;s.loop&&(i-=t.loopedSlides,t.loopDestroy());let r,n=i;if("object"==typeof e&&"length"in e){for(let s=0;s<e.length;s+=1)r=e[s],t.slides[r]&&t.slides[r].remove(),r<n&&(n-=1);n=Math.max(n,0)}else r=e,t.slides[r]&&t.slides[r].remove(),r<n&&(n-=1),n=Math.max(n,0);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update(),s.loop?t.slideTo(n+t.loopedSlides,0,!1):t.slideTo(n,0,!1)}function pe(){const e=this,t=[];for(let s=0;s<e.slides.length;s+=1)t.push(s);e.removeSlide(t)}function ue(e){const{effect:t,swiper:s,on:a,setTranslate:i,setTransition:r,overwriteParams:n,perspective:l,recreateShadows:o,getEffectParams:d}=e;let c;a("beforeInit",(()=>{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)})),a("setTranslate",(()=>{s.params.effect===t&&i()})),a("setTransition",((e,a)=>{s.params.effect===t&&r(a)})),a("transitionEnd",(()=>{if(s.params.effect===t&&o){if(!d||!d().slideShadows)return;s.slides.forEach((e=>{e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((e=>e.remove()))})),o()}})),a("virtualUpdate",(()=>{s.params.effect===t&&(s.slides.length||(c=!0),requestAnimationFrame((()=>{c&&s.slides&&s.slides.length&&(i(),c=!1)})))}))}function me(e,t){const s=h(t);return s!==t&&(s.style.backfaceVisibility="hidden",s.style["-webkit-backface-visibility"]="hidden"),s}function he(e){let{swiper:t,duration:s,transformElements:a,allSlides:i}=e;const{activeIndex:r}=t;if(t.params.virtualTranslate&&0!==s){let e,s=!1;e=i?a:a.filter((e=>{const s=e.classList.contains("swiper-slide-transform")?(e=>{if(!e.parentElement)return t.slides.filter((t=>t.shadowRoot&&t.shadowRoot===e.parentNode))[0];return e.parentElement})(e):e;return t.getSlideIndex(s)===r})),e.forEach((e=>{x(e,(()=>{if(s)return;if(!t||t.destroyed)return;s=!0,t.animating=!1;const e=new window.CustomEvent("transitionend",{bubbles:!0,cancelable:!0});t.wrapperEl.dispatchEvent(e)}))}))}}function fe(e,t,s){const a=`swiper-slide-shadow${s?`-${s}`:""}${e?` swiper-slide-shadow-${e}`:""}`,i=h(t);let r=i.querySelector(`.${a.split(" ").join(".")}`);return r||(r=v("div",a.split(" ")),i.append(r)),r}Object.keys(se).forEach((e=>{Object.keys(se[e]).forEach((t=>{ie.prototype[t]=se[e][t]}))})),ie.use([function(e){let{swiper:t,on:s,emit:a}=e;const i=r();let n=null,l=null;const o=()=>{t&&!t.destroyed&&t.initialized&&(a("beforeResize"),a("resize"))},d=()=>{t&&!t.destroyed&&t.initialized&&a("orientationchange")};s("init",(()=>{t.params.resizeObserver&&void 0!==i.ResizeObserver?t&&!t.destroyed&&t.initialized&&(n=new ResizeObserver((e=>{l=i.requestAnimationFrame((()=>{const{width:s,height:a}=t;let i=s,r=a;e.forEach((e=>{let{contentBoxSize:s,contentRect:a,target:n}=e;n&&n!==t.el||(i=a?a.width:(s[0]||s).inlineSize,r=a?a.height:(s[0]||s).blockSize)})),i===s&&r===a||o()}))})),n.observe(t.el)):(i.addEventListener("resize",o),i.addEventListener("orientationchange",d))})),s("destroy",(()=>{l&&i.cancelAnimationFrame(l),n&&n.unobserve&&t.el&&(n.unobserve(t.el),n=null),i.removeEventListener("resize",o),i.removeEventListener("orientationchange",d)}))},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=[],l=r(),o=function(e,s){void 0===s&&(s={});const a=new(l.MutationObserver||l.WebkitMutationObserver)((e=>{if(t.__preventObserver__)return;if(1===e.length)return void i("observerUpdate",e[0]);const s=function(){i("observerUpdate",e[0])};l.requestAnimationFrame?l.requestAnimationFrame(s):l.setTimeout(s,0)}));a.observe(e,{attributes:void 0===s.attributes||s.attributes,childList:t.isElement||(void 0===s.childList||s).childList,characterData:void 0===s.characterData||s.characterData}),n.push(a)};s({observer:!1,observeParents:!1,observeSlideChildren:!1}),a("init",(()=>{if(t.params.observer){if(t.params.observeParents){const e=E(t.hostEl);for(let t=0;t<e.length;t+=1)o(e[t])}o(t.hostEl,{childList:t.params.observeSlideChildren}),o(t.wrapperEl,{attributes:!1})}})),a("destroy",(()=>{n.forEach((e=>{e.disconnect()})),n.splice(0,n.length)}))}]);const ge=[function(e){let t,{swiper:s,extendParams:i,on:r,emit:n}=e;i({virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}});const l=a();s.virtual={cache:{},from:void 0,to:void 0,slides:[],offset:0,slidesGrid:[]};const o=l.createElement("div");function d(e,t){const a=s.params.virtual;if(a.cache&&s.virtual.cache[t])return s.virtual.cache[t];let i;return a.renderSlide?(i=a.renderSlide.call(s,e,t),"string"==typeof i&&(o.innerHTML=i,i=o.children[0])):i=s.isElement?v("swiper-slide"):v("div",s.params.slideClass),i.setAttribute("data-swiper-slide-index",t),a.renderSlide||(i.innerHTML=e),a.cache&&(s.virtual.cache[t]=i),i}function c(e,t){const{slidesPerView:a,slidesPerGroup:i,centeredSlides:r,loop:l,initialSlide:o}=s.params;if(t&&!l&&o>0)return;const{addSlidesBefore:c,addSlidesAfter:p}=s.params.virtual,{from:u,to:m,slides:h,slidesGrid:g,offset:v}=s.virtual;s.params.cssMode||s.updateActiveIndex();const w=s.activeIndex||0;let b,y,E;b=s.rtlTranslate?"right":s.isHorizontal()?"left":"top",r?(y=Math.floor(a/2)+i+p,E=Math.floor(a/2)+i+c):(y=a+(i-1)+p,E=(l?a:i)+c);let x=w-E,S=w+y;l||(x=Math.max(x,0),S=Math.min(S,h.length-1));let T=(s.slidesGrid[x]||0)-(s.slidesGrid[0]||0);function M(){s.updateSlides(),s.updateProgress(),s.updateSlidesClasses(),n("virtualUpdate")}if(l&&w>=E?(x-=E,r||(T+=s.slidesGrid[0])):l&&w<E&&(x=-E,r&&(T+=s.slidesGrid[0])),Object.assign(s.virtual,{from:x,to:S,offset:T,slidesGrid:s.slidesGrid,slidesBefore:E,slidesAfter:y}),u===x&&m===S&&!e)return s.slidesGrid!==g&&T!==v&&s.slides.forEach((e=>{e.style[b]=T-Math.abs(s.cssOverflowAdjustment())+"px"})),s.updateProgress(),void n("virtualUpdate");if(s.params.virtual.renderExternal)return s.params.virtual.renderExternal.call(s,{offset:T,from:x,to:S,slides:function(){const e=[];for(let t=x;t<=S;t+=1)e.push(h[t]);return e}()}),void(s.params.virtual.renderExternalUpdate?M():n("virtualUpdate"));const C=[],P=[],L=e=>{let t=e;return e<0?t=h.length+e:t>=h.length&&(t-=h.length),t};if(e)s.slides.filter((e=>e.matches(`.${s.params.slideClass}, swiper-slide`))).forEach((e=>{e.remove()}));else for(let e=u;e<=m;e+=1)if(e<x||e>S){const t=L(e);s.slides.filter((e=>e.matches(`.${s.params.slideClass}[data-swiper-slide-index="${t}"], swiper-slide[data-swiper-slide-index="${t}"]`))).forEach((e=>{e.remove()}))}const I=l?-h.length:0,z=l?2*h.length:h.length;for(let t=I;t<z;t+=1)if(t>=x&&t<=S){const s=L(t);void 0===m||e?P.push(s):(t>m&&P.push(s),t<u&&C.push(s))}if(P.forEach((e=>{s.slidesEl.append(d(h[e],e))})),l)for(let e=C.length-1;e>=0;e-=1){const t=C[e];s.slidesEl.prepend(d(h[t],t))}else C.sort(((e,t)=>t-e)),C.forEach((e=>{s.slidesEl.prepend(d(h[e],e))}));f(s.slidesEl,".swiper-slide, swiper-slide").forEach((e=>{e.style[b]=T-Math.abs(s.cssOverflowAdjustment())+"px"})),M()}r("beforeInit",(()=>{if(!s.params.virtual.enabled)return;let e;if(void 0===s.passedParams.virtual.slides){const t=[...s.slidesEl.children].filter((e=>e.matches(`.${s.params.slideClass}, swiper-slide`)));t&&t.length&&(s.virtual.slides=[...t],e=!0,t.forEach(((e,t)=>{e.setAttribute("data-swiper-slide-index",t),s.virtual.cache[t]=e,e.remove()})))}e||(s.virtual.slides=s.params.virtual.slides),s.classNames.push(`${s.params.containerModifierClass}virtual`),s.params.watchSlidesProgress=!0,s.originalParams.watchSlidesProgress=!0,c(!1,!0)})),r("setTranslate",(()=>{s.params.virtual.enabled&&(s.params.cssMode&&!s._immediateVirtual?(clearTimeout(t),t=setTimeout((()=>{c()}),100)):c())})),r("init update resize",(()=>{s.params.virtual.enabled&&s.params.cssMode&&u(s.wrapperEl,"--swiper-virtual-size",`${s.virtualSize}px`)})),Object.assign(s.virtual,{appendSlide:function(e){if("object"==typeof e&&"length"in e)for(let t=0;t<e.length;t+=1)e[t]&&s.virtual.slides.push(e[t]);else s.virtual.slides.push(e);c(!0)},prependSlide:function(e){const t=s.activeIndex;let a=t+1,i=1;if(Array.isArray(e)){for(let t=0;t<e.length;t+=1)e[t]&&s.virtual.slides.unshift(e[t]);a=t+e.length,i=e.length}else s.virtual.slides.unshift(e);if(s.params.virtual.cache){const e=s.virtual.cache,t={};Object.keys(e).forEach((s=>{const a=e[s],r=a.getAttribute("data-swiper-slide-index");r&&a.setAttribute("data-swiper-slide-index",parseInt(r,10)+i),t[parseInt(s,10)+i]=a})),s.virtual.cache=t}c(!0),s.slideTo(a,0)},removeSlide:function(e){if(null==e)return;let t=s.activeIndex;if(Array.isArray(e))for(let a=e.length-1;a>=0;a-=1)s.params.virtual.cache&&(delete s.virtual.cache[e[a]],Object.keys(s.virtual.cache).forEach((t=>{t>e&&(s.virtual.cache[t-1]=s.virtual.cache[t],s.virtual.cache[t-1].setAttribute("data-swiper-slide-index",t-1),delete s.virtual.cache[t])}))),s.virtual.slides.splice(e[a],1),e[a]<t&&(t-=1),t=Math.max(t,0);else s.params.virtual.cache&&(delete s.virtual.cache[e],Object.keys(s.virtual.cache).forEach((t=>{t>e&&(s.virtual.cache[t-1]=s.virtual.cache[t],s.virtual.cache[t-1].setAttribute("data-swiper-slide-index",t-1),delete s.virtual.cache[t])}))),s.virtual.slides.splice(e,1),e<t&&(t-=1),t=Math.max(t,0);c(!0),s.slideTo(t,0)},removeAllSlides:function(){s.virtual.slides=[],s.params.virtual.cache&&(s.virtual.cache={}),c(!0),s.slideTo(0,0)},update:c})},function(e){let{swiper:t,extendParams:s,on:i,emit:n}=e;const l=a(),o=r();function d(e){if(!t.enabled)return;const{rtlTranslate:s}=t;let a=e;a.originalEvent&&(a=a.originalEvent);const i=a.keyCode||a.charCode,r=t.params.keyboard.pageUpDown,d=r&&33===i,c=r&&34===i,p=37===i,u=39===i,m=38===i,h=40===i;if(!t.allowSlideNext&&(t.isHorizontal()&&u||t.isVertical()&&h||c))return!1;if(!t.allowSlidePrev&&(t.isHorizontal()&&p||t.isVertical()&&m||d))return!1;if(!(a.shiftKey||a.altKey||a.ctrlKey||a.metaKey||l.activeElement&&l.activeElement.nodeName&&("input"===l.activeElement.nodeName.toLowerCase()||"textarea"===l.activeElement.nodeName.toLowerCase()))){if(t.params.keyboard.onlyInViewport&&(d||c||p||u||m||h)){let e=!1;if(E(t.el,`.${t.params.slideClass}, swiper-slide`).length>0&&0===E(t.el,`.${t.params.slideActiveClass}`).length)return;const a=t.el,i=a.clientWidth,r=a.clientHeight,n=o.innerWidth,l=o.innerHeight,d=w(a);s&&(d.left-=a.scrollLeft);const c=[[d.left,d.top],[d.left+i,d.top],[d.left,d.top+r],[d.left+i,d.top+r]];for(let t=0;t<c.length;t+=1){const s=c[t];if(s[0]>=0&&s[0]<=n&&s[1]>=0&&s[1]<=l){if(0===s[0]&&0===s[1])continue;e=!0}}if(!e)return}t.isHorizontal()?((d||c||p||u)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),((c||u)&&!s||(d||p)&&s)&&t.slideNext(),((d||p)&&!s||(c||u)&&s)&&t.slidePrev()):((d||c||m||h)&&(a.preventDefault?a.preventDefault():a.returnValue=!1),(c||h)&&t.slideNext(),(d||m)&&t.slidePrev()),n("keyPress",i)}}function c(){t.keyboard.enabled||(l.addEventListener("keydown",d),t.keyboard.enabled=!0)}function p(){t.keyboard.enabled&&(l.removeEventListener("keydown",d),t.keyboard.enabled=!1)}t.keyboard={enabled:!1},s({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}}),i("init",(()=>{t.params.keyboard.enabled&&c()})),i("destroy",(()=>{t.keyboard.enabled&&p()})),Object.assign(t.keyboard,{enable:c,disable:p})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=r();let d;s({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null,noMousewheelClass:"swiper-no-mousewheel"}}),t.mousewheel={enabled:!1};let c,p=o();const u=[];function m(){t.enabled&&(t.mouseEntered=!0)}function h(){t.enabled&&(t.mouseEntered=!1)}function f(e){return!(t.params.mousewheel.thresholdDelta&&e.delta<t.params.mousewheel.thresholdDelta)&&(!(t.params.mousewheel.thresholdTime&&o()-p<t.params.mousewheel.thresholdTime)&&(e.delta>=6&&o()-p<60||(e.direction<0?t.isEnd&&!t.params.loop||t.animating||(t.slideNext(),i("scroll",e.raw)):t.isBeginning&&!t.params.loop||t.animating||(t.slidePrev(),i("scroll",e.raw)),p=(new n.Date).getTime(),!1)))}function g(e){let s=e,a=!0;if(!t.enabled)return;if(e.target.closest(`.${t.params.mousewheel.noMousewheelClass}`))return;const r=t.params.mousewheel;t.params.cssMode&&s.preventDefault();let n=t.el;"container"!==t.params.mousewheel.eventsTarget&&(n=document.querySelector(t.params.mousewheel.eventsTarget));const p=n&&n.contains(s.target);if(!t.mouseEntered&&!p&&!r.releaseOnEdges)return!0;s.originalEvent&&(s=s.originalEvent);let m=0;const h=t.rtlTranslate?-1:1,g=function(e){let t=0,s=0,a=0,i=0;return"detail"in e&&(s=e.detail),"wheelDelta"in e&&(s=-e.wheelDelta/120),"wheelDeltaY"in e&&(s=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=s,s=0),a=10*t,i=10*s,"deltaY"in e&&(i=e.deltaY),"deltaX"in e&&(a=e.deltaX),e.shiftKey&&!a&&(a=i,i=0),(a||i)&&e.deltaMode&&(1===e.deltaMode?(a*=40,i*=40):(a*=800,i*=800)),a&&!t&&(t=a<1?-1:1),i&&!s&&(s=i<1?-1:1),{spinX:t,spinY:s,pixelX:a,pixelY:i}}(s);if(r.forceToAxis)if(t.isHorizontal()){if(!(Math.abs(g.pixelX)>Math.abs(g.pixelY)))return!0;m=-g.pixelX*h}else{if(!(Math.abs(g.pixelY)>Math.abs(g.pixelX)))return!0;m=-g.pixelY}else m=Math.abs(g.pixelX)>Math.abs(g.pixelY)?-g.pixelX*h:-g.pixelY;if(0===m)return!0;r.invert&&(m=-m);let v=t.getTranslate()+m*r.sensitivity;if(v>=t.minTranslate()&&(v=t.minTranslate()),v<=t.maxTranslate()&&(v=t.maxTranslate()),a=!!t.params.loop||!(v===t.minTranslate()||v===t.maxTranslate()),a&&t.params.nested&&s.stopPropagation(),t.params.freeMode&&t.params.freeMode.enabled){const e={time:o(),delta:Math.abs(m),direction:Math.sign(m)},a=c&&e.time<c.time+500&&e.delta<=c.delta&&e.direction===c.direction;if(!a){c=void 0;let n=t.getTranslate()+m*r.sensitivity;const o=t.isBeginning,p=t.isEnd;if(n>=t.minTranslate()&&(n=t.minTranslate()),n<=t.maxTranslate()&&(n=t.maxTranslate()),t.setTransition(0),t.setTranslate(n),t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses(),(!o&&t.isBeginning||!p&&t.isEnd)&&t.updateSlidesClasses(),t.params.loop&&t.loopFix({direction:e.direction<0?"next":"prev",byMousewheel:!0}),t.params.freeMode.sticky){clearTimeout(d),d=void 0,u.length>=15&&u.shift();const s=u.length?u[u.length-1]:void 0,a=u[0];if(u.push(e),s&&(e.delta>s.delta||e.direction!==s.direction))u.splice(0);else if(u.length>=15&&e.time-a.time<500&&a.delta-e.delta>=1&&e.delta<=6){const s=m>0?.8:.2;c=e,u.splice(0),d=l((()=>{!t.destroyed&&t.params&&t.slideToClosest(t.params.speed,!0,void 0,s)}),0)}d||(d=l((()=>{if(t.destroyed||!t.params)return;c=e,u.splice(0),t.slideToClosest(t.params.speed,!0,void 0,.5)}),500))}if(a||i("scroll",s),t.params.autoplay&&t.params.autoplayDisableOnInteraction&&t.autoplay.stop(),r.releaseOnEdges&&(n===t.minTranslate()||n===t.maxTranslate()))return!0}}else{const s={time:o(),delta:Math.abs(m),direction:Math.sign(m),raw:e};u.length>=2&&u.shift();const a=u.length?u[u.length-1]:void 0;if(u.push(s),a?(s.direction!==a.direction||s.delta>a.delta||s.time>a.time+150)&&f(s):f(s),function(e){const s=t.params.mousewheel;if(e.direction<0){if(t.isEnd&&!t.params.loop&&s.releaseOnEdges)return!0}else if(t.isBeginning&&!t.params.loop&&s.releaseOnEdges)return!0;return!1}(s))return!0}return s.preventDefault?s.preventDefault():s.returnValue=!1,!1}function v(e){let s=t.el;"container"!==t.params.mousewheel.eventsTarget&&(s=document.querySelector(t.params.mousewheel.eventsTarget)),s[e]("mouseenter",m),s[e]("mouseleave",h),s[e]("wheel",g)}function w(){return t.params.cssMode?(t.wrapperEl.removeEventListener("wheel",g),!0):!t.mousewheel.enabled&&(v("addEventListener"),t.mousewheel.enabled=!0,!0)}function b(){return t.params.cssMode?(t.wrapperEl.addEventListener(event,g),!0):!!t.mousewheel.enabled&&(v("removeEventListener"),t.mousewheel.enabled=!1,!0)}a("init",(()=>{!t.params.mousewheel.enabled&&t.params.cssMode&&b(),t.params.mousewheel.enabled&&w()})),a("destroy",(()=>{t.params.cssMode&&w(),t.mousewheel.enabled&&b()})),Object.assign(t.mousewheel,{enable:w,disable:b})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;function r(e){let s;return e&&"string"==typeof e&&t.isElement&&(s=t.el.querySelector(e)||t.hostEl.querySelector(e),s)?s:(e&&("string"==typeof e&&(s=[...document.querySelectorAll(e)]),t.params.uniqueNavElements&&"string"==typeof e&&s&&s.length>1&&1===t.el.querySelectorAll(e).length?s=t.el.querySelector(e):s&&1===s.length&&(s=s[0])),e&&!s?e:s)}function n(e,s){const a=t.params.navigation;(e=T(e)).forEach((e=>{e&&(e.classList[s?"add":"remove"](...a.disabledClass.split(" ")),"BUTTON"===e.tagName&&(e.disabled=s),t.params.watchOverflow&&t.enabled&&e.classList[t.isLocked?"add":"remove"](a.lockClass))}))}function l(){const{nextEl:e,prevEl:s}=t.navigation;if(t.params.loop)return n(s,!1),void n(e,!1);n(s,t.isBeginning&&!t.params.rewind),n(e,t.isEnd&&!t.params.rewind)}function o(e){e.preventDefault(),(!t.isBeginning||t.params.loop||t.params.rewind)&&(t.slidePrev(),i("navigationPrev"))}function d(e){e.preventDefault(),(!t.isEnd||t.params.loop||t.params.rewind)&&(t.slideNext(),i("navigationNext"))}function c(){const e=t.params.navigation;if(t.params.navigation=re(t,t.originalParams.navigation,t.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),!e.nextEl&&!e.prevEl)return;let s=r(e.nextEl),a=r(e.prevEl);Object.assign(t.navigation,{nextEl:s,prevEl:a}),s=T(s),a=T(a);const i=(s,a)=>{s&&s.addEventListener("click","next"===a?d:o),!t.enabled&&s&&s.classList.add(...e.lockClass.split(" "))};s.forEach((e=>i(e,"next"))),a.forEach((e=>i(e,"prev")))}function p(){let{nextEl:e,prevEl:s}=t.navigation;e=T(e),s=T(s);const a=(e,s)=>{e.removeEventListener("click","next"===s?d:o),e.classList.remove(...t.params.navigation.disabledClass.split(" "))};e.forEach((e=>a(e,"next"))),s.forEach((e=>a(e,"prev")))}s({navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock",navigationDisabledClass:"swiper-navigation-disabled"}}),t.navigation={nextEl:null,prevEl:null},a("init",(()=>{!1===t.params.navigation.enabled?u():(c(),l())})),a("toEdge fromEdge lock unlock",(()=>{l()})),a("destroy",(()=>{p()})),a("enable disable",(()=>{let{nextEl:e,prevEl:s}=t.navigation;e=T(e),s=T(s),t.enabled?l():[...e,...s].filter((e=>!!e)).forEach((e=>e.classList.add(t.params.navigation.lockClass)))})),a("click",((e,s)=>{let{nextEl:a,prevEl:r}=t.navigation;a=T(a),r=T(r);const n=s.target;let l=r.includes(n)||a.includes(n);if(t.isElement&&!l){const e=s.path||s.composedPath&&s.composedPath();e&&(l=e.find((e=>a.includes(e)||r.includes(e))))}if(t.params.navigation.hideOnClick&&!l){if(t.pagination&&t.params.pagination&&t.params.pagination.clickable&&(t.pagination.el===n||t.pagination.el.contains(n)))return;let e;a.length?e=a[0].classList.contains(t.params.navigation.hiddenClass):r.length&&(e=r[0].classList.contains(t.params.navigation.hiddenClass)),i(!0===e?"navigationShow":"navigationHide"),[...a,...r].filter((e=>!!e)).forEach((e=>e.classList.toggle(t.params.navigation.hiddenClass)))}}));const u=()=>{t.el.classList.add(...t.params.navigation.navigationDisabledClass.split(" ")),p()};Object.assign(t.navigation,{enable:()=>{t.el.classList.remove(...t.params.navigation.navigationDisabledClass.split(" ")),c(),l()},disable:u,update:l,init:c,destroy:p})},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const r="swiper-pagination";let n;s({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${r}-bullet`,bulletActiveClass:`${r}-bullet-active`,modifierClass:`${r}-`,currentClass:`${r}-current`,totalClass:`${r}-total`,hiddenClass:`${r}-hidden`,progressbarFillClass:`${r}-progressbar-fill`,progressbarOppositeClass:`${r}-progressbar-opposite`,clickableClass:`${r}-clickable`,lockClass:`${r}-lock`,horizontalClass:`${r}-horizontal`,verticalClass:`${r}-vertical`,paginationDisabledClass:`${r}-disabled`}}),t.pagination={el:null,bullets:[]};let l=0;function o(){return!t.params.pagination.el||!t.pagination.el||Array.isArray(t.pagination.el)&&0===t.pagination.el.length}function d(e,s){const{bulletActiveClass:a}=t.params.pagination;e&&(e=e[("prev"===s?"previous":"next")+"ElementSibling"])&&(e.classList.add(`${a}-${s}`),(e=e[("prev"===s?"previous":"next")+"ElementSibling"])&&e.classList.add(`${a}-${s}-${s}`))}function c(e){const s=e.target.closest(ne(t.params.pagination.bulletClass));if(!s)return;e.preventDefault();const a=y(s)*t.params.slidesPerGroup;if(t.params.loop){if(t.realIndex===a)return;const e=(i=t.realIndex,r=a,n=t.slides.length,(r%=n)==1+(i%=n)?"next":r===i-1?"previous":void 0);"next"===e?t.slideNext():"previous"===e?t.slidePrev():t.slideToLoop(a)}else t.slideTo(a);var i,r,n}function p(){const e=t.rtl,s=t.params.pagination;if(o())return;let a,r,c=t.pagination.el;c=T(c);const p=t.virtual&&t.params.virtual.enabled?t.virtual.slides.length:t.slides.length,u=t.params.loop?Math.ceil(p/t.params.slidesPerGroup):t.snapGrid.length;if(t.params.loop?(r=t.previousRealIndex||0,a=t.params.slidesPerGroup>1?Math.floor(t.realIndex/t.params.slidesPerGroup):t.realIndex):void 0!==t.snapIndex?(a=t.snapIndex,r=t.previousSnapIndex):(r=t.previousIndex||0,a=t.activeIndex||0),"bullets"===s.type&&t.pagination.bullets&&t.pagination.bullets.length>0){const i=t.pagination.bullets;let o,p,u;if(s.dynamicBullets&&(n=S(i[0],t.isHorizontal()?"width":"height",!0),c.forEach((e=>{e.style[t.isHorizontal()?"width":"height"]=n*(s.dynamicMainBullets+4)+"px"})),s.dynamicMainBullets>1&&void 0!==r&&(l+=a-(r||0),l>s.dynamicMainBullets-1?l=s.dynamicMainBullets-1:l<0&&(l=0)),o=Math.max(a-l,0),p=o+(Math.min(i.length,s.dynamicMainBullets)-1),u=(p+o)/2),i.forEach((e=>{const t=[...["","-next","-next-next","-prev","-prev-prev","-main"].map((e=>`${s.bulletActiveClass}${e}`))].map((e=>"string"==typeof e&&e.includes(" ")?e.split(" "):e)).flat();e.classList.remove(...t)})),c.length>1)i.forEach((e=>{const i=y(e);i===a?e.classList.add(...s.bulletActiveClass.split(" ")):t.isElement&&e.setAttribute("part","bullet"),s.dynamicBullets&&(i>=o&&i<=p&&e.classList.add(...`${s.bulletActiveClass}-main`.split(" ")),i===o&&d(e,"prev"),i===p&&d(e,"next"))}));else{const e=i[a];if(e&&e.classList.add(...s.bulletActiveClass.split(" ")),t.isElement&&i.forEach(((e,t)=>{e.setAttribute("part",t===a?"bullet-active":"bullet")})),s.dynamicBullets){const e=i[o],t=i[p];for(let e=o;e<=p;e+=1)i[e]&&i[e].classList.add(...`${s.bulletActiveClass}-main`.split(" "));d(e,"prev"),d(t,"next")}}if(s.dynamicBullets){const a=Math.min(i.length,s.dynamicMainBullets+4),r=(n*a-n)/2-u*n,l=e?"right":"left";i.forEach((e=>{e.style[t.isHorizontal()?l:"top"]=`${r}px`}))}}c.forEach(((e,r)=>{if("fraction"===s.type&&(e.querySelectorAll(ne(s.currentClass)).forEach((e=>{e.textContent=s.formatFractionCurrent(a+1)})),e.querySelectorAll(ne(s.totalClass)).forEach((e=>{e.textContent=s.formatFractionTotal(u)}))),"progressbar"===s.type){let i;i=s.progressbarOpposite?t.isHorizontal()?"vertical":"horizontal":t.isHorizontal()?"horizontal":"vertical";const r=(a+1)/u;let n=1,l=1;"horizontal"===i?n=r:l=r,e.querySelectorAll(ne(s.progressbarFillClass)).forEach((e=>{e.style.transform=`translate3d(0,0,0) scaleX(${n}) scaleY(${l})`,e.style.transitionDuration=`${t.params.speed}ms`}))}"custom"===s.type&&s.renderCustom?(e.innerHTML=s.renderCustom(t,a+1,u),0===r&&i("paginationRender",e)):(0===r&&i("paginationRender",e),i("paginationUpdate",e)),t.params.watchOverflow&&t.enabled&&e.classList[t.isLocked?"add":"remove"](s.lockClass)}))}function u(){const e=t.params.pagination;if(o())return;const s=t.virtual&&t.params.virtual.enabled?t.virtual.slides.length:t.grid&&t.params.grid.rows>1?t.slides.length/Math.ceil(t.params.grid.rows):t.slides.length;let a=t.pagination.el;a=T(a);let r="";if("bullets"===e.type){let a=t.params.loop?Math.ceil(s/t.params.slidesPerGroup):t.snapGrid.length;t.params.freeMode&&t.params.freeMode.enabled&&a>s&&(a=s);for(let s=0;s<a;s+=1)e.renderBullet?r+=e.renderBullet.call(t,s,e.bulletClass):r+=`<${e.bulletElement} ${t.isElement?'part="bullet"':""} class="${e.bulletClass}"></${e.bulletElement}>`}"fraction"===e.type&&(r=e.renderFraction?e.renderFraction.call(t,e.currentClass,e.totalClass):`<span class="${e.currentClass}"></span> / <span class="${e.totalClass}"></span>`),"progressbar"===e.type&&(r=e.renderProgressbar?e.renderProgressbar.call(t,e.progressbarFillClass):`<span class="${e.progressbarFillClass}"></span>`),t.pagination.bullets=[],a.forEach((s=>{"custom"!==e.type&&(s.innerHTML=r||""),"bullets"===e.type&&t.pagination.bullets.push(...s.querySelectorAll(ne(e.bulletClass)))})),"custom"!==e.type&&i("paginationRender",a[0])}function m(){t.params.pagination=re(t,t.originalParams.pagination,t.params.pagination,{el:"swiper-pagination"});const e=t.params.pagination;if(!e.el)return;let s;"string"==typeof e.el&&t.isElement&&(s=t.el.querySelector(e.el)),s||"string"!=typeof e.el||(s=[...document.querySelectorAll(e.el)]),s||(s=e.el),s&&0!==s.length&&(t.params.uniqueNavElements&&"string"==typeof e.el&&Array.isArray(s)&&s.length>1&&(s=[...t.el.querySelectorAll(e.el)],s.length>1&&(s=s.filter((e=>E(e,".swiper")[0]===t.el))[0])),Array.isArray(s)&&1===s.length&&(s=s[0]),Object.assign(t.pagination,{el:s}),s=T(s),s.forEach((s=>{"bullets"===e.type&&e.clickable&&s.classList.add(...(e.clickableClass||"").split(" ")),s.classList.add(e.modifierClass+e.type),s.classList.add(t.isHorizontal()?e.horizontalClass:e.verticalClass),"bullets"===e.type&&e.dynamicBullets&&(s.classList.add(`${e.modifierClass}${e.type}-dynamic`),l=0,e.dynamicMainBullets<1&&(e.dynamicMainBullets=1)),"progressbar"===e.type&&e.progressbarOpposite&&s.classList.add(e.progressbarOppositeClass),e.clickable&&s.addEventListener("click",c),t.enabled||s.classList.add(e.lockClass)})))}function h(){const e=t.params.pagination;if(o())return;let s=t.pagination.el;s&&(s=T(s),s.forEach((s=>{s.classList.remove(e.hiddenClass),s.classList.remove(e.modifierClass+e.type),s.classList.remove(t.isHorizontal()?e.horizontalClass:e.verticalClass),e.clickable&&(s.classList.remove(...(e.clickableClass||"").split(" ")),s.removeEventListener("click",c))}))),t.pagination.bullets&&t.pagination.bullets.forEach((t=>t.classList.remove(...e.bulletActiveClass.split(" "))))}a("changeDirection",(()=>{if(!t.pagination||!t.pagination.el)return;const e=t.params.pagination;let{el:s}=t.pagination;s=T(s),s.forEach((s=>{s.classList.remove(e.horizontalClass,e.verticalClass),s.classList.add(t.isHorizontal()?e.horizontalClass:e.verticalClass)}))})),a("init",(()=>{!1===t.params.pagination.enabled?f():(m(),u(),p())})),a("activeIndexChange",(()=>{void 0===t.snapIndex&&p()})),a("snapIndexChange",(()=>{p()})),a("snapGridLengthChange",(()=>{u(),p()})),a("destroy",(()=>{h()})),a("enable disable",(()=>{let{el:e}=t.pagination;e&&(e=T(e),e.forEach((e=>e.classList[t.enabled?"remove":"add"](t.params.pagination.lockClass))))})),a("lock unlock",(()=>{p()})),a("click",((e,s)=>{const a=s.target,r=T(t.pagination.el);if(t.params.pagination.el&&t.params.pagination.hideOnClick&&r&&r.length>0&&!a.classList.contains(t.params.pagination.bulletClass)){if(t.navigation&&(t.navigation.nextEl&&a===t.navigation.nextEl||t.navigation.prevEl&&a===t.navigation.prevEl))return;const e=r[0].classList.contains(t.params.pagination.hiddenClass);i(!0===e?"paginationShow":"paginationHide"),r.forEach((e=>e.classList.toggle(t.params.pagination.hiddenClass)))}}));const f=()=>{t.el.classList.add(t.params.pagination.paginationDisabledClass);let{el:e}=t.pagination;e&&(e=T(e),e.forEach((e=>e.classList.add(t.params.pagination.paginationDisabledClass)))),h()};Object.assign(t.pagination,{enable:()=>{t.el.classList.remove(t.params.pagination.paginationDisabledClass);let{el:e}=t.pagination;e&&(e=T(e),e.forEach((e=>e.classList.remove(t.params.pagination.paginationDisabledClass)))),m(),u(),p()},disable:f,render:u,update:p,init:m,destroy:h})},function(e){let{swiper:t,extendParams:s,on:i,emit:r}=e;const o=a();let d,c,p,u,m=!1,h=null,f=null;function g(){if(!t.params.scrollbar.el||!t.scrollbar.el)return;const{scrollbar:e,rtlTranslate:s}=t,{dragEl:a,el:i}=e,r=t.params.scrollbar,n=t.params.loop?t.progressLoop:t.progress;let l=c,o=(p-c)*n;s?(o=-o,o>0?(l=c-o,o=0):-o+c>p&&(l=p+o)):o<0?(l=c+o,o=0):o+c>p&&(l=p-o),t.isHorizontal()?(a.style.transform=`translate3d(${o}px, 0, 0)`,a.style.width=`${l}px`):(a.style.transform=`translate3d(0px, ${o}px, 0)`,a.style.height=`${l}px`),r.hide&&(clearTimeout(h),i.style.opacity=1,h=setTimeout((()=>{i.style.opacity=0,i.style.transitionDuration="400ms"}),1e3))}function b(){if(!t.params.scrollbar.el||!t.scrollbar.el)return;const{scrollbar:e}=t,{dragEl:s,el:a}=e;s.style.width="",s.style.height="",p=t.isHorizontal()?a.offsetWidth:a.offsetHeight,u=t.size/(t.virtualSize+t.params.slidesOffsetBefore-(t.params.centeredSlides?t.snapGrid[0]:0)),c="auto"===t.params.scrollbar.dragSize?p*u:parseInt(t.params.scrollbar.dragSize,10),t.isHorizontal()?s.style.width=`${c}px`:s.style.height=`${c}px`,a.style.display=u>=1?"none":"",t.params.scrollbar.hide&&(a.style.opacity=0),t.params.watchOverflow&&t.enabled&&e.el.classList[t.isLocked?"add":"remove"](t.params.scrollbar.lockClass)}function y(e){return t.isHorizontal()?e.clientX:e.clientY}function E(e){const{scrollbar:s,rtlTranslate:a}=t,{el:i}=s;let r;r=(y(e)-w(i)[t.isHorizontal()?"left":"top"]-(null!==d?d:c/2))/(p-c),r=Math.max(Math.min(r,1),0),a&&(r=1-r);const n=t.minTranslate()+(t.maxTranslate()-t.minTranslate())*r;t.updateProgress(n),t.setTranslate(n),t.updateActiveIndex(),t.updateSlidesClasses()}function x(e){const s=t.params.scrollbar,{scrollbar:a,wrapperEl:i}=t,{el:n,dragEl:l}=a;m=!0,d=e.target===l?y(e)-e.target.getBoundingClientRect()[t.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),i.style.transitionDuration="100ms",l.style.transitionDuration="100ms",E(e),clearTimeout(f),n.style.transitionDuration="0ms",s.hide&&(n.style.opacity=1),t.params.cssMode&&(t.wrapperEl.style["scroll-snap-type"]="none"),r("scrollbarDragStart",e)}function S(e){const{scrollbar:s,wrapperEl:a}=t,{el:i,dragEl:n}=s;m&&(e.preventDefault&&e.cancelable?e.preventDefault():e.returnValue=!1,E(e),a.style.transitionDuration="0ms",i.style.transitionDuration="0ms",n.style.transitionDuration="0ms",r("scrollbarDragMove",e))}function M(e){const s=t.params.scrollbar,{scrollbar:a,wrapperEl:i}=t,{el:n}=a;m&&(m=!1,t.params.cssMode&&(t.wrapperEl.style["scroll-snap-type"]="",i.style.transitionDuration=""),s.hide&&(clearTimeout(f),f=l((()=>{n.style.opacity=0,n.style.transitionDuration="400ms"}),1e3)),r("scrollbarDragEnd",e),s.snapOnRelease&&t.slideToClosest())}function C(e){const{scrollbar:s,params:a}=t,i=s.el;if(!i)return;const r=i,n=!!a.passiveListeners&&{passive:!1,capture:!1},l=!!a.passiveListeners&&{passive:!0,capture:!1};if(!r)return;const d="on"===e?"addEventListener":"removeEventListener";r[d]("pointerdown",x,n),o[d]("pointermove",S,n),o[d]("pointerup",M,l)}function P(){const{scrollbar:e,el:s}=t;t.params.scrollbar=re(t,t.originalParams.scrollbar,t.params.scrollbar,{el:"swiper-scrollbar"});const a=t.params.scrollbar;if(!a.el)return;let i,r;if("string"==typeof a.el&&t.isElement&&(i=t.el.querySelector(a.el)),i||"string"!=typeof a.el)i||(i=a.el);else if(i=o.querySelectorAll(a.el),!i.length)return;t.params.uniqueNavElements&&"string"==typeof a.el&&i.length>1&&1===s.querySelectorAll(a.el).length&&(i=s.querySelector(a.el)),i.length>0&&(i=i[0]),i.classList.add(t.isHorizontal()?a.horizontalClass:a.verticalClass),i&&(r=i.querySelector(ne(t.params.scrollbar.dragClass)),r||(r=v("div",t.params.scrollbar.dragClass),i.append(r))),Object.assign(e,{el:i,dragEl:r}),a.draggable&&t.params.scrollbar.el&&t.scrollbar.el&&C("on"),i&&i.classList[t.enabled?"remove":"add"](...n(t.params.scrollbar.lockClass))}function L(){const e=t.params.scrollbar,s=t.scrollbar.el;s&&s.classList.remove(...n(t.isHorizontal()?e.horizontalClass:e.verticalClass)),t.params.scrollbar.el&&t.scrollbar.el&&C("off")}s({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag",scrollbarDisabledClass:"swiper-scrollbar-disabled",horizontalClass:"swiper-scrollbar-horizontal",verticalClass:"swiper-scrollbar-vertical"}}),t.scrollbar={el:null,dragEl:null},i("changeDirection",(()=>{if(!t.scrollbar||!t.scrollbar.el)return;const e=t.params.scrollbar;let{el:s}=t.scrollbar;s=T(s),s.forEach((s=>{s.classList.remove(e.horizontalClass,e.verticalClass),s.classList.add(t.isHorizontal()?e.horizontalClass:e.verticalClass)}))})),i("init",(()=>{!1===t.params.scrollbar.enabled?I():(P(),b(),g())})),i("update resize observerUpdate lock unlock changeDirection",(()=>{b()})),i("setTranslate",(()=>{g()})),i("setTransition",((e,s)=>{!function(e){t.params.scrollbar.el&&t.scrollbar.el&&(t.scrollbar.dragEl.style.transitionDuration=`${e}ms`)}(s)})),i("enable disable",(()=>{const{el:e}=t.scrollbar;e&&e.classList[t.enabled?"remove":"add"](...n(t.params.scrollbar.lockClass))})),i("destroy",(()=>{L()}));const I=()=>{t.el.classList.add(...n(t.params.scrollbar.scrollbarDisabledClass)),t.scrollbar.el&&t.scrollbar.el.classList.add(...n(t.params.scrollbar.scrollbarDisabledClass)),L()};Object.assign(t.scrollbar,{enable:()=>{t.el.classList.remove(...n(t.params.scrollbar.scrollbarDisabledClass)),t.scrollbar.el&&t.scrollbar.el.classList.remove(...n(t.params.scrollbar.scrollbarDisabledClass)),P(),b(),g()},disable:I,updateSize:b,setTranslate:g,init:P,destroy:L})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({parallax:{enabled:!1}});const i="[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]",r=(e,s)=>{const{rtl:a}=t,i=a?-1:1,r=e.getAttribute("data-swiper-parallax")||"0";let n=e.getAttribute("data-swiper-parallax-x"),l=e.getAttribute("data-swiper-parallax-y");const o=e.getAttribute("data-swiper-parallax-scale"),d=e.getAttribute("data-swiper-parallax-opacity"),c=e.getAttribute("data-swiper-parallax-rotate");if(n||l?(n=n||"0",l=l||"0"):t.isHorizontal()?(n=r,l="0"):(l=r,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*s*i+"%":n*s*i+"px",l=l.indexOf("%")>=0?parseInt(l,10)*s+"%":l*s+"px",null!=d){const t=d-(d-1)*(1-Math.abs(s));e.style.opacity=t}let p=`translate3d(${n}, ${l}, 0px)`;if(null!=o){p+=` scale(${o-(o-1)*(1-Math.abs(s))})`}if(c&&null!=c){p+=` rotate(${c*s*-1}deg)`}e.style.transform=p},n=()=>{const{el:e,slides:s,progress:a,snapGrid:n,isElement:l}=t,o=f(e,i);t.isElement&&o.push(...f(t.hostEl,i)),o.forEach((e=>{r(e,a)})),s.forEach(((e,s)=>{let l=e.progress;t.params.slidesPerGroup>1&&"auto"!==t.params.slidesPerView&&(l+=Math.ceil(s/2)-a*(n.length-1)),l=Math.min(Math.max(l,-1),1),e.querySelectorAll(`${i}, [data-swiper-parallax-rotate]`).forEach((e=>{r(e,l)}))}))};a("beforeInit",(()=>{t.params.parallax.enabled&&(t.params.watchSlidesProgress=!0,t.originalParams.watchSlidesProgress=!0)})),a("init",(()=>{t.params.parallax.enabled&&n()})),a("setTranslate",(()=>{t.params.parallax.enabled&&n()})),a("setTransition",((e,s)=>{t.params.parallax.enabled&&function(e){void 0===e&&(e=t.params.speed);const{el:s,hostEl:a}=t,r=[...s.querySelectorAll(i)];t.isElement&&r.push(...a.querySelectorAll(i)),r.forEach((t=>{let s=parseInt(t.getAttribute("data-swiper-parallax-duration"),10)||e;0===e&&(s=0),t.style.transitionDuration=`${s}ms`}))}(s)}))},function(e){let{swiper:t,extendParams:s,on:a,emit:i}=e;const n=r();s({zoom:{enabled:!1,limitToOriginalSize:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),t.zoom={enabled:!1};let l,o,c=1,p=!1;const u=[],m={originX:0,originY:0,slideEl:void 0,slideWidth:void 0,slideHeight:void 0,imageEl:void 0,imageWrapEl:void 0,maxRatio:3},h={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},g={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let v,b=1;function y(){if(u.length<2)return 1;const e=u[0].pageX,t=u[0].pageY,s=u[1].pageX,a=u[1].pageY;return Math.sqrt((s-e)**2+(a-t)**2)}function x(){const e=t.params.zoom,s=m.imageWrapEl.getAttribute("data-swiper-zoom")||e.maxRatio;if(e.limitToOriginalSize&&m.imageEl&&m.imageEl.naturalWidth){const e=m.imageEl.naturalWidth/m.imageEl.offsetWidth;return Math.min(e,s)}return s}function S(e){const s=t.isElement?"swiper-slide":`.${t.params.slideClass}`;return!!e.target.matches(s)||t.slides.filter((t=>t.contains(e.target))).length>0}function T(e){if("mouse"===e.pointerType&&u.splice(0,u.length),!S(e))return;const s=t.params.zoom;if(l=!1,o=!1,u.push(e),!(u.length<2)){if(l=!0,m.scaleStart=y(),!m.slideEl){m.slideEl=e.target.closest(`.${t.params.slideClass}, swiper-slide`),m.slideEl||(m.slideEl=t.slides[t.activeIndex]);let a=m.slideEl.querySelector(`.${s.containerClass}`);if(a&&(a=a.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]),m.imageEl=a,m.imageWrapEl=a?E(m.imageEl,`.${s.containerClass}`)[0]:void 0,!m.imageWrapEl)return void(m.imageEl=void 0);m.maxRatio=x()}if(m.imageEl){const[e,t]=function(){if(u.length<2)return{x:null,y:null};const e=m.imageEl.getBoundingClientRect();return[(u[0].pageX+(u[1].pageX-u[0].pageX)/2-e.x-n.scrollX)/c,(u[0].pageY+(u[1].pageY-u[0].pageY)/2-e.y-n.scrollY)/c]}();m.originX=e,m.originY=t,m.imageEl.style.transitionDuration="0ms"}p=!0}}function M(e){if(!S(e))return;const s=t.params.zoom,a=t.zoom,i=u.findIndex((t=>t.pointerId===e.pointerId));i>=0&&(u[i]=e),u.length<2||(o=!0,m.scaleMove=y(),m.imageEl&&(a.scale=m.scaleMove/m.scaleStart*c,a.scale>m.maxRatio&&(a.scale=m.maxRatio-1+(a.scale-m.maxRatio+1)**.5),a.scale<s.minRatio&&(a.scale=s.minRatio+1-(s.minRatio-a.scale+1)**.5),m.imageEl.style.transform=`translate3d(0,0,0) scale(${a.scale})`))}function C(e){if(!S(e))return;if("mouse"===e.pointerType&&"pointerout"===e.type)return;const s=t.params.zoom,a=t.zoom,i=u.findIndex((t=>t.pointerId===e.pointerId));i>=0&&u.splice(i,1),l&&o&&(l=!1,o=!1,m.imageEl&&(a.scale=Math.max(Math.min(a.scale,m.maxRatio),s.minRatio),m.imageEl.style.transitionDuration=`${t.params.speed}ms`,m.imageEl.style.transform=`translate3d(0,0,0) scale(${a.scale})`,c=a.scale,p=!1,a.scale>1&&m.slideEl?m.slideEl.classList.add(`${s.zoomedSlideClass}`):a.scale<=1&&m.slideEl&&m.slideEl.classList.remove(`${s.zoomedSlideClass}`),1===a.scale&&(m.originX=0,m.originY=0,m.slideEl=void 0)))}function P(){t.touchEventsData.preventTouchMoveFromPointerMove=!1}function L(e){if(!S(e)||!function(e){const s=`.${t.params.zoom.containerClass}`;return!!e.target.matches(s)||[...t.hostEl.querySelectorAll(s)].filter((t=>t.contains(e.target))).length>0}(e))return;const s=t.zoom;if(!m.imageEl)return;if(!h.isTouched||!m.slideEl)return;h.isMoved||(h.width=m.imageEl.offsetWidth||m.imageEl.clientWidth,h.height=m.imageEl.offsetHeight||m.imageEl.clientHeight,h.startX=d(m.imageWrapEl,"x")||0,h.startY=d(m.imageWrapEl,"y")||0,m.slideWidth=m.slideEl.offsetWidth,m.slideHeight=m.slideEl.offsetHeight,m.imageWrapEl.style.transitionDuration="0ms");const a=h.width*s.scale,i=h.height*s.scale;h.minX=Math.min(m.slideWidth/2-a/2,0),h.maxX=-h.minX,h.minY=Math.min(m.slideHeight/2-i/2,0),h.maxY=-h.minY,h.touchesCurrent.x=u.length>0?u[0].pageX:e.pageX,h.touchesCurrent.y=u.length>0?u[0].pageY:e.pageY;if(Math.max(Math.abs(h.touchesCurrent.x-h.touchesStart.x),Math.abs(h.touchesCurrent.y-h.touchesStart.y))>5&&(t.allowClick=!1),!h.isMoved&&!p){if(t.isHorizontal()&&(Math.floor(h.minX)===Math.floor(h.startX)&&h.touchesCurrent.x<h.touchesStart.x||Math.floor(h.maxX)===Math.floor(h.startX)&&h.touchesCurrent.x>h.touchesStart.x))return h.isTouched=!1,void P();if(!t.isHorizontal()&&(Math.floor(h.minY)===Math.floor(h.startY)&&h.touchesCurrent.y<h.touchesStart.y||Math.floor(h.maxY)===Math.floor(h.startY)&&h.touchesCurrent.y>h.touchesStart.y))return h.isTouched=!1,void P()}e.cancelable&&e.preventDefault(),e.stopPropagation(),clearTimeout(v),t.touchEventsData.preventTouchMoveFromPointerMove=!0,v=setTimeout((()=>{t.destroyed||P()})),h.isMoved=!0;const r=(s.scale-c)/(m.maxRatio-t.params.zoom.minRatio),{originX:n,originY:l}=m;h.currentX=h.touchesCurrent.x-h.touchesStart.x+h.startX+r*(h.width-2*n),h.currentY=h.touchesCurrent.y-h.touchesStart.y+h.startY+r*(h.height-2*l),h.currentX<h.minX&&(h.currentX=h.minX+1-(h.minX-h.currentX+1)**.8),h.currentX>h.maxX&&(h.currentX=h.maxX-1+(h.currentX-h.maxX+1)**.8),h.currentY<h.minY&&(h.currentY=h.minY+1-(h.minY-h.currentY+1)**.8),h.currentY>h.maxY&&(h.currentY=h.maxY-1+(h.currentY-h.maxY+1)**.8),g.prevPositionX||(g.prevPositionX=h.touchesCurrent.x),g.prevPositionY||(g.prevPositionY=h.touchesCurrent.y),g.prevTime||(g.prevTime=Date.now()),g.x=(h.touchesCurrent.x-g.prevPositionX)/(Date.now()-g.prevTime)/2,g.y=(h.touchesCurrent.y-g.prevPositionY)/(Date.now()-g.prevTime)/2,Math.abs(h.touchesCurrent.x-g.prevPositionX)<2&&(g.x=0),Math.abs(h.touchesCurrent.y-g.prevPositionY)<2&&(g.y=0),g.prevPositionX=h.touchesCurrent.x,g.prevPositionY=h.touchesCurrent.y,g.prevTime=Date.now(),m.imageWrapEl.style.transform=`translate3d(${h.currentX}px, ${h.currentY}px,0)`}function I(){const e=t.zoom;m.slideEl&&t.activeIndex!==t.slides.indexOf(m.slideEl)&&(m.imageEl&&(m.imageEl.style.transform="translate3d(0,0,0) scale(1)"),m.imageWrapEl&&(m.imageWrapEl.style.transform="translate3d(0,0,0)"),m.slideEl.classList.remove(`${t.params.zoom.zoomedSlideClass}`),e.scale=1,c=1,m.slideEl=void 0,m.imageEl=void 0,m.imageWrapEl=void 0,m.originX=0,m.originY=0)}function z(e){const s=t.zoom,a=t.params.zoom;if(!m.slideEl){e&&e.target&&(m.slideEl=e.target.closest(`.${t.params.slideClass}, swiper-slide`)),m.slideEl||(t.params.virtual&&t.params.virtual.enabled&&t.virtual?m.slideEl=f(t.slidesEl,`.${t.params.slideActiveClass}`)[0]:m.slideEl=t.slides[t.activeIndex]);let s=m.slideEl.querySelector(`.${a.containerClass}`);s&&(s=s.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]),m.imageEl=s,m.imageWrapEl=s?E(m.imageEl,`.${a.containerClass}`)[0]:void 0}if(!m.imageEl||!m.imageWrapEl)return;let i,r,l,o,d,p,u,g,v,b,y,S,T,M,C,P,L,I;t.params.cssMode&&(t.wrapperEl.style.overflow="hidden",t.wrapperEl.style.touchAction="none"),m.slideEl.classList.add(`${a.zoomedSlideClass}`),void 0===h.touchesStart.x&&e?(i=e.pageX,r=e.pageY):(i=h.touchesStart.x,r=h.touchesStart.y);const z="number"==typeof e?e:null;1===c&&z&&(i=void 0,r=void 0,h.touchesStart.x=void 0,h.touchesStart.y=void 0);const A=x();s.scale=z||A,c=z||A,!e||1===c&&z?(u=0,g=0):(L=m.slideEl.offsetWidth,I=m.slideEl.offsetHeight,l=w(m.slideEl).left+n.scrollX,o=w(m.slideEl).top+n.scrollY,d=l+L/2-i,p=o+I/2-r,v=m.imageEl.offsetWidth||m.imageEl.clientWidth,b=m.imageEl.offsetHeight||m.imageEl.clientHeight,y=v*s.scale,S=b*s.scale,T=Math.min(L/2-y/2,0),M=Math.min(I/2-S/2,0),C=-T,P=-M,u=d*s.scale,g=p*s.scale,u<T&&(u=T),u>C&&(u=C),g<M&&(g=M),g>P&&(g=P)),z&&1===s.scale&&(m.originX=0,m.originY=0),m.imageWrapEl.style.transitionDuration="300ms",m.imageWrapEl.style.transform=`translate3d(${u}px, ${g}px,0)`,m.imageEl.style.transitionDuration="300ms",m.imageEl.style.transform=`translate3d(0,0,0) scale(${s.scale})`}function A(){const e=t.zoom,s=t.params.zoom;if(!m.slideEl){t.params.virtual&&t.params.virtual.enabled&&t.virtual?m.slideEl=f(t.slidesEl,`.${t.params.slideActiveClass}`)[0]:m.slideEl=t.slides[t.activeIndex];let e=m.slideEl.querySelector(`.${s.containerClass}`);e&&(e=e.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]),m.imageEl=e,m.imageWrapEl=e?E(m.imageEl,`.${s.containerClass}`)[0]:void 0}m.imageEl&&m.imageWrapEl&&(t.params.cssMode&&(t.wrapperEl.style.overflow="",t.wrapperEl.style.touchAction=""),e.scale=1,c=1,h.touchesStart.x=void 0,h.touchesStart.y=void 0,m.imageWrapEl.style.transitionDuration="300ms",m.imageWrapEl.style.transform="translate3d(0,0,0)",m.imageEl.style.transitionDuration="300ms",m.imageEl.style.transform="translate3d(0,0,0) scale(1)",m.slideEl.classList.remove(`${s.zoomedSlideClass}`),m.slideEl=void 0,m.originX=0,m.originY=0)}function $(e){const s=t.zoom;s.scale&&1!==s.scale?A():z(e)}function k(){return{passiveListener:!!t.params.passiveListeners&&{passive:!0,capture:!1},activeListenerWithCapture:!t.params.passiveListeners||{passive:!1,capture:!0}}}function O(){const e=t.zoom;if(e.enabled)return;e.enabled=!0;const{passiveListener:s,activeListenerWithCapture:a}=k();t.wrapperEl.addEventListener("pointerdown",T,s),t.wrapperEl.addEventListener("pointermove",M,a),["pointerup","pointercancel","pointerout"].forEach((e=>{t.wrapperEl.addEventListener(e,C,s)})),t.wrapperEl.addEventListener("pointermove",L,a)}function D(){const e=t.zoom;if(!e.enabled)return;e.enabled=!1;const{passiveListener:s,activeListenerWithCapture:a}=k();t.wrapperEl.removeEventListener("pointerdown",T,s),t.wrapperEl.removeEventListener("pointermove",M,a),["pointerup","pointercancel","pointerout"].forEach((e=>{t.wrapperEl.removeEventListener(e,C,s)})),t.wrapperEl.removeEventListener("pointermove",L,a)}Object.defineProperty(t.zoom,"scale",{get:()=>b,set(e){if(b!==e){const t=m.imageEl,s=m.slideEl;i("zoomChange",e,t,s)}b=e}}),a("init",(()=>{t.params.zoom.enabled&&O()})),a("destroy",(()=>{D()})),a("touchStart",((e,s)=>{t.zoom.enabled&&function(e){const s=t.device;if(!m.imageEl)return;if(h.isTouched)return;s.android&&e.cancelable&&e.preventDefault(),h.isTouched=!0;const a=u.length>0?u[0]:e;h.touchesStart.x=a.pageX,h.touchesStart.y=a.pageY}(s)})),a("touchEnd",((e,s)=>{t.zoom.enabled&&function(){const e=t.zoom;if(!m.imageEl)return;if(!h.isTouched||!h.isMoved)return h.isTouched=!1,void(h.isMoved=!1);h.isTouched=!1,h.isMoved=!1;let s=300,a=300;const i=g.x*s,r=h.currentX+i,n=g.y*a,l=h.currentY+n;0!==g.x&&(s=Math.abs((r-h.currentX)/g.x)),0!==g.y&&(a=Math.abs((l-h.currentY)/g.y));const o=Math.max(s,a);h.currentX=r,h.currentY=l;const d=h.width*e.scale,c=h.height*e.scale;h.minX=Math.min(m.slideWidth/2-d/2,0),h.maxX=-h.minX,h.minY=Math.min(m.slideHeight/2-c/2,0),h.maxY=-h.minY,h.currentX=Math.max(Math.min(h.currentX,h.maxX),h.minX),h.currentY=Math.max(Math.min(h.currentY,h.maxY),h.minY),m.imageWrapEl.style.transitionDuration=`${o}ms`,m.imageWrapEl.style.transform=`translate3d(${h.currentX}px, ${h.currentY}px,0)`}()})),a("doubleTap",((e,s)=>{!t.animating&&t.params.zoom.enabled&&t.zoom.enabled&&t.params.zoom.toggle&&$(s)})),a("transitionEnd",(()=>{t.zoom.enabled&&t.params.zoom.enabled&&I()})),a("slideChange",(()=>{t.zoom.enabled&&t.params.zoom.enabled&&t.params.cssMode&&I()})),Object.assign(t.zoom,{enable:O,disable:D,in:z,out:A,toggle:$})},function(e){let{swiper:t,extendParams:s,on:a}=e;function i(e,t){const s=function(){let e,t,s;return(a,i)=>{for(t=-1,e=a.length;e-t>1;)s=e+t>>1,a[s]<=i?t=s:e=s;return e}}();let a,i;return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(i=s(this.x,e),a=i-1,(e-this.x[a])*(this.y[i]-this.y[a])/(this.x[i]-this.x[a])+this.y[a]):0},this}function r(){t.controller.control&&t.controller.spline&&(t.controller.spline=void 0,delete t.controller.spline)}s({controller:{control:void 0,inverse:!1,by:"slide"}}),t.controller={control:void 0},a("beforeInit",(()=>{if("undefined"!=typeof window&&("string"==typeof t.params.controller.control||t.params.controller.control instanceof HTMLElement)){("string"==typeof t.params.controller.control?[...document.querySelectorAll(t.params.controller.control)]:[t.params.controller.control]).forEach((e=>{if(t.controller.control||(t.controller.control=[]),e&&e.swiper)t.controller.control.push(e.swiper);else if(e){const s=`${t.params.eventsPrefix}init`,a=i=>{t.controller.control.push(i.detail[0]),t.update(),e.removeEventListener(s,a)};e.addEventListener(s,a)}}))}else t.controller.control=t.params.controller.control})),a("update",(()=>{r()})),a("resize",(()=>{r()})),a("observerUpdate",(()=>{r()})),a("setTranslate",((e,s,a)=>{t.controller.control&&!t.controller.control.destroyed&&t.controller.setTranslate(s,a)})),a("setTransition",((e,s,a)=>{t.controller.control&&!t.controller.control.destroyed&&t.controller.setTransition(s,a)})),Object.assign(t.controller,{setTranslate:function(e,s){const a=t.controller.control;let r,n;const l=t.constructor;function o(e){if(e.destroyed)return;const s=t.rtlTranslate?-t.translate:t.translate;"slide"===t.params.controller.by&&(!function(e){t.controller.spline=t.params.loop?new i(t.slidesGrid,e.slidesGrid):new i(t.snapGrid,e.snapGrid)}(e),n=-t.controller.spline.interpolate(-s)),n&&"container"!==t.params.controller.by||(r=(e.maxTranslate()-e.minTranslate())/(t.maxTranslate()-t.minTranslate()),!Number.isNaN(r)&&Number.isFinite(r)||(r=1),n=(s-t.minTranslate())*r+e.minTranslate()),t.params.controller.inverse&&(n=e.maxTranslate()-n),e.updateProgress(n),e.setTranslate(n,t),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(a))for(let e=0;e<a.length;e+=1)a[e]!==s&&a[e]instanceof l&&o(a[e]);else a instanceof l&&s!==a&&o(a)},setTransition:function(e,s){const a=t.constructor,i=t.controller.control;let r;function n(s){s.destroyed||(s.setTransition(e,t),0!==e&&(s.transitionStart(),s.params.autoHeight&&l((()=>{s.updateAutoHeight()})),x(s.wrapperEl,(()=>{i&&s.transitionEnd()}))))}if(Array.isArray(i))for(r=0;r<i.length;r+=1)i[r]!==s&&i[r]instanceof a&&n(i[r]);else i instanceof a&&s!==i&&n(i)}})},function(e){let{swiper:t,extendParams:s,on:i}=e;s({a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",slideLabelMessage:"{{index}} / {{slidesLength}}",containerMessage:null,containerRoleDescriptionMessage:null,containerRole:null,itemRoleDescriptionMessage:null,slideRole:"group",id:null,scrollOnFocus:!0}}),t.a11y={clicked:!1};let r,n,l=null,o=(new Date).getTime();function d(e){const t=l;0!==t.length&&(t.innerHTML="",t.innerHTML=e)}function c(e){(e=T(e)).forEach((e=>{e.setAttribute("tabIndex","0")}))}function p(e){(e=T(e)).forEach((e=>{e.setAttribute("tabIndex","-1")}))}function u(e,t){(e=T(e)).forEach((e=>{e.setAttribute("role",t)}))}function m(e,t){(e=T(e)).forEach((e=>{e.setAttribute("aria-roledescription",t)}))}function h(e,t){(e=T(e)).forEach((e=>{e.setAttribute("aria-label",t)}))}function f(e){(e=T(e)).forEach((e=>{e.setAttribute("aria-disabled",!0)}))}function g(e){(e=T(e)).forEach((e=>{e.setAttribute("aria-disabled",!1)}))}function w(e){if(13!==e.keyCode&&32!==e.keyCode)return;const s=t.params.a11y,a=e.target;if(!t.pagination||!t.pagination.el||a!==t.pagination.el&&!t.pagination.el.contains(e.target)||e.target.matches(ne(t.params.pagination.bulletClass))){if(t.navigation&&t.navigation.prevEl&&t.navigation.nextEl){const e=T(t.navigation.prevEl);T(t.navigation.nextEl).includes(a)&&(t.isEnd&&!t.params.loop||t.slideNext(),t.isEnd?d(s.lastSlideMessage):d(s.nextSlideMessage)),e.includes(a)&&(t.isBeginning&&!t.params.loop||t.slidePrev(),t.isBeginning?d(s.firstSlideMessage):d(s.prevSlideMessage))}t.pagination&&a.matches(ne(t.params.pagination.bulletClass))&&a.click()}}function b(){return t.pagination&&t.pagination.bullets&&t.pagination.bullets.length}function E(){return b()&&t.params.pagination.clickable}const x=(e,t,s)=>{c(e),"BUTTON"!==e.tagName&&(u(e,"button"),e.addEventListener("keydown",w)),h(e,s),function(e,t){(e=T(e)).forEach((e=>{e.setAttribute("aria-controls",t)}))}(e,t)},S=e=>{n&&n!==e.target&&!n.contains(e.target)&&(r=!0),t.a11y.clicked=!0},M=()=>{r=!1,requestAnimationFrame((()=>{requestAnimationFrame((()=>{t.destroyed||(t.a11y.clicked=!1)}))}))},C=e=>{o=(new Date).getTime()},P=e=>{if(t.a11y.clicked||!t.params.a11y.scrollOnFocus)return;if((new Date).getTime()-o<100)return;const s=e.target.closest(`.${t.params.slideClass}, swiper-slide`);if(!s||!t.slides.includes(s))return;n=s;const a=t.slides.indexOf(s)===t.activeIndex,i=t.params.watchSlidesProgress&&t.visibleSlides&&t.visibleSlides.includes(s);a||i||e.sourceCapabilities&&e.sourceCapabilities.firesTouchEvents||(t.isHorizontal()?t.el.scrollLeft=0:t.el.scrollTop=0,requestAnimationFrame((()=>{r||(t.params.loop?t.slideToLoop(parseInt(s.getAttribute("data-swiper-slide-index")),0):t.slideTo(t.slides.indexOf(s),0),r=!1)})))},L=()=>{const e=t.params.a11y;e.itemRoleDescriptionMessage&&m(t.slides,e.itemRoleDescriptionMessage),e.slideRole&&u(t.slides,e.slideRole);const s=t.slides.length;e.slideLabelMessage&&t.slides.forEach(((a,i)=>{const r=t.params.loop?parseInt(a.getAttribute("data-swiper-slide-index"),10):i;h(a,e.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,s))}))},I=()=>{const e=t.params.a11y;t.el.append(l);const s=t.el;e.containerRoleDescriptionMessage&&m(s,e.containerRoleDescriptionMessage),e.containerMessage&&h(s,e.containerMessage),e.containerRole&&u(s,e.containerRole);const i=t.wrapperEl,r=e.id||i.getAttribute("id")||`swiper-wrapper-${n=16,void 0===n&&(n=16),"x".repeat(n).replace(/x/g,(()=>Math.round(16*Math.random()).toString(16)))}`;var n;const o=t.params.autoplay&&t.params.autoplay.enabled?"off":"polite";var d;d=r,T(i).forEach((e=>{e.setAttribute("id",d)})),function(e,t){(e=T(e)).forEach((e=>{e.setAttribute("aria-live",t)}))}(i,o),L();let{nextEl:c,prevEl:p}=t.navigation?t.navigation:{};if(c=T(c),p=T(p),c&&c.forEach((t=>x(t,r,e.nextSlideMessage))),p&&p.forEach((t=>x(t,r,e.prevSlideMessage))),E()){T(t.pagination.el).forEach((e=>{e.addEventListener("keydown",w)}))}a().addEventListener("visibilitychange",C),t.el.addEventListener("focus",P,!0),t.el.addEventListener("focus",P,!0),t.el.addEventListener("pointerdown",S,!0),t.el.addEventListener("pointerup",M,!0)};i("beforeInit",(()=>{l=v("span",t.params.a11y.notificationClass),l.setAttribute("aria-live","assertive"),l.setAttribute("aria-atomic","true")})),i("afterInit",(()=>{t.params.a11y.enabled&&I()})),i("slidesLengthChange snapGridLengthChange slidesGridLengthChange",(()=>{t.params.a11y.enabled&&L()})),i("fromEdge toEdge afterInit lock unlock",(()=>{t.params.a11y.enabled&&function(){if(t.params.loop||t.params.rewind||!t.navigation)return;const{nextEl:e,prevEl:s}=t.navigation;s&&(t.isBeginning?(f(s),p(s)):(g(s),c(s))),e&&(t.isEnd?(f(e),p(e)):(g(e),c(e)))}()})),i("paginationUpdate",(()=>{t.params.a11y.enabled&&function(){const e=t.params.a11y;b()&&t.pagination.bullets.forEach((s=>{t.params.pagination.clickable&&(c(s),t.params.pagination.renderBullet||(u(s,"button"),h(s,e.paginationBulletMessage.replace(/\{\{index\}\}/,y(s)+1)))),s.matches(ne(t.params.pagination.bulletActiveClass))?s.setAttribute("aria-current","true"):s.removeAttribute("aria-current")}))}()})),i("destroy",(()=>{t.params.a11y.enabled&&function(){l&&l.remove();let{nextEl:e,prevEl:s}=t.navigation?t.navigation:{};e=T(e),s=T(s),e&&e.forEach((e=>e.removeEventListener("keydown",w))),s&&s.forEach((e=>e.removeEventListener("keydown",w))),E()&&T(t.pagination.el).forEach((e=>{e.removeEventListener("keydown",w)}));a().removeEventListener("visibilitychange",C),t.el&&"string"!=typeof t.el&&(t.el.removeEventListener("focus",P,!0),t.el.removeEventListener("pointerdown",S,!0),t.el.removeEventListener("pointerup",M,!0))}()}))},function(e){let{swiper:t,extendParams:s,on:a}=e;s({history:{enabled:!1,root:"",replaceState:!1,key:"slides",keepQuery:!1}});let i=!1,n={};const l=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),o=e=>{const t=r();let s;s=e?new URL(e):t.location;const a=s.pathname.slice(1).split("/").filter((e=>""!==e)),i=a.length;return{key:a[i-2],value:a[i-1]}},d=(e,s)=>{const a=r();if(!i||!t.params.history.enabled)return;let n;n=t.params.url?new URL(t.params.url):a.location;const o=t.virtual&&t.params.virtual.enabled?t.slidesEl.querySelector(`[data-swiper-slide-index="${s}"]`):t.slides[s];let d=l(o.getAttribute("data-history"));if(t.params.history.root.length>0){let s=t.params.history.root;"/"===s[s.length-1]&&(s=s.slice(0,s.length-1)),d=`${s}/${e?`${e}/`:""}${d}`}else n.pathname.includes(e)||(d=`${e?`${e}/`:""}${d}`);t.params.history.keepQuery&&(d+=n.search);const c=a.history.state;c&&c.value===d||(t.params.history.replaceState?a.history.replaceState({value:d},null,d):a.history.pushState({value:d},null,d))},c=(e,s,a)=>{if(s)for(let i=0,r=t.slides.length;i<r;i+=1){const r=t.slides[i];if(l(r.getAttribute("data-history"))===s){const s=t.getSlideIndex(r);t.slideTo(s,e,a)}}else t.slideTo(0,e,a)},p=()=>{n=o(t.params.url),c(t.params.speed,n.value,!1)};a("init",(()=>{t.params.history.enabled&&(()=>{const e=r();if(t.params.history){if(!e.history||!e.history.pushState)return t.params.history.enabled=!1,void(t.params.hashNavigation.enabled=!0);i=!0,n=o(t.params.url),n.key||n.value?(c(0,n.value,t.params.runCallbacksOnInit),t.params.history.replaceState||e.addEventListener("popstate",p)):t.params.history.replaceState||e.addEventListener("popstate",p)}})()})),a("destroy",(()=>{t.params.history.enabled&&(()=>{const e=r();t.params.history.replaceState||e.removeEventListener("popstate",p)})()})),a("transitionEnd _freeModeNoMomentumRelease",(()=>{i&&d(t.params.history.key,t.activeIndex)})),a("slideChange",(()=>{i&&t.params.cssMode&&d(t.params.history.key,t.activeIndex)}))},function(e){let{swiper:t,extendParams:s,emit:i,on:n}=e,l=!1;const o=a(),d=r();s({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1,getSlideIndex(e,s){if(t.virtual&&t.params.virtual.enabled){const e=t.slides.filter((e=>e.getAttribute("data-hash")===s))[0];if(!e)return 0;return parseInt(e.getAttribute("data-swiper-slide-index"),10)}return t.getSlideIndex(f(t.slidesEl,`.${t.params.slideClass}[data-hash="${s}"], swiper-slide[data-hash="${s}"]`)[0])}}});const c=()=>{i("hashChange");const e=o.location.hash.replace("#",""),s=t.virtual&&t.params.virtual.enabled?t.slidesEl.querySelector(`[data-swiper-slide-index="${t.activeIndex}"]`):t.slides[t.activeIndex];if(e!==(s?s.getAttribute("data-hash"):"")){const s=t.params.hashNavigation.getSlideIndex(t,e);if(void 0===s||Number.isNaN(s))return;t.slideTo(s)}},p=()=>{if(!l||!t.params.hashNavigation.enabled)return;const e=t.virtual&&t.params.virtual.enabled?t.slidesEl.querySelector(`[data-swiper-slide-index="${t.activeIndex}"]`):t.slides[t.activeIndex],s=e?e.getAttribute("data-hash")||e.getAttribute("data-history"):"";t.params.hashNavigation.replaceState&&d.history&&d.history.replaceState?(d.history.replaceState(null,null,`#${s}`||""),i("hashSet")):(o.location.hash=s||"",i("hashSet"))};n("init",(()=>{t.params.hashNavigation.enabled&&(()=>{if(!t.params.hashNavigation.enabled||t.params.history&&t.params.history.enabled)return;l=!0;const e=o.location.hash.replace("#","");if(e){const s=0,a=t.params.hashNavigation.getSlideIndex(t,e);t.slideTo(a||0,s,t.params.runCallbacksOnInit,!0)}t.params.hashNavigation.watchState&&d.addEventListener("hashchange",c)})()})),n("destroy",(()=>{t.params.hashNavigation.enabled&&t.params.hashNavigation.watchState&&d.removeEventListener("hashchange",c)})),n("transitionEnd _freeModeNoMomentumRelease",(()=>{l&&p()})),n("slideChange",(()=>{l&&t.params.cssMode&&p()}))},function(e){let t,s,{swiper:i,extendParams:r,on:n,emit:l,params:o}=e;i.autoplay={running:!1,paused:!1,timeLeft:0},r({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!1,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}});let d,c,p,u,m,h,f,g,v=o&&o.autoplay?o.autoplay.delay:3e3,w=o&&o.autoplay?o.autoplay.delay:3e3,b=(new Date).getTime();function y(e){i&&!i.destroyed&&i.wrapperEl&&e.target===i.wrapperEl&&(i.wrapperEl.removeEventListener("transitionend",y),g||e.detail&&e.detail.bySwiperTouchMove||C())}const E=()=>{if(i.destroyed||!i.autoplay.running)return;i.autoplay.paused?c=!0:c&&(w=d,c=!1);const e=i.autoplay.paused?d:b+w-(new Date).getTime();i.autoplay.timeLeft=e,l("autoplayTimeLeft",e,e/v),s=requestAnimationFrame((()=>{E()}))},x=e=>{if(i.destroyed||!i.autoplay.running)return;cancelAnimationFrame(s),E();let a=void 0===e?i.params.autoplay.delay:e;v=i.params.autoplay.delay,w=i.params.autoplay.delay;const r=(()=>{let e;if(e=i.virtual&&i.params.virtual.enabled?i.slides.filter((e=>e.classList.contains("swiper-slide-active")))[0]:i.slides[i.activeIndex],!e)return;return parseInt(e.getAttribute("data-swiper-autoplay"),10)})();!Number.isNaN(r)&&r>0&&void 0===e&&(a=r,v=r,w=r),d=a;const n=i.params.speed,o=()=>{i&&!i.destroyed&&(i.params.autoplay.reverseDirection?!i.isBeginning||i.params.loop||i.params.rewind?(i.slidePrev(n,!0,!0),l("autoplay")):i.params.autoplay.stopOnLastSlide||(i.slideTo(i.slides.length-1,n,!0,!0),l("autoplay")):!i.isEnd||i.params.loop||i.params.rewind?(i.slideNext(n,!0,!0),l("autoplay")):i.params.autoplay.stopOnLastSlide||(i.slideTo(0,n,!0,!0),l("autoplay")),i.params.cssMode&&(b=(new Date).getTime(),requestAnimationFrame((()=>{x()}))))};return a>0?(clearTimeout(t),t=setTimeout((()=>{o()}),a)):requestAnimationFrame((()=>{o()})),a},S=()=>{b=(new Date).getTime(),i.autoplay.running=!0,x(),l("autoplayStart")},T=()=>{i.autoplay.running=!1,clearTimeout(t),cancelAnimationFrame(s),l("autoplayStop")},M=(e,s)=>{if(i.destroyed||!i.autoplay.running)return;clearTimeout(t),e||(f=!0);const a=()=>{l("autoplayPause"),i.params.autoplay.waitForTransition?i.wrapperEl.addEventListener("transitionend",y):C()};if(i.autoplay.paused=!0,s)return h&&(d=i.params.autoplay.delay),h=!1,void a();const r=d||i.params.autoplay.delay;d=r-((new Date).getTime()-b),i.isEnd&&d<0&&!i.params.loop||(d<0&&(d=0),a())},C=()=>{i.isEnd&&d<0&&!i.params.loop||i.destroyed||!i.autoplay.running||(b=(new Date).getTime(),f?(f=!1,x(d)):x(),i.autoplay.paused=!1,l("autoplayResume"))},P=()=>{if(i.destroyed||!i.autoplay.running)return;const e=a();"hidden"===e.visibilityState&&(f=!0,M(!0)),"visible"===e.visibilityState&&C()},L=e=>{"mouse"===e.pointerType&&(f=!0,g=!0,i.animating||i.autoplay.paused||M(!0))},I=e=>{"mouse"===e.pointerType&&(g=!1,i.autoplay.paused&&C())};n("init",(()=>{i.params.autoplay.enabled&&(i.params.autoplay.pauseOnMouseEnter&&(i.el.addEventListener("pointerenter",L),i.el.addEventListener("pointerleave",I)),a().addEventListener("visibilitychange",P),S())})),n("destroy",(()=>{i.el&&"string"!=typeof i.el&&(i.el.removeEventListener("pointerenter",L),i.el.removeEventListener("pointerleave",I)),a().removeEventListener("visibilitychange",P),i.autoplay.running&&T()})),n("_freeModeStaticRelease",(()=>{(u||f)&&C()})),n("_freeModeNoMomentumRelease",(()=>{i.params.autoplay.disableOnInteraction?T():M(!0,!0)})),n("beforeTransitionStart",((e,t,s)=>{!i.destroyed&&i.autoplay.running&&(s||!i.params.autoplay.disableOnInteraction?M(!0,!0):T())})),n("sliderFirstMove",(()=>{!i.destroyed&&i.autoplay.running&&(i.params.autoplay.disableOnInteraction?T():(p=!0,u=!1,f=!1,m=setTimeout((()=>{f=!0,u=!0,M(!0)}),200)))})),n("touchEnd",(()=>{if(!i.destroyed&&i.autoplay.running&&p){if(clearTimeout(m),clearTimeout(t),i.params.autoplay.disableOnInteraction)return u=!1,void(p=!1);u&&i.params.cssMode&&C(),u=!1,p=!1}})),n("slideChange",(()=>{!i.destroyed&&i.autoplay.running&&(h=!0)})),Object.assign(i.autoplay,{start:S,stop:T,pause:M,resume:C})},function(e){let{swiper:t,extendParams:s,on:i}=e;s({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let r=!1,n=!1;function l(){const e=t.thumbs.swiper;if(!e||e.destroyed)return;const s=e.clickedIndex,a=e.clickedSlide;if(a&&a.classList.contains(t.params.thumbs.slideThumbActiveClass))return;if(null==s)return;let i;i=e.params.loop?parseInt(e.clickedSlide.getAttribute("data-swiper-slide-index"),10):s,t.params.loop?t.slideToLoop(i):t.slideTo(i)}function o(){const{thumbs:e}=t.params;if(r)return!1;r=!0;const s=t.constructor;if(e.swiper instanceof s)t.thumbs.swiper=e.swiper,Object.assign(t.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),Object.assign(t.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1}),t.thumbs.swiper.update();else if(c(e.swiper)){const a=Object.assign({},e.swiper);Object.assign(a,{watchSlidesProgress:!0,slideToClickedSlide:!1}),t.thumbs.swiper=new s(a),n=!0}return t.thumbs.swiper.el.classList.add(t.params.thumbs.thumbsContainerClass),t.thumbs.swiper.on("tap",l),!0}function d(e){const s=t.thumbs.swiper;if(!s||s.destroyed)return;const a="auto"===s.params.slidesPerView?s.slidesPerViewDynamic():s.params.slidesPerView;let i=1;const r=t.params.thumbs.slideThumbActiveClass;if(t.params.slidesPerView>1&&!t.params.centeredSlides&&(i=t.params.slidesPerView),t.params.thumbs.multipleActiveThumbs||(i=1),i=Math.floor(i),s.slides.forEach((e=>e.classList.remove(r))),s.params.loop||s.params.virtual&&s.params.virtual.enabled)for(let e=0;e<i;e+=1)f(s.slidesEl,`[data-swiper-slide-index="${t.realIndex+e}"]`).forEach((e=>{e.classList.add(r)}));else for(let e=0;e<i;e+=1)s.slides[t.realIndex+e]&&s.slides[t.realIndex+e].classList.add(r);const n=t.params.thumbs.autoScrollOffset,l=n&&!s.params.loop;if(t.realIndex!==s.realIndex||l){const i=s.activeIndex;let r,o;if(s.params.loop){const e=s.slides.filter((e=>e.getAttribute("data-swiper-slide-index")===`${t.realIndex}`))[0];r=s.slides.indexOf(e),o=t.activeIndex>t.previousIndex?"next":"prev"}else r=t.realIndex,o=r>t.previousIndex?"next":"prev";l&&(r+="next"===o?n:-1*n),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(r)<0&&(s.params.centeredSlides?r=r>i?r-Math.floor(a/2)+1:r+Math.floor(a/2)-1:r>i&&s.params.slidesPerGroup,s.slideTo(r,e?0:void 0))}}t.thumbs={swiper:null},i("beforeInit",(()=>{const{thumbs:e}=t.params;if(e&&e.swiper)if("string"==typeof e.swiper||e.swiper instanceof HTMLElement){const s=a(),i=()=>{const a="string"==typeof e.swiper?s.querySelector(e.swiper):e.swiper;if(a&&a.swiper)e.swiper=a.swiper,o(),d(!0);else if(a){const s=`${t.params.eventsPrefix}init`,i=r=>{e.swiper=r.detail[0],a.removeEventListener(s,i),o(),d(!0),e.swiper.update(),t.update()};a.addEventListener(s,i)}return a},r=()=>{if(t.destroyed)return;i()||requestAnimationFrame(r)};requestAnimationFrame(r)}else o(),d(!0)})),i("slideChange update resize observerUpdate",(()=>{d()})),i("setTransition",((e,s)=>{const a=t.thumbs.swiper;a&&!a.destroyed&&a.setTransition(s)})),i("beforeDestroy",(()=>{const e=t.thumbs.swiper;e&&!e.destroyed&&n&&e.destroy()})),Object.assign(t.thumbs,{init:o,update:d})},function(e){let{swiper:t,extendParams:s,emit:a,once:i}=e;s({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),Object.assign(t,{freeMode:{onTouchStart:function(){if(t.params.cssMode)return;const e=t.getTranslate();t.setTranslate(e),t.setTransition(0),t.touchEventsData.velocities.length=0,t.freeMode.onTouchEnd({currentPos:t.rtl?t.translate:-t.translate})},onTouchMove:function(){if(t.params.cssMode)return;const{touchEventsData:e,touches:s}=t;0===e.velocities.length&&e.velocities.push({position:s[t.isHorizontal()?"startX":"startY"],time:e.touchStartTime}),e.velocities.push({position:s[t.isHorizontal()?"currentX":"currentY"],time:o()})},onTouchEnd:function(e){let{currentPos:s}=e;if(t.params.cssMode)return;const{params:r,wrapperEl:n,rtlTranslate:l,snapGrid:d,touchEventsData:c}=t,p=o()-c.touchStartTime;if(s<-t.minTranslate())t.slideTo(t.activeIndex);else if(s>-t.maxTranslate())t.slides.length<d.length?t.slideTo(d.length-1):t.slideTo(t.slides.length-1);else{if(r.freeMode.momentum){if(c.velocities.length>1){const e=c.velocities.pop(),s=c.velocities.pop(),a=e.position-s.position,i=e.time-s.time;t.velocity=a/i,t.velocity/=2,Math.abs(t.velocity)<r.freeMode.minimumVelocity&&(t.velocity=0),(i>150||o()-e.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=r.freeMode.momentumVelocityRatio,c.velocities.length=0;let e=1e3*r.freeMode.momentumRatio;const s=t.velocity*e;let p=t.translate+s;l&&(p=-p);let u,m=!1;const h=20*Math.abs(t.velocity)*r.freeMode.momentumBounceRatio;let f;if(p<t.maxTranslate())r.freeMode.momentumBounce?(p+t.maxTranslate()<-h&&(p=t.maxTranslate()-h),u=t.maxTranslate(),m=!0,c.allowMomentumBounce=!0):p=t.maxTranslate(),r.loop&&r.centeredSlides&&(f=!0);else if(p>t.minTranslate())r.freeMode.momentumBounce?(p-t.minTranslate()>h&&(p=t.minTranslate()+h),u=t.minTranslate(),m=!0,c.allowMomentumBounce=!0):p=t.minTranslate(),r.loop&&r.centeredSlides&&(f=!0);else if(r.freeMode.sticky){let e;for(let t=0;t<d.length;t+=1)if(d[t]>-p){e=t;break}p=Math.abs(d[e]-p)<Math.abs(d[e-1]-p)||"next"===t.swipeDirection?d[e]:d[e-1],p=-p}if(f&&i("transitionEnd",(()=>{t.loopFix()})),0!==t.velocity){if(e=l?Math.abs((-p-t.translate)/t.velocity):Math.abs((p-t.translate)/t.velocity),r.freeMode.sticky){const s=Math.abs((l?-p:p)-t.translate),a=t.slidesSizesGrid[t.activeIndex];e=s<a?r.speed:s<2*a?1.5*r.speed:2.5*r.speed}}else if(r.freeMode.sticky)return void t.slideToClosest();r.freeMode.momentumBounce&&m?(t.updateProgress(u),t.setTransition(e),t.setTranslate(p),t.transitionStart(!0,t.swipeDirection),t.animating=!0,x(n,(()=>{t&&!t.destroyed&&c.allowMomentumBounce&&(a("momentumBounce"),t.setTransition(r.speed),setTimeout((()=>{t.setTranslate(u),x(n,(()=>{t&&!t.destroyed&&t.transitionEnd()}))}),0))}))):t.velocity?(a("_freeModeNoMomentumRelease"),t.updateProgress(p),t.setTransition(e),t.setTranslate(p),t.transitionStart(!0,t.swipeDirection),t.animating||(t.animating=!0,x(n,(()=>{t&&!t.destroyed&&t.transitionEnd()})))):t.updateProgress(p),t.updateActiveIndex(),t.updateSlidesClasses()}else{if(r.freeMode.sticky)return void t.slideToClosest();r.freeMode&&a("_freeModeNoMomentumRelease")}(!r.freeMode.momentum||p>=r.longSwipesMs)&&(a("_freeModeStaticRelease"),t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}}}})},function(e){let t,s,a,i,{swiper:r,extendParams:n,on:l}=e;n({grid:{rows:1,fill:"column"}});const o=()=>{let e=r.params.spaceBetween;return"string"==typeof e&&e.indexOf("%")>=0?e=parseFloat(e.replace("%",""))/100*r.size:"string"==typeof e&&(e=parseFloat(e)),e};l("init",(()=>{i=r.params.grid&&r.params.grid.rows>1})),l("update",(()=>{const{params:e,el:t}=r,s=e.grid&&e.grid.rows>1;i&&!s?(t.classList.remove(`${e.containerModifierClass}grid`,`${e.containerModifierClass}grid-column`),a=1,r.emitContainerClasses()):!i&&s&&(t.classList.add(`${e.containerModifierClass}grid`),"column"===e.grid.fill&&t.classList.add(`${e.containerModifierClass}grid-column`),r.emitContainerClasses()),i=s})),r.grid={initSlides:e=>{const{slidesPerView:i}=r.params,{rows:n,fill:l}=r.params.grid,o=r.virtual&&r.params.virtual.enabled?r.virtual.slides.length:e.length;a=Math.floor(o/n),t=Math.floor(o/n)===o/n?o:Math.ceil(o/n)*n,"auto"!==i&&"row"===l&&(t=Math.max(t,i*n)),s=t/n},unsetSlides:()=>{r.slides&&r.slides.forEach((e=>{e.swiperSlideGridSet&&(e.style.height="",e.style[r.getDirectionLabel("margin-top")]="")}))},updateSlide:(e,i,n)=>{const{slidesPerGroup:l}=r.params,d=o(),{rows:c,fill:p}=r.params.grid,u=r.virtual&&r.params.virtual.enabled?r.virtual.slides.length:n.length;let m,h,f;if("row"===p&&l>1){const s=Math.floor(e/(l*c)),a=e-c*l*s,r=0===s?l:Math.min(Math.ceil((u-s*c*l)/c),l);f=Math.floor(a/r),h=a-f*r+s*l,m=h+f*t/c,i.style.order=m}else"column"===p?(h=Math.floor(e/c),f=e-h*c,(h>a||h===a&&f===c-1)&&(f+=1,f>=c&&(f=0,h+=1))):(f=Math.floor(e/s),h=e-f*s);i.row=f,i.column=h,i.style.height=`calc((100% - ${(c-1)*d}px) / ${c})`,i.style[r.getDirectionLabel("margin-top")]=0!==f?d&&`${d}px`:"",i.swiperSlideGridSet=!0},updateWrapperSize:(e,s)=>{const{centeredSlides:a,roundLengths:i}=r.params,n=o(),{rows:l}=r.params.grid;if(r.virtualSize=(e+n)*t,r.virtualSize=Math.ceil(r.virtualSize/l)-n,r.params.cssMode||(r.wrapperEl.style[r.getDirectionLabel("width")]=`${r.virtualSize+n}px`),a){const e=[];for(let t=0;t<s.length;t+=1){let a=s[t];i&&(a=Math.floor(a)),s[t]<r.virtualSize+s[0]&&e.push(a)}s.splice(0,s.length),s.push(...e)}}}},function(e){let{swiper:t}=e;Object.assign(t,{appendSlide:le.bind(t),prependSlide:oe.bind(t),addSlide:de.bind(t),removeSlide:ce.bind(t),removeAllSlides:pe.bind(t)})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({fadeEffect:{crossFade:!1}}),ue({effect:"fade",swiper:t,on:a,setTranslate:()=>{const{slides:e}=t;t.params.fadeEffect;for(let s=0;s<e.length;s+=1){const e=t.slides[s];let a=-e.swiperSlideOffset;t.params.virtualTranslate||(a-=t.translate);let i=0;t.isHorizontal()||(i=a,a=0);const r=t.params.fadeEffect.crossFade?Math.max(1-Math.abs(e.progress),0):1+Math.min(Math.max(e.progress,-1),0),n=me(0,e);n.style.opacity=r,n.style.transform=`translate3d(${a}px, ${i}px, 0px)`}},setTransition:e=>{const s=t.slides.map((e=>h(e)));s.forEach((t=>{t.style.transitionDuration=`${e}ms`})),he({swiper:t,duration:e,transformElements:s,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});const i=(e,t,s)=>{let a=s?e.querySelector(".swiper-slide-shadow-left"):e.querySelector(".swiper-slide-shadow-top"),i=s?e.querySelector(".swiper-slide-shadow-right"):e.querySelector(".swiper-slide-shadow-bottom");a||(a=v("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"left":"top")).split(" ")),e.append(a)),i||(i=v("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"right":"bottom")).split(" ")),e.append(i)),a&&(a.style.opacity=Math.max(-t,0)),i&&(i.style.opacity=Math.max(t,0))};ue({effect:"cube",swiper:t,on:a,setTranslate:()=>{const{el:e,wrapperEl:s,slides:a,width:r,height:n,rtlTranslate:l,size:o,browser:d}=t,c=M(t),p=t.params.cubeEffect,u=t.isHorizontal(),m=t.virtual&&t.params.virtual.enabled;let h,f=0;p.shadow&&(u?(h=t.wrapperEl.querySelector(".swiper-cube-shadow"),h||(h=v("div","swiper-cube-shadow"),t.wrapperEl.append(h)),h.style.height=`${r}px`):(h=e.querySelector(".swiper-cube-shadow"),h||(h=v("div","swiper-cube-shadow"),e.append(h))));for(let e=0;e<a.length;e+=1){const t=a[e];let s=e;m&&(s=parseInt(t.getAttribute("data-swiper-slide-index"),10));let r=90*s,n=Math.floor(r/360);l&&(r=-r,n=Math.floor(-r/360));const d=Math.max(Math.min(t.progress,1),-1);let h=0,g=0,v=0;s%4==0?(h=4*-n*o,v=0):(s-1)%4==0?(h=0,v=4*-n*o):(s-2)%4==0?(h=o+4*n*o,v=o):(s-3)%4==0&&(h=-o,v=3*o+4*o*n),l&&(h=-h),u||(g=h,h=0);const w=`rotateX(${c(u?0:-r)}deg) rotateY(${c(u?r:0)}deg) translate3d(${h}px, ${g}px, ${v}px)`;d<=1&&d>-1&&(f=90*s+90*d,l&&(f=90*-s-90*d)),t.style.transform=w,p.slideShadows&&i(t,d,u)}if(s.style.transformOrigin=`50% 50% -${o/2}px`,s.style["-webkit-transform-origin"]=`50% 50% -${o/2}px`,p.shadow)if(u)h.style.transform=`translate3d(0px, ${r/2+p.shadowOffset}px, ${-r/2}px) rotateX(89.99deg) rotateZ(0deg) scale(${p.shadowScale})`;else{const e=Math.abs(f)-90*Math.floor(Math.abs(f)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=p.shadowScale,a=p.shadowScale/t,i=p.shadowOffset;h.style.transform=`scale3d(${s}, 1, ${a}) translate3d(0px, ${n/2+i}px, ${-n/2/a}px) rotateX(-89.99deg)`}const g=(d.isSafari||d.isWebView)&&d.needPerspectiveFix?-o/2:0;s.style.transform=`translate3d(0px,0,${g}px) rotateX(${c(t.isHorizontal()?0:f)}deg) rotateY(${c(t.isHorizontal()?-f:0)}deg)`,s.style.setProperty("--swiper-cube-translate-z",`${g}px`)},setTransition:e=>{const{el:s,slides:a}=t;if(a.forEach((t=>{t.style.transitionDuration=`${e}ms`,t.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((t=>{t.style.transitionDuration=`${e}ms`}))})),t.params.cubeEffect.shadow&&!t.isHorizontal()){const t=s.querySelector(".swiper-cube-shadow");t&&(t.style.transitionDuration=`${e}ms`)}},recreateShadows:()=>{const e=t.isHorizontal();t.slides.forEach((t=>{const s=Math.max(Math.min(t.progress,1),-1);i(t,s,e)}))},getEffectParams:()=>t.params.cubeEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({flipEffect:{slideShadows:!0,limitRotation:!0}});const i=(e,s)=>{let a=t.isHorizontal()?e.querySelector(".swiper-slide-shadow-left"):e.querySelector(".swiper-slide-shadow-top"),i=t.isHorizontal()?e.querySelector(".swiper-slide-shadow-right"):e.querySelector(".swiper-slide-shadow-bottom");a||(a=fe("flip",e,t.isHorizontal()?"left":"top")),i||(i=fe("flip",e,t.isHorizontal()?"right":"bottom")),a&&(a.style.opacity=Math.max(-s,0)),i&&(i.style.opacity=Math.max(s,0))};ue({effect:"flip",swiper:t,on:a,setTranslate:()=>{const{slides:e,rtlTranslate:s}=t,a=t.params.flipEffect,r=M(t);for(let n=0;n<e.length;n+=1){const l=e[n];let o=l.progress;t.params.flipEffect.limitRotation&&(o=Math.max(Math.min(l.progress,1),-1));const d=l.swiperSlideOffset;let c=-180*o,p=0,u=t.params.cssMode?-d-t.translate:-d,m=0;t.isHorizontal()?s&&(c=-c):(m=u,u=0,p=-c,c=0),l.style.zIndex=-Math.abs(Math.round(o))+e.length,a.slideShadows&&i(l,o);const h=`translate3d(${u}px, ${m}px, 0px) rotateX(${r(p)}deg) rotateY(${r(c)}deg)`;me(0,l).style.transform=h}},setTransition:e=>{const s=t.slides.map((e=>h(e)));s.forEach((t=>{t.style.transitionDuration=`${e}ms`,t.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((t=>{t.style.transitionDuration=`${e}ms`}))})),he({swiper:t,duration:e,transformElements:s})},recreateShadows:()=>{t.params.flipEffect,t.slides.forEach((e=>{let s=e.progress;t.params.flipEffect.limitRotation&&(s=Math.max(Math.min(e.progress,1),-1)),i(e,s)}))},getEffectParams:()=>t.params.flipEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}}),ue({effect:"coverflow",swiper:t,on:a,setTranslate:()=>{const{width:e,height:s,slides:a,slidesSizesGrid:i}=t,r=t.params.coverflowEffect,n=t.isHorizontal(),l=t.translate,o=n?e/2-l:s/2-l,d=n?r.rotate:-r.rotate,c=r.depth,p=M(t);for(let e=0,t=a.length;e<t;e+=1){const t=a[e],s=i[e],l=(o-t.swiperSlideOffset-s/2)/s,u="function"==typeof r.modifier?r.modifier(l):l*r.modifier;let m=n?d*u:0,h=n?0:d*u,f=-c*Math.abs(u),g=r.stretch;"string"==typeof g&&-1!==g.indexOf("%")&&(g=parseFloat(r.stretch)/100*s);let v=n?0:g*u,w=n?g*u:0,b=1-(1-r.scale)*Math.abs(u);Math.abs(w)<.001&&(w=0),Math.abs(v)<.001&&(v=0),Math.abs(f)<.001&&(f=0),Math.abs(m)<.001&&(m=0),Math.abs(h)<.001&&(h=0),Math.abs(b)<.001&&(b=0);const y=`translate3d(${w}px,${v}px,${f}px) rotateX(${p(h)}deg) rotateY(${p(m)}deg) scale(${b})`;if(me(0,t).style.transform=y,t.style.zIndex=1-Math.abs(Math.round(u)),r.slideShadows){let e=n?t.querySelector(".swiper-slide-shadow-left"):t.querySelector(".swiper-slide-shadow-top"),s=n?t.querySelector(".swiper-slide-shadow-right"):t.querySelector(".swiper-slide-shadow-bottom");e||(e=fe("coverflow",t,n?"left":"top")),s||(s=fe("coverflow",t,n?"right":"bottom")),e&&(e.style.opacity=u>0?u:0),s&&(s.style.opacity=-u>0?-u:0)}}},setTransition:e=>{t.slides.map((e=>h(e))).forEach((t=>{t.style.transitionDuration=`${e}ms`,t.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((t=>{t.style.transitionDuration=`${e}ms`}))}))},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({creativeEffect:{limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const i=e=>"string"==typeof e?e:`${e}px`;ue({effect:"creative",swiper:t,on:a,setTranslate:()=>{const{slides:e,wrapperEl:s,slidesSizesGrid:a}=t,r=t.params.creativeEffect,{progressMultiplier:n}=r,l=t.params.centeredSlides,o=M(t);if(l){const e=a[0]/2-t.params.slidesOffsetBefore||0;s.style.transform=`translateX(calc(50% - ${e}px))`}for(let s=0;s<e.length;s+=1){const a=e[s],d=a.progress,c=Math.min(Math.max(a.progress,-r.limitProgress),r.limitProgress);let p=c;l||(p=Math.min(Math.max(a.originalProgress,-r.limitProgress),r.limitProgress));const u=a.swiperSlideOffset,m=[t.params.cssMode?-u-t.translate:-u,0,0],h=[0,0,0];let f=!1;t.isHorizontal()||(m[1]=m[0],m[0]=0);let g={translate:[0,0,0],rotate:[0,0,0],scale:1,opacity:1};c<0?(g=r.next,f=!0):c>0&&(g=r.prev,f=!0),m.forEach(((e,t)=>{m[t]=`calc(${e}px + (${i(g.translate[t])} * ${Math.abs(c*n)}))`})),h.forEach(((e,t)=>{let s=g.rotate[t]*Math.abs(c*n);h[t]=s})),a.style.zIndex=-Math.abs(Math.round(d))+e.length;const v=m.join(", "),w=`rotateX(${o(h[0])}deg) rotateY(${o(h[1])}deg) rotateZ(${o(h[2])}deg)`,b=p<0?`scale(${1+(1-g.scale)*p*n})`:`scale(${1-(1-g.scale)*p*n})`,y=p<0?1+(1-g.opacity)*p*n:1-(1-g.opacity)*p*n,E=`translate3d(${v}) ${w} ${b}`;if(f&&g.shadow||!f){let e=a.querySelector(".swiper-slide-shadow");if(!e&&g.shadow&&(e=fe("creative",a)),e){const t=r.shadowPerProgress?c*(1/r.limitProgress):c;e.style.opacity=Math.min(Math.max(Math.abs(t),0),1)}}const x=me(0,a);x.style.transform=E,x.style.opacity=y,g.origin&&(x.style.transformOrigin=g.origin)}},setTransition:e=>{const s=t.slides.map((e=>h(e)));s.forEach((t=>{t.style.transitionDuration=`${e}ms`,t.querySelectorAll(".swiper-slide-shadow").forEach((t=>{t.style.transitionDuration=`${e}ms`}))})),he({swiper:t,duration:e,transformElements:s,allSlides:!0})},perspective:()=>t.params.creativeEffect.perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!t.params.cssMode})})},function(e){let{swiper:t,extendParams:s,on:a}=e;s({cardsEffect:{slideShadows:!0,rotate:!0,perSlideRotate:2,perSlideOffset:8}}),ue({effect:"cards",swiper:t,on:a,setTranslate:()=>{const{slides:e,activeIndex:s,rtlTranslate:a}=t,i=t.params.cardsEffect,{startTranslate:r,isTouched:n}=t.touchEventsData,l=a?-t.translate:t.translate;for(let o=0;o<e.length;o+=1){const d=e[o],c=d.progress,p=Math.min(Math.max(c,-4),4);let u=d.swiperSlideOffset;t.params.centeredSlides&&!t.params.cssMode&&(t.wrapperEl.style.transform=`translateX(${t.minTranslate()}px)`),t.params.centeredSlides&&t.params.cssMode&&(u-=e[0].swiperSlideOffset);let m=t.params.cssMode?-u-t.translate:-u,h=0;const f=-100*Math.abs(p);let g=1,v=-i.perSlideRotate*p,w=i.perSlideOffset-.75*Math.abs(p);const b=t.virtual&&t.params.virtual.enabled?t.virtual.from+o:o,y=(b===s||b===s-1)&&p>0&&p<1&&(n||t.params.cssMode)&&l<r,E=(b===s||b===s+1)&&p<0&&p>-1&&(n||t.params.cssMode)&&l>r;if(y||E){const e=(1-Math.abs((Math.abs(p)-.5)/.5))**.5;v+=-28*p*e,g+=-.5*e,w+=96*e,h=-25*e*Math.abs(p)+"%"}if(m=p<0?`calc(${m}px ${a?"-":"+"} (${w*Math.abs(p)}%))`:p>0?`calc(${m}px ${a?"-":"+"} (-${w*Math.abs(p)}%))`:`${m}px`,!t.isHorizontal()){const e=h;h=m,m=e}const x=p<0?""+(1+(1-g)*p):""+(1-(1-g)*p),S=`\n translate3d(${m}, ${h}, ${f}px)\n rotateZ(${i.rotate?a?-v:v:0}deg)\n scale(${x})\n `;if(i.slideShadows){let e=d.querySelector(".swiper-slide-shadow");e||(e=fe("cards",d)),e&&(e.style.opacity=Math.min(Math.max((Math.abs(p)-.5)/.5,0),1))}d.style.zIndex=-Math.abs(Math.round(c))+e.length;me(0,d).style.transform=S}},setTransition:e=>{const s=t.slides.map((e=>h(e)));s.forEach((t=>{t.style.transitionDuration=`${e}ms`,t.querySelectorAll(".swiper-slide-shadow").forEach((t=>{t.style.transitionDuration=`${e}ms`}))})),he({swiper:t,duration:e,transformElements:s})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!t.params.cssMode})})}];return ie.use(ge),ie}();
--//# sourceMappingURL=swiper-bundle.min.js.map
\\ No newline at end of file
ddiff --git a/public/assets/vendor/tsparticles/tsparticles.slim.bundle.min.js b/public/assets/vendor/tsparticles/tsparticles.slim.bundle.min.js
ddeleted file mode 100644
iindex 5442c58..0000000
---- a/public/assets/vendor/tsparticles/tsparticles.slim.bundle.min.js
++++ /dev/null
@@@ -1,2 +0,0 @@
--/*! For license information please see tsparticles.slim.bundle.min.js.LICENSE.txt */
--!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var i=e();for(var s in i)("object"==typeof exports?exports:t)[s]=i[s]}}(this,(()=>(()=>{var t={d:(e,i)=>{for(var s in i)t.o(i,s)&&!t.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:i[s]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{AlterType:()=>$t,AnimatableColor:()=>ui,AnimationMode:()=>at,AnimationOptions:()=>ci,AnimationStatus:()=>rt,AnimationValueWithRandom:()=>mi,Background:()=>qe,BackgroundMask:()=>Ue,BackgroundMaskCover:()=>He,BaseRange:()=>ts,Circle:()=>es,ClickEvent:()=>Ve,CollisionMode:()=>ti,Collisions:()=>wi,CollisionsAbsorb:()=>pi,CollisionsOverlap:()=>fi,ColorAnimation:()=>hi,DestroyType:()=>ct,DivEvent:()=>$e,DivType:()=>Be,EasingType:()=>xs,EventType:()=>Ae,Events:()=>Ne,ExternalInteractorBase:()=>Ms,FullScreen:()=>We,GradientType:()=>ws,HoverEvent:()=>Ge,HslAnimation:()=>di,HslColorManager:()=>_s,Interactivity:()=>Ye,InteractivityDetect:()=>Ee,InteractorType:()=>si,LimitMode:()=>ii,ManualParticle:()=>Ze,Modes:()=>Xe,Move:()=>Ri,MoveAngle:()=>_i,MoveAttract:()=>ki,MoveCenter:()=>Mi,MoveDirection:()=>y,MoveGravity:()=>zi,MovePath:()=>Ci,MoveTrail:()=>Oi,Opacity:()=>Ei,OpacityAnimation:()=>Di,Options:()=>Gi,OptionsColor:()=>Fe,OutMode:()=>ei,OutModeDirection:()=>lt,OutModes:()=>Si,Parallax:()=>je,ParticleOutType:()=>oi,ParticlesBounce:()=>bi,ParticlesBounceFactor:()=>yi,ParticlesDensity:()=>Ii,ParticlesInteractorBase:()=>zs,ParticlesNumber:()=>Ai,ParticlesNumberLimit:()=>Li,ParticlesOptions:()=>Vi,PixelMode:()=>ht,Point:()=>Ji,RangedAnimationOptions:()=>li,RangedAnimationValueWithRandom:()=>gi,Rectangle:()=>is,ResizeEvent:()=>Qe,Responsive:()=>ni,ResponsiveMode:()=>Je,RgbColorManager:()=>ks,RotateDirection:()=>bs,Shadow:()=>Bi,Shape:()=>Fi,Size:()=>Hi,SizeAnimation:()=>qi,Spin:()=>Ti,StartValueType:()=>dt,Stroke:()=>Ui,Theme:()=>ri,ThemeDefault:()=>ai,ThemeMode:()=>Ke,ValueWithRandom:()=>vi,Vector:()=>S,Vector3d:()=>O,ZIndex:()=>Wi,addColorManager:()=>Xt,addEasing:()=>I,alterHsl:()=>Se,animate:()=>q,areBoundsInside:()=>Ct,arrayRandomIndex:()=>kt,calcExactPositionOrRandomFromSize:()=>st,calcExactPositionOrRandomFromSizeRanged:()=>ot,calcPositionFromSize:()=>tt,calcPositionOrRandomFromSize:()=>et,calcPositionOrRandomFromSizeRanged:()=>it,calculateBounds:()=>Pt,cancelAnimation:()=>H,circleBounce:()=>It,circleBounceDataFromParticle:()=>Et,clamp:()=>U,clear:()=>_e,collisionVelocity:()=>K,colorMix:()=>le,colorToHsl:()=>Kt,colorToRgb:()=>Jt,deepExtend:()=>Ot,degToRad:()=>Y,divMode:()=>Dt,divModeExecute:()=>Tt,drawEffect:()=>Me,drawLine:()=>be,drawParticle:()=>ke,drawParticlePlugin:()=>Oe,drawPlugin:()=>Pe,drawShape:()=>ze,drawShapeAfterDraw:()=>Ce,errorPrefix:()=>f,executeOnSingleOrMultiple:()=>At,findItemFromSingleOrMultiple:()=>Ft,generatedAttribute:()=>i,getDistance:()=>X,getDistances:()=>N,getEasing:()=>L,getHslAnimationFromHsl:()=>pe,getHslFromAnimation:()=>ue,getLinkColor:()=>he,getLinkRandomColor:()=>de,getLogger:()=>ft,getParticleBaseVelocity:()=>J,getParticleDirectionAngle:()=>Z,getPosition:()=>Ut,getRandom:()=>B,getRandomRgbColor:()=>ae,getRangeMax:()=>G,getRangeMin:()=>j,getRangeValue:()=>$,getSize:()=>Wt,getStyleFromHsl:()=>ce,getStyleFromRgb:()=>re,halfRandom:()=>m,hasMatchMedia:()=>gt,hslToRgb:()=>oe,hslaToRgba:()=>ne,initParticleNumericAnimationValue:()=>qt,isArray:()=>M,isBoolean:()=>b,isDivModeEnabled:()=>St,isFunction:()=>_,isInArray:()=>xt,isNumber:()=>x,isObject:()=>k,isPointInside:()=>zt,isSsr:()=>mt,isString:()=>w,itemFromArray:()=>Mt,itemFromSingleOrMultiple:()=>Bt,loadFont:()=>_t,loadOptions:()=>$i,loadParticlesOptions:()=>ji,loadSlim:()=>Yn,millisecondsToSeconds:()=>g,mix:()=>W,mouseDownEvent:()=>s,mouseLeaveEvent:()=>n,mouseMoveEvent:()=>r,mouseOutEvent:()=>a,mouseUpEvent:()=>o,paintBase:()=>we,paintImage:()=>xe,parseAlpha:()=>nt,percentDenominator:()=>v,randomInRange:()=>V,rangeColorToHsl:()=>te,rangeColorToRgb:()=>Zt,rectBounce:()=>Lt,resizeEvent:()=>u,rgbToHsl:()=>ee,safeIntersectionObserver:()=>bt,safeMatchMedia:()=>yt,safeMutationObserver:()=>wt,setAnimationFunctions:()=>F,setLogger:()=>pt,setRandom:()=>A,setRangeValue:()=>Q,singleDivModeExecute:()=>Rt,stringToAlpha:()=>ie,stringToRgb:()=>se,touchCancelEvent:()=>d,touchEndEvent:()=>l,touchMoveEvent:()=>h,touchStartEvent:()=>c,tsParticles:()=>Cs,updateAnimation:()=>Vt,updateColor:()=>me,updateColorValue:()=>ve,visibilityChangeEvent:()=>p});const i="generated",s="pointerdown",o="pointerup",n="pointerleave",a="pointerout",r="pointermove",c="touchstart",l="touchend",h="touchmove",d="touchcancel",u="resize",p="visibilitychange",f="tsParticles - Error",v=100,m=.5,g=1e3;var y;function b(t){return"boolean"==typeof t}function w(t){return"string"==typeof t}function x(t){return"number"==typeof t}function _(t){return"function"==typeof t}function k(t){return"object"==typeof t&&null!==t}function M(t){return Array.isArray(t)}!function(t){t.bottom="bottom",t.bottomLeft="bottom-left",t.bottomRight="bottom-right",t.left="left",t.none="none",t.right="right",t.top="top",t.topLeft="top-left",t.topRight="top-right",t.outside="outside",t.inside="inside"}(y||(y={}));const z=0,C=0,P=0;class O{constructor(t,e,i){if(this._updateFromAngle=(t,e)=>{this.x=Math.cos(t)*e,this.y=Math.sin(t)*e},!x(t)&&t){this.x=t.x,this.y=t.y;const e=t;this.z=e.z?e.z:P}else{if(void 0===t||void 0===e)throw new Error(`${f} Vector3d not initialized correctly`);this.x=t,this.y=e,this.z=i??P}}static get origin(){return O.create(z,C,P)}get angle(){return Math.atan2(this.y,this.x)}set angle(t){this._updateFromAngle(t,this.length)}get length(){return Math.sqrt(this.getLengthSq())}set length(t){this._updateFromAngle(this.angle,t)}static clone(t){return O.create(t.x,t.y,t.z)}static create(t,e,i){return new O(t,e,i)}add(t){return O.create(this.x+t.x,this.y+t.y,this.z+t.z)}addTo(t){this.x+=t.x,this.y+=t.y,this.z+=t.z}copy(){return O.clone(this)}distanceTo(t){return this.sub(t).length}distanceToSq(t){return this.sub(t).getLengthSq()}div(t){return O.create(this.x/t,this.y/t,this.z/t)}divTo(t){this.x/=t,this.y/=t,this.z/=t}getLengthSq(){return this.x**2+this.y**2}mult(t){return O.create(this.x*t,this.y*t,this.z*t)}multTo(t){this.x*=t,this.y*=t,this.z*=t}normalize(){const t=this.length;0!=t&&this.multTo(1/t)}rotate(t){return O.create(this.x*Math.cos(t)-this.y*Math.sin(t),this.x*Math.sin(t)+this.y*Math.cos(t),P)}setTo(t){this.x=t.x,this.y=t.y;const e=t;this.z=e.z?e.z:P}sub(t){return O.create(this.x-t.x,this.y-t.y,this.z-t.z)}subFrom(t){this.x-=t.x,this.y-=t.y,this.z-=t.z}}class S extends O{constructor(t,e){super(t,e,P)}static get origin(){return S.create(z,C)}static clone(t){return S.create(t.x,t.y)}static create(t,e){return new S(t,e)}}let T=Math.random;const R={nextFrame:t=>requestAnimationFrame(t),cancel:t=>cancelAnimationFrame(t)},D=new Map,E=2*Math.PI;function I(t,e){D.get(t)||D.set(t,e)}function L(t){return D.get(t)??(t=>t)}function A(t=Math.random){T=t}function B(){return U(T(),0,1-Number.EPSILON)}function F(t,e){R.nextFrame=e=>t(e),R.cancel=t=>e(t)}function q(t){return R.nextFrame(t)}function H(t){R.cancel(t)}function U(t,e,i){return Math.min(Math.max(t,e),i)}function W(t,e,i,s){return Math.floor((t*i+e*s)/(i+s))}function V(t){const e=G(t);let i=j(t);return e===i&&(i=0),B()*(e-i)+i}function $(t){return x(t)?t:V(t)}function j(t){return x(t)?t:t.min}function G(t){return x(t)?t:t.max}function Q(t,e){if(t===e||void 0===e&&x(t))return t;const i=j(t),s=G(t);return void 0!==e?{min:Math.min(i,e),max:Math.max(s,e)}:Q(i,s)}function N(t,e){const i=t.x-e.x,s=t.y-e.y;return{dx:i,dy:s,distance:Math.sqrt(i**2+s**2)}}function X(t,e){return N(t,e).distance}function Y(t){return t*Math.PI/180}function Z(t,e,i){if(x(t))return Y(t);const s=.25;switch(t){case y.top:return.5*-Math.PI;case y.topRight:return-Math.PI*s;case y.right:return 0;case y.bottomRight:return Math.PI*s;case y.bottom:return.5*Math.PI;case y.bottomLeft:return.75*Math.PI;case y.left:return Math.PI;case y.topLeft:return.75*-Math.PI;case y.inside:return Math.atan2(i.y-e.y,i.x-e.x);case y.outside:return Math.atan2(e.y-i.y,e.x-i.x);default:return B()*E}}function J(t){const e=S.origin;return e.length=1,e.angle=t,e}function K(t,e,i,s){return S.create(t.x*(i-s)/(i+s)+2*e.x*s/(i+s),t.y)}function tt(t){return void 0!==t.position?.x&&void 0!==t.position.y?{x:t.position.x*t.size.width/v,y:t.position.y*t.size.height/v}:void 0}function et(t){return{x:(t.position?.x??B()*v)*t.size.width/v,y:(t.position?.y??B()*v)*t.size.height/v}}function it(t){const e={x:void 0!==t.position?.x?$(t.position.x):void 0,y:void 0!==t.position?.y?$(t.position.y):void 0};return et({size:t.size,position:e})}function st(t){return{x:t.position?.x??B()*t.size.width,y:t.position?.y??B()*t.size.height}}function ot(t){const e={x:void 0!==t.position?.x?$(t.position.x):void 0,y:void 0!==t.position?.y?$(t.position.y):void 0};return st({size:t.size,position:e})}function nt(t){return t?t.endsWith("%")?parseFloat(t)/v:parseFloat(t):1}var at,rt,ct,lt,ht,dt;!function(t){t.auto="auto",t.increase="increase",t.decrease="decrease",t.random="random"}(at||(at={})),function(t){t.increasing="increasing",t.decreasing="decreasing"}(rt||(rt={})),function(t){t.none="none",t.max="max",t.min="min"}(ct||(ct={})),function(t){t.bottom="bottom",t.left="left",t.right="right",t.top="top"}(lt||(lt={})),function(t){t.precise="precise",t.percent="percent"}(ht||(ht={})),function(t){t.max="max",t.min="min",t.random="random"}(dt||(dt={}));const ut={debug:console.debug,error:console.error,info:console.info,log:console.log,verbose:console.log,warning:console.warn};function pt(t){ut.debug=t.debug||ut.debug,ut.error=t.error||ut.error,ut.info=t.info||ut.info,ut.log=t.log||ut.log,ut.verbose=t.verbose||ut.verbose,ut.warning=t.warning||ut.warning}function ft(){return ut}function vt(t){const e={bounced:!1},{pSide:i,pOtherSide:s,rectSide:o,rectOtherSide:n,velocity:a,factor:r}=t;return s.min<n.min||s.min>n.max||s.max<n.min||s.max>n.max||(i.max>=o.min&&i.max<=.5*(o.max+o.min)&&a>0||i.min<=o.max&&i.min>.5*(o.max+o.min)&&a<0)&&(e.velocity=a*-r,e.bounced=!0),e}function mt(){return"undefined"==typeof window||!window||void 0===window.document||!window.document}function gt(){return!mt()&&"undefined"!=typeof matchMedia}function yt(t){if(gt())return matchMedia(t)}function bt(t){if(!mt()&&"undefined"!=typeof IntersectionObserver)return new IntersectionObserver(t)}function wt(t){if(!mt()&&"undefined"!=typeof MutationObserver)return new MutationObserver(t)}function xt(t,e){return t===e||M(e)&&e.indexOf(t)>-1}async function _t(t,e){try{await document.fonts.load(`${e??"400"} 36px '${t??"Verdana"}'`)}catch{}}function kt(t){return Math.floor(B()*t.length)}function Mt(t,e,i=!0){return t[void 0!==e&&i?e%t.length:kt(t)]}function zt(t,e,i,s,o){return Ct(Pt(t,s??0),e,i,o)}function Ct(t,e,i,s){let o=!0;return s&&s!==lt.bottom||(o=t.top<e.height+i.x),!o||s&&s!==lt.left||(o=t.right>i.x),!o||s&&s!==lt.right||(o=t.left<e.width+i.y),!o||s&&s!==lt.top||(o=t.bottom>i.y),o}function Pt(t,e){return{bottom:t.y+e,left:t.x-e,right:t.x+e,top:t.y-e}}function Ot(t,...e){for(const i of e){if(null==i)continue;if(!k(i)){t=i;continue}const e=Array.isArray(i);!e||!k(t)&&t&&Array.isArray(t)?e||!k(t)&&t&&!Array.isArray(t)||(t={}):t=[];for(const e in i){if("__proto__"===e)continue;const s=i[e],o=t;o[e]=k(s)&&Array.isArray(s)?s.map((t=>Ot(o[e],t))):Ot(o[e],s)}}return t}function St(t,e){return!!Ft(e,(e=>e.enable&&xt(t,e.mode)))}function Tt(t,e,i){At(e,(e=>{const s=e.mode;e.enable&&xt(t,s)&&Rt(e,i)}))}function Rt(t,e){At(t.selectors,(i=>{e(i,t)}))}function Dt(t,e){if(e&&t)return Ft(t,(t=>function(t,e){const i=At(e,(e=>t.matches(e)));return M(i)?i.some((t=>t)):i}(e,t.selectors)))}function Et(t){return{position:t.getPosition(),radius:t.getRadius(),mass:t.getMass(),velocity:t.velocity,factor:S.create($(t.options.bounce.horizontal.value),$(t.options.bounce.vertical.value))}}function It(t,e){const{x:i,y:s}=t.velocity.sub(e.velocity),[o,n]=[t.position,e.position],{dx:a,dy:r}=N(n,o);if(i*a+s*r<0)return;const c=-Math.atan2(r,a),l=t.mass,h=e.mass,d=t.velocity.rotate(c),u=e.velocity.rotate(c),p=K(d,u,l,h),f=K(u,d,l,h),v=p.rotate(-c),m=f.rotate(-c);t.velocity.x=v.x*t.factor.x,t.velocity.y=v.y*t.factor.y,e.velocity.x=m.x*e.factor.x,e.velocity.y=m.y*e.factor.y}function Lt(t,e){const i=Pt(t.getPosition(),t.getRadius()),s=t.options.bounce,o=vt({pSide:{min:i.left,max:i.right},pOtherSide:{min:i.top,max:i.bottom},rectSide:{min:e.left,max:e.right},rectOtherSide:{min:e.top,max:e.bottom},velocity:t.velocity.x,factor:$(s.horizontal.value)});o.bounced&&(void 0!==o.velocity&&(t.velocity.x=o.velocity),void 0!==o.position&&(t.position.x=o.position));const n=vt({pSide:{min:i.top,max:i.bottom},pOtherSide:{min:i.left,max:i.right},rectSide:{min:e.top,max:e.bottom},rectOtherSide:{min:e.left,max:e.right},velocity:t.velocity.y,factor:$(s.vertical.value)});n.bounced&&(void 0!==n.velocity&&(t.velocity.y=n.velocity),void 0!==n.position&&(t.position.y=n.position))}function At(t,e){return M(t)?t.map(((t,i)=>e(t,i))):e(t,0)}function Bt(t,e,i){return M(t)?Mt(t,e,i):t}function Ft(t,e){if(M(t))return t.find(((t,i)=>e(t,i)));return e(t,0)?t:void 0}function qt(t,e){const i=t.value,s=t.animation,o={delayTime:$(s.delay)*g,enable:s.enable,value:$(t.value)*e,max:G(i)*e,min:j(i)*e,loops:0,maxLoops:$(s.count),time:0};if(s.enable){switch(o.decay=1-$(s.decay),s.mode){case at.increase:o.status=rt.increasing;break;case at.decrease:o.status=rt.decreasing;break;case at.random:o.status=B()>=m?rt.increasing:rt.decreasing}const t=s.mode===at.auto;switch(s.startValue){case dt.min:o.value=o.min,t&&(o.status=rt.increasing);break;case dt.max:o.value=o.max,t&&(o.status=rt.decreasing);break;case dt.random:default:o.value=V(o),t&&(o.status=B()>=m?rt.increasing:rt.decreasing)}}return o.initialValue=o.value,o}function Ht(t,e){if(!(t.mode===ht.percent)){const{mode:e,...i}=t;return i}return"x"in t?{x:t.x/v*e.width,y:t.y/v*e.height}:{width:t.width/v*e.width,height:t.height/v*e.height}}function Ut(t,e){return Ht(t,e)}function Wt(t,e){return Ht(t,e)}function Vt(t,e,i,s,o){if(t.destroyed||!e||!e.enable||(e.maxLoops??0)>0&&(e.loops??0)>(e.maxLoops??0))return;const n=(e.velocity??0)*o.factor,a=e.min,r=e.max,c=e.decay??1;if(e.time||(e.time=0),(e.delayTime??0)>0&&e.time<(e.delayTime??0)&&(e.time+=o.value),!((e.delayTime??0)>0&&e.time<(e.delayTime??0))){switch(e.status){case rt.increasing:e.value>=r?(i?e.status=rt.decreasing:e.value-=r,e.loops||(e.loops=0),e.loops++):e.value+=n;break;case rt.decreasing:e.value<=a?(i?e.status=rt.increasing:e.value+=r,e.loops||(e.loops=0),e.loops++):e.value-=n}e.velocity&&1!==c&&(e.velocity*=c),function(t,e,i,s,o){switch(e){case ct.max:i>=o&&t.destroy();break;case ct.min:i<=s&&t.destroy()}}(t,s,e.value,a,r),t.destroyed||(e.value=U(e.value,a,r))}}var $t,jt;!function(t){t.darken="darken",t.enlighten="enlighten"}($t||($t={})),function(t){t[t.r=1]="r",t[t.g=2]="g",t[t.b=3]="b",t[t.a=4]="a"}(jt||(jt={}));const Gt="random",Qt="mid",Nt=new Map;function Xt(t){Nt.set(t.key,t)}function Yt(t){for(const[,e]of Nt)if(t.startsWith(e.stringPrefix))return e.parseString(t);const e=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i,((t,e,i,s,o)=>e+e+i+i+s+s+(void 0!==o?o+o:""))),i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i.exec(e);return i?{a:void 0!==i[jt.a]?parseInt(i[jt.a],16)/255:1,b:parseInt(i[jt.b],16),g:parseInt(i[jt.g],16),r:parseInt(i[jt.r],16)}:void 0}function Zt(t,e,i=!0){if(!t)return;const s=w(t)?{value:t}:t;if(w(s.value))return Jt(s.value,e,i);if(M(s.value))return Zt({value:Mt(s.value,e,i)});for(const[,t]of Nt){const e=t.handleRangeColor(s);if(e)return e}}function Jt(t,e,i=!0){if(!t)return;const s=w(t)?{value:t}:t;if(w(s.value))return s.value===Gt?ae():se(s.value);if(M(s.value))return Jt({value:Mt(s.value,e,i)});for(const[,t]of Nt){const e=t.handleColor(s);if(e)return e}}function Kt(t,e,i=!0){const s=Jt(t,e,i);return s?ee(s):void 0}function te(t,e,i=!0){const s=Zt(t,e,i);return s?ee(s):void 0}function ee(t){const e=t.r/255,i=t.g/255,s=t.b/255,o=Math.max(e,i,s),n=Math.min(e,i,s),a={h:0,l:.5*(o+n),s:0};return o!==n&&(a.s=a.l<.5?(o-n)/(o+n):(o-n)/(2-o-n),a.h=e===o?(i-s)/(o-n):a.h=i===o?2+(s-e)/(o-n):4+(e-i)/(o-n)),a.l*=100,a.s*=100,a.h*=60,a.h<0&&(a.h+=360),a.h>=360&&(a.h-=360),a}function ie(t){return Yt(t)?.a}function se(t){return Yt(t)}function oe(t){const e=360,i=(t.h%e+e)%e,s=Math.max(0,Math.min(100,t.s)),o=i/e,n=s/100,a=Math.max(0,Math.min(100,t.l))/100,r=255;if(0===s){const t=Math.round(a*r);return{r:t,g:t,b:t}}const c=(t,e,i)=>{if(i<0&&i++,i>1&&i--,6*i<1)return t+6*(e-t)*i;if(2*i<1)return e;if(3*i<2){return t+(e-t)*(2/3-i)*6}return t},l=a<.5?a*(1+n):a+n-a*n,h=2*a-l,d=1/3,u=Math.min(r,r*c(h,l,o+d)),p=Math.min(r,r*c(h,l,o)),f=Math.min(r,r*c(h,l,o-d));return{r:Math.round(u),g:Math.round(p),b:Math.round(f)}}function ne(t){const e=oe(t);return{a:t.a,b:e.b,g:e.g,r:e.r}}function ae(t){const e=t??0;return{b:Math.floor(V(Q(e,256))),g:Math.floor(V(Q(e,256))),r:Math.floor(V(Q(e,256)))}}function re(t,e){return`rgba(${t.r}, ${t.g}, ${t.b}, ${e??1})`}function ce(t,e){return`hsla(${t.h}, ${t.s}%, ${t.l}%, ${e??1})`}function le(t,e,i,s){let o=t,n=e;return void 0===o.r&&(o=oe(t)),void 0===n.r&&(n=oe(e)),{b:W(o.b,n.b,i,s),g:W(o.g,n.g,i,s),r:W(o.r,n.r,i,s)}}function he(t,e,i){if(i===Gt)return ae();if(i!==Qt)return i;{const i=t.getFillColor()??t.getStrokeColor(),s=e?.getFillColor()??e?.getStrokeColor();if(i&&s&&e)return le(i,s,t.getRadius(),e.getRadius());{const t=i??s;if(t)return oe(t)}}}function de(t,e,i){const s=w(t)?t:t.value;return s===Gt?i?Zt({value:s}):e?Gt:Qt:s===Qt?Qt:Zt({value:s})}function ue(t){return void 0!==t?{h:t.h.value,s:t.s.value,l:t.l.value}:void 0}function pe(t,e,i){const s={h:{enable:!1,value:t.h},s:{enable:!1,value:t.s},l:{enable:!1,value:t.l}};return e&&(fe(s.h,e.h,i),fe(s.s,e.s,i),fe(s.l,e.l,i)),s}function fe(t,e,i){t.enable=e.enable;t.enable?(t.velocity=$(e.speed)/v*i,t.decay=1-$(e.decay),t.status=rt.increasing,t.loops=0,t.maxLoops=$(e.count),t.time=0,t.delayTime=$(e.delay)*g,e.sync||(t.velocity*=B(),t.value*=B()),t.initialValue=t.value,t.offset=Q(e.offset)):t.velocity=0}function ve(t,e,i,s){if(!t||!t.enable||(t.maxLoops??0)>0&&(t.loops??0)>(t.maxLoops??0))return;if(t.time||(t.time=0),(t.delayTime??0)>0&&t.time<(t.delayTime??0)&&(t.time+=s.value),(t.delayTime??0)>0&&t.time<(t.delayTime??0))return;const o=t.offset?V(t.offset):0,n=(t.velocity??0)*s.factor+3.6*o,a=t.decay??1,r=G(e),c=j(e);if(i&&t.status!==rt.increasing){t.value-=n;const e=0;t.value<e&&(t.loops||(t.loops=0),t.loops++,t.status=rt.increasing)}else t.value+=n,t.value>r&&(t.loops||(t.loops=0),t.loops++,i?t.status=rt.decreasing:t.value-=r);t.velocity&&1!==a&&(t.velocity*=a),t.value=U(t.value,c,r)}function me(t,e){if(!t)return;const{h:i,s,l:o}=t,n={min:0,max:100},a={min:0,max:100};i&&ve(i,{min:0,max:360},!1,e),s&&ve(s,n,!0,e),o&&ve(o,a,!0,e)}const ge={x:0,y:0},ye={a:1,b:0,c:0,d:1};function be(t,e,i){t.beginPath(),t.moveTo(e.x,e.y),t.lineTo(i.x,i.y),t.closePath()}function we(t,e,i){t.fillStyle=i??"rgba(0,0,0,0)",t.fillRect(ge.x,ge.y,e.width,e.height)}function xe(t,e,i,s){i&&(t.globalAlpha=s,t.drawImage(i,ge.x,ge.y,e.width,e.height),t.globalAlpha=1)}function _e(t,e){t.clearRect(ge.x,ge.y,e.width,e.height)}function ke(t){const{container:e,context:i,particle:s,delta:o,colorStyles:n,backgroundMask:a,composite:r,radius:c,opacity:l,shadow:h,transform:d}=t,u=s.getPosition(),p=s.rotation+(s.pathRotation?s.velocity.angle:0),f=Math.sin(p),v=Math.cos(p),m=!!p,g={a:v*(d.a??ye.a),b:m?f*(d.b??1):d.b??ye.b,c:m?-f*(d.c??1):d.c??ye.c,d:v*(d.d??ye.d)};i.setTransform(g.a,g.b,g.c,g.d,u.x,u.y),a&&(i.globalCompositeOperation=r);const y=s.shadowColor;h.enable&&y&&(i.shadowBlur=h.blur,i.shadowColor=re(y),i.shadowOffsetX=h.offset.x,i.shadowOffsetY=h.offset.y),n.fill&&(i.fillStyle=n.fill);const b=s.strokeWidth??0;i.lineWidth=b,n.stroke&&(i.strokeStyle=n.stroke);const w={container:e,context:i,particle:s,radius:c,opacity:l,delta:o,transformData:g,strokeWidth:b};ze(w),Ce(w),Me(w),i.globalCompositeOperation="source-over",i.resetTransform()}function Me(t){const{container:e,context:i,particle:s,radius:o,opacity:n,delta:a,transformData:r}=t;if(!s.effect)return;const c=e.effectDrawers.get(s.effect);c&&c.draw({context:i,particle:s,radius:o,opacity:n,delta:a,pixelRatio:e.retina.pixelRatio,transformData:{...r}})}function ze(t){const{container:e,context:i,particle:s,radius:o,opacity:n,delta:a,strokeWidth:r,transformData:c}=t;if(!s.shape)return;const l=e.shapeDrawers.get(s.shape);l&&(i.beginPath(),l.draw({context:i,particle:s,radius:o,opacity:n,delta:a,pixelRatio:e.retina.pixelRatio,transformData:{...c}}),s.shapeClose&&i.closePath(),r>0&&i.stroke(),s.shapeFill&&i.fill())}function Ce(t){const{container:e,context:i,particle:s,radius:o,opacity:n,delta:a,transformData:r}=t;if(!s.shape)return;const c=e.shapeDrawers.get(s.shape);c?.afterDraw&&c.afterDraw({context:i,particle:s,radius:o,opacity:n,delta:a,pixelRatio:e.retina.pixelRatio,transformData:{...r}})}function Pe(t,e,i){e.draw&&e.draw(t,i)}function Oe(t,e,i,s){e.drawParticle&&e.drawParticle(t,i,s)}function Se(t,e,i){return{h:t.h,s:t.s,l:t.l+(e===$t.darken?-1:1)*i}}function Te(t,e,i){const s=e[i];void 0!==s&&(t[i]=(t[i]??1)*s)}function Re(t,e,i=!1){if(!e)return;if(!t)return;const s=t.style;if(s)for(const t in e){const o=e[t];o&&s.setProperty(t,o,i?"important":"")}}class De{constructor(t){this.container=t,this._applyPostDrawUpdaters=t=>{for(const e of this._postDrawUpdaters)e.afterDraw?.(t)},this._applyPreDrawUpdaters=(t,e,i,s,o,n)=>{for(const a of this._preDrawUpdaters){if(a.getColorStyles){const{fill:n,stroke:r}=a.getColorStyles(e,t,i,s);n&&(o.fill=n),r&&(o.stroke=r)}if(a.getTransformValues){const t=a.getTransformValues(e);for(const e in t)Te(n,t,e)}a.beforeDraw?.(e)}},this._applyResizePlugins=()=>{for(const t of this._resizePlugins)t.resize?.()},this._getPluginParticleColors=t=>{let e,i;for(const s of this._colorPlugins)if(!e&&s.particleFillColor&&(e=te(s.particleFillColor(t))),!i&&s.particleStrokeColor&&(i=te(s.particleStrokeColor(t))),e&&i)break;return[e,i]},this._initCover=async()=>{const t=this.container.actualOptions.backgroundMask.cover,e=t.color;if(e){const i=Zt(e);if(i){const e={...i,a:t.opacity};this._coverColorStyle=re(e,e.a)}}else await new Promise(((e,i)=>{if(!t.image)return;const s=document.createElement("img");s.addEventListener("load",(()=>{this._coverImage={image:s,opacity:t.opacity},e()})),s.addEventListener("error",(t=>{i(t.error)})),s.src=t.image}))},this._initStyle=()=>{const t=this.element,e=this.container.actualOptions;if(t){this._fullScreen?(this._originalStyle=Ot({},t.style),this._setFullScreenStyle()):this._resetOriginalStyle();for(const i in e.style){if(!i||!e.style)continue;const s=e.style[i];s&&t.style.setProperty(i,s,"important")}}},this._initTrail=async()=>{const t=this.container.actualOptions.particles.move.trail,e=t.fill;if(!t.enable)return;const i=1/t.length;if(e.color){const t=Zt(e.color);if(!t)return;this._trailFill={color:{...t},opacity:i}}else await new Promise(((t,s)=>{if(!e.image)return;const o=document.createElement("img");o.addEventListener("load",(()=>{this._trailFill={image:o,opacity:i},t()})),o.addEventListener("error",(t=>{s(t.error)})),o.src=e.image}))},this._paintBase=t=>{this.draw((e=>we(e,this.size,t)))},this._paintImage=(t,e)=>{this.draw((i=>xe(i,this.size,t,e)))},this._repairStyle=()=>{const t=this.element;t&&(this._safeMutationObserver((t=>t.disconnect())),this._initStyle(),this.initBackground(),this._safeMutationObserver((e=>{t&&t instanceof Node&&e.observe(t,{attributes:!0})})))},this._resetOriginalStyle=()=>{const t=this.element,e=this._originalStyle;t&&e&&Re(t,e)},this._safeMutationObserver=t=>{this._mutationObserver&&t(this._mutationObserver)},this._setFullScreenStyle=()=>{const t=this.element;if(!t)return;Re(t,{position:"fixed",zIndex:this.container.actualOptions.fullScreen.zIndex.toString(10),top:"0",left:"0",width:"100%",height:"100%"},!0)},this.size={height:0,width:0},this._context=null,this._generated=!1,this._preDrawUpdaters=[],this._postDrawUpdaters=[],this._resizePlugins=[],this._colorPlugins=[]}get _fullScreen(){return this.container.actualOptions.fullScreen.enable}clear(){const t=this.container.actualOptions,e=t.particles.move.trail,i=this._trailFill;t.backgroundMask.enable?this.paint():e.enable&&e.length>0&&i?i.color?this._paintBase(re(i.color,i.opacity)):i.image&&this._paintImage(i.image,i.opacity):t.clear&&this.draw((t=>{_e(t,this.size)}))}destroy(){if(this.stop(),this._generated){const t=this.element;t?.remove()}else this._resetOriginalStyle();this._preDrawUpdaters=[],this._postDrawUpdaters=[],this._resizePlugins=[],this._colorPlugins=[]}draw(t){const e=this._context;if(e)return t(e)}drawAsync(t){const e=this._context;if(e)return t(e)}drawParticle(t,e){if(t.spawning||t.destroyed)return;const i=t.getRadius();if(i<=0)return;const s=t.getFillColor(),o=t.getStrokeColor()??s;let[n,a]=this._getPluginParticleColors(t);n||(n=s),a||(a=o),(n||a)&&this.draw((s=>{const o=this.container,r=o.actualOptions,c=t.options.zIndex,l=1-t.zIndexFactor,h=l**c.opacityRate,d=t.bubble.opacity??t.opacity?.value??1,u=d*h,p=(t.strokeOpacity??d)*h,f={},v={fill:n?ce(n,u):void 0};v.stroke=a?ce(a,p):v.fill,this._applyPreDrawUpdaters(s,t,i,u,v,f),ke({container:o,context:s,particle:t,delta:e,colorStyles:v,backgroundMask:r.backgroundMask.enable,composite:r.backgroundMask.composite,radius:i*l**c.sizeRate,opacity:u,shadow:t.options.shadow,transform:f}),this._applyPostDrawUpdaters(t)}))}drawParticlePlugin(t,e,i){this.draw((s=>Oe(s,t,e,i)))}drawPlugin(t,e){this.draw((i=>Pe(i,t,e)))}async init(){this._safeMutationObserver((t=>t.disconnect())),this._mutationObserver=wt((t=>{for(const e of t)"attributes"===e.type&&"style"===e.attributeName&&this._repairStyle()})),this.resize(),this._initStyle(),await this._initCover();try{await this._initTrail()}catch(t){ft().error(t)}this.initBackground(),this._safeMutationObserver((t=>{this.element&&this.element instanceof Node&&t.observe(this.element,{attributes:!0})})),this.initUpdaters(),this.initPlugins(),this.paint()}initBackground(){const t=this.container.actualOptions.background,e=this.element;if(!e)return;const i=e.style;if(i){if(t.color){const e=Zt(t.color);i.backgroundColor=e?re(e,t.opacity):""}else i.backgroundColor="";i.backgroundImage=t.image||"",i.backgroundPosition=t.position||"",i.backgroundRepeat=t.repeat||"",i.backgroundSize=t.size||""}}initPlugins(){this._resizePlugins=[];for(const[,t]of this.container.plugins)t.resize&&this._resizePlugins.push(t),(t.particleFillColor??t.particleStrokeColor)&&this._colorPlugins.push(t)}initUpdaters(){this._preDrawUpdaters=[],this._postDrawUpdaters=[];for(const t of this.container.particles.updaters)t.afterDraw&&this._postDrawUpdaters.push(t),(t.getColorStyles??t.getTransformValues??t.beforeDraw)&&this._preDrawUpdaters.push(t)}loadCanvas(t){this._generated&&this.element&&this.element.remove(),this._generated=t.dataset&&i in t.dataset?"true"===t.dataset[i]:this._generated,this.element=t,this.element.ariaHidden="true",this._originalStyle=Ot({},this.element.style),this.size.height=t.offsetHeight,this.size.width=t.offsetWidth,this._context=this.element.getContext("2d"),this._safeMutationObserver((t=>{this.element&&this.element instanceof Node&&t.observe(this.element,{attributes:!0})})),this.container.retina.init(),this.initBackground()}paint(){const t=this.container.actualOptions;this.draw((e=>{t.backgroundMask.enable&&t.backgroundMask.cover?(_e(e,this.size),this._coverImage?this._paintImage(this._coverImage.image,this._coverImage.opacity):this._coverColorStyle?this._paintBase(this._coverColorStyle):this._paintBase()):this._paintBase()}))}resize(){if(!this.element)return!1;const t=this.container,e=t.retina.pixelRatio,i=t.canvas.size,s=this.element.offsetWidth*e,o=this.element.offsetHeight*e;if(o===i.height&&s===i.width&&o===this.element.height&&s===this.element.width)return!1;const n={...i};return this.element.width=i.width=this.element.offsetWidth*e,this.element.height=i.height=this.element.offsetHeight*e,this.container.started&&t.particles.setResizeFactor({width:i.width/n.width,height:i.height/n.height}),!0}stop(){this._safeMutationObserver((t=>t.disconnect())),this._mutationObserver=void 0,this.draw((t=>_e(t,this.size)))}async windowResize(){if(!this.element||!this.resize())return;const t=this.container,e=t.updateActualOptions();t.particles.setDensity(),this._applyResizePlugins(),e&&await t.refresh()}}var Ee;!function(t){t.canvas="canvas",t.parent="parent",t.window="window"}(Ee||(Ee={}));function Ie(t,e,i,s,o){if(s){let s={passive:!0};b(o)?s.capture=o:void 0!==o&&(s=o),t.addEventListener(e,i,s)}else{const s=o;t.removeEventListener(e,i,s)}}class Le{constructor(t){this.container=t,this._doMouseTouchClick=t=>{const e=this.container,i=e.actualOptions;if(this._canPush){const t=e.interactivity.mouse,s=t.position;if(!s)return;t.clickPosition={...s},t.clickTime=(new Date).getTime();At(i.interactivity.events.onClick.mode,(t=>this.container.handleClickMode(t)))}if("touchend"===t.type){setTimeout((()=>this._mouseTouchFinish()),500)}},this._handleThemeChange=t=>{const e=t,i=this.container,s=i.options,o=s.defaultThemes,n=e.matches?o.dark:o.light,a=s.themes.find((t=>t.name===n));a?.default.auto&&i.loadTheme(n)},this._handleVisibilityChange=()=>{const t=this.container,e=t.actualOptions;this._mouseTouchFinish(),e.pauseOnBlur&&(document?.hidden?(t.pageHidden=!0,t.pause()):(t.pageHidden=!1,t.animationStatus?t.play(!0):t.draw(!0)))},this._handleWindowResize=()=>{this._resizeTimeout&&(clearTimeout(this._resizeTimeout),delete this._resizeTimeout);const t=async()=>{const t=this.container.canvas;await(t?.windowResize())};this._resizeTimeout=setTimeout((()=>{t()}),this.container.actualOptions.interactivity.events.resize.delay*g)},this._manageInteractivityListeners=(t,e)=>{const i=this._handlers,n=this.container,a=n.actualOptions,u=n.interactivity.element;if(!u)return;const p=u,f=n.canvas.element;f&&(f.style.pointerEvents=p===f?"initial":"none"),(a.interactivity.events.onHover.enable||a.interactivity.events.onClick.enable)&&(Ie(u,r,i.mouseMove,e),Ie(u,c,i.touchStart,e),Ie(u,h,i.touchMove,e),a.interactivity.events.onClick.enable?(Ie(u,l,i.touchEndClick,e),Ie(u,o,i.mouseUp,e),Ie(u,s,i.mouseDown,e)):Ie(u,l,i.touchEnd,e),Ie(u,t,i.mouseLeave,e),Ie(u,d,i.touchCancel,e))},this._manageListeners=t=>{const e=this._handlers,i=this.container,s=i.actualOptions.interactivity.detectsOn,o=i.canvas.element;let r=n;s===Ee.window?(i.interactivity.element=window,r=a):s===Ee.parent&&o?i.interactivity.element=o.parentElement??o.parentNode:i.interactivity.element=o,this._manageMediaMatch(t),this._manageResize(t),this._manageInteractivityListeners(r,t),document&&Ie(document,p,e.visibilityChange,t,!1)},this._manageMediaMatch=t=>{const e=this._handlers,i=yt("(prefers-color-scheme: dark)");i&&(void 0===i.addEventListener?void 0!==i.addListener&&(t?i.addListener(e.oldThemeChange):i.removeListener(e.oldThemeChange)):Ie(i,"change",e.themeChange,t))},this._manageResize=t=>{const e=this._handlers,i=this.container;if(!i.actualOptions.interactivity.events.resize)return;if("undefined"==typeof ResizeObserver)return void Ie(window,u,e.resize,t);const s=i.canvas.element;this._resizeObserver&&!t?(s&&this._resizeObserver.unobserve(s),this._resizeObserver.disconnect(),delete this._resizeObserver):!this._resizeObserver&&t&&s&&(this._resizeObserver=new ResizeObserver((t=>{t.find((t=>t.target===s))&&this._handleWindowResize()})),this._resizeObserver.observe(s))},this._mouseDown=()=>{const{interactivity:t}=this.container;if(!t)return;const{mouse:e}=t;e.clicking=!0,e.downPosition=e.position},this._mouseTouchClick=t=>{const e=this.container,i=e.actualOptions,{mouse:s}=e.interactivity;s.inside=!0;let o=!1;const n=s.position;if(n&&i.interactivity.events.onClick.enable){for(const[,t]of e.plugins)if(t.clickPositionValid&&(o=t.clickPositionValid(n),o))break;o||this._doMouseTouchClick(t),s.clicking=!1}},this._mouseTouchFinish=()=>{const t=this.container.interactivity;if(!t)return;const e=t.mouse;delete e.position,delete e.clickPosition,delete e.downPosition,t.status=n,e.inside=!1,e.clicking=!1},this._mouseTouchMove=t=>{const e=this.container,i=e.actualOptions,s=e.interactivity,o=e.canvas.element;if(!s?.element)return;let n;if(s.mouse.inside=!0,t.type.startsWith("pointer")){this._canPush=!0;const e=t;if(s.element===window){if(o){const t=o.getBoundingClientRect();n={x:e.clientX-t.left,y:e.clientY-t.top}}}else if(i.interactivity.detectsOn===Ee.parent){const t=e.target,i=e.currentTarget;if(t&&i&&o){const s=t.getBoundingClientRect(),a=i.getBoundingClientRect(),r=o.getBoundingClientRect();n={x:e.offsetX+2*s.left-(a.left+r.left),y:e.offsetY+2*s.top-(a.top+r.top)}}else n={x:e.offsetX??e.clientX,y:e.offsetY??e.clientY}}else e.target===o&&(n={x:e.offsetX??e.clientX,y:e.offsetY??e.clientY})}else if(this._canPush="touchmove"!==t.type,o){const e=t,i=1,s=e.touches[e.touches.length-i],a=o.getBoundingClientRect(),r=0;n={x:s.clientX-(a.left??r),y:s.clientY-(a.top??r)}}const a=e.retina.pixelRatio;n&&(n.x*=a,n.y*=a),s.mouse.position=n,s.status=r},this._touchEnd=t=>{const e=t,i=Array.from(e.changedTouches);for(const t of i)this._touches.delete(t.identifier);this._mouseTouchFinish()},this._touchEndClick=t=>{const e=t,i=Array.from(e.changedTouches);for(const t of i)this._touches.delete(t.identifier);this._mouseTouchClick(t)},this._touchStart=t=>{const e=t,i=Array.from(e.changedTouches);for(const t of i)this._touches.set(t.identifier,performance.now());this._mouseTouchMove(t)},this._canPush=!0,this._touches=new Map,this._handlers={mouseDown:()=>this._mouseDown(),mouseLeave:()=>this._mouseTouchFinish(),mouseMove:t=>this._mouseTouchMove(t),mouseUp:t=>this._mouseTouchClick(t),touchStart:t=>this._touchStart(t),touchMove:t=>this._mouseTouchMove(t),touchEnd:t=>this._touchEnd(t),touchCancel:t=>this._touchEnd(t),touchEndClick:t=>this._touchEndClick(t),visibilityChange:()=>this._handleVisibilityChange(),themeChange:t=>this._handleThemeChange(t),oldThemeChange:t=>this._handleThemeChange(t),resize:()=>{this._handleWindowResize()}}}addListeners(){this._manageListeners(!0)}removeListeners(){this._manageListeners(!1)}}var Ae,Be;!function(t){t.configAdded="configAdded",t.containerInit="containerInit",t.particlesSetup="particlesSetup",t.containerStarted="containerStarted",t.containerStopped="containerStopped",t.containerDestroyed="containerDestroyed",t.containerPaused="containerPaused",t.containerPlay="containerPlay",t.containerBuilt="containerBuilt",t.particleAdded="particleAdded",t.particleDestroyed="particleDestroyed",t.particleRemoved="particleRemoved"}(Ae||(Ae={}));class Fe{constructor(){this.value=""}static create(t,e){const i=new Fe;return i.load(t),void 0!==e&&(w(e)||M(e)?i.load({value:e}):i.load(e)),i}load(t){void 0!==t?.value&&(this.value=t.value)}}class qe{constructor(){this.color=new Fe,this.color.value="",this.image="",this.position="",this.repeat="",this.size="",this.opacity=1}load(t){t&&(void 0!==t.color&&(this.color=Fe.create(this.color,t.color)),void 0!==t.image&&(this.image=t.image),void 0!==t.position&&(this.position=t.position),void 0!==t.repeat&&(this.repeat=t.repeat),void 0!==t.size&&(this.size=t.size),void 0!==t.opacity&&(this.opacity=t.opacity))}}class He{constructor(){this.opacity=1}load(t){t&&(void 0!==t.color&&(this.color=Fe.create(this.color,t.color)),void 0!==t.image&&(this.image=t.image),void 0!==t.opacity&&(this.opacity=t.opacity))}}class Ue{constructor(){this.composite="destination-out",this.cover=new He,this.enable=!1}load(t){if(t){if(void 0!==t.composite&&(this.composite=t.composite),void 0!==t.cover){const e=t.cover,i=w(t.cover)?{color:t.cover}:t.cover;this.cover.load(void 0!==e.color||void 0!==e.image?e:{color:i})}void 0!==t.enable&&(this.enable=t.enable)}}}class We{constructor(){this.enable=!0,this.zIndex=0}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.zIndex&&(this.zIndex=t.zIndex))}}class Ve{constructor(){this.enable=!1,this.mode=[]}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.mode&&(this.mode=t.mode))}}!function(t){t.circle="circle",t.rectangle="rectangle"}(Be||(Be={}));class $e{constructor(){this.selectors=[],this.enable=!1,this.mode=[],this.type=Be.circle}load(t){t&&(void 0!==t.selectors&&(this.selectors=t.selectors),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.mode&&(this.mode=t.mode),void 0!==t.type&&(this.type=t.type))}}class je{constructor(){this.enable=!1,this.force=2,this.smooth=10}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.force&&(this.force=t.force),void 0!==t.smooth&&(this.smooth=t.smooth))}}class Ge{constructor(){this.enable=!1,this.mode=[],this.parallax=new je}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.mode&&(this.mode=t.mode),this.parallax.load(t.parallax))}}class Qe{constructor(){this.delay=.5,this.enable=!0}load(t){void 0!==t&&(void 0!==t.delay&&(this.delay=t.delay),void 0!==t.enable&&(this.enable=t.enable))}}class Ne{constructor(){this.onClick=new Ve,this.onDiv=new $e,this.onHover=new Ge,this.resize=new Qe}load(t){if(!t)return;this.onClick.load(t.onClick);const e=t.onDiv;void 0!==e&&(this.onDiv=At(e,(t=>{const e=new $e;return e.load(t),e}))),this.onHover.load(t.onHover),this.resize.load(t.resize)}}class Xe{constructor(t,e){this._engine=t,this._container=e}load(t){if(!t)return;if(!this._container)return;const e=this._engine.interactors.get(this._container);if(e)for(const i of e)i.loadModeOptions&&i.loadModeOptions(this,t)}}class Ye{constructor(t,e){this.detectsOn=Ee.window,this.events=new Ne,this.modes=new Xe(t,e)}load(t){if(!t)return;const e=t.detectsOn;void 0!==e&&(this.detectsOn=e),this.events.load(t.events),this.modes.load(t.modes)}}class Ze{load(t){t&&(t.position&&(this.position={x:t.position.x??50,y:t.position.y??50,mode:t.position.mode??ht.percent}),t.options&&(this.options=Ot({},t.options)))}}var Je,Ke,ti,ei,ii,si,oi;!function(t){t.screen="screen",t.canvas="canvas"}(Je||(Je={}));class ni{constructor(){this.maxWidth=1/0,this.options={},this.mode=Je.canvas}load(t){t&&(void 0!==t.maxWidth&&(this.maxWidth=t.maxWidth),void 0!==t.mode&&(t.mode===Je.screen?this.mode=Je.screen:this.mode=Je.canvas),void 0!==t.options&&(this.options=Ot({},t.options)))}}!function(t){t.any="any",t.dark="dark",t.light="light"}(Ke||(Ke={}));class ai{constructor(){this.auto=!1,this.mode=Ke.any,this.value=!1}load(t){t&&(void 0!==t.auto&&(this.auto=t.auto),void 0!==t.mode&&(this.mode=t.mode),void 0!==t.value&&(this.value=t.value))}}class ri{constructor(){this.name="",this.default=new ai}load(t){t&&(void 0!==t.name&&(this.name=t.name),this.default.load(t.default),void 0!==t.options&&(this.options=Ot({},t.options)))}}class ci{constructor(){this.count=0,this.enable=!1,this.speed=1,this.decay=0,this.delay=0,this.sync=!1}load(t){t&&(void 0!==t.count&&(this.count=Q(t.count)),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.speed&&(this.speed=Q(t.speed)),void 0!==t.decay&&(this.decay=Q(t.decay)),void 0!==t.delay&&(this.delay=Q(t.delay)),void 0!==t.sync&&(this.sync=t.sync))}}class li extends ci{constructor(){super(),this.mode=at.auto,this.startValue=dt.random}load(t){super.load(t),t&&(void 0!==t.mode&&(this.mode=t.mode),void 0!==t.startValue&&(this.startValue=t.startValue))}}class hi extends ci{constructor(){super(),this.offset=0,this.sync=!0}load(t){super.load(t),t&&void 0!==t.offset&&(this.offset=Q(t.offset))}}class di{constructor(){this.h=new hi,this.s=new hi,this.l=new hi}load(t){t&&(this.h.load(t.h),this.s.load(t.s),this.l.load(t.l))}}class ui extends Fe{constructor(){super(),this.animation=new di}static create(t,e){const i=new ui;return i.load(t),void 0!==e&&(w(e)||M(e)?i.load({value:e}):i.load(e)),i}load(t){if(super.load(t),!t)return;const e=t.animation;void 0!==e&&(void 0!==e.enable?this.animation.h.load(e):this.animation.load(t.animation))}}!function(t){t.absorb="absorb",t.bounce="bounce",t.destroy="destroy"}(ti||(ti={}));class pi{constructor(){this.speed=2}load(t){t&&void 0!==t.speed&&(this.speed=t.speed)}}class fi{constructor(){this.enable=!0,this.retries=0}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.retries&&(this.retries=t.retries))}}class vi{constructor(){this.value=0}load(t){t&&void 0!==t.value&&(this.value=Q(t.value))}}class mi extends vi{constructor(){super(),this.animation=new ci}load(t){if(super.load(t),!t)return;const e=t.animation;void 0!==e&&this.animation.load(e)}}class gi extends mi{constructor(){super(),this.animation=new li}load(t){super.load(t)}}class yi extends vi{constructor(){super(),this.value=1}}class bi{constructor(){this.horizontal=new yi,this.vertical=new yi}load(t){t&&(this.horizontal.load(t.horizontal),this.vertical.load(t.vertical))}}class wi{constructor(){this.absorb=new pi,this.bounce=new bi,this.enable=!1,this.maxSpeed=50,this.mode=ti.bounce,this.overlap=new fi}load(t){t&&(this.absorb.load(t.absorb),this.bounce.load(t.bounce),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.maxSpeed&&(this.maxSpeed=Q(t.maxSpeed)),void 0!==t.mode&&(this.mode=t.mode),this.overlap.load(t.overlap))}}class xi{constructor(){this.close=!0,this.fill=!0,this.options={},this.type=[]}load(t){if(!t)return;const e=t.options;if(void 0!==e)for(const t in e){const i=e[t];i&&(this.options[t]=Ot(this.options[t]??{},i))}void 0!==t.close&&(this.close=t.close),void 0!==t.fill&&(this.fill=t.fill),void 0!==t.type&&(this.type=t.type)}}class _i{constructor(){this.offset=0,this.value=90}load(t){t&&(void 0!==t.offset&&(this.offset=Q(t.offset)),void 0!==t.value&&(this.value=Q(t.value)))}}class ki{constructor(){this.distance=200,this.enable=!1,this.rotate={x:3e3,y:3e3}}load(t){if(t&&(void 0!==t.distance&&(this.distance=Q(t.distance)),void 0!==t.enable&&(this.enable=t.enable),t.rotate)){const e=t.rotate.x;void 0!==e&&(this.rotate.x=e);const i=t.rotate.y;void 0!==i&&(this.rotate.y=i)}}}class Mi{constructor(){this.x=50,this.y=50,this.mode=ht.percent,this.radius=0}load(t){t&&(void 0!==t.x&&(this.x=t.x),void 0!==t.y&&(this.y=t.y),void 0!==t.mode&&(this.mode=t.mode),void 0!==t.radius&&(this.radius=t.radius))}}class zi{constructor(){this.acceleration=9.81,this.enable=!1,this.inverse=!1,this.maxSpeed=50}load(t){t&&(void 0!==t.acceleration&&(this.acceleration=Q(t.acceleration)),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.inverse&&(this.inverse=t.inverse),void 0!==t.maxSpeed&&(this.maxSpeed=Q(t.maxSpeed)))}}class Ci{constructor(){this.clamp=!0,this.delay=new vi,this.enable=!1,this.options={}}load(t){t&&(void 0!==t.clamp&&(this.clamp=t.clamp),this.delay.load(t.delay),void 0!==t.enable&&(this.enable=t.enable),this.generator=t.generator,t.options&&(this.options=Ot(this.options,t.options)))}}class Pi{load(t){t&&(void 0!==t.color&&(this.color=Fe.create(this.color,t.color)),void 0!==t.image&&(this.image=t.image))}}class Oi{constructor(){this.enable=!1,this.length=10,this.fill=new Pi}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.fill&&this.fill.load(t.fill),void 0!==t.length&&(this.length=t.length))}}!function(t){t.bounce="bounce",t.none="none",t.out="out",t.destroy="destroy",t.split="split"}(ei||(ei={}));class Si{constructor(){this.default=ei.out}load(t){t&&(void 0!==t.default&&(this.default=t.default),this.bottom=t.bottom??t.default,this.left=t.left??t.default,this.right=t.right??t.default,this.top=t.top??t.default)}}class Ti{constructor(){this.acceleration=0,this.enable=!1}load(t){t&&(void 0!==t.acceleration&&(this.acceleration=Q(t.acceleration)),void 0!==t.enable&&(this.enable=t.enable),t.position&&(this.position=Ot({},t.position)))}}class Ri{constructor(){this.angle=new _i,this.attract=new ki,this.center=new Mi,this.decay=0,this.distance={},this.direction=y.none,this.drift=0,this.enable=!1,this.gravity=new zi,this.path=new Ci,this.outModes=new Si,this.random=!1,this.size=!1,this.speed=2,this.spin=new Ti,this.straight=!1,this.trail=new Oi,this.vibrate=!1,this.warp=!1}load(t){if(!t)return;this.angle.load(x(t.angle)?{value:t.angle}:t.angle),this.attract.load(t.attract),this.center.load(t.center),void 0!==t.decay&&(this.decay=Q(t.decay)),void 0!==t.direction&&(this.direction=t.direction),void 0!==t.distance&&(this.distance=x(t.distance)?{horizontal:t.distance,vertical:t.distance}:{...t.distance}),void 0!==t.drift&&(this.drift=Q(t.drift)),void 0!==t.enable&&(this.enable=t.enable),this.gravity.load(t.gravity);const e=t.outModes;void 0!==e&&(k(e)?this.outModes.load(e):this.outModes.load({default:e})),this.path.load(t.path),void 0!==t.random&&(this.random=t.random),void 0!==t.size&&(this.size=t.size),void 0!==t.speed&&(this.speed=Q(t.speed)),this.spin.load(t.spin),void 0!==t.straight&&(this.straight=t.straight),this.trail.load(t.trail),void 0!==t.vibrate&&(this.vibrate=t.vibrate),void 0!==t.warp&&(this.warp=t.warp)}}class Di extends li{constructor(){super(),this.destroy=ct.none,this.speed=2}load(t){super.load(t),t&&void 0!==t.destroy&&(this.destroy=t.destroy)}}class Ei extends gi{constructor(){super(),this.animation=new Di,this.value=1}load(t){if(!t)return;super.load(t);const e=t.animation;void 0!==e&&this.animation.load(e)}}class Ii{constructor(){this.enable=!1,this.width=1920,this.height=1080}load(t){if(!t)return;void 0!==t.enable&&(this.enable=t.enable);const e=t.width;void 0!==e&&(this.width=e);const i=t.height;void 0!==i&&(this.height=i)}}!function(t){t.delete="delete",t.wait="wait"}(ii||(ii={}));class Li{constructor(){this.mode=ii.delete,this.value=0}load(t){t&&(void 0!==t.mode&&(this.mode=t.mode),void 0!==t.value&&(this.value=t.value))}}class Ai{constructor(){this.density=new Ii,this.limit=new Li,this.value=0}load(t){t&&(this.density.load(t.density),this.limit.load(t.limit),void 0!==t.value&&(this.value=t.value))}}class Bi{constructor(){this.blur=0,this.color=new Fe,this.enable=!1,this.offset={x:0,y:0},this.color.value="#000"}load(t){t&&(void 0!==t.blur&&(this.blur=t.blur),this.color=Fe.create(this.color,t.color),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.offset&&(void 0!==t.offset.x&&(this.offset.x=t.offset.x),void 0!==t.offset.y&&(this.offset.y=t.offset.y)))}}class Fi{constructor(){this.close=!0,this.fill=!0,this.options={},this.type="circle"}load(t){if(!t)return;const e=t.options;if(void 0!==e)for(const t in e){const i=e[t];i&&(this.options[t]=Ot(this.options[t]??{},i))}void 0!==t.close&&(this.close=t.close),void 0!==t.fill&&(this.fill=t.fill),void 0!==t.type&&(this.type=t.type)}}class qi extends li{constructor(){super(),this.destroy=ct.none,this.speed=5}load(t){super.load(t),t&&void 0!==t.destroy&&(this.destroy=t.destroy)}}class Hi extends gi{constructor(){super(),this.animation=new qi,this.value=3}load(t){if(super.load(t),!t)return;const e=t.animation;void 0!==e&&this.animation.load(e)}}class Ui{constructor(){this.width=0}load(t){t&&(void 0!==t.color&&(this.color=ui.create(this.color,t.color)),void 0!==t.width&&(this.width=Q(t.width)),void 0!==t.opacity&&(this.opacity=Q(t.opacity)))}}class Wi extends vi{constructor(){super(),this.opacityRate=1,this.sizeRate=1,this.velocityRate=1}load(t){super.load(t),t&&(void 0!==t.opacityRate&&(this.opacityRate=t.opacityRate),void 0!==t.sizeRate&&(this.sizeRate=t.sizeRate),void 0!==t.velocityRate&&(this.velocityRate=t.velocityRate))}}class Vi{constructor(t,e){this._engine=t,this._container=e,this.bounce=new bi,this.collisions=new wi,this.color=new ui,this.color.value="#fff",this.effect=new xi,this.groups={},this.move=new Ri,this.number=new Ai,this.opacity=new Ei,this.reduceDuplicates=!1,this.shadow=new Bi,this.shape=new Fi,this.size=new Hi,this.stroke=new Ui,this.zIndex=new Wi}load(t){if(!t)return;if(void 0!==t.groups)for(const e of Object.keys(t.groups)){if(!Object.hasOwn(t.groups,e))continue;const i=t.groups[e];void 0!==i&&(this.groups[e]=Ot(this.groups[e]??{},i))}void 0!==t.reduceDuplicates&&(this.reduceDuplicates=t.reduceDuplicates),this.bounce.load(t.bounce),this.color.load(ui.create(this.color,t.color)),this.effect.load(t.effect),this.move.load(t.move),this.number.load(t.number),this.opacity.load(t.opacity),this.shape.load(t.shape),this.size.load(t.size),this.shadow.load(t.shadow),this.zIndex.load(t.zIndex),this.collisions.load(t.collisions),void 0!==t.interactivity&&(this.interactivity=Ot({},t.interactivity));const e=t.stroke;if(e&&(this.stroke=At(e,(t=>{const e=new Ui;return e.load(t),e}))),this._container){const e=this._engine.updaters.get(this._container);if(e)for(const i of e)i.loadOptions&&i.loadOptions(this,t);const i=this._engine.interactors.get(this._container);if(i)for(const e of i)e.loadParticlesOptions&&e.loadParticlesOptions(this,t)}}}function $i(t,...e){for(const i of e)t.load(i)}function ji(t,e,...i){const s=new Vi(t,e);return $i(s,...i),s}class Gi{constructor(t,e){this._findDefaultTheme=t=>this.themes.find((e=>e.default.value&&e.default.mode===t))??this.themes.find((t=>t.default.value&&t.default.mode===Ke.any)),this._importPreset=t=>{this.load(this._engine.getPreset(t))},this._engine=t,this._container=e,this.autoPlay=!0,this.background=new qe,this.backgroundMask=new Ue,this.clear=!0,this.defaultThemes={},this.delay=0,this.fullScreen=new We,this.detectRetina=!0,this.duration=0,this.fpsLimit=120,this.interactivity=new Ye(t,e),this.manualParticles=[],this.particles=ji(this._engine,this._container),this.pauseOnBlur=!0,this.pauseOnOutsideViewport=!0,this.responsive=[],this.smooth=!1,this.style={},this.themes=[],this.zLayers=100}load(t){if(!t)return;void 0!==t.preset&&At(t.preset,(t=>this._importPreset(t))),void 0!==t.autoPlay&&(this.autoPlay=t.autoPlay),void 0!==t.clear&&(this.clear=t.clear),void 0!==t.key&&(this.key=t.key),void 0!==t.name&&(this.name=t.name),void 0!==t.delay&&(this.delay=Q(t.delay));const e=t.detectRetina;void 0!==e&&(this.detectRetina=e),void 0!==t.duration&&(this.duration=Q(t.duration));const i=t.fpsLimit;void 0!==i&&(this.fpsLimit=i),void 0!==t.pauseOnBlur&&(this.pauseOnBlur=t.pauseOnBlur),void 0!==t.pauseOnOutsideViewport&&(this.pauseOnOutsideViewport=t.pauseOnOutsideViewport),void 0!==t.zLayers&&(this.zLayers=t.zLayers),this.background.load(t.background);const s=t.fullScreen;b(s)?this.fullScreen.enable=s:this.fullScreen.load(s),this.backgroundMask.load(t.backgroundMask),this.interactivity.load(t.interactivity),t.manualParticles&&(this.manualParticles=t.manualParticles.map((t=>{const e=new Ze;return e.load(t),e}))),this.particles.load(t.particles),this.style=Ot(this.style,t.style),this._engine.loadOptions(this,t),void 0!==t.smooth&&(this.smooth=t.smooth);const o=this._engine.interactors.get(this._container);if(o)for(const e of o)e.loadOptions&&e.loadOptions(this,t);if(void 0!==t.responsive)for(const e of t.responsive){const t=new ni;t.load(e),this.responsive.push(t)}if(this.responsive.sort(((t,e)=>t.maxWidth-e.maxWidth)),void 0!==t.themes)for(const e of t.themes){const t=this.themes.find((t=>t.name===e.name));if(t)t.load(e);else{const t=new ri;t.load(e),this.themes.push(t)}}this.defaultThemes.dark=this._findDefaultTheme(Ke.dark)?.name,this.defaultThemes.light=this._findDefaultTheme(Ke.light)?.name}setResponsive(t,e,i){this.load(i);const s=this.responsive.find((i=>i.mode===Je.screen&&screen?i.maxWidth>screen.availWidth:i.maxWidth*e>t));return this.load(s?.options),s?.maxWidth}setTheme(t){if(t){const e=this.themes.find((e=>e.name===t));e&&this.load(e.options)}else{const t=yt("(prefers-color-scheme: dark)"),e=t?.matches,i=this._findDefaultTheme(e?Ke.dark:Ke.light);i&&this.load(i.options)}}}!function(t){t.external="external",t.particles="particles"}(si||(si={}));class Qi{constructor(t,e){this.container=e,this._engine=t,this._interactors=[],this._externalInteractors=[],this._particleInteractors=[]}externalInteract(t){for(const e of this._externalInteractors)e.isEnabled()&&e.interact(t)}handleClickMode(t){for(const e of this._externalInteractors)e.handleClickMode?.(t)}async init(){this._interactors=await this._engine.getInteractors(this.container,!0),this._externalInteractors=[],this._particleInteractors=[];for(const t of this._interactors){switch(t.type){case si.external:this._externalInteractors.push(t);break;case si.particles:this._particleInteractors.push(t)}t.init()}}particlesInteract(t,e){for(const i of this._externalInteractors)i.clear(t,e);for(const i of this._particleInteractors)i.isEnabled(t)&&i.interact(t,e)}reset(t){for(const e of this._externalInteractors)e.isEnabled()&&e.reset(t);for(const e of this._particleInteractors)e.isEnabled(t)&&e.reset(t)}}!function(t){t.normal="normal",t.inside="inside",t.outside="outside"}(oi||(oi={}));const Ni=.5,Xi="random";function Yi(t){if(!xt(t.outMode,t.checkModes))return;const e=2*t.radius;t.coord>t.maxCoord-e?t.setCb(-t.radius):t.coord<e&&t.setCb(t.radius)}class Zi{constructor(t,e){this.container=e,this._calcPosition=(t,e,i,s=0)=>{for(const[,s]of t.plugins){const t=void 0!==s.particlePosition?s.particlePosition(e,this):void 0;if(t)return O.create(t.x,t.y,i)}const o=st({size:t.canvas.size,position:e}),n=O.create(o.x,o.y,i),a=this.getRadius(),r=this.options.move.outModes,c=e=>{Yi({outMode:e,checkModes:[ei.bounce],coord:n.x,maxCoord:t.canvas.size.width,setCb:t=>n.x+=t,radius:a})},l=e=>{Yi({outMode:e,checkModes:[ei.bounce],coord:n.y,maxCoord:t.canvas.size.height,setCb:t=>n.y+=t,radius:a})};if(c(r.left??r.default),c(r.right??r.default),l(r.top??r.default),l(r.bottom??r.default),this._checkOverlap(n,s)){const e=1;return this._calcPosition(t,void 0,i,s+e)}return n},this._calculateVelocity=()=>{const t=J(this.direction).copy(),e=this.options.move;if(e.direction===y.inside||e.direction===y.outside)return t;const i=Y($(e.angle.value)),s=Y($(e.angle.offset)),o={left:s-i*Ni,right:s+i*Ni};return e.straight||(t.angle+=V(Q(o.left,o.right))),e.random&&"number"==typeof e.speed&&(t.length*=B()),t},this._checkOverlap=(t,e=0)=>{const i=this.options.collisions,s=this.getRadius();if(!i.enable)return!1;const o=i.overlap;if(o.enable)return!1;const n=o.retries;if(n>=0&&e>n)throw new Error(`${f} particle is overlapping and can't be placed`);return!!this.container.particles.find((e=>X(t,e.position)<s+e.getRadius()))},this._getRollColor=t=>{if(!t||!this.roll||!this.backColor&&!this.roll.alter)return t;const e=this.roll.horizontal&&this.roll.vertical?2:1,i=this.roll.horizontal?Math.PI*Ni:0;return Math.floor(((this.roll.angle??0)+i)/(Math.PI/e))%2?this.backColor?this.backColor:this.roll.alter?Se(t,this.roll.alter.type,this.roll.alter.value):t:t},this._initPosition=t=>{const e=this.container,i=$(this.options.zIndex.value);this.position=this._calcPosition(e,t,U(i,0,e.zLayers)),this.initialPosition=this.position.copy();const s=e.canvas.size;switch(this.moveCenter={...Ut(this.options.move.center,s),radius:this.options.move.center.radius??0,mode:this.options.move.center.mode??ht.percent},this.direction=Z(this.options.move.direction,this.position,this.moveCenter),this.options.move.direction){case y.inside:this.outType=oi.inside;break;case y.outside:this.outType=oi.outside}this.offset=S.origin},this._engine=t}destroy(t){if(this.unbreakable||this.destroyed)return;this.destroyed=!0,this.bubble.inRange=!1,this.slow.inRange=!1;const e=this.container,i=this.pathGenerator,s=e.shapeDrawers.get(this.shape);s?.particleDestroy?.(this);for(const[,i]of e.plugins)i.particleDestroyed?.(this,t);for(const i of e.particles.updaters)i.particleDestroyed?.(this,t);i?.reset(this),this._engine.dispatchEvent(Ae.particleDestroyed,{container:this.container,data:{particle:this}})}draw(t){const e=this.container,i=e.canvas;for(const[,s]of e.plugins)i.drawParticlePlugin(s,this,t);i.drawParticle(this,t)}getFillColor(){return this._getRollColor(this.bubble.color??ue(this.color))}getMass(){return this.getRadius()**2*Math.PI*Ni}getPosition(){return{x:this.position.x+this.offset.x,y:this.position.y+this.offset.y,z:this.position.z}}getRadius(){return this.bubble.radius??this.size.value}getStrokeColor(){return this._getRollColor(this.bubble.color??ue(this.strokeColor))}init(t,e,i,s){const o=this.container,n=this._engine;this.id=t,this.group=s,this.effectClose=!0,this.effectFill=!0,this.shapeClose=!0,this.shapeFill=!0,this.pathRotation=!1,this.lastPathTime=0,this.destroyed=!1,this.unbreakable=!1,this.isRotating=!1,this.rotation=0,this.misplaced=!1,this.retina={maxDistance:{}},this.outType=oi.normal,this.ignoresResizeRatio=!0;const a=o.retina.pixelRatio,r=o.actualOptions,c=ji(this._engine,o,r.particles),{reduceDuplicates:l}=c,h=c.effect.type,d=c.shape.type;this.effect=Bt(h,this.id,l),this.shape=Bt(d,this.id,l);const u=c.effect,p=c.shape;if(i){if(i.effect?.type){const t=Bt(i.effect.type,this.id,l);t&&(this.effect=t,u.load(i.effect))}if(i.shape?.type){const t=Bt(i.shape.type,this.id,l);t&&(this.shape=t,p.load(i.shape))}}if(this.effect===Xi){const t=[...this.container.effectDrawers.keys()];this.effect=t[Math.floor(Math.random()*t.length)]}if(this.shape===Xi){const t=[...this.container.shapeDrawers.keys()];this.shape=t[Math.floor(Math.random()*t.length)]}this.effectData=function(t,e,i,s){const o=e.options[t];if(o)return Ot({close:e.close,fill:e.fill},Bt(o,i,s))}(this.effect,u,this.id,l),this.shapeData=function(t,e,i,s){const o=e.options[t];if(o)return Ot({close:e.close,fill:e.fill},Bt(o,i,s))}(this.shape,p,this.id,l),c.load(i);const f=this.effectData;f&&c.load(f.particles);const v=this.shapeData;v&&c.load(v.particles);const m=new Ye(n,o);m.load(o.actualOptions.interactivity),m.load(c.interactivity),this.interactivity=m,this.effectFill=f?.fill??c.effect.fill,this.effectClose=f?.close??c.effect.close,this.shapeFill=v?.fill??c.shape.fill,this.shapeClose=v?.close??c.shape.close,this.options=c;const y=this.options.move.path;this.pathDelay=$(y.delay.value)*g,y.generator&&(this.pathGenerator=this._engine.getPathGenerator(y.generator),this.pathGenerator&&o.addPath(y.generator,this.pathGenerator)&&this.pathGenerator.init(o)),o.retina.initParticle(this),this.size=qt(this.options.size,a),this.bubble={inRange:!1},this.slow={inRange:!1,factor:1},this._initPosition(e),this.initialVelocity=this._calculateVelocity(),this.velocity=this.initialVelocity.copy();this.moveDecay=1-$(this.options.move.decay);const b=o.particles;b.setLastZIndex(this.position.z),this.zIndexFactor=this.position.z/o.zLayers,this.sides=24;let w=o.effectDrawers.get(this.effect);w||(w=this._engine.getEffectDrawer(this.effect),w&&o.effectDrawers.set(this.effect,w)),w?.loadEffect&&w.loadEffect(this);let x=o.shapeDrawers.get(this.shape);x||(x=this._engine.getShapeDrawer(this.shape),x&&o.shapeDrawers.set(this.shape,x)),x?.loadShape&&x.loadShape(this);const _=x?.getSidesCount;_&&(this.sides=_(this)),this.spawning=!1,this.shadowColor=Zt(this.options.shadow.color);for(const t of b.updaters)t.init(this);for(const t of b.movers)t.init?.(this);w?.particleInit?.(o,this),x?.particleInit?.(o,this);for(const[,t]of o.plugins)t.particleCreated?.(this)}isInsideCanvas(){const t=this.getRadius(),e=this.container.canvas.size,i=this.position;return i.x>=-t&&i.y>=-t&&i.y<=e.height+t&&i.x<=e.width+t}isVisible(){return!this.destroyed&&!this.spawning&&this.isInsideCanvas()}reset(){for(const t of this.container.particles.updaters)t.reset?.(this)}}class Ji{constructor(t,e){this.position=t,this.particle=e}}var Ki;!function(t){t.circle="circle",t.rectangle="rectangle"}(Ki||(Ki={}));class ts{constructor(t,e,i){this.position={x:t,y:e},this.type=i}}class es extends ts{constructor(t,e,i){super(t,e,Ki.circle),this.radius=i}contains(t){return X(t,this.position)<=this.radius}intersects(t){const e=this.position,i=t.position,s=Math.abs(i.x-e.x),o=Math.abs(i.y-e.y),n=this.radius;if(t instanceof es||t.type===Ki.circle){return n+t.radius>Math.sqrt(s**2+o**2)}if(t instanceof is||t.type===Ki.rectangle){const e=t,{width:i,height:a}=e.size;return Math.pow(s-i,2)+Math.pow(o-a,2)<=n**2||s<=n+i&&o<=n+a||s<=i||o<=a}return!1}}class is extends ts{constructor(t,e,i,s){super(t,e,Ki.rectangle),this.size={height:s,width:i}}contains(t){const e=this.size.width,i=this.size.height,s=this.position;return t.x>=s.x&&t.x<=s.x+e&&t.y>=s.y&&t.y<=s.y+i}intersects(t){if(t instanceof es)return t.intersects(this);const e=this.size.width,i=this.size.height,s=this.position,o=t.position,n=t instanceof is?t.size:{width:0,height:0},a=n.width,r=n.height;return o.x<s.x+e&&o.x+a>s.x&&o.y<s.y+i&&o.y+r>s.y}}const ss=.5;class os{constructor(t,e){this.rectangle=t,this.capacity=e,this._subdivide=()=>{const{x:t,y:e}=this.rectangle.position,{width:i,height:s}=this.rectangle.size,{capacity:o}=this;for(let n=0;n<4;n++){const a=n%2;this._subs.push(new os(new is(t+i*ss*a,e+s*ss*(Math.round(n*ss)-a),i*ss,s*ss),o))}this._divided=!0},this._points=[],this._divided=!1,this._subs=[]}insert(t){return!!this.rectangle.contains(t.position)&&(this._points.length<this.capacity?(this._points.push(t),!0):(this._divided||this._subdivide(),this._subs.some((e=>e.insert(t)))))}query(t,e){const i=[];if(!t.intersects(this.rectangle))return[];for(const s of this._points)!t.contains(s.position)&&X(t.position,s.position)>s.particle.getRadius()&&(!e||e(s.particle))||i.push(s.particle);if(this._divided)for(const s of this._subs)i.push(...s.query(t,e));return i}queryCircle(t,e,i){return this.query(new es(t.x,t.y,e),i)}queryRectangle(t,e,i){return this.query(new is(t.x,t.y,e.width,e.height),i)}}const ns=t=>{const{height:e,width:i}=t;return new is(-.25*i,-.25*e,1.5*i,1.5*e)};class as{constructor(t,e){this._addToPool=(...t)=>{this._pool.push(...t)},this._applyDensity=(t,e,i)=>{const s=t.number;if(!t.number.density?.enable)return void(void 0===i?this._limit=s.limit.value:s.limit&&this._groupLimits.set(i,s.limit.value));const o=this._initDensityFactor(s.density),n=s.value,a=s.limit.value>0?s.limit.value:n,r=Math.min(n,a)*o+e,c=Math.min(this.count,this.filter((t=>t.group===i)).length);void 0===i?this._limit=s.limit.value*o:this._groupLimits.set(i,s.limit.value*o),c<r?this.push(Math.abs(r-c),void 0,t,i):c>r&&this.removeQuantity(c-r,i)},this._initDensityFactor=t=>{const e=this._container;if(!e.canvas.element||!t.enable)return 1;const i=e.canvas.element,s=e.retina.pixelRatio;return i.width*i.height/(t.height*t.width*s**2)},this._pushParticle=(t,e,i,s)=>{try{let o=this._pool.pop();o||(o=new Zi(this._engine,this._container)),o.init(this._nextId,t,e,i);let n=!0;if(s&&(n=s(o)),!n)return;return this._array.push(o),this._zArray.push(o),this._nextId++,this._engine.dispatchEvent(Ae.particleAdded,{container:this._container,data:{particle:o}}),o}catch(t){ft().warning(`${f} adding particle: ${t}`)}},this._removeParticle=(t,e,i)=>{const s=this._array[t];if(!s||s.group!==e)return!1;const o=this._zArray.indexOf(s);return this._array.splice(t,1),this._zArray.splice(o,1),s.destroy(i),this._engine.dispatchEvent(Ae.particleRemoved,{container:this._container,data:{particle:s}}),this._addToPool(s),!0},this._engine=t,this._container=e,this._nextId=0,this._array=[],this._zArray=[],this._pool=[],this._limit=0,this._groupLimits=new Map,this._needsSort=!1,this._lastZIndex=0,this._interactionManager=new Qi(t,e),this._pluginsInitialized=!1;const i=e.canvas.size;this.quadTree=new os(ns(i),4),this.movers=[],this.updaters=[]}get count(){return this._array.length}addManualParticles(){const t=this._container;t.actualOptions.manualParticles.forEach((e=>this.addParticle(e.position?Ut(e.position,t.canvas.size):void 0,e.options)))}addParticle(t,e,i,s){const o=this._container.actualOptions.particles.number.limit.mode,n=void 0===i?this._limit:this._groupLimits.get(i)??this._limit,a=this.count;if(n>0)switch(o){case ii.delete:{const t=a+1-n;t>0&&this.removeQuantity(t);break}case ii.wait:if(a>=n)return}return this._pushParticle(t,e,i,s)}clear(){this._array=[],this._zArray=[],this._pluginsInitialized=!1}destroy(){this._array=[],this._zArray=[],this.movers=[],this.updaters=[]}draw(t){const e=this._container,i=e.canvas;i.clear(),this.update(t);for(const[,s]of e.plugins)i.drawPlugin(s,t);for(const e of this._zArray)e.draw(t)}filter(t){return this._array.filter(t)}find(t){return this._array.find(t)}get(t){return this._array[t]}handleClickMode(t){this._interactionManager.handleClickMode(t)}async init(){const t=this._container,e=t.actualOptions;this._lastZIndex=0,this._needsSort=!1,await this.initPlugins();let i=!1;for(const[,e]of t.plugins)if(i=e.particlesInitialization?.()??i,i)break;if(this.addManualParticles(),!i){const t=e.particles,i=t.groups;for(const e in i){const s=i[e];for(let i=this.count,o=0;o<s.number?.value&&i<t.number.value;i++,o++)this.addParticle(void 0,s,e)}for(let e=this.count;e<t.number.value;e++)this.addParticle()}}async initPlugins(){if(this._pluginsInitialized)return;const t=this._container;this.movers=await this._engine.getMovers(t,!0),this.updaters=await this._engine.getUpdaters(t,!0),await this._interactionManager.init();for(const[,e]of t.pathGenerators)e.init(t)}push(t,e,i,s){for(let o=0;o<t;o++)this.addParticle(e?.position,i,s)}async redraw(){this.clear(),await this.init(),this.draw({value:0,factor:0})}remove(t,e,i){this.removeAt(this._array.indexOf(t),void 0,e,i)}removeAt(t,e=1,i,s){if(t<0||t>this.count)return;let o=0;for(let n=t;o<e&&n<this.count;n++)this._removeParticle(n--,i,s)&&o++}removeQuantity(t,e){this.removeAt(0,t,e)}setDensity(){const t=this._container.actualOptions,e=t.particles.groups;for(const t in e)this._applyDensity(e[t],0,t);this._applyDensity(t.particles,t.manualParticles.length)}setLastZIndex(t){this._lastZIndex=t,this._needsSort=this._needsSort||this._lastZIndex<t}setResizeFactor(t){this._resizeFactor=t}update(t){const e=this._container,i=new Set;this.quadTree=new os(ns(e.canvas.size),4);for(const[,t]of e.pathGenerators)t.update();for(const[,i]of e.plugins)i.update?.(t);const s=this._resizeFactor;for(const e of this._array){s&&!e.ignoresResizeRatio&&(e.position.x*=s.width,e.position.y*=s.height,e.initialPosition.x*=s.width,e.initialPosition.y*=s.height),e.ignoresResizeRatio=!1,this._interactionManager.reset(e);for(const[,i]of this._container.plugins){if(e.destroyed)break;i.particleUpdate?.(e,t)}for(const i of this.movers)i.isEnabled(e)&&i.move(e,t);e.destroyed?i.add(e):this.quadTree.insert(new Ji(e.getPosition(),e))}if(i.size){const t=t=>!i.has(t);this._array=this.filter(t),this._zArray=this._zArray.filter(t);for(const t of i)this._engine.dispatchEvent(Ae.particleRemoved,{container:this._container,data:{particle:t}});this._addToPool(...i)}this._interactionManager.externalInteract(t);for(const e of this._array){for(const i of this.updaters)i.update(e,t);e.destroyed||e.spawning||this._interactionManager.particlesInteract(e,t)}if(delete this._resizeFactor,this._needsSort){const t=this._zArray;t.sort(((t,e)=>e.position.z-t.position.z||t.id-e.id));const e=1;this._lastZIndex=t[t.length-e].position.z,this._needsSort=!1}}}class rs{constructor(t){this.container=t,this.pixelRatio=1,this.reduceFactor=1}init(){const t=this.container,e=t.actualOptions;this.pixelRatio=!e.detectRetina||mt()?1:window.devicePixelRatio,this.reduceFactor=1;const i=this.pixelRatio,s=t.canvas;if(s.element){const t=s.element;s.size.width=t.offsetWidth*i,s.size.height=t.offsetHeight*i}const o=e.particles,n=o.move;this.maxSpeed=$(n.gravity.maxSpeed)*i,this.sizeAnimationSpeed=$(o.size.animation.speed)*i}initParticle(t){const e=t.options,i=this.pixelRatio,s=e.move,o=s.distance,n=t.retina;n.moveDrift=$(s.drift)*i,n.moveSpeed=$(s.speed)*i,n.sizeAnimationSpeed=$(e.size.animation.speed)*i;const a=n.maxDistance;a.horizontal=void 0!==o.horizontal?o.horizontal*i:void 0,a.vertical=void 0!==o.vertical?o.vertical*i:void 0,n.maxSpeed=$(s.gravity.maxSpeed)*i}}function cs(t){return t&&!t.destroyed}function ls(t,e,...i){const s=new Gi(t,e);return $i(s,...i),s}class hs{constructor(t,e,i){this._intersectionManager=t=>{if(cs(this)&&this.actualOptions.pauseOnOutsideViewport)for(const e of t)e.target===this.interactivity.element&&(e.isIntersecting?this.play():this.pause())},this._nextFrame=t=>{try{if(!this._smooth&&void 0!==this._lastFrameTime&&t<this._lastFrameTime+g/this.fpsLimit)return void this.draw(!1);this._lastFrameTime??=t;const e=function(t,e=60,i=!1){return{value:t,factor:i?60/e:60*t/g}}(t-this._lastFrameTime,this.fpsLimit,this._smooth);if(this.addLifeTime(e.value),this._lastFrameTime=t,e.value>g)return void this.draw(!1);if(this.particles.draw(e),!this.alive())return void this.destroy();this.animationStatus&&this.draw(!1)}catch(t){ft().error(`${f} in animation loop`,t)}},this._engine=t,this.id=Symbol(e),this.fpsLimit=120,this._smooth=!1,this._delay=0,this._duration=0,this._lifeTime=0,this._firstStart=!0,this.started=!1,this.destroyed=!1,this._paused=!0,this._lastFrameTime=0,this.zLayers=100,this.pageHidden=!1,this._clickHandlers=new Map,this._sourceOptions=i,this._initialSourceOptions=i,this.retina=new rs(this),this.canvas=new De(this),this.particles=new as(this._engine,this),this.pathGenerators=new Map,this.interactivity={mouse:{clicking:!1,inside:!1}},this.plugins=new Map,this.effectDrawers=new Map,this.shapeDrawers=new Map,this._options=ls(this._engine,this),this.actualOptions=ls(this._engine,this),this._eventListeners=new Le(this),this._intersectionObserver=bt((t=>this._intersectionManager(t))),this._engine.dispatchEvent(Ae.containerBuilt,{container:this})}get animationStatus(){return!this._paused&&!this.pageHidden&&cs(this)}get options(){return this._options}get sourceOptions(){return this._sourceOptions}addClickHandler(t){if(!cs(this))return;const e=this.interactivity.element;if(!e)return;const i=(e,i,s)=>{if(!cs(this))return;const o=this.retina.pixelRatio,n={x:i.x*o,y:i.y*o},a=this.particles.quadTree.queryCircle(n,s*o);t(e,a)};let s=!1,o=!1;this._clickHandlers.set("click",(t=>{if(!cs(this))return;const e=t,s={x:e.offsetX||e.clientX,y:e.offsetY||e.clientY};i(t,s,1)})),this._clickHandlers.set("touchstart",(()=>{cs(this)&&(s=!0,o=!1)})),this._clickHandlers.set("touchmove",(()=>{cs(this)&&(o=!0)})),this._clickHandlers.set("touchend",(t=>{if(cs(this)){if(s&&!o){const e=t,s=1;let o=e.touches[e.touches.length-s];if(!o&&(o=e.changedTouches[e.changedTouches.length-s],!o))return;const n=this.canvas.element,a=n?n.getBoundingClientRect():void 0,r=0,c={x:o.clientX-(a?a.left:r),y:o.clientY-(a?a.top:r)};i(t,c,Math.max(o.radiusX,o.radiusY))}s=!1,o=!1}})),this._clickHandlers.set("touchcancel",(()=>{cs(this)&&(s=!1,o=!1)}));for(const[t,i]of this._clickHandlers)e.addEventListener(t,i)}addLifeTime(t){this._lifeTime+=t}addPath(t,e,i=!1){return!(!cs(this)||!i&&this.pathGenerators.has(t))&&(this.pathGenerators.set(t,e),!0)}alive(){return!this._duration||this._lifeTime<=this._duration}clearClickHandlers(){if(cs(this)){for(const[t,e]of this._clickHandlers)this.interactivity.element?.removeEventListener(t,e);this._clickHandlers.clear()}}destroy(t=!0){if(cs(this)){this.stop(),this.clearClickHandlers(),this.particles.destroy(),this.canvas.destroy();for(const[,t]of this.effectDrawers)t.destroy?.(this);for(const[,t]of this.shapeDrawers)t.destroy?.(this);for(const t of this.effectDrawers.keys())this.effectDrawers.delete(t);for(const t of this.shapeDrawers.keys())this.shapeDrawers.delete(t);if(this._engine.clearPlugins(this),this.destroyed=!0,t){const t=this._engine.items,e=t.findIndex((t=>t===this));if(e>=0){const i=1;t.splice(e,i)}}this._engine.dispatchEvent(Ae.containerDestroyed,{container:this})}}draw(t){if(!cs(this))return;let e=t;const i=t=>{e&&(this._lastFrameTime=void 0,e=!1),this._nextFrame(t)};this._drawAnimationFrame=q((t=>i(t)))}async export(t,e={}){for(const[,i]of this.plugins){if(!i.export)continue;const s=await i.export(t,e);if(s.supported)return s.blob}ft().error(`${f} - Export plugin with type ${t} not found`)}handleClickMode(t){if(cs(this)){this.particles.handleClickMode(t);for(const[,e]of this.plugins)e.handleClickMode?.(t)}}async init(){if(!cs(this))return;const t=this._engine.getSupportedEffects();for(const e of t){const t=this._engine.getEffectDrawer(e);t&&this.effectDrawers.set(e,t)}const e=this._engine.getSupportedShapes();for(const t of e){const e=this._engine.getShapeDrawer(t);e&&this.shapeDrawers.set(t,e)}await this.particles.initPlugins(),this._options=ls(this._engine,this,this._initialSourceOptions,this.sourceOptions),this.actualOptions=ls(this._engine,this,this._options);const i=await this._engine.getAvailablePlugins(this);for(const[t,e]of i)this.plugins.set(t,e);this.retina.init(),await this.canvas.init(),this.updateActualOptions(),this.canvas.initBackground(),this.canvas.resize();const{zLayers:s,duration:o,delay:n,fpsLimit:a,smooth:r}=this.actualOptions;this.zLayers=s,this._duration=$(o)*g,this._delay=$(n)*g,this._lifeTime=0;this.fpsLimit=a>0?a:120,this._smooth=r;for(const[,t]of this.effectDrawers)await(t.init?.(this));for(const[,t]of this.shapeDrawers)await(t.init?.(this));for(const[,t]of this.plugins)await(t.init?.());this._engine.dispatchEvent(Ae.containerInit,{container:this}),await this.particles.init(),this.particles.setDensity();for(const[,t]of this.plugins)t.particlesSetup?.();this._engine.dispatchEvent(Ae.particlesSetup,{container:this})}async loadTheme(t){cs(this)&&(this._currentTheme=t,await this.refresh())}pause(){if(cs(this)&&(void 0!==this._drawAnimationFrame&&(H(this._drawAnimationFrame),delete this._drawAnimationFrame),!this._paused)){for(const[,t]of this.plugins)t.pause?.();this.pageHidden||(this._paused=!0),this._engine.dispatchEvent(Ae.containerPaused,{container:this})}}play(t){if(!cs(this))return;const e=this._paused||t;if(!this._firstStart||this.actualOptions.autoPlay){if(this._paused&&(this._paused=!1),e)for(const[,t]of this.plugins)t.play&&t.play();this._engine.dispatchEvent(Ae.containerPlay,{container:this}),this.draw(e??!1)}else this._firstStart=!1}async refresh(){if(cs(this))return this.stop(),this.start()}async reset(t){if(cs(this))return this._initialSourceOptions=t,this._sourceOptions=t,this._options=ls(this._engine,this,this._initialSourceOptions,this.sourceOptions),this.actualOptions=ls(this._engine,this,this._options),this.refresh()}async start(){cs(this)&&!this.started&&(await this.init(),this.started=!0,await new Promise((t=>{const e=async()=>{this._eventListeners.addListeners(),this.interactivity.element instanceof HTMLElement&&this._intersectionObserver&&this._intersectionObserver.observe(this.interactivity.element);for(const[,t]of this.plugins)await(t.start?.());this._engine.dispatchEvent(Ae.containerStarted,{container:this}),this.play(),t()};this._delayTimeout=setTimeout((()=>{e()}),this._delay)})))}stop(){if(cs(this)&&this.started){this._delayTimeout&&(clearTimeout(this._delayTimeout),delete this._delayTimeout),this._firstStart=!0,this.started=!1,this._eventListeners.removeListeners(),this.pause(),this.particles.clear(),this.canvas.stop(),this.interactivity.element instanceof HTMLElement&&this._intersectionObserver&&this._intersectionObserver.unobserve(this.interactivity.element);for(const[,t]of this.plugins)t.stop?.();for(const t of this.plugins.keys())this.plugins.delete(t);this._sourceOptions=this._options,this._engine.dispatchEvent(Ae.containerStopped,{container:this})}}updateActualOptions(){this.actualOptions.responsive=[];const t=this.actualOptions.setResponsive(this.canvas.size.width,this.retina.pixelRatio,this._options);return this.actualOptions.setTheme(this._currentTheme),this._responsiveMaxWidth!==t&&(this._responsiveMaxWidth=t,!0)}}class ds{constructor(){this._listeners=new Map}addEventListener(t,e){this.removeEventListener(t,e);let i=this._listeners.get(t);i||(i=[],this._listeners.set(t,i)),i.push(e)}dispatchEvent(t,e){const i=this._listeners.get(t);i?.forEach((t=>t(e)))}hasEventListener(t){return!!this._listeners.get(t)}removeAllEventListeners(t){t?this._listeners.delete(t):this._listeners=new Map}removeEventListener(t,e){const i=this._listeners.get(t);if(!i)return;const s=i.length,o=i.indexOf(e);if(o<0)return;1===s?this._listeners.delete(t):i.splice(o,1)}}async function us(t,e,i,s=!1){let o=e.get(t);return o&&!s||(o=await Promise.all([...i.values()].map((e=>e(t)))),e.set(t,o)),o}const ps="true",fs="false",vs="canvas";class ms{constructor(){this._configs=new Map,this._domArray=[],this._eventDispatcher=new ds,this._initialized=!1,this.plugins=[],this._initializers={interactors:new Map,movers:new Map,updaters:new Map},this.interactors=new Map,this.movers=new Map,this.updaters=new Map,this.presets=new Map,this.effectDrawers=new Map,this.shapeDrawers=new Map,this.pathGenerators=new Map}get configs(){const t={};for(const[e,i]of this._configs)t[e]=i;return t}get items(){return this._domArray}get version(){return"3.5.0"}addConfig(t){const e=t.key??t.name??"default";this._configs.set(e,t),this._eventDispatcher.dispatchEvent(Ae.configAdded,{data:{name:e,config:t}})}async addEffect(t,e,i=!0){At(t,(t=>{this.getEffectDrawer(t)||this.effectDrawers.set(t,e)})),await this.refresh(i)}addEventListener(t,e){this._eventDispatcher.addEventListener(t,e)}async addInteractor(t,e,i=!0){this._initializers.interactors.set(t,e),await this.refresh(i)}async addMover(t,e,i=!0){this._initializers.movers.set(t,e),await this.refresh(i)}async addParticleUpdater(t,e,i=!0){this._initializers.updaters.set(t,e),await this.refresh(i)}async addPathGenerator(t,e,i=!0){this.getPathGenerator(t)||this.pathGenerators.set(t,e),await this.refresh(i)}async addPlugin(t,e=!0){this.getPlugin(t.id)||this.plugins.push(t),await this.refresh(e)}async addPreset(t,e,i=!1,s=!0){!i&&this.getPreset(t)||this.presets.set(t,e),await this.refresh(s)}async addShape(t,e=!0){for(const e of t.validTypes)this.getShapeDrawer(e)||this.shapeDrawers.set(e,t);await this.refresh(e)}clearPlugins(t){this.updaters.delete(t),this.movers.delete(t),this.interactors.delete(t)}dispatchEvent(t,e){this._eventDispatcher.dispatchEvent(t,e)}dom(){return this.items}domItem(t){return this.item(t)}async getAvailablePlugins(t){const e=new Map;for(const i of this.plugins)i.needsPlugin(t.actualOptions)&&e.set(i.id,await i.getPlugin(t));return e}getEffectDrawer(t){return this.effectDrawers.get(t)}async getInteractors(t,e=!1){return us(t,this.interactors,this._initializers.interactors,e)}async getMovers(t,e=!1){return us(t,this.movers,this._initializers.movers,e)}getPathGenerator(t){return this.pathGenerators.get(t)}getPlugin(t){return this.plugins.find((e=>e.id===t))}getPreset(t){return this.presets.get(t)}getShapeDrawer(t){return this.shapeDrawers.get(t)}getSupportedEffects(){return this.effectDrawers.keys()}getSupportedShapes(){return this.shapeDrawers.keys()}async getUpdaters(t,e=!1){return us(t,this.updaters,this._initializers.updaters,e)}init(){this._initialized||(this._initialized=!0)}item(t){const{items:e}=this,i=e[t];if(i&&!i.destroyed)return i;{const i=1;e.splice(t,i)}}async load(t){const e=t.id??t.element?.id??`tsparticles${Math.floor(1e4*B())}`,{index:s,url:o}=t,n=o?await async function(t){const e=Bt(t.url,t.index);if(!e)return t.fallback;const i=await fetch(e);return i.ok?await i.json():(ft().error(`${f} ${i.status} while retrieving config file`),t.fallback)}({fallback:t.options,url:o,index:s}):t.options,a=Bt(n,s),{items:r}=this,c=r.findIndex((t=>t.id.description===e)),l=new hs(this,e,a);if(c>=0){const t=this.item(c),e=t?1:0;t&&!t.destroyed&&t.destroy(!1),r.splice(c,e,l)}else r.push(l);const h=((t,e)=>{let s=e??document.getElementById(t);return s||(s=document.createElement("div"),s.id=t,s.dataset[i]=ps,document.body.append(s),s)})(e,t.element),d=(t=>{let e;if(t instanceof HTMLCanvasElement||t.tagName.toLowerCase()===vs)e=t,e.dataset[i]||(e.dataset[i]=fs);else{const s=t.getElementsByTagName(vs);s.length?(e=s[0],e.dataset[i]=fs):(e=document.createElement(vs),e.dataset[i]=ps,t.appendChild(e))}const s="100%";return e.style.width||(e.style.width=s),e.style.height||(e.style.height=s),e})(h);return l.canvas.loadCanvas(d),await l.start(),l}loadOptions(t,e){this.plugins.forEach((i=>i.loadOptions?.(t,e)))}loadParticlesOptions(t,e,...i){const s=this.updaters.get(t);s&&s.forEach((t=>t.loadOptions?.(e,...i)))}async refresh(t=!0){t&&await Promise.all(this.items.map((t=>t.refresh())))}removeEventListener(t,e){this._eventDispatcher.removeEventListener(t,e)}setOnClickHandler(t){const{items:e}=this;if(!e.length)throw new Error(`${f} can only set click handlers after calling tsParticles.load()`);e.forEach((e=>e.addClickHandler(t)))}}var gs,ys,bs,ws,xs;!function(t){t[t.h=1]="h",t[t.s=2]="s",t[t.l=3]="l",t[t.a=5]="a"}(gs||(gs={}));class _s{constructor(){this.key="hsl",this.stringPrefix="hsl"}handleColor(t){const e=t.value.hsl??t.value;if(void 0!==e.h&&void 0!==e.s&&void 0!==e.l)return oe(e)}handleRangeColor(t){const e=t.value.hsl??t.value;if(void 0!==e.h&&void 0!==e.l)return oe({h:$(e.h),l:$(e.l),s:$(e.s)})}parseString(t){if(!t.startsWith("hsl"))return;const e=/hsla?\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.%]+)\s*)?\)/i.exec(t);return e?ne({a:e.length>4?nt(e[gs.a]):1,h:parseInt(e[gs.h],10),l:parseInt(e[gs.l],10),s:parseInt(e[gs.s],10)}):void 0}}!function(t){t[t.r=1]="r",t[t.g=2]="g",t[t.b=3]="b",t[t.a=5]="a"}(ys||(ys={}));class ks{constructor(){this.key="rgb",this.stringPrefix="rgb"}handleColor(t){const e=t.value.rgb??t.value;if(void 0!==e.r)return e}handleRangeColor(t){const e=t.value.rgb??t.value;if(void 0!==e.r)return{r:$(e.r),g:$(e.g),b:$(e.b)}}parseString(t){if(!t.startsWith(this.stringPrefix))return;const e=/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.%]+)\s*)?\)/i.exec(t);return e?{a:e.length>4?nt(e[ys.a]):1,b:parseInt(e[ys.b],10),g:parseInt(e[ys.g],10),r:parseInt(e[ys.r],10)}:void 0}}class Ms{constructor(t){this.type=si.external,this.container=t}}class zs{constructor(t){this.type=si.particles,this.container=t}}!function(t){t.clockwise="clockwise",t.counterClockwise="counter-clockwise",t.random="random"}(bs||(bs={})),function(t){t.linear="linear",t.radial="radial",t.random="random"}(ws||(ws={})),function(t){t.easeInBack="ease-in-back",t.easeInCirc="ease-in-circ",t.easeInCubic="ease-in-cubic",t.easeInLinear="ease-in-linear",t.easeInQuad="ease-in-quad",t.easeInQuart="ease-in-quart",t.easeInQuint="ease-in-quint",t.easeInExpo="ease-in-expo",t.easeInSine="ease-in-sine",t.easeOutBack="ease-out-back",t.easeOutCirc="ease-out-circ",t.easeOutCubic="ease-out-cubic",t.easeOutLinear="ease-out-linear",t.easeOutQuad="ease-out-quad",t.easeOutQuart="ease-out-quart",t.easeOutQuint="ease-out-quint",t.easeOutExpo="ease-out-expo",t.easeOutSine="ease-out-sine",t.easeInOutBack="ease-in-out-back",t.easeInOutCirc="ease-in-out-circ",t.easeInOutCubic="ease-in-out-cubic",t.easeInOutLinear="ease-in-out-linear",t.easeInOutQuad="ease-in-out-quad",t.easeInOutQuart="ease-in-out-quart",t.easeInOutQuint="ease-in-out-quint",t.easeInOutExpo="ease-in-out-expo",t.easeInOutSine="ease-in-out-sine"}(xs||(xs={}));const Cs=function(){const t=new ks,e=new _s;Xt(t),Xt(e);const i=new ms;return i.init(),i}();mt()||(window.tsParticles=Cs);const Ps=1;function Os(t,e,i,s,o,n){!function(t,e){const i=t.options,s=i.move.path;if(!s.enable)return;if(t.lastPathTime<=t.pathDelay)return void(t.lastPathTime+=e.value);const o=t.pathGenerator?.generate(t,e);o&&t.velocity.addTo(o);s.clamp&&(t.velocity.x=U(t.velocity.x,-Ps,Ps),t.velocity.y=U(t.velocity.y,-Ps,Ps));t.lastPathTime-=t.pathDelay}(t,n);const a=t.gravity,r=a?.enable&&a.inverse?-Ps:Ps;o&&i&&(t.velocity.x+=o*n.factor/(60*i)),a?.enable&&i&&(t.velocity.y+=r*(a.acceleration*n.factor)/(60*i));const c=t.moveDecay;t.velocity.multTo(c);const l=t.velocity.mult(i);a?.enable&&s>0&&(!a.inverse&&l.y>=0&&l.y>=s||a.inverse&&l.y<=0&&l.y<=-s)&&(l.y=r*s,i&&(t.velocity.y=l.y/i));const h=t.options.zIndex,d=(Ps-t.zIndexFactor)**h.velocityRate;l.multTo(d);const{position:u}=t;u.addTo(l),e.vibrate&&(u.x+=Math.sin(u.x*Math.cos(u.y)),u.y+=Math.cos(u.y*Math.sin(u.x)))}class Ss{init(t){const e=t.options.move.gravity;t.gravity={enable:e.enable,acceleration:$(e.acceleration),inverse:e.inverse},function(t){const e=t.container,i=t.options.move.spin;if(!i.enable)return;const s=i.position??{x:50,y:50},o={x:.01*s.x*e.canvas.size.width,y:.01*s.y*e.canvas.size.height},n=X(t.getPosition(),o),a=$(i.acceleration);t.retina.spinAcceleration=a*e.retina.pixelRatio,t.spin={center:o,direction:t.velocity.x>=0?bs.clockwise:bs.counterClockwise,angle:t.velocity.angle,radius:n,acceleration:t.retina.spinAcceleration}}(t)}isEnabled(t){return!t.destroyed&&t.options.move.enable}move(t,e){const i=t.options,s=i.move;if(!s.enable)return;const o=t.container,n=o.retina.pixelRatio;t.retina.moveSpeed??=$(s.speed)*n,t.retina.moveDrift??=$(t.options.move.drift)*n;const a=function(t){return t.slow.inRange?t.slow.factor:Ps}(t),r=t.retina.moveSpeed*o.retina.reduceFactor,c=t.retina.moveDrift,l=G(i.size.value)*n,h=r*(s.size?t.getRadius()/l:1)*a*(e.factor||1)/2,d=t.retina.maxSpeed??o.retina.maxSpeed;s.spin.enable?function(t,e){const i=t.container;if(!t.spin)return;const s={x:t.spin.direction===bs.clockwise?Math.cos:Math.sin,y:t.spin.direction===bs.clockwise?Math.sin:Math.cos};t.position.x=t.spin.center.x+t.spin.radius*s.x(t.spin.angle),t.position.y=t.spin.center.y+t.spin.radius*s.y(t.spin.angle),t.spin.radius+=t.spin.acceleration;const o=Math.max(i.canvas.size.width,i.canvas.size.height),n=.5*o;t.spin.radius>n?(t.spin.radius=n,t.spin.acceleration*=-Ps):t.spin.radius<0&&(t.spin.radius=0,t.spin.acceleration*=-Ps),t.spin.angle+=.01*e*(Ps-t.spin.radius/o)}(t,h):Os(t,s,h,d,c,e),function(t){const e=t.initialPosition,{dx:i,dy:s}=N(e,t.position),o=Math.abs(i),n=Math.abs(s),{maxDistance:a}=t.retina,r=a.horizontal,c=a.vertical;if(!r&&!c)return;if((r&&o>=r||c&&n>=c)&&!t.misplaced)t.misplaced=!!r&&o>r||!!c&&n>c,r&&(t.velocity.x=.5*t.velocity.y-t.velocity.x),c&&(t.velocity.y=.5*t.velocity.x-t.velocity.y);else if((!r||o<r)&&(!c||n<c)&&t.misplaced)t.misplaced=!1;else if(t.misplaced){const i=t.position,s=t.velocity;r&&(i.x<e.x&&s.x<0||i.x>e.x&&s.x>0)&&(s.x*=-B()),c&&(i.y<e.y&&s.y<0||i.y>e.y&&s.y>0)&&(s.y*=-B())}}(t)}}const Ts=2*Math.PI,Rs=0,Ds=0;class Es{constructor(){this.validTypes=["circle"]}draw(t){!function(t){const{context:e,particle:i,radius:s}=t;i.circleRange||(i.circleRange={min:0,max:Ts});const o=i.circleRange;e.arc(Rs,Ds,s,o.min,o.max,!1)}(t)}getSidesCount(){return 12}particleInit(t,e){const i=e.shapeData,s=i?.angle??{max:360,min:0};e.circleRange=k(s)?{min:Y(s.min),max:Y(s.max)}:{min:0,max:Y(s)}}}class Is{constructor(t){this.container=t}init(t){const e=te(t.options.color,t.id,t.options.reduceDuplicates);e&&(t.color=pe(e,t.options.color.animation,this.container.retina.reduceFactor))}isEnabled(t){const{h:e,s:i,l:s}=t.options.color.animation,{color:o}=t;return!t.destroyed&&!t.spawning&&(void 0!==o?.h.value&&e.enable||void 0!==o?.s.value&&i.enable||void 0!==o?.l.value&&s.enable)}update(t,e){me(t.color,e)}}class Ls{constructor(t){this.container=t}init(t){const e=t.options.opacity;t.opacity=qt(e,1);const i=e.animation;i.enable&&(t.opacity.velocity=$(i.speed)/v*this.container.retina.reduceFactor,i.sync||(t.opacity.velocity*=B()))}isEnabled(t){return!t.destroyed&&!t.spawning&&!!t.opacity&&t.opacity.enable&&((t.opacity.maxLoops??0)<=0||(t.opacity.maxLoops??0)>0&&(t.opacity.loops??0)<(t.opacity.maxLoops??0))}reset(t){t.opacity&&(t.opacity.time=0,t.opacity.loops=0)}update(t,e){this.isEnabled(t)&&t.opacity&&Vt(t,t.opacity,!0,t.options.opacity.animation.destroy,e)}}class As{constructor(t){this.container=t,this.modes=[ei.bounce,ei.split]}update(t,e,i,s){if(!this.modes.includes(s))return;const o=this.container;let n=!1;for(const[,s]of o.plugins)if(void 0!==s.particleBounce&&(n=s.particleBounce(t,i,e)),n)break;if(n)return;const a=t.getPosition(),r=t.offset,c=t.getRadius(),l=Pt(a,c),h=o.canvas.size;!function(t){if(t.outMode!==ei.bounce&&t.outMode!==ei.split||t.direction!==lt.left&&t.direction!==lt.right)return;t.bounds.right<0&&t.direction===lt.left?t.particle.position.x=t.size+t.offset.x:t.bounds.left>t.canvasSize.width&&t.direction===lt.right&&(t.particle.position.x=t.canvasSize.width-t.size-t.offset.x);const e=t.particle.velocity.x;let i=!1;if(t.direction===lt.right&&t.bounds.right>=t.canvasSize.width&&e>0||t.direction===lt.left&&t.bounds.left<=0&&e<0){const e=$(t.particle.options.bounce.horizontal.value);t.particle.velocity.x*=-e,i=!0}if(!i)return;const s=t.offset.x+t.size;t.bounds.right>=t.canvasSize.width&&t.direction===lt.right?t.particle.position.x=t.canvasSize.width-s:t.bounds.left<=0&&t.direction===lt.left&&(t.particle.position.x=s),t.outMode===ei.split&&t.particle.destroy()}({particle:t,outMode:s,direction:e,bounds:l,canvasSize:h,offset:r,size:c}),function(t){if(t.outMode!==ei.bounce&&t.outMode!==ei.split||t.direction!==lt.bottom&&t.direction!==lt.top)return;t.bounds.bottom<0&&t.direction===lt.top?t.particle.position.y=t.size+t.offset.y:t.bounds.top>t.canvasSize.height&&t.direction===lt.bottom&&(t.particle.position.y=t.canvasSize.height-t.size-t.offset.y);const e=t.particle.velocity.y;let i=!1;if(t.direction===lt.bottom&&t.bounds.bottom>=t.canvasSize.height&&e>0||t.direction===lt.top&&t.bounds.top<=0&&e<0){const e=$(t.particle.options.bounce.vertical.value);t.particle.velocity.y*=-e,i=!0}if(!i)return;const s=t.offset.y+t.size;t.bounds.bottom>=t.canvasSize.height&&t.direction===lt.bottom?t.particle.position.y=t.canvasSize.height-s:t.bounds.top<=0&&t.direction===lt.top&&(t.particle.position.y=s),t.outMode===ei.split&&t.particle.destroy()}({particle:t,outMode:s,direction:e,bounds:l,canvasSize:h,offset:r,size:c})}}class Bs{constructor(t){this.container=t,this.modes=[ei.destroy]}update(t,e,i,s){if(!this.modes.includes(s))return;const o=this.container;switch(t.outType){case oi.normal:case oi.outside:if(zt(t.position,o.canvas.size,S.origin,t.getRadius(),e))return;break;case oi.inside:{const{dx:e,dy:i}=N(t.position,t.moveCenter),{x:s,y:o}=t.velocity;if(s<0&&e>t.moveCenter.radius||o<0&&i>t.moveCenter.radius||s>=0&&e<-t.moveCenter.radius||o>=0&&i<-t.moveCenter.radius)return;break}}o.particles.remove(t,void 0,!0)}}class Fs{constructor(t){this.container=t,this.modes=[ei.none]}update(t,e,i,s){if(!this.modes.includes(s))return;if((t.options.move.distance.horizontal&&(e===lt.left||e===lt.right))??(t.options.move.distance.vertical&&(e===lt.top||e===lt.bottom)))return;const o=t.options.move.gravity,n=this.container,a=n.canvas.size,r=t.getRadius();if(o.enable){const i=t.position;(!o.inverse&&i.y>a.height+r&&e===lt.bottom||o.inverse&&i.y<-r&&e===lt.top)&&n.particles.remove(t)}else{if(t.velocity.y>0&&t.position.y<=a.height+r||t.velocity.y<0&&t.position.y>=-r||t.velocity.x>0&&t.position.x<=a.width+r||t.velocity.x<0&&t.position.x>=-r)return;zt(t.position,n.canvas.size,S.origin,r,e)||n.particles.remove(t)}}}class qs{constructor(t){this.container=t,this.modes=[ei.out]}update(t,e,i,s){if(!this.modes.includes(s))return;const o=this.container;switch(t.outType){case oi.inside:{const{x:e,y:i}=t.velocity,s=S.origin;s.length=t.moveCenter.radius,s.angle=t.velocity.angle+Math.PI,s.addTo(S.create(t.moveCenter));const{dx:n,dy:a}=N(t.position,s);if(e<=0&&n>=0||i<=0&&a>=0||e>=0&&n<=0||i>=0&&a<=0)return;t.position.x=Math.floor(V({min:0,max:o.canvas.size.width})),t.position.y=Math.floor(V({min:0,max:o.canvas.size.height}));const{dx:r,dy:c}=N(t.position,t.moveCenter);t.direction=Math.atan2(-c,-r),t.velocity.angle=t.direction;break}default:if(zt(t.position,o.canvas.size,S.origin,t.getRadius(),e))return;switch(t.outType){case oi.outside:{t.position.x=Math.floor(V({min:-t.moveCenter.radius,max:t.moveCenter.radius}))+t.moveCenter.x,t.position.y=Math.floor(V({min:-t.moveCenter.radius,max:t.moveCenter.radius}))+t.moveCenter.y;const{dx:e,dy:i}=N(t.position,t.moveCenter);t.moveCenter.radius&&(t.direction=Math.atan2(i,e),t.velocity.angle=t.direction);break}case oi.normal:{const i=t.options.move.warp,s=o.canvas.size,n={bottom:s.height+t.getRadius()+t.offset.y,left:-t.getRadius()-t.offset.x,right:s.width+t.getRadius()+t.offset.x,top:-t.getRadius()-t.offset.y},a=t.getRadius(),r=Pt(t.position,a);e===lt.right&&r.left>s.width+t.offset.x?(t.position.x=n.left,t.initialPosition.x=t.position.x,i||(t.position.y=B()*s.height,t.initialPosition.y=t.position.y)):e===lt.left&&r.right<-t.offset.x&&(t.position.x=n.right,t.initialPosition.x=t.position.x,i||(t.position.y=B()*s.height,t.initialPosition.y=t.position.y)),e===lt.bottom&&r.top>s.height+t.offset.y?(i||(t.position.x=B()*s.width,t.initialPosition.x=t.position.x),t.position.y=n.top,t.initialPosition.y=t.position.y):e===lt.top&&r.bottom<-t.offset.y&&(i||(t.position.x=B()*s.width,t.initialPosition.x=t.position.x),t.position.y=n.bottom,t.initialPosition.y=t.position.y);break}}}}}const Hs=(t,e)=>t.default===e||t.bottom===e||t.left===e||t.right===e||t.top===e;class Us{constructor(t){this._updateOutMode=(t,e,i,s)=>{for(const o of this.updaters)o.update(t,s,e,i)},this.container=t,this.updaters=[]}init(t){this.updaters=[];const e=t.options.move.outModes;Hs(e,ei.bounce)?this.updaters.push(new As(this.container)):Hs(e,ei.out)?this.updaters.push(new qs(this.container)):Hs(e,ei.destroy)?this.updaters.push(new Bs(this.container)):Hs(e,ei.none)&&this.updaters.push(new Fs(this.container))}isEnabled(t){return!t.destroyed&&!t.spawning}update(t,e){const i=t.options.move.outModes;this._updateOutMode(t,e,i.bottom??i.default,lt.bottom),this._updateOutMode(t,e,i.left??i.default,lt.left),this._updateOutMode(t,e,i.right??i.default,lt.right),this._updateOutMode(t,e,i.top??i.default,lt.top)}}class Ws{init(t){const e=t.container,i=t.options.size.animation;i.enable&&(t.size.velocity=(t.retina.sizeAnimationSpeed??e.retina.sizeAnimationSpeed)/v*e.retina.reduceFactor,i.sync||(t.size.velocity*=B()))}isEnabled(t){return!t.destroyed&&!t.spawning&&t.size.enable&&((t.size.maxLoops??0)<=0||(t.size.maxLoops??0)>0&&(t.size.loops??0)<(t.size.maxLoops??0))}reset(t){t.size.loops=0}update(t,e){this.isEnabled(t)&&Vt(t,t.size,!0,t.options.size.animation.destroy,e)}}async function Vs(t,e=!0){await async function(t,e=!0){await t.addMover("base",(()=>Promise.resolve(new Ss)),e)}(t,!1),await async function(t,e=!0){await t.addShape(new Es,e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("color",(t=>Promise.resolve(new Is(t))),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("opacity",(t=>Promise.resolve(new Ls(t))),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("outModes",(t=>Promise.resolve(new Us(t))),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("size",(()=>Promise.resolve(new Ws)),e)}(t,!1),await t.refresh(e)}const $s='"Twemoji Mozilla", Apple Color Emoji, "Segoe UI Emoji", "Noto Color Emoji", "EmojiOne Color"';class js{constructor(){this.validTypes=["emoji"],this._emojiShapeDict=new Map}destroy(){for(const[t,e]of this._emojiShapeDict)e instanceof ImageBitmap&&(e?.close(),this._emojiShapeDict.delete(t))}draw(t){!function(t){const{context:e,particle:i,radius:s,opacity:o}=t,n=i.emojiData,a=2*s,r=e.globalAlpha;n&&(e.globalAlpha=o,e.drawImage(n,-s,-s,a,a),e.globalAlpha=r)}(t)}async init(t){const e=t.actualOptions,{validTypes:i}=this;if(!i.find((t=>xt(t,e.particles.shape.type))))return;const s=[_t($s)],o=i.map((t=>e.particles.shape.options[t])).find((t=>!!t));o&&At(o,(t=>{t.font&&s.push(_t(t.font))})),await Promise.all(s)}particleDestroy(t){delete t.emojiData}particleInit(t,e){const i=e.shapeData;if(!i?.value)return;const s=Bt(i.value,e.randomIndexData),o=i.font??$s;if(!s)return;const n=`${s}_${o}`,a=this._emojiShapeDict.get(n);if(a)return void(e.emojiData=a);const r=2*G(e.size.value);let c;const l=G(e.size.value);if("undefined"!=typeof OffscreenCanvas){const t=new OffscreenCanvas(r,r),e=t.getContext("2d");if(!e)return;e.font=`400 ${2*l}px ${o}`,e.textBaseline="middle",e.textAlign="center",e.fillText(s,l,l),c=t.transferToImageBitmap()}else{const t=document.createElement("canvas");t.width=r,t.height=r;const e=t.getContext("2d");if(!e)return;e.font=`400 ${2*l}px ${o}`,e.textBaseline="middle",e.textAlign="center",e.fillText(s,l,l),c=t}this._emojiShapeDict.set(n,c),e.emojiData=c}}const Gs=1,Qs=1;function Ns(t,e,i,s,o){const n=t.actualOptions.interactivity.modes.attract;if(!n)return;const a=t.particles.quadTree.query(s,o);for(const t of a){const{dx:s,dy:o,distance:a}=N(t.position,e),r=n.speed*n.factor,c=U(L(n.easing)(Qs-a/i)*r,Gs,n.maxSpeed),l=S.create(a?s/a*c:r,a?o/a*c:r);t.position.subFrom(l)}}class Xs{constructor(){this.distance=200,this.duration=.4,this.easing=xs.easeOutQuad,this.factor=1,this.maxSpeed=50,this.speed=1}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),void 0!==t.duration&&(this.duration=t.duration),void 0!==t.easing&&(this.easing=t.easing),void 0!==t.factor&&(this.factor=t.factor),void 0!==t.maxSpeed&&(this.maxSpeed=t.maxSpeed),void 0!==t.speed&&(this.speed=t.speed))}}const Ys="attract";class Zs extends Ms{constructor(t,e){super(e),this._engine=t,e.attract||(e.attract={particles:[]}),this.handleClickMode=t=>{const i=this.container.actualOptions.interactivity.modes.attract;if(i&&t===Ys){e.attract||(e.attract={particles:[]}),e.attract.clicking=!0,e.attract.count=0;for(const t of e.attract.particles)this.isEnabled(t)&&t.velocity.setTo(t.initialVelocity);e.attract.particles=[],e.attract.finish=!1,setTimeout((()=>{e.destroyed||(e.attract||(e.attract={particles:[]}),e.attract.clicking=!1)}),i.duration*g)}}}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.attract;e&&(t.retina.attractModeDistance=e.distance*t.retina.pixelRatio)}interact(){const t=this.container,e=t.actualOptions,i=t.interactivity.status===r,s=e.interactivity.events,{enable:o,mode:n}=s.onHover,{enable:a,mode:c}=s.onClick;i&&o&&xt(Ys,n)?function(t,e){const i=t.interactivity.mouse.position,s=t.retina.attractModeDistance;!s||s<0||!i||Ns(t,i,s,new es(i.x,i.y,s),(t=>e(t)))}(this.container,(t=>this.isEnabled(t))):a&&xt(Ys,c)&&function(t,e){t.attract||(t.attract={particles:[]});const{attract:i}=t;if(i.finish||(i.count||(i.count=0),i.count++,i.count===t.particles.count&&(i.finish=!0)),i.clicking){const i=t.interactivity.mouse.clickPosition,s=t.retina.attractModeDistance;if(!s||s<0||!i)return;Ns(t,i,s,new es(i.x,i.y,s),(t=>e(t)))}else!1===i.clicking&&(i.particles=[])}(this.container,(t=>this.isEnabled(t)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events;if(!(s.position&&o.onHover.enable||s.clickPosition&&o.onClick.enable))return!1;const n=o.onHover.mode,a=o.onClick.mode;return xt(Ys,n)||xt(Ys,a)}loadModeOptions(t,...e){t.attract||(t.attract=new Xs);for(const i of e)t.attract.load(i?.attract)}reset(){}}const Js=2,Ks=.5,to=Math.PI*Ks,eo=2,io=10;function so(t,e,i,s,o){const n=t.particles.quadTree.query(s,o);for(const t of n)s instanceof es?It(Et(t),{position:e,radius:i,mass:i**Js*to,velocity:S.origin,factor:S.origin}):s instanceof is&&Lt(t,Pt(e,i))}function oo(t,e,i,s){Tt(i,e,((e,i)=>function(t,e,i,s){const o=document.querySelectorAll(e);o.length&&o.forEach((e=>{const o=e,n=t.retina.pixelRatio,a={x:(o.offsetLeft+o.offsetWidth*Ks)*n,y:(o.offsetTop+o.offsetHeight*Ks)*n},r=o.offsetWidth*Ks*n,c=io*n,l=i.type===Be.circle?new es(a.x,a.y,r+c):new is(o.offsetLeft*n-c,o.offsetTop*n-c,o.offsetWidth*n+c*eo,o.offsetHeight*n+c*eo);s(a,r,l)}))}(t,e,i,((e,i,o)=>so(t,e,i,o,s)))))}class no{constructor(){this.distance=200}load(t){t&&void 0!==t.distance&&(this.distance=t.distance)}}const ao="bounce";class ro extends Ms{constructor(t){super(t)}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.bounce;e&&(t.retina.bounceModeDistance=e.distance*t.retina.pixelRatio)}interact(){const t=this.container,e=t.actualOptions.interactivity.events,i=t.interactivity.status===r,s=e.onHover.enable,o=e.onHover.mode,n=e.onDiv;i&&s&&xt(ao,o)?function(t,e){const i=t.retina.pixelRatio,s=io*i,o=t.interactivity.mouse.position,n=t.retina.bounceModeDistance;!n||n<0||!o||so(t,o,n,new es(o.x,o.y,n+s),e)}(this.container,(t=>this.isEnabled(t))):oo(this.container,n,ao,(t=>this.isEnabled(t)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events,n=o.onDiv;return!!s.position&&o.onHover.enable&&xt(ao,o.onHover.mode)||St(ao,n)}loadModeOptions(t,...e){t.bounce||(t.bounce=new no);for(const i of e)t.bounce.load(i?.bounce)}reset(){}}class co{constructor(){this.distance=200,this.duration=.4,this.mix=!1}load(t){if(t){if(void 0!==t.distance&&(this.distance=t.distance),void 0!==t.duration&&(this.duration=t.duration),void 0!==t.mix&&(this.mix=t.mix),void 0!==t.opacity&&(this.opacity=t.opacity),void 0!==t.color){const e=M(this.color)?void 0:this.color;this.color=At(t.color,(t=>Fe.create(e,t)))}void 0!==t.size&&(this.size=t.size)}}}class lo extends co{constructor(){super(),this.selectors=[]}load(t){super.load(t),t&&void 0!==t.selectors&&(this.selectors=t.selectors)}}class ho extends co{load(t){super.load(t),t&&(this.divs=At(t.divs,(t=>{const e=new lo;return e.load(t),e})))}}var uo;function po(t,e,i,s){if(e>=i){return U(t+(e-i)*s,t,e)}if(e<i){return U(t-(i-e)*s,e,t)}}!function(t){t.color="color",t.opacity="opacity",t.size="size"}(uo||(uo={}));const fo="bubble";class vo extends Ms{constructor(t){super(t),this._clickBubble=()=>{const t=this.container,e=t.actualOptions,i=t.interactivity.mouse.clickPosition,s=e.interactivity.modes.bubble;if(!s||!i)return;t.bubble||(t.bubble={});const o=t.retina.bubbleModeDistance;if(!o||o<0)return;const n=t.particles.quadTree.queryCircle(i,o,(t=>this.isEnabled(t))),{bubble:a}=t;for(const e of n){if(!a.clicking)continue;e.bubble.inRange=!a.durationEnd;const n=X(e.getPosition(),i),r=((new Date).getTime()-(t.interactivity.mouse.clickTime??0))/g;r>s.duration&&(a.durationEnd=!0),r>2*s.duration&&(a.clicking=!1,a.durationEnd=!1);const c={bubbleObj:{optValue:t.retina.bubbleModeSize,value:e.bubble.radius},particlesObj:{optValue:G(e.options.size.value)*t.retina.pixelRatio,value:e.size.value},type:uo.size};this._process(e,n,r,c);const l={bubbleObj:{optValue:s.opacity,value:e.bubble.opacity},particlesObj:{optValue:G(e.options.opacity.value),value:e.opacity?.value??1},type:uo.opacity};this._process(e,n,r,l),!a.durationEnd&&n<=o?this._hoverBubbleColor(e,n):delete e.bubble.color}},this._hoverBubble=()=>{const t=this.container,e=t.interactivity.mouse.position,i=t.retina.bubbleModeDistance;if(!i||i<0||!e)return;const s=t.particles.quadTree.queryCircle(e,i,(t=>this.isEnabled(t)));for(const o of s){o.bubble.inRange=!0;const s=X(o.getPosition(),e),a=1-s/i;s<=i?a>=0&&t.interactivity.status===r&&(this._hoverBubbleSize(o,a),this._hoverBubbleOpacity(o,a),this._hoverBubbleColor(o,a)):this.reset(o),t.interactivity.status===n&&this.reset(o)}},this._hoverBubbleColor=(t,e,i)=>{const s=this.container.actualOptions,o=i??s.interactivity.modes.bubble;if(o){if(!t.bubble.finalColor){const e=o.color;if(!e)return;const i=Bt(e);t.bubble.finalColor=te(i)}if(t.bubble.finalColor)if(o.mix){t.bubble.color=void 0;const i=t.getFillColor();t.bubble.color=i?ee(le(i,t.bubble.finalColor,1-e,e)):t.bubble.finalColor}else t.bubble.color=t.bubble.finalColor}},this._hoverBubbleOpacity=(t,e,i)=>{const s=this.container.actualOptions,o=i?.opacity??s.interactivity.modes.bubble?.opacity;if(!o)return;const n=t.options.opacity.value,a=po(t.opacity?.value??1,o,G(n),e);void 0!==a&&(t.bubble.opacity=a)},this._hoverBubbleSize=(t,e,i)=>{const s=this.container,o=i?.size?i.size*s.retina.pixelRatio:s.retina.bubbleModeSize;if(void 0===o)return;const n=G(t.options.size.value)*s.retina.pixelRatio,a=po(t.size.value,o,n,e);void 0!==a&&(t.bubble.radius=a)},this._process=(t,e,i,s)=>{const o=this.container,n=s.bubbleObj.optValue,a=o.actualOptions.interactivity.modes.bubble;if(!a||void 0===n)return;const r=a.duration,c=o.retina.bubbleModeDistance,l=s.particlesObj.optValue,h=s.bubbleObj.value,d=s.particlesObj.value??0,u=s.type;if(c&&!(c<0)&&n!==l)if(o.bubble||(o.bubble={}),o.bubble.durationEnd)h&&(u===uo.size&&delete t.bubble.radius,u===uo.opacity&&delete t.bubble.opacity);else if(e<=c){if((h??d)!==n){const e=d-i*(d-n)/r;u===uo.size&&(t.bubble.radius=e),u===uo.opacity&&(t.bubble.opacity=e)}}else u===uo.size&&delete t.bubble.radius,u===uo.opacity&&delete t.bubble.opacity},this._singleSelectorHover=(t,e,i)=>{const s=this.container,o=document.querySelectorAll(e),n=s.actualOptions.interactivity.modes.bubble;n&&o.length&&o.forEach((e=>{const o=e,a=s.retina.pixelRatio,r={x:(o.offsetLeft+.5*o.offsetWidth)*a,y:(o.offsetTop+.5*o.offsetHeight)*a},c=.5*o.offsetWidth*a,l=i.type===Be.circle?new es(r.x,r.y,c):new is(o.offsetLeft*a,o.offsetTop*a,o.offsetWidth*a,o.offsetHeight*a),h=s.particles.quadTree.query(l,(t=>this.isEnabled(t)));for(const e of h){if(!l.contains(e.getPosition()))continue;e.bubble.inRange=!0;const i=Dt(n.divs,o);e.bubble.div&&e.bubble.div===o||(this.clear(e,t,!0),e.bubble.div=o),this._hoverBubbleSize(e,1,i),this._hoverBubbleOpacity(e,1,i),this._hoverBubbleColor(e,1,i)}}))},t.bubble||(t.bubble={}),this.handleClickMode=e=>{e===fo&&(t.bubble||(t.bubble={}),t.bubble.clicking=!0)}}clear(t,e,i){t.bubble.inRange&&!i||(delete t.bubble.div,delete t.bubble.opacity,delete t.bubble.radius,delete t.bubble.color)}init(){const t=this.container,e=t.actualOptions.interactivity.modes.bubble;e&&(t.retina.bubbleModeDistance=e.distance*t.retina.pixelRatio,void 0!==e.size&&(t.retina.bubbleModeSize=e.size*t.retina.pixelRatio))}interact(t){const e=this.container.actualOptions.interactivity.events,i=e.onHover,s=e.onClick,o=i.enable,n=i.mode,a=s.enable,r=s.mode,c=e.onDiv;o&&xt(fo,n)?this._hoverBubble():a&&xt(fo,r)?this._clickBubble():Tt(fo,c,((e,i)=>this._singleSelectorHover(t,e,i)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events,{onClick:n,onDiv:a,onHover:r}=o,c=St(fo,a);return!!(c||r.enable&&s.position||n.enable&&s.clickPosition)&&(xt(fo,r.mode)||xt(fo,n.mode)||c)}loadModeOptions(t,...e){t.bubble||(t.bubble=new ho);for(const i of e)t.bubble.load(i?.bubble)}reset(t){t.bubble.inRange=!1}}class mo{constructor(){this.opacity=.5}load(t){t&&void 0!==t.opacity&&(this.opacity=t.opacity)}}class go{constructor(){this.distance=80,this.links=new mo,this.radius=60}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),this.links.load(t.links),void 0!==t.radius&&(this.radius=t.radius))}}const yo=0,bo=1;function wo(t,e,i,s){const o=t.actualOptions.interactivity.modes.connect;if(o)return function(t,e,i,s){const o=Math.floor(i.getRadius()/e.getRadius()),n=e.getFillColor(),a=i.getFillColor();if(!n||!a)return;const r=e.getPosition(),c=i.getPosition(),l=le(n,a,e.getRadius(),i.getRadius()),h=t.createLinearGradient(r.x,r.y,c.x,c.y);return h.addColorStop(yo,ce(n,s)),h.addColorStop(U(o,yo,bo),re(l,s)),h.addColorStop(bo,ce(a,s)),h}(e,i,s,o.links.opacity)}function xo(t,e,i){t.canvas.draw((s=>{const o=wo(t,s,e,i);if(!o)return;const n=e.getPosition(),a=i.getPosition();!function(t,e,i,s,o){be(t,s,o),t.lineWidth=e,t.strokeStyle=i,t.stroke()}(s,e.retina.linksWidth??0,o,n,a)}))}class _o extends Ms{constructor(t){super(t)}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.connect;e&&(t.retina.connectModeDistance=e.distance*t.retina.pixelRatio,t.retina.connectModeRadius=e.radius*t.retina.pixelRatio)}interact(){const t=this.container;if(t.actualOptions.interactivity.events.onHover.enable&&"pointermove"===t.interactivity.status){const e=t.interactivity.mouse.position,{connectModeDistance:i,connectModeRadius:s}=t.retina;if(!i||i<0||!s||s<0||!e)return;const o=Math.abs(s),n=t.particles.quadTree.queryCircle(e,o,(t=>this.isEnabled(t)));n.forEach(((e,s)=>{const o=e.getPosition();for(const a of n.slice(s+1)){const s=a.getPosition(),n=Math.abs(i),r=Math.abs(o.x-s.x),c=Math.abs(o.y-s.y);r<n&&c<n&&xo(t,e,a)}}))}}isEnabled(t){const e=this.container,i=e.interactivity.mouse,s=(t?.interactivity??e.actualOptions.interactivity).events;return!(!s.onHover.enable||!i.position)&&xt("connect",s.onHover.mode)}loadModeOptions(t,...e){t.connect||(t.connect=new go);for(const i of e)t.connect.load(i?.connect)}reset(){}}class ko{constructor(){this.blink=!1,this.consent=!1,this.opacity=1}load(t){t&&(void 0!==t.blink&&(this.blink=t.blink),void 0!==t.color&&(this.color=Fe.create(this.color,t.color)),void 0!==t.consent&&(this.consent=t.consent),void 0!==t.opacity&&(this.opacity=t.opacity))}}class Mo{constructor(){this.distance=100,this.links=new ko}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),this.links.load(t.links))}}function zo(t,e,i,s,o){t.canvas.draw((t=>{const n=e.getPosition();!function(t,e,i,s,o,n){be(t,i,s),t.strokeStyle=re(o,n),t.lineWidth=e,t.stroke()}(t,e.retina.linksWidth??0,n,o,i,s)}))}class Co extends Ms{constructor(t){super(t)}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.grab;e&&(t.retina.grabModeDistance=e.distance*t.retina.pixelRatio)}interact(){const t=this.container,e=t.actualOptions.interactivity;if(!e.modes.grab||!e.events.onHover.enable||t.interactivity.status!==r)return;const i=t.interactivity.mouse.position;if(!i)return;const s=t.retina.grabModeDistance;if(!s||s<0)return;const o=t.particles.quadTree.queryCircle(i,s,(t=>this.isEnabled(t)));for(const n of o){const o=X(n.getPosition(),i);if(o>s)continue;const a=e.modes.grab.links,r=a.opacity,c=r-o*r/s;if(c<=0)continue;const l=a.color??n.options.links?.color;if(!t.particles.grabLineColor&&l){const i=e.modes.grab.links;t.particles.grabLineColor=de(l,i.blink,i.consent)}const h=he(n,void 0,t.particles.grabLineColor);h&&zo(t,n,h,c,i)}}isEnabled(t){const e=this.container,i=e.interactivity.mouse,s=(t?.interactivity??e.actualOptions.interactivity).events;return s.onHover.enable&&!!i.position&&xt("grab",s.onHover.mode)}loadModeOptions(t,...e){t.grab||(t.grab=new Mo);for(const i of e)t.grab.load(i?.grab)}reset(){}}class Po extends Ms{constructor(t){super(t),this.handleClickMode=t=>{if("pause"!==t)return;const e=this.container;e.animationStatus?e.pause():e.play()}}clear(){}init(){}interact(){}isEnabled(){return!0}reset(){}}class Oo{constructor(){this.default=!0,this.groups=[],this.quantity=4}load(t){if(!t)return;void 0!==t.default&&(this.default=t.default),void 0!==t.groups&&(this.groups=t.groups.map((t=>t))),this.groups.length||(this.default=!0);const e=t.quantity;void 0!==e&&(this.quantity=Q(e))}}class So extends Ms{constructor(t){super(t),this.handleClickMode=t=>{if("push"!==t)return;const e=this.container,i=e.actualOptions.interactivity.modes.push;if(!i)return;const s=$(i.quantity);if(s<=0)return;const o=Mt([void 0,...i.groups]),n=void 0!==o?e.actualOptions.particles.groups[o]:void 0;e.particles.push(s,e.interactivity.mouse,n,o)}}clear(){}init(){}interact(){}isEnabled(){return!0}loadModeOptions(t,...e){t.push||(t.push=new Oo);for(const i of e)t.push.load(i?.push)}reset(){}}class To{constructor(){this.quantity=2}load(t){if(!t)return;const e=t.quantity;void 0!==e&&(this.quantity=Q(e))}}class Ro extends Ms{constructor(t){super(t),this.handleClickMode=t=>{const e=this.container,i=e.actualOptions;if(!i.interactivity.modes.remove||"remove"!==t)return;const s=$(i.interactivity.modes.remove.quantity);e.particles.removeQuantity(s)}}clear(){}init(){}interact(){}isEnabled(){return!0}loadModeOptions(t,...e){t.remove||(t.remove=new To);for(const i of e)t.remove.load(i?.remove)}reset(){}}class Do{constructor(){this.distance=200,this.duration=.4,this.factor=100,this.speed=1,this.maxSpeed=50,this.easing=xs.easeOutQuad}load(t){t&&(void 0!==t.distance&&(this.distance=t.distance),void 0!==t.duration&&(this.duration=t.duration),void 0!==t.easing&&(this.easing=t.easing),void 0!==t.factor&&(this.factor=t.factor),void 0!==t.speed&&(this.speed=t.speed),void 0!==t.maxSpeed&&(this.maxSpeed=t.maxSpeed))}}class Eo extends Do{constructor(){super(),this.selectors=[]}load(t){super.load(t),t&&void 0!==t.selectors&&(this.selectors=t.selectors)}}class Io extends Do{load(t){super.load(t),t&&(this.divs=At(t.divs,(t=>{const e=new Eo;return e.load(t),e})))}}const Lo="repulse";class Ao extends Ms{constructor(t,e){super(e),this._clickRepulse=()=>{const t=this.container,e=t.actualOptions.interactivity.modes.repulse;if(!e)return;const i=t.repulse??{particles:[]};if(i.finish||(i.count||(i.count=0),i.count++,i.count===t.particles.count&&(i.finish=!0)),i.clicking){const s=t.retina.repulseModeDistance;if(!s||s<0)return;const o=Math.pow(s/6,3),n=t.interactivity.mouse.clickPosition;if(void 0===n)return;const a=new es(n.x,n.y,o),r=t.particles.quadTree.query(a,(t=>this.isEnabled(t)));for(const t of r){const{dx:s,dy:a,distance:r}=N(n,t.position),c=r**2,l=-o*e.speed/c;if(c<=o){i.particles.push(t);const e=S.create(s,a);e.length=l,t.velocity.setTo(e)}}}else if(!1===i.clicking){for(const t of i.particles)t.velocity.setTo(t.initialVelocity);i.particles=[]}},this._hoverRepulse=()=>{const t=this.container,e=t.interactivity.mouse.position,i=t.retina.repulseModeDistance;!i||i<0||!e||this._processRepulse(e,i,new es(e.x,e.y,i))},this._processRepulse=(t,e,i,s)=>{const o=this.container,n=o.particles.quadTree.query(i,(t=>this.isEnabled(t))),a=o.actualOptions.interactivity.modes.repulse;if(!a)return;const{easing:r,speed:c,factor:l,maxSpeed:h}=a,d=L(r),u=(s?.speed??c)*l;for(const i of n){const{dx:s,dy:o,distance:n}=N(i.position,t),a=U(d(1-n/e)*u,0,h),r=S.create(n?s/n*a:u,n?o/n*a:u);i.position.addTo(r)}},this._singleSelectorRepulse=(t,e)=>{const i=this.container,s=i.actualOptions.interactivity.modes.repulse;if(!s)return;const o=document.querySelectorAll(t);o.length&&o.forEach((t=>{const o=t,n=i.retina.pixelRatio,a={x:(o.offsetLeft+.5*o.offsetWidth)*n,y:(o.offsetTop+.5*o.offsetHeight)*n},r=.5*o.offsetWidth*n,c=e.type===Be.circle?new es(a.x,a.y,r):new is(o.offsetLeft*n,o.offsetTop*n,o.offsetWidth*n,o.offsetHeight*n),l=Dt(s.divs,o);this._processRepulse(a,r,c,l)}))},this._engine=t,e.repulse||(e.repulse={particles:[]}),this.handleClickMode=t=>{const i=this.container.actualOptions.interactivity.modes.repulse;if(!i||t!==Lo)return;e.repulse||(e.repulse={particles:[]});const s=e.repulse;s.clicking=!0,s.count=0;for(const t of e.repulse.particles)this.isEnabled(t)&&t.velocity.setTo(t.initialVelocity);s.particles=[],s.finish=!1,setTimeout((()=>{e.destroyed||(s.clicking=!1)}),i.duration*g)}}clear(){}init(){const t=this.container,e=t.actualOptions.interactivity.modes.repulse;e&&(t.retina.repulseModeDistance=e.distance*t.retina.pixelRatio)}interact(){const t=this.container,e=t.actualOptions,i=t.interactivity.status===r,s=e.interactivity.events,o=s.onHover,n=o.enable,a=o.mode,c=s.onClick,l=c.enable,h=c.mode,d=s.onDiv;i&&n&&xt(Lo,a)?this._hoverRepulse():l&&xt(Lo,h)?this._clickRepulse():Tt(Lo,d,((t,e)=>this._singleSelectorRepulse(t,e)))}isEnabled(t){const e=this.container,i=e.actualOptions,s=e.interactivity.mouse,o=(t?.interactivity??i.interactivity).events,n=o.onDiv,a=o.onHover,r=o.onClick,c=St(Lo,n);if(!(c||a.enable&&s.position||r.enable&&s.clickPosition))return!1;const l=a.mode,h=r.mode;return xt(Lo,l)||xt(Lo,h)||c}loadModeOptions(t,...e){t.repulse||(t.repulse=new Io);for(const i of e)t.repulse.load(i?.repulse)}reset(){}}class Bo{constructor(){this.factor=3,this.radius=200}load(t){t&&(void 0!==t.factor&&(this.factor=t.factor),void 0!==t.radius&&(this.radius=t.radius))}}class Fo extends Ms{constructor(t){super(t)}clear(t,e,i){t.slow.inRange&&!i||(t.slow.factor=1)}init(){const t=this.container,e=t.actualOptions.interactivity.modes.slow;e&&(t.retina.slowModeRadius=e.radius*t.retina.pixelRatio)}interact(){}isEnabled(t){const e=this.container,i=e.interactivity.mouse,s=(t?.interactivity??e.actualOptions.interactivity).events;return s.onHover.enable&&!!i.position&&xt("slow",s.onHover.mode)}loadModeOptions(t,...e){t.slow||(t.slow=new Bo);for(const i of e)t.slow.load(i?.slow)}reset(t){t.slow.inRange=!1;const e=this.container,i=e.actualOptions,s=e.interactivity.mouse.position,o=e.retina.slowModeRadius,n=i.interactivity.modes.slow;if(!n||!o||o<0||!s)return;const a=X(s,t.getPosition()),r=a/o,c=n.factor,{slow:l}=t;a>o||(l.inRange=!0,l.factor=r/c)}}const qo=0,Ho=/(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\))|currentcolor/gi;async function Uo(t){return new Promise((e=>{t.loading=!0;const i=new Image;t.element=i,i.addEventListener("load",(()=>{t.loading=!1,e()})),i.addEventListener("error",(()=>{t.element=void 0,t.error=!0,t.loading=!1,ft().error(`${f} loading image: ${t.source}`),e()})),i.src=t.source}))}async function Wo(t){if("svg"!==t.type)return void await Uo(t);t.loading=!0;const e=await fetch(t.source);e.ok?t.svgData=await e.text():(ft().error(`${f} Image not found`),t.error=!0),t.loading=!1}function Vo(t,e,i,s){const o=function(t,e,i){const{svgData:s}=t;if(!s)return"";const o=ce(e,i);if(s.includes("fill"))return s.replace(Ho,(()=>o));const n=s.indexOf(">");return`${s.substring(qo,n)} fill="${o}"${s.substring(n)}`}(t,i,s.opacity?.value??1),n={color:i,gif:e.gif,data:{...t,svgData:o},loaded:!1,ratio:e.width/e.height,replaceColor:e.replaceColor,source:e.src};return new Promise((e=>{const i=new Blob([o],{type:"image/svg+xml"}),s=URL||window.URL||window.webkitURL||window,a=s.createObjectURL(i),r=new Image;r.addEventListener("load",(()=>{n.loaded=!0,n.element=r,e(n),s.revokeObjectURL(a)}));r.addEventListener("error",(()=>{(async()=>{s.revokeObjectURL(a);const i={...t,error:!1,loading:!0};await Uo(i),n.loaded=!0,n.element=i.element,e(n)})()})),r.src=a}))}const $o=[0,4,2,1],jo=[8,8,4,2];class Go{constructor(t){this.pos=0,this.data=new Uint8ClampedArray(t)}getString(t){const e=this.data.slice(this.pos,this.pos+t);return this.pos+=e.length,e.reduce(((t,e)=>t+String.fromCharCode(e)),"")}nextByte(){return this.data[this.pos++]}nextTwoBytes(){return this.pos+=2,this.data[this.pos-2]+(this.data[this.pos-1]<<8)}readSubBlocks(){let t="",e=0;do{e=this.data[this.pos++];for(let i=e;--i>=0;t+=String.fromCharCode(this.data[this.pos++]));}while(0!==e);return t}readSubBlocksBin(){let t=this.data[this.pos],e=0;for(let i=0;0!==t;i+=t+1,t=this.data[this.pos+i])e+=t;const i=new Uint8Array(e);t=this.data[this.pos++];for(let e=0;0!==t;t=this.data[this.pos++])for(let s=t;--s>=0;i[e++]=this.data[this.pos++]);return i}skipSubBlocks(){for(const t=1,e=0;this.data[this.pos]!==e;this.pos+=this.data[this.pos]+t);this.pos++}}var Qo,No;!function(t){t[t.Replace=0]="Replace",t[t.Combine=1]="Combine",t[t.RestoreBackground=2]="RestoreBackground",t[t.RestorePrevious=3]="RestorePrevious",t[t.UndefinedA=4]="UndefinedA",t[t.UndefinedB=5]="UndefinedB",t[t.UndefinedC=6]="UndefinedC",t[t.UndefinedD=7]="UndefinedD"}(Qo||(Qo={})),function(t){t[t.Extension=33]="Extension",t[t.ApplicationExtension=255]="ApplicationExtension",t[t.GraphicsControlExtension=249]="GraphicsControlExtension",t[t.PlainTextExtension=1]="PlainTextExtension",t[t.CommentExtension=254]="CommentExtension",t[t.Image=44]="Image",t[t.EndOfFile=59]="EndOfFile"}(No||(No={}));const Xo=0,Yo=0,Zo=0;function Jo(t,e){const i=[];for(let s=0;s<e;s++)i.push({r:t.data[t.pos],g:t.data[t.pos+1],b:t.data[t.pos+2]}),t.pos+=3;return i}async function Ko(t,e,i,s,o,n){switch(t.nextByte()){case No.EndOfFile:return!0;case No.Image:await async function(t,e,i,s,o,n){const a=e.frames[s(!0)];a.left=t.nextTwoBytes(),a.top=t.nextTwoBytes(),a.width=t.nextTwoBytes(),a.height=t.nextTwoBytes();const r=t.nextByte(),c=128==(128&r),l=64==(64&r);a.sortFlag=32==(32&r),a.reserved=(24&r)>>>3;const h=1<<1+(7&r);c&&(a.localColorTable=Jo(t,h));const d=t=>{const{r:s,g:n,b:r}=(c?a.localColorTable:e.globalColorTable)[t];return t!==o(null)?{r:s,g:n,b:r,a:255}:{r:s,g:n,b:r,a:i?~~((s+n+r)/3):0}},u=(()=>{try{return new ImageData(a.width,a.height,{colorSpace:"srgb"})}catch(t){if(t instanceof DOMException&&"IndexSizeError"===t.name)return null;throw t}})();if(null==u)throw new EvalError("GIF frame size is to large");const p=t.nextByte(),f=t.readSubBlocksBin(),v=1<<p,m=(t,e)=>{const i=t>>>3,s=7&t;return(f[i]+(f[i+1]<<8)+(f[i+2]<<16)&(1<<e)-1<<s)>>>s};if(l){for(let i=0,o=p+1,r=0,c=[[0]],l=0;l<4;l++){if($o[l]<a.height){let t=0,e=0,s=!1;for(;!s;){const n=i;if(i=m(r,o),r+=o+1,i===v){o=p+1,c.length=v+2;for(let t=0;t<c.length;t++)c[t]=t<v?[t]:[]}else{i>=c.length?c.push(c[n].concat(c[n][0])):n!==v&&c.push(c[n].concat(c[i][0]));for(const s of c[i]){const{r:i,g:o,b:n,a:r}=d(s);u.data.set([i,o,n,r],$o[l]*a.width+jo[l]*e+t%(4*a.width)),t+=4}c.length===1<<o&&o<12&&o++}t===4*a.width*(e+1)&&(e++,$o[l]+jo[l]*e>=a.height&&(s=!0))}}n?.(t.pos/(t.data.length-1),s(!1)+1,u,{x:a.left,y:a.top},{width:e.width,height:e.height})}a.image=u,a.bitmap=await createImageBitmap(u)}else{let i=0,o=p+1,r=0,c=-4,l=!1;const h=[[0]];for(;!l;){const t=i;if(i=m(r,o),r+=o,i===v){o=p+1,h.length=v+2;for(let t=0;t<h.length;t++)h[t]=t<v?[t]:[]}else{if(i===v+1){l=!0;break}i>=h.length?h.push(h[t].concat(h[t][0])):t!==v&&h.push(h[t].concat(h[i][0]));for(const t of h[i]){const{r:e,g:i,b:s,a:o}=d(t);u.data.set([e,i,s,o],c+=4)}h.length>=1<<o&&o<12&&o++}}a.image=u,a.bitmap=await createImageBitmap(u),n?.((t.pos+1)/t.data.length,s(!1)+1,a.image,{x:a.left,y:a.top},{width:e.width,height:e.height})}}(t,e,i,s,o,n);break;case No.Extension:!function(t,e,i,s){switch(t.nextByte()){case No.GraphicsControlExtension:{const o=e.frames[i(!1)];t.pos++;const n=t.nextByte();o.GCreserved=(224&n)>>>5,o.disposalMethod=(28&n)>>>2,o.userInputDelayFlag=2==(2&n);const a=1==(1&n);o.delayTime=10*t.nextTwoBytes();const r=t.nextByte();a&&s(r),t.pos++;break}case No.ApplicationExtension:{t.pos++;const i={identifier:t.getString(8),authenticationCode:t.getString(3),data:t.readSubBlocksBin()};e.applicationExtensions.push(i);break}case No.CommentExtension:e.comments.push([i(!1),t.readSubBlocks()]);break;case No.PlainTextExtension:if(0===e.globalColorTable.length)throw new EvalError("plain text extension without global color table");t.pos++,e.frames[i(!1)].plainTextData={left:t.nextTwoBytes(),top:t.nextTwoBytes(),width:t.nextTwoBytes(),height:t.nextTwoBytes(),charSize:{width:t.nextTwoBytes(),height:t.nextTwoBytes()},foregroundColor:t.nextByte(),backgroundColor:t.nextByte(),text:t.readSubBlocks()};break;default:t.skipSubBlocks()}}(t,e,s,o);break;default:throw new EvalError("undefined block found")}return!1}async function tn(t){if("gif"===t.type){t.loading=!0;try{t.gifData=await async function(t,e,i){i||(i=!1);const s=await fetch(t);if(!s.ok&&404===s.status)throw new EvalError("file not found");const o=await s.arrayBuffer(),n={width:0,height:0,totalTime:0,colorRes:0,pixelAspectRatio:0,frames:[],sortFlag:!1,globalColorTable:[],backgroundImage:new ImageData(1,1,{colorSpace:"srgb"}),comments:[],applicationExtensions:[]},a=new Go(new Uint8ClampedArray(o));if("GIF89a"!==a.getString(6))throw new Error("not a supported GIF file");n.width=a.nextTwoBytes(),n.height=a.nextTwoBytes();const r=a.nextByte(),c=128==(128&r);n.colorRes=(112&r)>>>4,n.sortFlag=8==(8&r);const l=1<<1+(7&r),h=a.nextByte();n.pixelAspectRatio=a.nextByte(),0!==n.pixelAspectRatio&&(n.pixelAspectRatio=(n.pixelAspectRatio+15)/64),c&&(n.globalColorTable=Jo(a,l));const d=(()=>{try{return new ImageData(n.width,n.height,{colorSpace:"srgb"})}catch(t){if(t instanceof DOMException&&"IndexSizeError"===t.name)return null;throw t}})();if(null==d)throw new Error("GIF frame size is to large");const{r:u,g:p,b:f}=n.globalColorTable[h];d.data.set(c?[u,p,f,255]:[0,0,0,0]);for(let t=4;t<d.data.length;t*=2)d.data.copyWithin(t,0,t);n.backgroundImage=d;let v=-1,m=!0,g=-1;const y=t=>(t&&(m=!0),v),b=t=>(null!=t&&(g=t),g);try{do{m&&(n.frames.push({left:0,top:0,width:0,height:0,disposalMethod:Qo.Replace,image:new ImageData(1,1,{colorSpace:"srgb"}),plainTextData:null,userInputDelayFlag:!1,delayTime:0,sortFlag:!1,localColorTable:[],reserved:0,GCreserved:0}),v++,g=-1,m=!1)}while(!await Ko(a,n,i,y,b,e));n.frames.length--;for(const t of n.frames){if(t.userInputDelayFlag&&0===t.delayTime){n.totalTime=1/0;break}n.totalTime+=t.delayTime}return n}catch(t){if(t instanceof EvalError)throw new Error(`error while parsing frame ${v} "${t.message}"`);throw t}}(t.source),t.gifLoopCount=function(t){for(const e of t.applicationExtensions)if(e.identifier+e.authenticationCode==="NETSCAPE2.0")return e.data[1]+(e.data[2]<<8);return NaN}(t.gifData)??Zo,t.gifLoopCount||(t.gifLoopCount=1/0)}catch{t.error=!0}t.loading=!1}else await Uo(t)}class en{constructor(t){this.validTypes=["image","images"],this.loadImageShape=async t=>{if(!this._engine.loadImage)throw new Error(`${f} image shape not initialized`);await this._engine.loadImage({gif:t.gif,name:t.name,replaceColor:t.replaceColor??!1,src:t.src})},this._engine=t}addImage(t){this._engine.images||(this._engine.images=[]),this._engine.images.push(t)}draw(t){const{context:e,radius:i,particle:s,opacity:o}=t,n=s.image,a=n?.element;if(n){if(e.globalAlpha=o,n.gif&&n.gifData)!function(t){const{context:e,radius:i,particle:s,delta:o}=t,n=s.image;if(!n?.gifData||!n.gif)return;const a=new OffscreenCanvas(n.gifData.width,n.gifData.height),r=a.getContext("2d");if(!r)throw new Error("could not create offscreen canvas context");r.imageSmoothingQuality="low",r.imageSmoothingEnabled=!1,r.clearRect(Xo,Yo,a.width,a.height),void 0===s.gifLoopCount&&(s.gifLoopCount=n.gifLoopCount??Zo);let c=s.gifFrame??0;const l={x:.5*-n.gifData.width,y:.5*-n.gifData.height},h=n.gifData.frames[c];if(void 0===s.gifTime&&(s.gifTime=0),h.bitmap){switch(e.scale(i/n.gifData.width,i/n.gifData.height),h.disposalMethod){case Qo.UndefinedA:case Qo.UndefinedB:case Qo.UndefinedC:case Qo.UndefinedD:case Qo.Replace:r.drawImage(h.bitmap,h.left,h.top),e.drawImage(a,l.x,l.y),r.clearRect(Xo,Yo,a.width,a.height);break;case Qo.Combine:r.drawImage(h.bitmap,h.left,h.top),e.drawImage(a,l.x,l.y);break;case Qo.RestoreBackground:r.drawImage(h.bitmap,h.left,h.top),e.drawImage(a,l.x,l.y),r.clearRect(Xo,Yo,a.width,a.height),n.gifData.globalColorTable.length?r.putImageData(n.gifData.backgroundImage,l.x,l.y):r.putImageData(n.gifData.frames[0].image,l.x+h.left,l.y+h.top);break;case Qo.RestorePrevious:{const t=r.getImageData(Xo,Yo,a.width,a.height);r.drawImage(h.bitmap,h.left,h.top),e.drawImage(a,l.x,l.y),r.clearRect(Xo,Yo,a.width,a.height),r.putImageData(t,Xo,Yo)}}if(s.gifTime+=o.value,s.gifTime>h.delayTime){if(s.gifTime-=h.delayTime,++c>=n.gifData.frames.length){if(--s.gifLoopCount<=Zo)return;c=0,r.clearRect(Xo,Yo,a.width,a.height)}s.gifFrame=c}e.scale(n.gifData.width/i,n.gifData.height/i)}}(t);else if(a){const t=n.ratio,s={x:-i,y:-i},o=2*i;e.drawImage(a,s.x,s.y,o,o/t)}e.globalAlpha=1}}getSidesCount(){return 12}async init(t){const e=t.actualOptions;if(e.preload&&this._engine.loadImage)for(const t of e.preload)await this._engine.loadImage(t)}loadShape(t){if("image"!==t.shape&&"images"!==t.shape)return;this._engine.images||(this._engine.images=[]);const e=t.shapeData;if(!e)return;this._engine.images.find((t=>t.name===e.name||t.source===e.src))||this.loadImageShape(e).then((()=>{this.loadShape(t)}))}particleInit(t,e){if("image"!==e.shape&&"images"!==e.shape)return;this._engine.images||(this._engine.images=[]);const i=this._engine.images,s=e.shapeData;if(!s)return;const o=e.getFillColor(),n=i.find((t=>t.name===s.name||t.source===s.src));if(!n)return;const a=s.replaceColor??n.replaceColor;n.loading?setTimeout((()=>{this.particleInit(t,e)})):(async()=>{let t;t=n.svgData&&o?await Vo(n,s,o,e):{color:o,data:n,element:n.element,gif:n.gif,gifData:n.gifData,gifLoopCount:n.gifLoopCount,loaded:!0,ratio:s.width&&s.height?s.width/s.height:n.ratio??1,replaceColor:a,source:s.src},t.ratio||(t.ratio=1);const i={image:t,fill:s.fill??e.shapeFill,close:s.close??e.shapeClose};e.image=i.image,e.shapeFill=i.fill,e.shapeClose=i.close})()}}class sn{constructor(){this.src="",this.gif=!1}load(t){t&&(void 0!==t.gif&&(this.gif=t.gif),void 0!==t.height&&(this.height=t.height),void 0!==t.name&&(this.name=t.name),void 0!==t.replaceColor&&(this.replaceColor=t.replaceColor),void 0!==t.src&&(this.src=t.src),void 0!==t.width&&(this.width=t.width))}}class on{constructor(t){this.id="imagePreloader",this._engine=t}async getPlugin(){return await Promise.resolve(),{}}loadOptions(t,e){if(!e?.preload)return;t.preload||(t.preload=[]);const i=t.preload;for(const t of e.preload){const e=i.find((e=>e.name===t.name||e.src===t.src));if(e)e.load(t);else{const e=new sn;e.load(t),i.push(e)}}}needsPlugin(){return!0}}const nn=3;async function an(t,e=!0){!function(t){t.loadImage||(t.loadImage=async e=>{if(!e.name&&!e.src)throw new Error(`${f} no image source provided`);if(t.images||(t.images=[]),!t.images.find((t=>t.name===e.name||t.source===e.src)))try{const i={gif:e.gif??!1,name:e.name??e.src,source:e.src,type:e.src.substring(e.src.length-nn),error:!1,loading:!0,replaceColor:e.replaceColor,ratio:e.width&&e.height?e.width/e.height:void 0};let s;t.images.push(i),s=e.gif?tn:e.replaceColor?Wo:Uo,await s(i)}catch{throw new Error(`${f} ${e.name??e.src} not found`)}})}(t);const i=new on(t);await t.addPlugin(i,e),await t.addShape(new en(t),e)}class rn extends vi{constructor(){super(),this.sync=!1}load(t){t&&(super.load(t),void 0!==t.sync&&(this.sync=t.sync))}}class cn extends vi{constructor(){super(),this.sync=!1}load(t){t&&(super.load(t),void 0!==t.sync&&(this.sync=t.sync))}}class ln{constructor(){this.count=0,this.delay=new rn,this.duration=new cn}load(t){t&&(void 0!==t.count&&(this.count=t.count),this.delay.load(t.delay),this.duration.load(t.duration))}}class hn{constructor(t){this.container=t}init(t){const e=this.container,i=t.options.life;i&&(t.life={delay:e.retina.reduceFactor?$(i.delay.value)*(i.delay.sync?1:B())/e.retina.reduceFactor*g:0,delayTime:0,duration:e.retina.reduceFactor?$(i.duration.value)*(i.duration.sync?1:B())/e.retina.reduceFactor*g:0,time:0,count:i.count},t.life.duration<=0&&(t.life.duration=-1),t.life.count<=0&&(t.life.count=-1),t.life&&(t.spawning=t.life.delay>0))}isEnabled(t){return!t.destroyed}loadOptions(t,...e){t.life||(t.life=new ln);for(const i of e)t.life.load(i?.life)}update(t,e){this.isEnabled(t)&&t.life&&function(t,e,i){if(!t.life)return;const s=t.life;let o=!1;if(t.spawning){if(s.delayTime+=e.value,!(s.delayTime>=t.life.delay))return;o=!0,t.spawning=!1,s.delayTime=0,s.time=0}if(-1===s.duration)return;if(t.spawning)return;if(o?s.time=0:s.time+=e.value,s.time<s.duration)return;if(s.time=0,t.life.count>0&&t.life.count--,0===t.life.count)return void t.destroy();const n=Q(0,i.width),a=Q(0,i.width);t.position.x=V(n),t.position.y=V(a),t.spawning=!0,s.delayTime=0,s.time=0,t.reset();const r=t.options.life;r&&(s.delay=$(r.delay.value)*g,s.duration=$(r.duration.value)*g)}(t,e,this.container.canvas.size)}}class dn{constructor(){this.validTypes=["line"]}draw(t){!function(t){const{context:e,particle:i,radius:s}=t,o=i.shapeData;e.moveTo(-s,0),e.lineTo(s,0),e.lineCap=o?.cap??"butt"}(t)}getSidesCount(){return 1}}class un{init(){}isEnabled(t){return!mt()&&!t.destroyed&&t.container.actualOptions.interactivity.events.onHover.parallax.enable}move(t){const e=t.container,i=e.actualOptions.interactivity.events.onHover.parallax;if(mt()||!i.enable)return;const s=i.force,o=e.interactivity.mouse.position;if(!o)return;const n=e.canvas.size,a=.5*n.width,r=.5*n.height,c=i.smooth,l=t.getRadius()/s,h=(o.x-a)*l,d=(o.y-r)*l,{offset:u}=t;u.x+=(h-u.x)/c,u.y+=(d-u.y)/c}}class pn extends zs{constructor(t){super(t)}clear(){}init(){}interact(t){const e=this.container;void 0===t.attractDistance&&(t.attractDistance=$(t.options.move.attract.distance)*e.retina.pixelRatio);const i=t.attractDistance,s=t.getPosition(),o=e.particles.quadTree.queryCircle(s,i);for(const e of o){if(t===e||!e.options.move.attract.enable||e.destroyed||e.spawning)continue;const i=e.getPosition(),{dx:o,dy:n}=N(s,i),a=t.options.move.attract.rotate,r=o/(1e3*a.x),c=n/(1e3*a.y),l=e.size.value/t.size.value,h=1/l;t.velocity.x-=r*l,t.velocity.y-=c*l,e.velocity.x+=r*h,e.velocity.y+=c*h}}isEnabled(t){return t.options.move.attract.enable}reset(){}}const fn=.5,vn=10,mn=0;function gn(t,e,i,s,o,n){const a=U(t.options.collisions.absorb.speed*o.factor/vn,mn,s);t.size.value+=a*fn,i.size.value-=a,s<=n&&(i.size.value=0,i.destroy())}const yn=t=>{void 0===t.collisionMaxSpeed&&(t.collisionMaxSpeed=$(t.options.collisions.maxSpeed)),t.velocity.length>t.collisionMaxSpeed&&(t.velocity.length=t.collisionMaxSpeed)};function bn(t,e){It(Et(t),Et(e)),yn(t),yn(e)}function wn(t,e,i,s){switch(t.options.collisions.mode){case ti.absorb:!function(t,e,i,s){const o=t.getRadius(),n=e.getRadius();void 0===o&&void 0!==n?t.destroy():void 0!==o&&void 0===n?e.destroy():void 0!==o&&void 0!==n&&(o>=n?gn(t,0,e,n,i,s):gn(e,0,t,o,i,s))}(t,e,i,s);break;case ti.bounce:bn(t,e);break;case ti.destroy:!function(t,e){t.unbreakable||e.unbreakable||bn(t,e),void 0===t.getRadius()&&void 0!==e.getRadius()?t.destroy():void 0!==t.getRadius()&&void 0===e.getRadius()?e.destroy():void 0!==t.getRadius()&&void 0!==e.getRadius()&&(t.getRadius()>=e.getRadius()?e:t).destroy()}(t,e)}}class xn extends zs{constructor(t){super(t)}clear(){}init(){}interact(t,e){if(t.destroyed||t.spawning)return;const i=this.container,s=t.getPosition(),o=t.getRadius(),n=i.particles.quadTree.queryCircle(s,2*o);for(const a of n){if(t===a||!a.options.collisions.enable||t.options.collisions.mode!==a.options.collisions.mode||a.destroyed||a.spawning)continue;const n=a.getPosition(),r=a.getRadius();if(Math.abs(Math.round(s.z)-Math.round(n.z))>o+r)continue;X(s,n)>o+r||wn(t,a,e,i.retina.pixelRatio)}}isEnabled(t){return t.options.collisions.enable}reset(){}}class _n extends es{constructor(t,e,i,s){super(t,e,i),this.canvasSize=s,this.canvasSize={...s}}contains(t){const{width:e,height:i}=this.canvasSize,{x:s,y:o}=t;return super.contains(t)||super.contains({x:s-e,y:o})||super.contains({x:s-e,y:o-i})||super.contains({x:s,y:o-i})}intersects(t){if(super.intersects(t))return!0;const e=t,i=t,s={x:t.position.x-this.canvasSize.width,y:t.position.y-this.canvasSize.height};if(void 0!==i.radius){const t=new es(s.x,s.y,2*i.radius);return super.intersects(t)}if(void 0!==e.size){const t=new is(s.x,s.y,2*e.size.width,2*e.size.height);return super.intersects(t)}return!1}}class kn{constructor(){this.blur=5,this.color=new Fe,this.color.value="#000",this.enable=!1}load(t){t&&(void 0!==t.blur&&(this.blur=t.blur),this.color=Fe.create(this.color,t.color),void 0!==t.enable&&(this.enable=t.enable))}}class Mn{constructor(){this.enable=!1,this.frequency=1}load(t){t&&(void 0!==t.color&&(this.color=Fe.create(this.color,t.color)),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.frequency&&(this.frequency=t.frequency),void 0!==t.opacity&&(this.opacity=t.opacity))}}class zn{constructor(){this.blink=!1,this.color=new Fe,this.color.value="#fff",this.consent=!1,this.distance=100,this.enable=!1,this.frequency=1,this.opacity=1,this.shadow=new kn,this.triangles=new Mn,this.width=1,this.warp=!1}load(t){t&&(void 0!==t.id&&(this.id=t.id),void 0!==t.blink&&(this.blink=t.blink),this.color=Fe.create(this.color,t.color),void 0!==t.consent&&(this.consent=t.consent),void 0!==t.distance&&(this.distance=t.distance),void 0!==t.enable&&(this.enable=t.enable),void 0!==t.frequency&&(this.frequency=t.frequency),void 0!==t.opacity&&(this.opacity=t.opacity),this.shadow.load(t.shadow),this.triangles.load(t.triangles),void 0!==t.width&&(this.width=t.width),void 0!==t.warp&&(this.warp=t.warp))}}const Cn=0,Pn=0;function On(t,e,i,s,o){const{dx:n,dy:a,distance:r}=N(t,e);if(!o||r<=i)return r;const c={x:Math.abs(n),y:Math.abs(a)},l=Math.min(c.x,s.width-c.x),h=Math.min(c.y,s.height-c.y);return Math.sqrt(l**2+h**2)}class Sn extends zs{constructor(t){super(t),this._setColor=t=>{if(!t.options.links)return;const e=this.linkContainer,i=t.options.links;let s=void 0===i.id?e.particles.linksColor:e.particles.linksColors.get(i.id);if(s)return;s=de(i.color,i.blink,i.consent),void 0===i.id?e.particles.linksColor=s:e.particles.linksColors.set(i.id,s)},this.linkContainer=t}clear(){}init(){this.linkContainer.particles.linksColor=void 0,this.linkContainer.particles.linksColors=new Map}interact(t){if(!t.options.links)return;t.links=[];const e=t.getPosition(),i=this.container,s=i.canvas.size;if(e.x<Cn||e.y<Pn||e.x>s.width||e.y>s.height)return;const o=t.options.links,n=o.opacity,a=t.retina.linksDistance??0,r=o.warp;let c;c=r?new _n(e.x,e.y,a,s):new es(e.x,e.y,a);const l=i.particles.quadTree.query(c);for(const i of l){const c=i.options.links;if(t===i||!c?.enable||o.id!==c.id||i.spawning||i.destroyed||!i.links||t.links.some((t=>t.destination===i))||i.links.some((e=>e.destination===t)))continue;const l=i.getPosition();if(l.x<Cn||l.y<Pn||l.x>s.width||l.y>s.height)continue;const h=On(e,l,a,s,r&&c.warp);if(h>a)continue;const d=(1-h/a)*n;this._setColor(t),t.links.push({destination:i,opacity:d})}}isEnabled(t){return!!t.options.links?.enable}loadParticlesOptions(t,...e){t.links||(t.links=new zn);for(const i of e)t.links.load(i?.links)}reset(){}}function Tn(t,e){const i=((s=t.map((t=>t.id))).sort(((t,e)=>t-e)),s.join("_"));var s;let o=e.get(i);return void 0===o&&(o=B(),e.set(i,o)),o}class Rn{constructor(t){this.container=t,this._drawLinkLine=(t,e)=>{const i=t.options.links;if(!i?.enable)return;const s=this.container,o=s.actualOptions,n=e.destination,a=t.getPosition(),r=n.getPosition();let c=e.opacity;s.canvas.draw((e=>{let l;const h=t.options.twinkle?.lines;if(h?.enable){const t=h.frequency,e=Zt(h.color);B()<t&&e&&(l=e,c=$(h.opacity))}if(!l){const e=void 0!==i.id?s.particles.linksColors.get(i.id):s.particles.linksColor;l=he(t,n,e)}if(!l)return;const d=t.retina.linksWidth??0,u=t.retina.linksDistance??0,{backgroundMask:p}=o;!function(t){let e=!1;const{begin:i,end:s,maxDistance:o,context:n,canvasSize:a,width:r,backgroundMask:c,colorLine:l,opacity:h,links:d}=t;if(X(i,s)<=o)be(n,i,s),e=!0;else if(d.warp){let t,r;const c=N(i,{x:s.x-a.width,y:s.y});if(c.distance<=o){const e=i.y-c.dy/c.dx*i.x;t={x:0,y:e},r={x:a.width,y:e}}else{const e=N(i,{x:s.x,y:s.y-a.height});if(e.distance<=o){const s=-(i.y-e.dy/e.dx*i.x)/(e.dy/e.dx);t={x:s,y:0},r={x:s,y:a.height}}else{const e=N(i,{x:s.x-a.width,y:s.y-a.height});if(e.distance<=o){const s=i.y-e.dy/e.dx*i.x;t={x:-s/(e.dy/e.dx),y:s},r={x:t.x+a.width,y:t.y+a.height}}}}t&&r&&(be(n,i,t),be(n,s,r),e=!0)}if(!e)return;n.lineWidth=r,c.enable&&(n.globalCompositeOperation=c.composite),n.strokeStyle=re(l,h);const{shadow:u}=d;if(u.enable){const t=Zt(u.color);t&&(n.shadowBlur=u.blur,n.shadowColor=re(t))}n.stroke()}({context:e,width:d,begin:a,end:r,maxDistance:u,canvasSize:s.canvas.size,links:i,backgroundMask:p,colorLine:l,opacity:c})}))},this._drawLinkTriangle=(t,e,i)=>{const s=t.options.links;if(!s?.enable)return;const o=s.triangles;if(!o.enable)return;const n=this.container,a=n.actualOptions,r=e.destination,c=i.destination,l=o.opacity??.5*(e.opacity+i.opacity);l<=0||n.canvas.draw((e=>{const i=t.getPosition(),h=r.getPosition(),d=c.getPosition(),u=t.retina.linksDistance??0;if(X(i,h)>u||X(d,h)>u||X(d,i)>u)return;let p=Zt(o.color);if(!p){const e=void 0!==s.id?n.particles.linksColors.get(s.id):n.particles.linksColor;p=he(t,r,e)}p&&function(t){const{context:e,pos1:i,pos2:s,pos3:o,backgroundMask:n,colorTriangle:a,opacityTriangle:r}=t;!function(t,e,i,s){t.beginPath(),t.moveTo(e.x,e.y),t.lineTo(i.x,i.y),t.lineTo(s.x,s.y),t.closePath()}(e,i,s,o),n.enable&&(e.globalCompositeOperation=n.composite),e.fillStyle=re(a,r),e.fill()}({context:e,pos1:i,pos2:h,pos3:d,backgroundMask:a.backgroundMask,colorTriangle:p,opacityTriangle:l})}))},this._drawTriangles=(t,e,i,s)=>{const o=i.destination;if(!t.links?.triangles.enable||!o.options.links?.triangles.enable)return;const n=o.links?.filter((t=>{const e=this._getLinkFrequency(o,t.destination);return o.options.links&&e<=o.options.links.frequency&&s.findIndex((e=>e.destination===t.destination))>=0}));if(n?.length)for(const s of n){const n=s.destination;this._getTriangleFrequency(e,o,n)>t.links.triangles.frequency||this._drawLinkTriangle(e,i,s)}},this._getLinkFrequency=(t,e)=>Tn([t,e],this._freqs.links),this._getTriangleFrequency=(t,e,i)=>Tn([t,e,i],this._freqs.triangles),this._freqs={links:new Map,triangles:new Map}}drawParticle(t,e){const{links:i,options:s}=e;if(!i?.length)return;const o=i.filter((t=>s.links&&(s.links.frequency>=1||this._getLinkFrequency(e,t.destination)<=s.links.frequency)));for(const t of o)this._drawTriangles(s,e,t,o),t.opacity>0&&(e.retina.linksWidth??0)>0&&this._drawLinkLine(e,t)}async init(){this._freqs.links=new Map,this._freqs.triangles=new Map,await Promise.resolve()}particleCreated(t){if(t.links=[],!t.options.links)return;const e=this.container.retina.pixelRatio,{retina:i}=t,{distance:s,width:o}=t.options.links;i.linksDistance=s*e,i.linksWidth=o*e}particleDestroyed(t){t.links=[]}}class Dn{constructor(){this.id="links"}getPlugin(t){return Promise.resolve(new Rn(t))}loadOptions(){}needsPlugin(){return!0}}async function En(t,e=!0){await async function(t,e=!0){await t.addInteractor("particlesLinks",(async t=>Promise.resolve(new Sn(t))),e)}(t,e),await async function(t,e=!0){const i=new Dn;await t.addPlugin(i,e)}(t,e)}const In=0,Ln=0;class An{draw(t){const{particle:e,radius:i}=t;!function(t,e,i){const{context:s}=t,o=i.count.numerator*i.count.denominator,n=i.count.numerator/i.count.denominator,a=180*(n-2)/n,r=Math.PI-Y(a);if(s){s.beginPath(),s.translate(e.x,e.y),s.moveTo(In,Ln);for(let t=0;t<o;t++)s.lineTo(i.length,Ln),s.translate(i.length,Ln),s.rotate(r)}}(t,this.getCenter(e,i),this.getSidesData(e,i))}getSidesCount(t){const e=t.shapeData;return Math.round($(e?.sides??5))}}class Bn extends An{constructor(){super(...arguments),this.validTypes=["polygon"]}getCenter(t,e){return{x:-e/(t.sides/3.5),y:-e/.76}}getSidesData(t,e){const i=t.sides;return{count:{denominator:1,numerator:i},length:2.66*e/(i/3)}}}class Fn extends An{constructor(){super(...arguments),this.validTypes=["triangle"]}getCenter(t,e){return{x:-e,y:e/1.66}}getSidesCount(){return 3}getSidesData(t,e){return{count:{denominator:2,numerator:3},length:2*e}}}async function qn(t,e=!0){await async function(t,e=!0){await t.addShape(new Bn,e)}(t,e),await async function(t,e=!0){await t.addShape(new Fn,e)}(t,e)}class Hn{constructor(){this.enable=!1,this.speed=0,this.decay=0,this.sync=!1}load(t){t&&(void 0!==t.enable&&(this.enable=t.enable),void 0!==t.speed&&(this.speed=Q(t.speed)),void 0!==t.decay&&(this.decay=Q(t.decay)),void 0!==t.sync&&(this.sync=t.sync))}}class Un extends vi{constructor(){super(),this.animation=new Hn,this.direction=bs.clockwise,this.path=!1,this.value=0}load(t){t&&(super.load(t),void 0!==t.direction&&(this.direction=t.direction),this.animation.load(t.animation),void 0!==t.path&&(this.path=t.path))}}const Wn=2*Math.PI;class Vn{constructor(t){this.container=t}init(t){const e=t.options.rotate;if(!e)return;t.rotate={enable:e.animation.enable,value:Y($(e.value)),min:0,max:Wn},t.pathRotation=e.path;let i=e.direction;if(i===bs.random){i=Math.floor(2*B())>0?bs.counterClockwise:bs.clockwise}switch(i){case bs.counterClockwise:case"counterClockwise":t.rotate.status=rt.decreasing;break;case bs.clockwise:t.rotate.status=rt.increasing}const s=e.animation;s.enable&&(t.rotate.decay=1-$(s.decay),t.rotate.velocity=$(s.speed)/360*this.container.retina.reduceFactor,s.sync||(t.rotate.velocity*=B())),t.rotation=t.rotate.value}isEnabled(t){const e=t.options.rotate;return!!e&&(!t.destroyed&&!t.spawning&&(!!e.value||e.animation.enable||e.path))}loadOptions(t,...e){t.rotate||(t.rotate=new Un);for(const i of e)t.rotate.load(i?.rotate)}update(t,e){this.isEnabled(t)&&(t.isRotating=!!t.rotate,t.rotate&&(Vt(t,t.rotate,!1,ct.none,e),t.rotation=t.rotate.value))}}const $n=Math.sqrt(2);class jn{constructor(){this.validTypes=["edge","square"]}draw(t){!function(t){const{context:e,radius:i}=t,s=i/$n,o=2*s;e.rect(-s,-s,o,o)}(t)}getSidesCount(){return 4}}const Gn=0,Qn=0;class Nn{constructor(){this.validTypes=["star"]}draw(t){!function(t){const{context:e,particle:i,radius:s}=t,o=i.sides,n=i.starInset??2;e.moveTo(Gn,Qn-s);for(let t=0;t<o;t++)e.rotate(Math.PI/o),e.lineTo(Gn,Qn-s*n),e.rotate(Math.PI/o),e.lineTo(Gn,Qn-s)}(t)}getSidesCount(t){const e=t.shapeData;return Math.round($(e?.sides??5))}particleInit(t,e){const i=e.shapeData;e.starInset=$(i?.inset??2)}}class Xn{constructor(t){this.container=t}init(t){const e=this.container,i=t.options,s=Bt(i.stroke,t.id,i.reduceDuplicates);t.strokeWidth=$(s.width)*e.retina.pixelRatio,t.strokeOpacity=$(s.opacity??1),t.strokeAnimation=s.color?.animation;const o=te(s.color)??t.getFillColor();o&&(t.strokeColor=pe(o,t.strokeAnimation,e.retina.reduceFactor))}isEnabled(t){const e=t.strokeAnimation,{strokeColor:i}=t;return!t.destroyed&&!t.spawning&&!!e&&(void 0!==i?.h.value&&i.h.enable||void 0!==i?.s.value&&i.s.enable||void 0!==i?.l.value&&i.l.enable)}update(t,e){this.isEnabled(t)&&me(t.strokeColor,e)}}async function Yn(t,e=!0){await async function(t,e=!0){await t.addMover("parallax",(()=>Promise.resolve(new un)),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalAttract",(e=>Promise.resolve(new Zs(t,e))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalBounce",(t=>Promise.resolve(new ro(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalBubble",(t=>Promise.resolve(new vo(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalConnect",(t=>Promise.resolve(new _o(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalGrab",(t=>Promise.resolve(new Co(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalPause",(t=>Promise.resolve(new Po(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalPush",(t=>Promise.resolve(new So(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalRemove",(t=>Promise.resolve(new Ro(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalRepulse",(e=>Promise.resolve(new Ao(t,e))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("externalSlow",(t=>Promise.resolve(new Fo(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("particlesAttract",(t=>Promise.resolve(new pn(t))),e)}(t,!1),await async function(t,e=!0){await t.addInteractor("particlesCollisions",(t=>Promise.resolve(new xn(t))),e)}(t,!1),await En(t,!1),await async function(){I(xs.easeInQuad,(t=>t**2)),I(xs.easeOutQuad,(t=>1-(1-t)**2)),I(xs.easeInOutQuad,(t=>t<.5?2*t**2:1-(-2*t+2)**2/2)),await Promise.resolve()}(),await async function(t,e=!0){await t.addShape(new js,e)}(t,!1),await an(t,!1),await async function(t,e=!0){await t.addShape(new dn,e)}(t,!1),await qn(t,!1),await async function(t,e=!0){await t.addShape(new jn,e)}(t,!1),await async function(t,e=!0){await t.addShape(new Nn,e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("life",(async t=>Promise.resolve(new hn(t))),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("rotate",(t=>Promise.resolve(new Vn(t))),e)}(t,!1),await async function(t,e=!0){await t.addParticleUpdater("strokeColor",(t=>Promise.resolve(new Xn(t))),e)}(t,!1),await Vs(t,e)}return e})()));
\\ No newline at end of file
ddiff --git a/public/favicon.svg b/public/favicon.svg
iindex adc2187..d6da27a 100644
---- a/public/favicon.svg
++++ b/public/favicon.svg
@@@ -1,10 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
-- <stop offset="0" stop-color="#4cc9b0"/>
-- <stop offset="1" stop-color="#7aa2f7"/>
++ <stop offset="0" stop-color="#4f7cff"/>
++ <stop offset=".55" stop-color="#8b5cf6"/>
++ <stop offset="1" stop-color="#ff6a3d"/>
</linearGradient>
</defs>
-- <rect width="64" height="64" rx="14" fill="url(#g)"/>
-- <text x="32" y="32" text-anchor="middle" dominant-baseline="central" font-family="Arial, sans-serif" font-weight="800" font-size="30" letter-spacing="-1" fill="#06221c">AF</text>
++ <rect width="64" height="64" rx="16" fill="#0b0f1a"/>
++ <rect x="1.5" y="1.5" width="61" height="61" rx="15" fill="none" stroke="url(#g)" stroke-width="2"/>
++ <path d="M16 44 L26.5 19 L37 44 M20.2 35.2 h12.6" fill="none" stroke="#eef2ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
++ <path d="M41 44 V19 H51 M41 31 H49" fill="none" stroke="url(#g)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
ddiff --git a/resume/build_resume.py b/resume/build_resume.py
nnew file mode 100644
iindex 0000000..3d0c23a
---- /dev/null
++++ b/resume/build_resume.py
@@@ -0,0 +1,771 @@
++#!/usr/bin/env python3
++"""Build the two-page US-Letter resume PDF from the site's own content.
++
++Everything on the page comes from the repo so the PDF and alexfrison.net
++never drift:
++
++ src/data/profile.json name, tagline, pitch, contact, metrics, education
++ src/content/experience/*.json roles, sorted by `order`
++ src/content/skills/*.json skill groups, sorted by `order`
++ src/content/projects/<slug>.mdx selected projects (frontmatter only)
++
++Run from the repo root: python3 resume/build_resume.py
++Output: public/<profile.resumePdf> (public/Alex_Frison_Resume_Sep_2026.pdf)
++"""
++from __future__ import annotations
++
++import datetime as _dt
++import json
++import os
++import re
++import sys
++import tempfile
++from pathlib import Path
++
++from reportlab.lib.colors import HexColor
++from reportlab.lib.enums import TA_LEFT
++from reportlab.lib.pagesizes import letter
++from reportlab.lib.styles import ParagraphStyle
++from reportlab.pdfbase import pdfmetrics
++from reportlab.pdfbase.ttfonts import TTFont
++from reportlab.pdfgen import canvas as _canvas
++from reportlab.platypus import Paragraph
++
++ROOT = Path(__file__).resolve().parent.parent
++HERE = Path(__file__).resolve().parent
++
++# --------------------------------------------------------------------------
++# Content selection (labels only; no résumé text lives in this file)
++# --------------------------------------------------------------------------
++SELECTED_PROJECTS = [
++ "openvibe-live",
++ "openvibe-network",
++ "powerchat-payments",
++ "powerchat-developer-api",
++ "live-translation",
++ "irdr-autonomous-bot",
++]
++# Metrics strip: pick by a keyword found in the label, in this order.
++# Falls back to the first four metrics if fewer than four match.
++METRIC_KEYWORDS = ["services", "routes", "payment processors", "irdrs", "years"]
++FULL_ROLES = 3 # roles with summary + all bullets on page 1
++COMPACT_BULLETS = 2 # bullets per role on page 2
++
++# --------------------------------------------------------------------------
++# Palette
++# --------------------------------------------------------------------------
++PAPER = HexColor("#f5f6fb")
++CARD = HexColor("#ffffff")
++BORDER = HexColor("#dfe4f2")
++INK = HexColor("#0c1020")
++BODY = HexColor("#2a3148")
++MUTED = HexColor("#5c6683")
++BLUE = HexColor("#3b63f0")
++CORAL = HexColor("#f0562a")
++VIOLET = HexColor("#7c5cff")
++MINT = HexColor("#16b98a")
++
++# --------------------------------------------------------------------------
++# Page geometry
++# --------------------------------------------------------------------------
++PAGE_W, PAGE_H = letter
++MARGIN = 36.0 # 0.5in
++CONTENT_W = PAGE_W - 2 * MARGIN
++TOP = PAGE_H - MARGIN
++BOTTOM = MARGIN
++CARD_PAD = 9.0
++
++# --------------------------------------------------------------------------
++# Fonts
++# --------------------------------------------------------------------------
++FONT_CANDIDATES = [
++ # (family label, regular, bold, italic)
++ ("Inter",
++ "/usr/share/fonts/truetype/inter/Inter-Regular.ttf",
++ "/usr/share/fonts/truetype/inter/Inter-Bold.ttf",
++ None),
++ ("Liberation Sans",
++ "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf",
++ "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf",
++ "/usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf"),
++ ("DejaVu Sans",
++ "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
++ "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf",
++ "/usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf"),
++]
++FA_PATH = HERE / "fonts" / "fontawesome-webfont.ttf"
++
++FONT = {"regular": "Helvetica", "bold": "Helvetica-Bold", "italic": "Helvetica-Oblique", "label": "Helvetica (built-in)"}
++UNICODE_OK = False
++
++
++def dehinted(path: str) -> str:
++ """Copy of a TTF with TrueType hinting stripped.
++
++ reportlab keeps the hint programs when it subsets a font, and for heavily
++ hinted families (Liberation, DejaVu) they are most of the embedded bytes.
++ PDF viewers ignore them, so dropping them halves the file size with no
++ visible change. Falls back to the original path if fontTools is missing.
++ """
++ try:
++ from fontTools.ttLib import TTFont as FTFont
++ except ImportError:
++ return path
++ try:
++ f = FTFont(path)
++ for table in ("fpgm", "prep", "cvt ", "hdmx", "LTSH", "VDMX", "gasp", "kern", "GPOS", "GSUB", "DSIG"):
++ if table in f:
++ del f[table]
++ glyf = f["glyf"]
++ for g in glyf.glyphs.values():
++ g.expand(glyf)
++ if hasattr(g, "program"):
++ g.program.fromBytecode(b"")
++ out_dir = Path(tempfile.mkdtemp(prefix="resume-fonts-"))
++ out = out_dir / Path(path).name
++ f.save(str(out))
++ return str(out)
++ except Exception:
++ return path
++
++
++def register_fonts() -> None:
++ global UNICODE_OK
++ for label, reg, bold, ital in FONT_CANDIDATES:
++ if os.path.exists(reg) and os.path.exists(bold):
++ pdfmetrics.registerFont(TTFont("Body", dehinted(reg)))
++ pdfmetrics.registerFont(TTFont("Body-Bold", dehinted(bold)))
++ if ital and os.path.exists(ital):
++ pdfmetrics.registerFont(TTFont("Body-Italic", dehinted(ital)))
++ italic = "Body-Italic"
++ else:
++ italic = "Body"
++ pdfmetrics.registerFontFamily("Body", normal="Body", bold="Body-Bold", italic=italic, boldItalic="Body-Bold")
++ FONT.update(regular="Body", bold="Body-Bold", italic=italic, label=label)
++ UNICODE_OK = True
++ break
++ if not FA_PATH.exists():
++ sys.exit(f"missing icon font: {FA_PATH}")
++ pdfmetrics.registerFont(TTFont("FA", str(FA_PATH)))
++
++
++# Font Awesome 4 code points
++ICON = {
++ "email": "", "phone": "", "site": "", "linkedin": "",
++ "github": "", "location": "", "link": "", "education": "",
++}
++
++# --------------------------------------------------------------------------
++# Data loading
++# --------------------------------------------------------------------------
++
++def load_json_dir(path: Path) -> list[dict]:
++ items = [json.loads(p.read_text(encoding="utf-8")) for p in sorted(path.glob("*.json"))]
++ return sorted(items, key=lambda d: d.get("order", 999))
++
++
++def parse_frontmatter(path: Path) -> dict:
++ text = path.read_text(encoding="utf-8")
++ m = re.match(r"^---\s*\n(.*?)\n---\s*\n", text, re.S)
++ if not m:
++ return {}
++ out: dict = {}
++ for line in m.group(1).splitlines():
++ if not line.strip() or line.lstrip().startswith("#") or ":" not in line:
++ continue
++ key, _, raw = line.partition(":")
++ key, raw = key.strip(), raw.strip()
++ if raw.startswith(("{", "[")):
++ try:
++ out[key] = json.loads(raw)
++ except json.JSONDecodeError:
++ out[key] = raw
++ elif len(raw) >= 2 and raw[0] == raw[-1] and raw[0] in "\"'":
++ out[key] = raw[1:-1]
++ elif raw in ("true", "false"):
++ out[key] = raw == "true"
++ else:
++ try:
++ out[key] = int(raw)
++ except ValueError:
++ out[key] = raw
++ return out
++
++
++def load_content() -> dict:
++ profile = json.loads((ROOT / "src/data/profile.json").read_text(encoding="utf-8"))
++ experience = load_json_dir(ROOT / "src/content/experience")
++ skills = load_json_dir(ROOT / "src/content/skills")
++ projects = []
++ for slug in SELECTED_PROJECTS:
++ fm = parse_frontmatter(ROOT / "src/content/projects" / f"{slug}.mdx")
++ if fm:
++ projects.append(fm)
++ return dict(profile=profile, experience=experience, skills=skills, projects=projects)
++
++
++def pick_metrics(metrics: list[dict]) -> list[dict]:
++ picked = []
++ for kw in METRIC_KEYWORDS:
++ for m in metrics:
++ if kw in m["label"].lower() and m not in picked:
++ picked.append(m)
++ break
++ if len(picked) < 4:
++ picked = metrics[:4]
++ return picked[:5]
++
++
++# --------------------------------------------------------------------------
++# Text helpers
++# --------------------------------------------------------------------------
++
++def esc(s: str) -> str:
++ s = s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
++ if not UNICODE_OK:
++ s = s.replace("→", " to ").replace("×", "x")
++ return s
++
++
++def style(name: str, size: float, leading: float, color, font: str | None = None, **kw) -> ParagraphStyle:
++ return ParagraphStyle(name, fontName=font or FONT["regular"], fontSize=size, leading=leading,
++ textColor=color, alignment=TA_LEFT, **kw)
++
++
++class Styles:
++ def __init__(self) -> None:
++ self.body = style("body", 9.2, 11.6, BODY)
++ self.summary = style("summary", 8.5, 10.4, MUTED, FONT["italic"])
++ self.bullet = style("bullet", 8.5, 10.2, BODY, leftIndent=9, bulletIndent=0,
++ bulletFontName=FONT["regular"], bulletFontSize=8.5, bulletColor=BLUE)
++ self.bullet_compact = style("bulletc", 8.5, 10.0, BODY, leftIndent=9, bulletIndent=0,
++ bulletFontName=FONT["regular"], bulletFontSize=8.5, bulletColor=BLUE)
++ self.stack = style("stack", 7.2, 9.0, MUTED)
++ self.metric_label = style("mlabel", 7.2, 8.8, MUTED)
++ self.proj_title = style("ptitle", 8.6, 10.4, INK, FONT["bold"])
++ self.proj_summary = style("psum", 7.6, 9.2, BODY)
++ self.proj_link = style("plink", 7.4, 9.0, BLUE)
++ self.skill_items = style("skills", 8.4, 10.3, BODY)
++ self.edu = style("edu", 8.4, 10.3, BODY)
++
++
++def para(text: str, st: ParagraphStyle, bullet: str | None = None) -> Paragraph:
++ return Paragraph(text, st, bulletText=bullet) if bullet else Paragraph(text, st)
++
++
++def para_height(p: Paragraph, width: float) -> float:
++ _, h = p.wrap(width, 10_000)
++ return h
++
++
++def draw_para(c, p: Paragraph, x: float, y_top: float, width: float) -> float:
++ """Draw paragraph with its top edge at y_top; return its height."""
++ _, h = p.wrap(width, 10_000)
++ p.drawOn(c, x, y_top - h)
++ return h
++
++
++def truncate_to_lines(text: str, st: ParagraphStyle, width: float, max_lines: int) -> tuple[str, bool]:
++ """Shorten `text` word by word until it fits in max_lines. Returns (text, truncated)."""
++ limit = st.leading * max_lines + 0.5
++ if para_height(Paragraph(esc(text), st), width) <= limit:
++ return text, False
++ words = text.split()
++ while words:
++ words.pop()
++ candidate = " ".join(words).rstrip(",;:") + "…"
++ if para_height(Paragraph(esc(candidate), st), width) <= limit:
++ return candidate, True
++ return "…", True
++
++
++def small_caps(c, x: float, y_base: float, text: str, size: float, color, tracking: float = 0.7,
++ font: str | None = None) -> float:
++ """Tracked uppercase label drawn directly on the canvas. Returns width."""
++ font = font or FONT["bold"]
++ c.saveState() # Tc is graphics state and would otherwise leak into later text
++ t = c.beginText(x, y_base)
++ t.setFont(font, size)
++ t.setFillColor(color)
++ t.setCharSpace(tracking)
++ t.textOut(text.upper())
++ t.setCharSpace(0)
++ c.drawText(t)
++ c.restoreState()
++ return pdfmetrics.stringWidth(text.upper(), font, size) + tracking * len(text)
++
++
++def icon(c, x: float, y_base: float, glyph: str, size: float, color) -> float:
++ c.saveState()
++ c.setFont("FA", size)
++ c.setFillColor(color)
++ c.drawString(x, y_base, glyph)
++ c.restoreState()
++ return pdfmetrics.stringWidth(glyph, "FA", size)
++
++
++def hairline(c, x0: float, y: float, x1: float, color=BORDER, width: float = 0.6) -> None:
++ c.saveState()
++ c.setStrokeColor(color)
++ c.setLineWidth(width)
++ c.line(x0, y, x1, y)
++ c.restoreState()
++
++
++def card(c, x: float, y_top: float, w: float, h: float, radius: float = 4.0) -> None:
++ c.saveState()
++ c.setFillColor(CARD)
++ c.setStrokeColor(BORDER)
++ c.setLineWidth(0.7)
++ c.roundRect(x, y_top - h, w, h, radius, stroke=1, fill=1)
++ c.restoreState()
++
++
++def gradient_bar(c) -> None:
++ """Signature 3-stop bar across the very top of the page."""
++ c.saveState()
++ p = c.beginPath()
++ p.rect(0, PAGE_H - 5, PAGE_W, 5)
++ c.clipPath(p, stroke=0, fill=0)
++ c.linearGradient(0, PAGE_H, PAGE_W, PAGE_H, [BLUE, VIOLET, CORAL], [0.0, 0.5, 1.0], extend=True)
++ c.restoreState()
++
++
++def page_background(c) -> None:
++ c.saveState()
++ c.setFillColor(PAPER)
++ c.rect(0, 0, PAGE_W, PAGE_H, stroke=0, fill=1)
++ c.restoreState()
++ gradient_bar(c)
++
++
++SECTION_LABEL_SIZE = 7.6
++SECTION_LABEL_H = SECTION_LABEL_SIZE + 6.5
++
++
++def section_label(c, x: float, y_top: float, text: str, width: float) -> float:
++ """Small-caps blue label with a short coral tick and a hairline to the right. Returns height."""
++ size = SECTION_LABEL_SIZE
++ base = y_top - size
++ w = small_caps(c, x, base, text, size, BLUE, tracking=1.0)
++ hairline(c, x, base - 3.2, x + 16, CORAL, 1.2)
++ hairline(c, x + w + 8, base + size * 0.32, x + width)
++ return SECTION_LABEL_H
++
++
++# --------------------------------------------------------------------------
++# Blocks. Each block function draws when `draw` is True and always returns
++# the height it occupies, so callers can measure before drawing a card.
++# --------------------------------------------------------------------------
++
++def block_header(c, profile: dict, y_top: float, draw: bool) -> float:
++ x = MARGIN
++ y = y_top
++ name_size, tag_size = 24.0, 10.2
++ if draw:
++ c.setFillColor(INK)
++ c.setFont(FONT["bold"], name_size)
++ c.drawString(x, y - name_size * 0.78, profile["name"])
++ y -= name_size * 0.78 + 6
++ if draw:
++ c.setFillColor(MUTED)
++ c.setFont(FONT["regular"], tag_size)
++ c.drawString(x, y - tag_size * 0.78, profile["tagline"])
++ y -= tag_size * 0.78 + 8
++
++ # Contact line with icons; wraps to a second line if needed.
++ items = [
++ ("email", profile.get("emailDisplay") or profile.get("email"), f"mailto:{profile['email']}" if profile.get("email") else None),
++ ("phone", profile.get("phoneDisplay") or profile.get("phone"), f"tel:{profile['phone']}" if profile.get("phone") else None),
++ ("site", profile.get("siteDisplay"), profile.get("site")),
++ ("linkedin", profile.get("linkedinDisplay"), profile.get("linkedin")),
++ ("github", profile.get("githubDisplay"), profile.get("github")),
++ ("location", profile.get("locationShort") or profile.get("location"), None),
++ ]
++ items = [it for it in items if it[1]]
++ size, isize, gap, igap = 8.6, 8.2, 14.0, 4.5
++ line_h = 12.0
++ cx, base = x, y - size * 0.78
++ for key, text, url in items:
++ w = isize + igap + pdfmetrics.stringWidth(text, FONT["regular"], size)
++ if cx > x and cx + w > x + CONTENT_W:
++ cx = x
++ base -= line_h
++ if draw:
++ icon(c, cx, base, ICON[key], isize, BLUE)
++ c.setFillColor(BODY)
++ c.setFont(FONT["regular"], size)
++ c.drawString(cx + isize + igap, base, text)
++ if url:
++ c.linkURL(url, (cx, base - 2.5, cx + w, base + size), relative=0, thickness=0)
++ cx += w + gap
++ y = base - 4
++ return y_top - y
++
++
++def block_metrics(c, metrics: list[dict], st: Styles, y_top: float, draw: bool) -> float:
++ n = len(metrics)
++ gap = 8.0
++ w = (CONTENT_W - gap * (n - 1)) / n
++ num_size, suf_size = 17.0, 9.5
++ pad = 7.0
++ inner_w = w - 2 * pad
++ # measure the tallest label
++ label_paras = [para(esc(m["label"]), st.metric_label) for m in metrics]
++ label_h = max(para_height(p, inner_w) for p in label_paras)
++ h = pad + num_size * 0.78 + 5 + label_h + pad
++ if draw:
++ for i, (m, lp) in enumerate(zip(metrics, label_paras)):
++ x = MARGIN + i * (w + gap)
++ card(c, x, y_top, w, h)
++ base = y_top - pad - num_size * 0.78
++ c.setFillColor(CORAL)
++ c.setFont(FONT["bold"], num_size)
++ num = f"{m['num']:,}" if isinstance(m["num"], int) else str(m["num"])
++ c.drawString(x + pad, base, num)
++ nw = pdfmetrics.stringWidth(num, FONT["bold"], num_size)
++ if m.get("suffix"):
++ c.setFont(FONT["bold"], suf_size)
++ c.drawString(x + pad + nw + 1, base, m["suffix"])
++ draw_para(c, lp, x + pad, base - 5, inner_w)
++ return h
++
++
++def block_profile(c, profile: dict, st: Styles, y_top: float, draw: bool) -> float:
++ x, w = MARGIN + CARD_PAD, CONTENT_W - 2 * CARD_PAD
++ y = y_top - CARD_PAD
++ if draw:
++ section_label(c, x, y, "Profile", w)
++ y -= SECTION_LABEL_H
++ p = para(esc(profile["pitch"]), st.body)
++ h = para_height(p, w)
++ if draw:
++ draw_para(c, p, x, y, w)
++ y -= h + 1
++ y -= CARD_PAD
++ return y_top - y
++
++
++def role_header(c, role: dict, st: Styles, x: float, w: float, y_top: float, draw: bool) -> float:
++ """Role title, company · location, right-aligned dates (mint dot if current)."""
++ title_size, meta_size, date_size = 10.0, 8.6, 8.4
++ y = y_top
++ dates = f"{role.get('start', '')} – {role.get('end', '')}".strip(" –")
++ dw = pdfmetrics.stringWidth(dates, FONT["regular"], date_size)
++ base = y - title_size * 0.78
++ if draw:
++ c.setFillColor(INK)
++ c.setFont(FONT["bold"], title_size)
++ c.drawString(x, base, role["role"])
++ c.setFillColor(MUTED)
++ c.setFont(FONT["regular"], date_size)
++ c.drawRightString(x + w, base + 0.6, dates)
++ if role.get("current") or str(role.get("end", "")).lower() == "present":
++ c.setFillColor(MINT)
++ c.circle(x + w - dw - 7.5, base + 3.4, 2.1, stroke=0, fill=1)
++ y = base - 2.6
++ base = y - meta_size * 0.78
++ if draw:
++ c.setFillColor(BLUE)
++ c.setFont(FONT["bold"], meta_size)
++ c.drawString(x, base, role["company"])
++ cw = pdfmetrics.stringWidth(role["company"], FONT["bold"], meta_size)
++ if role.get("link"):
++ c.linkURL(role["link"], (x, base - 2, x + cw, base + meta_size), relative=0, thickness=0)
++ if role.get("location"):
++ c.setFillColor(MUTED)
++ c.setFont(FONT["regular"], meta_size)
++ c.drawString(x + cw, base, f" · {role['location']}")
++ y = base - 3.2
++ return y_top - y
++
++
++def stack_line(c, role: dict, st: Styles, x: float, w: float, y_top: float, draw: bool) -> float:
++ stack = role.get("stack") or []
++ if not stack:
++ return 0
++ p = para(f"<b>Stack</b>&nbsp;&nbsp;{esc(' · '.join(stack))}", st.stack)
++ h = para_height(p, w)
++ if draw:
++ draw_para(c, p, x, y_top, w)
++ return h
++
++
++def block_role_full(c, role: dict, st: Styles, x: float, w: float, y_top: float, draw: bool) -> float:
++ y = y_top
++ y -= role_header(c, role, st, x, w, y, draw)
++ if role.get("summary"):
++ p = para(esc(role["summary"]), st.summary)
++ h = para_height(p, w)
++ if draw:
++ draw_para(c, p, x, y, w)
++ y -= h + 2.5
++ for b in role.get("bullets", []):
++ p = para(esc(b), st.bullet, bullet="•")
++ h = para_height(p, w)
++ if draw:
++ draw_para(c, p, x, y, w)
++ y -= h
++ y -= 3.0
++ y -= stack_line(c, role, st, x, w, y, draw)
++ return y_top - y
++
++
++def block_role_compact(c, role: dict, st: Styles, x: float, w: float, y_top: float, draw: bool) -> float:
++ y = y_top
++ y -= role_header(c, role, st, x, w, y, draw)
++ for b in role.get("bullets", [])[:COMPACT_BULLETS]:
++ p = para(esc(b), st.bullet_compact, bullet="•")
++ h = para_height(p, w)
++ if draw:
++ draw_para(c, p, x, y, w)
++ y -= h
++ return y_top - y
++
++
++def block_experience(c, roles: list[dict], st: Styles, y_top: float, label: str, compact: bool, draw: bool) -> float:
++ x, w = MARGIN + CARD_PAD, CONTENT_W - 2 * CARD_PAD
++ y = y_top - CARD_PAD
++ if draw:
++ section_label(c, x, y, label, w)
++ y -= SECTION_LABEL_H
++ fn = block_role_compact if compact else block_role_full
++ sep = 7.0 if compact else 8.0
++ for i, role in enumerate(roles):
++ if i:
++ if draw:
++ hairline(c, x, y - sep / 2, x + w)
++ y -= sep
++ y -= fn(c, role, st, x, w, y, draw)
++ y -= CARD_PAD - 1
++ return y_top - y
++
++
++def block_projects(c, projects: list[dict], st: Styles, y_top: float, draw: bool) -> tuple[float, list[str]]:
++ """2 rows × 3 columns of small cards. Returns (height, truncated titles)."""
++ truncated: list[str] = []
++ y = y_top
++ if draw:
++ section_label(c, MARGIN, y, "Selected work", CONTENT_W)
++ y -= SECTION_LABEL_H
++ cols, gap, pad = 3, 8.0, 7.0
++ cw = (CONTENT_W - gap * (cols - 1)) / cols
++ inner = cw - 2 * pad
++ max_lines = 3
++ prepared = []
++ for pr in projects:
++ title = pr.get("title", "")
++ summary, trunc = truncate_to_lines(pr.get("summary", ""), st.proj_summary, inner, max_lines)
++ if trunc:
++ truncated.append(title)
++ url = (pr.get("links") or {}).get("live") if isinstance(pr.get("links"), dict) else None
++ prepared.append((title, summary, url))
++ title_h = st.proj_title.leading
++ sum_h = st.proj_summary.leading * max_lines
++ link_h = st.proj_link.leading
++ ch = pad + title_h + 2 + sum_h + 3 + link_h + pad
++ rows = (len(prepared) + cols - 1) // cols
++ if draw:
++ for i, (title, summary, url) in enumerate(prepared):
++ r, col = divmod(i, cols)
++ x = MARGIN + col * (cw + gap)
++ top = y - r * (ch + gap)
++ card(c, x, top, cw, ch)
++ ty = top - pad
++ tsize = st.proj_title.fontSize
++ while tsize > 7.4 and pdfmetrics.stringWidth(title, FONT["bold"], tsize) > inner:
++ tsize -= 0.2
++ c.setFillColor(INK)
++ c.setFont(FONT["bold"], tsize)
++ c.drawString(x + pad, ty - tsize * 0.78, title)
++ ty -= title_h + 2
++ draw_para(c, para(esc(summary), st.proj_summary), x + pad, ty, inner)
++ ty -= sum_h + 3
++ if url:
++ disp = re.sub(r"^https?://", "", url).rstrip("/")
++ iw = icon(c, x + pad, ty - st.proj_link.fontSize * 0.78, ICON["link"], 7.0, BLUE)
++ c.setFillColor(BLUE)
++ c.setFont(FONT["regular"], st.proj_link.fontSize)
++ c.drawString(x + pad + iw + 4, ty - st.proj_link.fontSize * 0.78, disp)
++ c.linkURL(url, (x, top - ch, x + cw, top), relative=0, thickness=0)
++ y -= rows * ch + (rows - 1) * gap
++ return y_top - y, truncated
++
++
++def block_skills(c, skills: list[dict], st: Styles, y_top: float, draw: bool) -> float:
++ x, w = MARGIN + CARD_PAD, CONTENT_W - 2 * CARD_PAD
++ y = y_top - CARD_PAD
++ if draw:
++ section_label(c, x, y, "Skills", w)
++ y -= SECTION_LABEL_H
++ row_gap = 2.8
++ for i, g in enumerate(skills):
++ items = [it["name"] for it in g.get("items", []) if it.get("name")]
++ label = f'<font name="{FONT["bold"]}" size="6.9" color="#0c1020">{esc(g["group"].upper())}</font>'
++ p = para(f"{label}&nbsp;&nbsp;&nbsp;{esc(' · '.join(items))}", st.skill_items)
++ h = para_height(p, w)
++ if draw:
++ if i:
++ hairline(c, x, y + row_gap / 2 + 0.5, x + w, BORDER, 0.4)
++ draw_para(c, p, x, y, w)
++ y -= h + row_gap
++ y -= CARD_PAD - row_gap
++ return y_top - y
++
++
++def block_education(c, profile: dict, st: Styles, y_top: float, draw: bool) -> float:
++ x, w = MARGIN + CARD_PAD, CONTENT_W - 2 * CARD_PAD
++ y = y_top - CARD_PAD
++ if draw:
++ section_label(c, x, y, "Education & links", w)
++ y -= SECTION_LABEL_H
++ p = para(esc(profile.get("education", "")), st.edu)
++ h = para_height(p, w)
++ if draw:
++ draw_para(c, p, x, y, w)
++ y -= h + 4
++ links = [
++ ("site", profile.get("siteDisplay"), profile.get("site")),
++ ("github", profile.get("githubDisplay"), profile.get("github")),
++ ("linkedin", profile.get("linkedinDisplay"), profile.get("linkedin")),
++ ("email", profile.get("emailDisplay"), f"mailto:{profile['email']}" if profile.get("email") else None),
++ ]
++ size, isize = 8.2, 7.8
++ base = y - size * 0.78
++ cx = x
++ if draw:
++ for key, text, url in links:
++ if not (text and url):
++ continue
++ iw = icon(c, cx, base, ICON[key], isize, BLUE)
++ c.setFillColor(BLUE)
++ c.setFont(FONT["regular"], size)
++ c.drawString(cx + iw + 4, base, text)
++ tw = iw + 4 + pdfmetrics.stringWidth(text, FONT["regular"], size)
++ c.linkURL(url, (cx, base - 2, cx + tw, base + size), relative=0, thickness=0)
++ cx += tw + 16
++ y = base - 2 - CARD_PAD
++ return y_top - y
++
++
++def footer(c, profile: dict, page: int, total: int, updated: str) -> None:
++ size = 7.4
++ base = 20.0
++ c.saveState()
++ c.setFillColor(MUTED)
++ c.setFont(FONT["regular"], size)
++ if page == total:
++ text = f"{profile['name']} · {profile.get('siteDisplay', '')} · updated {updated}"
++ c.drawString(MARGIN, base, text)
++ if profile.get("site"):
++ c.linkURL(profile["site"], (MARGIN, base - 2, MARGIN + pdfmetrics.stringWidth(text, FONT["regular"], size), base + size), relative=0, thickness=0)
++ else:
++ c.drawString(MARGIN, base, f"{profile['name']} · continued on page {page + 1}")
++ c.drawRightString(PAGE_W - MARGIN, base, f"{page} / {total}")
++ c.restoreState()
++
++
++# --------------------------------------------------------------------------
++# Page assembly
++# --------------------------------------------------------------------------
++MONTHS = {"jan": "January", "feb": "February", "mar": "March", "apr": "April", "may": "May", "jun": "June",
++ "jul": "July", "aug": "August", "sep": "September", "oct": "October", "nov": "November", "dec": "December"}
++
++
++def updated_label(pdf_name: str) -> str:
++ m = re.search(r"_([A-Za-z]{3})_(\d{4})\.pdf$", pdf_name)
++ if m and m.group(1).lower() in MONTHS:
++ return f"{MONTHS[m.group(1).lower()]} {m.group(2)}"
++ return _dt.date.today().strftime("%B %Y")
++
++
++def build(out_path: Path) -> dict:
++ data = load_content()
++ profile, experience, skills, projects = data["profile"], data["experience"], data["skills"], data["projects"]
++ st = Styles()
++ report: dict = {"truncated": [], "warnings": []}
++
++ c = _canvas.Canvas(str(out_path), pagesize=letter, pageCompression=1)
++ c.setTitle(f"{profile['name']} – Resume")
++ c.setAuthor(profile["name"])
++ c.setSubject(profile.get("tagline", ""))
++ c.setCreator("resume/build_resume.py (reportlab)")
++ c.setKeywords(", ".join(profile.get("roles", [])))
++ updated = updated_label(out_path.name)
++
++ def measured(fn, *args):
++ """Return (height, drawer) so the enclosing card can be drawn first."""
++ h = fn(c, *args, draw=False)
++ return h, (lambda: fn(c, *args, draw=True))
++
++ def check(y: float, what: str) -> None:
++ if y < BOTTOM:
++ report["warnings"].append(f"{what} overflows page bottom by {BOTTOM - y:.1f}pt")
++
++ # ---- Page 1 ----
++ page_background(c)
++ y = TOP
++ y -= block_header(c, profile, y, draw=True)
++ y -= 4
++ y -= block_metrics(c, pick_metrics(profile["metrics"]), st, y, draw=True)
++ y -= 10
++ h, drawer = measured(block_profile, profile, st, y)
++ card(c, MARGIN, y, CONTENT_W, h)
++ drawer()
++ y -= h + 10
++ h, drawer = measured(block_experience, experience[:FULL_ROLES], st, y, "Experience", False)
++ card(c, MARGIN, y, CONTENT_W, h)
++ drawer()
++ y -= h
++ check(y, "page 1 experience")
++ report["page1_bottom_gap"] = y - BOTTOM
++ footer(c, profile, 1, 2, updated)
++ c.showPage()
++
++ # ---- Page 2 ----
++ page_background(c)
++ y = TOP
++ h, drawer = measured(block_experience, experience[FULL_ROLES:], st, y, "Experience (continued)", True)
++ card(c, MARGIN, y, CONTENT_W, h)
++ drawer()
++ y -= h + 8
++ h, truncated = block_projects(c, projects, st, y, draw=True)
++ report["truncated"] = truncated
++ y -= h + 8
++ h, drawer = measured(block_skills, skills, st, y)
++ card(c, MARGIN, y, CONTENT_W, h)
++ drawer()
++ y -= h + 8
++ h, drawer = measured(block_education, profile, st, y)
++ card(c, MARGIN, y, CONTENT_W, h)
++ drawer()
++ y -= h
++ check(y, "page 2 education")
++ report["page2_bottom_gap"] = y - BOTTOM
++ footer(c, profile, 2, 2, updated)
++ c.showPage()
++ c.save()
++ return report
++
++
++def main() -> None:
++ register_fonts()
++ profile = json.loads((ROOT / "src/data/profile.json").read_text(encoding="utf-8"))
++ rel = profile.get("resumePdf", "/Alex_Frison_Resume.pdf").lstrip("/")
++ out = ROOT / "public" / rel
++ out.parent.mkdir(parents=True, exist_ok=True)
++ report = build(out)
++ size_kb = out.stat().st_size / 1024
++ print(f"wrote {out} ({size_kb:.1f} KB)")
++ print(f"text font: {FONT['label']}; icons: Font Awesome 4")
++ print(f"page 1 bottom gap: {report['page1_bottom_gap']:.1f}pt; page 2 bottom gap: {report['page2_bottom_gap']:.1f}pt")
++ if report["truncated"]:
++ print("truncated project summaries: " + ", ".join(report["truncated"]))
++ for w in report["warnings"]:
++ print("WARNING: " + w)
++ if report["warnings"]:
++ sys.exit(1)
++
++
++if __name__ == "__main__":
++ main()
ddiff --git a/resume/fonts/fontawesome-webfont.ttf b/resume/fonts/fontawesome-webfont.ttf
nnew file mode 100755
iindex 0000000..35acda2
BBinary files /dev/null and b/resume/fonts/fontawesome-webfont.ttf differ
ddiff --git a/scripts/fetch-vendor.mjs b/scripts/fetch-vendor.mjs
iindex 74e4d07..4360e29 100644
---- a/scripts/fetch-vendor.mjs
++++ b/scripts/fetch-vendor.mjs
@@@ -10,23 +10,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
const ROOT = join(__dirname, '..', 'public', 'assets', 'vendor');
const FILES = [
-- // GSAP 3.12.5 + ScrollTrigger (MIT-equivalent free for non-Club uses)
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js', 'gsap/gsap.min.js'],
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/ScrollTrigger.min.js', 'gsap/ScrollTrigger.min.js'],
-- // Lenis 1.1.13 (MIT)
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/lenis.min.js', 'lenis/lenis.min.js'],
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/lenis.css', 'lenis/lenis.css'],
-- // Splitting 1.0.6 (MIT)
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/splitting.min.js', 'splitting/splitting.min.js'],
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/splitting.css', 'splitting/splitting.css'],
-- ['https://cdn.jsdelivr.net/npm/[email protected]/dist/splitting-cells.css', 'splitting/splitting-cells.css'],
-- // tsparticles slim 3.5.0 (MIT)
-- ['https://cdn.jsdelivr.net/npm/@tsparticles/[email protected]/tsparticles.slim.bundle.min.js', 'tsparticles/tsparticles.slim.bundle.min.js'],
-- // Swiper 11.1.14 (MIT)
-- ['https://cdn.jsdelivr.net/npm/[email protected]/swiper-bundle.min.js', 'swiper/swiper-bundle.min.js'],
-- ['https://cdn.jsdelivr.net/npm/[email protected]/swiper-bundle.min.css', 'swiper/swiper-bundle.min.css'],
-- // Lottie-web 5.12.2 (MIT)
-- ['https://cdn.jsdelivr.net/npm/[email protected]/build/player/lottie_light.min.js', 'lottie/lottie_light.min.js'],
// Inter font (OFL)
['https://cdn.jsdelivr.net/npm/@fontsource/[email protected]/files/inter-latin-400-normal.woff2', 'fonts/inter-400.woff2'],
['https://cdn.jsdelivr.net/npm/@fontsource/[email protected]/files/inter-latin-600-normal.woff2', 'fonts/inter-600.woff2'],
@@@ -68,12 +51,8 @@ dependencies**. Re-fetch with \`npm run vendor:fetch\`.
| Library | Version | License |
|---|---|---|
--| GSAP + ScrollTrigger | 3.12.5 | GreenSock Standard "No Charge" License (free for non-commercial; see https://gsap.com/standard-license/) |
| Lenis | 1.1.13 | MIT |
--| Splitting.js | 1.0.6 | MIT |
--| tsparticles (slim) | 3.5.0 | MIT |
--| Swiper | 11.1.14 | MIT |
--| Lottie-web (light) | 5.12.2 | MIT |
++| Font Awesome Free (CSS + webfonts) | 6.x | CC BY 4.0 / SIL OFL 1.1 / MIT |
| Inter | 5.1.0 | SIL OFL 1.1 |
| Space Grotesk | 5.1.0 | SIL OFL 1.1 |
`);
ddiff --git a/src/components/Contact.astro b/src/components/Contact.astro
nnew file mode 100644
iindex 0000000..f3255d4
---- /dev/null
++++ b/src/components/Contact.astro
@@@ -0,0 +1,60 @@
++---
++import profile from "../data/profile.json";
++---
++<section class="section contact" id="contact" aria-labelledby="contact-title">
++ <div class="container">
++ <div class="ct card spot" data-reveal="scale">
++ <div class="ct__glow" aria-hidden="true"></div>
++ <div class="ct__grid">
++ <div>
++ <div class="sec-index">Contact</div>
++ <h2 class="ct__title" id="contact-title">Have a system that needs an <em class="grad-text">owner</em>?</h2>
++ <p class="ct__lead">{profile.availability}. I answer email fastest, and I'm happy to talk shop about streaming infra, identity, payments or whatever you're building.</p>
++ <div class="ct__actions">
++ <a class="btn btn--primary" href={`mailto:${profile.email}`} data-magnetic><i class="fa-solid fa-envelope"></i> {profile.emailDisplay}</a>
++ <button class="btn" data-copy={profile.email} data-magnetic><i class="fa-regular fa-copy"></i> <span>Copy email</span></button>
++ <a class="btn btn--ghost" href={`tel:${profile.phone}`} data-magnetic><i class="fa-solid fa-phone"></i> {profile.phoneDisplay}</a>
++ </div>
++ </div>
++ <ul class="ct__social">
++ <li><a href={profile.github} target="_blank" rel="me noopener"><i class="fa-brands fa-github"></i><span>GitHub</span><small>{profile.githubDisplay}</small></a></li>
++ <li><a href={profile.linkedin} target="_blank" rel="me noopener"><i class="fa-brands fa-linkedin-in"></i><span>LinkedIn</span><small>{profile.linkedinDisplay}</small></a></li>
++ <li><a href="https://openvibe.live" target="_blank" rel="noopener"><i class="fa-solid fa-tower-broadcast"></i><span>OpenVibe</span><small>openvibe.live</small></a></li>
++ <li><a href={profile.resumePdf}><i class="fa-solid fa-file-pdf"></i><span>Resume</span><small>PDF, two pages</small></a></li>
++ </ul>
++ </div>
++ </div>
++ </div>
++</section>
++
++<style>
++ .ct { overflow: hidden; padding: clamp(28px, 5vw, 60px); }
++ .ct__glow { position: absolute; inset: -40% -20% auto auto; width: 60%; aspect-ratio: 1; border-radius: 50%; background: radial-gradient(closest-side, rgba(var(--accent-rgb), .35), transparent 70%); filter: blur(30px); animation: breathe 9s ease-in-out infinite; pointer-events: none; }
++ @keyframes breathe { 50% { transform: scale(1.15) translate(-6%, 8%); opacity: .7; } }
++ .ct__grid { position: relative; display: grid; grid-template-columns: 1.3fr 1fr; gap: clamp(24px, 4vw, 56px); align-items: center; }
++ .ct__title { font-size: clamp(2rem, 4.4vw, 3.4rem); margin: 8px 0 14px; max-width: 16ch; }
++ .ct__lead { font-size: 1.05rem; max-width: 52ch; }
++ .ct__actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
++ .ct__social { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
++ .ct__social a {
++ display: grid; grid-template-columns: 44px 1fr; grid-template-rows: auto auto; column-gap: 14px; align-items: center;
++ padding: 12px 14px; border-radius: 16px; border: 1px solid var(--border); background: var(--surface);
++ color: var(--fg); text-decoration: none; transition: all .35s var(--ease);
++ }
++ .ct__social a:hover { border-color: rgba(var(--accent-rgb), .5); transform: translateX(6px); background: var(--surface-2); }
++ .ct__social i { grid-row: 1 / span 2; width: 44px; height: 44px; border-radius: 12px; display: inline-grid; place-items: center; font-size: 1.2rem; background: rgba(var(--accent-rgb), .12); color: var(--accent); }
++ .ct__social span { font-weight: 600; }
++ .ct__social small { color: var(--dim); font-family: var(--font-mono); font-size: .72rem; }
++ @media (max-width: 860px) { .ct__grid { grid-template-columns: 1fr; } }
++</style>
++
++<script>
++ document.querySelectorAll<HTMLButtonElement>('[data-copy]').forEach((b) => {
++ const label = b.querySelector('span')!;
++ b.addEventListener('click', async () => {
++ try { await navigator.clipboard.writeText(b.dataset.copy!); label.textContent = 'Copied!'; }
++ catch { label.textContent = b.dataset.copy!; }
++ setTimeout(() => (label.textContent = 'Copy email'), 1800);
++ });
++ });
++</script>
ddiff --git a/src/components/ContactBlock.astro b/src/components/ContactBlock.astro
ddeleted file mode 100644
iindex 703945d..0000000
---- a/src/components/ContactBlock.astro
++++ /dev/null
@@@ -1,162 +0,0 @@
-----
-----
--<section class="contact" id="contact">
-- <div class="container">
-- <div class="section-eyebrow"><i class="fa-solid fa-paper-plane"></i> Contact</div>
-- <h2 class="section-title">Let's connect</h2>
-- <div class="contact__grid">
-- <div class="card contact__card">
-- <p class="contact__lead">
-- Open to data analyst, software engineer, and platform builder roles &mdash;
-- Pacific Northwest, remote, or hybrid. Happy to talk tech, collaborate on
-- something interesting, or just say hi.
-- </p>
--
-- <div class="contact__direct">
-- <a class="contact__btn contact__btn--primary" href="mailto:[email protected]">
-- <i class="fa-solid fa-envelope"></i>
-- <span>[email protected]</span>
-- </a>
-- <a class="contact__btn" href="tel:+14253673997">
-- <i class="fa-solid fa-phone"></i>
-- <span>(425) 367-3997</span>
-- </a>
-- </div>
--
-- <div class="contact__social">
-- <a class="contact__social-btn contact__social-btn--github" href="https://github.com/OpenVibers" rel="me noopener" target="_blank">
-- <i class="fa-brands fa-github"></i>
-- <span>GitHub</span>
-- </a>
-- <a class="contact__social-btn contact__social-btn--linkedin" href="https://www.linkedin.com/in/fris/" rel="me noopener" target="_blank">
-- <i class="fa-brands fa-linkedin"></i>
-- <span>LinkedIn</span>
-- </a>
-- <a class="contact__social-btn contact__social-btn--steam" href="http://steamcommunity.com/id/HoboStreamer" rel="me noopener" target="_blank">
-- <i class="fa-brands fa-steam"></i>
-- <span>Steam</span>
-- </a>
-- </div>
-- </div>
-- </div>
-- </div>
--</section>
--
--<style>
-- .contact__grid { display: grid; }
--
-- .contact__lead {
-- font-size: 1.1rem;
-- line-height: 1.7;
-- color: var(--fg);
-- margin-bottom: 1.8rem;
-- }
--
-- /* Direct contact buttons */
-- .contact__direct {
-- display: flex;
-- gap: 14px;
-- flex-wrap: wrap;
-- margin-bottom: 2rem;
-- }
--
-- .contact__btn {
-- display: inline-flex;
-- align-items: center;
-- gap: 10px;
-- padding: 14px 24px;
-- border-radius: 12px;
-- font: 600 1rem var(--font-body);
-- text-decoration: none;
-- transition: all .2s var(--ease);
-- border: 2px solid var(--border);
-- color: var(--fg);
-- background: var(--bg-2);
-- }
-- .contact__btn i {
-- font-size: 1.15rem;
-- color: var(--accent);
-- }
-- .contact__btn--primary {
-- background: var(--accent);
-- color: #06221c;
-- border-color: var(--accent);
-- }
-- .contact__btn--primary i { color: #06221c; }
-- .contact__btn:hover {
-- transform: translateY(-2px);
-- box-shadow: 0 8px 24px rgba(76,201,176,.2);
-- text-decoration: none;
-- }
-- .contact__btn--primary:hover {
-- background: color-mix(in oklab, var(--accent) 85%, white);
-- border-color: color-mix(in oklab, var(--accent) 85%, white);
-- }
--
-- /* Social buttons */
-- .contact__social {
-- display: flex;
-- gap: 16px;
-- flex-wrap: wrap;
-- }
--
-- .contact__social-btn {
-- display: inline-flex;
-- align-items: center;
-- gap: 12px;
-- padding: 16px 28px;
-- border-radius: 14px;
-- font: 700 1.05rem var(--font-body);
-- text-decoration: none;
-- transition: all .2s var(--ease);
-- border: 2px solid transparent;
-- min-width: 150px;
-- justify-content: center;
-- }
-- .contact__social-btn i {
-- font-size: 1.6rem;
-- line-height: 1;
-- }
-- .contact__social-btn:hover {
-- transform: translateY(-3px);
-- text-decoration: none;
-- }
--
-- /* GitHub */
-- .contact__social-btn--github {
-- background: #24292e;
-- color: #fff;
-- border-color: #444d56;
-- }
-- .contact__social-btn--github:hover {
-- background: #2f363d;
-- box-shadow: 0 8px 24px rgba(0,0,0,.4);
-- }
--
-- /* LinkedIn */
-- .contact__social-btn--linkedin {
-- background: #0a66c2;
-- color: #fff;
-- border-color: #0a66c2;
-- }
-- .contact__social-btn--linkedin:hover {
-- background: #0b74d9;
-- box-shadow: 0 8px 24px rgba(10,102,194,.4);
-- }
--
-- /* Steam */
-- .contact__social-btn--steam {
-- background: linear-gradient(135deg, #1b2838, #2a475e);
-- color: #c7d5e0;
-- border-color: #4c6b84;
-- }
-- .contact__social-btn--steam:hover {
-- background: linear-gradient(135deg, #2a3f5f, #3d6d8e);
-- box-shadow: 0 8px 24px rgba(74,144,196,.3);
-- }
--
-- @media (max-width: 520px) {
-- .contact__social-btn { min-width: 130px; padding: 14px 20px; }
-- .contact__btn { padding: 12px 18px; font-size: .95rem; }
-- }
--</style>
ddiff --git a/src/components/ExperienceTimeline.astro b/src/components/ExperienceTimeline.astro
ddeleted file mode 100644
iindex 5603311..0000000
---- a/src/components/ExperienceTimeline.astro
++++ /dev/null
@@@ -1,81 +0,0 @@
-----
--import { getCollection } from "astro:content";
--const items = (await getCollection("experience"))
-- .sort((a, b) => a.data.order - b.data.order);
-----
--<section class="exp" id="experience">
-- <div class="container">
-- <div class="section-eyebrow"><i class="fa-solid fa-briefcase"></i> Experience</div>
-- <h2 class="section-title">A decade-plus of shipping</h2>
-- <ol class="exp__list">
-- {items.map((it) => (
-- <li class="exp__item card" data-reveal>
-- <div class="exp__dates">
-- <span class="exp__dot" aria-hidden="true"></span>
-- <span><i class="fa-regular fa-calendar-days"></i> {it.data.start} — {it.data.end ?? 'Present'}</span>
-- </div>
-- <div class="exp__body">
-- <h3>{it.data.role}</h3>
-- <div class="exp__company">
-- <i class="fa-solid fa-building"></i> {it.data.company}{it.data.location ? (<><i class="fa-solid fa-location-dot" style="margin-left:.5rem"></i> {it.data.location}</>) : ""}
-- </div>
-- <ul>{it.data.bullets.map((b) => <li>{b}</li>)}</ul>
-- {it.data.stack.length > 0 && (
-- <div class="exp__stack">
-- {it.data.stack.map((s) => <span class="chip">{s}</span>)}
-- </div>
-- )}
-- </div>
-- </li>
-- ))}
-- </ol>
-- </div>
--</section>
--
--<style>
-- .exp__list { list-style: none; padding: 0; margin: 0; display: grid; gap: 16px; }
-- .exp__item {
-- display: grid;
-- grid-template-columns: 200px 1fr;
-- gap: 24px;
-- align-items: start;
-- }
-- @media (max-width: 720px) {
-- .exp__item { grid-template-columns: 1fr; gap: 10px; }
-- }
-- .exp__dates {
-- display: flex;
-- flex-direction: column;
-- align-items: flex-start;
-- gap: 8px;
-- color: var(--muted);
-- font-family: var(--font-mono);
-- font-size: .8rem;
-- padding-top: 6px;
-- line-height: 1.6;
-- }
-- .exp__dot {
-- width: 9px; height: 9px; border-radius: 50%;
-- background: var(--accent);
-- box-shadow: 0 0 10px rgba(76,201,176,0.6), 0 0 24px rgba(76,201,176,0.25);
-- flex-shrink: 0;
-- }
-- .exp__body {
-- border-left: 2px solid rgba(76,201,176,0.15);
-- padding-left: 20px;
-- }
-- @media (max-width: 720px) {
-- .exp__body { border-left: none; padding-left: 0; border-top: 2px solid rgba(76,201,176,0.15); padding-top: 12px; }
-- }
-- .exp__body h3 {
-- font-family: var(--font-display);
-- font-size: 1.2rem; margin: 0 0 .3rem;
-- }
-- .exp__company { color: var(--accent); margin-bottom: .8rem; font-size: 0.9rem; font-weight: 600; }
-- .exp__body ul {
-- margin: 0 0 1rem; padding-left: 1.1rem;
-- color: var(--muted); line-height: 1.75;
-- }
-- .exp__body ul li { margin-bottom: 0.25rem; }
-- .exp__stack { display: flex; flex-wrap: wrap; gap: 6px; }
--</style>
ddiff --git a/src/components/Footer.astro b/src/components/Footer.astro
iindex 2460a44..641ff83 100644
---- a/src/components/Footer.astro
++++ b/src/components/Footer.astro
@@@ -1,68 +1,34 @@
---
++import profile from "../data/profile.json";
const year = new Date().getFullYear();
---
<footer class="foot">
<div class="container foot__inner">
<div class="foot__brand">
<span class="foot__name">Alex Frison</span>
-- <span class="foot__sub">&copy; {year} &middot; Built in the Pacific Northwest</span>
-- </div>
-- <div class="foot__links">
-- <a href="mailto:[email protected]" title="Email"><i class="fa-solid fa-envelope"></i> [email protected]</a>
-- <a href="tel:+14253673997" title="Phone"><i class="fa-solid fa-phone"></i> (425) 367-3997</a>
-- <a href="https://github.com/OpenVibers" rel="me noopener" target="_blank" title="GitHub"><i class="fa-brands fa-github"></i> GitHub</a>
-- <a href="https://www.linkedin.com/in/fris/" rel="me noopener" target="_blank" title="LinkedIn"><i class="fa-brands fa-linkedin"></i> LinkedIn</a>
++ <span class="foot__sub">&copy; {year} · Built and hosted from the Pacific Northwest · No trackers, no CDNs, no cookies</span>
</div>
++ <ul class="foot__links">
++ <li><a href={`mailto:${profile.email}`}><i class="fa-solid fa-envelope"></i> {profile.emailDisplay}</a></li>
++ <li><a href={`tel:${profile.phone}`}><i class="fa-solid fa-phone"></i> {profile.phoneDisplay}</a></li>
++ <li><a href={profile.github} target="_blank" rel="me noopener"><i class="fa-brands fa-github"></i> GitHub</a></li>
++ <li><a href={profile.linkedin} target="_blank" rel="me noopener"><i class="fa-brands fa-linkedin"></i> LinkedIn</a></li>
++ <li><a href="https://openvibe.live" target="_blank" rel="noopener"><i class="fa-solid fa-tower-broadcast"></i> OpenVibe</a></li>
++ <li><a href={profile.resumePdf}><i class="fa-solid fa-file-pdf"></i> Resume PDF</a></li>
++ </ul>
</div>
++ <div class="foot__line" aria-hidden="true"></div>
</footer>
++
<style>
-- .foot {
-- border-top: 1px solid var(--border);
-- padding: 40px 0;
-- color: var(--dim);
-- background: linear-gradient(to top, rgba(76,201,176,0.02), transparent);
-- }
-- .foot__inner {
-- display: flex;
-- justify-content: space-between;
-- align-items: center;
-- flex-wrap: wrap;
-- gap: 20px;
-- }
-- .foot__brand {
-- display: flex;
-- flex-direction: column;
-- gap: 3px;
-- }
-- .foot__name {
-- font-family: var(--font-display);
-- font-weight: 700;
-- font-size: 1rem;
-- color: var(--fg);
-- letter-spacing: -0.01em;
-- }
-- .foot__sub {
-- font-size: 0.8rem;
-- color: var(--muted);
-- }
-- .foot__links {
-- display: flex;
-- flex-wrap: wrap;
-- gap: 10px 24px;
-- align-items: center;
-- }
-- .foot a {
-- color: var(--muted);
-- font-size: 0.85rem;
-- display: inline-flex;
-- align-items: center;
-- gap: 6px;
-- transition: color .2s;
-- text-decoration: none;
-- }
-- .foot a:hover { color: var(--accent); }
-- .foot a i { font-size: 0.9em; }
-- @media (max-width: 540px) {
-- .foot__inner { flex-direction: column; align-items: flex-start; }
-- }
++ .foot { position: relative; z-index: 1; border-top: 1px solid var(--border); padding: 40px 0 34px; color: var(--dim); background: linear-gradient(to top, rgba(var(--accent-rgb), .04), transparent); }
++ .foot__inner { display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: 20px 32px; }
++ .foot__brand { display: flex; flex-direction: column; gap: 4px; }
++ .foot__name { font-family: var(--font-display); font-weight: 700; font-size: 1rem; color: var(--fg); }
++ .foot__sub { font-size: .8rem; color: var(--muted); max-width: 46ch; }
++ .foot__links { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px 22px; }
++ .foot__links a { color: var(--muted); font-size: .85rem; display: inline-flex; align-items: center; gap: 7px; text-decoration: none; transition: color .2s; }
++ .foot__links a:hover { color: var(--accent); }
++ .foot__line { position: absolute; left: 0; right: 0; top: -1px; height: 1px; background: var(--grad); opacity: .5; mask-image: linear-gradient(90deg, transparent, #000 30%, #000 70%, transparent); -webkit-mask-image: linear-gradient(90deg, transparent, #000 30%, #000 70%, transparent); }
++ @media (max-width: 560px) { .foot__inner { flex-direction: column; } }
</style>
ddiff --git a/src/components/Hero.astro b/src/components/Hero.astro
iindex ed57e17..732a6f6 100644
---- a/src/components/Hero.astro
++++ b/src/components/Hero.astro
@@@ -1,307 +1,276 @@
---
--// Pacific Northwest hero — layered SVG mountains, particles, animated title,
--// portrait slot, metrics ribbon.
++import profile from "../data/profile.json";
++const name = "Alex Frison";
++const words = name.split(" ");
++const offsets = words.map((_, i) => words.slice(0, i).join(" ").length + (i ? 1 : 0));
---
--<section class="hero" id="top">
-- <!-- Parallax mountain layers -->
-- <div class="hero__sky" aria-hidden="true"></div>
-- <div id="hero-particles" class="hero__particles" aria-hidden="true"></div>
--
-- <svg class="hero__mtn hero__mtn--3" viewBox="0 0 1440 600" preserveAspectRatio="none" aria-hidden="true">
-- <path d="M0,520 L120,360 L260,440 L420,300 L580,420 L740,280 L900,400 L1060,320 L1220,420 L1440,340 L1440,600 L0,600 Z" fill="#0c1a2c"/>
-- </svg>
-- <svg class="hero__mtn hero__mtn--2" viewBox="0 0 1440 600" preserveAspectRatio="none" aria-hidden="true">
-- <path d="M0,560 L160,440 L320,500 L500,380 L660,480 L820,360 L980,460 L1160,380 L1320,500 L1440,420 L1440,600 L0,600 Z" fill="#10243b"/>
-- </svg>
-- <svg class="hero__mtn hero__mtn--1" viewBox="0 0 1440 600" preserveAspectRatio="none" aria-hidden="true">
-- <path d="M0,580 L200,500 L380,540 L560,460 L760,520 L940,440 L1120,520 L1300,460 L1440,500 L1440,600 L0,600 Z" fill="#16314f"/>
-- </svg>
++<section class="hero" id="top" aria-labelledby="hero-title">
++ <canvas class="hero__aurora" id="aurora" aria-hidden="true"></canvas>
++ <div class="hero__veil" aria-hidden="true"></div>
<div class="container hero__grid">
-- <div class="hero__left">
-- <div class="section-eyebrow"><i class="fa-solid fa-location-dot"></i> Seattle · Arlington · Pacific Northwest</div>
-- <h1 class="hero__title" data-splitting>Alex Frison.</h1>
-- <p class="hero__role">
-- <span class="hero__rotator" aria-live="polite"><i class="fa-solid fa-chart-line"></i> Data Analyst</span>
++ <div class="hero__copy">
++ <p class="hero__status hero__in" style="--d:0ms">
++ <span class="live-dot" aria-hidden="true"></span>
++ <span>Now: contract engineer at <a href="https://powerchat.gg" target="_blank" rel="noopener">PowerChat</a> · building <a href="#network">OpenVibe</a></span>
</p>
-- <p class="hero__lead">
-- Data analyst and full-stack builder with 10+ years of shipping —
-- SOX-compliance tooling and autonomous AI agents at Amazon, a solo-built
-- 15-microservice creator platform, and sales leadership at Verizon.
-- Open to new roles.
++
++ <h1 class="hero__title" id="hero-title" aria-label={name}>
++ {words.map((w, wi) => (
++ <span class="hero__word" aria-hidden="true">
++ {Array.from(w).map((c, ci) => {
++ const i = offsets[wi] + ci;
++ const last = wi === words.length - 1 && ci === w.length - 1;
++ return <span class={`hero__ch ${last ? "hero__ch--last" : ""}`} style={`--i:${i}`}>{c}</span>;
++ })}
++ </span>
++ ))}
++ </h1>
++
++ <p class="hero__role" aria-live="polite">
++ <span class="hero__role-static">I'm a</span>
++ <span class="hero__rotator" id="rotator" data-roles={JSON.stringify(profile.roles)}>{profile.roles[0]}</span>
</p>
-- <div class="hero__cta">
-- <a href="/#work" class="btn btn--primary"><i class="fa-solid fa-eye"></i> View Work</a>
-- <a href="/Alex_Frison_Resume_May_2026_v2.pdf" class="btn" aria-label="Download resume as PDF"><i class="fa-solid fa-file-pdf"></i> PDF</a>
-- <a href="/#contact" class="btn"><i class="fa-solid fa-envelope"></i> Get in Touch</a>
-- </div>
-- <div class="hero__chips">
-- <span class="chip"><i class="fa-solid fa-chart-line"></i> Analytics / BI</span>
-- <span class="chip"><i class="fa-solid fa-code"></i> Full-Stack Eng</span>
-- <span class="chip"><i class="fa-solid fa-robot"></i> AI Agents</span>
-- <span class="chip"><i class="fa-solid fa-gear"></i> Robotics</span>
-- <span class="chip"><i class="fa-solid fa-users"></i> Sales & Leadership</span>
++
++ <p class="hero__lead hero__in" style="--d:650ms">
++ {profile.headline} Founder and sole engineer of the <strong>OpenVibe</strong> network: seven services, 20+ domains, live video, identity, media, 169 tools and a game, all designed, shipped and operated by me. Currently rebuilding <strong>PowerChat</strong>'s developer platform and payments.
++ </p>
++
++ <div class="hero__cta hero__in" style="--d:800ms">
++ <a href="#network" class="btn btn--primary" data-magnetic><i class="fa-solid fa-satellite-dish"></i> See the network <span class="btn__arrow">→</span></a>
++ <a href={profile.resumePdf} class="btn" data-magnetic><i class="fa-solid fa-file-pdf"></i> Resume PDF</a>
++ <a href="#contact" class="btn btn--ghost" data-magnetic><i class="fa-solid fa-paper-plane"></i> Get in touch</a>
</div>
++
++ <ul class="hero__tags hero__in" style="--d:950ms">
++ <li class="chip"><i class="fa-solid fa-tower-broadcast"></i> Streaming infra</li>
++ <li class="chip"><i class="fa-solid fa-id-badge"></i> OAuth2 / OIDC</li>
++ <li class="chip chip--ember"><i class="fa-solid fa-credit-card"></i> Payments</li>
++ <li class="chip"><i class="fa-solid fa-robot"></i> AI tooling</li>
++ <li class="chip chip--mint"><i class="fa-solid fa-server"></i> Ops & deploys</li>
++ <li class="chip"><i class="fa-solid fa-chart-line"></i> Analytics</li>
++ </ul>
</div>
-- <div class="hero__right">
-- <div class="hero__portrait">
-- <div class="hero__portrait-glow" aria-hidden="true"></div>
-- <div class="hero__portrait-frame">
-- <div class="hero__portrait-placeholder" role="img" aria-label="Portrait of Alex Frison">
-- <img src="/assets/img/me-cut1.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--a" id="portrait-a">
-- <img src="/assets/img/me-cut2.png" alt="Alex Frison" class="hero__portrait-img hero__portrait-img--b" id="portrait-b">
-- </div>
++ <div class="hero__visual hero__in hero__in--scale" style="--d:300ms">
++ <div class="portrait" data-tilt>
++ <div class="portrait__ring portrait__ring--a" aria-hidden="true"></div>
++ <div class="portrait__ring portrait__ring--b" aria-hidden="true"></div>
++ <div class="portrait__orbit" aria-hidden="true"><span></span></div>
++ <div class="portrait__frame">
++ <img src="/assets/img/me-cut1.png" alt="Portrait of Alex Frison" class="portrait__img is-on" id="portrait-a" width="889" height="1177" fetchpriority="high" />
++ <img src="/assets/img/me-cut2.png" alt="" class="portrait__img" id="portrait-b" width="829" height="1074" loading="lazy" />
++ <div class="portrait__scan" aria-hidden="true"></div>
</div>
++ <div class="portrait__tag portrait__tag--tl" aria-hidden="true"><i class="fa-solid fa-location-dot"></i> {profile.locationShort}</div>
++ <div class="portrait__tag portrait__tag--br" aria-hidden="true"><span class="live-dot"></span> Open to senior & founding roles</div>
</div>
</div>
</div>
--
++ <a href="#metrics" class="hero__scroll" aria-label="Scroll to content">
++ <span class="hero__mouse"><span></span></span>
++ <span class="hero__scroll-txt">scroll</span>
++ </a>
</section>
<style>
.hero {
-- position: relative;
-- min-height: 100vh;
++ position: relative; isolation: isolate; overflow: clip;
min-height: 100svh;
-- padding: clamp(80px, 12vh, 120px) 0 clamp(20px, 4vh, 60px);
-- overflow: hidden;
-- isolation: isolate;
-- }
-- .hero__sky {
-- position: absolute; inset: 0;
-- background:
-- radial-gradient(1200px 600px at 70% 10%, rgba(76,201,176,.18), transparent 60%),
-- radial-gradient(900px 500px at 20% 30%, rgba(244,162,97,.12), transparent 60%);
-- z-index: -3;
++ padding: calc(var(--nav-h) + clamp(40px, 8vh, 90px)) 0 clamp(60px, 8vh, 100px);
++ display: flex; align-items: center;
}
-- .hero__particles { position: absolute; inset: 0; z-index: -2; }
-- .hero__mtn {
-- position: absolute; left: 0; right: 0;
-- width: 100%; height: 60%;
-- bottom: 0;
-- z-index: -1;
-- will-change: transform;
-- }
-- .hero__mtn--3 { bottom: 12%; opacity: .6; }
-- .hero__mtn--2 { bottom: 6%; opacity: .8; }
-- .hero__mtn--1 { bottom: 0; opacity: 1; }
++ .hero__aurora { position: absolute; inset: 0; width: 100%; height: 100%; z-index: -2; filter: blur(52px) saturate(115%); opacity: .62; transform: scale(1.15); }
++ :root[data-theme="light"] .hero__aurora { opacity: .45; }
++ .hero__veil { position: absolute; inset: 0; z-index: -1; background: linear-gradient(180deg, rgba(7,9,15,.35) 0%, transparent 30%, transparent 55%, var(--bg) 100%), radial-gradient(60% 50% at 30% 45%, rgba(7,9,15,.35), transparent 70%); }
++ :root[data-theme="light"] .hero__veil { background: linear-gradient(180deg, transparent 55%, var(--bg) 100%); }
-- .hero__grid {
-- display: grid;
-- grid-template-columns: 1.4fr 1fr;
-- gap: clamp(24px, 4vw, 64px);
-- align-items: center;
-- min-height: 70svh;
-- }
-- /* min-width:0 prevents grid cells overflowing their track.
-- overflow:hidden ONLY on left — right needs visible overflow so portrait glow shows */
-- .hero__left { min-width: 0; overflow: hidden; }
-- .hero__right { display: grid; place-items: center; min-width: 0; }
-- @media (max-width: 880px) {
-- .hero__grid {
-- grid-template-columns: 1fr;
-- min-height: auto;
-- padding-bottom: 32px;
-- }
-- .hero__right { order: -1; }
-- .hero__portrait-frame { animation: none; }
-- .hero__portrait { width: min(220px, 55vw); margin-bottom: 8px; }
++ .hero__in { opacity: 0; animation: heroIn .9s var(--ease) forwards; animation-delay: var(--d, 0ms); }
++ .hero__in--scale { animation-name: heroInScale; }
++ @keyframes heroIn { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }
++ @keyframes heroInScale { from { opacity: 0; transform: scale(.94); } to { opacity: 1; transform: none; } }
++ .hero__grid { display: grid; grid-template-columns: 1.25fr .9fr; gap: clamp(28px, 5vw, 72px); align-items: center; width: 100%; }
++ .hero__copy { min-width: 0; }
++
++ .hero__status {
++ display: inline-flex; align-items: center; gap: 10px; margin: 0 0 22px;
++ padding: 8px 14px 8px 12px; border-radius: 999px;
++ background: var(--surface); border: 1px solid var(--border);
++ font-family: var(--font-mono); font-size: .78rem; color: var(--muted); letter-spacing: .01em;
++ backdrop-filter: blur(10px);
}
++ .hero__status a { color: var(--fg); }
-- /* Solid color on purpose — background-clip:text + color:transparent breaks
-- when Splitting.js wraps chars in inline-block spans (text renders invisible
-- on some GPUs/viewports, e.g. Steam Deck at 1280×800). Same bug class as the
-- earlier ImpactMetrics "invisible numbers" fix. */
.hero__title {
-- font-size: clamp(2.6rem, 7vw, 5.5rem);
-- color: var(--fg);
-- text-shadow: 0 2px 24px rgba(0, 0, 0, 0.35);
-- overflow-wrap: break-word;
-- margin-bottom: 0.4em;
-- }
-- .hero__role {
-- font-family: var(--font-display);
-- font-size: clamp(1.4rem, 5.5vw, 2.5rem);
-- color: var(--accent);
-- margin: 0 0 1rem;
-- height: 1.6em;
-- overflow: hidden;
-- contain: layout style;
++ margin: 0 0 .2em; font-size: clamp(3rem, 8.6vw, 6.9rem); line-height: .95; letter-spacing: -.04em;
++ display: flex; flex-wrap: wrap; column-gap: .22em;
}
-- .hero__rotator {
-- display: block;
-- white-space: nowrap;
-- overflow: hidden;
-- text-overflow: ellipsis;
-- width: 100%;
++ .hero__word { display: inline-flex; white-space: nowrap; }
++ .hero__ch {
++ display: inline-block; opacity: 0;
++ transform: translateY(.6em) rotate(6deg) scale(.9);
++ filter: blur(6px);
++ animation: chIn .9s var(--ease) forwards;
++ animation-delay: calc(var(--i) * 45ms + 120ms);
++ transition: color .3s;
}
-- .hero__lead {
-- max-width: 56ch;
-- color: var(--muted);
-- font-size: 1.06rem;
-- }
-- .hero__cta { display: flex; gap: 12px; flex-wrap: wrap; margin: 1.5rem 0; }
-- .hero__chips { display: flex; gap: 8px; flex-wrap: wrap; }
++ .hero__ch:hover { color: var(--accent); }
++ .hero__ch--last::after { content: "."; display: inline-block; color: transparent; background: var(--grad); -webkit-background-clip: text; background-clip: text; opacity: 0; animation: dotIn .8s var(--ease) forwards 1s; }
++ @keyframes chIn { to { opacity: 1; transform: none; filter: blur(0); } }
++ @keyframes dotIn { 0% { opacity: 0; transform: scale(0) translateY(.2em); } 60% { transform: scale(1.3); } 100% { opacity: 1; transform: none; } }
-- .hero__right { display: grid; place-items: center; min-width: 0; }
-- .hero__portrait {
-- position: relative;
-- width: min(400px, 44vw);
-- aspect-ratio: 5 / 6;
-- }
-- .hero__portrait-glow {
-- position: absolute; inset: -22%;
-- background: radial-gradient(closest-side, rgba(76,201,176,.42), transparent 70%);
-- filter: blur(32px);
-- animation: breathe 8s ease-in-out infinite;
-- pointer-events: none;
++ .hero__role {
++ display: flex; align-items: baseline; gap: .45em; flex-wrap: wrap;
++ margin: 0 0 1.2rem; font-family: var(--font-display); font-weight: 700;
++ font-size: clamp(1.35rem, 3.4vw, 2.2rem); letter-spacing: -.02em; color: var(--fg);
}
-- .hero__portrait-frame {
-- position: relative;
-- width: 100%; height: 100%;
-- border-radius: 28px;
-- overflow: hidden;
-- border: 1px solid var(--border-strong);
-- background: var(--surface);
-- box-shadow: var(--shadow-card), var(--shadow-glow);
-- animation: float 12s ease-in-out infinite;
++ .hero__role-static { color: var(--dim); font-weight: 500; }
++ .hero__rotator { color: var(--accent); min-height: 1.2em; }
++ .hero__rotator::after { content: "_"; margin-left: 2px; color: var(--accent-2); animation: caret 1s steps(2) infinite; }
++ @keyframes caret { 50% { opacity: 0; } }
++
++ .hero__lead { max-width: 58ch; font-size: clamp(1rem, 1.3vw, 1.12rem); color: var(--muted); }
++ .hero__cta { display: flex; gap: 12px; flex-wrap: wrap; margin: 1.6rem 0 1.4rem; }
++ .hero__tags { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
++
++ /* Portrait */
++ .hero__visual { display: grid; place-items: center; min-width: 0; }
++ .portrait { position: relative; width: min(400px, 78vw); aspect-ratio: 4 / 5; transition: transform .5s var(--ease); transform-style: preserve-3d; }
++ .portrait__frame {
++ position: absolute; inset: 0; border-radius: 34% 34% 28px 28px / 26% 26% 28px 28px;
++ overflow: hidden; background: var(--grad-soft); border: 1px solid var(--border-strong);
++ box-shadow: var(--shadow-card), inset 0 1px 0 rgba(255,255,255,.08);
}
-- .hero__portrait-placeholder { position: relative; width: 100%; height: 100%; overflow: hidden; }
-- .hero__portrait-img {
-- position: absolute;
-- inset: 0;
-- width: 100%;
-- height: 100%;
-- object-fit: cover;
-- object-position: top center;
-- display: block;
-- transition: opacity 0.8s ease;
++ .portrait__frame::before {
++ content: ""; position: absolute; inset: 0; z-index: 0;
++ background: radial-gradient(70% 60% at 50% 100%, rgba(var(--accent-rgb), .35), transparent 70%);
}
-- .hero__portrait-img--a { opacity: 1; }
-- .hero__portrait-img--b { opacity: 0; }
-- .hero__portrait-tag {
-- margin-top: 14px; text-align: center;
-- color: var(--dim); font-size: .8rem;
++ .portrait__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: top center; opacity: 0; transition: opacity 1s var(--ease); z-index: 1; }
++ .portrait__img.is-on { opacity: 1; }
++ .portrait__scan {
++ position: absolute; left: -10%; right: -10%; top: -20%; height: 18%; z-index: 2; pointer-events: none;
++ background: linear-gradient(180deg, transparent, rgba(var(--accent-3-rgb), .16), transparent);
++ animation: scan 7s var(--ease-io) infinite;
}
-- .hero__portrait-tag code {
-- color: var(--accent); font-family: var(--font-mono); font-size: .78rem;
++ @keyframes scan { 0%, 20% { top: -20%; } 60%, 100% { top: 110%; } }
++ .portrait__ring { position: absolute; inset: -8%; border-radius: 50%; border: 1px solid rgba(var(--accent-rgb), .25); z-index: -1; }
++ .portrait__ring--a { animation: spin 26s linear infinite; border-style: dashed; }
++ .portrait__ring--b { inset: -16%; border-color: rgba(var(--accent-2-rgb), .18); animation: spin 40s linear infinite reverse; }
++ .portrait__orbit { position: absolute; inset: -8%; border-radius: 50%; animation: spin 12s linear infinite; z-index: 3; pointer-events: none; }
++ .portrait__orbit span { position: absolute; top: -5px; left: 50%; width: 10px; height: 10px; margin-left: -5px; border-radius: 50%; background: var(--accent-3); box-shadow: 0 0 18px 4px rgba(var(--accent-3-rgb), .55); }
++ @keyframes spin { to { transform: rotate(360deg); } }
++ .portrait__tag {
++ position: absolute; z-index: 4; display: inline-flex; align-items: center; gap: 8px;
++ padding: 8px 12px; border-radius: 12px;
++ background: color-mix(in oklab, var(--bg) 70%, transparent); border: 1px solid var(--border);
++ backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
++ font: 500 .74rem var(--font-mono); color: var(--fg); white-space: nowrap;
++ box-shadow: var(--shadow-card);
++ animation: floaty 7s ease-in-out infinite;
}
++ .portrait__tag i { color: var(--accent-2); }
++ .portrait__tag--tl { top: 6%; left: -10%; }
++ .portrait__tag--br { bottom: 7%; right: -8%; animation-delay: -3.5s; }
++ @keyframes floaty { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-7px); } }
-- @keyframes breathe {
-- 0%, 100% { opacity: .55; transform: scale(1); }
-- 50% { opacity: .9; transform: scale(1.05); }
-- }
-- @keyframes float {
-- 0%, 100% { transform: translateY(0); }
-- 50% { transform: translateY(-6px); }
++ .hero__scroll {
++ position: absolute; left: 50%; bottom: 22px; transform: translateX(-50%);
++ display: flex; flex-direction: column; align-items: center; gap: 8px;
++ color: var(--dim); text-decoration: none; font: 500 .68rem var(--font-mono); letter-spacing: .3em; text-transform: uppercase;
++ opacity: 0; animation: fadeIn 1s ease forwards 1.6s;
}
++ .hero__scroll:hover { text-decoration: none; color: var(--fg); }
++ .hero__mouse { width: 22px; height: 34px; border-radius: 12px; border: 1.5px solid currentColor; display: grid; justify-content: center; padding-top: 6px; }
++ .hero__mouse span { width: 3px; height: 6px; border-radius: 2px; background: currentColor; animation: wheel 1.8s var(--ease) infinite; }
++ @keyframes wheel { 0% { transform: translateY(0); opacity: 1; } 100% { transform: translateY(12px); opacity: 0; } }
++ @keyframes fadeIn { to { opacity: 1; } }
--
++ @media (max-width: 920px) {
++ .hero { min-height: auto; padding-top: calc(var(--nav-h) + 30px); }
++ .hero__grid { grid-template-columns: 1fr; }
++ .hero__visual { order: -1; }
++ .portrait { width: min(280px, 70vw); }
++ .portrait__tag--tl { left: -4%; }
++ .portrait__tag--br { right: -4%; }
++ .hero__scroll { display: none; }
++ .hero__title { font-size: clamp(3rem, 15vw, 5rem); }
++ }
</style>
<script>
-- // Title char reveal via Splitting
-- const splitScript = document.createElement("script");
-- splitScript.src = "/assets/vendor/splitting/splitting.min.js";
-- splitScript.onload = () => {
-- // @ts-ignore
-- if (window.Splitting) Splitting();
-- document.querySelectorAll(".hero__title .char").forEach((c, i) => {
-- (c as HTMLElement).style.setProperty("--i", String(i));
-- });
-- };
-- document.head.appendChild(splitScript);
++ // ---- Aurora canvas: four drifting light blobs, pointer-parallaxed ----------
++ const cv = document.getElementById('aurora') as HTMLCanvasElement | null;
++ if (cv) {
++ const ctx = cv.getContext('2d')!;
++ const W = 180, H = 110; cv.width = W; cv.height = H;
++ const isLight = () => document.documentElement.dataset.theme === 'light';
++ const blobs = [
++ { x: .25, y: .35, r: .55, c: [79, 124, 255], s: .00021, p: 0 },
++ { x: .7, y: .3, r: .5, c: [139, 92, 246], s: .00017, p: 2 },
++ { x: .55, y: .8, r: .45, c: [255, 106, 61], s: .00015, p: 4 },
++ { x: .15, y: .85, r: .4, c: [62, 230, 176], s: .00019, p: 1 },
++ ];
++ let px = 0, py = 0, tpx = 0, tpy = 0, visible = true;
++ addEventListener('pointermove', (e) => { tpx = (e.clientX / innerWidth - .5); tpy = (e.clientY / innerHeight - .5); }, { passive: true });
++ new IntersectionObserver(([en]) => { visible = en.isIntersecting; }).observe(cv);
++ const draw = (t: number) => {
++ requestAnimationFrame(draw);
++ if (!visible) return;
++ px += (tpx - px) * .04; py += (tpy - py) * .04;
++ ctx.globalCompositeOperation = 'source-over';
++ ctx.fillStyle = isLight() ? '#f4f6fb' : '#07090f';
++ ctx.fillRect(0, 0, W, H);
++ ctx.globalCompositeOperation = isLight() ? 'multiply' : 'lighter';
++ for (const b of blobs) {
++ const x = (b.x + Math.sin(t * b.s + b.p) * .13 + px * .08) * W;
++ const y = (b.y + Math.cos(t * b.s * 1.3 + b.p) * .11 + py * .08) * H;
++ const r = b.r * W * (1 + Math.sin(t * b.s * .7 + b.p) * .12);
++ const g = ctx.createRadialGradient(x, y, 0, x, y, r);
++ const a = isLight() ? .3 : .42;
++ g.addColorStop(0, `rgba(${b.c[0]},${b.c[1]},${b.c[2]},${a})`);
++ g.addColorStop(1, `rgba(${b.c[0]},${b.c[1]},${b.c[2]},0)`);
++ ctx.fillStyle = g; ctx.beginPath(); ctx.arc(x, y, r, 0, Math.PI * 2); ctx.fill();
++ }
++ };
++ requestAnimationFrame(draw);
++ }
-- // Role rotator
-- const roles = [
-- `<i class="fa-solid fa-chart-line"></i> Data Analyst`,
-- `<i class="fa-solid fa-code"></i> Software Engineer`,
-- `<i class="fa-solid fa-robot"></i> AI Agent Builder`,
-- `<i class="fa-solid fa-server"></i> Systems Admin`,
-- `<i class="fa-solid fa-users"></i> Sales Leader`,
-- `<i class="fa-solid fa-tree"></i> Pacific Northwest Native`
-- ];
-- const rot = document.querySelector(".hero__rotator");
++ // ---- Role rotator with scramble effect ---------------------------------
++ const rot = document.getElementById('rotator');
if (rot) {
-- let i = 0;
-- setInterval(() => {
-- i = (i + 1) % roles.length;
-- (rot as HTMLElement).animate(
-- [{ opacity: 1, transform: "translateY(0) scale(1)" },
-- { opacity: 0, transform: "translateY(-10px) scale(0.96)" }],
-- { duration: 240, easing: "ease-in", fill: "forwards" }
-- ).onfinish = () => {
-- rot.innerHTML = roles[i];
-- (rot as HTMLElement).animate(
-- [{ opacity: 0, transform: "translateY(10px) scale(0.96)" },
-- { opacity: 1, transform: "translateY(0) scale(1)" }],
-- { duration: 300, easing: "cubic-bezier(0.22,1,0.36,1)", fill: "forwards" }
-- );
++ const roles: string[] = JSON.parse(rot.dataset.roles || '[]');
++ const glyphs = '!<>-_\\/[]{}—=+*^?#0123456789';
++ let i = 0, busy = false;
++ const scramble = (to: string) => new Promise<void>((res) => {
++ const from = rot.textContent || '';
++ const len = Math.max(from.length, to.length);
++ const q = Array.from({ length: len }, (_, k) => ({ from: from[k] || '', to: to[k] || '', start: Math.floor(Math.random() * 14), end: Math.floor(Math.random() * 14) + 14, ch: '' }));
++ let frame = 0;
++ const step = () => {
++ let out = '', done = 0;
++ for (const s of q) {
++ if (frame >= s.end) { done++; out += s.to; }
++ else if (frame >= s.start) { if (!s.ch || Math.random() < .28) s.ch = glyphs[Math.floor(Math.random() * glyphs.length)]; out += `<span class="scr">${s.ch}</span>`; }
++ else out += s.from;
++ }
++ rot.innerHTML = out;
++ if (done === q.length) res(); else { frame++; requestAnimationFrame(step); }
};
-- }, 2400);
-- }
--
-- // Portrait fade cycle (me-cut1 ↔ me-cut2, every 8s)
-- const imgA = document.getElementById("portrait-a") as HTMLImageElement | null;
-- const imgB = document.getElementById("portrait-b") as HTMLImageElement | null;
-- if (imgA && imgB) {
-- let showingA = true;
-- setInterval(() => {
-- showingA = !showingA;
-- imgA.style.opacity = showingA ? "1" : "0";
-- imgB.style.opacity = showingA ? "0" : "1";
-- }, 8000);
-- }
--
-- // Mountain parallax
-- const m1 = document.querySelector(".hero__mtn--1") as HTMLElement | null;
-- const m2 = document.querySelector(".hero__mtn--2") as HTMLElement | null;
-- const m3 = document.querySelector(".hero__mtn--3") as HTMLElement | null;
-- if (m1 && m2 && m3) {
-- let raf = 0;
-- const onScroll = () => {
-- const y = window.scrollY;
-- m1.style.transform = `translateY(${y * 0.06}px)`;
-- m2.style.transform = `translateY(${y * 0.12}px)`;
-- m3.style.transform = `translateY(${y * 0.20}px)`;
-- raf = 0;
-- };
-- window.addEventListener("scroll", () => {
-- if (!raf) raf = requestAnimationFrame(onScroll);
-- }, { passive: true });
++ step();
++ });
++ setInterval(async () => {
++ if (busy || document.hidden) return;
++ busy = true; i = (i + 1) % roles.length;
++ await scramble(roles[i]); busy = false;
++ }, 2800);
}
--
--
-- // tsparticles light rain/snow
-- const ps = document.createElement("script");
-- ps.src = "/assets/vendor/tsparticles/tsparticles.slim.bundle.min.js";
-- ps.onload = async () => {
-- // @ts-ignore
-- if (!window.tsParticles) return;
-- // @ts-ignore
-- await window.tsParticles.load({
-- id: "hero-particles",
-- options: {
-- fullScreen: { enable: false },
-- background: { color: "transparent" },
-- fpsLimit: 60,
-- particles: {
-- number: { value: 60, density: { enable: true, area: 900 } },
-- color: { value: ["#4cc9b0", "#7aa2f7", "#ffffff"] },
-- opacity: { value: { min: 0.15, max: 0.55 } },
-- size: { value: { min: 0.5, max: 1.8 } },
-- move: {
-- enable: true, speed: 0.6, direction: "bottom",
-- outModes: { default: "out" }, straight: false,
-- },
-- shape: { type: "circle" },
-- },
-- detectRetina: true,
-- },
-- });
-- };
-- document.head.appendChild(ps);
++ // ---- Portrait crossfade ---------------------------------------------------
++ const a = document.getElementById('portrait-a'), b = document.getElementById('portrait-b');
++ if (a && b) { let on = true; setInterval(() => { on = !on; a.classList.toggle('is-on', on); b.classList.toggle('is-on', !on); }, 7000); }
</script>
++
++<style is:global>
++ .hero__rotator .scr { color: var(--accent-2); opacity: .8; }
++</style>
ddiff --git a/src/components/ImpactMetrics.astro b/src/components/ImpactMetrics.astro
ddeleted file mode 100644
iindex 533b89c..0000000
---- a/src/components/ImpactMetrics.astro
++++ /dev/null
@@@ -1,75 +0,0 @@
-----
--const metrics = [
-- { num: "1,000+", label: "SOX-compliance IRDRs researched at Amazon", icon: "fa-solid fa-magnifying-glass-chart" },
-- { num: "15", label: "OpenVibe microservices built solo", icon: "fa-solid fa-cubes-stacked" },
-- { num: "200K+", label: "Live game servers tracked", icon: "fa-solid fa-tower-broadcast" },
-- { num: "20+", label: "Automation scripts for Amazon workflows", icon: "fa-solid fa-code" },
-- { num: "10+", label: "Years running my own LLC", icon: "fa-solid fa-building-flag" },
--];
-----
--<section class="impact" aria-labelledby="impact-title" data-reveal>
-- <div class="container">
-- <header class="impact__head">
-- <div class="section-eyebrow"><i class="fa-solid fa-bolt"></i> Impact at a glance</div>
-- <h2 id="impact-title" class="section-title">Real numbers from real work</h2>
-- </header>
-- <ul class="impact__grid">
-- {metrics.map(m => (
-- <li class="impact__card">
-- <i class={`${m.icon} impact__icon`} aria-hidden="true"></i>
-- <span class="impact__num">{m.num}</span>
-- <span class="impact__lbl">{m.label}</span>
-- </li>
-- ))}
-- </ul>
-- </div>
--</section>
--
--<style>
-- .impact { padding: clamp(40px, 6vw, 64px) 0 clamp(24px, 4vw, 40px); }
-- .impact__head { text-align: center; margin-bottom: clamp(20px, 3vw, 32px); }
-- .impact__head .section-title { margin: 0 auto; }
-- .impact__grid {
-- list-style: none; padding: 0; margin: 0;
-- display: grid;
-- grid-template-columns: repeat(5, 1fr);
-- gap: clamp(10px, 1.6vw, 18px);
-- }
-- @media (max-width: 980px) { .impact__grid { grid-template-columns: repeat(3, 1fr); } }
-- @media (max-width: 580px) { .impact__grid { grid-template-columns: repeat(2, 1fr); } }
-- .impact__card {
-- background: linear-gradient(180deg, var(--surface) 0%, color-mix(in srgb, var(--surface) 80%, transparent) 100%);
-- border: 1px solid var(--border);
-- border-radius: 16px;
-- padding: 20px 16px 18px;
-- display: flex; flex-direction: column; align-items: center; text-align: center;
-- gap: 8px;
-- position: relative;
-- transition: transform .25s ease, border-color .25s ease, box-shadow .25s ease;
-- }
-- .impact__card:hover {
-- transform: translateY(-4px);
-- border-color: rgba(76,201,176,0.35);
-- box-shadow: 0 12px 40px -12px rgba(76,201,176,0.3), 0 0 0 1px rgba(76,201,176,0.08);
-- }
-- .impact__icon {
-- font-size: 1.05rem;
-- color: var(--accent);
-- background: color-mix(in srgb, var(--accent) 14%, transparent);
-- width: 34px; height: 34px;
-- display: inline-flex; align-items: center; justify-content: center;
-- border-radius: 50%;
-- }
-- .impact__num {
-- font-family: var(--font-display);
-- font-size: clamp(1.7rem, 2.6vw, 2.1rem);
-- font-weight: 700;
-- color: var(--fg);
-- line-height: 1.05;
-- }
-- .impact__lbl {
-- font-size: .82rem;
-- color: var(--muted);
-- line-height: 1.35;
-- }
--</style>
ddiff --git a/src/components/Marquee.astro b/src/components/Marquee.astro
iindex 29f2f45..34ad5c9 100644
---- a/src/components/Marquee.astro
++++ b/src/components/Marquee.astro
@@@ -1,43 +1,31 @@
---
--const tech = [
-- "Python", "TypeScript", "Node.js", "SQL", "Anthropic", "OpenAI", "Machine Learning", "Electron", "React", "Vue",
-- "Lua", "C#", "Linux", "NGINX", "MongoDB", "Redis", "FFmpeg", "Excel", "PHP", "TamperMonkey",
-- "WebRTC", "PostgreSQL", "OAuth2 / OIDC", "Microservices", "Event-Driven Architecture", "WebSockets", "Canvas API",
--];
++const rowA = ["openvibe.live", "openvibe.network", "openvibe.media", "openvibe.tools", "openvibe.games", "openvibe.community", "openvibe.chat", "openvibe.codes", "openvibe.wiki", "openvibe.news", "openre.stream", "powerchat.gg"];
++const rowB = ["TypeScript", "Node.js", "mediasoup", "WebRTC", "RTMP / SRT / WHIP", "ffmpeg", "whisper.cpp", "OAuth2 / OIDC", "PostgreSQL", "SQLite", "Redis", "BullMQ", "Stripe", "Square", "PayPal", "nginx", "systemd", "Cloudflare R2", "Backblaze B2", "Babylon.js", "Havok", "React", "Prisma", "Python", "SQL", "Anthropic API"];
---
<div class="marquee" aria-hidden="true">
-- <div class="marquee__track">
-- {tech.concat(tech).map((t) => <span>{t}</span>)}
++ <div class="marquee__row marquee__row--a">
++ <div class="marquee__track">
++ {rowA.concat(rowA).map((t) => <span class="marquee__item marquee__item--dom"><i class="live-dot"></i>{t}</span>)}
++ </div>
++ </div>
++ <div class="marquee__row marquee__row--b">
++ <div class="marquee__track marquee__track--rev">
++ {rowB.concat(rowB).map((t) => <span class="marquee__item">{t}</span>)}
++ </div>
</div>
</div>
--<style is:global>
-- .marquee {
-- overflow: hidden;
-- border-block: 1px solid var(--border);
-- background: var(--surface);
-- backdrop-filter: blur(8px);
-- }
-- .marquee__track {
-- display: flex; gap: 0; padding: 16px 0;
-- width: max-content;
-- animation: scroll 80s linear infinite;
-- font-family: var(--font-mono);
-- color: var(--muted);
-- font-size: .88rem;
-- letter-spacing: 0.04em;
-- }
-- .marquee__track span {
-- white-space: nowrap;
-- padding: 0 28px;
-- border-right: 1px solid var(--border);
-- }
-- .marquee__track span:last-child { border-right: none; }
-- @media (hover: hover) {
-- .marquee:hover .marquee__track { animation-play-state: paused; }
-- }
-- @keyframes scroll {
-- from { transform: translateX(0); }
-- to { transform: translateX(-50%); }
-- }
++<style>
++ .marquee { position: relative; z-index: 1; overflow: hidden; border-block: 1px solid var(--border); background: color-mix(in oklab, var(--bg-2) 70%, transparent); backdrop-filter: blur(8px); mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); }
++ .marquee__row { overflow: hidden; }
++ .marquee__row--a { border-bottom: 1px dashed var(--border); }
++ .marquee__track { display: flex; width: max-content; padding: 14px 0; animation: scroll 70s linear infinite; }
++ .marquee__track--rev { animation-direction: reverse; animation-duration: 90s; }
++ .marquee:hover .marquee__track { animation-play-state: paused; }
++ .marquee__item { display: inline-flex; align-items: center; gap: 10px; padding: 0 26px; font: 500 .84rem var(--font-mono); color: var(--muted); letter-spacing: .03em; white-space: nowrap; border-right: 1px solid var(--border); transition: color .25s; }
++ .marquee__item:hover { color: var(--fg); }
++ .marquee__item--dom { color: var(--fg); font-weight: 600; }
++ .marquee__item--dom .live-dot { width: 6px; height: 6px; }
++ .marquee__item--dom .live-dot::after { display: none; }
++ @keyframes scroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
</style>
ddiff --git a/src/components/Metrics.astro b/src/components/Metrics.astro
nnew file mode 100644
iindex 0000000..277a1b2
---- /dev/null
++++ b/src/components/Metrics.astro
@@@ -0,0 +1,59 @@
++---
++import profile from "../data/profile.json";
++const metrics = profile.metrics;
++---
++<section class="metrics" id="metrics" aria-label="Numbers at a glance">
++ <div class="container">
++ <ul class="metrics__grid" data-stagger>
++ {metrics.map((m) => (
++ <li class="metric spot" data-tilt>
++ <i class={`${m.icon} metric__icon`} aria-hidden="true"></i>
++ <span class="metric__num"><span class="count" data-to={m.num}>0</span>{m.suffix}</span>
++ <span class="metric__lbl">{m.label}</span>
++ </li>
++ ))}
++ </ul>
++ </div>
++</section>
++
++<style>
++ .metrics { padding: clamp(24px, 4vw, 48px) 0 clamp(40px, 6vw, 80px); }
++ .metrics__grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
++ .metric {
++ position: relative; overflow: hidden;
++ display: flex; flex-direction: column; gap: 10px;
++ padding: 22px 20px 20px; border-radius: var(--radius);
++ background: var(--surface); border: 1px solid var(--border);
++ backdrop-filter: blur(12px);
++ transition: transform .5s var(--ease), border-color .3s var(--ease), box-shadow .5s var(--ease);
++ }
++ .metric:hover { border-color: rgba(var(--accent-rgb), .4); box-shadow: var(--shadow-glow); }
++ .metric::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--grad); transform: scaleX(0); transform-origin: 0 50%; transition: transform .6s var(--ease); }
++ .metric:hover::after { transform: scaleX(1); }
++ .metric__icon { width: 36px; height: 36px; display: inline-grid; place-items: center; border-radius: 10px; background: rgba(var(--accent-rgb), .12); color: var(--accent); font-size: .95rem; }
++ .metric__num { font-family: var(--font-display); font-weight: 700; font-size: clamp(1.9rem, 3vw, 2.5rem); letter-spacing: -.03em; color: var(--fg); line-height: 1; font-variant-numeric: tabular-nums; }
++ .metric__lbl { font-size: .84rem; color: var(--muted); line-height: 1.4; }
++ @media (max-width: 980px) { .metrics__grid { grid-template-columns: repeat(2, 1fr); } }
++ @media (max-width: 420px) { .metrics__grid { grid-template-columns: 1fr 1fr; gap: 8px; } .metric { padding: 16px 14px; } }
++</style>
++
++<script>
++ const fmt = (n: number) => n.toLocaleString('en-US');
++ const io = new IntersectionObserver((entries) => {
++ for (const en of entries) {
++ if (!en.isIntersecting) continue;
++ const el = en.target as HTMLElement;
++ const to = Number(el.dataset.to || 0);
++ const t0 = performance.now(), dur = 1400 + Math.min(800, to / 2);
++ const tick = (t: number) => {
++ const p = Math.min(1, (t - t0) / dur);
++ const e = 1 - Math.pow(1 - p, 4);
++ el.textContent = fmt(Math.round(to * e));
++ if (p < 1) requestAnimationFrame(tick);
++ };
++ requestAnimationFrame(tick);
++ io.unobserve(el);
++ }
++ }, { threshold: 0.4 });
++ document.querySelectorAll('.count').forEach((el) => io.observe(el));
++</script>
ddiff --git a/src/components/Nav.astro b/src/components/Nav.astro
iindex ac10206..132f493 100644
---- a/src/components/Nav.astro
++++ b/src/components/Nav.astro
@@@ -1,222 +1,184 @@
---
++import profile from "../data/profile.json";
const links = [
-- { href: "/#work", label: "Work", icon: "fa-solid fa-briefcase" },
-- { href: "/#experience", label: "Experience", icon: "fa-solid fa-clock-rotate-left" },
-- { href: "/#skills", label: "Skills", icon: "fa-solid fa-code" },
-- { href: "/portfolio", label: "Portfolio", icon: "fa-solid fa-folder-open" },
-- { href: "/resume", label: "Resume", icon: "fa-solid fa-file-lines" },
-- { href: "/#contact", label: "Contact", icon: "fa-solid fa-envelope" },
++ { href: "/#network", label: "OpenVibe", id: "network" },
++ { href: "/#work", label: "Work", id: "work" },
++ { href: "/#experience", label: "Experience", id: "experience" },
++ { href: "/#skills", label: "Skills", id: "skills" },
++ { href: "/resume", label: "Resume", id: "resume" },
++ { href: "/#contact", label: "Contact", id: "contact" },
];
++const path = Astro.url.pathname;
---
--<header class="nav">
-- <div class="container nav__row">
-- <a href="/" class="nav__brand">
-- <span class="nav__mark">AF</span>
++<header class="nav" id="nav">
++ <div class="nav__inner">
++ <a href="/" class="nav__brand" aria-label="Alex Frison, home">
++ <span class="nav__mark" aria-hidden="true">
++ <svg viewBox="0 0 40 40" width="34" height="34">
++ <defs><linearGradient id="nmg" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="var(--accent)"/><stop offset=".55" stop-color="var(--violet)"/><stop offset="1" stop-color="var(--accent-2)"/></linearGradient></defs>
++ <rect x="1" y="1" width="38" height="38" rx="11" fill="none" stroke="url(#nmg)" stroke-width="1.5"/>
++ <path d="M8 28 L14 12 L20 28 M10.4 22 h7.2" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
++ <path d="M24.5 28 V12 H32.5 M24.5 20 H31" fill="none" stroke="url(#nmg)" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
++ </svg>
++ </span>
<span class="nav__name">Alex Frison</span>
</a>
-- <!-- Desktop nav links (hidden on mobile) -->
-- <nav class="nav__desktop" aria-label="Primary">
-- <ul class="nav__links">
++ <nav class="nav__links" aria-label="Primary">
++ <ul>
{links.map((l) => (
-- <li><a href={l.href}><i class={l.icon}></i> {l.label}</a></li>
++ <li><a href={l.href} data-nav={l.id} aria-current={path.startsWith(`/${l.id}`) ? "page" : undefined}>{l.label}</a></li>
))}
++ <li class="nav__pill" aria-hidden="true"></li>
</ul>
</nav>
-- <!-- Right-side controls: theme toggle + hamburger -->
<div class="nav__end">
-- <button class="nav__toggle" data-theme-toggle aria-label="Toggle theme">
-- <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
++ <a class="nav__cta" href={profile.resumePdf} aria-label="Download resume PDF"><i class="fa-solid fa-arrow-down"></i><span>PDF</span></a>
++ <button class="nav__icon" data-theme-toggle aria-label="Toggle light and dark theme">
++ <i class="fa-solid fa-sun nav__sun"></i><i class="fa-solid fa-moon nav__moon"></i>
</button>
-- <button class="nav__burger" aria-label="Open navigation" aria-expanded="false" aria-controls="nav-drawer">
-- <i class="fa-solid fa-bars"></i>
++ <button class="nav__icon nav__burger" aria-label="Open navigation" aria-expanded="false" aria-controls="nav-drawer">
++ <span></span><span></span>
</button>
</div>
</div>
-- <!-- Mobile drawer (all links) -->
<div class="nav__drawer" id="nav-drawer" aria-hidden="true">
-- <nav aria-label="Mobile primary">
-- <ul class="nav__drawer-links">
-- {links.map((l) => (
-- <li><a href={l.href}><i class={l.icon}></i> {l.label}</a></li>
-- ))}
-- </ul>
-- </nav>
++ <ul>
++ {links.map((l, i) => (<li style={`--i:${i}`}><a href={l.href}>{l.label}</a></li>))}
++ <li style={`--i:${links.length}`}><a href={profile.resumePdf}>Download PDF</a></li>
++ </ul>
</div>
</header>
<style>
-- .nav {
-- position: sticky; top: 0; z-index: 50;
-- background: transparent;
-- border-bottom: 1px solid transparent;
-- backdrop-filter: none;
-- -webkit-backdrop-filter: none;
-- transition: background .4s ease, border-color .4s ease, box-shadow .4s ease;
-- will-change: background;
-- }
-- /* Frosted ice-glass on scroll */
-- .nav--scrolled {
-- backdrop-filter: blur(24px) saturate(180%);
-- -webkit-backdrop-filter: blur(24px) saturate(180%);
-- background: color-mix(in oklab, var(--bg) 68%, transparent);
-- border-bottom: 1px solid rgba(255, 255, 255, 0.07);
-- box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.04), 0 8px 40px rgba(0, 0, 0, 0.38);
-- }
-- /* Brighter links when floating over hero (transparent state) */
-- .nav:not(.nav--scrolled) .nav__links a {
-- color: rgba(230, 237, 243, 0.88);
-- }
-- .nav:not(.nav--scrolled) .nav__links a:hover {
-- color: #fff;
-- }
-- .nav:not(.nav--scrolled) .nav__brand {
-- color: var(--fg);
-- }
-- .nav:not(.nav--scrolled) .nav__toggle,
-- .nav:not(.nav--scrolled) .nav__burger {
-- border-color: rgba(255, 255, 255, 0.15);
-- color: rgba(230, 237, 243, 0.8);
-- }
-- .nav__row {
-- display: flex; align-items: center; gap: 16px;
-- padding: 14px 0;
-- }
--
-- /* Brand */
-- .nav__brand {
-- display: flex; align-items: center; gap: 10px;
-- color: var(--fg); text-decoration: none;
-- font-family: var(--font-display); font-weight: 700;
-- flex-shrink: 0;
-- margin-left:16px;
-- }
++ .nav { position: fixed; top: 0; left: 0; right: 0; z-index: 100; padding: 12px var(--gutter) 0; pointer-events: none; }
++ .nav__inner {
++ pointer-events: auto;
++ max-width: var(--container); margin: 0 auto;
++ display: flex; align-items: center; gap: 14px;
++ height: 58px; padding: 0 10px 0 12px;
++ border-radius: 999px;
++ border: 1px solid transparent;
++ transition: background .45s var(--ease), border-color .45s var(--ease), box-shadow .45s var(--ease), backdrop-filter .45s;
++ }
++ .nav.is-scrolled .nav__inner {
++ background: color-mix(in oklab, var(--bg) 62%, transparent);
++ border-color: var(--border);
++ backdrop-filter: blur(22px) saturate(160%);
++ -webkit-backdrop-filter: blur(22px) saturate(160%);
++ box-shadow: 0 10px 40px -18px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.05);
++ }
++ .nav__brand { display: inline-flex; align-items: center; gap: 10px; color: var(--fg); font-family: var(--font-display); font-weight: 700; letter-spacing: -.01em; text-decoration: none; flex: none; }
.nav__brand:hover { text-decoration: none; }
-- .nav__mark {
-- display: inline-grid; place-items: center;
-- width: 34px; height: 34px;
-- border-radius: 10px;
-- background: linear-gradient(135deg, var(--accent), var(--accent-3));
-- color: #06221c; font-size: 1.05rem; font-weight: 800; letter-spacing: -0.04em;
-- }
++ .nav__mark { display: inline-grid; place-items: center; color: var(--fg); transition: transform .5s var(--ease); }
++ .nav__brand:hover .nav__mark { transform: rotate(-8deg) scale(1.05); }
++ .nav__name { font-size: .98rem; }
-- /* Desktop nav — fills middle, centered */
-- .nav__desktop {
-- flex: 1;
-- display: flex;
-- justify-content: center;
-- }
-- .nav__links {
-- list-style: none; display: flex; gap: 22px;
-- margin: 0; padding: 0;
-- }
++ .nav__links { flex: 1; display: flex; justify-content: center; }
++ .nav__links ul { position: relative; list-style: none; margin: 0; padding: 4px; display: flex; gap: 2px; border-radius: 999px; }
.nav__links a {
-- color: var(--muted);
-- font: 500 0.92rem var(--font-body);
-- text-decoration: none;
-- transition: color .2s var(--ease);
-- display: inline-flex; align-items: center; gap: 5px;
-- white-space: nowrap;
++ position: relative; z-index: 1; display: inline-block; padding: 8px 14px; border-radius: 999px;
++ color: var(--muted); font: 500 .88rem var(--font-body); text-decoration: none; white-space: nowrap;
++ transition: color .25s var(--ease);
}
-- .nav__links a i { font-size: 0.82rem; opacity: 0.75; }
-- .nav__links a:hover { color: var(--fg); text-decoration: none; }
--
-- /* Right-side controls group — always floats right */
-- .nav__end {
-- display: flex; align-items: center; gap: 8px;
-- margin-left: auto;
-- flex-shrink: 0;
-- margin-right:20px;
++ .nav__links a:hover, .nav__links a.is-active, .nav__links a[aria-current="page"] { color: var(--fg); }
++ .nav__pill {
++ position: absolute; top: 4px; left: var(--px, 0); width: var(--pw, 0); height: calc(100% - 8px);
++ border-radius: 999px; background: var(--surface-2); border: 1px solid var(--border);
++ opacity: var(--po, 0);
++ transition: left .45s var(--ease), width .45s var(--ease), opacity .3s var(--ease);
}
-- /* Icon buttons (theme toggle + burger) */
-- .nav__toggle,
-- .nav__burger {
-- background: transparent; border: 1px solid var(--border);
-- color: var(--muted); padding: 8px; border-radius: 10px;
-- cursor: pointer; transition: all .2s var(--ease);
-- display: inline-grid; place-items: center;
-- width: 38px; height: 38px;
-- }
-- .nav__toggle:hover,
-- .nav__burger:hover { color: var(--fg); border-color: var(--border-strong); }
-- .nav__burger { font-size: 1rem; }
++ .nav__end { margin-left: auto; display: flex; align-items: center; gap: 6px; }
++ .nav__cta {
++ display: inline-flex; align-items: center; gap: 7px; padding: 8px 14px; border-radius: 999px;
++ background: var(--accent); color: #fff; font: 600 .82rem var(--font-body); text-decoration: none;
++ box-shadow: 0 8px 22px -10px rgba(var(--accent-rgb), .9);
++ transition: transform .3s var(--ease), box-shadow .3s var(--ease), filter .3s;
++ }
++ .nav__cta:hover { text-decoration: none; transform: translateY(-1px); filter: brightness(1.08); }
++ .nav__icon {
++ position: relative; width: 40px; height: 40px; border-radius: 50%; display: inline-grid; place-items: center;
++ background: transparent; border: 1px solid var(--border); color: var(--muted); cursor: pointer;
++ transition: color .25s, border-color .25s, background .25s;
++ }
++ .nav__icon:hover { color: var(--fg); border-color: var(--border-strong); background: var(--surface); }
++ .nav__sun, .nav__moon { grid-area: 1 / 1; transition: transform .5s var(--ease), opacity .3s; }
++ .nav__moon { opacity: 0; transform: rotate(-90deg) scale(.6); }
++ :root[data-theme="light"] .nav__sun { opacity: 0; transform: rotate(90deg) scale(.6); }
++ :root[data-theme="light"] .nav__moon { opacity: 1; transform: none; }
-- /* Hamburger hidden on desktop */
-- .nav__burger { display: none; }
++ .nav__burger { display: none; flex-direction: column; gap: 5px; }
++ .nav__burger span { display: block; width: 16px; height: 1.6px; background: currentColor; border-radius: 2px; transition: transform .35s var(--ease), opacity .3s; }
++ .nav__burger[aria-expanded="true"] span:first-child { transform: translateY(3.3px) rotate(45deg); }
++ .nav__burger[aria-expanded="true"] span:last-child { transform: translateY(-3.3px) rotate(-45deg); }
-- /* Mobile drawer */
.nav__drawer {
-- overflow: hidden;
-- max-height: 0;
-- transition: max-height 0.3s var(--ease);
-- border-top: 1px solid transparent;
-- background: color-mix(in oklab, var(--bg) 94%, transparent);
-- backdrop-filter: blur(16px);
-- -webkit-backdrop-filter: blur(16px);
-- }
-- .nav__drawer.is-open {
-- max-height: 360px;
-- border-top-color: var(--border);
-- }
-- .nav__drawer-links {
-- list-style: none;
-- display: flex; flex-direction: column;
-- margin: 0; padding: 10px 0 14px;
-- gap: 2px;
-- }
-- .nav__drawer-links a {
-- display: flex; align-items: center; gap: 10px;
-- padding: 10px clamp(16px, 3vw, 28px);
-- color: var(--muted);
-- font: 500 0.95rem var(--font-body);
-- text-decoration: none;
-- transition: color .15s var(--ease), background .15s var(--ease);
-- border-radius: 8px;
-- }
-- .nav__drawer-links a i { font-size: 0.88rem; opacity: 0.75; width: 16px; text-align: center; }
-- .nav__drawer-links a:hover { color: var(--fg); background: var(--surface); }
++ pointer-events: auto;
++ max-width: var(--container); margin: 8px auto 0;
++ border-radius: var(--radius-lg); overflow: hidden;
++ background: color-mix(in oklab, var(--bg) 84%, transparent);
++ border: 1px solid transparent;
++ backdrop-filter: blur(22px); -webkit-backdrop-filter: blur(22px);
++ max-height: 0; transition: max-height .45s var(--ease), border-color .3s;
++ }
++ .nav__drawer.is-open { max-height: 420px; border-color: var(--border); }
++ .nav__drawer ul { list-style: none; margin: 0; padding: 10px; display: flex; flex-direction: column; }
++ .nav__drawer li { opacity: 0; transform: translateY(8px); transition: opacity .4s var(--ease), transform .4s var(--ease); transition-delay: calc(var(--i) * 40ms); }
++ .nav__drawer.is-open li { opacity: 1; transform: none; }
++ .nav__drawer a { display: block; padding: 12px 14px; border-radius: 12px; color: var(--fg); font: 600 1.05rem var(--font-display); text-decoration: none; }
++ .nav__drawer a:hover { background: var(--surface-2); }
-- /* Breakpoints */
-- @media (max-width: 860px) {
-- .nav__links { gap: 14px; }
-- .nav__links a { font-size: 0.86rem; }
-- }
-- @media (max-width: 680px) {
-- /* Hide desktop nav, show hamburger */
-- .nav__desktop { display: none; }
-- .nav__burger { display: inline-grid; }
++ @media (max-width: 900px) { .nav__links a { padding: 8px 10px; font-size: .84rem; } }
++ @media (max-width: 760px) {
++ .nav__links { display: none; }
++ .nav__burger { display: inline-flex; }
.nav__name { display: none; }
}
</style>
<script>
-- const burger = document.querySelector<HTMLButtonElement>('.nav__burger');
-- const drawer = document.getElementById('nav-drawer');
--
-- burger?.addEventListener('click', () => {
-- const open = drawer?.classList.toggle('is-open');
++ const nav = document.getElementById('nav')!;
++ const burger = nav.querySelector<HTMLButtonElement>('.nav__burger')!;
++ const drawer = document.getElementById('nav-drawer')!;
++ const setOpen = (open: boolean) => {
++ drawer.classList.toggle('is-open', open);
burger.setAttribute('aria-expanded', String(open));
-- drawer?.setAttribute('aria-hidden', String(!open));
-- });
++ drawer.setAttribute('aria-hidden', String(!open));
++ };
++ burger.addEventListener('click', () => setOpen(!drawer.classList.contains('is-open')));
++ drawer.querySelectorAll('a').forEach((a) => a.addEventListener('click', () => setOpen(false)));
-- // Close drawer when a link inside is clicked
-- drawer?.querySelectorAll('a').forEach(a => {
-- a.addEventListener('click', () => {
-- drawer.classList.remove('is-open');
-- burger?.setAttribute('aria-expanded', 'false');
-- drawer.setAttribute('aria-hidden', 'true');
-- });
-- });
++ const onScroll = () => nav.classList.toggle('is-scrolled', scrollY > 24);
++ addEventListener('scroll', onScroll, { passive: true }); onScroll();
-- // Scroll-linked transparent → frosted glass
-- const navEl = document.querySelector('.nav') as HTMLElement | null;
-- const updateNav = () => {
-- const hero = document.querySelector('.hero');
-- navEl?.classList.toggle('nav--scrolled', window.scrollY > 40 || !hero);
++ // Sliding pill follows the active section
++ const list = nav.querySelector<HTMLUListElement>('.nav__links ul');
++ const anchors = Array.from(nav.querySelectorAll<HTMLAnchorElement>('.nav__links a[data-nav]'));
++ const movePill = (a: HTMLAnchorElement | null) => {
++ if (!list) return;
++ if (!a) { list.style.setProperty('--po', '0'); return; }
++ const lr = list.getBoundingClientRect(), ar = a.getBoundingClientRect();
++ list.style.setProperty('--px', `${ar.left - lr.left}px`);
++ list.style.setProperty('--pw', `${ar.width}px`);
++ list.style.setProperty('--po', '1');
};
-- window.addEventListener('scroll', updateNav, { passive: true });
-- updateNav();
++ anchors.forEach((a) => a.addEventListener('mouseenter', () => movePill(a)));
++ list?.addEventListener('mouseleave', () => movePill(anchors.find((a) => a.classList.contains('is-active')) || null));
++
++ const sections = ['top', ...anchors.map((a) => a.dataset.nav!)].map((id) => document.getElementById(id)).filter(Boolean) as HTMLElement[];
++ if (sections.length) {
++ const spy = new IntersectionObserver((entries) => {
++ const vis = entries.filter((e) => e.isIntersecting).sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0];
++ if (!vis) return;
++ const id = vis.target.id === 'top' ? '' : vis.target.id;
++ anchors.forEach((a) => a.classList.toggle('is-active', a.dataset.nav === id));
++ movePill(anchors.find((a) => a.dataset.nav === id) || null);
++ }, { rootMargin: '-35% 0px -55% 0px', threshold: [0, 0.2, 0.5] });
++ sections.forEach((s) => spy.observe(s));
++ } else {
++ movePill(anchors.find((a) => a.getAttribute('aria-current') === 'page') || null);
++ }
</script>
ddiff --git a/src/components/Network.astro b/src/components/Network.astro
nnew file mode 100644
iindex 0000000..66644b5
---- /dev/null
++++ b/src/components/Network.astro
@@@ -0,0 +1,171 @@
++---
++import profile from "../data/profile.json";
++const sites = profile.network;
++const big = sites[0];
++const rest = sites.slice(1);
++const icons: Record<string, string> = {
++ live: "fa-solid fa-tower-broadcast", network: "fa-solid fa-id-badge", media: "fa-solid fa-photo-film",
++ tools: "fa-solid fa-toolbox", games: "fa-solid fa-gamepad", community: "fa-solid fa-comments", sites: "fa-solid fa-globe",
++};
++// Architecture diagram geometry (viewBox 800 x 420)
++const hub = { x: 400, y: 210 };
++const nodes = [
++ { key: "live", label: "Live", x: 130, y: 90 },
++ { key: "media", label: "Media", x: 130, y: 330 },
++ { key: "tools", label: "Tools", x: 400, y: 50 },
++ { key: "games", label: "Games", x: 400, y: 372 },
++ { key: "community", label: "Community", x: 670, y: 90 },
++ { key: "sites", label: "13 Sites", x: 670, y: 330 },
++];
++const edges = [
++ ["live", "media"],
++];
++---
++<section class="section network" id="network" aria-labelledby="network-title">
++ <div class="container">
++ <div class="sec-head">
++ <span class="sec-num" aria-hidden="true">02</span>
++ <div>
++ <div class="sec-index">The OpenVibe network</div>
++ <h2 class="sec-title" id="network-title">Seven services. One sign-in. <em>One engineer.</em></h2>
++ </div>
++ <p class="sec-lead">An open, community-run streaming and tools network I started in 2022 and re-architected in 2026. Every service below is designed, built, deployed and operated by me, and every one is live.</p>
++ </div>
++
++ <div class="bento">
++ <a class="tile tile--big spot" href={big.url} target="_blank" rel="noopener" data-reveal data-tilt style={`--img:url(${big.image})`}>
++ <div class="tile__shot" aria-hidden="true"><img src={big.image} alt="" loading="lazy" width="1120" height="700" /></div>
++ <div class="tile__body">
++ <div class="tile__top">
++ <span class="tile__icon"><i class={icons[big.key]}></i></span>
++ <span class="tile__role">{big.role}</span>
++ </div>
++ <h3 class="tile__name">{big.name}</h3>
++ <p class="tile__blurb">{big.blurb}</p>
++ <div class="tile__foot"><span class="tile__stat mono">{big.stat}</span><span class="tile__go">Open <i class="fa-solid fa-arrow-up-right-from-square"></i></span></div>
++ </div>
++ </a>
++
++ {rest.map((s, i) => (
++ <a class={`tile spot tile--${s.key}`} href={s.url} target="_blank" rel="noopener" data-reveal data-delay={String(60 * (i + 1))} data-tilt>
++ {s.image && <div class="tile__shot" aria-hidden="true"><img src={s.image} alt="" loading="lazy" width="1120" height="700" /></div>}
++ <div class="tile__body">
++ <div class="tile__top">
++ <span class="tile__icon"><i class={icons[s.key]}></i></span>
++ <span class="tile__role">{s.role}</span>
++ </div>
++ <h3 class="tile__name">{s.name}</h3>
++ <p class="tile__blurb">{s.blurb}</p>
++ <div class="tile__foot"><span class="tile__stat mono">{s.stat}</span><span class="tile__go">Open <i class="fa-solid fa-arrow-up-right-from-square"></i></span></div>
++ </div>
++ </a>
++ ))}
++ </div>
++
++ <div class="arch card" data-reveal>
++ <div class="arch__copy">
++ <div class="eyebrow">How it fits together</div>
++ <h3>Identity in the middle, contracts between everything.</h3>
++ <p>OpenVibe.Network is the OIDC provider and wallet. Every other service verifies RS256 tokens offline against its cached key set, calls Media over a signed multi-tenant API, and renders the same shared navbar, themes and notifications. Contracts are written down before code moves, and legacy domains 301 into the new network so no link ever died.</p>
++ <ul class="arch__facts">
++ <li><i class="fa-solid fa-check"></i> Zero-downtime deploys via systemd socket activation</li>
++ <li><i class="fa-solid fa-check"></i> Local → B2 → R2 media tiering with presigned playback</li>
++ <li><i class="fa-solid fa-check"></i> Budget-metered, provider-agnostic AI jobs</li>
++ <li><i class="fa-solid fa-check"></i> Dry-run-first migrations, three-window cutover runbook</li>
++ </ul>
++ </div>
++ <svg class="arch__svg" viewBox="0 0 800 420" role="img" aria-label="Diagram: OpenVibe.Network at the center connected to Live, Media, Tools, Games, Community and 13 static sites; Live also talks to Media.">
++ <defs>
++ <linearGradient id="agrad" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="var(--accent)"/><stop offset="1" stop-color="var(--accent-2)"/></linearGradient>
++ <filter id="aglow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="6" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
++ </defs>
++ {nodes.map((n) => (
++ <g class="arch__edge">
++ <line x1={hub.x} y1={hub.y} x2={n.x} y2={n.y} class="arch__line" />
++ <line x1={hub.x} y1={hub.y} x2={n.x} y2={n.y} class="arch__pulse" />
++ </g>
++ ))}
++ {edges.map(([a, b]) => { const A = nodes.find(n => n.key === a)!, B = nodes.find(n => n.key === b)!; return (
++ <g class="arch__edge arch__edge--side"><line x1={A.x} y1={A.y} x2={B.x} y2={B.y} class="arch__line" /><line x1={A.x} y1={A.y} x2={B.x} y2={B.y} class="arch__pulse arch__pulse--slow" /></g>
++ ); })}
++ <g class="arch__hub" transform={`translate(${hub.x} ${hub.y})`}>
++ <circle r="58" class="arch__hub-glow" filter="url(#aglow)" />
++ <circle r="46" class="arch__hub-ring" />
++ <circle r="40" class="arch__hub-fill" />
++ <text y="-4" text-anchor="middle" class="arch__hub-t1">OpenVibe</text>
++ <text y="14" text-anchor="middle" class="arch__hub-t2">.Network</text>
++ <text y="30" text-anchor="middle" class="arch__hub-t3">OIDC · wallet · chrome</text>
++ </g>
++ {nodes.map((n) => (
++ <g class="arch__node" transform={`translate(${n.x} ${n.y})`}>
++ <rect x="-62" y="-22" width="124" height="44" rx="12" class="arch__node-box" />
++ <text y="5" text-anchor="middle" class="arch__node-t">{n.label}</text>
++ </g>
++ ))}
++ </svg>
++ </div>
++ </div>
++</section>
++
++<style>
++ .bento { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: minmax(210px, auto); gap: 14px; margin-bottom: 18px; }
++ .tile {
++ position: relative; overflow: hidden; display: flex; flex-direction: column; justify-content: flex-end;
++ min-height: 210px; border-radius: var(--radius-lg); text-decoration: none; color: var(--fg);
++ background: var(--surface); border: 1px solid var(--border);
++ transition: transform .5s var(--ease), border-color .35s var(--ease), box-shadow .5s var(--ease);
++ will-change: transform;
++ }
++ .tile:hover { text-decoration: none; border-color: rgba(var(--accent-rgb), .45); box-shadow: var(--shadow-card), var(--shadow-glow); }
++ .tile--big { grid-column: span 2; grid-row: span 2; min-height: 440px; }
++ .tile__shot { position: absolute; inset: 0; z-index: 0; overflow: hidden; }
++ .tile__shot img { width: 100%; height: 100%; object-fit: cover; object-position: top; opacity: .28; transform: scale(1.04); transition: transform 1.2s var(--ease), opacity .6s var(--ease), filter .6s; filter: saturate(.8); }
++ .tile:hover .tile__shot img { opacity: .55; transform: scale(1) translateY(-2%); filter: saturate(1.05); }
++ .tile__shot::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(7,9,15,.1) 0%, rgba(7,9,15,.55) 45%, rgba(7,9,15,.96) 100%); }
++ :root[data-theme="light"] .tile__shot::after { background: linear-gradient(180deg, rgba(244,246,251,.2) 0%, rgba(244,246,251,.7) 45%, rgba(244,246,251,.98) 100%); }
++ .tile__body { position: relative; z-index: 1; padding: clamp(18px, 2.4vw, 26px); display: flex; flex-direction: column; gap: 8px; }
++ .tile__top { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; }
++ .tile__icon { width: 34px; height: 34px; border-radius: 10px; display: inline-grid; place-items: center; background: rgba(var(--accent-rgb), .14); color: var(--accent); font-size: .9rem; border: 1px solid rgba(var(--accent-rgb), .2); }
++ .tile__role { font-family: var(--font-mono); font-size: .7rem; letter-spacing: .12em; text-transform: uppercase; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
++ .tile__foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 6px; }
++ .tile__stat { font-size: .7rem; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
++ .tile__name { margin: 0; font-size: clamp(1.1rem, 1.6vw, 1.45rem); letter-spacing: -.02em; overflow-wrap: anywhere; }
++ .tile--big .tile__name { font-size: clamp(1.8rem, 3vw, 2.6rem); }
++ .tile__blurb { margin: 0; font-size: .92rem; color: var(--muted); line-height: 1.55; max-width: 52ch; }
++ .tile__go { display: inline-flex; align-items: center; gap: 8px; flex: none; font: 600 .8rem var(--font-mono); color: var(--accent); opacity: 0; transform: translateY(6px); transition: opacity .35s var(--ease), transform .35s var(--ease); }
++ .tile:hover .tile__go { opacity: 1; transform: none; }
++ .tile--community, .tile--sites { grid-column: span 2; }
++ .tile--sites { background: var(--grad-soft); }
++ .tile--sites::before { content: ""; position: absolute; inset: 0; background: radial-gradient(60% 60% at 80% 20%, rgba(var(--accent-2-rgb), .25), transparent 70%); }
++ @media (max-width: 1024px) { .bento { grid-template-columns: repeat(2, 1fr); } .tile--big { grid-column: span 2; grid-row: span 1; min-height: 360px; } .tile--community, .tile--sites { grid-column: span 1; } }
++ @media (max-width: 560px) { .bento { grid-template-columns: 1fr; } .tile--big, .tile--community, .tile--sites { grid-column: span 1; } .tile--big { min-height: 320px; } }
++
++ /* Architecture */
++ .arch { display: grid; grid-template-columns: .9fr 1.1fr; gap: clamp(20px, 4vw, 48px); align-items: center; padding: clamp(22px, 3.5vw, 40px); }
++ .arch__copy h3 { font-size: clamp(1.3rem, 2.2vw, 1.8rem); margin-bottom: .6em; }
++ .arch__facts { list-style: none; margin: 14px 0 0; padding: 0; display: grid; gap: 8px; }
++ .arch__facts li { display: flex; gap: 10px; align-items: flex-start; color: var(--muted); font-size: .9rem; }
++ .arch__facts i { color: var(--accent-3); margin-top: 4px; font-size: .75rem; }
++ .arch__svg { width: 100%; height: auto; overflow: visible; }
++ .arch__line { stroke: var(--border-strong); stroke-width: 1.2; }
++ .arch__pulse { stroke: url(#agrad); stroke-width: 2; stroke-linecap: round; stroke-dasharray: 14 200; animation: pulse 3.2s linear infinite; opacity: .9; }
++ .arch__pulse--slow { animation-duration: 4.4s; animation-delay: -1s; }
++ .arch__edge:nth-child(2) .arch__pulse { animation-delay: -.6s; }
++ .arch__edge:nth-child(3) .arch__pulse { animation-delay: -1.2s; }
++ .arch__edge:nth-child(4) .arch__pulse { animation-delay: -1.8s; }
++ .arch__edge:nth-child(5) .arch__pulse { animation-delay: -2.4s; }
++ .arch__edge:nth-child(6) .arch__pulse { animation-delay: -3s; }
++ @keyframes pulse { from { stroke-dashoffset: 214; } to { stroke-dashoffset: -214; } }
++ .arch__hub-glow { fill: rgba(var(--accent-rgb), .16); animation: hubGlow 3s ease-in-out infinite; }
++ @keyframes hubGlow { 50% { fill: rgba(var(--accent-rgb), .3); } }
++ .arch__hub-ring { fill: none; stroke: url(#agrad); stroke-width: 1.5; stroke-dasharray: 6 8; animation: ringSpin 30s linear infinite; transform-origin: center; transform-box: fill-box; }
++ @keyframes ringSpin { to { transform: rotate(360deg); } }
++ .arch__hub-fill { fill: var(--surface-solid); stroke: var(--border-strong); }
++ .arch__hub-t1 { font: 700 15px var(--font-display); fill: var(--fg); }
++ .arch__hub-t2 { font: 700 13px var(--font-display); fill: var(--accent); }
++ .arch__hub-t3 { font: 500 8px var(--font-mono); fill: var(--dim); letter-spacing: .06em; }
++ .arch__node-box { fill: var(--surface-solid); stroke: var(--border-strong); transition: stroke .3s, fill .3s; }
++ .arch__node:hover .arch__node-box { stroke: var(--accent); }
++ .arch__node-t { font: 600 13px var(--font-body); fill: var(--fg); }
++ @media (max-width: 900px) { .arch { grid-template-columns: 1fr; } }
++</style>
ddiff --git a/src/components/Now.astro b/src/components/Now.astro
nnew file mode 100644
iindex 0000000..962c560
---- /dev/null
++++ b/src/components/Now.astro
@@@ -0,0 +1,62 @@
++---
++import profile from "../data/profile.json";
++---
++<section class="section now" id="about" aria-labelledby="now-title">
++ <div class="container">
++ <div class="sec-head">
++ <span class="sec-num" aria-hidden="true">01</span>
++ <div>
++ <div class="sec-index">Profile</div>
++ <h2 class="sec-title" id="now-title">Full-stack, then <em>full-ops</em>.</h2>
++ </div>
++ <p class="sec-lead">{profile.tagline} I do not hand things off: I design them, ship them, deploy them and answer for them in production.</p>
++ </div>
++
++ <div class="now__grid">
++ <article class="card spot now__pitch" data-reveal>
++ <p class="now__text">{profile.pitch}</p>
++ <p class="now__text">Ten years of running my own company taught me to care about the whole loop: the SQL, the socket, the nginx config, the invoice and the person on the other end. I like small teams, hard problems and code that stays up.</p>
++ <div class="now__cta">
++ <a href="#experience" class="btn btn--ghost">Experience <span class="btn__arrow">→</span></a>
++ <a href="/portfolio" class="btn btn--ghost">All projects <span class="btn__arrow">→</span></a>
++ </div>
++ </article>
++
++ <aside class="now__side">
++ <div class="card spot now__status" data-reveal data-delay="100">
++ <div class="now__status-head"><span class="live-dot"></span><span class="eyebrow">Right now</span></div>
++ <ul class="now__status-list">
++ <li><i class="fa-solid fa-bolt"></i><span>{profile.status.now}</span></li>
++ <li><i class="fa-solid fa-satellite-dish"></i><span>{profile.status.also}</span></li>
++ <li><i class="fa-solid fa-location-dot"></i><span>{profile.location}</span></li>
++ </ul>
++ </div>
++ <div class="card spot now__seeking" data-reveal data-delay="200">
++ <div class="eyebrow">Open to</div>
++ <ul class="now__seek">
++ {profile.seeking.map((s) => (<li><strong>{s.label}</strong><span>{s.detail}</span></li>))}
++ </ul>
++ </div>
++ </aside>
++ </div>
++ </div>
++</section>
++
++<style>
++ .now__grid { display: grid; grid-template-columns: 1.35fr 1fr; gap: 18px; align-items: start; }
++ .now__pitch { padding: clamp(24px, 3.5vw, 40px); }
++ .now__text { font-size: 1.08rem; line-height: 1.8; color: var(--muted); }
++ .now__text:first-child { color: var(--fg); font-size: clamp(1.1rem, 1.6vw, 1.3rem); font-weight: 500; line-height: 1.6; letter-spacing: -.005em; }
++ .now__cta { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
++ .now__side { display: grid; gap: 18px; }
++ .now__status-head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
++ .now__status-list, .now__seek { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
++ .now__status-list li { display: flex; gap: 12px; color: var(--muted); font-size: .94rem; line-height: 1.55; }
++ .now__status-list i { color: var(--accent); margin-top: 4px; width: 16px; text-align: center; flex: none; }
++ .now__seek { margin-top: 12px; }
++ .now__seek li { display: grid; gap: 2px; padding: 10px 0; border-top: 1px solid var(--border); }
++ .now__seek li:first-child { border-top: 0; padding-top: 0; }
++ .now__seek strong { color: var(--fg); font-size: .95rem; }
++ .now__seek span { color: var(--muted); font-size: .86rem; }
++ @media (max-width: 900px) { .now__grid { grid-template-columns: 1fr; } }
++</style>
ddiff --git a/src/components/ProjectCarousel.astro b/src/components/ProjectCarousel.astro
ddeleted file mode 100644
iindex df814bb..0000000
---- a/src/components/ProjectCarousel.astro
++++ /dev/null
@@@ -1,138 +0,0 @@
-----
--import { getCollection } from "astro:content";
--const all = await getCollection("projects", ({ data }) => data.featured);
--const featured = all.sort((a, b) => a.data.order - b.data.order);
-----
--<section class="featured" id="work">
-- <div class="container">
-- <div class="section-eyebrow"><i class="fa-solid fa-star"></i> Featured Work</div>
-- <h2 class="section-title">Things I've shipped</h2>
-- <p class="featured__lead">
-- A rotating gallery of the products, tools, and agents I've built —
-- from Amazon ICQA analytics to the Hobo Network creator stack.
-- </p>
--
-- <div class="swiper featured-swiper">
-- <div class="swiper-wrapper">
-- {featured.map((p) => (
-- <div class="swiper-slide">
-- <a href={`/portfolio/${p.slug}`} class="featured-card card" data-reveal>
-- <div class="featured-card__media">
-- {p.data.image ? (
-- <img src={p.data.image} alt={p.data.title} loading="lazy" decoding="async" />
-- ) : (
-- <div class="featured-card__placeholder">
-- <span>{p.data.title}</span>
-- </div>
-- )}
-- </div>
-- <div class="featured-card__body">
-- <span class="chip">{p.data.category}</span>
-- <h3>{p.data.title}</h3>
-- <p>{p.data.summary}</p>
-- <ul class="featured-card__tech">
-- {p.data.tech.slice(0, 5).map((t) => <li>{t}</li>)}
-- </ul>
-- <div class="featured-card__cta">
-- <span><i class="fa-solid fa-arrow-up-right-from-square"></i> View Project</span>
-- </div>
-- </div>
-- </a>
-- </div>
-- ))}
-- </div>
-- <div class="swiper-pagination"></div>
-- <div class="swiper-button-prev"></div>
-- <div class="swiper-button-next"></div>
-- </div>
-- </div>
--</section>
--
--<style>
-- .featured__lead { max-width: 60ch; }
-- .featured-swiper {
-- margin-top: 2rem;
-- padding: 20px 0 60px;
-- --swiper-theme-color: var(--accent);
-- }
-- .featured-card {
-- display: grid;
-- grid-template-rows: 220px auto;
-- height: 100%;
-- overflow: hidden;
-- color: var(--fg);
-- text-decoration: none;
-- }
-- .featured-card:hover { text-decoration: none; }
-- .featured-card__media {
-- position: relative;
-- background: linear-gradient(135deg, #14253b, #0f1a2b);
-- border-radius: 14px;
-- overflow: hidden;
-- margin: -8px -8px 18px;
-- }
-- .featured-card__media img {
-- width: 100%; height: 100%; object-fit: cover;
-- }
-- .featured-card__placeholder {
-- display: grid; place-items: center;
-- width: 100%; height: 100%;
-- font-family: var(--font-display);
-- font-size: 1.4rem;
-- color: var(--muted);
-- background:
-- radial-gradient(circle at 30% 30%, rgba(76,201,176,.25), transparent 60%),
-- radial-gradient(circle at 70% 70%, rgba(122,162,247,.25), transparent 60%),
-- var(--bg-3);
-- }
-- .featured-card__body h3 {
-- margin: .6rem 0 .4rem;
-- font-size: 1.4rem;
-- }
-- .featured-card__tech {
-- list-style: none; padding: 0; margin: 1rem 0 0;
-- display: flex; gap: 6px; flex-wrap: wrap;
-- }
-- .featured-card__tech li {
-- font: 500 .72rem var(--font-mono);
-- color: var(--dim);
-- border: 1px solid var(--border);
-- border-radius: 6px;
-- padding: 2px 8px;
-- }
-- .featured-card__cta {
-- margin-top: 1rem;
-- font: 600 0.85rem var(--font-body);
-- color: var(--accent);
-- display: flex;
-- align-items: center;
-- gap: 6px;
-- }
-- .featured-card__cta i { font-size: 0.8rem; }
--</style>
--
--<script>
-- const swiperScript = document.createElement("script");
-- swiperScript.src = "/assets/vendor/swiper/swiper-bundle.min.js";
-- swiperScript.onload = () => {
-- // @ts-ignore
-- new window.Swiper(".featured-swiper", {
-- slidesPerView: 1.05,
-- spaceBetween: 18,
-- centeredSlides: false,
-- loop: true,
-- grabCursor: true,
-- simulateTouch: true,
-- touchStartPreventDefault: false,
-- autoplay: { delay: 3000, disableOnInteraction: false, pauseOnMouseEnter: false },
-- pagination: { el: ".swiper-pagination", clickable: true },
-- navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev" },
-- keyboard: { enabled: true },
-- breakpoints: {
-- 640: { slidesPerView: 2, spaceBetween: 22 },
-- 1024: { slidesPerView: 3, spaceBetween: 26 },
-- },
-- });
-- };
-- document.head.appendChild(swiperScript);
--</script>
ddiff --git a/src/components/ProjectGrid.astro b/src/components/ProjectGrid.astro
iindex 60a759b..ca52ae4 100644
---- a/src/components/ProjectGrid.astro
++++ b/src/components/ProjectGrid.astro
@@@ -1,148 +1,140 @@
---
import { getCollection } from "astro:content";
--const all = (await getCollection("projects"))
-- .sort((a, b) => a.data.order - b.data.order);
--const cats = ["all", ...new Set(all.map((p) => p.data.category))];
--
--const catIcon: Record<string, string> = {
-- amazon: "fa-brands fa-aws",
-- hobo: "fa-solid fa-campground",
-- python: "fa-brands fa-python",
-- game: "fa-solid fa-gamepad",
-- hardware: "fa-solid fa-microchip",
-- web: "fa-solid fa-globe",
-- "3d": "fa-solid fa-cube",
-- tools: "fa-solid fa-screwdriver-wrench",
--};
--const filterIcon: Record<string, string> = {
-- all: "fa-solid fa-border-all",
-- ...catIcon,
++interface Props { limit?: number; showHead?: boolean; id?: string; }
++const { limit, showHead = true, id = "work" } = Astro.props;
++const all = (await getCollection("projects")).sort((a, b) => a.data.order - b.data.order);
++const projects = limit ? all.filter((p) => p.data.featured).slice(0, limit) : all;
++const catLabel: Record<string, string> = {
++ openvibe: "OpenVibe", powerchat: "PowerChat", amazon: "Amazon", ai: "AI", infra: "Infra & ops",
++ game: "Games", tools: "Tools", python: "Python", hardware: "Hardware", web: "Web",
};
++const cats = Array.from(new Set(projects.map((p) => p.data.category)));
---
--<section class="grid-sec" id="portfolio">
++<section class={`section work`} id={id} aria-labelledby={`${id}-title`}>
<div class="container">
-- <div class="section-eyebrow"><i class="fa-solid fa-layer-group"></i> Portfolio</div>
-- <h2 class="section-title">All work</h2>
-- <div class="filters" role="tablist">
-- {cats.map((c, i) => (
-- <button class={`filter ${i === 0 ? "is-active" : ""}`} data-filter={c} role="tab">
-- {filterIcon[c] && <i class={filterIcon[c]}></i>}{c}
-- </button>
++ {showHead && (
++ <div class="sec-head">
++ <span class="sec-num" aria-hidden="true">03</span>
++ <div>
++ <div class="sec-index">Selected work</div>
++ <h2 class="sec-title" id={`${id}-title`}>Things I <em>shipped</em>, not slides about them.</h2>
++ </div>
++ <p class="sec-lead">Platform programs at PowerChat, the OpenVibe services, the AI and analytics tooling I built at Amazon, and a few side projects that kept the tools sharp.</p>
++ </div>
++ )}
++
++ <div class="filters" role="tablist" aria-label="Filter projects" data-reveal>
++ <button class="filter is-active" data-filter="all" role="tab" aria-selected="true">All <span class="filter__n">{projects.length}</span></button>
++ {cats.map((c) => (
++ <button class="filter" data-filter={c} role="tab" aria-selected="false">{catLabel[c] ?? c} <span class="filter__n">{projects.filter((p) => p.data.category === c).length}</span></button>
))}
</div>
-- <div class="proj-grid">
-- {all.map((p) => (
-- <a href={`/portfolio/${p.slug}`} class="proj card" data-cat={p.data.category} data-reveal>
-- <div class="proj__head">
-- <span class={`chip chip--${p.data.category}`}>
-- {catIcon[p.data.category] && <i class={catIcon[p.data.category]}></i>}
-- {p.data.category}
-- </span>
-- {p.data.year && (
-- <span class="proj__year">
-- <i class="fa-regular fa-calendar"></i> {p.data.year}
-- </span>
-- )}
-- </div>
-- <h3>{p.data.title}</h3>
-- <p>{p.data.summary}</p>
-- <ul class="proj__tech">
-- {p.data.tech.slice(0, 4).map((t) => <li><i class="fa-solid fa-tag"></i>{t}</li>)}
-- </ul>
-- <div class="proj__cta">
-- <i class="fa-solid fa-arrow-up-right-from-square"></i> View Project
++
++ <ul class="pgrid" data-stagger>
++ {projects.map((p) => (
++ <li class={`pcard spot cat-${p.data.category} ${p.data.image ? "has-img" : ""}`} data-cat={p.data.category} data-tilt>
++ <a href={`/portfolio/${p.slug}`} class="pcard__link" aria-label={`${p.data.title}: ${p.data.summary}`}></a>
++ {p.data.image ? (
++ <div class="pcard__img" aria-hidden="true"><img src={p.data.image} alt="" loading="lazy" width="800" height="500" /></div>
++ ) : (
++ <div class="pcard__deco" aria-hidden="true"><i class={p.data.icon ?? "fa-solid fa-cube"}></i><span class="pcard__deco-grid"></span></div>
++ )}
++ <div class="pcard__body">
++ <div class="pcard__top">
++ <span class="pcard__icon"><i class={p.data.icon ?? "fa-solid fa-cube"}></i></span>
++ <span class="pcard__cat">{catLabel[p.data.category] ?? p.data.category}</span>
++ {p.data.year && <span class="pcard__year mono">{p.data.year}</span>}
++ </div>
++ <h3 class="pcard__title">{p.data.title}</h3>
++ <p class="pcard__sum">{p.data.summary}</p>
++ <ul class="pcard__tech">
++ {p.data.tech.slice(0, 4).map((t) => <li>{t}</li>)}
++ {p.data.tech.length > 4 && <li class="more">+{p.data.tech.length - 4}</li>}
++ </ul>
++ <div class="pcard__foot">
++ <span class="pcard__more">Case notes <span class="btn__arrow">→</span></span>
++ {p.data.links?.live && <a class="pcard__ext" href={p.data.links.live} target="_blank" rel="noopener" aria-label={`Open ${p.data.title} live`}><i class="fa-solid fa-arrow-up-right-from-square"></i></a>}
++ </div>
</div>
-- </a>
++ </li>
))}
-- </div>
++ </ul>
++
++ {limit && (
++ <div class="work__all" data-reveal>
++ <a href="/portfolio" class="btn" data-magnetic>All {all.length} projects <span class="btn__arrow">→</span></a>
++ </div>
++ )}
</div>
</section>
<style>
-- .filters { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 1.6rem; }
++ .filters { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 26px; }
.filter {
-- display: inline-flex; align-items: center; gap: 6px;
-- padding: 6px 14px; border-radius: 999px;
-- border: 1px solid var(--border);
-- background: transparent; color: var(--muted);
-- font: 500 .82rem var(--font-mono);
-- cursor: pointer;
-- text-transform: capitalize;
-- transition: all .2s var(--ease);
++ display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; border-radius: 999px;
++ background: transparent; border: 1px solid var(--border); color: var(--muted); cursor: pointer;
++ font: 500 .84rem var(--font-body); transition: all .3s var(--ease);
}
-- .filter i { font-size: 0.78rem; }
.filter:hover { color: var(--fg); border-color: var(--border-strong); }
-- .filter.is-active { background: var(--accent); color: #06221c; border-color: transparent; }
++ .filter.is-active { background: var(--fg); color: var(--bg); border-color: var(--fg); }
++ .filter__n { font-family: var(--font-mono); font-size: .7rem; opacity: .7; }
-- .proj-grid {
-- display: grid; gap: 18px;
-- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
++ .pgrid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
++ .pcard {
++ position: relative; overflow: hidden; display: flex; flex-direction: column;
++ border-radius: var(--radius-lg); background: var(--surface); border: 1px solid var(--border);
++ transition: transform .5s var(--ease), border-color .35s var(--ease), box-shadow .5s var(--ease), opacity .4s var(--ease);
++ will-change: transform;
}
-- .proj {
-- display: flex; flex-direction: column;
-- color: var(--fg); text-decoration: none;
-- transition: transform .3s var(--ease), border-color .3s var(--ease);
-- }
-- .proj:hover { text-decoration: none; transform: translateY(-4px); border-color: var(--accent); }
-- .proj:hover .proj__cta { color: var(--accent); gap: 8px; }
-- .proj.is-hidden { display: none; }
-- .proj__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: .8rem; }
-- .proj__year {
-- color: var(--dim); font-family: var(--font-mono); font-size: .78rem;
-- display: inline-flex; align-items: center; gap: 4px;
-- }
-- .proj__year i { font-size: 0.72rem; }
-- .proj h3 { font-family: var(--font-display); font-size: 1.15rem; margin: 0 0 .5rem; }
-- .proj p { font-size: .92rem; }
-- .proj__tech {
-- list-style: none; margin: auto 0 0; padding: 0;
-- display: flex; gap: 6px; flex-wrap: wrap;
-- padding-bottom: 0.6rem;
-- }
-- .proj__tech li {
-- font: 500 .7rem var(--font-mono);
-- color: var(--dim);
-- border: 1px solid var(--border);
-- border-radius: 6px;
-- padding: 2px 7px;
-- display: inline-flex; align-items: center; gap: 4px;
-- }
-- .proj__tech li i { font-size: 0.6rem; color: var(--accent); opacity: 0.6; }
--
-- .proj__cta {
-- display: inline-flex; align-items: center; gap: 5px;
-- margin-top: 0.8rem;
-- font: 600 0.82rem var(--font-body);
-- color: var(--muted);
-- transition: color .2s var(--ease), gap .2s var(--ease);
-- border-top: 1px solid var(--border);
-- padding-top: 0.8rem;
-- }
-- .proj__cta i { font-size: 0.75rem; }
--
-- /* Category chip accent colors */
-- .chip--amazon { color: #ff9900; border-color: rgba(255,153,0,.3); }
-- .chip--hobo { color: #4cc9b0; border-color: rgba(76,201,176,.3); }
-- .chip--python { color: #4b8bbe; border-color: rgba(75,139,190,.3); }
-- .chip--game { color: #f4a261; border-color: rgba(244,162,97,.3); }
-- .chip--hardware { color: #7aa2f7; border-color: rgba(122,162,247,.3); }
-- .chip--web { color: #9ece6a; border-color: rgba(158,206,106,.3); }
-- .chip--3d { color: #bb9af7; border-color: rgba(187,154,247,.3); }
-- .chip--tools { color: #e0af68; border-color: rgba(224,175,104,.3); }
-- .chip { display: inline-flex; align-items: center; gap: 5px; }
-- .chip i { font-size: 0.75em; }
++ .pcard:hover { border-color: rgba(var(--accent-rgb), .4); box-shadow: var(--shadow-card), var(--shadow-glow); }
++ .pcard.is-hidden { display: none; }
++ .pcard__link { position: absolute; inset: 0; z-index: 2; border-radius: inherit; }
++ .pcard__img { aspect-ratio: 16 / 9; overflow: hidden; border-bottom: 1px solid var(--border); background: var(--bg-2); }
++ .pcard__img img { width: 100%; height: 100%; object-fit: cover; object-position: top; transition: transform 1s var(--ease); }
++ .pcard:hover .pcard__img img { transform: scale(1.05); }
++ .pcard__deco { position: relative; aspect-ratio: 16 / 9; overflow: hidden; border-bottom: 1px solid var(--border); background: var(--grad-soft); display: grid; place-items: center; }
++ .pcard__deco i { font-size: 3.4rem; color: var(--fg); opacity: .22; transition: transform .8s var(--ease), opacity .5s; }
++ .pcard:hover .pcard__deco i { transform: scale(1.12) rotate(-6deg); opacity: .4; }
++ .pcard__deco-grid { position: absolute; inset: 0; background-image: linear-gradient(to right, rgba(255,255,255,.05) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,.05) 1px, transparent 1px); background-size: 28px 28px; mask-image: radial-gradient(60% 60% at 50% 50%, #000, transparent); -webkit-mask-image: radial-gradient(60% 60% at 50% 50%, #000, transparent); }
++ .cat-powerchat .pcard__deco { background: linear-gradient(135deg, rgba(var(--accent-2-rgb), .22), rgba(139,92,246,.14)); }
++ .cat-ai .pcard__deco, .cat-amazon .pcard__deco { background: linear-gradient(135deg, rgba(var(--accent-3-rgb), .18), rgba(var(--accent-rgb), .14)); }
++ .pcard__body { position: relative; z-index: 1; padding: 20px 20px 18px; display: flex; flex-direction: column; gap: 10px; flex: 1; }
++ .pcard__top { display: flex; align-items: center; gap: 10px; }
++ .pcard__icon { width: 34px; height: 34px; border-radius: 10px; display: inline-grid; place-items: center; background: rgba(var(--accent-rgb), .12); color: var(--accent); border: 1px solid rgba(var(--accent-rgb), .18); font-size: .85rem; }
++ .cat-powerchat .pcard__icon { background: rgba(var(--accent-2-rgb), .12); color: var(--accent-2); border-color: rgba(var(--accent-2-rgb), .22); }
++ .cat-amazon .pcard__icon, .cat-ai .pcard__icon { background: rgba(var(--accent-3-rgb), .12); color: var(--accent-3); border-color: rgba(var(--accent-3-rgb), .22); }
++ .cat-infra .pcard__icon { background: rgba(139, 92, 246, .14); color: var(--violet); border-color: rgba(139, 92, 246, .25); }
++ .pcard__cat { font-family: var(--font-mono); font-size: .7rem; letter-spacing: .14em; text-transform: uppercase; color: var(--muted); }
++ .pcard__year { margin-left: auto; font-size: .7rem; color: var(--dim); }
++ .pcard__title { margin: 0; font-size: 1.15rem; }
++ .pcard__sum { margin: 0; font-size: .9rem; color: var(--muted); line-height: 1.55; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
++ .pcard__tech { list-style: none; margin: auto 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
++ .pcard__tech li { font: 500 .68rem var(--font-mono); padding: 3px 8px; border-radius: 6px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--border); }
++ .pcard__tech .more { color: var(--dim); }
++ .pcard__foot { display: flex; align-items: center; justify-content: space-between; padding-top: 6px; }
++ .pcard__more { font: 600 .78rem var(--font-mono); color: var(--accent); }
++ .pcard__ext { position: relative; z-index: 3; width: 32px; height: 32px; border-radius: 50%; display: inline-grid; place-items: center; color: var(--muted); border: 1px solid var(--border); transition: all .25s; }
++ .pcard__ext:hover { color: var(--fg); border-color: var(--accent); text-decoration: none; background: rgba(var(--accent-rgb), .12); }
++ .work__all { display: flex; justify-content: center; margin-top: 34px; }
++ @media (max-width: 1000px) { .pgrid { grid-template-columns: repeat(2, 1fr); } }
++ @media (max-width: 600px) { .pgrid { grid-template-columns: 1fr; } }
</style>
<script>
-- document.querySelectorAll<HTMLButtonElement>(".filter").forEach((btn) => {
-- btn.addEventListener("click", () => {
-- const f = btn.dataset.filter;
-- document.querySelectorAll(".filter").forEach((b) => b.classList.remove("is-active"));
-- btn.classList.add("is-active");
-- document.querySelectorAll<HTMLAnchorElement>(".proj").forEach((card) => {
-- const show = f === "all" || card.dataset.cat === f;
-- card.classList.toggle("is-hidden", !show);
++ document.querySelectorAll<HTMLElement>('.work').forEach((sec) => {
++ const btns = sec.querySelectorAll<HTMLButtonElement>('.filter');
++ const cards = sec.querySelectorAll<HTMLElement>('.pcard');
++ btns.forEach((b) => b.addEventListener('click', () => {
++ const f = b.dataset.filter!;
++ btns.forEach((x) => { x.classList.toggle('is-active', x === b); x.setAttribute('aria-selected', String(x === b)); });
++ let shown = 0;
++ cards.forEach((c) => {
++ const show = f === 'all' || c.dataset.cat === f;
++ if (show) {
++ c.classList.remove('is-hidden');
++ c.animate([{ opacity: 0, transform: 'translateY(14px) scale(.98)' }, { opacity: 1, transform: 'none' }], { duration: 450, delay: shown++ * 40, easing: 'cubic-bezier(.22,1,.36,1)', fill: 'backwards' });
++ } else c.classList.add('is-hidden');
});
-- });
++ }));
});
</script>
ddiff --git a/src/components/Skills.astro b/src/components/Skills.astro
nnew file mode 100644
iindex 0000000..dc559cc
---- /dev/null
++++ b/src/components/Skills.astro
@@@ -0,0 +1,61 @@
++---
++import { getCollection } from "astro:content";
++const groups = (await getCollection("skills")).sort((a, b) => a.data.order - b.data.order);
++const lvl = { core: 3, strong: 2, familiar: 1 } as const;
++---
++<section class="section skills" id="skills" aria-labelledby="skills-title">
++ <div class="container">
++ <div class="sec-head">
++ <span class="sec-num" aria-hidden="true">05</span>
++ <div>
++ <div class="sec-index">Skills</div>
++ <h2 class="sec-title" id="skills-title">The <em>toolbox</em>, honestly labelled.</h2>
++ </div>
++ <p class="sec-lead">Three bars means I have shipped and operated it in production more than once. One bar means I can read it, fix it and learn the rest quickly.</p>
++ </div>
++
++ <div class="sk-grid" data-stagger>
++ {groups.map((g) => (
++ <article class="sk card spot">
++ <header class="sk__head">
++ <span class="sk__icon"><i class={g.data.icon ?? "fa-solid fa-star"}></i></span>
++ <div>
++ <h3 class="sk__title">{g.data.group}</h3>
++ {g.data.blurb && <p class="sk__blurb">{g.data.blurb}</p>}
++ </div>
++ </header>
++ <ul class="sk__list">
++ {g.data.items.map((it) => (
++ <li class="sk__item" title={it.level ?? "strong"}>
++ <span class="sk__name">{it.name}</span>
++ <span class="sk__bars" aria-label={`${it.level ?? "strong"} proficiency`}>
++ {[1, 2, 3].map((n) => <i class={n <= lvl[it.level ?? "strong"] ? "on" : ""}></i>)}
++ </span>
++ </li>
++ ))}
++ </ul>
++ </article>
++ ))}
++ </div>
++ </div>
++</section>
++
++<style>
++ .sk-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
++ .sk { padding: 22px; }
++ .sk__head { display: flex; gap: 14px; align-items: flex-start; margin-bottom: 14px; }
++ .sk__icon { width: 40px; height: 40px; flex: none; border-radius: 12px; display: inline-grid; place-items: center; background: var(--grad-soft); color: var(--fg); border: 1px solid var(--border); font-size: .95rem; }
++ .sk__title { margin: 0 0 3px; font-size: 1.05rem; }
++ .sk__blurb { margin: 0; font-size: .82rem; color: var(--dim); line-height: 1.45; }
++ .sk__list { list-style: none; margin: 0; padding: 0; display: grid; }
++ .sk__item { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 7px 0; border-top: 1px solid var(--border); font-size: .88rem; color: var(--muted); transition: color .2s; }
++ .sk__item:first-child { border-top: 0; }
++ .sk__item:hover { color: var(--fg); }
++ .sk__bars { display: inline-flex; gap: 3px; }
++ .sk__bars i { width: 12px; height: 5px; border-radius: 3px; background: var(--surface-2); border: 1px solid var(--border); transition: background .3s, box-shadow .3s; }
++ .sk__bars i.on { background: var(--accent); border-color: transparent; box-shadow: 0 0 8px rgba(var(--accent-rgb), .5); }
++ .sk__item:hover .sk__bars i.on { background: var(--accent-2); box-shadow: 0 0 8px rgba(var(--accent-2-rgb), .5); }
++ @media (min-width: 1001px) { .sk:last-child { grid-column: 1 / -1; } .sk:last-child .sk__list { grid-template-columns: repeat(3, 1fr); column-gap: 28px; } .sk:last-child .sk__item:nth-child(-n+3) { border-top: 0; } }
++ @media (max-width: 1000px) { .sk-grid { grid-template-columns: repeat(2, 1fr); } }
++ @media (max-width: 620px) { .sk-grid { grid-template-columns: 1fr; } }
++</style>
ddiff --git a/src/components/SkillsGrid.astro b/src/components/SkillsGrid.astro
ddeleted file mode 100644
iindex 37d1f35..0000000
---- a/src/components/SkillsGrid.astro
++++ /dev/null
@@@ -1,59 +0,0 @@
-----
--import { getCollection } from "astro:content";
--const groups = (await getCollection("skills")).sort((a, b) => a.data.order - b.data.order);
-----
--<section class="skills" id="skills">
-- <div class="container">
-- <div class="section-eyebrow"><i class="fa-solid fa-code"></i> Stack</div>
-- <h2 class="section-title">Skills & stack</h2>
-- <div class="skills__grid">
-- {groups.map((g) => (
-- <article class="card skills__card" data-reveal>
-- <h3>{g.data.group}</h3>
-- <ul>
-- {g.data.items.map((it) => (
-- <li class={`skills__item skills__item--${it.level ?? "strong"}`}>
-- <span>{it.name}</span>
-- </li>
-- ))}
-- </ul>
-- </article>
-- ))}
-- </div>
-- </div>
--</section>
--
--<style>
-- .skills__grid {
-- display: grid; gap: 18px;
-- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
-- }
-- .skills__card {
-- border-top: 2px solid rgba(76,201,176,0.25) !important;
-- }
-- .skills__card h3 {
-- font-family: var(--font-display);
-- font-size: 1rem;
-- font-weight: 700;
-- color: var(--accent);
-- margin-bottom: 1rem;
-- letter-spacing: 0.01em;
-- }
-- .skills__card ul { list-style: none; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 6px; }
-- .skills__item {
-- padding: 5px 12px;
-- border-radius: 8px;
-- border: 1px solid var(--border);
-- font: 500 .83rem var(--font-body);
-- color: var(--fg);
-- background: rgba(255,255,255,0.02);
-- transition: transform .2s var(--ease), border-color .2s var(--ease), background .2s var(--ease);
-- }
-- .skills__item:hover { transform: translateY(-2px); border-color: rgba(76,201,176,0.4); background: rgba(76,201,176,0.05); }
-- .skills__item--core {
-- border-color: rgba(76,201,176,.32);
-- color: var(--accent);
-- background: rgba(76,201,176,.06);
-- }
-- .skills__item--familiar { color: var(--dim); border-color: var(--border); }
--</style>
ddiff --git a/src/components/Timeline.astro b/src/components/Timeline.astro
nnew file mode 100644
iindex 0000000..0457c38
---- /dev/null
++++ b/src/components/Timeline.astro
@@@ -0,0 +1,112 @@
++---
++import { getCollection } from "astro:content";
++const exp = (await getCollection("experience")).sort((a, b) => a.data.order - b.data.order);
++const kindIcon: Record<string, string> = {
++ engineering: "fa-solid fa-code", founder: "fa-solid fa-rocket", analytics: "fa-solid fa-chart-line",
++ operations: "fa-solid fa-gears", sales: "fa-solid fa-handshake",
++};
++---
++<section class="section xp" id="experience" aria-labelledby="xp-title">
++ <div class="container">
++ <div class="sec-head">
++ <span class="sec-num" aria-hidden="true">04</span>
++ <div>
++ <div class="sec-index">Experience</div>
++ <h2 class="sec-title" id="xp-title">A decade of <em>owning the outcome</em>.</h2>
++ </div>
++ <p class="sec-lead">Founder, contractor, analyst, floor monitor, sales lead. Different rooms, same job: understand the system, fix it, make it measurable.</p>
++ </div>
++
++ <ol class="tl" id="tl">
++ <div class="tl__rail" aria-hidden="true"><div class="tl__fill" id="tl-fill"></div></div>
++ {exp.map((e, i) => (
++ <li class={`tl__item ${e.data.featured ? "is-featured" : ""} ${e.data.current ? "is-current" : ""}`} data-reveal="up">
++ <div class="tl__node" aria-hidden="true"><i class={kindIcon[e.data.kind]}></i></div>
++ <aside class="tl__aside" aria-hidden="true">
++ <span class="tl__aside-when">{e.data.current && <span class="live-dot"></span>}{e.data.start} — {e.data.end}</span>
++ <span class="tl__aside-co">{e.data.company}</span>
++ <span class="tl__aside-kind">{e.data.kind}</span>
++ </aside>
++ <article class="tl__card card spot">
++ <header class="tl__head">
++ <div class="tl__when mono">
++ {e.data.current && <span class="live-dot"></span>}
++ <span>{e.data.start} — {e.data.end}</span>
++ </div>
++ <h3 class="tl__role">{e.data.role}</h3>
++ <div class="tl__co">
++ {e.data.link ? <a href={e.data.link} target="_blank" rel="noopener">{e.data.company}</a> : <span>{e.data.company}</span>}
++ {e.data.location && <span class="tl__loc"><i class="fa-solid fa-location-dot"></i> {e.data.location}</span>}
++ </div>
++ </header>
++ {e.data.summary && <p class="tl__sum">{e.data.summary}</p>}
++ <ul class="tl__bullets">
++ {e.data.bullets.map((b) => <li>{b}</li>)}
++ </ul>
++ {e.data.stack.length > 0 && (
++ <ul class="tl__stack" aria-label="Stack">
++ {e.data.stack.map((s) => <li>{s}</li>)}
++ </ul>
++ )}
++ </article>
++ </li>
++ ))}
++ </ol>
++ </div>
++</section>
++
++<style>
++ .tl { position: relative; list-style: none; margin: 0; padding: 0; display: grid; gap: 28px; }
++ .tl__rail { position: absolute; left: 22px; top: 0; bottom: 0; width: 2px; background: var(--border); border-radius: 2px; overflow: hidden; }
++ .tl__fill { width: 100%; height: 0%; background: var(--grad); box-shadow: 0 0 16px rgba(var(--accent-rgb), .6); transition: height .15s linear; }
++ .tl__item { position: relative; padding-left: 64px; }
++ .tl__node {
++ position: absolute; left: 4px; top: 22px; width: 38px; height: 38px; border-radius: 50%;
++ display: grid; place-items: center; font-size: .82rem;
++ background: var(--surface-solid); border: 1px solid var(--border-strong); color: var(--muted);
++ transition: color .3s, border-color .3s, box-shadow .3s, transform .3s var(--ease);
++ }
++ .tl__item:hover .tl__node, .tl__item.is-current .tl__node { color: var(--accent); border-color: var(--accent); box-shadow: 0 0 0 6px rgba(var(--accent-rgb), .12); }
++ .tl__item.is-current .tl__node { color: #fff; background: var(--accent); }
++ .tl__card { padding: clamp(20px, 3vw, 30px); }
++ .tl__head { display: grid; gap: 6px; margin-bottom: 12px; }
++ .tl__when { display: inline-flex; align-items: center; gap: 10px; font-size: .76rem; letter-spacing: .12em; text-transform: uppercase; color: var(--accent); }
++ .tl__role { margin: 0; font-size: clamp(1.25rem, 2.2vw, 1.65rem); }
++ .tl__co { display: flex; flex-wrap: wrap; gap: 6px 18px; color: var(--muted); font-size: .95rem; }
++ .tl__co a { color: var(--fg); font-weight: 600; }
++ .tl__loc { color: var(--dim); font-size: .85rem; display: inline-flex; align-items: center; gap: 6px; }
++ .tl__sum { font-size: .95rem; color: var(--muted); font-style: italic; border-left: 2px solid rgba(var(--accent-rgb), .4); padding-left: 12px; }
++ .tl__bullets { margin: 0; padding: 0 0 0 1.1rem; display: grid; gap: 8px; color: var(--muted); line-height: 1.65; font-size: .95rem; }
++ .tl__bullets li::marker { color: var(--accent-2); }
++ .tl__stack { list-style: none; margin: 16px 0 0; padding: 14px 0 0; border-top: 1px dashed var(--border); display: flex; flex-wrap: wrap; gap: 6px; }
++ .tl__stack li { font: 500 .68rem var(--font-mono); padding: 3px 8px; border-radius: 6px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--border); }
++ @media (min-width: 900px) {
++ .tl__rail { left: 239px; }
++ .tl__item { display: grid; grid-template-columns: 200px 1fr; gap: 0 80px; padding-left: 0; }
++ .tl__node { left: 221px; }
++ .tl__aside { position: sticky; top: calc(var(--nav-h) + 24px); align-self: start; padding-top: 22px; display: grid; gap: 8px; }
++ .tl__head .tl__when { display: none; }
++ .tl__item.is-featured .tl__card { padding: clamp(24px, 3vw, 34px); }
++ }
++ .tl__aside { display: none; }
++ @media (min-width: 900px) { .tl__aside { display: grid; } }
++ .tl__aside-when { font-family: var(--font-mono); font-size: .8rem; letter-spacing: .1em; text-transform: uppercase; color: var(--accent); display: inline-flex; align-items: center; gap: 10px; }
++ .tl__aside-co { font-family: var(--font-display); font-weight: 700; font-size: 1.05rem; color: var(--fg); }
++ .tl__aside-kind { font-size: .78rem; color: var(--dim); text-transform: capitalize; }
++</style>
++
++<script>
++ const tl = document.getElementById('tl'), fill = document.getElementById('tl-fill');
++ if (tl && fill) {
++ let raf = 0;
++ const update = () => {
++ raf = 0;
++ const r = tl.getBoundingClientRect();
++ const start = innerHeight * 0.7;
++ const p = Math.min(1, Math.max(0, (start - r.top) / r.height));
++ fill.style.height = `${p * 100}%`;
++ };
++ addEventListener('scroll', () => { if (!raf) raf = requestAnimationFrame(update); }, { passive: true });
++ update();
++ }
++</script>
ddiff --git a/src/content/config.ts b/src/content/config.ts
iindex 4602b00..2725828 100644
---- a/src/content/config.ts
++++ b/src/content/config.ts
@@@ -8,9 +8,13 @@ const experience = defineCollection({
start: z.string(),
end: z.string(),
location: z.string().optional(),
++ kind: z.enum(['engineering', 'founder', 'analytics', 'operations', 'sales']).default('engineering'),
++ link: z.string().url().optional(),
++ summary: z.string().optional(),
bullets: z.array(z.string()),
stack: z.array(z.string()).default([]),
featured: z.boolean().default(false),
++ current: z.boolean().default(false),
order: z.number().default(0),
}),
});
@@@ -19,16 +23,19 @@ const projects = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
-- category: z.enum(['amazon', 'hobo', 'python', 'game', 'hardware', 'web', '3d', 'tools']),
++ category: z.enum(['openvibe', 'powerchat', 'amazon', 'ai', 'infra', 'game', 'tools', 'python', 'hardware', 'web']),
summary: z.string(),
tech: z.array(z.string()).default([]),
role: z.string().optional(),
year: z.string().optional(),
image: z.string().optional(),
images: z.array(z.string()).default([]),
++ accent: z.string().optional(),
++ icon: z.string().optional(),
links: z.object({
live: z.string().url().optional(),
repo: z.string().url().optional(),
++ docs: z.string().url().optional(),
video: z.string().url().optional(),
}).default({}),
featured: z.boolean().default(false),
@@@ -40,6 +47,8 @@ const skills = defineCollection({
type: 'data',
schema: z.object({
group: z.string(),
++ icon: z.string().optional(),
++ blurb: z.string().optional(),
items: z.array(z.object({
name: z.string(),
level: z.enum(['core', 'strong', 'familiar']).optional(),
ddiff --git a/src/content/experience/01-amazon-data-analyst.json b/src/content/experience/01-amazon-data-analyst.json
ddeleted file mode 100644
iindex 70d9246..0000000
---- a/src/content/experience/01-amazon-data-analyst.json
++++ /dev/null
@@@ -1,16 +0,0 @@
--{
-- "company": "Amazon",
-- "role": "Data Analyst — ICQA",
-- "start": "2024",
-- "end": "2025",
-- "location": "PAE2 · Arlington, WA",
-- "bullets": [
-- "Owned SOX-compliance IRDR workflows — researched 1,000+ inventory discrepancies and built the data systems behind Sarbanes-Oxley audit requirements.",
-- "Built SQL and Excel reporting for inventory accuracy and defect visibility; delivered dashboards and recurring leadership reports.",
-- "Created an Anthropic-powered SQL copilot that references every available data table for analysts.",
-- "Shipped an autonomous root-cause bot that performs end-to-end inventory research."
-- ],
-- "stack": ["SQL", "Excel", "Python", "Anthropic API", "TamperMonkey", "Power Query", "SOX Compliance"],
-- "featured": true,
-- "order": 1
--}
ddiff --git a/src/content/experience/01-powerchat.json b/src/content/experience/01-powerchat.json
nnew file mode 100644
iindex 0000000..86ff4dd
---- /dev/null
++++ b/src/content/experience/01-powerchat.json
@@@ -0,0 +1,36 @@
++{
++ "company": "PowerChat",
++ "role": "Software Engineer (Contract)",
++ "start": "Aug 2026",
++ "end": "Present",
++ "location": "Remote",
++ "kind": "engineering",
++ "link": "https://powerchat.gg",
++ "featured": true,
++ "current": true,
++ "order": 1,
++ "summary": "Creator monetization platform: tips, alerts, overlays, TTS and chat integrations across Twitch, Kick, YouTube and Rumble. I own large platform programs end to end on the v2 TypeScript rewrite.",
++ "bullets": [
++ "Designed and shipped the Developer API platform end to end: PowerChat became an OAuth2 authorization server with scoped consent, token lifecycle, HMAC-signed webhooks and an inbound API, so third-party apps act as pseudo-platforms feeding chat, view counts, follows, subs, currency and tips into overlays. Re-implemented Streamlabs as the first official app on the new framework.",
++ "Rebuilt the payments program as one system: a provider-agnostic charge rail with five adapters (Stripe Connect, Square, PayPal, an NMI card vault and NowPayments crypto), append-only ledgers where double-crediting is structurally impossible, Tipalti payouts, recurring Pro and viewer-subscription billing, signed webhooks per provider and an admin reconciliation surface.",
++ "Delivered 400+ commits and roughly 300k changed lines in the first five weeks across integrations, payments and Rumble connection work, backed by 240+ governed backend integration tests and 1,700+ frontend unit tests, with lint, typecheck and empty-database migration proofs in CI."
++ ],
++ "stack": [
++ "TypeScript",
++ "Node.js",
++ "Express",
++ "React",
++ "Prisma",
++ "PostgreSQL 17",
++ "Redis",
++ "BullMQ",
++ "OAuth2",
++ "Stripe",
++ "Square",
++ "PayPal",
++ "NMI",
++ "Tipalti",
++ "Docker",
++ "GitLab CI"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/experience/02-amazon-rme.json b/src/content/experience/02-amazon-rme.json
ddeleted file mode 100644
iindex 2ff7f55..0000000
---- a/src/content/experience/02-amazon-rme.json
++++ /dev/null
@@@ -1,15 +0,0 @@
--{
-- "company": "Amazon",
-- "role": "Amnesty Floor Monitor (AFM)",
-- "start": "2023",
-- "end": "2024",
-- "location": "Amazon Robotics launch site",
-- "bullets": [
-- "Monitored the Amazon Robotics floor during launch operations — enforced amnesty zones, cleared obstructions, and kept pod/drive flow safe.",
-- "Investigated pod, drive unit, and workstation issues; documented recurring defects to drive process improvement.",
-- "Coordinated amnesty events and communicated floor status to ops leadership in real time."
-- ],
-- "stack": ["Amazon Robotics", "AFM protocols", "Floor safety", "Amnesty ops"],
-- "featured": true,
-- "order": 2
--}
ddiff --git a/src/content/experience/02-openvibe.json b/src/content/experience/02-openvibe.json
nnew file mode 100644
iindex 0000000..d5560b3
---- /dev/null
++++ b/src/content/experience/02-openvibe.json
@@@ -0,0 +1,37 @@
++{
++ "company": "OpenVibe",
++ "role": "Founder · Architect · Sole Engineer",
++ "start": "2022",
++ "end": "Present",
++ "location": "openvibe.live and 20+ domains",
++ "kind": "founder",
++ "link": "https://openvibe.live",
++ "featured": true,
++ "current": true,
++ "order": 2,
++ "summary": "An open, community-run live-streaming and tools network. Started in 2022 as a streaming site, re-architected in 2026 into seven services behind one identity provider. I design, build, deploy and operate all of it.",
++ "bullets": [
++ "Architected the network as seven Node services with formal inter-service contracts: OpenVibe.Live (streaming), .Network (OIDC/OAuth2 identity, OpenCoins wallet, notifications, themes), .Media (multi-tenant media API), .Tools (169-tool suite), .Games (Scraplandia), .Community (pastes) and .Sites (13 front-page domains). About 363k lines, 900+ HTTP routes, one operator.",
++ "Built the streaming core: RTMP, WHIP and WebRTC-SFU ingest (mediasoup, werift), ffmpeg restream to Twitch, YouTube, Kick and SRT, VOD and clip pipelines with local → Backblaze B2 → Cloudflare R2 tiering, chat and moderation, a three-currency economy, PowerChat and RobotStreamer integrations, local whisper.cpp captions with LLM translation in about 21 languages, and AI clip and moment jobs on a provider-agnostic, budget-metered LLM client.",
++ "Ran it like a product team: systemd socket-activated zero-downtime deploys (measured 90 of 90 requests served through a restart), a deploy script that classifies each change and supports rollback, a headless-Chrome performance harness with interleaved A/B runs (home page CLS 0.83 → 0.03, warm FCP 1066 → 550 ms), and a dry-run migration suite plus cutover runbook that moved users, coins and 22 concurrent players with no downtime."
++ ],
++ "stack": [
++ "Node.js",
++ "TypeScript",
++ "Express",
++ "SQLite (WAL)",
++ "mediasoup",
++ "werift",
++ "ffmpeg",
++ "whisper.cpp",
++ "Babylon.js",
++ "Havok",
++ "OAuth2 / OIDC",
++ "RS256 JWT",
++ "nginx",
++ "systemd",
++ "Cloudflare",
++ "B2 / R2",
++ "Prometheus-style diagnostics"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/experience/03-amazon-data-analyst.json b/src/content/experience/03-amazon-data-analyst.json
nnew file mode 100644
iindex 0000000..2c13be9
---- /dev/null
++++ b/src/content/experience/03-amazon-data-analyst.json
@@@ -0,0 +1,25 @@
++{
++ "company": "Amazon",
++ "role": "Data Analyst — ICQA",
++ "start": "2024",
++ "end": "Mar 2026",
++ "location": "PAE2 · Arlington, WA",
++ "kind": "analytics",
++ "featured": true,
++ "order": 3,
++ "summary": "Inventory Control and Quality Assurance analytics for a fulfillment center, including the Sarbanes-Oxley controls behind inventory accuracy.",
++ "bullets": [
++ "Owned the SOX-compliance IRDR workflow: personally researched 1,000+ inventory discrepancies and built the data systems and reporting that satisfied Sarbanes-Oxley audit requirements.",
++ "Built SQL and Excel reporting for inventory accuracy and defect visibility; delivered dashboards, recurring leadership reports and a network-wide quality recap deck.",
++ "Shipped an Anthropic-powered SQL copilot that indexes every available table, and an autonomous root-cause agent that plans, gathers evidence and writes complete IRDRs, collapsing hours of research per defect into seconds."
++ ],
++ "stack": [
++ "SQL",
++ "Excel / Power Query / VBA",
++ "Python",
++ "Anthropic API",
++ "Tool-use agents",
++ "TamperMonkey",
++ "SOX compliance"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/experience/03-verizon.json b/src/content/experience/03-verizon.json
ddeleted file mode 100644
iindex e0858d1..0000000
---- a/src/content/experience/03-verizon.json
++++ /dev/null
@@@ -1,14 +0,0 @@
--{
-- "company": "Verizon Wireless",
-- "role": "Assistant Manager / Sales Representative",
-- "start": "2020",
-- "end": "2023",
-- "bullets": [
-- "Ranked among the district's top performers — consistently exceeded monthly quotas across phones, plans, accessories, protection, and financing.",
-- "Promoted to Assistant Manager; coached a team of 4–8 reps through 1-on-1s, floor coaching, and skill workshops.",
-- "Ran store opens/closes, inventory, escalations, and daily huddles.",
-- "Turned walk-ins into multi-line accounts through consultative, needs-first selling."
-- ],
-- "stack": ["Consultative Sales", "Team Leadership", "Coaching", "Retail Ops", "Quota Attainment", "Customer Retention"],
-- "order": 3
--}
ddiff --git a/src/content/experience/04-amazon-afm.json b/src/content/experience/04-amazon-afm.json
nnew file mode 100644
iindex 0000000..4b27adf
---- /dev/null
++++ b/src/content/experience/04-amazon-afm.json
@@@ -0,0 +1,19 @@
++{
++ "company": "Amazon",
++ "role": "Amnesty Floor Monitor — Amazon Robotics",
++ "start": "2023",
++ "end": "2024",
++ "location": "Robotics launch site",
++ "kind": "operations",
++ "order": 4,
++ "bullets": [
++ "Monitored the Amazon Robotics floor during launch operations: enforced amnesty zones, cleared obstructions and kept pod and drive-unit flow safe.",
++ "Investigated recurring pod, drive and workstation defects, documented patterns and escalated to RME and operations leadership to drive process fixes."
++ ],
++ "stack": [
++ "Amazon Robotics",
++ "Floor safety",
++ "Electro-mechanical troubleshooting",
++ "Incident documentation"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/experience/04-openvibe.json b/src/content/experience/04-openvibe.json
ddeleted file mode 100644
iindex 9041e39..0000000
---- a/src/content/experience/04-openvibe.json
++++ /dev/null
@@@ -1,15 +0,0 @@
--{
-- "company": "Hobo Network · OpenVibe",
-- "role": "Founder · Systems Architect · Principal Engineer",
-- "start": "2022",
-- "end": "2025",
-- "bullets": [
-- "Sole architect of OpenVibe — a 15-microservice open-source platform kernel: event bus, OIDC/OAuth2 identity, media storage, live-streaming ingest/restream, real-time chat, billing ledger, and AI/search backbone. A self-hosted alternative to Twitch + YouTube + Patreon + Discord.",
-- "Built and operated HoboStreamer — a full live-streaming platform with WebRTC, HLS, multi-destination RTMP restream, auto-recorded VODs, clips, real-time chat, voice channels, and moderation tools. Fully open source.",
-- "Built HoboQuest — a browser MMORPG on a custom isomorphic engine: shared game logic compiled to both server and client, Source Engine-style lag compensation, and four live game worlds. Playable in a tab, streamed live inside HoboStreamer.",
-- "Ran hobo.tools — shared SSO/OAuth2 identity and service registry connecting 14 services."
-- ],
-- "stack": ["TypeScript", "Node.js", "Express", "SQLite", "PostgreSQL", "WebRTC", "WebSockets", "Redis", "OAuth2", "OIDC", "FFmpeg", "React", "Vue"],
-- "featured": true,
-- "order": 4
--}
ddiff --git a/src/content/experience/05-gameserverstats.json b/src/content/experience/05-gameserverstats.json
ddeleted file mode 100644
iindex 962611f..0000000
---- a/src/content/experience/05-gameserverstats.json
++++ /dev/null
@@@ -1,13 +0,0 @@
--{
-- "company": "GameServerStats, LLC",
-- "role": "Founder · Developer · Systems Admin",
-- "start": "2015",
-- "end": "Present",
-- "bullets": [
-- "Built analytics-focused web platforms tracking 200,000+ live game servers using JavaScript, Node.js, PHP, Python, SQL, MongoDB, Redis, HTML, and CSS.",
-- "Designed ingestion, search, dashboards, Linux infrastructure, scaling, DDoS resilience, support workflows, and business reporting.",
-- "Self-built and collocated 1U / 2U servers in datacenters; ran the entire LLC including licenses, taxes, and partner relations."
-- ],
-- "stack": ["Node.js", "PHP", "Python", "MongoDB", "MySQL", "Redis", "NGINX", "Linux"],
-- "order": 5
--}
ddiff --git a/src/content/experience/05-verizon.json b/src/content/experience/05-verizon.json
nnew file mode 100644
iindex 0000000..927a778
---- /dev/null
++++ b/src/content/experience/05-verizon.json
@@@ -0,0 +1,20 @@
++{
++ "company": "Verizon Wireless",
++ "role": "Assistant Manager / Sales Representative",
++ "start": "2020",
++ "end": "2023",
++ "kind": "sales",
++ "order": 5,
++ "bullets": [
++ "Ranked among the district's top performers, consistently exceeding monthly quotas across phones, plans, accessories, protection and financing.",
++ "Promoted to Assistant Manager; coached a team of 4 to 8 reps through 1-on-1s, floor coaching and skill workshops, and ran opens, closes, inventory and escalations.",
++ "Turned walk-ins into multi-line accounts through consultative, needs-first selling. That habit still shapes how I present systems and decisions."
++ ],
++ "stack": [
++ "Consultative sales",
++ "Team leadership",
++ "Coaching",
++ "Retail operations",
++ "Customer retention"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/experience/06-earlier.json b/src/content/experience/06-earlier.json
ddeleted file mode 100644
iindex e86165f..0000000
---- a/src/content/experience/06-earlier.json
++++ /dev/null
@@@ -1,12 +0,0 @@
--{
-- "company": "Devolved · GModStore · eBay",
-- "role": "Earlier Technical & Business Experience",
-- "start": "2012",
-- "end": "2015",
-- "bullets": [
-- "Built multiplayer game systems, monetized in-game economies, and digital products sold through ScriptFodder/GModStore.",
-- "Created graphics, support docs, e-commerce listings, moderation workflows, and ran online communities at scale."
-- ],
-- "stack": ["Lua", "PHP", "MySQL", "Photoshop", "Source Engine"],
-- "order": 6
--}
ddiff --git a/src/content/experience/06-gameserverstats.json b/src/content/experience/06-gameserverstats.json
nnew file mode 100644
iindex 0000000..1e0c171
---- /dev/null
++++ b/src/content/experience/06-gameserverstats.json
@@@ -0,0 +1,24 @@
++{
++ "company": "GameServerStats, LLC",
++ "role": "Founder · Developer · Systems Admin",
++ "start": "2015",
++ "end": "Present",
++ "kind": "founder",
++ "order": 6,
++ "bullets": [
++ "Built analytics platforms tracking 200,000+ live game servers: ingestion, search, ranking, dashboards and licensed partner APIs. Ranked first on Google for several major titles.",
++ "Self-built and collocated 1U and 2U servers in datacenters; designed for scale and DDoS resilience and ran the whole LLC, from licenses and taxes to partner relations.",
++ "Rebuilt the idea in 2026 as GameServerLists: a 14-service, game-agnostic server-discovery platform with multi-region probes, time-weighted ranking, an anti-fraud integrity engine and a tiered public API."
++ ],
++ "stack": [
++ "Node.js",
++ "TypeScript",
++ "PHP",
++ "Python",
++ "MongoDB",
++ "TimescaleDB",
++ "Redis",
++ "NGINX",
++ "Linux"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/experience/07-earlier.json b/src/content/experience/07-earlier.json
nnew file mode 100644
iindex 0000000..ccde4d4
---- /dev/null
++++ b/src/content/experience/07-earlier.json
@@@ -0,0 +1,19 @@
++{
++ "company": "Devolved · GModStore · eBay",
++ "role": "Earlier Technical & Business Work",
++ "start": "2012",
++ "end": "2015",
++ "kind": "founder",
++ "order": 7,
++ "bullets": [
++ "Built multiplayer game systems, monetized in-game economies and digital products sold through ScriptFodder and GModStore.",
++ "Produced graphics, support docs, e-commerce listings and moderation workflows, and ran online communities at scale."
++ ],
++ "stack": [
++ "Lua",
++ "PHP",
++ "MySQL",
++ "Photoshop",
++ "Source Engine"
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/projects/amazon-sql-copilot.mdx b/src/content/projects/amazon-sql-copilot.mdx
iindex 7094b06..b10f980 100644
---- a/src/content/projects/amazon-sql-copilot.mdx
++++ b/src/content/projects/amazon-sql-copilot.mdx
@@@ -5,8 +5,10 @@ summary: "Anthropic-powered copilot that writes runnable, schema-aware SQL for I
tech: ["Python", "Anthropic API", "SQL", "Schema Indexing", "Streamlit"]
role: "Sole builder"
year: "2025"
++image: "/assets/img/projects/amazon-sql-copilot.webp"
++icon: "fa-solid fa-database"
featured: true
--order: 1
++order: 21
---
A conversational analytics assistant for Amazon ICQA. The bot ingests the
ddiff --git a/src/content/projects/amazon-userscripts.mdx b/src/content/projects/amazon-userscripts.mdx
iindex 88eaac2..d1c995d 100644
---- a/src/content/projects/amazon-userscripts.mdx
++++ b/src/content/projects/amazon-userscripts.mdx
@@@ -5,7 +5,8 @@ summary: "Six TamperMonkey userscripts that remove daily friction from internal
tech: ["JavaScript", "TamperMonkey", "DOM APIs", "Internal Web Tools"]
role: "Sole builder"
year: "2024–2026"
--order: 22
++icon: "fa-solid fa-puzzle-piece"
++order: 24
---
Each script targets a specific friction point in the internal Amazon tooling
ddiff --git a/src/content/projects/egg-game.mdx b/src/content/projects/egg-game.mdx
ddeleted file mode 100644
iindex 7ae41de..0000000
---- a/src/content/projects/egg-game.mdx
++++ /dev/null
@@@ -1,13 +0,0 @@
-----
--title: "Egg Game"
--category: "game"
--summary: "Browser game prototype — fast iteration on gameplay loops, entirely vanilla JS + canvas."
--tech: ["JavaScript", "Canvas", "HTML5"]
--role: "Sole builder"
--year: "2025"
--order: 50
-----
--
--A small playground for trying out movement, juice, and progression ideas
--without engine overhead. The kind of project that exists to keep gamedev
--muscle memory warm.
ddiff --git a/src/content/projects/gameserverlists.mdx b/src/content/projects/gameserverlists.mdx
nnew file mode 100644
iindex 0000000..439bed2
---- /dev/null
++++ b/src/content/projects/gameserverlists.mdx
@@@ -0,0 +1,12 @@
++---
++title: "GameServerLists"
++category: "web"
++summary: "2026 rebuild of the server-tracking idea as a 14-service, game-agnostic discovery platform: multi-region probes, time-weighted ranking, anti-fraud integrity engine and a tiered public API."
++tech: ["TypeScript", "pnpm monorepo", "TimescaleDB", "Redis", "A2S / Minecraft SLP / EOS", "WebSockets", "Provider-abstracted AI"]
++role: "Architect · Sole Engineer"
++year: "2026"
++icon: "fa-solid fa-list-check"
++order: 13
++---
++
++Fourteen services (API, crawler, discovery, three regional probes, ingest, ranking, enrichment, integrity, notifications, embeds, RCON, Discord, scheduler and sessions) plus eight shared packages. Five games across three query protocols, a multi-region latency matrix, claim-by-token ownership, a domain-mining crawler, an Open Graph embed image service, natural-language search with a deterministic fallback, and a webhook plus WebSocket live channel on a tiered public API.
ddiff --git a/src/content/projects/gameserverstats.mdx b/src/content/projects/gameserverstats.mdx
iindex c9064f8..97a9c08 100644
---- a/src/content/projects/gameserverstats.mdx
++++ b/src/content/projects/gameserverstats.mdx
@@@ -4,11 +4,12 @@ category: "web"
summary: "Analytics platform tracking 200,000+ live game servers — search, ranking, dashboards, and partner APIs."
tech: ["Node.js", "PHP", "MongoDB", "Redis", "NGINX", "Linux"]
role: "Founder / CEO / Sole Engineer"
--year: "2015–Present"
--order: 20
++year: "2015–2026"
++icon: "fa-solid fa-server"
++order: 30
---
--Ten-year-running analytics for the multiplayer-game-server world. Custom
++A decade of analytics for the multiplayer-game-server world. Custom
ingestion fetches and computes stats on hundreds of thousands of servers,
--serves the #1 Google result for several major games, and licenses to
++serves the #1 Google result for several major games, and licensed to
third-party sites under written agreement.
ddiff --git a/src/content/projects/hartools.mdx b/src/content/projects/hartools.mdx
iindex 41561a9..06afe74 100644
---- a/src/content/projects/hartools.mdx
++++ b/src/content/projects/hartools.mdx
@@@ -5,9 +5,10 @@ summary: "Electron desktop suite for capturing, minifying, and analyzing HAR net
tech: ["Electron", "Node.js", "JavaScript", "HAR Spec"]
role: "Sole builder"
year: "2025"
--order: 21
++icon: "fa-solid fa-network-wired"
++order: 31
---
Drag-and-drop HAR analysis with full minification, replay, diff, and a custom
viewer optimized for the kind of multi-megabyte traces that crash other
--tooling. Includes an automated test rig and PowerChat scripting support.
++tooling.
ddiff --git a/src/content/projects/hobo-maps.mdx b/src/content/projects/hobo-maps.mdx
ddeleted file mode 100644
iindex 74f779f..0000000
---- a/src/content/projects/hobo-maps.mdx
++++ /dev/null
@@@ -1,14 +0,0 @@
-----
--title: "HoboMaps"
--category: "hobo"
--summary: "Survival map for North America — camps, free resources, rest areas, water, shelters, public restrooms, and wilderness data."
--tech: ["Leaflet", "Node.js", "PostgreSQL", "JavaScript", "Custom Tile Pipeline"]
--role: "Founder / Lead Engineer"
--year: "2023–Present"
--image: "/assets/img/projects/hobo-maps.png"
--links: { "live": "https://maps.hobo.tools" }
--featured: true
--order: 13
-----
--
--A community-editable survival resource map at [maps.hobo.tools](https://maps.hobo.tools). Part of the Hobo Network, sharing the same unified account and theme system. Contributors can add and verify locations for camps, free resources, rest areas, water sources, shelters, and public facilities across North America.
ddiff --git a/src/content/projects/hobo-quest.mdx b/src/content/projects/hobo-quest.mdx
ddeleted file mode 100644
iindex 7b776d9..0000000
---- a/src/content/projects/hobo-quest.mdx
++++ /dev/null
@@@ -1,26 +0,0 @@
-----
--title: "HoboQuest"
--category: "hobo"
--summary: "Browser MMORPG on a custom-built engine with Source-style lag compensation — no downloads, open a tab and play."
--tech: ["JavaScript", "Node.js", "WebSockets", "Canvas API", "Express", "isomorphic compiler", "lag compensation", "Canvas 2D physics"]
--role: "Founder / Engine & Gameplay Engineer"
--year: "2023–Present"
--image: "/assets/img/projects/hobo-quest.png"
--links: { "live": "https://hobo.quest", "github": "https://github.com/HoboStreamer/www.Hobo.Quest" }
--featured: true
--order: 12
-----
--
--A persistent browser MMORPG built on a custom engine — no Unity, no Godot. Physics, collision, and the multiplayer protocol were all written from scratch.
--
--**Isomorphic engine.** All game logic lives in one shared file; a custom compiler emits both the server and client builds, so the exact same physics and world-state code runs on both sides — desyncs are prevented by design.
--
--**Source Engine-style netcode.** Client-side prediction with server reconciliation (the Counter-Strike approach): movement and combat feel instant while the server stays authoritative.
--
--**Four live worlds.** An orchestrator runs four game instances with distinct rulesets — a PvP building world, a safe social hub, a farming island, and a ship minigame.
--
--**Custom rendering & physics.** Canvas 2D renderer with full SAT collision detection (polygon/circle, frame-accurate hits) — no third-party physics library.
--
--**Full survival loop.** Building, combat (melee, ranged, NPC AI), persistent skills, crafting, banking, fast travel — plus an in-game scratch-card and slots casino with server-validated state.
--
--**Play anywhere.** Desktop WASD + mouse, mobile touch overlay, and gamepad support. Embedded live in HoboStreamer, so viewers watch and play in the same session.
ddiff --git a/src/content/projects/hobo-tools.mdx b/src/content/projects/hobo-tools.mdx
ddeleted file mode 100644
iindex ff39d57..0000000
---- a/src/content/projects/hobo-tools.mdx
++++ /dev/null
@@@ -1,16 +0,0 @@
-----
--title: "Hobo Tools"
--category: "hobo"
--summary: "One account across 14 services — streaming, games, maps, image & audio tools, developer utilities, and more."
--tech: ["TypeScript", "Node.js", "PostgreSQL", "Redis", "HTML", "CSS", "JavaScript"]
--role: "Founder / Lead Engineer"
--year: "2022–Present"
--image: "/assets/img/projects/hobo-tools.png"
--links: { "live": "https://hobo.tools" }
--featured: true
--order: 10
-----
--
--The Hobo Network hub at [hobo.tools](https://hobo.tools). One account sign-in carries you across all 14 services — HoboStreamer, HoboQuest, HoboMaps, HoboFood, HoboImg, HoboAudio, HoboText, HoboLogo, HoboDocs, HoboYT, HoboNet, HoboDev, and more.
--
--Built as a community-first, not-for-profit project. 200+ individual tools across dedicated subdomains, unified notifications, 34 themes that follow you everywhere, anonymous mode, and zero tracking.
ddiff --git a/src/content/projects/hobostreamer.mdx b/src/content/projects/hobostreamer.mdx
ddeleted file mode 100644
iindex 3f1e4e9..0000000
---- a/src/content/projects/hobostreamer.mdx
++++ /dev/null
@@@ -1,18 +0,0 @@
-----
--title: "HoboStreamer"
--category: "hobo"
--summary: "Live streaming platform with VODs, clips, chat, multi-destination RTMP restream, voice chat, and a built-in game — 100% open source."
--tech: ["Node.js", "FFmpeg", "WebRTC", "HLS", "HLS.js", "WebSockets", "JavaScript"]
--role: "Founder / Lead Engineer"
--year: "2022–Present"
--image: "/assets/img/projects/hobostreamer.png"
--links: { "live": "https://hobostreamer.com", "repo": "https://github.com/HoboStreamer/HoboStreamer.com" }
--featured: true
--order: 11
-----
--
--A community-first live streaming platform built from scratch. Connect OBS/ffmpeg or stream directly from the browser, then restream simultaneously to Twitch, YouTube, Kick, and any RTMP endpoint from a single dashboard.
--
--Features: real-time chat with custom emotes, automatic clip detection, auto-recorded VODs, built-in HoboQuest game for viewers, sitewide global chat, voice channels, pastes & file sharing with syntax highlighting, full stream analytics, and comprehensive moderation tools. Every line of code is public on GitHub.
--
--Servers went offline in May 2026 when the funding ran out during a job search. The architecture is sound, the codebase is complete, and it's all open source — ready to self-host or fork.
ddiff --git a/src/content/projects/hobotube.mdx b/src/content/projects/hobotube.mdx
ddeleted file mode 100644
iindex 987c161..0000000
---- a/src/content/projects/hobotube.mdx
++++ /dev/null
@@@ -1,13 +0,0 @@
-----
--title: "HoboTube (YouTube Client)"
--category: "hobo"
--summary: "Electron-based YouTube power client with mpv playback, persistent queue manager, collection storage, and diagnostics."
--tech: ["Electron", "Node.js", "mpv", "JavaScript", "IPC"]
--role: "Sole Builder"
--year: "2025"
--links: {}
--featured: false
--order: 14
-----
--
--A minimal-distraction desktop YouTube client built around [mpv](https://mpv.io) for buttery 4K playback. Features a proper persistent queue, collection management, hardware acceleration detection, auto-updater via GitHub Releases, and an in-app diagnostics panel. Built as a personal tool to complement the HoboStreamer clip pipeline.
ddiff --git a/src/content/projects/inbound-pull-tool.mdx b/src/content/projects/inbound-pull-tool.mdx
iindex 58fdb7f..c7b2ff4 100644
---- a/src/content/projects/inbound-pull-tool.mdx
++++ b/src/content/projects/inbound-pull-tool.mdx
@@@ -5,9 +5,10 @@ summary: "Excel + VBA workbook that pulls every inbound metric — receive, stow
tech: ["Excel", "VBA", "Power Query", "SQL"]
role: "Sole builder"
year: "2026"
--image: "/assets/img/projects/inbound-pull.png"
++image: "/assets/img/projects/inbound-pull.webp"
++icon: "fa-solid fa-table"
featured: true
--order: 3
++order: 22
---
A single-button workbook that replaces a tangle of overlapping reports. Pulls
ddiff --git a/src/content/projects/irdr-autonomous-bot.mdx b/src/content/projects/irdr-autonomous-bot.mdx
iindex 456759c..7a34d41 100644
---- a/src/content/projects/irdr-autonomous-bot.mdx
++++ b/src/content/projects/irdr-autonomous-bot.mdx
@@@ -5,10 +5,10 @@ summary: "Autonomous agent that plans, gathers evidence, and writes complete SOX
tech: ["Python", "Anthropic API", "Tool-use Agents", "TamperMonkey", "SQL", "SOX Compliance"]
role: "Sole builder"
year: "2025"
--image: "/assets/img/projects/irdr-bot-1.png"
--images: ["/assets/img/projects/irdr-bot-1.png", "/assets/img/projects/irdr-bot-2.png"]
++image: "/assets/img/projects/irdr-bot-1.webp"
++icon: "fa-solid fa-robot"
featured: true
--order: 2
++order: 20
---
IRDRs (Inventory Discrepancy Research Reports) are Amazon's mechanism for SOX-compliant inventory accuracy — every count mismatch must be investigated, root-caused, and documented to satisfy Sarbanes-Oxley financial controls. Built on top of 1,000+ hand-researched IRDRs in `IRDR_Research_Data.tsv`, this agent reproduces the full investigation loop a human analyst follows:
ddiff --git a/src/content/projects/irdr-quality-recap.mdx b/src/content/projects/irdr-quality-recap.mdx
iindex b7c1110..c2299b5 100644
---- a/src/content/projects/irdr-quality-recap.mdx
++++ b/src/content/projects/irdr-quality-recap.mdx
@@@ -4,9 +4,8 @@ category: "amazon"
summary: "Network-wide quality recap deck I authored and distributed covering SOX compliance metrics, root-cause trends, and corrective action plans."
tech: ["PowerPoint", "Data Storytelling", "Quality Analysis", "SOX Compliance"]
year: "2025"
--image: "/assets/img/projects/irdr-recap-1.png"
--images: ["/assets/img/projects/irdr-recap-1.png", "/assets/img/projects/irdr-recap-2.png", "/assets/img/projects/irdr-recap-3.png"]
--order: 4
++icon: "fa-solid fa-chart-pie"
++order: 23
---
IRDRs are Amazon's SOX-compliance mechanism for inventory accuracy — every count discrepancy must be investigated and documented to satisfy Sarbanes-Oxley financial controls. This nine-slide narrative covers how the facility's IRDR program is performing across the network — defect categories, double-defect rate, multi-scan trends, top-error process paths, and corrective action plans. Shipped to leadership on a recurring cadence.
ddiff --git a/src/content/projects/live-translation.mdx b/src/content/projects/live-translation.mdx
nnew file mode 100644
iindex 0000000..ae90b94
---- /dev/null
++++ b/src/content/projects/live-translation.mdx
@@@ -0,0 +1,15 @@
++---
++title: "Live captions & translation layer"
++category: "ai"
++summary: "Local whisper.cpp transcription feeding LLM translation in about 21 languages: live captions, two-way chat translation and translated bios, built so a Japanese-speaking streamer could be understood."
++tech: ["whisper.cpp", "Node.js", "OpenAI-compatible LLM APIs", "LRU + DB cache", "WebSockets"]
++role: "Designer · Sole Engineer"
++year: "2026"
++icon: "fa-solid fa-language"
++featured: true
++order: 9
++---
++
++The most popular streamer on OpenVibe.Live streams in Japanese and says in his bio that he does not speak English. Nobody could read him, and he could not read chat.
++
++The fix became a platform feature. Speech is transcribed on the server's CPU with whisper.cpp (no per-minute API cost), detected and translated by a cached LLM call, and pushed to viewers as captions. Chat messages are translated in both directions and persisted with the original, so the streamer reads English chat in Japanese and replies in Japanese that viewers read in English. The same layer translates bios and feeds the site's AI-picked daily spotlight.
ddiff --git a/src/content/projects/lyric-video-toolkit.mdx b/src/content/projects/lyric-video-toolkit.mdx
iindex 1252a45..0ab7348 100644
---- a/src/content/projects/lyric-video-toolkit.mdx
++++ b/src/content/projects/lyric-video-toolkit.mdx
@@@ -5,7 +5,8 @@ summary: "Python pipeline that takes a song + lyrics file and renders a karaoke-
tech: ["Python", "FFmpeg", "Whisper", "ASS Subtitles", "CustomTkinter"]
role: "Sole builder"
year: "2025"
--order: 30
++icon: "fa-solid fa-music"
++order: 32
---
A creative-audio rework + lyric-burn pipeline. Aligns words to audio, generates
ddiff --git a/src/content/projects/mp-select-mini.mdx b/src/content/projects/mp-select-mini.mdx
iindex 69d34bf..c04e102 100644
---- a/src/content/projects/mp-select-mini.mdx
++++ b/src/content/projects/mp-select-mini.mdx
@@@ -5,7 +5,8 @@ summary: "Extended-bed, custom firmware tuning, and Cura profile work on a Monop
tech: ["Cura", "G-code", "Hardware Modding", "Marlin-class firmware"]
role: "Tinkerer"
year: "Ongoing"
--order: 40
++icon: "fa-solid fa-print"
++order: 41
---
Took a $200 entry printer and wrung serious print quality out of it: layer-height
ddiff --git a/src/content/projects/openvibe-community.mdx b/src/content/projects/openvibe-community.mdx
nnew file mode 100644
iindex 0000000..16fbbdf
---- /dev/null
++++ b/src/content/projects/openvibe-community.mdx
@@@ -0,0 +1,17 @@
++---
++title: "OpenVibe.Community"
++category: "openvibe"
++summary: "Server-rendered paste and post hub with search, forks, feeds and silent SSO. It keeps no database of its own and proxies to Live so identity stays consistent."
++tech: ["Node.js", "Express", "SSR", "highlight.js", "OAuth2 client", "JSON-LD", "RSS"]
++role: "Founder · Sole Engineer"
++year: "2026"
++image: "/assets/img/sites/community.webp"
++icon: "fa-solid fa-comments"
++links: { "live": "https://openvibe.community" }
++featured: false
++order: 6
++---
++
++Share code, logs or a screenshot and get a short link that works anywhere. Every page is rendered on the server with progressive JavaScript on top, so pastes read fine with scripts off and index cleanly with canonical, Open Graph and Article structured data.
++
++The service owns no data: paste requests stream through to Live, the only service that can resolve the visitor's identity, and sign-in uses a silent `prompt=none` flow so a Live session simply appears here.
ddiff --git a/src/content/projects/openvibe-cutover.mdx b/src/content/projects/openvibe-cutover.mdx
nnew file mode 100644
iindex 0000000..eb93ce1
---- /dev/null
++++ b/src/content/projects/openvibe-cutover.mdx
@@@ -0,0 +1,17 @@
++---
++title: "Network cutover & migration suite"
++category: "infra"
++summary: "Zero-downtime migration from a monolith to seven services: dry-run-first migration scripts, a three-window runbook with smoke tests, and legacy-domain redirects that kept every old link alive."
++tech: ["Node.js", "SQLite", "SQL", "Bash", "nginx", "systemd", "Runbooks"]
++role: "Architect · Operator"
++year: "2026"
++icon: "fa-solid fa-diagram-project"
++order: 8
++---
++
++The old network was one database and one process. The new one is seven services with contracts between them. Getting from one to the other without losing a user, a coin balance or a live player took a written plan.
++
++- **Contracts first.** A formal inter-service document fixes domains, ports, OAuth clients, the wallet API, the Media API and notification semantics before any code moved.
++- **Dry-run everything.** Each migration script (identity, live/media split, coins, game world tokens) runs read-only by default and only writes with `--apply`, validated against production snapshots first. Unmappable legacy balances were deliberately left in place for a future claim flow rather than guessed.
++- **Three windows.** Network and Tools, then Live and Media, then Games, each with timed steps, smoke tests and a rollback path, followed by a two-week soak before decommission.
++- **Nothing 404s.** hobostreamer.com, hobo.tools and hobo.quest permanently redirect into the new network.
ddiff --git a/src/content/projects/openvibe-games.mdx b/src/content/projects/openvibe-games.mdx
nnew file mode 100644
iindex 0000000..dee22df
---- /dev/null
++++ b/src/content/projects/openvibe-games.mdx
@@@ -0,0 +1,21 @@
++---
++title: "Scraplandia on OpenVibe.Games"
++category: "game"
++summary: "Browser multiplayer survival building game: authoritative dedicated server, client-side prediction, Havok physics, GMod-style physgun building and an in-browser collaborative editor."
++tech: ["TypeScript", "Babylon.js (WebGPU / WebGL)", "Havok", "WebSockets", "zod", "SQLite", "pnpm monorepo", "vitest", "Playwright"]
++role: "Founder · Engine & Gameplay Engineer"
++year: "2023–Present"
++image: "/assets/img/sites/games.webp"
++icon: "fa-solid fa-gamepad"
++links: { "live": "https://openvibe.games" }
++featured: true
++order: 5
++---
++
++A persistent multiplayer world that starts in a tab. The current engine is a seven-package TypeScript monorepo: Babylon.js rendering with WebGPU and a WebGL fallback, Havok physics on both client and a headless NullEngine server, and a zod-validated WebSocket protocol.
++
++**Netcode.** The server is authoritative; clients predict movement (Source-style, bunnyhop included) and reconcile. Props carry trust-based protection so a griefer cannot freeze your base.
++
++**Building.** A physgun lets players grab, freeze, rotate and grid-lock props, backed by gathering, crafting, skills, zones and extraction risk. An in-browser editor supports collaboration.
++
++**Durability.** The world survives SIGTERM with a 20-second flush. The 2026 migration carried 22 live players across from the previous engine, which I had written from scratch with a custom isomorphic compiler emitting both client and server builds.
ddiff --git a/src/content/projects/openvibe-live.mdx b/src/content/projects/openvibe-live.mdx
nnew file mode 100644
iindex 0000000..69bdb17
---- /dev/null
++++ b/src/content/projects/openvibe-live.mdx
@@@ -0,0 +1,25 @@
++---
++title: "OpenVibe.Live"
++category: "openvibe"
++summary: "Open live-streaming platform: RTMP, WHIP and WebRTC ingest, multi-destination restream, VODs, clips, chat, live captions and translation. 529 routes, one engineer."
++tech: ["Node.js", "Express", "SQLite", "mediasoup", "werift", "node-media-server", "ffmpeg", "whisper.cpp", "WebSockets", "OAuth2"]
++role: "Founder · Architect · Sole Engineer"
++year: "2022–Present"
++image: "/assets/img/sites/live.webp"
++icon: "fa-solid fa-tower-broadcast"
++links: { "live": "https://openvibe.live", "docs": "https://openvibe.live/docs/whip" }
++featured: true
++order: 1
++---
++
++The flagship of the network and the reason the rest exists. Streamers connect OBS, an SRT encoder, a browser tab or a phone; viewers get a player, chat, clips and VODs that keep working while the server is being redeployed.
++
++**Ingest and delivery.** RTMP, WHIP (open-CORS, so a backend-less web page can publish), a WebRTC SFU built on mediasoup, and a JSMPEG fallback. Restreams fan out through ffmpeg to Twitch, YouTube, Kick, custom RTMP and SRT destinations, and end with their source instead of lingering.
++
++**Media.** Recording, clip cutting and thumbnails are delegated to OpenVibe.Media over a signed, multi-tenant API. VODs tier from local disk to Backblaze B2 and Cloudflare R2 and stream back through presigned URLs.
++
++**Community layer.** Chat with moderation cascades, IP bans and redaction; a three-currency economy (OpenCoins earned site-wide, per-channel points, and Vibes for real-money support); voice rooms; watch-party song requests; PowerChat and RobotStreamer integrations with reconcile-and-retry webhooks.
++
++**AI, on a budget.** A provider-agnostic LLM client (OpenAI, OpenRouter, Groq, Together, Ollama, llama.cpp) metered by a daily budget powers auto-clips, stream memories, timelines and site copy. Speech is transcribed locally with whisper.cpp and translated into about 21 languages, which is how a Japanese-speaking streamer became the site's star.
++
++**Operations.** systemd socket activation gives zero-downtime restarts (90 of 90 requests served through a full restart in testing). A deploy script classifies each change as static, server, dependency, schema or unit-level and takes the least disruptive path, with `--wait-idle` and `--rollback`. A CDP performance harness with interleaved A/B runs took the home page from CLS 0.83 to 0.03.
ddiff --git a/src/content/projects/openvibe-media.mdx b/src/content/projects/openvibe-media.mdx
nnew file mode 100644
iindex 0000000..3d8e06b
---- /dev/null
++++ b/src/content/projects/openvibe-media.mdx
@@@ -0,0 +1,23 @@
++---
++title: "OpenVibe.Media"
++category: "openvibe"
++summary: "Multi-tenant media backend for the whole network: RTMP and RTP recording, chunked uploads, clip cutting, thumbnails, pastes, view counting and local → B2 → R2 storage tiering."
++tech: ["Node.js", "Express", "SQLite", "ffmpeg / ffprobe", "sharp", "AWS SDK v3 (S3)", "Backblaze B2", "Cloudflare R2", "HMAC webhooks"]
++role: "Founder · Architect · Sole Engineer"
++year: "2026"
++image: "/assets/img/sites/media.webp"
++icon: "fa-solid fa-photo-film"
++links: { "live": "https://openvibe.media" }
++featured: true
++order: 3
++---
++
++Every video, clip, thumbnail, paste and avatar on the network lives here, keyed by tenant app. Apps authenticate with constant-time keys or offline-verified user tokens, and cross-tenant access is a hard 403.
++
++**Recording.** VODs are pulled from RTMP or ingested over RTP/SDP with codec passthrough, then finalized through remux, probe, master-recovery, thumbnail and webhook steps. A background health scanner probes, decodes and quarantines broken files.
++
++**Storage tiering.** Files move from local disk to Backblaze B2 and Cloudflare R2 under disk pressure and play back through presigned URLs. Two production incidents shaped it: ghost rows starving the drain, and a file-descriptor leak from aborted range requests pinning 81 GB of unlinked files. Both are now guarded by design, including an fd watchdog.
++
++**Clips.** Failed cuts retry with backoff and pull cloud VODs back to hot storage on the second attempt, because seeking a fragmented MP4 over HTTP scans the whole file.
++
++**Privacy.** View counting is per visitor per six hours using an HMAC of the IP; raw addresses are never stored. Avatars from any site are ingested server-side, SSRF-checked and re-encoded, so no client-supplied image URL is ever stored or served.
ddiff --git a/src/content/projects/openvibe-network.mdx b/src/content/projects/openvibe-network.mdx
nnew file mode 100644
iindex 0000000..afcf7cf
---- /dev/null
++++ b/src/content/projects/openvibe-network.mdx
@@@ -0,0 +1,23 @@
++---
++title: "OpenVibe.Network"
++category: "openvibe"
++summary: "The identity and shared spine of the network: an OIDC/OAuth2 provider with RS256 tokens, the OpenCoins wallet, notifications, themes and the shared navbar every site renders."
++tech: ["Node.js", "Express", "SQLite", "OAuth2 / OIDC", "RS256 JWT / JWKS", "FedCM", "Web Push", "Resend", "Discord.js"]
++role: "Founder · Architect · Sole Engineer"
++year: "2026"
++image: "/assets/img/sites/network.webp"
++icon: "fa-solid fa-id-badge"
++links: { "live": "https://openvibe.network" }
++featured: true
++order: 2
++---
++
++One account for every OpenVibe site. The Network issues RS256 access tokens and rotating refresh tokens, publishes discovery and JWKS, and every other service verifies offline against the cached key set, so a Network outage never blocks a logged-in viewer.
++
++**Sign-in that gets out of the way.** Silent cross-site hand-off, a read-only SSO probe, and FedCM (the Network is an identity provider), so clicking from Live to Tools never shows a login screen twice. Multi-account switching and anonymous identities that can link later.
++
++**Wallet and notifications.** Atomic credit, debit and transfer endpoints with idempotency keys for OpenCoins; a unified inbox with web push, email and Discord delivery and rate governance (go-live cooldowns, per-streamer and per-user daily caps).
++
++**Shared chrome.** One package serves the navbar, footer, theme loader, notification UI, account switcher and the animated OV brand mark to every site. Navigation is ranked by an anonymous per-host page-view beacon that honours Global Privacy Control, and the footer copy is regenerated daily by an AI job behind a budget.
++
++**Themes.** About 30 built-in themes synced network-wide, with derived tokens, theme-following favicons and per-user display preferences for motion and text size.
ddiff --git a/src/content/projects/openvibe-sites.mdx b/src/content/projects/openvibe-sites.mdx
nnew file mode 100644
iindex 0000000..089a4fa
---- /dev/null
++++ b/src/content/projects/openvibe-sites.mdx
@@@ -0,0 +1,13 @@
++---
++title: "OpenVibe.Sites"
++category: "openvibe"
++summary: "Thirteen network domains served from one catalog and one template that generate both the pages and the nginx configs, with a CI check that fails when the build is stale."
++tech: ["Node.js", "Static build", "nginx", "Let's Encrypt wildcard", "JSON-LD"]
++role: "Founder · Sole Engineer"
++year: "2026"
++icon: "fa-solid fa-globe"
++links: { "live": "https://openvibe.chat" }
++order: 7
++---
++
++openvibe.chat, .codes, .blog, .wiki, .news, .reviews, .tips, .vip, .trade, .host, .deals, .coupons and openre.stream all needed a real front door before they became apps. `sites.json` plus `build.js` emit a directory per domain and a matching nginx vhost; each page carries the shared navbar, footer and theme loader, so the whole network reads as one brand with many rooms.
ddiff --git a/src/content/projects/openvibe-tools.mdx b/src/content/projects/openvibe-tools.mdx
nnew file mode 100644
iindex 0000000..e9984c9
---- /dev/null
++++ b/src/content/projects/openvibe-tools.mdx
@@@ -0,0 +1,21 @@
++---
++title: "OpenVibe.Tools"
++category: "openvibe"
++summary: "169 server-rendered tools across 8 families with a host registry, custom-domain mirrors and full SEO plumbing: converters, PDF, images, audio, DNS, YouTube, maps and food finders."
++tech: ["Node.js", "Express", "Multi-app gateway", "OAuth2 client", "SSR", "yt-dlp", "sharp", "ffmpeg", "Leaflet"]
++role: "Founder · Architect · Sole Engineer"
++year: "2023–Present"
++image: "/assets/img/sites/tools.webp"
++icon: "fa-solid fa-toolbox"
++links: { "live": "https://openvibe.tools" }
++featured: true
++order: 4
++---
++
++A gateway plus seven satellite apps serving 169 tools from one catalog: developer utilities, network lookups, image and audio converters, PDF and document tools, text and logo generators, a YouTube downloader, a North America survival map and a food-bank finder.
++
++**One catalog, many addresses.** A host registry gives every tool a canonical host, a short memorable host and 301 aliases, merged every minute with owner overrides from the Network's domain admin. Purchased domains attach to a tool from the admin UI; people are redirected to the short address while crawlers keep the descriptive one. Unknown subdomains redirect to the index so wildcard DNS never renders an invented brand.
++
++**Built for search.** Every tool is server-rendered with no required JavaScript, carries its own title, description, FAQ structured data and sitemap entry, and the index and `llms.txt` are generated from the catalog.
++
++**Operating notes.** YouTube blocks the datacenter address on every player client; the app probes every 30 minutes and shows an honest banner rather than a broken download button.
ddiff --git a/src/content/projects/openvibe.mdx b/src/content/projects/openvibe.mdx
ddeleted file mode 100644
iindex eb58c10..0000000
---- a/src/content/projects/openvibe.mdx
++++ /dev/null
@@@ -1,25 +0,0 @@
-----
--title: "OpenVibe"
--category: "hobo"
--summary: "Open-source creator platform kernel — 15+ microservices spanning identity, live streaming, media, billing, and AI, designed and built by one person."
--tech: ["Node.js", "TypeScript", "Express", "SQLite", "PostgreSQL", "WebRTC", "WebSockets", "Redis", "OAuth2", "OIDC", "FFmpeg", "REST APIs", "Event-Driven Architecture", "Microservices"]
--role: "Sole Architect & Principal Engineer"
--year: "2024–2026"
--links: { "repo": "https://github.com/HoboStreamer/OpenVibe-Temporary-MonoRepo" }
--featured: true
--order: 5
-----
--
--A fully open-source, self-hosted platform kernel — Twitch, YouTube, Patreon, and Discord in one deployable monorepo. Designed and built by one person across 16 documented phases.
--
--**What's in it:**
--
--- **Identity & control plane** — OIDC/OAuth2 provider, service registry, capability contracts, policy engine
--- **Live streaming** — RTMP ingest, multi-destination restream (OBS → Twitch / YouTube / Kick simultaneously), DVR, viewer analytics
--- **Media** — object store for VODs, clips, and thumbnails with derivative pipeline, quotas, and audit log
--- **Community** — real-time chat with moderation and custom emotes, forums, Discord-style channels
--- **Billing** — credits ledger, tips, VIP tiers, payout engine with SOX-style audit trail
--- **AI & search** — autonomous content tagging, SEO generation, embedding-based search
--- **Infrastructure** — distributed event bus with full audit envelope, WebSocket/pub-sub realtime layer, task queues, and shared typed-contract packages (SQLite + PostgreSQL dual-mode persistence)
--
--**Status:** 11+ of 16 phases fully implemented; cutover runbook and migration tooling complete. Servers offline since May 2026 during job search — the architecture is sound and the code is all there.
ddiff --git a/src/content/projects/perf-harness.mdx b/src/content/projects/perf-harness.mdx
nnew file mode 100644
iindex 0000000..2742824
---- /dev/null
++++ b/src/content/projects/perf-harness.mdx
@@@ -0,0 +1,14 @@
++---
++title: "Performance harness & route loading"
++category: "infra"
++summary: "Headless-Chrome DevTools harness with interleaved A/B runs and layout-shift attribution. Home page CLS 0.83 → 0.03, warm FCP 1066 → 550 ms, first-2s JS parse cut by half a megabyte."
++tech: ["Chrome DevTools Protocol", "Node.js", "Performance budgets", "Coverage analysis"]
++role: "Sole Engineer"
++year: "2026"
++icon: "fa-solid fa-gauge-high"
++order: 10
++---
++
++Asked for provable before-and-after numbers rather than assertions, I built the measurement first. `measure-page.js` reports median TTFB, FCP, LCP, CLS, long-task time, bytes and request counts under desktop and throttled-phone profiles; `ab.js` interleaves two variants so machine noise cancels; `trace-page.js` attributes forced layout to the script that caused it; `check-budgets.js` runs in `npm test`.
++
++Precise coverage showed 14 percent of shipped JavaScript executing on the home page, so heavy routes moved behind an inline loader with idle prefetch. Layout-shift attribution found one hero stat board responsible for 72 percent of CLS. Idle-page animation gating cut running animations from 72 to 27 and idle main-thread time by about 41 percent.
ddiff --git a/src/content/projects/powerchat-developer-api.mdx b/src/content/projects/powerchat-developer-api.mdx
nnew file mode 100644
iindex 0000000..164f19a
---- /dev/null
++++ b/src/content/projects/powerchat-developer-api.mdx
@@@ -0,0 +1,16 @@
++---
++title: "PowerChat Developer API platform"
++category: "powerchat"
++summary: "Turned PowerChat into an OAuth2 authorization server with scoped consent, HMAC-signed webhooks and an inbound API, so third-party apps act as platforms feeding chat, subs, currency and tips into overlays."
++tech: ["TypeScript", "Node.js", "Express", "React", "Prisma", "PostgreSQL", "OAuth2", "HMAC webhooks", "BullMQ"]
++role: "Designer · Sole Engineer on the program"
++year: "2026"
++icon: "fa-solid fa-plug"
++links: { "live": "https://powerchat.gg" }
++featured: true
++order: 11
++---
++
++Designed and built end to end in my first weeks on the contract. Developers register an app once, request scoped permissions and send streamers through a standard consent screen. Authorized apps receive HMAC-signed webhooks and can push chat, view counts, follows, subscriptions, virtual currency and tips straight into a streamer's overlays, exactly as a first-party platform would.
++
++The work spanned OAuth and consent flows, token lifecycle, the inbound API and webhook delivery, the developer dashboard and documentation, admin review and audit tooling, branding and currency configuration, schema and migrations, and the unit and integration coverage behind it. Streamlabs was re-implemented as the first official app on the framework, retiring its hardcoded integration path. OpenVibe.Live was the first external platform to integrate.
ddiff --git a/src/content/projects/powerchat-payments.mdx b/src/content/projects/powerchat-payments.mdx
nnew file mode 100644
iindex 0000000..8970e0d
---- /dev/null
++++ b/src/content/projects/powerchat-payments.mdx
@@@ -0,0 +1,20 @@
++---
++title: "PowerChat payments program"
++category: "powerchat"
++summary: "Every payment, payout and billing capability of the product rebuilt as one system: a provider-agnostic charge rail with five adapters, append-only ledgers, Tipalti payouts, recurring billing and admin reconciliation."
++tech: ["TypeScript", "Stripe Connect", "Square", "PayPal", "NMI", "NowPayments", "Tipalti", "Prisma", "PostgreSQL 17", "BullMQ"]
++role: "Designer · Sole Engineer on the program"
++year: "2026"
++icon: "fa-solid fa-credit-card"
++links: { "live": "https://powerchat.gg" }
++featured: true
++order: 12
++---
++
++One payment-first ledger and one idempotent `confirmCharge`, fed by three racing triggers (provider webhook, the tipper's return poll and a nightly sweep), behind a registry of providers: Stripe Connect Express, Square, PayPal partner referrals, PowerChat Pay on an NMI tokenized vault, and NowPayments crypto invoices. The tipper picks the method explicitly; an unavailable pick is a 400, never a silent fallback onto a different processor.
++
++**Ledgers.** Streamer and crypto balances are append-only with a schema-unique external identity per entry, so double-crediting is structurally impossible. Payout submission is gated on an independent sum recompute; mismatches park as held with a reason, and failures reverse through explicit entries rather than deletes.
++
++**Recurring billing.** Pro plans and viewer-to-streamer subscriptions charge the vault on our schedule with a 1, 3 and 7-day retry ladder and drift-free period math; entitlements change only from confirmed billing state or an audited admin correction.
++
++**Verification.** Each provider webhook sits behind its own verifier (HMAC-SHA256, PayPal's verify-signature API, HMAC-SHA512 over key-sorted JSON) and a delivery dedupe table. Card data lives in provider-hosted iframes and never touches PowerChat. Validated by a governed integration suite that drives all six rails through the production HTTP composition, plus an empty-PostgreSQL migration proof in CI.
ddiff --git a/src/content/projects/pytools-workshop.mdx b/src/content/projects/pytools-workshop.mdx
iindex 2786c6c..0060f82 100644
---- a/src/content/projects/pytools-workshop.mdx
++++ b/src/content/projects/pytools-workshop.mdx
@@@ -5,7 +5,8 @@ summary: "A growing collection of focused Python utilities — file organizer, i
tech: ["Python", "CustomTkinter", "LLM Tooling", "Pandas"]
role: "Sole builder"
year: "Ongoing"
--order: 32
++icon: "fa-solid fa-flask"
++order: 34
---
Single-file utilities I reach for daily. Each one solves a real problem in
ddiff --git a/src/content/projects/robotstreamer-toolkit.mdx b/src/content/projects/robotstreamer-toolkit.mdx
iindex 3f5539c..9e94a19 100644
---- a/src/content/projects/robotstreamer-toolkit.mdx
++++ b/src/content/projects/robotstreamer-toolkit.mdx
@@@ -1,11 +1,12 @@
---
title: "RobotStreamer Toolkit"
category: "python"
--summary: "Full-GUI Tk toolkit for managing RobotStreamer accounts: bulk delete, VOD discord cards, OpenVibe Tools integration."
++summary: "Full-GUI Tk toolkit for managing RobotStreamer accounts: bulk moderation, VOD Discord cards and OpenVibe.Live hand-off."
tech: ["Python", "Tkinter", "Requests", "Discord Webhooks"]
role: "Sole builder"
year: "2025"
--order: 31
++icon: "fa-solid fa-robot"
++order: 33
---
Built for power users on RobotStreamer. Handles tedious moderation and content
ddiff --git a/src/content/projects/youtube-desktop-client.mdx b/src/content/projects/youtube-desktop-client.mdx
nnew file mode 100644
iindex 0000000..5195654
---- /dev/null
++++ b/src/content/projects/youtube-desktop-client.mdx
@@@ -0,0 +1,12 @@
++---
++title: "MPV YouTube desktop client"
++category: "tools"
++summary: "Electron desktop YouTube power client built around mpv: persistent queue, collections, hardware-acceleration detection, GitHub Releases auto-update and an in-app diagnostics panel."
++tech: ["Electron", "Node.js", "mpv", "JavaScript", "IPC"]
++role: "Sole builder"
++year: "2025"
++icon: "fa-solid fa-play"
++order: 40
++---
++
++A minimal-distraction desktop client for buttery 4K playback through mpv, with a proper persistent queue, collection management and diagnostics. Built as a personal tool alongside the OpenVibe clip pipeline.
ddiff --git a/src/content/skills/01-analytics.json b/src/content/skills/01-analytics.json
ddeleted file mode 100644
iindex 800663f..0000000
---- a/src/content/skills/01-analytics.json
++++ /dev/null
@@@ -1,12 +0,0 @@
--{
-- "group": "Analytics / Data",
-- "order": 1,
-- "items": [
-- { "name": "SQL", "level": "core" },
-- { "name": "Excel / Power Query", "level": "core" },
-- { "name": "ICQA Reporting", "level": "core" },
-- { "name": "Defect Research", "level": "core" },
-- { "name": "Dashboards", "level": "strong" },
-- { "name": "Root Cause Analysis", "level": "core" }
-- ]
--}
ddiff --git a/src/content/skills/01-engineering.json b/src/content/skills/01-engineering.json
nnew file mode 100644
iindex 0000000..6b320e9
---- /dev/null
++++ b/src/content/skills/01-engineering.json
@@@ -0,0 +1,48 @@
++{
++ "group": "Engineering & platform",
++ "icon": "fa-solid fa-code",
++ "order": 1,
++ "blurb": "Backends, APIs and the front ends that sit on them.",
++ "items": [
++ {
++ "name": "TypeScript / JavaScript",
++ "level": "core"
++ },
++ {
++ "name": "Node.js / Express",
++ "level": "core"
++ },
++ {
++ "name": "React",
++ "level": "strong"
++ },
++ {
++ "name": "Python",
++ "level": "core"
++ },
++ {
++ "name": "PostgreSQL / Prisma",
++ "level": "strong"
++ },
++ {
++ "name": "SQLite (WAL) / MySQL",
++ "level": "core"
++ },
++ {
++ "name": "Redis / BullMQ",
++ "level": "strong"
++ },
++ {
++ "name": "REST & event-driven design",
++ "level": "core"
++ },
++ {
++ "name": "PHP",
++ "level": "strong"
++ },
++ {
++ "name": "HTML / CSS / SSR",
++ "level": "core"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/skills/02-engineering.json b/src/content/skills/02-engineering.json
ddeleted file mode 100644
iindex 57062cc..0000000
---- a/src/content/skills/02-engineering.json
++++ /dev/null
@@@ -1,14 +0,0 @@
--{
-- "group": "Engineering / Web",
-- "order": 2,
-- "items": [
-- { "name": "JavaScript / TypeScript", "level": "core" },
-- { "name": "Node.js", "level": "core" },
-- { "name": "Python", "level": "core" },
-- { "name": "PHP", "level": "strong" },
-- { "name": "React / Vue", "level": "strong" },
-- { "name": "Electron", "level": "strong" },
-- { "name": "HTML5 / CSS / SASS", "level": "core" },
-- { "name": "REST APIs", "level": "core" }
-- ]
--}
ddiff --git a/src/content/skills/02-streaming.json b/src/content/skills/02-streaming.json
nnew file mode 100644
iindex 0000000..a4dad41
---- /dev/null
++++ b/src/content/skills/02-streaming.json
@@@ -0,0 +1,40 @@
++{
++ "group": "Streaming & realtime",
++ "icon": "fa-solid fa-tower-broadcast",
++ "order": 2,
++ "blurb": "Getting video from an encoder to a viewer without dropping frames.",
++ "items": [
++ {
++ "name": "RTMP / SRT / WHIP",
++ "level": "core"
++ },
++ {
++ "name": "WebRTC (mediasoup, werift)",
++ "level": "core"
++ },
++ {
++ "name": "ffmpeg pipelines",
++ "level": "core"
++ },
++ {
++ "name": "HLS / DASH",
++ "level": "strong"
++ },
++ {
++ "name": "WebSockets",
++ "level": "core"
++ },
++ {
++ "name": "TURN / coturn",
++ "level": "strong"
++ },
++ {
++ "name": "Restream & VOD systems",
++ "level": "core"
++ },
++ {
++ "name": "Live captions (whisper.cpp)",
++ "level": "strong"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/skills/03-ai-data.json b/src/content/skills/03-ai-data.json
nnew file mode 100644
iindex 0000000..b311ffe
---- /dev/null
++++ b/src/content/skills/03-ai-data.json
@@@ -0,0 +1,40 @@
++{
++ "group": "AI tooling & data",
++ "icon": "fa-solid fa-robot",
++ "order": 3,
++ "blurb": "LLM features with budgets, caching and guardrails, plus the analytics that came first.",
++ "items": [
++ {
++ "name": "Anthropic / OpenAI-compatible APIs",
++ "level": "core"
++ },
++ {
++ "name": "Tool-use agents",
++ "level": "core"
++ },
++ {
++ "name": "Local inference (whisper.cpp, Ollama)",
++ "level": "strong"
++ },
++ {
++ "name": "Prompt & cost governance",
++ "level": "core"
++ },
++ {
++ "name": "SQL analytics",
++ "level": "core"
++ },
++ {
++ "name": "Excel / Power Query / VBA",
++ "level": "core"
++ },
++ {
++ "name": "Dashboards & reporting",
++ "level": "core"
++ },
++ {
++ "name": "Root-cause analysis",
++ "level": "core"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/skills/03-systems.json b/src/content/skills/03-systems.json
ddeleted file mode 100644
iindex 5f69bd4..0000000
---- a/src/content/skills/03-systems.json
++++ /dev/null
@@@ -1,13 +0,0 @@
--{
-- "group": "Systems / Infrastructure",
-- "order": 3,
-- "items": [
-- { "name": "Linux (Debian/Ubuntu)", "level": "core" },
-- { "name": "Windows Server", "level": "strong" },
-- { "name": "NGINX / Apache", "level": "core" },
-- { "name": "MongoDB / Redis / MySQL", "level": "core" },
-- { "name": "Cloudflare", "level": "strong" },
-- { "name": "DDoS Resilience", "level": "strong" },
-- { "name": "Datacenter / 1U-2U builds", "level": "strong" }
-- ]
--}
ddiff --git a/src/content/skills/04-gamedev.json b/src/content/skills/04-gamedev.json
ddeleted file mode 100644
iindex 2770cc3..0000000
---- a/src/content/skills/04-gamedev.json
++++ /dev/null
@@@ -1,12 +0,0 @@
--{
-- "group": "Game Dev / Product",
-- "order": 4,
-- "items": [
-- { "name": "Lua", "level": "core" },
-- { "name": "C# / C++", "level": "familiar" },
-- { "name": "Gameplay Systems", "level": "strong" },
-- { "name": "Creator Tooling", "level": "core" },
-- { "name": "UX & Product Thinking", "level": "core" },
-- { "name": "Source Engine", "level": "strong" }
-- ]
--}
ddiff --git a/src/content/skills/04-infra.json b/src/content/skills/04-infra.json
nnew file mode 100644
iindex 0000000..7d7b4bf
---- /dev/null
++++ b/src/content/skills/04-infra.json
@@@ -0,0 +1,48 @@
++{
++ "group": "Infrastructure & operations",
++ "icon": "fa-solid fa-server",
++ "order": 4,
++ "blurb": "I deploy what I build and get paged for it.",
++ "items": [
++ {
++ "name": "Linux (Debian / Ubuntu)",
++ "level": "core"
++ },
++ {
++ "name": "nginx",
++ "level": "core"
++ },
++ {
++ "name": "systemd & socket activation",
++ "level": "core"
++ },
++ {
++ "name": "Docker / Compose",
++ "level": "strong"
++ },
++ {
++ "name": "Cloudflare (DNS, edge, R2)",
++ "level": "strong"
++ },
++ {
++ "name": "Backblaze B2 / S3 APIs",
++ "level": "strong"
++ },
++ {
++ "name": "Zero-downtime deploys & rollback",
++ "level": "core"
++ },
++ {
++ "name": "Performance profiling (CDP)",
++ "level": "strong"
++ },
++ {
++ "name": "DDoS resilience",
++ "level": "strong"
++ },
++ {
++ "name": "Bare-metal 1U/2U builds",
++ "level": "strong"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/skills/05-identity-payments.json b/src/content/skills/05-identity-payments.json
nnew file mode 100644
iindex 0000000..caac5cc
---- /dev/null
++++ b/src/content/skills/05-identity-payments.json
@@@ -0,0 +1,40 @@
++{
++ "group": "Identity, payments & security",
++ "icon": "fa-solid fa-shield-halved",
++ "order": 5,
++ "blurb": "The parts that must not be wrong.",
++ "items": [
++ {
++ "name": "OAuth2 / OIDC providers",
++ "level": "core"
++ },
++ {
++ "name": "JWT (RS256), JWKS, SSO, FedCM",
++ "level": "core"
++ },
++ {
++ "name": "Stripe Connect / Square / PayPal",
++ "level": "strong"
++ },
++ {
++ "name": "NMI vault / Tipalti payouts",
++ "level": "strong"
++ },
++ {
++ "name": "Ledger design & idempotency",
++ "level": "core"
++ },
++ {
++ "name": "Webhook signing & verification",
++ "level": "core"
++ },
++ {
++ "name": "SSRF / egress hardening",
++ "level": "strong"
++ },
++ {
++ "name": "SOX-style audit trails",
++ "level": "core"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/skills/05-other.json b/src/content/skills/05-other.json
ddeleted file mode 100644
iindex 89725bb..0000000
---- a/src/content/skills/05-other.json
++++ /dev/null
@@@ -1,15 +0,0 @@
--{
-- "group": "Robotics · Hardware · Leadership",
-- "order": 5,
-- "items": [
-- { "name": "ARS Robotics Support", "level": "strong" },
-- { "name": "Electro-mechanical Troubleshooting", "level": "strong" },
-- { "name": "3D Printing (MP Select Mini)", "level": "strong" },
-- { "name": "Photoshop / Graphics", "level": "core" },
-- { "name": "Consultative Sales", "level": "strong" },
-- { "name": "Team Leadership & Coaching", "level": "strong" },
-- { "name": "Quota Attainment", "level": "strong" },
-- { "name": "Customer Retention", "level": "core" },
-- { "name": "Customer Support", "level": "core" }
-- ]
--}
ddiff --git a/src/content/skills/06-gamedev.json b/src/content/skills/06-gamedev.json
nnew file mode 100644
iindex 0000000..50ea169
---- /dev/null
++++ b/src/content/skills/06-gamedev.json
@@@ -0,0 +1,32 @@
++{
++ "group": "Game development",
++ "icon": "fa-solid fa-gamepad",
++ "order": 6,
++ "blurb": "Multiplayer first, physics second, everything authoritative.",
++ "items": [
++ {
++ "name": "Babylon.js (WebGPU/WebGL)",
++ "level": "strong"
++ },
++ {
++ "name": "Havok physics",
++ "level": "strong"
++ },
++ {
++ "name": "Authoritative servers & prediction",
++ "level": "core"
++ },
++ {
++ "name": "Lua / Source Engine",
++ "level": "core"
++ },
++ {
++ "name": "C# / C++",
++ "level": "familiar"
++ },
++ {
++ "name": "Gameplay systems & economies",
++ "level": "strong"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/content/skills/07-leadership.json b/src/content/skills/07-leadership.json
nnew file mode 100644
iindex 0000000..f90f307
---- /dev/null
++++ b/src/content/skills/07-leadership.json
@@@ -0,0 +1,32 @@
++{
++ "group": "Leadership & communication",
++ "icon": "fa-solid fa-people-group",
++ "order": 7,
++ "blurb": "Ten years of running a company and a few of running a sales floor.",
++ "items": [
++ {
++ "name": "Founding & operating an LLC",
++ "level": "core"
++ },
++ {
++ "name": "Technical writing & runbooks",
++ "level": "core"
++ },
++ {
++ "name": "Coaching & team leadership",
++ "level": "strong"
++ },
++ {
++ "name": "Consultative sales",
++ "level": "strong"
++ },
++ {
++ "name": "Stakeholder reporting",
++ "level": "core"
++ },
++ {
++ "name": "Community moderation at scale",
++ "level": "strong"
++ }
++ ]
++}
\\ No newline at end of file
ddiff --git a/src/data/profile.json b/src/data/profile.json
nnew file mode 100644
iindex 0000000..6fe2fb3
---- /dev/null
++++ b/src/data/profile.json
@@@ -0,0 +1,51 @@
++{
++ "name": "Alex Frison",
++ "tagline": "Software engineer, platform architect and founder of the OpenVibe network.",
++ "headline": "I build the whole stack, then run it.",
++ "roles": ["Software Engineer", "Platform Architect", "Founder of OpenVibe", "Streaming Infrastructure Builder", "AI Tooling Engineer", "Data Analyst"],
++ "location": "Arlington · Seattle · Pacific Northwest",
++ "locationShort": "Seattle / Arlington, WA",
++ "email": "[email protected]",
++ "emailDisplay": "[email protected]",
++ "phone": "+14253673997",
++ "phoneDisplay": "(425) 367-3997",
++ "site": "https://alexfrison.net",
++ "siteDisplay": "alexfrison.net",
++ "github": "https://github.com/OpenVibers",
++ "githubDisplay": "github.com/OpenVibers",
++ "linkedin": "https://www.linkedin.com/in/fris/",
++ "linkedinDisplay": "linkedin.com/in/fris",
++ "resumePdf": "/Alex_Frison_Resume_Sep_2026.pdf",
++ "availability": "Open to senior engineering, platform and founding-engineer roles · remote or Pacific Northwest",
++ "status": {
++ "now": "Contract software engineer at PowerChat, building its developer platform and payments program.",
++ "also": "Founder and sole engineer of OpenVibe: seven services, 20+ domains, one operator."
++ },
++ "pitch": "Full-stack engineer with 10+ years shipping production systems and a habit of owning them end to end. I designed and run OpenVibe, an open live-streaming and tools network of seven Node services behind one identity provider. At PowerChat I turned the product into an OAuth2 platform and rebuilt its payments across five processors. Before that I ran SOX-compliance analytics at Amazon and shipped autonomous research agents that analysts used daily.",
++ "seeking": [
++ { "label": "Senior / staff engineer", "detail": "Full-stack, platform, streaming or realtime systems" },
++ { "label": "Founding engineer", "detail": "Small teams that need someone to own the stack" },
++ { "label": "AI tooling & agents", "detail": "LLM products with budgets, guardrails and real users" },
++ { "label": "Data & analytics", "detail": "SQL, reporting and compliance tooling that people act on" }
++ ],
++ "metrics": [
++ { "num": 7, "suffix": "", "label": "OpenVibe services designed, built and operated solo", "icon": "fa-solid fa-cubes-stacked" },
++ { "num": 900, "suffix": "+", "label": "HTTP routes across the OpenVibe network", "icon": "fa-solid fa-route" },
++ { "num": 363, "suffix": "k", "label": "Lines of code in the OpenVibe repos", "icon": "fa-solid fa-code" },
++ { "num": 169, "suffix": "", "label": "Tools catalogued on OpenVibe.Tools", "icon": "fa-solid fa-toolbox" },
++ { "num": 5, "suffix": "", "label": "Payment processors unified at PowerChat", "icon": "fa-solid fa-credit-card" },
++ { "num": 1000, "suffix": "+", "label": "SOX-compliance IRDRs researched at Amazon", "icon": "fa-solid fa-magnifying-glass-chart" },
++ { "num": 200, "suffix": "k+", "label": "Live game servers tracked by GameServerStats", "icon": "fa-solid fa-tower-broadcast" },
++ { "num": 10, "suffix": "+", "label": "Years running my own company", "icon": "fa-solid fa-building-flag" }
++ ],
++ "network": [
++ { "key": "live", "name": "OpenVibe.Live", "url": "https://openvibe.live", "role": "Live streaming", "blurb": "RTMP, WHIP and WebRTC ingest, multi-destination restream, VODs, clips, chat, live captions and translation.", "stat": "529 routes · 179k LOC", "image": "/assets/img/sites/live.webp" },
++ { "key": "network", "name": "OpenVibe.Network", "url": "https://openvibe.network", "role": "Identity & spine", "blurb": "OIDC/OAuth2 provider, OpenCoins wallet, notifications, themes and the shared chrome every site renders.", "stat": "176 routes · RS256", "image": "/assets/img/sites/network.webp" },
++ { "key": "media", "name": "OpenVibe.Media", "url": "https://openvibe.media", "role": "Media backend", "blurb": "Multi-tenant media API: recording, uploads, clip cutting, thumbnails, pastes and local → B2 → R2 storage tiering.", "stat": "86 routes · 3 tiers", "image": "/assets/img/sites/media.webp" },
++ { "key": "tools", "name": "OpenVibe.Tools", "url": "https://openvibe.tools", "role": "Tools suite", "blurb": "169 server-rendered tools across 8 families, a host registry with custom-domain mirrors, and full SEO plumbing.", "stat": "169 tools · 8 families", "image": "/assets/img/sites/tools.webp" },
++ { "key": "games", "name": "OpenVibe.Games", "url": "https://openvibe.games", "role": "Scraplandia", "blurb": "Browser multiplayer survival game: authoritative server, client prediction, Havok physics, physgun building.", "stat": "56k LOC TypeScript", "image": "/assets/img/sites/games.webp" },
++ { "key": "community", "name": "OpenVibe.Community", "url": "https://openvibe.community", "role": "Pastes & posts", "blurb": "Server-rendered paste hub with forks, search, feeds and silent SSO, proxied to Live so identity stays consistent.", "stat": "No DB of its own", "image": "/assets/img/sites/community.webp" },
++ { "key": "sites", "name": "OpenVibe.Sites", "url": "https://openvibe.chat", "role": "13 front doors", "blurb": "One catalog and one template generate the pages and nginx configs for openvibe.chat, .codes, .wiki, .news and more.", "stat": "13 domains · 1 build", "image": null }
++ ],
++ "education": "Snohomish High School, WA. AP Statistics, Calculus, English, Creative Writing and Spanish. Self-taught engineer since age 12: systems, infrastructure, graphics, hardware and whatever the problem needs."
++}
ddiff --git a/src/layouts/Base.astro b/src/layouts/Base.astro
iindex c83a6b6..64fda6b 100644
---- a/src/layouts/Base.astro
++++ b/src/layouts/Base.astro
@@@ -2,25 +2,30 @@
import "../styles/global.css";
import Nav from "../components/Nav.astro";
import Footer from "../components/Footer.astro";
++import profile from "../data/profile.json";
interface Props {
title?: string;
description?: string;
image?: string;
canonical?: string;
++ type?: string;
}
const {
-- title = "Alex Frison — Software Engineer · Data Analyst · Builder",
-- description = "Alex Frison: Seattle-based data analyst, software engineer, and product builder. Amazon ICQA analytics, autonomous research agents, OpenVibe streaming products, and a decade of shipping web platforms.",
++ title = "Alex Frison — Software Engineer · Platform Architect · Founder of OpenVibe",
++ description = "Alex Frison: Pacific Northwest software engineer and founder of the OpenVibe network (live streaming, identity, media, 169 tools, games). Contract engineer at PowerChat building its developer platform and payments. Formerly Amazon ICQA analytics.",
image = "/assets/img/og.png",
canonical,
++ type = "website",
} = Astro.props;
--const pageUrl = canonical ?? new URL(Astro.url.pathname, Astro.site).toString();
++const site = Astro.site ?? new URL("https://alexfrison.net");
++const pageUrl = canonical ?? new URL(Astro.url.pathname, site).toString();
++const imageUrl = new URL(image, site).toString();
---
<!doctype html>
--<html lang="en" data-theme="dark">
++<html lang="en" data-theme="dark" class="no-js">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
@@@ -28,90 +33,203 @@ const pageUrl = canonical ?? new URL(Astro.url.pathname, Astro.site).toString();
<meta name="description" content={description} />
<link rel="canonical" href={pageUrl} />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
-- <meta name="theme-color" content="#0a1018" />
++ <link rel="sitemap" href="/sitemap-index.xml" />
++ <meta name="theme-color" content="#07090f" />
++ <meta name="color-scheme" content="dark light" />
-- <meta property="og:type" content="website" />
++ <meta property="og:type" content={type} />
++ <meta property="og:site_name" content="Alex Frison" />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
-- <meta property="og:image" content={image} />
++ <meta property="og:image" content={imageUrl} />
<meta property="og:url" content={pageUrl} />
<meta name="twitter:card" content="summary_large_image" />
++ <meta name="twitter:title" content={title} />
++ <meta name="twitter:description" content={description} />
++ <meta name="twitter:image" content={imageUrl} />
<meta name="robots" content="index, follow" />
<meta name="author" content="Alex Frison" />
-- <meta name="keywords" content="Alex Frison, Data Analyst, Software Engineer, Seattle, Arlington WA, Amazon ICQA, SQL, Python, TypeScript, Node.js, React, Full-Stack Developer, Autonomous Agents, AI Agent Builder, Systems Architect, SOX Compliance, Open Source, Pacific Northwest" />
++ <meta name="keywords" content="Alex Frison, Software Engineer, Platform Architect, OpenVibe, Live Streaming, WebRTC, RTMP, OAuth2, OIDC, Payments, Stripe, Node.js, TypeScript, Seattle, Arlington WA, Pacific Northwest, Founding Engineer, AI Agents, Data Analyst, Amazon ICQA, SOX" />
-- <script type="application/ld+json">
-- {
++ <script type="application/ld+json" set:html={JSON.stringify({
"@context": "https://schema.org",
"@type": "Person",
-- "name": "Alex Frison",
-- "url": "https://alexfrison.net",
-- "email": "[email protected]",
-- "telephone": "+14253673997",
-- "image": "https://alexfrison.net/assets/img/alex-cut1.png",
-- "jobTitle": "Data Analyst · Software Engineer",
-- "description": "Seattle-area data analyst and full-stack software engineer with 10+ years shipping web platforms, autonomous analytics agents, and creator infrastructure. Open to new roles.",
-- "knowsAbout": [
-- "Data Analysis", "SQL", "Python", "TypeScript", "Node.js",
-- "Machine Learning", "Autonomous Agents", "Streaming Platforms",
-- "Systems Architecture", "SOX Compliance", "React", "MongoDB",
-- "Redis", "NGINX", "Linux", "Excel", "Power Query"
++ name: profile.name,
++ url: profile.site,
++ email: profile.email,
++ telephone: profile.phone,
++ image: `${profile.site}/assets/img/me-cut1.png`,
++ jobTitle: "Software Engineer · Platform Architect · Founder of OpenVibe",
++ description: profile.pitch,
++ worksFor: [
++ { "@type": "Organization", name: "PowerChat", url: "https://powerchat.gg" },
++ { "@type": "Organization", name: "OpenVibe", url: "https://openvibe.live" },
],
-- "address": {
-- "@type": "PostalAddress",
-- "addressLocality": "Arlington",
-- "addressRegion": "WA",
-- "addressCountry": "US"
-- },
-- "sameAs": [
-- "https://github.com/OpenVibers",
-- "https://www.linkedin.com/in/fris/"
-- ]
-- }
-- </script>
++ knowsAbout: ["Live streaming infrastructure", "WebRTC", "RTMP", "OAuth2", "OIDC", "Payments systems", "Node.js", "TypeScript", "PostgreSQL", "SQLite", "Redis", "ffmpeg", "LLM tooling", "SQL analytics", "Linux", "nginx", "systemd"],
++ address: { "@type": "PostalAddress", addressLocality: "Arlington", addressRegion: "WA", addressCountry: "US" },
++ sameAs: [profile.github, profile.linkedin],
++ })} />
++ <link rel="preload" href="/assets/vendor/fonts/space-grotesk-700.woff2" as="font" type="font/woff2" crossorigin />
++ <link rel="preload" href="/assets/vendor/fonts/inter-400.woff2" as="font" type="font/woff2" crossorigin />
<link rel="stylesheet" href="/assets/vendor/fontawesome/css/all.min.css" />
-- <link rel="stylesheet" href="/assets/vendor/splitting/splitting.css" />
-- <link rel="stylesheet" href="/assets/vendor/swiper/swiper-bundle.min.css" />
++ <link rel="stylesheet" href="/assets/vendor/lenis/lenis.css" />
++
++ <script is:inline>
++ // Theme before paint (no flash) and JS marker for reveal fallbacks
++ (function () {
++ var d = document.documentElement;
++ d.classList.remove('no-js');
++ try {
++ var t = localStorage.getItem('afnet-theme');
++ if (t === 'light' || t === 'dark') d.dataset.theme = t;
++ } catch (e) {}
++ })();
++ </script>
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
++ <div class="progress" aria-hidden="true"></div>
++ <div class="cursor" aria-hidden="true"></div>
<Nav />
<main id="main"><slot /></main>
<Footer />
<script>
-- // Reveal-on-scroll — Web Animations API so OS reduced-motion can't suppress it
++ // ---- Smooth scroll (Lenis) --------------------------------------------
++ const lenisScript = document.createElement('script');
++ lenisScript.src = '/assets/vendor/lenis/lenis.min.js';
++ lenisScript.onload = () => {
++ // @ts-ignore
++ const L = window.Lenis;
++ if (!L || matchMedia('(pointer: coarse)').matches) return;
++ const lenis = new L({ lerp: 0.11, wheelMultiplier: 0.95, smoothWheel: true });
++ // @ts-ignore
++ window.__lenis = lenis;
++ const raf = (t: number) => { lenis.raf(t); requestAnimationFrame(raf); };
++ requestAnimationFrame(raf);
++ document.addEventListener('click', (e) => {
++ const a = (e.target as HTMLElement).closest('a[href^="#"], a[href^="/#"]') as HTMLAnchorElement | null;
++ if (!a) return;
++ const hash = a.getAttribute('href')!.replace(/^\//, '');
++ if (hash === '#' || location.pathname !== '/' && a.getAttribute('href')!.startsWith('/#')) return;
++ const target = document.querySelector(hash);
++ if (!target) return;
++ e.preventDefault();
++ lenis.scrollTo(target as HTMLElement, { offset: -80, duration: 1.1 });
++ history.pushState(null, '', hash);
++ });
++ };
++ document.head.appendChild(lenisScript);
++
++ // ---- Reveal on scroll (WAAPI so OS reduced-motion cannot leave it hidden)
const io = new IntersectionObserver((entries) => {
-- for (const e of entries) {
-- if (e.isIntersecting) {
-- const el = e.target as HTMLElement;
-- el.style.opacity = '1';
-- el.style.transform = 'none';
-- el.animate(
-- [
-- { opacity: 0, transform: 'translateY(24px)' },
-- { opacity: 1, transform: 'translateY(0)' }
-- ],
-- { duration: 600, easing: 'cubic-bezier(0.22, 1, 0.36, 1)', fill: 'forwards' }
-- );
-- io.unobserve(el);
-- }
++ for (const en of entries) {
++ if (!en.isIntersecting) continue;
++ const el = en.target as HTMLElement;
++ const kind = el.dataset.reveal || 'up';
++ const delay = Number(el.dataset.delay || 0);
++ const from: Keyframe = kind === 'left' ? { opacity: 0, transform: 'translateX(-30px)' }
++ : kind === 'right' ? { opacity: 0, transform: 'translateX(30px)' }
++ : kind === 'scale' ? { opacity: 0, transform: 'scale(.94)' }
++ : { opacity: 0, transform: 'translateY(26px)' };
++ el.style.opacity = '1'; el.style.transform = 'none';
++ el.animate([from, { opacity: 1, transform: 'none' }], { duration: 750, delay, easing: 'cubic-bezier(0.22, 1, 0.36, 1)', fill: 'backwards' });
++ io.unobserve(el);
}
-- }, { rootMargin: '0px 0px -8% 0px', threshold: 0.05 });
++ }, { rootMargin: '0px 0px -8% 0px', threshold: 0.06 });
document.querySelectorAll('[data-reveal]').forEach((el) => io.observe(el));
-- // Theme toggle
-- const KEY = "afnet-theme";
-- const saved = localStorage.getItem(KEY);
-- if (saved) document.documentElement.dataset.theme = saved;
-- document.addEventListener("click", (e) => {
-- const t = e.target as HTMLElement;
-- if (t.closest("[data-theme-toggle]")) {
-- const next = document.documentElement.dataset.theme === "light" ? "dark" : "light";
-- document.documentElement.dataset.theme = next;
-- localStorage.setItem(KEY, next);
++ // Staggered children: <ul data-stagger> reveals each child in sequence
++ const sio = new IntersectionObserver((entries) => {
++ for (const en of entries) {
++ if (!en.isIntersecting) continue;
++ const kids = Array.from((en.target as HTMLElement).children) as HTMLElement[];
++ kids.forEach((k, i) => {
++ k.style.opacity = '1';
++ k.animate([{ opacity: 0, transform: 'translateY(22px)' }, { opacity: 1, transform: 'none' }],
++ { duration: 650, delay: i * 70, easing: 'cubic-bezier(0.22, 1, 0.36, 1)', fill: 'backwards' });
++ });
++ sio.unobserve(en.target);
}
++ }, { rootMargin: '0px 0px -6% 0px', threshold: 0.05 });
++ document.querySelectorAll('[data-stagger]').forEach((el) => {
++ Array.from(el.children).forEach((k) => ((k as HTMLElement).style.opacity = '0'));
++ sio.observe(el);
++ });
++
++ // ---- Scroll progress ---------------------------------------------------
++ const bar = document.querySelector('.progress') as HTMLElement | null;
++ let ticking = false;
++ const onScroll = () => {
++ if (!bar) return;
++ const max = document.documentElement.scrollHeight - innerHeight;
++ bar.style.transform = `scaleX(${max > 0 ? Math.min(1, scrollY / max) : 0})`;
++ ticking = false;
++ };
++ addEventListener('scroll', () => { if (!ticking) { ticking = true; requestAnimationFrame(onScroll); } }, { passive: true });
++ onScroll();
++
++ // ---- Custom cursor (fine pointers only) --------------------------------
++ const cur = document.querySelector('.cursor') as HTMLElement | null;
++ if (cur && matchMedia('(pointer: fine)').matches) {
++ let cx = 0, cy = 0, tx = 0, ty = 0, shown = false;
++ addEventListener('pointermove', (e) => {
++ tx = e.clientX; ty = e.clientY;
++ if (!shown) { shown = true; cx = tx; cy = ty; cur.classList.add('is-on'); }
++ const hot = (e.target as HTMLElement).closest('a, button, [data-tilt], .chip');
++ cur.classList.toggle('is-link', !!hot);
++ }, { passive: true });
++ addEventListener('pointerdown', () => cur.classList.add('is-down'));
++ addEventListener('pointerup', () => cur.classList.remove('is-down'));
++ document.addEventListener('mouseleave', () => cur.classList.remove('is-on'));
++ const loop = () => {
++ cx += (tx - cx) * 0.22; cy += (ty - cy) * 0.22;
++ cur.style.translate = `${cx}px ${cy}px`;
++ requestAnimationFrame(loop);
++ };
++ loop();
++ }
++
++ // ---- Pointer spotlight + tilt cards -----------------------------------
++ document.querySelectorAll<HTMLElement>('.spot, [data-tilt]').forEach((el) => {
++ const tilt = el.hasAttribute('data-tilt');
++ el.addEventListener('pointermove', (e) => {
++ const r = el.getBoundingClientRect();
++ const x = e.clientX - r.left, y = e.clientY - r.top;
++ el.style.setProperty('--mx', `${x}px`);
++ el.style.setProperty('--my', `${y}px`);
++ if (tilt && matchMedia('(pointer: fine)').matches) {
++ const rx = ((y / r.height) - 0.5) * -6;
++ const ry = ((x / r.width) - 0.5) * 8;
++ el.style.transform = `perspective(900px) rotateX(${rx}deg) rotateY(${ry}deg) translateY(-4px)`;
++ }
++ });
++ el.addEventListener('pointerleave', () => { if (tilt) el.style.transform = ''; });
++ });
++
++ // ---- Magnetic buttons ----------------------------------------------------
++ if (matchMedia('(pointer: fine)').matches) {
++ document.querySelectorAll<HTMLElement>('[data-magnetic]').forEach((el) => {
++ el.addEventListener('pointermove', (e) => {
++ const r = el.getBoundingClientRect();
++ const dx = e.clientX - (r.left + r.width / 2);
++ const dy = e.clientY - (r.top + r.height / 2);
++ el.style.transform = `translate(${dx * 0.18}px, ${dy * 0.22}px)`;
++ });
++ el.addEventListener('pointerleave', () => { el.style.transform = ''; });
++ });
++ }
++
++ // ---- Theme toggle --------------------------------------------------------
++ document.addEventListener('click', (e) => {
++ const t = (e.target as HTMLElement).closest('[data-theme-toggle]');
++ if (!t) return;
++ const root = document.documentElement;
++ const next = root.dataset.theme === 'light' ? 'dark' : 'light';
++ root.dataset.theme = next;
++ try { localStorage.setItem('afnet-theme', next); } catch {}
++ document.querySelector('meta[name="theme-color"]')?.setAttribute('content', next === 'light' ? '#f4f6fb' : '#07090f');
});
</script>
</body>
ddiff --git a/src/pages/404.astro b/src/pages/404.astro
iindex 307a073..f48d285 100644
---- a/src/pages/404.astro
++++ b/src/pages/404.astro
@@@ -1,16 +1,22 @@
---
import Base from "../layouts/Base.astro";
---
--<Base title="404 — Lost in the woods">
++<Base title="404 — Signal lost · Alex Frison">
<section class="container nf">
-- <div class="section-eyebrow">404</div>
-- <h1>Lost in the woods.</h1>
-- <p>That page doesn't exist — or maybe it's just hiding behind a Douglas fir.</p>
-- <a href="/" class="btn btn--primary">Take me home →</a>
++ <div class="nf__code mono" aria-hidden="true">HTTP/2 404</div>
++ <h1>Signal <span class="grad-text">lost</span>.</h1>
++ <p>That page isn't broadcasting. Maybe it moved, maybe it never existed, maybe it's on one of the other twenty domains.</p>
++ <div class="nf__actions">
++ <a href="/" class="btn btn--primary" data-magnetic>Back to the start <span class="btn__arrow">→</span></a>
++ <a href="/portfolio" class="btn" data-magnetic>Browse projects</a>
++ </div>
</section>
</Base>
<style>
-- .nf { padding: 120px 0; text-align: center; }
-- .nf h1 { font-size: clamp(2.6rem, 7vw, 5rem); }
-- .nf p { max-width: 50ch; margin: 0 auto 1.5rem; }
++ .nf { padding: calc(var(--nav-h) + 100px) var(--gutter) 140px; text-align: center; }
++ .nf__code { display: inline-block; padding: 6px 12px; border-radius: 8px; border: 1px solid var(--border); color: var(--accent-2); font-size: .78rem; letter-spacing: .2em; margin-bottom: 20px; animation: flicker 3s infinite; }
++ @keyframes flicker { 0%, 92%, 100% { opacity: 1; } 94% { opacity: .3; } 96% { opacity: 1; } 98% { opacity: .5; } }
++ .nf h1 { font-size: clamp(3rem, 9vw, 6.5rem); }
++ .nf p { max-width: 50ch; margin: 0 auto 1.6rem; font-size: 1.05rem; }
++ .nf__actions { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; }
</style>
ddiff --git a/src/pages/index.astro b/src/pages/index.astro
iindex 5147354..d328e37 100644
---- a/src/pages/index.astro
++++ b/src/pages/index.astro
@@@ -1,105 +1,23 @@
---
import Base from "../layouts/Base.astro";
import Hero from "../components/Hero.astro";
--import ImpactMetrics from "../components/ImpactMetrics.astro";
++import Metrics from "../components/Metrics.astro";
import Marquee from "../components/Marquee.astro";
--import ProjectCarousel from "../components/ProjectCarousel.astro";
++import Now from "../components/Now.astro";
++import Network from "../components/Network.astro";
import ProjectGrid from "../components/ProjectGrid.astro";
--import ExperienceTimeline from "../components/ExperienceTimeline.astro";
--import SkillsGrid from "../components/SkillsGrid.astro";
--import ContactBlock from "../components/ContactBlock.astro";
++import Timeline from "../components/Timeline.astro";
++import Skills from "../components/Skills.astro";
++import Contact from "../components/Contact.astro";
---
<Base>
<Hero />
-- <ImpactMetrics />
++ <Metrics />
<Marquee />
--
-- <section class="profile" id="about">
-- <div class="container profile__row">
-- <div data-reveal>
-- <div class="section-eyebrow"><i class="fa-solid fa-user"></i> Profile</div>
-- <h2 class="section-title">A versatile builder</h2>
-- <p class="profile-para">
-- <i class="fa-solid fa-microchip profile-para__icon"></i>
-- <span>Data analyst and systems architect with 10+ years of shipping —
-- from <strong>SOX-compliance tooling at Amazon ICQA</strong> to
-- autonomous AI agents to a <strong>15-microservice open-source
-- platform</strong>, built and operated solo. I turn operational
-- context into tools and analysis stakeholders can act on.</span>
-- </p>
-- <p class="profile-para">
-- <i class="fa-solid fa-store profile-para__icon"></i>
-- <span>Before tech, I sold at <strong>Verizon Wireless</strong> —
-- promoted from Sales Rep to <strong>Assistant Manager</strong> in a
-- quota-driven store. Reading people, handling objections, and closing
-- clearly still shape how I present data and decisions.</span>
-- </p>
-- <p class="profile-para">
-- <i class="fa-solid fa-screwdriver-wrench profile-para__icon"></i>
-- <span>Building computers since age 12. A decade running my own LLC,
-- ten years tracking 200,000+ live game servers, 1,000+ IRDRs
-- researched at Amazon. I ship fast and keep what works.</span>
-- </p>
-- </div>
-- <aside class="card profile__facts" data-reveal>
-- <h3><i class="fa-solid fa-circle-info" style="color:var(--accent);margin-right:.4rem"></i>Quick facts</h3>
-- <ul>
-- <li><strong><i class="fa-solid fa-location-dot"></i> Based</strong>Seattle / Arlington, WA</li>
-- <li><strong><i class="fa-solid fa-briefcase"></i> Open to</strong>Hybrid · Remote · On-site PNW</li>
-- <li><strong><i class="fa-solid fa-building-columns"></i> Founder</strong>GameServerStats, LLC</li>
-- <li><strong><i class="fa-solid fa-laptop-code"></i> Last role</strong>Amazon · Data Analyst (ICQA)</li>
-- <li class="profile__facts-seeking"><strong><i class="fa-solid fa-magnifying-glass"></i> Seeking</strong><span class="seek-groups"><span class="seek-group"><i class="fa-solid fa-chart-line"></i> Analyst · Data Engineer · BI</span><span class="seek-group"><i class="fa-solid fa-server"></i> IT · Systems · Robotics</span><span class="seek-group"><i class="fa-solid fa-people-group"></i> Sales · Leadership · Management</span></span></li>
-- </ul>
-- </aside>
-- </div>
-- </section>
--
-- <ProjectCarousel />
-- <ProjectGrid />
-- <ExperienceTimeline />
-- <SkillsGrid />
-- <ContactBlock />
++ <Now />
++ <Network />
++ <ProjectGrid limit={9} />
++ <Timeline />
++ <Skills />
++ <Contact />
</Base>
--
--<style>
-- .profile__row {
-- display: grid;
-- grid-template-columns: 1.6fr 1fr;
-- gap: clamp(20px, 4vw, 48px);
-- align-items: start;
-- }
-- @media (max-width: 880px) { .profile__row { grid-template-columns: 1fr; } }
-- .profile__facts h3 { font-family: var(--font-display); margin-bottom: .8rem; }
-- .profile__facts ul { list-style: none; padding: 0; margin: 0; }
-- .profile__facts li {
-- display: grid; grid-template-columns: 110px 1fr;
-- gap: 12px; padding: 8px 0;
-- border-top: 1px solid var(--border);
-- color: var(--muted);
-- font-size: .92rem;
-- }
-- .profile__facts li:first-child { border-top: 0; }
-- .profile__facts strong { color: var(--accent); font-family: var(--font-mono); font-size: .8rem; text-transform: uppercase; letter-spacing: .08em; }
--
-- .seek-groups { display: flex; flex-direction: column; gap: 3px; }
-- .seek-group { font-size: .82rem; color: var(--muted); }
-- .seek-group i { color: var(--accent); margin-right: .25rem; font-size: .75rem; }
-- .profile__facts-seeking { display: block !important; }
-- .profile__facts-seeking strong { display: block; margin-bottom: 5px; }
--
-- .profile-para {
-- display: flex;
-- gap: 1rem;
-- align-items: flex-start;
-- margin-bottom: 1.2rem;
-- line-height: 1.75;
-- }
-- .profile-para__icon {
-- flex-shrink: 0;
-- margin-top: .25rem;
-- font-size: 1rem;
-- color: var(--accent);
-- width: 1.2rem;
-- text-align: center;
-- }
--</style>
ddiff --git a/src/pages/portfolio.astro b/src/pages/portfolio.astro
iindex 7c22536..d9ad7e2 100644
---- a/src/pages/portfolio.astro
++++ b/src/pages/portfolio.astro
@@@ -2,20 +2,21 @@
import Base from "../layouts/Base.astro";
import ProjectGrid from "../components/ProjectGrid.astro";
---
--<Base title="Portfolio — Alex Frison">
++<Base title="Portfolio — Alex Frison" description="Every project: the OpenVibe services, PowerChat platform programs, Amazon analytics and AI tooling, infrastructure work, games and side projects by Alex Frison.">
<section class="container portfolio-head">
-- <div class="section-eyebrow">Portfolio</div>
-- <h1>Selected work</h1>
++ <div class="sec-index">Portfolio</div>
++ <h1>Everything I've <span class="grad-text">shipped</span>.</h1>
<p class="portfolio-lead">
-- Tools, products, agents, and platforms — across Amazon analytics, the
-- Hobo Network (HoboStreamer, HoboQuest, HoboMaps, hobo.tools), Python utilities, game dev, and hardware.
++ The OpenVibe services, the PowerChat platform programs, the analytics and AI tooling from Amazon,
++ the infrastructure work behind all of it, and the side projects that keep the tools sharp.
++ Filter by area or open any card for the case notes.
</p>
</section>
-- <ProjectGrid />
++ <ProjectGrid showHead={false} id="all-work" />
</Base>
--
<style>
-- .portfolio-head { padding: 80px 0 0; max-width: 800px; }
-- .portfolio-head h1 { font-size: clamp(2.2rem, 5vw, 3.4rem); }
-- .portfolio-lead { color: var(--muted); font-size: 1.08rem; }
++ .portfolio-head { padding: calc(var(--nav-h) + 60px) var(--gutter) 0; max-width: 860px; }
++ .portfolio-head h1 { font-size: clamp(2.6rem, 6.5vw, 4.6rem); margin: .2em 0 .3em; }
++ .portfolio-lead { color: var(--muted); font-size: 1.1rem; max-width: 60ch; }
++ :global(#all-work) { padding-top: 40px; }
</style>
ddiff --git a/src/pages/portfolio/[slug].astro b/src/pages/portfolio/[slug].astro
iindex e2e5d41..ec2cfde 100644
---- a/src/pages/portfolio/[slug].astro
++++ b/src/pages/portfolio/[slug].astro
@@@ -4,80 +4,105 @@ import { getCollection } from "astro:content";
import type { GetStaticPaths } from "astro";
export const getStaticPaths: GetStaticPaths = async () => {
-- const all = await getCollection("projects");
-- return all.map((p) => ({ params: { slug: p.slug }, props: { project: p } }));
++ const all = (await getCollection("projects")).sort((a, b) => a.data.order - b.data.order);
++ return all.map((p, i) => ({
++ params: { slug: p.slug },
++ props: { project: p, prev: all[i - 1] ?? null, next: all[i + 1] ?? null },
++ }));
};
--const { project } = Astro.props as any;
++const { project, prev, next } = Astro.props as any;
const { Content } = await project.render();
const d = project.data;
++const catLabel: Record<string, string> = {
++ openvibe: "OpenVibe", powerchat: "PowerChat", amazon: "Amazon", ai: "AI", infra: "Infra & ops",
++ game: "Games", tools: "Tools", python: "Python", hardware: "Hardware", web: "Web",
++};
---
--<Base title={`${d.title} — Alex Frison`} description={d.summary}>
-- <article class="proj-page container">
-- <a href="/portfolio" class="back">← All projects</a>
-- <header class="proj-page__head">
-- <span class="chip">{d.category}</span>
-- <h1>{d.title}</h1>
-- <p class="lead">{d.summary}</p>
-- <div class="meta">
-- {d.role && <div><strong>Role</strong>{d.role}</div>}
-- {d.year && <div><strong>Year</strong>{d.year}</div>}
-- {d.tech.length > 0 && <div><strong>Stack</strong>{d.tech.join(" · ")}</div>}
++<Base title={`${d.title} — Alex Frison`} description={d.summary} image={d.image ?? "/assets/img/og.png"} type="article">
++ <article class="pp container">
++ <a href="/portfolio" class="pp__back"><i class="fa-solid fa-arrow-left"></i> All projects</a>
++
++ <header class="pp__head" data-reveal>
++ <div class="pp__meta-top">
++ <span class="chip">{catLabel[d.category] ?? d.category}</span>
++ {d.year && <span class="mono pp__year">{d.year}</span>}
++ </div>
++ <h1 class="pp__title">{d.title}</h1>
++ <p class="pp__lead">{d.summary}</p>
++ <div class="pp__meta">
++ {d.role && <div><strong>Role</strong><span>{d.role}</span></div>}
++ {d.tech.length > 0 && <div class="pp__meta-wide"><strong>Stack</strong><span class="pp__tech">{d.tech.map((t: string) => <em>{t}</em>)}</span></div>}
</div>
-- {(d.links?.live || d.links?.repo || d.links?.video) && (
-- <div class="links">
-- {d.links.live && <a class="btn btn--primary" href={d.links.live} target="_blank" rel="noopener">Live →</a>}
-- {d.links.repo && <a class="btn" href={d.links.repo} target="_blank" rel="noopener">Repo</a>}
-- {d.links.video && <a class="btn" href={d.links.video} target="_blank" rel="noopener">Video</a>}
++ {(d.links?.live || d.links?.repo || d.links?.docs || d.links?.video) && (
++ <div class="pp__links">
++ {d.links.live && <a class="btn btn--primary" href={d.links.live} target="_blank" rel="noopener" data-magnetic><i class="fa-solid fa-arrow-up-right-from-square"></i> Open live</a>}
++ {d.links.docs && <a class="btn" href={d.links.docs} target="_blank" rel="noopener" data-magnetic><i class="fa-solid fa-book"></i> Docs</a>}
++ {d.links.repo && <a class="btn" href={d.links.repo} target="_blank" rel="noopener" data-magnetic><i class="fa-brands fa-github"></i> Repo</a>}
++ {d.links.video && <a class="btn" href={d.links.video} target="_blank" rel="noopener" data-magnetic><i class="fa-solid fa-play"></i> Video</a>}
</div>
)}
</header>
{d.image && (
-- <figure class="hero-img">
-- <img src={d.image} alt={d.title} loading="lazy" />
++ <figure class="pp__hero" data-reveal="scale">
++ <img src={d.image} alt={`${d.title} screenshot`} loading="eager" />
</figure>
)}
-- <div class="prose card">
-- <Content />
++ <div class="pp__body">
++ <div class="prose card pp__prose" data-reveal>
++ <Content />
++ </div>
++ <aside class="pp__side" data-reveal data-delay="120">
++ <div class="card pp__cta">
++ <div class="eyebrow">Want the details?</div>
++ <p>I'm happy to walk through the architecture, the trade-offs and what I would do differently.</p>
++ <a href="/#contact" class="btn btn--primary">Get in touch <span class="btn__arrow">→</span></a>
++ </div>
++ </aside>
</div>
{d.images.length > 1 && (
-- <section class="gallery">
-- {d.images.map((src: string) => (
-- <figure><img src={src} alt={d.title} loading="lazy" /></figure>
-- ))}
++ <section class="pp__gallery" data-stagger>
++ {d.images.map((src: string) => (<figure><img src={src} alt={d.title} loading="lazy" /></figure>))}
</section>
)}
++
++ <nav class="pp__nav" aria-label="More projects">
++ {prev ? <a href={`/portfolio/${prev.slug}`} class="pp__nav-link"><span class="mono">← Previous</span><strong>{prev.data.title}</strong></a> : <span></span>}
++ {next ? <a href={`/portfolio/${next.slug}`} class="pp__nav-link pp__nav-link--next"><span class="mono">Next →</span><strong>{next.data.title}</strong></a> : <span></span>}
++ </nav>
</article>
</Base>
<style>
-- .proj-page { padding: 60px 0 80px; max-width: 880px; }
-- .back { color: var(--muted); font-family: var(--font-mono); font-size: .85rem; }
-- .proj-page__head { padding: 18px 0 32px; }
-- .proj-page__head h1 { font-size: clamp(2rem, 5vw, 3rem); margin: .4rem 0; }
-- .lead { font-size: 1.15rem; color: var(--fg); max-width: 60ch; }
-- .meta {
-- display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
-- gap: 12px; margin: 1.4rem 0;
-- }
-- .meta div { color: var(--muted); font-size: .92rem; }
-- .meta strong { display: block; color: var(--accent); font-family: var(--font-mono); font-size: .75rem; text-transform: uppercase; letter-spacing: .1em; margin-bottom: 4px; }
-- .links { display: flex; gap: 10px; flex-wrap: wrap; }
-- .hero-img { margin: 0 0 32px; border-radius: var(--radius-lg); overflow: hidden; border: 1px solid var(--border); }
-- .hero-img img { width: 100%; height: auto; display: block; }
-- .prose { color: var(--fg); line-height: 1.75; font-size: 1.02rem; }
-- .prose :global(h2) { font-size: 1.3rem; margin-top: 1.4em; }
-- .prose :global(p) { color: var(--muted); }
-- .prose :global(strong) { color: var(--fg); }
-- .prose :global(ul) { color: var(--muted); }
-- .gallery {
-- margin-top: 32px;
-- display: grid; gap: 16px;
-- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
-- }
-- .gallery figure { margin: 0; border-radius: 14px; overflow: hidden; border: 1px solid var(--border); }
-- .gallery img { width: 100%; height: auto; }
++ .pp { padding: calc(var(--nav-h) + 40px) var(--gutter) 90px; max-width: 980px; }
++ .pp__back { display: inline-flex; align-items: center; gap: 8px; color: var(--muted); font: 500 .84rem var(--font-mono); margin-bottom: 26px; }
++ .pp__back:hover { color: var(--fg); text-decoration: none; }
++ .pp__meta-top { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
++ .pp__year { color: var(--dim); font-size: .8rem; }
++ .pp__title { font-size: clamp(2.2rem, 5.5vw, 4rem); margin: 0 0 .3em; }
++ .pp__lead { font-size: clamp(1.05rem, 1.6vw, 1.3rem); color: var(--fg); max-width: 62ch; line-height: 1.6; }
++ .pp__meta { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px; margin: 1.4rem 0; }
++ .pp__meta-wide { grid-column: 1 / -1; }
++ .pp__meta strong { display: block; color: var(--accent); font-family: var(--font-mono); font-size: .72rem; text-transform: uppercase; letter-spacing: .14em; margin-bottom: 6px; }
++ .pp__meta span { color: var(--muted); font-size: .94rem; }
++ .pp__tech { display: flex; flex-wrap: wrap; gap: 6px; }
++ .pp__tech em { font: 500 .72rem var(--font-mono); font-style: normal; padding: 4px 9px; border-radius: 7px; background: var(--surface-2); border: 1px solid var(--border); color: var(--muted); }
++ .pp__links { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 6px; }
++ .pp__hero { margin: 30px 0; border-radius: var(--radius-lg); overflow: hidden; border: 1px solid var(--border); box-shadow: var(--shadow-card); }
++ .pp__hero img { width: 100%; height: auto; }
++ .pp__body { display: grid; grid-template-columns: 1fr 280px; gap: 18px; align-items: start; margin-top: 24px; }
++ .pp__prose { padding: clamp(22px, 3.5vw, 40px); }
++ .pp__side { position: sticky; top: calc(var(--nav-h) + 20px); }
++ .pp__cta p { font-size: .92rem; margin: 8px 0 16px; }
++ .pp__gallery { margin-top: 32px; display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
++ .pp__gallery figure { margin: 0; border-radius: 14px; overflow: hidden; border: 1px solid var(--border); }
++ .pp__nav { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 44px; }
++ .pp__nav-link { display: grid; gap: 6px; padding: 18px 20px; border-radius: 16px; border: 1px solid var(--border); background: var(--surface); color: var(--fg); text-decoration: none; transition: all .35s var(--ease); }
++ .pp__nav-link .mono { font-size: .72rem; color: var(--dim); letter-spacing: .1em; text-transform: uppercase; }
++ .pp__nav-link:hover { border-color: rgba(var(--accent-rgb), .5); transform: translateY(-3px); text-decoration: none; }
++ .pp__nav-link--next { text-align: right; }
++ @media (max-width: 820px) { .pp__body { grid-template-columns: 1fr; } .pp__side { position: static; } .pp__nav { grid-template-columns: 1fr; } .pp__nav-link--next { text-align: left; } }
</style>
ddiff --git a/src/pages/resume.astro b/src/pages/resume.astro
iindex b6c5397..a4233a2 100644
---- a/src/pages/resume.astro
++++ b/src/pages/resume.astro
@@@ -1,52 +1,74 @@
---
import Base from "../layouts/Base.astro";
import { getCollection } from "astro:content";
++import profile from "../data/profile.json";
const exp = (await getCollection("experience")).sort((a, b) => a.data.order - b.data.order);
const skills = (await getCollection("skills")).sort((a, b) => a.data.order - b.data.order);
++const projects = (await getCollection("projects")).filter((p) => p.data.featured).sort((a, b) => a.data.order - b.data.order).slice(0, 6);
---
--<Base title="Resume — Alex Frison">
++<Base title="Resume — Alex Frison" description="Resume of Alex Frison: software engineer, platform architect and founder of OpenVibe. Contract engineer at PowerChat. Formerly Amazon ICQA analytics.">
<article class="resume container">
-- <header class="resume__head">
++ <header class="resume__head" data-reveal>
<div>
-- <h1>Alex Frison</h1>
-- <p class="resume__sub">Data Analyst · Software Engineer · Systems Builder</p>
++ <div class="eyebrow">Resume · September 2026</div>
++ <h1>{profile.name}</h1>
++ <p class="resume__sub">Software Engineer · Platform Architect · Founder of OpenVibe</p>
++ <p class="resume__avail"><span class="live-dot"></span> {profile.availability}</p>
</div>
<div class="resume__contact">
-- <div>Seattle / Arlington, WA</div>
-- <div><a href="mailto:[email protected]">[email protected]</a></div>
-- <div><a href="tel:+14253673997">(425) 367-3997</a></div>
-- <div><a href="https://alexfrison.net">alexfrison.net</a></div>
++ <a href={`mailto:${profile.email}`}><i class="fa-solid fa-envelope"></i> {profile.emailDisplay}</a>
++ <a href={`tel:${profile.phone}`}><i class="fa-solid fa-phone"></i> {profile.phoneDisplay}</a>
++ <a href={profile.site}><i class="fa-solid fa-globe"></i> {profile.siteDisplay}</a>
++ <a href={profile.linkedin} target="_blank" rel="noopener"><i class="fa-brands fa-linkedin"></i> {profile.linkedinDisplay}</a>
++ <a href={profile.github} target="_blank" rel="noopener"><i class="fa-brands fa-github"></i> {profile.githubDisplay}</a>
++ <span><i class="fa-solid fa-location-dot"></i> {profile.locationShort}</span>
</div>
</header>
-- <section>
++ <div class="resume__actions" data-reveal>
++ <a href={profile.resumePdf} class="btn btn--primary" data-magnetic><i class="fa-solid fa-file-pdf"></i> Download PDF</a>
++ <button onclick="window.print()" class="btn" data-magnetic><i class="fa-solid fa-print"></i> Print this page</button>
++ </div>
++
++ <section class="resume__sec" data-reveal>
<h2>Profile</h2>
-- <p>
-- Versatile data analyst and systems-minded builder with experience across
-- Amazon ICQA analytics, Amazon Robotics AFM floor support, retail sales
-- leadership, and full-stack product development. Strong at turning
-- operational context into clear reporting, stakeholder-ready analysis,
-- practical tools, and process improvements.
-- </p>
++ <p class="resume__pitch">{profile.pitch}</p>
</section>
-- <section>
++ <section class="resume__sec" data-reveal>
<h2>Experience</h2>
{exp.map((e) => (
-- <div class="resume__job">
-- <div class="resume__job-head">
-- <strong>{e.data.role}</strong>
-- <span>{e.data.start} — {e.data.end}</span>
++ <div class="job">
++ <div class="job__head">
++ <div>
++ <strong class="job__role">{e.data.role}</strong>
++ <div class="job__co">{e.data.link ? <a href={e.data.link} target="_blank" rel="noopener">{e.data.company}</a> : e.data.company}{e.data.location ? ` · ${e.data.location}` : ""}</div>
++ </div>
++ <span class="job__when mono">{e.data.current && <span class="live-dot"></span>}{e.data.start} — {e.data.end}</span>
</div>
-- <div class="resume__company">{e.data.company}{e.data.location ? ` · ${e.data.location}` : ""}</div>
++ {e.data.summary && <p class="job__sum">{e.data.summary}</p>}
<ul>{e.data.bullets.map((b) => <li>{b}</li>)}</ul>
++ {e.data.stack.length > 0 && <p class="job__stack">{e.data.stack.join(" · ")}</p>}
</div>
))}
</section>
-- <section>
-- <h2>Core Stack</h2>
++ <section class="resume__sec" data-reveal>
++ <h2>Selected work</h2>
++ <ul class="resume__projects">
++ {projects.map((p) => (
++ <li>
++ <a href={`/portfolio/${p.slug}`}><strong>{p.data.title}</strong></a>
++ <span>{p.data.summary}</span>
++ {p.data.links?.live && <a class="mono resume__url" href={p.data.links.live} target="_blank" rel="noopener">{p.data.links.live.replace(/^https?:\/\//, "")}</a>}
++ </li>
++ ))}
++ </ul>
++ </section>
++
++ <section class="resume__sec" data-reveal>
++ <h2>Skills</h2>
<div class="resume__skills">
{skills.map((g) => (
<div>
@@@ -57,60 +79,56 @@ const skills = (await getCollection("skills")).sort((a, b) => a.data.order - b.d
</div>
</section>
-- <section>
++ <section class="resume__sec" data-reveal>
<h2>Education</h2>
-- <p>
-- Snohomish High School, WA — AP Statistics, Calculus, English, Creative
-- Writing, Spanish. Self-taught systems builder focused on analytics,
-- infrastructure, graphics, photography, and practical problem solving.
-- </p>
++ <p>{profile.education}</p>
</section>
--
-- <p class="resume__print">
-- <a href="/Alex_Frison_Resume_May_2026_v2.pdf" class="btn btn--primary" aria-label="Download resume as PDF"><i class="fa-solid fa-file-pdf"></i> Download PDF</a>
-- <button onclick="window.print()" class="btn">Print</button>
-- </p>
</article>
</Base>
<style>
-- .resume { padding: 60px 0 80px; max-width: 880px; }
-- .resume__head {
-- display: flex; justify-content: space-between; align-items: flex-end; gap: 18px;
-- flex-wrap: wrap;
-- padding-bottom: 24px;
-- border-bottom: 1px solid var(--border);
-- margin-bottom: 28px;
-- }
-- .resume__head h1 { font-size: 2.6rem; margin: 0; }
-- .resume__sub { color: var(--accent); margin: .4rem 0 0; }
-- .resume__contact { text-align: right; color: var(--muted); font-size: .92rem; line-height: 1.7; }
-- .resume section { padding: 18px 0; border-top: 1px solid var(--border); }
-- .resume section:first-of-type { border-top: 0; }
-- .resume h2 {
-- font-family: var(--font-display); font-size: 1rem;
-- text-transform: uppercase; letter-spacing: .14em; color: var(--accent);
-- margin-bottom: 1rem;
-- }
-- .resume__job { margin-bottom: 1.2rem; }
-- .resume__job-head { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
-- .resume__job-head strong { color: var(--fg); }
-- .resume__job-head span { color: var(--dim); font-family: var(--font-mono); font-size: .85rem; }
-- .resume__company { color: var(--muted); margin: .2rem 0 .5rem; }
-- .resume__job ul { margin: 0; padding-left: 1.2rem; color: var(--muted); }
-- .resume__skills { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
-- .resume__skills h3 { font-family: var(--font-mono); font-size: .85rem; color: var(--accent); text-transform: uppercase; letter-spacing: .08em; margin: 0 0 .3rem; }
-- .resume__skills p { margin: 0; }
-- .resume__print { display: flex; gap: 10px; margin-top: 2rem; }
-- @media (max-width: 600px) { .resume__skills { grid-template-columns: 1fr; } }
++ .resume { padding: calc(var(--nav-h) + 40px) var(--gutter) 90px; max-width: 920px; }
++ .resume__head { display: grid; grid-template-columns: 1fr auto; align-items: end; gap: 24px; padding-bottom: 26px; border-bottom: 1px solid var(--border); }
++ @media (max-width: 720px) { .resume__head { grid-template-columns: 1fr; } }
++ .resume__head h1 { font-size: clamp(2.4rem, 6vw, 3.6rem); margin: .2em 0 .1em; }
++ .resume__sub { color: var(--fg); font-weight: 600; margin: 0 0 8px; }
++ .resume__avail { display: inline-flex; align-items: center; gap: 10px; font-size: .88rem; color: var(--muted); margin: 0; max-width: 46ch; }
++ .resume__contact { display: grid; gap: 6px; font-size: .9rem; color: var(--muted); text-align: right; }
++ .resume__contact a, .resume__contact span { display: inline-flex; align-items: center; gap: 8px; justify-content: flex-end; color: var(--muted); }
++ .resume__contact a:hover { color: var(--accent); text-decoration: none; }
++ .resume__contact i { color: var(--accent); width: 14px; }
++ .resume__actions { display: flex; gap: 10px; flex-wrap: wrap; padding: 22px 0 6px; }
++ .resume__sec { padding: 26px 0; border-top: 1px solid var(--border); }
++ .resume__sec:first-of-type { border-top: 0; }
++ .resume__sec h2 { font-family: var(--font-mono); font-size: .78rem; letter-spacing: .22em; text-transform: uppercase; color: var(--accent); margin-bottom: 1.1rem; display: flex; align-items: center; gap: 12px; }
++ .resume__sec h2::after { content: ""; flex: 1; height: 1px; background: var(--border); }
++ .resume__pitch { font-size: 1.05rem; color: var(--fg); line-height: 1.75; }
++ .job { margin-bottom: 1.6rem; }
++ .job__head { display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; align-items: flex-start; }
++ .job__role { color: var(--fg); font-size: 1.08rem; font-family: var(--font-display); }
++ .job__co { color: var(--muted); font-size: .92rem; margin-top: 2px; }
++ .job__co a { color: var(--fg); font-weight: 600; }
++ .job__when { display: inline-flex; align-items: center; gap: 8px; color: var(--dim); font-size: .8rem; letter-spacing: .06em; white-space: nowrap; }
++ .job__sum { font-style: italic; color: var(--muted); font-size: .92rem; margin: .6rem 0 .4rem; }
++ .job ul { margin: .5rem 0 0; padding-left: 1.2rem; color: var(--muted); line-height: 1.65; font-size: .95rem; display: grid; gap: 6px; }
++ .job li::marker { color: var(--accent-2); }
++ .job__stack { font-family: var(--font-mono); font-size: .74rem; color: var(--dim); margin: .7rem 0 0; }
++ .resume__projects { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 14px 24px; }
++ .resume__projects li { display: grid; gap: 3px; font-size: .92rem; color: var(--muted); padding: 12px 14px; border: 1px solid var(--border); border-radius: 12px; background: var(--surface); }
++ .resume__projects strong { color: var(--fg); }
++ .resume__url { font-size: .74rem; color: var(--accent); }
++ .resume__skills { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 24px; }
++ .resume__skills h3 { font-family: var(--font-mono); font-size: .76rem; color: var(--fg); text-transform: uppercase; letter-spacing: .1em; margin: 0 0 .3rem; }
++ .resume__skills p { margin: 0; font-size: .92rem; }
++ @media (max-width: 640px) { .resume__skills, .resume__projects { grid-template-columns: 1fr; } .resume__contact { text-align: left; } .resume__contact a, .resume__contact span { justify-content: flex-start; } }
@media print {
-- body { background: #fff !important; color: #000 !important; }
-- header, footer, .resume__print, .marquee, .skip-link, .nav { display: none !important; }
-- .resume { max-width: 100%; padding: 0; }
-- .resume h2 { color: #000; }
-- .resume__sub, .resume__company, .resume__job ul, .resume p { color: #222 !important; }
-- .resume__contact a, .resume__head h1 { color: #000 !important; }
-- .resume section { border-color: #ccc !important; }
++ :root { --bg: #fff; --fg: #000; --muted: #222; --dim: #444; --border: #ccc; --accent: #1d4ed8; --accent-2: #000; --surface: transparent; }
++ html, body { background: #fff !important; }
++ .resume { padding: 0; max-width: 100%; }
++ .resume__actions, .live-dot { display: none !important; }
++ .resume__sec { break-inside: avoid; padding: 14px 0; }
++ .job { break-inside: avoid; }
++ a { color: #000; }
}
</style>
ddiff --git a/src/styles/global.css b/src/styles/global.css
iindex 25d099f..3fb99b1 100644
---- a/src/styles/global.css
++++ b/src/styles/global.css
@@@ -1,30 +1,10 @@
@import "./tokens.css";
--@font-face {
-- font-family: "Inter";
-- src: url("/assets/vendor/fonts/inter-400.woff2") format("woff2");
-- font-weight: 400; font-style: normal; font-display: swap;
--}
--@font-face {
-- font-family: "Inter";
-- src: url("/assets/vendor/fonts/inter-600.woff2") format("woff2");
-- font-weight: 600; font-style: normal; font-display: swap;
--}
--@font-face {
-- font-family: "Inter";
-- src: url("/assets/vendor/fonts/inter-800.woff2") format("woff2");
-- font-weight: 800; font-style: normal; font-display: swap;
--}
--@font-face {
-- font-family: "Space Grotesk";
-- src: url("/assets/vendor/fonts/space-grotesk-500.woff2") format("woff2");
-- font-weight: 500; font-style: normal; font-display: swap;
--}
--@font-face {
-- font-family: "Space Grotesk";
-- src: url("/assets/vendor/fonts/space-grotesk-700.woff2") format("woff2");
-- font-weight: 700; font-style: normal; font-display: swap;
--}
++@font-face { font-family: "Inter"; src: url("/assets/vendor/fonts/inter-400.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
++@font-face { font-family: "Inter"; src: url("/assets/vendor/fonts/inter-600.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; }
++@font-face { font-family: "Inter"; src: url("/assets/vendor/fonts/inter-800.woff2") format("woff2"); font-weight: 800; font-style: normal; font-display: swap; }
++@font-face { font-family: "Space Grotesk"; src: url("/assets/vendor/fonts/space-grotesk-500.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; }
++@font-face { font-family: "Space Grotesk"; src: url("/assets/vendor/fonts/space-grotesk-700.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; }
*, *::before, *::after { box-sizing: border-box; }
@@@ -34,133 +14,195 @@ html {
font-family: var(--font-body);
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-- scroll-behavior: smooth;
++ scroll-padding-top: calc(var(--nav-h) + 12px);
}
++html:not(.lenis) { scroll-behavior: smooth; }
body {
margin: 0;
min-height: 100vh;
-- background:
-- radial-gradient(1200px 600px at 80% -10%, rgba(76, 201, 176, 0.12), transparent 60%),
-- radial-gradient(900px 500px at -10% 30%, rgba(122, 162, 247, 0.10), transparent 60%),
-- linear-gradient(180deg, var(--bg) 0%, var(--bg-2) 100%);
-- background-attachment: fixed;
-- overflow-x: hidden;
++ background: var(--bg);
++ overflow-x: clip;
++ position: relative;
++}
++
++/* Film grain + faint grid over the whole page */
++body::before {
++ content: "";
++ position: fixed; inset: 0; z-index: 0; pointer-events: none;
++ background-image:
++ linear-gradient(to right, rgba(160,180,255,.045) 1px, transparent 1px),
++ linear-gradient(to bottom, rgba(160,180,255,.045) 1px, transparent 1px);
++ background-size: 64px 64px;
++ mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, #000 0%, transparent 70%);
++ -webkit-mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, #000 0%, transparent 70%);
++}
++body::after {
++ content: "";
++ position: fixed; inset: -50%; z-index: 0; pointer-events: none;
++ opacity: .05;
++ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .6 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
++ animation: grain 1.4s steps(4) infinite;
}
++:root[data-theme="light"] body::after { opacity: .035; }
++@keyframes grain {
++ 0% { transform: translate(0, 0); } 25% { transform: translate(-3%, 2%); }
++ 50% { transform: translate(2%, -3%); } 75% { transform: translate(-1%, -1%); } 100% { transform: translate(0, 0); }
++}
++
++main { position: relative; z-index: 1; }
++
++::selection { background: rgba(var(--accent-rgb), .35); color: var(--fg); }
a { color: var(--accent); text-decoration: none; }
--a:hover { text-decoration: underline; text-underline-offset: 4px; }
++a:hover { text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
--img, svg { max-width: 100%; display: block; }
++img, svg, video { max-width: 100%; display: block; }
++button { font: inherit; color: inherit; }
h1, h2, h3, h4 {
font-family: var(--font-display);
font-weight: 700;
-- letter-spacing: -0.02em;
-- line-height: 1.1;
++ letter-spacing: -0.025em;
++ line-height: 1.05;
margin: 0 0 0.6em;
++ color: var(--fg);
}
--h1 { font-size: clamp(2.6rem, 7vw, 5.4rem); }
--h2 { font-size: clamp(1.8rem, 4vw, 2.6rem); }
--h3 { font-size: 1.25rem; }
--p { line-height: 1.65; color: var(--muted); margin: 0 0 1em; }
--
--.container {
-- max-width: var(--container);
-- margin: 0 auto;
-- padding: 0 clamp(16px, 3vw, 28px);
--}
++h1 { font-size: clamp(2.8rem, 8vw, 6.4rem); }
++h2 { font-size: clamp(2rem, 4.4vw, 3.2rem); }
++h3 { font-size: 1.2rem; letter-spacing: -0.01em; }
++p { line-height: 1.7; color: var(--muted); margin: 0 0 1em; }
++strong { color: var(--fg); font-weight: 600; }
--section { padding: clamp(60px, 10vw, 120px) 0; position: relative; }
++.container { max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter); }
++.section { padding: clamp(72px, 10vw, 140px) 0; position: relative; }
--.section-title {
-- font-family: var(--font-display);
-- font-size: clamp(1.8rem, 3.5vw, 2.6rem);
-- display: flex; align-items: center; gap: 14px;
-- color: var(--fg);
-- margin-bottom: 2.4rem;
--}
--.section-title i {
-- color: var(--accent);
-- font-size: 0.8em;
-- flex-shrink: 0;
--}
--.section-title::before {
-- content: "";
-- display: inline-block;
-- width: 36px; height: 2px;
-- background: linear-gradient(90deg, var(--accent), transparent);
++/* ---- Section headers --------------------------------------------------- */
++.sec-head { display: grid; grid-template-columns: auto 1fr; gap: 18px 28px; align-items: end; margin-bottom: clamp(32px, 5vw, 56px); }
++.sec-index {
++ font-family: var(--font-mono); font-size: .8rem; letter-spacing: .22em; text-transform: uppercase;
++ color: var(--accent); display: inline-flex; align-items: center; gap: 12px; margin-bottom: 14px;
++}
++.sec-index::before { content: ""; width: 28px; height: 1px; background: var(--accent); box-shadow: 0 0 12px var(--accent); }
++.sec-title { margin: 0; font-size: clamp(2rem, 4.6vw, 3.4rem); max-width: 18ch; }
++.sec-title em { font-style: normal; background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
++.sec-lead { color: var(--muted); font-size: 1.08rem; max-width: 52ch; margin: 0; align-self: end; }
++.sec-num {
++ grid-row: 1 / span 2; align-self: start;
++ font-family: var(--font-display); font-weight: 700; font-size: clamp(3rem, 9vw, 7rem); line-height: .8;
++ color: transparent; -webkit-text-stroke: 1px rgba(var(--accent-rgb), .45);
++ user-select: none;
++}
++@media (max-width: 760px) {
++ .sec-head { grid-template-columns: 1fr; }
++ .sec-num { grid-row: auto; font-size: 3rem; }
}
--.section-eyebrow {
-- display: inline-flex;
-- align-items: center;
-- gap: 6px;
-- font-family: var(--font-mono);
-- font-size: 0.78rem;
-- letter-spacing: 0.18em;
-- text-transform: uppercase;
-- color: var(--accent);
-- margin-bottom: 0.75rem;
--}
--.section-eyebrow i { font-size: 0.85em; }
++/* ---- Surfaces ------------------------------------------------------------ */
.card {
++ position: relative;
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
-- padding: clamp(20px, 3vw, 28px);
-- backdrop-filter: blur(14px);
-- -webkit-backdrop-filter: blur(14px);
++ padding: clamp(20px, 3vw, 30px);
++ backdrop-filter: blur(16px);
++ -webkit-backdrop-filter: blur(16px);
box-shadow: var(--shadow-card);
-- transition: transform .3s var(--ease), border-color .3s var(--ease), box-shadow .3s var(--ease);
--}
--.card:hover {
-- border-color: rgba(76, 201, 176, 0.3);
-- transform: translateY(-4px);
-- box-shadow: var(--shadow-card), 0 0 0 1px rgba(76,201,176,0.08), 0 12px 48px -8px rgba(76,201,176,0.18);
++ transition: transform .5s var(--ease), border-color .4s var(--ease), box-shadow .5s var(--ease), background .4s var(--ease);
}
++.card:hover { border-color: rgba(var(--accent-rgb), .35); box-shadow: var(--shadow-card), var(--shadow-glow); }
++/* Pointer-tracked spotlight (set --mx/--my in JS) */
++.spot { --mx: 50%; --my: 50%; }
++.spot::before {
++ content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;
++ background: radial-gradient(360px circle at var(--mx) var(--my), rgba(var(--accent-rgb), .16), transparent 55%);
++ opacity: 0; transition: opacity .4s var(--ease);
++}
++.spot:hover::before { opacity: 1; }
++
++/* ---- Buttons ------------------------------------------------------------- */
.btn {
++ --btn-bg: transparent;
++ position: relative; isolation: isolate;
display: inline-flex; align-items: center; gap: 10px;
-- padding: 12px 22px;
-- border-radius: 999px;
++ padding: 13px 22px; border-radius: 999px;
border: 1px solid var(--border-strong);
-- background: transparent;
-- color: var(--fg);
-- font: 600 0.95rem var(--font-body);
-- cursor: pointer;
-- transition: all .25s var(--ease);
-- text-decoration: none;
--}
--.btn:hover { background: var(--surface-2); transform: translateY(-2px); text-decoration: none; border-color: var(--border-strong); }
--.btn--primary { background: var(--accent); color: #06221c; border-color: transparent; font-weight: 700; letter-spacing: 0.01em; }
--.btn--primary:hover { background: #5fdcc4; box-shadow: var(--shadow-glow), 0 6px 24px rgba(76,201,176,0.25); transform: translateY(-2px); }
++ background: var(--btn-bg); color: var(--fg);
++ font: 600 .95rem var(--font-body); letter-spacing: .005em;
++ cursor: pointer; text-decoration: none; white-space: nowrap;
++ transition: transform .35s var(--ease), border-color .3s var(--ease), background .3s var(--ease), color .3s var(--ease), box-shadow .35s var(--ease);
++ will-change: transform;
++}
++.btn:hover { text-decoration: none; border-color: rgba(var(--accent-rgb), .6); background: rgba(var(--accent-rgb), .08); }
++.btn i { font-size: .9em; }
++.btn--primary { --btn-bg: var(--accent); color: #fff; border-color: transparent; box-shadow: 0 10px 30px -12px rgba(var(--accent-rgb), .8); overflow: hidden; }
++.btn--primary::after {
++ content: ""; position: absolute; inset: 0; z-index: -1;
++ background: var(--grad); opacity: 0; transition: opacity .35s var(--ease);
++}
++.btn--primary:hover { background: var(--accent); color: #fff; }
++.btn--primary:hover::after { opacity: 1; }
++.btn--ghost { border-color: transparent; color: var(--muted); }
++.btn--ghost:hover { color: var(--fg); background: var(--surface-2); border-color: transparent; }
++.btn__arrow { display: inline-block; transition: transform .35s var(--ease); }
++.btn:hover .btn__arrow { transform: translateX(4px); }
++/* ---- Chips ---------------------------------------------------------------- */
.chip {
-- display: inline-flex; align-items: center; gap: 5px;
-- padding: 4px 12px;
-- border-radius: 999px;
-- font: 500 0.75rem var(--font-mono);
-- background: rgba(76, 201, 176, 0.07);
-- border: 1px solid rgba(76, 201, 176, 0.22);
-- color: var(--accent);
-- letter-spacing: 0.03em;
-- transition: background .2s var(--ease), border-color .2s var(--ease);
--}
--.chip:hover { background: rgba(76, 201, 176, 0.14); border-color: rgba(76, 201, 176, 0.38); }
--.chip i { font-size: 0.75em; }
++ display: inline-flex; align-items: center; gap: 6px;
++ padding: 5px 12px; border-radius: 999px;
++ font: 500 .74rem var(--font-mono); letter-spacing: .02em;
++ background: rgba(var(--accent-rgb), .08);
++ border: 1px solid rgba(var(--accent-rgb), .22);
++ color: color-mix(in oklab, var(--accent) 70%, var(--fg));
++ transition: background .25s var(--ease), border-color .25s var(--ease), transform .25s var(--ease);
++}
++.chip:hover { background: rgba(var(--accent-rgb), .16); border-color: rgba(var(--accent-rgb), .4); transform: translateY(-1px); }
++.chip--ember { background: rgba(var(--accent-2-rgb), .08); border-color: rgba(var(--accent-2-rgb), .25); color: color-mix(in oklab, var(--accent-2) 75%, var(--fg)); }
++.chip--mint { background: rgba(var(--accent-3-rgb), .08); border-color: rgba(var(--accent-3-rgb), .25); color: color-mix(in oklab, var(--accent-3) 75%, var(--fg)); }
++.chip i { font-size: .8em; }
--.skip-link {
-- position: absolute; left: -9999px; top: 8px;
-- background: var(--accent); color: #06221c;
-- padding: 8px 14px; border-radius: 8px; z-index: 1000;
--}
++/* Live status dot */
++.live-dot { position: relative; width: 8px; height: 8px; border-radius: 50%; background: var(--accent-3); box-shadow: 0 0 10px var(--accent-3); flex: none; }
++.live-dot::after { content: ""; position: absolute; inset: -4px; border-radius: 50%; border: 1px solid var(--accent-3); animation: ping 1.8s var(--ease) infinite; }
++@keyframes ping { 0% { transform: scale(.6); opacity: .9; } 100% { transform: scale(1.8); opacity: 0; } }
++
++/* ---- Reveal (initial state; JS animates with WAAPI) ---------------------- */
++[data-reveal] { opacity: 0; transform: translateY(26px); }
++[data-reveal="left"] { transform: translateX(-30px); }
++[data-reveal="right"] { transform: translateX(30px); }
++[data-reveal="scale"] { transform: scale(.94); }
++.no-js [data-reveal] { opacity: 1; transform: none; }
++
++/* ---- Utilities ------------------------------------------------------------ */
++.grad-text { background: var(--grad); -webkit-background-clip: text; background-clip: text; color: transparent; }
++.mono { font-family: var(--font-mono); }
++.eyebrow { font-family: var(--font-mono); font-size: .76rem; letter-spacing: .2em; text-transform: uppercase; color: var(--accent); }
++.visually-hidden { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
++.skip-link { position: absolute; left: -9999px; top: 10px; z-index: 1000; background: var(--accent); color: #fff; padding: 8px 14px; border-radius: 8px; }
.skip-link:focus { left: 12px; }
--/* Reveal — initial hidden state only; animation driven by JS (Web Animations API) */
--[data-reveal] {
-- opacity: 0;
-- transform: translateY(28px);
-- transition: opacity .55s var(--ease), transform .55s var(--ease);
++/* Scroll progress + cursor */
++.progress { position: fixed; top: 0; left: 0; height: 2px; width: 100%; z-index: 120; transform-origin: 0 50%; transform: scaleX(0); background: var(--grad); pointer-events: none; }
++.cursor { position: fixed; top: 0; left: 0; z-index: 130; pointer-events: none; width: 34px; height: 34px; margin: -17px 0 0 -17px; border-radius: 50%; border: 1.5px solid rgba(var(--accent-rgb), .8); mix-blend-mode: difference; opacity: 0; transition: transform .28s var(--ease), opacity .3s, border-color .3s, background .3s; }
++.cursor.is-on { opacity: 1; }
++.cursor.is-link { transform: scale(1.8); background: rgba(var(--accent-rgb), .18); border-color: transparent; }
++.cursor.is-down { transform: scale(.7); }
++@media (pointer: coarse) { .cursor { display: none; } }
++
++/* Prose */
++.prose { color: var(--fg); line-height: 1.8; font-size: 1.03rem; }
++.prose p { color: var(--muted); }
++.prose strong { color: var(--fg); }
++.prose ul, .prose ol { color: var(--muted); padding-left: 1.2rem; }
++.prose li { margin: .35em 0; }
++.prose li::marker { color: var(--accent); }
++.prose code { font-family: var(--font-mono); font-size: .88em; background: var(--surface-2); padding: .12em .4em; border-radius: 6px; color: var(--fg); }
++.prose h2 { font-size: 1.35rem; margin-top: 1.6em; }
++.prose a { text-decoration: underline; text-underline-offset: 4px; text-decoration-color: rgba(var(--accent-rgb), .4); }
++
++@media print {
++ body::before, body::after, .progress, .cursor, .nav, .foot, .marquee { display: none !important; }
++ [data-reveal] { opacity: 1 !important; transform: none !important; }
}
--[data-reveal].in { opacity: 1; transform: none; }
ddiff --git a/src/styles/tokens.css b/src/styles/tokens.css
iindex 5ac9e0e..a966ab8 100644
---- a/src/styles/tokens.css
++++ b/src/styles/tokens.css
@@@ -1,47 +1,71 @@
:root {
-- /* Pacific Northwest palette */
-- --bg: #0a1018;
-- --bg-2: #0f1a2b;
-- --bg-3: #14253b;
-- --surface: rgba(20, 37, 59, 0.55);
-- --surface-2: rgba(20, 37, 59, 0.85);
-- --border: rgba(140, 180, 220, 0.12);
-- --border-strong: rgba(140, 180, 220, 0.22);
--
-- --fg: #e6edf3;
-- --muted: #8aa0b6;
-- --dim: #5d7186;
--
-- --accent: #4cc9b0; /* cascade teal */
-- --accent-2: #f4a261; /* sunset cedar */
-- --accent-3: #7aa2f7; /* mountain blue */
-- --danger: #e76f51;
--
-- --shadow-glow: 0 0 60px rgba(76, 201, 176, 0.18);
-- --shadow-card: 0 10px 40px -10px rgba(0, 0, 0, 0.55);
--
-- --radius: 14px;
-- --radius-lg: 22px;
++ color-scheme: dark;
++
++ /* Signal palette: night base, electric blue, ember, mint */
++ --bg: #07090f;
++ --bg-2: #0b0f1a;
++ --bg-3: #111827;
++ --surface: rgba(255, 255, 255, 0.035);
++ --surface-2: rgba(255, 255, 255, 0.07);
++ --surface-solid: #0e1320;
++ --border: rgba(160, 180, 255, 0.10);
++ --border-strong: rgba(160, 180, 255, 0.22);
++
++ --fg: #eef2ff;
++ --muted: #9aa6c0;
++ --dim: #5f6b85;
++
++ --accent: #4f7cff;
++ --accent-rgb: 79, 124, 255;
++ --accent-2: #ff6a3d;
++ --accent-2-rgb: 255, 106, 61;
++ --accent-3: #3ee6b0;
++ --accent-3-rgb: 62, 230, 176;
++ --violet: #8b5cf6;
++ --on-accent: #06091a;
++
++ --grad: linear-gradient(95deg, var(--accent) 0%, var(--violet) 48%, var(--accent-2) 100%);
++ --grad-soft: linear-gradient(135deg, rgba(var(--accent-rgb), .22), rgba(139, 92, 246, .18) 50%, rgba(var(--accent-2-rgb), .16));
++
++ --shadow-card: 0 20px 60px -24px rgba(0, 0, 0, 0.7);
++ --shadow-glow: 0 0 0 1px rgba(var(--accent-rgb), .18), 0 18px 60px -20px rgba(var(--accent-rgb), .45);
++
++ --radius-sm: 10px;
++ --radius: 16px;
++ --radius-lg: 24px;
++ --radius-xl: 32px;
--font-body: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
--font-display: "Space Grotesk", "Inter", system-ui, sans-serif;
-- --font-mono: ui-monospace, "JetBrains Mono", "Fira Code", Menlo, monospace;
++ --font-mono: ui-monospace, "JetBrains Mono", "Fira Code", "SFMono-Regular", Menlo, Consolas, monospace;
-- --ease: cubic-bezier(.2, .8, .2, 1);
-- --container: 1180px;
++ --ease: cubic-bezier(.22, 1, .36, 1);
++ --ease-io: cubic-bezier(.65, 0, .35, 1);
++ --container: 1200px;
++ --gutter: clamp(16px, 4vw, 40px);
++ --nav-h: 72px;
}
--[data-theme="light"] {
-- --bg: #f7f8fa;
-- --bg-2: #eef2f7;
-- --bg-3: #e1e8f0;
-- --surface: rgba(255, 255, 255, 0.7);
-- --surface-2: rgba(255, 255, 255, 0.95);
-- --border: rgba(20, 37, 59, 0.1);
-- --border-strong: rgba(20, 37, 59, 0.2);
-- --fg: #0f1a2b;
-- --muted: #4a5d72;
-- --dim: #7c8ea2;
-- --shadow-glow: 0 0 60px rgba(76, 201, 176, 0.25);
-- --shadow-card: 0 10px 40px -10px rgba(20, 37, 59, 0.18);
++:root[data-theme="light"] {
++ color-scheme: light;
++ --bg: #f4f6fb;
++ --bg-2: #eaeef7;
++ --bg-3: #dfe5f2;
++ --surface: rgba(255, 255, 255, 0.72);
++ --surface-2: rgba(255, 255, 255, 0.96);
++ --surface-solid: #ffffff;
++ --border: rgba(12, 16, 32, 0.09);
++ --border-strong: rgba(12, 16, 32, 0.18);
++ --fg: #0c1020;
++ --muted: #4c5670;
++ --dim: #7b859d;
++ --accent: #2f5cf0;
++ --accent-rgb: 47, 92, 240;
++ --accent-2: #ef5a2c;
++ --accent-2-rgb: 239, 90, 44;
++ --accent-3: #12a97f;
++ --accent-3-rgb: 18, 169, 127;
++ --on-accent: #ffffff;
++ --shadow-card: 0 20px 50px -28px rgba(12, 16, 32, 0.35);
++ --shadow-glow: 0 0 0 1px rgba(var(--accent-rgb), .16), 0 18px 50px -22px rgba(var(--accent-rgb), .35);
}