@vectojs/markdown 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/dist/Markdown.d.ts +66 -15
- package/dist/MarkdownWorkerSource.d.ts +1 -1
- package/dist/StreamController.d.ts +40 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +642 -76
- package/dist/index.mjs +646 -77
- package/package.json +5 -3
package/dist/index.mjs
CHANGED
|
@@ -4,9 +4,397 @@ import {
|
|
|
4
4
|
Entity,
|
|
5
5
|
GlyphRasterAtlas,
|
|
6
6
|
prepareContentGrid,
|
|
7
|
-
SVGEntity
|
|
7
|
+
SVGEntity,
|
|
8
|
+
beginVectoUserTiming,
|
|
9
|
+
endVectoUserTiming,
|
|
10
|
+
VECTO_USER_TIMING
|
|
8
11
|
} from "@vectojs/core";
|
|
9
12
|
import { marked } from "marked";
|
|
13
|
+
|
|
14
|
+
// src/StreamController.ts
|
|
15
|
+
var DEFAULT_MAX_BUFFERED_CHARS = 64 * 1024;
|
|
16
|
+
var MAX_FRAME_DELTA_MS = 100;
|
|
17
|
+
var MIN_SCAN_CODE_UNITS = 64;
|
|
18
|
+
function positiveFinite(value, label) {
|
|
19
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
20
|
+
throw new RangeError(`${label} must be a positive finite number`);
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function abortError() {
|
|
25
|
+
const error = new Error("Stream aborted");
|
|
26
|
+
error.name = "AbortError";
|
|
27
|
+
return error;
|
|
28
|
+
}
|
|
29
|
+
var StreamControllerImpl = class {
|
|
30
|
+
constructor(host, options) {
|
|
31
|
+
this.host = host;
|
|
32
|
+
this.maxBufferedChars = positiveFinite(
|
|
33
|
+
options.maxBufferedChars ?? DEFAULT_MAX_BUFFERED_CHARS,
|
|
34
|
+
"maxBufferedChars"
|
|
35
|
+
);
|
|
36
|
+
this.graphemesPerSecond = options.pacing ? positiveFinite(options.pacing.graphemesPerSecond, "pacing.graphemesPerSecond") : null;
|
|
37
|
+
this.segmenter = this.graphemesPerSecond === null ? null : new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
38
|
+
this.signal = options.signal;
|
|
39
|
+
this.onSignalAbort = () => this.abort(this.signal?.reason);
|
|
40
|
+
if (this.signal?.aborted) this.abort(this.signal.reason);
|
|
41
|
+
else this.signal?.addEventListener("abort", this.onSignalAbort, { once: true });
|
|
42
|
+
}
|
|
43
|
+
host;
|
|
44
|
+
maxBufferedChars;
|
|
45
|
+
graphemesPerSecond;
|
|
46
|
+
segmenter;
|
|
47
|
+
signal;
|
|
48
|
+
onSignalAbort;
|
|
49
|
+
chunks = [];
|
|
50
|
+
headIndex = 0;
|
|
51
|
+
headOffset = 0;
|
|
52
|
+
acceptedChars = 0;
|
|
53
|
+
blocked = null;
|
|
54
|
+
currentState = "open";
|
|
55
|
+
terminalReason = null;
|
|
56
|
+
rafId = null;
|
|
57
|
+
lastFrameAt = null;
|
|
58
|
+
graphemeCredit = 0;
|
|
59
|
+
released = false;
|
|
60
|
+
closePromise = null;
|
|
61
|
+
resolveClose = null;
|
|
62
|
+
rejectClose = null;
|
|
63
|
+
get state() {
|
|
64
|
+
return this.currentState;
|
|
65
|
+
}
|
|
66
|
+
get bufferedChars() {
|
|
67
|
+
return this.acceptedChars + (this.blocked?.chunk.length ?? 0);
|
|
68
|
+
}
|
|
69
|
+
write(chunk) {
|
|
70
|
+
if (this.currentState !== "open" || this.closePromise) {
|
|
71
|
+
return Promise.reject(this.reasonForWrite());
|
|
72
|
+
}
|
|
73
|
+
if (chunk.length === 0) return Promise.resolve();
|
|
74
|
+
if (this.blocked) {
|
|
75
|
+
return Promise.reject(new Error("StreamController already has a blocked write"));
|
|
76
|
+
}
|
|
77
|
+
if (this.canAdmit(chunk)) {
|
|
78
|
+
this.admit(chunk);
|
|
79
|
+
try {
|
|
80
|
+
this.schedule();
|
|
81
|
+
return Promise.resolve();
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return Promise.reject(error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
const blocked = { chunk, resolve, reject };
|
|
88
|
+
this.blocked = blocked;
|
|
89
|
+
try {
|
|
90
|
+
this.schedule();
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (this.blocked === blocked) this.blocked = null;
|
|
93
|
+
reject(error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
flush() {
|
|
98
|
+
if (this.currentState === "closed") return;
|
|
99
|
+
if (this.currentState === "aborted") throw this.terminalReason;
|
|
100
|
+
this.cancelFrame();
|
|
101
|
+
this.commitAllSubmitted();
|
|
102
|
+
this.resetPacingIfIdle();
|
|
103
|
+
}
|
|
104
|
+
close() {
|
|
105
|
+
if (this.currentState === "closed") return Promise.resolve();
|
|
106
|
+
if (this.currentState === "aborted") return Promise.reject(this.terminalReason);
|
|
107
|
+
if (this.closePromise) return this.closePromise;
|
|
108
|
+
let resolveClose;
|
|
109
|
+
let rejectClose;
|
|
110
|
+
const closePromise = new Promise((resolve, reject) => {
|
|
111
|
+
resolveClose = resolve;
|
|
112
|
+
rejectClose = reject;
|
|
113
|
+
});
|
|
114
|
+
this.closePromise = closePromise;
|
|
115
|
+
this.resolveClose = resolveClose;
|
|
116
|
+
this.rejectClose = rejectClose;
|
|
117
|
+
this.cancelFrame();
|
|
118
|
+
try {
|
|
119
|
+
this.commitAllSubmitted();
|
|
120
|
+
} catch (error) {
|
|
121
|
+
this.rejectPendingClose(error);
|
|
122
|
+
return closePromise;
|
|
123
|
+
}
|
|
124
|
+
if (this.currentState !== "open") {
|
|
125
|
+
this.rejectPendingClose(this.terminalReason);
|
|
126
|
+
return closePromise;
|
|
127
|
+
}
|
|
128
|
+
this.currentState = "closed";
|
|
129
|
+
this.cleanup();
|
|
130
|
+
this.resolveClose?.();
|
|
131
|
+
this.resolveClose = null;
|
|
132
|
+
this.rejectClose = null;
|
|
133
|
+
return closePromise;
|
|
134
|
+
}
|
|
135
|
+
abort(reason) {
|
|
136
|
+
if (this.currentState !== "open") return;
|
|
137
|
+
this.fail(reason === void 0 ? abortError() : reason);
|
|
138
|
+
}
|
|
139
|
+
destroy() {
|
|
140
|
+
this.abort();
|
|
141
|
+
}
|
|
142
|
+
onFrame = (timestamp) => {
|
|
143
|
+
this.rafId = null;
|
|
144
|
+
if (this.currentState !== "open") return;
|
|
145
|
+
let keepScheduling = true;
|
|
146
|
+
try {
|
|
147
|
+
if (this.graphemesPerSecond === null) this.commitAccepted();
|
|
148
|
+
else keepScheduling = this.commitPaced(timestamp);
|
|
149
|
+
} catch {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (this.currentState !== "open") return;
|
|
153
|
+
this.admitBlockedIfPossible();
|
|
154
|
+
this.resetPacingIfIdle();
|
|
155
|
+
if (!keepScheduling) return;
|
|
156
|
+
try {
|
|
157
|
+
this.schedule();
|
|
158
|
+
} catch {
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
reasonForWrite() {
|
|
162
|
+
if (this.currentState === "aborted") return this.terminalReason;
|
|
163
|
+
if (this.currentState === "closed") return new Error("StreamController is closed");
|
|
164
|
+
return new Error("StreamController is closing");
|
|
165
|
+
}
|
|
166
|
+
canAdmit(chunk) {
|
|
167
|
+
return this.acceptedChars + chunk.length <= this.maxBufferedChars || this.acceptedChars === 0 && chunk.length > this.maxBufferedChars;
|
|
168
|
+
}
|
|
169
|
+
admit(chunk) {
|
|
170
|
+
this.chunks.push(chunk);
|
|
171
|
+
this.acceptedChars += chunk.length;
|
|
172
|
+
}
|
|
173
|
+
admitBlockedIfPossible() {
|
|
174
|
+
const blocked = this.blocked;
|
|
175
|
+
if (!blocked || !this.canAdmit(blocked.chunk)) return;
|
|
176
|
+
this.blocked = null;
|
|
177
|
+
this.admit(blocked.chunk);
|
|
178
|
+
blocked.resolve();
|
|
179
|
+
}
|
|
180
|
+
schedule() {
|
|
181
|
+
if (this.currentState !== "open" || this.acceptedChars === 0 || this.rafId !== null) return;
|
|
182
|
+
if (typeof requestAnimationFrame !== "function") {
|
|
183
|
+
this.flush();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.rafId = requestAnimationFrame(this.onFrame);
|
|
187
|
+
}
|
|
188
|
+
cancelFrame() {
|
|
189
|
+
if (this.rafId === null) return;
|
|
190
|
+
if (typeof cancelAnimationFrame === "function") cancelAnimationFrame(this.rafId);
|
|
191
|
+
this.rafId = null;
|
|
192
|
+
}
|
|
193
|
+
commitAccepted() {
|
|
194
|
+
if (this.acceptedChars === 0) return;
|
|
195
|
+
const text = this.takeAcceptedText();
|
|
196
|
+
try {
|
|
197
|
+
this.host.append(text);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
this.fail(error);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** Return true while another frame can make progress without more producer input. */
|
|
204
|
+
commitPaced(timestamp) {
|
|
205
|
+
if (this.lastFrameAt === null) {
|
|
206
|
+
this.lastFrameAt = timestamp;
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
const delta = Math.min(MAX_FRAME_DELTA_MS, Math.max(0, timestamp - this.lastFrameAt));
|
|
210
|
+
this.lastFrameAt = timestamp;
|
|
211
|
+
this.graphemeCredit += delta * this.graphemesPerSecond / 1e3;
|
|
212
|
+
const available = Math.floor(this.graphemeCredit);
|
|
213
|
+
if (available < 1) return true;
|
|
214
|
+
const selected = this.selectGraphemePrefix(available);
|
|
215
|
+
if (selected.count === 0) {
|
|
216
|
+
this.lastFrameAt = null;
|
|
217
|
+
this.graphemeCredit = 0;
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
const completedBlocked = this.consumeSubmittedChars(selected.codeUnits);
|
|
221
|
+
try {
|
|
222
|
+
this.host.append(selected.text);
|
|
223
|
+
completedBlocked?.resolve();
|
|
224
|
+
} catch (error) {
|
|
225
|
+
completedBlocked?.reject(error);
|
|
226
|
+
this.fail(error);
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
this.graphemeCredit -= selected.count;
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
selectGraphemePrefix(maxCount) {
|
|
233
|
+
const submittedChars = this.acceptedChars + (this.blocked?.chunk.length ?? 0);
|
|
234
|
+
let scanLength = Math.min(submittedChars, Math.max(MIN_SCAN_CODE_UNITS, maxCount * 2));
|
|
235
|
+
while (scanLength > 0) {
|
|
236
|
+
let sample = this.peekSubmittedChars(scanLength);
|
|
237
|
+
if (scanLength < submittedChars && /[\uD800-\uDBFF]$/.test(sample)) {
|
|
238
|
+
scanLength++;
|
|
239
|
+
sample = this.peekSubmittedChars(scanLength);
|
|
240
|
+
}
|
|
241
|
+
const segments = [...this.segmenter.segment(sample)];
|
|
242
|
+
const hasUnscannedText = scanLength < submittedChars;
|
|
243
|
+
if (hasUnscannedText && segments.length <= maxCount) {
|
|
244
|
+
scanLength = Math.min(submittedChars, scanLength * 2);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const count = hasUnscannedText ? maxCount : Math.min(maxCount, Math.max(0, segments.length - 1));
|
|
248
|
+
if (count > 0) {
|
|
249
|
+
const last = segments[count - 1];
|
|
250
|
+
const codeUnits = last.index + last.segment.length;
|
|
251
|
+
return { text: sample.slice(0, codeUnits), count, codeUnits };
|
|
252
|
+
}
|
|
253
|
+
if (this.blocked || this.acceptedChars > this.maxBufferedChars) {
|
|
254
|
+
return this.forceCodePointPrefix(sample);
|
|
255
|
+
}
|
|
256
|
+
return { text: "", count: 0, codeUnits: 0 };
|
|
257
|
+
}
|
|
258
|
+
return { text: "", count: 0, codeUnits: 0 };
|
|
259
|
+
}
|
|
260
|
+
forceCodePointPrefix(sample) {
|
|
261
|
+
const first = sample.charCodeAt(0);
|
|
262
|
+
const second = sample.charCodeAt(1);
|
|
263
|
+
const codeUnits = first >= 55296 && first <= 56319 && second >= 56320 && second <= 57343 ? 2 : 1;
|
|
264
|
+
return { text: sample.slice(0, codeUnits), count: 1, codeUnits };
|
|
265
|
+
}
|
|
266
|
+
peekSubmittedChars(limit) {
|
|
267
|
+
const parts = this.peekAcceptedParts(Math.min(limit, this.acceptedChars));
|
|
268
|
+
const acceptedLength = Math.min(limit, this.acceptedChars);
|
|
269
|
+
const blockedLength = limit - acceptedLength;
|
|
270
|
+
if (blockedLength > 0 && this.blocked) {
|
|
271
|
+
parts.push(this.blocked.chunk.slice(0, blockedLength));
|
|
272
|
+
}
|
|
273
|
+
return parts.length === 1 ? parts[0] : parts.join("");
|
|
274
|
+
}
|
|
275
|
+
peekAcceptedParts(limit) {
|
|
276
|
+
if (limit <= 0) return [];
|
|
277
|
+
const parts = [];
|
|
278
|
+
let remaining = limit;
|
|
279
|
+
for (let index = this.headIndex; index < this.chunks.length && remaining > 0; index++) {
|
|
280
|
+
const chunk = this.chunks[index];
|
|
281
|
+
const start = index === this.headIndex ? this.headOffset : 0;
|
|
282
|
+
const available = chunk.length - start;
|
|
283
|
+
if (available <= remaining) {
|
|
284
|
+
parts.push(start === 0 ? chunk : chunk.slice(start));
|
|
285
|
+
remaining -= available;
|
|
286
|
+
} else {
|
|
287
|
+
parts.push(chunk.slice(start, start + remaining));
|
|
288
|
+
remaining = 0;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return parts;
|
|
292
|
+
}
|
|
293
|
+
consumeSubmittedChars(count) {
|
|
294
|
+
const acceptedCount = Math.min(count, this.acceptedChars);
|
|
295
|
+
this.consumeAcceptedChars(acceptedCount);
|
|
296
|
+
const blockedCount = count - acceptedCount;
|
|
297
|
+
if (blockedCount === 0) return null;
|
|
298
|
+
const blocked = this.blocked;
|
|
299
|
+
if (!blocked) throw new Error("StreamController queue accounting diverged");
|
|
300
|
+
if (blockedCount >= blocked.chunk.length) {
|
|
301
|
+
this.blocked = null;
|
|
302
|
+
return blocked;
|
|
303
|
+
}
|
|
304
|
+
blocked.chunk = blocked.chunk.slice(blockedCount);
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
consumeAcceptedChars(count) {
|
|
308
|
+
if (count < 0 || count > this.acceptedChars) {
|
|
309
|
+
throw new Error("StreamController queue accounting diverged");
|
|
310
|
+
}
|
|
311
|
+
this.acceptedChars -= count;
|
|
312
|
+
let remaining = count;
|
|
313
|
+
while (remaining > 0) {
|
|
314
|
+
const chunk = this.chunks[this.headIndex];
|
|
315
|
+
const available = chunk.length - this.headOffset;
|
|
316
|
+
if (remaining < available) {
|
|
317
|
+
this.headOffset += remaining;
|
|
318
|
+
remaining = 0;
|
|
319
|
+
} else {
|
|
320
|
+
remaining -= available;
|
|
321
|
+
this.headIndex++;
|
|
322
|
+
this.headOffset = 0;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (this.acceptedChars === 0) {
|
|
326
|
+
this.chunks = [];
|
|
327
|
+
this.headIndex = 0;
|
|
328
|
+
this.headOffset = 0;
|
|
329
|
+
} else if (this.headIndex >= 64 && this.headIndex * 2 >= this.chunks.length) {
|
|
330
|
+
this.chunks.splice(0, this.headIndex);
|
|
331
|
+
this.headIndex = 0;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
takeAcceptedText() {
|
|
335
|
+
const parts = this.takeAcceptedParts();
|
|
336
|
+
return parts.length === 1 ? parts[0] : parts.join("");
|
|
337
|
+
}
|
|
338
|
+
takeAcceptedParts() {
|
|
339
|
+
const parts = this.peekAcceptedParts(this.acceptedChars);
|
|
340
|
+
this.chunks = [];
|
|
341
|
+
this.headIndex = 0;
|
|
342
|
+
this.headOffset = 0;
|
|
343
|
+
this.acceptedChars = 0;
|
|
344
|
+
return parts;
|
|
345
|
+
}
|
|
346
|
+
commitAllSubmitted() {
|
|
347
|
+
const blocked = this.blocked;
|
|
348
|
+
this.blocked = null;
|
|
349
|
+
const parts = this.takeAcceptedParts();
|
|
350
|
+
if (blocked) parts.push(blocked.chunk);
|
|
351
|
+
if (parts.length === 0) return;
|
|
352
|
+
try {
|
|
353
|
+
this.host.append(parts.length === 1 ? parts[0] : parts.join(""));
|
|
354
|
+
blocked?.resolve();
|
|
355
|
+
} catch (error) {
|
|
356
|
+
blocked?.reject(error);
|
|
357
|
+
this.fail(error);
|
|
358
|
+
throw error;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
rejectPendingClose(reason) {
|
|
362
|
+
this.rejectClose?.(reason);
|
|
363
|
+
this.resolveClose = null;
|
|
364
|
+
this.rejectClose = null;
|
|
365
|
+
}
|
|
366
|
+
fail(reason) {
|
|
367
|
+
if (this.currentState !== "open") return;
|
|
368
|
+
this.currentState = "aborted";
|
|
369
|
+
this.terminalReason = reason;
|
|
370
|
+
this.cancelFrame();
|
|
371
|
+
this.chunks = [];
|
|
372
|
+
this.headIndex = 0;
|
|
373
|
+
this.headOffset = 0;
|
|
374
|
+
this.acceptedChars = 0;
|
|
375
|
+
const blocked = this.blocked;
|
|
376
|
+
this.blocked = null;
|
|
377
|
+
blocked?.reject(reason);
|
|
378
|
+
this.rejectPendingClose(reason);
|
|
379
|
+
this.cleanup();
|
|
380
|
+
}
|
|
381
|
+
cleanup() {
|
|
382
|
+
this.signal?.removeEventListener("abort", this.onSignalAbort);
|
|
383
|
+
if (this.released) return;
|
|
384
|
+
this.released = true;
|
|
385
|
+
this.host.release(this);
|
|
386
|
+
}
|
|
387
|
+
resetPacingIfIdle() {
|
|
388
|
+
if (this.acceptedChars !== 0 || this.blocked) return;
|
|
389
|
+
this.lastFrameAt = null;
|
|
390
|
+
this.graphemeCredit = 0;
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
function createStreamController(host, options = {}) {
|
|
394
|
+
return new StreamControllerImpl(host, options);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// src/Markdown.ts
|
|
10
398
|
import { mathjax } from "mathjax-full/js/mathjax.js";
|
|
11
399
|
import { TeX } from "mathjax-full/js/input/tex.js";
|
|
12
400
|
import { SVG } from "mathjax-full/js/output/svg.js";
|
|
@@ -16,10 +404,19 @@ import { AllPackages } from "mathjax-full/js/input/tex/AllPackages.js";
|
|
|
16
404
|
import { measureText, RichText, Stack, Table, Text, Image, UIComponent } from "@vectojs/ui";
|
|
17
405
|
|
|
18
406
|
// src/MarkdownWorkerSource.ts
|
|
19
|
-
var WORKER_SOURCE_STRING = '"use strict";(()=>{function O(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=O();function oe(r){T=r}var R={exec:()=>null};function z(r){let e=[];return t=>{let s=Math.max(0,Math.min(3,t-1)),n=e[s];return n||(n=r(s),e[s]=n),n}}function g(r,e=""){let t=typeof r=="string"?r:r.source,s={replace:(n,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(x.caret,"$1"),t=t.replace(n,a),s},getRegex:()=>new RegExp(t,e)};return s}var me=((r="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+r)}catch{return!1}})(),x={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^\'"]*[^\\s])\\s+([\'"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>"\']/,escapeReplace:/[&<>"\']/g,escapeTestNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:z(r=>new RegExp(`^ {0,${r}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ ][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:z(r=>new RegExp(`^ {0,${r}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),fencesBeginRegex:z(r=>new RegExp(`^ {0,${r}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:z(r=>new RegExp(`^ {0,${r}}#`)),htmlBeginRegex:z(r=>new RegExp(`^ {0,${r}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:z(r=>new RegExp(`^ {0,${r}}>`))},ye=/^(?:[ \\t]*(?:\\n|$))+/,$e=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,v=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Se=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,N=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,ce=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,he=g(ce).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,"").getRegex(),Te=g(ce).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),G=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,ze=/^[^\\n]+/,X=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ae=g(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace("label",X).replace("title",/(?:"(?:\\\\"?|[^"\\\\])*"|\'[^\'\\n]*(?:\\n[^\'\\n]+)*\\n?\'|\\([^()]*\\))/).getRegex(),_e=g(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,N).getRegex(),q="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",W=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Pe=g("^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$))","i").replace("comment",W).replace("tag",q).replace("attribute",/ +[a-zA-Z:_][\\w.:-]*(?: *= *"[^"\\n]*"| *= *\'[^\'\\n]*\'| *= *[^\\s"\'=<>`]+)?/).getRegex(),pe=r=>g(G).replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list",r).replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",q).getRegex(),Le=pe(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),ve=pe(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Ie=g(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace("paragraph",ve).getRegex(),F={blockquote:Ie,code:$e,def:Ae,fences:Re,heading:Se,hr:v,html:Pe,lheading:he,list:_e,newline:ye,paragraph:Le,table:R,text:ze},te=g("^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)").replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",q).getRegex(),Ee={...F,lheading:Te,table:te,paragraph:g(G).replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("table",te).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",q).getRegex()},Ce={...F,html:g(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:"[^"]*"|\'[^\']*\'|\\\\s[^\'"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace("comment",W).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +(["(][^\\n]+[")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:R,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:g(G).replace("hr",v).replace("heading",` *#{1,6} *[^\n]`).replace("lheading",he).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Be=/^\\\\([!"#$%&\'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,qe=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ue=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ze=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,A=/[\\p{P}\\p{S}]/u,Z=/[\\s\\p{P}\\p{S}]/u,U=/[^\\s\\p{P}\\p{S}]/u,De=g(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,Z).getRegex(),ge=/(?!~)[\\p{P}\\p{S}]/u,Me=/(?!~)[\\s\\p{P}\\p{S}]/u,Qe=/(?:[^\\s\\p{P}\\p{S}]|~)/u,je=g(/link|precode-code|html/,"g").replace("link",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace("precode-",me?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),ke=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,He=g(ke,"u").replace(/punct/g,A).getRegex(),Oe=g(ke,"u").replace(/punct/g,ge).getRegex(),de="^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)",Ne=g(de,"gu").replace(/notPunctSpace/g,U).replace(/punctSpace/g,Z).replace(/punct/g,A).getRegex(),Ge=g(de,"gu").replace(/notPunctSpace/g,Qe).replace(/punctSpace/g,Me).replace(/punct/g,ge).getRegex(),Xe=g("^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,U).replace(/punctSpace/g,Z).replace(/punct/g,A).getRegex(),We=g(/^~~?(?:((?!~)punct)|[^\\s~])/,"u").replace(/punct/g,A).getRegex(),Fe="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Ue=g(Fe,"gu").replace(/notPunctSpace/g,U).replace(/punctSpace/g,Z).replace(/punct/g,A).getRegex(),Ve=g(/\\\\(punct)/,"gu").replace(/punct/g,A).getRegex(),Je=g(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&\'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Ke=g(W).replace("(?:-->|$)","-->").getRegex(),Ye=g("^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>").replace("comment",Ke).replace("attribute",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*"[^"]*"|\\s*=\\s*\'[^\']*\'|\\s*=\\s*[^\\s"\'=<>`]+)?/).getRegex(),E=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,et=g(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace("label",E).replace("href",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace("title",/"(?:\\\\"?|[^"\\\\])*"|\'(?:\\\\\'?|[^\'\\\\])*\'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),fe=g(/^!?\\[(label)\\]\\[(ref)\\]/).replace("label",E).replace("ref",X).getRegex(),xe=g(/^!?\\[(ref)\\](?:\\[\\])?/).replace("ref",X).getRegex(),tt=g("reflink|nolink(?!\\\\()","g").replace("reflink",fe).replace("nolink",xe).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,V={_backpedal:R,anyPunctuation:Ve,autolink:Je,blockSkip:je,br:ue,code:qe,del:R,delLDelim:R,delRDelim:R,emStrongLDelim:He,emStrongRDelimAst:Ne,emStrongRDelimUnd:Xe,escape:Be,link:et,nolink:xe,punctuation:De,reflink:fe,reflinkSearch:tt,tag:Ye,text:Ze,url:R},rt={...V,link:g(/^!?\\[(label)\\]\\((.*?)\\)/).replace("label",E).getRegex(),reflink:g(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace("label",E).getRegex()},Q={...V,emStrongRDelimAst:Ge,emStrongLDelim:Oe,delLDelim:We,delRDelim:Ue,url:g(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace("protocol",re).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_\'"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_\'"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:g(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)))/).replace("protocol",re).getRegex()},nt={...Q,br:g(ue).replace("{2,}","*").getRegex(),text:g(Q.text).replace("\\\\b_","\\\\b_| {2,}\\\\n").replace(/\\{2,\\}/g,"*").getRegex()},I={normal:F,gfm:Ee,pedantic:Ce},P={normal:V,gfm:Q,breaks:nt,pedantic:rt},st={"&":"&","<":"<",">":">",\'"\':""","\'":"'"},ne=r=>st[r];function m(r,e){if(e){if(x.escapeTest.test(r))return r.replace(x.escapeReplace,ne)}else if(x.escapeTestNoEncode.test(r))return r.replace(x.escapeReplaceNoEncode,ne);return r}function se(r){try{r=encodeURI(r).replace(x.percentDecode,"%")}catch{return null}return r}function ie(r,e){let t=r.replace(x.findPipe,(i,a,l)=>{let o=!1,c=a;for(;--c>=0&&l[c]==="\\\\";)o=!o;return o?"|":" |"}),s=t.split(x.splitPipe),n=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(x.slashPipe,"|");return s}function $(r,e,t){let s=r.length;if(s===0)return"";let n=0;for(;n<s;){let i=r.charAt(s-n-1);if(i===e&&!t)n++;else if(i!==e&&t)n++;else break}return r.slice(0,s-n)}function le(r){let e=r.split(`\n`),t=e.length-1;for(;t>=0&&x.blankLine.test(e[t]);)t--;return e.length-t<=2?r:e.slice(0,t+1).join(`\n`)}function it(r,e){if(r.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<r.length;s++)if(r[s]==="\\\\")s++;else if(r[s]===e[0])t++;else if(r[s]===e[1]&&(t--,t<0))return s;return t>0?-2:-1}function lt(r,e=0){let t=e,s="";for(let n of r)if(n===" "){let i=4-t%4;s+=" ".repeat(i),t+=i}else s+=n,t++;return s}function ae(r,e,t,s,n){let i=e.href,a=e.title||null,l=r[1].replace(n.other.outputLinkReplace,"$1");s.state.inLink=!0;let o={type:r[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:a,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,o}function at(r,e,t){let s=r.match(t.other.indentCodeCompensation);if(s===null)return e;let n=s[1];return e.split(`\n`).map(i=>{let a=i.match(t.other.beginningSpace);if(a===null)return i;let[l]=a;return l.length>=n.length?i.slice(n.length):i}).join(`\n`)}var C=class{options;rules;lexer;constructor(r){this.options=r||T}space(r){let e=this.rules.block.newline.exec(r);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(r){let e=this.rules.block.code.exec(r);if(e){let t=this.options.pedantic?e[0]:le(e[0]),s=t.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t,codeBlockStyle:"indented",text:s}}}fences(r){let e=this.rules.block.fences.exec(r);if(e){let t=e[0],s=at(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(r){let e=this.rules.block.heading.exec(r);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){let s=$(t,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(t=s.trim())}return{type:"heading",raw:$(e[0],`\n`),depth:e[1].length,text:t,tokens:this.lexer.inline(t)}}}hr(r){let e=this.rules.block.hr.exec(r);if(e)return{type:"hr",raw:$(e[0],`\n`)}}blockquote(r){let e=this.rules.block.blockquote.exec(r);if(e){let t=$(e[0],`\n`).split(`\n`),s="",n="",i=[];for(;t.length>0;){let a=!1,l=[],o;for(o=0;o<t.length;o++)if(this.rules.other.blockquoteStart.test(t[o]))l.push(t[o]),a=!0;else if(!a)l.push(t[o]);else break;t=t.slice(o);let c=l.join(`\n`),p=c.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}\n${c}`:c,n=n?`${n}\n${p}`:p;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(p,i,!0),this.lexer.state.top=h,t.length===0)break;let u=i.at(-1);if(u?.type==="code")break;if(u?.type==="blockquote"){let f=u,d=f.raw+`\n`+t.join(`\n`),y=this.blockquote(d);i[i.length-1]=y,s=s.substring(0,s.length-f.raw.length)+y.raw,n=n.substring(0,n.length-f.text.length)+y.text;break}else if(u?.type==="list"){let f=u,d=f.raw+`\n`+t.join(`\n`),y=this.list(d);i[i.length-1]=y,s=s.substring(0,s.length-u.raw.length)+y.raw,n=n.substring(0,n.length-f.raw.length)+y.raw,t=d.substring(i.at(-1).raw.length).split(`\n`);continue}}return{type:"blockquote",raw:s,tokens:i,text:n}}}list(r){let e=this.rules.block.list.exec(r);if(e){let t=e[1].trim(),s=t.length>1,n={type:"list",raw:"",ordered:s,start:s?+t.slice(0,-1):"",loose:!1,items:[]};t=s?`\\\\d{1,9}\\\\${t.slice(-1)}`:`\\\\${t}`,this.options.pedantic&&(t=s?t:"[*+-]");let i=this.rules.other.listItemRegex(t),a=!1;for(;r;){let o=!1,c="",p="";if(!(e=i.exec(r))||this.rules.block.hr.test(r))break;c=e[0],r=r.substring(c.length);let h=lt(e[2].split(`\n`,1)[0],e[1].length),u=r.split(`\n`,1)[0],f=!h.trim(),d=0;if(this.options.pedantic?(d=2,p=h.trimStart()):f?d=e[1].length+1:(d=h.search(this.rules.other.nonSpaceChar),d=d>4?1:d,p=h.slice(d),d+=e[1].length),f&&this.rules.other.blankLine.test(u)&&(c+=u+`\n`,r=r.substring(u.length+1),o=!0),!o){let y=this.rules.other.nextBulletRegex(d),K=this.rules.other.hrRegex(d),Y=this.rules.other.fencesBeginRegex(d),ee=this.rules.other.headingBeginRegex(d),be=this.rules.other.htmlBeginRegex(d),we=this.rules.other.blockquoteBeginRegex(d);for(;r;){let M=r.split(`\n`,1)[0],_;if(u=M,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),_=u):_=u.replace(this.rules.other.tabCharGlobal," "),Y.test(u)||ee.test(u)||be.test(u)||we.test(u)||y.test(u)||K.test(u))break;if(_.search(this.rules.other.nonSpaceChar)>=d||!u.trim())p+=`\n`+_.slice(d);else{if(f||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||Y.test(h)||ee.test(h)||K.test(h))break;p+=`\n`+u}f=!u.trim(),c+=M+`\n`,r=r.substring(M.length+1),h=_.slice(d)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(a=!0)),n.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(p),loose:!1,text:p,tokens:[]}),n.raw+=c}let l=n.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let o of n.items){this.lexer.state.top=!1,o.tokens=this.lexer.blockTokens(o.text,[]);let c=o.tokens[0];if(o.task&&(c?.type==="text"||c?.type==="paragraph")){o.text=o.text.replace(this.rules.other.listReplaceTask,""),c.raw=c.raw.replace(this.rules.other.listReplaceTask,""),c.text=c.text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}let p=this.rules.other.listTaskCheckbox.exec(o.raw);if(p){let h={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};o.checked=h.checked,n.loose?o.tokens[0]&&["paragraph","text"].includes(o.tokens[0].type)&&"tokens"in o.tokens[0]&&o.tokens[0].tokens?(o.tokens[0].raw=h.raw+o.tokens[0].raw,o.tokens[0].text=h.raw+o.tokens[0].text,o.tokens[0].tokens.unshift(h)):o.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):o.tokens.unshift(h)}}else o.task&&(o.task=!1);if(!n.loose){let p=o.tokens.filter(u=>u.type==="space"),h=p.length>0&&p.some(u=>this.rules.other.anyLine.test(u.raw));n.loose=h}}if(n.loose)for(let o of n.items){o.loose=!0;for(let c of o.tokens)c.type==="text"&&(c.type="paragraph")}return n}}html(r){let e=this.rules.block.html.exec(r);if(e){let t=le(e[0]);return{type:"html",block:!0,raw:t,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:t}}}def(r){let e=this.rules.block.def.exec(r);if(e){let t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:$(e[0],`\n`),href:s,title:n}}}table(r){let e=this.rules.block.table.exec(r);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let t=ie(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`\n`):[],i={type:"table",raw:$(e[0],`\n`),header:[],align:[],rows:[]};if(t.length===s.length){for(let a of s)this.rules.other.tableAlignRight.test(a)?i.align.push("right"):this.rules.other.tableAlignCenter.test(a)?i.align.push("center"):this.rules.other.tableAlignLeft.test(a)?i.align.push("left"):i.align.push(null);for(let a=0;a<t.length;a++)i.header.push({text:t[a],tokens:this.lexer.inline(t[a]),header:!0,align:i.align[a]});for(let a of n)i.rows.push(ie(a,i.header.length).map((l,o)=>({text:l,tokens:this.lexer.inline(l),header:!1,align:i.align[o]})));return i}}lheading(r){let e=this.rules.block.lheading.exec(r);if(e){let t=e[1].trim();return{type:"heading",raw:$(e[0],`\n`),depth:e[2].charAt(0)==="="?1:2,text:t,tokens:this.lexer.inline(t)}}}paragraph(r){let e=this.rules.block.paragraph.exec(r);if(e){let t=e[1].charAt(e[1].length-1)===`\n`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(r){let e=this.rules.block.text.exec(r);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(r){let e=this.rules.inline.escape.exec(r);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(r){let e=this.rules.inline.tag.exec(r);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(r){let e=this.rules.inline.link.exec(r);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let i=$(t.slice(0,-1),"\\\\");if((t.length-i.length)%2===0)return}else{let i=it(e[2],"()");if(i===-2)return;if(i>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let s=e[2],n="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],n=i[3])}else n=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?s=s.slice(1):s=s.slice(1,-1)),ae(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(r,e){let t;if((t=this.rules.inline.reflink.exec(r))||(t=this.rules.inline.nolink.exec(r))){let s=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[s.toLowerCase()];if(!n){let i=t[0].charAt(0);return{type:"text",raw:i,text:i}}return ae(t,n,t[0],this.lexer,this.rules)}}emStrong(r,e,t=""){let s=this.rules.inline.emStrongLDelim.exec(r);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=0,c=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,e=e.slice(-1*r.length+n);(s=c.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(a=[...i].length,s[3]||s[4]){l+=a;continue}else if((s[5]||s[6])&&n%3&&!((n+a)%3)){o+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l+o);let p=[...s[0]][0].length,h=r.slice(0,n+s.index+p+a);if(Math.min(n,a)%2){let f=h.slice(1,-1);return{type:"em",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let u=h.slice(2,-2);return{type:"strong",raw:h,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(r){let e=this.rules.inline.code.exec(r);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(t),n=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return s&&n&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(r){let e=this.rules.inline.br.exec(r);if(e)return{type:"br",raw:e[0]}}del(r,e,t=""){let s=this.rules.inline.delLDelim.exec(r);if(s&&(!s[1]||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=this.rules.inline.delRDelim;for(o.lastIndex=0,e=e.slice(-1*r.length+n);(s=o.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(a=[...i].length,a!==n))continue;if(s[3]||s[4]){l+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l);let c=[...s[0]][0].length,p=r.slice(0,n+s.index+c+a),h=p.slice(n,-n);return{type:"del",raw:p,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(r){let e=this.rules.inline.autolink.exec(r);if(e){let t,s;return e[2]==="@"?(t=e[1],s="mailto:"+t):(t=e[1],s=t),{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}url(r){let e;if(e=this.rules.inline.url.exec(r)){let t,s;if(e[2]==="@")t=e[0],s="mailto:"+t;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);t=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}inlineText(r){let e=this.rules.inline.text.exec(r);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},b=class j{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new C,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:x,block:I.normal,inline:P.normal};this.options.pedantic?(t.block=I.pedantic,t.inline=P.pedantic):this.options.gfm&&(t.block=I.gfm,this.options.breaks?t.inline=P.breaks:t.inline=P.gfm),this.tokenizer.rules=t}static get rules(){return{block:I,inline:P}}static lex(e,t){return new j(t).lex(e)}static lexInline(e,t){return new j(t).inlineTokens(e)}lex(e){e=e.replace(x.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],s=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(x.tabCharGlobal," ").replace(x.spaceLine,""));let n=1/0;for(;e;){if(e.length<n)n=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let i;if(this.options.extensions?.block?.some(l=>(i=l.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let l=t.at(-1);i.raw.length===1&&l!==void 0?l.raw+=`\n`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.raw,this.inlineQueue.at(-1).src=l.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},t.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let l=1/0,o=e.slice(1),c;this.options.extensions.startBlock.forEach(p=>{c=p.call({lexer:this},o),typeof c=="number"&&c>=0&&(l=Math.min(l,c))}),l<1/0&&l>=0&&(a=e.substring(0,l+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let l=t.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i),s=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let s=e;if(this.tokens.links){let l=Object.keys(this.tokens.links);l.length>0&&(s=s.replace(this.tokenizer.rules.inline.reflinkSearch,o=>l.includes(o.slice(o.lastIndexOf("[")+1,-1))?"["+"a".repeat(o.length-2)+"]":o))}s=s.replace(this.tokenizer.rules.inline.anyPunctuation,"++"),s=s.replace(this.tokenizer.rules.inline.blockSkip,(l,o,c)=>{let p=c?c.length:0;return l.slice(0,p)+"["+"a".repeat(l.length-p-2)+"]"}),s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let n=!1,i="",a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}n||(i=""),n=!1;let l;if(this.options.extensions?.inline?.some(c=>(l=c.call({lexer:this},e,t))?(e=e.substring(l.raw.length),t.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let c=t.at(-1);l.type==="text"&&c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(l=this.tokenizer.emStrong(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.del(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),t.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),t.push(l);continue}let o=e;if(this.options.extensions?.startInline){let c=1/0,p=e.slice(1),h;this.options.extensions.startInline.forEach(u=>{h=u.call({lexer:this},p),typeof h=="number"&&h>=0&&(c=Math.min(c,h))}),c<1/0&&c>=0&&(o=e.substring(0,c+1))}if(l=this.tokenizer.inlineText(o)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(i=l.raw.slice(-1)),n=!0;let c=t.at(-1);c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},B=class{options;parser;constructor(r){this.options=r||T}space(r){return""}code({text:r,lang:e,escaped:t}){let s=(e||"").match(x.notSpaceStart)?.[0],n=r.replace(x.endingNewline,"")+`\n`;return s?\'<pre><code class="language-\'+m(s)+\'">\'+(t?n:m(n,!0))+`</code></pre>\n`:"<pre><code>"+(t?n:m(n,!0))+`</code></pre>\n`}blockquote({tokens:r}){return`<blockquote>\n${this.parser.parse(r)}</blockquote>\n`}html({text:r}){return r}def(r){return""}heading({tokens:r,depth:e}){return`<h${e}>${this.parser.parseInline(r)}</h${e}>\n`}hr(r){return`<hr>\n`}list(r){let e=r.ordered,t=r.start,s="";for(let a=0;a<r.items.length;a++){let l=r.items[a];s+=this.listitem(l)}let n=e?"ol":"ul",i=e&&t!==1?\' start="\'+t+\'"\':"";return"<"+n+i+`>\n`+s+"</"+n+`>\n`}listitem(r){return`<li>${this.parser.parse(r.tokens)}</li>\n`}checkbox({checked:r}){return"<input "+(r?\'checked="" \':"")+\'disabled="" type="checkbox"> \'}paragraph({tokens:r}){return`<p>${this.parser.parseInline(r)}</p>\n`}table(r){let e="",t="";for(let n=0;n<r.header.length;n++)t+=this.tablecell(r.header[n]);e+=this.tablerow({text:t});let s="";for(let n=0;n<r.rows.length;n++){let i=r.rows[n];t="";for(let a=0;a<i.length;a++)t+=this.tablecell(i[a]);s+=this.tablerow({text:t})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+e+`</thead>\n`+s+`</table>\n`}tablerow({text:r}){return`<tr>\n${r}</tr>\n`}tablecell(r){let e=this.parser.parseInline(r.tokens),t=r.header?"th":"td";return(r.align?`<${t} align="${r.align}">`:`<${t}>`)+e+`</${t}>\n`}strong({tokens:r}){return`<strong>${this.parser.parseInline(r)}</strong>`}em({tokens:r}){return`<em>${this.parser.parseInline(r)}</em>`}codespan({text:r}){return`<code>${m(r,!0)}</code>`}br(r){return"<br>"}del({tokens:r}){return`<del>${this.parser.parseInline(r)}</del>`}link({href:r,title:e,tokens:t}){let s=this.parser.parseInline(t),n=se(r);if(n===null)return s;r=n;let i=\'<a href="\'+r+\'"\';return e&&(i+=\' title="\'+m(e)+\'"\'),i+=">"+s+"</a>",i}image({href:r,title:e,text:t,tokens:s}){s&&(t=this.parser.parseInline(s,this.parser.textRenderer));let n=se(r);if(n===null)return m(t);r=n;let i=`<img src="${r}" alt="${m(t)}"`;return e&&(i+=` title="${m(e)}"`),i+=">",i}text(r){return"tokens"in r&&r.tokens?this.parser.parseInline(r.tokens):"escaped"in r&&r.escaped?r.text:m(r.text)}},J=class{strong({text:r}){return r}em({text:r}){return r}codespan({text:r}){return r}del({text:r}){return r}html({text:r}){return r}text({text:r}){return r}link({text:r}){return""+r}image({text:r}){return""+r}br(){return""}checkbox({raw:r}){return r}},w=class H{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new B,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new J}static parse(e,t){return new H(t).parse(e)}static parseInline(e,t){return new H(t).parseInline(e)}parse(e){this.renderer.parser=this;let t="";for(let s=0;s<e.length;s++){let n=e[s];if(this.options.extensions?.renderers?.[n.type]){let a=n,l=this.options.extensions.renderers[a.type].call({parser:this},a);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(a.type)){t+=l||"";continue}}let i=n;switch(i.type){case"space":{t+=this.renderer.space(i);break}case"hr":{t+=this.renderer.hr(i);break}case"heading":{t+=this.renderer.heading(i);break}case"code":{t+=this.renderer.code(i);break}case"table":{t+=this.renderer.table(i);break}case"blockquote":{t+=this.renderer.blockquote(i);break}case"list":{t+=this.renderer.list(i);break}case"checkbox":{t+=this.renderer.checkbox(i);break}case"html":{t+=this.renderer.html(i);break}case"def":{t+=this.renderer.def(i);break}case"paragraph":{t+=this.renderer.paragraph(i);break}case"text":{t+=this.renderer.text(i);break}default:{let a=\'Token with "\'+i.type+\'" type was not found.\';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let s="";for(let n=0;n<e.length;n++){let i=e[n];if(this.options.extensions?.renderers?.[i.type]){let l=this.options.extensions.renderers[i.type].call({parser:this},i);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){s+=l||"";continue}}let a=i;switch(a.type){case"escape":{s+=t.text(a);break}case"html":{s+=t.html(a);break}case"link":{s+=t.link(a);break}case"image":{s+=t.image(a);break}case"checkbox":{s+=t.checkbox(a);break}case"strong":{s+=t.strong(a);break}case"em":{s+=t.em(a);break}case"codespan":{s+=t.codespan(a);break}case"br":{s+=t.br(a);break}case"del":{s+=t.del(a);break}case"text":{s+=t.text(a);break}default:{let l=\'Token with "\'+a.type+\'" type was not found.\';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},L=class{options;block;constructor(r){this.options=r||T}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(r){return r}postprocess(r){return r}processAllTokens(r){return r}emStrongMask(r){return r}provideLexer(r=this.block){return r?b.lex:b.lexInline}provideParser(r=this.block){return r?w.parse:w.parseInline}},ot=class{defaults=O();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=w;Renderer=B;TextRenderer=J;Lexer=b;Tokenizer=C;Hooks=L;constructor(...r){this.use(...r)}walkTokens(r,e){let t=[];for(let s of r)switch(t=t.concat(e.call(this,s)),s.type){case"table":{let n=s;for(let i of n.header)t=t.concat(this.walkTokens(i.tokens,e));for(let i of n.rows)for(let a of i)t=t.concat(this.walkTokens(a.tokens,e));break}case"list":{let n=s;t=t.concat(this.walkTokens(n.items,e));break}default:{let n=s;this.defaults.extensions?.childTokens?.[n.type]?this.defaults.extensions.childTokens[n.type].forEach(i=>{let a=n[i].flat(1/0);t=t.concat(this.walkTokens(a,e))}):n.tokens&&(t=t.concat(this.walkTokens(n.tokens,e)))}}return t}use(...r){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(t=>{let s={...t};if(s.async=this.defaults.async||s.async||!1,t.extensions&&(t.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let i=e.renderers[n.name];i?e.renderers[n.name]=function(...a){let l=n.renderer.apply(this,a);return l===!1&&(l=i.apply(this,a)),l}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be \'block\' or \'inline\'");let i=e[n.level];i?i.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),s.extensions=e),t.renderer){let n=this.defaults.renderer||new B(this.defaults);for(let i in t.renderer){if(!(i in n))throw new Error(`renderer \'${i}\' does not exist`);if(["options","parser"].includes(i))continue;let a=i,l=t.renderer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p||""}}s.renderer=n}if(t.tokenizer){let n=this.defaults.tokenizer||new C(this.defaults);for(let i in t.tokenizer){if(!(i in n))throw new Error(`tokenizer \'${i}\' does not exist`);if(["options","rules","lexer"].includes(i))continue;let a=i,l=t.tokenizer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.tokenizer=n}if(t.hooks){let n=this.defaults.hooks||new L;for(let i in t.hooks){if(!(i in n))throw new Error(`hook \'${i}\' does not exist`);if(["options","block"].includes(i))continue;let a=i,l=t.hooks[a],o=n[a];L.passThroughHooks.has(i)?n[a]=c=>{if(this.defaults.async&&L.passThroughHooksRespectAsync.has(i))return(async()=>{let h=await l.call(n,c);return o.call(n,h)})();let p=l.call(n,c);return o.call(n,p)}:n[a]=(...c)=>{if(this.defaults.async)return(async()=>{let h=await l.apply(n,c);return h===!1&&(h=await o.apply(n,c)),h})();let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.hooks=n}if(t.walkTokens){let n=this.defaults.walkTokens,i=t.walkTokens;s.walkTokens=function(a){let l=[];return l.push(i.call(this,a)),n&&(l=l.concat(n.call(this,a))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,e){return b.lex(r,e??this.defaults)}parser(r,e){return w.parse(r,e??this.defaults)}parseMarkdown(r){return(e,t)=>{let s={...t},n={...this.defaults,...s},i=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&s.async===!1)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=r),n.async)return(async()=>{let a=n.hooks?await n.hooks.preprocess(e):e,l=await(n.hooks?await n.hooks.provideLexer(r):r?b.lex:b.lexInline)(a,n),o=n.hooks?await n.hooks.processAllTokens(l):l;n.walkTokens&&await Promise.all(this.walkTokens(o,n.walkTokens));let c=await(n.hooks?await n.hooks.provideParser(r):r?w.parse:w.parseInline)(o,n);return n.hooks?await n.hooks.postprocess(c):c})().catch(i);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer(r):r?b.lex:b.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let l=(n.hooks?n.hooks.provideParser(r):r?w.parse:w.parseInline)(a,n);return n.hooks&&(l=n.hooks.postprocess(l)),l}catch(a){return i(a)}}}onError(r,e){return t=>{if(t.message+=`\nPlease report this to https://github.com/markedjs/marked.`,r){let s="<p>An error occurred:</p><pre>"+m(t.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(t);throw t}}},S=new ot;function k(r,e){return S.parse(r,e)}k.options=k.setOptions=function(r){return S.setOptions(r),k.defaults=S.defaults,oe(k.defaults),k};k.getDefaults=O;k.defaults=T;k.use=function(...r){return S.use(...r),k.defaults=S.defaults,oe(k.defaults),k};k.walkTokens=function(r,e){return S.walkTokens(r,e)};k.parseInline=S.parseInline;k.Parser=w;k.parser=w.parse;k.Renderer=B;k.TextRenderer=J;k.Lexer=b;k.lexer=b.lex;k.Tokenizer=C;k.Hooks=L;k.parse=k;var ct=k.options,ht=k.setOptions,pt=k.use,ut=k.walkTokens,gt=k.parseInline;var kt=w.parse,dt=b.lex;k.use({extensions:[{name:"inlineMath",level:"inline",start(r){return r.match(/(?<![\\\\$])\\$(?![$\\s])/)?.index},tokenizer(r){let e=/^\\$(?![$\\s\\d])((?:\\\\\\$|[^$\\n])*?)(?<!\\s)\\$(?!\\d)/.exec(r);if(e)return{type:"inlineMath",raw:e[0],text:e[1].trim()}},renderer(r){return r.raw}}]});var D=new Map;self.onmessage=r=>{let e=r.data;if(typeof e!="object"||e===null)return;let{id:t,text:s,oldRaws:n,instance:i,baseVersion:a,dispose:l}=e;if(l===!0){typeof i=="string"&&D.delete(i);return}if(typeof s!="string")return;let o=typeof i=="string"?i:null,c=typeof a=="number"?a:null,p=null;if(Array.isArray(n))p=n;else if(o!==null&&c!==null){let h=D.get(o);if(h&&h.version===c)p=h.raws;else{self.postMessage({id:t,needRaws:!0});return}}try{let h=k.lexer(s),u=0;if(p){let f=Math.min(p.length,h.length);for(;u<f&&p[u]===h[u].raw;u++);}o!==null&&c!==null&&D.set(o,{version:c+1,raws:h.map(f=>f.raw)}),self.postMessage({id:t,matchLen:u,tail:h.slice(u)})}catch(h){o!==null&&D.delete(o),self.postMessage({id:t,error:String(h)})}};})();\n';
|
|
407
|
+
var WORKER_SOURCE_STRING = '"use strict";(()=>{function U(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var A=U();function he(r){A=r}var T={exec:()=>null};function L(r){let e=[];return t=>{let s=Math.max(0,Math.min(3,t-1)),n=e[s];return n||(n=r(s),e[s]=n),n}}function g(r,e=""){let t=typeof r=="string"?r:r.source,s={replace:(n,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(b.caret,"$1"),t=t.replace(n,a),s},getRegex:()=>new RegExp(t,e)};return s}var me=((r="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+r)}catch{return!1}})(),b={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^\'"]*[^\\s])\\s+([\'"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>"\']/,escapeReplace:/[&<>"\']/g,escapeTestNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:L(r=>new RegExp(`^ {0,${r}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ ][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:L(r=>new RegExp(`^ {0,${r}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),fencesBeginRegex:L(r=>new RegExp(`^ {0,${r}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:L(r=>new RegExp(`^ {0,${r}}#`)),htmlBeginRegex:L(r=>new RegExp(`^ {0,${r}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:L(r=>new RegExp(`^ {0,${r}}>`))},ye=/^(?:[ \\t]*(?:\\n|$))+/,$e=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,M=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Se=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,F=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,pe=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ue=g(pe).replace(/bull/g,F).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,"").getRegex(),Te=g(pe).replace(/bull/g,F).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),V=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,ze=/^[^\\n]+/,J=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ae=g(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace("label",J).replace("title",/(?:"(?:\\\\"?|[^"\\\\])*"|\'[^\'\\n]*(?:\\n[^\'\\n]+)*\\n?\'|\\([^()]*\\))/).getRegex(),Le=g(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,F).getRegex(),j="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",K=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,_e=g("^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$))","i").replace("comment",K).replace("tag",j).replace("attribute",/ +[a-zA-Z:_][\\w.:-]*(?: *= *"[^"\\n]*"| *= *\'[^\'\\n]*\'| *= *[^\\s"\'=<>`]+)?/).getRegex(),ge=r=>g(V).replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list",r).replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",j).getRegex(),Pe=ge(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),ve=ge(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Ie=g(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace("paragraph",ve).getRegex(),Y={blockquote:Ie,code:$e,def:Ae,fences:Re,heading:Se,hr:M,html:_e,lheading:ue,list:Le,newline:ye,paragraph:Pe,table:T,text:ze},ne=g("^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)").replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",j).getRegex(),Ce={...Y,lheading:Te,table:ne,paragraph:g(V).replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("table",ne).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",j).getRegex()},Ee={...Y,html:g(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:"[^"]*"|\'[^\']*\'|\\\\s[^\'"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace("comment",K).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +(["(][^\\n]+[")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:T,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:g(V).replace("hr",M).replace("heading",` *#{1,6} *[^\n]`).replace("lheading",ue).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Me=/^\\\\([!"#$%&\'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Be=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ke=/^( {2,}|\\\\)\\n(?!\\s*$)/,qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,_=/[\\p{P}\\p{S}]/u,H=/[\\s\\p{P}\\p{S}]/u,ee=/[^\\s\\p{P}\\p{S}]/u,Ze=g(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,H).getRegex(),fe=/(?!~)[\\p{P}\\p{S}]/u,De=/(?!~)[\\s\\p{P}\\p{S}]/u,Qe=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Ne=g(/link|precode-code|html/,"g").replace("link",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace("precode-",me?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),de=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,je=g(de,"u").replace(/punct/g,_).getRegex(),He=g(de,"u").replace(/punct/g,fe).getRegex(),xe="^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)",Oe=g(xe,"gu").replace(/notPunctSpace/g,ee).replace(/punctSpace/g,H).replace(/punct/g,_).getRegex(),Ge=g(xe,"gu").replace(/notPunctSpace/g,Qe).replace(/punctSpace/g,De).replace(/punct/g,fe).getRegex(),We=g("^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,ee).replace(/punctSpace/g,H).replace(/punct/g,_).getRegex(),Xe=g(/^~~?(?:((?!~)punct)|[^\\s~])/,"u").replace(/punct/g,_).getRegex(),Ue="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Fe=g(Ue,"gu").replace(/notPunctSpace/g,ee).replace(/punctSpace/g,H).replace(/punct/g,_).getRegex(),Ve=g(/\\\\(punct)/,"gu").replace(/punct/g,_).getRegex(),Je=g(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&\'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Ke=g(K).replace("(?:-->|$)","-->").getRegex(),Ye=g("^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>").replace("comment",Ke).replace("attribute",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*"[^"]*"|\\s*=\\s*\'[^\']*\'|\\s*=\\s*[^\\s"\'=<>`]+)?/).getRegex(),D=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,et=g(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace("label",D).replace("href",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace("title",/"(?:\\\\"?|[^"\\\\])*"|\'(?:\\\\\'?|[^\'\\\\])*\'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),be=g(/^!?\\[(label)\\]\\[(ref)\\]/).replace("label",D).replace("ref",J).getRegex(),we=g(/^!?\\[(ref)\\](?:\\[\\])?/).replace("ref",J).getRegex(),tt=g("reflink|nolink(?!\\\\()","g").replace("reflink",be).replace("nolink",we).getRegex(),se=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,te={_backpedal:T,anyPunctuation:Ve,autolink:Je,blockSkip:Ne,br:ke,code:Be,del:T,delLDelim:T,delRDelim:T,emStrongLDelim:je,emStrongRDelimAst:Oe,emStrongRDelimUnd:We,escape:Me,link:et,nolink:we,punctuation:Ze,reflink:be,reflinkSearch:tt,tag:Ye,text:qe,url:T},rt={...te,link:g(/^!?\\[(label)\\]\\((.*?)\\)/).replace("label",D).getRegex(),reflink:g(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace("label",D).getRegex()},G={...te,emStrongRDelimAst:Ge,emStrongLDelim:He,delLDelim:Xe,delRDelim:Fe,url:g(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace("protocol",se).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_\'"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_\'"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:g(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)))/).replace("protocol",se).getRegex()},nt={...G,br:g(ke).replace("{2,}","*").getRegex(),text:g(G.text).replace("\\\\b_","\\\\b_| {2,}\\\\n").replace(/\\{2,\\}/g,"*").getRegex()},Z={normal:Y,gfm:Ce,pedantic:Ee},C={normal:te,gfm:G,breaks:nt,pedantic:rt},st={"&":"&","<":"<",">":">",\'"\':""","\'":"'"},ie=r=>st[r];function y(r,e){if(e){if(b.escapeTest.test(r))return r.replace(b.escapeReplace,ie)}else if(b.escapeTestNoEncode.test(r))return r.replace(b.escapeReplaceNoEncode,ie);return r}function le(r){try{r=encodeURI(r).replace(b.percentDecode,"%")}catch{return null}return r}function ae(r,e){let t=r.replace(b.findPipe,(i,a,l)=>{let o=!1,c=a;for(;--c>=0&&l[c]==="\\\\";)o=!o;return o?"|":" |"}),s=t.split(b.splitPipe),n=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(b.slashPipe,"|");return s}function S(r,e,t){let s=r.length;if(s===0)return"";let n=0;for(;n<s;){let i=r.charAt(s-n-1);if(i===e&&!t)n++;else if(i!==e&&t)n++;else break}return r.slice(0,s-n)}function oe(r){let e=r.split(`\n`),t=e.length-1;for(;t>=0&&b.blankLine.test(e[t]);)t--;return e.length-t<=2?r:e.slice(0,t+1).join(`\n`)}function it(r,e){if(r.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<r.length;s++)if(r[s]==="\\\\")s++;else if(r[s]===e[0])t++;else if(r[s]===e[1]&&(t--,t<0))return s;return t>0?-2:-1}function lt(r,e=0){let t=e,s="";for(let n of r)if(n===" "){let i=4-t%4;s+=" ".repeat(i),t+=i}else s+=n,t++;return s}function ce(r,e,t,s,n){let i=e.href,a=e.title||null,l=r[1].replace(n.other.outputLinkReplace,"$1");s.state.inLink=!0;let o={type:r[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:a,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,o}function at(r,e,t){let s=r.match(t.other.indentCodeCompensation);if(s===null)return e;let n=s[1];return e.split(`\n`).map(i=>{let a=i.match(t.other.beginningSpace);if(a===null)return i;let[l]=a;return l.length>=n.length?i.slice(n.length):i}).join(`\n`)}var Q=class{options;rules;lexer;constructor(r){this.options=r||A}space(r){let e=this.rules.block.newline.exec(r);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(r){let e=this.rules.block.code.exec(r);if(e){let t=this.options.pedantic?e[0]:oe(e[0]),s=t.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t,codeBlockStyle:"indented",text:s}}}fences(r){let e=this.rules.block.fences.exec(r);if(e){let t=e[0],s=at(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(r){let e=this.rules.block.heading.exec(r);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){let s=S(t,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(t=s.trim())}return{type:"heading",raw:S(e[0],`\n`),depth:e[1].length,text:t,tokens:this.lexer.inline(t)}}}hr(r){let e=this.rules.block.hr.exec(r);if(e)return{type:"hr",raw:S(e[0],`\n`)}}blockquote(r){let e=this.rules.block.blockquote.exec(r);if(e){let t=S(e[0],`\n`).split(`\n`),s="",n="",i=[];for(;t.length>0;){let a=!1,l=[],o;for(o=0;o<t.length;o++)if(this.rules.other.blockquoteStart.test(t[o]))l.push(t[o]),a=!0;else if(!a)l.push(t[o]);else break;t=t.slice(o);let c=l.join(`\n`),p=c.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}\n${c}`:c,n=n?`${n}\n${p}`:p;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(p,i,!0),this.lexer.state.top=h,t.length===0)break;let u=i.at(-1);if(u?.type==="code")break;if(u?.type==="blockquote"){let x=u,f=x.raw+`\n`+t.join(`\n`),d=this.blockquote(f);i[i.length-1]=d,s=s.substring(0,s.length-x.raw.length)+d.raw,n=n.substring(0,n.length-x.text.length)+d.text;break}else if(u?.type==="list"){let x=u,f=x.raw+`\n`+t.join(`\n`),d=this.list(f);i[i.length-1]=d,s=s.substring(0,s.length-u.raw.length)+d.raw,n=n.substring(0,n.length-x.raw.length)+d.raw,t=f.substring(i.at(-1).raw.length).split(`\n`);continue}}return{type:"blockquote",raw:s,tokens:i,text:n}}}list(r){let e=this.rules.block.list.exec(r);if(e){let t=e[1].trim(),s=t.length>1,n={type:"list",raw:"",ordered:s,start:s?+t.slice(0,-1):"",loose:!1,items:[]};t=s?`\\\\d{1,9}\\\\${t.slice(-1)}`:`\\\\${t}`,this.options.pedantic&&(t=s?t:"[*+-]");let i=this.rules.other.listItemRegex(t),a=!1;for(;r;){let o=!1,c="",p="";if(!(e=i.exec(r))||this.rules.block.hr.test(r))break;c=e[0],r=r.substring(c.length);let h=lt(e[2].split(`\n`,1)[0],e[1].length),u=r.split(`\n`,1)[0],x=!h.trim(),f=0;if(this.options.pedantic?(f=2,p=h.trimStart()):x?f=e[1].length+1:(f=h.search(this.rules.other.nonSpaceChar),f=f>4?1:f,p=h.slice(f),f+=e[1].length),x&&this.rules.other.blankLine.test(u)&&(c+=u+`\n`,r=r.substring(u.length+1),o=!0),!o){let d=this.rules.other.nextBulletRegex(f),B=this.rules.other.hrRegex(f),$=this.rules.other.fencesBeginRegex(f),q=this.rules.other.headingBeginRegex(f),R=this.rules.other.htmlBeginRegex(f),v=this.rules.other.blockquoteBeginRegex(f);for(;r;){let O=r.split(`\n`,1)[0],I;if(u=O,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),I=u):I=u.replace(this.rules.other.tabCharGlobal," "),$.test(u)||q.test(u)||R.test(u)||v.test(u)||d.test(u)||B.test(u))break;if(I.search(this.rules.other.nonSpaceChar)>=f||!u.trim())p+=`\n`+I.slice(f);else{if(x||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||$.test(h)||q.test(h)||B.test(h))break;p+=`\n`+u}x=!u.trim(),c+=O+`\n`,r=r.substring(O.length+1),h=I.slice(f)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(a=!0)),n.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(p),loose:!1,text:p,tokens:[]}),n.raw+=c}let l=n.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let o of n.items){this.lexer.state.top=!1,o.tokens=this.lexer.blockTokens(o.text,[]);let c=o.tokens[0];if(o.task&&(c?.type==="text"||c?.type==="paragraph")){o.text=o.text.replace(this.rules.other.listReplaceTask,""),c.raw=c.raw.replace(this.rules.other.listReplaceTask,""),c.text=c.text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}let p=this.rules.other.listTaskCheckbox.exec(o.raw);if(p){let h={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};o.checked=h.checked,n.loose?o.tokens[0]&&["paragraph","text"].includes(o.tokens[0].type)&&"tokens"in o.tokens[0]&&o.tokens[0].tokens?(o.tokens[0].raw=h.raw+o.tokens[0].raw,o.tokens[0].text=h.raw+o.tokens[0].text,o.tokens[0].tokens.unshift(h)):o.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):o.tokens.unshift(h)}}else o.task&&(o.task=!1);if(!n.loose){let p=o.tokens.filter(u=>u.type==="space"),h=p.length>0&&p.some(u=>this.rules.other.anyLine.test(u.raw));n.loose=h}}if(n.loose)for(let o of n.items){o.loose=!0;for(let c of o.tokens)c.type==="text"&&(c.type="paragraph")}return n}}html(r){let e=this.rules.block.html.exec(r);if(e){let t=oe(e[0]);return{type:"html",block:!0,raw:t,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:t}}}def(r){let e=this.rules.block.def.exec(r);if(e){let t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:S(e[0],`\n`),href:s,title:n}}}table(r){let e=this.rules.block.table.exec(r);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let t=ae(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`\n`):[],i={type:"table",raw:S(e[0],`\n`),header:[],align:[],rows:[]};if(t.length===s.length){for(let a of s)this.rules.other.tableAlignRight.test(a)?i.align.push("right"):this.rules.other.tableAlignCenter.test(a)?i.align.push("center"):this.rules.other.tableAlignLeft.test(a)?i.align.push("left"):i.align.push(null);for(let a=0;a<t.length;a++)i.header.push({text:t[a],tokens:this.lexer.inline(t[a]),header:!0,align:i.align[a]});for(let a of n)i.rows.push(ae(a,i.header.length).map((l,o)=>({text:l,tokens:this.lexer.inline(l),header:!1,align:i.align[o]})));return i}}lheading(r){let e=this.rules.block.lheading.exec(r);if(e){let t=e[1].trim();return{type:"heading",raw:S(e[0],`\n`),depth:e[2].charAt(0)==="="?1:2,text:t,tokens:this.lexer.inline(t)}}}paragraph(r){let e=this.rules.block.paragraph.exec(r);if(e){let t=e[1].charAt(e[1].length-1)===`\n`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(r){let e=this.rules.block.text.exec(r);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(r){let e=this.rules.inline.escape.exec(r);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(r){let e=this.rules.inline.tag.exec(r);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(r){let e=this.rules.inline.link.exec(r);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let i=S(t.slice(0,-1),"\\\\");if((t.length-i.length)%2===0)return}else{let i=it(e[2],"()");if(i===-2)return;if(i>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let s=e[2],n="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],n=i[3])}else n=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?s=s.slice(1):s=s.slice(1,-1)),ce(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(r,e){let t;if((t=this.rules.inline.reflink.exec(r))||(t=this.rules.inline.nolink.exec(r))){let s=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[s.toLowerCase()];if(!n){let i=t[0].charAt(0);return{type:"text",raw:i,text:i}}return ce(t,n,t[0],this.lexer,this.rules)}}emStrong(r,e,t=""){let s=this.rules.inline.emStrongLDelim.exec(r);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=0,c=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,e=e.slice(-1*r.length+n);(s=c.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(a=[...i].length,s[3]||s[4]){l+=a;continue}else if((s[5]||s[6])&&n%3&&!((n+a)%3)){o+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l+o);let p=[...s[0]][0].length,h=r.slice(0,n+s.index+p+a);if(Math.min(n,a)%2){let x=h.slice(1,-1);return{type:"em",raw:h,text:x,tokens:this.lexer.inlineTokens(x)}}let u=h.slice(2,-2);return{type:"strong",raw:h,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(r){let e=this.rules.inline.code.exec(r);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(t),n=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return s&&n&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(r){let e=this.rules.inline.br.exec(r);if(e)return{type:"br",raw:e[0]}}del(r,e,t=""){let s=this.rules.inline.delLDelim.exec(r);if(s&&(!s[1]||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=this.rules.inline.delRDelim;for(o.lastIndex=0,e=e.slice(-1*r.length+n);(s=o.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(a=[...i].length,a!==n))continue;if(s[3]||s[4]){l+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l);let c=[...s[0]][0].length,p=r.slice(0,n+s.index+c+a),h=p.slice(n,-n);return{type:"del",raw:p,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(r){let e=this.rules.inline.autolink.exec(r);if(e){let t,s;return e[2]==="@"?(t=e[1],s="mailto:"+t):(t=e[1],s=t),{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}url(r){let e;if(e=this.rules.inline.url.exec(r)){let t,s;if(e[2]==="@")t=e[0],s="mailto:"+t;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);t=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}inlineText(r){let e=this.rules.inline.text.exec(r);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},w=class W{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||A,this.options.tokenizer=this.options.tokenizer||new Q,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:b,block:Z.normal,inline:C.normal};this.options.pedantic?(t.block=Z.pedantic,t.inline=C.pedantic):this.options.gfm&&(t.block=Z.gfm,this.options.breaks?t.inline=C.breaks:t.inline=C.gfm),this.tokenizer.rules=t}static get rules(){return{block:Z,inline:C}}static lex(e,t){return new W(t).lex(e)}static lexInline(e,t){return new W(t).inlineTokens(e)}lex(e){e=e.replace(b.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],s=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(b.tabCharGlobal," ").replace(b.spaceLine,""));let n=1/0;for(;e;){if(e.length<n)n=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let i;if(this.options.extensions?.block?.some(l=>(i=l.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let l=t.at(-1);i.raw.length===1&&l!==void 0?l.raw+=`\n`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.raw,this.inlineQueue.at(-1).src=l.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},t.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let l=1/0,o=e.slice(1),c;this.options.extensions.startBlock.forEach(p=>{c=p.call({lexer:this},o),typeof c=="number"&&c>=0&&(l=Math.min(l,c))}),l<1/0&&l>=0&&(a=e.substring(0,l+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let l=t.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i),s=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let s=e;if(this.tokens.links){let l=Object.keys(this.tokens.links);l.length>0&&(s=s.replace(this.tokenizer.rules.inline.reflinkSearch,o=>l.includes(o.slice(o.lastIndexOf("[")+1,-1))?"["+"a".repeat(o.length-2)+"]":o))}s=s.replace(this.tokenizer.rules.inline.anyPunctuation,"++"),s=s.replace(this.tokenizer.rules.inline.blockSkip,(l,o,c)=>{let p=c?c.length:0;return l.slice(0,p)+"["+"a".repeat(l.length-p-2)+"]"}),s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let n=!1,i="",a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}n||(i=""),n=!1;let l;if(this.options.extensions?.inline?.some(c=>(l=c.call({lexer:this},e,t))?(e=e.substring(l.raw.length),t.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let c=t.at(-1);l.type==="text"&&c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(l=this.tokenizer.emStrong(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.del(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),t.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),t.push(l);continue}let o=e;if(this.options.extensions?.startInline){let c=1/0,p=e.slice(1),h;this.options.extensions.startInline.forEach(u=>{h=u.call({lexer:this},p),typeof h=="number"&&h>=0&&(c=Math.min(c,h))}),c<1/0&&c>=0&&(o=e.substring(0,c+1))}if(l=this.tokenizer.inlineText(o)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(i=l.raw.slice(-1)),n=!0;let c=t.at(-1);c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},N=class{options;parser;constructor(r){this.options=r||A}space(r){return""}code({text:r,lang:e,escaped:t}){let s=(e||"").match(b.notSpaceStart)?.[0],n=r.replace(b.endingNewline,"")+`\n`;return s?\'<pre><code class="language-\'+y(s)+\'">\'+(t?n:y(n,!0))+`</code></pre>\n`:"<pre><code>"+(t?n:y(n,!0))+`</code></pre>\n`}blockquote({tokens:r}){return`<blockquote>\n${this.parser.parse(r)}</blockquote>\n`}html({text:r}){return r}def(r){return""}heading({tokens:r,depth:e}){return`<h${e}>${this.parser.parseInline(r)}</h${e}>\n`}hr(r){return`<hr>\n`}list(r){let e=r.ordered,t=r.start,s="";for(let a=0;a<r.items.length;a++){let l=r.items[a];s+=this.listitem(l)}let n=e?"ol":"ul",i=e&&t!==1?\' start="\'+t+\'"\':"";return"<"+n+i+`>\n`+s+"</"+n+`>\n`}listitem(r){return`<li>${this.parser.parse(r.tokens)}</li>\n`}checkbox({checked:r}){return"<input "+(r?\'checked="" \':"")+\'disabled="" type="checkbox"> \'}paragraph({tokens:r}){return`<p>${this.parser.parseInline(r)}</p>\n`}table(r){let e="",t="";for(let n=0;n<r.header.length;n++)t+=this.tablecell(r.header[n]);e+=this.tablerow({text:t});let s="";for(let n=0;n<r.rows.length;n++){let i=r.rows[n];t="";for(let a=0;a<i.length;a++)t+=this.tablecell(i[a]);s+=this.tablerow({text:t})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+e+`</thead>\n`+s+`</table>\n`}tablerow({text:r}){return`<tr>\n${r}</tr>\n`}tablecell(r){let e=this.parser.parseInline(r.tokens),t=r.header?"th":"td";return(r.align?`<${t} align="${r.align}">`:`<${t}>`)+e+`</${t}>\n`}strong({tokens:r}){return`<strong>${this.parser.parseInline(r)}</strong>`}em({tokens:r}){return`<em>${this.parser.parseInline(r)}</em>`}codespan({text:r}){return`<code>${y(r,!0)}</code>`}br(r){return"<br>"}del({tokens:r}){return`<del>${this.parser.parseInline(r)}</del>`}link({href:r,title:e,tokens:t}){let s=this.parser.parseInline(t),n=le(r);if(n===null)return s;r=n;let i=\'<a href="\'+r+\'"\';return e&&(i+=\' title="\'+y(e)+\'"\'),i+=">"+s+"</a>",i}image({href:r,title:e,text:t,tokens:s}){s&&(t=this.parser.parseInline(s,this.parser.textRenderer));let n=le(r);if(n===null)return y(t);r=n;let i=`<img src="${r}" alt="${y(t)}"`;return e&&(i+=` title="${y(e)}"`),i+=">",i}text(r){return"tokens"in r&&r.tokens?this.parser.parseInline(r.tokens):"escaped"in r&&r.escaped?r.text:y(r.text)}},re=class{strong({text:r}){return r}em({text:r}){return r}codespan({text:r}){return r}del({text:r}){return r}html({text:r}){return r}text({text:r}){return r}link({text:r}){return""+r}image({text:r}){return""+r}br(){return""}checkbox({raw:r}){return r}},m=class X{options;renderer;textRenderer;constructor(e){this.options=e||A,this.options.renderer=this.options.renderer||new N,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new re}static parse(e,t){return new X(t).parse(e)}static parseInline(e,t){return new X(t).parseInline(e)}parse(e){this.renderer.parser=this;let t="";for(let s=0;s<e.length;s++){let n=e[s];if(this.options.extensions?.renderers?.[n.type]){let a=n,l=this.options.extensions.renderers[a.type].call({parser:this},a);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(a.type)){t+=l||"";continue}}let i=n;switch(i.type){case"space":{t+=this.renderer.space(i);break}case"hr":{t+=this.renderer.hr(i);break}case"heading":{t+=this.renderer.heading(i);break}case"code":{t+=this.renderer.code(i);break}case"table":{t+=this.renderer.table(i);break}case"blockquote":{t+=this.renderer.blockquote(i);break}case"list":{t+=this.renderer.list(i);break}case"checkbox":{t+=this.renderer.checkbox(i);break}case"html":{t+=this.renderer.html(i);break}case"def":{t+=this.renderer.def(i);break}case"paragraph":{t+=this.renderer.paragraph(i);break}case"text":{t+=this.renderer.text(i);break}default:{let a=\'Token with "\'+i.type+\'" type was not found.\';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let s="";for(let n=0;n<e.length;n++){let i=e[n];if(this.options.extensions?.renderers?.[i.type]){let l=this.options.extensions.renderers[i.type].call({parser:this},i);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){s+=l||"";continue}}let a=i;switch(a.type){case"escape":{s+=t.text(a);break}case"html":{s+=t.html(a);break}case"link":{s+=t.link(a);break}case"image":{s+=t.image(a);break}case"checkbox":{s+=t.checkbox(a);break}case"strong":{s+=t.strong(a);break}case"em":{s+=t.em(a);break}case"codespan":{s+=t.codespan(a);break}case"br":{s+=t.br(a);break}case"del":{s+=t.del(a);break}case"text":{s+=t.text(a);break}default:{let l=\'Token with "\'+a.type+\'" type was not found.\';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},E=class{options;block;constructor(r){this.options=r||A}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(r){return r}postprocess(r){return r}processAllTokens(r){return r}emStrongMask(r){return r}provideLexer(r=this.block){return r?w.lex:w.lexInline}provideParser(r=this.block){return r?m.parse:m.parseInline}},ot=class{defaults=U();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=m;Renderer=N;TextRenderer=re;Lexer=w;Tokenizer=Q;Hooks=E;constructor(...r){this.use(...r)}walkTokens(r,e){let t=[];for(let s of r)switch(t=t.concat(e.call(this,s)),s.type){case"table":{let n=s;for(let i of n.header)t=t.concat(this.walkTokens(i.tokens,e));for(let i of n.rows)for(let a of i)t=t.concat(this.walkTokens(a.tokens,e));break}case"list":{let n=s;t=t.concat(this.walkTokens(n.items,e));break}default:{let n=s;this.defaults.extensions?.childTokens?.[n.type]?this.defaults.extensions.childTokens[n.type].forEach(i=>{let a=n[i].flat(1/0);t=t.concat(this.walkTokens(a,e))}):n.tokens&&(t=t.concat(this.walkTokens(n.tokens,e)))}}return t}use(...r){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(t=>{let s={...t};if(s.async=this.defaults.async||s.async||!1,t.extensions&&(t.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let i=e.renderers[n.name];i?e.renderers[n.name]=function(...a){let l=n.renderer.apply(this,a);return l===!1&&(l=i.apply(this,a)),l}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be \'block\' or \'inline\'");let i=e[n.level];i?i.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),s.extensions=e),t.renderer){let n=this.defaults.renderer||new N(this.defaults);for(let i in t.renderer){if(!(i in n))throw new Error(`renderer \'${i}\' does not exist`);if(["options","parser"].includes(i))continue;let a=i,l=t.renderer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p||""}}s.renderer=n}if(t.tokenizer){let n=this.defaults.tokenizer||new Q(this.defaults);for(let i in t.tokenizer){if(!(i in n))throw new Error(`tokenizer \'${i}\' does not exist`);if(["options","rules","lexer"].includes(i))continue;let a=i,l=t.tokenizer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.tokenizer=n}if(t.hooks){let n=this.defaults.hooks||new E;for(let i in t.hooks){if(!(i in n))throw new Error(`hook \'${i}\' does not exist`);if(["options","block"].includes(i))continue;let a=i,l=t.hooks[a],o=n[a];E.passThroughHooks.has(i)?n[a]=c=>{if(this.defaults.async&&E.passThroughHooksRespectAsync.has(i))return(async()=>{let h=await l.call(n,c);return o.call(n,h)})();let p=l.call(n,c);return o.call(n,p)}:n[a]=(...c)=>{if(this.defaults.async)return(async()=>{let h=await l.apply(n,c);return h===!1&&(h=await o.apply(n,c)),h})();let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.hooks=n}if(t.walkTokens){let n=this.defaults.walkTokens,i=t.walkTokens;s.walkTokens=function(a){let l=[];return l.push(i.call(this,a)),n&&(l=l.concat(n.call(this,a))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,e){return w.lex(r,e??this.defaults)}parser(r,e){return m.parse(r,e??this.defaults)}parseMarkdown(r){return(e,t)=>{let s={...t},n={...this.defaults,...s},i=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&s.async===!1)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=r),n.async)return(async()=>{let a=n.hooks?await n.hooks.preprocess(e):e,l=await(n.hooks?await n.hooks.provideLexer(r):r?w.lex:w.lexInline)(a,n),o=n.hooks?await n.hooks.processAllTokens(l):l;n.walkTokens&&await Promise.all(this.walkTokens(o,n.walkTokens));let c=await(n.hooks?await n.hooks.provideParser(r):r?m.parse:m.parseInline)(o,n);return n.hooks?await n.hooks.postprocess(c):c})().catch(i);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer(r):r?w.lex:w.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let l=(n.hooks?n.hooks.provideParser(r):r?m.parse:m.parseInline)(a,n);return n.hooks&&(l=n.hooks.postprocess(l)),l}catch(a){return i(a)}}}onError(r,e){return t=>{if(t.message+=`\nPlease report this to https://github.com/markedjs/marked.`,r){let s="<p>An error occurred:</p><pre>"+y(t.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(t);throw t}}},z=new ot;function k(r,e){return z.parse(r,e)}k.options=k.setOptions=function(r){return z.setOptions(r),k.defaults=z.defaults,he(k.defaults),k};k.getDefaults=U;k.defaults=A;k.use=function(...r){return z.use(...r),k.defaults=z.defaults,he(k.defaults),k};k.walkTokens=function(r,e){return z.walkTokens(r,e)};k.parseInline=z.parseInline;k.Parser=m;k.parser=m.parse;k.Renderer=N;k.TextRenderer=re;k.Lexer=w;k.lexer=w.lex;k.Tokenizer=Q;k.Hooks=E;k.parse=k;var ut=k.options,gt=k.setOptions,kt=k.use,ft=k.walkTokens,dt=k.parseInline;var xt=m.parse,bt=w.lex;var ct=0;function ht(r){if(typeof r!="string"||typeof performance.mark!="function"||typeof performance.measure!="function")return null;let e=ct++,t={name:r,startMark:`${r}:start:${e}`,endMark:`${r}:end:${e}`};try{return performance.mark(t.startMark),t}catch{return null}}function pt(r){if(r)try{performance.mark(r.endMark),performance.measure(r.name,r.startMark,r.endMark)}catch{}finally{try{performance.clearMarks?.(r.startMark),performance.clearMarks?.(r.endMark)}catch{}}}k.use({extensions:[{name:"inlineMath",level:"inline",start(r){return r.match(/(?<![\\\\$])\\$(?![$\\s])/)?.index},tokenizer(r){let e=/^\\$(?![$\\s\\d])((?:\\\\\\$|[^$\\n])*?)(?<!\\s)\\$(?!\\d)/.exec(r);if(e)return{type:"inlineMath",raw:e[0],text:e[1].trim()}},renderer(r){return r.raw}}]});var P=new Map;self.onmessage=r=>{let e=r.data;if(typeof e!="object"||e===null)return;let{id:t,text:s,append:n,expectedLength:i,oldRaws:a,instance:l,baseVersion:o,dispose:c,userTimingName:p}=e;if(c===!0){typeof l=="string"&&P.delete(l);return}let h=typeof l=="string"?l:null,u=typeof o=="number"?o:null,x,f=null;if(typeof n=="string"){if(h===null||u===null){self.postMessage({id:t,needResync:!0});return}let d=P.get(h);if(!d||d.version!==u){self.postMessage({id:t,needResync:!0});return}if(x=d.source+n,typeof i=="number"&&x.length!==i){P.delete(h),self.postMessage({id:t,needResync:!0});return}f=d.raws}else if(typeof s=="string"){if(x=s,Array.isArray(a))f=a;else if(h!==null&&u!==null){let d=P.get(h);if(d&&d.version===u)f=d.raws;else{self.postMessage({id:t,needResync:!0});return}}}else return;try{let d=typeof p=="string"?ht(p):null,B=performance.now(),$;try{$=k.lexer(x)}finally{d&&pt(d)}let q=performance.now()-B,R=0;if(f){let v=Math.min(f.length,$.length);for(;R<v&&f[R]===$[R].raw;R++);}h!==null&&u!==null&&P.set(h,{version:u+1,raws:$.map(v=>v.raw),source:x}),self.postMessage({id:t,matchLen:R,tail:$.slice(R),lexerMs:q,sourceCharsLexed:x.length})}catch(d){h!==null&&P.delete(h),self.postMessage({id:t,error:String(d)})}};})();\n';
|
|
20
408
|
|
|
21
409
|
// src/Markdown.ts
|
|
22
410
|
var now = () => typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
411
|
+
function lexMarkdown(text, userTiming) {
|
|
412
|
+
if (!userTiming) return marked.lexer(text);
|
|
413
|
+
const timing = beginVectoUserTiming(VECTO_USER_TIMING.markdown.parse);
|
|
414
|
+
try {
|
|
415
|
+
return marked.lexer(text);
|
|
416
|
+
} finally {
|
|
417
|
+
if (timing) endVectoUserTiming(timing);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
23
420
|
marked.use({
|
|
24
421
|
extensions: [
|
|
25
422
|
{
|
|
@@ -73,7 +470,7 @@ var workerInstanceCounter = 0;
|
|
|
73
470
|
var workerCallbacks = /* @__PURE__ */ new Map();
|
|
74
471
|
function runSyncFallback(entry) {
|
|
75
472
|
try {
|
|
76
|
-
entry.cb(0,
|
|
473
|
+
entry.cb(0, lexMarkdown(entry.text, entry.userTiming), true);
|
|
77
474
|
} catch (err) {
|
|
78
475
|
console.warn("Markdown sync fallback parse failed", err);
|
|
79
476
|
}
|
|
@@ -85,16 +482,19 @@ if (typeof Worker !== "undefined") {
|
|
|
85
482
|
});
|
|
86
483
|
markdownWorker = new Worker(URL.createObjectURL(blob));
|
|
87
484
|
markdownWorker.onmessage = (e) => {
|
|
88
|
-
const { id, matchLen, tail, error,
|
|
485
|
+
const { id, matchLen, tail, error, needResync, lexerMs, sourceCharsLexed } = e.data;
|
|
89
486
|
const entry = workerCallbacks.get(id);
|
|
90
487
|
if (entry) {
|
|
91
488
|
workerCallbacks.delete(id);
|
|
92
|
-
if (
|
|
93
|
-
entry.
|
|
94
|
-
} else if (
|
|
489
|
+
if (needResync && entry.onNeedResync) {
|
|
490
|
+
entry.onNeedResync();
|
|
491
|
+
} else if (needResync) {
|
|
95
492
|
runSyncFallback(entry);
|
|
96
493
|
} else if (!error) {
|
|
97
|
-
entry.cb(matchLen, tail
|
|
494
|
+
entry.cb(matchLen, tail, false, {
|
|
495
|
+
lexerMs: typeof lexerMs === "number" ? lexerMs : 0,
|
|
496
|
+
sourceCharsLexed: typeof sourceCharsLexed === "number" ? sourceCharsLexed : 0
|
|
497
|
+
});
|
|
98
498
|
} else {
|
|
99
499
|
runSyncFallback(entry);
|
|
100
500
|
}
|
|
@@ -721,8 +1121,19 @@ var Markdown = class extends UIComponent {
|
|
|
721
1121
|
theme;
|
|
722
1122
|
onLinkClick;
|
|
723
1123
|
selectable;
|
|
1124
|
+
activeBlockMetrics = null;
|
|
1125
|
+
/**
|
|
1126
|
+
* Called after a streamed append has re-laid-out the document.
|
|
1127
|
+
*
|
|
1128
|
+
* Not required for a `VirtualList` to track a streaming row's height: the list
|
|
1129
|
+
* re-reads `height` on every mounted row each frame, so it sees this entity grow
|
|
1130
|
+
* without being told. Prefer that over wiring this up — it fires from the append
|
|
1131
|
+
* path only, **not** from `setContent()`, so it is not a complete size signal.
|
|
1132
|
+
*/
|
|
724
1133
|
onLayoutUpdated;
|
|
725
1134
|
rawMarkdown;
|
|
1135
|
+
streamController = null;
|
|
1136
|
+
_userTiming;
|
|
726
1137
|
tokens = [];
|
|
727
1138
|
// At most one worker lex request in flight at a time. Required for the
|
|
728
1139
|
// delta-transfer protocol below to be safe: the request captures a
|
|
@@ -737,19 +1148,38 @@ var Markdown = class extends UIComponent {
|
|
|
737
1148
|
/**
|
|
738
1149
|
* Streaming counters for the DevTools inspector.
|
|
739
1150
|
*
|
|
740
|
-
* Cheap enough to keep always-on (
|
|
741
|
-
*
|
|
742
|
-
*
|
|
743
|
-
*
|
|
744
|
-
*
|
|
1151
|
+
* Cheap enough to keep always-on (a handful of integer increments per append).
|
|
1152
|
+
*
|
|
1153
|
+
* These describe the **token diff and the transfer**, not the parser. `marked`
|
|
1154
|
+
* has no incremental lexing API, so the worker calls `marked.lexer()` on the
|
|
1155
|
+
* whole accumulated source for every chunk and the lexer's cost is O(document)
|
|
1156
|
+
* per append no matter how well the diff goes. That is what `lexerMs` and
|
|
1157
|
+
* `sourceCharsLexed` are for; an earlier version of these counters was named as
|
|
1158
|
+
* though a high prefix match meant less lexing, which sent readers to optimise
|
|
1159
|
+
* the already-solved transfer path.
|
|
745
1160
|
*/
|
|
746
1161
|
streamStats = {
|
|
747
1162
|
appends: 0,
|
|
748
1163
|
workerResponses: 0,
|
|
749
|
-
/**
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
1164
|
+
/**
|
|
1165
|
+
* Sum of `matchLen`: leading tokens whose `raw` was unchanged, so the main
|
|
1166
|
+
* thread kept its existing token objects and child entities. A prefix match,
|
|
1167
|
+
* not a lexer saving — the worker still lexed them.
|
|
1168
|
+
*/
|
|
1169
|
+
tokensPrefixMatched: 0,
|
|
1170
|
+
/**
|
|
1171
|
+
* Sum of returned tail lengths: tokens the worker sent back because their
|
|
1172
|
+
* `raw` differed. This is the structured-clone payload size in tokens, which
|
|
1173
|
+
* is what the delta protocol exists to keep small.
|
|
1174
|
+
*/
|
|
1175
|
+
tokensReturned: 0,
|
|
1176
|
+
/** Total ms spent inside `marked.lexer()` across worker responses. */
|
|
1177
|
+
lexerMs: 0,
|
|
1178
|
+
/**
|
|
1179
|
+
* Characters handed to the lexer, summed across responses. Grows ~O(n^2) over
|
|
1180
|
+
* a stream of n chunks, because every chunk re-lexes the whole document.
|
|
1181
|
+
*/
|
|
1182
|
+
sourceCharsLexed: 0,
|
|
753
1183
|
/** Total round-trip ms across worker lex requests, dispatch to callback. */
|
|
754
1184
|
workerMs: 0,
|
|
755
1185
|
/** Longest single worker round trip, which is what a dropped frame feels. */
|
|
@@ -759,7 +1189,7 @@ var Markdown = class extends UIComponent {
|
|
|
759
1189
|
* worker matched and did not re-read.
|
|
760
1190
|
*/
|
|
761
1191
|
stablePrefixChars: 0,
|
|
762
|
-
/** Source length of the tail
|
|
1192
|
+
/** Source length of the tail whose tokens changed on the most recent append. */
|
|
763
1193
|
changedTailChars: 0,
|
|
764
1194
|
/** Child entities kept across reconciles, either untouched or updated in place. */
|
|
765
1195
|
entitiesReused: 0,
|
|
@@ -780,6 +1210,23 @@ var Markdown = class extends UIComponent {
|
|
|
780
1210
|
// that cache instead of silently diffing against stale raws.
|
|
781
1211
|
workerInstanceId = `md-${workerInstanceCounter++}`;
|
|
782
1212
|
tokenVersion = 0;
|
|
1213
|
+
/**
|
|
1214
|
+
* How many characters of {@link rawMarkdown} the worker is known to hold.
|
|
1215
|
+
*
|
|
1216
|
+
* The worker keeps the document source too, not just the prior token raws, so a
|
|
1217
|
+
* steady-state append posts only the new chunk instead of the whole document —
|
|
1218
|
+
* that term was O(document) per chunk, i.e. O(N²) over a stream, and unlike the
|
|
1219
|
+
* re-lex it accompanies it is paid on the MAIN thread (structured-cloning the
|
|
1220
|
+
* string happens in `postMessage`, not in the worker). Measured on a 240Hz
|
|
1221
|
+
* panel: 4µs per append at 8KB rising to 220µs at 512KB on Chrome, against a
|
|
1222
|
+
* flat ~2µs for a chunk-sized post.
|
|
1223
|
+
*
|
|
1224
|
+
* 0 means the worker holds nothing for this instance, so the next request must
|
|
1225
|
+
* carry the full text. It is only advanced when a response proves the worker
|
|
1226
|
+
* accepted that source, and reset to 0 by anything the worker did not produce
|
|
1227
|
+
* ({@link setContent}, a sync-fallback parse, a worker error or crash).
|
|
1228
|
+
*/
|
|
1229
|
+
workerSourceLen = 0;
|
|
783
1230
|
// `tokenChildPrefix[i]` = how many of `tokens[0..i)` render a child entity, so
|
|
784
1231
|
// `updateTokens` can map a token index to its child slot in O(1). Maintained
|
|
785
1232
|
// incrementally by setTokens() (only the changed suffix is recomputed).
|
|
@@ -815,6 +1262,7 @@ var Markdown = class extends UIComponent {
|
|
|
815
1262
|
this.theme = { ...DEFAULT_THEME, ...opts.theme };
|
|
816
1263
|
this.onLinkClick = opts.onLinkClick;
|
|
817
1264
|
this.selectable = opts.selectable ?? true;
|
|
1265
|
+
this._userTiming = opts.userTiming ?? false;
|
|
818
1266
|
this.content = new Stack({ direction: "vertical", gap: 16 });
|
|
819
1267
|
this.add(this.content);
|
|
820
1268
|
this.rawMarkdown = markdownText;
|
|
@@ -822,7 +1270,7 @@ var Markdown = class extends UIComponent {
|
|
|
822
1270
|
this.renderMarkdown(markdownText);
|
|
823
1271
|
}
|
|
824
1272
|
renderMarkdown(text) {
|
|
825
|
-
const tokens =
|
|
1273
|
+
const tokens = lexMarkdown(text, this._userTiming);
|
|
826
1274
|
this.setTokens(tokens);
|
|
827
1275
|
for (const token of tokens) {
|
|
828
1276
|
const el = this.renderToken(token);
|
|
@@ -833,9 +1281,32 @@ var Markdown = class extends UIComponent {
|
|
|
833
1281
|
this.width = this.content.width;
|
|
834
1282
|
this.height = this.content.height;
|
|
835
1283
|
}
|
|
1284
|
+
/** Create a frame-coalesced stream bound to this Markdown instance. */
|
|
1285
|
+
createStream(options = {}) {
|
|
1286
|
+
if (this.streamController) {
|
|
1287
|
+
throw new Error("Markdown already has an active StreamController");
|
|
1288
|
+
}
|
|
1289
|
+
const controller = createStreamController(
|
|
1290
|
+
{
|
|
1291
|
+
append: (chunk) => this.appendMarkdownCore(chunk),
|
|
1292
|
+
release: (released) => {
|
|
1293
|
+
if (this.streamController === released) this.streamController = null;
|
|
1294
|
+
}
|
|
1295
|
+
},
|
|
1296
|
+
options
|
|
1297
|
+
);
|
|
1298
|
+
if (controller.state === "open") this.streamController = controller;
|
|
1299
|
+
return controller;
|
|
1300
|
+
}
|
|
836
1301
|
/** Replace all markdown content (full rebuild). */
|
|
837
1302
|
setContent(markdown) {
|
|
1303
|
+
this.streamController?.abort(new Error("Markdown content was replaced"));
|
|
1304
|
+
for (const id of this.pendingWorkerIds) workerCallbacks.delete(id);
|
|
1305
|
+
this.pendingWorkerIds.clear();
|
|
1306
|
+
this.appendInFlight = false;
|
|
1307
|
+
this.appendPending = false;
|
|
838
1308
|
this.rawMarkdown = markdown;
|
|
1309
|
+
this.workerSourceLen = 0;
|
|
839
1310
|
while (this.content.children.length > 0) {
|
|
840
1311
|
this.content.children[this.content.children.length - 1].destroy();
|
|
841
1312
|
}
|
|
@@ -850,6 +1321,7 @@ var Markdown = class extends UIComponent {
|
|
|
850
1321
|
* content subtree via `super.destroy()` so every block's resources are freed.
|
|
851
1322
|
*/
|
|
852
1323
|
destroy() {
|
|
1324
|
+
this.streamController?.destroy();
|
|
853
1325
|
for (const id of this.pendingWorkerIds) workerCallbacks.delete(id);
|
|
854
1326
|
this.pendingWorkerIds.clear();
|
|
855
1327
|
this.appendInFlight = false;
|
|
@@ -864,24 +1336,38 @@ var Markdown = class extends UIComponent {
|
|
|
864
1336
|
* Streaming and parse state — the markdown streaming inspector.
|
|
865
1337
|
*
|
|
866
1338
|
* Source length, chunk count, worker in-flight state, and the stable-prefix
|
|
867
|
-
* versus
|
|
1339
|
+
* versus changed-tail split. That last ratio is the one worth watching: it is
|
|
868
1340
|
* how you tell incremental reuse is working from outside, and nothing else
|
|
869
1341
|
* surfaces it. A ratio near 1 means the worker matched almost the whole prefix
|
|
870
|
-
* and only
|
|
1342
|
+
* and rebuilt only the tail's entities; near 0 means almost nothing was reused.
|
|
1343
|
+
* Neither says anything about lexer CPU, which is O(document) per append — that
|
|
1344
|
+
* is what the Parser cost group reports.
|
|
871
1345
|
*/
|
|
872
1346
|
getDevtoolsDescriptor() {
|
|
873
1347
|
const s = this.streamStats;
|
|
874
|
-
const
|
|
875
|
-
const
|
|
1348
|
+
const diffedTokens = s.tokensPrefixMatched + s.tokensReturned;
|
|
1349
|
+
const tokenPrefixReuseRatio = diffedTokens > 0 ? s.tokensPrefixMatched / diffedTokens : 0;
|
|
876
1350
|
return {
|
|
877
1351
|
kind: "Markdown",
|
|
878
1352
|
groups: [
|
|
879
1353
|
{
|
|
880
1354
|
label: "Source",
|
|
881
1355
|
fields: [
|
|
882
|
-
{
|
|
883
|
-
|
|
884
|
-
|
|
1356
|
+
{
|
|
1357
|
+
label: "sourceLength",
|
|
1358
|
+
value: this.rawMarkdown.length,
|
|
1359
|
+
readOnly: true
|
|
1360
|
+
},
|
|
1361
|
+
{
|
|
1362
|
+
label: "topLevelTokens",
|
|
1363
|
+
value: this.tokens.length,
|
|
1364
|
+
readOnly: true
|
|
1365
|
+
},
|
|
1366
|
+
{
|
|
1367
|
+
label: "childEntities",
|
|
1368
|
+
value: this.content.children.length,
|
|
1369
|
+
readOnly: true
|
|
1370
|
+
},
|
|
885
1371
|
{ label: "selectable", value: this.selectable }
|
|
886
1372
|
]
|
|
887
1373
|
},
|
|
@@ -901,7 +1387,11 @@ var Markdown = class extends UIComponent {
|
|
|
901
1387
|
hint: "One lex request at a time; the delta protocol requires it",
|
|
902
1388
|
readOnly: true
|
|
903
1389
|
},
|
|
904
|
-
{
|
|
1390
|
+
{
|
|
1391
|
+
label: "appendPending",
|
|
1392
|
+
value: this.appendPending,
|
|
1393
|
+
readOnly: true
|
|
1394
|
+
},
|
|
905
1395
|
{
|
|
906
1396
|
label: "workerMsAvg",
|
|
907
1397
|
value: s.workerResponses > 0 ? Math.round(s.workerMs / s.workerResponses * 100) / 100 : 0,
|
|
@@ -928,7 +1418,7 @@ var Markdown = class extends UIComponent {
|
|
|
928
1418
|
{
|
|
929
1419
|
label: "changedTailChars",
|
|
930
1420
|
value: s.changedTailChars,
|
|
931
|
-
hint: "Source characters
|
|
1421
|
+
hint: "Source characters whose tokens changed on the last append. Growing with the document means the delta is not a delta",
|
|
932
1422
|
readOnly: true
|
|
933
1423
|
},
|
|
934
1424
|
{
|
|
@@ -955,21 +1445,38 @@ var Markdown = class extends UIComponent {
|
|
|
955
1445
|
label: "Incremental reuse",
|
|
956
1446
|
fields: [
|
|
957
1447
|
{
|
|
958
|
-
label: "
|
|
959
|
-
value: s.
|
|
960
|
-
hint: "Sum of matchLen:
|
|
1448
|
+
label: "tokensPrefixMatched",
|
|
1449
|
+
value: s.tokensPrefixMatched,
|
|
1450
|
+
hint: "Sum of matchLen: leading tokens whose raw was unchanged, so their entities were kept",
|
|
961
1451
|
readOnly: true
|
|
962
1452
|
},
|
|
963
1453
|
{
|
|
964
|
-
label: "
|
|
965
|
-
value: s.
|
|
966
|
-
hint: "Sum of returned tail lengths:
|
|
1454
|
+
label: "tokensReturned",
|
|
1455
|
+
value: s.tokensReturned,
|
|
1456
|
+
hint: "Sum of returned tail lengths: the changed suffix the worker cloned back",
|
|
967
1457
|
readOnly: true
|
|
968
1458
|
},
|
|
969
1459
|
{
|
|
970
|
-
label: "
|
|
971
|
-
value: Math.round(
|
|
972
|
-
hint: "
|
|
1460
|
+
label: "tokenPrefixReuseRatio",
|
|
1461
|
+
value: Math.round(tokenPrefixReuseRatio * 1e3) / 1e3,
|
|
1462
|
+
hint: "matched / (matched + returned). Near 1 means small transfers and high entity reuse \u2014 NOT less lexing",
|
|
1463
|
+
readOnly: true
|
|
1464
|
+
}
|
|
1465
|
+
]
|
|
1466
|
+
},
|
|
1467
|
+
{
|
|
1468
|
+
label: "Parser cost",
|
|
1469
|
+
fields: [
|
|
1470
|
+
{
|
|
1471
|
+
label: "lexerMs",
|
|
1472
|
+
value: Math.round(s.lexerMs * 10) / 10,
|
|
1473
|
+
hint: "Total ms inside marked.lexer() \u2014 the whole source, every append",
|
|
1474
|
+
readOnly: true
|
|
1475
|
+
},
|
|
1476
|
+
{
|
|
1477
|
+
label: "sourceCharsLexed",
|
|
1478
|
+
value: s.sourceCharsLexed,
|
|
1479
|
+
hint: "Characters lexed, summed over appends. Grows ~O(n^2) across a stream",
|
|
973
1480
|
readOnly: true
|
|
974
1481
|
}
|
|
975
1482
|
]
|
|
@@ -977,13 +1484,22 @@ var Markdown = class extends UIComponent {
|
|
|
977
1484
|
],
|
|
978
1485
|
notes: s.workerResponses === 0 && s.appends > 0 ? [
|
|
979
1486
|
"No worker responses yet: either the worker is unavailable and parsing ran synchronously on the main thread, or the first request is still in flight."
|
|
980
|
-
] :
|
|
981
|
-
`Only ${Math.round(
|
|
1487
|
+
] : tokenPrefixReuseRatio > 0 && tokenPrefixReuseRatio < 0.5 ? [
|
|
1488
|
+
`Only ${Math.round(tokenPrefixReuseRatio * 100)}% of tokens matched the prior prefix, so most of the token array is being returned and its entities rebuilt every chunk. Note the LEXER is O(document) per append regardless \u2014 see lexerMs.`
|
|
982
1489
|
] : s.changedTailChars > 0 && this.rawMarkdown.length > 0 && s.changedTailChars / this.rawMarkdown.length > 0.5 ? [
|
|
983
|
-
`The last append
|
|
1490
|
+
`The last append changed ${s.changedTailChars} of ${this.rawMarkdown.length} characters. A changed tail that grows with the document means the delta is not a delta, so almost every entity is rebuilt per chunk.`
|
|
984
1491
|
] : void 0
|
|
985
1492
|
};
|
|
986
1493
|
}
|
|
1494
|
+
/** Enable or disable User Timing for subsequent parses. */
|
|
1495
|
+
setUserTiming(enabled) {
|
|
1496
|
+
this._userTiming = enabled;
|
|
1497
|
+
return this;
|
|
1498
|
+
}
|
|
1499
|
+
/** Whether Markdown parse User Timing is enabled. */
|
|
1500
|
+
get userTiming() {
|
|
1501
|
+
return this._userTiming;
|
|
1502
|
+
}
|
|
987
1503
|
/** Enable or disable native selection for existing and future Markdown text. */
|
|
988
1504
|
setSelectable(selectable) {
|
|
989
1505
|
this.selectable = selectable;
|
|
@@ -998,10 +1514,15 @@ var Markdown = class extends UIComponent {
|
|
|
998
1514
|
}
|
|
999
1515
|
/** Append a markdown chunk incrementally. Reuses unchanged prefix entities. */
|
|
1000
1516
|
appendMarkdown(chunk) {
|
|
1517
|
+
this.streamController?.flush();
|
|
1518
|
+
return this.appendMarkdownCore(chunk);
|
|
1519
|
+
}
|
|
1520
|
+
appendMarkdownCore(chunk) {
|
|
1001
1521
|
this.rawMarkdown += chunk;
|
|
1002
1522
|
this.streamStats.appends++;
|
|
1003
1523
|
if (!markdownWorker) {
|
|
1004
|
-
|
|
1524
|
+
this.workerSourceLen = 0;
|
|
1525
|
+
const newTokens = lexMarkdown(this.rawMarkdown, this._userTiming);
|
|
1005
1526
|
this.updateTokens(newTokens);
|
|
1006
1527
|
return this;
|
|
1007
1528
|
}
|
|
@@ -1015,32 +1536,41 @@ var Markdown = class extends UIComponent {
|
|
|
1015
1536
|
/**
|
|
1016
1537
|
* Post one lex request for the accumulated text.
|
|
1017
1538
|
*
|
|
1018
|
-
*
|
|
1019
|
-
* worker
|
|
1020
|
-
*
|
|
1021
|
-
*
|
|
1022
|
-
* O(N²) over a stream
|
|
1023
|
-
*
|
|
1024
|
-
*
|
|
1025
|
-
*
|
|
1539
|
+
* Two shapes. Steady state sends a DELTA — `{ append }` plus the expected total
|
|
1540
|
+
* length — because the worker keeps both this instance's prior token raws and
|
|
1541
|
+
* the document source itself (keyed by `workerInstanceId` + `tokenVersion`).
|
|
1542
|
+
* Re-sending the document each chunk made main->worker transfer O(document) per
|
|
1543
|
+
* chunk, i.e. O(N²) over a stream, and that cost is paid on the main thread:
|
|
1544
|
+
* `postMessage` structured-clones the string synchronously before the worker
|
|
1545
|
+
* ever wakes. `resync` forces the FULL shape instead — the whole text plus the
|
|
1546
|
+
* prior raw list — and is used for the first request for this instance, after
|
|
1547
|
+
* anything the worker did not produce (`setContent`, a sync-fallback parse), and
|
|
1548
|
+
* whenever the worker reports it cannot trust what it holds (`needResync`).
|
|
1026
1549
|
*/
|
|
1027
|
-
dispatchAppend(
|
|
1550
|
+
dispatchAppend(resync = false) {
|
|
1028
1551
|
if (!markdownWorker) return;
|
|
1029
1552
|
this.appendInFlight = true;
|
|
1030
1553
|
const id = workerIdCounter++;
|
|
1031
1554
|
const oldTokensSnapshot = this.tokens;
|
|
1032
1555
|
const baseVersion = this.tokenVersion;
|
|
1033
1556
|
const dispatchedAt = now();
|
|
1557
|
+
const sentLength = this.rawMarkdown.length;
|
|
1558
|
+
const canSendDelta = !resync && this.workerSourceLen > 0 && this.workerSourceLen <= sentLength;
|
|
1034
1559
|
this.pendingWorkerIds.add(id);
|
|
1035
1560
|
workerCallbacks.set(id, {
|
|
1036
|
-
cb: (matchLen, tail) => {
|
|
1561
|
+
cb: (matchLen, tail, local = false, lex) => {
|
|
1037
1562
|
this.pendingWorkerIds.delete(id);
|
|
1038
1563
|
this.streamStats.workerResponses++;
|
|
1039
|
-
this.streamStats.
|
|
1040
|
-
this.streamStats.
|
|
1564
|
+
this.streamStats.tokensPrefixMatched += matchLen;
|
|
1565
|
+
this.streamStats.tokensReturned += tail.length;
|
|
1566
|
+
if (lex) {
|
|
1567
|
+
this.streamStats.lexerMs += lex.lexerMs;
|
|
1568
|
+
this.streamStats.sourceCharsLexed += lex.sourceCharsLexed;
|
|
1569
|
+
}
|
|
1041
1570
|
const elapsed = now() - dispatchedAt;
|
|
1042
1571
|
this.streamStats.workerMs += elapsed;
|
|
1043
1572
|
if (elapsed > this.streamStats.workerMsMax) this.streamStats.workerMsMax = elapsed;
|
|
1573
|
+
this.workerSourceLen = local ? 0 : sentLength;
|
|
1044
1574
|
let prefixChars = 0;
|
|
1045
1575
|
for (let i = 0; i < matchLen; i++) prefixChars += oldTokensSnapshot[i]?.raw.length ?? 0;
|
|
1046
1576
|
this.streamStats.stablePrefixChars = prefixChars;
|
|
@@ -1053,22 +1583,34 @@ var Markdown = class extends UIComponent {
|
|
|
1053
1583
|
this.dispatchAppend();
|
|
1054
1584
|
}
|
|
1055
1585
|
},
|
|
1056
|
-
// The worker can't trust
|
|
1057
|
-
//
|
|
1058
|
-
// the retry's snapshot and version still line up.
|
|
1059
|
-
|
|
1586
|
+
// The worker can't trust what it holds for this request; retry it once with
|
|
1587
|
+
// the full text and raws attached. `this.tokens` is untouched (no
|
|
1588
|
+
// updateTokens ran), so the retry's snapshot and version still line up.
|
|
1589
|
+
onNeedResync: () => {
|
|
1060
1590
|
this.pendingWorkerIds.delete(id);
|
|
1061
1591
|
this.appendInFlight = false;
|
|
1592
|
+
this.workerSourceLen = 0;
|
|
1062
1593
|
this.dispatchAppend(true);
|
|
1063
1594
|
},
|
|
1064
|
-
text: this.rawMarkdown
|
|
1595
|
+
text: this.rawMarkdown,
|
|
1596
|
+
userTiming: this._userTiming
|
|
1065
1597
|
});
|
|
1066
1598
|
markdownWorker.postMessage({
|
|
1067
1599
|
id,
|
|
1068
|
-
text: this.rawMarkdown,
|
|
1069
1600
|
instance: this.workerInstanceId,
|
|
1070
1601
|
baseVersion,
|
|
1071
|
-
|
|
1602
|
+
userTimingName: this._userTiming ? VECTO_USER_TIMING.markdown.parse : void 0,
|
|
1603
|
+
...canSendDelta ? {
|
|
1604
|
+
append: this.rawMarkdown.slice(this.workerSourceLen),
|
|
1605
|
+
// What the worker's source must total once it applies this append. It
|
|
1606
|
+
// rejects a mismatch with one resync rather than lexing a source that
|
|
1607
|
+
// has diverged from this one — a dropped or duplicated chunk would
|
|
1608
|
+
// otherwise return a matchLen against tokens this instance never had.
|
|
1609
|
+
expectedLength: sentLength
|
|
1610
|
+
} : {
|
|
1611
|
+
text: this.rawMarkdown,
|
|
1612
|
+
oldRaws: oldTokensSnapshot.map((t) => t.raw)
|
|
1613
|
+
}
|
|
1072
1614
|
});
|
|
1073
1615
|
}
|
|
1074
1616
|
updateTokens(newTokens, knownMatchLen) {
|
|
@@ -1143,6 +1685,19 @@ var Markdown = class extends UIComponent {
|
|
|
1143
1685
|
this.onLayoutUpdated();
|
|
1144
1686
|
}
|
|
1145
1687
|
}
|
|
1688
|
+
/**
|
|
1689
|
+
* Render one nested block with a temporary width/margin context while
|
|
1690
|
+
* preserving `renderToken` as the subclass override seam.
|
|
1691
|
+
*/
|
|
1692
|
+
renderTokenWithMetrics(token, metrics) {
|
|
1693
|
+
const previous = this.activeBlockMetrics;
|
|
1694
|
+
this.activeBlockMetrics = metrics;
|
|
1695
|
+
try {
|
|
1696
|
+
return this.renderToken(token);
|
|
1697
|
+
} finally {
|
|
1698
|
+
this.activeBlockMetrics = previous;
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1146
1701
|
/**
|
|
1147
1702
|
* Whether {@link renderToken} produces a child entity for this token (vs
|
|
1148
1703
|
* `null`). `updateTokens` maps token indices to child-entity indices, and the
|
|
@@ -1177,6 +1732,13 @@ var Markdown = class extends UIComponent {
|
|
|
1177
1732
|
renderToken(token) {
|
|
1178
1733
|
const t = this.theme;
|
|
1179
1734
|
const bodyFont = `${t.fontSize}px ${t.bodyFont}`;
|
|
1735
|
+
const metrics = this.activeBlockMetrics ?? {
|
|
1736
|
+
marginBefore: 0,
|
|
1737
|
+
marginAfter: 0,
|
|
1738
|
+
indentStart: 0,
|
|
1739
|
+
availableWidth: this.maxWidth
|
|
1740
|
+
};
|
|
1741
|
+
const availableWidth = metrics.availableWidth;
|
|
1180
1742
|
switch (token.type) {
|
|
1181
1743
|
// ── Headings ─────────────────────────────────────────────────────
|
|
1182
1744
|
case "heading": {
|
|
@@ -1189,7 +1751,7 @@ var Markdown = class extends UIComponent {
|
|
|
1189
1751
|
hToken.text,
|
|
1190
1752
|
headingFont,
|
|
1191
1753
|
t.headingColor,
|
|
1192
|
-
|
|
1754
|
+
availableWidth,
|
|
1193
1755
|
t,
|
|
1194
1756
|
this.selectable,
|
|
1195
1757
|
this.onLinkClick
|
|
@@ -1204,7 +1766,7 @@ var Markdown = class extends UIComponent {
|
|
|
1204
1766
|
pToken.text,
|
|
1205
1767
|
bodyFont,
|
|
1206
1768
|
t.textColor,
|
|
1207
|
-
|
|
1769
|
+
availableWidth,
|
|
1208
1770
|
t,
|
|
1209
1771
|
this.selectable,
|
|
1210
1772
|
this.onLinkClick
|
|
@@ -1213,7 +1775,7 @@ var Markdown = class extends UIComponent {
|
|
|
1213
1775
|
const stack = new Stack({
|
|
1214
1776
|
direction: "vertical",
|
|
1215
1777
|
gap: 16,
|
|
1216
|
-
maxWidth:
|
|
1778
|
+
maxWidth: availableWidth
|
|
1217
1779
|
});
|
|
1218
1780
|
let currentTokens = [];
|
|
1219
1781
|
const flushText = () => {
|
|
@@ -1224,7 +1786,7 @@ var Markdown = class extends UIComponent {
|
|
|
1224
1786
|
"",
|
|
1225
1787
|
bodyFont,
|
|
1226
1788
|
t.textColor,
|
|
1227
|
-
|
|
1789
|
+
availableWidth,
|
|
1228
1790
|
t,
|
|
1229
1791
|
this.selectable,
|
|
1230
1792
|
this.onLinkClick
|
|
@@ -1237,7 +1799,7 @@ var Markdown = class extends UIComponent {
|
|
|
1237
1799
|
if (child.type === "image") {
|
|
1238
1800
|
flushText();
|
|
1239
1801
|
const imgToken = child;
|
|
1240
|
-
const initialWidth = Math.min(800,
|
|
1802
|
+
const initialWidth = Math.min(800, availableWidth);
|
|
1241
1803
|
const initialHeight = Math.round(initialWidth * 0.6);
|
|
1242
1804
|
const img = new Image(imgToken.href, {
|
|
1243
1805
|
width: initialWidth,
|
|
@@ -1248,7 +1810,7 @@ var Markdown = class extends UIComponent {
|
|
|
1248
1810
|
const bmp = img.bitmap;
|
|
1249
1811
|
if (bmp && bmp.naturalWidth && bmp.naturalHeight) {
|
|
1250
1812
|
const aspect = bmp.naturalHeight / bmp.naturalWidth;
|
|
1251
|
-
img.width = Math.min(bmp.naturalWidth,
|
|
1813
|
+
img.width = Math.min(bmp.naturalWidth, availableWidth);
|
|
1252
1814
|
img.height = Math.round(img.width * aspect);
|
|
1253
1815
|
if (this.scene) this.scene.markDirty();
|
|
1254
1816
|
}
|
|
@@ -1270,8 +1832,8 @@ var Markdown = class extends UIComponent {
|
|
|
1270
1832
|
const mathData = renderMathToSVGDataURI(codeToken.text, true);
|
|
1271
1833
|
if (mathData) {
|
|
1272
1834
|
const mathImg = new Image(mathData.uri, {
|
|
1273
|
-
width: Math.min(
|
|
1274
|
-
height: mathData.height * Math.min(1,
|
|
1835
|
+
width: Math.min(availableWidth, mathData.width),
|
|
1836
|
+
height: mathData.height * Math.min(1, availableWidth / mathData.width),
|
|
1275
1837
|
alt: codeToken.text
|
|
1276
1838
|
});
|
|
1277
1839
|
const wrapper = new MarkdownContainer();
|
|
@@ -1283,20 +1845,27 @@ var Markdown = class extends UIComponent {
|
|
|
1283
1845
|
return wrapper;
|
|
1284
1846
|
}
|
|
1285
1847
|
}
|
|
1286
|
-
return new CodeBlock(codeToken.text, lang,
|
|
1848
|
+
return new CodeBlock(codeToken.text, lang, availableWidth, t, this.selectable);
|
|
1287
1849
|
}
|
|
1288
1850
|
// ── Blockquotes ──────────────────────────────────────────────────
|
|
1289
1851
|
case "blockquote": {
|
|
1290
1852
|
const bqToken = token;
|
|
1291
1853
|
const innerStack = new Stack({ direction: "vertical", gap: 8 });
|
|
1854
|
+
const indentStart = Math.min(16, availableWidth);
|
|
1855
|
+
const childMetrics = {
|
|
1856
|
+
marginBefore: 0,
|
|
1857
|
+
marginAfter: 0,
|
|
1858
|
+
indentStart,
|
|
1859
|
+
availableWidth: Math.max(0, availableWidth - indentStart)
|
|
1860
|
+
};
|
|
1292
1861
|
if (bqToken.tokens) {
|
|
1293
1862
|
for (const inner of bqToken.tokens) {
|
|
1294
|
-
const el = this.
|
|
1863
|
+
const el = this.renderTokenWithMetrics(inner, childMetrics);
|
|
1295
1864
|
if (el) {
|
|
1296
1865
|
const wrapper = new MarkdownContainer();
|
|
1297
|
-
el.x =
|
|
1866
|
+
el.x = childMetrics.indentStart;
|
|
1298
1867
|
wrapper.add(el);
|
|
1299
|
-
wrapper.width = el.width +
|
|
1868
|
+
wrapper.width = el.width + childMetrics.indentStart;
|
|
1300
1869
|
wrapper.height = el.height;
|
|
1301
1870
|
innerStack.add(wrapper);
|
|
1302
1871
|
}
|
|
@@ -1310,7 +1879,7 @@ var Markdown = class extends UIComponent {
|
|
|
1310
1879
|
innerStack.y = 0;
|
|
1311
1880
|
innerStack.x = 0;
|
|
1312
1881
|
container.add(innerStack);
|
|
1313
|
-
container.width =
|
|
1882
|
+
container.width = availableWidth;
|
|
1314
1883
|
container.height = Math.max(border.height, innerStack.height);
|
|
1315
1884
|
return container;
|
|
1316
1885
|
}
|
|
@@ -1342,7 +1911,7 @@ var Markdown = class extends UIComponent {
|
|
|
1342
1911
|
const itemRt = new RichText(itemSpans, {
|
|
1343
1912
|
font: bodyFont,
|
|
1344
1913
|
color: t.textColor,
|
|
1345
|
-
maxWidth:
|
|
1914
|
+
maxWidth: Math.max(0, availableWidth - 24),
|
|
1346
1915
|
linkColor: "#38bdf8",
|
|
1347
1916
|
selectable: this.selectable,
|
|
1348
1917
|
onLinkClick: this.onLinkClick
|
|
@@ -1373,7 +1942,7 @@ var Markdown = class extends UIComponent {
|
|
|
1373
1942
|
return new Table({
|
|
1374
1943
|
headers,
|
|
1375
1944
|
rows,
|
|
1376
|
-
width:
|
|
1945
|
+
width: availableWidth,
|
|
1377
1946
|
textColor: t.textColor,
|
|
1378
1947
|
headerTextColor: t.headingColor,
|
|
1379
1948
|
font: `${t.fontSize - 2}px ${t.bodyFont}`,
|
|
@@ -1385,7 +1954,7 @@ var Markdown = class extends UIComponent {
|
|
|
1385
1954
|
}
|
|
1386
1955
|
// ── Horizontal rule ──────────────────────────────────────────────
|
|
1387
1956
|
case "hr":
|
|
1388
|
-
return new HorizontalRule(
|
|
1957
|
+
return new HorizontalRule(availableWidth, t.hrColor);
|
|
1389
1958
|
// ── Whitespace ───────────────────────────────────────────────────
|
|
1390
1959
|
case "space":
|
|
1391
1960
|
return null;
|
|
@@ -1403,7 +1972,7 @@ var Markdown = class extends UIComponent {
|
|
|
1403
1972
|
return new Text(token.text, {
|
|
1404
1973
|
font: bodyFont,
|
|
1405
1974
|
color: t.textColor,
|
|
1406
|
-
maxWidth:
|
|
1975
|
+
maxWidth: availableWidth,
|
|
1407
1976
|
lineHeight: 24,
|
|
1408
1977
|
selectable: this.selectable
|
|
1409
1978
|
});
|