@fapost/jig-ui 0.1.0-next.1 → 0.1.0-next.11

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.
package/dist/args.js CHANGED
@@ -10,6 +10,7 @@ export function parseCliArgs(argv) {
10
10
  allowPositionals: false,
11
11
  options: {
12
12
  port: { type: 'string' },
13
+ 'no-open': { type: 'boolean' },
13
14
  help: { type: 'boolean', short: 'h' },
14
15
  version: { type: 'boolean', short: 'v' },
15
16
  },
@@ -22,11 +23,12 @@ export function parseCliArgs(argv) {
22
23
  return { kind: 'help' };
23
24
  if (values.version)
24
25
  return { kind: 'version' };
26
+ const open = !values['no-open'];
25
27
  if (values.port === undefined)
26
- return { kind: 'run', port: DEFAULT_PORT };
28
+ return { kind: 'run', port: DEFAULT_PORT, open };
27
29
  const port = /^\d+$/.test(values.port) ? Number(values.port) : Number.NaN;
28
30
  if (!Number.isInteger(port) || port < 1 || port > 65535) {
29
31
  return { kind: 'error', message: `Invalid --port value: ${values.port}. Use a number from 1 to 65535.` };
30
32
  }
31
- return { kind: 'run', port };
33
+ return { kind: 'run', port, open };
32
34
  }
@@ -0,0 +1,23 @@
1
+ const COLUMNS = [
2
+ { id: 'backlog', title: 'Backlog' },
3
+ { id: 'in-progress', title: 'In progress' },
4
+ { id: 'needs-you', title: 'Needs you' },
5
+ { id: 'paused', title: 'Paused' },
6
+ { id: 'ready', title: 'Ready' },
7
+ ];
8
+ /** Where a task stands, from Jig's state alone; the first rule that fits wins. */
9
+ export function columnOf(task) {
10
+ if (task.paused)
11
+ return 'paused';
12
+ if (!task.started)
13
+ return 'backlog';
14
+ if (task.gate === 'waiting' || task.gate === 'changed' || task.autopilot === 'stopped')
15
+ return 'needs-you';
16
+ if (task.status === 'ready')
17
+ return 'ready';
18
+ return 'in-progress';
19
+ }
20
+ /** The board: every column, in a fixed order, its cards in the order Jig listed them. Computed on every read, never stored. */
21
+ export function columns(tasks) {
22
+ return COLUMNS.map((c) => ({ ...c, cards: tasks.filter((t) => columnOf(t) === c.id) }));
23
+ }
@@ -0,0 +1,46 @@
1
+ import { timingSafeEqual } from 'node:crypto';
2
+ import { getCookie, setCookie } from 'hono/cookie';
3
+ import { cookieName } from '../registry/instance.js';
4
+ /** Refuses requests whose `Host` or `Origin` is not this server's own loopback address. */
5
+ export function localOnly(port) {
6
+ const hosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`]);
7
+ const origins = new Set([`http://127.0.0.1:${port}`, `http://localhost:${port}`]);
8
+ return async (c, next) => {
9
+ const host = c.req.header('host');
10
+ const origin = c.req.header('origin');
11
+ if (host === undefined || !hosts.has(host.toLowerCase())) {
12
+ return c.text('Forbidden', 403);
13
+ }
14
+ if (origin !== undefined && !origins.has(origin.toLowerCase())) {
15
+ return c.text('Forbidden', 403);
16
+ }
17
+ await next();
18
+ };
19
+ }
20
+ function sameSecret(given, token) {
21
+ if (given === undefined)
22
+ return false;
23
+ const a = Buffer.from(given);
24
+ const b = Buffer.from(token);
25
+ return a.length === b.length && timingSafeEqual(a, b);
26
+ }
27
+ /**
28
+ * The per-start token: `/?token=` swaps it for a cookie and redirects to `/`, and every `/api/*`
29
+ * request without that cookie is refused. Static files need no token; they carry no data.
30
+ */
31
+ export function tokenAccess({ port, token }) {
32
+ const cookie = cookieName(port);
33
+ return async (c, next) => {
34
+ const path = c.req.path;
35
+ if (path === '/' && c.req.query('token') !== undefined) {
36
+ if (!sameSecret(c.req.query('token'), token))
37
+ return c.text('Forbidden', 403);
38
+ setCookie(c, cookie, token, { httpOnly: true, sameSite: 'Strict', path: '/' });
39
+ return c.redirect('/', 302);
40
+ }
41
+ if ((path === '/api' || path.startsWith('/api/')) && !sameSecret(getCookie(c, cookie), token)) {
42
+ return c.json({ error: 'unauthorized' }, 401);
43
+ }
44
+ await next();
45
+ };
46
+ }
package/dist/http/app.js CHANGED
@@ -1,5 +1,13 @@
1
- import { readFileSync } from 'node:fs';
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { isAbsolute, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { serveStatic } from '@hono/node-server/serve-static';
2
6
  import { Hono } from 'hono';
7
+ import { streamSSE } from 'hono/streaming';
8
+ import { columns } from '../board/columns.js';
9
+ import { RegistryUnreadable } from '../source/project-source.js';
10
+ import { localOnly, tokenAccess } from './access.js';
3
11
  /**
4
12
  * Reads the version from the package's own package.json. The relative path is the same from
5
13
  * `server/http/` (tests) and `dist/http/` (published), as both sit two levels below the root.
@@ -9,37 +17,73 @@ export function readPackageVersion() {
9
17
  const pkg = JSON.parse(readFileSync(url, 'utf8'));
10
18
  return pkg.version;
11
19
  }
12
- /** Refuses requests whose `Host` or `Origin` is not this server's own loopback address. */
13
- export function localOnly(port) {
14
- const hosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`]);
15
- const origins = new Set([`http://127.0.0.1:${port}`, `http://localhost:${port}`]);
16
- return async (c, next) => {
17
- const host = c.req.header('host');
18
- const origin = c.req.header('origin');
19
- if (host === undefined || !hosts.has(host.toLowerCase())) {
20
- return c.text('Forbidden', 403);
21
- }
22
- if (origin !== undefined && !origins.has(origin.toLowerCase())) {
23
- return c.text('Forbidden', 403);
24
- }
25
- await next();
26
- };
20
+ /** The built page: `dist/web`, next to `dist/http` where this file runs when published. */
21
+ export const DEFAULT_WEB_ROOT = fileURLToPath(new URL('../web', import.meta.url));
22
+ /** How often an idle stream sends a comment, so a closed tab is noticed and its subscription ends. */
23
+ const PING_MS = 30_000;
24
+ const refuse = (c, status, code, message) => c.json({ error: { code, message } }, status);
25
+ /** The path the person typed, absolute; `~/` stands for their home. */
26
+ function absolute(path) {
27
+ if (typeof path !== 'string')
28
+ return undefined;
29
+ const expanded = path.trim().replace(/^~(?=$|[\\/])/, homedir());
30
+ return isAbsolute(expanded) ? expanded : undefined;
27
31
  }
28
- export function createApp({ port, version = readPackageVersion() }) {
32
+ export function createApp({ port, token, source, version = readPackageVersion(), webRoot = DEFAULT_WEB_ROOT }) {
29
33
  const app = new Hono();
30
34
  app.use(localOnly(port));
31
- app.get('/', (c) => c.html(`<!doctype html>
32
- <html lang="en">
33
- <head>
34
- <meta charset="utf-8" />
35
- <meta name="viewport" content="width=device-width, initial-scale=1" />
36
- <title>Jig UI</title>
37
- </head>
38
- <body>
39
- <h1>Jig UI &mdash; not built yet</h1>
40
- <p>Version ${version}</p>
41
- </body>
42
- </html>
43
- `));
35
+ app.use(tokenAccess({ port, token }));
36
+ app.onError((error, c) => {
37
+ if (error instanceof RegistryUnreadable)
38
+ return refuse(c, 500, 'registry-unreadable', error.message);
39
+ console.error(error);
40
+ return c.text('Internal Server Error', 500);
41
+ });
42
+ app.get('/api/instance', (c) => c.json({ version }));
43
+ app.get('/api/workspace', async (c) => c.json({ projects: await source.workspace() }));
44
+ app.get('/api/projects/:id/board', async (c) => {
45
+ const id = c.req.param('id');
46
+ const read = await source.tasks(id);
47
+ if (read === undefined)
48
+ return refuse(c, 404, 'not-connected', 'No connected project has this id.');
49
+ if (read.state !== 'ready')
50
+ return c.json({ board: read });
51
+ return c.json({ board: { id, state: 'ready', columns: columns(read.tasks), finished: read.finished } });
52
+ });
53
+ app.post('/api/projects', async (c) => {
54
+ const body = await c.req.json().catch(() => undefined);
55
+ const path = absolute(body?.path);
56
+ if (path === undefined)
57
+ return refuse(c, 422, 'usage', 'Give the absolute path of a project.');
58
+ const result = await source.connect(path);
59
+ if ('code' in result)
60
+ return refuse(c, 422, result.code, result.message);
61
+ return c.json({ project: result.project }, result.created ? 201 : 200);
62
+ });
63
+ app.delete('/api/projects/:id', async (c) => {
64
+ if (!(await source.disconnect(c.req.param('id')))) {
65
+ return refuse(c, 404, 'not-connected', 'No connected project has this id.');
66
+ }
67
+ return c.body(null, 204);
68
+ });
69
+ // A signal, not data: the page re-fetches what it shows (adr-20261014-project-source-port-keeps-hosting-open).
70
+ app.get('/api/events', (c) => streamSSE(c, async (stream) => {
71
+ const unsubscribe = source.subscribe(({ id, revision }) => {
72
+ void stream.writeSSE({ event: 'changed', data: JSON.stringify({ project: id, revision }) });
73
+ });
74
+ stream.onAbort(unsubscribe);
75
+ while (!stream.aborted) {
76
+ await stream.sleep(PING_MS);
77
+ if (!stream.aborted)
78
+ await stream.write(': ping\n\n');
79
+ }
80
+ }));
81
+ app.all('/api/*', (c) => c.json({ error: 'not found' }, 404));
82
+ if (existsSync(join(webRoot, 'index.html'))) {
83
+ app.use('/*', serveStatic({ root: webRoot }));
84
+ }
85
+ else {
86
+ app.get('/', (c) => c.text('The page is not built. Run npm run build.', 503));
87
+ }
44
88
  return app;
45
89
  }
@@ -0,0 +1,170 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ const run = promisify(execFile);
6
+ /** The oldest Jig whose reads Jig UI understands: 0.29.0 is the first that prints JSON. */
7
+ export const MIN_JIG_VERSION = '0.29.0';
8
+ const SCRIPT = join('.ai', 'scripts', 'jig');
9
+ const TIMEOUT_MS = 10_000;
10
+ /** The directory whose changes may change what Jig reports: the main checkout's `.ai/`. */
11
+ export const watchDir = (root) => join(root, '.ai');
12
+ /**
13
+ * True for a path under `.ai/` (with `/` separators) that Jig writes while it only reads — its
14
+ * records of what it is doing under `runtime/` — so a change there is no sign of a change, and
15
+ * watching it would make every read trigger the next. `runtime/revision/` is where the clone's
16
+ * revision rises on each Jig write, and stays a sign. Jig names no such path in its contract
17
+ * (Jig 0.29.0, found by watching which files its reads touch).
18
+ */
19
+ export const writtenByReads = (path) => (path === 'runtime' || path.startsWith('runtime/')) && !path.startsWith('runtime/revision');
20
+ /**
21
+ * The bash that runs `.ai/scripts/jig`. On Windows it is Git's, found next to git itself
22
+ * (`<git>/mingw64/libexec/git-core` → `<git>/bin/bash.exe`): a `bash` on PATH may be WSL's.
23
+ */
24
+ async function bash(platform) {
25
+ if (platform !== 'win32')
26
+ return 'bash';
27
+ const { stdout } = await run('git', ['--exec-path'], { timeout: TIMEOUT_MS });
28
+ return resolve(stdout.trim(), '..', '..', '..', 'bin', 'bash.exe');
29
+ }
30
+ /** Runs the project's own Jig in its main checkout, without a shell. */
31
+ async function jig(root, args, platform) {
32
+ const { stdout } = await run(await bash(platform), [SCRIPT, ...args], { cwd: root, timeout: TIMEOUT_MS });
33
+ return stdout;
34
+ }
35
+ /**
36
+ * The project's Jig version, `undefined` when the checkout has no Jig. Throws when Jig is there but
37
+ * does not answer with a version.
38
+ */
39
+ export async function jigVersion(root, platform = process.platform) {
40
+ if (!existsSync(join(root, SCRIPT)))
41
+ return undefined;
42
+ const match = /^jig (\d+\.\d+\.\d+)\b/.exec((await jig(root, ['--version'], platform)).trim());
43
+ if (!match?.[1])
44
+ throw new Error('jig --version did not print a version');
45
+ return match[1];
46
+ }
47
+ /** Why a JSON read was refused: Jig's failure code (`failed` for one this Jig UI does not know, or a shape it cannot read). */
48
+ export class JigRefusal extends Error {
49
+ code;
50
+ constructor(code) {
51
+ super(`jig refused: ${code}`);
52
+ this.code = code;
53
+ }
54
+ }
55
+ const CODES = new Set(['usage', 'not-a-repository', 'not-initialised', 'failed']);
56
+ /** Jig answered in a shape this Jig UI does not read: a Jig newer than the contract its tests pin. */
57
+ export class JigShapeError extends Error {
58
+ constructor() {
59
+ super('jig answered in a shape this Jig UI does not read');
60
+ }
61
+ }
62
+ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
63
+ const isString = (v) => typeof v === 'string';
64
+ const isNullableString = (v) => v === null || typeof v === 'string';
65
+ /**
66
+ * Runs a `--json` read and returns its `data` and the clone's revision. Jig's refusal throws
67
+ * JigRefusal, as does output that is no JSON at all (a crash); an envelope of another shape throws
68
+ * JigShapeError.
69
+ */
70
+ async function readJson(root, args, platform) {
71
+ let stdout;
72
+ try {
73
+ stdout = await jig(root, [...args, '--json'], platform);
74
+ }
75
+ catch (error) {
76
+ // A refusal is an envelope too, printed before the non-zero exit.
77
+ stdout = error.stdout ?? '';
78
+ }
79
+ let envelope;
80
+ try {
81
+ envelope = JSON.parse(stdout);
82
+ }
83
+ catch {
84
+ throw new JigRefusal('failed');
85
+ }
86
+ if (!isObject(envelope) || envelope.schema !== 1 || typeof envelope.revision !== 'number')
87
+ throw new JigShapeError();
88
+ if (isObject(envelope.error)) {
89
+ const code = envelope.error.code;
90
+ throw new JigRefusal(isString(code) && CODES.has(code) ? code : 'failed');
91
+ }
92
+ if (!isObject(envelope.data))
93
+ throw new JigShapeError();
94
+ return { revision: envelope.revision, data: envelope.data };
95
+ }
96
+ const isAttention = (v) => isObject(v) &&
97
+ isString(v.kind) &&
98
+ isObject(v.subject) &&
99
+ isString(v.subject.type) &&
100
+ isNullableString(v.subject.id) &&
101
+ Array.isArray(v.tasks) &&
102
+ v.tasks.every(isString) &&
103
+ isString(v.title) &&
104
+ isNullableString(v.detail) &&
105
+ isString(v.todo) &&
106
+ isNullableString(v.url);
107
+ /** What needs the person in a project, most urgent first, and whether the pull request facts behind it may be missing. */
108
+ export async function readStatus(root, platform = process.platform) {
109
+ const { revision, data } = await readJson(root, ['status'], platform);
110
+ const { attention, housekeeping } = data;
111
+ if (!Array.isArray(attention) || !attention.every(isAttention))
112
+ throw new JigShapeError();
113
+ if (housekeeping !== null && !(isObject(housekeeping) && typeof housekeeping.stale === 'boolean'))
114
+ throw new JigShapeError();
115
+ return {
116
+ revision,
117
+ attention: attention.map(({ kind, subject, tasks, title, detail, todo, url }) => ({
118
+ kind,
119
+ subject: { type: subject.type, id: subject.id },
120
+ tasks: [...tasks],
121
+ title,
122
+ detail,
123
+ todo,
124
+ url,
125
+ })),
126
+ housekeepingStale: housekeeping?.stale === true,
127
+ };
128
+ }
129
+ const STATUSES = new Set(['active', 'ready', 'consolidated', 'abandoned']);
130
+ const isNullableState = (v) => v === null || (isObject(v) && isString(v.state));
131
+ const isPullRequest = (v) => v === null || (isObject(v) && isString(v.url) && isNullableString(v.state) && isNullableString(v.ci));
132
+ const isTaskRow = (v) => isObject(v) &&
133
+ isString(v.id) &&
134
+ isNullableString(v.class) &&
135
+ isString(v.status) &&
136
+ STATUSES.has(v.status) &&
137
+ isNullableString(v.goal) &&
138
+ typeof v.paused === 'boolean' &&
139
+ isNullableString(v.branch) &&
140
+ isNullableState(v.gate) &&
141
+ isNullableState(v.autopilot) &&
142
+ isPullRequest(v.pull_request);
143
+ /** The project's live tasks (`jig task list --json`) and how many finished ones it left out. */
144
+ export async function readTasks(root, platform = process.platform) {
145
+ const { revision, data } = await readJson(root, ['task', 'list'], platform);
146
+ if (!Array.isArray(data.tasks) || !data.tasks.every(isTaskRow) || typeof data.hidden !== 'number')
147
+ throw new JigShapeError();
148
+ const tasks = data.tasks.map(({ id, class: cls, status, goal, paused, branch, gate, autopilot, pull_request: pr }) => ({
149
+ id,
150
+ class: cls,
151
+ status,
152
+ goal,
153
+ paused,
154
+ branch,
155
+ gate: gate && { state: gate.state },
156
+ autopilot: autopilot && { state: autopilot.state },
157
+ pullRequest: pr && { url: pr.url, state: pr.state, ci: pr.ci },
158
+ }));
159
+ return { revision, tasks, hidden: data.hidden };
160
+ }
161
+ /** True when `version` is at least the minimum Jig UI reads. */
162
+ export function supports(version, minimum = MIN_JIG_VERSION) {
163
+ const a = version.split('.').map(Number);
164
+ const b = minimum.split('.').map(Number);
165
+ for (let i = 0; i < 3; i++) {
166
+ if ((a[i] ?? 0) !== (b[i] ?? 0))
167
+ return (a[i] ?? 0) > (b[i] ?? 0);
168
+ }
169
+ return true;
170
+ }
package/dist/main.js CHANGED
@@ -1,11 +1,19 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { homedir } from 'node:os';
3
+ import { setTimeout as delay } from 'node:timers/promises';
1
4
  import { serve } from '@hono/node-server';
2
- import { parseCliArgs } from './args.js';
5
+ import { DEFAULT_PORT, parseCliArgs } from './args.js';
3
6
  import { createApp, readPackageVersion } from './http/app.js';
7
+ import { openBrowser } from './open-browser.js';
8
+ import { configDir } from './registry/config-dir.js';
9
+ import { probeInstance, readInstance, removeInstance, writeInstance } from './registry/instance.js';
10
+ import { localSource } from './source/local.js';
4
11
  const HOST = '127.0.0.1';
5
12
  const HELP = `Usage: jig-ui [options]
6
13
 
7
14
  Options:
8
15
  --port <n> Port to listen on (default 4870)
16
+ --no-open Print the link instead of opening the browser
9
17
  -v, --version Print the version and exit
10
18
  -h, --help Print this help and exit
11
19
  `;
@@ -13,7 +21,28 @@ function fail(message) {
13
21
  console.error(message);
14
22
  process.exit(1);
15
23
  }
16
- export function main() {
24
+ const link = ({ port, token }) => `http://${HOST}:${port}/?token=${token}`;
25
+ async function show(info, open, dir) {
26
+ console.log(`Open it at ${link(info)}`);
27
+ if (open && !(await openBrowser(link(info), dir)))
28
+ console.log('Could not open a browser; open the link above.');
29
+ }
30
+ /** The instance recorded in the config directory, if it still answers with its token. */
31
+ async function runningInstance(dir) {
32
+ const info = await readInstance(dir);
33
+ return info && (await probeInstance(info)) ? info : undefined;
34
+ }
35
+ /** After losing the port: the winner writes its file only once it listens, so give it a moment. */
36
+ async function winnerOfRace(dir) {
37
+ for (let attempt = 0; attempt < 5; attempt++) {
38
+ const winner = await runningInstance(dir);
39
+ if (winner)
40
+ return winner;
41
+ await delay(200);
42
+ }
43
+ return undefined;
44
+ }
45
+ export async function main() {
17
46
  const command = parseCliArgs(process.argv.slice(2));
18
47
  if (command.kind === 'error')
19
48
  fail(command.message);
@@ -25,22 +54,45 @@ export function main() {
25
54
  console.log(readPackageVersion());
26
55
  return;
27
56
  }
28
- const { port } = command;
57
+ const { port, open } = command;
58
+ const dir = configDir(process.env, process.platform, homedir());
59
+ const running = await runningInstance(dir);
60
+ if (running) {
61
+ console.log(`Jig UI is already running on port ${running.port}.`);
62
+ // ponytail: a --port equal to the default is indistinguishable from no flag; no note then.
63
+ if (port !== running.port && port !== DEFAULT_PORT)
64
+ console.log(`--port ${port} is ignored.`);
65
+ await show(running, open, dir);
66
+ return;
67
+ }
29
68
  const version = readPackageVersion();
30
- const server = serve({ fetch: createApp({ port, version }).fetch, hostname: HOST, port }, () => {
31
- console.log(`Jig UI ${version} is running at http://${HOST}:${port}/`);
32
- console.log('Press Ctrl+C to stop.');
69
+ const token = randomBytes(32).toString('base64url');
70
+ const server = serve({ fetch: createApp({ port, token, source: localSource(dir), version }).fetch, hostname: HOST, port }, () => {
71
+ void (async () => {
72
+ await writeInstance(dir, { port, token, pid: process.pid, version });
73
+ console.log(`Jig UI ${version} is running at http://${HOST}:${port}/`);
74
+ await show({ port, token }, open, dir);
75
+ console.log('Press Ctrl+C to stop.');
76
+ })().catch((error) => fail(`Could not start: ${error instanceof Error ? error.message : String(error)}`));
33
77
  });
34
78
  server.on('error', (error) => {
35
- if (error.code === 'EADDRINUSE') {
36
- fail(`Port ${port} is already in use. Stop the other process or choose another port with --port.`);
37
- }
38
- fail(`Could not start the server: ${error.message}`);
79
+ if (error.code !== 'EADDRINUSE')
80
+ fail(`Could not start the server: ${error.message}`);
81
+ // Two starts at once: the one that lost the port opens the one that won.
82
+ void winnerOfRace(dir).then(async (winner) => {
83
+ if (!winner)
84
+ fail(`Port ${port} is already in use. Stop the other process or choose another port with --port.`);
85
+ console.log(`Jig UI is already running on port ${winner.port}.`);
86
+ await show(winner, open, dir);
87
+ process.exit(0);
88
+ });
39
89
  });
40
90
  const shutdown = () => {
41
- server.close(() => process.exit(0));
42
- if ('closeAllConnections' in server)
43
- server.closeAllConnections();
91
+ void removeInstance(dir, token).finally(() => {
92
+ server.close(() => process.exit(0));
93
+ if ('closeAllConnections' in server)
94
+ server.closeAllConnections();
95
+ });
44
96
  };
45
97
  process.on('SIGINT', shutdown);
46
98
  process.on('SIGTERM', shutdown);
@@ -0,0 +1,47 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { OPEN_FILE, writeConfigFile } from './registry/instance.js';
3
+ /** The system command that opens a file in the default browser. */
4
+ export function browserCommand(platform, file) {
5
+ if (platform === 'darwin')
6
+ return { cmd: 'open', args: [file] };
7
+ if (platform === 'win32')
8
+ return { cmd: 'explorer.exe', args: [file] };
9
+ return { cmd: 'xdg-open', args: [file] };
10
+ }
11
+ /** A page that sends the browser on to `url`; the token travels in the file, not in a process's arguments. */
12
+ export function redirectPage(url) {
13
+ const json = JSON.stringify(url).replace(/</g, '\\u003c');
14
+ const attr = url.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
15
+ return `<!doctype html>
16
+ <html lang="en">
17
+ <head>
18
+ <meta charset="utf-8" />
19
+ <meta http-equiv="refresh" content="0; url=${attr}" />
20
+ <title>Jig UI</title>
21
+ <script>location.replace(${json});</script>
22
+ </head>
23
+ <body><a href="${attr}">Open Jig UI</a></body>
24
+ </html>
25
+ `;
26
+ }
27
+ /**
28
+ * Opens `url` in the default browser through a redirect file, because `ps` shows every user the
29
+ * arguments of a process, and the url carries the token. The file lives in the config directory
30
+ * and is not removed here: a second start exits at once, maybe before the browser read it; the
31
+ * instance removes it when it stops. Resolves false when no browser could be started; the caller
32
+ * prints the link instead.
33
+ */
34
+ export async function openBrowser(url, dir, platform = process.platform) {
35
+ let file;
36
+ try {
37
+ file = await writeConfigFile(dir, OPEN_FILE, redirectPage(url));
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ const { cmd, args } = browserCommand(platform, file);
43
+ return new Promise((resolve) => {
44
+ // explorer.exe exits with 1 even when it opened the file, so on Windows only a spawn error counts.
45
+ execFile(cmd, args, (error) => resolve(!error || (platform === 'win32' && typeof error.code === 'number')));
46
+ });
47
+ }
@@ -0,0 +1,10 @@
1
+ import { posix, win32 } from 'node:path';
2
+ /**
3
+ * Jig UI's config directory, following each system's convention: `%APPDATA%\jig-ui` on Windows,
4
+ * else `$XDG_CONFIG_HOME/jig-ui`, else `~/.config/jig-ui`. Pure: the caller passes the environment.
5
+ */
6
+ export function configDir(env, platform, home) {
7
+ if (platform === 'win32')
8
+ return win32.join(env.APPDATA || win32.join(home, 'AppData', 'Roaming'), 'jig-ui');
9
+ return posix.join(env.XDG_CONFIG_HOME || posix.join(home, '.config'), 'jig-ui');
10
+ }
@@ -0,0 +1,50 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ const FILE = 'instance.json';
5
+ /** The page that sends the browser on to the instance; it carries the token, so it lives here too. */
6
+ export const OPEN_FILE = 'open.html';
7
+ /** The cookie that carries the token; named by port, as browsers do not separate cookies by port. */
8
+ export const cookieName = (port) => `jig-ui-${port}`;
9
+ export async function readInstance(dir) {
10
+ try {
11
+ const info = JSON.parse(await readFile(join(dir, FILE), 'utf8'));
12
+ if (typeof info.port !== 'number' || typeof info.token !== 'string')
13
+ return undefined;
14
+ return info;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ /** Writes a file of the config directory atomically (temp file, then rename), readable only by the user. */
21
+ export async function writeConfigFile(dir, name, content) {
22
+ await mkdir(dir, { recursive: true, mode: 0o700 });
23
+ const temp = join(dir, `${name}.${randomBytes(6).toString('hex')}.tmp`);
24
+ await writeFile(temp, content, { mode: 0o600 });
25
+ await rename(temp, join(dir, name));
26
+ return join(dir, name);
27
+ }
28
+ export async function writeInstance(dir, info) {
29
+ await writeConfigFile(dir, FILE, `${JSON.stringify(info, null, 2)}\n`);
30
+ }
31
+ /** Removes the files only while they are still ours: an instance started after us may have replaced them. */
32
+ export async function removeInstance(dir, token) {
33
+ if ((await readInstance(dir))?.token !== token)
34
+ return;
35
+ await rm(join(dir, OPEN_FILE), { force: true });
36
+ await rm(join(dir, FILE), { force: true });
37
+ }
38
+ /** True when an instance answers on its port with its token; a crash leaves the file behind. */
39
+ export async function probeInstance(info, timeoutMs = 1000) {
40
+ try {
41
+ const res = await fetch(`http://127.0.0.1:${info.port}/api/instance`, {
42
+ headers: { cookie: `${cookieName(info.port)}=${info.token}` },
43
+ signal: AbortSignal.timeout(timeoutMs),
44
+ });
45
+ return res.ok;
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
@@ -0,0 +1,78 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { basename, join } from 'node:path';
3
+ import { writeConfigFile } from './instance.js';
4
+ const FILE = 'projects.json';
5
+ /** The registry file exists but cannot be read; it is never overwritten then, so the list is not lost. */
6
+ export class RegistryUnreadable extends Error {
7
+ constructor() {
8
+ super(`${FILE} in Jig UI's config directory cannot be read; fix or remove it.`);
9
+ }
10
+ }
11
+ const isProject = (p) => typeof p === 'object' && p !== null && typeof p.id === 'string' && typeof p.path === 'string';
12
+ /** The connected projects in the order they were connected; none when there is no registry yet. */
13
+ export async function readProjects(dir) {
14
+ let text;
15
+ try {
16
+ text = await readFile(join(dir, FILE), 'utf8');
17
+ }
18
+ catch (error) {
19
+ if (error.code === 'ENOENT')
20
+ return [];
21
+ throw new RegistryUnreadable();
22
+ }
23
+ try {
24
+ const { projects } = JSON.parse(text);
25
+ if (Array.isArray(projects) && projects.every(isProject))
26
+ return projects;
27
+ }
28
+ catch {
29
+ // falls through
30
+ }
31
+ throw new RegistryUnreadable();
32
+ }
33
+ /** The id for a checkout: its directory name as a slug, with `-2`, `-3`… when that is taken. */
34
+ export function slugFor(root, taken) {
35
+ const base = basename(root)
36
+ .normalize('NFKD')
37
+ .replace(/[̀-ͯ]/g, '')
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9]+/g, '-')
40
+ .replace(/^-+|-+$/g, '') || 'project';
41
+ let id = base;
42
+ for (let n = 2; taken.has(id); n++)
43
+ id = `${base}-${n}`;
44
+ return id;
45
+ }
46
+ // One instance is the only writer; this chain keeps its own requests from overlapping.
47
+ let writes = Promise.resolve();
48
+ function serialized(change) {
49
+ const next = writes.then(change, change);
50
+ writes = next.catch(() => undefined);
51
+ return next;
52
+ }
53
+ async function save(dir, projects) {
54
+ await writeConfigFile(dir, FILE, `${JSON.stringify({ projects }, null, 2)}\n`);
55
+ }
56
+ /** Connects the checkout at `root`; a checkout already connected keeps its id. */
57
+ export function addProject(dir, root) {
58
+ return serialized(async () => {
59
+ const projects = await readProjects(dir);
60
+ const existing = projects.find((p) => p.path === root);
61
+ if (existing)
62
+ return { project: existing, created: false };
63
+ const project = { id: slugFor(root, new Set(projects.map((p) => p.id))), path: root };
64
+ await save(dir, [...projects, project]);
65
+ return { project, created: true };
66
+ });
67
+ }
68
+ /** Disconnects a project; false when no project has that id. Nothing in the project is touched. */
69
+ export function removeProject(dir, id) {
70
+ return serialized(async () => {
71
+ const projects = await readProjects(dir);
72
+ const rest = projects.filter((p) => p.id !== id);
73
+ if (rest.length === projects.length)
74
+ return false;
75
+ await save(dir, rest);
76
+ return true;
77
+ });
78
+ }
@@ -0,0 +1,25 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { realpath } from 'node:fs/promises';
3
+ import { promisify } from 'node:util';
4
+ const run = promisify(execFile);
5
+ /**
6
+ * Where `path` sits in git: a clone's main checkout (its root, even from a subdirectory), a
7
+ * worktree, or nothing git knows. Only a worktree has a git directory of its own beside the
8
+ * clone's common one; a submodule or a `--separate-git-dir` clone has one directory for both.
9
+ */
10
+ export async function mainCheckout(path) {
11
+ let stdout;
12
+ try {
13
+ ({ stdout } = await run('git', ['rev-parse', '--path-format=absolute', '--show-toplevel', '--git-dir', '--git-common-dir'], {
14
+ cwd: path,
15
+ timeout: 10_000,
16
+ }));
17
+ }
18
+ catch {
19
+ return { kind: 'not-a-repository' };
20
+ }
21
+ const [top, own, common] = stdout.trim().split(/\r?\n/);
22
+ if (!top || !own || !common)
23
+ return { kind: 'not-a-repository' };
24
+ return (await realpath(own)) === (await realpath(common)) ? { kind: 'main', root: await realpath(top) } : { kind: 'worktree' };
25
+ }
@@ -0,0 +1,240 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { JigRefusal, JigShapeError, jigVersion, MIN_JIG_VERSION, readStatus, readTasks, supports, watchDir, writtenByReads, } from '../jig/client.js';
3
+ import { addProject, readProjects, removeProject } from '../registry/projects.js';
4
+ import { watchTree } from '../watch/watch.js';
5
+ import { mainCheckout } from './checkout.js';
6
+ /** Jig's version in the checkout: `null` when Jig is there but names no version Jig UI can read. */
7
+ async function version(root) {
8
+ try {
9
+ return await jigVersion(root);
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ /** The main checkout `path` names, or why it cannot be connected. A Jig below the minimum can. */
16
+ async function connectable(path) {
17
+ const checkout = await mainCheckout(path);
18
+ if (checkout.kind === 'not-a-repository') {
19
+ return { code: 'not-a-repository', message: 'This is not a directory inside a git repository.' };
20
+ }
21
+ if (checkout.kind === 'worktree') {
22
+ return { code: 'worktree', message: "This is a worktree. Connect its clone's main checkout instead." };
23
+ }
24
+ if ((await version(checkout.root)) === undefined) {
25
+ return { code: 'no-jig', message: 'There is no Jig in this repository. Run jig init in it first.' };
26
+ }
27
+ return { root: checkout.root };
28
+ }
29
+ function count(tasks) {
30
+ return {
31
+ active: tasks.filter((t) => t.status === 'active' && !t.paused).length,
32
+ paused: tasks.filter((t) => t.paused).length,
33
+ ready: tasks.filter((t) => t.status === 'ready' && !t.paused).length,
34
+ };
35
+ }
36
+ /**
37
+ * Runs `read` on a connected project whose Jig Jig UI reads; a project gone, below the minimum, or
38
+ * refusing the read comes back as its state instead.
39
+ */
40
+ async function reading({ id, path }, read) {
41
+ if (!existsSync(path))
42
+ return { id, state: 'unavailable', reason: 'missing' };
43
+ const v = await version(path);
44
+ if (v === undefined)
45
+ return { id, state: 'unavailable', reason: 'no-jig' };
46
+ if (v === null || !supports(v))
47
+ return { id, state: 'unsupported', jigVersion: v, minimum: MIN_JIG_VERSION };
48
+ try {
49
+ return await read(path, v);
50
+ }
51
+ catch (error) {
52
+ if (error instanceof JigShapeError)
53
+ return { id, state: 'incompatible', jigVersion: v };
54
+ // Only the code goes on: Jig's message may name a path.
55
+ return { id, state: 'unreadable', code: error instanceof JigRefusal ? error.code : 'failed' };
56
+ }
57
+ }
58
+ async function readProject(project) {
59
+ const read = await reading(project, async (root, jigVersion) => {
60
+ const [status, list] = await Promise.all([readStatus(root), readTasks(root)]);
61
+ return { status, list, jigVersion };
62
+ });
63
+ if (!('list' in read))
64
+ return { view: read, tasks: read, revision: null };
65
+ const { status, list, jigVersion } = read;
66
+ return {
67
+ view: {
68
+ id: project.id,
69
+ state: 'ready',
70
+ jigVersion,
71
+ counts: count(list.tasks),
72
+ attention: status.attention,
73
+ housekeepingStale: status.housekeepingStale,
74
+ },
75
+ tasks: {
76
+ state: 'ready',
77
+ // Jig's live list holds active and ready tasks only.
78
+ tasks: list.tasks.flatMap((t) => t.status === 'active' || t.status === 'ready'
79
+ ? [
80
+ {
81
+ id: t.id,
82
+ class: t.class,
83
+ status: t.status,
84
+ goal: t.goal,
85
+ paused: t.paused,
86
+ started: t.branch !== null,
87
+ gate: t.gate?.state ?? null,
88
+ autopilot: t.autopilot?.state ?? null,
89
+ pullRequest: t.pullRequest,
90
+ },
91
+ ]
92
+ : []),
93
+ finished: list.hidden,
94
+ },
95
+ revision: list.revision,
96
+ };
97
+ }
98
+ /** A read that may have caught Jig mid-write: worth one more try before it is believed. */
99
+ const torn = (read) => read.view.state === 'unreadable' || read.view.state === 'incompatible';
100
+ /**
101
+ * The local adapter: the registry in the config directory, Jig run in each main checkout, and a
102
+ * Watcher on each project's `.ai/` while someone listens. Then reads are served from what the
103
+ * watch last read, and a change is signalled only when a new read differs from it.
104
+ */
105
+ export function localSource(configDir, { rescanMs = 60_000, quietMs, maxWaitMs } = {}) {
106
+ const entries = new Map();
107
+ const listeners = new Set();
108
+ let rescan;
109
+ const following = () => rescan !== undefined;
110
+ const entryOf = (project) => {
111
+ let entry = entries.get(project.id);
112
+ if (!entry)
113
+ entries.set(project.id, (entry = { project, held: false, dirty: false }));
114
+ return entry;
115
+ };
116
+ /** Keeps what was shown over one torn read; otherwise the read is what the project shows. */
117
+ function settle(entry, read) {
118
+ if (torn(read) && entry.shown && !torn(entry.shown) && !entry.held) {
119
+ entry.held = true;
120
+ return;
121
+ }
122
+ entry.held = false;
123
+ entry.shown = read;
124
+ }
125
+ /** Reads the project again — one read at a time — and signals when what it shows changed. */
126
+ function refresh(entry) {
127
+ if (entry.reading) {
128
+ entry.dirty = true;
129
+ return entry.reading;
130
+ }
131
+ entry.reading = (async () => {
132
+ do {
133
+ entry.dirty = false;
134
+ const before = JSON.stringify(entry.shown);
135
+ settle(entry, await readProject(entry.project));
136
+ if (following() && entries.get(entry.project.id) === entry && JSON.stringify(entry.shown) !== before) {
137
+ signal({ id: entry.project.id, revision: entry.shown?.revision ?? null });
138
+ }
139
+ } while (entry.dirty);
140
+ })().finally(() => (entry.reading = undefined));
141
+ return entry.reading;
142
+ }
143
+ function signal(change) {
144
+ for (const listener of listeners)
145
+ listener(change);
146
+ }
147
+ /** What the project shows: from the watch while following, read through Jig otherwise. */
148
+ async function shown(project) {
149
+ const entry = entryOf(project);
150
+ if (!(following() && entry.shown))
151
+ await (entry.reading ?? refresh(entry));
152
+ return entry.shown;
153
+ }
154
+ function follow(entry) {
155
+ if (entry.watch?.open)
156
+ return;
157
+ entry.watch = watchTree(watchDir(entry.project.path), {
158
+ ignore: writtenByReads,
159
+ onChange: () => void refresh(entry),
160
+ quietMs,
161
+ maxWaitMs,
162
+ });
163
+ }
164
+ /**
165
+ * Follows every registered project and reads it again; forgets one no longer registered, such as
166
+ * one a read in flight brought back after its disconnect.
167
+ */
168
+ async function sweep() {
169
+ // An unreadable registry is the page's to show, through its own read.
170
+ const projects = await readProjects(configDir).catch(() => undefined);
171
+ if (!projects || !following())
172
+ return;
173
+ const ids = new Set(projects.map((p) => p.id));
174
+ for (const [id, entry] of entries) {
175
+ if (ids.has(id))
176
+ continue;
177
+ entry.watch?.close();
178
+ entries.delete(id);
179
+ }
180
+ for (const project of projects) {
181
+ const entry = entryOf(project);
182
+ follow(entry); // a watcher that failed, or a directory that came back
183
+ void refresh(entry);
184
+ }
185
+ }
186
+ function start() {
187
+ rescan = setInterval(() => void sweep(), rescanMs);
188
+ rescan.unref();
189
+ void sweep();
190
+ }
191
+ /** Stops following; what was read while following may be old by the next subscribe, so it goes. */
192
+ function stop() {
193
+ clearInterval(rescan);
194
+ rescan = undefined;
195
+ for (const entry of entries.values()) {
196
+ entry.watch?.close();
197
+ entry.watch = undefined;
198
+ entry.shown = undefined;
199
+ entry.held = false;
200
+ }
201
+ }
202
+ return {
203
+ async workspace() {
204
+ return Promise.all((await readProjects(configDir)).map(async (p) => (await shown(p)).view));
205
+ },
206
+ async connect(path) {
207
+ const found = await connectable(path);
208
+ if ('code' in found)
209
+ return found;
210
+ const { project, created } = await addProject(configDir, found.root);
211
+ const entry = entryOf(project);
212
+ if (following())
213
+ follow(entry);
214
+ await refresh(entry);
215
+ return { project: entry.shown.view, created };
216
+ },
217
+ async tasks(id) {
218
+ const project = (await readProjects(configDir)).find((p) => p.id === id);
219
+ return project && (await shown(project)).tasks;
220
+ },
221
+ async disconnect(id) {
222
+ if (!(await removeProject(configDir, id)))
223
+ return false;
224
+ entries.get(id)?.watch?.close();
225
+ entries.delete(id);
226
+ if (following())
227
+ signal({ id, revision: null });
228
+ return true;
229
+ },
230
+ subscribe(listener) {
231
+ listeners.add(listener);
232
+ if (!following())
233
+ start();
234
+ return () => {
235
+ if (listeners.delete(listener) && listeners.size === 0)
236
+ stop();
237
+ };
238
+ },
239
+ };
240
+ }
@@ -0,0 +1 @@
1
+ export { RegistryUnreadable } from '../registry/projects.js';
@@ -0,0 +1,50 @@
1
+ import { existsSync, watch } from 'node:fs';
2
+ /**
3
+ * Calls `onChange`, debounced, when anything under `dir` changes. It says only that something
4
+ * changed: an event is never read as data. A system watcher that fails becomes one change.
5
+ */
6
+ export function watchTree(dir, { ignore, onChange, quietMs = 1_000, maxWaitMs = 2_000 }) {
7
+ let quiet;
8
+ let first;
9
+ let watcher;
10
+ const settle = () => {
11
+ clearTimeout(quiet);
12
+ clearTimeout(first);
13
+ quiet = first = undefined;
14
+ };
15
+ const fire = () => {
16
+ settle();
17
+ onChange();
18
+ };
19
+ const close = () => {
20
+ settle();
21
+ watcher?.close();
22
+ watcher = undefined;
23
+ };
24
+ // Linux's recursive watch does not throw for a missing directory, macOS's does: ask first.
25
+ if (!existsSync(dir))
26
+ return { open: false, close };
27
+ try {
28
+ watcher = watch(dir, { recursive: true }, (_event, file) => {
29
+ // Some systems name no file; that is still a change.
30
+ if (file !== null && ignore(file.replaceAll('\\', '/')))
31
+ return;
32
+ clearTimeout(quiet);
33
+ quiet = setTimeout(fire, quietMs);
34
+ first ??= setTimeout(fire, maxWaitMs);
35
+ });
36
+ watcher.on('error', () => {
37
+ close();
38
+ onChange();
39
+ });
40
+ }
41
+ catch {
42
+ watcher = undefined; // the directory is not there: the owner's next read says so
43
+ }
44
+ return {
45
+ get open() {
46
+ return watcher !== undefined;
47
+ },
48
+ close,
49
+ };
50
+ }
@@ -0,0 +1 @@
1
+ .columns[data-v-4b2ba6bc]{grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));align-items:start;gap:1rem;display:grid}ul[data-v-4b2ba6bc]{padding:0;list-style:none}li[data-v-4b2ba6bc]{border:1px solid;border-radius:.25rem;margin-bottom:.5rem;padding:.5rem}.goal[data-v-4b2ba6bc]{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}
@@ -0,0 +1,2 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),te=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ne=/-\w/g,T=te(e=>e.replace(ne,e=>e.slice(1).toUpperCase())),re=/\B([A-Z])/g,E=te(e=>e.replace(re,`-$1`).toLowerCase()),ie=te(e=>e.charAt(0).toUpperCase()+e.slice(1)),ae=te(e=>e?`on${ie(e)}`:``),D=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},O=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce,le=()=>ce||=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{};function ue(e){if(d(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=g(r)?me(r):ue(r);if(i)for(let e in i)t[e]=i[e]}return t}if(g(e)||v(e))return e}var de=/;(?![^(]*\))/g,fe=/:([^]+)/,pe=/"(?:[^"\\]|\\[^])*"|'(?:[^'\\]|\\[^])*'|\\[^]|\/\*[^]*?\*\//g;function me(e){let t={};return e.replace(pe,e=>e.startsWith(`/*`)?``:e).split(de).forEach(e=>{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function k(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n<e.length;n++){let r=k(e[n]);r&&(t+=r+` `)}else if(v(e))for(let n in e)e[n]&&(t+=n+` `);return t.trim()}var he=e(`itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,playsinline,readonly`);function ge(e){return!!e||e===``}function _e(e,t,n){if(e.length!==t.length)return!1;let r=!0;for(let i=0;r&&i<e.length;i++)r=xe(e[i],t[i],n);return r}function ve(e,t,n){if(e.size!==t.size)return!1;let r=Array.from(t),i=new Uint8Array(r.length);for(let t of e){let e=-1;for(let a=0;a<r.length;a++)if(!i[a]&&xe(t,r[a],n)){e=a;break}if(e<0)return!1;i[e]=1}return!0}function ye(e,t,n){let r=f(e),i=f(t);if(r||i||(r=p(e),i=p(t),r||i))return r&&i?ve(e,t,n):!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let r in e){let i=e.hasOwnProperty(r),a=t.hasOwnProperty(r);if(i&&!a||!i&&a||!xe(e[r],t[r],n))return!1}return String(e)===String(t)}function be(e,t,n,r){n||=[new Map,new Map];let[i,a]=n;if(i.has(e)||a.has(t))return i.get(e)===t&&a.get(t)===e;i.set(e,t),a.set(t,e);let o=r(e,t,n);return i.delete(e),a.delete(t),o}function xe(e,t,n){if(e===t)return!0;let r=m(e),i=m(t);return r||i?r&&i?e.getTime()===t.getTime():!1:(r=_(e),i=_(t),r||i?e===t:(r=d(e),i=d(t),r||i?r&&i?be(e,t,n,_e):!1:(r=v(e),i=v(t),r||i?!r||!i?!1:be(e,t,n,ye):String(e)===String(t))))}var Se=e=>!!(e&&e.__v_isRef===!0),A=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?Se(e)?A(e.value):JSON.stringify(e,Ce,2):String(e),Ce=(e,t)=>Se(t)?Ce(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[we(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>we(e))}:_(t)?we(t):v(t)&&!d(t)&&!C(t)?String(t):t,we=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,j,Te=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&j&&(j.active?(this.parent=j,this.index=(j.scopes||(j.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e<t;e++)n[e].pause()}for(e=0,t=this.effects.length;e<t;e++)this.effects[e].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let e,t;if(this.scopes){let n=this.scopes.slice();for(e=0,t=n.length;e<t;e++)n[e].resume()}let n=this.effects.slice();for(e=0,t=n.length;e<t;e++)n[e].resume()}}run(e){if(this._active){let t=j;try{return j=this,e()}finally{j=t}}}on(){++this._on===1&&(this.prevScope=j,j=this)}off(){if(this._on>0&&--this._on===0){if(j===this)j=this.prevScope;else{let e=j;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(this.effects.length=0,t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.cleanups.length=0,this.scopes){let e=this.scopes.slice();for(t=0,n=e.length;t<n;t++)e[t].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!e){let e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0}}};function Ee(){return j}var M,De=new WeakSet,Oe=class{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,j&&(j.active?j.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,De.has(this)&&(De.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Me(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,We(this),Fe(this);let e=M,t=N;M=this,N=!0;try{return this.fn()}finally{Ie(this),M=e,N=t,this.flags&=-3}}stop(){if(this.flags&1){for(let e=this.deps;e;e=e.nextDep)ze(e);this.deps=this.depsTail=void 0,We(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?De.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Le(this)&&this.run()}get dirty(){return Le(this)}},ke=0,Ae,je;function Me(e,t=!1){e.flags|=8,t?(e.next=je,je=e):(e.next=Ae,Ae=e)}function Ne(){ke++}function Pe(){if(--ke>0)return;if(je){let e=je;for(je=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;Ae;){let t=Ae;for(Ae=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||=t}t=n}}if(e)throw e}function Fe(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ie(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),ze(r),Be(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Le(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Re(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Re(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ge)||(e.globalVersion=Ge,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Le(e))))return;e.flags|=2;let t=e.dep,n=M,r=N;M=e,N=!0;try{Fe(e);let n=e.fn(e._value);(t.version===0||D(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{M=n,N=r,Ie(e),e.flags&=-3}}function ze(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)ze(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Be(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var N=!0,Ve=[];function He(){Ve.push(N),N=!1}function Ue(){let e=Ve.pop();N=e===void 0||e}function We(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=M;M=void 0;try{t()}finally{M=e}}}var Ge=0,Ke=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},qe=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!M||!N||M===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==M)t=this.activeLink=new Ke(M,this),M.deps?(t.prevDep=M.depsTail,M.depsTail.nextDep=t,M.depsTail=t):M.deps=M.depsTail=t,Je(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=M.depsTail,t.nextDep=void 0,M.depsTail.nextDep=t,M.depsTail=t,M.deps===t&&(M.deps=e)}return t}trigger(e){this.version++,Ge++,this.notify(e)}notify(e){Ne();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Pe()}}};function Je(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Je(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var Ye=new WeakMap,Xe=Symbol(``),Ze=Symbol(``),Qe=Symbol(``);function P(e,t,n){if(N&&M){let t=Ye.get(e);t||Ye.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new qe),r.map=t,r.key=n),r.track()}}function $e(e,t,n,r,i,a){let o=Ye.get(e);if(!o){Ge++;return}let s=e=>{e&&e.trigger()};if(Ne(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===Qe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Qe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Xe)),f(e)&&s(o.get(Ze)));break;case`delete`:i||(s(o.get(Xe)),f(e)&&s(o.get(Ze)));break;case`set`:f(e)&&s(o.get(Xe))}}Pe()}function et(e){let t=I(e);return t===e||(P(t,`iterate`,Qe),F(e))?t:zt(e)?Rt(e)?t.map(e=>Ht(L(e))):t.map(Ht):t.map(L)}function tt(e){return P(e=I(e),`iterate`,Qe),e}function nt(e,t){return zt(e)?Ht(Rt(e)?L(t):t):L(t)}var rt={__proto__:null,[Symbol.iterator](){return it(this,Symbol.iterator,e=>nt(this,e))},concat(...e){return et(this).concat(...e.map(e=>d(e)?et(e):e))},entries(){return it(this,`entries`,e=>(e[1]=nt(this,e[1]),e))},every(e,t){return st(this,`every`,e,t,void 0,arguments)},filter(e,t){return st(this,`filter`,e,t,e=>e.map(e=>nt(this,e)),arguments)},find(e,t){return st(this,`find`,e,t,e=>nt(this,e),arguments)},findIndex(e,t){return st(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return st(this,`findLast`,e,t,e=>nt(this,e),arguments)},findLastIndex(e,t){return st(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return st(this,`forEach`,e,t,void 0,arguments)},includes(...e){return lt(this,`includes`,e)},indexOf(...e){return lt(this,`indexOf`,e)},join(e){return et(this).join(e)},lastIndexOf(...e){return lt(this,`lastIndexOf`,e)},map(e,t){return st(this,`map`,e,t,void 0,arguments)},pop(){return ut(this,`pop`)},push(...e){return ut(this,`push`,e)},reduce(e,...t){return ct(this,`reduce`,e,t)},reduceRight(e,...t){return ct(this,`reduceRight`,e,t)},shift(){return ut(this,`shift`)},some(e,t){return st(this,`some`,e,t,void 0,arguments)},splice(...e){return ut(this,`splice`,e)},toReversed(){return et(this).toReversed()},toSorted(e){return et(this).toSorted(e)},toSpliced(...e){return et(this).toSpliced(...e)},unshift(...e){return ut(this,`unshift`,e)},values(){return it(this,`values`,e=>nt(this,e))}};function it(e,t,n){let r=tt(e),i=r[t],a=i.call(r);if(r!==e&&!F(e)){if(a[Symbol.toStringTag]===`Array Iterator`){let e=Object.create(Object.getPrototypeOf(a));return e.next=()=>at(a.next(),n),i!==ot[t]&&Object.defineProperties(e,{return:{get(){let e=a.return;return typeof e==`function`?e.bind(a):e}},throw:{get(){let e=a.throw;return typeof e==`function`?e.bind(a):e}}}),e}a._next=a.next,a.next=()=>at(a._next(),n)}return a}function at(e,t){return e.done||(e.value=t(e.value)),e}var ot=Array.prototype;function st(e,t,n,r,i,a){let o=tt(e),s=o!==e&&!F(e),c=o[t];if(c!==ot[t]){let t=c.apply(e,a);return s?L(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,nt(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function ct(e,t,n,r){let i=tt(e),a=i!==e&&!F(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=nt(e,t)),n.call(this,t,nt(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?nt(e,c):c}function lt(e,t,n){let r=I(e);P(r,`iterate`,Qe);let i=r[t](...n);return(i===-1||i===!1)&&Bt(n[0])?(n[0]=I(n[0]),r[t](...n)):i}function ut(e,t,n=[]){He(),Ne();let r=I(e)[t].apply(e,n);return Pe(),Ue(),r}var dt=e(`__proto__,__v_isRef,__isVue`),ft=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function pt(e){_(e)||(e=String(e));let t=I(this);return P(t,`has`,e),t.hasOwnProperty(e)}var mt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?Mt:jt:i?At:kt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=rt[t]))return e;if(t===`hasOwnProperty`)return pt}let o=Reflect.get(e,t,R(e)?e:n);if((_(t)?ft.has(t):dt(t))||(r||P(e,`get`,t),i))return o;if(R(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?It(e):e}return v(o)?r?It(o):Pt(o):o}},ht=class extends mt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=zt(i);if(!F(n)&&!zt(n)&&(i=I(i),n=I(n)),!a&&R(i)&&!R(n))return e||(i.value=n),!0}let o=a?Number(t)<e.length:u(e,t),s=Reflect.set(e,t,n,R(e)?e:r);return e===I(r)&&s&&(o?D(n,i)&&$e(e,`set`,t,n,i):$e(e,`add`,t,n)),s}deleteProperty(e,t){let n=u(e,t),r=e[t],i=Reflect.deleteProperty(e,t);return i&&n&&$e(e,`delete`,t,void 0,r),i}has(e,t){let n=Reflect.has(e,t);return(!_(t)||!ft.has(t))&&P(e,`has`,t),n}ownKeys(e){return P(e,`iterate`,d(e)?`length`:Xe),Reflect.ownKeys(e)}},gt=class extends mt{constructor(e=!1){super(!0,e)}set(e,t){return!0}deleteProperty(e,t){return!0}},_t=new ht,vt=new gt,yt=new ht(!0),bt=e=>e,xt=e=>Reflect.getPrototypeOf(e);function St(e,t,n){return function(...r){let i=this.__v_raw,a=I(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?bt:t?Ht:L;return!t&&P(a,`iterate`,l?Ze:Xe),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function Ct(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function wt(e,t){let n={get(n){let r=this.__v_raw,i=I(r),a=I(n);e||(D(n,a)&&P(i,`get`,n),P(i,`get`,a));let{has:o}=xt(i),s=t?bt:e?Ht:L;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&P(I(t),`iterate`,Xe),t.size},has(t){let n=this.__v_raw,r=I(n),i=I(t);return e||(D(t,i)&&P(r,`has`,t),P(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=I(a),s=t?bt:e?Ht:L;return!e&&P(o,`iterate`,Xe),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:Ct(`add`),set:Ct(`set`),delete:Ct(`delete`),clear:Ct(`clear`)}:{add(e){let n=I(this),r=xt(n),i=I(e),a=!t&&!F(e)&&!zt(e)?i:e;return r.has.call(n,a)||D(e,a)&&r.has.call(n,e)||D(i,a)&&r.has.call(n,i)||(n.add(a),$e(n,`add`,a,a)),this},set(e,n){!t&&!F(n)&&!zt(n)&&(n=I(n));let r=I(this),{has:i,get:a}=xt(r),o=i.call(r,e);o||=(e=I(e),i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?D(n,s)&&$e(r,`set`,e,n,s):$e(r,`add`,e,n),this},delete(e){let t=I(this),{has:n,get:r}=xt(t),i=n.call(t,e);i||=(e=I(e),n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&$e(t,`delete`,e,void 0,a),o},clear(){let e=I(this),t=e.size!==0,n=e.clear();return t&&$e(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=St(r,e,t)}),n}function Tt(e,t){let n=wt(e,t);return(r,i,a)=>i===`__v_isReactive`?!e:i===`__v_isReadonly`?e:i===`__v_isShallow`?t:i===`__v_raw`?r:Reflect.get(u(n,i)&&i in r?n:r,i,a)}var Et={get:Tt(!1,!1)},Dt={get:Tt(!1,!0)},Ot={get:Tt(!0,!1)},kt=new WeakMap,At=new WeakMap,jt=new WeakMap,Mt=new WeakMap;function Nt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Pt(e){return zt(e)?e:Lt(e,!1,_t,Et,kt)}function Ft(e){return Lt(e,!1,yt,Dt,At)}function It(e){return Lt(e,!0,vt,Ot,jt)}function Lt(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Nt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Rt(e){return zt(e)?Rt(e.__v_raw):!!(e&&e.__v_isReactive)}function zt(e){return!!(e&&e.__v_isReadonly)}function F(e){return!!(e&&e.__v_isShallow)}function Bt(e){return e?!!e.__v_raw:!1}function I(e){let t=e&&e.__v_raw;return t?I(t):e}function Vt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&O(e,`__v_skip`,!0),e}var L=e=>v(e)?Pt(e):e,Ht=e=>v(e)?It(e):e;function R(e){return e?e.__v_isRef===!0:!1}function Ut(e){return Wt(e,!1)}function Wt(e,t){return R(e)?e:new Gt(e,t)}var Gt=class{constructor(e,t){this.dep=new qe,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:I(e),this._value=t?e:L(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||F(e)||zt(e);e=n?e:I(e),D(e,t)&&(this._rawValue=e,this._value=n?e:L(e),this.dep.trigger())}};function z(e){return R(e)?e.value:e}var Kt={get:(e,t,n)=>t===`__v_raw`?e:z(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return R(i)&&!R(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function qt(e){return Rt(e)?e:new Proxy(e,Kt)}var Jt=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new qe(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ge-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&M!==this)return Me(this,!0),!0}get value(){let e=this.dep.track();return Re(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function Yt(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new Jt(r,i,n)}var Xt={},Zt=new WeakMap,Qt=void 0;function $t(e,t=!1,n=Qt){if(n){let t=Zt.get(n);t||Zt.set(n,t=[]),t.push(e)}}function en(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:F(e)||o===!1||o===0?tn(e,1):tn(e),m,g,_,v,y=!1,b=!1;if(R(e)?(g=()=>e.value,y=F(e)):Rt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Rt(e)||F(e)),g=()=>e.map(e=>{if(R(e))return e.value;if(Rt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){He();try{_()}finally{Ue()}}let t=Qt;Qt=m;try{return f?f(e,3,[v]):e(v)}finally{Qt=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>tn(e(),t)}let x=Ee(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{try{return e(...t)}finally{S()}}}let C=b?Array(e.length).fill(Xt):Xt,w=e=>{if(m.flags&1&&(m.dirty||e)){if(n){let t=m.run();if(e||o||y||(b?t.some((e,t)=>D(e,C[t])):D(t,C))){let e=Qt;He();try{_&&_(),Qt=m;let e=[t,C===Xt?void 0:b&&C[0]===Xt?[]:C,v];C=t,f?f(n,3,e):n(...e)}finally{Qt=e,Ue()}}}else m.run()}};return u&&u(w),m=new Oe(g),m.scheduler=l?()=>l(w,!1):w,v=e=>$t(e,!1,m),_=m.onStop=()=>{let e=Zt.get(m);if(e){if(f)f(e,4);else for(let t of e)t();Zt.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function tn(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n||=new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,R(e))tn(e.value,t,n);else if(d(e))for(let r=0;r<e.length;r++)tn(e[r],t,n);else if(p(e)||f(e))e.forEach(e=>{tn(e,t,n)});else if(C(e)){for(let r in e)tn(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&tn(e[r],t,n)}return e}function nn(e,t,n,r){try{return r?e(...r):e()}catch(e){rn(e,t,n)}}function B(e,t,n,r){if(h(e)){let i=nn(e,t,n,r);return i&&y(i)&&i.catch(e=>{rn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a<e.length;a++)i.push(B(e[a],t,n,r));return i}}function rn(e,n,r,i=!0){let a=n?n.vnode:null,{errorHandler:o,throwUnhandledErrorInProduction:s}=n&&n.appContext.config||t;if(n){let t=n.parent,i=n.proxy,a=`https://vuejs.org/error-reference/#runtime-${r}`;for(;t;){let n=t.ec;if(n){for(let t=0;t<n.length;t++)if(n[t](e,i,a)===!1)return}t=t.parent}if(o){He(),nn(o,null,10,[e,i,a]),Ue();return}}an(e,r,a,i,s)}function an(e,t,n,r=!0,i=!1){if(i)throw e;console.error(e)}var V=[],H=-1,on=[],sn=null,cn=0,ln=Promise.resolve(),un=null;function dn(e){let t=un||ln;return e?t.then(this?e.bind(this):e):t}function fn(e){let t=H+1,n=V.length;for(;t<n;){let r=t+n>>>1,i=V[r],a=bn(i);a<e||a===e&&i.flags&2?t=r+1:n=r}return t}function pn(e){if(!(e.flags&1)){let t=bn(e),n=V[V.length-1];!n||!(e.flags&2)&&t>=bn(n)?V.push(e):V.splice(fn(t),0,e),e.flags|=1,mn()}}function mn(){un||=ln.then(xn)}function hn(e){if(!d(e))sn&&e.id===-1?sn.splice(cn+1,0,e):e.flags&1||(on.push(e),e.flags|=1);else for(let t=0;t<e.length;t++)on.push(e[t]);mn()}function gn(e,t,n,r=H+1){for(;r<V.length;r++){let n=V[r];if(n&&n.flags&2){if(e&&n.id!==e.uid||t!==void 0&&!(n.id>=t))continue;V.splice(r,1),r=e?r-1:H,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function _n(e,t,n=0){if(on.length){let e=on,r=0;if(t){e=[];for(let i=0;i<on.length;i++){let a=on[i];(a.i===void 0?t.has(a):!a.i||a.i.uid<n)?on[r++]=a:e.push(a)}}let i=[...new Set(e)].sort((e,t)=>bn(e)-bn(t));if(on.length=r,sn){for(let e=0;e<i.length;e++)sn.push(i[e]);return}for(sn=i,cn=0;cn<sn.length;cn++){let e=sn[cn];e.flags&4&&(e.flags&=-2),e.flags&8||e(),e.flags&=-2}sn=null,cn=0}}var vn=!1;function yn(e,t){if(vn){e();return}let n=t===void 0?void 0:new Set(on);e(),vn=!0;try{gn(void 0,t),_n(void 0,n,t)}finally{vn=!1}}var bn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function xn(e){try{for(H=0;H<V.length;H++){let e=V[H];e&&!(e.flags&8)&&(e.flags&4&&(e.flags&=-2),nn(e,e.i,e.i?15:14),e.flags&4||(e.flags&=-2))}}finally{for(;H<V.length;H++){let e=V[H];e&&(e.flags&=-2)}H=-1,V.length=0,_n(e),un=null,(V.length||on.length)&&xn(e)}}var U=null,Sn=null;function Cn(e){let t=U;return U=e,Sn=e&&e.type.__scopeId||null,t}function wn(e,t=U,n){if(!t||e._n)return e;let r=(...n)=>{r._d&&ji(-1);let i=Cn(t),a=Oi.length,o;try{o=e(...n)}finally{for(let e=Oi.length;e>a;e--)ki();Cn(i),r._d&&ji(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function Tn(e,n){if(U===null)return e;let r=da(U),i=e.dirs||=[];for(let e=0;e<n.length;e++){let[a,o,s,c=t]=n[e];a&&(h(a)&&(a={mounted:a,updated:a}),a.deep&&tn(o),i.push({dir:a,instance:r,value:o,oldValue:void 0,arg:s,modifiers:c}))}return e}function En(e,t,n,r){let i=e.dirs,a=t&&t.dirs;for(let o=0;o<i.length;o++){let s=i[o];a&&(s.oldValue=a[o].value);let c=s.dir[r];c&&(He(),B(c,n,8,[e.el,s,e,t]),Ue())}}function Dn(e,t){if($){let n=$.provides,r=$.parent&&$.parent.provides;r===n&&(n=$.provides=Object.create(r)),n[e]=t}}function On(e,t,n=!1){let r=Qi();if(r||Ir){let i=Ir?Ir._context.provides:r?r.parent==null||r.ce?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return n&&h(t)?t.call(r&&r.proxy):t}}var kn=Symbol.for(`v-scx`),An=()=>On(kn);function jn(e,t,n){return Mn(e,t,n)}function Mn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(ia){if(c===`sync`){let e=An();f=e.__watcherHandles||=[]}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=$;u.call=(e,t,n)=>B(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{e.i=p,G(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():pn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=en(e,n,u);return ia&&(f?f.push(h):d&&h()),h}function Nn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?Pn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=ta(this),s=Mn(i,a.bind(r),n);return o(),s}function Pn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}var Fn=Symbol(`_vte`),In=e=>e.__isTeleport,Ln=Symbol(`_leaveCb`);function Rn(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==q){t=n;break}}return t}function zn(e){if(!Yn(e))return In(e.type)&&e.children?Rn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function Bn(e,t){if(e.shapeFlag&6&&e.component){e.transition=t;let n=e.component.subTree;Bn(In(n.type)&&zn(n)||n,t)}else if(e.shapeFlag&128)e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback);else if(e.transition=t,e.type===K&&d(e.children)){let n=Ur(e.children,!1);n&&Bn(n,t)}}function Vn(e){if(e.component)return Vn(e.component.subTree);if(e.type===K){let t=d(e.children)&&Ur(e.children,!1);return t?Vn(t):void 0}if(e.type!==q)return e}function Hn(e,t){return h(e)?s({name:e.name},t,{setup:e}):e}function Un(e){e.ids=[e.ids[0]+e.ids[2]+++`-`,0,0]}function Wn(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}var Gn=new WeakMap;function Kn(e,n,r,a,o=!1){if(d(e)){e.forEach((e,t)=>Kn(e,n&&(d(n)?n[t]:n),r,a,o));return}if(Jn(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&Kn(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?da(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=I(v),b=v===t?i:e=>!Wn(_,e)&&u(y,e),x=(e,t)=>!(t&&Wn(_,t));if(m!=null&&m!==p){if(qn(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(R(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))nn(p,f,12,[l,_]);else{let t=g(p),n=R(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),Gn.delete(e)};t.id=-1,Gn.set(e,t),G(t,r)}else qn(e),i()}}}function qn(e){let t=Gn.get(e);t&&(t.flags|=8,Gn.delete(e))}le().requestIdleCallback,le().cancelIdleCallback;var Jn=e=>!!e.type.__asyncLoader,Yn=e=>e.type.__isKeepAlive;function Xn(e,t){Qn(e,`a`,t)}function Zn(e,t){Qn(e,`da`,t)}function Qn(e,t,n=$){let r=e.__wdc||=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()};if(er(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Yn(e.parent.vnode)&&$n(r,t,n,e),e=e.parent}}function $n(e,t,n,r){let i=er(t,e,r,!0);sr(()=>{c(r[t],i)},n)}function er(e,t,n=$,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||=(...r)=>{He();let i=ta(n),a=B(t,n,e,r);return i(),Ue(),a};return r?i.unshift(a):i.push(a),a}}var tr=e=>(t,n=$)=>{(!ia||e===`sp`)&&er(e,(...e)=>t(...e),n)},nr=tr(`bm`),rr=tr(`m`),ir=tr(`bu`),ar=tr(`u`),or=tr(`bum`),sr=tr(`um`),cr=tr(`sp`),lr=tr(`rtg`),ur=tr(`rtc`);function dr(e,t=$){er(`ec`,e,t)}var fr=Symbol.for(`v-ndc`);function pr(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Rt(e),r=!1,s=!1;n&&(r=!F(e),s=zt(e),e=tt(e)),i=Array(e.length);for(let n=0,o=e.length;n<o;n++)i[n]=t(r?s?Ht(L(e[n])):L(e[n]):e[n],n,void 0,a&&a[n])}else if(typeof e==`number`){if(!Number.isInteger(e)||e<0)i=[];else{i=Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,a&&a[n])}}else if(v(e)){if(e[Symbol.iterator])i=Array.from(e,(e,n)=>t(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;r<o;r++){let o=n[r];i[r]=t(e[o],o,r,a&&a[r])}}}else i=[];return n&&(n[r]=i),i}var mr=e=>e?ra(e)?da(e):mr(e.parent):null,hr=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>mr(e.parent),$root:e=>mr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>wr(e),$forceUpdate:e=>e.f||=()=>{pn(e.update)},$nextTick:e=>e.n||=dn.bind(e.proxy),$watch:e=>Nn.bind(e)}),gr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),_r={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(gr(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else yr&&(s[n]=0)}let d=hr[n],f,p;if(d)return n===`$attrs`&&P(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return gr(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||gr(n,c)||u(o,c)||u(i,c)||u(hr,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function vr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var yr=!0;function br(e){let t=wr(e),n=e.proxy,i=e.ctx;yr=!1,t.beforeCreate&&Sr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:ee,renderTracked:te,renderTriggered:ne,errorCaptured:T,serverPrefetch:re,expose:E,inheritAttrs:ie,components:ae,directives:D,filters:oe}=t;if(u&&xr(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Pt(t))}if(yr=!0,o)for(let e in o){let t=o[e],a=pa({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)Cr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{Dn(t,e[t])})}f&&Sr(f,e,`c`);function O(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(O(nr,p),O(rr,m),O(ir,g),O(ar,_),O(Xn,y),O(Zn,b),O(dr,T),O(ur,te),O(lr,ne),O(or,S),O(sr,w),O(cr,re),d(E)){if(E.length){let t=e.exposed||={};E.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||={}}ee&&e.render===r&&(e.render=ee),ie!=null&&(e.inheritAttrs=ie),ae&&(e.components=ae),D&&(e.directives=D),re&&Un(e)}function xr(e,t,n=r){d(e)&&(e=kr(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?On(r.from||n,r.default,!0):On(r.from||n):On(r),R(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function Sr(e,t,n){B(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Cr(e,t,n,r){let i=r.includes(`.`)?Pn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&jn(i,n)}else if(h(e))jn(i,e.bind(n));else if(v(e)){if(d(e))e.forEach(e=>Cr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&jn(i,r,e)}}}function wr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>Tr(c,e,o,!0)),Tr(c,t,o)),v(t)&&a.set(t,c),c}function Tr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Tr(e,a,n,!0),i&&i.forEach(t=>Tr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Er[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Er={data:Dr,props:jr,emits:jr,methods:Ar,computed:Ar,beforeCreate:W,created:W,beforeMount:W,mounted:W,beforeUpdate:W,updated:W,beforeDestroy:W,beforeUnmount:W,destroyed:W,unmounted:W,activated:W,deactivated:W,errorCaptured:W,serverPrefetch:W,components:Ar,directives:Ar,watch:Mr,provide:Dr,inject:Or};function Dr(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function Or(e,t){return Ar(kr(e),kr(t))}function kr(e){if(d(e)){let t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function W(e,t){return e?[...new Set([].concat(e,t))]:t}function Ar(e,t){return e?s(Object.create(null),e,t):t}function jr(e,t){return e?d(e)&&d(t)?[...new Set([...e,...t])]:s(Object.create(null),vr(e),vr(t??{})):t}function Mr(e,t){if(!e)return t;if(!t)return e;let n=s(Object.create(null),e);for(let r in t)n[r]=W(e[r],t[r]);return n}function Nr(){return{app:null,config:{isNativeTag:i,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}var Pr=0;function Fr(e,t){return function(n,r=null){h(n)||(n=s({},n)),r!=null&&!v(r)&&(r=null);let i=Nr(),a=new WeakSet,o=[],c=!1,l=i.app={_uid:Pr++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:ma,get config(){return i.config},set config(e){},use(e,...t){return a.has(e)||(e&&h(e.install)?(a.add(e),e.install(l,...t)):h(e)&&(a.add(e),e(l,...t))),l},mixin(e){return i.mixins.includes(e)||i.mixins.push(e),l},component(e,t){return t?(i.components[e]=t,l):i.components[e]},directive(e,t){return t?(i.directives[e]=t,l):i.directives[e]},mount(a,o,s){if(!c){let u=l._ceVNode||Ri(n,r);return u.appContext=i,s===!0?s=`svg`:s===!1&&(s=void 0),o&&t?t(u,a):e(u,a,s),c=!0,l._container=a,a.__vue_app__=l,da(u.component)}},onUnmount(e){o.push(e)},unmount(){c&&(B(o,l._instance,16),e(null,l._container),delete l._container.__vue_app__)},provide(e,t){return i.provides[e]=t,l},runWithContext(e){let t=Ir;Ir=l;try{return e()}finally{Ir=t}}};return l}}var Ir=null,Lr=(e,t)=>t===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${T(t)}Modifiers`]||e[`${E(t)}Modifiers`];function Rr(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&Lr(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=a.map(se)));let c,l=i[c=ae(n)]||i[c=ae(T(n))];!l&&o&&(l=i[c=ae(E(n))]),l&&B(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,B(u,e,6,a)}}var zr=new WeakMap;function Br(e,t,n=!1){let r=n?zr:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=Br(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function Vr(e,t){return!e||!a(t)?!1:(t=t.slice(2),t=t===`Once`?t:t.replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,E(t))||u(e,t))}function Hr(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=Cn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=Ui(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=Ui(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:Wr(c)}}catch(t){Oi.length=0,rn(t,e,1),v=Ri(q)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=Gr(y,a)),b=Vi(b,y,!1,!0))}return n.dirs&&(b=Vi(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&Bn(In(b.type)&&zn(b)||b,n.transition),v=b,Cn(_),v}function Ur(e,t=!0){let n;for(let t=0;t<e.length;t++){let r=e[t];if(Pi(r)){if(r.type!==q||r.children===`v-if`){if(n)return;n=r}}else return}return n}var Wr=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||={})[n]=e[n]);return t},Gr=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Kr(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?qr(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t];if(Jr(o,r,n)&&!Vr(l,n))return!0}}}else return(i||s)&&(!s||!s.$stable)?!0:r===o?!1:r?!o||qr(r,o,l):!!o;return!1}function qr(e,t,n){let r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let i=0;i<r.length;i++){let a=r[i];if(!u(e,a)||Jr(t,e,a)&&!Vr(n,a))return!0}return!1}function Jr(e,t,n){let r=e[n],i=t[n];return n===`style`&&v(r)&&v(i)?!xe(r,i):r!==i}function Yr({vnode:e,parent:t,suspense:n},r){for(;t;){let n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.suspense.vnode.el=n.el=r,e=n),n===e)(e=t.vnode).el=r,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=r)}var Xr={},Zr=()=>Object.create(Xr),Qr=e=>Object.getPrototypeOf(e)===Xr;function $r(e,t,n,r=!1){let i={},a=Zr();e.propsDefaults=Object.create(null),ti(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);e.props=n?r?i:Ft(i):e.type.props?i:a,e.attrs=a}function ei(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=I(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let o=n[r];if(Vr(e.emitsOptions,o))continue;let d=t[o];if(c){if(u(a,o))d!==a[o]&&(a[o]=d,l=!0);else{let t=T(o);i[t]=ni(c,s,t,d,e,!1)}}else d!==a[o]&&(a[o]=d,l=!0)}}}else{ti(e,t,i,a)&&(l=!0);let r;for(let a in s)(!t||!u(t,a)&&((r=E(a))===a||!u(t,r)))&&(c?n&&(n[a]!==void 0||n[r]!==void 0)&&(i[a]=ni(c,s,a,void 0,e,!0)):delete i[a]);if(a!==s)for(let e in a)(!t||!u(t,e))&&(delete a[e],l=!0)}l&&$e(e.attrs,`set`,``)}function ti(e,n,r,i){let[a,o]=e.propsOptions,s=!1,c;if(n)for(let t in n){if(ee(t))continue;let l=n[t],d;a&&u(a,d=T(t))?!o||!o.includes(d)?r[d]=l:(c||={})[d]=l:Vr(e.emitsOptions,t)||(!(t in i)||l!==i[t])&&(i[t]=l,s=!0)}if(o){let n=I(r),i=c||t;for(let t=0;t<o.length;t++){let s=o[t];r[s]=ni(a,n,s,i[s],e,!u(i,s))}}return s}function ni(e,t,n,r,i,a){let o=e[n];if(o!=null){let e=u(o,`default`);if(e&&r===void 0){let e=o.default;if(o.type!==Function&&!o.skipFactory&&h(e)){let{propsDefaults:a}=i;if(n in a)r=a[n];else{let o=ta(i);r=a[n]=e.call(null,t),o()}}else r=e;i.ce&&i.ce._setProp(n,r)}o[0]&&(a&&!e?r=!1:o[1]&&(r===``||r===E(n))&&(r=!0))}return r}var ri=new WeakMap;function ii(e,r,i=!1){let a=i?ri:r.propsCache,o=a.get(e);if(o)return o;let c=e.props,l={},f=[],p=!1;if(!h(e)){let t=e=>{p=!0;let[t,n]=ii(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;e<c.length;e++){let n=T(c[e]);ai(n)&&(l[n]=t)}else if(c)for(let e in c){let t=T(e);if(ai(t)){let n=c[e],r=l[t]=d(n)||h(n)?{type:n}:s({},n),i=r.type,a=!1,o=!0;if(d(i))for(let e=0;e<i.length;++e){let t=i[e],n=h(t)&&t.name;if(n===`Boolean`){a=!0;break}n===`String`&&(o=!1)}else a=h(i)&&i.name===`Boolean`;r[0]=a,r[1]=o,(a||u(r,`default`))&&f.push(t)}}let m=[l,f];return v(e)&&a.set(e,m),m}function ai(e){return e[0]!==`$`&&!ee(e)}var oi=e=>e===`_`||e===`_ctx`||e===`$stable`,si=e=>d(e)?e.map(Ui):[Ui(e)],ci=(e,t,n)=>{if(t._n)return t;let r=wn((...e)=>si(t(...e)),n);return r._c=!1,r},li=(e,t,n)=>{let r=e._ctx;for(let n in e){if(oi(n))continue;let i=e[n];if(h(i))t[n]=ci(n,i,r);else if(i!=null){let e=si(i);t[n]=()=>e}}},ui=(e,t)=>{let n=si(t);e.slots.default=()=>n},di=(e,t,n)=>{for(let r in t)(n||!oi(r))&&(e[r]=t[r])},fi=(e,t,n)=>{let r=e.slots=Zr();if(e.vnode.shapeFlag&32){let e=t._;e?(di(r,t,n),n&&O(r,`_`,e,!0)):li(t,r)}else t&&ui(e,t)},pi=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:di(a,n,r):(o=!n.$stable,li(n,a)),s=n}else n&&(ui(e,n),s={default:1});if(o)for(let e in a)!oi(e)&&s[e]==null&&delete a[e]},G=Ti;function mi(e){return hi(e)}function hi(e,i){let a=le();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,r,i=null,a=null,o=null,s=void 0,c=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!Fi(e,t)&&(i=ye(e),k(e,a,o,!0),e=null),t.patchFlag===-2&&(l=!1,t.dynamicChildren=null),t.dynamicChildren&&e&&e.dynamicChildren&&e.dynamicChildren.hasOnce&&(t.dynamicChildren===n&&(t.dynamicChildren=[]),t.dynamicChildren.hasOnce=!0);let{type:u,ref:d,shapeFlag:f}=t;switch(u){case Ei:y(e,t,r,i);break;case q:b(e,t,r,i);break;case Di:e??x(t,r,i,s);break;case K:ae(e,t,r,i,a,o,s,c,l);break;default:f&1?w(e,t,r,i,a,o,s,c,l):f&6?D(e,t,r,i,a,o,s,c,l):(f&64||f&128)&&u.process(e,t,r,i,a,o,s,c,l,xe)}d!=null&&a?Kn(d,e&&e.ref,o,t||e,!t):d==null&&e&&e.ref!=null&&Kn(e.ref,null,o,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)te(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),re(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},te=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&T(e.children,d,null,r,i,gi(e,a),s,u),_&&En(e,null,r,`created`),ne(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&qi(f,r,e)}_&&En(e,null,r,`beforeMount`);let v=vi(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&G(()=>{try{f&&qi(f,r,e),v&&g.enter(d),_&&En(e,null,r,`mounted`)}finally{}},i)},ne=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t<r.length;t++)g(e,r[t]);if(i){let n=i.subTree;if(t===n||wi(n.type)&&(n.ssContent===t||n.ssFallback===t)){let t=i.vnode;ne(e,t,t.scopeId,t.slotScopeIds,i.parent)}}},T=(e,t,n,r,i,a,o,s,c=0)=>{for(let l=c;l<e.length;l++){let c=e[l]=s?Wi(e[l]):Ui(e[l]);v(null,c,t,n,r,i,a,o,s)}},re=(e,n,r,i,a,o,s)=>{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&_i(r,!1),(g=h.onVnodeBeforeUpdate)&&qi(g,r,n,e),f&&En(n,e,r,`beforeUpdate`),r&&_i(r,!0),d&&(!e.dynamicChildren||e.dynamicChildren.length!==d.length)&&(u=0,s=!1,d=null),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?E(e.dynamicChildren,d,l,r,i,gi(n,a),o):s||de(e,n,l,null,r,i,gi(n,a),o,!1),u>0){if(u&16)ie(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t],i=m[n],o=h[n];(o!==i||n===`value`)&&c(l,n,i,o,a,r)}}u&1&&e.children!==n.children&&p(l,n.children)}else!s&&d==null&&ie(l,m,h,r,a);((g=h.onVnodeUpdated)||f)&&G(()=>{g&&qi(g,r,n,e),f&&En(n,e,r,`updated`)},i)},E=(e,t,n,r,i,a,o)=>{for(let s=0;s<t.length;s++){let c=e[s],l=t[s],u=c.el||Ci(c),d=u&&(c.type===K||!Fi(c,l)||c.shapeFlag&198)?m(u):n;v(c,l,d,null,r,i,a,o,!0)}},ie=(e,n,r,i,a)=>{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},ae=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),T(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(E(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&yi(e,t,!0)):de(e,t,n,f,i,a,s,c,l)},D=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):O(t,n,r,i,a,o,c):se(e,t,c)},O=(e,t,n,r,i,a,o)=>{let s=e.component=Zi(e,r,i);if(Yn(e)&&(s.ctx.renderer=xe),aa(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ce,o,a),!e.el){let r=s.subTree=Ri(q);b(null,r,t,n),e.placeholder=r.el}}else ce(s,e,t,n,i,a,o)},se=(e,t,n)=>{let r=t.component=e.component;if(Kr(e,t,n)){if(r.asyncDep&&!r.asyncResolved){t.el=e.el,t.placeholder=e.placeholder,ue(r,t,n);return}r.next=t,r.update()}else t.el=e.el,t.placeholder=e.placeholder,r.vnode=t},ce=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=xi(e);if(n){t&&(t.el=c.el,ue(e,t,o)),n.asyncDep.then(()=>{G(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;_i(e,!1),t?(t.el=c.el,ue(e,t,o)):t=c,n&&oe(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&qi(d,s,t,c),_i(e,!0);let f=Hr(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ye(p),e,i,a),t.el=f.el,u===null&&Yr(e,f.el),r&&G(r,i),(d=t.props&&t.props.onVnodeUpdated)&&G(()=>qi(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=Jn(t);if(_i(e,!1),l&&oe(l),!m&&(o=c&&c.onVnodeBeforeMount)&&qi(o,d,t),_i(e,!0),s&&A){let t=()=>{e.subTree=Hr(e),A(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=Hr(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&G(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;G(()=>qi(o,d,e),i)}(t.shapeFlag&256||d&&Jn(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&G(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new Oe(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>pn(u),_i(e,!0),l()},ue=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,ei(e,t.props,r,n),pi(e,t.children,n),He(),gn(e),Ue()},de=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){pe(l,d,n,r,i,a,o,s,c);return}if(f&256){fe(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&ve(l,i,a),d!==l&&p(n,d)):u&16?m&16?pe(l,d,n,r,i,a,o,s,c):ve(l,i,a,!0):(u&8&&p(n,``),m&16&&T(d,n,r,i,a,o,s,c))},fe=(e,t,r,i,a,o,s,c,l)=>{e||=n,t||=n;let u=e.length,d=t.length,f=Math.min(u,d),p=0;for(;p<f;p++){let n=t[p]=l?Wi(t[p]):Ui(t[p]);v(e[p],n,r,null,a,o,s,c,l)}u>d?ve(e,a,o,!0,!1,f):T(t,r,i,a,o,s,c,l,f)},pe=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?Wi(t[u]):Ui(t[u]);if(Fi(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?Wi(t[p]):Ui(t[p]);if(Fi(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=e<d?t[e].el:i;for(;u<=p;)v(null,t[u]=l?Wi(t[u]):Ui(t[u]),r,n,a,o,s,c,l),u++}}else if(u>p)for(;u<=f;)k(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?Wi(t[u]):Ui(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u<b;u++)C[u]=0;for(u=m;u<=f;u++){let n=e[u];if(y>=b){k(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&Fi(n,t[_])){i=_;break}i===void 0?k(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?bi(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1<d?f.el||Ci(f):i;C[u]===0?v(null,n,r,p,a,o,s,c,l):x&&(_<0||u!==w[_]?me(n,r,p,2):_--)}}},me=(e,t,n,r,i=null)=>{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6)me(e.component.subTree,t,n,r);else if(d&128)e.suspense.move(t,n,r);else if(d&64)c.move(e,t,n,xe);else if(c===K){o(a,t,n);for(let e=0;e<u.length;e++)me(u[e],t,n,r);o(e.anchor,t,n)}else if(c===Di)S(e,t,n);else if(r!==2&&d&1&&l){if(r===0)l.persisted&&!a[Ln]?o(a,t,n):(l.beforeEnter(a),o(a,t,n),G(()=>l.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[Ln];a._isLeaving&&a[Ln](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}}else o(a,t,n)},k=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if((d===-2||l&&l.hasOnce)&&(i=!1),s!=null&&(He(),Kn(s,null,n,e,!0),Ue()),p!=null&&(!e.ctx||e.ctx===t)&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!Jn(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&qi(_,t,e),u&6)_e(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&En(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,xe,r):l&&!l.hasOnce&&(a!==K||d>0&&d&64)?ve(l,t,n,!1,!0):(a===K&&d&384||!i&&u&16)&&ve(c,t,n),r&&he(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&G(()=>{_&&qi(_,t,e),h&&En(e,null,t,`unmounted`),v&&(e.el=null)},n)},he=e=>{let{type:t,el:n,anchor:r,transition:i}=e,a=t===K;if(a&&!i){ge(n,r);return}if(t===Di){C(e),i&&!i.persisted&&i.afterLeave&&i.afterLeave();return}let o=a?Vn(e):e,c=()=>{a?m(n)&&ge(n,r):s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(o&&o.shapeFlag&1&&i&&!i.persisted){let{leave:e,delayLeave:t}=i,n=o.el,r=()=>e(n,c);t?t(n,c,r):r()}else c()},ge=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},_e=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;Si(c),Si(l),r&&oe(r),i.stop(),a?(a.flags|=8,k(o,e,t,n)):e.vnode.el&&o&&(o.transition=e.vnode.transition,k(o,e,t,n)),s&&G(s,t),G(()=>{e.isUnmounted=!0},t)},ve=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o<e.length;o++)k(e[o],t,n,r,i)},ye=e=>{if(e.shapeFlag&6)return ye(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Fn];return n?h(n):t},be=(e,t,n)=>{yn(()=>{e==null?t._vnode&&k(t._vnode,null,null,!0):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e},e&&t._vnode?void 0:e&&e.component?e.component.uid:Xi())},xe={p:v,um:k,m:me,r:he,mt:O,mc:T,pc:de,pbc:E,n:ye,o:e},Se,A;return i&&([Se,A]=i(xe)),{render:be,hydrate:Se,createApp:Fr(be,Se)}}function gi({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function _i({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function vi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function yi(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e<r.length;e++){let t=r[e],a=i[e];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=i[e]=Wi(i[e]),a.el=t.el),!n&&a.patchFlag!==-2&&yi(t,a)),a.type===Ei&&(a.patchFlag===-1&&(a=i[e]=Wi(a)),a.el=t.el),a.type===q&&!a.el&&(a.el=t.el)}}function bi(e){let t=e.slice(),n=[0],r,i,a,o,s,c=e.length;for(r=0;r<c;r++){let c=e[r];if(c!==0){if(i=n[n.length-1],e[i]<c){t[r]=i,n.push(r);continue}for(a=0,o=n.length-1;a<o;)s=a+o>>1,e[n[s]]<c?a=s+1:o=s;c<e[n[a]]&&(a>0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-->0;)n[a]=o,o=t[o];return n}function xi(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:xi(t)}function Si(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}function Ci(e){if(e.placeholder)return e.placeholder;let t=e.component;return t?Ci(t.subTree):null}var wi=e=>e.__isSuspense;function Ti(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):hn(e)}var K=Symbol.for(`v-fgt`),Ei=Symbol.for(`v-txt`),q=Symbol.for(`v-cmt`),Di=Symbol.for(`v-stc`),Oi=[],J=null;function Y(e=!1){Oi.push(J=e?null:[])}function ki(){Oi.pop(),J=Oi[Oi.length-1]||null}var Ai=1;function ji(e,t=!1){Ai+=e,e<0&&J&&t&&(J.hasOnce=!0)}function Mi(e){return e.dynamicChildren=Ai>0?J||n:null,ki(),Ai>0&&J&&J.push(e),e}function X(e,t,n,r,i,a){return Mi(Z(e,t,n,r,i,a,!0))}function Ni(e,t,n,r,i){return Mi(Ri(e,t,n,r,i,!0))}function Pi(e){return e?e.__v_isVNode===!0:!1}function Fi(e,t){return e.type===t.type&&e.key===t.key}var Ii=({key:e})=>e??null,Li=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||R(e)||h(e)?{i:U,r:e,k:t,f:!!n}:e);function Z(e,t=null,n=null,r=0,i=null,a=e===K?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ii(t),ref:t&&Li(t),scopeId:Sn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:U};return s?(Gi(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),Ai>0&&!o&&J&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&J.push(c),c}var Ri=zi;function zi(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===fr)&&(e=q),Pi(e)){let r=Vi(e,t,!0);return n&&Gi(r,n),Ai>0&&!a&&J&&(r.shapeFlag&6?J[J.indexOf(e)]=r:J.push(r)),r.patchFlag=-2,r}if(fa(e)&&(e=e.__vccOpts),t){t=Bi(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=k(e)),v(n)&&(Bt(n)&&!d(n)&&(n=s({},n)),t.style=ue(n))}let o=g(e)?1:wi(e)?128:In(e)?64:v(e)?4:h(e)?2:0;return Z(e,t,n,r,i,o,a,!0)}function Bi(e){return e?Bt(e)||Qr(e)?s({},e):e:null}function Vi(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?Ki(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Ii(l),ref:t&&t.ref?n&&a?d(a)?a.concat(Li(t)):[a,Li(t)]:Li(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==K?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Vi(e.ssContent),ssFallback:e.ssFallback&&Vi(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce,cacheIndex:e.cacheIndex};return c&&r&&Bn(u,c.clone(u)),u}function Hi(e=` `,t=0){return Ri(Ei,null,e,t)}function Q(e=``,t=!1){return t?(Y(),Ni(q,null,e)):Ri(q,null,e)}function Ui(e){return e==null||typeof e==`boolean`?Ri(q):d(e)?Ri(K,null,e.slice()):Pi(e)?Wi(e):Ri(Ei,null,String(e))}function Wi(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Vi(e)}function Gi(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`){if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),Gi(e,n()),n._c&&(n._d=!0));return}{n=32;let r=t._;!r&&!Qr(t)?t._ctx=U:r===3&&U&&(U.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}}else if(h(t)){if(r&65){Gi(e,{default:t});return}t={default:t,_ctx:U},n=32}else t=String(t),r&64?(n=16,t=[Hi(t)]):n=8;e.children=t,e.shapeFlag|=n}function Ki(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];for(let e in r)if(e===`class`)t.class!==r.class&&(t.class=k([t.class,r.class]));else if(e===`style`)t.style=ue([t.style,r.style]);else if(a(e)){let n=t[e],i=r[e];i&&n!==i&&!(d(n)&&n.includes(i))?t[e]=n?[].concat(n,i):i:i==null&&n==null&&!o(e)&&(t[e]=i)}else e!==``&&(t[e]=r[e])}return t}function qi(e,t,n,r=null){B(e,t,7,[n,r])}var Ji=Nr(),Yi=0;function Xi(){return Yi}function Zi(e,n,r){let i=e.type,a=(n?n.appContext:e.appContext)||Ji,o={uid:Yi++,vnode:e,type:i,parent:n,appContext:a,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Te(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:n?n.provides:Object.create(a.provides),ids:n?n.ids:[``,0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ii(i,a),emitsOptions:Br(i,a),emit:null,emitted:null,propsDefaults:t,inheritAttrs:i.inheritAttrs,ctx:t,data:t,props:t,attrs:t,slots:t,refs:t,setupState:t,setupContext:null,suspense:r,suspenseId:r?r.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return o.ctx={_:o},o.root=n?n.root:o,o.emit=Rr.bind(null,o),e.ce&&e.ce(o),o}var $=null,Qi=()=>$||U,$i,ea;{let e=le(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};$i=t(`__VUE_INSTANCE_SETTERS__`,e=>$=e),ea=t(`__VUE_SSR_SETTERS__`,e=>ia=e)}var ta=e=>{let t=$;return $i(e),e.scope.on(),()=>{e.scope.off(),$i(t)}},na=()=>{$&&$.scope.off(),$i(null)};function ra(e){return e.vnode.shapeFlag&4}var ia=!1;function aa(e,t=!1,n=!1){t&&ea(t);let{props:r,children:i}=e.vnode,a=ra(e);$r(e,r,a,t),fi(e,i,n||t);let o=a?oa(e,t):void 0;return t&&ea(!1),o}function oa(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,_r);let{setup:r}=n;if(r){He();let n=e.setupContext=r.length>1?ua(e):null,i=ta(e),a=nn(r,e,0,[e.props,n]),o=y(a);if(Ue(),i(),(o||e.sp)&&!Jn(e)&&Un(e),o){if(a.then(na,na),t)return a.then(n=>{ea(!0);try{sa(e,n,t)}finally{ea(!1)}}).catch(t=>{rn(t,e,0)});e.asyncDep=a}else sa(e,a,t)}else ca(e,t)}function sa(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=qt(t)),ca(e,n)}function ca(e,t,n){let i=e.type;e.render||=i.render||r;{let t=ta(e);He();try{br(e)}finally{Ue(),t()}}}var la={get(e,t){return P(e,`get`,``),e[t]}};function ua(e){return{attrs:new Proxy(e.attrs,la),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function da(e){return e.exposed?e.exposeProxy||=new Proxy(qt(Vt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in hr)return hr[n](e)},has(e,t){return t in e||t in hr}}):e.proxy}function fa(e){return h(e)&&`__vccOpts`in e}var pa=(e,t)=>Yt(e,t,ia),ma=`3.5.44`,ha=void 0,ga=typeof window<`u`&&window.trustedTypes;if(ga)try{ha=ga.createPolicy(`vue`,{createHTML:e=>e})}catch{}var _a=ha?e=>ha.createHTML(e):e=>e,va=`http://www.w3.org/2000/svg`,ya=`http://www.w3.org/1998/Math/MathML`,ba=typeof document<`u`?document:null,xa=ba&&ba.createElement(`template`),Sa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?ba.createElementNS(va,e):t===`mathml`?ba.createElementNS(ya,e):n?ba.createElement(e,{is:n}):ba.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>ba.createTextNode(e),createComment:e=>ba.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ba.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==a&&(i=i.nextSibling););else{xa.innerHTML=_a(r===`svg`?`<svg>${e}</svg>`:r===`mathml`?`<math>${e}</math>`:e);let i=xa.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ca=Symbol(`_vtc`);function wa(e,t,n){let r=e[Ca];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var Ta=Symbol(`_vod`),Ea=Symbol(`_vsh`),Da=Symbol(``),Oa=/(?:^|;)\s*display\s*:/;function ka(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t){if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??ja(r,t,``)}else for(let e in t)n[e]??ja(r,e,``)}for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?ja(r,i,``):Fa(e,i,!g(t)&&t?t[i]:void 0,o)||ja(r,i,o)}}else if(i){if(t!==n){let e=r[Da];e&&(n+=`;`+e),r.cssText=n,a=Oa.test(n)}}else t&&e.removeAttribute(`style`);Ta in e&&((!i||t!==n)&&(e[Ta]=a?r.display:``),e[Ea]&&(r.display=`none`))}var Aa=/\s*!important$/;function ja(e,t,n){if(d(n))n.forEach(n=>ja(e,t,n));else if(n??=``,t.startsWith(`--`))Aa.test(n)?e.setProperty(t,n.replace(Aa,``),`important`):e.setProperty(t,n);else{let r=Pa(e,t);Aa.test(n)?e.setProperty(E(r),n.replace(Aa,``),`important`):e[r]=n}}var Ma=[`Webkit`,`Moz`,`ms`],Na={};function Pa(e,t){let n=Na[t];if(n)return n;let r=T(t);if(r!==`filter`&&r in e)return Na[t]=r;r=ie(r);for(let n=0;n<Ma.length;n++){let i=Ma[n]+r;if(i in e)return Na[t]=i}return t}function Fa(e,t,n,r){return e.tagName===`TEXTAREA`&&(t===`width`||t===`height`)&&g(r)&&n===r}var Ia=`http://www.w3.org/1999/xlink`;function La(e,t,n,r,i,a=he(t)){r&&t.startsWith(`xlink:`)?n==null?e.removeAttributeNS(Ia,t.slice(6,t.length)):e.setAttributeNS(Ia,t,n):n==null||a&&!ge(n)?e.removeAttribute(t):e.setAttribute(t,a?``:_(n)?String(n):n)}function Ra(e,t,n,r,i){if(t===`innerHTML`||t===`textContent`){n!=null&&(e[t]=t===`innerHTML`?_a(n):n);return}let a=e.tagName;if(t===`value`&&a!==`PROGRESS`&&!a.includes(`-`)){let r=a===`OPTION`?e.getAttribute(`value`)||``:e.value,i=n==null?e.type===`checkbox`?`on`:``:String(n);(r!==i||!(`_value`in e))&&(e.value=i),n??e.removeAttribute(t),e._value=n;return}let o=!1;if(n===``||n==null){let r=typeof e[t];r===`boolean`?n=ge(n):n==null&&r===`string`?(n=``,o=!0):r===`number`&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(i||t)}function za(e,t,n,r){e.addEventListener(t,n,r)}function Ba(e,t,n,r){e.removeEventListener(t,n,r)}var Va=Symbol(`_vei`);function Ha(e,t,n,r,i=null){let a=e[Va]||(e[Va]={}),o=a[t];if(r&&o)o.value=r;else{let[n,s]=Ga(t);r?za(e,n,a[t]=Ya(r,i),s):o&&(Ba(e,n,o,s),a[t]=void 0)}}var Ua=/(Once|Passive|Capture)$/,Wa=/^on:?(?:Once|Passive|Capture)$/;function Ga(e){let t,n;for(;(n=e.match(Ua))&&!Wa.test(e);)t||={},e=e.slice(0,e.length-n[1].length),t[n[1].toLowerCase()]=!0;return[e[2]===`:`?e.slice(3):E(e.slice(2)),t]}var Ka=0,qa=Promise.resolve(),Ja=()=>Ka||=(qa.then(()=>Ka=0),Date.now());function Ya(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;n<i.length&&!e._stopped;n++){let e=i[n];e&&B(e,t,5,a)}}else B(r,t,5,[e])};return n.value=e,n.attached=Ja(),n}var Xa=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Za=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?wa(e,r,c):t===`style`?ka(e,n,r):a(t)?o(t)||Ha(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),1):t[0]===`^`?(t=t.slice(1),0):Qa(e,t,r,c))?(Ra(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&La(e,t,r,c,s,t!==`value`)):e._isVueCE&&($a(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?Ra(e,T(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),La(e,t,r,c))};function Qa(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Xa(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Xa(t)&&g(n)?!1:t in e}function $a(e,t){let n=e._def.props;if(!n)return!1;let r=T(t);return Array.isArray(n)?n.some(e=>T(e)===r):Object.keys(n).some(e=>T(e)===r)}var eo=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>oe(t,e):t};function to(e){e.target.composing=!0}function no(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(`input`)))}var ro=Symbol(`_assign`),io=Symbol(`_initialValue`);function ao(e,t,n){return t&&(e=e.trim()),n&&(e=se(e)),e}var oo={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e.parentNode&&(e.type===`text`?e[io]=e.defaultValue.replace(/[\r\n]/g,``):e.type===`textarea`&&(e[io]=e.defaultValue.replace(/\r\n?/g,`
2
+ `))),e[ro]=eo(i);let a=r||i.props&&i.props.type===`number`;za(e,t?`change`:`input`,t=>{t.target.composing||e[ro](ao(e.value,n,a))}),(n||a)&&za(e,`change`,()=>{e.value=ao(e.value,n,a)}),t||(za(e,`compositionstart`,to),za(e,`compositionend`,no),za(e,`change`,no))},mounted(e,{value:t,modifiers:{trim:n,number:r}}){let i=t??``,a=e[io];delete e[io],a!==void 0&&(e.type===`text`||e.type===`textarea`)&&e.value!==a?e[ro](ao(e.value,n,r)):e.value=i},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:a}},o){if(e[ro]=eo(o),e.composing)return;let s=(a||e.type===`number`)&&!/^0\d/.test(e.value)?se(e.value):e.value,c=t??``;if(s===c)return;let l=e.getRootNode();(l instanceof Document||l instanceof ShadowRoot)&&l.activeElement===e&&e.type!==`range`&&(r&&t===n||i&&e.value.trim()===c)||(e.value=c)}},so=[`ctrl`,`shift`,`alt`,`meta`],co={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>so.some(n=>e[`${n}Key`]&&!t.includes(n))},lo=(e,t)=>{if(!e)return e;let n=e._withMods||={},r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e<t.length;e++){let r=co[t[e]];if(r&&r(n,t))return}return e(n,...r)}))},uo=s({patchProp:Za},Sa),fo;function po(){return fo||=mi(uo)}var mo=((...e)=>{let t=po().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=go(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,ho(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function ho(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function go(e){return g(e)?document.querySelector(e):e}var _o=Ut();async function vo(e,t){try{let n=await fetch(e,t);if(n.status===401)_o.value={kind:`session-ended`};else if(n.status===500){let{error:e}=await n.json();_o.value={kind:`registry-unreadable`,message:e.message}}else return n}catch{_o.value={kind:`not-running`}}}function yo(e){return e.state===`ready`?`Jig ${e.jigVersion}`:e.state===`unsupported`?`${e.jigVersion?`Jig ${e.jigVersion}`:`A Jig of unknown version`} — Jig UI needs ${e.minimum} or later. Run jig upgrade in the project.`:e.state===`incompatible`?`Jig ${e.jigVersion} answers in a form this Jig UI does not read. Update Jig UI: npx @fapost/jig-ui@latest.`:e.state===`unreadable`?`Jig could not be read (${e.code}). It is tried again on the next change.`:e.reason===`missing`?`The project directory is not there any more.`:`There is no Jig in the project any more.`}var bo=e=>e?.startsWith(`https://`)?e:void 0,xo=new Set,So;function Co(e){return xo.size===0&&document.addEventListener(`visibilitychange`,wo),xo.add(e),wo(),()=>xo.delete(e)}function wo(){document.hidden?(So?.close(),So=void 0):So||(So=new EventSource(`/api/events`),So.addEventListener(`open`,()=>{for(let e of xo)e()}),So.addEventListener(`changed`,e=>{let{project:t}=JSON.parse(e.data);for(let e of xo)e(t)}),So.addEventListener(`error`,()=>void vo(`/api/instance`)))}var To={key:0},Eo={key:1,role:`alert`},Do={key:2},Oo={class:`columns`},ko=[`aria-labelledby`],Ao=[`id`],jo={key:0},Mo={key:1,class:`goal`},No={key:2},Po=[`href`],Fo={key:0},Io=((e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n})(Hn({__name:`Board`,props:{id:{}},setup(e){let t=e,n=Ut(),r=0;async function i(){let e=++r,i=await vo(`/api/projects/${encodeURIComponent(t.id)}/board`);if(!i)return;let a=i.status===404?`not-connected`:(await i.json()).board;e===r&&(n.value=a)}rr(i),sr(Co(e=>(e===void 0||e===t.id)&&void i()));let a=e=>e.pullRequest!==null&&!e.paused&&e.gate!==`waiting`&&e.gate!==`changed`&&e.autopilot!==`stopped`;function o(e){if(e.gate===`waiting`)return`Design waits at its gate`;if(e.gate===`changed`)return`Design changed after approval`;if(e.autopilot===`stopped`)return`Autopilot stopped with a question`;if(!e.paused){if(e.pullRequest){let t=e.pullRequest.ci&&e.pullRequest.ci!==`none`?`, CI ${e.pullRequest.ci}`:``;return`Pull request ${e.pullRequest.state??`opened`}${t}`}return e.status===`ready`?`No pull request yet`:e.autopilot===`on`?`On autopilot`:void 0}}return(t,r)=>(Y(),X(K,null,[r[1]||=Z(`p`,null,[Z(`a`,{href:`#/`},`← All projects`)],-1),Z(`h2`,null,A(e.id),1),n.value===void 0?(Y(),X(`p`,To,`Reading the board…`)):n.value===`not-connected`?(Y(),X(`p`,Eo,`No connected project is called `+A(e.id)+`.`,1)):n.value.state===`ready`?(Y(),X(K,{key:3},[Z(`div`,Oo,[(Y(!0),X(K,null,pr(n.value.columns,e=>(Y(),X(`section`,{key:e.id,"aria-labelledby":`column-${e.id}`},[Z(`h3`,{id:`column-${e.id}`},A(e.title)+` (`+A(e.cards.length)+`)`,9,Ao),Z(`ul`,null,[(Y(!0),X(K,null,pr(e.cards,e=>(Y(),X(`li`,{key:e.id},[Z(`strong`,null,A(e.id),1),r[0]||=Hi(),e.class?(Y(),X(`span`,jo,A(e.class),1)):Q(``,!0),e.goal?(Y(),X(`p`,Mo,A(e.goal),1)):Q(``,!0),o(e)?(Y(),X(`p`,No,[Hi(A(o(e))+` `,1),e.pullRequest&&a(e)&&z(bo)(e.pullRequest.url)?(Y(),X(`a`,{key:0,href:z(bo)(e.pullRequest.url),target:`_blank`,rel:`noopener noreferrer`},`Open`,8,Po)):Q(``,!0)])):Q(``,!0)]))),128))])],8,ko))),128))]),n.value.finished>0?(Y(),X(`p`,Fo,A(n.value.finished)+` finished `+A(n.value.finished===1?`task is`:`tasks are`)+` not shown.`,1)):Q(``,!0)],64)):(Y(),X(`p`,Do,A(z(yo)(n.value)),1))],64))}}),[[`__scopeId`,`data-v-4b2ba6bc`]]),Lo={key:0},Ro={key:1},zo=[`aria-labelledby`],Bo=[`id`],Vo=[`href`],Ho={key:0},Uo=[`aria-label`],Wo={key:0},Go={key:1},Ko=[`href`],qo={key:2},Jo=[`onClick`],Yo=[`aria-invalid`],Xo=[`disabled`],Zo={key:0,id:`connect-refusal`,role:`alert`},Qo=Hn({__name:`Workspace`,setup(e){let t=Ut(),n=Ut(``),r=Ut(),i=Ut(!1),a=0;async function o(){let e=++a,n=await vo(`/api/workspace`),r=n&&(await n.json()).projects;r&&e===a&&(t.value=r)}async function s(){i.value=!0,r.value=void 0;let e=await vo(`/api/projects`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:n.value})});i.value=!1,e&&(e.ok?(n.value=``,await o()):r.value=(await e.json()).error.message)}async function c(e){await vo(`/api/projects/${encodeURIComponent(e)}`,{method:`DELETE`})&&await o()}return rr(o),sr(Co(()=>void o())),(e,a)=>(Y(),X(K,null,[t.value===void 0?(Y(),X(`p`,Lo,`Reading projects…`)):t.value.length===0?(Y(),X(`p`,Ro,`No projects yet. Paste the path of a project's main checkout below.`)):(Y(!0),X(K,{key:2},pr(t.value,e=>(Y(),X(`article`,{key:e.id,"aria-labelledby":`project-${e.id}`},[Z(`h2`,{id:`project-${e.id}`},A(e.id),9,Bo),Z(`p`,null,A(z(yo)(e)),1),e.state===`ready`?(Y(),X(K,{key:0},[Z(`p`,null,[Hi(A(e.counts.active)+` active · `+A(e.counts.paused)+` paused · `+A(e.counts.ready)+` ready · `,1),Z(`a`,{href:`#/projects/${encodeURIComponent(e.id)}`},`Open board`,8,Vo)]),e.attention.length===0?(Y(),X(`p`,Ho,`Nothing needs you here.`)):(Y(),X(`ul`,{key:1,"aria-label":`What needs you in ${e.id}`},[(Y(!0),X(K,null,pr(e.attention,(e,t)=>(Y(),X(`li`,{key:t},[Z(`strong`,null,A(e.title),1),e.subject.id?(Y(),X(`span`,Wo,` — `+A(e.subject.id),1)):Q(``,!0),e.detail?(Y(),X(`span`,Go,` (`+A(e.detail)+`)`,1)):Q(``,!0),a[1]||=Z(`br`,null,null,-1),Hi(` `+A(e.todo)+` `,1),z(bo)(e.url)?(Y(),X(`a`,{key:2,href:z(bo)(e.url),target:`_blank`,rel:`noopener noreferrer`},A(e.kind.startsWith(`pull-request`)?`Open pull request`:`Open link`),9,Ko)):Q(``,!0)]))),128))],8,Uo)),e.housekeepingStale?(Y(),X(`p`,qo,[...a[2]||=[Hi(` Pull request facts may be out of date: run `,-1),Z(`code`,null,`jig housekeeping`,-1),Hi(` in the project. `,-1)]])):Q(``,!0)],64)):Q(``,!0),Z(`button`,{type:`button`,onClick:t=>c(e.id)},`Disconnect`,8,Jo)],8,zo))),128)),Z(`form`,{onSubmit:lo(s,[`prevent`])},[a[3]||=Z(`label`,{for:`project-path`},`Project path`,-1),Tn(Z(`input`,{id:`project-path`,"onUpdate:modelValue":a[0]||=e=>n.value=e,required:``,placeholder:`/path/to/project`,"aria-invalid":r.value!==void 0,"aria-describedby":`connect-refusal`},null,8,Yo),[[oo,n.value]]),Z(`button`,{type:`submit`,disabled:i.value},A(i.value?`Connecting…`:`Connect`),9,Xo),r.value?(Y(),X(`p`,Zo,A(r.value),1)):Q(``,!0)],32)],64))}}),$o={key:0,role:`alert`},es={key:1,role:`alert`},ts={key:2,role:`alert`};mo(Hn({__name:`App`,setup(e){let t=Ut(),n=Ut(location.hash),r=()=>n.value=location.hash,i=pa(()=>{let e=/^#\/projects\/([^/]+)$/.exec(n.value);try{return e?.[1]?decodeURIComponent(e[1]):void 0}catch{return}});return rr(async()=>{addEventListener(`hashchange`,r);let e=await vo(`/api/instance`);e&&(t.value=(await e.json()).version)}),sr(()=>removeEventListener(`hashchange`,r)),(e,n)=>(Y(),X(`main`,null,[z(_o)?.kind===`registry-unreadable`?(Y(),X(`p`,$o,A(z(_o).message),1)):z(_o)?.kind===`session-ended`?(Y(),X(`p`,es,[...n[0]||=[Hi(` This page's session has ended. Run `,-1),Z(`code`,null,`npx @fapost/jig-ui`,-1),Hi(` again to reopen it. `,-1)]])):z(_o)?.kind===`not-running`?(Y(),X(`p`,ts,[...n[1]||=[Hi(`Jig UI is not running. Start it with `,-1),Z(`code`,null,`npx @fapost/jig-ui`,-1),Hi(`.`,-1)]])):(Y(),X(K,{key:3},[Z(`h1`,null,`Jig UI `+A(t.value),1),i.value?(Y(),Ni(Io,{id:i.value,key:i.value},null,8,[`id`])):(Y(),Ni(Qo,{key:1}))],64))]))}})).mount(`#app`);
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Jig UI</title>
7
+ <script type="module" crossorigin src="/assets/index-wtIUiIbx.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-Cq3IeyD0.css">
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ </body>
13
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fapost/jig-ui",
3
- "version": "0.1.0-next.1",
3
+ "version": "0.1.0-next.11",
4
4
  "description": "A local web interface for Jig, the agent SDLC framework.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -21,8 +21,10 @@
21
21
  "url": "git+https://github.com/fapost-lab/jig-ui.git"
22
22
  },
23
23
  "scripts": {
24
- "build": "tsc -p tsconfig.build.json",
25
- "typecheck": "tsc --noEmit",
24
+ "build": "tsc -p tsconfig.build.json && vite build",
25
+ "start": "npm run build && node dist/cli.js",
26
+ "dev": "npm run build && (tsc -p tsconfig.build.json --watch --preserveWatchOutput & vite build --watch & node --watch dist/cli.js --no-open)",
27
+ "typecheck": "tsc --noEmit && vue-tsc --noEmit -p web/tsconfig.json",
26
28
  "test": "vitest run"
27
29
  },
28
30
  "dependencies": {
@@ -31,7 +33,11 @@
31
33
  },
32
34
  "devDependencies": {
33
35
  "@types/node": "^24.19.2",
34
- "typescript": "^7.0.2",
35
- "vitest": "^5.0.4"
36
+ "@vitejs/plugin-vue": "^6.0.10",
37
+ "typescript": "^6.0.3",
38
+ "vite": "^8.3.4",
39
+ "vitest": "^5.0.4",
40
+ "vue": "^3.5.44",
41
+ "vue-tsc": "^3.3.13"
36
42
  }
37
43
  }