{"build":"v9-2026-10-28e","edits":[{"id":"V9-BODY-IN","target":"body","find":"\n\n\n \n \n\n\nSkip to content\n\n
\n\n
\n
\n\n
\n
\n
\n \n \n
\n
Waking the Brain 0
\n
\n
\n\n
\n
\n \n \n PANDO\n \n \n \n
\n
\n\n
\n\n\n
\n
\n
\n
Claude Code · Codex · Cursor · Grok online1 needs you14/14 checks passedBrain 85 notes
\n

Every AI agent. One app. One memory.

\n

Build with AI. Pando checks every change.

\n

Your agents work in their own copy. Pando tests the work and an AI from another company checks it. Your project changes only when you press Keep.

\n \n

Free for 7 days, the whole app. Your card won't be charged until your 7-day trial ends. Then $15 a month, or $99 once. Uses the Claude Code and ChatGPT Codex plans you already pay for. Mac with Apple Silicon.

\n
\n\n
\n
\n
\n \n rally · 4 on screen\n ⌕ Search or run a command ⌘K\n S\n
\n
\n
\n \n R\n +\n
\n Work\n Brain\n Settings\n
\n
\n
\n
rally 4 terminals
\n
Needs you · 1
\n
\n Deploy to the preview site12s\n Do you want to proceed?\n Rio · Claude Code\n RISKY Runs this project's deploy step, which can put it live\n DenyApprove\n
\n
Agents
\n
Review the join code20sWorkingOpal · Codex
\n
Style the game cards19sWorkingNico · Cursor
\n
Rally on a small phone18sWorkingSuki · Grok
\n
In this workspace
\n
Brain notes85
\n
\n
\n
\n
\"\"RioClaude Code· Deploy to the preview siteNeeds you 12s
\n
Deploy Rally to the preview siteI will put the Rally test build on the preview site. Bash command npm run deploy -- --preview Deploys rally to the preview site Do you want to proceed?❯ 1. Yes 2. Yes, and don't ask again for npm run deploy 3. No, tell Claude what to do
\n
\n
\n
\"\"NicoCursor· Style the game cardsWorking 19s
\n
Style the game cards and the Join buttonRead components/GameCard.tsxSport, place, distance and spots left on one cardThe Join button goes grey when a game is fullEdit components/GameCard.tsx+84 linesDone. The cards use the Rally green.
\n
\n
\n
\"\"OpalCodex· Review the join codeWorking 20s
\n
Review the join codeExploredRead lib/join.tsChecking two players tapping Join at onceBoth could take the last spotClaim it in one database step, then it is good.
\n
\n
\n
\"\"SukiGrok· Rally on a small phoneWorking 18s
\n
Check Rally on a small phoneOpen localhost:3000/map at 360 pxScreenshot 360 × 780The Join button sat on the distanceEdit components/GameCard.tsxJoin moved under the cardChecked at 360 px wide: nothing is cut off.
\n
\n
\n
\n
3 working1 needs youBrain ready0.3.62
\n
\n
\n The real Pando window: Claude Code, Codex, Cursor and Grok on one project, one of them waiting for your yes.\n \n
\n
\n
\n
\n\n\n
\n
\n \"\"Claude Code\"\"ChatGPT\"\"Cursor\"\"Grok\"\"Antigravity\n \"\"Claude Code\"\"ChatGPT\"\"Cursor\"\"Grok\"\"Antigravity\n
\n

Pando launches the agents already on your Mac, with your own sign-ins. No API keys, no extra bill for the AI work.

\n
\n\n\n
\n
\n
\n
\n

01Run Claude Code and Codex together on one project

\n

Every agent you pay for, side by side.

\n
\n

Claude Code, Codex, Cursor, Grok and the rest each run in a real terminal on the same project, so you get the full agent, not a copy. They talk to each other, so you stop copying from one AI and pasting into another.

\n
\n
\n
\n
Control Room · rally⌕ Search or run a command ⌘KS
\n
\n
R+
\n
\n
\"\"MiraClaude CodeWorking
Build sign-in with Google or an email linkRead(db/schema.sql)Write(app/sign-in.tsx)Wrote 156 linesWrite(lib/auth.ts)Bash(npm test)✓ 31 passedSaved to the BrainNew players land on /mapAsking Juno for a review
\n
\"\"JunoCodexWorking
Build the map of games near youRan npm install maplibre-glLoading games within 10 kmPins and a list, side by sideEdited app/map.tsx (+214)Edited lib/games.ts (+188)✓ 12 games near Riverside ParkReviewed Mira's sign-in: fineNext: the Join button
\n
\"\"NicoCursorWorking
Style the game cardsSport, place, distanceand spots lefton one cardJoin goes grey when fullDone.components/GameCard.tsx +84
\n
\"\"SukiGrokWorking
Rally on a small phoneOpening /mapat 360 px wideMoving the Join buttonunder the cardChecking the team chatNothing is cut off.Checked at 360 px wide
\n
\n
\n
4 workingBrain ready0.3.62
\n
\n Claude Code, Codex, Cursor and Grok, one app\n
\n
\n
INBOX

Your agents talk to each other

Every terminal has an inbox. Claude Code can ask Codex for a review, and a busy agent reads it on its next turn.

\n
MORE THAN ONE

Run more than one Claude Code session at once

Open as many Claude Code terminals as you like, on one project or several, and see what each one changed.

\n
⌘J

Jump to the one waiting

Home and the left list show which one needs you, and ⌘J puts your keyboard straight into it.

\n
\n
\n
\n\n\n
\n
\n
\n
\n
\n

02Claude Code for people who do not live in the terminal

\n
\n
01 / 06 · JOBS

Say what you want. Approve one short plan.

Type a goal on Home, or say it with Pando Voice. Press Start job and Pando writes a short plan. Nothing is built before you say Start.

\n
02 / 06 · THE PLAN

One short plan. You approve it once.

Each task says who does it, what done means, and how Pando will check it. Read it, then press Start.

\n
03 / 06 · OWN COPIES

Your agents work at the same time, each in its own copy.

Your project stays untouched while they work. Every task runs in its own copy of rally.

\n
04 / 06 · CHECKED

Your AI doesn't grade its own homework.

Pando runs your project's own tests on every task. A task that fails goes back with the real error. Then an agent from another company reads the real change and says what it would fix.

\n
05 / 06 · SEE IT RUNNING

See it running. Fix what you see.

The Preview opens your running site beside the terminals. If the page shows an error, a red pill says so. Press Fix what I see and Pando hands the agent a screenshot of the page with each error. Nothing is sent until you press it.

\n
06 / 06 · YOU DECIDE

See it first. Keep it, or put it back.

Your project changes only when you press Keep this change, and Undo puts it back the way it was. Undo any turn.

\n
\n
\n \n
\n
\n
\n
\n
Home › Build Rally⌕ Search or run a command ⌘KS
\n
\n
\n
\n
\n

Home

\n
\n What do you want done?\n
Build Rally: a map of pickup games near you, join a game with one tap, and a chat for each team
\n
rally ⌄Talk it over firstTry two designsStart job ↵
\n
Pando writes a short plan first. Nothing starts until you press Start.
\n
\n
Nothing needs you, and nothing is working. Say what you want done above.
\n
\n
\n
\n
\n
‹ Home
\n

Build Rally: the map, joining and team chat Ask for a changeKeep this change

\n
\n
StatusPlan waiting for you
\n
Projectrally
\n
AgentsClaude Code and Codex build, each checks the other
\n
StartedWhen you press Start
\n
\n
Here is the plan: 4 tasks. Nothing starts until you say Start.
\n
\n
The plan4 taskswaiting for your Start
\n
\n
\n
1. Sign-in with Google or an email link
\n
WhoClaude CodeDone whena new player can sign up and lands on the mapChecked byPando's checks, then Codex
\n
\n
\n
\n
\n
2. The map of games near you
\n
WhoCodexDone whengames within 10 km show as pins and in a listChecked byPando's checks, then Claude Code
\n
\n
\n
\n
\n
3. Join a game with one tap
\n
WhoClaude CodeDone whenjoining takes a spot, and a full game shows FullChecked byPando's checks, then Codex
\n
\n
\n
✗ npm test: 1 failed
\n
join: two players took the last spot at the same moment. A 10-player game now has 11.
\n
Sent back to Claude Code with the real error.
\n
\n
\n
4. A chat for each team
\n
WhoCodexDone whena message shows up for everyone in the game right awayChecked byPando's checks, then Claude Code
\n
\n
\n
\n
Start ↵ChangeYou approve this plan once.
\n
\n
\n
\n
Second opinionanother company's AInothing wrong ✓
\n
Codex read \"Join a game with one tap\": found nothing wrong.Claude Code read \"A chat for each team\": messages are kept for 30 days, as planned.
\n
\n
\n
What changed41 filesapp/sign-in.tsx · app/map.tsx · lib/join.ts · app/game/chat.tsx
\n
\n
\n
\n
\n
\n
\"\"MiraClaude Code· rallyWorking
\n
Run Rally so I can see itBash(npm run dev)Local: http://localhost:3000/The map and the game list are up. \n
From Preview · localhost:3000/map
1 error: TypeError: Cannot read properties of undefined (reading 'lat') at GameCard.tsx:42
\n One game has no place yet, so its card crashed.Cards without a place now say Location to be set.Fixed. The page shows no errors now.\n
\n
\n
\n
Previewlocalhost:3000/map1 error
\n \n
\n
RallyRiverside · within 10 km
\n
\n
⚽Sunday 5-a-sideRiverside Park · 1.2 km · 9/10Join
🏀Pickup basketballElm Street courts · 2.8 km · 6/10Join
🏐Beach volleyballLocation to be set · 3/10This card could not loadJoin
🏃Sunday run clubLakeside loop · 3.4 km · 14/20Join
\n
MapMy gamesChat
\n
\n
Errors on this page
TypeError: Cannot read properties of undefined (reading 'lat') at GameCard (components/GameCard.tsx:42)
Goes to Mira
Fix what I see
Sent to Mira, with a screenshot.
\n
\n
\n
\n Pando ran your project's own tests\n Another company's AI read the real change\n You look. One click hands it to the agent.\n
\n \n
\n
Kept. The change is in your project.
\n
\n
0 workingBrain ready0.3.62
\n
\n
\n
\n
\n
\n
\n\n\n
\n
\n
\n

03Memory · the Brain

One memory, so you never explain your project twice.

The Brain is Pando's shared memory. What one agent learns, every agent reads, so you never explain your project twice.

\n
\n
\n
\n
Brain›HaloSearch or run a command⌘KS
\n
\n
ML+\n
WorkBrainSettings
\n
Brain85 notes
Sections
Profile2
Decisions23
Knowledge33
Projects8
Journal19
Views
\n
Halo
Notes85
Ledger
Engine
\n
\n
Second Brain85 notesSearch the Halo⌘F
\n
\n
Profile2Decisions23Knowledge33Projects8Journal19Inbox0
\n
Drag to circle it · click a note
\n
\n
\n
Recent notes
\n
\n
0 working4 idleBrain ready0.3.62
\n
\n
\n
\n
Right now
\n
    \n
  1. Claude Code saved a note: the last spot is claimed in one step.
  2. \n
  3. Cursor read it before it styled the Join button.
  4. \n
  5. Codex read it too. Nobody explained it twice.
  6. \n
\n
\n
\n
\n
YOURS

Plain notes you own

Decisions and facts are saved as notes in a folder on your Mac.

\n
SHARED

Every agent reads them

Claude Code, Codex, Cursor and Grok all connect to the same Brain, before they start and after they finish.

\n
SAFE

Backed up from the start

Your Brain is backed up on this Mac, from the first note.

\n
\n
\n
\n
\n\n\n
\n
\n
\n
\n

04Ship

\n

Checked before it ships. Watched after.

\n

Anything you cannot take back waits for your yes: deletes outside the project folder, sending messages, deploys and payments. The approval says how risky the command is before you answer. Before a deploy, Pando Shield runs a deeper check, including a test purchase. After a deploy you approve, Pando opens the live link itself and checks that it works.

\n
\n
\n
    \n
  1. 01 It waits for your yes
    \n
    \n
    Needs you
    \n
    Deploy to the preview site
    \n
    Rio · Claude Code · rally
    \n
    npm run deploy -- --preview
    \n
    RISKYRuns this project's deploy step, which can put it live.
    \n
    DenyApprove
    \n
    \n
  2. \n
  3. 02 Pando Shield checks it
    \n
    \n
    ✓Launch check passed
    \n
    ✓Shield found nothing to fix
    \n
    \n
  4. \n
  5. 03 Live, and checked
    \n
    Liverally preview
    \n

    Shipped 9:41 am: the Rally test build, with the map, joining, team chat and 41 files changed.

    \n
    ✓Pando opened the live link: it works
    \n
    \n
  6. \n
  7. 04 Watched after
    \n
    Site upCertificate goodPando Watch
    \n

    Turn on Pando Watch in Settings and Pando tells you when your live site goes down or its certificate fails.

    \n
    \n
  8. \n
\n
\n \n It waits for your yes\n
\n
\n
\n
\n\n\n
\n
\n
\n
\n

05Away from your Mac

\n

Answer from your phone.

\n
\n

Every terminal has its own Pando Bot on your phone. Message it, answer its questions with a tap, or approve a deploy from the couch, and your Mac carries on with the work. With every paid plan.

\n
\n
\n
\n
\n
rally · 2 on screen⌕ Search or run a command ⌘KS
\n
\n
R
\n
\n
\"\"RioClaude CodeNeeds you
\n
Deploy Rally to the preview siteBash command npm run deploy -- --preview Do you want to proceed?❯ 1. Yes✓ Live on the preview site. Deployed in 31 s.
\n
\"\"OpalCodexWorking
\n
Review the join codeChecking two taps at onceLooks good.
\n
\n
\n
1 workingPhone paired0.3.62
\n
\n
\n
\n
\n
\n
Rio · Claude Code
\n
Deploy Rally to the preview site
\n
› Ran a command
npm run build
\n
Rally is built and all 84 tests pass. I need your OK to deploy it to the preview site.
\n
Needs your OK
Deploy to the preview site
npm run deploy -- --preview
ApproveNot now
\n
Live. Deployed in 31 s. Pando opened the link: it works.
\n
Message Rio
\n \n
\n
\n A tap on your phone, the Mac carries on\n
\n
\n
\n\n\n
\n
\n
\n
\n

06Pando Voice

\n

Say it. Pando Voice types it.

\n
\n

Hold Right Option, talk, let go. Your words land wherever your cursor is, cleaned up, in Pando or any other app. Speech turns into text on your Mac, so your voice never leaves it. Comes with every paid plan.

\n
\n
\n \n \n \n \n

A demo of Pando Voice on a Mac: hold Right Option and talk, the Pando Voice pill appears at the bottom of the screen with a live level trace, then shows Finishing dictation and Inserting text, and the cleaned-up words land at the cursor in a Pando terminal or in Mail.

\n
\n
\n
PandoFileEditViewWindow\n \n \n \n \n \n \n 9:41
\n\n
\n
New Message
\n
To:Priya Shah
\n
Subject:Rally test build
\n
\n
\n\n
\n
rally
\n
RioClaude CodeWaiting for you
\n
> make the map open on where you are● The map now starts on your location.> group the games by sport on the list● Games are grouped into football, basketball and volleyball.● All 84 tests pass.
\n
>
\n
? for shortcuts
\n
\n\n

You sayadd a share button to each game uh so people can invite friends and um ask Codex to review it

\n\n
\n \n \n ListeningAirPods Pro\n \n \n ···\n
\n\n
\n
\n
\n\n
\n \n
Hold Right Option, talk, let go.Hold this key, or Right Option on your keyboard, to dictate a sample. Tap it twice for hands-free. Click a window to choose where the words go. Sample words only: no microphone is used.
\n
  1. Hold Right Option
  2. Talk
  3. Let go
  4. It types at your cursor
\n
\n\n
\n
PRIVATE

Private, and it works offline

Speech is turned into text on your Mac with Apple Speech. Your voice never leaves it.

\n
CLEAN

Clean text, not a transcript

The ums come out, punctuation and capitals go in.

\n
ANYWHERE

In Pando or any other app

An agent's prompt, an email, a document. Wherever your cursor is.

\n
\n
\n
\n
\n\n\n
\n
\n
\n
\"Best
Best Agentic Service AwardAudos Summer 2026
\n
\n
\n
\n\n\n
\n
\n
\n
\n

07Pricing

\n

Try Pando free for 7 days.

\n
\n

Every feature, nothing locked, for 7 days. Your card won't be charged until your 7-day trial ends. Cancel any time before then. Uses the Claude Code, Codex and other agent plans you already pay for: no API keys, no extra bill for the AI work.

\n
\n
\n
\n
First 7 days
\n
$0for 7 days
\n

The whole app, nothing locked. Your card won't be charged until your 7-day trial ends.

\n
  • Everything in Monthly
  • Then $15 a month or $144 a year, unless you cancel
  • Cancel any time on your account page
\n Try Pando free\n
\n
\n
Monthly Launch price
\n
$15/ month
\n

Keep $15 a month for as long as you stay subscribed.

\n
\n
  • As many workspaces and terminals as you like
  • Pando on your phone
  • Pando Voice
  • Every update
\n Get started\n

Or pay yearly: $12 a month, billed $144 a year.

\n
\n
\n
Lifetime
\n
$99once
\n

Pay once. Pando for life. Your key never expires.

\n
  • Everything in Monthly
  • Every future update
  • No subscription
\n Get Pando for life\n
\n
\n
Try Pando free for 7 days. Your card won't be charged until your 7-day trial ends.Full refund within 7 days of your first payment.For a Mac with Apple Silicon and macOS 14 or newer, with Claude Code, Codex, Cursor, Grok or another coding agent installed.
\n
\n
\n\n\n
\n
\n
\n \n
\n
What is vibe coding, and is Pando for me?

Vibe coding is building software by describing it. You say what should change, and an agent changes it. Pando is where those agents work: every agent you already pay for in a real terminal, a short plan you approve once, checks that Pando runs itself, Undo for anything you don't want, your yes before anything you can't take back, and one memory they all share. If you direct agents rather than type every line yourself, it is for you.

\n
What is a job?

A goal you type on Home. Pando writes a short plan, you approve it once, and your agents work on it at the same time, each in its own copy of your project. Pando checks the work, an agent from another company reviews it, and your project changes only when you press Keep this change.

\n
Who checks the work?

Pando does, not the agent that did the work. Pando runs your project's own tests on every task, or builds or lints it when there are none. Then an agent from another company reads the real change: if Claude Code built it, Codex reads it, or the other way round. Anything Pando could not check is listed as still untested.

\n
What happens when Claude Code hits its usage limit?

Pando offers to carry on in another agent you have installed, such as Codex. The new agent opens beside the first one in the same folder and is told what you asked for and where Claude stopped. It is only an offer: nothing switches on its own.

\n
Can I run more than one Claude Code session at once?

Yes. Open as many Claude Code terminals as you like, on one project or several, and see them side by side. Home and the left list show which one needs you.

\n
Can I use Claude Code and ChatGPT together?

Yes. Each agent gets its own real terminal on the same project, so Claude Code can build while Codex, ChatGPT's coding agent, reviews. In a job, Pando has one check the other's work. They share one memory, so what one learns the other reads, and they can send each other messages.

\n
Do I need an API key?

No. Pando launches the agents already installed on your Mac. Sign in to Claude Code, ChatGPT's Codex, Cursor or Grok the way you always do. Pando never sees a key, and there is no extra bill for the AI work.

\n
Is Pando free to try?

Yes, for 7 days, with every feature unlocked and nothing limited. You add a card to start, and it won't be charged until your 7 free days end. Cancel any time before then on your account page and you pay nothing. If you keep going, your plan carries on at $15 a month, or $144 a year if you picked Yearly. Or skip the free days and pay $99 once for Lifetime, with a full refund within 7 days. Your projects and your Brain stay on your Mac either way.

\n
Can I get a refund?

Yes. Reply to your receipt email, or ask from your account page, within 7 days of your first payment and you get all of it back, no questions.

\n
Is my data private?

Your Brain is stored on your Mac. Agents you connect can read it; cloud agents may send that context to their model provider.

\n
\n
\n
\n
\n\n\n
\n
\n

Every AI agent. One app. One memory.

\n

All of your AI
on the same team.

\n

Try the whole app free for 7 days. Your card won't be charged until your 7-day trial ends. Cancel any time before then.

\n \n

Paid plans from $15 a month, or $99 once for life. Full refund within 7 days of your first payment.

\n
\n
\n
\n\n\n\n\n\n\n\n
\n\n\n","count":1},{"id":"V9-JS-IN","target":"js","find":"\n(function(){\n'use strict';\nvar RM = matchMedia('(prefers-re","replace":"/* Pando site v9-2026-10-28e */\ndocument.documentElement.classList.add('js');\n /* failsafe: if the motion layer has not started within 3 s, show everything as plain HTML */\n setTimeout(function () { if (!window.__fx) document.documentElement.classList.add('nofx'); }, 3000);\n\n// The host paints html and body navy (inline, important) when it mounts this page; the page ground is black.\n{ const ground = '#050506'; let want = null;\n const paint = () => { for (const el of [document.documentElement, document.body]) { if (!el) continue;\n if (want !== null && el.style.backgroundColor === want && el.style.getPropertyPriority('background-color') === 'important') continue;\n el.style.setProperty('background', ground, 'important'); if (want === null) want = el.style.backgroundColor; } };\n paint(); const mo = new MutationObserver(paint); mo.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] }); if (document.body) mo.observe(document.body, { attributes: true, attributeFilter: ['style'] }); }\n\n/*!\n * GSAP 3.13.0\n * https://gsap.com\n * \n * @license Copyright 2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license.\n * @author: Jack Doyle, jack@greensock.com\n */\n\n!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 Zt(t[r],e)))||t.splice(r,1);return t}function fa(t){return t._gsap||ea(Ot(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&&++ia;)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 za(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 Aa(t,e){t.parent&&(!e||t.parent.autoRemoveChildren)&&t.parent.remove&&t.parent.remove(t),t._act=0}function Ba(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 Da(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 Fa(t){return t._repeat?Tt(t._tTime,t=t.duration()+t._rDelay)*t:0}function Ha(t,e){return(t-e._start)*e._ts+(0<=e._ts?0:e._dirty?e.totalDuration():e._tDur)}function Ia(t){return t._end=ja(t._start+(t._tDur/Math.abs(t._ts||t._rts||U)||0))}function Ja(t,e){var r=t._dp;return r&&r.smoothChildTiming&&t._ts&&(t._start=ja(r._time-(0U)&&e.render(r,!0)),Ba(t,e)._dp&&t._initted&&t._time>=t._dur&&t._ts){if(t._dur(n=Math.abs(n))&&(a=i,o=n);return a}function ub(t){return Aa(t),t.scrollTrigger&&t.scrollTrigger.kill(!!L),t.progress()<1&&Pt(t,\"onInterrupt\"),t}function xb(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:ue,add:Vt,kill:de,modifier:he,rawVars:0},a={targetTest:0,get:0,getSetter:ie,aliases:{},register:0};if(Ft(),t!==i){if(pt[e])return;ra(i,ra(va(t,n),a)),yt(i.prototype,yt(n,va(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,ge)}else Ct.push(t)}function Ab(t,e,r){return(6*(t+=t<0?1:1>16,e>>8&St,e&St]:0:Dt.black;if(!p){if(\",\"===e.substr(-1)&&(e=e.substr(0,e.length-1)),Dt[e])p=Dt[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=N?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*($(i)?i[0]:i).totalDuration()),1=r&&te)return i;i=i._next}else for(i=t._last;i&&i._start>=r;){if(\"isPause\"===i.data&&i._start=n._start)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0=this.totalDuration()||!v&&_)&&(f!==this._start&&Math.abs(l)===Math.abs(this._ts)||this._lock||(!t&&g||!(v===m&&0=i&&(a instanceof Jt?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):(t.parent===this&&za(this,t),t===this._recent&&(this._recent=this._last),Ba(this))},e.totalTime=function totalTime(t,e){return arguments.length?(this._forcing=1,!this._dp&&this._ts&&(this._start=ja(Rt.time-(0r:!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=Jt.to(i,ra({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())||U,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&&Sa(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,ra({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),sb(this,xt(this,t))},e.previousLabel=function previousLabel(t){return void 0===t&&(t=this._time),sb(this,xt(this,t),1)},e.currentLabel=function currentLabel(t){return arguments.length?this.seek(t,!0):this.previousLabel(this._time+U)},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 Ba(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={}),Ba(this)},e.totalDuration=function totalDuration(t){var e,r,i,n=0,a=this,s=a._last,o=N;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,La(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;Sa(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&&(oa(I,Ha(t,I)),f=Rt.frame),Rt.frame>=mt){mt+=X.autoSleep||120;var e=I._first;if((!e||!e._ts)&&X.autoSleep&&Rt._listeners.length<2){for(;e&&!e._ts;)e=e._next;e||Rt.sleep()}}},Timeline}(Nt);ra(Qt.prototype,{_lock:0,_hasPause:0,_forcing:0});function bc(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=Gt(t,a,e,i,n)),!v(t)||t.style&&t.nodeType||$(t)||J(t))return r(t)?Gt(t,a,e,i,n):t;var o,u={};for(o in t)u[o]=Gt(t[o],a,e,i,n);return u}(e[t],n,a,o,i),i,n,o)&&(i._pt=h=new ge(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 hc(t,r,e,i){var n,a,s=r.ease||i||\"power1.inOut\";if($(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 Ut,qt,Vt=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:$t;if(r(n)&&(~n.indexOf(\"random(\")&&(n=pb(n)),\"=\"===n.charAt(1)&&(!(d=ka(p,n)+(Za(p)||0))&&0!==d||(n=d))),!f||p!==n||qt)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 ge(this._pt,t,e,0,1,oe,null,n),m=0,g=0;for(_.b=r,_.e=i,r+=\"\",(c=~(i+=\"\").indexOf(\"random(\"))&&(i=pb(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\")}),s.duration();else{for(l in u={},x)\"ease\"===l||\"easeEach\"===l||hc(l,x[l],u,x.easeEach);for(l in u)for(C=u[l].sort(function(t,e){return t.t-e.t}),o=z=0;o=t._tDur||e<0)&&t.ratio===u&&(u&&Aa(t,1),r||L||(Pt(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),E.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||Wt(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 qt=1,t.vars[e]=\"+=0\",Wt(t,s),qt=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)+Za(h.e)),h.b&&(h.b=u.s+Za(h.b))}(this,t,e,r,i,a,s,n)?this.resetTo(t,e,r,i,1):(Ja(this,0),this.parent||ya(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?ub(this):this.scrollTrigger&&this.scrollTrigger.kill(!!L),this;if(this.timeline){var i=this.timeline.totalDuration();return this.timeline.killTweensOf(t,e,Ut&&!0!==Ut.vars.overwrite)._first||ub(this),this.parent&&i!==this.timeline.totalDuration()&&Sa(this,this._dur*this.timeline._tDur/i,0,1),this}var n,a,s,o,u,h,l,f=this._targets,d=t?Ot(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),ub(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)||za(this,h,\"_pt\"),delete a[u]),\"all\"!==s&&(s[u]=1);return this._initted&&!this._pt&&p&&ub(this),this},Tween.to=function to(t,e,r){return new Tween(t,e,r)},Tween.from=function from(t,e){return Wa(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 Wa(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}(Nt);ra(Jt.prototype,{_targets:[],_lazy:0,_startAt:0,_op:0,_onInit:0}),ha(\"staggerTo,staggerFrom,staggerFromTo\",function(r){Jt[r]=function(){var t=new Qt,e=kt.call(arguments,0);return e.splice(\"staggerFromTo\"===r?5:4,0,0),t[r].apply(t,e)}});function pc(t,e,r){return t.setAttribute(e,r)}function xc(t,e,r,i){i.mSet(t,e,i.m.call(i.tween,r,i.mt),i)}var $t=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)},ie=function _getSetter(t,e){return s(t[e])?te:u(t[e])&&t.setAttribute?pc:$t},ne=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)},oe=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)},ue=function _renderPropTweens(t,e){for(var r=e._pt;r;)r.r(t,r.d),r=r._next},he=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},de=function _killPropTweensOf(t){for(var e,r,i=this._pt;i;)r=i._next,i.p===t&&!i.op||i.op===t?za(this,i,\"_pt\"):i.dep||(e=1),i=r;return!e},_e=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},ge=(PropTween.prototype.modifier=function modifier(t,e,r){this.mSet=this.mSet||this.set,this.set=xc,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||ne,this.d=s||this,this.set=o||$t,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=Jt,ot.TimelineLite=ot.TimelineMax=Qt,I=new Qt({sortChildren:!1,defaults:Z,autoRemoveChildren:!0,id:\"root\",smoothChildTiming:!0}),X.stringFilter=Gb;function Fc(t){return(be[t]||Me).map(function(t){return t()})}function Gc(){var t=Date.now(),o=[];2=Math.abs(r)?t:r}function P(){(Ae=Se.core.globals().ScrollTrigger)&&Ae.core&&function _integrate(){var e=Ae.core,r=e.bridge||{},t=e._scrollers,n=e._proxies;t.push.apply(t,ze),n.push.apply(n,Ye),ze=t,Ye=n,o=function _bridge(e,t){return r[e](t)}}()}function Q(e){return Se=e||r(),!ke&&Se&&\"undefined\"!=typeof document&&document.body&&(Te=window,Me=(Ce=document).documentElement,Ee=Ce.body,t=[Te,Ce,Me,Ee],Se.utils.clamp,Be=Se.core.context||function(){},Oe=\"onpointerenter\"in Ee?\"pointer\":\"mouse\",Pe=E.isTouch=Te.matchMedia&&Te.matchMedia(\"(hover: none), (pointer: coarse)\").matches?1:\"ontouchstart\"in Te||0=i,n=Math.abs(t)>=i;k&&(r||n)&&k(se,e,t,me,ye),r&&(m&&0Math.abs(t)?\"x\":\"y\",oe=!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(kf):kf()}function nf(e){if(!hf(e,1)){var t=(e=N(e,s)).clientX,r=e.clientY,n=t-se.x,i=r-se.y,o=se.isDragging;se.x=t,se.y=r,(o||(n||i)&&(Math.abs(se.startX-t)>=a||Math.abs(se.startY-r)>=a))&&(re=o?2:1,o||(se.isDragging=!0),mf(n,i))}}function qf(e){return e.touches&&1=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=o(e);return!t||Math.abs(n-e)r&&(n*=t/100),e=e.substr(0,r-1)),e=n+(e in q?q[e]*t:~e.indexOf(\"%\")?parseFloat(e)*t/100:parseFloat(e)||0)}return e}function Eb(e,t,r,n,i,o,a,s){var l=i.startColor,c=i.endColor,u=i.fontSize,f=i.indent,d=i.fontWeight,p=Fe.createElement(\"div\"),g=Ma(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===qe?I:Y)+\":\"+(o+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 Jb(){return 34We.clientWidth)||(ze.cache++,v?T=T||requestAnimationFrame(Z):Z(),st||V(\"scrollStart\"),st=at())}function Lb(){y=Xe.innerWidth,m=Xe.innerHeight}function Mb(e){ze.cache++,!0!==e&&(Ke||h||Fe.fullscreenElement||Fe.webkitFullscreenElement||b&&y===Xe.innerWidth&&!(Math.abs(Xe.innerHeight-m)>.25*Xe.innerHeight))||c.restart(!0)}function Pb(){return yb(ne,\"scrollEnd\",Pb)||Mt(!0)}function Sb(e){for(var t=0;tt,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)}),$b(!1),et=0,r.forEach(function(e){return e&&e.render&&e.render(-1)}),ze.forEach(function(e){Ua(e)&&(e.smooth&&requestAnimationFrame(function(){return e.target.style.scrollBehavior=\"smooth\"}),e.rec&&e(e.rec))}),Ub(_,1),c.pause(),Ct++,Z(rt=2),kt.forEach(function(e){return Ua(e.vars.onRefresh)&&e.vars.onRefresh(e)}),rt=ne.isRefreshing=!1,V(\"refresh\")}else xb(ne,\"scrollEnd\",Pb)},j=0,Et=1,Z=function _updateAll(e){if(2===e||!rt&&!k){ne.isUpdating=!0,it&&it.update(0);var t=kt.length,r=at(),n=50<=r-D,i=t&&kt[0].scroll();if(Et=i=Ra(be,he)){if(oe&&Ae()&&!de)for(o=oe.parentNode;o&&o!==We;)o._pinOffset&&(B-=o._pinOffset,I-=o._pinOffset),o=o.parentNode}else i=nb(ae),s=he===qe,a=Ae(),Q=parseFloat(K(he.a))+w,!y&&1=I})},ke.update=function(e,t,r){if(!de||r||e){var n,i,o,a,s,l,c,u=!0===rt?re:ke.scroll(),f=e?0:(u-B)/F,d=f<0?0:1u+(u-D)/(at()-Ve)*E&&(d=.9999)),d!==p&&ke.enabled){if(a=(s=(n=ke.isActive=!!d&&d<1)!=(!!p&&p<1))||!!d!=!!p,ke.direction=p=Ra(be,he),fe)if(e||!n&&!l)pc(ae,V);else{var g=_t(ae,!0),h=u-B;pc(ae,We,g.top+(he===qe?h:0)+xt,g.left+(he===qe?0:h)+xt)}Pt(n||l?W:G),$&&d<1&&n||b(Q+(1!==d||l?0:j))}}else b(Ja(Q+j*d));!ue||A.tween||Ke||ot||te.restart(!0),T&&(s||ce&&d&&(d<1||!tt))&&Je(T.targets).forEach(function(e){return e.classList[n||ce?\"add\":\"remove\"](T.className)}),!k||ve||e||k(ke),a&&!Ke?(ve&&(c&&(\"complete\"===o?O.pause().totalProgress(1):\"reset\"===o?O.restart(!0).pause():\"restart\"===o?O.restart(!0):O[o]()),k&&k(ke)),!s&&tt||(C&&s&&Ya(ke,C),xe[i]&&Ya(ke,xe[i]),ce&&(1===d?ke.kill(!1,1):xe[i]=0),s||xe[i=1===d?1:3]&&Ya(ke,xe[i])),pe&&!n&&Math.abs(ke.getVelocity())>(Va(pe)?pe:2500)&&(Xa(ke.callbackAnimation),ee?ee.progress(1):Xa(O,\"reverse\"===o?1:!d,1))):ve&&k&&!Ke&&k(ke)}if(x){var v=de?u/de.duration()*(de._caScrollDist||0):u;y(v+(q._isFlipped?1:0)),x(v)}S&&S(-u/de.duration()*(de._caScrollDist||0))}},ke.enable=function(e,t){ke.enabled||(ke.enabled=!0,xb(be,\"resize\",Mb),me||xb(be,\"scroll\",Kb),Te&&xb(ScrollTrigger,\"refreshInit\",Te),!1!==e&&(ke.progress=Oe=0,R=D=Ee=Ae()),!1!==t&&ke.refresh())},ke.getTween=function(e){return e&&A?A.tween:ee},ke.setPositions=function(e,t,r,n){if(de){var i=de.scrollTrigger,o=de.duration(),a=i.end-i.start;e=i.start+a*e/o,t=i.start+a*t/o}ke.refresh(!1,!1,{start:Ea(e,r&&!!ke._startClamp),end:Ea(t,r&&!!ke._endClamp)},n),ke.update()},ke.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,Pt(Z)}},ke.disable=function(e,t){if(ke.enabled&&(!1!==e&&ke.revert(!0,!0),ke.enabled=ke.isActive=!1,t||ee&&ee.pause(),re=0,n&&(n.uncache=1),Te&&yb(ScrollTrigger,\"refreshInit\",Te),te&&(te.pause(),A.tween&&A.tween.kill()&&(A.tween=0)),!me)){for(var r=kt.length;r--;)if(kt[r].scroller===be&&kt[r]!==ke)return;yb(be,\"resize\",Mb),me||yb(be,\"scroll\",Kb)}},ke.kill=function(e,t){ke.disable(e,t),ee&&!t&&ee.kill(),a&&delete Tt[a];var r=kt.indexOf(ke);0<=r&&kt.splice(r,1),r===je&&0o&&(b()>o?a.progress(1)&&b(o):a.resetTo(\"scrollY\",o))}Wa(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,o,l,i,a,c,u,s,f=e.normalizeScrollX,t=e.momentum,r=e.allowNestedScroll,d=e.onRelease,p=J(e.target)||Ue,g=Ne.core.globals().ScrollSmoother,h=g&&g.get(),v=R&&(e.content&&J(e.content)||h&&!1!==e.content&&!h.smooth()&&h.content()),b=L(p,qe),m=L(p,He),y=1,x=(E.isTouch&&Xe.visualViewport?Xe.visualViewport.scale*Xe.visualViewport.width:Xe.outerWidth)/Xe.innerWidth,_=0,w=Ua(t)?function(){return t(n)}:function(){return t||2.8},S=yc(p,e.type,!0,r),k=Ia,T=Ia;return v&&Ne.set(v,{y:\"+=0\"}),e.ignoreCheck=function(e){return R&&\"touchmove\"===e.type&&function ignoreDrag(){if(i){requestAnimationFrame(Gq);var e=Ja(n.deltaY/2),t=T(b.v-e);if(v&&t!==b.v+b.offset){b.offset=t-b.v;var r=Ja((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=ze.cache,Z()}return!0}b.offset&&Kq(),i=!0}()||1.05=o||o-1<=r)&&Ne.to({},{onUpdate:Qq,duration:i})}else s.restart(!0);d&&d(e)},e.onWheel=function(){a._ts&&a.pause(),1e3G||U.register(window.gsap),V=typeof Intl!=\"undefined\"?new Intl.Segmenter:0,P=e=>typeof e==\"string\"?P(document.querySelectorAll(e)):\"length\"in e?Array.from(e):[e],X=e=>P(e).filter(t=>t instanceof HTMLElement),J=[],K=function(){},oe=/\\s+/g,Y=new RegExp(\"\\\\p{RI}\\\\p{RI}|\\\\p{Emoji}(\\\\p{EMod}|\\\\u{FE0F}\\\\u{20E3}?|[\\\\u{E0020}-\\\\u{E007E}]+\\\\u{E007F})?(\\\\u{200D}\\\\p{Emoji}(\\\\p{EMod}|\\\\u{FE0F}\\\\u{20E3}?|[\\\\u{E0020}-\\\\u{E007E}]+\\\\u{E007F})?)*|.\",\"gu\"),Z={left:0,top:0,width:0,height:0},ee=(e,t)=>{if(t){let s=new Set(e.join(\"\").match(t)||J),i=e.length,o,c,n,a;if(s.size)for(;--i>-1;){c=e[i];for(n of s)if(n.startsWith(c)&&n.length>c.length){for(o=0,a=c;n.startsWith(a+=e[i+ ++o])&&a.lengthwindow.getComputedStyle(e).display===\"inline\"&&(e.style.display=\"inline-block\"),z=(e,t,s)=>t.insertBefore(typeof e==\"string\"?document.createTextNode(e):e,s),Q=(e,t,s)=>{let i=t[e+\"sClass\"]||\"\",{tag:o=\"div\",aria:c=\"auto\",propIndex:n=!1}=t,a=e===\"line\"?\"block\":\"inline-block\",h=i.indexOf(\"++\")>-1,b=x=>{let g=document.createElement(o),C=s.length+1;return i&&(g.className=i+(h?\" \"+i+C:\"\")),n&&g.style.setProperty(\"--\"+e,C+\"\"),c!==\"none\"&&g.setAttribute(\"aria-hidden\",\"true\"),o!==\"span\"&&(g.style.position=\"relative\",g.style.display=a),g.textContent=x,s.push(g),g};return h&&(i=i.replace(\"++\",\"\")),b.collection=s,b},ae=(e,t,s,i)=>{let o=Q(\"line\",s,i),c=window.getComputedStyle(e).textAlign||\"left\";return(n,a)=>{let h=o(\"\");for(h.style.textAlign=c,e.insertBefore(h,t[n]);n{var x;let g=Array.from(e.childNodes),C=0,{wordDelimiter:R,reduceWhiteSpace:L=!0,prepareText:$}=t,q=e.getBoundingClientRect(),j=q,D=!L&&window.getComputedStyle(e).whiteSpace.substring(0,3)===\"pre\",E=0,v=s.collection,r,f,H,l,m,y,I,d,u,W,S,O,T,F,w,p,k,N;for(typeof R==\"object\"?(H=R.delimiter||R,f=R.replaceWith||\"\"):f=R===\"\"?\"\":R||\" \",r=f!==\" \";C-1?(y=v[v.length-1],y.appendChild(document.createTextNode(i?\"\":p))):(y=s(i?\"\":p),z(y,e,l),E&&u===1&&!I&&y.insertBefore(E,y.firstChild)),i)for(S=V?ee([...V.segment(p)].map(M=>M.segment),h):p.match(a)||J,N=0;Nj.top&&W.left<=j.left){for(O=e.cloneNode(),T=e.childNodes[0];T&&T!==y;)F=T,T=T.nextSibling,O.appendChild(F);e.parentNode.insertBefore(O,e),o&&te(O)}j=W}(u=m.length?\" \":r&&p.slice(-1)===\" \"?\" \"+f:f,e,l)}e.removeChild(l),E=0}else l.nodeType===1&&(n&&n.indexOf(l)>-1?(v.indexOf(l.previousSibling)>-1&&v[v.length-1].appendChild(l),E=l):(ie(l,t,s,i,o,c,n,a,h,!0),E=0),o&&te(l))};const ne=class se{constructor(t,s){this.isSplit=!1,re(),this.elements=X(t),this.chars=[],this.words=[],this.lines=[],this.masks=[],this.vars=s,this._split=()=>this.isSplit&&this.split(this.vars);let i=[],o,c=()=>{let n=i.length,a;for(;n--;){a=i[n];let h=a.element.offsetWidth;if(h!==a.width){a.width=h,this._split();return}}};this._data={orig:i,obs:typeof ResizeObserver!=\"undefined\"&&new ResizeObserver(()=>{clearTimeout(o),o=setTimeout(c,200)})},K(this),this.split(s)}split(t){this.isSplit&&this.revert(),this.vars=t=t||this.vars||{};let{type:s=\"chars,words,lines\",aria:i=\"auto\",deepSlice:o=!0,smartWrap:c,onSplit:n,autoSplit:a=!1,specialChars:h,mask:b}=this.vars,x=s.indexOf(\"lines\")>-1,g=s.indexOf(\"chars\")>-1,C=s.indexOf(\"words\")>-1,R=g&&!C&&!x,L=h&&(\"push\"in h?new RegExp(\"(?:\"+h.join(\"|\")+\")\",\"gu\"):h),$=L?new RegExp(L.source+\"|\"+Y.source,\"gu\"):Y,q=!!t.ignore&&X(t.ignore),{orig:j,animTime:D,obs:E}=this._data,v;return(g||C||x)&&(this.elements.forEach((r,f)=>{j[f]={element:r,html:r.innerHTML,ariaL:r.getAttribute(\"aria-label\"),ariaH:r.getAttribute(\"aria-hidden\")},i===\"auto\"?r.setAttribute(\"aria-label\",(r.textContent||\"\").trim()):i===\"hidden\"&&r.setAttribute(\"aria-hidden\",\"true\");let H=[],l=[],m=[],y=g?Q(\"char\",t,H):null,I=Q(\"word\",t,l),d,u,W,S;if(ie(r,t,I,y,R,o&&(x||R),q,$,L,!1),x){let O=P(r.childNodes),T=ae(r,O,t,m),F,w=[],p=0,k=O.map(M=>M.nodeType===1?M.getBoundingClientRect():Z),N=Z;for(d=0;dN.top&&k[d].left<=N.left&&(T(p,d),p=d),N=k[d]));p{var le;return(le=M.parentNode)==null?void 0:le.removeChild(M)})}if(!C){for(d=0;d{let f=r.cloneNode();return r.replaceWith(f),f.appendChild(r),r.className&&(f.className=r.className.replace(/(\\b\\w+\\b)/g,\"$1-mask\")),f.style.overflow=\"clip\",f}))),this.isSplit=!0,_&&(a?_.addEventListener(\"loadingdone\",this._split):_.status===\"loading\"&&console.warn(\"SplitText called before fonts loaded\")),(v=n&&n(this))&&v.totalTime&&(this._data.anim=D?v.totalTime(D):v),x&&a&&this.elements.forEach((r,f)=>{j[f].width=r.offsetWidth,E&&E.observe(r)}),this}revert(){var t,s;let{orig:i,anim:o,obs:c}=this._data;return c&&c.disconnect(),i.forEach(({element:n,html:a,ariaL:h,ariaH:b})=>{n.innerHTML=a,h?n.setAttribute(\"aria-label\",h):n.removeAttribute(\"aria-label\"),b?n.setAttribute(\"aria-hidden\",b):n.removeAttribute(\"aria-hidden\")}),this.chars.length=this.words.length=this.lines.length=i.length=this.masks.length=0,this.isSplit=!1,_==null||_.removeEventListener(\"loadingdone\",this._split),o&&(this._data.animTime=o.totalTime(),o.revert()),(s=(t=this.vars).onRevert)==null||s.call(t,this),this}static create(t,s){return new se(t,s)}static register(t){A=A||t||window.gsap,A&&(P=A.utils.toArray,K=A.core.context||K),!G&&window.innerWidth>0&&(_=document.fonts,G=!0)}};ne.version=\"3.13.0\";let U=ne;B.SplitText=U,B.default=U,Object.defineProperty(B,\"__esModule\",{value:!0})});\n\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).Lenis=i()}(this,(function(){\"use strict\";function clamp(t,i,e){return Math.max(t,Math.min(i,e))}class Animate{constructor(){this.isRunning=!1,this.value=0,this.from=0,this.to=0,this.currentTime=0}advance(t){var i;if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;const i=clamp(0,this.currentTime/this.duration,1);e=i>=1;const s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=function damp(t,i,e,s){return function lerp(t,i,e){return(1-e)*t+e*i}(t,i,1-Math.exp(-e*s))}(this.value,this.to,60*this.lerp,t),Math.round(this.value)===this.to&&(this.value=this.to,e=!0)):(this.value=this.to,e=!0);e&&this.stop(),null===(i=this.onUpdate)||void 0===i||i.call(this,this.value,e)}stop(){this.isRunning=!1}fromTo(t,i,{lerp:e,duration:s,easing:o,onStart:n,onUpdate:l}){this.from=this.value=t,this.to=i,this.lerp=e,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,null==n||n(),this.onUpdate=l}}class Dimensions{constructor(t,i,{autoResize:e=!0,debounce:s=250}={}){this.wrapper=t,this.content=i,this.width=0,this.height=0,this.scrollHeight=0,this.scrollWidth=0,this.resize=()=>{this.onWrapperResize(),this.onContentResize()},this.onWrapperResize=()=>{this.wrapper instanceof Window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)},this.onContentResize=()=>{this.wrapper instanceof Window?(this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth):(this.scrollHeight=this.wrapper.scrollHeight,this.scrollWidth=this.wrapper.scrollWidth)},e&&(this.debouncedResize=function debounce(t,i){let e;return function(...s){let o=this;clearTimeout(e),e=setTimeout((()=>{e=void 0,t.apply(o,s)}),i)}}(this.resize,s),this.wrapper instanceof Window?window.addEventListener(\"resize\",this.debouncedResize,!1):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}destroy(){var t,i;null===(t=this.wrapperResizeObserver)||void 0===t||t.disconnect(),null===(i=this.contentResizeObserver)||void 0===i||i.disconnect(),this.wrapper===window&&this.debouncedResize&&window.removeEventListener(\"resize\",this.debouncedResize,!1)}get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class Emitter{constructor(){this.events={}}emit(t,...i){var e;let s=this.events[t]||[];for(let t=0,o=s.length;t{var e;this.events[t]=null===(e=this.events[t])||void 0===e?void 0:e.filter((t=>i!==t))}}off(t,i){var e;this.events[t]=null===(e=this.events[t])||void 0===e?void 0:e.filter((t=>i!==t))}destroy(){this.events={}}}const t=100/6,i={passive:!1};class VirtualScroll{constructor(e,s={wheelMultiplier:1,touchMultiplier:1}){this.element=e,this.options=s,this.touchStart={x:0,y:0},this.lastDelta={x:0,y:0},this.window={width:0,height:0},this.emitter=new Emitter,this.onTouchStart=t=>{const{clientX:i,clientY:e}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=i,this.touchStart.y=e,this.lastDelta={x:0,y:0},this.emitter.emit(\"scroll\",{deltaX:0,deltaY:0,event:t})},this.onTouchMove=t=>{const{clientX:i,clientY:e}=t.targetTouches?t.targetTouches[0]:t,s=-(i-this.touchStart.x)*this.options.touchMultiplier,o=-(e-this.touchStart.y)*this.options.touchMultiplier;this.touchStart.x=i,this.touchStart.y=e,this.lastDelta={x:s,y:o},this.emitter.emit(\"scroll\",{deltaX:s,deltaY:o,event:t})},this.onTouchEnd=t=>{this.emitter.emit(\"scroll\",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})},this.onWheel=i=>{let{deltaX:e,deltaY:s,deltaMode:o}=i;e*=1===o?t:2===o?this.window.width:1,s*=1===o?t:2===o?this.window.height:1,e*=this.options.wheelMultiplier,s*=this.options.wheelMultiplier,this.emitter.emit(\"scroll\",{deltaX:e,deltaY:s,event:i})},this.onWindowResize=()=>{this.window={width:window.innerWidth,height:window.innerHeight}},window.addEventListener(\"resize\",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener(\"wheel\",this.onWheel,i),this.element.addEventListener(\"touchstart\",this.onTouchStart,i),this.element.addEventListener(\"touchmove\",this.onTouchMove,i),this.element.addEventListener(\"touchend\",this.onTouchEnd,i)}on(t,i){return this.emitter.on(t,i)}destroy(){this.emitter.destroy(),window.removeEventListener(\"resize\",this.onWindowResize,!1),this.element.removeEventListener(\"wheel\",this.onWheel,i),this.element.removeEventListener(\"touchstart\",this.onTouchStart,i),this.element.removeEventListener(\"touchmove\",this.onTouchMove,i),this.element.removeEventListener(\"touchend\",this.onTouchEnd,i)}}return class Lenis{constructor({wrapper:t=window,content:i=document.documentElement,eventsTarget:e=t,smoothWheel:s=!0,syncTouch:o=!1,syncTouchLerp:n=.075,touchInertiaMultiplier:l=35,duration:r,easing:h=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:a=.1,infinite:c=!1,orientation:u=\"vertical\",gestureOrientation:d=\"vertical\",touchMultiplier:p=1,wheelMultiplier:m=1,autoResize:v=!0,prevent:g,virtualScroll:S,__experimental__naiveDimensions:w=!1}={}){this._isScrolling=!1,this._isStopped=!1,this._isLocked=!1,this._preventNextNativeScrollEvent=!1,this._resetVelocityTimeout=null,this.time=0,this.userData={},this.lastVelocity=0,this.velocity=0,this.direction=0,this.animate=new Animate,this.emitter=new Emitter,this.onPointerDown=t=>{1===t.button&&this.reset()},this.onVirtualScroll=t=>{if(\"function\"==typeof this.options.virtualScroll&&!1===this.options.virtualScroll(t))return;const{deltaX:i,deltaY:e,event:s}=t;if(this.emitter.emit(\"virtual-scroll\",{deltaX:i,deltaY:e,event:s}),s.ctrlKey)return;const o=s.type.includes(\"touch\"),n=s.type.includes(\"wheel\");this.isTouching=\"touchstart\"===s.type||\"touchmove\"===s.type;if(this.options.syncTouch&&o&&\"touchstart\"===s.type&&!this.isStopped&&!this.isLocked)return void this.reset();const l=0===i&&0===e,r=\"vertical\"===this.options.gestureOrientation&&0===e||\"horizontal\"===this.options.gestureOrientation&&0===i;if(l||r)return;let h=s.composedPath();h=h.slice(0,h.indexOf(this.rootElement));const a=this.options.prevent;if(h.find((t=>{var i,e,s,l,r;return t instanceof HTMLElement&&(\"function\"==typeof a&&(null==a?void 0:a(t))||(null===(i=t.hasAttribute)||void 0===i?void 0:i.call(t,\"data-lenis-prevent\"))||o&&(null===(e=t.hasAttribute)||void 0===e?void 0:e.call(t,\"data-lenis-prevent-touch\"))||n&&(null===(s=t.hasAttribute)||void 0===s?void 0:s.call(t,\"data-lenis-prevent-wheel\"))||(null===(l=t.classList)||void 0===l?void 0:l.contains(\"lenis\"))&&!(null===(r=t.classList)||void 0===r?void 0:r.contains(\"lenis-stopped\")))})))return;if(this.isStopped||this.isLocked)return void s.preventDefault();if(!(this.options.syncTouch&&o||this.options.smoothWheel&&n))return this.isScrolling=\"native\",void this.animate.stop();s.preventDefault();let c=e;\"both\"===this.options.gestureOrientation?c=Math.abs(e)>Math.abs(i)?e:i:\"horizontal\"===this.options.gestureOrientation&&(c=i);const u=o&&this.options.syncTouch,d=o&&\"touchend\"===s.type&&Math.abs(c)>5;d&&(c=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+c,Object.assign({programmatic:!1},u?{lerp:d?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}))},this.onNativeScroll=()=>{if(null!==this._resetVelocityTimeout&&(clearTimeout(this._resetVelocityTimeout),this._resetVelocityTimeout=null),this._preventNextNativeScrollEvent)this._preventNextNativeScrollEvent=!1;else if(!1===this.isScrolling||\"native\"===this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity,this.velocity=this.animatedScroll-t,this.direction=Math.sign(this.animatedScroll-t),this.isScrolling=\"native\",this.emit(),0!==this.velocity&&(this._resetVelocityTimeout=setTimeout((()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()}),400))}},window.lenisVersion=\"1.1.13\",t&&t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:i,eventsTarget:e,smoothWheel:s,syncTouch:o,syncTouchLerp:n,touchInertiaMultiplier:l,duration:r,easing:h,lerp:a,infinite:c,gestureOrientation:d,orientation:u,touchMultiplier:p,wheelMultiplier:m,autoResize:v,prevent:g,virtualScroll:S,__experimental__naiveDimensions:w},this.dimensions=new Dimensions(t,i,{autoResize:v}),this.updateClassName(),this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener(\"scroll\",this.onNativeScroll,!1),this.options.wrapper.addEventListener(\"pointerdown\",this.onPointerDown,!1),this.virtualScroll=new VirtualScroll(e,{touchMultiplier:p,wheelMultiplier:m}),this.virtualScroll.on(\"scroll\",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener(\"scroll\",this.onNativeScroll,!1),this.options.wrapper.removeEventListener(\"pointerdown\",this.onPointerDown,!1),this.virtualScroll.destroy(),this.dimensions.destroy(),this.cleanUpClassName()}on(t,i){return this.emitter.on(t,i)}off(t,i){return this.emitter.off(t,i)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize(),this.animatedScroll=this.targetScroll=this.actualScroll,this.emit()}emit(){this.emitter.emit(\"scroll\",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity=0,this.animate.stop()}start(){this.isStopped&&(this.isStopped=!1,this.reset())}stop(){this.isStopped||(this.isStopped=!0,this.animate.stop(),this.reset())}raf(t){const i=t-(this.time||t);this.time=t,this.animate.advance(.001*i)}scrollTo(t,{offset:i=0,immediate:e=!1,lock:s=!1,duration:o=this.options.duration,easing:n=this.options.easing,lerp:l=this.options.lerp,onStart:r,onComplete:h,force:a=!1,programmatic:c=!0,userData:u}={}){if(!this.isStopped&&!this.isLocked||a){if(\"string\"==typeof t&&[\"top\",\"left\",\"start\"].includes(t))t=0;else if(\"string\"==typeof t&&[\"bottom\",\"right\",\"end\"].includes(t))t=this.limit;else{let e;if(\"string\"==typeof t?e=document.querySelector(t):t instanceof HTMLElement&&(null==t?void 0:t.nodeType)&&(e=t),e){if(this.options.wrapper!==window){const t=this.rootElement.getBoundingClientRect();i-=this.isHorizontal?t.left:t.top}const s=e.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if(\"number\"==typeof t){if(t+=i,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=clamp(0,t,this.limit),t===this.targetScroll)return null==r||r(this),void(null==h||h(this));if(this.userData=null!=u?u:{},e)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),null==h||h(this),void(this.userData={});c||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:n,lerp:l,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling=\"smooth\",null==r||r(this)},onUpdate:(t,i)=>{this.isScrolling=\"smooth\",this.lastVelocity=this.velocity,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),i||this.emit(),i&&(this.reset(),this.emit(),null==h||h(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this._preventNextNativeScrollEvent=!0,requestAnimationFrame((()=>{this._preventNextNativeScrollEvent=!1}))}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.options.__experimental__naiveDimensions?this.isHorizontal?this.rootElement.scrollWidth-this.rootElement.clientWidth:this.rootElement.scrollHeight-this.rootElement.clientHeight:this.dimensions.limit[this.isHorizontal?\"x\":\"y\"]}get isHorizontal(){return\"horizontal\"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?function modulo(t,i){return(t%i+i)%i}(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isScrolling(){return this._isScrolling}set isScrolling(t){this._isScrolling!==t&&(this._isScrolling=t,this.updateClassName())}get isStopped(){return this._isStopped}set isStopped(t){this._isStopped!==t&&(this._isStopped=t,this.updateClassName())}get isLocked(){return this._isLocked}set isLocked(t){this._isLocked!==t&&(this._isLocked=t,this.updateClassName())}get isSmooth(){return\"smooth\"===this.isScrolling}get className(){let t=\"lenis\";return this.isStopped&&(t+=\" lenis-stopped\"),this.isLocked&&(t+=\" lenis-locked\"),this.isScrolling&&(t+=\" lenis-scrolling\"),\"smooth\"===this.isScrolling&&(t+=\" lenis-smooth\"),t}updateClassName(){this.cleanUpClassName(),this.rootElement.className=`${this.rootElement.className} ${this.className}`.trim()}cleanUpClassName(){this.rootElement.className=this.rootElement.className.replace(/lenis(-\\w+)?/g,\"\").trim()}}}));\n//# sourceMappingURL=lenis.min.js.map\n\n(()=>{var Ao=Object.defineProperty;var tn=(t,e)=>()=>(t&&(e=t(t=0)),e);var en=(t,e)=>{for(var n in e)Ao(t,n,{get:e[n],enumerable:!0})};var sn={};en(sn,{initVoice:()=>Uo});function Wo(t){let e=t.say.length*7919,n=()=>(e=e*16807%2147483647)/2147483647,o=[],i=[],b=140;return t.say.forEach(([A,G])=>{let et=G===0;if(et&&(b+=110),i.push(b),et){o.push({a:b,b:b+330,L:.42+n()*.06}),b+=480;return}let K=Math.max(1,(A.toLowerCase().match(/[aeiouy]+/g)||[]).length);for(let E=0;E=o.a&&ee)break}return((.045+Math.random()*.03)/2.4)**2}function Uo(){document.querySelectorAll(\"[data-vp-root]\").forEach(t=>{t.__vp||(t.__vp=Qo(t))})}function Qo(t){let e=m=>t.querySelector(`[data-vp=\"${m}\"]`),n=e(\"desk\"),o=e(\"pill\"),i=e(\"pt\"),b=e(\"pd\"),A=[...e(\"wave\").children],G=e(\"mbi\"),et=e(\"app\"),K=e(\"say\"),E=e(\"sayTx\"),l=e(\"key\"),R=e(\"hint\"),v=[...e(\"beats\").children],lt={mail:e(\"mail\"),pando:e(\"pando\")},dt=e(\"mbody\"),Tt=e(\"ptx\"),It=e(\"term\"),tt=matchMedia(\"(prefers-reduced-motion: reduce)\").matches,At=i.querySelector(\".vp-lock\"),at=It.innerHTML,pt=()=>{let m=n.clientWidth||800;t.style.setProperty(\"--vp-s\",Math.max(.86,Math.min(1.5,m/800)).toFixed(3))};pt(),window.ResizeObserver?new ResizeObserver(pt).observe(n):addEventListener(\"resize\",pt);let Vt=new Sa,oe={connecting:[\"Connecting\",\"Waiting for audio\"],listen:[\"Listening\",an],locked:[\"Hands-free\",an],finishing:[\"Finishing dictation\",\"Preparing text\"],inserting:[\"Inserting text\",\"Writing to your app\"],idle:[\"Pando Voice\",an]},te=()=>{for(let m=0;m<11;m++){let S=Vt.s[15+m];A[m].style.height=(2.5+21*S).toFixed(2)+\"px\",A[m].style.opacity=(.32+.68*Math.max(S,Vt.env)).toFixed(3)}},Ut=m=>{let S=o.dataset.st===\"listen\"||o.dataset.st===\"locked\";(m===\"listen\"||m===\"locked\")&&!S&&(Vt=new Sa,te()),o.dataset.st=m,m&&(i.firstChild.nodeValue=oe[m][0],b.textContent=oe[m][1],At.style.display=m===\"locked\"?\"block\":\"\")},F=m=>{G.dataset.st=m},U=m=>v.forEach((S,X)=>{S.classList.toggle(\"on\",X===m),S.classList.toggle(\"dn\",m>=0&&X{R.textContent=m},yt=\"pando\",ht={pando:0,mail:0},nt=m=>{yt=m,et.textContent=m===\"pando\"?\"Pando\":\"Mail\",lt.pando.classList.toggle(\"vp-front\",m===\"pando\"),lt.mail.classList.toggle(\"vp-front\",m===\"mail\")},Z=\"\",ot=(m,S)=>{if(yt===\"pando\")return Tt.textContent=(Tt.textContent?Tt.textContent+\" \":\"\")+m,S();let X=(Z?\" \":\"\")+m,B=0,it=()=>{vt===Xt&&(B=Math.min(X.length,B+20),dt.textContent=Z+X.slice(0,B),B{let X=Xt;return setTimeout(()=>{X===Xt&&S()},m)};function Pe(){Xt++,clearTimeout(_t);let m=(z?Yo:nn)[yt],S=m[ht[yt]%m.length];Et={sample:S,tl:Wo(S),t0:0,n:0},W=\"connecting\",Ut(\"connecting\"),F(\"connecting\"),U(0),E.innerHTML=\"\",K.classList.remove(\"on\"),pe(Oo,Le)}function Le(){W===\"connecting\"&&(W=\"listening\",Ut(ut?\"locked\":\"listen\"),F(\"listening\"),U(1),J(ut?\"Hands-free. Talk as long as you like, then press once to stop.\":\"Talking. Let go of the key to type it.\"),Et.t0=performance.now(),clearInterval(se),se=setInterval(()=>{let m=performance.now()-Et.t0;Vt.push(Ho(Et.tl,m)),te();let S=0;for(;Svt===0?`${on(it)}`:on(it)).join(\" \"),K.classList.add(\"on\")}},zo))}function Ye(m){ut!==m&&(ut=m,W===\"listening\"&&Ut(m?\"locked\":\"listen\"),m&&J(\"Tapped twice: hands-free. No need to hold the key.\"))}function ie(){if(W!==\"listening\"&&W!==\"connecting\"){W===\"inserting\"&&ue();return}clearInterval(se),W=\"transcribing\",Ut(\"finishing\"),F(\"transcribing\"),U(2),J(\"Let go. Pando Voice finishes the words on your Mac.\");let m=Go(Et.sample,Et.n);pe(Zo,()=>{if(!m)return We();W=\"inserting\",Ut(\"inserting\"),F(\"inserting\"),U(3),pe(30,()=>ot(m,()=>{ht[yt]++,J(yt===\"pando\"?\"In Pando the words go in as one paste, at the cursor.\":\"Typed at the cursor in Mail, cleaned up.\"),pe(Po,We)}))})}function We(){W=\"idle\",ut=!1,Ut(\"idle\"),F(\"idle\"),_t=pe(600,()=>{W===\"idle\"&&(Ut(\"\"),K.classList.remove(\"on\"),U(-1))})}function ue(){Xt++,clearInterval(se),clearTimeout(Nt),clearTimeout(_t),W=\"idle\",ut=!1,mt=null,zt=null,Nt=0,Ut(\"\"),F(\"idle\"),K.classList.remove(\"on\"),U(-1),l.classList.remove(\"down\")}function k(){if(clearTimeout(Nt),Nt=0,ut){Ye(!1),ie();return}W===\"idle\"&&Pe(),mt=performance.now(),!ut&&W!==\"transcribing\"&&J(\"Holding Right Option.\")}function f(){if(ut||mt===null)return;let m=performance.now(),S=m-mt;if(mt=null,S>=350){zt=null,ie();return}if(zt!==null&&m-zt<450){zt=null,W!==\"idle\"&&Ye(!0);return}zt=m,Nt=setTimeout(()=>{zt=null,ie()},450)}let P=m=>{let S=Tt.textContent;if(!S)return;Tt.textContent=\"\";let X=document.createElement(\"span\");X.className=\"vp-ln vp-dm vp-new\",X.textContent=\"> \"+S,It.appendChild(X),setTimeout(()=>{let B=document.createElement(\"span\");for(B.className=\"vp-ln vp-new\",B.innerHTML='\\u25CF '+on(m),It.appendChild(B);It.children.length>6;)It.firstElementChild.remove()},520)},St=()=>{ue(),Z=\"\",dt.textContent=\"\",Tt.textContent=\"\",It.innerHTML=at,ht.pando=0,ht.mail=0,nt(\"pando\"),J(\"Hold Right Option, talk, let go.\")},s=0,d=[],x={},r=m=>new Promise((S,X)=>{let B=setTimeout(S,m);d.push({id:B,rej:X})}),w=()=>{s++,d.forEach(m=>{clearTimeout(m.id),m.rej(x)}),d=[]},c=async m=>{for(;!m();)await r(40)},j=async(m=110)=>{l.classList.add(\"down\"),k(),await r(m),l.classList.remove(\"down\"),f()},h=()=>Et&&Et.t0&&performance.now()-Et.t0>=Et.tl.dur;async function T(){let m=++s;try{for(;;){if(m!==s)return;St(),await r(900),l.classList.add(\"down\"),k(),await c(()=>W===\"listening\"),await c(h),await r(160),l.classList.remove(\"down\"),f(),await c(()=>o.dataset.st===\"\"),await r(1100),P(nn.pando[0].reply),await r(1700),nt(\"mail\"),J(\"The words go wherever your cursor is.\"),await r(1e3),l.classList.add(\"down\"),k(),await c(()=>W===\"listening\"),await c(h),await r(160),l.classList.remove(\"down\"),f(),await c(()=>o.dataset.st===\"\"),await r(2e3),nt(\"pando\"),J(\"For a long prompt, tap the key twice.\"),await r(1300),await j(),await r(150),await j(),await c(()=>W===\"listening\"),await c(h),await r(380),J(\"Pressed once more to stop.\"),await j(120),await c(()=>o.dataset.st===\"\"),await r(1100),P(nn.pando[1].reply),await r(3200)}}catch(S){if(S!==x)throw S}}let z=!1,C=0,N=!1,H=()=>{z||(z=!0,t.classList.add(\"vp-manual\"),w(),ue()),clearTimeout(C),C=setTimeout(()=>{W===\"idle\"&&N&&!tt&&(z=!1,t.classList.remove(\"vp-manual\"),T())},14e3)},V=!1,ft=m=>{V||(m&&m.preventDefault(),H(),V=!0,l.classList.add(\"down\"),k())},jt=()=>{V&&(V=!1,l.classList.remove(\"down\"),f(),H())};l.addEventListener(\"pointerdown\",m=>{m.button===0&&(l.setPointerCapture(m.pointerId),ft(m))}),l.addEventListener(\"pointerup\",jt),l.addEventListener(\"pointercancel\",jt),l.addEventListener(\"lostpointercapture\",jt),l.addEventListener(\"keydown\",m=>{(m.key===\" \"||m.key===\"Enter\")&&!m.repeat&&ft(m)}),l.addEventListener(\"keyup\",m=>{(m.key===\" \"||m.key===\"Enter\")&&jt()}),l.addEventListener(\"contextmenu\",m=>m.preventDefault()),addEventListener(\"keydown\",m=>{m.code===\"AltRight\"&&!m.repeat&&N&&ft(m)}),addEventListener(\"keyup\",m=>{m.code===\"AltRight\"&&jt()}),addEventListener(\"blur\",jt),Object.entries(lt).forEach(([m,S])=>S.addEventListener(\"click\",()=>{H(),W!==\"idle\"&&ue(),nt(m),J(m===\"pando\"?\"Your cursor is in Claude Code, in Pando.\":\"Your cursor is in Mail.\")})),t.classList.add(\"vp-on\");let st={cancel:ue,press:k,release:f,state:()=>W,showPill:Ut,stopAuto:w,front:nt,freeze:()=>{z=!0,w(),ue(),clearTimeout(C)},pushLevels:m=>{m.forEach(S=>Vt.push((S/2.4)**2)),te()}};return tt?(K.classList.add(\"on\"),U(1),st):(Ut(\"\"),F(\"idle\"),E.innerHTML=\"\",new IntersectionObserver(([m])=>{N=m.isIntersecting,N?z||T():(w(),ue(),clearTimeout(C),z=!1,t.classList.remove(\"vp-manual\"))},{threshold:.3}).observe(n),st)}var zo,Oo,Zo,Po,an,Sa,nn,Yo,Go,on,rn=tn(()=>{zo=33.333333333333336,Oo=460,Zo=620,Po=200,an=\"AirPods Pro\",Sa=class t{constructor(){this.s=new Array(26).fill(0),this.env=0}static norm(e){return Number.isFinite(e)?Math.min(1,Math.sqrt(Math.max(0,e))*2.4):0}push(e){let n=t.norm(e),o=this.s[25],i=n>o?1:.3;this.s.shift(),this.s.push(o+(n-o)*i),this.env=n>this.env?n:this.env+(n-this.env)*.12}},nn={pando:[{say:[[\"add\",\"Add\"],[\"a\"],[\"share\"],[\"button\"],[\"to\"],[\"each\"],[\"game\"],[\"uh\",0],[\"so\"],[\"people\"],[\"can\"],[\"invite\"],[\"friends\"],[\"and\"],[\"um\",0],[\"ask\"],[\"Codex\"],[\"to\"],[\"review\"],[\"it\",\"it.\"]],reply:\"Adding a share button to each game, then asking Codex to review it.\"},{say:[[\"make\",\"Make\"],[\"the\"],[\"um\",0],[\"game\"],[\"cards\"],[\"show\"],[\"the\"],[\"distance\"],[\"and\"],[\"run\"],[\"the\"],[\"tests\",\"tests.\"]],reply:\"Adding the distance to every game card, then running the tests.\"}],mail:[{say:[[\"hi\",\"Hi\"],[\"Priya\",\"Priya,\"],[\"um\",0],[\"the\"],[\"Rally\"],[\"test\"],[\"build\"],[\"is\"],[\"up\",\"up.\"],[\"find\",\"Find\"],[\"a\"],[\"game\"],[\"on\"],[\"the\"],[\"map\",\"map,\"],[\"join\"],[\"it\"],[\"and\"],[\"uh\",0],[\"say\"],[\"hi\"],[\"in\"],[\"the\"],[\"team\"],[\"chat\",\"chat.\"],[\"tell\",\"Tell\"],[\"me\"],[\"what\"],[\"breaks\",\"breaks.\"]]},{say:[[\"thanks\",\"Thanks\"],[\"for\"],[\"testing\",\"testing.\"],[\"uh\",0],[\"I'll\"],[\"add\"],[\"the\"],[\"share\"],[\"button\"],[\"by\"],[\"Friday\",\"Friday.\"]]}]},Yo={pando:[{say:[[\"run\",\"Run\"],[\"the\"],[\"um\",0],[\"tests\"],[\"again\",\"again.\"]]},{say:[[\"ask\",\"Ask\"],[\"Codex\"],[\"to\"],[\"uh\",0],[\"check\"],[\"it\",\"it.\"]]}],mail:[{say:[[\"thanks\",\"Thanks\"],[\"Priya\",\"Priya,\"],[\"uh\",0],[\"talk\"],[\"soon\",\"soon.\"]]},{say:[[\"see\",\"See\"],[\"you\"],[\"um\",0],[\"on\"],[\"Friday\",\"Friday.\"]]}]};Go=(t,e)=>{let n=t.say.slice(0,e).map(i=>i[1]===void 0?i[0]:i[1]).filter(Boolean);if(!n.length)return\"\";let o=n.join(\" \").replace(/,$/,\"\");return o=o[0].toUpperCase()+o.slice(1),/[.!?]$/.test(o)?o:o+\".\"},on=t=>t.replace(/[&<>]/g,e=>({\"&\":\"&\",\"<\":\"<\",\">\":\">\"})[e])});var Jn={};en(Jn,{SAMPLE:()=>Jo,mountBrainHalo:()=>Xo});function Vo(){let t=document.createElement(\"canvas\");t.width=t.height=64;let e=t.getContext(\"2d\"),n=e.createRadialGradient(32,32,0,32,32,32);n.addColorStop(0,\"rgba(255,255,255,0.9)\"),n.addColorStop(.25,\"rgba(255,255,255,0.28)\"),n.addColorStop(1,\"rgba(255,255,255,0)\"),e.fillStyle=n,e.fillRect(0,0,64,64);let o=new _.CanvasTexture(t);return o.colorSpace=_.SRGBColorSpace,o}function Fo(){let t=[];for(let E of pn)for(let l of dn[E])t.push({title:l,section:E});let e=new Map(t.map((E,l)=>[E.title,l])),n=[];for(let[E,l]of Ro)for(let R of l){let v=e.get(E),lt=e.get(R);v!==void 0&<!==void 0&&v!==lt&&n.push([v,lt])}let o=t.length,i=Math.max(340,Math.min(980,o*3.8)),b=new Array(o).fill(0),A=t.map(()=>[]);for(let[E,l]of n)b[E]++,b[l]++,A[E].push(l),A[l].push(E);t.forEach((E,l)=>{E.angle=l/o*Math.PI*2-Math.PI/2,E.pos=new _.Vector3(Math.cos(E.angle)*i,0,Math.sin(E.angle)*i),E.degree=b[l],E.revealAt=.4+l/o*1.2});let G=[],et=0;for(let E of pn){let l=dn[E].length;G.push({section:E,a0:et/o*Math.PI*2-Math.PI/2,a1:(et+l)/o*Math.PI*2-Math.PI/2}),et+=l}let K=n.map(([E,l],R)=>{let v=t[E].pos,lt=t[l].pos,dt=v.distanceTo(lt),Tt=(R%2?1:-1)*(30+dt*.1);return{x:E,y:l,curve:new _.QuadraticBezierCurve3(v.clone(),new _.Vector3((v.x+lt.x)*.32,Tt,(v.z+lt.z)*.32),lt.clone())}});return{stars:t,rails:G,chords:K,neighbors:A,R:i}}function Xo(t,{reduced:e=!1,labelHost:n=t,onSelect:o,onWrite:i}={}){let b;try{b=new _.WebGLRenderer({antialias:!0,alpha:!0})}catch{return null}b.setPixelRatio(Math.min(2,devicePixelRatio||1)),b.domElement.className=\"bw-canvas\",t.appendChild(b.domElement);let A=new _.Scene,G=new _.PerspectiveCamera(55,1,1,12e3),et=Fo(),K=et.R,E=Vo(),l=new _.Group;{let f=new Float32Array(4200),P=s=>{let d=Math.sin(s*13.13)*43758.5453;return d-Math.floor(d)};for(let s=0;s<1400;s++){let d=P(s)*Math.PI*2,x=Math.acos(2*P(s+9999)-1),r=3600+P(s*3)*2200;f[s*3]=r*Math.sin(x)*Math.cos(d),f[s*3+1]=r*Math.cos(x),f[s*3+2]=r*Math.sin(x)*Math.sin(d)}let St=new _.BufferGeometry;St.setAttribute(\"position\",new _.BufferAttribute(f,3)),l.add(new _.Points(St,new _.PointsMaterial({color:10466508,size:2,sizeAttenuation:!1,transparent:!0,opacity:0,depthWrite:!1}))),A.add(l)}let R=l.children[0].material,v=new _.Group;A.add(v);let lt=et.rails.map(k=>{let f=[];for(let St=0;St<=48;St++){let s=k.a0+(k.a1-k.a0)*(St/48);f.push(new _.Vector3(Math.cos(s)*(K+ln),0,Math.sin(s)*(K+ln)))}let P=new _.LineBasicMaterial({color:new _.Color(cn[k.section]),transparent:!0,opacity:0});return v.add(new _.Line(new _.BufferGeometry().setFromPoints(f),P)),{mat:P,at:.4+(k.a0+Math.PI/2)/(Math.PI*2)*1.2}}),dt=new _.SphereGeometry(1,18,18),Tt=new _.SphereGeometry(1,8,8),It=new _.MeshBasicMaterial({visible:!1}),tt=et.stars.map((k,f)=>{let P=new _.Color(cn[k.section]),St=new _.Mesh(dt,new _.MeshBasicMaterial({color:P,transparent:!0,opacity:.6}));St.position.copy(k.pos);let s=new _.Sprite(new _.SpriteMaterial({map:E,color:P,transparent:!0,opacity:.7,blending:_.AdditiveBlending,depthWrite:!1}));s.position.copy(k.pos);let d=new _.Mesh(Tt,It);return d.position.copy(k.pos),d.userData.i=f,v.add(St,s,d),{star:k,core:St,glow:s,hit:d,base:3.2+Math.min(15,k.degree)*.85,heat:0}}),At=tt.filter(k=>k.star.degree>=8).sort((k,f)=>f.star.degree-k.star.degree).map(k=>{let f=document.createElement(\"div\");return f.className=\"bw-hub\",f.textContent=k.star.title,n.appendChild(f),{el:f,p:k}}),at=document.createElement(\"div\");at.className=\"bw-label\",n.appendChild(at);let pt=et.chords.map(k=>{let f=new _.LineBasicMaterial({color:Qn,transparent:!0,opacity:0,blending:_.AdditiveBlending,depthWrite:!1});return v.add(new _.Line(new _.BufferGeometry().setFromPoints(k.curve.getPoints(28)),f)),{...k,mat:f,heat:0}}),Vt=Math.min(pt.length,Bo),oe=Array.from({length:Vt},(k,f)=>{let P=new _.Sprite(new _.SpriteMaterial({map:E,color:Bn,transparent:!0,opacity:0,blending:_.AdditiveBlending,depthWrite:!1}));return v.add(P),{chord:pt[Math.floor(f*pt.length/Vt)],sprite:P,u:f*.618%1,rush:0}}),te=new _.Vector3(0,K*.6,K*1.68),Ut=new _.Vector3(K*.2,-K*.34,K*.92),F=()=>{let k=t.clientWidth,f=Math.max(1,t.clientHeight);b.setSize(k,f,!1),G.aspect=k/f,G.updateProjectionMatrix();let P=Math.tan(G.fov*Math.PI/360),St=P*G.aspect,s=new _.Vector3(0,.6,1.68).normalize(),d=Math.max((K+ln)/(St*.92),K*.62/(P*.72))+K*.12;te=s.clone().multiplyScalar(d),Ut=new _.Vector3(.2,-.34,.92).normalize().multiplyScalar(d*.62)};F(),G.position.copy(e?te:Ut),G.lookAt(0,0,0);let U=new ResizeObserver(F);U.observe(t);let J=new _.Raycaster,yt=new _.Vector2,ht=-1,nt=-1,Z=null,ot=0,W=0,ut=0,mt=0,zt=k=>{let f=b.domElement.getBoundingClientRect();yt.set((k.clientX-f.left)/f.width*2-1,-((k.clientY-f.top)/f.height)*2+1),J.setFromCamera(yt,G);let P=J.intersectObjects(tt.map(St=>St.hit))[0];return P?P.object.userData.i:-1},Nt=b.domElement;Nt.addEventListener(\"pointerdown\",k=>{Z={x:k.clientX,y:k.clientY,yaw:W,pitch:ut,moved:!1},Nt.setPointerCapture(k.pointerId),ot=performance.now()}),Nt.addEventListener(\"pointermove\",k=>{if(Z){let f=k.clientX-Z.x,P=k.clientY-Z.y;Math.abs(f)+Math.abs(P)>3&&(Z.moved=!0),W=Z.yaw+f*.006,ut=Math.max(-.35,Math.min(.5,Z.pitch+P*.003)),ot=performance.now();return}ht=zt(k),Nt.style.cursor=ht>=0?\"pointer\":\"grab\"}),Nt.addEventListener(\"pointerup\",k=>{let f=Z;if(Z=null,f&&!f.moved){let P=zt(k);nt=P===nt?-1:P,o&&o(nt>=0?et.stars[nt]:null)}}),Nt.addEventListener(\"pointerleave\",()=>{ht=-1});let Xt=k=>{tt[k].heat=1;for(let f of pt)(f.x===k||f.y===k)&&(f.heat=1);i&&i(et.stars[k])},Et=tt.map((k,f)=>[k.star.degree,f]).sort((k,f)=>f[0]-k[0]).slice(0,10).map(k=>k[1]),se=0,_t=e,pe=!1,Pe=0,Le=performance.now(),Ye=0,ie=new _.Vector3,We=(k,f,P)=>{tt[f].core.getWorldPosition(ie).project(G);let St=(ie.x*.5+.5)*t.clientWidth,s=(-ie.y*.5+.5)*t.clientHeight;return k.style.transform=`translate(${St.toFixed(1)}px,${(s+P).toFixed(1)}px) translate(-50%,-100%)`,{x:St,y:s}},ue=k=>{if(Pe=requestAnimationFrame(ue),!pe){Le=k;return}let f=Math.min(.1,(k-Le)/1e3);Le=k,se||(se=k);let P=(k-se)/1e3,St=k/1e3;_t?G.position.copy(te):(P>=Rn&&(_t=!0),G.position.lerpVectors(Ut,te,$o(Math.min(1,P/Rn)))),G.lookAt(0,0,0);let s=k-ot>4e3&&nt<0&&!Z;!e&&_t&&s&&(W+=f*.045),v.rotation.set(ut,W,0),e||(l.rotation.y=St*.002),mt+=((nt>=0?1:0)-mt)*.07;let d=nt>=0?et.neighbors[nt]:null;R.opacity=_t?.45:Math.max(0,(P-1.6)/.8)*.45;for(let{mat:c,at:j}of lt)c.opacity=(_t?1:Math.min(1,Math.max(0,(P-j)/.4)))*.55*(1-mt*.3);!e&&_t&&k>Ye&&(Ye=k+2200+Math.random()*1800,Xt(Math.random()<.7?Et[Math.floor(Math.random()*Et.length)]:Math.floor(Math.random()*tt.length)));let x=Math.tan(G.fov*Math.PI/360);tt.forEach((c,j)=>{let h=c.star,T=_t?1:Math.min(1,Math.max(0,(P-h.revealAt)/.35));c.heat=Math.max(0,c.heat-f*.48);let z=(.78+c.heat*.22)*T;if(h.degree===0&&(z*=.45),d){let V=j===nt?1.35:d.includes(j)?1.2:.4;z*=1+(V-1)*mt}j===ht&&(z*=1.25);let C=Math.min(1,z);c.core.material.opacity=.34+C*.5,c.glow.material.opacity=Math.min(1,z*.9);let N=G.position.distanceTo(c.core.getWorldPosition(ie)),H=Math.max(c.base*.5*(1+c.heat*.25),.0028*2*N*x)*(j===ht?1.22:1);c.core.scale.setScalar(H),c.glow.scale.setScalar(H*11),c.hit.scale.setScalar(Math.max(H*4,.045*2*N*x))});for(let c of pt){c.heat=Math.max(0,c.heat-f*.6);let h=.2*(_t?1:Math.max(0,(P-1.6)/.8));if(d){let T=c.x===nt||c.y===nt;h*=1+((T?3.2:.25)-1)*mt}c.mat.opacity=Math.min(.85,h+c.heat*.5),c.mat.color.setHex(c.heat>.02?Bn:Qn)}for(let c of oe){c.rush=Math.max(c.chord.heat,c.rush-f*.25),e||(c.u=(c.u+(.07+Math.min(1,c.rush)*.83)*f)%1),c.sprite.position.copy(c.chord.curve.getPoint(c.u));let j=_t?1:Math.max(0,(P-1.6)/.8),h=Math.sin(Math.PI*c.u)*(.75+c.rush*.25)*j;if(d){let z=c.chord.x===nt||c.chord.y===nt;h*=1+((z?1.2:.2)-1)*mt}c.sprite.material.opacity=e?0:Math.min(1,h);let T=G.position.distanceTo(c.sprite.getWorldPosition(ie));c.sprite.scale.setScalar(Math.max(K*.028,.012*T*x)*(1+c.rush*.7))}b.render(A,G);let r=[];for(let{el:c,p:j}of At){let h=tt.indexOf(j);j.core.getWorldPosition(ie);let T=ie.clone().applyMatrix4(G.matrixWorldInverse).z,{x:z,y:C}=We(c,h,-10),N=r.some(V=>Math.abs(V.x-z)<120&&Math.abs(V.y-C)<22),H=_t&&!N&&T<-K*.2&&h!==ht&&h!==nt;c.style.opacity=H?d&&!d.includes(h)?\"0.25\":\"0.92\":\"0\",H&&r.push({x:z,y:C})}let w=ht>=0?ht:nt;w>=0?(We(at,w,-14),at.innerHTML=`${et.stars[w].title}${et.stars[w].section}`,at.style.opacity=\"1\"):at.style.opacity=\"0\"};return new IntersectionObserver(k=>{pe=k[0].isIntersecting,pe&&(Le=performance.now())},{threshold:.05}).observe(t),Pe=requestAnimationFrame(ue),e&&(pe=!0),{reset(){W=0,ut=0,nt=-1,o&&o(null),ot=0},heat:Xt,select(k){let f=et.stars.findIndex(P=>P.title===k);nt=f,ot=performance.now(),o&&o(f>=0?et.stars[f]:null)},stop(){cancelAnimationFrame(Pe),U.disconnect()}}}var _,cn,Qn,Bn,Rn,ln,Bo,dn,pn,Ro,Jo,$o,Vn=tn(()=>{_=window.__pandoTHREE,cn={profile:\"#ffe3a3\",decisions:\"#ffb870\",knowledge:\"#8fe3ff\",projects:\"#5aa8ff\",journal:\"#b9c6d8\",inbox:\"#ff8a6a\"},Qn=9430015,Bn=15334143,Rn=2.8,ln=26,Bo=80,dn={profile:[\"Marcus checks every change on a phone first\",\"Marcus wants it simple to start\"],decisions:[\"The last spot is claimed in one step\",\"Games show within 10 km\",\"Team chats keep 30 days of messages\",\"Deploys wait for a yes\",\"Sign-in is Google or an email link\",\"New players land on /map\",\"A full game shows Full\",\"Games need a time and a place\",\"Players can leave up to an hour before\",\"Rally is free for now\",\"One sport per game\",\"Ten players is the default size\",\"Hosts can remove a player\",\"Chat shows first names only\",\"No ads in the app\",\"Distances are in km\",\"Maps use the light theme\",\"Reminders go out an hour before\",\"Old games drop off after a day\",\"Photos are off for now\",\"Join is always one tap\",\"Codex reviews every join change\",\"Tests run before every deploy\"],knowledge:[\"Maps use MapLibre with free tiles\",\"Buttons use the Rally green\",\"How a player joins a game\",\"Where game times are stored\",\"How distance is worked out\",\"The steps to host a game\",\"How chat messages are sent\",\"Which sports Rally supports\",\"How the spot count updates\",\"How sign-in links are sent\",\"What a game card shows\",\"How full games are shown\",\"Where the app icon files are\",\"How reminders are worded\",\"How the test players are made\",\"Which pages need sign-in\",\"How the map clusters pins\",\"How time zones are handled\",\"The fonts in the app\",\"How a host cancels a game\",\"Where backups are kept\",\"How search finds a park\",\"How the preview site is built\",\"How long a sign-in lasts\",\"Which phones Rally is tested on\",\"How chat is kept to 30 days\",\"What happens when a player leaves\",\"How errors are logged\",\"How the database is laid out\",\"Where the share links point\",\"How games are sorted\",\"The colours in dark mode\",\"How Join handles a slow network\"],projects:[\"Rally app\",\"Rally map\",\"Team chat\",\"Sign-in\",\"Game hosting\",\"Reminders\",\"Rally website\",\"Share links\"],journal:[\"Built sign-in\",\"Added the map of games\",\"Fixed the last-spot bug\",\"Codex reviewed the join code\",\"Deployed the preview site\",\"Added the Join button\",\"Added team chat\",\"Styled the game cards\",\"Checked Rally on a small phone\",\"Added reminders\",\"Fixed a crash on games with no place\",\"Added share links\",\"Moved the tabs to the bottom\",\"Sped up the map\",\"Added dark mode\",\"Cleaned up test games\",\"Wrote the hosting steps\",\"Fixed the chat scroll\",\"Sent Priya the test build\"]},pn=[\"profile\",\"decisions\",\"knowledge\",\"projects\",\"journal\"],Ro=[[\"The last spot is claimed in one step\",[\"How a player joins a game\",\"How the spot count updates\",\"Fixed the last-spot bug\",\"Codex reviewed the join code\",\"Added the Join button\",\"Rally app\",\"Codex reviews every join change\",\"A full game shows Full\",\"Ten players is the default size\",\"Tests run before every deploy\",\"Join is always one tap\"]],[\"Rally app\",[\"Sign-in is Google or an email link\",\"New players land on /map\",\"Rally map\",\"Team chat\",\"Sign-in\",\"Game hosting\",\"Reminders\",\"Deployed the preview site\",\"How the preview site is built\",\"Rally website\",\"Share links\"]],[\"Deploys wait for a yes\",[\"Deployed the preview site\",\"How the preview site is built\",\"Rally website\",\"Tests run before every deploy\",\"Marcus checks every change on a phone first\",\"Marcus wants it simple to start\"]],[\"Maps use MapLibre with free tiles\",[\"Rally map\",\"How distance is worked out\",\"How the map clusters pins\",\"Sped up the map\",\"Games show within 10 km\",\"Distances are in km\",\"Maps use the light theme\",\"How search finds a park\",\"Added the map of games\",\"Fixed a crash on games with no place\"]],[\"Team chats keep 30 days of messages\",[\"Team chat\",\"How chat messages are sent\",\"How chat is kept to 30 days\",\"Added team chat\",\"Fixed the chat scroll\",\"Chat shows first names only\",\"Photos are off for now\",\"Hosts can remove a player\"]],[\"Game hosting\",[\"The steps to host a game\",\"How a host cancels a game\",\"Games need a time and a place\",\"One sport per game\",\"Which sports Rally supports\",\"Wrote the hosting steps\",\"Old games drop off after a day\",\"Players can leave up to an hour before\"]],[\"Reminders\",[\"Reminders go out an hour before\",\"How reminders are worded\",\"Added reminders\",\"Where game times are stored\",\"How time zones are handled\"]],[\"Buttons use the Rally green\",[\"Styled the game cards\",\"What a game card shows\",\"How full games are shown\",\"The fonts in the app\",\"The colours in dark mode\",\"Added dark mode\",\"Where the app icon files are\"]],[\"Which phones Rally is tested on\",[\"Checked Rally on a small phone\",\"Moved the tabs to the bottom\",\"Marcus checks every change on a phone first\",\"How Join handles a slow network\",\"Which pages need sign-in\"]],[\"Sign-in\",[\"How sign-in links are sent\",\"How long a sign-in lasts\",\"Built sign-in\",\"Which pages need sign-in\",\"Sign-in is Google or an email link\"]],[\"Share links\",[\"Where the share links point\",\"Added share links\",\"Sent Priya the test build\"]],[\"How the database is laid out\",[\"Where backups are kept\",\"How the test players are made\",\"Cleaned up test games\",\"How errors are logged\",\"How games are sorted\"]],[\"Rally is free for now\",[\"No ads in the app\",\"Rally website\"]]],Jo={NOTES:dn,ORDER:pn,SECTION_HEX:cn};$o=t=>1-Math.pow(1-t,3)});var mo={};en(mo,{closeExplore:()=>ya,initExplore:()=>Cs,openExplore:()=>xn});function ss(){de.forEach(t=>{t.shown=t.stream?1:t.lines.length,t.extra=[],t.st=t.st0,t.t=t.t0,t.chat=!1,t.note=null,t.strip=null,t.ver=(t.ver||0)+1}),a.approval=\"waiting\"}function is(t){return`
\n
\"\"${t.name}\\xB7 ${gt(t.task)}\n \n
\n
\n \n \n
`}function oo(){return ce?!0:(g=y(\"#xp\"),g?(ce=y(\"#xpApp\",g),y(\"#xpChaps\",g).innerHTML=Oe.map(([t,e],n)=>``).join(\"\"),y(\"#xpGrid\",g).innerHTML=de.map(is).join(\"\"),y(\"#xpLegend\",g).innerHTML=me.map(([t,e],n)=>``).join(\"\")+'Drag to circle it \\xB7 scroll to zoom',Ts(),!0):!1)}function $(){if(!ce)return;let t=Se.matches;ce.dataset.view=a.view,ce.classList.toggle(\"noside\",!a.side&&!t),ce.classList.toggle(\"pp\",t&&a.view===\"terms\"&&!!a.pp),rs(),ls(),jn(),a.view===\"terms\"&&Za(),a.view===\"home\"&&Pa(),a.view===\"job\"&&Ya(),a.view===\"brain\"?(ga(),Ze.start()):Ze.stop(),hs(),yn(),gs(),ys(),be()}function rs(){let t=y(\"#xpCrumb\",g),e=a.job,n='';a.view===\"terms\"?t.innerHTML=`${a.max?1:4} on screen`:a.view===\"home\"?t.innerHTML=\"Home\":a.view===\"job\"?t.innerHTML=`\\u203A${gt(e.title)}`:a.view===\"brain\"?t.innerHTML=`Brain\\u203A${{halo:\"Halo\",notes:\"Notes\",ledger:\"Ledger\"}[a.brain.view]}`:t.innerHTML=\"Settings\"}function ls(){let t=a.view===\"brain\"?\"brain\":a.view===\"settings\"?\"settings\":a.view===\"terms\"?\"\":\"work\";Kt(\".xp-rnav button\",g).forEach(o=>o.classList.toggle(\"on\",o.dataset.rn===t)),y('.xp-ws[data-xp=\"go-terms\"]',g).classList.toggle(\"on\",a.view===\"terms\");let e=a.view===\"job\"?\"home\":a.view;Kt(\".xp-tabs button\",g).forEach(o=>o.classList.toggle(\"on\",o.dataset.tb===e));let n=a.approval===\"waiting\";y(\"#xpWsDot\",g).classList.toggle(\"on\",n),y(\"#xpBell\",g).classList.toggle(\"on\",n||a.job.stage===\"done\"&&a.job.kept===null)}function cs(t){return t.st===\"needs\"?'Do you want to proceed?':t.st===\"work\"?'Working':t.st===\"turn\"?'Your turn':t.id===\"rio\"&&a.approval===\"approved\"?'Live on the preview site':'Idle'}function _n(t){let e=a.focus===t.id?\" on\":\"\",n=t.st===\"work\"||t.st===\"needs\"?`${t.t}s`:\"\",o=t.st===\"needs\";return`
\n \"\"${gt(t.task)}${n}\n ${cs(t)}${t.name} \\xB7 ${t.agent}\n ${o?`RISKYRuns this project's deploy step, which can put it live`:\"\"}\n
`}function jn(){let t=y(\"#xpSide\",g);if(a.view===\"terms\"){let e=de.filter(o=>o.st===\"needs\"),n=de.filter(o=>o.st!==\"needs\");t.innerHTML=`
rally4 terminals
\n \n
Needs you \\xB7 ${e.length}
\n ${e.map(_n).join(\"\")||'

Nothing needs you right now.

'}\n
Agents
\n ${n.map(_n).join(\"\")}\n
In this workspace
\n
${qn}Brain notes85
\n \n `}else if(a.view===\"brain\"){let e=a.brain.view;t.innerHTML=`
Brain85 notes
Sections
\n ${me.map(([n,o],i)=>``).join(\"\")}\n
Views
\n \n \n `}else a.view===\"settings\"?t.innerHTML=`
Settings
General
\n \n \n
Advanced
\n \n `:t.innerHTML=\"\"}function Oa(t){return t.lines.slice(0,t.shown).concat(t.extra)}function so(t,e){let n=t.id===\"rio\"&&a.approval===\"waiting\",o=Oa(t).map(([i,b,A,G])=>{if(i===\"msg\")return`
${gt(A)}${gt(b)}
`;let et=(!e&&A?` data-ex=\"${A}\"`:\"\")+(!e&&i.split(\" \").includes(\"opt\")&&n?` data-xp=\"opt\" data-o=\"${G}\" role=\"button\" tabindex=\"0\"`:\"\");return`${gt(b)}`}).join(\"\");return t.st===\"work\"&&(o+=`${t.a===\"claude\"?`Working\\u2026 (${t.t}s \\xB7 esc to interrupt)`:t.a===\"codex\"?`Working (${t.t}s \\u2022 esc to interrupt)`:`Working\\u2026 ${t.t}s`}`),!n&&!e&&(o+=`
${{claude:\"? for shortcuts\",codex:\"\\u23CE send\",cursor:\"/ commands \\xB7 @ files\",grok:\"/ commands\"}[t.a]}
`),o}function ds(t){let e=[],n=!1;for(let[o,i,b]of Oa(t)){let A=i.trim();if(!A)continue;let G=o.split(\" \");if(o===\"msg\"){e.push(`
${gt(b)}: ${gt(A)}
`);continue}if(G.includes(\"u\")&&!n){e.push(`
${gt(A)}
`),n=!0;continue}if(!(G.includes(\"opt\")||/^(Do you want to proceed\\?|Esc to cancel|Bash command|Deploys rally)/.test(A))){if(G.includes(\"bad\")){e.push(`
${gt(A)}
`);continue}if(G.includes(\"d\")||G.includes(\"t\")||G.includes(\"r\")||/^(>|at |npm |● )/.test(A)){e.push(`
${gt(A.replace(/^● /,\"\"))}
`);continue}e.push(`
${gt(A)}
`)}}return t.id===\"rio\"&&a.approval===\"waiting\"&&e.push('
Needs youDo you want to proceed?npm run deploy -- --preview
'),`
${e.join(\"\")}
${so(t,!0)}
`}function Za(){let t=y(\"#xpGrid\",g);t.classList.toggle(\"max\",!!a.max&&!Se.matches),de.forEach(e=>{let n=y(`.xp-pane[data-p=\"${e.id}\"]`,t);n.classList.toggle(\"needs\",e.st===\"needs\"),n.classList.toggle(\"focus\",a.focus===e.id),n.classList.toggle(\"max\",a.max===e.id),n.classList.toggle(\"pp-on\",(a.pp||\"rio\")===e.id),y(\"[data-st]\",n).className=\"xp-st\"+(e.st===\"needs\"?\" q\":e.st===\"idle\"?\" idle\":e.st===\"turn\"?\" turn\":\"\"),y(\"[data-st]\",n).innerHTML=e.st===\"needs\"?`Needs you \\xB7 ${e.t}s`:e.st===\"work\"?`Working \\xB7 ${e.t}s`:e.st===\"turn\"?\"Your turn\":\"Idle\";let o=y('[data-xp=\"max\"]',n);o.setAttribute(\"aria-label\",a.max===e.id?\"Show all terminals\":`Make ${e.name}'s terminal big`),o.innerHTML=a.max===e.id?'':'',y(\".xp-chatsw\",n).setAttribute(\"aria-checked\",e.chat?\"true\":\"false\");let b=y(\"[data-term]\",n),A=y(\"[data-chat]\",n),G=`${e.ver}|${e.shown}|${e.extra.length}|${e.chat}|${a.approval}|${e.st}`;n.dataset.k!==G&&(n.dataset.k=G,b.hidden=e.chat,A.hidden=!e.chat,e.chat?A.innerHTML=ds(e):b.innerHTML=so(e),n.dataset.scroll=\"1\");let et=y(\"[data-xnote]\",n);et.hidden=!e.note,e.note&&(y(\"span\",et).textContent=e.note);let K=y(\"[data-strip]\",n);if(K.hidden=!e.strip,e.strip&&(K.textContent=e.strip),n.dataset.scroll||n.dataset.ns!==`${!!e.note}${!!e.strip}`){n.dataset.scroll=\"\",n.dataset.ns=`${!!e.note}${!!e.strip}`;let E=e.chat?y(\".xp-chatcol\",A):b;E&&(E.scrollTop=E.scrollHeight)}})}function Pa(){let t=y(\"#xpGoal\",g),e=a.job;y(\"#xpStartJob\",g).disabled=!t.value.trim();let n=e.stage!==\"none\";if(y(\"#xpHomeEmpty\",g).hidden=n,y(\"#xpHomeJobs\",g).hidden=!n,n){y(\"#xpHomeJobT\",g).textContent=e.title;let o=y(\"#xpHomeJobS\",g),i=e.stage===\"plan\"||e.stage===\"writing\"?\"Plan waiting for you\":e.stage===\"done\"?e.kept?\"Kept\":e.kept===!1?\"Undone \\xB7 your turn\":\"Your turn\":\"Working\";o.textContent=i,o.className=e.kept||e.stage===\"working\"||e.stage===\"checking\"?\"ok\":\"\"}}function Ya(){let t=a.job,e=y(\".xp-job\",g),n=t.stage;y(\"#xpJobTitle\",g).textContent=t.title;let o=n===\"writing\"?[\"wait\",\"Writing the plan\"]:n===\"plan\"?[\"wait\",\"Plan waiting for you\"]:n===\"working\"?[\"work\",`Working \\xB7 ${t.secs}s`]:n===\"checking\"?[\"chk\",\"Checking\"]:t.kept?[\"ok\",\"Kept\"]:[\"\",\"Your turn\"],i=y(\"#xpStatus\",g);i.className=\"xp-stt \"+o[0],y(\"span\",i).textContent=o[1],y(\"#xpStarted\",g).textContent=n===\"plan\"||n===\"writing\"?\"When you press Start\":\"9:37 am from the Mac\",y(\"#xpAgents\",g).textContent=\"Claude Code and Codex build, each checks the other\";let b=y(\"#xpNote\",g),A=n===\"writing\"?\"\":n===\"plan\"?\"Here is the plan: 4 tasks. Nothing starts until you say Start.\":n===\"working\"?\"Every task runs at the same time, each in its own copy of rally. Your project is untouched.\":n===\"checking\"?t.op===\"read\"?\"Checked. Now each agent reads the real change the other one made.\":t.t3===\"fail\"?\"One task failed its test. Pando sent it back to Claude Code with the real error.\":\"Pando is running rally's own tests on each task.\":t.kept?\"Kept. The change is in your project.\":t.kept===!1?\"Undone. Your project is back to how it was before this job. Keep this change puts the work back.\":\"Done and checked. Keep this change, or ask for a change.\";b.hidden=!A,y(\"span\",b).textContent=A,b.classList.toggle(\"ok\",n===\"done\"&&t.kept!==!1),y(\"#xpSample\",g).hidden=!t.sample,y(\"#xpSkel\",g).hidden=n!==\"writing\";let G=n===\"writing\"||n===\"plan\";y(\"#xpPlan\",g).hidden=n===\"writing\",[\"#xpOp\",\"#xpChg\",\"#xpEng\"].forEach(tt=>{y(tt,g).hidden=G}),Kt(\".xp-kv\",e).forEach(tt=>{tt.hidden=n!==\"plan\"}),y(\"#xpPActs\",g).hidden=n!==\"plan\",gn.forEach((tt,At)=>{let at=y(\"#xpT\"+(At+1),g),pt=t[tt],[Vt,oe]=ps[pt],te=y(\".xp-r\",at);te.textContent=Vt,te.className=\"xp-r \"+oe,y(\".xp-run\",at).hidden=pt!==\"work\",y(\".xp-ck\",at).innerHTML=pt===\"pass\"?us[At]:\"\",At===2&&(y(\".xp-err\",at).hidden=pt!==\"fail\",y(\".xp-backmsg\",at).textContent=pt===\"fail\"?\"Sent back to Claude Code with the real error.\":pt===\"pass\"&&t.failed?\"Claude Code now claims the last spot in one step. Pando ran the tests again: they passed.\":\"\")});let et=gn.filter(tt=>t[tt]===\"pass\").length,K=y(\"#xpPlanR\",g);n===\"plan\"?(K.textContent=\"waiting for your Start\",K.className=\"xp-r\"):et===4?(K.textContent=\"all 4 passed\",K.className=\"xp-r ok\"):(K.textContent=`${et} of 4 passed`,K.className=\"xp-r\"+(t.t3===\"fail\"?\" bad\":\"\")),y(\"#xpPlan .xp-bh\",g).setAttribute(\"aria-expanded\",n===\"working\"&&!t.userOpenedPlan?\"false\":\"true\"),y(\"#xpOpWho\",g).textContent=t.op===\"wait\"?\"another company's AI\":\"Codex and Claude Code\";let E=y(\"#xpOpR\",g);E.textContent=t.op===\"wait\"?\"after Pando's checks pass\":t.op===\"read\"?\"reading the change\":\"nothing wrong\",E.className=\"xp-r\"+(t.op===\"read\"?\" read\":t.op===\"done\"?\" ok\":\"\"),y(\"#xpOpBody\",g).innerHTML=t.op===\"done\"?'Codex read \"Join a game with one tap\": found nothing wrong.Claude Code read \"A chat for each team\": messages are kept for 30 days, as planned.Codex read \"Sign-in\" and Claude Code read \"The map of games near you\": found nothing wrong.':t.op===\"read\"?\"Each agent is reading the real change the other one made: 41 files in app, lib, db and test.\":\"\",y(\"#xpOp .xp-bh\",g).setAttribute(\"aria-expanded\",t.op===\"wait\"?\"false\":\"true\");let l=n===\"done\";y(\"#xpChgN\",g).textContent=l?\"41 files\":\"\";let R=y(\"#xpChgR\",g);R.textContent=l?t.kept===!1?\"put back\":t.kept?\"in your project\":\"waiting for Keep\":\"nothing yet\",R.className=\"xp-r\"+(t.kept?\" ok\":\"\"),y(\"#xpChg .xp-bh\",g).setAttribute(\"aria-expanded\",l?\"true\":\"false\");let v=y(\"#xpFiles\",g),lt=l+\"|\"+Object.entries(t.files).filter(([,tt])=>tt).map(([tt])=>tt).join(\",\");if(v.dataset.k!==lt){v.dataset.k=lt;let tt=\"\",At=\"\";l&&qo.forEach(at=>{at.g!==At&&(At=at.g,tt+=`
${gt(At)}Passed
`);let pt=!!t.files[at.f];tt+=``,pt&&(tt+=`
${at.d.map(([Vt,oe])=>`
${gt(oe)}
`).join(\"\")}
`)}),l&&(tt+=`

and ${Ko} more files in app, components, lib and test

`),v.innerHTML=tt}let dt=y(\"#xpEngR\",g);dt.textContent=n===\"working\"||n===\"checking\"?\"working\":l?\"done\":\"not started\",y(\"#xpEngTerm\",g).innerHTML=t.eng.map(([tt,At])=>`
${gt(At)}
`).join(\"\")||'
The agents\\u2019 terminals open here when the job starts.
';let Tt=y(\"#xpJActs\",g),It=``;Tt.innerHTML=n===\"working\"||n===\"checking\"?'':l?It+(t.kept?'':''):\"\",y(\"#xpAsk2\",g).hidden=!a.ask}function hs(){let t=y(\"#xpPv\",g),e=a.preview&&a.view===\"job\";t.hidden===e&&(t.hidden=!e,e&&!Jt.matches&&t.animate([{transform:\"translateX(40px)\",opacity:0},{transform:\"none\",opacity:1}],{duration:420,easing:\"cubic-bezier(.2,.75,.1,1)\"})),y(\"#xpMain\",g).classList.toggle(\"pv\",e);let n=a.job,o=y(\"#xpSite\",g);o.classList.toggle(\"undone\",n.kept===!1),o.classList.toggle(\"fixed\",n.pv===\"fixed\"),o.classList.toggle(\"joined\",n.joined);let i=y(\"#xpEpill\",g);i.hidden=n.pv===\"fixed\"||n.kept===!1,i.lastChild.textContent=n.pv===\"sending\"?\"Sending\\u2026\":\"1 error\",i.classList.toggle(\"busy\",n.pv===\"sending\")}function yn(){let t=de.filter(e=>e.st===\"work\").length;(a.job.stage===\"working\"||a.job.stage===\"checking\")&&(t+=gn.filter(e=>a.job[e]===\"work\"||a.job[e]===\"check\"||a.job[e]===\"fail\").length),y(\"#xpFtW\",g).textContent=t,y(\"#xpFtI\",g).textContent=de.filter(e=>e.st!==\"work\").length}function gs(){let t=a.job;a.view===\"terms\"?a.chapter!==\"explain\"&&(a.chapter=\"work\"):a.view===\"home\"?a.chapter=\"home\":a.view===\"job\"?t.stage===\"writing\"||t.stage===\"plan\"?a.chapter=\"plan\":t.stage!==\"done\"?a.chapter=\"checks\":t.kept!==null||a.changedOpen?a.chapter=\"keep\":a.preview||t.joined?a.chapter=\"preview\":a.chapter=\"checks\":a.view===\"brain\"?a.chapter=\"brain\":a.chapter=null,a.chapter&&(a.seen.add(a.chapter),a.lastCh=a.chapter)}function ys(){Kt(\"#xpChaps button\",g).forEach(n=>{let o=n.dataset.c===a.chapter;n.classList.toggle(\"on\",o),n.classList.toggle(\"seen\",a.seen.has(n.dataset.c)&&!o),o?n.setAttribute(\"aria-current\",\"step\"):n.removeAttribute(\"aria-current\")});let t=a.chapter===\"explain\";Kt(\".xp-next\",g).forEach(n=>{n.firstChild.textContent=t?\"Done \":\"Next \"});let e=y(\"#xpChaps button.on\",g);if(e&&Se.matches){let n=y(\"#xpChaps\",g);n.scrollTo({left:e.offsetLeft-n.clientWidth/2+e.offsetWidth/2,behavior:Jt.matches?\"auto\":\"smooth\"})}}function ms(){let t=a.job,e=Se.matches;if(a.view===\"terms\"){if(a.chapter===\"explain\"){let n=le.nico;return n.note?n.chat?[\"The chat, with the real terminal beside it. Click around freely, or press Done.\",\".xp-next\"]:[\"A plain note, right under the terminal. Now flip Show as chat on it.\",'.xp-pane[data-p=\"nico\"] .xp-chatsw']:[\"Click the red error in Cursor's terminal, then choose Explain this.\",'.xp-pane[data-p=\"nico\"] .ln[data-ex=\"err\"]']}return a.approval===\"waiting\"?[\"Rio is waiting for your yes. Click Approve, or Deny.\",e&&a.pp?'.xp-pane.pp-on [data-xp=\"opt\"]':'.xp-side [data-xp=\"approve\"]']:a.approval===\"deploying\"?[\"Deploying. Pando then opens the live link itself and checks that it works.\",null]:!a.maxTried&&!e?[\"Double-click any terminal to make it big. \\u2318J jumps to the one waiting.\",null]:[\"Next, say what you want done on Home.\",e?'.xp-tabs [data-tb=\"home\"]':'.xp-rnav [data-rn=\"work\"]']}if(a.view===\"home\")return y(\"#xpGoal\",g).value.trim()?[\"Press Start job. Pando writes a short plan first.\",\"#xpStartJob\"]:[\"Type what you want done, or click the suggestion.\",\"#xpSugg\"];if(a.view===\"job\"){let n=t.stage;return n===\"writing\"?[\"Pando is writing a short plan.\",null]:n===\"plan\"?a.ask?[\"Say what should change, then Send.\",'[data-xp=\"ask-send\"]']:[\"Read the plan, then press Start. Nothing is built before you do.\",\"#xpStart\"]:n===\"working\"?[\"Each task runs in its own copy of rally. Your project is untouched.\",null]:n===\"checking\"?t.t3===\"fail\"?[\"Pando ran the tests itself. One failed, so it went back to Claude Code with the real error.\",\".xp-err\"]:t.op===\"read\"?[\"Codex and Claude Code, from two companies, each read the other one\\u2019s real change.\",null]:[\"Pando runs your project's own tests on each task.\",null]:a.ask?[\"Say what should change, then Send. Pando checks it again before you keep it.\",'[data-xp=\"ask-send\"]']:t.kept===!0?[\"Kept. Undo puts it back the way it was.\",'[data-xp=\"undo\"]']:t.kept===!1?[\"Undone. Your project is back to how it was. Next, the Brain.\",\".xp-next\"]:!a.preview&&!t.joined?[\"Done and checked. Open the Preview to see Rally running.\",'[data-xp=\"pv-open\"]']:a.preview&&t.pv===\"err\"?[\"This is Rally, running. The red pill means the page has an error: click 1 error.\",\"#xpEpill\"]:a.preview&&t.pv===\"sending\"?[\"Pando is handing the agent a screenshot of the page with the error.\",null]:a.preview&&!t.joined?[\"Fixed. Now press Join on Sunday 5-a-side.\",\"#xpJoin\"]:a.changedOpen?[\"Keep this change, or put it back.\",'[data-xp=\"keep\"]']:[\"Now see what changed: open a file to read its lines.\",\".xp-file\"]}return a.view===\"brain\"?a.brain.sel===null?[\"Each light is a note your agents saved. Click one, or drag to turn the Halo.\",\"#xpRecent .xp-nrow\"]:[\"Every agent reads the same notes, so you never explain your project twice.\",\".xp-next\"]:[\"Flip a setting to see what it does.\",'[data-k=\"watch\"]']}function be(){let[t,e]=ms(),n=y(\"#xpHint\",g);if(n.textContent!==t&&(n.textContent=t),Kt(\".xp-pulse\",g).forEach(i=>i.classList.remove(\"xp-pulse\")),!e||a.pal)return;let o=Kt(e,g).find(i=>i.offsetParent!==null||i.getClientRects().length);o&&o.classList.add(\"xp-pulse\")}function mn(){clearInterval(Ca);let t=de.filter(n=>n.shown{e++;let n=!1,o=!1;if(de.forEach((i,b)=>{i.shown>=i.lines.length||(n=!0,(e+b*2)%3===0&&(i.shown++,i.shown>=i.lines.length&&(fn(i),o=!0)))}),!n){clearInterval(Ca);return}a.view===\"terms\"?(Za(),o&&(jn(),yn(),be())):o&&yn()},260)}function fn(t){t.shown=t.lines.length,t.st===\"work\"&&(t.st=\"idle\")}function fs(){clearInterval(hn),hn=setInterval(()=>{de.forEach(t=>{(t.st===\"work\"||t.st===\"needs\")&&t.t++}),a.job.stage===\"working\"&&a.job.secs++,a.view===\"terms\"&&de.forEach(t=>{let e=y(`.xp-pane[data-p=\"${t.id}\"] [data-st] .tm`,g);e&&(e.textContent=`\\xB7 ${t.t}s`);let n=y(`[data-tm=\"${t.id}\"]`,g);n&&n.textContent&&(n.textContent=`${t.t}s`)}),a.view===\"job\"&&a.job.stage===\"working\"&&(y(\"#xpStatus span\",g).textContent=`Working \\xB7 ${a.job.secs}s`)},1e3)}function Kn(t=\"1\"){if(a.approval!==\"waiting\")return;let e=le.rio;a.approval=\"deploying\",e.st=\"work\",e.t=0,e.extra.push([\"\",t===\"2\"?\" \\u276F 2. Yes, and don't ask again for npm run deploy\":\" \\u276F 1. Yes\"],[\"\",\" \"],[\"\",\"\\u25CF Bash(npm run deploy -- --preview)\"]),e.ver++,$(),Gt(700,()=>{e.extra.push([\"d\",\" Building rally\\u2026 done in 5.6 s\"]),e.ver++,Za()}),Gt(1500,()=>{e.extra.push([\"d\",\" Uploading 62 files to the preview site\"]),e.ver++,Za()}),Gt(2500,()=>{e.extra.push([\"ok\",\" Deployed in 31 s.\"],[\"\",\"Rally is on the preview site now.\"]),e.st=\"idle\",a.approval=\"approved\",e.strip=\"\\u2713 Pando opened the live link: it works\",e.ver++,Ct(\"Deployed. Pando opened the live link itself: it works.\"),$()})}function to(){if(a.approval!==\"waiting\")return;let t=le.rio;a.approval=\"denied\",t.st=\"turn\",t.extra.push([\"\",\" \\u276F 3. No, tell Claude what to do\"],[\"\",\" \"],[\"\",\"Okay, I won't deploy. What would you like me to do instead?\"]),t.ver++,Ct(\"Denied. Nothing was deployed.\",\"n\"),$()}function Ms(){let t=le.rio;t.extra=[],t.st=\"needs\",t.t=12,t.strip=null,t.ver++,a.approval=\"waiting\",$()}function io(){if(a.approval!==\"waiting\"){Ct(\"Nothing is waiting for you right now.\");return}a.view=\"terms\",a.max=null,ro(\"rio\"),Ct(\"Your keyboard is in Rio's terminal, the one waiting.\")}function ro(t){a.focus=t,Se.matches&&(a.pp=t),a.max&&a.max!==t&&(a.max=t),$();let e=y(`.xp-pane[data-p=\"${t}\"]`,g);e&&(e.classList.remove(\"flash\"),e.offsetWidth,e.classList.add(\"flash\"),e.focus({preventScroll:!0}))}function lo(t){a.max=a.max===t?null:t,a.focus=t,a.maxTried=!0,$()}function co(){ha&&(y(\"#xpGoal\",g).value=ha,ha=null);let t=y(\"#xpGoal\",g).value.trim();if(!t)return;let e=/rally|game|join|map|chat|pickup|team/i.test(t);Fe(),a.job=ke(\"writing\",e?t.charAt(0).toUpperCase()+t.slice(1):za,!e),a.preview=!1,a.changedOpen=!1,a.ask=null,a.view=\"job\",$(),y(\"#xpJobScroll\",g).scrollTop=0,Gt(1100,()=>{a.job.stage=\"plan\",$()})}function po(){let t=a.job;t.stage===\"plan\"&&(Fe(),Object.assign(t,{stage:\"working\",secs:0,t1:\"work\",t2:\"work\",t3:\"work\",t4:\"work\",eng:[[\"h\",\"Mira \\xB7 Claude Code \\xB7 copies 1 and 3\"]]}),$(),requestAnimationFrame(()=>requestAnimationFrame(()=>Kt(\".xp-prog i\",g).forEach((e,n)=>{e.style.transitionDuration=[\"2.0s\",\"2.3s\",\"2.6s\",\"2.2s\"][n]||\"2s\",e.style.width=\"100%\"}))),xs())}function xs(){let t=a.job,e=n=>{t.eng.push(n),a.view===\"job\"&&Ya()};Gt(450,()=>e([\"\",\"Building sign-in, then Join with one tap\"])),Gt(950,()=>{t.eng.push([\"h\",\"Juno \\xB7 Codex \\xB7 copies 2 and 4\"]),e([\"\",\"Building the map of games and the team chat\"])}),Gt(2100,()=>{t.t1=\"check\",t.t2=\"check\",t.t4=\"check\",$()}),Gt(2600,()=>{t.t1=\"pass\",t.t2=\"pass\",t.t4=\"pass\",t.stage=\"checking\",t.t3=\"check\",e([\"\",\"Done. Handing every task to Pando\\u2019s checks.\"]),$()}),Gt(3300,()=>{t.t3=\"fail\",t.failed=!0,e([\"bad\",\"Pando: npm test failed: two players took the last spot. A 10-player game has 11.\"]),$()}),Gt(5e3,()=>e([\"\",\"Mira: claiming the last spot in one database step\"])),Gt(6300,()=>{t.t3=\"pass\",e([\"ok\",\"Done. Pando ran the tests again: 84 passed.\"]),$()}),Gt(6900,()=>{t.op=\"read\",$()}),Gt(8500,()=>{t.op=\"done\",t.stage=\"done\",$(),Ct(\"Done and checked. Your turn.\")})}function ws(){let t=a.job;t.kept=!0,Ct(\"Kept. The change is in your project.\"),$()}function js(){let t=a.job;t.kept=!1,Ct(\"Undone. Your project is back to how it was.\",\"n\"),$()}function bs(){let t=a.job;t.pv===\"err\"&&(t.pv=\"sending\",$(),Gt(700,()=>{Ct(\"Sent to Mira, with a screenshot.\"),t.eng.push([\"h\",\"Mira \\xB7 Claude Code\"],[\"\",\"From Preview: a screenshot of localhost:3000/map and 1 error\"]),a.view===\"job\"&&Ya()}),Gt(1700,()=>{t.eng.push([\"\",\"One game has no location yet, so its card crashed. It now says Location to be set.\"]),a.view===\"job\"&&Ya()}),Gt(2600,()=>{t.pv=\"fixed\",t.eng.push([\"ok\",\"Fixed. The page shows no errors now.\"]);let e=y(\"#xpSite\",g);e.classList.remove(\"reload\"),e.offsetWidth,e.classList.add(\"reload\"),Ct(\"Fixed. The page shows no errors now.\"),$()}))}function Ls(){let t=a.job;if(t.kept===!1||t.joined)return;let e=y(\"#xpJoin\",g);e.textContent=\"Joining\\u2026\",Gt(500,()=>{t.joined=!0,e.textContent=\"Join\",$(),Ct(\"You're in. Sunday 5-a-side is full now.\")})}function Ns(t){Be(t,`
Errors on this page
TypeError: Cannot read properties of undefined (reading 'lat')at GameCard (components/GameCard.tsx:42)

Goes to Mira \\xB7 Claude Code

`)}function uo(t){a.brain.sel=t,ga(),be(),Ze.redraw()}function ga(){let t=a.brain,e=y(\"#xpRecent\",g),n=y(\"#xpNotesV\",g);if(t.sel!==null){let o=Yt[t.sel];e.innerHTML=`
\n ${me[o.s][0]}

${gt(o.t)}

${gt(o.body)}

Saved by ${gt(o.by)} \\xB7 ${o.ago}m ago
\n
Read by${o.read.map(i=>`\"\"${gt(i)}`).join(\"\")}
`}else{let o=Yt.filter(i=>i.s!==4).slice().sort((i,b)=>i.ago-b.ago).filter(i=>!t.off.has(i.s)&&(!t.q||i.t.toLowerCase().includes(t.q.toLowerCase()))).slice(0,26);e.innerHTML=`
Recent notes
${o.map(i=>``).join(\"\")||'

No notes match.

'}`}Kt(\"#xpLegend [data-s]\",g).forEach(o=>o.classList.toggle(\"off\",t.off.has(+o.dataset.s))),y(\"#xpHaloBox\",g).classList.toggle(\"list\",t.view!==\"halo\"),n.hidden=t.view===\"halo\",t.view===\"notes\"&&(n.innerHTML=Yt.filter(o=>!t.off.has(o.s)).slice(0,48).map(o=>``).join(\"\")),t.view===\"ledger\"&&(n.innerHTML=Je.concat(Je).map((o,i)=>{let b=i${Ve[un[b]]?`\"\"`:\"\"}${gt(b)} ${A} \"${gt(o.t)}\"${o.ago+i}m`}).join(\"\"))}function Ct(t,e=\"ok\"){let n=y(\"#xpToast\",g);y(\"span\",n).textContent=t,n.hidden=!1,n.dataset.kind=e,Jt.matches||n.animate([{opacity:0,transform:\"translateY(8px)\"},{opacity:1,transform:\"none\"}],{duration:300,easing:\"cubic-bezier(.2,.75,.1,1)\"}),clearTimeout(eo),eo=setTimeout(()=>{n.hidden=!0},3600)}function ho(t,e,n){let o=ce.getBoundingClientRect();t.hidden=!1;let i=t.offsetWidth,b=t.offsetHeight;t.style.left=Math.max(8,Math.min(e-o.left,o.width-i-8))+\"px\",t.style.top=Math.max(8,Math.min(n-o.top,o.height-b-8))+\"px\"}function Is(t,e,n){let o=y(\"#xpMenu\",g);o.innerHTML=n.map(i=>i===\"-\"?\"
\":i.lbl?`
${gt(i.lbl)}
`:``).join(\"\"),ho(o,t,e),y(\"button\",o)?.focus({preventScroll:!0})}function Be(t,e){let n=y(\"#xpPop\",g);n.innerHTML=e;let o=t.getBoundingClientRect();ho(n,o.left+o.width/2-140,o.bottom+6)}function Ht(){let t=!1;return[\"#xpMenu\",\"#xpPop\"].forEach(e=>{let n=y(e,g);n.hidden||(n.hidden=!0,t=!0)}),a.pal&&(a.pal=!1,y(\"#xpPal\",g).hidden=!0,t=!0,be()),Kt(\".xp-term .sel\",g).forEach(e=>e.classList.remove(\"sel\")),t}function go(){Ht(),a.pal=!0;let t=y(\"#xpPal\",g);t.hidden=!1;let e=y(\"#xpPalIn\",g);e.value=\"\",bn(),e.focus(),be()}function bn(){let t=y(\"#xpPalIn\",g).value.trim().toLowerCase(),e=ks.filter(n=>!t||n[0].toLowerCase().includes(t));ve=Math.min(ve,Math.max(0,e.length-1)),y(\"#xpPalL\",g).innerHTML=e.map((n,o)=>``).join(\"\")||'
Nothing matches. Try \"Brain\" or \"Home\".
'}function vs(t){return t==null||t===\"\"?\"work\":/^\\d+$/.test(String(t))?_o[+t]||\"work\":Oe.some(([e])=>e===t)?t:\"work\"}function $e(t){t=vs(t),Fe(),Ht(),a.ask=null,a.maxByChat=null,g&&(y(\"#xpToast\",g).hidden=!0),a.chapter=t;let e=()=>{a.preview=!1,a.changedOpen=!1};switch(t){case\"work\":a.view=\"terms\",a.max=null,a.focus=null,a.pp=null,mn();break;case\"home\":a.view=\"home\",a.job=ke(),e(),y(\"#xpGoal\",g).value=\"\";break;case\"plan\":a.view=\"job\",a.job=ke(\"plan\"),e();break;case\"checks\":a.view=\"job\",e(),a.job=ke(\"plan\"),a.job.stage=\"plan\",po();break;case\"preview\":a.view=\"job\",a.job=ke(\"done\"),e(),a.preview=!0;break;case\"keep\":a.view=\"job\",a.job=ke(\"done\"),e(),a.job.pv=\"fixed\",a.job.joined=!0,a.job.files[\"lib/join.ts\"]=!0,a.changedOpen=!0;break;case\"brain\":a.view=\"brain\",a.brain.sel=null,a.brain.view=\"halo\";break;case\"explain\":a.view=\"terms\",a.max=null,fn(le.nico),le.nico.ver++,mn(),a.focus=\"nico\",a.pp=\"nico\",le.nico.note=null,le.nico.chat=!1;break}if($(),a.view===\"job\"){let n=y(\"#xpJobScroll\",g);n.scrollTop=0,t===\"keep\"&&requestAnimationFrame(()=>{let o=y(\"#xpChg\",g);n.scrollTo({top:o.offsetTop-20,behavior:Jt.matches?\"auto\":\"smooth\"})})}}function Mn(t){let e=Oe.findIndex(([o])=>o===a.chapter),n=e>=0?e:Math.max(0,Oe.findIndex(([o])=>o===a.lastCh));if(e<0&&t<0){$e(Oe[n][0]);return}if(t>0&&n===Oe.length-1){ya();return}$e(Oe[Math.max(0,Math.min(Oe.length-1,n+t))][0])}function Wa(t,e,n){let o=e&&e.dataset.p;switch(t){case\"close\":ya();break;case\"prev\":Mn(-1);break;case\"next\":Mn(1);break;case\"chap\":$e(e.dataset.c);break;case\"toggle-side\":a.side=!a.side,$();break;case\"go-home\":Ht(),a.view=\"home\",$();break;case\"go-terms\":Ht(),a.view=\"terms\",Se.matches&&(a.pp=null),a.chapter===\"explain\"&&e.closest(\".xp-tabs, .xp-rail, .xp-pall\")&&(a.chapter=\"work\"),mn(),$();break;case\"go-brain\":Ht(),a.view=\"brain\",$();break;case\"go-settings\":Ht(),a.view=\"settings\",$();break;case\"go-job\":a.view=\"job\",$();break;case\"phone-list\":a.pp=null,$();break;case\"focus\":ro(o);break;case\"max\":lo(o);break;case\"jump\":Ht(),io();break;case\"approve\":Kn(\"1\");break;case\"deny\":to();break;case\"opt\":e.dataset.o===\"3\"?to():Kn(e.dataset.o);break;case\"replay\":Ms();break;case\"chat\":{let i=le[o];i.chat=!i.chat,a.focus=o,Se.matches||(i.chat?(a.max=o,a.maxByChat=o):a.maxByChat===o&&(a.max=null,a.maxByChat=null)),$();break}case\"folders\":{e.classList.toggle(\"open\"),e.nextElementSibling.hidden=!e.classList.contains(\"open\");break}case\"explain-it\":{let i=le[o];i.note=Fn[e.dataset.ex]||Fn.err,Ht(),$();break}case\"copy\":{try{navigator.clipboard&&navigator.clipboard.writeText(e.dataset.ex&&(Oa(le[o]).find(i=>i[2]===e.dataset.ex)||[])[1]||\"\").catch(()=>{})}catch{}Ht(),Ct(\"Copied.\");break}case\"send-to\":{let i=le[e.dataset.from],b=le[o],A=(Oa(i).find(G=>G[2]===e.dataset.ex)||[\"\",\"\"])[1].trim();b.extra.push([\"msg\",A,`From ${i.name} \\xB7 ${i.agent}`]),b.ver++,Ht(),Ct(`Sent to ${b.name}'s terminal. ${b.agent} reads it on its next turn.`),$();break}case\"start-job\":co();break;case\"suggest\":ao(za);break;case\"talk\":Ct(\"Not sure what to ask? Talk it over first, then start the job once the goal is clear.\");break;case\"two\":Ct(\"Try two designs builds two versions side by side. Then you Keep A or Keep B.\");break;case\"start\":po();break;case\"change\":a.ask=\"plan\",y(\"#xpAskIn\",g).value=\"Let hosts set how many players a game needs\",$(),y(\"#xpAskIn\",g).focus();break;case\"cancel\":Fe(),a.job=ke(),a.view=\"home\",Ct(\"Cancelled. Nothing was built.\",\"n\"),$();break;case\"stop\":Fe(),a.job=ke(\"plan\",a.job.title,a.job.sample),Ct(\"Stopped. Your project is untouched. Press Start to run the plan again.\"),$();break;case\"ask\":a.ask=\"job\",y(\"#xpAskIn\",g).value=\"Add a share button to each game\",$(),y(\"#xpAskIn\",g).focus();break;case\"ask-cancel\":a.ask=null,$();break;case\"ask-send\":{let i=y(\"#xpAskIn\",g).value.trim()||\"a small change\";if(a.ask===\"plan\"){a.ask=null,Ct(`Plan updated: \"${i}\". You still approve it once.`),$();break}a.ask=null;let b=a.job;b.stage=\"checking\",b.op=\"read\",$(),Gt(1800,()=>{b.stage=\"done\",b.op=\"done\",$(),Ct(\"Changed and checked again. Your turn.\")});break}case\"keep\":ws();break;case\"undo\":js();break;case\"pv-open\":a.preview=!0,$();break;case\"pv-close\":a.preview=!1,$();break;case\"pv-reload\":{let i=y(\"#xpSite\",g);i.classList.remove(\"reload\"),i.offsetWidth,i.classList.add(\"reload\");break}case\"pv-errs\":a.job.pv===\"err\"&&Ns(e);break;case\"fix-see\":bs();break;case\"join\":Ls();break;case\"join-other\":Ct(\"In this sample, try Join on Sunday 5-a-side.\");break;case\"team-chat\":Ct(\"In Rally this opens the team chat for Sunday 5-a-side.\");break;case\"file\":{let i=a.job;i.files[e.dataset.f]=!i.files[e.dataset.f],a.changedOpen=!0,$();break}case\"err-detail\":e.classList.toggle(\"open\");break;case\"fold\":{let i=e.getAttribute(\"aria-expanded\")!==\"true\";e.setAttribute(\"aria-expanded\",i),e.closest(\"#xpPlan\")&&(a.job.userOpenedPlan=i);break}case\"sec\":{let i=+e.dataset.s;a.brain.off.has(i)?a.brain.off.delete(i):a.brain.off.add(i),jn(),ga(),Ze.redraw();break}case\"bview\":a.brain.view=e.dataset.v,$();break;case\"note\":uo(+e.dataset.n);break;case\"note-back\":a.brain.sel=null,ga(),be(),Ze.redraw();break;case\"halo-reset\":a.brain.sel=null,a.brain.off.clear(),a.brain.q=\"\",y(\"#xpHaloQ\",g).value=\"\",Ze.reset(),$();break;case\"set\":{let i=e.dataset.k;a.settings[i]=!a.settings[i],e.classList.toggle(\"on\",a.settings[i]),e.setAttribute(\"aria-checked\",a.settings[i]),Ct(i===\"undo\"?a.settings.undo?\"Undo is on. Pando keeps a copy before each turn.\":\"Undo is off for this sample. Turn it back on any time.\":a.settings.watch?\"Pando Watch is on. Pando tells you if Rally's live site goes down.\":\"Pando Watch is off.\");break}case\"add-login\":Ct(\"In Pando this opens Claude Code's own sign-in for a second account.\");break;case\"srow\":{let i=Kt(\".xp-srow\",g)[+e.dataset.n];i.scrollIntoView({block:\"center\",behavior:Jt.matches?\"auto\":\"smooth\"}),i.classList.add(\"flash\"),setTimeout(()=>i.classList.remove(\"flash\"),900);break}case\"toast-x\":y(\"#xpToast\",g).hidden=!0;break;case\"palette\":go();break;case\"pal-job\":Ht(),a.view=\"home\",$(),ao(za);break;case\"pal-pv\":Ht(),a.job.stage!==\"done\"?$e(\"preview\"):(a.view=\"job\",a.preview=!0,$());break;case\"pal-explain\":Ht(),$e(\"explain\");break;case\"pop-history\":Be(e,`
Recent
${a.job.stage!==\"none\"?``:\"\"}`);break;case\"pop-alerts\":Be(e,`
Alerts
${a.approval===\"waiting\"?'':\"\"}${a.job.stage===\"done\"&&a.job.kept===null?'':\"\"}${a.approval!==\"waiting\"&&!(a.job.stage===\"done\"&&a.job.kept===null)?\"

Nothing needs you right now.

\":\"\"}`);break;case\"pop-me\":Be(e,'
Signed in

Marcus \\xB7 sample project rally
Pando 0.3.62 on this Mac

');break;case\"pop-project\":Be(e,'
Projects

Your other projects show up here.

');break;case\"pop-addws\":Be(e,\"
New workspace

Pick a folder and Pando opens your agents in it, each in its own terminal.

\");break;case\"pop-addterm\":Be(e,`
Open a terminal
${[[\"Claude Code\",\"claude\"],[\"Codex\",\"codex\"],[\"Cursor\",\"cursor\"],[\"Grok\",\"grok\"],[\"Antigravity\",\"antigravity\"]].map(([i,b])=>``).join(\"\")}`);break;case\"add-term\":Ht(),Ct(`In Pando this opens a new ${e.dataset.n} terminal in rally, signed in the way you always do.`);break}n&&t!==\"fold\"&&n.preventDefault?.()}function ao(t){let e=y(\"#xpGoal\",g);if(e.value=\"\",e.focus({preventScroll:!0}),Jt.matches){e.value=t,Pa(),be();return}let n=0;Fe(),ha=t;let o=()=>{n=Math.min(t.length,n+2),e.value=t.slice(0,n),Pa(),nA.classList.remove(\"sel\")),t.classList.add(\"sel\");let b=de.filter(A=>A.id!==o);Is(e.clientX+4,e.clientY+6,[{t:\"Copy\",act:\"copy\",p:o,ex:i,k:\"\\u2318C\"},{t:\"Explain this\",act:\"explain-it\",p:o,ex:i},\"-\",{lbl:\"Send to another agent\"},...b.map(A=>({t:`${A.name} \\xB7 ${A.agent}`,act:\"send-to\",p:A.id,ex:i,img:Ve[A.a]}))]),Kt('#xpMenu [data-xp=\"send-to\"]',g).forEach(A=>{A.dataset.from=o}),a.chapter===\"explain\"&&be()}function Ts(){g.addEventListener(\"click\",t=>{let e=t.target.closest(\"#xpMenu, #xpPop\"),n=t.target.closest(\".xp-term [data-ex]\"),o=t.target.closest(\"[data-xp]\");if(!e){let i=y(\"#xpMenu\",g),b=y(\"#xpPop\",g);if((!i.hidden||!b.hidden)&&(i.hidden=!0,b.hidden=!0,Kt(\".xp-term .sel\",g).forEach(A=>A.classList.remove(\"sel\")),!o&&!n))return}if(!(a.pal&&!t.target.closest(\".xp-palbox\")&&(Ht(),!o))){if(n&&!o){no(n,t);return}o&&((e||t.target.closest(\"#xpPalL\"))&&(y(\"#xpMenu\",g).hidden=!0,y(\"#xpPop\",g).hidden=!0,a.pal&&(a.pal=!1,y(\"#xpPal\",g).hidden=!0)),Wa(o.dataset.xp,o,t))}}),g.addEventListener(\"contextmenu\",t=>{let e=t.target.closest(\".xp-term [data-ex]\");e&&(t.preventDefault(),no(e,t))}),g.addEventListener(\"dblclick\",t=>{let e=t.target.closest(\".xp-pane\");e&&!t.target.closest(\"button,[data-ex]\")&&!Se.matches&&(getSelection()?.removeAllRanges(),lo(e.dataset.p))}),y(\"#xpGoal\",g).addEventListener(\"input\",()=>{Pa(),be()}),y(\"#xpGoal\",g).addEventListener(\"keydown\",t=>{t.key===\"Enter\"&&!t.shiftKey&&(t.preventDefault(),co())}),y(\"#xpAskIn\",g).addEventListener(\"keydown\",t=>{t.key===\"Enter\"&&(t.preventDefault(),Wa(\"ask-send\"))}),y(\"#xpHaloQ\",g).addEventListener(\"input\",t=>{a.brain.q=t.target.value,a.brain.sel=null,ga(),Ze.redraw()}),y(\"#xpPalIn\",g).addEventListener(\"input\",()=>{ve=0,bn()}),document.addEventListener(\"keydown\",Ds,!0),Se.addEventListener?.(\"change\",()=>{a.open&&$()})}function Ss(){return Kt('button:not([disabled]), [href], input, textarea, [tabindex=\"0\"]',g).filter(t=>t.getClientRects().length&&!t.closest(\"[hidden]\"))}function Ds(t){if(!a.open)return;let e=t.target.matches&&t.target.matches(\"input, textarea\"),n=t.metaKey||t.ctrlKey,o=t.key.toLowerCase();if(t.key===\"Escape\"){t.preventDefault(),t.stopPropagation(),Ht()||ya();return}if(n&&o===\"k\"){t.preventDefault(),go();return}if(n&&o===\"j\"){t.preventDefault(),Ht(),io();return}if(a.pal){let i=Kt(\"#xpPalL button\",g);if(t.key===\"ArrowDown\"||t.key===\"ArrowUp\"){t.preventDefault(),ve=(ve+(t.key===\"ArrowDown\"?1:-1)+i.length)%Math.max(1,i.length),bn();return}if(t.key===\"Enter\"&&i[ve]){t.preventDefault();let b=i[ve];Ht(),Wa(b.dataset.xp,b);return}}if(t.key===\"Tab\"){let i=Ss();if(!i.length)return;let b=i.indexOf(document.activeElement);t.shiftKey&&b<=0?(t.preventDefault(),i[i.length-1].focus()):!t.shiftKey&&(b===i.length-1||b===-1)&&(t.preventDefault(),i[0].focus());return}if((t.key===\"Enter\"||t.key===\" \")&&t.target.matches&&t.target.matches('[role=\"button\"][data-xp]')){t.preventDefault(),Wa(t.target.dataset.xp,t.target,t);return}!e&&!n&&(t.key===\"ArrowRight\"||t.key===\"ArrowLeft\")&&!t.target.closest?.(\"#xpMenu\")&&(t.preventDefault(),Mn(t.key===\"ArrowRight\"?1:-1))}function yo(t){return t&&t.width>40&&t.bottom>0&&t.top0&&t.leftb.animate([{opacity:0,transform:`translateY(${A?10:-10}px)`},{opacity:1,transform:\"none\"}],{duration:500,delay:380,easing:Ea,fill:\"backwards\"}))}requestAnimationFrame(()=>n.focus({preventScroll:!0}))}function ya(){if(!a.open)return;a.open=!1,Fe(),clearInterval(hn),clearInterval(Ca),Ze.stop(),Ht();let t=()=>{g.hidden=!0,document.documentElement.classList.remove(\"xp-on\");try{Re&&Re.start()}catch{}Da&&Da.focus&&Da.focus({preventScroll:!0})};if(Jt.matches){t();return}let e=ua&&ua.getBoundingClientRect(),n=ce.getBoundingClientRect(),o;if(yo(e)){let i=e.width/n.width,b=Math.max(0,n.height-e.height/i);o=ce.animate([{transform:\"none\",clipPath:\"inset(0 0 0 0 round 14px)\"},{transform:`translate(${e.left-n.left}px,${e.top-n.top}px) scale(${i})`,clipPath:`inset(0 0 ${b}px 0 round ${14/i}px)`}],{duration:620,easing:Ea})}else o=ce.animate([{opacity:1},{opacity:0,transform:\"translateY(20px) scale(.97)\"}],{duration:360,easing:\"ease-in\"});y(\".xp-back\",g).animate([{opacity:1},{opacity:0}],{duration:560,easing:\"ease-in\",fill:\"forwards\"}),[y(\".xp-bar\",g),y(\".xp-hint\",g)].forEach(i=>i.animate([{opacity:1},{opacity:0}],{duration:220,fill:\"forwards\"})),o.onfinish=()=>{t(),g.getAnimations({subtree:!0}).forEach(i=>i.cancel())}}function Cs({lenis:t}={}){Re=t||window.__lenis||null,oo()&&($n||($n=!0,document.addEventListener(\"click\",e=>{let n=e.target.closest(\"[data-explore]\");if(!n||g.contains(n))return;e.preventDefault();let o=null;try{o=n.dataset.exploreFrom?document.querySelector(n.dataset.exploreFrom):null}catch{o=null}o||(o=n.id===\"heroWin\"||n.closest(\"#stage\")?document.getElementById(\"heroWin\"):n),xn(n.dataset.explore,o)}),window.__explore={open:xn,close:ya,state:a}))}var Jt,Se,y,Kt,gt,g,ce,Re,Da,ua,$n,Aa,Gt,Fe,hn,Ca,Ve,Oe,_o,za,de,le,Fn,qo,Ko,me,wn,ts,es,un,Yt,Je,Te,as,ea,Xn,ns,a,gn,ke,os,qn,ps,us,Ze,eo,ks,ve,ha,Ea,fo=tn(()=>{Jt=matchMedia(\"(prefers-reduced-motion: reduce)\"),Se=matchMedia(\"(max-width: 760px)\"),y=(t,e=document)=>e.querySelector(t),Kt=(t,e=document)=>[...e.querySelectorAll(t)],gt=t=>String(t).replace(/[&<>\"]/g,e=>({\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\"})[e]),g=null,ce=null,Re=null,Da=null,ua=null,$n=!1,Aa=new Set,Gt=(t,e)=>{if(Jt.matches){e();return}let n=setTimeout(()=>{Aa.delete(n),e()},t);Aa.add(n)},Fe=()=>{Aa.forEach(clearTimeout),Aa.clear()},hn=0,Ca=0,Ve={claude:\"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHRpdGxlPkNsYXVkZTwvdGl0bGU+PHBhdGggZD0iTTQuNzA5IDE1Ljk1NWw0LjcyLTIuNjQ3LjA4LS4yMy0uMDgtLjEyOEg5LjJsLS43OS0uMDQ4LTIuNjk4LS4wNzMtMi4zMzktLjA5Ny0yLjI2Ni0uMTIyLS41NzEtLjEyMUwwIDExLjc4NGwuMDU1LS4zNTIuNDgtLjMyMS42ODYuMDYgMS41Mi4xMDMgMi4yNzguMTU4IDEuNjUyLjA5NyAyLjQ0OS4yNTVoLjM4OWwuMDU1LS4xNTctLjEzNC0uMDk4LS4xMDMtLjA5Ny0yLjM1OC0xLjU5Ni0yLjU1Mi0xLjY4OC0xLjMzNi0uOTcyLS43MjQtLjQ5MS0uMzY0LS40NjItLjE1OC0xLjAwOC42NTYtLjcyMi44ODEuMDYuMjI1LjA2MS44OTMuNjg2IDEuOTA4IDEuNDc2IDIuNDkxIDEuODMzLjM2NS4zMDQuMTQ1LS4xMDMuMDE5LS4wNzMtLjE2NC0uMjc0LTEuMzU1LTIuNDQ2LTEuNDQ2LTIuNDktLjY0NC0xLjAzMi0uMTctLjYxOWEyLjk3IDIuOTcgMCAwMS0uMTA0LS43MjlMNi4yODMuMTM0IDYuNjk2IDBsLjk5Ni4xMzQuNDIuMzY0LjYyIDEuNDE0IDEuMDAyIDIuMjI5IDEuNTU1IDMuMDMuNDU2Ljg5OC4yNDMuODMyLjA5MS4yNTVoLjE1OFY5LjAxbC4xMjgtMS43MDYuMjM3LTIuMDk1LjIzLTIuNjk1LjA4LS43Ni4zNzYtLjkxLjc0Ny0uNDkyLjU4NC4yOC40OC42ODUtLjA2Ny40NDQtLjI4NiAxLjg1MS0uNTU5IDIuOTAzLS4zNjQgMS45NDJoLjIxMmwuMjQzLS4yNDIuOTg1LTEuMzA2IDEuNjUyLTIuMDY0LjczLS44Mi44NS0uOTA0LjU0Ny0uNDMxaDEuMDMzbC43NiAxLjEyOS0uMzQgMS4xNjYtMS4wNjQgMS4zNDctLjg4MSAxLjE0Mi0xLjI2NCAxLjctLjc5IDEuMzYuMDczLjExLjE4OC0uMDIgMi44NTYtLjYwNiAxLjU0My0uMjggMS44NDEtLjMxNS44MzMuMzg4LjA5MS4zOTUtLjMyOC44MDctMS45NjkuNDg2LTIuMzA5LjQ2Mi0zLjQzOS44MTMtLjA0Mi4wMy4wNDkuMDYxIDEuNTQ5LjE0Ni42NjIuMDM2aDEuNjIybDMuMDIuMjI1Ljc5LjUyMi40NzQuNjM4LS4wNzkuNDg1LTEuMjE1LjYyLTEuNjQtLjM4OS0zLjgyOS0uOTEtMS4zMTItLjMyOWgtLjE4MnYuMTFsMS4wOTMgMS4wNjggMi4wMDYgMS44MSAyLjUwOSAyLjMzLjEyNy41NzgtLjMyMi40NTUtLjM0LS4wNDktMi4yMDUtMS42NTctLjg1MS0uNzQ3LTEuOTI2LTEuNjJoLS4xMjh2LjE3bC40NDQuNjQ5IDIuMzQ1IDMuNTIxLjEyMiAxLjA4LS4xNy4zNTMtLjYwOC4yMTMtLjY2OC0uMTIyLTEuMzc0LTEuOTI1LTEuNDE1LTIuMTY3LTEuMTQzLTEuOTQzLS4xNC4wOC0uNjc0IDcuMjU0LS4zMTYuMzctLjcyOS4yOC0uNjA3LS40NjEtLjMyMi0uNzQ3LjMyMi0xLjQ3Ni4zODktMS45MjQuMzE1LTEuNTMuMjg2LTEuOS4xNy0uNjMyLS4wMTItLjA0Mi0uMTQuMDE4LTEuNDM0IDEuOTY3LTIuMTggMi45NDUtMS43MjYgMS44NDUtLjQxNC4xNjQtLjcxNy0uMzcuMDY3LS42NjIuNDAxLS41ODkgMi4zODgtMy4wMzYgMS40NC0xLjg4Mi45My0xLjA4Ni0uMDA2LS4xNThoLS4wNTVMNC4xMzIgMTguNTZsLTEuMTMuMTQ2LS40ODctLjQ1Ni4wNjEtLjc0Ni4yMzEtLjI0MyAxLjkwOC0xLjMxMi0uMDA2LjAwNnoiIGZpbGw9IiNEOTc3NTciIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPjwvc3ZnPg==\",codex:\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjNGM0Y1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+T3BlbkFJPC90aXRsZT48cGF0aCBkPSJNOS4yMDUgOC42NTh2LTIuMjZjMC0uMTkuMDcyLS4zMzMuMjM4LS40MjhsNC41NDMtMi42MTZjLjYxOS0uMzU3IDEuMzU2LS41MjMgMi4xMTctLjUyMyAyLjg1NCAwIDQuNjYyIDIuMjEyIDQuNjYyIDQuNTY2IDAgLjE2NyAwIC4zNTctLjAyNC41NDdsLTQuNzEtMi43NTlhLjc5Ny43OTcgMCAwMC0uODU2IDBsLTUuOTcgMy40NzN6bTEwLjYwOSA4LjhWMTIuMDZjMC0uMzMzLS4xNDMtLjU3LS40MjktLjczN2wtNS45Ny0zLjQ3MyAxLjk1LTEuMTE4YS40MzMuNDMzIDAgMDEuNDc2IDBsNC41NDMgMi42MTdjMS4zMDkuNzYgMi4xODkgMi4zNzggMi4xODkgMy45NDggMCAxLjgwOC0xLjA3IDMuNDczLTIuNzYgNC4xNjN6TTcuODAyIDEyLjcwM2wtMS45NS0xLjE0MmMtLjE2Ny0uMDk1LS4yMzktLjIzOC0uMjM5LS40MjhWNS44OTljMC0yLjU0NSAxLjk1LTQuNDcyIDQuNTkxLTQuNDcyIDEgMCAxLjkyNy4zMzMgMi43MTIuOTI4TDguMjMgNS4wNjdjLS4yODUuMTY2LS40MjguNDA0LS40MjguNzM3djYuODk4ek0xMiAxNS4xMjhsLTIuNzk1LTEuNTd2LTMuMzNMMTIgOC42NThsMi43OTUgMS41N3YzLjMzTDEyIDE1LjEyOHptMS43OTYgNy4yM2MtMSAwLTEuOTI3LS4zMzItMi43MTItLjkyN2w0LjY4Ni0yLjcxMmMuMjg1LS4xNjYuNDI4LS40MDQuNDI4LS43Mzd2LTYuODk4bDEuOTc0IDEuMTQyYy4xNjcuMDk1LjIzOC4yMzguMjM4LjQyOHY1LjIzM2MwIDIuNTQ1LTEuOTc0IDQuNDcyLTQuNjE0IDQuNDcyem0tNS42MzctNS4zMDNsLTQuNTQ0LTIuNjE3Yy0xLjMwOC0uNzYxLTIuMTg4LTIuMzc4LTIuMTg4LTMuOTQ4QTQuNDgyIDQuNDgyIDAgMDE0LjIxIDYuMzI3djUuNDIzYzAgLjMzMy4xNDMuNTcxLjQyOC43MzhsNS45NDcgMy40NDktMS45NSAxLjExOGEuNDMyLjQzMiAwIDAxLS40NzYgMHptLS4yNjIgMy45Yy0yLjY4OCAwLTQuNjYyLTIuMDIxLTQuNjYyLTQuNTE5IDAtLjE5LjAyNC0uMzguMDQ3LS41N2w0LjY4NiAyLjcxYy4yODYuMTY3LjU3MS4xNjcuODU2IDBsNS45Ny0zLjQ0OHYyLjI2YzAgLjE5LS4wNy4zMzMtLjIzNy40MjhsLTQuNTQzIDIuNjE2Yy0uNjE5LjM1Ny0xLjM1Ni41MjMtMi4xMTcuNTIzem01Ljg5OSAyLjgzYTUuOTQ3IDUuOTQ3IDAgMDA1LjgyNy00Ljc1NkMyMi4yODcgMTguMzM5IDI0IDE1Ljg0IDI0IDEzLjI5NmMwLTEuNjY1LS43MTMtMy4yODItMS45OTgtNC40NDguMTE5LS41LjE5LS45OTkuMTktMS40OTggMC0zLjQwMS0yLjc1OS01Ljk0Ny01Ljk0Ni01Ljk0Ny0uNjQyIDAtMS4yNi4wOTUtMS44OC4zMUE1Ljk2MiA1Ljk2MiAwIDAwMTAuMjA1IDBhNS45NDcgNS45NDcgMCAwMC01LjgyNyA0Ljc1N0MxLjcxMyA1LjQ0NyAwIDcuOTQ1IDAgMTAuNDljMCAxLjY2Ni43MTMgMy4yODMgMS45OTggNC40NDgtLjExOS41LS4xOSAxLS4xOSAxLjQ5OSAwIDMuNDAxIDIuNzU5IDUuOTQ2IDUuOTQ2IDUuOTQ2LjY0MiAwIDEuMjYtLjA5NSAxLjg4LS4zMDlhNS45NiA1Ljk2IDAgMDA0LjE2MiAxLjcxM3oiPjwvcGF0aD48L3N2Zz4=\",cursor:\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjNGM0Y1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Q3Vyc29yPC90aXRsZT48cGF0aCBkPSJNMjIuMTA2IDUuNjhMMTIuNS4xMzVhLjk5OC45OTggMCAwMC0uOTk4IDBMMS44OTMgNS42OGEuODQuODQgMCAwMC0uNDE5LjcyNnYxMS4xODZjMCAuMy4xNi41NzcuNDIuNzI3bDkuNjA3IDUuNTQ3YS45OTkuOTk5IDAgMDAuOTk4IDBsOS42MDgtNS41NDdhLjg0Ljg0IDAgMDAuNDItLjcyN1Y2LjQwN2EuODQuODQgMCAwMC0uNDItLjcyNnptLS42MDMgMS4xNzZMMTIuMjI4IDIyLjkyYy0uMDYzLjEwOC0uMjI4LjA2NC0uMjI4LS4wNjFWMTIuMzRhLjU5LjU5IDAgMDAtLjI5NS0uNTFsLTkuMTEtNS4yNmMtLjEwNy0uMDYyLS4wNjMtLjIyOC4wNjItLjIyOGgxOC41NWMuMjY0IDAgLjQyOC4yODYuMjk2LjUxNHoiPjwvcGF0aD48L3N2Zz4=\",grok:\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjNGM0Y1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+R3JvazwvdGl0bGU+PHBhdGggZD0iTTkuMjcgMTUuMjlsNy45NzgtNS44OTdjLjM5MS0uMjkuOTUtLjE3NyAxLjEzNy4yNzIuOTggMi4zNjkuNTQyIDUuMjE1LTEuNDEgNy4xNjktMS45NTEgMS45NTQtNC42NjcgMi4zODItNy4xNDkgMS40MDZsLTIuNzExIDEuMjU3YzMuODg5IDIuNjYxIDguNjExIDIuMDAzIDExLjU2Mi0uOTUzIDIuMzQxLTIuMzQ0IDMuMDY2LTUuNTM5IDIuMzg4LTguNDJsLjAwNi4wMDdjLS45ODMtNC4yMzIuMjQyLTUuOTI0IDIuNzUtOS4zODMuMDYtLjA4Mi4xMi0uMTY0LjE3OS0uMjQ4bC0zLjMwMSAzLjMwNXYtLjAxTDkuMjY3IDE1LjI5Mk03LjYyMyAxNi43MjNjLTIuNzkyLTIuNjctMi4zMS02LjgwMS4wNzEtOS4xODQgMS43NjEtMS43NjMgNC42NDctMi40ODMgNy4xNjYtMS40MjVsMi43MDUtMS4yNWE3LjgwOCA3LjgwOCAwIDAwLTEuODI5LTFBOC45NzUgOC45NzUgMCAwMDUuOTg0IDUuODNjLTIuNTMzIDIuNTM2LTMuMzMgNi40MzYtMS45NjIgOS43NjQgMS4wMjIgMi40ODctLjY1MyA0LjI0Ni0yLjM0IDYuMDIyLS41OTkuNjMtMS4xOTkgMS4yNTktMS42ODIgMS45MjVsNy42Mi02LjgxNSI+PC9wYXRoPjwvc3ZnPg==\",antigravity:\"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHRpdGxlPkFudGlncmF2aXR5PC90aXRsZT48bWFzayBoZWlnaHQ9IjIzIiBpZD0ibG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0wLV9SXzBfIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB3aWR0aD0iMjQiIHg9IjAiIHk9IjEiPjxwYXRoIGQ9Ik0yMS43NTEgMjIuNjA3YzEuMzQgMS4wMDUgMy4zNS4zMzUgMS41MDgtMS41MDhDMTcuNzMgMTUuNzQgMTguOTA0IDEgMTIuMDM3IDEgNS4xNyAxIDYuMzQyIDE1Ljc0LjgxNSAyMS4xYy0yLjAxIDIuMDA5LjE2NyAyLjUxMSAxLjUwNyAxLjUwNiA1LjE5Mi0zLjUxNyA0Ljg1Ny05LjcxNCA5LjcxNS05LjcxNCA0Ljg1NyAwIDQuNTIyIDYuMTk3IDkuNzE0IDkuNzE1eiIgZmlsbD0iI2ZmZiI+PC9wYXRoPjwvbWFzaz48ZyBtYXNrPSJ1cmwoI2xvYmUtaWNvbnMtYW50aWdyYXZpdHktMC1fUl8wXykiPjxnIGZpbHRlcj0idXJsKCNsb2JlLWljb25zLWFudGlncmF2aXR5LTEtX1JfMF8pIj48cGF0aCBkPSJNLTEuMDE4LTMuOTkyYy0uNDA4IDMuNTkxIDIuNjg2IDYuODkgNi45MSA3LjM3IDQuMjI1LjQ4IDcuOTgtMi4wNDMgOC4zODctNS42MzMuNDA4LTMuNTktMi42ODYtNi44OS02LjkxLTcuMzctNC4yMjUtLjQ3OS03Ljk4IDIuMDQzLTguMzg3IDUuNjMzeiIgZmlsbD0iI0ZGRTQzMiI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjbG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0yLV9SXzBfKSI+PHBhdGggZD0iTTE1LjI2OSA3Ljc0N2MxLjA1OCA0LjU1NyA1LjY5MSA3LjM3NCAxMC4zNDggNi4yOTMgNC42NTctMS4wODIgNy41NzUtNS42NTMgNi41MTYtMTAuMjEtMS4wNTgtNC41NTYtNS42OTEtNy4zNzQtMTAuMzQ4LTYuMjkyLTQuNjU3IDEuMDgyLTcuNTc1IDUuNjUzLTYuNTE2IDEwLjIxeiIgZmlsbD0iI0ZDNDEzRCI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjbG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0zLV9SXzBfKSI+PHBhdGggZD0iTS0xMi40NDMgMTAuODA0YzEuMzM4IDQuNzAzIDcuMzYgNy4xMSAxMy40NTMgNS4zNzggNi4wOTItMS43MzMgOS45NDctNi45NSA4LjYxLTExLjY1MkM4LjI4Mi0uMTczIDIuMjYtMi41OC0zLjgzMy0uODQ4LTkuOTI1Ljg4NC0xMy43OCA2LjEtMTIuNDQzIDEwLjgwNHoiIGZpbGw9IiMwMEI5NUMiPjwvcGF0aD48L2c+PGcgZmlsdGVyPSJ1cmwoI2xvYmUtaWNvbnMtYW50aWdyYXZpdHktNC1fUl8wXykiPjxwYXRoIGQ9Ik0tMTIuNDQzIDEwLjgwNGMxLjMzOCA0LjcwMyA3LjM2IDcuMTEgMTMuNDUzIDUuMzc4IDYuMDkyLTEuNzMzIDkuOTQ3LTYuOTUgOC42MS0xMS42NTJDOC4yODItLjE3MyAyLjI2LTIuNTgtMy44MzMtLjg0OC05LjkyNS44ODQtMTMuNzggNi4xLTEyLjQ0MyAxMC44MDR6IiBmaWxsPSIjMDBCOTVDIj48L3BhdGg+PC9nPjxnIGZpbHRlcj0idXJsKCNsb2JlLWljb25zLWFudGlncmF2aXR5LTUtX1JfMF8pIj48cGF0aCBkPSJNLTcuNjA4IDE0LjcwM2MzLjM1MiAzLjQyNCA5LjEyNiAzLjIwOCAxMi44OTYtLjQ4MyAzLjc3LTMuNjkgNC4xMDgtOS40NTkuNzU2LTEyLjg4M0MyLjY5LTIuMDg3LTMuMDgzLTEuODcxLTYuODUzIDEuODJjLTMuNzcgMy42OS00LjEwOCA5LjQ1OC0uNzU1IDEyLjg4M3oiIGZpbGw9IiMwMEI5NUMiPjwvcGF0aD48L2c+PGcgZmlsdGVyPSJ1cmwoI2xvYmUtaWNvbnMtYW50aWdyYXZpdHktNi1fUl8wXykiPjxwYXRoIGQ9Ik05LjkzMiAyNy42MTdjMS4wNCA0LjQ4MiA1LjM4NCA3LjMwMyA5LjcgNi4zIDQuMzE2LTEuMDAyIDYuOTcxLTUuNDQ4IDUuOTMtOS45My0xLjA0LTQuNDgzLTUuMzg0LTcuMzA0LTkuNy02LjMwMS00LjMxNiAxLjAwMi02Ljk3MSA1LjQ0OC01LjkzIDkuOTN6IiBmaWxsPSIjMzE4NkZGIj48L3BhdGg+PC9nPjxnIGZpbHRlcj0idXJsKCNsb2JlLWljb25zLWFudGlncmF2aXR5LTctX1JfMF8pIj48cGF0aCBkPSJNMi41NzItOC4xODVDLjM5Mi0zLjMyOSAyLjc3OCAyLjQ3MiA3LjkgNC43NzFjNS4xMjIgMi4zIDExLjA0Mi4yMjcgMTMuMjIyLTQuNjMgMi4xOC00Ljg1NS0uMjA1LTEwLjY1Ni01LjMyNy0xMi45NTUtNS4xMjItMi4zLTExLjA0Mi0uMjI3LTEzLjIyMiA0LjYzeiIgZmlsbD0iI0ZCQkMwNCI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjbG9iZS1pY29ucy1hbnRpZ3Jhdml0eS04LV9SXzBfKSI+PHBhdGggZD0iTS0zLjI2NyAzOC42ODZjLTUuMjc3LTIuMDcyIDMuNzQyLTE5LjExNyA1Ljk4NC0yNC44MyAyLjI0My01LjcxMiA4LjM0LTguNjY0IDEzLjYxNi02LjU5MiA1LjI3OCAyLjA3MSAxMS41MzMgMTMuNDgyIDkuMjkgMTkuMTk1LTIuMjQyIDUuNzEzLTIzLjYxMyAxNC4yOTgtMjguODkgMTIuMjI3eiIgZmlsbD0iIzMxODZGRiI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjbG9iZS1pY29ucy1hbnRpZ3Jhdml0eS05LV9SXzBfKSI+PHBhdGggZD0iTTI4LjcxIDE3LjQ3MWMtMS40MTMgMS42NDktNS4xLjgwOC04LjIzNi0xLjg3OC0zLjEzNS0yLjY4Ny00LjUzMS02LjIwMS0zLjExOC03Ljg1IDEuNDEyLTEuNjQ5IDUuMS0uODA4IDguMjM1IDEuODc4czQuNTMyIDYuMiAzLjExOSA3Ljg1eiIgZmlsbD0iIzc0OUJGRiI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjbG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0xMC1fUl8wXykiPjxwYXRoIGQ9Ik0xOC4xNjMgOS4wNzdjNS44MSAzLjkzIDEyLjUwMiA0LjE5IDE0Ljk0Ni41NzcgMi40NDMtMy42MTItLjI4Ny05LjcyNy02LjA5OC0xMy42NTgtNS44MS0zLjkzMS0xMi41MDItNC4xOS0xNC45NDYtLjU3Ny0yLjQ0MyAzLjYxMi4yODcgOS43MjcgNi4wOTggMTMuNjU4eiIgZmlsbD0iI0ZDNDEzRCI+PC9wYXRoPjwvZz48ZyBmaWx0ZXI9InVybCgjbG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0xMS1fUl8wXykiPjxwYXRoIGQ9Ik0tLjkxNSAyLjY4NGMtMS40NCAzLjQ3My0uOTcgNi45NjcgMS4wNSA3LjgwNCAyLjAyLjgzNyA0LjgyNC0xLjMgNi4yNjQtNC43NzIgMS40NC0zLjQ3My45Ny02Ljk2Ny0xLjA1LTcuODA0LTIuMDItLjgzNy00LjgyNCAxLjMtNi4yNjQgNC43NzJ6IiBmaWxsPSIjRkZFRTQ4Ij48L3BhdGg+PC9nPjwvZz48ZGVmcz48ZmlsdGVyIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBoZWlnaHQ9IjE3LjU4NyIgaWQ9ImxvYmUtaWNvbnMtYW50aWdyYXZpdHktMS1fUl8wXyIgd2lkdGg9IjE5LjgzOCIgeD0iLTMuMjg4IiB5PSItMTEuOTE3Ij48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfOTc3XzExNSIgc3RkRGV2aWF0aW9uPSIxLjExNyI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48ZmlsdGVyIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBoZWlnaHQ9IjM4LjU2NSIgaWQ9ImxvYmUtaWNvbnMtYW50aWdyYXZpdHktMi1fUl8wXyIgd2lkdGg9IjM4LjkiIHg9IjQuMjUxIiB5PSItMTMuNDkzIj48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfOTc3XzExNSIgc3RkRGV2aWF0aW9uPSI1LjQiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PGZpbHRlciBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaGVpZ2h0PSIzNi41MTciIGlkPSJsb2JlLWljb25zLWFudGlncmF2aXR5LTMtX1JfMF8iIHdpZHRoPSI0MC45NTUiIHg9Ii0yMS44ODkiIHk9Ii0xMC41OTIiPjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ij48L2ZlRmxvb2Q+PGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl85NzdfMTE1IiBzdGREZXZpYXRpb249IjQuNTkxIj48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGhlaWdodD0iMzYuNTE3IiBpZD0ibG9iZS1pY29ucy1hbnRpZ3Jhdml0eS00LV9SXzBfIiB3aWR0aD0iNDAuOTU1IiB4PSItMjEuODg5IiB5PSItMTAuNTkyIj48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfOTc3XzExNSIgc3RkRGV2aWF0aW9uPSI0LjU5MSI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48ZmlsdGVyIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBoZWlnaHQ9IjM2LjU5NSIgaWQ9ImxvYmUtaWNvbnMtYW50aWdyYXZpdHktNS1fUl8wXyIgd2lkdGg9IjM2LjYzMiIgeD0iLTE5LjA5OSIgeT0iLTEwLjI3OCI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiPjwvZmVGbG9vZD48ZmVCbGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0ic2hhcGUiPjwvZmVCbGVuZD48ZmVHYXVzc2lhbkJsdXIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzk3N18xMTUiIHN0ZERldmlhdGlvbj0iNC41OTEiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PGZpbHRlciBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaGVpZ2h0PSIzNC4wODciIGlkPSJsb2JlLWljb25zLWFudGlncmF2aXR5LTYtX1JfMF8iIHdpZHRoPSIzMy41MzMiIHg9Ii45ODEiIHk9IjguNzU4Ij48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfOTc3XzExNSIgc3RkRGV2aWF0aW9uPSI0LjM2MyI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48ZmlsdGVyIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBoZWlnaHQ9IjM1LjI3NiIgaWQ9ImxvYmUtaWNvbnMtYW50aWdyYXZpdHktNy1fUl8wXyIgd2lkdGg9IjM1Ljk3OCIgeD0iLTYuMTQzIiB5PSItMjEuNjU5Ij48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfOTc3XzExNSIgc3RkRGV2aWF0aW9uPSIzLjk1NCI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48ZmlsdGVyIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBoZWlnaHQ9IjQ2LjUyMyIgaWQ9ImxvYmUtaWNvbnMtYW50aWdyYXZpdHktOC1fUl8wXyIgd2lkdGg9IjQ1LjExNCIgeD0iLTExLjk2IiB5PSItLjQ2Ij48ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCI+PC9mZUZsb29kPjxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSI+PC9mZUJsZW5kPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfOTc3XzExNSIgc3RkRGV2aWF0aW9uPSIzLjUzMSI+PC9mZUdhdXNzaWFuQmx1cj48L2ZpbHRlcj48ZmlsdGVyIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBoZWlnaHQ9IjI0LjA1NCIgaWQ9ImxvYmUtaWNvbnMtYW50aWdyYXZpdHktOS1fUl8wXyIgd2lkdGg9IjI1LjA5NCIgeD0iMTAuNDg1IiB5PSIuNTgiPjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ij48L2ZlRmxvb2Q+PGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl85NzdfMTE1IiBzdGREZXZpYXRpb249IjMuMTU5Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGhlaWdodD0iMzAuMDA3IiBpZD0ibG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0xMC1fUl8wXyIgd2lkdGg9IjMzLjUwOCIgeD0iNS44MzMiIHk9Ii0xMi40NjciPjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ij48L2ZlRmxvb2Q+PGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl85NzdfMTE1IiBzdGREZXZpYXRpb249IjIuNjY5Ij48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjxmaWx0ZXIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGhlaWdodD0iMjYuMTUxIiBpZD0ibG9iZS1pY29ucy1hbnRpZ3Jhdml0eS0xMS1fUl8wXyIgd2lkdGg9IjIyLjE5NCIgeD0iLTguMzU1IiB5PSItOC44NzYiPjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ij48L2ZlRmxvb2Q+PGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIj48L2ZlQmxlbmQ+PGZlR2F1c3NpYW5CbHVyIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl85NzdfMTE1IiBzdGREZXZpYXRpb249IjMuMzAzIj48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjwvZGVmcz48L3N2Zz4=\"},Oe=[[\"work\",\"Terminals\"],[\"home\",\"Home\"],[\"plan\",\"Plan\"],[\"checks\",\"Checks\"],[\"preview\",\"Preview\"],[\"keep\",\"Keep or Undo\"],[\"brain\",\"Brain\"],[\"explain\",\"Explain this\"]],_o=[\"work\",\"home\",\"plan\",\"checks\",\"keep\",\"keep\"],za=\"Build Rally: a map of pickup games near you, join a game with one tap, and a chat for each team\",de=[{id:\"rio\",name:\"Rio\",agent:\"Claude Code\",a:\"claude\",task:\"Deploy to the preview site\",st0:\"needs\",t0:12,stream:!1,lines:[[\"u\",\"Deploy Rally to the preview site\"],[\"a\",\"I will put Rally on the preview site.\"],[\"\",\" \"],[\"d bx top\",\"Bash command\"],[\"bx\",\" npm run deploy -- --preview\",\"deploy\"],[\"d bx\",\" Deploys rally to the preview site\"],[\"bx\",\" \"],[\"bx\",\"Do you want to proceed?\"],[\"opt bx\",\"\\u276F 1. Yes\",\"\",\"1\"],[\"opt bx\",\" 2. Yes, and don't ask again for npm run deploy\",\"\",\"2\"],[\"opt bx\",\" 3. No, tell Claude what to do\",\"\",\"3\"],[\"d bx bot\",\"Esc to cancel\"]]},{id:\"nico\",name:\"Nico\",agent:\"Cursor\",a:\"cursor\",task:\"Style the game cards\",st0:\"work\",t0:19,stream:!0,lines:[[\"u\",\"Style the game cards and the Join button\"],[\"t\",\"Read components/GameCard.tsx\"],[\"a\",\"Using the Rally green on every Join button\"],[\"t\",\"Run npm run build\"],[\"r d\",\"> rally@0.4.0 build\"],[\"r d\",\"> next build\",\"vite\"],[\"r bad\",\"Error: Cannot find module './join-button'\",\"err\"],[\"r d\",\" at components/GameCard.tsx:3\",\"where\"],[\"a\",\"I'll create components/join-button.tsx and run it again.\"],[\"a ok\",\"Built in 3.4 s.\"],[\"a\",\"Done. Every game card has a green Join button now.\"]]},{id:\"opal\",name:\"Opal\",agent:\"Codex\",a:\"codex\",task:\"Review the join code\",st0:\"work\",t0:20,stream:!0,lines:[[\"u\",\"Review the join code\"],[\"t\",\"Explored\"],[\"r\",\"Read lib/join.ts\"],[\"a\",\"Checking what happens when two players tap Join at once\"],[\"a\",\"Two taps at once could take the last spot twice\"],[\"a ok\",\"Claim it in one database step, then it's good.\"]]},{id:\"suki\",name:\"Suki\",agent:\"Grok\",a:\"grok\",task:\"Rally on a small phone\",st0:\"work\",t0:18,stream:!0,lines:[[\"u\",\"Check Rally on a small phone screen\"],[\"t\",\"Open localhost:3000/map at 360 px\"],[\"r\",\"Screenshot 360 \\xD7 780\"],[\"a\",\"The Join button wraps under the card\"],[\"t\",\"Edit components/GameCard.tsx\"],[\"a ok\",\"The Join button sits under the card. Nothing is cut off at 360 px.\"]]}],le=Object.fromEntries(de.map(t=>[t.id,t])),Fn={err:\"The game card tried to load a file called join-button that does not exist yet. Cursor is creating it now, then it will build again.\",vite:\"This is the project's build step. Next.js turns the source files into the app a phone or a browser opens.\",where:\"Where it happened: line 3 of the game card file, the line that asks for join-button.\",deploy:\"This runs the project's deploy step with --preview, so Rally goes to the preview address, not the live one. Pando asks you first because it puts something online.\"},qo=[{g:\"Sign-in with Google or an email link\",f:\"app/sign-in.tsx\",add:156,del:0,d:[[\"a\",\"+export default function SignIn() {\"],[\"a\",\"+ return (\"],[\"a\",'+ '],[\"a\",\"+ router.replace('/map')} />\"],[\"a\",'+ '],[\"a\",\"+ \"],[\"a\",\"+ );\"],[\"a\",\"+}\"]]},{g:\"The map of games near you\",f:\"app/map.tsx\",add:214,del:0,d:[[\"a\",\"+export default function MapScreen() {\"],[\"a\",\"+ const here = useLocation();\"],[\"a\",\"+ const games = useGamesNear(here, { km: 10 });\"],[\"a\",\"+ return (\"],[\"a\",\"+ <>\"],[\"a\",\"+ \"],[\"a\",\"+ \"],[\"a\",\"+ \"],[\"a\",\"+ );\"],[\"a\",\"+}\"]]},{g:\"The map of games near you\",f:\"lib/games.ts\",add:188,del:0,d:[[\"a\",\"+export async function gamesNear({ lat, lng }, km = 10) {\"],[\"a\",\"+ return db.query(\"],[\"a\",\"+ `select * from games where starts_at > now()\"],[\"a\",\"+ and distance_km(lat, lng, $1, $2) <= $3\"],[\"a\",\"+ order by starts_at`, [lat, lng, km]);\"],[\"a\",\"+}\"]]},{g:\"Join a game with one tap\",f:\"lib/join.ts\",add:97,del:0,d:[[\"a\",\"+export async function joinGame(gameId, playerId) {\"],[\"a\",\"+ // claim the last spot in one step, so two taps at once can't both get it\"],[\"a\",\"+ const row = await db.one(\"],[\"a\",\"+ `update games set players = players + 1\"],[\"a\",\"+ where id = $1 and players < max_players\"],[\"a\",\"+ returning players, max_players`, [gameId]);\"],[\"a\",\"+ if (!row) return { full: true };\"],[\"a\",\"+ await db.query('insert into game_players values ($1, $2)', [gameId, playerId]);\"],[\"a\",\"+ return { players: row.players, full: row.players === row.max_players };\"],[\"a\",\"+}\"]]},{g:\"Join a game with one tap\",f:\"test/join.test.ts\",add:88,del:0,d:[[\"a\",\"+test('two players tap Join for the last spot: only one gets it', async () => {\"],[\"a\",\"+ const game = await makeGame({ maxPlayers: 10, players: 9 });\"],[\"a\",\"+ const [a, b] = await Promise.all([joinGame(game.id, 'p1'), joinGame(game.id, 'p2')]);\"],[\"a\",\"+ assert.equal([a, b].filter(r => !r.full).length, 1);\"],[\"a\",\"+ assert.equal((await getGame(game.id)).players, 10);\"],[\"a\",\"+});\"]]},{g:\"A chat for each team\",f:\"app/game/chat.tsx\",add:241,del:0,d:[[\"a\",\"+export function TeamChat({ gameId }) {\"],[\"a\",\"+ const messages = useLiveMessages(gameId);\"],[\"a\",\"+ return (\"],[\"a\",\"+ sendMessage(gameId, text)}\"],[\"a\",'+ placeholder=\"Say hi to your team\" />'],[\"a\",\"+ );\"],[\"a\",\"+}\"]]},{g:\"A chat for each team\",f:\"db/schema.sql\",add:62,del:0,d:[[\"a\",\"+create table games (\"],[\"a\",\"+ id uuid primary key,\"],[\"a\",\"+ sport text not null,\"],[\"a\",\"+ lat double precision, lng double precision,\"],[\"a\",\"+ starts_at timestamptz not null,\"],[\"a\",\"+ players int not null default 0,\"],[\"a\",\"+ max_players int not null\"],[\"a\",\"+);\"]]}],Ko=34,me=[[\"Profile\",\"#ffe3a3\"],[\"Decisions\",\"#ffb870\"],[\"Knowledge\",\"#8fe3ff\"],[\"Projects\",\"#5aa8ff\"],[\"Journal\",\"#b9c6d8\"]],wn=[[\"Marcus checks every change on a phone first\",\"Marcus likes short, plain answers\"],[\"The last spot is claimed in one step\",\"Games show within 10 km\",\"Team chats keep 30 days of messages\",\"Deploys wait for a yes\",\"Sign-in is Google or an email link\",\"A full game shows Full, never a Join button\",\"Games start on the hour or half hour\",\"Players can leave a game up to an hour before\",\"The map opens on where you are\",\"Tests run before every deploy\",\"Sports start with football, basketball and volleyball\",\"Distances are in km\",\"A game needs a place and a time\",\"No ads in the app\",\"Chat messages can be reported\",\"Every game has a host\",\"Names show as first name and initial\",\"The weekly games email goes out on Fridays\",\"Cancelled games stay in My games\",\"Notifications only for your own games\",\"Times show in the player's own time zone\",\"No deletes without a yes\",\"Location is only used while the app is open\"],[\"Maps use MapLibre with free tiles\",\"Buttons use the Rally green\",\"How a game is created\",\"How the join step works\",\"Where the sports list lives\",\"How distance is worked out\",\"How team chats stay live\",\"What the preview address is\",\"How sign-in links are sent\",\"Phone layout rules\",\"How the game cards are built\",\"Which screens need a sign-in\",\"How push notifications are sent\",\"Where test data lives\",\"How the build is run\",\"How times are stored\",\"Where the app icons are\",\"How a reported message is handled\",\"How the host is chosen\",\"What happens when a game fills up\",\"How a cancelled game is shown\",\"The fonts in the app\",\"How the weekly email is built\",\"Where settings are saved\",\"How player names are shown\",\"How the game list is sorted\",\"How backups are named\",\"Which phones the app is checked on\",\"How map pins are grouped\",\"What the database looks like\",\"How a player leaves a game\",\"How errors are logged\",\"How chats are kept to 30 days\"],[\"The app opens on /map after sign-in\",\"Rally is built with Next.js\",\"The preview site is for checks\",\"Rally on phones\",\"The game finder\",\"Team chat\",\"The weekly games email\",\"Host tools\"],Array.from({length:19},(t,e)=>`Journal \\xB7 Oct ${e+1}`)],ts={\"The last spot is claimed in one step\":\"Two players can tap Join for the last spot at the same moment, so joining takes the spot in one database step. Learned when a test put 11 players in a 10-player game.\",\"Games show within 10 km\":\"The map and the list show games within 10 km of where you are. Further than that is too far for a pickup game.\",\"Maps use MapLibre with free tiles\":\"The map is drawn with MapLibre and free map tiles, so there is no map bill while Rally is small.\",\"Team chats keep 30 days of messages\":\"Each game gets its own team chat. Messages are kept for 30 days, then they are removed.\",\"The app opens on /map after sign-in\":\"After sign-in, players land on /map, the map of games near them.\",\"Deploys wait for a yes\":\"Nothing goes to the preview or the live site until you say yes.\",\"Buttons use the Rally green\":\"Every main button, like Join, uses the same Rally green, so players always know where to tap.\",\"Marcus checks every change on a phone first\":\"Marcus looks at every change on his phone before it ships, so phone layouts come first.\"},es=[\"Claude Code\",\"Codex\",\"Cursor\",\"Grok\",\"You\"],un={\"Claude Code\":\"claude\",Codex:\"codex\",Cursor:\"cursor\",Grok:\"grok\"},Yt=[];(()=>{let t=0;wn.forEach((e,n)=>e.forEach(o=>{let i={\"The last spot is claimed in one step\":\"Claude Code\",\"Maps use MapLibre with free tiles\":\"Codex\",\"Team chats keep 30 days of messages\":\"Codex\",\"Buttons use the Rally green\":\"Cursor\",\"The app opens on /map after sign-in\":\"Grok\"}[o]||(n===0||o.startsWith(\"Deploys\")||o.startsWith(\"Games show\")?\"You\":es[t%4]),b=[\"Claude Code\",\"Codex\",\"Cursor\",\"Grok\"].filter(A=>A!==i).slice(0,2+t%2);Yt.push({i:t,t:o,s:n,by:i,read:b,ago:2+t*7%58,body:ts[o]||(n===4?\"What happened on rally that day: the jobs, what was kept and what is next.\":`Saved by ${i} while working on rally. Every agent reads it before it starts, so nobody explains it twice.`)}),t++})),Yt.forEach((e,n)=>{e.ang=n/Yt.length*Math.PI*2-Math.PI/2})})();Je=[\"The last spot is claimed in one step\",\"Maps use MapLibre with free tiles\",\"Team chats keep 30 days of messages\",\"The app opens on /map after sign-in\",\"Deploys wait for a yes\",\"Buttons use the Rally green\",\"Marcus checks every change on a phone first\"].map(t=>Yt.find(e=>e.t===t)),Te=[];(()=>{let t=5,e=()=>(t=t*16807%2147483647)/2147483647;Je.forEach(n=>{let o=7+Math.floor(e()*5);for(let i=0;iTe.filter(n=>n[0]===e||n[1]===e).length),ea=Te.map(()=>0),Xn=Math.min(60,Te.length),ns=Array.from({length:Xn},(t,e)=>({l:Math.floor(e*Te.length/Xn),u:e*.618%1,rush:0})),a={open:!1,chapter:\"work\",view:\"terms\",side:!0,focus:null,max:null,pp:null,maxTried:!1,approval:\"waiting\",job:null,preview:!1,changedOpen:!1,ask:null,pal:!1,brain:{sel:null,off:new Set,view:\"halo\",q:\"\"},settings:{undo:!0,watch:!1},seen:new Set,lastCh:\"work\"},gn=[\"t1\",\"t2\",\"t3\",\"t4\"],ke=(t=\"none\",e=za,n=!1)=>{let o=t===\"done\"?\"pass\":t===\"none\"||t===\"plan\"||t===\"writing\"?\"plan\":\"work\";return{stage:t,title:e,sample:n,secs:0,kept:null,joined:!1,pv:\"err\",files:{},t1:o,t2:o,t3:o,t4:o,failed:t===\"done\",op:t===\"done\"?\"done\":\"wait\",eng:t===\"done\"?os.slice():[]}},os=[[\"h\",\"Mira \\xB7 Claude Code \\xB7 copies 1 and 3\"],[\"\",\"Building sign-in, then Join with one tap\"],[\"h\",\"Juno \\xB7 Codex \\xB7 copies 2 and 4\"],[\"\",\"Building the map of games and the team chat\"],[\"\",\"Done. Handing every task to Pando\\u2019s checks.\"],[\"bad\",\"Pando: npm test failed: two players took the last spot. A 10-player game has 11.\"],[\"\",\"Mira: claiming the last spot in one database step\"],[\"ok\",\"Done. Pando ran the tests again: 84 passed.\"]];ss();a.job=ke();qn='';ps={plan:[\"\",\"\"],work:[\"Working\",\"wk\"],check:[\"Checking\",\"wk\"],fail:[\"Failed\",\"bad\"],pass:[\"Passed\",\"ok\"]},us=['
A new player can sign up
They land on the map
The tests passed
','
Games within 10 km show as pins
The same games show in a list
The tests passed
','
Joining takes a spot
A full game shows Full
npm test: 84 passed
','
A message shows up for everyone in the game right away
The tests passed
'];Ze=(()=>{let t,e,n=0,o=!1,i=0,b=0,A=1,G=0,et=0,K=1,E=-1,l=0,R=null,v=0,lt=[],dt=()=>{let F=11,U=()=>(F=F*16807%2147483647)/2147483647;lt=Array.from({length:90},()=>[U(),U(),U()*.9+.3])},Tt=()=>{let F=Math.min(i*.4,b*1)*K,U=F*.36;return{cx:i/2,cy:b*.53,rx:F,ry:U}},It=(F,U)=>{let J=F.ang+G;return{x:U.cx+Math.cos(J)*U.rx,y:U.cy+Math.sin(J)*U.ry,z:(Math.sin(J)+1)/2}},tt=F=>!a.brain.off.has(F.s)&&(!a.brain.q||F.t.toLowerCase().includes(a.brain.q.toLowerCase()));function At(){if(!t)return;let F=t.getBoundingClientRect();A=Math.min(devicePixelRatio||1,2),!(F.width<2)&&(i=F.width,b=F.height,t.width=Math.round(i*A),t.height=Math.round(b*A))}function at(F){if(!e||i<2)return;let U=Math.min(.05,(F-(l||F))/1e3);l=F,!R&&!Jt.matches&&(G+=(.06+et)*U,et*=Math.pow(.04,U)),e.setTransform(A,0,0,A,0,0),e.clearRect(0,0,i,b);for(let[Z,ot,W]of lt)e.fillStyle=`rgba(200,210,230,${.16*W})`,e.fillRect(Z*i,ot*b,1.2,1.2);let J=Tt(),yt=Yt.map(Z=>It(Z,J)),ht=a.brain.sel;me.forEach(([,Z],ot)=>{let W=Yt.findIndex(Nt=>Nt.s===ot),ut=Yt.filter(Nt=>Nt.s===ot).length;if(W<0)return;let mt=Yt[W].ang+G,zt=ut/Yt.length*Math.PI*2;e.globalAlpha=.5*(ht!==null?.7:1),e.strokeStyle=Z,e.beginPath(),e.ellipse(J.cx,J.cy,J.rx*1.076,J.ry*1.076,0,mt,mt+zt),e.stroke()}),e.globalAlpha=1,Te.forEach((Z,ot)=>{let W=yt[Z[0]],ut=yt[Z[1]],mt=Math.hypot((W.x-ut.x)/J.rx,(W.y-ut.y)/J.ry),zt=(ot%2?1:-1)*(.088+.1*mt)*J.rx*.9,Nt=J.cx+((W.x+ut.x)/2-J.cx)*.64,Xt=J.cy+((W.y+ut.y)/2-J.cy)*.64-zt;Z.q=[Nt,Xt];let Et=ht!==null&&(Z[0]===ht||Z[1]===ht),se=Math.min(.85,(ht===null?.2:Et?.64:.05)+ea[ot]*.5);e.strokeStyle=ea[ot]>.02?`rgba(233,250,255,${se})`:`rgba(143,227,255,${se})`,e.beginPath(),e.moveTo(W.x,W.y),e.quadraticCurveTo(Nt,Xt,ut.x,ut.y),e.stroke()});for(let Z of ns){let ot=Te[Z.l],W=yt[ot[0]],ut=yt[ot[1]];Z.rush=Math.max(ea[Z.l],Z.rush-U*.25),Jt.matches||(Z.u=(Z.u+(.07+Z.rush*.83)*U)%1);let mt=1-Z.u,zt=mt*mt*W.x+2*mt*Z.u*ot.q[0]+Z.u*Z.u*ut.x,Nt=mt*mt*W.y+2*mt*Z.u*ot.q[1]+Z.u*Z.u*ut.y;e.globalAlpha=Math.sin(Math.PI*Z.u)*(.75+Z.rush*.25)*(ht!==null?.35:1),e.fillStyle=\"#e9faff\",e.shadowColor=\"#bff0ff\",e.shadowBlur=8,e.beginPath(),e.arc(zt,Nt,1.7+Z.rush*1.2,0,Math.PI*2),e.fill(),e.shadowBlur=0}e.globalAlpha=1,ea.forEach((Z,ot)=>{ea[ot]=Math.max(0,Z-U*.6)});let nt=yt.map((Z,ot)=>ot).sort((Z,ot)=>yt[Z].z-yt[ot].z);for(let Z of nt){let ot=Yt[Z],W=yt[Z],ut=tt(ot),mt=Z===a.brain.sel||Z===E,zt=(1.5+Math.min(12,as[Z])*.22+W.z*1.8)*(mt?1.7:1)*Math.sqrt(K);e.globalAlpha=ut?.35+W.z*.65:.12,e.fillStyle=me[ot.s][1],(mt||ut&&W.z>.6)&&(e.shadowColor=me[ot.s][1],e.shadowBlur=mt?18:8),e.beginPath(),e.arc(W.x,W.y,zt,0,Math.PI*2),e.fill(),e.shadowBlur=0,mt&&(e.globalAlpha=1,e.strokeStyle=\"#fff\",e.lineWidth=1.2,e.beginPath(),e.arc(W.x,W.y,zt+4,0,Math.PI*2),e.stroke(),e.lineWidth=1)}e.globalAlpha=1,a.brain.view!==\"halo\"?y(\"#xpTip\",g).hidden=!0:a.brain.sel!==null?pt(yt[a.brain.sel],Yt[a.brain.sel]):E>=0?pt(yt[E],Yt[E]):y(\"#xpTip\",g).hidden=!0}function pt(F,U){let J=y(\"#xpTip\",g);J.hidden=!1,J.style.setProperty(\"--c\",me[U.s][1]),J.innerHTML=`${me[U.s][0]} \\xB7 ${gt(U.by)}${gt(U.t)}`,J.style.left=F.x+\"px\",J.style.top=F.y+\"px\"}function Vt(F,U){let J=Tt(),yt=-1,ht=14;return Yt.forEach((nt,Z)=>{if(!tt(nt))return;let ot=It(nt,J),W=Math.hypot(ot.x-F,ot.y-U);W{(ht[0]===F.i||ht[1]===F.i)&&(ea[nt]=1)});let yt=y(\"#xpReadTick\",g);yt.innerHTML=`${gt(U)} read \"${gt(F.t)}\" \\xB7 just now`}function Ut(){t=y(\"#xpHalo\",g),e=t.getContext(\"2d\"),dt(),new ResizeObserver(()=>{At(),(!o||Jt.matches)&&at(performance.now())}).observe(t),t.addEventListener(\"pointerdown\",U=>{R={x:U.clientX,r:G,moved:!1},t.setPointerCapture(U.pointerId),t.classList.add(\"drag\")}),t.addEventListener(\"pointermove\",U=>{let J=t.getBoundingClientRect(),yt=U.clientX-J.left,ht=U.clientY-J.top;if(R){let Z=U.clientX-R.x;Math.abs(Z)>3&&(R.moved=!0),G=R.r+Z*.006,et=0,Jt.matches&&at(performance.now());return}let nt=Vt(yt,ht);nt!==E&&(E=nt,t.classList.toggle(\"hot\",nt>=0),Jt.matches&&at(performance.now()))});let F=U=>{if(!R)return;let J=t.getBoundingClientRect(),yt=R.moved;if(yt&&(et=Math.max(-1.2,Math.min(1.2,(G-R.r)*2))),R=null,t.classList.remove(\"drag\"),!yt){let ht=Vt(U.clientX-J.left,U.clientY-J.top);ht>=0&&uo(ht)}};t.addEventListener(\"pointerup\",F),t.addEventListener(\"pointercancel\",()=>{R=null,t.classList.remove(\"drag\")}),t.addEventListener(\"pointerleave\",()=>{R||(E=-1,t.classList.remove(\"hot\"))}),t.addEventListener(\"wheel\",U=>{U.preventDefault(),K=Math.max(.7,Math.min(1.5,K*(U.deltaY>0?.94:1.06))),Jt.matches&&at(performance.now())},{passive:!1})}return{start(){if(t||Ut(),At(),!o){if(o=!0,l=0,Jt.matches){at(performance.now());return}n||(n=requestAnimationFrame(oe))}},stop(){o=!1,cancelAnimationFrame(n),n=0},redraw(){t&&at(performance.now())},reset(){G=0,et=0,K=1,E=-1}}})();eo=0;ks=[[\"Go to Home\",\"go-home\"],[\"Show the terminals\",\"go-terms\"],[\"Jump to the one waiting\",\"jump\",\"\\u2318J\"],[\"Start a job: build Rally, the pickup games app\",\"pal-job\"],[\"Open the Preview\",\"pal-pv\"],[\"Open the Brain\",\"go-brain\"],[\"Explain this: the build error in Cursor's terminal\",\"pal-explain\"],[\"Settings\",\"go-settings\"]],ve=0;ha=null;Ea=\"cubic-bezier(.2,.75,.1,1)\"});(async()=>{let t=()=>new Promise((s,d)=>{if(window.__pandoTHREE)return s(window.__pandoTHREE);addEventListener(\"pando-three\",()=>window.__pandoTHREE?s(window.__pandoTHREE):d(new Error(\"three failed\")),{once:!0});let x=document.createElement(\"script\");x.type=\"module\",x.textContent=\"import('https://cdn.jsdelivr.net/npm/three@0.169.0/build/three.module.min.js').then(T => { window.__pandoTHREE = T; }).catch(() => {}).finally(() => dispatchEvent(new Event('pando-three')));\",document.head.appendChild(x)}),e=document.documentElement,n=new URLSearchParams(location.search),o=n.get(\"jump\"),i=n.has(\"still\"),b=matchMedia(\"(prefers-reduced-motion: reduce)\").matches,A=matchMedia(\"(max-width: 760px)\").matches,G=()=>innerWidth<=760,et=matchMedia(\"(hover: hover) and (pointer: fine)\").matches,E=!!(window.gsap&&window.ScrollTrigger)&&!b,l=(s,d=document)=>d.querySelector(s),R=(s,d=document)=>[...d.querySelectorAll(s)],v=(s,d)=>s.querySelector(`[data-j=\"${d}\"]`),lt=(s,d,x)=>Math.min(x,Math.max(d,s)),dt=(s,d,x)=>s+(d-s)*x,Tt=s=>1-Math.pow(1-s,3),It=null,tt=!1,At=null,at=null,pt=[{key:\"claude\",name:\"Claude Code\",col:\"#d97757\",logo:\"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHRpdGxlPkNsYXVkZTwvdGl0bGU+PHBhdGggZD0iTTQuNzA5IDE1Ljk1NWw0LjcyLTIuNjQ3LjA4LS4yMy0uMDgtLjEyOEg5LjJsLS43OS0uMDQ4LTIuNjk4LS4wNzMtMi4zMzktLjA5Ny0yLjI2Ni0uMTIyLS41NzEtLjEyMUwwIDExLjc4NGwuMDU1LS4zNTIuNDgtLjMyMS42ODYuMDYgMS41Mi4xMDMgMi4yNzguMTU4IDEuNjUyLjA5NyAyLjQ0OS4yNTVoLjM4OWwuMDU1LS4xNTctLjEzNC0uMDk4LS4xMDMtLjA5Ny0yLjM1OC0xLjU5Ni0yLjU1Mi0xLjY4OC0xLjMzNi0uOTcyLS43MjQtLjQ5MS0uMzY0LS40NjItLjE1OC0xLjAwOC42NTYtLjcyMi44ODEuMDYuMjI1LjA2MS44OTMuNjg2IDEuOTA4IDEuNDc2IDIuNDkxIDEuODMzLjM2NS4zMDQuMTQ1LS4xMDMuMDE5LS4wNzMtLjE2NC0uMjc0LTEuMzU1LTIuNDQ2LTEuNDQ2LTIuNDktLjY0NC0xLjAzMi0uMTctLjYxOWEyLjk3IDIuOTcgMCAwMS0uMTA0LS43MjlMNi4yODMuMTM0IDYuNjk2IDBsLjk5Ni4xMzQuNDIuMzY0LjYyIDEuNDE0IDEuMDAyIDIuMjI5IDEuNTU1IDMuMDMuNDU2Ljg5OC4yNDMuODMyLjA5MS4yNTVoLjE1OFY5LjAxbC4xMjgtMS43MDYuMjM3LTIuMDk1LjIzLTIuNjk1LjA4LS43Ni4zNzYtLjkxLjc0Ny0uNDkyLjU4NC4yOC40OC42ODUtLjA2Ny40NDQtLjI4NiAxLjg1MS0uNTU5IDIuOTAzLS4zNjQgMS45NDJoLjIxMmwuMjQzLS4yNDIuOTg1LTEuMzA2IDEuNjUyLTIuMDY0LjczLS44Mi44NS0uOTA0LjU0Ny0uNDMxaDEuMDMzbC43NiAxLjEyOS0uMzQgMS4xNjYtMS4wNjQgMS4zNDctLjg4MSAxLjE0Mi0xLjI2NCAxLjctLjc5IDEuMzYuMDczLjExLjE4OC0uMDIgMi44NTYtLjYwNiAxLjU0My0uMjggMS44NDEtLjMxNS44MzMuMzg4LjA5MS4zOTUtLjMyOC44MDctMS45NjkuNDg2LTIuMzA5LjQ2Mi0zLjQzOS44MTMtLjA0Mi4wMy4wNDkuMDYxIDEuNTQ5LjE0Ni42NjIuMDM2aDEuNjIybDMuMDIuMjI1Ljc5LjUyMi40NzQuNjM4LS4wNzkuNDg1LTEuMjE1LjYyLTEuNjQtLjM4OS0zLjgyOS0uOTEtMS4zMTItLjMyOWgtLjE4MnYuMTFsMS4wOTMgMS4wNjggMi4wMDYgMS44MSAyLjUwOSAyLjMzLjEyNy41NzgtLjMyMi40NTUtLjM0LS4wNDktMi4yMDUtMS42NTctLjg1MS0uNzQ3LTEuOTI2LTEuNjJoLS4xMjh2LjE3bC40NDQuNjQ5IDIuMzQ1IDMuNTIxLjEyMiAxLjA4LS4xNy4zNTMtLjYwOC4yMTMtLjY2OC0uMTIyLTEuMzc0LTEuOTI1LTEuNDE1LTIuMTY3LTEuMTQzLTEuOTQzLS4xNC4wOC0uNjc0IDcuMjU0LS4zMTYuMzctLjcyOS4yOC0uNjA3LS40NjEtLjMyMi0uNzQ3LjMyMi0xLjQ3Ni4zODktMS45MjQuMzE1LTEuNTMuMjg2LTEuOS4xNy0uNjMyLS4wMTItLjA0Mi0uMTQuMDE4LTEuNDM0IDEuOTY3LTIuMTggMi45NDUtMS43MjYgMS44NDUtLjQxNC4xNjQtLjcxNy0uMzcuMDY3LS42NjIuNDAxLS41ODkgMi4zODgtMy4wMzYgMS40NC0xLjg4Mi45My0xLjA4Ni0uMDA2LS4xNThoLS4wNTVMNC4xMzIgMTguNTZsLTEuMTMuMTQ2LS40ODctLjQ1Ni4wNjEtLjc0Ni4yMzEtLjI0MyAxLjkwOC0xLjMxMi0uMDA2LjAwNnoiIGZpbGw9IiNEOTc3NTciIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPjwvc3ZnPg==\"},{key:\"codex\",name:\"Codex\",col:\"#10a37f\",logo:\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjNGM0Y1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+T3BlbkFJPC90aXRsZT48cGF0aCBkPSJNOS4yMDUgOC42NTh2LTIuMjZjMC0uMTkuMDcyLS4zMzMuMjM4LS40MjhsNC41NDMtMi42MTZjLjYxOS0uMzU3IDEuMzU2LS41MjMgMi4xMTctLjUyMyAyLjg1NCAwIDQuNjYyIDIuMjEyIDQuNjYyIDQuNTY2IDAgLjE2NyAwIC4zNTctLjAyNC41NDdsLTQuNzEtMi43NTlhLjc5Ny43OTcgMCAwMC0uODU2IDBsLTUuOTcgMy40NzN6bTEwLjYwOSA4LjhWMTIuMDZjMC0uMzMzLS4xNDMtLjU3LS40MjktLjczN2wtNS45Ny0zLjQ3MyAxLjk1LTEuMTE4YS40MzMuNDMzIDAgMDEuNDc2IDBsNC41NDMgMi42MTdjMS4zMDkuNzYgMi4xODkgMi4zNzggMi4xODkgMy45NDggMCAxLjgwOC0xLjA3IDMuNDczLTIuNzYgNC4xNjN6TTcuODAyIDEyLjcwM2wtMS45NS0xLjE0MmMtLjE2Ny0uMDk1LS4yMzktLjIzOC0uMjM5LS40MjhWNS44OTljMC0yLjU0NSAxLjk1LTQuNDcyIDQuNTkxLTQuNDcyIDEgMCAxLjkyNy4zMzMgMi43MTIuOTI4TDguMjMgNS4wNjdjLS4yODUuMTY2LS40MjguNDA0LS40MjguNzM3djYuODk4ek0xMiAxNS4xMjhsLTIuNzk1LTEuNTd2LTMuMzNMMTIgOC42NThsMi43OTUgMS41N3YzLjMzTDEyIDE1LjEyOHptMS43OTYgNy4yM2MtMSAwLTEuOTI3LS4zMzItMi43MTItLjkyN2w0LjY4Ni0yLjcxMmMuMjg1LS4xNjYuNDI4LS40MDQuNDI4LS43Mzd2LTYuODk4bDEuOTc0IDEuMTQyYy4xNjcuMDk1LjIzOC4yMzguMjM4LjQyOHY1LjIzM2MwIDIuNTQ1LTEuOTc0IDQuNDcyLTQuNjE0IDQuNDcyem0tNS42MzctNS4zMDNsLTQuNTQ0LTIuNjE3Yy0xLjMwOC0uNzYxLTIuMTg4LTIuMzc4LTIuMTg4LTMuOTQ4QTQuNDgyIDQuNDgyIDAgMDE0LjIxIDYuMzI3djUuNDIzYzAgLjMzMy4xNDMuNTcxLjQyOC43MzhsNS45NDcgMy40NDktMS45NSAxLjExOGEuNDMyLjQzMiAwIDAxLS40NzYgMHptLS4yNjIgMy45Yy0yLjY4OCAwLTQuNjYyLTIuMDIxLTQuNjYyLTQuNTE5IDAtLjE5LjAyNC0uMzguMDQ3LS41N2w0LjY4NiAyLjcxYy4yODYuMTY3LjU3MS4xNjcuODU2IDBsNS45Ny0zLjQ0OHYyLjI2YzAgLjE5LS4wNy4zMzMtLjIzNy40MjhsLTQuNTQzIDIuNjE2Yy0uNjE5LjM1Ny0xLjM1Ni41MjMtMi4xMTcuNTIzem01Ljg5OSAyLjgzYTUuOTQ3IDUuOTQ3IDAgMDA1LjgyNy00Ljc1NkMyMi4yODcgMTguMzM5IDI0IDE1Ljg0IDI0IDEzLjI5NmMwLTEuNjY1LS43MTMtMy4yODItMS45OTgtNC40NDguMTE5LS41LjE5LS45OTkuMTktMS40OTggMC0zLjQwMS0yLjc1OS01Ljk0Ny01Ljk0Ni01Ljk0Ny0uNjQyIDAtMS4yNi4wOTUtMS44OC4zMUE1Ljk2MiA1Ljk2MiAwIDAwMTAuMjA1IDBhNS45NDcgNS45NDcgMCAwMC01LjgyNyA0Ljc1N0MxLjcxMyA1LjQ0NyAwIDcuOTQ1IDAgMTAuNDljMCAxLjY2Ni43MTMgMy4yODMgMS45OTggNC40NDgtLjExOS41LS4xOSAxLS4xOSAxLjQ5OSAwIDMuNDAxIDIuNzU5IDUuOTQ2IDUuOTQ2IDUuOTQ2LjY0MiAwIDEuMjYtLjA5NSAxLjg4LS4zMDlhNS45NiA1Ljk2IDAgMDA0LjE2MiAxLjcxM3oiPjwvcGF0aD48L3N2Zz4=\"},{key:\"cursor\",name:\"Cursor\",col:\"#c9ced6\",logo:\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjNGM0Y1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Q3Vyc29yPC90aXRsZT48cGF0aCBkPSJNMjIuMTA2IDUuNjhMMTIuNS4xMzVhLjk5OC45OTggMCAwMC0uOTk4IDBMMS44OTMgNS42OGEuODQuODQgMCAwMC0uNDE5LjcyNnYxMS4xODZjMCAuMy4xNi41NzcuNDIuNzI3bDkuNjA3IDUuNTQ3YS45OTkuOTk5IDAgMDAuOTk4IDBsOS42MDgtNS41NDdhLjg0Ljg0IDAgMDAuNDItLjcyN1Y2LjQwN2EuODQuODQgMCAwMC0uNDItLjcyNnptLS42MDMgMS4xNzZMMTIuMjI4IDIyLjkyYy0uMDYzLjEwOC0uMjI4LjA2NC0uMjI4LS4wNjFWMTIuMzRhLjU5LjU5IDAgMDAtLjI5NS0uNTFsLTkuMTEtNS4yNmMtLjEwNy0uMDYyLS4wNjMtLjIyOC4wNjItLjIyOGgxOC41NWMuMjY0IDAgLjQyOC4yODYuMjk2LjUxNHoiPjwvcGF0aD48L3N2Zz4=\"},{key:\"grok\",name:\"Grok\",col:\"#e6e6e6\",logo:\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRjNGM0Y1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+R3JvazwvdGl0bGU+PHBhdGggZD0iTTkuMjcgMTUuMjlsNy45NzgtNS44OTdjLjM5MS0uMjkuOTUtLjE3NyAxLjEzNy4yNzIuOTggMi4zNjkuNTQyIDUuMjE1LTEuNDEgNy4xNjktMS45NTEgMS45NTQtNC42NjcgMi4zODItNy4xNDkgMS40MDZsLTIuNzExIDEuMjU3YzMuODg5IDIuNjYxIDguNjExIDIuMDAzIDExLjU2Mi0uOTUzIDIuMzQxLTIuMzQ0IDMuMDY2LTUuNTM5IDIuMzg4LTguNDJsLjAwNi4wMDdjLS45ODMtNC4yMzIuMjQyLTUuOTI0IDIuNzUtOS4zODMuMDYtLjA4Mi4xMi0uMTY0LjE3OS0uMjQ4bC0zLjMwMSAzLjMwNXYtLjAxTDkuMjY3IDE1LjI5Mk03LjYyMyAxNi43MjNjLTIuNzkyLTIuNjctMi4zMS02LjgwMS4wNzEtOS4xODQgMS43NjEtMS43NjMgNC42NDctMi40ODMgNy4xNjYtMS40MjVsMi43MDUtMS4yNWE3LjgwOCA3LjgwOCAwIDAwLTEuODI5LTFBOC45NzUgOC45NzUgMCAwMDUuOTg0IDUuODNjLTIuNTMzIDIuNTM2LTMuMzMgNi40MzYtMS45NjIgOS43NjQgMS4wMjIgMi40ODctLjY1MyA0LjI0Ni0yLjM0IDYuMDIyLS41OTkuNjMtMS4xOTkgMS4yNTktMS42ODIgMS45MjVsNy42Mi02LjgxNSI+PC9wYXRoPjwvc3ZnPg==\"}];We(),ue(),Vt();function Vt(){let s={claude:\"? for shortcuts\",codex:\"\\u23CE send\",cursor:\"/ commands \\xB7 @ files\",grok:\"/ commands\"},d=R(\".pane\").filter(r=>l(\".term\",r)&&!r.closest(\"#xp\")).map((r,w)=>{let c=r.dataset.agent||\"claude\",j=document.createElement(\"div\");if(j.className=\"tsp\",j.hidden=!0,r.appendChild(j),!r.classList.contains(\"nu\")){let h=document.createElement(\"div\");h.className=\"tin\",h.setAttribute(\"aria-hidden\",\"true\"),h.innerHTML=`${s[c]||\"\"}`,r.appendChild(h)}return{ag:c,sp:j,st:l(\".st\",r),t:9+w*7%31}}),x=()=>d.forEach(r=>{let w=!!r.st&&/Working/.test(r.st.textContent);r.sp.hidden=!w,w&&(r.t++,r.sp.textContent=r.ag===\"claude\"?`Working\\u2026 (${r.t}s \\xB7 esc to interrupt)`:r.ag===\"codex\"?`Working (${r.t}s \\u2022 esc to interrupt)`:`Working\\u2026 ${r.t}s`)});x(),setInterval(x,1e3)}function oe(){gsap.registerPlugin(ScrollTrigger,...window.SplitText?[SplitText]:[]),o===null&&!i&&(It=new Lenis({lerp:.085,smoothWheel:!0}),It.on(\"scroll\",ScrollTrigger.update),gsap.ticker.add(d=>It.raf(d*1e3)),gsap.ticker.lagSmoothing(0),window.__lenis=It),A?W():Z(),matchMedia(\"(max-width: 760px)\").addEventListener?.(\"change\",d=>{if(d.matches&&At)At(),At=null,W();else if(!d.matches&&at&&et)at(),at=null,Z();else return;ScrollTrigger.refresh()}),F(),U(),yt(),ht(),nt(),zt(),se(),Et(),_t(),pe(),Pe(),Le(),ie(),ScrollTrigger.refresh();let s=()=>{o!==null&&(history.scrollRestoration=\"manual\",scrollTo(0,+o||0),ScrollTrigger.update()),window.__ready=!0};Promise.race([document.fonts?document.fonts.ready:Promise.resolve(),new Promise(d=>setTimeout(d,1200))]).then(()=>te().then(s)),window.__go=d=>{It?It.scrollTo(d,{immediate:!0}):scrollTo(0,d),ScrollTrigger.update()}}function te(){let s=l(\"#pre\"),d=[l(\"#h1\")];window.SplitText&&(d=SplitText.create(\"#h1\",{type:\"lines\",mask:\"lines\",linesClass:\"hl\"}).lines);let x=o!==null||i;return new Promise(r=>{let w=gsap.timeline({onComplete:()=>{tt=!0,window.__measureAvoid&&window.__measureAvoid(),r()}});if(!x&&s){let j=l(\"#cnt\"),h={v:0};w.to(\"#pre ellipse\",{strokeDashoffset:0,duration:1,ease:\"power2.inOut\"},0).to(h,{v:100,duration:1,ease:\"power2.inOut\",onUpdate:()=>{j.textContent=Math.round(h.v)}},0).to(\"#pre\",{autoAlpha:0,duration:.5,ease:\"power2.out\"},1.1).add(()=>s.remove())}else s&&s.remove();let c=x?0:1.15;w.from(d,{yPercent:110,duration:x?.01:1.15,ease:\"power4.out\",stagger:.12},c).fromTo(\"#slogan\",{opacity:0,y:18},{opacity:1,y:0,duration:x?.01:.9,ease:\"power3.out\"},c+.1).fromTo(\".hero .status\",{opacity:0,y:12},{opacity:1,y:0,duration:x?.01:.8,ease:\"power3.out\"},c).fromTo(\".hero .top .sub, .hero .top .ctas, .hero .top .fine\",{opacity:0,y:22},{opacity:1,y:0,duration:x?.01:.9,ease:\"power3.out\",stagger:.09},c+.35).fromTo(\"#stage\",{opacity:0,y:140},{opacity:1,y:0,duration:x?.01:1.4,ease:\"power3.out\"},c+.45).add(()=>{P&&P.ignite(),Ut(x)},c+.7)})}function Ut(s){s||R(\".hero .term.stream\").forEach((d,x)=>{let r=R(\".ln\",d);gsap.set(r,{opacity:0,x:-6});let w=gsap.timeline({delay:.3+x*.55});r.forEach((c,j)=>{w.to(c,{opacity:1,x:0,duration:.35,ease:\"power2.out\"},j*.75)})})}function F(){window.SplitText&&R(\".split\").forEach(s=>{s.closest(\".story\")||SplitText.create(s,{type:\"lines\",mask:\"lines\",autoSplit:!0,linesClass:\"sl\",onSplit(d){return gsap.from(d.lines,{yPercent:112,duration:1.1,ease:\"power4.out\",stagger:.1,scrollTrigger:{trigger:s,start:\"top 90%\",toggleActions:\"play none none reverse\"}})}})})}function U(){let s=[{el:l(\"#h1\"),blur:!1,exitOnly:!0,intro:!0},...R(\".rise\").filter(h=>!h.closest(\".story\")).map(h=>({el:h,blur:!h.matches(\".win,.stage,.th,.card\"),intro:!!h.closest(\".hero\")})),...R(\".split\").filter(h=>!h.closest(\".story\")).map(h=>({el:h,blur:!1,exitOnly:!0})),...R(\".assemble,.pvw,.duo,.limwin,.pipe,.pm,.mail,.brainwin .win,.vp-stage\").map(h=>({el:h,blur:!1,exitOnly:!1,win:!0}))],d=new Set,x=s.filter(h=>h.el&&!d.has(h.el)&&d.add(h.el));x.forEach(h=>{h.sticky=!!h.el.closest(\".sticky\")});let r=()=>x.forEach(h=>{if(!h.sticky){let T=J(h.el);h.top=T.top,h.h=T.h}});r(),ScrollTrigger.addEventListener(\"refresh\",r),addEventListener(\"resize\",r),document.fonts&&document.fonts.ready.then(()=>{r(),ScrollTrigger.refresh()});let w=-1,c=!1,j=()=>{let h=scrollY;if(h===w&&tt===c)return;w=h,c=tt;let T=innerHeight,z=T*.2;for(let C of x){if(C.intro&&!tt)continue;let N,H;if(C.sticky){let X=C.el.getBoundingClientRect();N=X.top,H=X.bottom}else N=C.top-h,H=N+C.h;if(H<-T*.3||N>T*1.3){C.off||(C.el.style.opacity=\"0\",C.off=!0);continue}C.off=!1;let V=lt((T-N)/z,0,1),ft=lt(H/z,0,1);(C.exitOnly||C.intro)&&(V=1);let jt=0,st=1;V<1?(st=Tt(V),jt=160*(1-st)):ft<1&&(st=Tt(ft),jt=-120*(1-st));let ae=st.toFixed(3);if(ae===C.k)continue;C.k=ae;let m=.88+.12*st,S=C.el.style;S.transform=st>.999?\"\":`translate3d(0,${jt.toFixed(1)}px,0) scale(${m.toFixed(4)})`,S.opacity=st>.999?\"1\":ae,C.blur&&(S.filter=st>.995?\"\":`blur(${(14*(1-st)).toFixed(2)}px)`)}};gsap.ticker.add(j)}function J(s){let d=0,x=s;for(;x;)d+=x.offsetTop,x=x.offsetParent;return{top:d,h:s.offsetHeight}}function yt(){gsap.fromTo(\"#heroWin\",{rotateX:16,scale:.93},{rotateX:0,scale:1,ease:\"none\",scrollTrigger:{trigger:\"#stage\",start:\"top 92%\",end:\"top 22%\",scrub:!0}})}function ht(){let s=l(\"#marq\"),d=gsap.to(s,{xPercent:-50,duration:32,ease:\"none\",repeat:-1});It&&It.on(\"scroll\",({velocity:x})=>{d.timeScale(1+Math.min(4,Math.abs(x)/8))}),ScrollTrigger.create({trigger:\".band\",start:\"top bottom\",end:\"bottom top\",onToggle:x=>x.isActive?d.play():d.pause()})}function nt(){let s=R(\"#assemble .pane.asm\"),d=l(\"#asmTag\");gsap.set(s,{opacity:0,y:90,rotateX:28,scale:.86,transformPerspective:1400});let x=gsap.timeline({paused:!0});s.forEach((r,w)=>{let c=pt.find(j=>j.key===r.dataset.agent).col;x.to(r,{opacity:1,y:0,rotateX:0,scale:1,duration:1,ease:\"power3.out\"},w*.16).fromTo(r,{borderColor:c,boxShadow:`0 0 0 1px ${c}, 0 0 40px -6px ${c}`},{borderColor:\"rgba(255,255,255,.07)\",boxShadow:\"0 0 0 0 rgba(0,0,0,0)\",duration:1.6,ease:\"power2.out\"},w*.16+.5)}),x.to(d,{opacity:1,y:0,duration:.5},1.1),gsap.set(d,{y:8}),ScrollTrigger.create({trigger:\"#assemble\",start:\"top 72%\",onEnter:()=>x.play(),onLeaveBack:()=>x.reverse()})}function Z(){let s=l(\"#job\"),d=R(\".story .step\"),x=R(\".story .rail2 button\"),r=-1,w=null,c=h=>{h!==r&&(r=h,d.forEach((T,z)=>T.classList.toggle(\"on\",z===h)),x.forEach((T,z)=>{T.classList.toggle(\"on\",z===h),T.classList.toggle(\"dn\",zc(lt(Math.floor(h.progress*5.999),0,5))});x.forEach((h,T)=>h.addEventListener(\"click\",()=>{let z=j.start+(T+.5)/6*(j.end-j.start);It?It.scrollTo(z,{duration:1.2}):scrollTo({top:z,behavior:\"smooth\"})})),c(0),At=()=>{w&&w.kill(),j.kill(!0),gsap.set(d.flatMap(h=>[...h.children]),{clearProps:\"opacity,transform\"})}}function ot(){let s=l(\".story\");if(!s||s.dataset.stack)return;s.dataset.stack=\"1\";let d=l(\"#job\"),x=l(\".story .right\"),r=R(\".story .step\");l(\".story .rail2\")?.remove(),r.forEach((c,j)=>{c.classList.add(\"on\"),c.style.position=\"relative\",c.style.opacity=\"1\",c.style.visibility=\"visible\",c.style.marginTop=j?\"72px\":\"0\";let h=d.cloneNode(!0);h.removeAttribute(\"id\"),h.style.marginTop=\"26px\",ut(h,j,!1),c.appendChild(h)}),x.remove();let w=l(\".story .pin\");Object.assign(w.style,{height:\"auto\",minHeight:\"0\",display:\"block\",padding:\"140px 0 40px\"}),l(\".story .grid\").style.gridTemplateColumns=\"1fr\",l(\".story .steps\").style.minHeight=\"0\",l(\".story .left\").style.minHeight=\"0\"}function W(){let s=l(\".story\");if(!s||s.dataset.stack)return;s.dataset.stack=\"1\",s.dataset.swipe=\"1\";let d=l(\"#job\"),x=R(\".story .step\"),r=l(\".story .steps\"),w=l(\".story .right\"),c=w.parentNode,j=l(\".story .rail2\");j?.remove();let h=document.createElement(\"div\");h.className=\"swipe\",h.tabIndex=0,h.setAttribute(\"role\",\"region\"),h.setAttribute(\"aria-roledescription\",\"carousel\"),h.setAttribute(\"aria-label\",\"How a job runs, in six steps\");let T=x.map((S,X)=>{S.classList.add(\"on\"),S.removeAttribute(\"style\");let B=document.createElement(\"div\");B.className=\"card6\",B.setAttribute(\"role\",\"group\"),B.setAttribute(\"aria-label\",`Step ${X+1} of ${x.length}`);let it=d.cloneNode(!0);return it.removeAttribute(\"id\"),ut(it,X,!1),B.append(it,S),h.append(B),it}),z=document.createElement(\"div\");z.className=\"dots6\";let C=x.map((S,X)=>{let B=document.createElement(\"button\");return B.type=\"button\",B.setAttribute(\"aria-label\",`Step ${X+1}`),B.addEventListener(\"click\",()=>h.scrollTo({left:h.children[X].offsetLeft-h.children[0].offsetLeft,behavior:b?\"auto\":\"smooth\"})),z.append(B),B});r.replaceWith(h),h.after(z),w.remove();let N=0,H=!1,V=0,ft=new Set,jt=()=>{let S=h.getBoundingClientRect(),X=S.left+S.width/2,B=0,it=1/0;return[...h.children].forEach((vt,Dt)=>{let Qt=vt.getBoundingClientRect(),re=Math.abs(Qt.left+Qt.width/2-X);reC.forEach((S,X)=>{S.classList.toggle(\"on\",X===N),S.setAttribute(\"aria-current\",X===N?\"step\":\"false\")}),ae=()=>{!H||ft.has(N)||(ft.add(N),E&&ut(T[N],N,!0))};h.addEventListener(\"scroll\",()=>{let S=jt();S!==N&&(N=S,st()),clearTimeout(V),V=setTimeout(ae,140)},{passive:!0});let m=new IntersectionObserver(S=>{H=S[0].isIntersecting,ae()},{threshold:.5});m.observe(h),st(),at=()=>{m.disconnect(),clearTimeout(V),x.forEach(S=>{S.classList.remove(\"on\"),r.append(S)}),h.replaceWith(r),z.remove(),j&&r.after(j.cloneNode(!0)),c.append(w),delete s.dataset.stack,delete s.dataset.swipe}}function ut(s,d,x){let r=x?gsap.timeline():null,w=(I,Y)=>{let Q=v(s,I);Q&&Y(Q)},c=(I,Y)=>{I&&(I.style.display=Y?\"\":\"none\")},j=(I,Y)=>w(\"jStatus\",Q=>{Q.className=\"stt \"+I,Q.querySelector(\"span\").textContent=Y}),h=I=>w(\"jNote\",Y=>{Y.querySelector(\"span\").textContent=I}),T=v(s,\"t1\"),z=v(s,\"t2\"),C=v(s,\"t3\"),N=v(s,\"t4\"),H=[z,C,N],V=(I,Y)=>I.querySelector(Y),ft=I=>{V(I,\".k-plan\").style.display=\"\",V(I,\".prog\")&&(V(I,\".prog\").style.display=\"none\"),[\".ck\",\".err\",\".back\",\".copyline\"].forEach(Y=>{let Q=V(I,Y);Q&&(Q.style.display=\"none\")})},jt=v(s,\"t1r\"),st=v(s,\"t2r\"),ae=v(s,\"t3r\"),m=v(s,\"t4r\"),S=[st,ae,m],X=v(s,\"jCur\"),B=v(s,\"jClk\"),it=v(s,\"jobZoom\"),vt=v(s,\"jTag1\"),Dt=v(s,\"jTag2\"),Qt=v(s,\"jTag3\"),re=v(s,\"jToast\"),aa=s.querySelector(\".jcr\");r?(gsap.killTweensOf([X,B,vt,Dt,Qt,re]),gsap.set([vt,Dt,Qt],{opacity:0}),gsap.set(re,{opacity:0,y:10}),gsap.set(X,{opacity:0})):[vt,Dt,Qt,re,X,B].forEach(I=>{I&&(I.style.opacity=\"0\",I.style.display=\"none\")});let he=I=>w(\"jFoot\",Y=>{Y.textContent=I}),He=v(s,\"bKeep\"),na=v(s,\"bAsk\"),fe=I=>{let Y=0,Q=0,q=I;for(;q&&q!==it;)Y+=q.offsetLeft,Q+=q.offsetTop,q=q.offsetParent;return{x:Y,y:Q,w:I.offsetWidth,h:I.offsetHeight}},ne=(I,Y,Q=0)=>{if(!r||!I){!r&&window.gsap&&gsap.set(it,{x:0,y:0,scale:1});return}r.add(()=>{G()&&(Y=1+(Y-1)*.3);let q=fe(I),Zt=it.offsetWidth,xt=it.offsetHeight,De=it.querySelector(s.dataset.v===\"home\"?\".hm .in\":s.dataset.v===\"pv\"?\".pv2\":\".jp .in\"),we=fe(De),je=Math.max(xt,we.y+we.h+30),ge=Zt/2-Y*(q.x+q.w/2),Bt=xt/2-Y*(q.y+q.h/2);s.closest(\".card6\")&&(Y=1,ge=0,Bt=10-q.y),ge=lt(ge,Zt-Y*Zt,0),Bt=lt(Bt,Math.min(0,xt-Y*je),0),gsap.to(it,{x:ge,y:Bt,scale:Y,duration:1.15,ease:\"power3.inOut\",overwrite:!0})},Q)},xe=(I,Y)=>{let Q=fe(Y);I.style.left=Math.max(8,Q.x+Q.w-I.offsetWidth-10)+\"px\",I.style.top=Q.y-16+\"px\",I.style.right=\"auto\"},oa=I=>{let Y=0,Q=0,q=I;for(;q&&q!==it;)Y+=q.offsetLeft,Q+=q.offsetTop,q=q.offsetParent;return{x:Y+I.offsetWidth*.55,y:Q+I.offsetHeight*.62}},Ne=(I,Y,Q)=>{if(!r){Q&&Q();return}let q=oa(I);r.to(X,{opacity:1,duration:.2},Y-.9).fromTo(X,{x:q.x+160,y:q.y+120},{x:q.x,y:q.y,duration:.9,ease:\"power3.inOut\"},Y-.9).add(()=>{I.classList.add(\"press\"),setTimeout(()=>I.classList.remove(\"press\"),160),Q&&Q()},Y).fromTo(B,{x:q.x,y:q.y,scale:.4,opacity:.9},{scale:1.6,opacity:0,duration:.6,ease:\"power2.out\"},Y).to(X,{opacity:0,duration:.4},Y+.7)};if(s.dataset.s=d,[T,...H].forEach(ft),c(v(s,\"bOpinion\"),!1),c(v(s,\"bChanged\"),!1),c(v(s,\"jActs\"),!1),c(v(s,\"planActs\"),!0),[jt,...S].forEach(I=>{I.textContent=\"\",I.className=\"r\"}),w(\"planR\",I=>{I.className=\"r\",I.textContent=\"waiting for your Start\"}),aa&&(aa.style.display=d===0?\"none\":\"\"),He.textContent=\"Keep this change\",na.textContent=\"Ask for a change\",d===0){s.dataset.v=\"home\",he(\"0 working\");let I=v(s,\"goal\"),Y=\"Build Rally: a map of pickup games near you, join a game with one tap, and a chat for each team\";if(r){let Q={n:0};I.textContent=\"\",ne(I.closest(\".box\"),1.18,0),r.to(Q,{n:Y.length,duration:1.5,ease:\"none\",onUpdate:()=>{I.textContent=Y.slice(0,Math.round(Q.n))}},.2),Ne(v(s,\"bStartJob\"),2.6)}else I.textContent=Y}if(d===1&&(s.dataset.v=\"job\",j(\"wait\",\"Plan waiting for you\"),w(\"jStarted\",I=>{I.textContent=\"When you press Start\"}),h(\"Here is the plan: 4 tasks. Nothing starts until you say Start.\"),he(\"0 working\"),r&&r.from([z,C,T,N],{opacity:0,y:14,stagger:.15,duration:.6,ease:\"power3.out\"},.1),ne(v(s,\"bPlan\"),1.08,0),Ne(v(s,\"bStart\"),2.4)),d===2&&(s.dataset.v=\"job\",j(\"work\",\"Working\"),w(\"jStarted\",I=>{I.textContent=\"9:37 am from the Mac\"}),h(\"Four tasks at once, each in its own copy of rally. Your project is untouched.\"),he(\"4 working\"),c(v(s,\"planActs\"),!1),[[z,st,\"copy 1 \\xB7 app/sign-in.tsx, lib/auth.ts\",.84],[C,ae,\"copy 2 \\xB7 app/map.tsx, lib/games.ts\",.7],[T,jt,\"copy 3 \\xB7 lib/join.ts, components/GameCard.tsx\",.56],[N,m,\"copy 4 \\xB7 app/game/chat.tsx\",.44]].forEach(([I,Y,Q,q])=>{V(I,\".k-plan\").style.display=\"none\";let Zt=V(I,\".copyline\");Zt&&(Zt.textContent=Q,Zt.style.display=\"\",Zt.style.font=\"400 10.5px/1.5 var(--mono)\",Zt.style.color=\"var(--ink3)\",Zt.style.marginTop=\"4px\");let xt=V(I,\".prog\");xt.style.display=\"\",Y.textContent=\"Working\",Y.className=\"r wk\",r?r.fromTo(xt.firstElementChild,{width:\"4%\"},{width:q*100+\"%\",duration:3.2,ease:\"power1.inOut\"},.2):xt.firstElementChild.style.width=q*100+\"%\"}),w(\"planR\",I=>{I.textContent=\"0 of 4 passed\"}),ne(v(s,\"bPlan\"),1.05,0)),d===3){s.dataset.v=\"job\",j(\"work\",\"Checking\"),w(\"jStarted\",xt=>{xt.textContent=\"9:37 am from the Mac\"}),c(v(s,\"planActs\"),!1),he(\"1 working\"),[T,...H].forEach(xt=>{V(xt,\".k-plan\").style.display=\"none\"});let I=V(T,\".ck\"),Y=V(T,\".err\"),Q=V(T,\".back\"),q=()=>{h(\"Pando is running rally's own tests on each task.\"),I.style.display=\"\",I.innerHTML='
\\u2717 npm test: 1 failed
',Y.style.display=\"\",Q.style.display=\"\",Q.textContent=\"Sent back to Claude Code with the real error.\",jt.textContent=\"Failed\",jt.className=\"r bd\",S.forEach(xt=>{xt.textContent=\"Passed\",xt.className=\"r ok\"}),w(\"planR\",xt=>{xt.className=\"r bd\",xt.textContent=\"3 of 4 passed\"})},Zt=()=>{I.innerHTML='
\\u2713 npm test: 84 passed
',Y.style.display=\"none\",Q.textContent=\"Claude Code now claims the last spot in one step. Pando ran the tests again: they passed.\",jt.textContent=\"Passed\",jt.className=\"r ok\",w(\"planR\",xt=>{xt.className=\"r ok\",xt.textContent=\"all 4 passed \\u2713\"}),c(v(s,\"bOpinion\"),!0),h(\"Done and checked. An AI from another company read each real change.\")};r?(r.add(q,.1).add(()=>xe(vt,T),.12).fromTo(Y,{opacity:0,y:6},{opacity:1,y:0,duration:.4},.15).to(vt,{opacity:1,duration:.4},.5).add(Zt,2.7).fromTo(v(s,\"bOpinion\"),{opacity:0,y:10},{opacity:1,y:0,duration:.6,ease:\"power3.out\"},2.75).to(vt,{opacity:0,duration:.3},2.7).add(()=>xe(Dt,v(s,\"bOpinion\")),2.8).to(Dt,{opacity:1,duration:.4},3.2),ne(T,1.22,.1),ne(v(s,\"bOpinion\"),1.18,2.8)):(Zt(),Dt.style.display=\"\",requestAnimationFrame(()=>{xe(Dt,v(s,\"bOpinion\")),Dt.style.opacity=\"1\"}))}if(d===4){s.dataset.v=\"pv\",he(\"1 working\");let I=v(s,\"pvPill\"),Y=v(s,\"pvErrs\"),Q=v(s,\"pvFix\"),q=v(s,\"pvSent\"),Zt=v(s,\"pvShot\"),xt=v(s,\"pvIcon\"),De=v(s,\"pvLd\"),we=v(s,\"pvSt\"),je=[\"pvL1\",\"pvL2\",\"pvL3\"].map(Bt=>v(s,Bt)),ge=(Bt,Me)=>{we.className=\"st \"+(Me||\"\"),we.querySelector(\"span\").textContent=Bt};Q.textContent=\"Fix what I see\",xt.classList.remove(\"ok\"),ge(\"Working\"),r?(gsap.set([Y,Zt,...je,q],{opacity:0}),gsap.set(I,{opacity:0,scale:.8}),gsap.set(Y,{y:-6}),r.add(()=>gsap.to(it,{x:0,y:0,scale:1,duration:.8,ease:\"power3.inOut\",overwrite:!0}),0).to(I,{opacity:1,scale:1,duration:.4,ease:\"back.out(2)\"},.7).add(()=>{Qt.style.left=\"auto\",Qt.style.right=\"18px\",Qt.style.top=\"auto\",Qt.style.bottom=\"18px\"},.7).to(Qt,{opacity:1,duration:.4},1),Ne(I,2,()=>{}),r.to(Y,{opacity:1,y:0,duration:.35,ease:\"power3.out\"},2.05),Ne(Q,3.4,()=>{Q.textContent=\"Sending\\u2026\"}),r.add(()=>{Q.textContent=\"Fix what I see\"},4).to(q,{opacity:1,duration:.3},4).to(Zt,{opacity:1,duration:.45,ease:\"power3.out\"},4.1).to(Qt,{opacity:0,duration:.3},4.3).to(Y,{opacity:0,duration:.35},5),je.forEach((Bt,Me)=>r.to(Bt,{opacity:1,duration:.3},4.6+Me*.6)),r.fromTo(De,{width:\"0%\",opacity:1},{width:\"100%\",duration:.5,ease:\"power2.inOut\"},6.4).to(De,{opacity:0,duration:.25},6.9).add(()=>{xt.classList.add(\"ok\"),ge(\"Done\"),he(\"0 working\")},6.8).to(I,{opacity:0,scale:.8,duration:.3},6.8)):([Y,Zt,...je,q].forEach(Bt=>{Bt.style.opacity=\"1\"}),je[2].style.opacity=\"0\")}if(d===5){s.dataset.v=\"job\",j(\"\",\"Your turn\"),w(\"jStarted\",Q=>{Q.textContent=\"9:37 am from the Mac\"}),h(\"Done and checked. Keep this change, or ask for a change.\"),he(\"0 working\"),c(v(s,\"planActs\"),!1),c(v(s,\"jActs\"),!0),c(v(s,\"bOpinion\"),!0),c(v(s,\"bChanged\"),!0),[T,...H].forEach(Q=>{V(Q,\".k-plan\").style.display=\"none\"});let I=V(T,\".ck\");I.style.display=\"\",I.innerHTML='
\\u2713 npm test: 84 passed
',[jt,...S].forEach(Q=>{Q.textContent=\"Passed\",Q.className=\"r ok\"}),w(\"planR\",Q=>{Q.className=\"r ok\",Q.textContent=\"all 4 passed \\u2713\"});let Y=re.querySelector(\"span\");ne(v(s,\"jActs\").closest(\"h4\"),1.08,0),r?(Ne(He,1.4,()=>{He.textContent=\"Undo\",na.style.display=\"none\",Y.textContent=\"Kept. The change is in your project.\",h(\"Kept. The change is in your project.\")}),r.to(re,{opacity:1,y:0,duration:.4},1.5).to(re,{opacity:0,y:6,duration:.4},3.4),Ne(He,4.6,()=>{He.textContent=\"Keep this change\",na.style.display=\"\",Y.textContent=\"Undone. Your project is back to how it was.\",h(\"Undone. Your project is back to how it was before this job. Keep this change puts the work back.\")}),r.to(re,{opacity:1,y:0,duration:.4},4.7)):h(\"Undone. Your project is back to how it was before this job. Keep this change puts the work back.\")}return r}function mt(s,d,x,r,w){let c=l(\"#fly\"),j=w.getBoundingClientRect(),h=d.getBoundingClientRect(),T=x.getBoundingClientRect(),z={x:h.left+h.width*.5-j.left,y:h.top+h.height*.5-j.top},C={x:T.left+T.width*.5-j.left,y:T.top+T.height*.5-j.top},N={t:0};s.set(c,{opacity:1,x:z.x,y:z.y},r).to(N,{t:1,duration:1,ease:\"power2.inOut\",onUpdate:()=>{let H=N.t,V=dt(z.x,C.x,H),ft=dt(z.y,C.y,H)-Math.sin(H*Math.PI)*120;gsap.set(c,{x:V,y:ft})}},r).to(c,{opacity:0,duration:.2},r+1)}function zt(){let s=l(\"#duo\");if(!s)return;let d=[\"#mOut\",\"#mIn\",\"#mRead\",\"#mOut2\",\"#mIn2\",\"#mFix\"].map(j=>l(j)),x=l(\"#talkTag\"),r=()=>{gsap.set(d,{opacity:0,y:8}),gsap.set(x,{opacity:0})};r();let w=null,c=()=>{w&&w.kill(),r(),w=gsap.timeline();let j=(h,T)=>w.to(h,{opacity:1,y:0,duration:.45,ease:\"power3.out\"},T);j(d[0],.2),w.to(x,{opacity:1,duration:.4},.5),w.add(()=>{mt(gsap.timeline(),d[0],d[1],0,s),P&&P.fire(\"claude\",\"codex\")},.75),j(d[1],1.75),j(d[2],2.3),j(d[3],3),w.add(()=>{mt(gsap.timeline(),d[3],d[4],0,s),P&&P.fire(\"codex\",\"claude\")},3.3),j(d[4],4.3),j(d[5],4.9)};ScrollTrigger.create({trigger:s,start:\"top 68%\",onEnter:c,onEnterBack:c})}function Nt(s,d){if(!P)return;let x=pt.find(r=>r.key===s).col;P.thread(s,d,()=>{d.style.setProperty(\"--hc\",x),d.classList.add(\"hitfx\",\"hit\"),setTimeout(()=>d.classList.remove(\"hit\"),320)})}function Xt(s,d,x,r,w,c,j){let h=r.getBoundingClientRect(),T=w.getBoundingClientRect(),z=T.left-h.left+T.width*.55,C=T.top-h.top+T.height*.6;s.to(d,{opacity:1,duration:.2},c-1).fromTo(d,{x:z+180,y:C+110},{x:z,y:C,duration:1,ease:\"power3.inOut\"},c-1).add(()=>{w.classList.add(\"press\"),setTimeout(()=>w.classList.remove(\"press\"),160),j&&j()},c).fromTo(x,{x:z,y:C,scale:.4,opacity:.9},{scale:1.6,opacity:0,duration:.6,ease:\"power2.out\"},c).to(d,{opacity:0,duration:.4},c+.8)}function Et(){let s=l(\"#limWin\"),d=l(\"#limPanes\"),x=l(\"#limLine\"),r=l(\"#limSt\"),w=l(\"#offer\"),c=l(\"#limTag\");if(!s)return;let j=R('.pane[data-agent=\"codex\"] .ln',d),h=()=>{d.classList.remove(\"open\"),gsap.set(x,{opacity:0}),gsap.set(w,{opacity:0,y:20}),gsap.set(c,{opacity:0}),r.className=\"st\",r.querySelector(\"span\").textContent=\"Working\",gsap.set(j,{opacity:0})};h();let T=null,z=()=>{T&&T.kill(),h(),T=gsap.timeline(),T.to(x,{opacity:1,duration:.4},.5).add(()=>{r.className=\"st lim\",r.querySelector(\"span\").textContent=\"Limit reached\"},.5).to(w,{opacity:1,y:0,duration:.6,ease:\"power3.out\"},1.1),Xt(T,l(\"#lCur\"),l(\"#lClk\"),s,l(\"#bCont\"),2.9,()=>{d.classList.add(\"open\"),P&&P.fire(\"claude\",\"codex\")}),T.to(w,{opacity:0,y:12,duration:.4},3.15).add(()=>Nt(\"codex\",l('.pane[data-agent=\"codex\"]',d)),3).to(j,{opacity:1,duration:.35,stagger:.42},3.8).to(c,{opacity:1,duration:.4},4)};ScrollTrigger.create({trigger:s,start:\"top 66%\",onEnter:z,onEnterBack:z})}function se(){let s=l(\"#pvw\");if(!s)return;let d=l(\".win\",s),x=R(\"#pvA .ln\"),r=R(\"#pvB .ln\"),w=l(\"#pvAturn\"),c=l(\"#pvBturn\"),j=l(\"#pvChg\"),h=l(\"#pvChat\"),T=R(\"#pvSite .jn\"),z=l(\"#pvLd\"),C=l(\"#pvTag\"),N=l(\"#pvToast\"),H=l(\"#pvAst\"),V=l(\"#pvBst\"),ft=l(\"#pvFoot\"),jt=R(\".chh,.f,.diff\",j),st=w.innerHTML,ae=C.textContent,m=(vt,Dt,Qt=\"\")=>{vt.className=\"st \"+Qt,vt.querySelector(\"span\").textContent=Dt},S=()=>{gsap.set([...x,...r],{opacity:0}),gsap.set([w,c,j,C,N],{opacity:0,y:8}),gsap.set(jt,{opacity:0}),gsap.set(T,{opacity:0,scale:.6}),gsap.set(h,{opacity:0}),gsap.set(z,{width:0,opacity:0}),w.innerHTML=st,C.textContent=ae,m(H,\"Working\"),m(V,\"Working\"),ft.textContent=\"2 working\"},X=(vt,Dt)=>vt.fromTo(z,{width:\"0%\",opacity:1},{width:\"100%\",duration:.5,ease:\"power2.inOut\"},Dt).to(z,{opacity:0,duration:.25},Dt+.5);S();let B=null,it=()=>{B&&B.kill(),S(),B=gsap.timeline(),x.forEach((vt,Dt)=>B.to(vt,{opacity:1,duration:.3},.2+Dt*.4)),r.forEach((vt,Dt)=>B.to(vt,{opacity:1,duration:.3},.8+Dt*.75)),B.add(()=>m(H,\"Done\"),2).to(w,{opacity:1,y:0,duration:.4},2.05),X(B,2.2),B.add(()=>Nt(\"claude\",l(\".site\",s)),2.15).to(T,{opacity:1,scale:1,duration:.5,ease:\"back.out(2.2)\",stagger:.08},2.65).to(C,{opacity:1,y:0,duration:.4},2.85).to(j,{opacity:1,y:0,duration:.5,ease:\"power3.out\"},3.05).to(jt,{opacity:1,duration:.3,stagger:.12},3.15).add(()=>{m(V,\"Done\"),ft.textContent=\"0 working\"},3.95).to(c,{opacity:1,y:0,duration:.4},4),X(B,4.15),B.to(h,{opacity:1,duration:.4},4.55).to(C,{opacity:0,duration:.3},5.4),Xt(B,l(\"#pvCur\"),l(\"#pvClk\"),d,l(\"#pvUndo\"),6.4,()=>{w.innerHTML='\\u21BAUndid turn 3.The files are back.'}),X(B,6.5),B.to(T,{opacity:0,scale:.7,duration:.35},6.9).to(j,{opacity:.32,duration:.4},6.9).to(N,{opacity:1,y:0,duration:.4},7).add(()=>{C.textContent=\"Undo any turn. Rio's chat stays.\"},7).to(C,{opacity:1,y:0,duration:.4},7.1)};ScrollTrigger.create({trigger:s,start:\"top 62%\",onEnter:it,onEnterBack:it})}function _t(){let s=l(\"#shipDemo\"),d=l(\"#shipTag\"),x=l(\"#pipeFill\"),r=l(\"#pipe\");if(!s)return;let w=[0,1,2,3].map(H=>l(\"#ps\"+H)),c=w.map(H=>l(\".c2\",H)),j=[\"#sh1\",\"#sh2\",\"#sh3\"].map(H=>l(H)),h=H=>{let V=r.getBoundingClientRect(),ft=l(\".node\",w[H]).getBoundingClientRect();return ft.top+ft.height/2-(V.top+22)},T=()=>{j.forEach(H=>H.classList.remove(\"on\")),w.forEach((H,V)=>{H.classList.toggle(\"on\",V===0),H.classList.remove(\"ok\")}),gsap.set(c.slice(1),{opacity:.28}),gsap.set(x,{height:0}),gsap.set(d,{opacity:0})},z=(H,V,ft)=>{H.to(x,{height:()=>h(V),duration:.6,ease:\"power2.inOut\"},ft-.5).add(()=>{w[V-1].classList.remove(\"on\"),w[V-1].classList.add(\"ok\"),w[V].classList.add(\"on\")},ft).to(c[V],{opacity:1,duration:.5},ft)};T();let C=null,N=()=>{C&&C.kill(),T(),C=gsap.timeline(),C.to(d,{opacity:1,duration:.4},.3),Xt(C,l(\"#sCur\"),l(\"#sClk\"),s,l(\"#bAppr\"),1.6,()=>Nt(\"claude\",c[0])),C.to(d,{opacity:0,duration:.3},2.1),z(C,1,2.4),C.add(()=>j[0].classList.add(\"on\"),2.8).add(()=>j[1].classList.add(\"on\"),3.4),z(C,2,4),C.add(()=>j[2].classList.add(\"on\"),4.5),z(C,3,5.1),C.add(()=>{w[3].classList.remove(\"on\"),w[3].classList.add(\"ok\")},5.7)};ScrollTrigger.create({trigger:s,start:\"top 60%\",onEnter:N,onEnterBack:N})}function pe(){let s=l(\"#phScr\"),d=[\".sys\",\".rep\",\".ok\",\".live2\"].map(N=>l(N,s)),x=l(\"#phTap\"),r=l(\"#phAppr\"),w=l(\"#pmPane\"),c=l(\"#pmSt\"),j=l(\"#pmLive\"),h=l(\"#pmTag\"),T=()=>{gsap.set(d,{opacity:0,y:10}),gsap.set(h,{opacity:0}),gsap.set(j,{opacity:0}),w.classList.add(\"nu\"),c.className=\"st q\",c.querySelector(\"span\").textContent=\"Needs you\"};T();let z=null,C=()=>{z&&z.kill(),T(),z=gsap.timeline(),d.slice(0,3).forEach((N,H)=>z.to(N,{opacity:1,y:0,duration:.5,ease:\"power3.out\"},.3+H*.6)),z.add(()=>{let N=s.getBoundingClientRect(),H=r.getBoundingClientRect();gsap.set(x,{left:H.left-N.left+H.width/2,top:H.top-N.top+H.height/2})},2).fromTo(x,{opacity:0,scale:.4},{opacity:1,scale:1,duration:.25},2.3).to(x,{opacity:0,scale:1.5,duration:.5},2.55).to(h,{opacity:1,duration:.4},2.4).to(d[2],{opacity:.45,duration:.4},2.7).add(()=>Nt(\"claude\",w),2.45).add(()=>{w.classList.remove(\"nu\"),c.className=\"st\",c.querySelector(\"span\").textContent=\"Working\"},3.2).to(j,{opacity:1,duration:.4},3.5).to(d[3],{opacity:1,y:0,duration:.5,ease:\"power3.out\"},3.8)};ScrollTrigger.create({trigger:\"#pm\",start:\"top 64%\",onEnter:C,onEnterBack:C})}function Pe(){Promise.resolve().then(()=>(rn(),sn)).then(s=>s.initVoice({gsap,ScrollTrigger})).catch(s=>console.warn(\"voice off\",s))}function Le(){let s=l(\"#bwStage\");s&&Promise.resolve().then(()=>(Vn(),Jn)).then(d=>{let x=l(\"#bwList\"),r=()=>R(\".bw-n\",x),w=d.mountBrainHalo(s,{reduced:b,onWrite:c=>{let j=r().find(h=>h.dataset.note===c.title);for(j||(j=r()[r().length-1].cloneNode(!0),j.dataset.note=c.title,j.querySelector(\"span\").textContent=c.title,j.querySelector(\"i\").style.setProperty(\"--c\",d.SAMPLE.SECTION_HEX[c.section])),j.querySelector(\"time\").textContent=\"now\",r().forEach(h=>{h!==j&&h.querySelector(\"time\").textContent===\"now\"&&(h.querySelector(\"time\").textContent=\"1m\")}),x.prepend(j),j.classList.remove(\"new\"),j.offsetWidth,j.classList.add(\"new\");r().length>24;)r()[r().length-1].remove()},onSelect:c=>r().forEach(j=>j.classList.toggle(\"sel\",!!c&&j.dataset.note===c.title))});w&&(s.classList.add(\"gl\"),x.addEventListener(\"click\",c=>{let j=c.target.closest(\".bw-n\");j&&w.select(j.dataset.note)}),l(\"#bwReset\")?.addEventListener(\"click\",()=>w.reset()))}).catch(d=>console.warn(\"brain halo off\",d))}function Ye(){l(\"#limPanes\")?.classList.add(\"open\");let s=l(\"#limSt\");s&&(s.className=\"st lim\",s.querySelector(\"span\").textContent=\"Limit reached\"),R(\".shield .ck\").forEach(x=>x.classList.add(\"on\")),R(\".pst\").forEach(x=>{x.classList.remove(\"on\"),x.classList.add(\"ok\")});let d=l(\"#pmLive\");d&&(d.style.opacity=\"1\")}function ie(){if(!et)return;let s=l(\"#cursor\"),d=gsap.quickTo(s,\"x\",{duration:.22,ease:\"power3\"}),x=gsap.quickTo(s,\"y\",{duration:.22,ease:\"power3\"});addEventListener(\"mousemove\",r=>{s.style.opacity=1,d(r.clientX),x(r.clientY),P&&P.pointer(r.clientX/innerWidth*2-1,r.clientY/innerHeight*2-1)},{passive:!0}),R(\"a,button,summary\").forEach(r=>{r.addEventListener(\"mouseenter\",()=>s.classList.add(\"big\")),r.addEventListener(\"mouseleave\",()=>s.classList.remove(\"big\"))}),R(\".mag\").forEach(r=>{let w=gsap.quickTo(r,\"x\",{duration:.45,ease:\"power3\"}),c=gsap.quickTo(r,\"y\",{duration:.45,ease:\"power3\"});r.addEventListener(\"mousemove\",j=>{let h=r.getBoundingClientRect();w((j.clientX-h.left-h.width/2)*.3),c((j.clientY-h.top-h.height/2)*.35)}),r.addEventListener(\"mouseleave\",()=>{w(0),c(0)})})}function We(){R(\".qa details\").forEach(s=>{let d=s.querySelector(\"summary\"),x=s.querySelector(\".ans\");d.addEventListener(\"click\",r=>{if(!(b||!x.animate))if(r.preventDefault(),s.open){let w=x.offsetHeight;x.animate([{height:w+\"px\",opacity:1},{height:\"0px\",opacity:0}],{duration:320,easing:\"cubic-bezier(.3,.7,.2,1)\"}).onfinish=()=>{s.open=!1}}else{s.open=!0;let w=x.offsetHeight;x.animate([{height:\"0px\",opacity:0},{height:w+\"px\",opacity:1}],{duration:420,easing:\"cubic-bezier(.3,.7,.2,1)\"})}})})}function ue(){let s=R(\".tgl button\"),d=l(\"#mPrice\"),x=l(\"#mPer\"),r=l(\"#mSub\"),w=l(\"#mYr\");s.forEach(c=>c.addEventListener(\"click\",()=>{s.forEach(j=>j.classList.toggle(\"on\",j===c)),c.dataset.bill===\"y\"?(d.textContent=\"$12\",x.textContent=\"/ month, billed $144 a year\",r.textContent=\"Pay for the year and it works out to $12 a month.\",w.textContent=\"Or pay monthly: $15 a month.\"):(d.textContent=\"$15\",x.textContent=\"/ month\",r.textContent=\"Keep $15 a month for as long as you stay subscribed.\",w.textContent=\"Or pay yearly: $12 a month, billed $144 a year.\")}))}function k(){let s=l(\"#gl\"),d;try{d=new f.WebGLRenderer({canvas:s,antialias:!0,powerPreference:\"high-performance\"})}catch{return null}let x=Math.min(devicePixelRatio||1,A?1.25:1.6);d.setPixelRatio(x),d.setClearColor(328966,1);let r=new f.PerspectiveCamera(38,innerWidth/innerHeight,.1,400);r.position.set(0,0,10);let w=new f.Scene;w.fog=new f.FogExp2(328966,.018);let c={uTime:{value:0},uPixel:{value:x},uDim:{value:1}},j={value:-10},h={value:-1},T=`attribute vec3 aColor; attribute float aSize; attribute float aPhase; attribute float aFlash;\n uniform float uTime, uPixel, uCenterZ, uCut, uK;\n varying vec3 vC; varying float vA;\n void main(){\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n float front = step(uCenterZ, mv.z);\n float keep = uCut < -0.5 ? 1.0 : (uCut > 0.5 ? front : 1.0 - front);\n float tw = 0.72 + 0.28 * sin(uTime * 1.4 + aPhase * 6.2831);\n vC = aColor; vA = keep * tw * (1.0 + aFlash * 2.2);\n gl_PointSize = aSize * uK * uPixel * (1.0 + aFlash * 1.4) * (10.0 / max(0.5, -mv.z));\n gl_Position = projectionMatrix * mv;\n }`,z=`uniform float uDim, uA; varying vec3 vC; varying float vA;\n void main(){\n vec2 c = gl_PointCoord - 0.5; float d = length(c);\n if (d > 0.5 || vA < 0.004) discard;\n float a = smoothstep(0.5, 0.0, d); a = a * a * (0.6 + 0.4 * smoothstep(0.22, 0.0, d));\n float k = a * vA * uDim * uA;\n gl_FragColor = vec4(vC * k, k);\n }`,C=(p,u=1,D=1)=>new f.ShaderMaterial({uniforms:{uTime:c.uTime,uPixel:c.uPixel,uDim:c.uDim,uCenterZ:j,uCut:p,uA:{value:u},uK:{value:D}},vertexShader:T,fragmentShader:z,transparent:!0,depthWrite:!1,depthTest:!1,blending:f.AdditiveBlending}),N=(()=>{let p=7;return()=>(p=p*16807%2147483647)/2147483647})(),H=()=>{let p=0,u=0;for(;!p;)p=N();for(;!u;)u=N();return Math.sqrt(-2*Math.log(p))*Math.cos(2*Math.PI*u)},V=p=>new f.Color(p),ft=(p,u)=>{let D=new Float32Array(p*3),L=new Float32Array(p*3),O=new Float32Array(p),ct=new Float32Array(p),kt=new Float32Array(p);for(let Wt=0;Wt{let u=N()*Math.PI*2,D=1+H()*.014,L=H()*.007,O=.62+N()*.38;return{p:[Math.cos(u)*D,L,Math.sin(u)*D],c:[.8*O,.86*O,.95*O],s:1.6+N()*1.8}}),S=Math.round(760*jt),X=ft(S,p=>{let u=p/S*Math.PI*2,D=1+H()*.01;return{p:[Math.cos(u)*D,0,Math.sin(u)*D],c:[.6,.68,.86],s:26+N()*22}}),B=[[\"profile\",\"#ffe3a3\",8],[\"decisions\",\"#ffb870\",34],[\"knowledge\",\"#8fe3ff\",50],[\"projects\",\"#5aa8ff\",22],[\"journal\",\"#b9c6d8\",26],[\"inbox\",\"#ff8a6a\",10]],it=B.reduce((p,u)=>p+u[2],0),vt=[];B.forEach(([,,p],u)=>{for(let D=0;D{p!==u&&(re.push([p,u]),Qt[p]++,Qt[u]++)};Dt.forEach(p=>{let u=6+Math.floor(N()*8);for(let D=0;D{let u=p/it*Math.PI*2-Math.PI/2,D=V(B[vt[p]][1]);return{p:[Math.cos(u),0,Math.sin(u)],c:[D.r,D.g,D.b],s:4.5+Math.min(15,Qt[p])*.75}}),He=Math.round(4600*jt),na=ft(He,p=>{let u=N()*Math.PI*2,D=N()<.07,L=D?Math.sqrt(N())*.96:1+H()*.1,O=H()*(D?.035:.06),ct=(D?.3:.45)+N()*.4;return{p:[Math.cos(u)*L,O,Math.sin(u)*L],c:[ct*.86,ct*.9,ct],s:D?1.2+N()*1.4:1.5+N()*2.2}}),fe=he.attributes.position.array,ne=28,xe=re.map(([p,u],D)=>{let L=[fe[p*3],0,fe[p*3+2]],O=[fe[u*3],0,fe[u*3+2]],ct=Math.hypot(L[0]-O[0],L[2]-O[2]),kt=(D%2?1:-1)*(.088+.1*ct);return{x:p,y:u,A:L,B:O,M:[(L[0]+O[0])*.32,kt,(L[2]+O[2])*.32],heat:0,t:N()}}),oa=(p,u,D)=>{let L=1-u;for(let O=0;O<3;O++)D[O]=L*L*p.A[O]+2*L*u*p.M[O]+u*u*p.B[O];return D},Ne=[],I=[],Y=[],Q=[],q=[0,0,0],Zt=[0,0,0];xe.forEach(p=>{for(let u=0;u clamp((uReveal - vT * 0.6) / 0.4, 0.0, 1.0)) discard;\n float a = min(0.85, uOp + vH * 0.5 * step(0.001, uOp));\n vec3 c = mix(vec3(0.561, 0.89, 1.0), vec3(0.914, 0.98, 1.0), vH);\n gl_FragColor = vec4(c * a, a);\n }`,transparent:!0,depthWrite:!1,depthTest:!1,blending:f.AdditiveBlending}),we=Math.min(80,xe.length),je=Array.from({length:we},(p,u)=>Math.floor(u*xe.length/we)),ge=je.map((p,u)=>u*.618%1),Bt=je.map(()=>0),Me=ft(we,()=>({p:[0,0,0],c:[.914,.98,1],s:0})),Ln=new f.Group,Nn=[],In=0;B.forEach(([,p,u])=>{let D=[];for(let O=0;O<=48;O++){let ct=(In+u*O/48)/it*Math.PI*2-Math.PI/2;D.push(new f.Vector3(Math.cos(ct)*1.076,0,Math.sin(ct)*1.076))}let L=new f.LineBasicMaterial({color:new f.Color(p),transparent:!0,opacity:0,depthWrite:!1,depthTest:!1,blending:f.AdditiveBlending});Ln.add(new f.Line(new f.BufferGeometry().setFromPoints(D),L)),Nn.push(L),In+=u});let Mo=[[X,.26],[na,1],[m,2.1],[he,1.25]].map(([p,u])=>{let D=C(h,u,1);return st.add(new f.Points(p,D)),[D,u]}),xo=new f.LineSegments(xt,De);st.add(xo);let wo=C({value:-1},1,1);st.add(new f.Points(Me,wo)),st.add(Ln);let ma=40,sa=pt.length,fa=ma+2,Ge=ft(sa*fa,p=>({p:[0,0,0],c:[1,1,1],s:1})),Ma=pt.map(p=>V(p.col)),xa=pt.map((p,u)=>u/sa*Math.PI*2+.6),jo=[.13,.13,.13,.13],Xe=pt.map(()=>1),bo=pt.map(()=>[]);st.add(new f.Points(Ge,C(h,1,1)));let kn=12,_e=30,Ue=ft(kn*_e,()=>({p:[0,0,0],c:[1,1,1],s:0})),vn=C({value:-1},1,1);vn.uniforms.uDim={value:1},st.add(new f.Points(Ue,vn));let Tn=Array.from({length:kn},()=>({on:!1,t:0,a:new f.Vector3,b:new f.Vector3,c:new f.Color,toAgent:-1,toNote:-1,fromAgent:-1,toEl:null,onHit:null,startA:0,dur:1.2})),Lo=Math.round(1600*jt),No=ft(Lo,()=>{let p=N()*2-1,u=N()*Math.PI*2,D=18+N()*50,L=Math.sqrt(1-p*p),O=.4+N()*.4;return{p:[L*Math.cos(u)*D,p*D*.6,L*Math.sin(u)*D-10],c:[O,O,O*1.05],s:.7+N()*1.1}}),Ha=new f.Points(No,C({value:-1},.8,1));w.add(Ha);let Ga={hero:{track:1,tilt:.3,dim:1,boost:1,chips:1,labels:0,spin:.05,lines:.09},band:{fx:.5,fy:.55,fr:.62,tilt:.24,dim:.55,spin:.08},side:{fx:.5,fy:.62,fr:.62,tilt:.18,dim:.4,spin:.06},how:{fx:.18,fy:.6,fr:.44,tilt:.6,dim:.34,spin:.045},talk:{fx:.5,fy:.58,fr:.32,tilt:1.12,dim:.62,spin:.05},brain:{fx:.5,fy:.42,fr:.36,tilt:1.12,dim:1,chips:1,labels:1,spin:.02,lines:.22},brainwin:{fx:.5,fy:.16,fr:.62,tilt:.3,dim:.34,spin:.04},limit:{fx:.8,fy:.5,fr:.28,tilt:.78,dim:.58,spin:.05,limit:1},ship:{fx:.24,fy:.42,fr:.3,tilt:.5,dim:.34,spin:.04},explain:{fx:.8,fy:.6,fr:.3,tilt:.62,dim:.3,spin:.04},phone:{fx:.5,fy:.56,fr:.58,tilt:.22,dim:.3,spin:.05},voice:{fx:.5,fy:.62,fr:.2,tilt:1.38,dim:.56,spin:.16},explore:{fx:.5,fy:.95,fr:.72,tilt:.2,dim:.22,spin:.04},proof:{fx:.5,fy:.95,fr:.72,tilt:.2,dim:.2,spin:.04},pricing:{fx:.5,fy:1,fr:.78,tilt:.18,dim:.16,spin:.04},faq:{fx:.5,fy:1,fr:.78,tilt:.18,dim:.12,spin:.04},close:{fx:.5,fy:.5,fr:.44,tilt:.32,dim:1,chips:1,spin:.06,lines:.09}},rt={x:0,y:-2,R:3,tilt:.34,dim:0,boost:1,chips:0,labels:0,limit:0,lines:0,flow:.5},Ua=\"\",ia=0,Sn=0,Dn=performance.now(),wa=Dn,Ie=E?0:1,Cn=!0,ye={x:0,y:0,sx:0,sy:0},En=R(\"[data-world]\").map(p=>({el:p,name:p.dataset.world,top:0,h:0})),ja=()=>En.forEach(p=>{let u=p.el.parentElement&&p.el.parentElement.classList.contains(\"pin-spacer\")?p.el.parentElement:p.el,D=J(u);p.top=D.top,p.h=u.offsetHeight});ja(),addEventListener(\"resize\",ja),window.ScrollTrigger&&ScrollTrigger.addEventListener(\"refresh\",ja),document.fonts&&document.fonts.ready.then(ja);let Io=l(\"#heroWin\"),ko=l(\"#h1\"),An=l(\"#brainIntro\"),Qa=[],ra=()=>{Qa=[];let p=u=>{u.width>4&&Qa.push({l:u.left,r:u.right,t:u.top+scrollY,b:u.bottom+scrollY})};[\"#h1\",\"#slogan\",\".hero .status\",\".hero .top .sub\",\".hero .top .fine\"].forEach(u=>{let D=l(u);if(!D)return;let L=document.createRange();L.selectNodeContents(D),[...L.getClientRects()].forEach(p)}),R(\".hero .top .ctas .btn\").forEach(u=>p(u.getBoundingClientRect()))};ra(),addEventListener(\"resize\",ra),window.ScrollTrigger&&ScrollTrigger.addEventListener(\"refresh\",ra),document.fonts&&document.fonts.ready.then(ra),window.__measureAvoid=ra;let qe=l(\"#brainIntro .txt\"),vo=l(\"#chipsB\"),To=l(\"#labels\"),So=pt.map(p=>{let u=document.createElement(\"span\");return u.className=\"chip\",u.style.setProperty(\"--c\",p.col),u.innerHTML=(p.logo?`\"\"`:\"\")+p.name,vo.appendChild(u),u}),zn=[[24,\"Decision \\xB7 Claude Code\",\"The last spot is claimed in one step\"],[60,\"Knowledge \\xB7 Codex\",\"Maps use MapLibre with free tiles\"],[104,\"Project \\xB7 Grok\",\"The app opens on /map after sign-in\"],[38,\"Decision \\xB7 You\",\"Deploys wait for a yes\"],[84,\"Knowledge \\xB7 Cursor\",\"Buttons use the Rally green\"],[4,\"Profile \\xB7 You\",\"Marcus checks every change on a phone first\"]].map(([p,u,D])=>{let L=document.createElement(\"div\");return L.className=\"nlab\",L.innerHTML=`${u}${D}`,To.appendChild(L),{n:p,el:L,line:L.querySelector(\".l\"),txt:L.querySelector(\".t\"),tw:0,th:0}}),On=()=>zn.forEach(p=>{p.tw=p.txt.offsetWidth,p.th=p.txt.offsetHeight});On(),document.fonts&&document.fonts.ready.then(On);let la=new f.Vector3,ba=new f.Vector3,Zn=()=>r.position.z*Math.tan(f.MathUtils.degToRad(r.fov/2)),Ba=(p,u)=>{let D=Zn(),L=D*r.aspect;return{x:(p/innerWidth*2-1)*L,y:-(u/innerHeight*2-1)*D}},Pn=()=>innerHeight/(2*Zn()),ca=(p,u)=>(la.copy(p).applyMatrix4(st.matrixWorld),ba.copy(la).applyMatrix4(r.matrixWorldInverse),la.project(r),u.x=(la.x*.5+.5)*innerWidth,u.y=(-la.y*.5+.5)*innerHeight,u.front=ba.z>j.value,u);function Do(){let p=G(),u=scrollY+innerHeight*.5,D=\"hero\";for(let O of En)O.top<=u&&O.top+O.h>=u&&(D=O.name);let L={...Ga[D]||Ga.hero};if(D===\"hero\"){let O=Io.getBoundingClientRect();if(O.bottom<-40)Object.assign(L,Ga.band),L.track=0;else{let ct=lt((innerHeight*.62-O.top)/(innerHeight*.75),0,1),kt=Tt(ct),Rt=ko.getBoundingClientRect(),Wt=O.top+O.height*(p?.22:.1),ee=O.top+O.height*.86,Ae=Ba(dt(innerWidth/2,O.left+O.width/2,kt),dt(Wt,ee,kt));L.x=Ae.x,L.y=Ae.y,L.R=O.width*dt(p?.5:.64,p?.56:.62,kt)/Pn(),L.tilt=dt(p?.6:.56,.3,kt),L.boost=dt(p?2.4:3,1.5,kt)}}if(D===\"brain\"&&An){let O=An.getBoundingClientRect(),ct=lt(-O.top/Math.max(1,O.height-innerHeight),0,1);if(L.fr=dt(.19,.235,Tt(ct)),L.tilt=dt(1.32,1.02,Tt(ct)),L.labels=ct>.06?1:0,L.fy=dt(.47,.45,ct),L.fx=.665,p)L.fx=.5,L.fy=.27,L.fr=.25;else if(qe){let kt=qe.getBoundingClientRect(),Rt=L.fr*innerWidth,Wt=innerWidth-70-(kt.right+40);2*Rt>Wt&&(Rt=Math.max(160,Wt/2)),L.fr=Rt/innerWidth,L.fx=(kt.right+40+Rt)/innerWidth}}if(p&&D===\"close\"&&(L.fy=1.12,L.fr=.5),L.x===void 0){let O=p?Math.min(.95,L.fr*1.7):L.fr,ct=p?.5:L.fx,kt=Ba(ct*innerWidth,L.fy*innerHeight);L.x=kt.x,L.y=kt.y,L.R=O*innerWidth/Pn()}return L.name=D,L}function La(p,u,D=-1,L=null,O=null){let ct=Tn.find(kt=>!kt.on);if(!ct){O&&O();return}if(ct.on=!0,ct.t=0,ct.fromAgent=p,ct.toNote=u,ct.toAgent=D,ct.toEl=L,ct.onHit=O,ct.dur=L?.75:D>=0?1.3:1+N()*.5,L){let kt=L.getBoundingClientRect(),Rt=xa[p],Wt=-1e9;for(let ee=0;ee<48;ee++){let Ae=xa[p]+(ee%2?1:-1)*Math.ceil(ee/2)*.13;if(ca($t.set(Math.cos(Ae)*1.07,.012,Math.sin(Ae)*1.07),wt),wt.x<24||wt.x>innerWidth-24||wt.y<96||wt.y>innerHeight-24)continue;let Ke=Math.hypot(Math.max(kt.left-wt.x,0,wt.x-kt.right),Math.max(kt.top-wt.y,0,wt.y-kt.bottom)),ta=Ke<50?-1e6:-Math.abs(Ke-240)-ee*4;ta>Wt&&(Wt=ta,Rt=Ae)}ct.startA=Rt}ct.c.copy(Ma[p])}let Na=(p,u)=>{let D=xa[p];return u.set(Math.cos(D)*1.07,.012,Math.sin(D)*1.07),u},Yn=(p,u)=>u.set(fe[p*3],fe[p*3+1],fe[p*3+2]),Co=p=>{for(let u of xe)(u.x===p||u.y===p)&&(u.heat=1)},Ra=0,$t=new f.Vector3,Ce=new f.Vector3,Ee=new f.Vector3,Ia=new f.Vector3,wt={x:0,y:0,front:!0},Ja={x:0,y:0,front:!0};function Va(p){let u=Math.min(.05,(p-wa)/1e3);wa=p;let D=(p-Dn)/1e3;c.uTime.value=D;let L=Do(),O=E?1-Math.exp(-u*2.6):1;rt.x=dt(rt.x,L.x,O),rt.y=dt(rt.y,L.y,O),rt.R=dt(rt.R,L.R,O),rt.tilt=dt(rt.tilt,L.tilt,O),rt.dim=dt(rt.dim,L.dim*Ie,E?1-Math.exp(-u*2):1),rt.chips=dt(rt.chips,(L.chips||0)*Ie,O),rt.labels=dt(rt.labels,L.labels||0,E?1-Math.exp(-u*4):1),rt.limit=dt(rt.limit,L.limit||0,O),rt.boost=dt(rt.boost,L.boost||1,O),Sn+=(L.spin||.05)*u*(E?1:0),E&&(ye.sx=dt(ye.sx,ye.x,1-Math.exp(-u*3)),ye.sy=dt(ye.sy,ye.y,1-Math.exp(-u*3))),st.position.set(rt.x,rt.y,0),st.scale.setScalar(rt.R),st.rotation.set(rt.tilt+ye.sy*.06,Sn+ye.sx*.12,0),st.updateMatrixWorld(!0),Ha.rotation.y=D*.006+ye.sx*.03,Ha.rotation.x=ye.sy*.02,r.updateMatrixWorld(),ba.copy(st.position).applyMatrix4(r.matrixWorldInverse),j.value=ba.z,c.uDim.value=rt.dim,Mo.forEach(([M,Pt])=>{M.uniforms.uA.value=Pt*rt.boost}),rt.lines=dt(rt.lines,(L.lines??.05)*Ie,E?1-Math.exp(-u*2.4):1),L.name!==Ua&&((L.name===\"brain\"||!Ua)&&(ia=0),Ua=L.name),ia=E?Math.min(1,ia+u/1.9):1,De.uniforms.uOp.value=rt.lines*rt.dim,De.uniforms.uReveal.value=Tt(ia);let ct=lt(rt.lines/.22,0,1)*Tt(ia);Nn.forEach(M=>{M.opacity=.55*rt.dim*ct});let kt=!1,Rt=xt.attributes.aH.array;xe.forEach((M,Pt)=>{M.heat<=0&&!M.was||(M.heat=Math.max(0,M.heat-u*.6),M.was=M.heat>0,kt=!0,Rt.fill(M.heat,Pt*ne*2,(Pt+1)*ne*2))}),kt&&(xt.attributes.aH.needsUpdate=!0);let Wt=Me.attributes.position.array,ee=Me.attributes.aColor.array,Ae=Me.attributes.aSize.array;for(let M=0;Mma&&Pt.pop();let bt=M===0?1-rt.limit*.78:M===1?1+rt.limit*.6:1;Xe[M]=dt(Xe[M],bt,O);for(let Mt=0;Mt.5&&Ra<=0){Ra=(L.name===\"brain\"?.32:.95)+N()*.5;let M=rt.limit>.5?N()<.8?1:2+Math.floor(N()*2):Math.floor(N()*sa);La(M,N()<.55?Dt[Math.floor(N()*Dt.length)]:Math.floor(N()*it))}let Xa=Ue.attributes.position.array,_a=Ue.attributes.aColor.array,qa=Ue.attributes.aSize.array,ka=he.attributes.aFlash.array;for(let M=0;M{if(M.on){if(M.t+=u/M.dur,M.toEl){$t.set(Math.cos(M.startA)*1.07,.012,Math.sin(M.startA)*1.07),ca($t,wt);let bt=M.toEl.getBoundingClientRect(),Mt=Ba(lt(wt.x,bt.left,bt.right),lt(wt.y,bt.top,bt.bottom));st.worldToLocal(Ce.set(Mt.x,Mt.y,0)),Ee.copy($t).add(Ce).multiplyScalar(.5),Ee.y+=.12}else Na(M.fromAgent,$t),M.toAgent>=0?Na(M.toAgent,Ce):Yn(M.toNote,Ce),Ee.copy($t).add(Ce).multiplyScalar(M.toAgent>=0?.15:.3),Ee.y+=M.toAgent>=0?.35:.12;M.t>=1&&(M.on=!1,M.toNote>=0&&M.toAgent<0&&(ka[M.toNote]=1,Co(M.toNote)),M.onHit&&M.onHit(),M.onHit=null,M.toEl=null)}for(let bt=0;bt<_e;bt++){let Mt=Pt*_e+bt;if(!M.on){qa[Mt]=0;continue}let Lt=M.t-bt*(M.toEl?.026:.014);if(Lt<0||Lt>1){qa[Mt]=0;continue}let Ot=1-Lt;Ia.set(Ot*Ot*$t.x+2*Ot*Lt*Ee.x+Lt*Lt*Ce.x,Ot*Ot*$t.y+2*Ot*Lt*Ee.y+Lt*Lt*Ce.y,Ot*Ot*$t.z+2*Ot*Lt*Ee.z+Lt*Lt*Ce.z),Xa[Mt*3]=Ia.x,Xa[Mt*3+1]=Ia.y,Xa[Mt*3+2]=Ia.z;let qt=Math.pow(1-bt/_e,2)*(M.toEl?1.5:rt.dim);_a[Mt*3]=M.c.r*qt,_a[Mt*3+1]=M.c.g*qt,_a[Mt*3+2]=M.c.b*qt,qa[Mt]=M.toEl?bt===0?22:11*Math.pow(1-bt/_e,1.4)+2.4:bt===0?10:6*Math.pow(1-bt/_e,2)+1.4}}),Ue.attributes.position.needsUpdate=!0,Ue.attributes.aColor.needsUpdate=!0,Ue.attributes.aSize.needsUpdate=!0,he.attributes.aFlash.needsUpdate=!0,d.render(w,r);let Un=rt.chips,da=L.name===\"brain\"&&qe?qe.getBoundingClientRect():null;So.forEach((M,Pt)=>{if(Un<.02){M.style.opacity!==\"0\"&&(M.style.opacity=\"0\");return}Na(Pt,$t),ca($t,wt);let bt=wt.front?1:.55,Mt=Un*bt*(Pt===0?lt(Xe[0],.3,1):1);if(da&&wt.x>da.left-40&&wt.xda.top-30&&wt.ywt.x+60>ze.l&&wt.x-60ze.t&&Qe-48qt)&&(Mt*=lt(1-(Ft.02&&qe?qe.getBoundingClientRect():null;zn.forEach((M,Pt)=>{if(va<.02||G()&&Pt%2){M.el.style.opacity!==\"0\"&&(M.el.style.opacity=\"0\");return}Yn(M.n,$t),ca($t,wt);let bt=wt.x-Ja.x,Mt=wt.y-Ja.y,Lt=Math.hypot(bt,Mt)||1;bt/=Lt,Mt/=Lt;let Ot=46+Pt%3*16,qt=bt*Ot,Ft=Mt*Ot-12;M.el.style.opacity=(va*(wt.front?1:.72)).toFixed(3),M.el.style.transform=`translate3d(${wt.x.toFixed(1)}px,${wt.y.toFixed(1)}px,0)`,M.line.style.width=Math.hypot(qt,Ft).toFixed(1)+\"px\",M.line.style.transform=`rotate(${Math.atan2(Ft,qt)}rad)`;let Qe=M.tw,ze=M.th;M.txt.style.transform=`translate(${(qt+(bt<0?-Qe:0)).toFixed(1)}px,${(Ft-ze/2).toFixed(1)}px)`;let Ta=wt.x+qt+(bt<0?-Qe:0),Ka=wt.y+Ft-ze/2;(Ka<84||Ta<8||Ta+Qe>innerWidth-8||pa&&Tapa.left-20&&Ka+ze>pa.top-20&&Ka{Wn(),E||Fa.renderOnce()});let Hn=0,$a=!0,Gn=p=>{Hn=requestAnimationFrame(Gn),!(!Cn||!$a)&&Va(p)};document.addEventListener(\"visibilitychange\",()=>{$a=!document.hidden,wa=performance.now()});let Fa={renderOnce(){wa=performance.now(),Ie=1,Va(performance.now()),s.classList.add(\"on\"),e.classList.add(\"gl-on\")},ignite(){gsap.to({v:0},{v:1,duration:2.2,ease:\"power2.out\",onUpdate(){Ie=this.targets()[0].v}})},pointer(p,u){ye.x=p,ye.y=u},fire(p,u){let D=pt.findIndex(O=>O.key===p),L=pt.findIndex(O=>O.key===u);La(D,-1,L)},thread(p,u,D){La(pt.findIndex(L=>L.key===p),-1,-1,u,D)},pulse(p){for(let u=0;u<4;u++)setTimeout(()=>La(p%sa,Math.floor(N()*it)),u*120)}};return E&&(gsap.ticker.add(()=>{Cn&&$a&&Va(performance.now())},!1,!0),requestAnimationFrame(()=>{s.classList.add(\"on\"),setTimeout(()=>e.classList.add(\"gl-on\"),1100)}),(o!==null||i)&&(Ie=1)),d.compile(w,r),window.__world=Fa,Fa}E||(e.classList.add(\"nofx\"),l(\"#pre\")?.remove(),A?W():ot(),Ye()),window.__fx=!0;let f=null;try{f=await Promise.race([t(),new Promise((s,d)=>setTimeout(()=>d(new Error(\"three timeout\")),5e3))])}catch(s){console.warn(\"three off\",s)}let P=null;try{f&&!n.has(\"nogl\")&&(P=k())}catch(s){console.warn(\"webgl off\",s)}E?oe():(P&&P.renderOnce(),addEventListener(\"scroll\",()=>P&&P.renderOnce(),{passive:!0}),window.__ready=!0,St(),Le());function St(){Promise.resolve().then(()=>(rn(),sn)).then(s=>s.initVoice({})).catch(s=>console.warn(\"voice off\",s))}Promise.resolve().then(()=>(fo(),mo)).then(s=>{s.initExplore({lenis:It}),window.__exploreReady=!0}).catch(s=>console.warn(\"explore off\",s))})();})();\n\n;function __pandoLegacyPage(){\n(function(){\n'use strict';\nvar RM = matchMedia('(prefers-re","count":1},{"id":"V9-JS-OUT","target":"js","find":"imeout(settle, 60); }); else setTimeout(settle, 400);\n})();\n","replace":"imeout(settle, 60); }); else setTimeout(settle, 400);\n})();\n\n}\n","count":1},{"id":"V9-CSS-IN","target":"css","find":"#root { max-width: none !important; }","replace":"#root { max-width: none !important; background: #050506 !important; }\n@media not all {","count":1},{"id":"V9-CSS-OUT","target":"css","find":"@media (prefers-reduced-motion: reduce) {\n .pando-static-page #workspaces .panes.pando-stagger > .pane { opacity: 1; transform: none; transition: none; }\n }\n ","replace":"@media (prefers-reduced-motion: reduce) {\n .pando-static-page #workspaces .panes.pando-stagger > .pane { opacity: 1; transform: none; transition: none; }\n }\n \n}\n","count":1}]}