sparse-neural-constellation.../exploration.html

73 lines
No EOL
73 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sparse Neural Constellations — exploration</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: #0a0a0f; color: #3a3a4a; font-family: ui-monospace, monospace; overflow: hidden; }
#grid { padding: 20px; font-size: 12px; line-height: 1.4; white-space: pre; }
.c { display: inline-block; transition: all 0.3s; }
.c.active { color: #fde68a; text-shadow: 0 0 6px rgba(253,230,138,0.5); }
.c.strong { color: #34d399; text-shadow: 0 0 10px rgba(52,211,153,0.6); font-weight: bold; }
.c.dead { color: #1a1a2a; }
#info { position: fixed; bottom: 10px; left: 20px; color: #3a3a4a; font-size: 11px; }
#controls { position: fixed; top: 10px; right: 20px; color: #666; font-size: 11px; }
#controls span { cursor: pointer; margin-left: 12px; color: #fde68a; }
</style>
</head>
<body>
<div id="grid"></div>
<div id="info">neurameba · physarum exploration</div>
<div id="controls"><span id="play-btn">play</span><span id="reset-btn">reset</span></div>
<script>
const text = "# API Reference\n\nmotd is API-first. Every feature is an endpoint. Build clients, bots, integrations — whatever you want.\n\n## Base URL\n\n```\nhttps://motd.social/api\n```\n\nLocal dev: `http://localhost:3006/api`\n\n## Response Format\n\nEvery endpoint returns the same envelope:\n\n**Success:**\n```json\n{ \"ok\": true, \"data\": { ... } }\n```\n\n**Error:**\n```json\n{ \"ok\": false, \"error\": \"Something went wrong.\" }\n```\n\nHTTP status codes are standard: 200 success, 400 bad request, 401 unauthorized, 404 not found, 409 conflict.\n\n## Authentication\n\nMost endpoints require authentication. Get a token by registering or logging in, then send it as a Bearer token or let the browser handle it via cookies.\n\n**Header auth (for scripts and clients):**\n```\nAuthorization: Bearer <token>\n```\n\n**Cookie auth (for the web client):**\nThe login endpoints set an `motd_session` httpOnly cookie automatically.\n\nSessions expire after 7 days. Use `/login-permanently` in the web client to persist across tabs (stored in localStorage instead of sessionStorage — the token is the same).\n\n---\n\n## Auth\n\n### POST /api/auth/register\n\nCreate a new account.\n\n**Auth:** none\n\n**Body:**\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2pwd\" }\n```\n\n**Rules:**\n- Username: 3-20 characters, letters, numbers, underscore only\n- Password: minimum 8 characters\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"token\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"alice\"\n }\n }\n}\n```\n\n**Errors:**\n- `400` — username or password missing, invalid format\n- `409` — username taken\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\"username\":\"alice\",\"password\":\"hunter2pwd\"}'\n```\n\n### POST /api/auth/login\n\nLog in to an existing account.\n\n**Auth:** none\n\n**Body:**\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2pwd\" }\n```\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"token\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\"\n }\n }\n}\n```\n\n**Errors:**\n- `400` — missing fields\n- `401` — invalid username or password\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/login \\\n -H \"Content-Type: application/json\" \\\n -d '{\"username\":\"alice\",\"password\":\"hunter2pwd\"}'\n```\n\n### GET /api/auth/me\n\nGet the current authenticated user.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"bio\": \"building things\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\"\n }\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/auth/me \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### POST /api/auth/logout\n\nEnd the current session.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Logged out.\" } }\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/logout \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Profile\n\n### GET /api/profile/:username\n\nView a user's profile.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"bio\": \"building things\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\",\n \"posts\": 42,\n \"avatar\": [\n \"████ ████\",\n \" ████████ \",\n \"████████████\",\n \" ████████ \",\n \"██ ████ ██\"\n ]\n }\n}\n```\n\n**Errors:**\n- `404` — user not found\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/profile/alice\n```\n\n### PUT /api/profile\n\nUpdate your display name and/or bio.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"display_name\": \"Alice W.\", \"bio\": \"shipping code\" }\n```\n\nBoth fields are optional. Send only what you want to change.\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice W.\",\n \"bio\": \"shipping code\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\"\n }\n}\n```\n\n**Errors:**\n- `400` — nothing to update\n\n**Example:**\n```bash\ncurl -X PUT http://localhost:3006/api/profile \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"bio\":\"shipping code\"}'\n```\n\n### GET /api/profile/search?q=\n\nSearch users by username or display name.\n\n**Auth:** none\n\n**Params:**\n- `q` — search query (required, min 1 character)\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"users\": [\n { \"username\": \"alice\", \"display_name\": \"Alice\", \"bio\": \"building things\" },\n { \"username\": \"alice2\", \"display_name\": \"Alice Too\", \"bio\": null }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl \"http://localhost:3006/api/profile/search?q=alice\"\n```\n\n---\n\n## Posts\n\n### POST /api/posts\n\nPublish a post.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"content\": \"just shipped the wasm compiler [rust] [wasm]\" }\n```\n\n**Optional fields:**\n- `reply_to` — post ID to reply to\n\n**Inline commands:**\n- `/attach <media_id>` — attach previously uploaded media to the post. The `/attach` command is stripped from the displayed content.\n\n**Rules:**\n- Content: 1-500 characters\n- Tags use [brackets]: `[rust]`, `[music]`, `[coding]`\n- Tags are auto-extracted and stored\n- New tags are auto-assigned to the \"general\" category\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n}\n```\n\n**Errors:**\n- `400` — empty content, too long, media not found/not yours\n- `404` — reply_to post not found\n\n**Examples:**\n\nSimple post:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"just shipped the wasm compiler [rust] [wasm]\"}'\n```\n\nReply to a post:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"nice work!\",\"reply_to\":\"a3kf9x\"}'\n```\n\nPost with media attachment:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"screenshot of the new UI /attach x7km2p [showcase]\"}'\n```\n\n### GET /api/posts/feed\n\nGet the chronological feed. Public — works without auth. Authenticated users get kill-filtered results; guests get unfiltered posts (still subject to system-level filter_score suppression).\n\n**Auth:** optional\n\n**Params:**\n- `limit` — max posts to return (default 50, max 100)\n- `offset` — pagination offset (default 0)\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n ]\n }\n}\n```\n\n**Examples:**\n```bash\n# Guest (unfiltered)\ncurl \"http://localhost:3006/api/posts/feed?limit=20\"\n\n# Authenticated (kill-filtered)\ncurl \"http://localhost:3006/api/posts/feed?limit=20\" \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### GET /api/posts/:id\n\nGet a single post by ID.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/posts/a3kf9x\n```\n\n### GET /api/posts/:id/thread\n\nGet a post and all its replies.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"post\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n },\n \"replies\": [\n {\n \"id\": \"b7xm2k\",\n \"content\": \"nice work!\",\n \"reply_to\": \"a3kf9x\",\n \"tags\": [],\n \"username\": \"bob\",\n \"display_name\": \"Bob\",\n \"created_at\": \"2026-03-22T14:05:00.000Z\"\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/posts/a3kf9x/thread\n```\n\n### GET /api/posts/search\n\nSearch posts by content. Searches active posts by default, or archived posts with the `archive` flag.\n\n**Auth:** none\n\n**Params:**\n- `q` — search query (required)\n- `archive` — set to `true` to search archived posts instead\n\n**Response (active):**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\",\n \"archived\": false\n }\n ]\n }\n}\n```\n\n**Response (archive):**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"b7xm2k\",\n \"content\": \"old post about [rust]\",\n \"tags\": [\"rust\"],\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2025-12-01T08:00:00.000Z\",\n \"archived\": true\n }\n ]\n }\n}\n```\n\n**Examples:**\n```bash\n# Search active posts\ncurl \"http://localhost:3006/api/posts/search?q=rust\"\n\n# Search archived posts\ncurl \"http://localhost:3006/api/posts/search?q=rust&archive=true\"\n```\n\n---\n\n## Filter (Kill)\n\nThe `/kill` command maps to the filter API. The word \"kill\" never appears in the database or API.\n\n### POST /api/filter\n\nAdd a filter. Hides a user or post from your feed.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"bob\" }\n```\n\n- `target_type` — `\"user\"` or `\"post\"`\n- `target_id` — username (for users) or post ID (for posts)\n\nFiltering a user also increments their hidden `filter_score`. Users filtered by enough people get suppressed from everyone's feed silently (threshold: ~5 active filters, with 7-day half-life decay).\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Filtered.\" } }\n```\n\n**Errors:**\n- `400` — missing fields, invalid type, can't filter yourself\n- `404` — user not found\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/filter \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"spammer\"}'\n```\n\n### GET /api/filter\n\nGet your current filter list.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"filters\": [\n { \"type\": \"user\", \"id\": \"uuid-of-filtered-user\" },\n { \"type\": \"post\", \"id\": \"b7xm2k\" }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/filter \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Media\n\nSupported formats: PNG (max 5MB), MP3 (max 10MB), MP4 (max 25MB).\n\nPNG uploads are processed into multiple variants: original (downscaled to max 1MB), thumbnail (80px wide), large (800px wide), and ASCII art.\n\n### POST /api/media/upload\n\nUpload a file.\n\n**Auth:** required\n\n**Body:** multipart/form-data with `file` field\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"media_id\": \"x7km2p\",\n \"type\": \"png\"\n }\n}\n```\n\n**Errors:**\n- `400` — no file, unsupported type, file too large\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/media/upload \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -F \"file=@screenshot.png\"\n```\n\n### GET /api/media/:id\n\nServe the original file.\n\n**Auth:** none\n\n**Response:** raw file with appropriate Content-Type header (`image/png`, `audio/mpeg`, `video/mp4`)\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p -o image.png\n```\n\n### GET /api/media/:id/thumb\n\nServe the thumbnail (PNG only, max 80px wide).\n\n**Auth:** none\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/thumb -o thumb.png\n```\n\n### GET /api/media/:id/large\n\nServe the large version (PNG only, max 800px wide).\n\n**Auth:** none\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/large -o large.png\n```\n\n### GET /api/media/:id/ascii\n\nGet the ASCII art representation (PNG only).\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"ascii\": \" @@@@ \\n @ @ \\n @ @ \\n @@@@ \\n\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/ascii\n```\n\n---\n\n## Avatar\n\n### POST /api/avatar\n\nUpload a profile picture. PNG only, max 5MB. Processes into thumb, large, and ASCII art versions. Sets as your avatar immediately.\n\n**Auth:** required\n\n**Body:** multipart/form-data with `file` field\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"avatar_id\": \"x7km2p\" } }\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/avatar \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -F \"file=@photo.png\"\n```\n\n### GET /api/avatar/:username\n\nGet a user's avatar image (large version, 800px max).\n\n**Auth:** none\n\n**Response:** raw PNG with `Content-Type: image/png`\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/avatar/alice -o avatar.png\n```\n\nReturns 404 if the user has no uploaded avatar.\n\n---\n\n## Bookmarks\n\nBookmarks are private. Nobody sees your bookmarks. No counts, no notifications. One concept for everything: users, tags, posts, docs.\n\n### POST /api/bookmarks\n\nAdd a bookmark.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"alice\" }\n```\n\n- `target_type` — `\"user\"`, `\"tag\"`, `\"post\"`, or `\"doc\"`\n- `target_id` — username, tag name, post ID, or doc name\n\nBookmarking the same thing twice is a no-op, not an error.\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Bookmarked.\" } }\n```\n\n**Errors:**\n- `400` — missing fields, invalid type\n\n**Example:**\n```bash\n# Bookmark a user\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"alice\"}'\n\n# Bookmark a tag\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"tag\",\"target_id\":\"rust\"}'\n\n# Bookmark a post\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"post\",\"target_id\":\"a3kf9x\"}'\n\n# Bookmark a doc\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"doc\",\"target_id\":\"api\"}'\n```\n\n### DELETE /api/bookmarks\n\nRemove a bookmark.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"alice\" }\n```\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Unbookmarked.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"alice\"}'\n```\n\n### GET /api/bookmarks\n\nList your bookmarks. Optionally filter by type.\n\n**Auth:** required\n\n**Params:**\n- `type` — optional: `user`, `tag`, `post`, or `doc`\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"bookmarks\": [\n { \"type\": \"user\", \"id\": \"alice\" },\n { \"type\": \"tag\", \"id\": \"rust\" },\n {\n \"type\": \"post\",\n \"id\": \"a3kf9x\",\n \"preview\": \"just shipped the wasm compiler...\",\n \"username\": \"alice\"\n },\n {\n \"type\": \"post\",\n \"id\": \"old123\",\n \"preview\": \"this was archived...\",\n \"archived\": true\n },\n {\n \"type\": \"post\",\n \"id\": \"gone99\",\n \"expired\": true\n },\n { \"type\": \"doc\", \"id\": \"api\" }\n ]\n }\n}\n```\n\nPost bookmarks are enriched with a content preview (60 chars), the author's username, and status flags (`archived`, `expired`) when applicable.\n\n**Examples:**\n```bash\n# All bookmarks\ncurl http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n\n# Only bookmarked tags\ncurl \"http://localhost:3006/api/bookmarks?type=tag\" \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Docs\n\n### GET /api/docs\n\nList all available documentation files.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"docs\": [\n { \"name\": \"about\", \"path\": \"docs/about.md\" },\n { \"name\": \"api\", \"path\": \"docs/api.md\" },\n { \"name\": \"commands\", \"path\": \"docs/commands.md\" },\n { \"name\": \"changelog\", \"path\": \"docs/changelog.md\" }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/docs\n```\n\n### GET /api/docs/:name\n\nGet the contents of a specific document. The `.md` extension is optional.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"name\": \"api\",\n \"content\": \"# API Reference\\n\\n...\"\n }\n}\n```\n\n**Errors:**\n- `400` — path traversal attempt\n- `404` — document not found\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/docs/api\n```\n\n---\n\n## Categories\n\n### GET /api/categories\n\nGet the category tree with tags. Used by `/tree -cat` in the client.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"categories\": [\n {\n \"id\": \"coding\",\n \"name\": \"coding\",\n \"tags\": [\"rust\", \"python\", \"wasm\", \"js\", \"frontend\", \"backend\"]\n },\n {\n \"id\": \"creative\",\n \"name\": \"creative\",\n \"tags\": [\"music\", \"art\", \"writing\", \"gamedev\"]\n },\n {\n \"id\": \"meta\",\n \"name\": \"meta\",\n \"tags\": [\"motd\", \"bugs\", \"ideas\", \"feedback\"]\n },\n {\n \"id\": \"general\",\n \"name\": \"general\",\n \"tags\": [\"offtopic\", \"introductions\", \"showcase\"]\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/categories\n```\n\n---\n\n## Commands\n\n### GET /api/commands\n\nGet the full command list grouped by category. Used by `/help` and `/menu` in the client.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"categories\": [\n {\n \"name\": \"General\",\n \"commands\": [\n { \"command\": \"/help\", \"description\": \"Show all available commands\" },\n { \"command\": \"/menu\", \"description\": \"Toggle the command menu\" },\n { \"command\": \"/clear\", \"description\": \"Clear the terminal\" },\n { \"command\": \"/read [path]\", \"description\": \"Read a document\" },\n { \"command\": \"/tree -cat\", \"description\": \"Browse categories and tags\" },\n { \"command\": \"/link [target]\", \"description\": \"Navigate to user, tag, post, or doc\" }\n ]\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/commands\n```\n\n---\n\n## Telegram Connect\n\n### POST /api/connect/telegram\n\nGenerate a Telegram deep link to connect your account.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"link\": \"https://t.me/motdsocial_bot?start=alice_a8f3k2\",\n \"expires_in\": 600\n }\n}\n```\n\nIf already connected:\n```json\n{\n \"ok\": true,\n \"data\": {\n \"already_connected\": true,\n \"message\": \"Telegram already connected.\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/connect/telegram \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### DELETE /api/connect/telegram\n\nDisconnect your Telegram account.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Telegram disconnected.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/connect/telegram \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### POST /api/connect/email\n\nSend a verification email to connect your email address.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"email\": \"you@gmail.com\" }\n```\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"message\": \"Verification email sent to you@gmail.com\",\n \"tip\": \"Tip: add noreply@motd.social to your contacts so notifications don't go to spam.\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/connect/email \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"you@gmail.com\"}'\n```\n\n### GET /api/connect/email/verify\n\nVerify email address from link in verification email.\n\n**Auth:** none (link from email)\n\n**Params:**\n- `code` — verification code from the email link\n\nReturns an HTML confirmation page on success.\n\n### DELETE /api/connect/email\n\nDisconnect your email address.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Email disconnected.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/connect/email \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### GET /api/connect/status\n\nCheck your Telegram and email connection status and notification settings.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"telegram\": {\n \"connected\": true,\n \"username\": \"alice_tg\",\n \"notify\": true,\n \"notify_bookmarks\": true,\n \"notify_mentions\": true\n },\n \"email\": {\n \"connected\": true,\n \"address\": \"alice@gmail.com\",\n \"notify\": true,\n \"notify_bookmarks\": true,\n \"notify_mentions\": true\n }\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/connect/status \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Account\n\n### DELETE /api/account\n\nPermanently delete your account. This is irreversible. Deletes all posts, media, sessions, and user data.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"confirm_username\": \"alice\" }\n```\n\nThe `confirm_username` must match your actual username.\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Account terminated.\" } }\n```\n\n**Errors:**\n- `400` — username confirmation doesn't match\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/account \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"confirm_username\":\"alice\"}'\n```\n";
const passes = [{"t":0,"r":933,"c":2,"a":"hold","s":0.27828752629922626,"ps":9,"e":100.87630021039381,"pr":1.1},{"t":0,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":9,"e":71.43441108319092,"pr":1.1},{"t":0,"r":167,"c":0,"a":"died","s":0,"ps":8,"e":100,"pr":1},{"t":1,"r":933,"c":2,"a":"hold","s":0.2534190427369841,"ps":9,"e":101.55365255228968,"pr":1.1},{"t":1,"r":1068,"c":36,"a":"extend","s":0.47018144575923293,"ps":9,"e":51.692103854485346,"pr":1.1},{"t":1,"r":1068,"c":37,"a":"hold","s":0.19988872260106244,"ps":5,"e":31.463857387890325,"pr":1.2000000000000002},{"t":2,"r":933,"c":2,"a":"retracted","s":0.2534190427369841,"ps":8,"e":102.38100489418555,"pr":1.05},{"t":2,"r":1068,"c":36,"a":"extend","s":0.47018144575923293,"ps":8,"e":37.97748879439144,"pr":1.05},{"t":2,"r":1068,"c":37,"a":"hold","s":0.19597278269685017,"ps":4,"e":32.431639649465126,"pr":1.1500000000000001},{"t":2,"r":1068,"c":35,"a":"extend","s":0.38188876078083545,"ps":5,"e":17.121208216718284,"pr":1.2000000000000002},{"t":3,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":8,"e":28.12365323926493,"pr":1.05},{"t":3,"r":1068,"c":37,"a":"retracted","s":0.19988872260106244,"ps":4,"e":33.43074943027363,"pr":1.1},{"t":3,"r":1068,"c":35,"a":"extend","s":0.3908753842142372,"ps":5,"e":13.648747903302526,"pr":1.2000000000000002},{"t":3,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":5,"e":7.137588654585028,"pr":1.3000000000000003},{"t":4,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":7,"e":21.330968350676372,"pr":1},{"t":4,"r":1068,"c":35,"a":"hold","s":0.3908753842142372,"ps":4,"e":16.175750977016424,"pr":1.1500000000000001},{"t":4,"r":1068,"c":34,"a":"extend","s":0.45761562523623167,"ps":5,"e":7.033959559532416,"pr":1.3000000000000003},{"t":4,"r":1068,"c":33,"a":"hold","s":0.2708416697526547,"ps":5,"e":4.475699924271964,"pr":1.4000000000000004},{"t":5,"r":1068,"c":36,"a":"extend","s":0.401124774909063,"ps":7,"e":16.44297658496421,"pr":1},{"t":5,"r":1068,"c":35,"a":"hold","s":0.38188876078083545,"ps":4,"e":18.630861063263108,"pr":1.1500000000000001},{"t":5,"r":1068,"c":34,"a":"extend","s":0.45761562523623167,"ps":4,"e":7.066419192995588,"pr":1.2500000000000002},{"t":5,"r":1068,"c":33,"a":"hold","s":0.32921605844623203,"ps":6,"e":6.20942839184182,"pr":1.5000000000000004},{"t":6,"r":1068,"c":36,"a":"extend","s":0.401124774909063,"ps":6,"e":13.1263823489657,"pr":0.95},{"t":6,"r":1068,"c":35,"a":"retracted","s":0.38188876078083545,"ps":4,"e":21.085971149509792,"pr":1.1},{"t":6,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.052719624666455,"pr":1.2500000000000002},{"t":6,"r":1068,"c":33,"a":"extend","s":0.4161055765054919,"ps":6,"e":6.046791102720029,"pr":1.5000000000000004},{"t":6,"r":1068,"c":37,"a":"hold","s":0.2140369448163677,"ps":5,"e":8.009285523515604,"pr":1.1},{"t":7,"r":1068,"c":36,"a":"hold","s":0.3474974071802458,"ps":6,"e":15.006361606407667,"pr":0.95},{"t":7,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.0431299268360625,"pr":1.2000000000000002},{"t":7,"r":1068,"c":33,"a":"extend","s":0.4161055765054919,"ps":5,"e":6.0379450003347745,"pr":1.4500000000000004},{"t":7,"r":1068,"c":37,"a":"hold","s":0.23243998646062303,"ps":5,"e":9.118805415200589,"pr":1.1},{"t":7,"r":1068,"c":32,"a":"hold","s":0.22789577580643453,"ps":5,"e":3.664648107617203,"pr":1.6000000000000005},{"t":8,"r":1068,"c":36,"a":"hold","s":0.3474974071802458,"ps":5,"e":17.036340863849635,"pr":0.8999999999999999},{"t":8,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.036417138354787,"pr":1.1500000000000001},{"t":8,"r":1068,"c":33,"a":"hold","s":0.32921605844623203,"ps":5,"e":7.921673467904631,"pr":1.4500000000000004},{"t":8,"r":1068,"c":37,"a":"retracted","s":0.23243998646062303,"ps":4,"e":10.378325306885573,"pr":1.05},{"t":8,"r":1068,"c":32,"a":"hold","s":0.22889269979020685,"ps":5,"e":4.745789705938858,"pr":1.6000000000000005},{"t":8,"r":1068,"c":35,"a":"hold","s":0.30616962318485597,"ps":5,"e":4.71784123983716,"pr":1.3000000000000003},{"t":9,"r":1068,"c":36,"a":"retracted","s":0.3205297295326896,"ps":5,"e":18.85057870011115,"pr":0.8999999999999999},{"t":9,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.031718186417895,"pr":1.1},{"t":9,"r":1068,"c":33,"a":"hold","s":0.32921605844623203,"ps":4,"e":9.955401935474487,"pr":1.4000000000000004},{"t":9,"r":1068,"c":32,"a":"retracted","s":0.22889269979020685,"ps":4,"e":5.976931304260512,"pr":1.5500000000000005},{"t":9,"r":1068,"c":35,"a":"hold","s":0.32112722191381293,"ps":5,"e":6.536859015147663,"pr":1.3000000000000003},{"t":10,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.02842892006207,"pr":1.05},{"t":10,"r":1068,"c":33,"a":"retracted","s":0.2708416697526547,"ps":5,"e":11.372135293495726,"pr":1.5000000000000004},{"t":10,"r":1068,"c":35,"a":"extend","s":0.32112722191381293,"ps":4,"e":5.9541137533207165,"pr":1.2500000000000002},{"t":16,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.021656915992636,"pr":0.7499999999999998},{"t":16,"r":1068,"c":33,"a":"extend","s":0.26710608780414663,"ps":4,"e":3.4252353001397533,"pr":0.8999999999999999},{"t":16,"r":1068,"c":32,"a":"hold","s":0.176716466821335,"ps":5,"e":2.102165127491006,"pr":1.05},{"t":17,"r":1068,"c":33,"a":"extend","s":0.26710608780414663,"ps":4,"e":3.4734588018010477,"pr":0.8499999999999999},{"t":18,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.021196411104615,"pr":0.6499999999999997},{"t":18,"r":1068,"c":33,"a":"extend","s":0.26710608780414663,"ps":4,"e":3.507215252963954,"pr":0.7999999999999998},{"t":19,"r":1068,"c":35,"a":"extend","s":0.30616962318485597,"ps":4,"e":4.381303740897767,"pr":0.8499999999999999},{"t":20,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":4.869787458998768,"pr":0.95},{"t":22,"r":1068,"c":37,"a":"retracted","s":0.12868908615576316,"ps":4,"e":2.4104341252060952,"pr":1.05},{"t":25,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020790402551954,"pr":0.3},{"t":26,"r":1068,"c":37,"a":"retracted","s":0.1939642630397334,"ps":5,"e":4.895079921303248,"pr":0.9499999999999997},{"t":27,"r":1068,"c":33,"a":"retracted","s":0.2713714610782977,"ps":4,"e":7.3337150611360595,"pr":0.39999999999999963},{"t":27,"r":1068,"c":35,"a":"hold","s":0.2630065682969665,"ps":5,"e":4.04820394505451,"pr":0.7499999999999997},{"t":28,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.38268153960464,"pr":0.5499999999999996},{"t":29,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.410446748575348,"pr":0.4999999999999996},{"t":30,"r":1068,"c":33,"a":"hold","s":0.2028849582706908,"ps":6,"e":4.581382157601336,"pr":0.5},{"t":31,"r":1068,"c":37,"a":"retracted","s":0.23114134164904218,"ps":4,"e":5.579878478896527,"pr":0.5999999999999995},{"t":32,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020756966001806,"pr":0.3},{"t":33,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.45967724060131,"pr":0.3},{"t":34,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.4643437392730165,"pr":0.3},{"t":36,"r":1068,"c":35,"a":"extend","s":0.26038628957311344,"ps":4,"e":3.7354512091378775,"pr":0.30000000000000004},{"t":37,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020754469571225,"pr":0.3},{"t":38,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020754318269401,"pr":0.3},{"t":38,"r":1068,"c":35,"a":"extend","s":0.26038628957311344,"ps":4,"e":3.595248569213599,"pr":0.3},{"t":38,"r":1068,"c":33,"a":"extend","s":0.3332363942827247,"ps":4,"e":4.388799588328808,"pr":0.3},{"t":39,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.473402206499573,"pr":0.3},{"t":39,"r":1068,"c":33,"a":"extend","s":0.3332363942827247,"ps":4,"e":4.518283519813424,"pr":0.3},{"t":41,"r":1068,"c":35,"a":"hold","s":0.26038628957311344,"ps":4,"e":5.00963959223561,"pr":0.3},{"t":42,"r":1068,"c":31,"a":"extend","s":0.33329338210256476,"ps":4,"e":3.9166787791427624,"pr":0.5},{"t":43,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.0207540245668385,"pr":0.3},{"t":43,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.474792846048915,"pr":0.3},{"t":45,"r":1068,"c":33,"a":"hold","s":0.3332363942827247,"ps":4,"e":8.87965378725239,"pr":0.3},{"t":49,"r":1068,"c":33,"a":"hold","s":0.22407089634490676,"ps":5,"e":5.1826075389907444,"pr":0.4},{"t":49,"r":1068,"c":35,"a":"hold","s":0.19480319791689912,"ps":5,"e":3.817320144137014,"pr":0.4},{"t":49,"r":1068,"c":37,"a":"hold","s":0.14094439501090816,"ps":5,"e":3.152623040605293,"pr":0.4},{"t":50,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475196050507514,"pr":0.3},{"t":51,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.0207539686523575,"pr":0.3},{"t":51,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.47520690620736,"pr":0.3},{"t":52,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753967626194,"pr":0.3},{"t":54,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475223547995222,"pr":0.3},{"t":55,"r":1068,"c":33,"a":"extend","s":0.3098350645671488,"ps":4,"e":3.6173995915478065,"pr":0.35000000000000003},{"t":59,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965429,"pr":0.3},{"t":59,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.4752307759515135,"pr":0.3},{"t":59,"r":1068,"c":33,"a":"extend","s":0.3049655349288567,"ps":4,"e":4.130552761789475,"pr":0.3},{"t":61,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.244380295983758,"pr":0.3},{"t":64,"r":1068,"c":33,"a":"hold","s":0.3049655349288567,"ps":4,"e":7.9165254765229935,"pr":0.3},{"t":65,"r":1068,"c":33,"a":"retracted","s":0.3049655349288567,"ps":4,"e":9.756249755953847,"pr":0.3},{"t":66,"r":1068,"c":37,"a":"hold","s":0.17082838308633624,"ps":4,"e":4.180018414554946,"pr":0.35000000000000003},{"t":67,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965243179,"pr":0.3},{"t":67,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.864175604540853,"pr":0.3},{"t":67,"r":1068,"c":37,"a":"retracted","s":0.17353649065691806,"ps":4,"e":4.968310339810291,"pr":0.30000000000000004},{"t":67,"r":1068,"c":30,"a":"hold","s":0.20818297381761558,"ps":5,"e":2.519222187399051,"pr":0.6},{"t":68,"r":1068,"c":30,"a":"hold","s":0.2092711944038461,"ps":4,"e":3.59339174262982,"pr":0.5499999999999999},{"t":69,"r":1068,"c":33,"a":"hold","s":0.20564587537641082,"ps":5,"e":4.643551385177567,"pr":0.4},{"t":71,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.02075396523454,"pr":0.3},{"t":71,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.087271328370552,"pr":0.3},{"t":72,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.093507274908774,"pr":0.3},{"t":72,"r":1068,"c":33,"a":"hold","s":0.30837166866740906,"ps":5,"e":4.325803918640938,"pr":0.4},{"t":73,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232226270102,"pr":0.3},{"t":74,"r":1068,"c":33,"a":"extend","s":0.30837166866740906,"ps":4,"e":4.396438124239444,"pr":0.30000000000000004},{"t":75,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.942052439801836,"pr":0.3},{"t":76,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965232269,"pr":0.3},{"t":77,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232233795819,"pr":0.3},{"t":77,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.04152768502332,"pr":0.3},{"t":78,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.176473506306869,"pr":0.3},{"t":79,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.106859517136637,"pr":0.3},{"t":80,"r":1068,"c":38,"a":"hold","s":0.13330780739323678,"ps":5,"e":1.456136067179457,"pr":0.45000000000000007},{"t":81,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.4752322356027445,"pr":0.3},{"t":81,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.1074706499809075,"pr":0.3},{"t":81,"r":1068,"c":38,"a":"hold","s":0.22564948667735252,"ps":5,"e":2.511331960598277,"pr":0.45000000000000007},{"t":82,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231865,"pr":0.3},{"t":82,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.107646800036021,"pr":0.3},{"t":83,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231849,"pr":0.3},{"t":83,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946541884379729,"pr":0.3},{"t":84,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9466242763782615,"pr":0.3},{"t":84,"r":1068,"c":33,"a":"extend","s":0.30837166866740906,"ps":4,"e":4.357405766106836,"pr":0.3},{"t":84,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.454302527136043,"pr":0.3},{"t":86,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.107959131698744,"pr":0.3},{"t":88,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236126647,"pr":0.3},{"t":88,"r":1068,"c":37,"a":"hold","s":0.15618392932983258,"ps":5,"e":3.2745709643985874,"pr":0.4},{"t":89,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946784213254051,"pr":0.3},{"t":90,"r":1068,"c":33,"a":"hold","s":0.2512404575055255,"ps":5,"e":3.877648217685986,"pr":0.4},{"t":91,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236157537,"pr":0.3},{"t":93,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946808766474736,"pr":0.3},{"t":95,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.4906145972672835,"pr":0.3},{"t":95,"r":1068,"c":30,"a":"hold","s":0.1749477164360471,"ps":4,"e":4.207230454672406,"pr":0.35000000000000003},{"t":96,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":96,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236170954,"pr":0.3},{"t":97,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":97,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946814661703022,"pr":0.3},{"t":97,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108055865503771,"pr":0.3},{"t":100,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468158854784035,"pr":0.3},{"t":101,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":102,"r":1068,"c":38,"a":"hold","s":0.1909263965354337,"ps":5,"e":2.123489009643345,"pr":0.55},{"t":103,"r":1068,"c":33,"a":"extend","s":0.3011097188288201,"ps":4,"e":4.253484378169861,"pr":0.3},{"t":103,"r":1068,"c":30,"a":"hold","s":0.1537104869996813,"ps":5,"e":3.2616639383259027,"pr":0.4},{"t":104,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946816370975803,"pr":0.3},{"t":104,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057656131074,"pr":0.3},{"t":105,"r":1068,"c":37,"a":"retracted","s":0.19877868275899077,"ps":4,"e":5.972317307717494,"pr":0.4},{"t":106,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":106,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.4752322361735875,"pr":0.3},{"t":106,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491332605540927,"pr":0.3},{"t":107,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":107,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491336950669193,"pr":0.3},{"t":107,"r":1068,"c":33,"a":"retracted","s":0.3011097188288201,"ps":4,"e":9.670286742051978,"pr":0.3},{"t":107,"r":1068,"c":37,"a":"hold","s":0.10079089388938331,"ps":5,"e":2.831426680903747,"pr":0.4},{"t":108,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946816487543728,"pr":0.3},{"t":108,"r":1068,"c":37,"a":"hold","s":0.10442788286201563,"ps":4,"e":3.0668497437998723,"pr":0.35000000000000003},{"t":109,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173639,"pr":0.3},{"t":109,"r":1068,"c":33,"a":"hold","s":0.2242052363652177,"ps":5,"e":4.052536447449661,"pr":0.4},{"t":109,"r":1068,"c":30,"a":"hold","s":0.18807016945668736,"ps":5,"e":3.536564209478776,"pr":0.4},{"t":110,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173648,"pr":0.3},{"t":110,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057797925067,"pr":0.3},{"t":111,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173652,"pr":0.3},{"t":112,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946816515531687,"pr":0.3},{"t":112,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.4913453853018295,"pr":0.3},{"t":112,"r":1068,"c":37,"a":"hold","s":0.15105406486278897,"ps":5,"e":2.8460446885661117,"pr":0.4},{"t":113,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":113,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.4752322361736585,"pr":0.3},{"t":113,"r":1068,"c":37,"a":"retracted","s":0.15105406486278897,"ps":4,"e":3.4544772074684236,"pr":0.35000000000000003},{"t":114,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165200416925,"pr":0.3},{"t":115,"r":1068,"c":30,"a":"hold","s":0.15489269956231153,"ps":4,"e":3.897447417960215,"pr":0.35000000000000003},{"t":116,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":116,"r":1068,"c":33,"a":"hold","s":0.18909874180587188,"ps":4,"e":6.0756051361970025,"pr":0.35000000000000003},{"t":117,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":117,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057815274278,"pr":0.3},{"t":118,"r":1068,"c":33,"a":"extend","s":0.29094317274268683,"ps":4,"e":4.406271471526198,"pr":0.4},{"t":119,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":119,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946816523646564,"pr":0.3},{"t":119,"r":1068,"c":33,"a":"hold","s":0.16883276274009612,"ps":5,"e":5.006933573446966,"pr":0.5},{"t":120,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491346991069608,"pr":0.3},{"t":121,"r":1068,"c":33,"a":"extend","s":0.2628457445250093,"ps":4,"e":4.168188938867101,"pr":0.45},{"t":122,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":123,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816648106,"pr":0.3},{"t":124,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.10805781670306,"pr":0.3},{"t":124,"r":1068,"c":33,"a":"retracted","s":0.16883276274009612,"ps":4,"e":6.420175244629408,"pr":0.35000000000000003},{"t":126,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":126,"r":1068,"c":30,"a":"retracted","s":0.07727669863061744,"ps":4,"e":3.2762499505348623,"pr":0.35000000000000003},{"t":127,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":128,"r":1068,"c":30,"a":"hold","s":0.13678209768894878,"ps":5,"e":3.126262673459578,"pr":0.4},{"t":129,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":131,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816820727,"pr":0.3},{"t":131,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.4913470873594425,"pr":0.3},{"t":132,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":132,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243677795,"pr":0.3},{"t":132,"r":1068,"c":33,"a":"hold","s":0.34388747038244727,"ps":5,"e":7.7148008986734595,"pr":0.5},{"t":134,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816827666,"pr":0.3},{"t":134,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347088635581,"pr":0.3},{"t":135,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":135,"r":1068,"c":37,"a":"retracted","s":0.2145363760195417,"ps":4,"e":5.3780715834467445,"pr":0.35000000000000003},{"t":137,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":137,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":137,"r":1068,"c":37,"a":"hold","s":0.2311870458583502,"ps":5,"e":3.874595896655514,"pr":0.4},{"t":138,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":138,"r":1068,"c":30,"a":"hold","s":0.13362140967941158,"ps":5,"e":3.10097717275242,"pr":0.4},{"t":139,"r":1068,"c":33,"a":"extend","s":0.2715957990836731,"ps":4,"e":3.5509034391856478,"pr":0.35000000000000003},{"t":139,"r":1068,"c":30,"a":"hold","s":0.19249071462085368,"ps":5,"e":3.890902889719249,"pr":0.4},{"t":140,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":140,"r":1068,"c":33,"a":"extend","s":0.21367839040175574,"ps":4,"e":3.262231393679785,"pr":0.35000000000000003},{"t":141,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946816524374549,"pr":0.3},{"t":142,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":142,"r":1068,"c":33,"a":"extend","s":0.21367839040175574,"ps":4,"e":2.918711659527809,"pr":0.3},{"t":143,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.49134708927493,"pr":0.3},{"t":143,"r":1068,"c":37,"a":"extend","s":0.2311870458583502,"ps":4,"e":3.2906827959322715,"pr":0.3},{"t":144,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":144,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089282995,"pr":0.3},{"t":145,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.946816524374768,"pr":0.3},{"t":145,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.1080578168312165,"pr":0.3},{"t":145,"r":1068,"c":37,"a":"hold","s":0.2311870458583502,"ps":4,"e":4.427621780826152,"pr":0.3},{"t":145,"r":1068,"c":33,"a":"hold","s":0.21367839040175574,"ps":4,"e":5.03855139434739,"pr":0.3},{"t":148,"r":1068,"c":30,"a":"hold","s":0.16458478735158472,"ps":5,"e":4.191579963719631,"pr":0.4},{"t":149,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":149,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831272,"pr":0.3},{"t":155,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":155,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301442,"pr":0.3},{"t":156,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":156,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":157,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":157,"r":1068,"c":30,"a":"hold","s":0.15008103394664626,"ps":5,"e":3.232654166988122,"pr":0.4},{"t":158,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":158,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301687,"pr":0.3},{"t":159,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":159,"r":1068,"c":30,"a":"retracted","s":0.1027484699582476,"ps":4,"e":3.5266296863200837,"pr":0.35000000000000003},{"t":160,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":160,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":160,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":161,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":162,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":163,"r":1068,"c":37,"a":"extend","s":0.27377527361323134,"ps":4,"e":3.6345956600856555,"pr":0.30000000000000004},{"t":164,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":164,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301799,"pr":0.3},{"t":165,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":165,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301804,"pr":0.3},{"t":166,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":166,"r":1068,"c":39,"a":"extend","s":0.2710521509421219,"ps":5,"e":1.7038242394606593,"pr":0.5},{"t":167,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":167,"r":1068,"c":30,"a":"retracted","s":0.2075316410433938,"ps":4,"e":5.82084970795089,"pr":0.30000000000000004},{"t":168,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":169,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":169,"r":1068,"c":39,"a":"hold","s":0.2710521509421219,"ps":4,"e":5.593519242119668,"pr":0.45},{"t":170,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":170,"r":1068,"c":33,"a":"retracted","s":0.31133726344408863,"ps":4,"e":10.115162853789453,"pr":0.3},{"t":171,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":171,"r":1068,"c":30,"a":"retracted","s":0.26301895423577976,"ps":4,"e":7.329396131645137,"pr":0.30000000000000004},{"t":172,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":173,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":173,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":173,"r":1068,"c":30,"a":"hold","s":0.22224534144509955,"ps":5,"e":3.8099686269758597,"pr":0.4},{"t":175,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":175,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":175,"r":1068,"c":30,"a":"retracted","s":0.262059762967171,"ps":4,"e":6.652924834450595,"pr":0.35000000000000003},{"t":176,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":177,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":177,"r":1068,"c":33,"a":"extend","s":0.44496147253754303,"ps":5,"e":5.414972647283675,"pr":0.4},{"t":177,"r":1068,"c":33,"a":"hold","s":0.1897088324337255,"ps":5,"e":3.301320929328406,"pr":0.4},{"t":178,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":178,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":179,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":179,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":179,"r":1068,"c":33,"a":"extend","s":0.3333861091971233,"ps":4,"e":5.550547781020059,"pr":0.35000000000000003},{"t":180,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":180,"r":1068,"c":33,"a":"extend","s":0.3333861091971233,"ps":4,"e":5.332345658217932,"pr":0.30000000000000004},{"t":181,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":181,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":181,"r":1068,"c":33,"a":"extend","s":0.3333861091971233,"ps":4,"e":5.179604172256442,"pr":0.3},{"t":182,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":183,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":183,"r":1068,"c":30,"a":"extend","s":0.24820370087379642,"ps":5,"e":2.8964952293484516,"pr":0.45},{"t":184,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":185,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":186,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":186,"r":1068,"c":30,"a":"hold","s":0.17794341779880476,"ps":5,"e":3.4669016414782385,"pr":0.5},{"t":187,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":187,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":187,"r":1068,"c":37,"a":"hold","s":0.2343944684884169,"ps":4,"e":4.133268971161012,"pr":0.35000000000000003},{"t":187,"r":1068,"c":38,"a":"hold","s":0.21488396483777897,"ps":5,"e":2.1939773858109506,"pr":0.45000000000000007},{"t":188,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":188,"r":1068,"c":30,"a":"retracted","s":0.14378114765905634,"ps":4,"e":4.41740000402314,"pr":0.45},{"t":188,"r":1068,"c":29,"a":"hold","s":0.19560361058293937,"ps":4,"e":3.625713593427604,"pr":0.5},{"t":190,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":191,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":191,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":192,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":193,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":193,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":194,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":195,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":195,"r":1068,"c":30,"a":"hold","s":0.27324704008651185,"ps":5,"e":5.312381713876329,"pr":0.4},{"t":196,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":197,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":197,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":198,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":198,"r":1068,"c":37,"a":"retracted","s":0.28402459182708695,"ps":4,"e":7.07754254832361,"pr":0.35000000000000003},{"t":199,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":199,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":201,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":201,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":202,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":202,"r":1068,"c":33,"a":"extend","s":0.242980636249501,"ps":4,"e":3.9568182076893743,"pr":0.30000000000000004},{"t":202,"r":1068,"c":30,"a":"retracted","s":0.18539579870183318,"ps":4,"e":5.262062825128844,"pr":0.30000000000000004},{"t":203,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":205,"r":1068,"c":33,"a":"extend","s":0.242980636249501,"ps":4,"e":3.417303168201335,"pr":0.3},{"t":206,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":206,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":207,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":207,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":207,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":207,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":207,"r":1068,"c":29,"a":"hold","s":0.20529884850629124,"ps":5,"e":1.9332190965722875,"pr":0.55},{"t":208,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":209,"r":1068,"c":29,"a":"retracted","s":0.1760536829509186,"ps":4,"e":3.400078023786985,"pr":0.5},{"t":212,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":212,"r":1068,"c":33,"a":"hold","s":0.33940779884722183,"ps":5,"e":4.58300145513404,"pr":0.4},{"t":213,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":213,"r":1068,"c":33,"a":"hold","s":0.3217700866337923,"ps":6,"e":5.946295616756772,"pr":0.5},{"t":213,"r":1068,"c":30,"a":"hold","s":0.2294648116449136,"ps":5,"e":5.259621161899026,"pr":0.4},{"t":214,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":214,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":215,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":216,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":216,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":216,"r":1068,"c":33,"a":"retracted","s":0.33940779884722183,"ps":5,"e":11.58642169586485,"pr":0.5},{"t":216,"r":1068,"c":37,"a":"hold","s":0.1889286163775609,"ps":5,"e":3.5365284608091994,"pr":0.4},{"t":217,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":217,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":219,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":219,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":220,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":220,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":220,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":221,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":221,"r":1068,"c":33,"a":"retracted","s":0.11173938510037523,"ps":4,"e":3.7686016145360046,"pr":0.30000000000000004},{"t":221,"r":1068,"c":33,"a":"retracted","s":0.10661746265168069,"ps":4,"e":3.2525874272661044,"pr":0.30000000000000004},{"t":222,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":223,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":224,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":224,"r":1068,"c":33,"a":"extend","s":0.3257029699476301,"ps":5,"e":3.4228719359252096,"pr":0.4},{"t":225,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":226,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":227,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":228,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":228,"r":1068,"c":30,"a":"hold","s":0.16082872301445716,"ps":4,"e":4.335621296816807,"pr":0.30000000000000004},{"t":231,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":232,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":232,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":232,"r":1068,"c":33,"a":"hold","s":0.30835284762344684,"ps":4,"e":7.996123029825412,"pr":0.3},{"t":233,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":233,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":233,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":233,"r":1068,"c":33,"a":"retracted","s":0.30835284762344684,"ps":4,"e":9.862945810812986,"pr":0.3},{"t":234,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":234,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":234,"r":1068,"c":30,"a":"hold","s":0.13431322881737587,"ps":4,"e":3.5026097185346585,"pr":0.35000000000000003},{"t":234,"r":1068,"c":37,"a":"hold","s":0.2214812224394698,"ps":5,"e":3.7969493093044706,"pr":0.4},{"t":235,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":235,"r":1068,"c":33,"a":"hold","s":0.224435603538705,"ps":5,"e":3.6632238926659055,"pr":0.4},{"t":237,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":237,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":237,"r":1068,"c":33,"a":"retracted","s":0.31572945124625584,"ps":4,"e":7.364895112606,"pr":0.35000000000000003},{"t":238,"r":1068,"c":30,"a":"hold","s":0.1592445590689542,"ps":5,"e":3.8018653196056658,"pr":0.4},{"t":239,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":239,"r":1068,"c":33,"a":"hold","s":0.275218669500557,"ps":5,"e":4.460643912532376,"pr":0.4},{"t":239,"r":1068,"c":33,"a":"hold","s":0.24551782105047382,"ps":5,"e":3.831881632760056,"pr":0.4},{"t":243,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":243,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":244,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":244,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":244,"r":1068,"c":33,"a":"extend","s":0.2575121720632759,"ps":5,"e":3.0232943531238887,"pr":0.4},{"t":246,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":246,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":248,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":248,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":248,"r":1068,"c":33,"a":"extend","s":0.2575121720632759,"ps":4,"e":3.6297118065396883,"pr":0.30000000000000004},{"t":248,"r":1068,"c":30,"a":"retracted","s":0.19242471928000693,"ps":4,"e":4.872027917323377,"pr":0.35000000000000003},{"t":248,"r":1068,"c":37,"a":"extend","s":0.23904473926939562,"ps":5,"e":2.756220210760714,"pr":0.4},{"t":250,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":250,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":250,"r":1068,"c":37,"a":"hold","s":0.2279202354607841,"ps":4,"e":5.05294397813326,"pr":0.35000000000000003},{"t":251,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":251,"r":1068,"c":38,"a":"retracted","s":0.12955762795011794,"ps":4,"e":2.347360938126175,"pr":0.4},{"t":252,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":252,"r":1068,"c":33,"a":"retracted","s":0.2575121720632759,"ps":4,"e":7.943158557650747,"pr":0.3},{"t":252,"r":1068,"c":30,"a":"retracted","s":0.13655940724550278,"ps":4,"e":4.034452358177024,"pr":0.35000000000000003},{"t":253,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":253,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":254,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":254,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":254,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":257,"r":1068,"c":30,"a":"retracted","s":0.10626338972129412,"ps":4,"e":3.341099822351372,"pr":0.35000000000000003},{"t":258,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":258,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":259,"r":1068,"c":33,"a":"hold","s":0.2559767169027933,"ps":5,"e":5.114159821299403,"pr":0.4},{"t":261,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":262,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":262,"r":1068,"c":37,"a":"retracted","s":0.19394340411915373,"ps":4,"e":5.718560927210562,"pr":0.30000000000000004},{"t":262,"r":1068,"c":30,"a":"hold","s":0.2284244918758671,"ps":5,"e":3.859401830422,"pr":0.4},{"t":263,"r":1068,"c":33,"a":"hold","s":0.20710576471070663,"ps":4,"e":4.611982178168292,"pr":0.35000000000000003},{"t":265,"r":1068,"c":30,"a":"extend","s":0.2284244918758671,"ps":4,"e":4.054140739756457,"pr":0.35000000000000003},{"t":266,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":266,"r":1068,"c":33,"a":"extend","s":0.32529882934113524,"ps":4,"e":4.2735182091140285,"pr":0.30000000000000004},{"t":266,"r":1068,"c":30,"a":"extend","s":0.2284244918758671,"ps":4,"e":3.697075672334376,"pr":0.30000000000000004},{"t":267,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":267,"r":1068,"c":33,"a":"extend","s":0.32529882934113524,"ps":4,"e":4.393136190690177,"pr":0.3},{"t":268,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":268,"r":1068,"c":33,"a":"extend","s":0.32529882934113524,"ps":4,"e":4.476868777793481,"pr":0.3},{"t":269,"r":1068,"c":29,"a":"extend","s":0.322492568439255,"ps":4,"e":4.274158470094104,"pr":0.3500000000000001},{"t":269,"r":1068,"c":28,"a":"extend","s":0.3506006011704167,"ps":5,"e":3.178328911576804,"pr":0.5000000000000001},{"t":270,"r":1068,"c":29,"a":"extend","s":0.322492568439255,"ps":4,"e":4.377869312325701,"pr":0.3000000000000001},{"t":271,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":271,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":272,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":272,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":272,"r":1068,"c":29,"a":"extend","s":0.322492568439255,"ps":4,"e":4.5012852145813005,"pr":0.3},{"t":272,"r":1068,"c":37,"a":"retracted","s":0.25813004772568326,"ps":5,"e":5.271983844301948,"pr":0.45},{"t":273,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":273,"r":1068,"c":33,"a":"extend","s":0.32529882934113524,"ps":4,"e":4.639407963900801,"pr":0.3},{"t":273,"r":1068,"c":28,"a":"extend","s":0.32792168948615547,"ps":4,"e":4.394322006255937,"pr":0.35000000000000014},{"t":274,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":275,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":275,"r":1068,"c":33,"a":"hold","s":0.32529882934113524,"ps":4,"e":8.644189233358965,"pr":0.3},{"t":276,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":278,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":278,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":279,"r":1068,"c":33,"a":"hold","s":0.266484683439372,"ps":5,"e":5.23807780679976,"pr":0.4},{"t":280,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":280,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":280,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":281,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":282,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":282,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":283,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":283,"r":1068,"c":37,"a":"retracted","s":0.1872070859868765,"ps":4,"e":5.388785807711773,"pr":0.30000000000000004},{"t":283,"r":1068,"c":30,"a":"retracted","s":0.19647256386953021,"ps":4,"e":5.5822587927934,"pr":0.35000000000000003},{"t":286,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":286,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":286,"r":1068,"c":30,"a":"extend","s":0.26754420606378676,"ps":4,"e":3.8051185083359633,"pr":0.35000000000000003},{"t":287,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":287,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":288,"r":1068,"c":33,"a":"extend","s":0.37502832004022674,"ps":4,"e":4.514320659856303,"pr":0.35000000000000003},{"t":289,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":290,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":290,"r":1068,"c":28,"a":"extend","s":0.2960268345089728,"ps":5,"e":2.0216893821356683,"pr":0.5},{"t":292,"r":1068,"c":30,"a":"hold","s":0.2329405049264667,"ps":4,"e":5.681011506955877,"pr":0.3},{"t":292,"r":1068,"c":29,"a":"extend","s":0.3208044175178673,"ps":4,"e":4.058575199226028,"pr":0.30000000000000004},{"t":292,"r":1068,"c":28,"a":"extend","s":0.2960268345089728,"ps":4,"e":3.0184873040186364,"pr":0.4},{"t":293,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":295,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":295,"r":1068,"c":31,"a":"extend","s":0.42275073692688303,"ps":4,"e":6.491347089301814,"pr":0.3},{"t":295,"r":1068,"c":28,"a":"hold","s":0.2960268345089728,"ps":4,"e":6.887120738206857,"pr":0.3},{"t":296,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":296,"r":1068,"c":32,"a":"extend","s":0.4022173830445333,"ps":4,"e":6.108057816831286,"pr":0.3},{"t":297,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":298,"r":1068,"c":36,"a":"extend","s":0.4218874412235893,"ps":4,"e":6.475232236173662,"pr":0.3},{"t":299,"r":1068,"c":34,"a":"extend","s":0.45111181956599,"ps":4,"e":7.020753965231814,"pr":0.3},{"t":299,"r":1068,"c":35,"a":"extend","s":0.44715088523436625,"ps":4,"e":6.9468165243748325,"pr":0.3},{"t":299,"r":1068,"c":33,"a":"hold","s":0.39756434183642325,"ps":4,"e":11.121422458032454,"pr":0.3}];
const lines = text.split('\n');
const gridEl = document.getElementById('grid');
const charEls = [];
for (let r = 0; r < lines.length; r++) {
const row = [];
for (let c = 0; c < lines[r].length; c++) {
const s = document.createElement('span');
s.className = 'c';
s.textContent = lines[r][c];
row.push(s);
gridEl.appendChild(s);
}
charEls.push(row);
gridEl.appendChild(document.createTextNode('\n'));
}
let tick = -1, playing = false, iv;
function apply(t) {
for (const r of charEls) for (const e of r) e.className = 'c';
const active = new Map();
for (const p of passes) {
if (p.t > t) break;
const k = p.r+','+p.c;
if (p.a === 'died' || p.a === 'retracted') active.set(k, 'dead');
else if (p.ps > 16) active.set(k, 'strong');
else active.set(k, 'active');
}
for (const [k, cls] of active) {
const [r, c] = k.split(',').map(Number);
if (charEls[r]?.[c]) charEls[r][c].className = 'c ' + cls;
}
document.getElementById('info').textContent = 'tick ' + t + ' · ' + [...active.values()].filter(v=>v!=='dead').length + ' alive';
}
function play() {
if (playing) return;
playing = true;
document.getElementById('play-btn').textContent = 'pause';
const max = passes.length > 0 ? passes[passes.length-1].t : 0;
iv = setInterval(() => { tick++; if (tick > max) { pause(); return; } apply(tick); }, 900);
}
function pause() { playing = false; clearInterval(iv); document.getElementById('play-btn').textContent = 'play'; }
function reset() { pause(); tick = -1; for (const r of charEls) for (const e of r) e.className = 'c'; document.getElementById('info').textContent = 'neurameba'; }
document.getElementById('play-btn').addEventListener('click', () => playing ? pause() : play());
document.getElementById('reset-btn').addEventListener('click', reset);
setTimeout(play, 1000);
</script>
</body>
</html>