Renders the Mermaid diagrams Claude Code writes or reads as elegant cards in the transcript: colored Unicode art in any terminal, real SVG on desktop.

mermaid-render is a Claude Code plugin that turns every Mermaid diagram Claude writes in a reply, reads, writes, edits or prints in a file or a command's output, into a rendered diagram right in the transcript: a colored Unicode card in any terminal, a real SVG in the Claude Code desktop app and VS Code.
No more reading raw flowchart LR source. Flowcharts, sequence diagrams, state diagrams, class diagrams and ER diagrams show up as pictures.

In Claude Code, run:
/plugin marketplace add ejklock/claude-mermaid-render
/plugin install mermaid-render@mermaid-render
Or in one line:
/plugin install mermaid-render --marketplace ejklock/claude-mermaid-render
Answer y to add the marketplace and pick a scope (user scope is the default). The plugin is active at once, with no restart.
Requirements: Claude Code 2.1.292 or newer (function-hook plugins). Node.js 20+ for the SVG renderer (desktop, VS Code, and the terminal image mode). rsvg-convert only for the image mode (brew install librsvg / apt install librsvg2-bin).
| Where | When | How it looks |
|---|---|---|
| Claude's replies | A closed ```mermaid fence in the answer | Prose stays Markdown; each diagram becomes a titled card |
| Tool rows | Read or Write of a .mmd / .mermaid file, or a .md file with mermaid fences | The diagrams appear under the tool row |
| Tool rows | A finished Bash run whose output holds a closed mermaid fence, or that prints a whole .mmd / .mermaid file (cat, sed -n) | The command's own row and output stay; each diagram appears as a card under it |
| Tool rows | A finished Edit of a .md file, for each mermaid fence the edit touched; of a .mmd / .mermaid file, the whole updated diagram | The edit's own diff stays; the updated diagrams appear as cards under it |
| Any terminal | Default unicode mode | Box-drawing art: bold labels, soft lines, accent-colored arrows |
| Ghostty, kitty, WezTerm | image mode | The real SVG, drawn as a picture (kitty graphics protocol) |
| Desktop app, VS Code | Always | Native SVG |
Details that keep it pleasant:
The desktop SVG and the terminal image mode use the diagram themes of beautiful-mermaid:
Flowchart, tokyo-night | Sequence, tokyo-night | State, catppuccin-mocha |
|---|---|---|
![]() | ![]() | ![]() |
Open /plugin, select mermaid-render, then Configure:
| Option | Values | Default |
|---|---|---|
terminalRender | unicode (any terminal), image (kitty graphics terminals) | unicode |
theme | tokyo-night, tokyo-night-storm, catppuccin-mocha, dracula, nord, one-dark, github-dark, zinc-dark, solarized-dark, github-light, catppuccin-latte, zinc-light | tokyo-night |
Inside tmux or another multiplexer that does not pass graphics through, keep unicode.
After installing, ask Claude:
Draw the checkout flow of an online store as a Mermaid flowchart.
Or read one of the demo files in this repository:
Read demo/checkout.mmd and demo/architecture.md
flowchart / graph, sequenceDiagram, stateDiagram / stateDiagram-v2, classDiagram, erDiagram. Other types (pie, gantt, mindmap, ...) show a short notice and their source.
Card labels are in Portuguese today (Fluxograma, Sequência, ...).
The plugin is a Claude Code function-hook module (hooks/register.tsx). It hooks ui.render for AssistantMessage, ToolUse and ToolGroup, finds mermaid fences with a CommonMark-style parser (hooks/fences.ts) and draws a TSX tree per diagram.
hooks/vendor/mermaid.js, about 84 KB).renderer/svg.mjs runs it under Node. It flattens CSS variables to plain colors, so any SVG renderer (including rsvg-convert) draws it right.npm ci
npm run build # rebuilds hooks/vendor/mermaid.js and renderer/svg.mjs
npm run validate # claude plugin validate .
npm test # claude plugin test .
npm run screenshots # regenerates docs/images (needs rsvg-convert)
claude --plugin-dir . # try the working copy in a session
The images in docs/images are generated by scripts/screenshots.mjs from the plugin's own renderers. The terminal picture draws the plugin's real Unicode output inside a terminal frame.
MIT. Bundled third-party code is listed in THIRD_PARTY_NOTICES.md.
hooks/register.tsx 344 lines1import type { ElementTable, Register, RenderElement, RenderSurface } from 'claude-code'
2
3import { header, renderUnicode } from './diagram'
4import type { Failure, Glyph, Unicode } from './diagram'
5import { applyEdit, diagramsInFile, diagramsInOutput, diagramsTouched, isDiagramFile, splitMermaid } from './fences'
6import type { Segment } from './fences'
7
8type Svg = { isRendered: true; svg: string; width: number; height: number }
9type Png = { path: string; width: number; height: number }
10/** What the hook fetched through $ for one source, before anything is drawn. */
11type Prepared = { svg?: Svg | Failure; png?: Png }
12type Draw = { ui: ElementTable; surface: RenderSurface; width: number; prepared: Map<string, Prepared> }
13type FileDiagrams = { path: string; lines: number; sources: string[] }
14
15const KINDS: Record<string, string> = {
16 flowchart: 'Fluxograma',
17 graph: 'Fluxograma',
18 sequenceDiagram: 'Sequência',
19 stateDiagram: 'Estados',
20 'stateDiagram-v2': 'Estados',
21 classDiagram: 'Classes',
22 erDiagram: 'Entidade-relacionamento',
23}
24const GLYPH_COLOR: Record<Glyph, string> = { label: 'text', line: 'inactive', arrow: 'claude' }
25const SVG_LIMIT = 131072
26const CACHE_LIMIT = 200
27// The card's border and padding.
28const CARD_CHROME = 4
29
30const unicodeCache = new Map<string, Unicode | Failure>()
31const svgCache = new Map<string, Svg | Failure>()
32const pngCache = new Map<string, Png | undefined>()
33
34export const register: Register = (on, options) => {
35 const terminalRender = String(options.terminalRender ?? 'unicode')
36 const theme = String(options.theme ?? 'tokyo-night')
37
38 // A run of reads folds into one count line; unfold the finished ones that
39 // read or wrote a diagram, so each row below can draw it.
40 on('ui.render', { component: 'ToolGroup' }, ($, e, next) => {
41 const hasDiagram = e.props.calls.some(call => {
42 if (fileDiagrams(call.tool, call.output) !== undefined) return true
43 if (call.isRunning || call.isErrored || call.isInterrupted) return false
44 if (call.tool === 'Bash') return bashDiagrams(call.input, call.output).length > 0
45
46 return call.tool === 'Edit' && editDiagrams(call.output).length > 0
47 })
48
49 return !e.props.isActive && !e.props.isExpanded && hasDiagram
50 ? next({ ...e, props: { ...e.props, isExpanded: true } })
51 : next(e)
52 })
53
54 on('ui.render', async ($, e, next) => {
55 let segments: Segment[] = []
56 let file: FileDiagrams | undefined
57 let indent = 0
58 // Sources of a Bash or Edit row, drawn under the engine's own row.
59 let kept: string[] = []
60 if (e.component === 'AssistantMessage' && e.props.isSummary !== true) {
61 segments = splitMermaid(e.props.text)
62 indent = 2
63 } else if (e.component === 'ToolUse' && !e.props.isRunning && !e.props.isErrored) {
64 const isInterrupted = e.props.isInterrupted === true
65 file = fileDiagrams(e.props.tool, e.props.output)
66 segments = (file?.sources ?? []).map(source => ({ kind: 'mermaid', source }))
67 indent = 7
68 if (file === undefined && !isInterrupted) {
69 kept = e.props.tool === 'Bash' ? bashDiagrams(e.props.input, e.props.output) : e.props.tool === 'Edit' ? editDiagrams(e.props.output) : []
70 segments = kept.map(source => ({ kind: 'mermaid', source }))
71 }
72 }
73 const sources = segments.flatMap(segment => (segment.kind === 'mermaid' ? [segment.source] : []))
74 if (sources.length === 0) return next(e)
75
76 const wantsSvg = e.surface !== 'terminal' || terminalRender === 'image'
77 const prepared = new Map<string, Prepared>()
78 for (const source of wantsSvg ? sources : []) {
79 const key = `${theme}|${source}`
80 let svg = svgCache.get(key)
81 if (svg === undefined) {
82 // SVG layout needs ELK, too large to import: renderer/svg.mjs runs it under node.
83 try {
84 const ran = await $.process.run(['/usr/bin/env', 'node', `${$.plugin.root}/renderer/svg.mjs`], {
85 stdin: JSON.stringify({ source, theme }),
86 timeoutMs: 15000,
87 })
88 svg = ran.exitCode === 0 && !ran.isStdoutTruncated ? parseSvg(ran.stdout) : failure(source, ran.stderr)
89 } catch (error) {
90 svg = failure(source, error instanceof Error ? error.message : String(error))
91 }
92 remember(svgCache, key, svg)
93 }
94
95 let png: Png | undefined
96 if (e.surface === 'terminal' && svg.isRendered) {
97 if (!pngCache.has(key)) {
98 // The terminal reads the PNG itself, so no pixel crosses $.
99 const dir = `${((await $.env.get('TMPDIR')) ?? '/tmp').replace(/\/$/, '')}/mermaid-render`
100 const name = `${dir}/${hash(key)}`
101 let isRasterized = false
102 try {
103 await $.process.run(['mkdir', '-p', dir])
104 await $.fs.write(`${name}.svg`, svg.svg)
105 const ran = await $.process.run(
106 ['/usr/bin/env', 'rsvg-convert', '--zoom', '2', '--output', `${name}.png`, `${name}.svg`],
107 { timeoutMs: 15000 },
108 )
109 isRasterized = ran.exitCode === 0
110 } catch {
111 isRasterized = false
112 }
113 const evicted = remember(pngCache, key, isRasterized ? { path: `${name}.png`, width: svg.width, height: svg.height } : undefined)
114 // Only the PNG is the cache; the SVG is scratch, and a failed run may leave a half-written PNG.
115 const stale = [`${name}.svg`, ...(isRasterized ? [] : [`${name}.png`]), ...(evicted === undefined ? [] : [evicted.path])]
116 await $.process.run(['rm', '-f', ...stale]).catch(() => undefined)
117 }
118 png = pngCache.get(key)
119 }
120 prepared.set(source, { svg, png })
121 }
122
123 const ui = $.ui.resolve(e)
124 const draw: Draw = { ui, surface: e.surface, width: (e.viewport?.columns ?? 100) - indent - CARD_CHROME, prepared }
125 if (e.component === 'ToolUse' && file !== undefined) return toolRow(draw, e.props.tool, file)
126 if (kept.length > 0) return underEngineRow(draw, await next(e), kept)
127
128 return reply(draw, segments, e.component === 'AssistantMessage' && e.props.isFirstOfReply)
129 })
130}
131
132function reply(draw: Draw, segments: Segment[], isFirstOfReply: boolean): RenderElement {
133 const { Box, Text, Markdown } = draw.ui
134
135 return (
136 <Box flexDirection="row">
137 <Box width={2} flexShrink={0}>
138 <Text>{isFirstOfReply ? '⏺' : ' '}</Text>
139 </Box>
140 <Box flexDirection="column" flexGrow={1} gap={1}>
141 {segments.map((segment, index) =>
142 segment.kind === 'markdown' ? <Markdown key={`md-${index}`} text={segment.text} /> : card(draw, segment.source, index),
143 )}
144 </Box>
145 </Box>
146 )
147}
148
149function underEngineRow(draw: Draw, engineRow: RenderElement, sources: string[]): RenderElement {
150 const { Box } = draw.ui
151
152 return (
153 <Box flexDirection="column">
154 {engineRow}
155 <Box flexDirection="column" marginLeft={5} marginTop={1} gap={1}>
156 {sources.map((source, index) => card(draw, source, index))}
157 </Box>
158 </Box>
159 )
160}
161
162function toolRow(draw: Draw, tool: string, file: FileDiagrams): RenderElement {
163 const { Box, Text } = draw.ui
164 const count = file.sources.length
165
166 return (
167 <Box flexDirection="column">
168 <Text>
169 <Text color="success">⏺ </Text>
170 <Text bold>{tool}</Text>
171 <Text>({file.path})</Text>
172 </Text>
173 <Text dimColor>
174 {` ⎿ ${file.lines} linhas · ${count} ${count === 1 ? 'diagrama' : 'diagramas'} Mermaid`}
175 </Text>
176 <Box flexDirection="column" marginLeft={5} marginTop={1} gap={1}>
177 {file.sources.map((source, index) => card(draw, source, index))}
178 </Box>
179 </Box>
180 )
181}
182
183/** The diagrams a finished, clean foreground Bash run printed. */
184function bashDiagrams(input: unknown, output: unknown): string[] {
185 const command = (input as { command?: unknown } | undefined)?.command
186 const result = output as { stdout?: unknown; interrupted?: unknown; isImage?: unknown; backgroundTaskId?: unknown } | undefined
187 const stdout = result?.stdout
188 const isClean = result?.interrupted !== true && result?.isImage !== true && result?.backgroundTaskId === undefined
189 if (typeof command !== 'string' || typeof stdout !== 'string' || !isClean) return []
190
191 return diagramsInOutput(command, stdout)
192}
193
194/** The diagrams a finished Edit left in its file: the whole of a .mmd, else the fences the edit touched. */
195function editDiagrams(output: unknown): string[] {
196 const result = output as
197 | { filePath?: unknown; oldString?: unknown; newString?: unknown; originalFile?: unknown; replaceAll?: unknown }
198 | undefined
199 const { filePath, oldString, newString, originalFile } = result ?? {}
200 if (typeof filePath !== 'string' || typeof oldString !== 'string' || typeof newString !== 'string') return []
201 const original = originalFile === null ? null : typeof originalFile === 'string' ? originalFile : undefined
202 if (original === undefined) return []
203
204 const edited = applyEdit(original, oldString, newString, result?.replaceAll === true)
205 if (isDiagramFile(filePath)) return edited.content.trim() === '' ? [] : [edited.content]
206
207 return diagramsTouched(edited.content, edited.spans)
208}
209
210/** The diagrams a finished Read or Write handled, with the file they came from. */
211function fileDiagrams(tool: string, output: unknown): FileDiagrams | undefined {
212 const result = output as { type?: string; file?: { filePath: string; content: string }; filePath?: string; content?: string } | undefined
213 const file =
214 tool === 'Read' && result?.type === 'text' && result.file !== undefined
215 ? { path: result.file.filePath, content: result.file.content }
216 : tool === 'Write' && typeof result?.filePath === 'string' && typeof result.content === 'string'
217 ? { path: result.filePath, content: result.content }
218 : undefined
219 if (file === undefined) return undefined
220 const sources = diagramsInFile(file.path, file.content)
221
222 return sources.length === 0 ? undefined : { path: file.path, lines: file.content.split('\n').length, sources }
223}
224
225function card(draw: Draw, source: string, index: number): RenderElement {
226 const { Box, Text, Code } = draw.ui
227 const width = Math.max(20, draw.width)
228 const body = cardBody(draw, source, width)
229 const { kind, direction } = header(source)
230 const isFailed = 'reason' in body
231
232 return (
233 <Box
234 key={`mermaid-${index}`}
235 flexDirection="column"
236 borderStyle="round"
237 borderColor={isFailed ? 'warning' : 'claude'}
238 borderDimColor={!isFailed}
239 paddingX={1}
240 >
241 <Box flexDirection="row" justifyContent="space-between">
242 <Text>
243 <Text color={isFailed ? 'warning' : 'claude'}>{isFailed ? '▲ ' : '◆ '}</Text>
244 <Text bold>{KINDS[kind] ?? kind}</Text>
245 {direction !== undefined && <Text dimColor>{` · ${direction}`}</Text>}
246 </Text>
247 <Text dimColor>mermaid</Text>
248 </Box>
249 {'reason' in body ? (
250 <Box flexDirection="column" marginTop={1}>
251 <Text color="warning">Não foi possível desenhar: {body.reason}</Text>
252 <Code source={source} language="mermaid" />
253 </Box>
254 ) : (
255 <Box flexDirection="column" marginTop={1}>
256 {body.element}
257 </Box>
258 )}
259 </Box>
260 )
261}
262
263/** The picture a surface draws best, falling back to box-drawing art. */
264function cardBody(draw: Draw, source: string, width: number): { element: RenderElement } | { reason: string } {
265 const { ui } = draw
266 const { svg, png } = draw.prepared.get(source) ?? {}
267 const alt = `diagrama ${header(source).kind}`
268
269 if (draw.surface !== 'terminal' && svg?.isRendered && svg.svg.length <= SVG_LIMIT && 'Svg' in ui) {
270 const { Svg } = ui
271 return { element: <Svg source={svg.svg} alt={alt} /> }
272 }
273
274 if (draw.surface === 'terminal' && png !== undefined && 'Image' in ui) {
275 const { Image } = ui
276 // A cell is about twice as tall as it is wide.
277 const columns = Math.min(255, width, Math.max(16, Math.ceil(png.width / 8)))
278 const rows = Math.min(255, Math.max(3, Math.round((columns * png.height) / png.width / 2)))
279 return { element: <Image source={{ file: png.path, format: 'png' }} columns={columns} rows={rows} alt={alt} /> }
280 }
281
282 let art = unicodeCache.get(`${width}|${source}`)
283 if (art === undefined) {
284 art = renderUnicode(source, width)
285 remember(unicodeCache, `${width}|${source}`, art)
286 }
287 if (!art.isRendered) return { reason: art.reason }
288
289 return { element: unicodeArt(ui, art, width) }
290}
291
292function unicodeArt(ui: ElementTable, art: Unicode, width: number): RenderElement {
293 const { Box, Text } = ui
294
295 return (
296 <Box flexDirection="column">
297 {art.lines.map(runs => (
298 <Text wrap="truncate-end">
299 {runs.map(run => (
300 <Text color={GLYPH_COLOR[run.glyph]} bold={run.glyph === 'label'}>
301 {run.text}
302 </Text>
303 ))}
304 </Text>
305 ))}
306 {art.isTurned && <Text dimColor>{'\n↕ disposto na vertical para caber na largura do terminal'}</Text>}
307 {art.width > width && <Text dimColor>{`\n↔ o diagrama tem ${art.width} colunas; alargue o terminal para vê-lo inteiro`}</Text>}
308 </Box>
309 )
310}
311
312function parseSvg(svg: string): Svg {
313 const [, width = '640', height = '360'] = /viewBox="[\d.]+ [\d.]+ ([\d.]+) ([\d.]+)"/.exec(svg) ?? []
314
315 return { isRendered: true, svg, width: Number(width), height: Number(height) }
316}
317
318function failure(source: string, reason: string): Failure {
319 return { isRendered: false, kind: header(source).kind, reason: reason.trim() || 'renderer/svg.mjs falhou' }
320}
321
322/** Stores the value and returns the entry it pushed out, if any. */
323function remember<T>(cache: Map<string, T>, key: string, value: T): T | undefined {
324 let evicted: T | undefined
325 if (cache.size >= CACHE_LIMIT) {
326 const oldest = cache.keys().next().value as string
327 evicted = cache.get(oldest)
328 cache.delete(oldest)
329 }
330 cache.set(key, value)
331
332 return evicted
333}
334
335function hash(text: string): string {
336 let value = 0x811c9dc5
337 for (let index = 0; index < text.length; index += 1) {
338 value ^= text.charCodeAt(index)
339 value = Math.imul(value, 0x01000193)
340 }
341
342 return (value >>> 0).toString(16)
343}
344hooks/diagram.ts 92 lines1import { renderMermaidASCII } from './vendor/mermaid.js'
2
3export type Glyph = 'label' | 'line' | 'arrow'
4export type Run = { glyph: Glyph; text: string }
5
6export type Unicode = {
7 isRendered: true
8 kind: string
9 direction?: string
10 /** Set when a horizontal flowchart was laid out vertically to fit. */
11 isTurned: boolean
12 lines: Run[][]
13 width: number
14}
15
16export type Failure = { isRendered: false; kind: string; reason: string }
17
18const COMPACT = { colorMode: 'none', paddingX: 4, paddingY: 2, boxBorderPadding: 0 } as const
19const ARROWS = new Set('►▶◀◄▲▼△▽▷◁→←↑↓')
20const LINES = /[─-╿◇◆○●]/
21
22/**
23 * The header Mermaid itself reads: the first line that is neither blank, a
24 * %% comment nor front matter. Its first word is the kind, its second the
25 * direction of a flowchart.
26 */
27export function header(source: string): { kind: string; direction?: string } {
28 const lines = source.split('\n').map(line => line.trim())
29 let index = 0
30 if (lines[0] === '---') index = lines.indexOf('---', 1) + 1
31 const first = lines.slice(index).find(line => line !== '' && !line.startsWith('%%')) ?? ''
32 const [kind = 'diagram', direction] = first.split(/\s+/)
33 const isFlow = kind === 'flowchart' || kind === 'graph'
34
35 return { kind, direction: isFlow && direction ? direction.toUpperCase() : undefined }
36}
37
38/** Box-drawing art cut into colored runs, laid out vertically when too wide. */
39export function renderUnicode(source: string, columns: number): Unicode | Failure {
40 const { kind, direction } = header(source)
41 try {
42 let art = tidy(renderMermaidASCII(source, COMPACT))
43 let isTurned = false
44 if (widest(art) > columns && (direction === 'LR' || direction === 'RL')) {
45 const turned = tidy(renderMermaidASCII(turnVertical(source), COMPACT))
46 if (widest(turned) < widest(art)) {
47 art = turned
48 isTurned = true
49 }
50 }
51
52 return { isRendered: true, kind, direction, isTurned, lines: art.map(toRuns), width: widest(art) }
53 } catch (error) {
54 return { isRendered: false, kind, reason: firstLine(error) }
55 }
56}
57
58function turnVertical(source: string): string {
59 return source.replace(/^(\s*(?:flowchart|graph)\s+)(LR|RL)\b/im, '$1TD')
60}
61
62function tidy(text: string): string[] {
63 const lines = text.split('\n').map(line => line.replace(/\s+$/, ''))
64 while (lines.length > 0 && lines[0] === '') lines.shift()
65 while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop()
66
67 return lines
68}
69
70function widest(lines: string[]): number {
71 return lines.reduce((most, line) => Math.max(most, [...line].length), 0)
72}
73
74function toRuns(line: string): Run[] {
75 const runs: Run[] = []
76 for (const char of line) {
77 const glyph: Glyph = ARROWS.has(char) ? 'arrow' : LINES.test(char) || char === '╌' ? 'line' : 'label'
78 const last = runs[runs.length - 1]
79 // A space joins whatever run it sits in, so labels stay one run each.
80 if (last !== undefined && (last.glyph === glyph || char === ' ')) last.text += char
81 else runs.push({ glyph, text: char })
82 }
83
84 return runs
85}
86
87function firstLine(error: unknown): string {
88 const message = error instanceof Error ? error.message : String(error)
89
90 return message.split('\n')[0] ?? message
91}
92hooks/fences.ts 136 lines1import { header } from './diagram'
2
3export type Segment =
4 | { kind: 'markdown'; text: string }
5 | { kind: 'mermaid'; source: string }
6
7const OPENER = /^ {0,3}(`{3,}|~{3,})(.*)$/
8
9/**
10 * Splits markdown into prose and mermaid fences, CommonMark style: the closer
11 * repeats the opener's character at least as long, and a mermaid fence shown
12 * inside another fence is documentation, left as prose. An unclosed mermaid
13 * fence (a reply still streaming) stays prose until it closes.
14 */
15export function splitMermaid(markdown: string): Segment[] {
16 const { lines, fences } = scanFences(markdown)
17 const segments: Segment[] = []
18 let proseFrom = 0
19
20 const flushProse = (to: number) => {
21 const text = lines.slice(proseFrom, to).join('\n').replace(/^\n+|\s+$/g, '')
22 if (text !== '') segments.push({ kind: 'markdown', text })
23 }
24
25 for (const fence of fences) {
26 flushProse(fence.opener)
27 segments.push({ kind: 'mermaid', source: fence.source })
28 proseFrom = fence.closer + 1
29 }
30 flushProse(lines.length)
31
32 return segments
33}
34
35/** A closed top-level mermaid fence: the lines of its opener and closer, and what sits between. */
36type Fence = { opener: number; closer: number; source: string }
37
38function scanFences(markdown: string): { lines: string[]; fences: Fence[] } {
39 const lines = markdown.split('\n').map(line => (line.endsWith('\r') ? line.slice(0, -1) : line))
40 const fences: Fence[] = []
41 let index = 0
42
43 while (index < lines.length) {
44 const opener = OPENER.exec(lines[index] ?? '')
45 if (opener === null) {
46 index += 1
47 continue
48 }
49 const closer = closingLine(lines, index + 1, opener[1] ?? '```')
50 const isMermaid = (opener[2] ?? '').trim().split(/\s+/)[0]?.toLowerCase() === 'mermaid'
51 if (closer !== -1 && isMermaid) fences.push({ opener: index, closer, source: lines.slice(index + 1, closer).join('\n') })
52 index = closer === -1 ? lines.length : closer + 1
53 }
54
55 return { lines, fences }
56}
57
58function closingLine(lines: string[], from: number, fence: string): number {
59 const pattern = new RegExp(`^ {0,3}\\${fence[0]}{${fence.length},}\\s*$`)
60 for (let index = from; index < lines.length; index += 1) {
61 if (pattern.test(lines[index] ?? '')) return index
62 }
63
64 return -1
65}
66
67/** The mermaid sources a file holds: the whole of a .mmd, the fences of anything else. */
68export function diagramsInFile(path: string, content: string): string[] {
69 if (isDiagramFile(path)) return content.trim() === '' ? [] : [content]
70
71 return splitMermaid(content).flatMap(segment => (segment.kind === 'mermaid' ? [segment.source] : []))
72}
73
74export function isDiagramFile(path: string): boolean {
75 return /\.(mmd|mermaid)$/i.test(path)
76}
77
78const DIAGRAM_KINDS = new Set([
79 'flowchart', 'flowchart-elk', 'graph', 'sequenceDiagram', 'stateDiagram', 'stateDiagram-v2', 'classDiagram', 'erDiagram',
80 'pie', 'gantt', 'journey', 'gitGraph', 'mindmap', 'timeline', 'quadrantChart', 'requirementDiagram', 'sankey-beta',
81 'xychart-beta', 'block-beta', 'architecture-beta', 'packet-beta', 'kanban', 'C4Context',
82])
83
84/** The mermaid sources a finished shell command printed: its fences, else the whole of a .mmd/.mermaid file it named. */
85export function diagramsInOutput(command: string, stdout: string): string[] {
86 const fenced = splitMermaid(stdout).flatMap(segment => (segment.kind === 'mermaid' ? [segment.source] : []))
87 if (fenced.length > 0) return fenced
88
89 const namesDiagramFile = /\.(mmd|mermaid)(?=$|[\s'"`;|&<>)])/i.test(command)
90 const source = stdout.replace(/\r\n/g, '\n')
91
92 return namesDiagramFile && DIAGRAM_KINDS.has(header(source).kind) ? [source] : []
93}
94
95/** A character range of the edited file that the edit wrote. */
96export type Span = { start: number; end: number }
97
98/** The file an edit leaves behind and the ranges it wrote. */
99export function applyEdit(original: string | null, oldString: string, newString: string, replaceAll: boolean): { content: string; spans: Span[] } {
100 if (original === null) return { content: newString, spans: [{ start: 0, end: newString.length }] }
101 if (oldString === '') return { content: original, spans: [] }
102
103 let content = ''
104 let from = 0
105 const spans: Span[] = []
106 for (let at = original.indexOf(oldString); at !== -1; at = replaceAll ? original.indexOf(oldString, from) : -1) {
107 content += original.slice(from, at)
108 spans.push({ start: content.length, end: content.length + newString.length })
109 content += newString
110 from = at + oldString.length
111 }
112
113 return { content: content + original.slice(from), spans }
114}
115
116/** The mermaid fences of a markdown text whose lines, opener to closer, overlap a written span. */
117export function diagramsTouched(markdown: string, spans: Span[]): string[] {
118 const starts: number[] = []
119 let offset = 0
120 for (const line of markdown.split('\n')) {
121 starts.push(offset)
122 offset += line.length + 1
123 }
124 starts.push(offset)
125 const { fences } = scanFences(markdown)
126
127 return fences.flatMap(fence => {
128 const start = starts[fence.opener] ?? 0
129 // The raw closer line, \r included: scanFences strips the \r from its lines.
130 const end = (starts[fence.closer + 1] ?? 0) - 1
131 const isTouched = spans.some(span => span.start < end && span.end > start)
132
133 return isTouched ? [fence.source] : []
134 })
135}
136hooks/vendor/mermaid.js 13 lines1var oe;var pe=(oe=String.fromCodePoint)!==null&&oe!==void 0?oe:t=>{let e="";return t>65535&&(t-=65536,e+=String.fromCharCode(t>>>10&1023|55296),t=56320|t&1023),e+=String.fromCharCode(t),e};var re;(function(t){t[t.VALUE_LENGTH=49152]="VALUE_LENGTH",t[t.FLAG13=8192]="FLAG13",t[t.BRANCH_LENGTH=8064]="BRANCH_LENGTH",t[t.JUMP_TABLE=127]="JUMP_TABLE"})(re||(re={}));var ye;(function(t){t[t.NUM=35]="NUM",t[t.SEMI=59]="SEMI",t[t.EQUALS=61]="EQUALS",t[t.ZERO=48]="ZERO",t[t.NINE=57]="NINE",t[t.LOWER_A=97]="LOWER_A",t[t.LOWER_F=102]="LOWER_F",t[t.LOWER_X=120]="LOWER_X",t[t.LOWER_Z=122]="LOWER_Z",t[t.UPPER_A=65]="UPPER_A",t[t.UPPER_F=70]="UPPER_F",t[t.UPPER_Z=90]="UPPER_Z"})(ye||(ye={}));var be;(function(t){t[t.EntityStart=0]="EntityStart",t[t.NumericStart=1]="NumericStart",t[t.NumericDecimal=2]="NumericDecimal",t[t.NumericHex=3]="NumericHex",t[t.NamedEntity=4]="NamedEntity"})(be||(be={}));var jt;(function(t){t[t.Legacy=0]="Legacy",t[t.Strict=1]="Strict",t[t.Attribute=2]="Attribute"})(jt||(jt={}));var yn=String.prototype.codePointAt==null?(t,e)=>(t.charCodeAt(e)&64512)===55296?(t.charCodeAt(e)-55296)*1024+t.charCodeAt(e+1)-56320+65536:t.charCodeAt(e):(t,e)=>t.codePointAt(e);var we;(function(t){t[t.XML=0]="XML",t[t.HTML=1]="HTML"})(we||(we={}));var Ce;(function(t){t[t.UTF8=0]="UTF8",t[t.ASCII=1]="ASCII",t[t.Extensive=2]="Extensive",t[t.Attribute=3]="Attribute",t[t.Text=4]="Text"})(Ce||(Ce={}));function lt(t){return(t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1):t).replace(/<br\s*\/?>/gi,`
2`).replace(/\\n/g,`
3`).replace(/<\/?(?:sub|sup|small|mark)\s*>/gi,"").replace(/\*\*(.+?)\*\*/g,"<b>$1</b>").replace(/(?<!\*)\*([^\s*](?:[^*]*[^\s*])?)\*(?!\*)/g,"<i>$1</i>").replace(/~~(.+?)~~/g,"<s>$1</s>")}function Mn(t){let e=t.split(`
4`).map(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("%%"));if(e.length===0)throw new Error("Empty mermaid diagram");let n=e[0];return/^stateDiagram(-v2)?\s*$/i.test(n)?$n(e):kn(e)}function kn(t){let e=t[0].match(/^(?:graph|flowchart)\s+(TD|TB|LR|BT|RL)\s*$/i);if(!e)throw new Error(`Invalid mermaid header: "${t[0]}". Expected "graph TD", "flowchart LR", "stateDiagram-v2", etc.`);let s={direction:e[1].toUpperCase(),nodes:new Map,edges:[],subgraphs:[],classDefs:new Map,classAssignments:new Map,nodeStyles:new Map,linkStyles:new Map},i=[];for(let o=1;o<t.length;o++){let r=t[o],c=r.match(/^classDef\s+(\w+)\s+(.+)$/);if(c){let h=c[1],g=c[2],f=qt(g);s.classDefs.set(h,f);continue}let a=r.match(/^class\s+([\w,-]+)\s+(\w+)$/);if(a){let h=a[1].split(",").map(f=>f.trim()),g=a[2];for(let f of h)s.classAssignments.set(f,g);continue}let A=r.match(/^style\s+([\w,-]+)\s+(.+)$/);if(A){let h=A[1].split(",").map(f=>f.trim()),g=qt(A[2]);for(let f of h)s.nodeStyles.set(f,{...s.nodeStyles.get(f),...g});continue}let l=r.match(/^linkStyle\s+(default|[\d,\s]+)\s+(.+)$/);if(l){let h=l[1].trim(),g=qt(l[2]);if(h==="default")s.linkStyles.set("default",{...s.linkStyles.get("default"),...g});else{let f=h.split(",").map(p=>parseInt(p.trim(),10));for(let p of f)isNaN(p)||s.linkStyles.set(p,{...s.linkStyles.get(p),...g})}continue}let u=r.match(/^direction\s+(TD|TB|LR|BT|RL)\s*$/i);if(u&&i.length>0){i[i.length-1].direction=u[1].toUpperCase();continue}let d=r.match(/^subgraph\s+(.+)$/);if(d){let h=d[1].trim(),g=h.match(/^([\w-]+)\s*\[(.+)\]$/),f,p;g?(f=g[1],p=lt(g[2])):(p=lt(h),f=h.replace(/\s+/g,"_").replace(/[^\w]/g,""));let I={id:f,label:p,nodeIds:[],children:[]};i.push(I);continue}if(r==="end"){let h=i.pop();h&&(i.length>0?i[i.length-1].children.push(h):s.subgraphs.push(h));continue}Yn(r,s,i)}return s}function $n(t){let e={direction:"TD",nodes:new Map,edges:[],subgraphs:[],classDefs:new Map,classAssignments:new Map,nodeStyles:new Map,linkStyles:new Map},n=[],s=new Set,i=0,o=0;for(let r=1;r<t.length;r++){let c=t[r],a=c.match(/^direction\s+(TD|TB|LR|BT|RL)\s*$/i);if(a){n.length>0?n[n.length-1].direction=a[1].toUpperCase():e.direction=a[1].toUpperCase();continue}let A=c.match(/^linkStyle\s+(default|[\d,\s]+)\s+(.+)$/);if(A){let g=A[1].trim(),f=qt(A[2]);if(g==="default")e.linkStyles.set("default",{...e.linkStyles.get("default"),...f});else{let p=g.split(",").map(I=>parseInt(I.trim(),10));for(let I of p)isNaN(I)||e.linkStyles.set(I,{...e.linkStyles.get(I),...f})}continue}let l=c.match(/^state\s+(?:"([^"]+)"\s+as\s+)?([\w\p{L}]+)\s*\{$/u);if(l){let g=l[1]??l[2],f=l[2],p={id:f,label:g,nodeIds:[],children:[]};n.push(p),s.add(f),e.nodes.delete(f);continue}if(c==="}"){let g=n.pop();g&&(n.length>0?n[n.length-1].children.push(g):e.subgraphs.push(g));continue}let u=c.match(/^state\s+"([^"]+)"\s+as\s+([\w\p{L}]+)\s*$/u);if(u){let g=lt(u[1]),f=u[2];Xt(e,n,{id:f,label:g,shape:"rounded"});continue}let d=c.match(/^(\[\*\]|[\w\p{L}-]+)\s*(-->)\s*(\[\*\]|[\w\p{L}-]+)(?:\s*:\s*(.+))?$/u);if(d){let g=d[1],f=d[3],p=d[4]?.trim(),I=p?lt(p):void 0;g==="[*]"?(i++,g=`_start${i>1?i:""}`,Xt(e,n,{id:g,label:"",shape:"state-start"})):s.has(g)||Be(e,n,g),f==="[*]"?(o++,f=`_end${o>1?o:""}`,Xt(e,n,{id:f,label:"",shape:"state-end"})):s.has(f)||Be(e,n,f),e.edges.push({source:g,target:f,label:I,style:"solid",hasArrowStart:!1,hasArrowEnd:!0});continue}let h=c.match(/^([\w\p{L}-]+)\s*:\s*(.+)$/u);if(h){let g=h[1],f=lt(h[2].trim());Xt(e,n,{id:g,label:f,shape:"rounded"});continue}}return e}function Xt(t,e,n){if(!t.nodes.has(n.id)&&t.nodes.set(n.id,n),e.length>0){let i=e[e.length-1];i.nodeIds.includes(n.id)||i.nodeIds.push(n.id)}}function Be(t,e,n){if(!t.nodes.has(n))Xt(t,e,{id:n,label:n,shape:"rounded"});else if(e.length>0){let s=e[e.length-1];s.nodeIds.includes(n)||s.nodeIds.push(n)}}function qt(t){let e=t.replace(/;\s*$/,""),n={};for(let s of e.split(",")){let i=s.indexOf(":");if(i>0){let o=s.slice(0,i).trim(),r=s.slice(i+1).trim();o&&r&&(n[o]=r)}}return n}var Dn=/^(<)?(-->|-.->|==>|---|-\.-|===)(?:\|([^|]*)\|)?/,vn=/^(<)?(--|-\.|==)\s+(.+?)\s+(-->|---|\.\->|-\.\-|==>|===)/,Sn=[{regex:/^([\w-]+)\(\(\((.+?)\)\)\)/,shape:"doublecircle"},{regex:/^([\w-]+)\(\[(.+?)\]\)/,shape:"stadium"},{regex:/^([\w-]+)\(\((.+?)\)\)/,shape:"circle"},{regex:/^([\w-]+)\[\[(.+?)\]\]/,shape:"subroutine"},{regex:/^([\w-]+)\[\((.+?)\)\]/,shape:"cylinder"},{regex:/^([\w-]+)\[\/(.+?)\\\]/,shape:"trapezoid"},{regex:/^([\w-]+)\[\\(.+?)\/\]/,shape:"trapezoid-alt"},{regex:/^([\w-]+)>(.+?)\]/,shape:"asymmetric"},{regex:/^([\w-]+)\{\{(.+?)\}\}/,shape:"hexagon"},{regex:/^([\w-]+)\[(.+?)\]/,shape:"rectangle"},{regex:/^([\w-]+)\((.+?)\)/,shape:"rounded"},{regex:/^([\w-]+)\{(.+?)\}/,shape:"diamond"}],En=/^([\w-]+)/,Wn=/^:::([\w][\w-]*)/;function Yn(t,e,n){let s=t.trim(),i=Me(s,e,n);if(!i||i.ids.length===0)return;s=i.remaining.trim();let o=i.ids;for(;s.length>0;){let r,c,a,A,l=s.match(Dn);if(l){r=!!l[1];let d=l[2],h=l[3]?.trim();A=h?lt(h):void 0,s=s.slice(l[0].length).trim(),c=Qn(d),a=d.endsWith(">")}else{let d=s.match(vn);if(!d)break;r=!!d[1];let h=d[3].trim();A=h?lt(h):void 0;let g=d[2],f=d[4];s=s.slice(d[0].length).trim(),c=Hn(g,f),a=f.endsWith(">")}let u=Me(s,e,n);if(!u||u.ids.length===0)break;s=u.remaining.trim();for(let d of o)for(let h of u.ids)e.edges.push({source:d,target:h,label:A,style:c,hasArrowStart:r,hasArrowEnd:a});o=u.ids}}function Me(t,e,n){let s=ke(t,e,n);if(!s)return null;let i=[s.id],o=s.remaining.trim();for(;o.startsWith("&");){o=o.slice(1).trim();let r=ke(o,e,n);if(!r)break;i.push(r.id),o=r.remaining.trim()}return{ids:i,remaining:o}}function ke(t,e,n){let s=null,i=t;for(let{regex:r,shape:c}of Sn){let a=t.match(r);if(a){s=a[1];let A=lt(a[2]);$e(e,n,{id:s,label:A,shape:c}),i=t.slice(a[0].length);break}}if(s===null){let r=t.match(En);r&&(s=r[1],e.nodes.has(s)||$e(e,n,{id:s,label:s,shape:"rectangle"}),i=t.slice(r[0].length))}if(s===null)return null;let o=i.match(Wn);return o&&(e.classAssignments.set(s,o[1]),i=i.slice(o[0].length)),{id:s,remaining:i}}function $e(t,e,n){!t.nodes.has(n.id)&&t.nodes.set(n.id,n),Fn(e,n.id)}function Fn(t,e){if(t.length>0){let n=t[t.length-1];n.nodeIds.includes(e)||n.nodeIds.push(e)}}function Qn(t){return t==="-.->"||t==="-.-"?"dotted":t==="==>"||t==="==="?"thick":"solid"}function Hn(t,e){return t==="-."||e===".->"||e==="-.-"?"dotted":t==="=="||e==="==>"||e==="==="?"thick":"solid"}var T={x:1,y:0},J={x:1,y:2},U={x:0,y:1},X={x:2,y:1},wt={x:2,y:0},yt={x:0,y:0},Bt={x:2,y:2},Ct={x:0,y:2},Ht={x:1,y:1};function De(t,e){return t.x===e.x&&t.y===e.y}function fe(t,e){return t.x===e.x&&t.y===e.y}function Ot(t,e){return{x:t.x+e.x,y:t.y+e.y}}function Wt(t){return`${t.x},${t.y}`}var Ln={name:"",styles:{}},Ne={fg:"#27272a",border:"#a1a1aa",line:"#71717a",arrow:"#52525b",corner:"#71717a",junction:"#a1a1aa"};function Gn(){let t=globalThis.process;if(t){if(!t.stdout?.isTTY)return"none";let e=t.env?.COLORTERM?.toLowerCase()??"",n=t.env?.TERM?.toLowerCase()??"";return e==="truecolor"||e==="24bit"?"truecolor":n.includes("256color")||n.includes("256")?"ansi256":n&&n!=="dumb"?"ansi16":"none"}return typeof document<"u"?"html":"none"}function xe(t){let e=t.replace("#","");return e.length===3?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16)}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}}var ee="\x1B[",_t=`${ee}0m`;function Xe(t){let{r:e,g:n,b:s}=xe(t);return`${ee}38;2;${e};${n};${s}m`}function Rn(t,e,n){let s=(t+e+n)/3;if(Math.max(Math.abs(t-s),Math.abs(e-s),Math.abs(n-s))<10){let A=Math.round(s/255*23);return 232+Math.min(23,Math.max(0,A))}let o=A=>A<48?0:A<115?1:Math.min(5,Math.floor((A-35)/40)),r=o(t),c=o(e),a=o(n);return 16+36*r+6*c+a}function Ze(t){let{r:e,g:n,b:s}=xe(t),i=Rn(e,n,s);return`${ee}38;5;${i}m`}function Te(t){let{r:e,g:n,b:s}=xe(t),i=.299*e+.587*n+.114*s,o=i>100?0:60,r;return e>180&&n<100&&s<100?r=31:n>180&&e<100&&s<100?r=32:e>150&&n>150&&s<100?r=33:s>180&&e<100&&n<100?r=34:e>150&&s>150&&n<100?r=35:n>150&&s>150&&e<100?r=36:i>200?r=37:i<50?r=30:r=37,`${ee}${r+o}m`}function Ue(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Pe(t,e){return`<span style="color:${t}">${Ue(e)}</span>`}function je(t,e){switch(t){case"text":return e.fg;case"border":return e.border;case"line":return e.line;case"arrow":return e.arrow;case"corner":return e.corner??e.line;case"junction":return e.junction??e.border;default:return e.fg}}function ae(t,e,n){if(n==="none")return"";let s=je(t,e);switch(n){case"truecolor":return Xe(s);case"ansi256":return Ze(s);case"ansi16":return Te(s);default:return""}}function Kn(t,e,n,s){if(s==="none")return t.join("");if(s==="html")return Jn(t,e,n);let i="",o=null,r="";for(let c=0;c<t.length;c++){let a=t[c],A=e[c]??null;if(a===" "){r.length>0&&(o!==null?i+=ae(o,n,s)+r+_t:i+=r,r="",o=null),i+=a;continue}if(A===o){r+=a;continue}r.length>0&&(o!==null?i+=ae(o,n,s)+r+_t:i+=r),r=a,o=A}return r.length>0&&o!==null?i+=ae(o,n,s)+r+_t:r.length>0&&(i+=r),i}function Jn(t,e,n){let s="",i=null,o="",r=()=>{o.length!==0&&(i!==null?s+=Pe(je(i,n),o):s+=Ue(o),o="",i=null)};for(let c=0;c<t.length;c++){let a=t[c],A=e[c]??null;if(a===" "){r(),s+=" ";continue}if(A===i){o+=a;continue}r(),o=a,i=A}return r(),s}function Ae(t,e,n){if(n==="none"||t.length===0)return t;if(n==="html")return Pe(e,t);let s;switch(n){case"truecolor":s=Xe(e);break;case"ansi256":s=Ze(e);break;case"ansi16":s=Te(e);break;default:return t}return`${s}${t}${_t}`}function dt(t,e){let n=[];for(let s=0;s<=t;s++){let i=[];for(let o=0;o<=e;o++)i.push(" ");n.push(i)}return n}function ut(t){let[e,n]=Tt(t);return dt(e,n)}function Ut(t,e){let n=[];for(let s=0;s<=t;s++){let i=[];for(let o=0;o<=e;o++)i.push(null);n.push(i)}return n}function Lt(t,e,n){let s=t.length-1,i=(t[0]?.length??1)-1,o=Math.max(e,s),r=Math.max(n,i),c=Ut(o,r);for(let a=0;a<c.length;a++)for(let A=0;A<c[0].length;A++)a<t.length&&A<t[0].length&&(c[a][A]=t[a][A]);return t.length=0,t.push(...c),t}function Pt(t,e,n,s){(e>=t.length||n>=(t[0]?.length??0))&&Lt(t,e,n),t[e][n]=s}function Tt(t){return[t.length-1,(t[0]?.length??1)-1]}function Ft(t,e,n){let[s,i]=Tt(t),o=Math.max(e,s),r=Math.max(n,i),c=dt(o,r);for(let a=0;a<c.length;a++)for(let A=0;A<c[0].length;A++)a<t.length&&A<t[0].length&&(c[a][A]=t[a][A]);return t.length=0,t.push(...c),t}var Nn=new Set(["\u2500","\u2502","\u250C","\u2510","\u2514","\u2518","\u251C","\u2524","\u252C","\u2534","\u253C","\u2574","\u2575","\u2576","\u2577"]);function ve(t){return Nn.has(t)}function Se(t){return/^[a-zA-Z0-9]$/.test(t)}var Xn={"\u2500":{"\u2502":"\u253C","\u250C":"\u252C","\u2510":"\u252C","\u2514":"\u2534","\u2518":"\u2534","\u251C":"\u253C","\u2524":"\u253C","\u252C":"\u252C","\u2534":"\u2534"},"\u2502":{"\u2500":"\u253C","\u250C":"\u251C","\u2510":"\u2524","\u2514":"\u251C","\u2518":"\u2524","\u251C":"\u251C","\u2524":"\u2524","\u252C":"\u253C","\u2534":"\u253C"},"\u250C":{"\u2500":"\u252C","\u2502":"\u251C","\u2510":"\u252C","\u2514":"\u251C","\u2518":"\u253C","\u251C":"\u251C","\u2524":"\u253C","\u252C":"\u252C","\u2534":"\u253C"},"\u2510":{"\u2500":"\u252C","\u2502":"\u2524","\u250C":"\u252C","\u2514":"\u253C","\u2518":"\u2524","\u251C":"\u253C","\u2524":"\u2524","\u252C":"\u252C","\u2534":"\u253C"},"\u2514":{"\u2500":"\u2534","\u2502":"\u251C","\u250C":"\u251C","\u2510":"\u253C","\u2518":"\u2534","\u251C":"\u251C","\u2524":"\u253C","\u252C":"\u253C","\u2534":"\u2534"},"\u2518":{"\u2500":"\u2534","\u2502":"\u2524","\u250C":"\u253C","\u2510":"\u2524","\u2514":"\u2534","\u251C":"\u253C","\u2524":"\u2524","\u252C":"\u253C","\u2534":"\u2534"},"\u251C":{"\u2500":"\u253C","\u2502":"\u251C","\u250C":"\u251C","\u2510":"\u253C","\u2514":"\u251C","\u2518":"\u253C","\u2524":"\u253C","\u252C":"\u253C","\u2534":"\u253C"},"\u2524":{"\u2500":"\u253C","\u2502":"\u2524","\u250C":"\u253C","\u2510":"\u2524","\u2514":"\u253C","\u2518":"\u2524","\u251C":"\u253C","\u252C":"\u253C","\u2534":"\u253C"},"\u252C":{"\u2500":"\u252C","\u2502":"\u253C","\u250C":"\u252C","\u2510":"\u252C","\u2514":"\u253C","\u2518":"\u253C","\u251C":"\u253C","\u2524":"\u253C","\u2534":"\u253C"},"\u2534":{"\u2500":"\u2534","\u2502":"\u253C","\u250C":"\u253C","\u2510":"\u253C","\u2514":"\u2534","\u2518":"\u2534","\u251C":"\u253C","\u2524":"\u253C","\u252C":"\u253C"}};function Zn(t,e){return Xn[t]?.[e]??t}function It(t,e,n,...s){let[i,o]=Tt(t);for(let c of s){let[a,A]=Tt(c);i=Math.max(i,a+e.x),o=Math.max(o,A+e.y)}let r=dt(i,o);for(let c=0;c<=i;c++)for(let a=0;a<=o;a++)c<t.length&&a<t[0].length&&(r[c][a]=t[c][a]);for(let c of s)for(let a=0;a<c.length;a++)for(let A=0;A<c[0].length;A++){let l=c[a][A];if(l!==" "){let u=a+e.x,d=A+e.y,h=r[u][d];!n&&ve(l)&&ve(h)?r[u][d]=Zn(h,l):Se(h)&&Se(l)||(r[u][d]=l)}}return r}function ne(t,e){let[n,s]=Tt(t),i=[],o=e?.roleCanvas,r=e?.colorMode??"none",c=e?.theme??Ne;for(let a=0;a<=s;a++)if(r==="none"||!o){let A="";for(let l=0;l<=n;l++)A+=t[l][a];i.push(A)}else{let A=[],l=[];for(let u=0;u<=n;u++)A.push(t[u][a]),l.push(o[u]?.[a]??null);i.push(Kn(A,l,c,r))}return i.join(`
5`)}var Tn={"\u25B2":"\u25BC","\u25BC":"\u25B2","\u25E4":"\u25E3","\u25E3":"\u25E4","\u25E5":"\u25E2","\u25E2":"\u25E5","^":"v",v:"^","\u250C":"\u2514","\u2514":"\u250C","\u2510":"\u2518","\u2518":"\u2510","\u252C":"\u2534","\u2534":"\u252C","\u2575":"\u2577","\u2577":"\u2575"};function Un(t){for(let e of t)e.reverse();for(let e of t)for(let n=0;n<e.length;n++){let s=Tn[e[n]];s&&(e[n]=s)}return t}function Pn(t){for(let e of t)e.reverse();return t}function jn(t,e,n,s=!1){Ft(t,e.x+n.length,e.y);for(let i=0;i<n.length;i++){let o=e.x+i,r=t[o][e.y];(s||r===" ")&&(t[o][e.y]=n[i])}}function On(t,e,n){let s=0,i=0;for(let o of e.values())s+=o;for(let o of n.values())i+=o;Ft(t,s-1,i-1)}function Vn(t,e,n){let s=0,i=0;for(let o of e.values())s+=o;for(let o of n.values())i+=o;Lt(t,s-1,i-1)}function zn(t,e){let n=new Map,s=0;for(let[c,a]of t.nodes){let A={name:c,displayLabel:a.label,shape:a.shape,index:s,gridCoord:null,drawingCoord:null,drawing:null,drawn:!1,styleClassName:"",styleClass:Ln};n.set(c,A),s++}let i=[...n.values()],o=[];for(let c of t.edges){let a=n.get(c.source),A=n.get(c.target);!a||!A||o.push({from:a,to:A,text:c.label??"",path:[],labelLine:[],startDir:{x:0,y:0},endDir:{x:0,y:0},style:c.style,hasArrowStart:c.hasArrowStart,hasArrowEnd:c.hasArrowEnd})}let r=[];for(let c of t.subgraphs)Oe(c,null,n,r);qn(t.subgraphs,r,n,t);for(let[c,a]of t.classAssignments){let A=n.get(c),l=t.classDefs.get(a);A&&l&&(A.styleClassName=a,A.styleClass={name:a,styles:l})}return{nodes:i,edges:o,canvas:dt(0,0),roleCanvas:Ut(0,0),grid:new Map,columnWidth:new Map,rowHeight:new Map,subgraphs:r,config:e,offsetX:0,offsetY:0,bundles:[]}}function Oe(t,e,n,s){let i;t.direction&&(i=t.direction==="LR"||t.direction==="RL"?"LR":"TD");let o={name:t.label,nodes:[],parent:e,children:[],minX:0,minY:0,maxX:0,maxY:0,direction:i};for(let r of t.nodeIds){let c=n.get(r);c&&o.nodes.push(c)}s.push(o);for(let r of t.children){let c=Oe(r,o,n,s);o.children.push(c);for(let a of c.nodes)o.nodes.includes(a)||o.nodes.push(a)}return o}function qn(t,e,n,s){let i=new Map;to(t,e,i);let o=new Map;function r(c){let a=i.get(c);if(a){for(let A of c.children)r(A);for(let A of c.nodeIds)o.has(A)||o.set(A,a)}}for(let c of t)r(c);for(let c of e)c.nodes=c.nodes.filter(a=>{let A;for(let[u,d]of n)if(d===a){A=u;break}if(!A)return!1;let l=o.get(A);return l?_n(c,l):!0})}function _n(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parent}return!1}function to(t,e,n){let s=[];function i(o){for(let r of o)s.push(r),i(r.children)}i(t);for(let o=0;o<s.length&&o<e.length;o++)n.set(s[o],e[o])}var eo=class{items=[];get length(){return this.items.length}push(t){this.items.push(t),this.bubbleUp(this.items.length-1)}pop(){if(this.items.length===0)return;let t=this.items[0],e=this.items.pop();return this.items.length>0&&(this.items[0]=e,this.sinkDown(0)),t}bubbleUp(t){for(;t>0;){let e=t-1>>1;if(this.items[t].priority<this.items[e].priority)[this.items[t],this.items[e]]=[this.items[e],this.items[t]],t=e;else break}}sinkDown(t){let e=this.items.length;for(;;){let n=t,s=2*t+1,i=2*t+2;if(s<e&&this.items[s].priority<this.items[n].priority&&(n=s),i<e&&this.items[i].priority<this.items[n].priority&&(n=i),n!==t)[this.items[t],this.items[n]]=[this.items[n],this.items[t]],t=n;else break}}};function no(t,e){let n=Math.abs(t.x-e.x),s=Math.abs(t.y-e.y);return n===0||s===0?n+s:n+s+1}var oo=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}];function ro(t,e){return e.x<0||e.y<0?!1:!t.has(Wt(e))}function Kt(t,e,n){let s=new eo;s.push({coord:e,priority:0});let i=new Map;i.set(Wt(e),0);let o=new Map;for(o.set(Wt(e),null);s.length>0;){let r=s.pop().coord;if(De(r,n)){let a=[],A=r;for(;A!==null;)a.unshift(A),A=o.get(Wt(A))??null;return a}let c=i.get(Wt(r));for(let a of oo){let A={x:r.x+a.x,y:r.y+a.y};if(!ro(t,A)&&!De(A,n))continue;let l=c+1,u=Wt(A),d=i.get(u);if(d===void 0||l<d){i.set(u,l);let h=l+no(A,n);s.push({coord:A,priority:h}),o.set(u,r)}}}return null}function Yt(t){if(t.length<=2)return t;let e=new Set,n=t[0],s=t[1];for(let i=2;i<t.length;i++){let o=t[i],r=s.x-n.x,c=s.y-n.y,a=o.x-s.x,A=o.y-s.y;r===a&&c===A&&e.add(i-1),n=s,s=o}return t.filter((i,o)=>!e.has(o))}function Vt(t){return t===T?J:t===J?T:t===U?X:t===X?U:t===wt?Ct:t===yt?Bt:t===Bt?yt:t===Ct?wt:Ht}function x(t,e){return t.x===e.x&&t.y===e.y}function ft(t,e){return t.x===e.x?t.y<e.y?J:T:t.y===e.y?t.x<e.x?X:U:t.x<e.x?t.y<e.y?Bt:wt:t.y<e.y?Ct:yt}function so(t){return t==="LR"?[X,J,J,X]:[J,X,X,J]}function io(t,e){if(t.from===t.to)return so(e);let n=ft(t.from.gridCoord,t.to.gridCoord),s,i,o,r,c=e==="LR"?x(n,U)||x(n,yt)||x(n,Ct):x(n,T)||x(n,yt)||x(n,wt);return x(n,Bt)?e==="LR"?(s=J,i=U,o=X,r=T):(s=X,i=T,o=J,r=U):x(n,wt)?e==="LR"?(s=T,i=U,o=X,r=J):(s=X,i=J,o=T,r=U):x(n,Ct)?e==="LR"?(s=J,i=J,o=U,r=T):(s=U,i=T,o=J,r=X):x(n,yt)?e==="LR"?(s=J,i=J,o=U,r=J):(s=X,i=X,o=T,r=X):c?e==="LR"&&x(n,U)?(s=J,i=J,o=U,r=X):e==="TD"&&x(n,T)?(s=X,i=X,o=T,r=J):(s=n,i=Vt(n),o=n,r=Vt(n)):(s=n,i=Vt(n),o=n,r=Vt(n)),[s,i,o,r]}function co(t,e){let n=xt(t,e.from),s=xt(t,e.to),i=n&&n===s&&n.direction?n.direction:t.config.graphDirection,[o,r,c,a]=io(e,i),A=Ot(e.from.gridCoord,o),l=Ot(e.to.gridCoord,r),u=Kt(t.grid,A,l),d=Ot(e.from.gridCoord,c),h=Ot(e.to.gridCoord,a),g=Kt(t.grid,d,h);if(u!==null&&g!==null){u=Yt(u),g=Yt(g),u.length<=g.length?(e.startDir=o,e.endDir=r,e.path=u):(e.startDir=c,e.endDir=a,e.path=g);return}if(u!==null){e.startDir=o,e.endDir=r,e.path=Yt(u);return}if(g!==null){e.startDir=c,e.endDir=a,e.path=Yt(g);return}e.startDir=o,e.endDir=r,e.path=[A,l]}function Ee(t,e){if(e.text.length===0)return;let n=e.text.length,s=e.path.length,i=t.config.graphDirection==="TD",o=[];for(let d=1;d<s;d++){let h=e.path[d-1],g=e.path[d],f=[h,g],p=ao(t,f),I=h.x===g.x;o.push({line:f,width:p,index:d,isVertical:I})}let r=o.filter(d=>d.width>=n&&d.index>1),c;if(r.length>0)r.sort((d,h)=>h.index-d.index),c=r[0].line;else{let d=o.filter(h=>h.width>=n);d.length>0?(d.sort((h,g)=>g.index-h.index),c=d[0].line):(o.sort((h,g)=>g.width-h.width),c=o[0]?.line??[e.path[0],e.path[1]])}let a=Math.min(c[0].x,c[1].x),A=Math.max(c[0].x,c[1].x),l=a+Math.floor((A-a)/2),u=t.columnWidth.get(l)??0;t.columnWidth.set(l,Math.max(u,n+2)),e.labelLine=[c[0],c[1]]}function ao(t,e){let n=0,s=Math.min(e[0].x,e[1].x),i=Math.max(e[0].x,e[1].x);for(let o=s;o<=i;o++)n+=t.columnWidth.get(o)??0;return n}function Ao(t){if(t.config.graphDirection!=="TD")return[];let e=[],n=new Set,s=new Map;for(let o of t.edges){if(o.from===o.to)continue;let r=s.get(o.to)??[];r.push(o),s.set(o.to,r)}for(let[o,r]of s){if(r.length<2||!We(r,t)||r.some(a=>n.has(a)))continue;let c={type:"fan-in",edges:[...r],sharedNode:o,otherNodes:r.map(a=>a.from),junctionPoint:null,sharedPath:[],junctionDir:Ht,sharedNodeDir:Ht};for(let a of r)a.bundle=c,n.add(a);e.push(c)}let i=new Map;for(let o of t.edges){if(o.from===o.to||n.has(o))continue;let r=i.get(o.from)??[];r.push(o),i.set(o.from,r)}for(let[o,r]of i){if(r.length<2||!We(r,t))continue;let c={type:"fan-out",edges:[...r],sharedNode:o,otherNodes:r.map(a=>a.to),junctionPoint:null,sharedPath:[],junctionDir:Ht,sharedNodeDir:Ht};for(let a of r)a.bundle=c,n.add(a);e.push(c)}return e}function We(t,e){if(t.length<2)return!1;let n=t[0].style,s=xt(e,t[0].from),i=xt(e,t[0].to);for(let o of t){if(o.style!==n||o.text.length>0)return!1;let r=xt(e,o.from),c=xt(e,o.to);if(r!==s||c!==i||r!==c)return!1}return!0}function lo(t,e){let n=t.config.graphDirection,s=e.sharedNode.gridCoord,i=e.otherNodes.map(o=>o.gridCoord);if(e.type==="fan-in"){let o=Math.min(...i.map(A=>A.x)),r=Math.max(...i.map(A=>A.x)),c=Math.min(...i.map(A=>A.y)),a=Math.max(...i.map(A=>A.y));if(n==="TD"){let A=s.y-1,l=Math.floor((o+r)/2)+1;return{x:s.x+1,y:A}}else{let A=s.x-1,l=s.y+1;return{x:A,y:l}}}else{let o=Math.min(...i.map(A=>A.x)),r=Math.max(...i.map(A=>A.x)),c=Math.min(...i.map(A=>A.y)),a=Math.max(...i.map(A=>A.y));if(n==="TD"){let A=s.y+3;return{x:s.x+1,y:A}}else{let A=s.x+3,l=s.y+1;return{x:A,y:l}}}}function ho(t,e){let n=t.config.graphDirection;e.junctionPoint=lo(t,e);let s=e.junctionPoint;if(e.type==="fan-in"){e.junctionDir=n==="TD"?T:U,e.sharedNodeDir=n==="TD"?J:X;let i=e.sharedNode.gridCoord,o=n==="TD"?{x:i.x+1,y:i.y}:{x:i.x,y:i.y+1},r=Kt(t.grid,s,o);e.sharedPath=r?Yt(r):[s,o];for(let c of e.edges){let a=c.from.gridCoord,A=n==="TD"?{x:a.x+1,y:a.y+2}:{x:a.x+2,y:a.y+1},l=Kt(t.grid,A,s);c.pathToJunction=l?Yt(l):[A,s],c.startDir=n==="TD"?J:X,c.endDir=n==="TD"?T:U,c.path=[...c.pathToJunction,...e.sharedPath.slice(1)]}}else{e.junctionDir=n==="TD"?J:X,e.sharedNodeDir=n==="TD"?T:U;let i=e.sharedNode.gridCoord,o=n==="TD"?{x:i.x+1,y:i.y+2}:{x:i.x+2,y:i.y+1},r=Kt(t.grid,o,s);e.sharedPath=r?Yt(r):[o,s];for(let c of e.edges){let a=c.to.gridCoord,A=n==="TD"?{x:a.x+1,y:a.y}:{x:a.x,y:a.y+1},l=Kt(t.grid,s,A);c.pathToJunction=l?Yt(l):[s,A],c.startDir=n==="TD"?J:X,c.endDir=n==="TD"?T:U,c.path=[...e.sharedPath,...c.pathToJunction.slice(1)]}}}function uo(t){for(let e of t.bundles)ho(t,e)}function ct(t){return t.split(`
6`)}function le(t){let e=ct(t);return Math.max(...e.map(n=>n.length),0)}function Ye(t){return ct(t).length}var Fe={rectangle:{unicode:{tl:"\u250C",tr:"\u2510",bl:"\u2514",br:"\u2518"},ascii:{tl:"+",tr:"+",bl:"+",br:"+"}},rounded:{unicode:{tl:"\u256D",tr:"\u256E",bl:"\u2570",br:"\u256F"},ascii:{tl:".",tr:".",bl:"'",br:"'"}},circle:{unicode:{tl:"\u25EF",tr:"\u25EF",bl:"\u25EF",br:"\u25EF"},ascii:{tl:"o",tr:"o",bl:"o",br:"o"}},doublecircle:{unicode:{tl:"\u25CE",tr:"\u25CE",bl:"\u25CE",br:"\u25CE"},ascii:{tl:"@",tr:"@",bl:"@",br:"@"}},diamond:{unicode:{tl:"\u25C7",tr:"\u25C7",bl:"\u25C7",br:"\u25C7"},ascii:{tl:"<",tr:">",bl:"<",br:">"}},hexagon:{unicode:{tl:"\u231C",tr:"\u231D",bl:"\u231E",br:"\u231F"},ascii:{tl:"*",tr:"*",bl:"*",br:"*"}},stadium:{unicode:{tl:"(",tr:")",bl:"(",br:")"},ascii:{tl:"(",tr:")",bl:"(",br:")"}},subroutine:{unicode:{tl:"\u255F",tr:"\u2562",bl:"\u255F",br:"\u2562"},ascii:{tl:"|",tr:"|",bl:"|",br:"|"}},cylinder:{unicode:{tl:"\u256D",tr:"\u256E",bl:"\u2570",br:"\u256F"},ascii:{tl:".",tr:".",bl:"'",br:"'"}},asymmetric:{unicode:{tl:"\u25B7",tr:"\u2510",bl:"\u25B7",br:"\u2518"},ascii:{tl:">",tr:"+",bl:">",br:"+"}},trapezoid:{unicode:{tl:"/",tr:"\\",bl:"\u2514",br:"\u2518"},ascii:{tl:"/",tr:"\\",bl:"+",br:"+"}},"trapezoid-alt":{unicode:{tl:"\u250C",tr:"\u2510",bl:"\\",br:"/"},ascii:{tl:"+",tr:"+",bl:"\\",br:"/"}},"state-start":{unicode:{tl:"\u25CF",tr:"\u25CF",bl:"\u25CF",br:"\u25CF"},ascii:{tl:"*",tr:"*",bl:"*",br:"*"}},"state-end":{unicode:{tl:"\u25C9",tr:"\u25C9",bl:"\u25C9",br:"\u25C9"},ascii:{tl:"@",tr:"@",bl:"@",br:"@"}}};function kt(t,e){let n=Fe[t]??Fe.rectangle;return e?n.ascii:n.unicode}function Dt(t,e){let n=ct(t),s=Math.max(...n.map(l=>l.length),0),i=n.length,o=2*e.padding+s,r=o+2,c=i+2*e.padding,a=c%2===0?c+1:c,A=a+2;return{width:r,height:A,labelArea:{x:1+e.padding,y:1+e.padding,width:s,height:i},gridColumns:[1,o,1],gridRows:[1,a,1]}}function vt(t,e,n,s){let{width:i,height:o}=e,r=dt(i-1,o-1),c={x:0,y:0},a={x:i-1,y:o-1},A=s?"-":"\u2500",l=s?"|":"\u2502";for(let p=c.x+1;p<a.x;p++)r[p][c.y]=A,r[p][a.y]=A;for(let p=c.y+1;p<a.y;p++)r[c.x][p]=l,r[a.x][p]=l;r[c.x][c.y]=n.tl,r[a.x][c.y]=n.tr,r[c.x][a.y]=n.bl,r[a.x][a.y]=n.br;let u=ct(t),d=i-1,h=o-1,f=Math.floor(h/2)-Math.floor((u.length-1)/2);for(let p=0;p<u.length;p++){let I=u[p],H=Math.floor(d/2)-Math.ceil(I.length/2)+1;for(let B=0;B<I.length;B++){let R=H+B,D=f+p;R>=0&&R<r.length&&D>=0&&D<r[0].length&&(r[R][D]=I[B])}}return r}function bt(t,e,n){let{width:s,height:i}=e,o=n.x+Math.floor(s/2),r=n.y+Math.floor(i/2);return x(t,T)?{x:o,y:n.y}:x(t,J)?{x:o,y:n.y+i-1}:x(t,U)?{x:n.x,y:r}:x(t,X)?{x:n.x+s-1,y:r}:x(t,yt)?{x:n.x,y:n.y}:x(t,wt)?{x:n.x+s-1,y:n.y}:x(t,Ct)?{x:n.x,y:n.y+i-1}:x(t,Bt)?{x:n.x+s-1,y:n.y+i-1}:{x:o,y:r}}var Ve={getDimensions:Dt,render(t,e,n){let s=kt("rectangle",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},go={getDimensions:Dt,render(t,e,n){let s=kt("diamond",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},fo={getDimensions:Dt,render(t,e,n){let s=kt("circle",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},xo={getDimensions(t,e){return{width:5,height:3,labelArea:{x:2,y:1,width:1,height:1},gridColumns:[1,3,1],gridRows:[1,1,1]}},render(t,e,n){let{width:s,height:i}=e,o=dt(s-1,i-1),r=Math.floor(s/2);return n.useAscii?(o[0][0]=".",o[1][0]="-",o[2][0]="-",o[3][0]="-",o[4][0]=".",o[0][1]="|",o[r][1]="*",o[4][1]="|",o[0][2]="'",o[1][2]="-",o[2][2]="-",o[3][2]="-",o[4][2]="'"):(o[0][0]="\u256D",o[1][0]="\u2500",o[2][0]="\u2500",o[3][0]="\u2500",o[4][0]="\u256E",o[0][1]="\u2502",o[r][1]="\u25CF",o[4][1]="\u2502",o[0][2]="\u2570",o[1][2]="\u2500",o[2][2]="\u2500",o[3][2]="\u2500",o[4][2]="\u256F"),o},getAttachmentPoint(t,e,n){let{width:s,height:i}=e,o=n.x+Math.floor(s/2),r=n.y+Math.floor(i/2);return x(t,T)?{x:o,y:n.y}:x(t,J)?{x:o,y:n.y+i-1}:x(t,U)?{x:n.x,y:r}:x(t,X)?{x:n.x+s-1,y:r}:{x:o,y:r}}},mo={getDimensions(t,e){return{width:5,height:3,labelArea:{x:2,y:1,width:1,height:1},gridColumns:[1,3,1],gridRows:[1,1,1]}},render(t,e,n){let{width:s,height:i}=e,o=dt(s-1,i-1),r=Math.floor(s/2);return n.useAscii?(o[0][0]="#",o[1][0]="=",o[2][0]="=",o[3][0]="=",o[4][0]="#",o[0][1]="#",o[r][1]="*",o[4][1]="#",o[0][2]="#",o[1][2]="=",o[2][2]="=",o[3][2]="=",o[4][2]="#"):(o[0][0]="\u2554",o[1][0]="\u2550",o[2][0]="\u2550",o[3][0]="\u2550",o[4][0]="\u2557",o[0][1]="\u2551",o[r][1]="\u25CE",o[4][1]="\u2551",o[0][2]="\u255A",o[1][2]="\u2550",o[2][2]="\u2550",o[3][2]="\u2550",o[4][2]="\u255D"),o},getAttachmentPoint(t,e,n){let{width:s,height:i}=e,o=n.x+Math.floor(s/2),r=n.y+Math.floor(i/2);return x(t,T)?{x:o,y:n.y}:x(t,J)?{x:o,y:n.y+i-1}:x(t,U)?{x:n.x,y:r}:x(t,X)?{x:n.x+s-1,y:r}:{x:o,y:r}}},po={getDimensions:Dt,render(t,e,n){let s=kt("rounded",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},yo={getDimensions(t,e){let n=ct(t),s=Math.max(...n.map(A=>A.length),0),i=n.length,o=2*e.padding+s,r=o+4,c=i+2*e.padding,a=Math.max(c+2,3);return{width:r,height:a,labelArea:{x:2+e.padding,y:1+e.padding,width:s,height:i},gridColumns:[2,o,2],gridRows:[1,c,1]}},render(t,e,n){let{width:s,height:i}=e,o=dt(s-1,i-1),r=Math.floor(i/2),c=n.useAscii?"-":"\u2500";if(i===3)o[0][r]="(",o[s-1][r]=")";else if(n.useAscii){for(let l=0;l<i;l++)o[0][l]="(",o[s-1][l]=")";for(let l=1;l<s-1;l++)o[l][0]=c,o[l][i-1]=c}else{o[0][0]="\u256D";for(let l=1;l<s-1;l++)o[l][0]=c;o[s-1][0]="\u256E";for(let l=1;l<i-1;l++)o[0][l]="\u2502",o[s-1][l]="\u2502";o[0][i-1]="\u2570";for(let l=1;l<s-1;l++)o[l][i-1]=c;o[s-1][i-1]="\u256F"}let a=ct(t),A=r-Math.floor((a.length-1)/2);for(let l=0;l<a.length;l++){let u=a[l],d=Math.floor(s/2)-Math.floor(u.length/2);for(let h=0;h<u.length;h++){let g=d+h,f=A+l;g>0&&g<s-1&&f>=0&&f<i&&(o[g][f]=u[h])}}return o},getAttachmentPoint:bt},bo={getDimensions:Dt,render(t,e,n){let s=kt("hexagon",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},wo={getDimensions(t,e){let n=ct(t),s=Math.max(...n.map(A=>A.length),0),i=n.length,o=2*e.padding+s,r=o+4,c=i+2*e.padding,a=c+2;return{width:r,height:a,labelArea:{x:2+e.padding,y:1+e.padding,width:s,height:i},gridColumns:[2,o,2],gridRows:[1,c,1]}},render(t,e,n){let{width:s,height:i}=e,o=dt(s-1,i-1),r=n.useAscii?"-":"\u2500",c=n.useAscii?"|":"\u2502";o[0][0]=n.useAscii?"+":"\u250C",o[1][0]=n.useAscii?"+":"\u252C";for(let u=2;u<s-2;u++)o[u][0]=r;o[s-2][0]=n.useAscii?"+":"\u252C",o[s-1][0]=n.useAscii?"+":"\u2510";for(let u=1;u<i-1;u++)o[0][u]=c,o[1][u]=c,o[s-2][u]=c,o[s-1][u]=c;o[0][i-1]=n.useAscii?"+":"\u2514",o[1][i-1]=n.useAscii?"+":"\u2534";for(let u=2;u<s-2;u++)o[u][i-1]=r;o[s-2][i-1]=n.useAscii?"+":"\u2534",o[s-1][i-1]=n.useAscii?"+":"\u2518";let a=ct(t),l=Math.floor(i/2)-Math.floor((a.length-1)/2);for(let u=0;u<a.length;u++){let d=a[u],h=Math.floor(s/2)-Math.floor(d.length/2);for(let g=0;g<d.length;g++){let f=h+g,p=l+u;f>1&&f<s-2&&p>0&&p<i-1&&(o[f][p]=d[g])}}return o},getAttachmentPoint:bt},Co={getDimensions:Dt,render(t,e,n){let s=kt("doublecircle",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},Io={getDimensions(t,e){let n=ct(t),s=Math.max(...n.map(A=>A.length),0),i=n.length,o=2*e.padding+s,r=o+2,c=i+2*e.padding+2,a=c+2;return{width:r,height:a,labelArea:{x:1+e.padding,y:2+e.padding,width:s,height:i},gridColumns:[1,o,1],gridRows:[2,c-2,2]}},render(t,e,n){let{width:s,height:i}=e,o=dt(s-1,i-1),r=n.useAscii?"-":"\u2500",c=n.useAscii?"|":"\u2502";o[0][0]=n.useAscii?".":"\u256D";for(let u=1;u<s-1;u++)o[u][0]=r;o[s-1][0]=n.useAscii?".":"\u256E",o[0][1]=c;for(let u=1;u<s-1;u++)o[u][1]=r;o[s-1][1]=c;for(let u=2;u<i-2;u++)o[0][u]=c,o[s-1][u]=c;o[0][i-2]=c;for(let u=1;u<s-1;u++)o[u][i-2]=r;o[s-1][i-2]=c,o[0][i-1]=n.useAscii?"'":"\u2570";for(let u=1;u<s-1;u++)o[u][i-1]=r;o[s-1][i-1]=n.useAscii?"'":"\u256F";let a=ct(t),l=Math.floor(i/2)-Math.floor((a.length-1)/2);for(let u=0;u<a.length;u++){let d=a[u],h=Math.floor(s/2)-Math.floor(d.length/2);for(let g=0;g<d.length;g++){let f=h+g,p=l+u;f>0&&f<s-1&&p>1&&p<i-2&&(o[f][p]=d[g])}}return o},getAttachmentPoint:bt},Bo={getDimensions:Dt,render(t,e,n){let s=kt("asymmetric",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},Mo={getDimensions:Dt,render(t,e,n){let s=kt("trapezoid",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},ko={getDimensions:Dt,render(t,e,n){let s=kt("trapezoid-alt",n.useAscii);return vt(t,e,s,n.useAscii)},getAttachmentPoint:bt},$o=new Map([["rectangle",Ve],["rounded",po],["diamond",go],["stadium",yo],["circle",fo],["subroutine",wo],["doublecircle",Co],["hexagon",bo],["cylinder",Io],["asymmetric",Bo],["trapezoid",Mo],["trapezoid-alt",ko],["state-start",xo],["state-end",mo]]);function ze(t){return $o.get(t)??Ve}function Do(t,e,n){return ze(t).getDimensions(e,n)}function vo(t,e,n,s){return ze(t).getAttachmentPoint(e,n,s)}function So(t,e){return Eo(t,e)}function Eo(t,e){let n=t.gridCoord,s=e.config.useAscii,i=0;for(let B=0;B<2;B++)i+=e.columnWidth.get(n.x+B)??0;let o=0;for(let B=0;B<2;B++)o+=e.rowHeight.get(n.y+B)??0;let r={x:0,y:0},c={x:i,y:o},a=dt(Math.max(r.x,c.x),Math.max(r.y,c.y)),A=kt(t.shape,s),l=t.shape==="state-end",u=s?l?"=":"-":l?"\u2550":"\u2500",d=s?l?"\u2016":"|":l?"\u2551":"\u2502",g=l?s?{tl:"#",tr:"#",bl:"#",br:"#"}:{tl:"\u2554",tr:"\u2557",bl:"\u255A",br:"\u255D"}:A;for(let B=r.x+1;B<c.x;B++)a[B][r.y]=u;for(let B=r.x+1;B<c.x;B++)a[B][c.y]=u;for(let B=r.y+1;B<c.y;B++)a[r.x][B]=d;for(let B=r.y+1;B<c.y;B++)a[c.x][B]=d;a[r.x][r.y]=g.tl,a[c.x][r.y]=g.tr,a[r.x][c.y]=g.bl,a[c.x][c.y]=g.br;let f=t.displayLabel,p=ct(f),H=r.y+Math.floor(o/2)-Math.floor((p.length-1)/2);for(let B=0;B<p.length;B++){let R=p[B],D=r.x+Math.floor(i/2)-Math.ceil(R.length/2)+1;for(let j=0;j<R.length;j++)D+j>=0&&D+j<a.length&&H+B>=0&&H+B<a[0].length&&(a[D+j][H+B]=R[j])}return a}function Wo(t,e){return So(t,e)}function qe(t,e,n=1){let s=0;for(let B of t)for(let R of B)s=Math.max(s,R.length);let o=s+2*n+2,r=0;for(let B of t)r+=Math.max(B.length,1);let c=t.length-1,a=r+c+2,A=e?"-":"\u2500",l=e?"|":"\u2502",u=e?"+":"\u250C",d=e?"+":"\u2510",h=e?"+":"\u2514",g=e?"+":"\u2518",f=e?"+":"\u251C",p=e?"+":"\u2524",I=dt(o-1,a-1);I[0][0]=u;for(let B=1;B<o-1;B++)I[B][0]=A;I[o-1][0]=d,I[0][a-1]=h;for(let B=1;B<o-1;B++)I[B][a-1]=A;I[o-1][a-1]=g;for(let B=1;B<a-1;B++)I[0][B]=l,I[o-1][B]=l;let H=1;for(let B=0;B<t.length;B++){let R=t[B],D=R.length>0?R:[""];for(let j of D){let ht=1+n;for(let L=0;L<j.length;L++)I[ht+L][H]=j[L];H++}if(B<t.length-1){I[0][H]=f;for(let j=1;j<o-1;j++)I[j][H]=A;I[o-1][H]=p,H++}}return I}var Yo={solid:{h:{unicode:"\u2500",ascii:"-"},v:{unicode:"\u2502",ascii:"|"}},dotted:{h:{unicode:"\u2504",ascii:"."},v:{unicode:"\u2506",ascii:":"}},thick:{h:{unicode:"\u2501",ascii:"="},v:{unicode:"\u2503",ascii:"\u2016"}}};function me(t,e,n,s,i,o,r="solid"){let c=ft(e,n),a=[],A=Yo[r],l=o?A.h.ascii:A.h.unicode,u=o?A.v.ascii:A.v.unicode;if(x(c,T))for(let d=e.y-s;d>=n.y-i;d--)a.push({x:e.x,y:d}),t[e.x][d]=u;else if(x(c,J))for(let d=e.y+s;d<=n.y+i;d++)a.push({x:e.x,y:d}),t[e.x][d]=u;else if(x(c,U))for(let d=e.x-s;d>=n.x-i;d--)a.push({x:d,y:e.y}),t[d][e.y]=l;else if(x(c,X))for(let d=e.x+s;d<=n.x+i;d++)a.push({x:d,y:e.y}),t[d][e.y]=l;else if(x(c,yt)){for(let d=e.x-s;d>=n.x;d--)a.push({x:d,y:e.y}),t[d][e.y]=l;for(let d=e.y-1;d>=n.y-i;d--)a.push({x:n.x,y:d}),t[n.x][d]=u}else if(x(c,wt)){for(let d=e.x+s;d<=n.x;d++)a.push({x:d,y:e.y}),t[d][e.y]=l;for(let d=e.y-1;d>=n.y-i;d--)a.push({x:n.x,y:d}),t[n.x][d]=u}else if(x(c,Ct)){for(let d=e.x-s;d>=n.x;d--)a.push({x:d,y:e.y}),t[d][e.y]=l;for(let d=e.y+1;d<=n.y+i;d++)a.push({x:n.x,y:d}),t[n.x][d]=u}else if(x(c,Bt))if(n.x-e.x<=1)for(let h=e.y+s;h<=n.y+i;h++)a.push({x:e.x,y:h}),t[e.x][h]=u;else{for(let h=e.x+s;h<=n.x;h++)a.push({x:h,y:e.y}),t[h][e.y]=l;for(let h=e.y+1;h<=n.y+i;h++)a.push({x:n.x,y:h}),t[n.x][h]=u}return a}function Fo(t,e){if(e.path.length===0){let l=ut(t.canvas);return[l,l,l,l,l,l]}let n=Ro(t,e),[s,i,o]=Ho(t,e.path,e.style),r=Lo(t,e.path,i[0],e.from.shape),c;e.hasArrowEnd?c=Qe(t,i[i.length-1],o[o.length-1]):c=ut(t.canvas);let a;if(e.hasArrowStart&&i.length>0){let u=i[0][0],d=Qo(o[0]),h={x:u.x,y:u.y};x(o[0],X)?h.x=u.x-1:x(o[0],U)?h.x=u.x+1:x(o[0],J)?h.y=u.y-1:x(o[0],T)&&(h.y=u.y+1),a=Qe(t,[u,h],d)}else a=ut(t.canvas);let A=Go(t,e.path);return[s,r,c,a,A,n]}function Qo(t){return x(t,T)?J:x(t,J)?T:x(t,U)?X:x(t,X)?U:x(t,yt)?Bt:x(t,wt)?Ct:x(t,Ct)?wt:x(t,Bt)?yt:Ht}function Ho(t,e,n="solid"){let s=ut(t.canvas),i=e[0],o=[],r=[];for(let c=1;c<e.length;c++){let a=e[c],A=Mt(t,i),l=Mt(t,a);if(fe(A,l)){i=a;continue}let u=ft(i,a),d=me(s,A,l,1,-1,t.config.useAscii,n);d.length===0&&d.push(A),o.push(d),r.push(u),i=a}return[s,o,r]}function Lo(t,e,n,s){let i=ut(t.canvas);if(t.config.useAscii||s==="state-start"||s==="state-end")return i;let o=n[0],r=ft(e[0],e[1]);return x(r,T)?i[o.x][o.y+1]="\u2534":x(r,J)?i[o.x][o.y-1]="\u252C":x(r,U)?i[o.x+1][o.y]="\u2524":x(r,X)&&(i[o.x-1][o.y]="\u251C"),i}function Qe(t,e,n){let s=ut(t.canvas);if(e.length===0)return s;let i=e[0],o=e[e.length-1],r=ft(i,o);(e.length===1||x(r,Ht))&&(r=n);let c;return t.config.useAscii?x(r,T)?c="^":x(r,J)?c="v":x(r,U)?c="<":x(r,X)?c=">":x(n,T)?c="^":x(n,J)?c="v":x(n,U)?c="<":x(n,X)?c=">":c="*":x(r,T)?c="\u25B2":x(r,J)?c="\u25BC":x(r,U)?c="\u25C4":x(r,X)?c="\u25BA":x(r,wt)?c="\u25E5":x(r,yt)?c="\u25E4":x(r,Bt)?c="\u25E2":x(r,Ct)?c="\u25E3":x(n,T)?c="\u25B2":x(n,J)?c="\u25BC":x(n,U)?c="\u25C4":x(n,X)?c="\u25BA":x(n,wt)?c="\u25E5":x(n,yt)?c="\u25E4":x(n,Bt)?c="\u25E2":x(n,Ct)?c="\u25E3":c="\u25CF",s[o.x][o.y]=c,s}function Go(t,e){let n=ut(t.canvas);for(let s=1;s<e.length-1;s++){let i=e[s],o=Mt(t,i),r=ft(e[s-1],i),c=ft(i,e[s+1]),a;t.config.useAscii?a="+":x(r,X)&&x(c,J)||x(r,T)&&x(c,U)?a="\u2510":x(r,X)&&x(c,T)||x(r,J)&&x(c,U)?a="\u2518":x(r,U)&&x(c,J)||x(r,T)&&x(c,X)?a="\u250C":x(r,U)&&x(c,T)||x(r,J)&&x(c,X)?a="\u2514":a="+",n[o.x][o.y]=a}return n}function Ro(t,e){let n=ut(t.canvas);if(e.text.length===0)return n;let s=zo(t,e.labelLine),i;if(e.path.length>=2){let o=e.path[0].y,r=e.path[e.path.length-1].y;r<o?i=!0:r>o&&(i=!1)}return Ko(n,s,e.text,i),n}function Ko(t,e,n,s){if(e.length<2)return;let i=Math.min(e[0].x,e[1].x),o=Math.max(e[0].x,e[1].x),r=Math.min(e[0].y,e[1].y),c=Math.max(e[0].y,e[1].y),a=i+Math.floor((o-i)/2),A=r+Math.floor((c-r)/2);if(s!==void 0&&i===o){let d=c-r,h=Math.max(1,Math.floor(d/4));s?A=A+h:A=A-h}let l=ct(n),u=A-Math.floor((l.length-1)/2);for(let d=0;d<l.length;d++){let h=l[d],g=a-Math.floor(h.length/2);jn(t,{x:g,y:u+d},h)}}function Jt(t,e,n){let s=e.gridCoord,i=0;for(let a=0;a<2;a++)i+=t.columnWidth.get(s.x+a)??0;let o=0;for(let a=0;a<2;a++)o+=t.rowHeight.get(s.y+a)??0;let r={width:i+1,height:o+1,labelArea:{x:0,y:0,width:0,height:0},gridColumns:[0,0,0],gridRows:[0,0,0]},c=e.drawingCoord;return vo(e.shape,n,r,c)}function Jo(t,e,n){let s=ut(t.canvas);if(!e.pathToJunction||e.pathToJunction.length===0)return[s,s,s,s,s,s];let i=ut(t.canvas),o=t.config.useAscii,r=e.pathToJunction.map((l,u)=>n.type==="fan-in"&&u===0?Jt(t,e.from,e.startDir):n.type==="fan-out"&&u===e.pathToJunction.length-1?Jt(t,e.to,e.endDir):Mt(t,l));for(let l=1;l<r.length;l++){let u=r[l-1],d=r[l];fe(u,d)||me(i,u,d,1,-1,o,e.style)}let c=ut(t.canvas);for(let l=1;l<e.pathToJunction.length-1;l++){let u=e.pathToJunction[l],d=Mt(t,u),h=ft(e.pathToJunction[l-1],u),g=ft(u,e.pathToJunction[l+1]),f;o?f="+":x(h,X)&&x(g,J)||x(h,T)&&x(g,U)?f="\u2510":x(h,X)&&x(g,T)||x(h,J)&&x(g,U)?f="\u2518":x(h,U)&&x(g,J)||x(h,T)&&x(g,X)?f="\u250C":x(h,U)&&x(g,T)||x(h,J)&&x(g,X)?f="\u2514":f="+",c[d.x][d.y]=f}let a=ut(t.canvas);if(n.type==="fan-in"&&e.pathToJunction.length>=2){let l=r[0],u=ft(e.pathToJunction[0],e.pathToJunction[1]);o||(x(u,T)?a[l.x][l.y]="\u2534":x(u,J)?a[l.x][l.y]="\u252C":x(u,U)?a[l.x][l.y]="\u2524":x(u,X)&&(a[l.x][l.y]="\u251C"))}let A=ut(t.canvas);return[i,a,s,s,c,A]}function No(t,e){let n=ut(t.canvas),s=ut(t.canvas);if(e.sharedPath.length<2)return[n,s];let i=t.config.useAscii,o=e.edges[0]?.style??"solid",r=t.config.graphDirection,c=e.sharedPath.map((a,A)=>{if(e.type==="fan-in"&&A===e.sharedPath.length-1){let l=r==="TD"?T:U;return Jt(t,e.sharedNode,l)}if(e.type==="fan-out"&&A===0){let l=r==="TD"?J:X;return Jt(t,e.sharedNode,l)}return Mt(t,a)});for(let a=1;a<c.length;a++){let A=c[a-1],l=c[a];fe(A,l)||me(n,A,l,1,-1,i,o)}for(let a=1;a<e.sharedPath.length-1;a++){let A=e.sharedPath[a],l=Mt(t,A),u=ft(e.sharedPath[a-1],A),d=ft(A,e.sharedPath[a+1]),h;i?h="+":x(u,X)&&x(d,J)||x(u,T)&&x(d,U)?h="\u2510":x(u,X)&&x(d,T)||x(u,J)&&x(d,U)?h="\u2518":x(u,U)&&x(d,J)||x(u,T)&&x(d,X)?h="\u250C":x(u,U)&&x(d,T)||x(u,J)&&x(d,X)?h="\u2514":h="+",s[l.x][l.y]=h}return[n,s]}function Xo(t,e){let n=ut(t.canvas);if(e.sharedPath.length<2)return n;let s=e.sharedPath.length-1,i=e.sharedPath[s-1],o=e.sharedPath[s],r=ft(i,o),c=t.config.graphDirection,a=c==="TD"?T:U,A=Jt(t,e.sharedNode,a);c==="TD"?A.y-=1:A.x-=1;let l;return t.config.useAscii?x(r,T)?l="^":x(r,J)?l="v":x(r,U)?l="<":x(r,X)?l=">":l="v":x(r,T)?l="\u25B2":x(r,J)?l="\u25BC":x(r,U)?l="\u25C4":x(r,X)?l="\u25BA":l="\u25BC",n[A.x][A.y]=l,n}function Zo(t,e){let n=ut(t.canvas);if(!e.pathToJunction||e.pathToJunction.length<2)return n;let s=e.pathToJunction.length-1,i=e.pathToJunction[s-1],o=e.pathToJunction[s],r=ft(i,o),c=t.config.graphDirection,a=c==="TD"?T:U,A=Jt(t,e.to,a);c==="TD"?A.y-=1:A.x-=1;let l;return t.config.useAscii?x(r,T)?l="^":x(r,J)?l="v":x(r,U)?l="<":x(r,X)?l=">":l="v":x(r,T)?l="\u25B2":x(r,J)?l="\u25BC":x(r,U)?l="\u25C4":x(r,X)?l="\u25BA":l="\u25BC",n[A.x][A.y]=l,n}function To(t,e){let n=ut(t.canvas);if(!e.junctionPoint)return n;let s=Mt(t,e.junctionPoint),i=t.config.useAscii,o=!1,r=!1,c=!1,a=!1;if(e.sharedPath.length>=2){let l=e.type==="fan-in"?0:e.sharedPath.length-1,u=e.type==="fan-in"?1:e.sharedPath.length-2,d=ft(e.sharedPath[l],e.sharedPath[u]);x(d,J)?r=!0:x(d,T)?o=!0:x(d,X)?a=!0:x(d,U)&&(c=!0)}for(let l of e.edges)if(l.pathToJunction&&l.pathToJunction.length>=2){let u=e.type==="fan-in"?l.pathToJunction.length-1:0,d=e.type==="fan-in"?l.pathToJunction.length-2:1,h=ft(l.pathToJunction[d],l.pathToJunction[u]);x(h,J)?o=!0:x(h,T)?r=!0:x(h,X)?c=!0:x(h,U)&&(a=!0)}let A;return i?A="+":o&&r&&c&&a?A="\u253C":r&&c&&a&&!o?A="\u252C":o&&c&&a&&!r?A="\u2534":o&&r&&a&&!c?A="\u251C":o&&r&&c&&!a?A="\u2524":c&&a?A="\u2500":o&&r?A="\u2502":r&&a?A="\u250C":r&&c?A="\u2510":o&&a?A="\u2514":o&&c?A="\u2518":A="\u253C",n[s.x][s.y]=A,n}function Uo(t,e){let n=t.maxX-t.minX,s=t.maxY-t.minY;if(n<=0||s<=0)return dt(0,0);let i={x:0,y:0},o={x:n,y:s},r=dt(n,s);if(e.config.useAscii){for(let c=i.x+1;c<o.x;c++)r[c][i.y]="-";for(let c=i.x+1;c<o.x;c++)r[c][o.y]="-";for(let c=i.y+1;c<o.y;c++)r[i.x][c]="|";for(let c=i.y+1;c<o.y;c++)r[o.x][c]="|";r[i.x][i.y]="+",r[o.x][i.y]="+",r[i.x][o.y]="+",r[o.x][o.y]="+"}else{for(let c=i.x+1;c<o.x;c++)r[c][i.y]="\u2500";for(let c=i.x+1;c<o.x;c++)r[c][o.y]="\u2500";for(let c=i.y+1;c<o.y;c++)r[i.x][c]="\u2502";for(let c=i.y+1;c<o.y;c++)r[o.x][c]="\u2502";r[i.x][i.y]="\u250C",r[o.x][i.y]="\u2510",r[i.x][o.y]="\u2514",r[o.x][o.y]="\u2518"}return r}function Po(t,e){let n=t.maxX-t.minX,s=t.maxY-t.minY;if(n<=0||s<=0)return[dt(0,0),{x:0,y:0}];let i=dt(n,s),o=ct(t.name);for(let r=0;r<o.length;r++){let c=o[r],a=1+r,A=Math.floor(n/2)-Math.floor(c.length/2);A<1&&(A=1);for(let l=0;l<c.length;l++)A+l<n&&a<s&&(i[A+l][a]=c[l])}return[i,{x:t.minX,y:t.minY}]}function jo(t){function e(s){return s.parent===null?0:1+e(s.parent)}let n=[...t];return n.sort((s,i)=>e(s)-e(i)),n}function ge(t,e,n,s){for(let i=0;i<e.length;i++)for(let o=0;o<(e[0]?.length??0);o++){let r=e[i]?.[o];if(r&&r!==" "){let c=i+n.x,a=o+n.y;c>=0&&a>=0&&Pt(t,c,a,s)}}}function Qt(t,e,n,s){for(let i of e)ge(t,i,n,s)}function Oo(t,e,n){let s=i=>/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|.':]$/.test(i);for(let i=0;i<e.length;i++)for(let o=0;o<(e[0]?.length??0);o++){let r=e[i]?.[o];if(r&&r!==" "){let c=i+n.x,a=o+n.y;c>=0&&a>=0&&Pt(t,c,a,s(r)?"border":"text")}}}function Vo(t){let e=t.config.useAscii,n={x:0,y:0},s=jo(t.subgraphs);for(let d of s){let h=Uo(d,t),g={x:d.minX,y:d.minY};t.canvas=It(t.canvas,g,e,h),ge(t.roleCanvas,h,g,"border")}for(let d of t.nodes)!d.drawn&&d.drawingCoord&&d.drawing&&(t.canvas=It(t.canvas,d.drawingCoord,e,d.drawing),Oo(t.roleCanvas,d.drawing,d.drawingCoord),d.drawn=!0);let i=[],o=[],r=[],c=[],a=[],A=[],l=[],u=new Set;for(let d of t.edges)if(d.bundle&&d.pathToJunction){let h=d.bundle,[g,f,,,p,I]=Jo(t,d,h);if(i.push(g),o.push(p),a.push(f),A.push(I),!u.has(h)){u.add(h);let[H,B]=No(t,h);if(i.push(H),o.push(B),h.type==="fan-in"){let D=Xo(t,h);r.push(D)}let R=To(t,h);l.push(R)}if(h.type==="fan-out"&&d.hasArrowEnd){let H=Zo(t,d);r.push(H)}}else{let[h,g,f,p,I,H]=Fo(t,d);i.push(h),o.push(I),r.push(f),c.push(p),a.push(g),A.push(H)}t.canvas=It(t.canvas,n,e,...i),Qt(t.roleCanvas,i,n,"line"),t.canvas=It(t.canvas,n,e,...o),Qt(t.roleCanvas,o,n,"corner"),t.canvas=It(t.canvas,n,e,...l),Qt(t.roleCanvas,l,n,"junction"),t.canvas=It(t.canvas,n,e,...r),Qt(t.roleCanvas,r,n,"arrow"),t.canvas=It(t.canvas,n,e,...a),Qt(t.roleCanvas,a,n,"junction"),t.canvas=It(t.canvas,n,e,...c),Qt(t.roleCanvas,c,n,"arrow"),t.canvas=It(t.canvas,n,e,...A),Qt(t.roleCanvas,A,n,"text");for(let d of t.subgraphs){if(d.nodes.length===0)continue;let[h,g]=Po(d,t);t.canvas=It(t.canvas,g,e,h),ge(t.roleCanvas,h,g,"text")}return t.canvas}function Mt(t,e,n){let s=n?{x:e.x+n.x,y:e.y+n.y}:e,i=0;for(let a=0;a<s.x;a++)i+=t.columnWidth.get(a)??0;let o=0;for(let a=0;a<s.y;a++)o+=t.rowHeight.get(a)??0;let r=t.columnWidth.get(s.x)??0,c=t.rowHeight.get(s.y)??0;return{x:i+Math.floor(r/2)+t.offsetX,y:o+Math.floor(c/2)+t.offsetY}}function zo(t,e){return e.map(n=>Mt(t,n))}function Zt(t,e,n,s){let i=s??tr(t,e);if(t.grid.has(Wt(n)))return i==="LR"?Zt(t,e,{x:n.x,y:n.y+4},i):Zt(t,e,{x:n.x+4,y:n.y},i);for(let o=0;o<3;o++)for(let r=0;r<3;r++){let c={x:n.x+o,y:n.y+r};t.grid.set(Wt(c),e)}return e.gridCoord=n,n}function qo(t,e){let n=e.gridCoord,s=t.config.boxBorderPadding,i=Do(e.shape,e.displayLabel,{useAscii:t.config.useAscii,padding:s}),o=i.gridColumns,r=i.gridRows;for(let c=0;c<o.length;c++){let a=n.x+c,A=t.columnWidth.get(a)??0;t.columnWidth.set(a,Math.max(A,o[c]))}for(let c=0;c<r.length;c++){let a=n.y+c,A=t.rowHeight.get(a)??0;t.rowHeight.set(a,Math.max(A,r[c]))}if(n.x>0){let c=t.columnWidth.get(n.x-1)??0;t.columnWidth.set(n.x-1,Math.max(c,t.config.paddingX))}if(n.y>0){let c=t.config.paddingY;er(t,e)&&(c+=4);let a=t.rowHeight.get(n.y-1)??0;t.rowHeight.set(n.y-1,Math.max(a,c))}}function He(t,e){for(let n of e)t.columnWidth.has(n.x)||t.columnWidth.set(n.x,Math.floor(t.config.paddingX/2)),t.rowHeight.has(n.y)||t.rowHeight.set(n.y,Math.floor(t.config.paddingY/2))}function de(t,e){return t.subgraphs.some(n=>n.nodes.includes(e))}function xt(t,e){let n=null;for(let s of t.subgraphs)s.nodes.includes(e)&&(!n||_o(n,s))&&(n=s);return n}function _o(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parent}return!1}function tr(t,e){let n=xt(t,e);return n?.direction?n.direction:t.config.graphDirection}function er(t,e){let n=xt(t,e);if(!n)return!1;let s=!1;for(let i of t.edges)if(i.to===e&&xt(t,i.from)!==n){s=!0;break}if(!s)return!1;for(let i of n.nodes){if(i===e||!i.gridCoord)continue;let o=!1;for(let r of t.edges)if(r.to===i&&xt(t,r.from)!==n){o=!0;break}if(o&&i.gridCoord.y<e.gridCoord.y)return!1}return!0}function _e(t,e){if(e.nodes.length===0)return;let n=1e6,s=1e6,i=-1e6,o=-1e6;for(let a of e.children)_e(t,a),a.nodes.length>0&&(n=Math.min(n,a.minX),s=Math.min(s,a.minY),i=Math.max(i,a.maxX),o=Math.max(o,a.maxY));for(let a of e.nodes){if(!a.drawingCoord||!a.drawing)continue;let A=a.drawingCoord.x,l=a.drawingCoord.y,u=A+a.drawing.length-1,d=l+a.drawing[0].length-1;n=Math.min(n,A),s=Math.min(s,l),i=Math.max(i,u),o=Math.max(o,d)}let r=2,c=2;e.minX=n-r,e.minY=s-r-c,e.maxX=i+r,e.maxY=o+r}function nr(t){let n=t.subgraphs.filter(s=>s.parent===null&&s.nodes.length>0);for(let s=0;s<n.length;s++)for(let i=s+1;i<n.length;i++){let o=n[s],r=n[i];o.minX<r.maxX&&o.maxX>r.minX&&(o.maxY>=r.minY-1&&o.minY<r.minY?r.minY=o.maxY+1+1:r.maxY>=o.minY-1&&r.minY<o.minY&&(o.minY=r.maxY+1+1)),o.minY<r.maxY&&o.maxY>r.minY&&(o.maxX>=r.minX-1&&o.minX<r.minX?r.minX=o.maxX+1+1:r.maxX>=o.minX-1&&r.minX<o.minX&&(o.minX=r.maxX+1+1))}}function or(t){for(let e of t.subgraphs)_e(t,e);nr(t)}function rr(t){if(t.subgraphs.length===0)return;let e=0,n=0;for(let o of t.subgraphs)e=Math.min(e,o.minX),n=Math.min(n,o.minY);let s=-e,i=-n;if(!(s===0&&i===0)){t.offsetX=s,t.offsetY=i;for(let o of t.subgraphs)o.minX+=s,o.minY+=i,o.maxX+=s,o.maxY+=i;for(let o of t.nodes)o.drawingCoord&&(o.drawingCoord.x+=s,o.drawingCoord.y+=i)}}function sr(t){let e=t.config.graphDirection,n=new Array(100).fill(0),s=new Set,i=[];for(let d of t.nodes){s.has(d.name)||i.push(d),s.add(d.name);for(let h of he(t,d))s.add(h.name)}let o=i.filter(d=>{let h=xt(t,d);if(!h)return!0;for(let g of t.edges)if(g.to===d&&xt(t,g.from)!==h)return!1;return!0}),r=!1,c=!1;for(let d of o)de(t,d)?he(t,d).length>0&&(c=!0):r=!0;let a=e==="LR"&&r&&c,A,l=[];a?(A=o.filter(d=>!de(t,d)),l=o.filter(d=>de(t,d))):A=o;for(let d of A){let h=e==="LR"?{x:0,y:n[0]}:{x:n[0],y:0};Zt(t,t.nodes[d.index],h),n[0]=n[0]+4}if(a&&l.length>0)for(let h of l){let g=e==="LR"?{x:4,y:n[4]}:{x:n[4],y:4};Zt(t,t.nodes[h.index],g),n[4]=n[4]+4}let u=A.length+l.length;for(;u<t.nodes.length;){let d=u;for(let h of t.nodes){if(h.gridCoord===null)continue;let g=h.gridCoord;for(let f of he(t,h)){if(f.gridCoord!==null)continue;let p=xt(t,h),I=xt(t,f),H=p&&p===I&&p.direction?p.direction:t.config.graphDirection,B=H==="LR"?g.x+4:g.y+4,R;H!==t.config.graphDirection?R=H==="LR"?g.y:g.x:R=n[B];let D=H==="LR"?{x:B,y:R}:{x:R,y:B};Zt(t,t.nodes[f.index],D,H),H===t.config.graphDirection&&(n[B]=R+4),u++}}if(u===d)break}for(let d of t.nodes)qo(t,d);t.bundles=Ao(t),uo(t);for(let d of t.edges){if(d.bundle&&d.path.length>0){He(t,d.path),Ee(t,d);continue}co(t,d),He(t,d.path),Ee(t,d)}for(let d of t.nodes)d.drawingCoord=Mt(t,d.gridCoord),d.drawing=Wo(d,t);On(t.canvas,t.columnWidth,t.rowHeight),Vn(t.roleCanvas,t.columnWidth,t.rowHeight),or(t),rr(t)}function ir(t,e){return t.edges.filter(n=>n.from.name===e.name)}function he(t,e){return ir(t,e).map(n=>n.to)}function cr(t){let e={actors:[],messages:[],blocks:[],notes:[]},n=new Set,s=[];for(let i=1;i<t.length;i++){let o=t[i],r=o.match(/^(participant|actor)\s+(\S+?)(?:\s+as\s+(.+))?$/);if(r){let d=r[1],h=r[2],g=r[3]?.trim()??h,f=lt(g);n.has(h)||(n.add(h),e.actors.push({id:h,label:f,type:d}));continue}let c=o.match(/^Note\s+(left of|right of|over)\s+([^:]+):\s*(.+)$/i);if(c){let d=c[1].toLowerCase(),h=c[2].trim(),g=lt(c[3].trim()),f=h.split(",").map(I=>I.trim());for(let I of f)Nt(e,n,I);let p="over";d==="left of"?p="left":d==="right of"&&(p="right"),e.notes.push({actorIds:f,text:g,position:p,afterIndex:e.messages.length-1});continue}let a=o.match(/^(loop|alt|opt|par|critical|break|rect)\s*(.*)$/);if(a){let d=a[1],h=a[2]?.trim()??"",g=lt(h);s.push({type:d,label:g,startIndex:e.messages.length,dividers:[]});continue}let A=o.match(/^(else|and)\s*(.*)$/);if(A&&s.length>0){let d=A[2]?.trim()??"",h=lt(d);s[s.length-1].dividers.push({index:e.messages.length,label:h});continue}if(o==="end"&&s.length>0){let d=s.pop();e.blocks.push({type:d.type,label:d.label,startIndex:d.startIndex,endIndex:Math.max(e.messages.length-1,d.startIndex),dividers:d.dividers});continue}let l=o.match(/^(\S+?)\s*(--?>?>|--?[)x]|--?>>|--?>)\s*([+-]?)(\S+?)\s*:\s*(.+)$/);if(l){let d=l[1],h=l[2],g=l[3],f=l[4],p=lt(l[5].trim());Nt(e,n,d),Nt(e,n,f);let I=h.startsWith("--")?"dashed":"solid",H=h.includes(">>")||h.includes("x")?"filled":"open",B={from:d,to:f,label:p,lineStyle:I,arrowHead:H};g==="+"&&(B.activate=!0),g==="-"&&(B.deactivate=!0),e.messages.push(B);continue}let u=o.match(/^(\S+?)\s*(->>|-->>|-\)|--\)|-x|--x|->|-->)\s*([+-]?)(\S+?)\s*:\s*(.+)$/);if(u){let d=u[1],h=u[2],g=u[3],f=u[4],p=lt(u[5].trim());Nt(e,n,d),Nt(e,n,f);let I=h.startsWith("--")?"dashed":"solid",H=h.includes(">>")||h.includes("x")?"filled":"open",B={from:d,to:f,label:p,lineStyle:I,arrowHead:H};g==="+"&&(B.activate=!0),g==="-"&&(B.deactivate=!0),e.messages.push(B);continue}}return e}function Nt(t,e,n){e.has(n)||(e.add(n),t.actors.push({id:n,label:n,type:"participant"}))}function ar(t,e,n,s){let i=t.split(`
7`).map(m=>m.trim()).filter(m=>m.length>0&&!m.startsWith("%%")),o=cr(i);if(o.actors.length===0)return"";let r=e.useAscii,c=r?"-":"\u2500",a=r?"|":"\u2502",A=r?"+":"\u250C",l=r?"+":"\u2510",u=r?"+":"\u2514",d=r?"+":"\u2518",h=r?"+":"\u252C",g=r?"+":"\u2534",f=r?"+":"\u251C",p=r?"+":"\u2524",I=new Map;o.actors.forEach((m,b)=>I.set(m.id,b));let H=1,R=o.actors.map(m=>le(m.label)+2*H+2).map(m=>Math.ceil(m/2)),D=o.actors.map(m=>Ye(m.label)+2),j=Math.max(...D,3),ht=new Array(Math.max(o.actors.length-1,0)).fill(0);for(let m of o.messages){let b=I.get(m.from),S=I.get(m.to);if(b===S)continue;let v=Math.min(b,S),Q=Math.max(b,S),k=le(m.label)+4,P=Q-v,Y=Math.ceil(k/P);for(let M=v;M<Q;M++)ht[M]=Math.max(ht[M],Y)}let L=[R[0]];for(let m=1;m<o.actors.length;m++){let b=Math.max(R[m-1]+R[m]+2,ht[m-1]+2,10);L[m]=L[m-1]+b}let nt=[],W=[],z=new Map,y=new Map,O=new Map,V=[],q=j;for(let m=0;m<o.messages.length;m++){for(let Q=0;Q<o.blocks.length;Q++)o.blocks[Q].startIndex===m&&(q+=2,z.set(Q,q-1));for(let Q=0;Q<o.blocks.length;Q++)for(let k=0;k<o.blocks[Q].dividers.length;k++)o.blocks[Q].dividers[k].index===m&&(q+=1,O.set(`${Q}:${k}`,q),q+=1);q+=1;let b=o.messages[m],S=b.from===b.to,v=Ye(b.label);S?(W[m]=q+1,nt[m]=q,q+=2+v):(W[m]=q,nt[m]=q+v,q+=v+1);for(let Q=0;Q<o.notes.length;Q++)if(o.notes[Q].afterIndex===m){q+=1;let k=o.notes[Q],P=ct(k.text),Y=Math.max(...P.map(K=>K.length))+4,M=P.length+2,Z=I.get(k.actorIds[0])??0,$;if(k.position==="left")$=L[Z]-Y-1;else if(k.position==="right")$=L[Z]+2;else if(k.actorIds.length>=2){let K=I.get(k.actorIds[1])??Z;$=Math.floor((L[Z]+L[K])/2)-Math.floor(Y/2)}else $=L[Z]-Math.floor(Y/2);$=Math.max(0,$),V.push({x:$,y:q,width:Y,height:M,lines:P}),q+=M}for(let Q=0;Q<o.blocks.length;Q++)o.blocks[Q].endIndex===m&&(q+=1,y.set(Q,q),q+=1)}q+=1;let E=q,_=E+j,st=L[L.length-1]??0,it=R[R.length-1]??0,w=st+it+2;for(let m=0;m<o.messages.length;m++){let b=o.messages[m];if(b.from===b.to){let S=I.get(b.from),v=L[S]+6+2+b.label.length;w=Math.max(w,v+1)}}for(let m of V)w=Math.max(w,m.x+m.width+1);let G=dt(w,_-1),F=Ut(w,_-1);function C(m,b,S,v){m>=0&&m<G.length&&b>=0&&b<(G[0]?.length??0)&&(G[m][b]=S,Pt(F,m,b,v))}function N(m,b,S){let v=ct(S),Q=le(S),k=Q+2*H+2,P=v.length+2,Y=m-Math.floor(k/2);C(Y,b,A,"border");for(let Z=1;Z<k-1;Z++)C(Y+Z,b,c,"border");C(Y+k-1,b,l,"border");for(let Z=0;Z<v.length;Z++){let $=b+1+Z;C(Y,$,a,"border"),C(Y+k-1,$,a,"border");let K=v[Z],rt=Y+1+H+Math.floor((Q-K.length)/2);for(let et=0;et<K.length;et++)C(rt+et,$,K[et],"text")}let M=b+P-1;C(Y,M,u,"border");for(let Z=1;Z<k-1;Z++)C(Y+Z,M,c,"border");C(Y+k-1,M,d,"border")}for(let m=0;m<o.actors.length;m++){let b=L[m];for(let S=j;S<=E;S++)C(b,S,a,"line")}for(let m=0;m<o.actors.length;m++){let b=o.actors[m];N(L[m],0,b.label),N(L[m],E,b.label),r||(C(L[m],j-1,h,"junction"),C(L[m],E,g,"junction"))}for(let m=0;m<o.messages.length;m++){let b=o.messages[m],S=I.get(b.from),v=I.get(b.to),Q=L[S],k=L[v],P=S===v,Y=b.lineStyle==="dashed",M=b.arrowHead==="filled",Z=Y?r?".":"\u254C":c;if(P){let $=nt[m],K=Math.max(4,4);C(Q,$,f,"junction");for(let ot=Q+1;ot<Q+K;ot++)C(ot,$,Z,"line");C(Q+K,$,r?"+":"\u2510","corner"),C(Q+K,$+1,a,"line");let rt=Q+K+2;for(let ot=0;ot<b.label.length;ot++)rt+ot<w&&C(rt+ot,$+1,b.label[ot],"text");let et=M?r?"<":"\u25C0":r?"<":"\u25C1";C(Q,$+2,et,"arrow");for(let ot=Q+1;ot<Q+K;ot++)C(ot,$+2,Z,"line");C(Q+K,$+2,r?"+":"\u2518","corner")}else{let $=W[m],K=nt[m],rt=Q<k,et=Math.floor((Q+k)/2),ot=ct(b.label);for(let at=0;at<ot.length;at++){let At=ot[at],mt=et-Math.floor(At.length/2),St=$+at;for(let pt=0;pt<At.length;pt++){let Gt=mt+pt;Gt>=0&&Gt<w&&C(Gt,St,At[pt],"text")}}if(rt){for(let At=Q+1;At<k;At++)C(At,K,Z,"line");C(k,K,M?r?">":"\u25B6":r?">":"\u25B7","arrow")}else{for(let At=k+1;At<Q;At++)C(At,K,Z,"line");C(k,K,M?r?"<":"\u25C0":r?"<":"\u25C1","arrow")}}}for(let m=0;m<o.blocks.length;m++){let b=o.blocks[m],S=z.get(m),v=y.get(m);if(S===void 0||v===void 0)continue;let Q=w,k=0;for(let $=b.startIndex;$<=b.endIndex&&!($>=o.messages.length);$++){let K=o.messages[$],rt=I.get(K.from)??0,et=I.get(K.to)??0;Q=Math.min(Q,L[Math.min(rt,et)]),k=Math.max(k,L[Math.max(rt,et)])}let P=Math.max(0,Q-4),Y=Math.min(w-1,k+4);C(P,S,A,"border");for(let $=P+1;$<Y;$++)C($,S,c,"border");C(Y,S,l,"border");let M=b.label?`${b.type} [${b.label}]`:b.type,Z=ct(M);for(let $=0;$<Z.length&&S+$<v;$++){let K=Z[$];for(let rt=0;rt<K.length&&P+1+rt<Y;rt++)C(P+1+rt,S+$,K[rt],"text")}C(P,v,u,"border");for(let $=P+1;$<Y;$++)C($,v,c,"border");C(Y,v,d,"border");for(let $=S+1;$<v;$++)C(P,$,a,"border"),C(Y,$,a,"border");for(let $=0;$<b.dividers.length;$++){let K=O.get(`${m}:${$}`);if(K===void 0)continue;let rt=tt();C(P,K,f,"junction");for(let ot=P+1;ot<Y;ot++)C(ot,K,rt,"line");C(Y,K,p,"junction");let et=b.dividers[$].label;if(et){let ot=`[${et}]`;for(let at=0;at<ot.length&&P+1+at<Y;at++)C(P+1+at,K,ot[at],"text")}}}for(let m of V){Ft(G,m.x+m.width,m.y+m.height),Lt(F,m.x+m.width,m.y+m.height),C(m.x,m.y,A,"border");for(let S=1;S<m.width-1;S++)C(m.x+S,m.y,c,"border");C(m.x+m.width-1,m.y,l,"border");for(let S=0;S<m.lines.length;S++){let v=m.y+1+S;C(m.x,v,a,"border"),C(m.x+m.width-1,v,a,"border");for(let Q=0;Q<m.lines[S].length;Q++)C(m.x+2+Q,v,m.lines[S][Q],"text")}let b=m.y+m.height-1;C(m.x,b,u,"border");for(let S=1;S<m.width-1;S++)C(m.x+S,b,c,"border");C(m.x+m.width-1,b,d,"border")}return ne(G,{roleCanvas:F,colorMode:n,theme:s});function tt(){return r?"-":"\u254C"}}function Ar(t){let e={classes:[],relationships:[],namespaces:[]},n=new Map,s=null,i=null,o=0;for(let r=1;r<t.length;r++){let c=t[r];if(i&&o>0){if(c==="}"){o--,o===0&&(i=null);continue}let g=c.match(/^<<(\w+)>>$/);if(g){i.annotation=g[1];continue}let f=Le(c);f&&(f.isMethod?i.methods.push(f.member):i.attributes.push(f.member));continue}let a=c.match(/^namespace\s+(\S+)\s*\{$/);if(a){s={name:a[1],classIds:[]};continue}if(c==="}"&&s){e.namespaces.push(s),s=null;continue}let A=c.match(/^class\s+(\S+?)(?:\s*~(\w+)~)?\s*\{$/);if(A){let g=A[1],f=A[2],p=Rt(n,g);f&&(p.label=`${g}<${f}>`),i=p,o=1,s&&s.classIds.push(g);continue}let l=c.match(/^class\s+(\S+?)(?:\s*~(\w+)~)?\s*$/);if(l){let g=l[1],f=l[2],p=Rt(n,g);f&&(p.label=`${g}<${f}>`),s&&s.classIds.push(g);continue}let u=c.match(/^class\s+(\S+?)\s*\{\s*<<(\w+)>>\s*\}$/);if(u){let g=Rt(n,u[1]);g.annotation=u[2];continue}let d=c.match(/^(\S+?)\s*:\s*(.+)$/);if(d){let g=d[2];if(!g.match(/<\|--|--|\*--|o--|-->|\.\.>|\.\.\|>/)){let f=Rt(n,d[1]),p=Le(g);p&&(p.isMethod?f.methods.push(p.member):f.attributes.push(p.member));continue}}let h=lr(c);if(h){Rt(n,h.from),Rt(n,h.to),e.relationships.push(h);continue}}return e.classes=[...n.values()],e}function Rt(t,e){let n=t.get(e);return n||(n={id:e,label:e,attributes:[],methods:[]},t.set(e,n)),n}function Le(t){let e=t.trim().replace(/;$/,"");if(!e)return null;let n="",s=e;/^[+\-#~]/.test(s)&&(n=s[0],s=s.slice(1).trim());let i=s.match(/^(.+?)\(([^)]*)\)(?:\s*(.+))?$/);if(i){let l=i[1].trim(),u=i[2]?.trim()||void 0,d=i[3]?.trim(),h=l.endsWith("$")||s.includes("$"),g=l.endsWith("*")||s.includes("*");return{member:{visibility:n,name:l.replace(/[$*]$/,""),type:d||void 0,isStatic:h,isAbstract:g,isMethod:!0,params:u},isMethod:!0}}let o=s.split(/\s+/),r,c;o.length>=2?(c=o[0],r=o.slice(1).join(" ")):r=o[0]??s;let a=r.endsWith("$"),A=r.endsWith("*");return{member:{visibility:n,name:r.replace(/[$*]$/,""),type:c||void 0,isStatic:a,isAbstract:A,isMethod:!1},isMethod:!1}}function lr(t){let e=t.match(/^(\S+?)\s+(?:"([^"]*?)"\s+)?(<\|--|<\|\.\.|\*--|o--|-->|--\*|--o|--\|>|\.\.>|\.\.\|>|<--|<\.\.?|--)\s+(?:"([^"]*?)"\s+)?(\S+?)(?:\s*:\s*(.+))?$/);if(!e)return null;let n=e[1],s=e[2],i=s?lt(s):void 0,o=e[3].trim(),r=e[4],c=r?lt(r):void 0,a=e[5],A=e[6]?.trim(),l=A?lt(A):void 0,u=dr(o);return u?{from:n,to:a,type:u.type,markerAt:u.markerAt,label:l,fromCardinality:i,toCardinality:c}:null}function dr(t){switch(t.trim()){case"<|--":return{type:"inheritance",markerAt:"from"};case"--|>":return{type:"inheritance",markerAt:"to"};case"<|..":return{type:"realization",markerAt:"from"};case"..|>":return{type:"realization",markerAt:"to"};case"*--":return{type:"composition",markerAt:"from"};case"--*":return{type:"composition",markerAt:"to"};case"o--":return{type:"aggregation",markerAt:"from"};case"--o":return{type:"aggregation",markerAt:"to"};case"-->":return{type:"association",markerAt:"to"};case"<--":return{type:"association",markerAt:"from"};case"..>":return{type:"dependency",markerAt:"to"};case"<..":return{type:"dependency",markerAt:"from"};case"--":return{type:"association",markerAt:"to"};default:return null}}function hr(t){return/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|]$/.test(t)?"border":"text"}function Ge(t){let e=t.visibility||"",n=t.type?`: ${t.type}`:"";return`${e}${t.name}${n}`}function ur(t){let e=[];t.annotation&&e.push(`<<${t.annotation}>>`);let n=ct(t.label);e.push(...n);let s=t.attributes.map(Ge),i=t.methods.map(Ge);return s.length===0&&i.length===0?[e]:i.length===0?[e,s]:[e,s,i]}function gr(t,e){return{type:t,markerAt:e,dashed:t==="dependency"||t==="realization"}}function Et(t,e,n){switch(t){case"inheritance":case"realization":return n==="down"?e?"^":"\u25B3":n==="up"?e?"v":"\u25BD":n==="left"?e?">":"\u25C1":e?"<":"\u25B7";case"composition":return e?"*":"\u25C6";case"aggregation":return e?"o":"\u25C7";case"association":case"dependency":return n==="down"?e?"v":"\u25BC":n==="up"?e?"^":"\u25B2":n==="left"?e?"<":"\u25C0":e?">":"\u25B6"}}function fr(t,e,n,s){let i=t.split(`
8`).map(w=>w.trim()).filter(w=>w.length>0&&!w.startsWith("%%")),o=Ar(i);if(o.classes.length===0)return"";let r=e.useAscii,c=4,a=3,A=new Map,l=new Map,u=new Map;for(let w of o.classes){let G=ur(w);A.set(w.id,G);let F=0;for(let m of G)for(let b of m)F=Math.max(F,b.length);let C=F+4,N=0;for(let m of G)N+=Math.max(m.length,1);let tt=N+(G.length-1)+2;l.set(w.id,C),u.set(w.id,tt)}let d=new Map;for(let w of o.classes)d.set(w.id,w);let h=new Map,g=new Map;for(let w of o.relationships){let G=w.type==="inheritance"||w.type==="realization",F=G&&w.markerAt==="to"?w.to:w.from,C=G&&w.markerAt==="to"?w.from:w.to;h.has(C)||h.set(C,new Set),h.get(C).add(F),g.has(F)||g.set(F,new Set),g.get(F).add(C)}let f=new Map,I=o.classes.filter(w=>!h.has(w.id)||h.get(w.id).size===0).map(w=>w.id);for(let w of I)f.set(w,0);let H=o.classes.length-1,B=0;for(;B<I.length;){let w=I[B++],G=g.get(w);if(G)for(let F of G){let C=(f.get(w)??0)+1;C>H||(!f.has(F)||f.get(F)<C)&&(f.set(F,C),I.push(F))}}for(let w of o.classes)f.has(w.id)||f.set(w.id,0);let R=Math.max(...f.values(),0),D=Array.from({length:R+1},()=>[]);for(let w of o.classes)D[f.get(w.id)].push(w.id);let j=new Map,ht=0;for(let w=0;w<=R;w++){let G=D[w];if(G.length===0)continue;let F=0,C=0;for(let N of G){let tt=d.get(N),m=l.get(N),b=u.get(N);j.set(N,{cls:tt,sections:A.get(N),x:F,y:ht,width:m,height:b}),F+=m+c,C=Math.max(C,b)}ht+=C+a}let L=0,nt=0;for(let w of j.values())L=Math.max(L,w.x+w.width),nt=Math.max(nt,w.y+w.height);L+=4,nt+=2;let W=dt(L-1,nt-1),z=Ut(L-1,nt-1);function y(w,G,F,C){w>=0&&w<W.length&&G>=0&&G<(W[0]?.length??0)&&(W[w][G]=F,Pt(z,w,G,C))}for(let w of j.values()){let G=qe(w.sections,r);for(let F=0;F<G.length;F++)for(let C=0;C<G[0].length;C++){let N=G[F][C];if(N!==" "){let tt=w.x+F,m=w.y+C;tt<L&&m<nt&&y(tt,m,N,hr(N))}}}let O=[];for(let w of j.values())O.push({x1:w.x,x2:w.x+w.width-1,y1:w.y,y2:w.y+w.height-1});function V(w,G,F){for(let[C,N]of j.entries())if(!F?.has(C)&&w>=N.x&&w<=N.x+N.width-1&&G>=N.y&&G<=N.y+N.height-1)return!0;return!1}function q(w,G,F,C){let N=!0;for(let tt=Math.min(G,F);tt<=Math.max(G,F);tt++)if(V(w,tt,C)){N=!1;break}if(N)return w;for(let tt=1;tt<L+10;tt++){let m=w+tt;N=!0;for(let S=Math.min(G,F);S<=Math.max(G,F);S++)if(V(m,S,C)){N=!1;break}if(N)return m;let b=w-tt;if(b>=0){N=!0;for(let S=Math.min(G,F);S<=Math.max(G,F);S++)if(V(b,S,C)){N=!1;break}if(N)return b}}return L+2}let E=r?"-":"\u2500",_=r?"|":"\u2502",st=r?".":"\u254C",it=r?":":"\u250A";for(let w of o.relationships){let G=j.get(w.from),F=j.get(w.to);if(!G||!F)continue;let C=gr(w.type,w.markerAt),N=C.dashed?st:E,tt=C.dashed?it:_,m=new Set([w.from,w.to]),b=G.x+Math.floor(G.width/2),S=G.y+G.height-1,v=F.x+Math.floor(F.width/2),Q=F.y;if(S<Q){let k=q(b,S+1,Q-1,m),P=k!==b;if(k>=L&&Ft(W,k+2,nt),P){let Y=S+1,M=Q-1,Z=Math.min(b,k),$=Math.max(b,k);for(let K=Z;K<=$;K++)y(K,Y,N,"line");!r&&Y<(W[0]?.length??0)&&(b<k?(y(b,Y,"\u2514","corner"),y(k,Y,"\u2510","corner")):(y(b,Y,"\u2518","corner"),y(k,Y,"\u250C","corner")));for(let K=Y+1;K<=M;K++)y(k,K,tt,"line");if(k!==v){let K=Math.min(k,v),rt=Math.max(k,v);for(let et=K;et<=rt;et++)y(et,M,N,"line");!r&&M<(W[0]?.length??0)&&(k<v?(y(k,M,"\u2514","corner"),y(v,M,"\u2510","corner")):(y(k,M,"\u2518","corner"),y(v,M,"\u250C","corner")))}if(C.markerAt==="to"){let K=Et(C.type,r,"down");y(v,M,K,"arrow")}if(C.markerAt==="from"){let K=Et(C.type,r,"down");y(b,S+1,K,"arrow")}}else{let Y=S+Math.floor((Q-S)/2);for(let M=S+1;M<=Y;M++)y(b,M,tt,"line");if(b!==v&&Y<(W[0]?.length??0)){let M=Math.min(b,v),Z=Math.max(b,v);for(let $=M;$<=Z;$++)y($,Y,N,"line");r||(y(b,Y,b<v?"\u2514":"\u2518","corner"),y(v,Y,b<v?"\u2510":"\u250C","corner"))}for(let M=Y+1;M<Q;M++)y(v,M,tt,"line");C.markerAt==="to"&&y(v,Q-1,Et(C.type,r,"down"),"arrow"),C.markerAt==="from"&&y(b,S+1,Et(C.type,r,"down"),"arrow")}}else if(F.y+F.height-1<G.y){let k=G.y,P=F.y+F.height-1,Y=P+Math.floor((k-P)/2);for(let M=k-1;M>=Y;M--)y(b,M,tt,"line");if(b!==v){let M=Math.min(b,v),Z=Math.max(b,v);for(let $=M;$<=Z;$++)y($,Y,N,"line");!r&&Y>=0&&Y<nt&&(y(b,Y,b<v?"\u250C":"\u2510","corner"),y(v,Y,b<v?"\u2518":"\u2514","corner"))}for(let M=Y-1;M>P;M--)y(v,M,tt,"line");if(C.markerAt==="from"){let M=Et(C.type,r,"up"),Z=k-1;for(let $=0;$<M.length;$++)y(b-Math.floor(M.length/2)+$,Z,M[$],"arrow")}if(C.markerAt==="to"){let Z=C.type==="inheritance"||C.type==="realization"?"down":"up",$=Et(C.type,r,Z),K=P+1;for(let rt=0;rt<$.length;rt++)y(v-Math.floor($.length/2)+rt,K,$[rt],"arrow")}}else{let k=Math.max(S,F.y+F.height-1)+2;Ft(W,L,k+1),Lt(z,L,k+1);for(let M=S+1;M<=k;M++)y(b,M,tt,"line");let P=Math.min(b,v),Y=Math.max(b,v);for(let M=P;M<=Y;M++)y(M,k,N,"line");for(let M=k-1;M>=F.y+F.height;M--)y(v,M,tt,"line");if(C.markerAt==="from"){let M=Et(C.type,r,"down"),Z=S+1;for(let $=0;$<M.length;$++)y(b-Math.floor(M.length/2)+$,Z,M[$],"arrow")}if(C.markerAt==="to"){let M=Et(C.type,r,"up"),Z=F.y+F.height;for(let $=0;$<M.length;$++)y(v-Math.floor(M.length/2)+$,Z,M[$],"arrow")}}if(w.label){let k=ct(w.label),P=Math.max(...k.map(et=>et.length))+2,Y,M;if(S<Q)Y=Math.floor((S+1+Q-1)/2),M=Math.floor((b+v)/2);else if(F.y+F.height-1<G.y){let et=F.y+F.height-1;Y=Math.floor((et+1+G.y-1)/2),M=Math.floor((b+v)/2)}else Y=Math.max(S,F.y+F.height-1)+2,M=Math.floor((b+v)/2);let Z=Y,$=Math.floor(k.length/2),K=!1;for(let et=0;et<k.length;et++){let ot=Z-$+et,at=M-Math.floor(P/2),At=Math.max(0,at);for(let mt=At;mt<At+P;mt++)if(V(mt,ot,m)){K=!0;break}if(K)break}if(K){let et=S+1,ot=Q-1;for(let at=et;at<=ot;at++){let At=!0,mt=M-Math.floor(P/2),St=Math.max(0,mt);for(let pt=St;pt<St+P;pt++)if(V(pt,at,m)){At=!1;break}if(At){Z=at;break}}}let rt=Z-$;for(let et=0;et<k.length;et++){let ot=` ${k[et]} `,at=M-Math.floor(ot.length/2),At=Math.max(0,at),mt=rt+et,St=At+ot.length;St>0&&mt>=0&&(Ft(W,Math.max(St,1),Math.max(mt+1,1)),Lt(z,Math.max(St,1),Math.max(mt+1,1)));for(let pt=0;pt<ot.length;pt++){let Gt=At+pt;Gt>=0&&mt>=0&&y(Gt,mt,ot[pt],"text")}}}}return ne(W,{roleCanvas:z,colorMode:n,theme:s})}function xr(t){let e={entities:[],relationships:[]},n=new Map,s=null;for(let i=1;i<t.length;i++){let o=t[i];if(s){if(o==="}"){s=null;continue}let a=mr(o);a&&s.attributes.push(a);continue}let r=o.match(/^(\S+)\s*\{$/);if(r){let a=r[1];s=ue(n,a);continue}let c=pr(o);if(c){ue(n,c.entity1),ue(n,c.entity2),e.relationships.push(c);continue}}return e.entities=[...n.values()],e}function ue(t,e){let n=t.get(e);return n||(n={id:e,label:e,attributes:[]},t.set(e,n)),n}function mr(t){let e=t.match(/^(\S+)\s+(\S+)(?:\s+(.+))?$/);if(!e)return null;let n=e[1],s=e[2],i=e[3]?.trim()??"",o=[],r,c=i.match(/"([^"]*)"/);c&&(r=lt(c[1]));let a=i.replace(/"[^"]*"/,"").trim();for(let A of a.split(/\s+/)){let l=A.toUpperCase();(l==="PK"||l==="FK"||l==="UK")&&o.push(l)}return{type:n,name:s,keys:o,comment:r}}function pr(t){let e=t.match(/^(\S+)\s+([|o}{]+(?:--|\.\.)[|o}{]+)\s+(\S+)\s*:\s*(.+)$/);if(!e)return null;let n=e[1],s=e[2],i=e[3],o=e[4].trim().replace(/^["']|["']$/g,""),r=lt(o),c=s.match(/^([|o}{]+)(--|\.\.?)([|o}{]+)$/);if(!c)return null;let a=c[1],A=c[2],l=c[3],u=Re(a),d=Re(l),h=A==="--";return!u||!d?null:{entity1:n,entity2:i,cardinality1:u,cardinality2:d,label:r,identifying:h}}function Re(t){let e=t.split("").sort().join("");return e==="||"?"one":e==="o|"?"zero-one":e==="|}"||e==="{|"?"many":e==="{o"||e==="o{"?"zero-many":null}function yr(t){return/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|]$/.test(t)?"border":"text"}function br(t){return`${t.keys.length>0?t.keys.join(",")+" ":" "}${t.type} ${t.name}`}function wr(t){let e=ct(t.label),n=t.attributes.map(br);return n.length===0?[e]:[e,n]}function zt(t,e,n=!1){if(e)switch(t){case"one":return"|";case"zero-one":return"o|";case"many":return n?"<":">";case"zero-many":return n?"o<":">o"}else switch(t){case"one":return"\u2502";case"zero-one":return"\u25CB\u2502";case"many":return n?"\u255F":"\u2562";case"zero-many":return n?"\u25CB\u255F":"\u2562\u25CB"}}function Cr(t){let e=new Set,n=[],s=new Map;for(let o of t.entities)s.set(o.id,new Set);for(let o of t.relationships)s.get(o.entity1)?.add(o.entity2),s.get(o.entity2)?.add(o.entity1);function i(o,r){let c=[o];for(;c.length>0;){let a=c.pop();if(!e.has(a)){e.add(a),r.add(a);for(let A of s.get(a)??[])e.has(A)||c.push(A)}}}for(let o of t.entities)if(!e.has(o.id)){let r=new Set;i(o.id,r),r.size>0&&n.push(r)}return n}function Ir(t,e,n,s){let i=t.split(`
9`).map(W=>W.trim()).filter(W=>W.length>0&&!W.startsWith("%%")),o=xr(i);if(o.entities.length===0)return"";let r=e.useAscii,c=6,a=4,A=6,l=new Map,u=new Map,d=new Map,h=new Map;for(let W of o.entities){h.set(W.id,W);let z=wr(W);l.set(W.id,z);let y=0;for(let E of z)for(let _ of E)y=Math.max(y,_.length);let O=y+4,V=0;for(let E of z)V+=Math.max(E.length,1);let q=V+(z.length-1)+2;u.set(W.id,O),d.set(W.id,q)}let g=Cr(o),f=new Map,p=0;for(let W of g){let z=o.entities.filter(_=>W.has(_.id)),y=Math.max(2,Math.ceil(Math.sqrt(z.length))),O=0,V=0,q=0,E=p;for(let _ of z){let st=u.get(_.id),it=d.get(_.id);q>=y&&(p+=V+a,O=0,V=0,q=0),f.set(_.id,{entity:_,sections:l.get(_.id),x:O,y:p,width:st,height:it}),O+=st+c,V=Math.max(V,it),q++}p+=V+A}let I=0,H=0;for(let W of f.values())I=Math.max(I,W.x+W.width),H=Math.max(H,W.y+W.height);I+=4,H+=2;let B=dt(I-1,H-1),R=Ut(I-1,H-1);function D(W,z,y,O){W>=0&&W<B.length&&z>=0&&z<(B[0]?.length??0)&&(B[W][z]=y,Pt(R,W,z,O))}for(let W of f.values()){let z=qe(W.sections,r);for(let y=0;y<z.length;y++)for(let O=0;O<z[0].length;O++){let V=z[y][O];if(V!==" "){let q=W.x+y,E=W.y+O;q<I&&E<H&&D(q,E,V,yr(V))}}}let j=r?"-":"\u2500",ht=r?"|":"\u2502",L=r?".":"\u254C",nt=r?":":"\u250A";for(let W of o.relationships){let z=f.get(W.entity1),y=f.get(W.entity2);if(!z||!y)continue;let O=W.identifying?j:L,V=W.identifying?ht:nt,q=z.x+Math.floor(z.width/2),E=z.y+Math.floor(z.height/2),_=y.x+Math.floor(y.width/2),st=y.y+Math.floor(y.height/2);if(Math.abs(E-st)<Math.max(z.height,y.height)){let[w,G]=q<_?[z,y]:[y,z],[F,C]=q<_?[W.cardinality1,W.cardinality2]:[W.cardinality2,W.cardinality1],N=w.x+w.width,tt=G.x-1,m=w.y+Math.floor(w.height/2);for(let v=N;v<=tt;v++)D(v,m,O,"line");let b=zt(F,r,!1);for(let v=0;v<b.length;v++)D(N+v,m,b[v],"arrow");let S=zt(C,r,!0);for(let v=0;v<S.length;v++)D(tt-S.length+1+v,m,S[v],"arrow");if(W.label){let v=ct(W.label),Q=Math.floor((N+tt)/2);for(let k=0;k<v.length;k++){let P=v[k],Y=Math.max(N,Q-Math.floor(P.length/2)),M=m+1+k;Ft(B,Math.max(Y+P.length,1),Math.max(M+1,1)),Lt(R,Math.max(Y+P.length,1),Math.max(M+1,1));for(let Z=0;Z<P.length;Z++){let $=Y+Z;$>=N&&$<=tt&&D($,M,P[Z],"text")}}}}else{let[w,G]=E<st?[z,y]:[y,z],[F,C]=E<st?[W.cardinality1,W.cardinality2]:[W.cardinality2,W.cardinality1],N=w.y+w.height,tt=G.y-1,m=w.x+Math.floor(w.width/2);for(let k=N;k<=tt;k++)D(m,k,V,"line");let b=G.x+Math.floor(G.width/2);if(m!==b){let k=Math.floor((N+tt)/2),P=Math.min(m,b),Y=Math.max(m,b);for(let M=P;M<=Y;M++)D(M,k,O,"line");for(let M=k+1;M<=tt;M++)D(b,M,V,"line")}let S=zt(F,r,!1);for(let k=0;k<S.length;k++)D(m-Math.floor(S.length/2)+k,N,S[k],"arrow");let v=m!==b?b:m,Q=zt(C,r,!0);for(let k=0;k<Q.length;k++)D(v-Math.floor(Q.length/2)+k,tt,Q[k],"arrow");if(W.label){let k=ct(W.label),Y=Math.floor((N+tt)/2)-Math.floor((k.length-1)/2);for(let M=0;M<k.length;M++){let Z=k[M],$=m+2,K=Y+M;if(K>=0)for(let rt=0;rt<Z.length;rt++){let et=$+rt;et>=0&&(Ft(B,et+1,K+1),Lt(R,et+1,K+1),D(et,K,Z[rt],"text"))}}}}}return ne(B,{roleCanvas:R,colorMode:n,theme:s})}function Br(t){let e={},n={},s=[],i,o=!1;for(let r of t){if(/^xychart(-beta)?\b/i.test(r)){/\bhorizontal\b/i.test(r)&&(o=!0);continue}let c=r.match(/^title\s+"([^"]+)"/);if(c){i=c[1];continue}let a=r.match(/^x-axis\s+(?:"([^"]*)"\s*)?\[([^\]]+)\]/);if(a){a[1]&&(e.title=a[1]),e.categories=a[2].split(",").map(g=>g.trim());continue}let A=r.match(/^x-axis\s+(?:"([^"]*)"\s+)?(-?\d+(?:\.\d+)?)\s*-->\s*(-?\d+(?:\.\d+)?)/);if(A){A[1]&&(e.title=A[1]),e.range={min:parseFloat(A[2]),max:parseFloat(A[3])};continue}let l=r.match(/^y-axis\s+(?:"([^"]*)"\s+)?(-?\d+(?:\.\d+)?)\s*-->\s*(-?\d+(?:\.\d+)?)/);if(l){l[1]&&(n.title=l[1]),n.range={min:parseFloat(l[2]),max:parseFloat(l[3])};continue}let u=r.match(/^y-axis\s+"([^"]+)"\s*$/);if(u){n.title=u[1];continue}let d=r.match(/^bar\s+\[([^\]]+)\]/);if(d){s.push({type:"bar",data:Ke(d[1])});continue}let h=r.match(/^line\s+\[([^\]]+)\]/);if(h){s.push({type:"line",data:Ke(h[1])});continue}}if(!n.range&&s.length>0){let r=s.flatMap(l=>l.data),c=Math.min(...r),a=Math.max(...r),A=a-c||1;c=c-A*.1,a=a+A*.1,c>0&&c<A*.5&&(c=0),n.range={min:c,max:a}}return n.range||(n.range={min:0,max:100}),{title:i,horizontal:o,xAxis:e,yAxis:n,series:s}}function Ke(t){return t.split(",").map(e=>parseFloat(e.trim()))}var tn="#3b82f6";function en(t){let e=t.replace("#",""),n=parseInt(e.substring(0,2),16)/255,s=parseInt(e.substring(2,4),16)/255,i=parseInt(e.substring(4,6),16)/255,o=Math.max(n,s,i),r=Math.min(n,s,i),c=(o+r)/2;if(o===r)return[0,0,c*100];let a=o-r,A=c>.5?a/(2-o-r):a/(o+r),l;return o===n?l=((s-i)/a+(s<i?6:0))/6:o===s?l=((i-n)/a+2)/6:l=((n-s)/a+4)/6,[l*360,A*100,c*100]}function Mr(t,e,n){let s=e/100,i=n/100,o=(1-Math.abs(2*i-1))*s,r=o*(1-Math.abs(t/60%2-1)),c=i-o/2,a,A,l;t<60?(a=o,A=r,l=0):t<120?(a=r,A=o,l=0):t<180?(a=0,A=o,l=r):t<240?(a=0,A=r,l=o):t<300?(a=r,A=0,l=o):(a=o,A=0,l=r);let u=d=>Math.round((d+c)*255).toString(16).padStart(2,"0");return`#${u(a)}${u(A)}${u(l)}`}function Je(t){return/^#[0-9a-fA-F]{6}$/.test(t)}function kr(t){return en(t)[2]<50}function $r(t,e,n){if(t===0)return e;let s=Je(e)?e:tn,i=n&&Je(n)?n:void 0,[o,r]=en(s),c=Math.max(55,Math.min(85,r)),a=Math.ceil(t/2),A=t%2===1,l=i&&kr(i)?!A:A,u=l?Math.max(25,48-a*13):Math.min(78,55+a*11),d=(l?-8:12)*a,h=((o+d)%360+360)%360;return Mr(h,c,u)}var nn=60,on=20,Dr={hLine:"\u2500",vLine:"\u2502",origin:"\u253C",yTick:"\u2524",xTick:"\u252C",bar:"\u2588",grid:"\xB7",cornerTL:"\u256D",cornerTR:"\u256E",cornerBL:"\u2570",cornerBR:"\u256F"},vr={hLine:"-",vLine:"|",origin:"+",yTick:"+",xTick:"+",bar:"#",grid:".",cornerTL:"+",cornerTR:"+",cornerBL:"+",cornerBR:"+"};function rn(t,e){let n=e.accent??tn;return t<=1?[n]:Array.from({length:t},(s,i)=>$r(i,n,e.bg))}function Sr(t,e){switch(t){case"text":return e.fg;case"border":return e.border;case"line":return e.line;case"arrow":return e.arrow;case"corner":return e.corner??e.line;case"junction":return e.junction??e.border;default:return e.fg}}function Er(t,e,n,s){let i=t.split(`
10`).map(c=>c.trim()).filter(c=>c.length>0&&!c.startsWith("%%")),o=Br(i),r=e.useAscii?vr:Dr;return o.horizontal?Yr(o,r,n,s):Wr(o,r,n,s)}function Wr(t,e,n,s){let i=hn(t);if(i===0)return"";let o=t.yAxis.range,r=gn(o.min,o.max),c=r.map(E=>te(E)),a=Math.max(...c.map(E=>E.length))+1,A=Math.max(nn,i*6),l=on,u=Math.floor(A/i),d=un(t,i),h=!!t.title,g=!!t.xAxis.title,f=t.series.length>1,p=h?0:-1,I=(h?2:0)+(f?1:0),H=a+1,B=H+u*i+2,R=I+l,D=R+1,j=g?D+1:-1,ht=D+1+(g?1:0)+0,L=cn(B,ht),nt=an(B,ht),W=An(B,ht),z=rn(t.series.length,s),y=E=>{let _=(E-o.min)/(o.max-o.min||1);return Math.round(_*(l-1))},O=E=>H+Math.floor(u*(E+.5));h&&p>=0&&$t(L,nt,p,Math.floor(B/2-t.title.length/2),t.title,"text"),f&&sn(L,nt,W,t,h?1:0,B,e,z);for(let E=0;E<l;E++){let _=I+(l-1-E);gt(L,nt,_,H-1,e.vLine,"border")}gt(L,nt,R,H-1,e.origin,"border");for(let E of r){let _=y(E);if(_<0||_>=l)continue;let st=I+(l-1-_),it=te(E);gt(L,nt,st,H-1,_===0?e.origin:e.yTick,"border");let w=a-it.length;$t(L,nt,st,Math.max(0,w),it,"text")}for(let E=H;E<H+u*i;E++)gt(L,nt,R,E,e.hLine,"border");for(let E=0;E<i;E++){let _=O(E);gt(L,nt,R,_,e.xTick,"border");let st=d[E],it=_-Math.floor(st.length/2);$t(L,nt,D,Math.max(0,it),st,"text")}if(g&&j>=0){let E=t.xAxis.title;$t(L,nt,j,Math.floor(B/2-E.length/2),E,"text")}for(let E of r){let _=y(E);if(_<0||_>=l)continue;let st=I+(l-1-_);for(let it=H;it<H+u*i;it++)ln(L,st,it)===" "&>(L,nt,st,it,e.grid,"line")}let V=[];for(let E=0;E<t.series.length;E++)t.series[E].type==="bar"&&V.push({data:t.series[E].data,globalIdx:E});if(V.length>0){let E=V.length,_=Math.max(1,u-2),st=Math.max(1,Math.min(Math.floor(_/E),8)),it=st*E+(E-1),w=y(Math.max(0,o.min));for(let G=0;G<V.length;G++){let F=V[G],C=z[F.globalIdx];for(let N=0;N<F.data.length;N++){let b=O(N)-Math.floor(it/2)+G*(st+1),S=y(F.data[N]),v=Math.min(w,S),Q=Math.max(w,S);for(let k=v;k<=Q;k++){let P=I+(l-1-k);for(let Y=b;Y<b+st;Y++)gt(L,nt,P,Y,e.bar,"arrow",W,C)}}}}let q=[];for(let E=0;E<t.series.length;E++)t.series[E].type==="line"&&q.push({data:t.series[E].data,globalIdx:E});for(let E of q){if(E.data.length===0)continue;let _=z[E.globalIdx];Fr(L,nt,E.data,O,y,I,l,H,u*i,e,W,_)}return dn(L,nt,W,n,s)}function Yr(t,e,n,s){let i=hn(t);if(i===0)return"";let o=t.yAxis.range,r=gn(o.min,o.max),c=un(t,i),a=Math.max(...c.map(y=>y.length))+1,A=Math.max(nn,40),l=Math.max(2,Math.floor(on/i)),u=l*i,d=!!t.title,h=!!t.yAxis.title,g=t.series.length>1,f=(d?2:0)+(g?1:0),p=a+1,I=p+A+2,H=f+u+2+(h?1:0),B=f+u,R=cn(I,H),D=an(I,H),j=An(I,H),ht=rn(t.series.length,s),L=y=>{let O=(y-o.min)/(o.max-o.min||1);return p+Math.round(O*(A-1))},nt=y=>f+Math.floor(l*(y+.5));d&&$t(R,D,0,Math.floor(I/2-t.title.length/2),t.title,"text"),g&&sn(R,D,j,t,d?1:0,I,e,ht);for(let y=f;y<f+u;y++)gt(R,D,y,p-1,e.vLine,"border");gt(R,D,B,p-1,e.origin,"border");for(let y=0;y<i;y++){let O=nt(y),V=c[y],q=a-V.length;$t(R,D,O,Math.max(0,q),V,"text")}for(let y=p;y<p+A;y++)gt(R,D,B,y,e.hLine,"border");for(let y of r){let O=L(y);if(O<p||O>=p+A)continue;gt(R,D,B,O,e.xTick,"border");let V=te(y);$t(R,D,B+1,O-Math.floor(V.length/2),V,"text")}if(h){let y=t.yAxis.title;$t(R,D,H-1,Math.floor(I/2-y.length/2),y,"text")}for(let y of r){let O=L(y);if(!(O<p||O>=p+A))for(let V=f;V<f+u;V++)ln(R,V,O)===" "&>(R,D,V,O,e.grid,"line")}let W=[];for(let y=0;y<t.series.length;y++)t.series[y].type==="bar"&&W.push({data:t.series[y].data,globalIdx:y});if(W.length>0){let y=W.length,O=1,V=O*y+(y-1),q=L(Math.max(0,o.min));for(let E=0;E<W.length;E++){let _=W[E],st=ht[_.globalIdx];for(let it=0;it<_.data.length;it++){let F=nt(it)-Math.floor(V/2)+E*(O+1),C=L(_.data[it]),N=Math.min(q,C),tt=Math.max(q,C);for(let m=F;m<F+O;m++)for(let b=N;b<=tt;b++)gt(R,D,m,b,e.bar,"arrow",j,st)}}}let z=[];for(let y=0;y<t.series.length;y++)t.series[y].type==="line"&&z.push({data:t.series[y].data,globalIdx:y});for(let y of z){if(y.data.length===0)continue;let O=ht[y.globalIdx];Qr(R,D,y.data,nt,L,f,u,p,A,e,j,O)}return dn(R,D,j,n,s)}function Fr(t,e,n,s,i,o,r,c,a,A,l,u){if(n.length===0)return;let d=n.map((g,f)=>({col:s(f),row:i(g)})),h=(g,f,p)=>{let I=o+(r-1-f);I>=0&&g>=c&&g<c+a&>(t,e,I,g,p,"arrow",l,u)};if(d.length===1){h(d[0].col,d[0].row,A.hLine);return}for(let g=0;g<d.length-1;g++){let f=d[g],p=d[g+1];if(f.row===p.row){for(let D=f.col;D<=p.col;D++)h(D,f.row,A.hLine);continue}let I=Math.round((f.col+p.col)/2),H=p.row>f.row;for(let D=f.col;D<I;D++)h(D,f.row,A.hLine);H?h(I,f.row,A.cornerBR):h(I,f.row,A.cornerTR);let B=Math.min(f.row,p.row),R=Math.max(f.row,p.row);for(let D=B+1;D<R;D++)h(I,D,A.vLine);H?h(I,p.row,A.cornerTL):h(I,p.row,A.cornerBL);for(let D=I+1;D<=p.col;D++)h(D,p.row,A.hLine);if(g===0){let D=Math.max(c,f.col-Math.floor((p.col-f.col)/4));for(let j=D;j<f.col;j++)h(j,f.row,A.hLine)}if(g===d.length-2){let D=Math.min(c+a-1,p.col+Math.floor((p.col-f.col)/4));for(let j=p.col+1;j<=D;j++)h(j,p.row,A.hLine)}}}function Qr(t,e,n,s,i,o,r,c,a,A,l,u){if(n.length===0)return;let d=n.map((g,f)=>({row:s(f),col:i(g)})),h=(g,f,p)=>{g>=o&&g<o+r&&f>=c&&f<c+a&>(t,e,g,f,p,"arrow",l,u)};if(d.length===1){h(d[0].row,d[0].col,A.vLine);return}for(let g=0;g<d.length-1;g++){let f=d[g],p=d[g+1];if(f.col===p.col){for(let D=f.row;D<=p.row;D++)h(D,f.col,A.vLine);continue}let I=Math.round((f.row+p.row)/2),H=p.col>f.col;for(let D=f.row;D<I;D++)h(D,f.col,A.vLine);H?h(I,f.col,A.cornerBL):h(I,f.col,A.cornerBR);let B=Math.min(f.col,p.col),R=Math.max(f.col,p.col);for(let D=B+1;D<R;D++)h(I,D,A.hLine);H?h(I,p.col,A.cornerTR):h(I,p.col,A.cornerTL);for(let D=I+1;D<=p.row;D++)h(D,p.col,A.vLine)}}function sn(t,e,n,s,i,o,r,c){let a=[],A=0,l=0;for(let g=0;g<s.series.length;g++)s.series[g].type==="bar"?(a.push({symbol:r.bar,label:`Bar ${A+1}`,globalIdx:g}),A++):(a.push({symbol:r.hLine,label:`Line ${l+1}`,globalIdx:g}),l++);let u=0;for(let g=0;g<a.length;g++)g>0&&(u+=2),u+=2+a[g].label.length;let h=Math.max(0,Math.floor(o/2-u/2));for(let g=0;g<a.length;g++){g>0&&(h+=2);let f=a[g];gt(t,e,i,h,f.symbol,"arrow",n,c[f.globalIdx]),h+=1,h+=1,$t(t,e,i,h,f.label,"text"),h+=f.label.length}}function cn(t,e){return Array.from({length:t},()=>Array.from({length:e},()=>" "))}function an(t,e){return Array.from({length:t},()=>Array.from({length:e}).fill(null))}function An(t,e){return Array.from({length:t},()=>Array.from({length:e}).fill(null))}function gt(t,e,n,s,i,o,r,c){s>=0&&s<t.length&&n>=0&&n<t[0].length&&(t[s][n]=i,e[s][n]=o,r&&c&&(r[s][n]=c))}function ln(t,e,n){return n>=0&&n<t.length&&e>=0&&e<t[0].length?t[n][e]:" "}function $t(t,e,n,s,i,o){for(let r=0;r<i.length;r++)gt(t,e,n,s+r,i[r],o)}function dn(t,e,n,s,i){if(t.length===0)return"";let o=t[0].length,r=t.length,c=[];for(let a=0;a<o;a++){let A=[],l=[],u=[];for(let h=0;h<r;h++)A.push(t[h][a]),l.push(e[h][a]),u.push(n[h][a]);let d=A.length-1;for(;d>=0&&A[d]===" ";)d--;d<0?c.push(""):c.push(Hr(A.slice(0,d+1),l.slice(0,d+1),u.slice(0,d+1),i,s))}for(;c.length>0&&c[c.length-1]==="";)c.pop();return c.join(`
11`)}function Hr(t,e,n,s,i){if(i==="none")return t.join("");let o="",r=null,c="";for(let a=0;a<t.length;a++){let A=t[a];if(A===" "){c.length>0&&(o+=r?Ae(c,r,i):c,c="",r=null),o+=" ";continue}let l=n[a]??null,u=e[a]??null,d=l??(u?Sr(u,s):null);d===r?c+=A:(c.length>0&&(o+=r?Ae(c,r,i):c),c=A,r=d)}return c.length>0&&(o+=r?Ae(c,r,i):c),o}function hn(t){if(t.xAxis.categories)return t.xAxis.categories.length;for(let e of t.series)if(e.data.length>0)return e.data.length;return 0}function un(t,e){if(t.xAxis.categories)return t.xAxis.categories;if(t.xAxis.range){let{min:n,max:s}=t.xAxis.range,i=e>1?(s-n)/(e-1):0;return Array.from({length:e},(o,r)=>te(n+i*r))}return Array.from({length:e},(n,s)=>String(s+1))}function gn(t,e){let n=e-t;if(n<=0)return[t];let s=n/6,i=Math.pow(10,Math.floor(Math.log10(s))),o=s/i,r;o<=1.5?r=i:o<=3?r=2*i:o<=7?r=5*i:r=10*i;let c=Math.ceil(t/r)*r,a=[];for(let A=c;A<=e+r*.001;A+=r)a.push(Math.round(A*1e10)/1e10);return a}function te(t){return Number.isInteger(t)?String(t):t.toFixed(Math.abs(t)<10?1:0)}function Lr(t){let e=t.trim().split(`
12`)[0]?.trim().toLowerCase()??"";return/^xychart(-beta)?\b/.test(e)?"xychart":/^sequencediagram\s*$/.test(e)?"sequence":/^classdiagram\s*$/.test(e)?"class":/^erdiagram\s*$/.test(e)?"er":"flowchart"}function Gr(t,e={}){let n={useAscii:e.useAscii??!1,paddingX:e.paddingX??5,paddingY:e.paddingY??5,boxBorderPadding:e.boxBorderPadding??1,graphDirection:"TD"},s=e.colorMode==="auto"||e.colorMode===void 0?Gn():e.colorMode,i={...Ne,...e.theme};switch(Lr(t)){case"xychart":return Er(t,n,s,i);case"sequence":return ar(t,n,s,i);case"class":return fr(t,n,s,i);case"er":return Ir(t,n,s,i);case"flowchart":default:{let r=Mn(t);r.direction==="LR"||r.direction==="RL"?n.graphDirection="LR":n.graphDirection="TD";let c=zn(r,n);return sr(c),Vo(c),r.direction==="BT"&&(Un(c.canvas),Pn(c.roleCanvas)),ne(c.canvas,{roleCanvas:c.roleCanvas,colorMode:s,theme:i})}}}var Rr="'JetBrains Mono'",Ms=`${Rr}, 'SF Mono', 'Fira Code', ui-monospace, monospace`;export{Gr as renderMermaidASCII};
13