@epic-web/workshop-app 6.74.0 → 6.74.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/build/client/assets/_exerciseNumber-6IQJMb5M.js +2 -0
  2. package/build/client/assets/{_exerciseNumber-jokuvO2V.js.map → _exerciseNumber-6IQJMb5M.js.map} +1 -1
  3. package/build/client/assets/_exerciseNumber_.finished-D9-WSUZy.js +2 -0
  4. package/build/client/assets/{_exerciseNumber_.finished-BaC--Y5p.js.map → _exerciseNumber_.finished-D9-WSUZy.js.map} +1 -1
  5. package/build/client/assets/_extra-IT1EaIMp.js +2 -0
  6. package/build/client/assets/{_extra-DXypL1sc.js.map → _extra-IT1EaIMp.js.map} +1 -1
  7. package/build/client/assets/{_layout-C9vSX5Ti.js → _layout-BDFC2e7T.js} +2 -2
  8. package/build/client/assets/{_layout-C9vSX5Ti.js.map → _layout-BDFC2e7T.js.map} +1 -1
  9. package/build/client/assets/_layout-CCCrBY2W.js +2 -0
  10. package/build/client/assets/{_layout-_Aw6qzZC.js.map → _layout-CCCrBY2W.js.map} +1 -1
  11. package/build/client/assets/{diff-Dng5ItOr.js → diff-4YyKvzHi.js} +2 -2
  12. package/build/client/assets/{diff-Dng5ItOr.js.map → diff-4YyKvzHi.js.map} +1 -1
  13. package/build/client/assets/diff-8Er9eAl-.js +2 -0
  14. package/build/client/assets/{diff-DfWBhj2O.js.map → diff-8Er9eAl-.js.map} +1 -1
  15. package/build/client/assets/epic-video-BtFzbNqF.js +2 -0
  16. package/build/client/assets/{epic-video-C1_HSISA.js.map → epic-video-BtFzbNqF.js.map} +1 -1
  17. package/build/client/assets/{epic-video-CC0372g5.js → epic-video-DzLohyvt.js} +146 -146
  18. package/build/client/assets/epic-video-DzLohyvt.js.map +1 -0
  19. package/build/client/assets/finished-CzmzTZg6.js +2 -0
  20. package/build/client/assets/{finished-BbEk1NdF.js.map → finished-CzmzTZg6.js.map} +1 -1
  21. package/build/client/assets/index-BN0kldnY.js +2 -0
  22. package/build/client/assets/{index-CFM_ffAh.js.map → index-BN0kldnY.js.map} +1 -1
  23. package/build/client/assets/index-BNsKVnVt.js +2 -0
  24. package/build/client/assets/{index-Pxi8WjFA.js.map → index-BNsKVnVt.js.map} +1 -1
  25. package/build/client/assets/index-Cby_tLUO.js +2 -0
  26. package/build/client/assets/{index-CfU0fdf7.js.map → index-Cby_tLUO.js.map} +1 -1
  27. package/build/client/assets/{index-DroM8fzS.js → index-Dpyv8N6m.js} +2 -2
  28. package/build/client/assets/{index-DroM8fzS.js.map → index-Dpyv8N6m.js.map} +1 -1
  29. package/build/client/assets/{manifest-835c6db1.js → manifest-65ac4702.js} +1 -1
  30. package/build/client/assets/{mdx-vy-1-0a3.js → mdx-8X3W8bVO.js} +2 -2
  31. package/build/client/assets/{mdx-vy-1-0a3.js.map → mdx-8X3W8bVO.js.map} +1 -1
  32. package/build/client/assets/{progress-BcA4i0iU.js → progress-Bby-ybMA.js} +2 -2
  33. package/build/client/assets/progress-Bby-ybMA.js.map +1 -0
  34. package/build/client/assets/root-BwYDIUyI.js.map +1 -1
  35. package/build/client/assets/test-DXylXETz.js +2 -0
  36. package/build/client/assets/{test-Ciw2aKZE.js.map → test-DXylXETz.js.map} +1 -1
  37. package/build/client/assets/{tests-CZ2AhDKA.js → tests-DlPVOsMT.js} +2 -2
  38. package/build/client/assets/{tests-CZ2AhDKA.js.map → tests-DlPVOsMT.js.map} +1 -1
  39. package/build/server/index.js +310 -63
  40. package/build/server/index.js.map +1 -1
  41. package/package.json +3 -3
  42. package/build/client/assets/_exerciseNumber-jokuvO2V.js +0 -2
  43. package/build/client/assets/_exerciseNumber_.finished-BaC--Y5p.js +0 -2
  44. package/build/client/assets/_extra-DXypL1sc.js +0 -2
  45. package/build/client/assets/_layout-_Aw6qzZC.js +0 -2
  46. package/build/client/assets/diff-DfWBhj2O.js +0 -2
  47. package/build/client/assets/epic-video-C1_HSISA.js +0 -2
  48. package/build/client/assets/epic-video-CC0372g5.js.map +0 -1
  49. package/build/client/assets/finished-BbEk1NdF.js +0 -2
  50. package/build/client/assets/index-CFM_ffAh.js +0 -2
  51. package/build/client/assets/index-CfU0fdf7.js +0 -2
  52. package/build/client/assets/index-Pxi8WjFA.js +0 -2
  53. package/build/client/assets/progress-BcA4i0iU.js.map +0 -1
  54. package/build/client/assets/test-Ciw2aKZE.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index-DroM8fzS.js","sources":["../../../app/routes/admin+/index.tsx"],"sourcesContent":["import { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { data, Form, Link, useFetcher, useNavigation } from 'react-router'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport {\n\tuseEpicProgress,\n\ttype SerializedProgress,\n} from '#app/routes/progress.tsx'\nimport { cn, ensureUndeployed, useDoubleCheck } from '#app/utils/misc.tsx'\nimport { getRootMatchLoaderData } from '#app/utils/root-loader.ts'\nimport { type Route } from './+types/index.tsx'\nimport {\n\tclearCaches,\n\tclearData,\n\tgetSidecarLogLines,\n\tisInspectorRunning,\n\trestartSidecar,\n\tstartInspector,\n\tstopInspector,\n} from './admin-utils.server.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport const meta: Route.MetaFunction = ({ matches }) => {\n\tconst rootData = getRootMatchLoaderData(matches)\n\treturn [{ title: `👷 | ${rootData?.workshopTitle}` }]\n}\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tensureUndeployed()\n\tconst timings = makeTimings('adminLoader')\n\tconst apps = (await getApps({ request, timings })).filter(\n\t\t(a, i, ar) => ar.findIndex((b) => a.name === b.name) === i,\n\t)\n\tconst processes: Record<\n\t\tstring,\n\t\t{ port: number; pid?: number; color: string }\n\t> = {}\n\tconst testProcesses: Record<\n\t\tstring,\n\t\t{ pid?: number; exitCode?: number | null }\n\t> = {}\n\tfor (const [\n\t\tname,\n\t\t{ port, process, color },\n\t] of getProcesses().devProcesses.entries()) {\n\t\tprocesses[name] = { port, pid: process.pid, color }\n\t}\n\n\tfor (const [\n\t\tname,\n\t\t{ process, exitCode },\n\t] of getProcesses().testProcesses.entries()) {\n\t\ttestProcesses[name] = { pid: process?.pid, exitCode }\n\t}\n\n\tconst sidecarProcesses: Record<string, { pid?: number; running: boolean }> =\n\t\t{}\n\tfor (const [name, { process }] of getProcesses().sidecarProcesses.entries()) {\n\t\tsidecarProcesses[name] = {\n\t\t\tpid: process.pid,\n\t\t\trunning: process.exitCode === null,\n\t\t}\n\t}\n\n\treturn data(\n\t\t{\n\t\t\tapps,\n\t\t\tprocesses,\n\t\t\ttestProcesses,\n\t\t\tsidecarProcesses,\n\t\t\tinspectorRunning: isInspectorRunning(),\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport async function action({ request }: Route.ActionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tswitch (intent) {\n\t\tcase 'clear-data': {\n\t\t\tawait clearData()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'clear-caches': {\n\t\t\tawait clearCaches()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'inspect': {\n\t\t\tawait startInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'stop-inspect': {\n\t\t\tawait stopInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'restart-sidecar': {\n\t\t\tconst name = formData.get('name')\n\t\t\tif (typeof name !== 'string') {\n\t\t\t\tthrow new Error('Sidecar name is required')\n\t\t\t}\n\t\t\tconst success = await restartSidecar(name)\n\t\t\treturn { success }\n\t\t}\n\t\tcase 'get-sidecar-logs': {\n\t\t\tconst name = formData.get('name')\n\t\t\tif (typeof name !== 'string') {\n\t\t\t\tthrow new Error('Sidecar name is required')\n\t\t\t}\n\t\t\tconst logs = getSidecarLogLines(name, 1000)\n\t\t\treturn { success: true, logs }\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown intent: ${intent}`)\n\t\t}\n\t}\n}\n\nfunction sortProgress(a: SerializedProgress, b: SerializedProgress) {\n\treturn a.type === 'unknown' && b.type === 'unknown'\n\t\t? 0\n\t\t: a.type === 'unknown'\n\t\t\t? -1\n\t\t\t: b.type === 'unknown'\n\t\t\t\t? 1\n\t\t\t\t: 0\n}\n\nfunction linkProgress(progress: SerializedProgress) {\n\tswitch (progress.type) {\n\t\tcase 'workshop-instructions':\n\t\t\treturn '/'\n\t\tcase 'workshop-finished':\n\t\t\treturn '/finished'\n\t\tcase 'instructions':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}`\n\t\tcase 'step':\n\t\t\treturn `/${progress.exerciseNumber\n\t\t\t\t.toString()\n\t\t\t\t.padStart(2, '0')}/${progress.stepNumber.toString().padStart(2, '0')}`\n\t\tcase 'finished':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}/finished`\n\t\tdefault:\n\t\t\treturn ''\n\t}\n}\n\nexport default function AdminLayout({\n\tloaderData: data,\n}: Route.ComponentProps) {\n\tconst navigation = useNavigation()\n\tconst epicProgress = useEpicProgress()\n\n\tconst isStartingInspector = navigation.formData?.get('intent') === 'inspect'\n\tconst isStoppingInspector =\n\t\tnavigation.formData?.get('intent') === 'stop-inspect'\n\n\tconst progressStatus = {\n\t\tcompleted: 'bg-success',\n\t\tincomplete: 'bg-warning',\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-6 p-6\">\n\t\t\t<div className=\"mb-2\">\n\t\t\t\t<h1 className=\"text-foreground text-2xl font-bold\">Admin Panel</h1>\n\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\tManage workshop settings and monitor processes\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid gap-6 md:grid-cols-2\">\n\t\t\t\t{Object.entries(data.sidecarProcesses).length > 0 && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t\t<CardTitle>Sidecar Processes</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>Background sidecar processes</CardDescription>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t{Object.entries(data.sidecarProcesses).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<SidecarProcessItem\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tname={key}\n\t\t\t\t\t\t\t\t\t\tpid={process.pid}\n\t\t\t\t\t\t\t\t\t\trunning={process.running}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Commands</CardTitle>\n\t\t\t\t\t\t<CardDescription>Workshop management actions</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<DoubleCheckAdminButton name=\"intent\" value=\"clear-caches\">\n\t\t\t\t\t\t\t\t\t<Icon name=\"Clear\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tClear local caches\n\t\t\t\t\t\t\t\t</DoubleCheckAdminButton>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<DoubleCheckAdminButton\n\t\t\t\t\t\t\t\t\tname=\"intent\"\n\t\t\t\t\t\t\t\t\tvalue=\"clear-data\"\n\t\t\t\t\t\t\t\t\tclassName=\"border-destructive bg-destructive/80 text-destructive-foreground hover:bg-destructive hover:text-destructive-foreground\"\n\t\t\t\t\t\t\t\t\tdoubleCheckClassName=\"border-destructive bg-destructive text-destructive-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"TriangleAlert\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tClear all local data (including auth data)\n\t\t\t\t\t\t\t\t</DoubleCheckAdminButton>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t{data.inspectorRunning ? (\n\t\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t\t<AdminButton name=\"intent\" value=\"stop-inspect\">\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"Stop\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t{isStoppingInspector\n\t\t\t\t\t\t\t\t\t\t\t? 'Stopping inspector...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Stop inspector'}\n\t\t\t\t\t\t\t\t\t</AdminButton>\n\t\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t\t<AdminButton name=\"intent\" value=\"inspect\">\n\t\t\t\t\t\t\t\t\t\t{isStartingInspector\n\t\t\t\t\t\t\t\t\t\t\t? 'Starting inspector...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Start inspector'}\n\t\t\t\t\t\t\t\t\t</AdminButton>\n\t\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Apps</CardTitle>\n\t\t\t\t\t\t<CardDescription>Available workshop apps</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t{data.apps.length > 0 ? (\n\t\t\t\t\t\t\t\tdata.apps.map((app) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={app.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{data.processes[app.name] ? (\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm\">{app.name}</span>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\tNo apps available\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Processes</CardTitle>\n\t\t\t\t\t\t<CardDescription>Running development processes</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t{Object.entries(data.processes).length > 0 ? (\n\t\t\t\t\t\t\t\tObject.entries(data.processes).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-border bg-muted/30 rounded-md border p-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Port:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{process.port}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{process.pid && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">PID:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.pid}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Color:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"inline-block h-3 w-3 rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ backgroundColor: process.color }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\tNo processes running\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t{Object.entries(data.testProcesses).length > 0 && (\n\t\t\t\t\t<Card className=\"md:col-span-2\">\n\t\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t\t<CardTitle>Test Processes</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>Test execution processes</CardDescription>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{Object.entries(data.testProcesses).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-border bg-muted/30 rounded-md border p-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{process.exitCode === null ||\n\t\t\t\t\t\t\t\t\t\t\tprocess.exitCode === undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t\t) : process.exitCode === 0 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"taken\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{process.pid && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">PID:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.pid}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Exit code:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{process.exitCode === null ||\n\t\t\t\t\t\t\t\t\t\t\t\tprocess.exitCode === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Running'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: process.exitCode}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Progress</CardTitle>\n\t\t\t\t\t\t<CardDescription>EpicWeb.dev lesson progress</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t{epicProgress ? (\n\t\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-72 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{epicProgress.sort(sortProgress).map((progress) => {\n\t\t\t\t\t\t\t\t\tconst status = progress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t\t? 'completed'\n\t\t\t\t\t\t\t\t\t\t: 'incomplete'\n\t\t\t\t\t\t\t\t\tconst label = [\n\t\t\t\t\t\t\t\t\t\tprogress.epicLessonSlug,\n\t\t\t\t\t\t\t\t\t\tprogress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t\t\t? `(${progress.epicCompletedAt})`\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t.join(' ')\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={progress.epicLessonSlug}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'h-3 w-3 shrink-0 rounded-full',\n\t\t\t\t\t\t\t\t\t\t\t\t\tprogressStatus[status],\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={status}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t{progress.type === 'unknown' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex flex-1 items-center gap-2 truncate text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"This video is in the workshop on EpicWeb.dev, but not in the local workshop.\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"Close\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-destructive h-4 w-4 shrink-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={linkProgress(progress)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-foreground flex-1 truncate text-sm hover:underline\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tto={progress.epicLessonUrl}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground shrink-0\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">No progress data</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction SidecarProcessItem({\n\tname,\n\tpid,\n\trunning,\n}: {\n\tname: string\n\tpid?: number\n\trunning: boolean\n}) {\n\tconst restartFetcher = useFetcher()\n\tconst logsFetcher = useFetcher<{ logs?: string }>()\n\tconst [copyStatus, setCopyStatus] = React.useState<'idle' | 'copied'>('idle')\n\tconst [logsOpen, setLogsOpen] = React.useState(false)\n\tconst [displayLogs, setDisplayLogs] = React.useState<string | null>(null)\n\n\tconst isRestarting = restartFetcher.state !== 'idle'\n\tconst isLoadingLogs = logsFetcher.state !== 'idle'\n\n\t// Update display logs when fetcher returns data\n\tReact.useEffect(() => {\n\t\tif (logsFetcher.data) {\n\t\t\tsetDisplayLogs(logsFetcher.data.logs ?? '')\n\t\t}\n\t}, [logsFetcher.data])\n\n\tconst handleCopyLogs = () => {\n\t\tif (!displayLogs) return\n\t\tnavigator.clipboard\n\t\t\t.writeText(displayLogs)\n\t\t\t.then(() => {\n\t\t\t\tsetCopyStatus('copied')\n\t\t\t\tsetTimeout(() => setCopyStatus('idle'), 2000)\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// silently fail\n\t\t\t})\n\t}\n\n\tconst handleToggleLogs = (open: boolean) => {\n\t\tsetLogsOpen(open)\n\t\tif (open) {\n\t\t\t// Fetch logs when opening\n\t\t\tvoid logsFetcher.submit(\n\t\t\t\t{ intent: 'get-sidecar-logs', name },\n\t\t\t\t{ method: 'POST' },\n\t\t\t)\n\t\t}\n\t}\n\n\treturn (\n\t\t<li className=\"border-border bg-muted/30 rounded-md border p-3\">\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{running ? <Pinger status=\"running\" /> : <Pinger status=\"taken\" />}\n\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">{name}</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t<restartFetcher.Form method=\"POST\">\n\t\t\t\t\t\t<input type=\"hidden\" name=\"intent\" value=\"restart-sidecar\" />\n\t\t\t\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t\t\t\t<SimpleTooltip content=\"Restart process\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tdisabled={isRestarting}\n\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted rounded p-1.5 transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"Refresh\"\n\t\t\t\t\t\t\t\t\tclassName={cn('h-4 w-4', isRestarting && 'animate-spin')}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t</restartFetcher.Form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t{pid && (\n\t\t\t\t\t<span>\n\t\t\t\t\t\t<span className=\"font-medium\">PID:</span> {pid}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span>\n\t\t\t\t\t<span className=\"font-medium\">Status:</span>{' '}\n\t\t\t\t\t{isRestarting ? 'Restarting...' : running ? 'Running' : 'Failed'}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<details\n\t\t\t\tclassName=\"mt-3\"\n\t\t\t\topen={logsOpen}\n\t\t\t\tonToggle={(e) => handleToggleLogs(e.currentTarget.open)}\n\t\t\t>\n\t\t\t\t<summary className=\"text-muted-foreground hover:text-foreground cursor-pointer text-xs font-medium\">\n\t\t\t\t\t{isLoadingLogs ? 'Loading logs...' : 'View logs'}\n\t\t\t\t</summary>\n\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t<div className=\"mb-1 flex justify-end\">\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={copyStatus === 'copied' ? 'Copied!' : 'Copy logs'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleCopyLogs}\n\t\t\t\t\t\t\t\tdisabled={!displayLogs}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'text-muted-foreground hover:text-foreground hover:bg-muted rounded p-1 transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t\t\t\t\tcopyStatus === 'copied' && 'text-success',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname={copyStatus === 'copied' ? 'CheckSmall' : 'Copy'}\n\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<pre className=\"scrollbar-thin scrollbar-thumb-scrollbar bg-background max-h-96 overflow-auto rounded border p-2 text-xs\">\n\t\t\t\t\t\t{displayLogs ||\n\t\t\t\t\t\t\t(isLoadingLogs ? 'Loading...' : 'No logs available')}\n\t\t\t\t\t</pre>\n\t\t\t\t</div>\n\t\t\t</details>\n\t\t</li>\n\t)\n}\n\nfunction Card({\n\tchildren,\n\tclassName,\n}: {\n\tchildren: React.ReactNode\n\tclassName?: string\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-border bg-card rounded-lg border p-6 shadow-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nfunction CardHeader({ children }: { children: React.ReactNode }) {\n\treturn <div className=\"mb-4\">{children}</div>\n}\n\nfunction CardTitle({ children }: { children: React.ReactNode }) {\n\treturn <h2 className=\"text-foreground text-lg font-semibold\">{children}</h2>\n}\n\nfunction CardDescription({ children }: { children: React.ReactNode }) {\n\treturn <p className=\"text-muted-foreground mt-1 text-sm\">{children}</p>\n}\n\nfunction CardContent({ children }: { children: React.ReactNode }) {\n\treturn <div>{children}</div>\n}\n\nfunction AdminButton({\n\tchildren,\n\t...props\n}: React.ComponentPropsWithoutRef<'button'>) {\n\treturn (\n\t\t<button\n\t\t\t{...props}\n\t\t\tclassName={cn(\n\t\t\t\t'border-border bg-background text-foreground hover:bg-muted hover:text-foreground focus:ring-ring inline-flex w-full items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none disabled:opacity-50',\n\t\t\t\tprops.className,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n}\n\nfunction DoubleCheckAdminButton({\n\tchildren,\n\tdoubleCheckClassName,\n\t...props\n}: React.ComponentPropsWithoutRef<'button'> & {\n\tdoubleCheckClassName?: string\n}) {\n\tconst { doubleCheck, getButtonProps } = useDoubleCheck()\n\n\treturn (\n\t\t<AdminButton\n\t\t\t{...getButtonProps(props)}\n\t\t\tclassName={cn(\n\t\t\t\tprops.className,\n\t\t\t\tdoubleCheck\n\t\t\t\t\t? (doubleCheckClassName ??\n\t\t\t\t\t\t\t'border-destructive bg-destructive text-destructive-foreground')\n\t\t\t\t\t: null,\n\t\t\t)}\n\t\t>\n\t\t\t{doubleCheck ? (\n\t\t\t\t<>\n\t\t\t\t\t<Icon name=\"TriangleAlert\" className=\"h-4 w-4\" />\n\t\t\t\t\tAre you sure?\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</AdminButton>\n\t)\n}\n\nfunction Pinger({\n\tstatus,\n}: {\n\tstatus: 'running' | 'starting' | 'stopped' | 'taken'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-success/60',\n\t\t\tcircle: 'bg-success',\n\t\t},\n\t\tstarting: {\n\t\t\tpinger: 'bg-info/60',\n\t\t\tcircle: 'bg-info',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-muted-foreground',\n\t\t},\n\t\ttaken: {\n\t\t\tpinger: 'bg-destructive/60',\n\t\t\tcircle: 'bg-destructive',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3 shrink-0\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t'absolute inline-flex h-full w-full animate-ping rounded-full opacity-75',\n\t\t\t\t\t\tcolors.pinger,\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t'relative inline-flex h-3 w-3 rounded-full',\n\t\t\t\t\tcolors.circle,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n"],"names":["handle","getSitemapEntries","meta","matches","title","getRootMatchLoaderData","workshopTitle","sortProgress","a","b","type","linkProgress","progress","exerciseNumber","toString","padStart","stepNumber","index","_UNSAFE_withComponentProps","loaderData","data","navigation","useNavigation","epicProgress","useEpicProgress","isStartingInspector","formData","get","isStoppingInspector","progressStatus","completed","incomplete","jsxs","className","children","jsx","Object","entries","sidecarProcesses","length","Card","CardHeader","CardTitle","CardDescription","CardContent","map","key","process","SidecarProcessItem","name","pid","running","Form","method","DoubleCheckAdminButton","value","Icon","doubleCheckClassName","inspectorRunning","AdminButton","apps","app","processes","Pinger","status","port","style","backgroundColor","color","testProcesses","exitCode","sort","epicCompletedAt","label","epicLessonSlug","filter","Boolean","join","clsx","SimpleTooltip","content","Link","to","epicLessonUrl","restartFetcher","useFetcher","logsFetcher","copyStatus","setCopyStatus","React","logsOpen","setLogsOpen","displayLogs","setDisplayLogs","isRestarting","state","isLoadingLogs","logs","handleCopyLogs","navigator","clipboard","writeText","then","setTimeout","catch","handleToggleLogs","open","submit","intent","disabled","cn","onToggle","e","currentTarget","onClick","props","doubleCheck","getButtonProps","useDoubleCheck","Fragment","colors","pinger","circle","starting","stopped","taken"],"mappings":"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"}
1
+ {"version":3,"file":"index-Dpyv8N6m.js","sources":["../../../app/routes/admin+/index.tsx"],"sourcesContent":["import { getApps } from '@epic-web/workshop-utils/apps.server'\nimport { getProcesses } from '@epic-web/workshop-utils/process-manager.server'\nimport {\n\tgetServerTimeHeader,\n\tmakeTimings,\n} from '@epic-web/workshop-utils/timing.server'\nimport { type SEOHandle } from '@nasa-gcn/remix-seo'\nimport { clsx } from 'clsx'\nimport * as React from 'react'\nimport { data, Form, Link, useFetcher, useNavigation } from 'react-router'\nimport { Icon } from '#app/components/icons.tsx'\nimport { SimpleTooltip } from '#app/components/ui/tooltip.tsx'\nimport {\n\tuseEpicProgress,\n\ttype SerializedProgress,\n} from '#app/routes/progress.tsx'\nimport { cn, ensureUndeployed, useDoubleCheck } from '#app/utils/misc.tsx'\nimport { getRootMatchLoaderData } from '#app/utils/root-loader.ts'\nimport { type Route } from './+types/index.tsx'\nimport {\n\tclearCaches,\n\tclearData,\n\tgetSidecarLogLines,\n\tisInspectorRunning,\n\trestartSidecar,\n\tstartInspector,\n\tstopInspector,\n} from './admin-utils.server.tsx'\n\nexport const handle: SEOHandle = {\n\tgetSitemapEntries: () => null,\n}\n\nexport const meta: Route.MetaFunction = ({ matches }) => {\n\tconst rootData = getRootMatchLoaderData(matches)\n\treturn [{ title: `👷 | ${rootData?.workshopTitle}` }]\n}\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tensureUndeployed()\n\tconst timings = makeTimings('adminLoader')\n\tconst apps = (await getApps({ request, timings })).filter(\n\t\t(a, i, ar) => ar.findIndex((b) => a.name === b.name) === i,\n\t)\n\tconst processes: Record<\n\t\tstring,\n\t\t{ port: number; pid?: number; color: string }\n\t> = {}\n\tconst testProcesses: Record<\n\t\tstring,\n\t\t{ pid?: number; exitCode?: number | null }\n\t> = {}\n\tfor (const [\n\t\tname,\n\t\t{ port, process, color },\n\t] of getProcesses().devProcesses.entries()) {\n\t\tprocesses[name] = { port, pid: process.pid, color }\n\t}\n\n\tfor (const [\n\t\tname,\n\t\t{ process, exitCode },\n\t] of getProcesses().testProcesses.entries()) {\n\t\ttestProcesses[name] = { pid: process?.pid, exitCode }\n\t}\n\n\tconst sidecarProcesses: Record<string, { pid?: number; running: boolean }> =\n\t\t{}\n\tfor (const [name, { process }] of getProcesses().sidecarProcesses.entries()) {\n\t\tsidecarProcesses[name] = {\n\t\t\tpid: process.pid,\n\t\t\trunning: process.exitCode === null,\n\t\t}\n\t}\n\n\treturn data(\n\t\t{\n\t\t\tapps,\n\t\t\tprocesses,\n\t\t\ttestProcesses,\n\t\t\tsidecarProcesses,\n\t\t\tinspectorRunning: isInspectorRunning(),\n\t\t},\n\t\t{\n\t\t\theaders: {\n\t\t\t\t'Server-Timing': getServerTimeHeader(timings),\n\t\t\t},\n\t\t},\n\t)\n}\n\nexport async function action({ request }: Route.ActionArgs) {\n\tensureUndeployed()\n\tconst formData = await request.formData()\n\tconst intent = formData.get('intent')\n\tswitch (intent) {\n\t\tcase 'clear-data': {\n\t\t\tawait clearData()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'clear-caches': {\n\t\t\tawait clearCaches()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'inspect': {\n\t\t\tawait startInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'stop-inspect': {\n\t\t\tawait stopInspector()\n\t\t\treturn { success: true }\n\t\t}\n\t\tcase 'restart-sidecar': {\n\t\t\tconst name = formData.get('name')\n\t\t\tif (typeof name !== 'string') {\n\t\t\t\tthrow new Error('Sidecar name is required')\n\t\t\t}\n\t\t\tconst success = await restartSidecar(name)\n\t\t\treturn { success }\n\t\t}\n\t\tcase 'get-sidecar-logs': {\n\t\t\tconst name = formData.get('name')\n\t\t\tif (typeof name !== 'string') {\n\t\t\t\tthrow new Error('Sidecar name is required')\n\t\t\t}\n\t\t\tconst logs = getSidecarLogLines(name, 1000)\n\t\t\treturn { success: true, logs }\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown intent: ${intent}`)\n\t\t}\n\t}\n}\n\nfunction sortProgress(a: SerializedProgress, b: SerializedProgress) {\n\treturn a.type === 'unknown' && b.type === 'unknown'\n\t\t? 0\n\t\t: a.type === 'unknown'\n\t\t\t? -1\n\t\t\t: b.type === 'unknown'\n\t\t\t\t? 1\n\t\t\t\t: 0\n}\n\nfunction linkProgress(progress: SerializedProgress) {\n\tswitch (progress.type) {\n\t\tcase 'workshop-instructions':\n\t\t\treturn '/'\n\t\tcase 'workshop-finished':\n\t\t\treturn '/finished'\n\t\tcase 'instructions':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}`\n\t\tcase 'step':\n\t\t\treturn `/${progress.exerciseNumber\n\t\t\t\t.toString()\n\t\t\t\t.padStart(2, '0')}/${progress.stepNumber.toString().padStart(2, '0')}`\n\t\tcase 'finished':\n\t\t\treturn `/${progress.exerciseNumber.toString().padStart(2, '0')}/finished`\n\t\tdefault:\n\t\t\treturn ''\n\t}\n}\n\nexport default function AdminLayout({\n\tloaderData: data,\n}: Route.ComponentProps) {\n\tconst navigation = useNavigation()\n\tconst epicProgress = useEpicProgress()\n\n\tconst isStartingInspector = navigation.formData?.get('intent') === 'inspect'\n\tconst isStoppingInspector =\n\t\tnavigation.formData?.get('intent') === 'stop-inspect'\n\n\tconst progressStatus = {\n\t\tcompleted: 'bg-success',\n\t\tincomplete: 'bg-warning',\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-6 p-6\">\n\t\t\t<div className=\"mb-2\">\n\t\t\t\t<h1 className=\"text-foreground text-2xl font-bold\">Admin Panel</h1>\n\t\t\t\t<p className=\"text-muted-foreground mt-1 text-sm\">\n\t\t\t\t\tManage workshop settings and monitor processes\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid gap-6 md:grid-cols-2\">\n\t\t\t\t{Object.entries(data.sidecarProcesses).length > 0 && (\n\t\t\t\t\t<Card>\n\t\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t\t<CardTitle>Sidecar Processes</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>Background sidecar processes</CardDescription>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<ul className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t{Object.entries(data.sidecarProcesses).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<SidecarProcessItem\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tname={key}\n\t\t\t\t\t\t\t\t\t\tpid={process.pid}\n\t\t\t\t\t\t\t\t\t\trunning={process.running}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Commands</CardTitle>\n\t\t\t\t\t\t<CardDescription>Workshop management actions</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<div className=\"flex flex-col gap-3\">\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<DoubleCheckAdminButton name=\"intent\" value=\"clear-caches\">\n\t\t\t\t\t\t\t\t\t<Icon name=\"Clear\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tClear local caches\n\t\t\t\t\t\t\t\t</DoubleCheckAdminButton>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t<DoubleCheckAdminButton\n\t\t\t\t\t\t\t\t\tname=\"intent\"\n\t\t\t\t\t\t\t\t\tvalue=\"clear-data\"\n\t\t\t\t\t\t\t\t\tclassName=\"border-destructive bg-destructive/80 text-destructive-foreground hover:bg-destructive hover:text-destructive-foreground\"\n\t\t\t\t\t\t\t\t\tdoubleCheckClassName=\"border-destructive bg-destructive text-destructive-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<Icon name=\"TriangleAlert\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\tClear all local data (including auth data)\n\t\t\t\t\t\t\t\t</DoubleCheckAdminButton>\n\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t{data.inspectorRunning ? (\n\t\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t\t<AdminButton name=\"intent\" value=\"stop-inspect\">\n\t\t\t\t\t\t\t\t\t\t<Icon name=\"Stop\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t{isStoppingInspector\n\t\t\t\t\t\t\t\t\t\t\t? 'Stopping inspector...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Stop inspector'}\n\t\t\t\t\t\t\t\t\t</AdminButton>\n\t\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Form method=\"POST\">\n\t\t\t\t\t\t\t\t\t<AdminButton name=\"intent\" value=\"inspect\">\n\t\t\t\t\t\t\t\t\t\t{isStartingInspector\n\t\t\t\t\t\t\t\t\t\t\t? 'Starting inspector...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Start inspector'}\n\t\t\t\t\t\t\t\t\t</AdminButton>\n\t\t\t\t\t\t\t\t</Form>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Apps</CardTitle>\n\t\t\t\t\t\t<CardDescription>Available workshop apps</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t{data.apps.length > 0 ? (\n\t\t\t\t\t\t\t\tdata.apps.map((app) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={app.name}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{data.processes[app.name] ? (\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm\">{app.name}</span>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\tNo apps available\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Processes</CardTitle>\n\t\t\t\t\t\t<CardDescription>Running development processes</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-48 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t{Object.entries(data.processes).length > 0 ? (\n\t\t\t\t\t\t\t\tObject.entries(data.processes).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-border bg-muted/30 rounded-md border p-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Port:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{process.port}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{process.pid && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">PID:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.pid}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Color:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"inline-block h-3 w-3 rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ backgroundColor: process.color }}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">\n\t\t\t\t\t\t\t\t\tNo processes running\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\n\t\t\t\t{Object.entries(data.testProcesses).length > 0 && (\n\t\t\t\t\t<Card className=\"md:col-span-2\">\n\t\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t\t<CardTitle>Test Processes</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>Test execution processes</CardDescription>\n\t\t\t\t\t\t</CardHeader>\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{Object.entries(data.testProcesses).map(([key, process]) => (\n\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-border bg-muted/30 rounded-md border p-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{process.exitCode === null ||\n\t\t\t\t\t\t\t\t\t\t\tprocess.exitCode === undefined ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"running\" />\n\t\t\t\t\t\t\t\t\t\t\t) : process.exitCode === 0 ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"stopped\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<Pinger status=\"taken\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t{process.pid && (\n\t\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">PID:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.pid}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Exit code:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{process.exitCode === null ||\n\t\t\t\t\t\t\t\t\t\t\t\tprocess.exitCode === undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Running'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: process.exitCode}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t</Card>\n\t\t\t\t)}\n\n\t\t\t\t<Card>\n\t\t\t\t\t<CardHeader>\n\t\t\t\t\t\t<CardTitle>Progress</CardTitle>\n\t\t\t\t\t\t<CardDescription>EpicWeb.dev lesson progress</CardDescription>\n\t\t\t\t\t</CardHeader>\n\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t{epicProgress ? (\n\t\t\t\t\t\t\t<ul className=\"scrollbar-thin scrollbar-thumb-scrollbar flex max-h-72 flex-col gap-2 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{epicProgress.sort(sortProgress).map((progress) => {\n\t\t\t\t\t\t\t\t\tconst status = progress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t\t? 'completed'\n\t\t\t\t\t\t\t\t\t\t: 'incomplete'\n\t\t\t\t\t\t\t\t\tconst label = [\n\t\t\t\t\t\t\t\t\t\tprogress.epicLessonSlug,\n\t\t\t\t\t\t\t\t\t\tprogress.epicCompletedAt\n\t\t\t\t\t\t\t\t\t\t\t? `(${progress.epicCompletedAt})`\n\t\t\t\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t\t\t.join(' ')\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\t\t\tkey={progress.epicLessonSlug}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"hover:bg-muted/50 flex items-center gap-3 rounded-md p-2\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'h-3 w-3 shrink-0 rounded-full',\n\t\t\t\t\t\t\t\t\t\t\t\t\tprogressStatus[status],\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={status}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t{progress.type === 'unknown' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"flex flex-1 items-center gap-2 truncate text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SimpleTooltip content=\"This video is in the workshop on EpicWeb.dev, but not in the local workshop.\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"Close\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-destructive h-4 w-4 shrink-0\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\t\tto={linkProgress(progress)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-foreground flex-1 truncate text-sm hover:underline\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\t\t\t\tto={progress.epicLessonUrl}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground shrink-0\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon name=\"ExternalLink\" className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-sm\">No progress data</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nfunction SidecarProcessItem({\n\tname,\n\tpid,\n\trunning,\n}: {\n\tname: string\n\tpid?: number\n\trunning: boolean\n}) {\n\tconst restartFetcher = useFetcher()\n\tconst logsFetcher = useFetcher<{ logs?: string }>()\n\tconst [copyStatus, setCopyStatus] = React.useState<'idle' | 'copied'>('idle')\n\tconst [logsOpen, setLogsOpen] = React.useState(false)\n\tconst [displayLogs, setDisplayLogs] = React.useState<string | null>(null)\n\n\tconst isRestarting = restartFetcher.state !== 'idle'\n\tconst isLoadingLogs = logsFetcher.state !== 'idle'\n\n\t// Update display logs when fetcher returns data\n\tReact.useEffect(() => {\n\t\tif (logsFetcher.data) {\n\t\t\tsetDisplayLogs(logsFetcher.data.logs ?? '')\n\t\t}\n\t}, [logsFetcher.data])\n\n\tconst handleCopyLogs = () => {\n\t\tif (!displayLogs) return\n\t\tnavigator.clipboard\n\t\t\t.writeText(displayLogs)\n\t\t\t.then(() => {\n\t\t\t\tsetCopyStatus('copied')\n\t\t\t\tsetTimeout(() => setCopyStatus('idle'), 2000)\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// silently fail\n\t\t\t})\n\t}\n\n\tconst handleToggleLogs = (open: boolean) => {\n\t\tsetLogsOpen(open)\n\t\tif (open) {\n\t\t\t// Fetch logs when opening\n\t\t\tvoid logsFetcher.submit(\n\t\t\t\t{ intent: 'get-sidecar-logs', name },\n\t\t\t\t{ method: 'POST' },\n\t\t\t)\n\t\t}\n\t}\n\n\treturn (\n\t\t<li className=\"border-border bg-muted/30 rounded-md border p-3\">\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{running ? <Pinger status=\"running\" /> : <Pinger status=\"taken\" />}\n\t\t\t\t\t<span className=\"font-mono text-sm font-semibold\">{name}</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t<restartFetcher.Form method=\"POST\">\n\t\t\t\t\t\t<input type=\"hidden\" name=\"intent\" value=\"restart-sidecar\" />\n\t\t\t\t\t\t<input type=\"hidden\" name=\"name\" value={name} />\n\t\t\t\t\t\t<SimpleTooltip content=\"Restart process\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tdisabled={isRestarting}\n\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground hover:bg-muted rounded p-1.5 transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname=\"Refresh\"\n\t\t\t\t\t\t\t\t\tclassName={cn('h-4 w-4', isRestarting && 'animate-spin')}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t</restartFetcher.Form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"text-muted-foreground mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs\">\n\t\t\t\t{pid && (\n\t\t\t\t\t<span>\n\t\t\t\t\t\t<span className=\"font-medium\">PID:</span> {pid}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span>\n\t\t\t\t\t<span className=\"font-medium\">Status:</span>{' '}\n\t\t\t\t\t{isRestarting ? 'Restarting...' : running ? 'Running' : 'Failed'}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<details\n\t\t\t\tclassName=\"mt-3\"\n\t\t\t\topen={logsOpen}\n\t\t\t\tonToggle={(e) => handleToggleLogs(e.currentTarget.open)}\n\t\t\t>\n\t\t\t\t<summary className=\"text-muted-foreground hover:text-foreground cursor-pointer text-xs font-medium\">\n\t\t\t\t\t{isLoadingLogs ? 'Loading logs...' : 'View logs'}\n\t\t\t\t</summary>\n\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t<div className=\"mb-1 flex justify-end\">\n\t\t\t\t\t\t<SimpleTooltip\n\t\t\t\t\t\t\tcontent={copyStatus === 'copied' ? 'Copied!' : 'Copy logs'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleCopyLogs}\n\t\t\t\t\t\t\t\tdisabled={!displayLogs}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'text-muted-foreground hover:text-foreground hover:bg-muted rounded p-1 transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t\t\t\t\tcopyStatus === 'copied' && 'text-success',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\t\tname={copyStatus === 'copied' ? 'CheckSmall' : 'Copy'}\n\t\t\t\t\t\t\t\t\tclassName=\"h-3.5 w-3.5\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</SimpleTooltip>\n\t\t\t\t\t</div>\n\t\t\t\t\t<pre className=\"scrollbar-thin scrollbar-thumb-scrollbar bg-background max-h-96 overflow-auto rounded border p-2 text-xs\">\n\t\t\t\t\t\t{displayLogs ||\n\t\t\t\t\t\t\t(isLoadingLogs ? 'Loading...' : 'No logs available')}\n\t\t\t\t\t</pre>\n\t\t\t\t</div>\n\t\t\t</details>\n\t\t</li>\n\t)\n}\n\nfunction Card({\n\tchildren,\n\tclassName,\n}: {\n\tchildren: React.ReactNode\n\tclassName?: string\n}) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'border-border bg-card rounded-lg border p-6 shadow-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nfunction CardHeader({ children }: { children: React.ReactNode }) {\n\treturn <div className=\"mb-4\">{children}</div>\n}\n\nfunction CardTitle({ children }: { children: React.ReactNode }) {\n\treturn <h2 className=\"text-foreground text-lg font-semibold\">{children}</h2>\n}\n\nfunction CardDescription({ children }: { children: React.ReactNode }) {\n\treturn <p className=\"text-muted-foreground mt-1 text-sm\">{children}</p>\n}\n\nfunction CardContent({ children }: { children: React.ReactNode }) {\n\treturn <div>{children}</div>\n}\n\nfunction AdminButton({\n\tchildren,\n\t...props\n}: React.ComponentPropsWithoutRef<'button'>) {\n\treturn (\n\t\t<button\n\t\t\t{...props}\n\t\t\tclassName={cn(\n\t\t\t\t'border-border bg-background text-foreground hover:bg-muted hover:text-foreground focus:ring-ring inline-flex w-full items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:pointer-events-none disabled:opacity-50',\n\t\t\t\tprops.className,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n}\n\nfunction DoubleCheckAdminButton({\n\tchildren,\n\tdoubleCheckClassName,\n\t...props\n}: React.ComponentPropsWithoutRef<'button'> & {\n\tdoubleCheckClassName?: string\n}) {\n\tconst { doubleCheck, getButtonProps } = useDoubleCheck()\n\n\treturn (\n\t\t<AdminButton\n\t\t\t{...getButtonProps(props)}\n\t\t\tclassName={cn(\n\t\t\t\tprops.className,\n\t\t\t\tdoubleCheck\n\t\t\t\t\t? (doubleCheckClassName ??\n\t\t\t\t\t\t\t'border-destructive bg-destructive text-destructive-foreground')\n\t\t\t\t\t: null,\n\t\t\t)}\n\t\t>\n\t\t\t{doubleCheck ? (\n\t\t\t\t<>\n\t\t\t\t\t<Icon name=\"TriangleAlert\" className=\"h-4 w-4\" />\n\t\t\t\t\tAre you sure?\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</AdminButton>\n\t)\n}\n\nfunction Pinger({\n\tstatus,\n}: {\n\tstatus: 'running' | 'starting' | 'stopped' | 'taken'\n}) {\n\tconst colors = {\n\t\trunning: {\n\t\t\tpinger: 'bg-success/60',\n\t\t\tcircle: 'bg-success',\n\t\t},\n\t\tstarting: {\n\t\t\tpinger: 'bg-info/60',\n\t\t\tcircle: 'bg-info',\n\t\t},\n\t\tstopped: {\n\t\t\tcircle: 'bg-muted-foreground',\n\t\t},\n\t\ttaken: {\n\t\t\tpinger: 'bg-destructive/60',\n\t\t\tcircle: 'bg-destructive',\n\t\t},\n\t}[status]\n\treturn (\n\t\t<span className=\"relative flex h-3 w-3 shrink-0\">\n\t\t\t{colors.pinger ? (\n\t\t\t\t<span\n\t\t\t\t\tclassName={clsx(\n\t\t\t\t\t\t'absolute inline-flex h-full w-full animate-ping rounded-full opacity-75',\n\t\t\t\t\t\tcolors.pinger,\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t\t<span\n\t\t\t\tclassName={clsx(\n\t\t\t\t\t'relative inline-flex h-3 w-3 rounded-full',\n\t\t\t\t\tcolors.circle,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</span>\n\t)\n}\n"],"names":["handle","getSitemapEntries","meta","matches","title","getRootMatchLoaderData","workshopTitle","sortProgress","a","b","type","linkProgress","progress","exerciseNumber","toString","padStart","stepNumber","index","_UNSAFE_withComponentProps","loaderData","data","navigation","useNavigation","epicProgress","useEpicProgress","isStartingInspector","formData","get","isStoppingInspector","progressStatus","completed","incomplete","jsxs","className","children","jsx","Object","entries","sidecarProcesses","length","Card","CardHeader","CardTitle","CardDescription","CardContent","map","key","process","SidecarProcessItem","name","pid","running","Form","method","DoubleCheckAdminButton","value","Icon","doubleCheckClassName","inspectorRunning","AdminButton","apps","app","processes","Pinger","status","port","style","backgroundColor","color","testProcesses","exitCode","sort","epicCompletedAt","label","epicLessonSlug","filter","Boolean","join","clsx","SimpleTooltip","content","Link","to","epicLessonUrl","restartFetcher","useFetcher","logsFetcher","copyStatus","setCopyStatus","React","logsOpen","setLogsOpen","displayLogs","setDisplayLogs","isRestarting","state","isLoadingLogs","logs","handleCopyLogs","navigator","clipboard","writeText","then","setTimeout","catch","handleToggleLogs","open","submit","intent","disabled","cn","onToggle","e","currentTarget","onClick","props","doubleCheck","getButtonProps","useDoubleCheck","Fragment","colors","pinger","circle","starting","stopped","taken"],"mappings":"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"}
@@ -1 +1 @@
1
- window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-DdbTov6T.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-BwYDIUyI.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/client-only-BeMV-Wuv.js","/assets/error-boundary-DxHqAEHX.js","/assets/dialog-CzO65Z5w.js","/assets/progress-bar-DpWhcyhC.js","/assets/index-DzdDahau.js","/assets/tooltip-Tlsyx2YO.js","/assets/schemas-Uj5SZtvt.js","/assets/index-CdzVFL-Z.js","/assets/presence-VCvV2mg7.js","/assets/seo-t5J-DRxw.js","/assets/pe-CIZUOJMr.js","/assets/index-ynYvVAOK.js","/assets/root-loader-BOzEMapJ.js","/assets/online-DiNLkgTC.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-C4AWl_1u.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-C9vSX5Ti.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/pe-CIZUOJMr.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/product-CvyMpYD_.js","/assets/revalidation-ws-BJWJviUX.js","/assets/status-indicator-C6DiLYL5.js","/assets/dialog-CzO65Z5w.js","/assets/index-CmflCPTU.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/online-DiNLkgTC.js","/assets/presence-VCvV2mg7.js","/assets/root-loader-BOzEMapJ.js","/assets/progress-BcA4i0iU.js","/assets/index-CdzVFL-Z.js","/assets/schemas-Uj5SZtvt.js","/assets/index-ynYvVAOK.js","/assets/index-vDCSPjrM.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-C96cpeZR.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-r3m19sUM.js","imports":["/assets/discord-BJkw0IrB.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/user-BsPobzjB.js","/assets/root-loader-BOzEMapJ.js","/assets/workshop-config-Zfc8zU0x.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BvtJxESE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-jokuvO2V.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-CC0372g5.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-BcA4i0iU.js","/assets/mdx-vy-1-0a3.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-_Aw6qzZC.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-BcA4i0iU.js","/assets/set-playground-BSGwH9dH.js","/assets/misc-W4055b-0.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/error-boundary-BDqWjIFP.js","/assets/epic-video-CC0372g5.js","/assets/tooltip-Tlsyx2YO.js","/assets/mdx-vy-1-0a3.js","/assets/index-CmflCPTU.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/preload-helper-BXl3LOEh.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/index-CJDOQ1bl.js","/assets/index-vDCSPjrM.js","/assets/index-ynYvVAOK.js","/assets/button-Cd-ekki5.js","/assets/dialog-CzO65Z5w.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-CdzVFL-Z.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-CJniokic.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/preview-fhmjENlm.js","/assets/misc-W4055b-0.js","/assets/button-Cd-ekki5.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-Pxi8WjFA.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/playground-DmEAkxG1.js","/assets/diff-Dng5ItOr.js","/assets/error-boundary-DxHqAEHX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/misc-W4055b-0.js","/assets/preview-fhmjENlm.js","/assets/tests-CZ2AhDKA.js","/assets/index-CqIc3cxq.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-BJkw0IrB.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/set-playground-BSGwH9dH.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js","/assets/playground-window-x2mQ5o1O.js","/assets/accordion-CQ7oujC6.js","/assets/mdx-vy-1-0a3.js","/assets/epic-video-CC0372g5.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-D2exGfVu.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-Ciw2aKZE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-CZ2AhDKA.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/misc-W4055b-0.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/epic-video-CC0372g5.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-CdzVFL-Z.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/playground-window-x2mQ5o1O.js","/assets/set-playground-BSGwH9dH.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-BPqMtmN8.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/schemas-Uj5SZtvt.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-BaC--Y5p.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-CC0372g5.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/retrieval-practice-BOku32wW.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-BcA4i0iU.js","/assets/index-CdzVFL-Z.js","/assets/mdx-vy-1-0a3.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/_layout":{"id":"routes/_app+/extra+/_layout","parentId":"routes/_app+/_layout","path":"extra","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-jJ6TnDJF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/extra+/$extra":{"id":"routes/_app+/extra+/$extra","parentId":"routes/_app+/extra+/_layout","path":":extra","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_extra-DXypL1sc.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/playground-DmEAkxG1.js","/assets/index-CqIc3cxq.js","/assets/diff-Dng5ItOr.js","/assets/epic-video-CC0372g5.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preview-fhmjENlm.js","/assets/launch-editor-D2exGfVu.js","/assets/set-playground-BSGwH9dH.js","/assets/mdx-vy-1-0a3.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-BJkw0IrB.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/playground-window-x2mQ5o1O.js","/assets/accordion-CQ7oujC6.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/button-Cd-ekki5.js","/assets/progress-bar-DpWhcyhC.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/index":{"id":"routes/_app+/extra+/index","parentId":"routes/_app+/extra+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-CFM_ffAh.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-CC0372g5.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/mdx-vy-1-0a3.js","/assets/misc-W4055b-0.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-BbEk1NdF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-CC0372g5.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/mdx-vy-1-0a3.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/retrieval-practice-BOku32wW.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-BcA4i0iU.js","/assets/index-CdzVFL-Z.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/guide":{"id":"routes/_app+/guide","parentId":"routes/_app+/_layout","path":"guide","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/guide-Cinib8Ji.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-CfU0fdf7.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-CC0372g5.js","/assets/error-boundary-DxHqAEHX.js","/assets/launch-editor-D2exGfVu.js","/assets/mdx-vy-1-0a3.js","/assets/misc-W4055b-0.js","/assets/progress-BcA4i0iU.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-BWU2-fsj.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-mWjVXGbJ.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/button-Cd-ekki5.js","/assets/loading-CDNzW5oO.js","/assets/product-CvyMpYD_.js","/assets/workshop-config-Zfc8zU0x.js","/assets/schemas-Uj5SZtvt.js","/assets/misc-W4055b-0.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-B7ND1VS9.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-D5mDQ-c-.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-B6Rpl-B2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/index-CqIc3cxq.js","/assets/misc-W4055b-0.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CunOyAg4.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-CAr50MIB.js","imports":["/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/client-only-BeMV-Wuv.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/launch-editor-D2exGfVu.js","/assets/pe-CIZUOJMr.js","/assets/progress-bar-DpWhcyhC.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-DAnX-T3_.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/launch-editor-D2exGfVu.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DroM8fzS.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/tooltip-Tlsyx2YO.js","/assets/progress-BcA4i0iU.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/offline-videos":{"id":"routes/admin+/offline-videos","parentId":"routes/admin+/_layout","path":"offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-DAsuWMco.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/format-CZ5n8p10.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-f8qqYbyU.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-DfWBhj2O.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/diff-Dng5ItOr.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/mdx-vy-1-0a3.js","/assets/index-DzdDahau.js","/assets/epic-video-CC0372g5.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-CdzVFL-Z.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-bar-DpWhcyhC.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mark-onboarding-complete":{"id":"routes/mark-onboarding-complete","parentId":"root","path":"mark-onboarding-complete","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/mark-onboarding-complete-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-C1_HSISA.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/epic-video-CC0372g5.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/persist-playground":{"id":"routes/persist-playground","parentId":"root","path":"persist-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/persist-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-video-progress.$playbackId":{"id":"routes/resources+/offline-video-progress.$playbackId","parentId":"root","path":"resources/offline-video-progress/:playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-video-progress._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos":{"id":"routes/resources+/offline-videos","parentId":"root","path":"resources/offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos.$playbackId":{"id":"routes/resources+/offline-videos.$playbackId","parentId":"routes/resources+/offline-videos","path":":playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/saved-playgrounds":{"id":"routes/saved-playgrounds","parentId":"root","path":"saved-playgrounds","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/saved-playgrounds-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-835c6db1.js","version":"835c6db1"};
1
+ window.__reactRouterManifest={"entry":{"module":"/assets/entry.client-DdbTov6T.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/root-BwYDIUyI.js","imports":["/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/client-only-BeMV-Wuv.js","/assets/error-boundary-DxHqAEHX.js","/assets/dialog-CzO65Z5w.js","/assets/progress-bar-DpWhcyhC.js","/assets/index-DzdDahau.js","/assets/tooltip-Tlsyx2YO.js","/assets/schemas-Uj5SZtvt.js","/assets/index-CdzVFL-Z.js","/assets/presence-VCvV2mg7.js","/assets/seo-t5J-DRxw.js","/assets/pe-CIZUOJMr.js","/assets/index-ynYvVAOK.js","/assets/root-loader-BOzEMapJ.js","/assets/online-DiNLkgTC.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/$":{"id":"routes/$","parentId":"root","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_-C4AWl_1u.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js"],"css":[]},"routes/_app+/_layout":{"id":"routes/_app+/_layout","parentId":"root","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BDFC2e7T.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/pe-CIZUOJMr.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/product-CvyMpYD_.js","/assets/revalidation-ws-BJWJviUX.js","/assets/status-indicator-C6DiLYL5.js","/assets/dialog-CzO65Z5w.js","/assets/index-CmflCPTU.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/online-DiNLkgTC.js","/assets/presence-VCvV2mg7.js","/assets/root-loader-BOzEMapJ.js","/assets/progress-Bby-ybMA.js","/assets/index-CdzVFL-Z.js","/assets/schemas-Uj5SZtvt.js","/assets/index-ynYvVAOK.js","/assets/index-vDCSPjrM.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/account":{"id":"routes/_app+/account","parentId":"routes/_app+/_layout","path":"account","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/account-C96cpeZR.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/tooltip-Tlsyx2YO.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/app.$appName+/$":{"id":"routes/_app+/app.$appName+/$","parentId":"routes/_app+/_layout","path":"app/:appName/*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/api.$":{"id":"routes/_app+/app.$appName+/api.$","parentId":"routes/_app+/_layout","path":"app/:appName/api/*","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/api._-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/epic_ws[.js]":{"id":"routes/_app+/app.$appName+/epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/epic_ws.js","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/index":{"id":"routes/_app+/app.$appName+/index","parentId":"routes/_app+/_layout","path":"app/:appName","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.$testName":{"id":"routes/_app+/app.$appName+/test.$testName","parentId":"routes/_app+/_layout","path":"app/:appName/test/:testName","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test._testName-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.$appName+/test.epic_ws[.js]":{"id":"routes/_app+/app.$appName+/test.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/:appName/test/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/app.epic_ws[.js]":{"id":"routes/_app+/app.epic_ws[.js]","parentId":"routes/_app+/_layout","path":"app/epic_ws.js","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app.epic_ws_.js_-l0sNRNKZ.js","imports":[],"css":[]},"routes/_app+/discord":{"id":"routes/_app+/discord","parentId":"routes/_app+/_layout","path":"discord","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/discord-r3m19sUM.js","imports":["/assets/discord-BJkw0IrB.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/user-BsPobzjB.js","/assets/root-loader-BOzEMapJ.js","/assets/workshop-config-Zfc8zU0x.js"],"css":[]},"routes/_app+/exercise+/_layout":{"id":"routes/_app+/exercise+/_layout","parentId":"routes/_app+/_layout","path":"exercise","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-BvtJxESE.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber":{"id":"routes/_app+/exercise+/$exerciseNumber","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber-6IQJMb5M.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-DzLohyvt.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/mdx-8X3W8bVO.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber/:type","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_layout-CCCrBY2W.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/set-playground-BSGwH9dH.js","/assets/misc-W4055b-0.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/error-boundary-BDqWjIFP.js","/assets/epic-video-DzLohyvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/mdx-8X3W8bVO.js","/assets/index-CmflCPTU.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/preload-helper-BXl3LOEh.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/index-CJDOQ1bl.js","/assets/index-vDCSPjrM.js","/assets/index-ynYvVAOK.js","/assets/button-Cd-ekki5.js","/assets/dialog-CzO65Z5w.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/coerce-CkHW0SMv.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-CdzVFL-Z.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/app","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"app","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/app-CJniokic.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/preview-fhmjENlm.js","/assets/misc-W4055b-0.js","/assets/button-Cd-ekki5.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/progress-bar-DpWhcyhC.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/index","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-BNsKVnVt.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/playground-DmEAkxG1.js","/assets/diff-4YyKvzHi.js","/assets/error-boundary-DxHqAEHX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/misc-W4055b-0.js","/assets/preview-fhmjENlm.js","/assets/tests-DlPVOsMT.js","/assets/index-CqIc3cxq.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-BJkw0IrB.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/set-playground-BSGwH9dH.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js","/assets/playground-window-x2mQ5o1O.js","/assets/accordion-CQ7oujC6.js","/assets/mdx-8X3W8bVO.js","/assets/epic-video-DzLohyvt.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-D2exGfVu.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/test","parentId":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.$type+/_layout","path":"test","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-DXylXETz.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/tests-DlPVOsMT.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/misc-W4055b-0.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/epic-video-DzLohyvt.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-CdzVFL-Z.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/playground-window-x2mQ5o1O.js","/assets/set-playground-BSGwH9dH.js","/assets/button-Cd-ekki5.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/progress-bar-DpWhcyhC.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index":{"id":"routes/_app+/exercise+/$exerciseNumber_.$stepNumber.index","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/:stepNumber","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_exerciseNumber_._stepNumber.index-BPqMtmN8.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/error-boundary-DxHqAEHX.js","/assets/error-boundary-BDqWjIFP.js","/assets/index-CqIc3cxq.js","/assets/preload-helper-BXl3LOEh.js","/assets/misc-W4055b-0.js","/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/schemas-Uj5SZtvt.js","/assets/coerce-CkHW0SMv.js"],"css":[]},"routes/_app+/exercise+/$exerciseNumber_.finished":{"id":"routes/_app+/exercise+/$exerciseNumber_.finished","parentId":"routes/_app+/exercise+/_layout","path":":exerciseNumber/finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_exerciseNumber_.finished-D9-WSUZy.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-DzLohyvt.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/retrieval-practice-BOku32wW.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/index-CdzVFL-Z.js","/assets/mdx-8X3W8bVO.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/preload-helper-BXl3LOEh.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/_layout":{"id":"routes/_app+/extra+/_layout","parentId":"routes/_app+/_layout","path":"extra","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-jJ6TnDJF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/extra+/$extra":{"id":"routes/_app+/extra+/$extra","parentId":"routes/_app+/extra+/_layout","path":":extra","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/_extra-IT1EaIMp.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/playground-DmEAkxG1.js","/assets/index-CqIc3cxq.js","/assets/diff-4YyKvzHi.js","/assets/epic-video-DzLohyvt.js","/assets/error-boundary-DxHqAEHX.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/revalidation-ws-BJWJviUX.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preview-fhmjENlm.js","/assets/launch-editor-D2exGfVu.js","/assets/set-playground-BSGwH9dH.js","/assets/mdx-8X3W8bVO.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/split-layout-DnRER1bP.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/discord-BJkw0IrB.js","/assets/user-BsPobzjB.js","/assets/online-DiNLkgTC.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/status-indicator-C6DiLYL5.js","/assets/index-DzdDahau.js","/assets/playground-window-x2mQ5o1O.js","/assets/accordion-CQ7oujC6.js","/assets/use-event-source-BuD4_2SF.js","/assets/format-CZ5n8p10.js","/assets/preload-helper-BXl3LOEh.js","/assets/button-Cd-ekki5.js","/assets/progress-bar-DpWhcyhC.js","/assets/onboarding-indicator-B-XR90_G.js","/assets/dialog-CzO65Z5w.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/extra+/index":{"id":"routes/_app+/extra+/index","parentId":"routes/_app+/extra+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-BN0kldnY.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-DzLohyvt.js","/assets/error-boundary-DxHqAEHX.js","/assets/revalidation-ws-BJWJviUX.js","/assets/launch-editor-D2exGfVu.js","/assets/mdx-8X3W8bVO.js","/assets/misc-W4055b-0.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/finished":{"id":"routes/_app+/finished","parentId":"routes/_app+/_layout","path":"finished","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/finished-CzmzTZg6.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/index-CqIc3cxq.js","/assets/epic-video-DzLohyvt.js","/assets/misc-W4055b-0.js","/assets/loading-CDNzW5oO.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/retrieval-practice-BOku32wW.js","/assets/revalidation-ws-BJWJviUX.js","/assets/mdx-8X3W8bVO.js","/assets/online-DiNLkgTC.js","/assets/root-loader-BOzEMapJ.js","/assets/seo-t5J-DRxw.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-Bby-ybMA.js","/assets/index-CdzVFL-Z.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/schemas-Uj5SZtvt.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/guide":{"id":"routes/_app+/guide","parentId":"routes/_app+/_layout","path":"guide","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/guide-Cinib8Ji.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/index":{"id":"routes/_app+/index","parentId":"routes/_app+/_layout","index":true,"hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":true,"module":"/assets/index-Cby_tLUO.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CEVyDj51.js","/assets/epic-video-DzLohyvt.js","/assets/error-boundary-DxHqAEHX.js","/assets/launch-editor-D2exGfVu.js","/assets/mdx-8X3W8bVO.js","/assets/misc-W4055b-0.js","/assets/progress-Bby-ybMA.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/progress-bar-DpWhcyhC.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/_app+/l":{"id":"routes/_app+/l","parentId":"routes/_app+/_layout","path":"l","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/l-BWU2-fsj.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/login":{"id":"routes/_app+/login","parentId":"routes/_app+/_layout","path":"login","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-mWjVXGbJ.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/use-event-source-BuD4_2SF.js","/assets/button-Cd-ekki5.js","/assets/loading-CDNzW5oO.js","/assets/product-CvyMpYD_.js","/assets/workshop-config-Zfc8zU0x.js","/assets/schemas-Uj5SZtvt.js","/assets/misc-W4055b-0.js","/assets/index-CdzVFL-Z.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/_app+/preferences":{"id":"routes/_app+/preferences","parentId":"routes/_app+/_layout","path":"preferences","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/preferences-B7ND1VS9.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/format-CZ5n8p10.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js"],"css":[]},"routes/_app+/support":{"id":"routes/_app+/support","parentId":"routes/_app+/_layout","path":"support","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/support-D5mDQ-c-.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/_app+/workspace-structure":{"id":"routes/_app+/workspace-structure","parentId":"routes/_app+/_layout","path":"workspace-structure","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/workspace-structure-B6Rpl-B2.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/button-Cd-ekki5.js","/assets/index-CqIc3cxq.js","/assets/misc-W4055b-0.js"],"css":[]},"routes/admin+/_layout":{"id":"routes/admin+/_layout","parentId":"root","path":"admin","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/_layout-CunOyAg4.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/root-loader-BOzEMapJ.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/apps":{"id":"routes/admin+/apps","parentId":"routes/admin+/_layout","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/cache":{"id":"routes/admin+/cache","parentId":"routes/admin+/_layout","path":"cache","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache-CAr50MIB.js","imports":["/assets/chunk-FNSCYPCZ-BHgC5cdx.js","/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/client-only-BeMV-Wuv.js","/assets/button-Cd-ekki5.js","/assets/misc-W4055b-0.js","/assets/launch-editor-D2exGfVu.js","/assets/pe-CIZUOJMr.js","/assets/progress-bar-DpWhcyhC.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/cache.$":{"id":"routes/admin+/cache.$","parentId":"routes/admin+/cache","path":"*","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/cache._-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/db":{"id":"routes/admin+/db","parentId":"routes/admin+/_layout","path":"db","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/db-DAnX-T3_.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/launch-editor-D2exGfVu.js","/assets/index-CqIc3cxq.js","/assets/index-vDCSPjrM.js","/assets/progress-bar-DpWhcyhC.js","/assets/pe-CIZUOJMr.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/index":{"id":"routes/admin+/index","parentId":"routes/admin+/_layout","index":true,"hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-Dpyv8N6m.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js","/assets/tooltip-Tlsyx2YO.js","/assets/progress-Bby-ybMA.js","/assets/root-loader-BOzEMapJ.js","/assets/index-vDCSPjrM.js","/assets/pe-CIZUOJMr.js"],"css":[]},"routes/admin+/notifications":{"id":"routes/admin+/notifications","parentId":"routes/admin+/_layout","path":"notifications","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/notifications-l0sNRNKZ.js","imports":[],"css":[]},"routes/admin+/offline-videos":{"id":"routes/admin+/offline-videos","parentId":"routes/admin+/_layout","path":"offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-DAsuWMco.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/format-CZ5n8p10.js","/assets/misc-W4055b-0.js","/assets/index-CqIc3cxq.js"],"css":[]},"routes/admin+/version":{"id":"routes/admin+/version","parentId":"routes/admin+/_layout","path":"version","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version-f8qqYbyU.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/workshop-config-Zfc8zU0x.js","/assets/index-CqIc3cxq.js","/assets/root-loader-BOzEMapJ.js"],"css":[]},"routes/admin+/version[.json]":{"id":"routes/admin+/version[.json]","parentId":"routes/admin+/_layout","path":"version.json","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/version_.json_-l0sNRNKZ.js","imports":[],"css":[]},"routes/apps":{"id":"routes/apps","parentId":"root","path":"apps","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/apps-DP2rzg_V.js","imports":[],"css":[]},"routes/diff":{"id":"routes/diff","parentId":"root","path":"diff","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff-8Er9eAl-.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/misc-W4055b-0.js","/assets/diff-4YyKvzHi.js","/assets/nav-chevrons-Dk4GtZwQ.js","/assets/index-CqIc3cxq.js","/assets/accordion-CQ7oujC6.js","/assets/tooltip-Tlsyx2YO.js","/assets/index-vDCSPjrM.js","/assets/index-CJDOQ1bl.js","/assets/index-ynYvVAOK.js","/assets/mdx-8X3W8bVO.js","/assets/index-DzdDahau.js","/assets/epic-video-DzLohyvt.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-CdzVFL-Z.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js","/assets/preload-helper-BXl3LOEh.js","/assets/launch-editor-D2exGfVu.js","/assets/progress-bar-DpWhcyhC.js","/assets/revalidation-ws-BJWJviUX.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/diff.$shortcut":{"id":"routes/diff.$shortcut","parentId":"routes/diff","path":":shortcut","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/diff._shortcut-l0sNRNKZ.js","imports":[],"css":[]},"routes/exercises":{"id":"routes/exercises","parentId":"root","path":"exercises","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/exercises-l0sNRNKZ.js","imports":[],"css":[]},"routes/launch-editor":{"id":"routes/launch-editor","parentId":"root","path":"launch-editor","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/launch-editor-l0sNRNKZ.js","imports":[],"css":[]},"routes/login-sse":{"id":"routes/login-sse","parentId":"root","path":"login-sse","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/login-sse-l0sNRNKZ.js","imports":[],"css":[]},"routes/mark-onboarding-complete":{"id":"routes/mark-onboarding-complete","parentId":"root","path":"mark-onboarding-complete","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/mark-onboarding-complete-l0sNRNKZ.js","imports":[],"css":[]},"routes/mcp-ui+/epic-video":{"id":"routes/mcp-ui+/epic-video","parentId":"root","path":"mcp-ui/epic-video","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/epic-video-BtFzbNqF.js","imports":["/assets/chunk-EPOLDU6W-BCLmut3y.js","/assets/jsx-runtime-C5WNSv3b.js","/assets/index-CqIc3cxq.js","/assets/epic-video-DzLohyvt.js","/assets/use-event-source-BuD4_2SF.js","/assets/index-DzdDahau.js","/assets/index-vDCSPjrM.js","/assets/index-CdzVFL-Z.js","/assets/misc-W4055b-0.js","/assets/tooltip-Tlsyx2YO.js","/assets/root-loader-BOzEMapJ.js","/assets/pe-CIZUOJMr.js","/assets/schemas-Uj5SZtvt.js","/assets/online-DiNLkgTC.js","/assets/loading-CDNzW5oO.js","/assets/format-CZ5n8p10.js","/assets/user-BsPobzjB.js","/assets/workshop-config-Zfc8zU0x.js"],"css":["/assets/epic-video-irT-uesJ.css"]},"routes/og":{"id":"routes/og","parentId":"root","path":"og","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/og-l0sNRNKZ.js","imports":[],"css":[]},"routes/persist-playground":{"id":"routes/persist-playground","parentId":"root","path":"persist-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/persist-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/processes":{"id":"routes/processes","parentId":"root","path":"processes","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/processes-l0sNRNKZ.js","imports":[],"css":[]},"routes/progress":{"id":"routes/progress","parentId":"root","path":"progress","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/progress-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/healthcheck":{"id":"routes/resources+/healthcheck","parentId":"root","path":"resources/healthcheck","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/healthcheck-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/lookout":{"id":"routes/resources+/lookout","parentId":"root","path":"resources/lookout","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/lookout-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-video-progress.$playbackId":{"id":"routes/resources+/offline-video-progress.$playbackId","parentId":"root","path":"resources/offline-video-progress/:playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-video-progress._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos":{"id":"routes/resources+/offline-videos","parentId":"root","path":"resources/offline-videos","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos-l0sNRNKZ.js","imports":[],"css":[]},"routes/resources+/offline-videos.$playbackId":{"id":"routes/resources+/offline-videos.$playbackId","parentId":"routes/resources+/offline-videos","path":":playbackId","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/offline-videos._playbackId-l0sNRNKZ.js","imports":[],"css":[]},"routes/robots[.]txt":{"id":"routes/robots[.]txt","parentId":"root","path":"robots.txt","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/robots_._txt-l0sNRNKZ.js","imports":[],"css":[]},"routes/saved-playgrounds":{"id":"routes/saved-playgrounds","parentId":"root","path":"saved-playgrounds","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/saved-playgrounds-l0sNRNKZ.js","imports":[],"css":[]},"routes/set-playground":{"id":"routes/set-playground","parentId":"root","path":"set-playground","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/set-playground-l0sNRNKZ.js","imports":[],"css":[]},"routes/sitemap[.]xml":{"id":"routes/sitemap[.]xml","parentId":"root","path":"sitemap.xml","hasAction":false,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/sitemap_._xml-l0sNRNKZ.js","imports":[],"css":[]},"routes/start":{"id":"routes/start","parentId":"root","path":"start","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/start-l0sNRNKZ.js","imports":[],"css":[]},"routes/test":{"id":"routes/test","parentId":"root","path":"test","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/test-l0sNRNKZ.js","imports":[],"css":[]},"routes/theme/index":{"id":"routes/theme/index","parentId":"root","path":"theme","hasAction":true,"hasLoader":true,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-DP2rzg_V.js","imports":[],"css":[]},"routes/video-player/index":{"id":"routes/video-player/index","parentId":"root","path":"video-player","hasAction":true,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasClientMiddleware":false,"hasErrorBoundary":false,"module":"/assets/index-K6Dvbx-E.js","imports":[],"css":[]}},"url":"/assets/manifest-65ac4702.js","version":"65ac4702"};