@dualityinstitute/blink 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +160 -0
  3. package/assets/AppIcon.icns +0 -0
  4. package/assets/tray/iconTemplate-error.png +0 -0
  5. package/assets/tray/iconTemplate-error@2x.png +0 -0
  6. package/assets/tray/iconTemplate-hidden.png +0 -0
  7. package/assets/tray/iconTemplate-hidden@2x.png +0 -0
  8. package/assets/tray/iconTemplate-monitoring.png +0 -0
  9. package/assets/tray/iconTemplate-monitoring@2x.png +0 -0
  10. package/assets/tray/iconTemplate-processing-b.png +0 -0
  11. package/assets/tray/iconTemplate-processing-b@2x.png +0 -0
  12. package/assets/tray/iconTemplate-processing.png +0 -0
  13. package/assets/tray/iconTemplate-processing@2x.png +0 -0
  14. package/assets/tray/iconTemplate.png +0 -0
  15. package/assets/tray/iconTemplate@2x.png +0 -0
  16. package/dist/cli.js +20463 -0
  17. package/dist/electron/fsevents-1bczt1x4.node +0 -0
  18. package/dist/electron/main.js +28529 -0
  19. package/dist/electron/preload.cjs +115 -0
  20. package/dist/electron/renderer/popup.css +815 -0
  21. package/dist/electron/renderer/popup.html +141 -0
  22. package/dist/electron/renderer/popup.js +4087 -0
  23. package/dist/electron/renderer/presenter.css +455 -0
  24. package/dist/electron/renderer/presenter.html +75 -0
  25. package/dist/electron/renderer/presenter.js +3870 -0
  26. package/package.json +76 -0
  27. package/vendor/Blink.app/Contents/Helpers/BlinkAudio +0 -0
  28. package/vendor/Blink.app/Contents/Info.plist +30 -0
  29. package/vendor/Blink.app/Contents/MacOS/Blink +0 -0
  30. package/vendor/Blink.app/Contents/Resources/AppIcon.icns +0 -0
  31. package/vendor/Blink.app/Contents/_CodeSignature/CodeResources +137 -0
@@ -0,0 +1,4087 @@
1
+ // node_modules/dompurify/dist/purify.es.mjs
2
+ /*! @license DOMPurify 3.4.13 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.13/LICENSE */
3
+ function _arrayLikeToArray(r, a) {
4
+ (a == null || a > r.length) && (a = r.length);
5
+ for (var e = 0, n = Array(a);e < a; e++)
6
+ n[e] = r[e];
7
+ return n;
8
+ }
9
+ function _arrayWithHoles(r) {
10
+ if (Array.isArray(r))
11
+ return r;
12
+ }
13
+ function _iterableToArrayLimit(r, l) {
14
+ var t = r == null ? null : typeof Symbol != "undefined" && r[Symbol.iterator] || r["@@iterator"];
15
+ if (t != null) {
16
+ var e, n, i, u, a = [], f = true, o = false;
17
+ try {
18
+ if (i = (t = t.call(r)).next, l === 0)
19
+ ;
20
+ else
21
+ for (;!(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = true)
22
+ ;
23
+ } catch (r2) {
24
+ o = true, n = r2;
25
+ } finally {
26
+ try {
27
+ if (!f && t.return != null && (u = t.return(), Object(u) !== u))
28
+ return;
29
+ } finally {
30
+ if (o)
31
+ throw n;
32
+ }
33
+ }
34
+ return a;
35
+ }
36
+ }
37
+ function _nonIterableRest() {
38
+ throw new TypeError(`Invalid attempt to destructure non-iterable instance.
39
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
40
+ }
41
+ function _slicedToArray(r, e) {
42
+ return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
43
+ }
44
+ function _unsupportedIterableToArray(r, a) {
45
+ if (r) {
46
+ if (typeof r == "string")
47
+ return _arrayLikeToArray(r, a);
48
+ var t = {}.toString.call(r).slice(8, -1);
49
+ return t === "Object" && r.constructor && (t = r.constructor.name), t === "Map" || t === "Set" ? Array.from(r) : t === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : undefined;
50
+ }
51
+ }
52
+ var entries = Object.entries;
53
+ var setPrototypeOf = Object.setPrototypeOf;
54
+ var isFrozen = Object.isFrozen;
55
+ var getPrototypeOf = Object.getPrototypeOf;
56
+ var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
57
+ var freeze = Object.freeze;
58
+ var seal = Object.seal;
59
+ var create = Object.create;
60
+ var _ref = typeof Reflect !== "undefined" && Reflect;
61
+ var apply = _ref.apply;
62
+ var construct = _ref.construct;
63
+ if (!freeze) {
64
+ freeze = function freeze2(x) {
65
+ return x;
66
+ };
67
+ }
68
+ if (!seal) {
69
+ seal = function seal2(x) {
70
+ return x;
71
+ };
72
+ }
73
+ if (!apply) {
74
+ apply = function apply2(func, thisArg) {
75
+ for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2;_key < _len; _key++) {
76
+ args[_key - 2] = arguments[_key];
77
+ }
78
+ return func.apply(thisArg, args);
79
+ };
80
+ }
81
+ if (!construct) {
82
+ construct = function construct2(Func) {
83
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1;_key2 < _len2; _key2++) {
84
+ args[_key2 - 1] = arguments[_key2];
85
+ }
86
+ return new Func(...args);
87
+ };
88
+ }
89
+ var arrayForEach = unapply(Array.prototype.forEach);
90
+ var arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);
91
+ var arrayPop = unapply(Array.prototype.pop);
92
+ var arrayPush = unapply(Array.prototype.push);
93
+ var arraySplice = unapply(Array.prototype.splice);
94
+ var arrayIsArray = Array.isArray;
95
+ var stringToLowerCase = unapply(String.prototype.toLowerCase);
96
+ var stringToString = unapply(String.prototype.toString);
97
+ var stringMatch = unapply(String.prototype.match);
98
+ var stringReplace = unapply(String.prototype.replace);
99
+ var stringIndexOf = unapply(String.prototype.indexOf);
100
+ var stringTrim = unapply(String.prototype.trim);
101
+ var numberToString = unapply(Number.prototype.toString);
102
+ var booleanToString = unapply(Boolean.prototype.toString);
103
+ var bigintToString = typeof BigInt === "undefined" ? null : unapply(BigInt.prototype.toString);
104
+ var symbolToString = typeof Symbol === "undefined" ? null : unapply(Symbol.prototype.toString);
105
+ var objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);
106
+ var objectToString = unapply(Object.prototype.toString);
107
+ var regExpTest = unapply(RegExp.prototype.test);
108
+ var typeErrorCreate = unconstruct(TypeError);
109
+ function unapply(func) {
110
+ return function(thisArg) {
111
+ if (thisArg instanceof RegExp) {
112
+ thisArg.lastIndex = 0;
113
+ }
114
+ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1;_key3 < _len3; _key3++) {
115
+ args[_key3 - 1] = arguments[_key3];
116
+ }
117
+ return apply(func, thisArg, args);
118
+ };
119
+ }
120
+ function unconstruct(Func) {
121
+ return function() {
122
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0;_key4 < _len4; _key4++) {
123
+ args[_key4] = arguments[_key4];
124
+ }
125
+ return construct(Func, args);
126
+ };
127
+ }
128
+ function addToSet(set, array) {
129
+ let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;
130
+ if (setPrototypeOf) {
131
+ setPrototypeOf(set, null);
132
+ }
133
+ if (!arrayIsArray(array)) {
134
+ return set;
135
+ }
136
+ let l = array.length;
137
+ while (l--) {
138
+ let element = array[l];
139
+ if (typeof element === "string") {
140
+ const lcElement = transformCaseFunc(element);
141
+ if (lcElement !== element) {
142
+ if (!isFrozen(array)) {
143
+ array[l] = lcElement;
144
+ }
145
+ element = lcElement;
146
+ }
147
+ }
148
+ set[element] = true;
149
+ }
150
+ return set;
151
+ }
152
+ function cleanArray(array) {
153
+ for (let index = 0;index < array.length; index++) {
154
+ const isPropertyExist = objectHasOwnProperty(array, index);
155
+ if (!isPropertyExist) {
156
+ array[index] = null;
157
+ }
158
+ }
159
+ return array;
160
+ }
161
+ function clone(object) {
162
+ const newObject = create(null);
163
+ for (const _ref2 of entries(object)) {
164
+ var _ref3 = _slicedToArray(_ref2, 2);
165
+ const property = _ref3[0];
166
+ const value = _ref3[1];
167
+ const isPropertyExist = objectHasOwnProperty(object, property);
168
+ if (isPropertyExist) {
169
+ if (arrayIsArray(value)) {
170
+ newObject[property] = cleanArray(value);
171
+ } else if (value && typeof value === "object" && value.constructor === Object) {
172
+ newObject[property] = clone(value);
173
+ } else {
174
+ newObject[property] = value;
175
+ }
176
+ }
177
+ }
178
+ return newObject;
179
+ }
180
+ function stringifyValue(value) {
181
+ switch (typeof value) {
182
+ case "string": {
183
+ return value;
184
+ }
185
+ case "number": {
186
+ return numberToString(value);
187
+ }
188
+ case "boolean": {
189
+ return booleanToString(value);
190
+ }
191
+ case "bigint": {
192
+ return bigintToString ? bigintToString(value) : "0";
193
+ }
194
+ case "symbol": {
195
+ return symbolToString ? symbolToString(value) : "Symbol()";
196
+ }
197
+ case "undefined": {
198
+ return objectToString(value);
199
+ }
200
+ case "function":
201
+ case "object": {
202
+ if (value === null) {
203
+ return objectToString(value);
204
+ }
205
+ const valueAsRecord = value;
206
+ const valueToString = lookupGetter(valueAsRecord, "toString");
207
+ if (typeof valueToString === "function") {
208
+ const stringified = valueToString(valueAsRecord);
209
+ return typeof stringified === "string" ? stringified : objectToString(stringified);
210
+ }
211
+ return objectToString(value);
212
+ }
213
+ default: {
214
+ return objectToString(value);
215
+ }
216
+ }
217
+ }
218
+ function lookupGetter(object, prop) {
219
+ while (object !== null) {
220
+ const desc = getOwnPropertyDescriptor(object, prop);
221
+ if (desc) {
222
+ if (desc.get) {
223
+ return unapply(desc.get);
224
+ }
225
+ if (typeof desc.value === "function") {
226
+ return unapply(desc.value);
227
+ }
228
+ }
229
+ object = getPrototypeOf(object);
230
+ }
231
+ function fallbackValue() {
232
+ return null;
233
+ }
234
+ return fallbackValue;
235
+ }
236
+ function isRegex(value) {
237
+ try {
238
+ regExpTest(value, "");
239
+ return true;
240
+ } catch (_unused) {
241
+ return false;
242
+ }
243
+ }
244
+ var html$1 = freeze(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "search", "section", "select", "shadow", "slot", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]);
245
+ var svg$1 = freeze(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "enterkeyhint", "exportparts", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "inputmode", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "part", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]);
246
+ var svgFilters = freeze(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]);
247
+ var svgDisallowed = freeze(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]);
248
+ var mathMl$1 = freeze(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]);
249
+ var mathMlDisallowed = freeze(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]);
250
+ var text = freeze(["#text"]);
251
+ var html = freeze(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "command", "commandfor", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "exportparts", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inert", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "part", "pattern", "placeholder", "playsinline", "popover", "popovertarget", "popovertargetaction", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "slot", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "wrap", "xmlns"]);
252
+ var svg = freeze(["accent-height", "accumulate", "additive", "alignment-baseline", "amplitude", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dominant-baseline", "dur", "edgemode", "elevation", "end", "exponent", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "intercept", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "mask-type", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "slope", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "tablevalues", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-orientation", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]);
253
+ var mathMl = freeze(["accent", "accentunder", "align", "bevelled", "close", "columnalign", "columnlines", "columnspacing", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lquote", "lspace", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]);
254
+ var xml = freeze(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]);
255
+ var MUSTACHE_EXPR = seal(/{{[\w\W]*|^[\w\W]*}}/g);
256
+ var ERB_EXPR = seal(/<%[\w\W]*|^[\w\W]*%>/g);
257
+ var TMPLIT_EXPR = seal(/\${[\w\W]*/g);
258
+ var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/);
259
+ var ARIA_ATTR = seal(/^aria-[\-\w]+$/);
260
+ var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i);
261
+ var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
262
+ var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g);
263
+ var DOCTYPE_NAME = seal(/^html$/i);
264
+ var CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i);
265
+ var ELEMENT_MARKUP_PROBE = seal(/<[/\w!]/g);
266
+ var COMMENT_MARKUP_PROBE = seal(/<[/\w]/g);
267
+ var FALLBACK_TAG_CLOSE = seal(/<\/no(script|embed|frames)/i);
268
+ var SELF_CLOSING_TAG = seal(/\/>/i);
269
+ var NODE_TYPE = {
270
+ element: 1,
271
+ attribute: 2,
272
+ text: 3,
273
+ cdataSection: 4,
274
+ entityReference: 5,
275
+ entityNode: 6,
276
+ processingInstruction: 7,
277
+ comment: 8,
278
+ document: 9,
279
+ documentType: 10,
280
+ documentFragment: 11,
281
+ notation: 12
282
+ };
283
+ var getGlobal = function getGlobal2() {
284
+ return typeof window === "undefined" ? null : window;
285
+ };
286
+ var _createTrustedTypesPolicy = function _createTrustedTypesPolicy2(trustedTypes, purifyHostElement) {
287
+ if (typeof trustedTypes !== "object" || typeof trustedTypes.createPolicy !== "function") {
288
+ return null;
289
+ }
290
+ let suffix = null;
291
+ const ATTR_NAME = "data-tt-policy-suffix";
292
+ if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {
293
+ suffix = purifyHostElement.getAttribute(ATTR_NAME);
294
+ }
295
+ const policyName = "dompurify" + (suffix ? "#" + suffix : "");
296
+ try {
297
+ return trustedTypes.createPolicy(policyName, {
298
+ createHTML(html2) {
299
+ return html2;
300
+ },
301
+ createScriptURL(scriptUrl) {
302
+ return scriptUrl;
303
+ }
304
+ });
305
+ } catch (_) {
306
+ console.warn("TrustedTypes policy " + policyName + " could not be created.");
307
+ return null;
308
+ }
309
+ };
310
+ var _createHooksMap = function _createHooksMap2() {
311
+ return {
312
+ afterSanitizeAttributes: [],
313
+ afterSanitizeElements: [],
314
+ afterSanitizeShadowDOM: [],
315
+ beforeSanitizeAttributes: [],
316
+ beforeSanitizeElements: [],
317
+ beforeSanitizeShadowDOM: [],
318
+ uponSanitizeAttribute: [],
319
+ uponSanitizeElement: [],
320
+ uponSanitizeShadowNode: []
321
+ };
322
+ };
323
+ var _resolveSetOption = function _resolveSetOption2(cfg, key, fallback, options) {
324
+ return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;
325
+ };
326
+ function createDOMPurify() {
327
+ let window2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
328
+ const DOMPurify = (root) => createDOMPurify(root);
329
+ DOMPurify.version = "3.4.13";
330
+ DOMPurify.removed = [];
331
+ if (!window2 || !window2.document || window2.document.nodeType !== NODE_TYPE.document || !window2.Element) {
332
+ DOMPurify.isSupported = false;
333
+ return DOMPurify;
334
+ }
335
+ let document2 = window2.document;
336
+ const originalDocument = document2;
337
+ const currentScript = originalDocument.currentScript;
338
+ window2.DocumentFragment;
339
+ const { HTMLTemplateElement, Node, Element, NodeFilter, NamedNodeMap: _window$NamedNodeMap } = window2;
340
+ _window$NamedNodeMap === undefined && (window2.NamedNodeMap || window2.MozNamedAttrMap);
341
+ window2.HTMLFormElement;
342
+ const { DOMParser, trustedTypes } = window2;
343
+ const ElementPrototype = Element.prototype;
344
+ const cloneNode = lookupGetter(ElementPrototype, "cloneNode");
345
+ const remove = lookupGetter(ElementPrototype, "remove");
346
+ const getNextSibling = lookupGetter(ElementPrototype, "nextSibling");
347
+ const getChildNodes = lookupGetter(ElementPrototype, "childNodes");
348
+ const getParentNode = lookupGetter(ElementPrototype, "parentNode");
349
+ const getShadowRoot = lookupGetter(ElementPrototype, "shadowRoot");
350
+ const getAttributes = lookupGetter(ElementPrototype, "attributes");
351
+ const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeType") : null;
352
+ const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeName") : null;
353
+ const getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, "ownerDocument") : null;
354
+ if (typeof HTMLTemplateElement === "function") {
355
+ const template = document2.createElement("template");
356
+ if (template.content && template.content.ownerDocument) {
357
+ document2 = template.content.ownerDocument;
358
+ }
359
+ }
360
+ let trustedTypesPolicy;
361
+ let emptyHTML = "";
362
+ let defaultTrustedTypesPolicy;
363
+ let defaultTrustedTypesPolicyResolved = false;
364
+ let IN_TRUSTED_TYPES_POLICY = 0;
365
+ const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy2() {
366
+ if (IN_TRUSTED_TYPES_POLICY > 0) {
367
+ throw typeErrorCreate("A configured TRUSTED_TYPES_POLICY callback (createHTML or " + "createScriptURL) must not call DOMPurify.sanitize, as that causes " + "infinite recursion. Do not pass a policy whose callbacks wrap " + 'DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted ' + 'Types" section of the README.');
368
+ }
369
+ };
370
+ const _createTrustedHTML = function _createTrustedHTML2(html2) {
371
+ _assertNotInTrustedTypesPolicy();
372
+ IN_TRUSTED_TYPES_POLICY++;
373
+ try {
374
+ return trustedTypesPolicy.createHTML(html2);
375
+ } finally {
376
+ IN_TRUSTED_TYPES_POLICY--;
377
+ }
378
+ };
379
+ const _createTrustedScriptURL = function _createTrustedScriptURL2(scriptUrl) {
380
+ _assertNotInTrustedTypesPolicy();
381
+ IN_TRUSTED_TYPES_POLICY++;
382
+ try {
383
+ return trustedTypesPolicy.createScriptURL(scriptUrl);
384
+ } finally {
385
+ IN_TRUSTED_TYPES_POLICY--;
386
+ }
387
+ };
388
+ const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy2() {
389
+ if (!defaultTrustedTypesPolicyResolved) {
390
+ defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);
391
+ defaultTrustedTypesPolicyResolved = true;
392
+ }
393
+ return defaultTrustedTypesPolicy;
394
+ };
395
+ const _document = document2, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;
396
+ const importNode = originalDocument.importNode;
397
+ let hooks = _createHooksMap();
398
+ DOMPurify.isSupported = typeof entries === "function" && typeof getParentNode === "function" && implementation && implementation.createHTMLDocument !== undefined;
399
+ const MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, TMPLIT_EXPR$1 = TMPLIT_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE, CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;
400
+ let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;
401
+ let ALLOWED_TAGS = null;
402
+ const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
403
+ let ALLOWED_ATTR = null;
404
+ const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
405
+ let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {
406
+ tagNameCheck: {
407
+ writable: true,
408
+ configurable: false,
409
+ enumerable: true,
410
+ value: null
411
+ },
412
+ attributeNameCheck: {
413
+ writable: true,
414
+ configurable: false,
415
+ enumerable: true,
416
+ value: null
417
+ },
418
+ allowCustomizedBuiltInElements: {
419
+ writable: true,
420
+ configurable: false,
421
+ enumerable: true,
422
+ value: false
423
+ }
424
+ }));
425
+ let FORBID_TAGS = null;
426
+ let FORBID_ATTR = null;
427
+ const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {
428
+ tagCheck: {
429
+ writable: true,
430
+ configurable: false,
431
+ enumerable: true,
432
+ value: null
433
+ },
434
+ attributeCheck: {
435
+ writable: true,
436
+ configurable: false,
437
+ enumerable: true,
438
+ value: null
439
+ }
440
+ }));
441
+ let ALLOW_ARIA_ATTR = true;
442
+ let ALLOW_DATA_ATTR = true;
443
+ let ALLOW_UNKNOWN_PROTOCOLS = false;
444
+ let ALLOW_SELF_CLOSE_IN_ATTR = true;
445
+ let SAFE_FOR_TEMPLATES = false;
446
+ let SAFE_FOR_XML = true;
447
+ let WHOLE_DOCUMENT = false;
448
+ let SET_CONFIG = false;
449
+ let SET_CONFIG_ALLOWED_TAGS = null;
450
+ let SET_CONFIG_ALLOWED_ATTR = null;
451
+ let FORCE_BODY = false;
452
+ let RETURN_DOM = false;
453
+ let RETURN_DOM_FRAGMENT = false;
454
+ let RETURN_TRUSTED_TYPE = false;
455
+ let SANITIZE_DOM = true;
456
+ let SANITIZE_NAMED_PROPS = false;
457
+ const SANITIZE_NAMED_PROPS_PREFIX = "user-content-";
458
+ let KEEP_CONTENT = true;
459
+ let IN_PLACE = false;
460
+ let USE_PROFILES = {};
461
+ let FORBID_CONTENTS = null;
462
+ const DEFAULT_FORBID_CONTENTS = addToSet({}, [
463
+ "annotation-xml",
464
+ "audio",
465
+ "colgroup",
466
+ "desc",
467
+ "foreignobject",
468
+ "head",
469
+ "iframe",
470
+ "math",
471
+ "mi",
472
+ "mn",
473
+ "mo",
474
+ "ms",
475
+ "mtext",
476
+ "noembed",
477
+ "noframes",
478
+ "noscript",
479
+ "plaintext",
480
+ "script",
481
+ "selectedcontent",
482
+ "style",
483
+ "svg",
484
+ "template",
485
+ "thead",
486
+ "title",
487
+ "video",
488
+ "xmp"
489
+ ]);
490
+ let DATA_URI_TAGS = null;
491
+ const DEFAULT_DATA_URI_TAGS = addToSet({}, ["audio", "video", "img", "source", "image", "track"]);
492
+ let URI_SAFE_ATTRIBUTES = null;
493
+ const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]);
494
+ const MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
495
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
496
+ const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
497
+ let NAMESPACE = HTML_NAMESPACE;
498
+ let IS_EMPTY_INPUT = false;
499
+ let ALLOWED_NAMESPACES = null;
500
+ const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
501
+ const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze(["mi", "mo", "mn", "ms", "mtext"]);
502
+ let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
503
+ const DEFAULT_HTML_INTEGRATION_POINTS = freeze(["annotation-xml"]);
504
+ let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
505
+ const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ["title", "style", "font", "a", "script"]);
506
+ let PARSER_MEDIA_TYPE = null;
507
+ const SUPPORTED_PARSER_MEDIA_TYPES = ["application/xhtml+xml", "text/html"];
508
+ const DEFAULT_PARSER_MEDIA_TYPE = "text/html";
509
+ let transformCaseFunc = null;
510
+ let CONFIG = null;
511
+ const formElement = document2.createElement("form");
512
+ const isRegexOrFunction = function isRegexOrFunction2(testValue) {
513
+ return testValue instanceof RegExp || testValue instanceof Function;
514
+ };
515
+ const _parseConfig = function _parseConfig2() {
516
+ let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
517
+ if (CONFIG && CONFIG === cfg) {
518
+ return;
519
+ }
520
+ if (!cfg || typeof cfg !== "object") {
521
+ cfg = {};
522
+ }
523
+ cfg = clone(cfg);
524
+ PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;
525
+ transformCaseFunc = PARSER_MEDIA_TYPE === "application/xhtml+xml" ? stringToString : stringToLowerCase;
526
+ ALLOWED_TAGS = _resolveSetOption(cfg, "ALLOWED_TAGS", DEFAULT_ALLOWED_TAGS, {
527
+ transform: transformCaseFunc
528
+ });
529
+ ALLOWED_ATTR = _resolveSetOption(cfg, "ALLOWED_ATTR", DEFAULT_ALLOWED_ATTR, {
530
+ transform: transformCaseFunc
531
+ });
532
+ ALLOWED_NAMESPACES = _resolveSetOption(cfg, "ALLOWED_NAMESPACES", DEFAULT_ALLOWED_NAMESPACES, {
533
+ transform: stringToString
534
+ });
535
+ URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, "ADD_URI_SAFE_ATTR", DEFAULT_URI_SAFE_ATTRIBUTES, {
536
+ transform: transformCaseFunc,
537
+ base: DEFAULT_URI_SAFE_ATTRIBUTES
538
+ });
539
+ DATA_URI_TAGS = _resolveSetOption(cfg, "ADD_DATA_URI_TAGS", DEFAULT_DATA_URI_TAGS, {
540
+ transform: transformCaseFunc,
541
+ base: DEFAULT_DATA_URI_TAGS
542
+ });
543
+ FORBID_CONTENTS = _resolveSetOption(cfg, "FORBID_CONTENTS", DEFAULT_FORBID_CONTENTS, {
544
+ transform: transformCaseFunc
545
+ });
546
+ FORBID_TAGS = _resolveSetOption(cfg, "FORBID_TAGS", clone({}), {
547
+ transform: transformCaseFunc
548
+ });
549
+ FORBID_ATTR = _resolveSetOption(cfg, "FORBID_ATTR", clone({}), {
550
+ transform: transformCaseFunc
551
+ });
552
+ USE_PROFILES = objectHasOwnProperty(cfg, "USE_PROFILES") ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === "object" ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;
553
+ ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;
554
+ ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;
555
+ ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;
556
+ ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false;
557
+ SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;
558
+ SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false;
559
+ WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;
560
+ RETURN_DOM = cfg.RETURN_DOM || false;
561
+ RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;
562
+ RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;
563
+ FORCE_BODY = cfg.FORCE_BODY || false;
564
+ SANITIZE_DOM = cfg.SANITIZE_DOM !== false;
565
+ SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false;
566
+ KEEP_CONTENT = cfg.KEEP_CONTENT !== false;
567
+ IN_PLACE = cfg.IN_PLACE || false;
568
+ IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI;
569
+ NAMESPACE = typeof cfg.NAMESPACE === "string" ? cfg.NAMESPACE : HTML_NAMESPACE;
570
+ MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "MATHML_TEXT_INTEGRATION_POINTS") && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === "object" ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
571
+ HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "HTML_INTEGRATION_POINTS") && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === "object" ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
572
+ const customElementHandling = objectHasOwnProperty(cfg, "CUSTOM_ELEMENT_HANDLING") && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === "object" ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);
573
+ CUSTOM_ELEMENT_HANDLING = create(null);
574
+ if (objectHasOwnProperty(customElementHandling, "tagNameCheck") && isRegexOrFunction(customElementHandling.tagNameCheck)) {
575
+ CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck;
576
+ }
577
+ if (objectHasOwnProperty(customElementHandling, "attributeNameCheck") && isRegexOrFunction(customElementHandling.attributeNameCheck)) {
578
+ CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck;
579
+ }
580
+ if (objectHasOwnProperty(customElementHandling, "allowCustomizedBuiltInElements") && typeof customElementHandling.allowCustomizedBuiltInElements === "boolean") {
581
+ CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements;
582
+ }
583
+ seal(CUSTOM_ELEMENT_HANDLING);
584
+ if (SAFE_FOR_TEMPLATES) {
585
+ ALLOW_DATA_ATTR = false;
586
+ }
587
+ if (RETURN_DOM_FRAGMENT) {
588
+ RETURN_DOM = true;
589
+ }
590
+ if (USE_PROFILES) {
591
+ ALLOWED_TAGS = addToSet({}, text);
592
+ ALLOWED_ATTR = create(null);
593
+ if (USE_PROFILES.html === true) {
594
+ addToSet(ALLOWED_TAGS, html$1);
595
+ addToSet(ALLOWED_ATTR, html);
596
+ }
597
+ if (USE_PROFILES.svg === true) {
598
+ addToSet(ALLOWED_TAGS, svg$1);
599
+ addToSet(ALLOWED_ATTR, svg);
600
+ addToSet(ALLOWED_ATTR, xml);
601
+ }
602
+ if (USE_PROFILES.svgFilters === true) {
603
+ addToSet(ALLOWED_TAGS, svgFilters);
604
+ addToSet(ALLOWED_ATTR, svg);
605
+ addToSet(ALLOWED_ATTR, xml);
606
+ }
607
+ if (USE_PROFILES.mathMl === true) {
608
+ addToSet(ALLOWED_TAGS, mathMl$1);
609
+ addToSet(ALLOWED_ATTR, mathMl);
610
+ addToSet(ALLOWED_ATTR, xml);
611
+ }
612
+ }
613
+ EXTRA_ELEMENT_HANDLING.tagCheck = null;
614
+ EXTRA_ELEMENT_HANDLING.attributeCheck = null;
615
+ if (objectHasOwnProperty(cfg, "ADD_TAGS")) {
616
+ if (typeof cfg.ADD_TAGS === "function") {
617
+ EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;
618
+ } else if (arrayIsArray(cfg.ADD_TAGS)) {
619
+ if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
620
+ ALLOWED_TAGS = clone(ALLOWED_TAGS);
621
+ }
622
+ addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
623
+ }
624
+ }
625
+ if (objectHasOwnProperty(cfg, "ADD_ATTR")) {
626
+ if (typeof cfg.ADD_ATTR === "function") {
627
+ EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;
628
+ } else if (arrayIsArray(cfg.ADD_ATTR)) {
629
+ if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
630
+ ALLOWED_ATTR = clone(ALLOWED_ATTR);
631
+ }
632
+ addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
633
+ }
634
+ }
635
+ if (objectHasOwnProperty(cfg, "ADD_URI_SAFE_ATTR") && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {
636
+ addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
637
+ }
638
+ if (objectHasOwnProperty(cfg, "FORBID_CONTENTS") && arrayIsArray(cfg.FORBID_CONTENTS)) {
639
+ if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
640
+ FORBID_CONTENTS = clone(FORBID_CONTENTS);
641
+ }
642
+ addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
643
+ }
644
+ if (objectHasOwnProperty(cfg, "ADD_FORBID_CONTENTS") && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {
645
+ if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
646
+ FORBID_CONTENTS = clone(FORBID_CONTENTS);
647
+ }
648
+ addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);
649
+ }
650
+ if (KEEP_CONTENT) {
651
+ ALLOWED_TAGS["#text"] = true;
652
+ }
653
+ if (WHOLE_DOCUMENT) {
654
+ addToSet(ALLOWED_TAGS, ["html", "head", "body"]);
655
+ }
656
+ if (ALLOWED_TAGS.table) {
657
+ addToSet(ALLOWED_TAGS, ["tbody"]);
658
+ delete FORBID_TAGS.tbody;
659
+ }
660
+ if (cfg.TRUSTED_TYPES_POLICY) {
661
+ if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== "function") {
662
+ throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');
663
+ }
664
+ if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== "function") {
665
+ throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');
666
+ }
667
+ const previousTrustedTypesPolicy = trustedTypesPolicy;
668
+ trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;
669
+ try {
670
+ emptyHTML = _createTrustedHTML("");
671
+ } catch (error) {
672
+ trustedTypesPolicy = previousTrustedTypesPolicy;
673
+ throw error;
674
+ }
675
+ } else if (cfg.TRUSTED_TYPES_POLICY === null) {
676
+ trustedTypesPolicy = undefined;
677
+ emptyHTML = "";
678
+ } else {
679
+ if (trustedTypesPolicy === undefined) {
680
+ trustedTypesPolicy = _getDefaultTrustedTypesPolicy();
681
+ }
682
+ if (trustedTypesPolicy && typeof emptyHTML === "string") {
683
+ emptyHTML = _createTrustedHTML("");
684
+ }
685
+ }
686
+ if (freeze) {
687
+ freeze(cfg);
688
+ }
689
+ CONFIG = cfg;
690
+ };
691
+ const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);
692
+ const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);
693
+ const _checkSvgNamespace = function _checkSvgNamespace2(tagName, parent, parentTagName) {
694
+ if (parent.namespaceURI === HTML_NAMESPACE) {
695
+ return tagName === "svg";
696
+ }
697
+ if (parent.namespaceURI === MATHML_NAMESPACE) {
698
+ return tagName === "svg" && (parentTagName === "annotation-xml" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
699
+ }
700
+ return Boolean(ALL_SVG_TAGS[tagName]);
701
+ };
702
+ const _checkMathMlNamespace = function _checkMathMlNamespace2(tagName, parent, parentTagName) {
703
+ if (parent.namespaceURI === HTML_NAMESPACE) {
704
+ return tagName === "math";
705
+ }
706
+ if (parent.namespaceURI === SVG_NAMESPACE) {
707
+ return tagName === "math" && HTML_INTEGRATION_POINTS[parentTagName];
708
+ }
709
+ return Boolean(ALL_MATHML_TAGS[tagName]);
710
+ };
711
+ const _checkHtmlNamespace = function _checkHtmlNamespace2(tagName, parent, parentTagName) {
712
+ if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
713
+ return false;
714
+ }
715
+ if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
716
+ return false;
717
+ }
718
+ return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
719
+ };
720
+ const _checkValidNamespace = function _checkValidNamespace2(element) {
721
+ let parent = getParentNode(element);
722
+ if (!parent || !parent.tagName) {
723
+ parent = {
724
+ namespaceURI: NAMESPACE,
725
+ tagName: "template"
726
+ };
727
+ }
728
+ const tagName = stringToLowerCase(element.tagName);
729
+ const parentTagName = stringToLowerCase(parent.tagName);
730
+ if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
731
+ return false;
732
+ }
733
+ if (element.namespaceURI === SVG_NAMESPACE) {
734
+ return _checkSvgNamespace(tagName, parent, parentTagName);
735
+ }
736
+ if (element.namespaceURI === MATHML_NAMESPACE) {
737
+ return _checkMathMlNamespace(tagName, parent, parentTagName);
738
+ }
739
+ if (element.namespaceURI === HTML_NAMESPACE) {
740
+ return _checkHtmlNamespace(tagName, parent, parentTagName);
741
+ }
742
+ if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && ALLOWED_NAMESPACES[element.namespaceURI]) {
743
+ return true;
744
+ }
745
+ return false;
746
+ };
747
+ const _forceRemove = function _forceRemove2(node) {
748
+ arrayPush(DOMPurify.removed, {
749
+ element: node
750
+ });
751
+ try {
752
+ getParentNode(node).removeChild(node);
753
+ } catch (_) {
754
+ remove(node);
755
+ if (!getParentNode(node)) {
756
+ throw typeErrorCreate("a node selected for removal could not be detached from its tree " + "and cannot be safely returned; refusing to sanitize in place");
757
+ }
758
+ }
759
+ };
760
+ const _neutralizeRoot = function _neutralizeRoot2(root) {
761
+ _neutralizeSubtree(root);
762
+ const childNodes = getChildNodes(root);
763
+ if (childNodes) {
764
+ const snapshot = [];
765
+ arrayForEach(childNodes, (child) => {
766
+ arrayPush(snapshot, child);
767
+ });
768
+ arrayForEach(snapshot, (child) => {
769
+ try {
770
+ remove(child);
771
+ } catch (_) {}
772
+ });
773
+ }
774
+ const attributes = getAttributes(root);
775
+ if (attributes) {
776
+ for (let i = attributes.length - 1;i >= 0; --i) {
777
+ const attribute = attributes[i];
778
+ const name = attribute && attribute.name;
779
+ if (typeof name === "string") {
780
+ try {
781
+ root.removeAttribute(name);
782
+ } catch (_) {}
783
+ }
784
+ }
785
+ }
786
+ };
787
+ const _removeAttribute = function _removeAttribute2(name, element) {
788
+ try {
789
+ arrayPush(DOMPurify.removed, {
790
+ attribute: element.getAttributeNode(name),
791
+ from: element
792
+ });
793
+ } catch (_) {
794
+ arrayPush(DOMPurify.removed, {
795
+ attribute: null,
796
+ from: element
797
+ });
798
+ }
799
+ element.removeAttribute(name);
800
+ if (name === "is") {
801
+ if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
802
+ try {
803
+ _forceRemove(element);
804
+ } catch (_) {}
805
+ } else {
806
+ try {
807
+ element.setAttribute(name, "");
808
+ } catch (_) {}
809
+ }
810
+ }
811
+ };
812
+ const _stripDisallowedAttributes = function _stripDisallowedAttributes2(element) {
813
+ const attributes = getAttributes(element);
814
+ if (!attributes) {
815
+ return;
816
+ }
817
+ for (let i = attributes.length - 1;i >= 0; --i) {
818
+ const attribute = attributes[i];
819
+ const name = attribute && attribute.name;
820
+ if (typeof name !== "string" || ALLOWED_ATTR[transformCaseFunc(name)]) {
821
+ continue;
822
+ }
823
+ try {
824
+ element.removeAttribute(name);
825
+ } catch (_) {}
826
+ }
827
+ };
828
+ const _neutralizeSubtree = function _neutralizeSubtree2(root) {
829
+ const stack = [root];
830
+ while (stack.length > 0) {
831
+ const node = stack.pop();
832
+ const nodeType = getNodeType ? getNodeType(node) : node.nodeType;
833
+ if (nodeType === NODE_TYPE.element) {
834
+ _stripDisallowedAttributes(node);
835
+ }
836
+ const childNodes = getChildNodes(node);
837
+ if (childNodes) {
838
+ for (let i = childNodes.length - 1;i >= 0; --i) {
839
+ stack.push(childNodes[i]);
840
+ }
841
+ }
842
+ }
843
+ };
844
+ const _neutralizePatchLinkage = function _neutralizePatchLinkage2(root) {
845
+ if (!SAFE_FOR_XML) {
846
+ return;
847
+ }
848
+ const stack = [root];
849
+ while (stack.length > 0) {
850
+ const node = stack.pop();
851
+ const nodeType = getNodeType ? getNodeType(node) : node.nodeType;
852
+ if (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {
853
+ try {
854
+ remove(node);
855
+ } catch (_) {}
856
+ continue;
857
+ }
858
+ if (nodeType === NODE_TYPE.element) {
859
+ const element = node;
860
+ const lcTag = transformCaseFunc(getNodeName ? getNodeName(node) : node.nodeName);
861
+ try {
862
+ if (element.hasAttribute && element.hasAttribute("patchsrc")) {
863
+ element.removeAttribute("patchsrc");
864
+ }
865
+ if (element.hasAttribute && element.hasAttribute("for") && lcTag !== "label" && lcTag !== "output") {
866
+ element.removeAttribute("for");
867
+ }
868
+ } catch (_) {}
869
+ }
870
+ const childNodes = getChildNodes(node);
871
+ if (childNodes) {
872
+ for (let i = childNodes.length - 1;i >= 0; --i) {
873
+ stack.push(childNodes[i]);
874
+ }
875
+ }
876
+ }
877
+ };
878
+ const _initDocument = function _initDocument2(dirty) {
879
+ let doc = null;
880
+ let leadingWhitespace = null;
881
+ if (FORCE_BODY) {
882
+ dirty = "<remove></remove>" + dirty;
883
+ } else {
884
+ const matches = stringMatch(dirty, /^[\r\n\t ]+/);
885
+ leadingWhitespace = matches && matches[0];
886
+ }
887
+ if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && NAMESPACE === HTML_NAMESPACE) {
888
+ dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + "</body></html>";
889
+ }
890
+ const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;
891
+ if (NAMESPACE === HTML_NAMESPACE) {
892
+ try {
893
+ doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
894
+ } catch (_) {}
895
+ }
896
+ if (!doc || !doc.documentElement) {
897
+ doc = implementation.createDocument(NAMESPACE, "template", null);
898
+ try {
899
+ doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
900
+ } catch (_) {}
901
+ }
902
+ const body = doc.body || doc.documentElement;
903
+ if (dirty && leadingWhitespace) {
904
+ body.insertBefore(document2.createTextNode(leadingWhitespace), body.childNodes[0] || null);
905
+ }
906
+ if (NAMESPACE === HTML_NAMESPACE) {
907
+ return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? "html" : "body")[0];
908
+ }
909
+ return WHOLE_DOCUMENT ? doc.documentElement : body;
910
+ };
911
+ const _createNodeIterator = function _createNodeIterator2(root) {
912
+ const doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;
913
+ return createNodeIterator.call(doc || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);
914
+ };
915
+ const _stripTemplateExpressions = function _stripTemplateExpressions2(value) {
916
+ value = stringReplace(value, MUSTACHE_EXPR$1, " ");
917
+ value = stringReplace(value, ERB_EXPR$1, " ");
918
+ value = stringReplace(value, TMPLIT_EXPR$1, " ");
919
+ return value;
920
+ };
921
+ const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {
922
+ var _node$querySelectorAl;
923
+ node.normalize();
924
+ const doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;
925
+ const walker = createNodeIterator.call(doc || node, node, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);
926
+ let currentNode = walker.nextNode();
927
+ while (currentNode) {
928
+ currentNode.data = _stripTemplateExpressions(currentNode.data);
929
+ currentNode = walker.nextNode();
930
+ }
931
+ const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === undefined ? undefined : _node$querySelectorAl.call(node, "template");
932
+ if (templates) {
933
+ arrayForEach(templates, (tmpl) => {
934
+ if (_isDocumentFragment(tmpl.content)) {
935
+ _scrubTemplateExpressions2(tmpl.content);
936
+ }
937
+ });
938
+ }
939
+ };
940
+ const _isClobbered = function _isClobbered2(element) {
941
+ const realTagName = getNodeName ? getNodeName(element) : null;
942
+ if (typeof realTagName !== "string") {
943
+ return false;
944
+ }
945
+ if (transformCaseFunc(realTagName) !== "form") {
946
+ return false;
947
+ }
948
+ return typeof element.nodeName !== "string" || typeof element.textContent !== "string" || typeof element.removeChild !== "function" || element.attributes !== getAttributes(element) || typeof element.removeAttribute !== "function" || typeof element.setAttribute !== "function" || typeof element.namespaceURI !== "string" || typeof element.insertBefore !== "function" || typeof element.hasChildNodes !== "function" || element.nodeType !== getNodeType(element) || element.childNodes !== getChildNodes(element);
949
+ };
950
+ const _isDocumentFragment = function _isDocumentFragment2(value) {
951
+ if (!getNodeType || typeof value !== "object" || value === null) {
952
+ return false;
953
+ }
954
+ try {
955
+ return getNodeType(value) === NODE_TYPE.documentFragment;
956
+ } catch (_) {
957
+ return false;
958
+ }
959
+ };
960
+ const _isNode = function _isNode2(value) {
961
+ if (!getNodeType || typeof value !== "object" || value === null) {
962
+ return false;
963
+ }
964
+ try {
965
+ return typeof getNodeType(value) === "number";
966
+ } catch (_) {
967
+ return false;
968
+ }
969
+ };
970
+ function _executeHooks(hooks2, currentNode, data) {
971
+ if (hooks2.length === 0) {
972
+ return;
973
+ }
974
+ arrayForEach(hooks2, (hook) => {
975
+ hook.call(DOMPurify, currentNode, data, CONFIG);
976
+ });
977
+ }
978
+ const _isUnsafeNode = function _isUnsafeNode2(currentNode, tagName) {
979
+ if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) {
980
+ return true;
981
+ }
982
+ if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === "style" && _isNode(currentNode.firstElementChild)) {
983
+ return true;
984
+ }
985
+ if (currentNode.nodeType === NODE_TYPE.processingInstruction) {
986
+ return true;
987
+ }
988
+ if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) {
989
+ return true;
990
+ }
991
+ return false;
992
+ };
993
+ const _sanitizeDisallowedNode = function _sanitizeDisallowedNode2(currentNode, tagName, root) {
994
+ if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {
995
+ if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {
996
+ return false;
997
+ }
998
+ if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {
999
+ return false;
1000
+ }
1001
+ }
1002
+ if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
1003
+ const parentNode = getParentNode(currentNode);
1004
+ const childNodes = getChildNodes(currentNode);
1005
+ if (childNodes && parentNode) {
1006
+ const childCount = childNodes.length;
1007
+ for (let i = childCount - 1;i >= 0; --i) {
1008
+ const hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];
1009
+ parentNode.insertBefore(hoisted, getNextSibling(currentNode));
1010
+ }
1011
+ }
1012
+ }
1013
+ _forceRemove(currentNode);
1014
+ return true;
1015
+ };
1016
+ const _forkSharedAllowlist = function _forkSharedAllowlist2(hookList, set, defaultSet, setConfigSet) {
1017
+ if (hookList.length === 0) {
1018
+ return set;
1019
+ }
1020
+ return set === defaultSet || set === setConfigSet ? clone(set) : set;
1021
+ };
1022
+ const _sanitizeElements = function _sanitizeElements2(currentNode, root) {
1023
+ _executeHooks(hooks.beforeSanitizeElements, currentNode, null);
1024
+ if (currentNode !== root && getParentNode(currentNode) === null) {
1025
+ if (IN_PLACE) {
1026
+ _neutralizeSubtree(currentNode);
1027
+ }
1028
+ return true;
1029
+ }
1030
+ if (_isClobbered(currentNode)) {
1031
+ _forceRemove(currentNode);
1032
+ return true;
1033
+ }
1034
+ const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);
1035
+ ALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);
1036
+ _executeHooks(hooks.uponSanitizeElement, currentNode, {
1037
+ tagName,
1038
+ allowedTags: ALLOWED_TAGS
1039
+ });
1040
+ if (currentNode !== root && getParentNode(currentNode) === null) {
1041
+ if (IN_PLACE) {
1042
+ _neutralizeSubtree(currentNode);
1043
+ }
1044
+ return true;
1045
+ }
1046
+ if (_isUnsafeNode(currentNode, tagName)) {
1047
+ _forceRemove(currentNode);
1048
+ return true;
1049
+ }
1050
+ if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {
1051
+ const removed = _sanitizeDisallowedNode(currentNode, tagName, root);
1052
+ if (removed === false) {
1053
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
1054
+ }
1055
+ return removed;
1056
+ }
1057
+ const nt = getNodeType ? getNodeType(currentNode) : currentNode.nodeType;
1058
+ if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {
1059
+ _forceRemove(currentNode);
1060
+ return true;
1061
+ }
1062
+ if ((tagName === "noscript" || tagName === "noembed" || tagName === "noframes") && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {
1063
+ _forceRemove(currentNode);
1064
+ return true;
1065
+ }
1066
+ if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {
1067
+ const content = _stripTemplateExpressions(currentNode.textContent);
1068
+ if (currentNode.textContent !== content) {
1069
+ arrayPush(DOMPurify.removed, {
1070
+ element: currentNode.cloneNode()
1071
+ });
1072
+ currentNode.textContent = content;
1073
+ }
1074
+ }
1075
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
1076
+ return false;
1077
+ };
1078
+ const _isValidAttribute = function _isValidAttribute2(lcTag, lcName, value) {
1079
+ if (FORBID_ATTR[lcName]) {
1080
+ return false;
1081
+ }
1082
+ if (SAFE_FOR_XML && lcName === "patchsrc") {
1083
+ return false;
1084
+ }
1085
+ if (SAFE_FOR_XML && lcName === "for" && lcTag !== "label" && lcTag !== "output") {
1086
+ return false;
1087
+ }
1088
+ if (SANITIZE_DOM && (lcName === "id" || lcName === "name") && ((value in document2) || (value in formElement))) {
1089
+ return false;
1090
+ }
1091
+ const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);
1092
+ if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName))
1093
+ ;
1094
+ else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName))
1095
+ ;
1096
+ else if (!nameIsPermitted) {
1097
+ if (_isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) || lcName === "is" && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value)))
1098
+ ;
1099
+ else {
1100
+ return false;
1101
+ }
1102
+ } else if (URI_SAFE_ATTRIBUTES[lcName])
1103
+ ;
1104
+ else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, "")))
1105
+ ;
1106
+ else if ((lcName === "src" || lcName === "xlink:href" || lcName === "href") && lcTag !== "script" && stringIndexOf(value, "data:") === 0 && DATA_URI_TAGS[lcTag])
1107
+ ;
1108
+ else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, "")))
1109
+ ;
1110
+ else if (value) {
1111
+ return false;
1112
+ } else
1113
+ ;
1114
+ return true;
1115
+ };
1116
+ const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ["annotation-xml", "color-profile", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "missing-glyph"]);
1117
+ const _isBasicCustomElement = function _isBasicCustomElement2(tagName) {
1118
+ return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);
1119
+ };
1120
+ const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute2(lcTag, lcName, namespaceURI, value) {
1121
+ if (trustedTypesPolicy && typeof trustedTypes === "object" && typeof trustedTypes.getAttributeType === "function" && !namespaceURI) {
1122
+ switch (trustedTypes.getAttributeType(lcTag, lcName)) {
1123
+ case "TrustedHTML": {
1124
+ return _createTrustedHTML(value);
1125
+ }
1126
+ case "TrustedScriptURL": {
1127
+ return _createTrustedScriptURL(value);
1128
+ }
1129
+ }
1130
+ }
1131
+ return value;
1132
+ };
1133
+ const _setAttributeValue = function _setAttributeValue2(currentNode, name, namespaceURI, value) {
1134
+ try {
1135
+ if (namespaceURI) {
1136
+ currentNode.setAttributeNS(namespaceURI, name, value);
1137
+ } else {
1138
+ currentNode.setAttribute(name, value);
1139
+ }
1140
+ if (_isClobbered(currentNode)) {
1141
+ _forceRemove(currentNode);
1142
+ } else {
1143
+ arrayPop(DOMPurify.removed);
1144
+ }
1145
+ } catch (_) {
1146
+ _removeAttribute(name, currentNode);
1147
+ }
1148
+ };
1149
+ const _sanitizeAttributes = function _sanitizeAttributes2(currentNode) {
1150
+ _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
1151
+ const attributes = currentNode.attributes;
1152
+ if (!attributes || _isClobbered(currentNode)) {
1153
+ return;
1154
+ }
1155
+ ALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);
1156
+ const hookEvent = {
1157
+ attrName: "",
1158
+ attrValue: "",
1159
+ keepAttr: true,
1160
+ allowedAttributes: ALLOWED_ATTR,
1161
+ forceKeepAttr: undefined
1162
+ };
1163
+ let l = attributes.length;
1164
+ const lcTag = transformCaseFunc(currentNode.nodeName);
1165
+ while (l--) {
1166
+ const attr = attributes[l];
1167
+ const { name, namespaceURI, value: attrValue } = attr;
1168
+ const lcName = transformCaseFunc(name);
1169
+ const initValue = attrValue;
1170
+ let value = name === "value" ? initValue : stringTrim(initValue);
1171
+ hookEvent.attrName = lcName;
1172
+ hookEvent.attrValue = value;
1173
+ hookEvent.keepAttr = true;
1174
+ hookEvent.forceKeepAttr = undefined;
1175
+ _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
1176
+ value = hookEvent.attrValue;
1177
+ if (SANITIZE_NAMED_PROPS && (lcName === "id" || lcName === "name") && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {
1178
+ _removeAttribute(name, currentNode);
1179
+ value = SANITIZE_NAMED_PROPS_PREFIX + value;
1180
+ }
1181
+ if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {
1182
+ _removeAttribute(name, currentNode);
1183
+ continue;
1184
+ }
1185
+ if (lcName === "attributename" && stringMatch(value, "href")) {
1186
+ _removeAttribute(name, currentNode);
1187
+ continue;
1188
+ }
1189
+ if (hookEvent.forceKeepAttr) {
1190
+ continue;
1191
+ }
1192
+ if (!hookEvent.keepAttr) {
1193
+ _removeAttribute(name, currentNode);
1194
+ continue;
1195
+ }
1196
+ if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {
1197
+ _removeAttribute(name, currentNode);
1198
+ continue;
1199
+ }
1200
+ if (SAFE_FOR_TEMPLATES) {
1201
+ value = _stripTemplateExpressions(value);
1202
+ }
1203
+ if (!_isValidAttribute(lcTag, lcName, value)) {
1204
+ _removeAttribute(name, currentNode);
1205
+ continue;
1206
+ }
1207
+ value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);
1208
+ if (value !== initValue) {
1209
+ _setAttributeValue(currentNode, name, namespaceURI, value);
1210
+ }
1211
+ }
1212
+ _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
1213
+ };
1214
+ const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {
1215
+ let shadowNode = null;
1216
+ const shadowIterator = _createNodeIterator(fragment);
1217
+ _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
1218
+ while (shadowNode = shadowIterator.nextNode()) {
1219
+ _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
1220
+ _sanitizeElements(shadowNode, fragment);
1221
+ _sanitizeAttributes(shadowNode);
1222
+ if (_isDocumentFragment(shadowNode.content)) {
1223
+ _sanitizeShadowDOM2(shadowNode.content);
1224
+ }
1225
+ const shadowNodeType = getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType;
1226
+ if (shadowNodeType === NODE_TYPE.element) {
1227
+ const innerSr = getShadowRoot(shadowNode);
1228
+ if (_isDocumentFragment(innerSr)) {
1229
+ _sanitizeAttachedShadowRoots(innerSr);
1230
+ _sanitizeShadowDOM2(innerSr);
1231
+ }
1232
+ }
1233
+ }
1234
+ _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
1235
+ };
1236
+ const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots2(root) {
1237
+ const stack = [{
1238
+ node: root,
1239
+ shadow: null
1240
+ }];
1241
+ while (stack.length > 0) {
1242
+ const item = stack.pop();
1243
+ if (item.shadow) {
1244
+ _sanitizeShadowDOM2(item.shadow);
1245
+ continue;
1246
+ }
1247
+ const node = item.node;
1248
+ const nodeType = getNodeType ? getNodeType(node) : node.nodeType;
1249
+ const isElement = nodeType === NODE_TYPE.element;
1250
+ const childNodes = getChildNodes(node);
1251
+ if (childNodes) {
1252
+ for (let i = childNodes.length - 1;i >= 0; --i) {
1253
+ stack.push({
1254
+ node: childNodes[i],
1255
+ shadow: null
1256
+ });
1257
+ }
1258
+ }
1259
+ if (isElement) {
1260
+ const rootName = getNodeName ? getNodeName(node) : null;
1261
+ if (typeof rootName === "string" && transformCaseFunc(rootName) === "template") {
1262
+ const content = node.content;
1263
+ if (_isDocumentFragment(content)) {
1264
+ stack.push({
1265
+ node: content,
1266
+ shadow: null
1267
+ });
1268
+ }
1269
+ }
1270
+ }
1271
+ if (isElement) {
1272
+ const sr = getShadowRoot(node);
1273
+ if (_isDocumentFragment(sr)) {
1274
+ stack.push({
1275
+ node: null,
1276
+ shadow: sr
1277
+ }, {
1278
+ node: sr,
1279
+ shadow: null
1280
+ });
1281
+ }
1282
+ }
1283
+ }
1284
+ };
1285
+ DOMPurify.sanitize = function(dirty) {
1286
+ let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1287
+ let body = null;
1288
+ let importedNode = null;
1289
+ let currentNode = null;
1290
+ let returnNode = null;
1291
+ IS_EMPTY_INPUT = !dirty;
1292
+ if (IS_EMPTY_INPUT) {
1293
+ dirty = "<!-->";
1294
+ }
1295
+ if (typeof dirty !== "string" && !_isNode(dirty)) {
1296
+ dirty = stringifyValue(dirty);
1297
+ if (typeof dirty !== "string") {
1298
+ throw typeErrorCreate("dirty is not a string, aborting");
1299
+ }
1300
+ }
1301
+ if (!DOMPurify.isSupported) {
1302
+ return dirty;
1303
+ }
1304
+ if (SET_CONFIG) {
1305
+ ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;
1306
+ ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;
1307
+ } else {
1308
+ _parseConfig(cfg);
1309
+ }
1310
+ if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) {
1311
+ ALLOWED_TAGS = clone(ALLOWED_TAGS);
1312
+ }
1313
+ if (hooks.uponSanitizeAttribute.length > 0) {
1314
+ ALLOWED_ATTR = clone(ALLOWED_ATTR);
1315
+ }
1316
+ DOMPurify.removed = [];
1317
+ const inPlace = IN_PLACE && typeof dirty !== "string" && _isNode(dirty);
1318
+ if (inPlace) {
1319
+ _neutralizePatchLinkage(dirty);
1320
+ const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;
1321
+ if (typeof nn === "string") {
1322
+ const tagName = transformCaseFunc(nn);
1323
+ if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
1324
+ _neutralizeRoot(dirty);
1325
+ throw typeErrorCreate("root node is forbidden and cannot be sanitized in-place");
1326
+ }
1327
+ }
1328
+ if (_isClobbered(dirty)) {
1329
+ _neutralizeRoot(dirty);
1330
+ throw typeErrorCreate("root node is clobbered and cannot be sanitized in-place");
1331
+ }
1332
+ try {
1333
+ _sanitizeAttachedShadowRoots(dirty);
1334
+ } catch (error) {
1335
+ _neutralizeRoot(dirty);
1336
+ throw error;
1337
+ }
1338
+ } else if (_isNode(dirty)) {
1339
+ body = _initDocument("<!---->");
1340
+ importedNode = body.ownerDocument.importNode(dirty, true);
1341
+ if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === "BODY") {
1342
+ body = importedNode;
1343
+ } else if (importedNode.nodeName === "HTML") {
1344
+ body = importedNode;
1345
+ } else {
1346
+ body.appendChild(importedNode);
1347
+ }
1348
+ _sanitizeAttachedShadowRoots(importedNode);
1349
+ } else {
1350
+ if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf("<") === -1) {
1351
+ return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;
1352
+ }
1353
+ body = _initDocument(dirty);
1354
+ if (!body) {
1355
+ return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : "";
1356
+ }
1357
+ }
1358
+ if (body && FORCE_BODY) {
1359
+ _forceRemove(body.firstChild);
1360
+ }
1361
+ const walkRoot = inPlace ? dirty : body;
1362
+ try {
1363
+ const nodeIterator = _createNodeIterator(walkRoot);
1364
+ while (currentNode = nodeIterator.nextNode()) {
1365
+ _sanitizeElements(currentNode, walkRoot);
1366
+ _sanitizeAttributes(currentNode);
1367
+ if (_isDocumentFragment(currentNode.content)) {
1368
+ _sanitizeShadowDOM2(currentNode.content);
1369
+ }
1370
+ }
1371
+ } catch (error) {
1372
+ if (inPlace) {
1373
+ _neutralizeRoot(dirty);
1374
+ arrayForEach(DOMPurify.removed, (entry) => {
1375
+ if (entry.element) {
1376
+ _neutralizeSubtree(entry.element);
1377
+ }
1378
+ });
1379
+ }
1380
+ throw error;
1381
+ }
1382
+ if (inPlace) {
1383
+ arrayForEach(DOMPurify.removed, (entry) => {
1384
+ if (entry.element) {
1385
+ _neutralizeSubtree(entry.element);
1386
+ }
1387
+ });
1388
+ if (SAFE_FOR_TEMPLATES) {
1389
+ _scrubTemplateExpressions2(dirty);
1390
+ }
1391
+ return dirty;
1392
+ }
1393
+ if (RETURN_DOM) {
1394
+ if (SAFE_FOR_TEMPLATES) {
1395
+ _scrubTemplateExpressions2(body);
1396
+ }
1397
+ if (RETURN_DOM_FRAGMENT) {
1398
+ returnNode = createDocumentFragment.call(body.ownerDocument);
1399
+ while (body.firstChild) {
1400
+ returnNode.appendChild(body.firstChild);
1401
+ }
1402
+ } else {
1403
+ returnNode = body;
1404
+ }
1405
+ if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {
1406
+ returnNode = importNode.call(originalDocument, returnNode, true);
1407
+ }
1408
+ return returnNode;
1409
+ }
1410
+ let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
1411
+ if (WHOLE_DOCUMENT && ALLOWED_TAGS["!doctype"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
1412
+ serializedHTML = "<!DOCTYPE " + body.ownerDocument.doctype.name + `>
1413
+ ` + serializedHTML;
1414
+ }
1415
+ if (SAFE_FOR_TEMPLATES) {
1416
+ serializedHTML = _stripTemplateExpressions(serializedHTML);
1417
+ }
1418
+ return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;
1419
+ };
1420
+ DOMPurify.setConfig = function() {
1421
+ let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1422
+ _parseConfig(cfg);
1423
+ SET_CONFIG = true;
1424
+ SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;
1425
+ SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;
1426
+ };
1427
+ DOMPurify.clearConfig = function() {
1428
+ CONFIG = null;
1429
+ SET_CONFIG = false;
1430
+ SET_CONFIG_ALLOWED_TAGS = null;
1431
+ SET_CONFIG_ALLOWED_ATTR = null;
1432
+ trustedTypesPolicy = defaultTrustedTypesPolicy;
1433
+ emptyHTML = "";
1434
+ };
1435
+ DOMPurify.isValidAttribute = function(tag, attr, value) {
1436
+ if (!CONFIG) {
1437
+ _parseConfig({});
1438
+ }
1439
+ const lcTag = transformCaseFunc(tag);
1440
+ const lcName = transformCaseFunc(attr);
1441
+ return _isValidAttribute(lcTag, lcName, value);
1442
+ };
1443
+ DOMPurify.addHook = function(entryPoint, hookFunction) {
1444
+ if (typeof hookFunction !== "function") {
1445
+ return;
1446
+ }
1447
+ if (!objectHasOwnProperty(hooks, entryPoint)) {
1448
+ return;
1449
+ }
1450
+ arrayPush(hooks[entryPoint], hookFunction);
1451
+ };
1452
+ DOMPurify.removeHook = function(entryPoint, hookFunction) {
1453
+ if (!objectHasOwnProperty(hooks, entryPoint)) {
1454
+ return;
1455
+ }
1456
+ if (hookFunction !== undefined) {
1457
+ const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);
1458
+ return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];
1459
+ }
1460
+ return arrayPop(hooks[entryPoint]);
1461
+ };
1462
+ DOMPurify.removeHooks = function(entryPoint) {
1463
+ if (!objectHasOwnProperty(hooks, entryPoint)) {
1464
+ return;
1465
+ }
1466
+ hooks[entryPoint] = [];
1467
+ };
1468
+ DOMPurify.removeAllHooks = function() {
1469
+ hooks = _createHooksMap();
1470
+ };
1471
+ return DOMPurify;
1472
+ }
1473
+ var purify = createDOMPurify();
1474
+
1475
+ // node_modules/marked/lib/marked.esm.js
1476
+ function _getDefaults() {
1477
+ return {
1478
+ async: false,
1479
+ breaks: false,
1480
+ extensions: null,
1481
+ gfm: true,
1482
+ hooks: null,
1483
+ pedantic: false,
1484
+ renderer: null,
1485
+ silent: false,
1486
+ tokenizer: null,
1487
+ walkTokens: null
1488
+ };
1489
+ }
1490
+ var _defaults = _getDefaults();
1491
+ function changeDefaults(newDefaults) {
1492
+ _defaults = newDefaults;
1493
+ }
1494
+ var escapeTest = /[&<>"']/;
1495
+ var escapeReplace = new RegExp(escapeTest.source, "g");
1496
+ var escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;
1497
+ var escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, "g");
1498
+ var escapeReplacements = {
1499
+ "&": "&amp;",
1500
+ "<": "&lt;",
1501
+ ">": "&gt;",
1502
+ '"': "&quot;",
1503
+ "'": "&#39;"
1504
+ };
1505
+ var getEscapeReplacement = (ch) => escapeReplacements[ch];
1506
+ function escape$1(html2, encode) {
1507
+ if (encode) {
1508
+ if (escapeTest.test(html2)) {
1509
+ return html2.replace(escapeReplace, getEscapeReplacement);
1510
+ }
1511
+ } else {
1512
+ if (escapeTestNoEncode.test(html2)) {
1513
+ return html2.replace(escapeReplaceNoEncode, getEscapeReplacement);
1514
+ }
1515
+ }
1516
+ return html2;
1517
+ }
1518
+ var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
1519
+ function unescape(html2) {
1520
+ return html2.replace(unescapeTest, (_, n) => {
1521
+ n = n.toLowerCase();
1522
+ if (n === "colon")
1523
+ return ":";
1524
+ if (n.charAt(0) === "#") {
1525
+ return n.charAt(1) === "x" ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
1526
+ }
1527
+ return "";
1528
+ });
1529
+ }
1530
+ var caret = /(^|[^\[])\^/g;
1531
+ function edit(regex, opt) {
1532
+ let source = typeof regex === "string" ? regex : regex.source;
1533
+ opt = opt || "";
1534
+ const obj = {
1535
+ replace: (name, val) => {
1536
+ let valSource = typeof val === "string" ? val : val.source;
1537
+ valSource = valSource.replace(caret, "$1");
1538
+ source = source.replace(name, valSource);
1539
+ return obj;
1540
+ },
1541
+ getRegex: () => {
1542
+ return new RegExp(source, opt);
1543
+ }
1544
+ };
1545
+ return obj;
1546
+ }
1547
+ function cleanUrl(href) {
1548
+ try {
1549
+ href = encodeURI(href).replace(/%25/g, "%");
1550
+ } catch (e) {
1551
+ return null;
1552
+ }
1553
+ return href;
1554
+ }
1555
+ var noopTest = { exec: () => null };
1556
+ function splitCells(tableRow, count) {
1557
+ const row = tableRow.replace(/\|/g, (match, offset, str) => {
1558
+ let escaped = false;
1559
+ let curr = offset;
1560
+ while (--curr >= 0 && str[curr] === "\\")
1561
+ escaped = !escaped;
1562
+ if (escaped) {
1563
+ return "|";
1564
+ } else {
1565
+ return " |";
1566
+ }
1567
+ }), cells = row.split(/ \|/);
1568
+ let i = 0;
1569
+ if (!cells[0].trim()) {
1570
+ cells.shift();
1571
+ }
1572
+ if (cells.length > 0 && !cells[cells.length - 1].trim()) {
1573
+ cells.pop();
1574
+ }
1575
+ if (count) {
1576
+ if (cells.length > count) {
1577
+ cells.splice(count);
1578
+ } else {
1579
+ while (cells.length < count)
1580
+ cells.push("");
1581
+ }
1582
+ }
1583
+ for (;i < cells.length; i++) {
1584
+ cells[i] = cells[i].trim().replace(/\\\|/g, "|");
1585
+ }
1586
+ return cells;
1587
+ }
1588
+ function rtrim(str, c, invert) {
1589
+ const l = str.length;
1590
+ if (l === 0) {
1591
+ return "";
1592
+ }
1593
+ let suffLen = 0;
1594
+ while (suffLen < l) {
1595
+ const currChar = str.charAt(l - suffLen - 1);
1596
+ if (currChar === c && !invert) {
1597
+ suffLen++;
1598
+ } else if (currChar !== c && invert) {
1599
+ suffLen++;
1600
+ } else {
1601
+ break;
1602
+ }
1603
+ }
1604
+ return str.slice(0, l - suffLen);
1605
+ }
1606
+ function findClosingBracket(str, b) {
1607
+ if (str.indexOf(b[1]) === -1) {
1608
+ return -1;
1609
+ }
1610
+ let level = 0;
1611
+ for (let i = 0;i < str.length; i++) {
1612
+ if (str[i] === "\\") {
1613
+ i++;
1614
+ } else if (str[i] === b[0]) {
1615
+ level++;
1616
+ } else if (str[i] === b[1]) {
1617
+ level--;
1618
+ if (level < 0) {
1619
+ return i;
1620
+ }
1621
+ }
1622
+ }
1623
+ return -1;
1624
+ }
1625
+ function outputLink(cap, link, raw, lexer) {
1626
+ const href = link.href;
1627
+ const title = link.title ? escape$1(link.title) : null;
1628
+ const text2 = cap[1].replace(/\\([\[\]])/g, "$1");
1629
+ if (cap[0].charAt(0) !== "!") {
1630
+ lexer.state.inLink = true;
1631
+ const token = {
1632
+ type: "link",
1633
+ raw,
1634
+ href,
1635
+ title,
1636
+ text: text2,
1637
+ tokens: lexer.inlineTokens(text2)
1638
+ };
1639
+ lexer.state.inLink = false;
1640
+ return token;
1641
+ }
1642
+ return {
1643
+ type: "image",
1644
+ raw,
1645
+ href,
1646
+ title,
1647
+ text: escape$1(text2)
1648
+ };
1649
+ }
1650
+ function indentCodeCompensation(raw, text2) {
1651
+ const matchIndentToCode = raw.match(/^(\s+)(?:```)/);
1652
+ if (matchIndentToCode === null) {
1653
+ return text2;
1654
+ }
1655
+ const indentToCode = matchIndentToCode[1];
1656
+ return text2.split(`
1657
+ `).map((node) => {
1658
+ const matchIndentInNode = node.match(/^\s+/);
1659
+ if (matchIndentInNode === null) {
1660
+ return node;
1661
+ }
1662
+ const [indentInNode] = matchIndentInNode;
1663
+ if (indentInNode.length >= indentToCode.length) {
1664
+ return node.slice(indentToCode.length);
1665
+ }
1666
+ return node;
1667
+ }).join(`
1668
+ `);
1669
+ }
1670
+
1671
+ class _Tokenizer {
1672
+ options;
1673
+ rules;
1674
+ lexer;
1675
+ constructor(options) {
1676
+ this.options = options || _defaults;
1677
+ }
1678
+ space(src) {
1679
+ const cap = this.rules.block.newline.exec(src);
1680
+ if (cap && cap[0].length > 0) {
1681
+ return {
1682
+ type: "space",
1683
+ raw: cap[0]
1684
+ };
1685
+ }
1686
+ }
1687
+ code(src) {
1688
+ const cap = this.rules.block.code.exec(src);
1689
+ if (cap) {
1690
+ const text2 = cap[0].replace(/^ {1,4}/gm, "");
1691
+ return {
1692
+ type: "code",
1693
+ raw: cap[0],
1694
+ codeBlockStyle: "indented",
1695
+ text: !this.options.pedantic ? rtrim(text2, `
1696
+ `) : text2
1697
+ };
1698
+ }
1699
+ }
1700
+ fences(src) {
1701
+ const cap = this.rules.block.fences.exec(src);
1702
+ if (cap) {
1703
+ const raw = cap[0];
1704
+ const text2 = indentCodeCompensation(raw, cap[3] || "");
1705
+ return {
1706
+ type: "code",
1707
+ raw,
1708
+ lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : cap[2],
1709
+ text: text2
1710
+ };
1711
+ }
1712
+ }
1713
+ heading(src) {
1714
+ const cap = this.rules.block.heading.exec(src);
1715
+ if (cap) {
1716
+ let text2 = cap[2].trim();
1717
+ if (/#$/.test(text2)) {
1718
+ const trimmed = rtrim(text2, "#");
1719
+ if (this.options.pedantic) {
1720
+ text2 = trimmed.trim();
1721
+ } else if (!trimmed || / $/.test(trimmed)) {
1722
+ text2 = trimmed.trim();
1723
+ }
1724
+ }
1725
+ return {
1726
+ type: "heading",
1727
+ raw: cap[0],
1728
+ depth: cap[1].length,
1729
+ text: text2,
1730
+ tokens: this.lexer.inline(text2)
1731
+ };
1732
+ }
1733
+ }
1734
+ hr(src) {
1735
+ const cap = this.rules.block.hr.exec(src);
1736
+ if (cap) {
1737
+ return {
1738
+ type: "hr",
1739
+ raw: rtrim(cap[0], `
1740
+ `)
1741
+ };
1742
+ }
1743
+ }
1744
+ blockquote(src) {
1745
+ const cap = this.rules.block.blockquote.exec(src);
1746
+ if (cap) {
1747
+ let lines = rtrim(cap[0], `
1748
+ `).split(`
1749
+ `);
1750
+ let raw = "";
1751
+ let text2 = "";
1752
+ const tokens = [];
1753
+ while (lines.length > 0) {
1754
+ let inBlockquote = false;
1755
+ const currentLines = [];
1756
+ let i;
1757
+ for (i = 0;i < lines.length; i++) {
1758
+ if (/^ {0,3}>/.test(lines[i])) {
1759
+ currentLines.push(lines[i]);
1760
+ inBlockquote = true;
1761
+ } else if (!inBlockquote) {
1762
+ currentLines.push(lines[i]);
1763
+ } else {
1764
+ break;
1765
+ }
1766
+ }
1767
+ lines = lines.slice(i);
1768
+ const currentRaw = currentLines.join(`
1769
+ `);
1770
+ const currentText = currentRaw.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g, `
1771
+ $1`).replace(/^ {0,3}>[ \t]?/gm, "");
1772
+ raw = raw ? `${raw}
1773
+ ${currentRaw}` : currentRaw;
1774
+ text2 = text2 ? `${text2}
1775
+ ${currentText}` : currentText;
1776
+ const top = this.lexer.state.top;
1777
+ this.lexer.state.top = true;
1778
+ this.lexer.blockTokens(currentText, tokens, true);
1779
+ this.lexer.state.top = top;
1780
+ if (lines.length === 0) {
1781
+ break;
1782
+ }
1783
+ const lastToken = tokens[tokens.length - 1];
1784
+ if (lastToken?.type === "code") {
1785
+ break;
1786
+ } else if (lastToken?.type === "blockquote") {
1787
+ const oldToken = lastToken;
1788
+ const newText = oldToken.raw + `
1789
+ ` + lines.join(`
1790
+ `);
1791
+ const newToken = this.blockquote(newText);
1792
+ tokens[tokens.length - 1] = newToken;
1793
+ raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;
1794
+ text2 = text2.substring(0, text2.length - oldToken.text.length) + newToken.text;
1795
+ break;
1796
+ } else if (lastToken?.type === "list") {
1797
+ const oldToken = lastToken;
1798
+ const newText = oldToken.raw + `
1799
+ ` + lines.join(`
1800
+ `);
1801
+ const newToken = this.list(newText);
1802
+ tokens[tokens.length - 1] = newToken;
1803
+ raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;
1804
+ text2 = text2.substring(0, text2.length - oldToken.raw.length) + newToken.raw;
1805
+ lines = newText.substring(tokens[tokens.length - 1].raw.length).split(`
1806
+ `);
1807
+ continue;
1808
+ }
1809
+ }
1810
+ return {
1811
+ type: "blockquote",
1812
+ raw,
1813
+ tokens,
1814
+ text: text2
1815
+ };
1816
+ }
1817
+ }
1818
+ list(src) {
1819
+ let cap = this.rules.block.list.exec(src);
1820
+ if (cap) {
1821
+ let bull = cap[1].trim();
1822
+ const isordered = bull.length > 1;
1823
+ const list = {
1824
+ type: "list",
1825
+ raw: "",
1826
+ ordered: isordered,
1827
+ start: isordered ? +bull.slice(0, -1) : "",
1828
+ loose: false,
1829
+ items: []
1830
+ };
1831
+ bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
1832
+ if (this.options.pedantic) {
1833
+ bull = isordered ? bull : "[*+-]";
1834
+ }
1835
+ const itemRegex = new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`);
1836
+ let raw = "";
1837
+ let itemContents = "";
1838
+ let endsWithBlankLine = false;
1839
+ while (src) {
1840
+ let endEarly = false;
1841
+ if (!(cap = itemRegex.exec(src))) {
1842
+ break;
1843
+ }
1844
+ if (this.rules.block.hr.test(src)) {
1845
+ break;
1846
+ }
1847
+ raw = cap[0];
1848
+ src = src.substring(raw.length);
1849
+ let line = cap[2].split(`
1850
+ `, 1)[0].replace(/^\t+/, (t) => " ".repeat(3 * t.length));
1851
+ let nextLine = src.split(`
1852
+ `, 1)[0];
1853
+ let indent = 0;
1854
+ if (this.options.pedantic) {
1855
+ indent = 2;
1856
+ itemContents = line.trimStart();
1857
+ } else {
1858
+ indent = cap[2].search(/[^ ]/);
1859
+ indent = indent > 4 ? 1 : indent;
1860
+ itemContents = line.slice(indent);
1861
+ indent += cap[1].length;
1862
+ }
1863
+ let blankLine = false;
1864
+ if (!line && /^ *$/.test(nextLine)) {
1865
+ raw += nextLine + `
1866
+ `;
1867
+ src = src.substring(nextLine.length + 1);
1868
+ endEarly = true;
1869
+ }
1870
+ if (!endEarly) {
1871
+ const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`);
1872
+ const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`);
1873
+ const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`);
1874
+ const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);
1875
+ while (src) {
1876
+ const rawLine = src.split(`
1877
+ `, 1)[0];
1878
+ nextLine = rawLine;
1879
+ if (this.options.pedantic) {
1880
+ nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ");
1881
+ }
1882
+ if (fencesBeginRegex.test(nextLine)) {
1883
+ break;
1884
+ }
1885
+ if (headingBeginRegex.test(nextLine)) {
1886
+ break;
1887
+ }
1888
+ if (nextBulletRegex.test(nextLine)) {
1889
+ break;
1890
+ }
1891
+ if (hrRegex.test(src)) {
1892
+ break;
1893
+ }
1894
+ if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) {
1895
+ itemContents += `
1896
+ ` + nextLine.slice(indent);
1897
+ } else {
1898
+ if (blankLine) {
1899
+ break;
1900
+ }
1901
+ if (line.search(/[^ ]/) >= 4) {
1902
+ break;
1903
+ }
1904
+ if (fencesBeginRegex.test(line)) {
1905
+ break;
1906
+ }
1907
+ if (headingBeginRegex.test(line)) {
1908
+ break;
1909
+ }
1910
+ if (hrRegex.test(line)) {
1911
+ break;
1912
+ }
1913
+ itemContents += `
1914
+ ` + nextLine;
1915
+ }
1916
+ if (!blankLine && !nextLine.trim()) {
1917
+ blankLine = true;
1918
+ }
1919
+ raw += rawLine + `
1920
+ `;
1921
+ src = src.substring(rawLine.length + 1);
1922
+ line = nextLine.slice(indent);
1923
+ }
1924
+ }
1925
+ if (!list.loose) {
1926
+ if (endsWithBlankLine) {
1927
+ list.loose = true;
1928
+ } else if (/\n *\n *$/.test(raw)) {
1929
+ endsWithBlankLine = true;
1930
+ }
1931
+ }
1932
+ let istask = null;
1933
+ let ischecked;
1934
+ if (this.options.gfm) {
1935
+ istask = /^\[[ xX]\] /.exec(itemContents);
1936
+ if (istask) {
1937
+ ischecked = istask[0] !== "[ ] ";
1938
+ itemContents = itemContents.replace(/^\[[ xX]\] +/, "");
1939
+ }
1940
+ }
1941
+ list.items.push({
1942
+ type: "list_item",
1943
+ raw,
1944
+ task: !!istask,
1945
+ checked: ischecked,
1946
+ loose: false,
1947
+ text: itemContents,
1948
+ tokens: []
1949
+ });
1950
+ list.raw += raw;
1951
+ }
1952
+ list.items[list.items.length - 1].raw = raw.trimEnd();
1953
+ list.items[list.items.length - 1].text = itemContents.trimEnd();
1954
+ list.raw = list.raw.trimEnd();
1955
+ for (let i = 0;i < list.items.length; i++) {
1956
+ this.lexer.state.top = false;
1957
+ list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);
1958
+ if (!list.loose) {
1959
+ const spacers = list.items[i].tokens.filter((t) => t.type === "space");
1960
+ const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => /\n.*\n/.test(t.raw));
1961
+ list.loose = hasMultipleLineBreaks;
1962
+ }
1963
+ }
1964
+ if (list.loose) {
1965
+ for (let i = 0;i < list.items.length; i++) {
1966
+ list.items[i].loose = true;
1967
+ }
1968
+ }
1969
+ return list;
1970
+ }
1971
+ }
1972
+ html(src) {
1973
+ const cap = this.rules.block.html.exec(src);
1974
+ if (cap) {
1975
+ const token = {
1976
+ type: "html",
1977
+ block: true,
1978
+ raw: cap[0],
1979
+ pre: cap[1] === "pre" || cap[1] === "script" || cap[1] === "style",
1980
+ text: cap[0]
1981
+ };
1982
+ return token;
1983
+ }
1984
+ }
1985
+ def(src) {
1986
+ const cap = this.rules.block.def.exec(src);
1987
+ if (cap) {
1988
+ const tag = cap[1].toLowerCase().replace(/\s+/g, " ");
1989
+ const href = cap[2] ? cap[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "";
1990
+ const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : cap[3];
1991
+ return {
1992
+ type: "def",
1993
+ tag,
1994
+ raw: cap[0],
1995
+ href,
1996
+ title
1997
+ };
1998
+ }
1999
+ }
2000
+ table(src) {
2001
+ const cap = this.rules.block.table.exec(src);
2002
+ if (!cap) {
2003
+ return;
2004
+ }
2005
+ if (!/[:|]/.test(cap[2])) {
2006
+ return;
2007
+ }
2008
+ const headers = splitCells(cap[1]);
2009
+ const aligns = cap[2].replace(/^\||\| *$/g, "").split("|");
2010
+ const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, "").split(`
2011
+ `) : [];
2012
+ const item = {
2013
+ type: "table",
2014
+ raw: cap[0],
2015
+ header: [],
2016
+ align: [],
2017
+ rows: []
2018
+ };
2019
+ if (headers.length !== aligns.length) {
2020
+ return;
2021
+ }
2022
+ for (const align of aligns) {
2023
+ if (/^ *-+: *$/.test(align)) {
2024
+ item.align.push("right");
2025
+ } else if (/^ *:-+: *$/.test(align)) {
2026
+ item.align.push("center");
2027
+ } else if (/^ *:-+ *$/.test(align)) {
2028
+ item.align.push("left");
2029
+ } else {
2030
+ item.align.push(null);
2031
+ }
2032
+ }
2033
+ for (let i = 0;i < headers.length; i++) {
2034
+ item.header.push({
2035
+ text: headers[i],
2036
+ tokens: this.lexer.inline(headers[i]),
2037
+ header: true,
2038
+ align: item.align[i]
2039
+ });
2040
+ }
2041
+ for (const row of rows) {
2042
+ item.rows.push(splitCells(row, item.header.length).map((cell, i) => {
2043
+ return {
2044
+ text: cell,
2045
+ tokens: this.lexer.inline(cell),
2046
+ header: false,
2047
+ align: item.align[i]
2048
+ };
2049
+ }));
2050
+ }
2051
+ return item;
2052
+ }
2053
+ lheading(src) {
2054
+ const cap = this.rules.block.lheading.exec(src);
2055
+ if (cap) {
2056
+ return {
2057
+ type: "heading",
2058
+ raw: cap[0],
2059
+ depth: cap[2].charAt(0) === "=" ? 1 : 2,
2060
+ text: cap[1],
2061
+ tokens: this.lexer.inline(cap[1])
2062
+ };
2063
+ }
2064
+ }
2065
+ paragraph(src) {
2066
+ const cap = this.rules.block.paragraph.exec(src);
2067
+ if (cap) {
2068
+ const text2 = cap[1].charAt(cap[1].length - 1) === `
2069
+ ` ? cap[1].slice(0, -1) : cap[1];
2070
+ return {
2071
+ type: "paragraph",
2072
+ raw: cap[0],
2073
+ text: text2,
2074
+ tokens: this.lexer.inline(text2)
2075
+ };
2076
+ }
2077
+ }
2078
+ text(src) {
2079
+ const cap = this.rules.block.text.exec(src);
2080
+ if (cap) {
2081
+ return {
2082
+ type: "text",
2083
+ raw: cap[0],
2084
+ text: cap[0],
2085
+ tokens: this.lexer.inline(cap[0])
2086
+ };
2087
+ }
2088
+ }
2089
+ escape(src) {
2090
+ const cap = this.rules.inline.escape.exec(src);
2091
+ if (cap) {
2092
+ return {
2093
+ type: "escape",
2094
+ raw: cap[0],
2095
+ text: escape$1(cap[1])
2096
+ };
2097
+ }
2098
+ }
2099
+ tag(src) {
2100
+ const cap = this.rules.inline.tag.exec(src);
2101
+ if (cap) {
2102
+ if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {
2103
+ this.lexer.state.inLink = true;
2104
+ } else if (this.lexer.state.inLink && /^<\/a>/i.test(cap[0])) {
2105
+ this.lexer.state.inLink = false;
2106
+ }
2107
+ if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
2108
+ this.lexer.state.inRawBlock = true;
2109
+ } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
2110
+ this.lexer.state.inRawBlock = false;
2111
+ }
2112
+ return {
2113
+ type: "html",
2114
+ raw: cap[0],
2115
+ inLink: this.lexer.state.inLink,
2116
+ inRawBlock: this.lexer.state.inRawBlock,
2117
+ block: false,
2118
+ text: cap[0]
2119
+ };
2120
+ }
2121
+ }
2122
+ link(src) {
2123
+ const cap = this.rules.inline.link.exec(src);
2124
+ if (cap) {
2125
+ const trimmedUrl = cap[2].trim();
2126
+ if (!this.options.pedantic && /^</.test(trimmedUrl)) {
2127
+ if (!/>$/.test(trimmedUrl)) {
2128
+ return;
2129
+ }
2130
+ const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
2131
+ if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
2132
+ return;
2133
+ }
2134
+ } else {
2135
+ const lastParenIndex = findClosingBracket(cap[2], "()");
2136
+ if (lastParenIndex > -1) {
2137
+ const start = cap[0].indexOf("!") === 0 ? 5 : 4;
2138
+ const linkLen = start + cap[1].length + lastParenIndex;
2139
+ cap[2] = cap[2].substring(0, lastParenIndex);
2140
+ cap[0] = cap[0].substring(0, linkLen).trim();
2141
+ cap[3] = "";
2142
+ }
2143
+ }
2144
+ let href = cap[2];
2145
+ let title = "";
2146
+ if (this.options.pedantic) {
2147
+ const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
2148
+ if (link) {
2149
+ href = link[1];
2150
+ title = link[3];
2151
+ }
2152
+ } else {
2153
+ title = cap[3] ? cap[3].slice(1, -1) : "";
2154
+ }
2155
+ href = href.trim();
2156
+ if (/^</.test(href)) {
2157
+ if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
2158
+ href = href.slice(1);
2159
+ } else {
2160
+ href = href.slice(1, -1);
2161
+ }
2162
+ }
2163
+ return outputLink(cap, {
2164
+ href: href ? href.replace(this.rules.inline.anyPunctuation, "$1") : href,
2165
+ title: title ? title.replace(this.rules.inline.anyPunctuation, "$1") : title
2166
+ }, cap[0], this.lexer);
2167
+ }
2168
+ }
2169
+ reflink(src, links) {
2170
+ let cap;
2171
+ if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
2172
+ const linkString = (cap[2] || cap[1]).replace(/\s+/g, " ");
2173
+ const link = links[linkString.toLowerCase()];
2174
+ if (!link) {
2175
+ const text2 = cap[0].charAt(0);
2176
+ return {
2177
+ type: "text",
2178
+ raw: text2,
2179
+ text: text2
2180
+ };
2181
+ }
2182
+ return outputLink(cap, link, cap[0], this.lexer);
2183
+ }
2184
+ }
2185
+ emStrong(src, maskedSrc, prevChar = "") {
2186
+ let match = this.rules.inline.emStrongLDelim.exec(src);
2187
+ if (!match)
2188
+ return;
2189
+ if (match[3] && prevChar.match(/[\p{L}\p{N}]/u))
2190
+ return;
2191
+ const nextChar = match[1] || match[2] || "";
2192
+ if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
2193
+ const lLength = [...match[0]].length - 1;
2194
+ let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
2195
+ const endReg = match[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
2196
+ endReg.lastIndex = 0;
2197
+ maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
2198
+ while ((match = endReg.exec(maskedSrc)) != null) {
2199
+ rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
2200
+ if (!rDelim)
2201
+ continue;
2202
+ rLength = [...rDelim].length;
2203
+ if (match[3] || match[4]) {
2204
+ delimTotal += rLength;
2205
+ continue;
2206
+ } else if (match[5] || match[6]) {
2207
+ if (lLength % 3 && !((lLength + rLength) % 3)) {
2208
+ midDelimTotal += rLength;
2209
+ continue;
2210
+ }
2211
+ }
2212
+ delimTotal -= rLength;
2213
+ if (delimTotal > 0)
2214
+ continue;
2215
+ rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
2216
+ const lastCharLength = [...match[0]][0].length;
2217
+ const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);
2218
+ if (Math.min(lLength, rLength) % 2) {
2219
+ const text3 = raw.slice(1, -1);
2220
+ return {
2221
+ type: "em",
2222
+ raw,
2223
+ text: text3,
2224
+ tokens: this.lexer.inlineTokens(text3)
2225
+ };
2226
+ }
2227
+ const text2 = raw.slice(2, -2);
2228
+ return {
2229
+ type: "strong",
2230
+ raw,
2231
+ text: text2,
2232
+ tokens: this.lexer.inlineTokens(text2)
2233
+ };
2234
+ }
2235
+ }
2236
+ }
2237
+ codespan(src) {
2238
+ const cap = this.rules.inline.code.exec(src);
2239
+ if (cap) {
2240
+ let text2 = cap[2].replace(/\n/g, " ");
2241
+ const hasNonSpaceChars = /[^ ]/.test(text2);
2242
+ const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2);
2243
+ if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
2244
+ text2 = text2.substring(1, text2.length - 1);
2245
+ }
2246
+ text2 = escape$1(text2, true);
2247
+ return {
2248
+ type: "codespan",
2249
+ raw: cap[0],
2250
+ text: text2
2251
+ };
2252
+ }
2253
+ }
2254
+ br(src) {
2255
+ const cap = this.rules.inline.br.exec(src);
2256
+ if (cap) {
2257
+ return {
2258
+ type: "br",
2259
+ raw: cap[0]
2260
+ };
2261
+ }
2262
+ }
2263
+ del(src) {
2264
+ const cap = this.rules.inline.del.exec(src);
2265
+ if (cap) {
2266
+ return {
2267
+ type: "del",
2268
+ raw: cap[0],
2269
+ text: cap[2],
2270
+ tokens: this.lexer.inlineTokens(cap[2])
2271
+ };
2272
+ }
2273
+ }
2274
+ autolink(src) {
2275
+ const cap = this.rules.inline.autolink.exec(src);
2276
+ if (cap) {
2277
+ let text2, href;
2278
+ if (cap[2] === "@") {
2279
+ text2 = escape$1(cap[1]);
2280
+ href = "mailto:" + text2;
2281
+ } else {
2282
+ text2 = escape$1(cap[1]);
2283
+ href = text2;
2284
+ }
2285
+ return {
2286
+ type: "link",
2287
+ raw: cap[0],
2288
+ text: text2,
2289
+ href,
2290
+ tokens: [
2291
+ {
2292
+ type: "text",
2293
+ raw: text2,
2294
+ text: text2
2295
+ }
2296
+ ]
2297
+ };
2298
+ }
2299
+ }
2300
+ url(src) {
2301
+ let cap;
2302
+ if (cap = this.rules.inline.url.exec(src)) {
2303
+ let text2, href;
2304
+ if (cap[2] === "@") {
2305
+ text2 = escape$1(cap[0]);
2306
+ href = "mailto:" + text2;
2307
+ } else {
2308
+ let prevCapZero;
2309
+ do {
2310
+ prevCapZero = cap[0];
2311
+ cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? "";
2312
+ } while (prevCapZero !== cap[0]);
2313
+ text2 = escape$1(cap[0]);
2314
+ if (cap[1] === "www.") {
2315
+ href = "http://" + cap[0];
2316
+ } else {
2317
+ href = cap[0];
2318
+ }
2319
+ }
2320
+ return {
2321
+ type: "link",
2322
+ raw: cap[0],
2323
+ text: text2,
2324
+ href,
2325
+ tokens: [
2326
+ {
2327
+ type: "text",
2328
+ raw: text2,
2329
+ text: text2
2330
+ }
2331
+ ]
2332
+ };
2333
+ }
2334
+ }
2335
+ inlineText(src) {
2336
+ const cap = this.rules.inline.text.exec(src);
2337
+ if (cap) {
2338
+ let text2;
2339
+ if (this.lexer.state.inRawBlock) {
2340
+ text2 = cap[0];
2341
+ } else {
2342
+ text2 = escape$1(cap[0]);
2343
+ }
2344
+ return {
2345
+ type: "text",
2346
+ raw: cap[0],
2347
+ text: text2
2348
+ };
2349
+ }
2350
+ }
2351
+ }
2352
+ var newline = /^(?: *(?:\n|$))+/;
2353
+ var blockCode = /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/;
2354
+ var fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;
2355
+ var hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;
2356
+ var heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;
2357
+ var bullet = /(?:[*+-]|\d{1,9}[.)])/;
2358
+ var lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g, bullet).replace(/blockCode/g, / {4}/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).getRegex();
2359
+ var _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/;
2360
+ var blockText = /^[^\n]+/;
2361
+ var _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
2362
+ var def = edit(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label", _blockLabel).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();
2363
+ var list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, bullet).getRegex();
2364
+ var _tag = "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";
2365
+ var _comment = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
2366
+ var html2 = edit("^ {0,3}(?:" + "<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)" + "|comment[^\\n]*(\\n+|$)" + "|<\\?[\\s\\S]*?(?:\\?>\\n*|$)" + "|<![A-Z][\\s\\S]*?(?:>\\n*|$)" + "|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\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", _comment).replace("tag", _tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
2367
+ var paragraph = edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
2368
+ var blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", paragraph).getRegex();
2369
+ var blockNormal = {
2370
+ blockquote,
2371
+ code: blockCode,
2372
+ def,
2373
+ fences,
2374
+ heading,
2375
+ hr,
2376
+ html: html2,
2377
+ lheading,
2378
+ list,
2379
+ newline,
2380
+ paragraph,
2381
+ table: noopTest,
2382
+ text: blockText
2383
+ };
2384
+ var gfmTable = edit("^ *([^\\n ].*)\\n" + " {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)" + "(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
2385
+ var blockGfm = {
2386
+ ...blockNormal,
2387
+ table: gfmTable,
2388
+ paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", gfmTable).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex()
2389
+ };
2390
+ var blockPedantic = {
2391
+ ...blockNormal,
2392
+ html: edit("^ *(?:comment *(?:\\n|\\s*$)" + "|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)" + `|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", _comment).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(),
2393
+ def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
2394
+ heading: /^(#{1,6})(.*)(?:\n+|$)/,
2395
+ fences: noopTest,
2396
+ lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
2397
+ paragraph: edit(_paragraph).replace("hr", hr).replace("heading", ` *#{1,6} *[^
2398
+ ]`).replace("lheading", lheading).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
2399
+ };
2400
+ var escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
2401
+ var inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;
2402
+ var br = /^( {2,}|\\)\n(?!\s*$)/;
2403
+ var inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;
2404
+ var _punctuation = "\\p{P}\\p{S}";
2405
+ var punctuation = edit(/^((?![*_])[\spunctuation])/, "u").replace(/punctuation/g, _punctuation).getRegex();
2406
+ var blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;
2407
+ var emStrongLDelim = edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, "u").replace(/punct/g, _punctuation).getRegex();
2408
+ var emStrongRDelimAst = edit("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)" + "|[^*]+(?=[^*])" + "|(?!\\*)[punct](\\*+)(?=[\\s]|$)" + "|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)" + "|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])" + "|[\\s](\\*+)(?!\\*)(?=[punct])" + "|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])" + "|[^punct\\s](\\*+)(?=[^punct\\s])", "gu").replace(/punct/g, _punctuation).getRegex();
2409
+ var emStrongRDelimUnd = edit("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)" + "|[^_]+(?=[^_])" + "|(?!_)[punct](_+)(?=[\\s]|$)" + "|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)" + "|(?!_)[punct\\s](_+)(?=[^punct\\s])" + "|[\\s](_+)(?!_)(?=[punct])" + "|(?!_)[punct](_+)(?!_)(?=[punct])", "gu").replace(/punct/g, _punctuation).getRegex();
2410
+ var anyPunctuation = edit(/\\([punct])/, "gu").replace(/punct/g, _punctuation).getRegex();
2411
+ var autolink = edit(/^<(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();
2412
+ var _inlineComment = edit(_comment).replace("(?:-->|$)", "-->").getRegex();
2413
+ var tag = edit("^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", _inlineComment).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();
2414
+ var _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
2415
+ var link = edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label", _inlineLabel).replace("href", /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();
2416
+ var reflink = edit(/^!?\[(label)\]\[(ref)\]/).replace("label", _inlineLabel).replace("ref", _blockLabel).getRegex();
2417
+ var nolink = edit(/^!?\[(ref)\](?:\[\])?/).replace("ref", _blockLabel).getRegex();
2418
+ var reflinkSearch = edit("reflink|nolink(?!\\()", "g").replace("reflink", reflink).replace("nolink", nolink).getRegex();
2419
+ var inlineNormal = {
2420
+ _backpedal: noopTest,
2421
+ anyPunctuation,
2422
+ autolink,
2423
+ blockSkip,
2424
+ br,
2425
+ code: inlineCode,
2426
+ del: noopTest,
2427
+ emStrongLDelim,
2428
+ emStrongRDelimAst,
2429
+ emStrongRDelimUnd,
2430
+ escape,
2431
+ link,
2432
+ nolink,
2433
+ punctuation,
2434
+ reflink,
2435
+ reflinkSearch,
2436
+ tag,
2437
+ text: inlineText,
2438
+ url: noopTest
2439
+ };
2440
+ var inlinePedantic = {
2441
+ ...inlineNormal,
2442
+ link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", _inlineLabel).getRegex(),
2443
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", _inlineLabel).getRegex()
2444
+ };
2445
+ var inlineGfm = {
2446
+ ...inlineNormal,
2447
+ escape: edit(escape).replace("])", "~|])").getRegex(),
2448
+ url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
2449
+ _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
2450
+ del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
2451
+ text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
2452
+ };
2453
+ var inlineBreaks = {
2454
+ ...inlineGfm,
2455
+ br: edit(br).replace("{2,}", "*").getRegex(),
2456
+ text: edit(inlineGfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
2457
+ };
2458
+ var block = {
2459
+ normal: blockNormal,
2460
+ gfm: blockGfm,
2461
+ pedantic: blockPedantic
2462
+ };
2463
+ var inline = {
2464
+ normal: inlineNormal,
2465
+ gfm: inlineGfm,
2466
+ breaks: inlineBreaks,
2467
+ pedantic: inlinePedantic
2468
+ };
2469
+
2470
+ class _Lexer {
2471
+ tokens;
2472
+ options;
2473
+ state;
2474
+ tokenizer;
2475
+ inlineQueue;
2476
+ constructor(options) {
2477
+ this.tokens = [];
2478
+ this.tokens.links = Object.create(null);
2479
+ this.options = options || _defaults;
2480
+ this.options.tokenizer = this.options.tokenizer || new _Tokenizer;
2481
+ this.tokenizer = this.options.tokenizer;
2482
+ this.tokenizer.options = this.options;
2483
+ this.tokenizer.lexer = this;
2484
+ this.inlineQueue = [];
2485
+ this.state = {
2486
+ inLink: false,
2487
+ inRawBlock: false,
2488
+ top: true
2489
+ };
2490
+ const rules = {
2491
+ block: block.normal,
2492
+ inline: inline.normal
2493
+ };
2494
+ if (this.options.pedantic) {
2495
+ rules.block = block.pedantic;
2496
+ rules.inline = inline.pedantic;
2497
+ } else if (this.options.gfm) {
2498
+ rules.block = block.gfm;
2499
+ if (this.options.breaks) {
2500
+ rules.inline = inline.breaks;
2501
+ } else {
2502
+ rules.inline = inline.gfm;
2503
+ }
2504
+ }
2505
+ this.tokenizer.rules = rules;
2506
+ }
2507
+ static get rules() {
2508
+ return {
2509
+ block,
2510
+ inline
2511
+ };
2512
+ }
2513
+ static lex(src, options) {
2514
+ const lexer = new _Lexer(options);
2515
+ return lexer.lex(src);
2516
+ }
2517
+ static lexInline(src, options) {
2518
+ const lexer = new _Lexer(options);
2519
+ return lexer.inlineTokens(src);
2520
+ }
2521
+ lex(src) {
2522
+ src = src.replace(/\r\n|\r/g, `
2523
+ `);
2524
+ this.blockTokens(src, this.tokens);
2525
+ for (let i = 0;i < this.inlineQueue.length; i++) {
2526
+ const next = this.inlineQueue[i];
2527
+ this.inlineTokens(next.src, next.tokens);
2528
+ }
2529
+ this.inlineQueue = [];
2530
+ return this.tokens;
2531
+ }
2532
+ blockTokens(src, tokens = [], lastParagraphClipped = false) {
2533
+ if (this.options.pedantic) {
2534
+ src = src.replace(/\t/g, " ").replace(/^ +$/gm, "");
2535
+ } else {
2536
+ src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => {
2537
+ return leading + " ".repeat(tabs.length);
2538
+ });
2539
+ }
2540
+ let token;
2541
+ let lastToken;
2542
+ let cutSrc;
2543
+ while (src) {
2544
+ if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => {
2545
+ if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
2546
+ src = src.substring(token.raw.length);
2547
+ tokens.push(token);
2548
+ return true;
2549
+ }
2550
+ return false;
2551
+ })) {
2552
+ continue;
2553
+ }
2554
+ if (token = this.tokenizer.space(src)) {
2555
+ src = src.substring(token.raw.length);
2556
+ if (token.raw.length === 1 && tokens.length > 0) {
2557
+ tokens[tokens.length - 1].raw += `
2558
+ `;
2559
+ } else {
2560
+ tokens.push(token);
2561
+ }
2562
+ continue;
2563
+ }
2564
+ if (token = this.tokenizer.code(src)) {
2565
+ src = src.substring(token.raw.length);
2566
+ lastToken = tokens[tokens.length - 1];
2567
+ if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
2568
+ lastToken.raw += `
2569
+ ` + token.raw;
2570
+ lastToken.text += `
2571
+ ` + token.text;
2572
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
2573
+ } else {
2574
+ tokens.push(token);
2575
+ }
2576
+ continue;
2577
+ }
2578
+ if (token = this.tokenizer.fences(src)) {
2579
+ src = src.substring(token.raw.length);
2580
+ tokens.push(token);
2581
+ continue;
2582
+ }
2583
+ if (token = this.tokenizer.heading(src)) {
2584
+ src = src.substring(token.raw.length);
2585
+ tokens.push(token);
2586
+ continue;
2587
+ }
2588
+ if (token = this.tokenizer.hr(src)) {
2589
+ src = src.substring(token.raw.length);
2590
+ tokens.push(token);
2591
+ continue;
2592
+ }
2593
+ if (token = this.tokenizer.blockquote(src)) {
2594
+ src = src.substring(token.raw.length);
2595
+ tokens.push(token);
2596
+ continue;
2597
+ }
2598
+ if (token = this.tokenizer.list(src)) {
2599
+ src = src.substring(token.raw.length);
2600
+ tokens.push(token);
2601
+ continue;
2602
+ }
2603
+ if (token = this.tokenizer.html(src)) {
2604
+ src = src.substring(token.raw.length);
2605
+ tokens.push(token);
2606
+ continue;
2607
+ }
2608
+ if (token = this.tokenizer.def(src)) {
2609
+ src = src.substring(token.raw.length);
2610
+ lastToken = tokens[tokens.length - 1];
2611
+ if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) {
2612
+ lastToken.raw += `
2613
+ ` + token.raw;
2614
+ lastToken.text += `
2615
+ ` + token.raw;
2616
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
2617
+ } else if (!this.tokens.links[token.tag]) {
2618
+ this.tokens.links[token.tag] = {
2619
+ href: token.href,
2620
+ title: token.title
2621
+ };
2622
+ }
2623
+ continue;
2624
+ }
2625
+ if (token = this.tokenizer.table(src)) {
2626
+ src = src.substring(token.raw.length);
2627
+ tokens.push(token);
2628
+ continue;
2629
+ }
2630
+ if (token = this.tokenizer.lheading(src)) {
2631
+ src = src.substring(token.raw.length);
2632
+ tokens.push(token);
2633
+ continue;
2634
+ }
2635
+ cutSrc = src;
2636
+ if (this.options.extensions && this.options.extensions.startBlock) {
2637
+ let startIndex = Infinity;
2638
+ const tempSrc = src.slice(1);
2639
+ let tempStart;
2640
+ this.options.extensions.startBlock.forEach((getStartIndex) => {
2641
+ tempStart = getStartIndex.call({ lexer: this }, tempSrc);
2642
+ if (typeof tempStart === "number" && tempStart >= 0) {
2643
+ startIndex = Math.min(startIndex, tempStart);
2644
+ }
2645
+ });
2646
+ if (startIndex < Infinity && startIndex >= 0) {
2647
+ cutSrc = src.substring(0, startIndex + 1);
2648
+ }
2649
+ }
2650
+ if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
2651
+ lastToken = tokens[tokens.length - 1];
2652
+ if (lastParagraphClipped && lastToken?.type === "paragraph") {
2653
+ lastToken.raw += `
2654
+ ` + token.raw;
2655
+ lastToken.text += `
2656
+ ` + token.text;
2657
+ this.inlineQueue.pop();
2658
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
2659
+ } else {
2660
+ tokens.push(token);
2661
+ }
2662
+ lastParagraphClipped = cutSrc.length !== src.length;
2663
+ src = src.substring(token.raw.length);
2664
+ continue;
2665
+ }
2666
+ if (token = this.tokenizer.text(src)) {
2667
+ src = src.substring(token.raw.length);
2668
+ lastToken = tokens[tokens.length - 1];
2669
+ if (lastToken && lastToken.type === "text") {
2670
+ lastToken.raw += `
2671
+ ` + token.raw;
2672
+ lastToken.text += `
2673
+ ` + token.text;
2674
+ this.inlineQueue.pop();
2675
+ this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;
2676
+ } else {
2677
+ tokens.push(token);
2678
+ }
2679
+ continue;
2680
+ }
2681
+ if (src) {
2682
+ const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
2683
+ if (this.options.silent) {
2684
+ console.error(errMsg);
2685
+ break;
2686
+ } else {
2687
+ throw new Error(errMsg);
2688
+ }
2689
+ }
2690
+ }
2691
+ this.state.top = true;
2692
+ return tokens;
2693
+ }
2694
+ inline(src, tokens = []) {
2695
+ this.inlineQueue.push({ src, tokens });
2696
+ return tokens;
2697
+ }
2698
+ inlineTokens(src, tokens = []) {
2699
+ let token, lastToken, cutSrc;
2700
+ let maskedSrc = src;
2701
+ let match;
2702
+ let keepPrevChar, prevChar;
2703
+ if (this.tokens.links) {
2704
+ const links = Object.keys(this.tokens.links);
2705
+ if (links.length > 0) {
2706
+ while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
2707
+ if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
2708
+ maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
2709
+ }
2710
+ }
2711
+ }
2712
+ }
2713
+ while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
2714
+ maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
2715
+ }
2716
+ while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
2717
+ maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
2718
+ }
2719
+ while (src) {
2720
+ if (!keepPrevChar) {
2721
+ prevChar = "";
2722
+ }
2723
+ keepPrevChar = false;
2724
+ if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => {
2725
+ if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
2726
+ src = src.substring(token.raw.length);
2727
+ tokens.push(token);
2728
+ return true;
2729
+ }
2730
+ return false;
2731
+ })) {
2732
+ continue;
2733
+ }
2734
+ if (token = this.tokenizer.escape(src)) {
2735
+ src = src.substring(token.raw.length);
2736
+ tokens.push(token);
2737
+ continue;
2738
+ }
2739
+ if (token = this.tokenizer.tag(src)) {
2740
+ src = src.substring(token.raw.length);
2741
+ lastToken = tokens[tokens.length - 1];
2742
+ if (lastToken && token.type === "text" && lastToken.type === "text") {
2743
+ lastToken.raw += token.raw;
2744
+ lastToken.text += token.text;
2745
+ } else {
2746
+ tokens.push(token);
2747
+ }
2748
+ continue;
2749
+ }
2750
+ if (token = this.tokenizer.link(src)) {
2751
+ src = src.substring(token.raw.length);
2752
+ tokens.push(token);
2753
+ continue;
2754
+ }
2755
+ if (token = this.tokenizer.reflink(src, this.tokens.links)) {
2756
+ src = src.substring(token.raw.length);
2757
+ lastToken = tokens[tokens.length - 1];
2758
+ if (lastToken && token.type === "text" && lastToken.type === "text") {
2759
+ lastToken.raw += token.raw;
2760
+ lastToken.text += token.text;
2761
+ } else {
2762
+ tokens.push(token);
2763
+ }
2764
+ continue;
2765
+ }
2766
+ if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
2767
+ src = src.substring(token.raw.length);
2768
+ tokens.push(token);
2769
+ continue;
2770
+ }
2771
+ if (token = this.tokenizer.codespan(src)) {
2772
+ src = src.substring(token.raw.length);
2773
+ tokens.push(token);
2774
+ continue;
2775
+ }
2776
+ if (token = this.tokenizer.br(src)) {
2777
+ src = src.substring(token.raw.length);
2778
+ tokens.push(token);
2779
+ continue;
2780
+ }
2781
+ if (token = this.tokenizer.del(src)) {
2782
+ src = src.substring(token.raw.length);
2783
+ tokens.push(token);
2784
+ continue;
2785
+ }
2786
+ if (token = this.tokenizer.autolink(src)) {
2787
+ src = src.substring(token.raw.length);
2788
+ tokens.push(token);
2789
+ continue;
2790
+ }
2791
+ if (!this.state.inLink && (token = this.tokenizer.url(src))) {
2792
+ src = src.substring(token.raw.length);
2793
+ tokens.push(token);
2794
+ continue;
2795
+ }
2796
+ cutSrc = src;
2797
+ if (this.options.extensions && this.options.extensions.startInline) {
2798
+ let startIndex = Infinity;
2799
+ const tempSrc = src.slice(1);
2800
+ let tempStart;
2801
+ this.options.extensions.startInline.forEach((getStartIndex) => {
2802
+ tempStart = getStartIndex.call({ lexer: this }, tempSrc);
2803
+ if (typeof tempStart === "number" && tempStart >= 0) {
2804
+ startIndex = Math.min(startIndex, tempStart);
2805
+ }
2806
+ });
2807
+ if (startIndex < Infinity && startIndex >= 0) {
2808
+ cutSrc = src.substring(0, startIndex + 1);
2809
+ }
2810
+ }
2811
+ if (token = this.tokenizer.inlineText(cutSrc)) {
2812
+ src = src.substring(token.raw.length);
2813
+ if (token.raw.slice(-1) !== "_") {
2814
+ prevChar = token.raw.slice(-1);
2815
+ }
2816
+ keepPrevChar = true;
2817
+ lastToken = tokens[tokens.length - 1];
2818
+ if (lastToken && lastToken.type === "text") {
2819
+ lastToken.raw += token.raw;
2820
+ lastToken.text += token.text;
2821
+ } else {
2822
+ tokens.push(token);
2823
+ }
2824
+ continue;
2825
+ }
2826
+ if (src) {
2827
+ const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
2828
+ if (this.options.silent) {
2829
+ console.error(errMsg);
2830
+ break;
2831
+ } else {
2832
+ throw new Error(errMsg);
2833
+ }
2834
+ }
2835
+ }
2836
+ return tokens;
2837
+ }
2838
+ }
2839
+
2840
+ class _Renderer {
2841
+ options;
2842
+ parser;
2843
+ constructor(options) {
2844
+ this.options = options || _defaults;
2845
+ }
2846
+ space(token) {
2847
+ return "";
2848
+ }
2849
+ code({ text: text2, lang, escaped }) {
2850
+ const langString = (lang || "").match(/^\S*/)?.[0];
2851
+ const code = text2.replace(/\n$/, "") + `
2852
+ `;
2853
+ if (!langString) {
2854
+ return "<pre><code>" + (escaped ? code : escape$1(code, true)) + `</code></pre>
2855
+ `;
2856
+ }
2857
+ return '<pre><code class="language-' + escape$1(langString) + '">' + (escaped ? code : escape$1(code, true)) + `</code></pre>
2858
+ `;
2859
+ }
2860
+ blockquote({ tokens }) {
2861
+ const body = this.parser.parse(tokens);
2862
+ return `<blockquote>
2863
+ ${body}</blockquote>
2864
+ `;
2865
+ }
2866
+ html({ text: text2 }) {
2867
+ return text2;
2868
+ }
2869
+ heading({ tokens, depth }) {
2870
+ return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>
2871
+ `;
2872
+ }
2873
+ hr(token) {
2874
+ return `<hr>
2875
+ `;
2876
+ }
2877
+ list(token) {
2878
+ const ordered = token.ordered;
2879
+ const start = token.start;
2880
+ let body = "";
2881
+ for (let j = 0;j < token.items.length; j++) {
2882
+ const item = token.items[j];
2883
+ body += this.listitem(item);
2884
+ }
2885
+ const type = ordered ? "ol" : "ul";
2886
+ const startAttr = ordered && start !== 1 ? ' start="' + start + '"' : "";
2887
+ return "<" + type + startAttr + `>
2888
+ ` + body + "</" + type + `>
2889
+ `;
2890
+ }
2891
+ listitem(item) {
2892
+ let itemBody = "";
2893
+ if (item.task) {
2894
+ const checkbox = this.checkbox({ checked: !!item.checked });
2895
+ if (item.loose) {
2896
+ if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
2897
+ item.tokens[0].text = checkbox + " " + item.tokens[0].text;
2898
+ if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
2899
+ item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
2900
+ }
2901
+ } else {
2902
+ item.tokens.unshift({
2903
+ type: "text",
2904
+ raw: checkbox + " ",
2905
+ text: checkbox + " "
2906
+ });
2907
+ }
2908
+ } else {
2909
+ itemBody += checkbox + " ";
2910
+ }
2911
+ }
2912
+ itemBody += this.parser.parse(item.tokens, !!item.loose);
2913
+ return `<li>${itemBody}</li>
2914
+ `;
2915
+ }
2916
+ checkbox({ checked }) {
2917
+ return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox">';
2918
+ }
2919
+ paragraph({ tokens }) {
2920
+ return `<p>${this.parser.parseInline(tokens)}</p>
2921
+ `;
2922
+ }
2923
+ table(token) {
2924
+ let header = "";
2925
+ let cell = "";
2926
+ for (let j = 0;j < token.header.length; j++) {
2927
+ cell += this.tablecell(token.header[j]);
2928
+ }
2929
+ header += this.tablerow({ text: cell });
2930
+ let body = "";
2931
+ for (let j = 0;j < token.rows.length; j++) {
2932
+ const row = token.rows[j];
2933
+ cell = "";
2934
+ for (let k = 0;k < row.length; k++) {
2935
+ cell += this.tablecell(row[k]);
2936
+ }
2937
+ body += this.tablerow({ text: cell });
2938
+ }
2939
+ if (body)
2940
+ body = `<tbody>${body}</tbody>`;
2941
+ return `<table>
2942
+ ` + `<thead>
2943
+ ` + header + `</thead>
2944
+ ` + body + `</table>
2945
+ `;
2946
+ }
2947
+ tablerow({ text: text2 }) {
2948
+ return `<tr>
2949
+ ${text2}</tr>
2950
+ `;
2951
+ }
2952
+ tablecell(token) {
2953
+ const content = this.parser.parseInline(token.tokens);
2954
+ const type = token.header ? "th" : "td";
2955
+ const tag2 = token.align ? `<${type} align="${token.align}">` : `<${type}>`;
2956
+ return tag2 + content + `</${type}>
2957
+ `;
2958
+ }
2959
+ strong({ tokens }) {
2960
+ return `<strong>${this.parser.parseInline(tokens)}</strong>`;
2961
+ }
2962
+ em({ tokens }) {
2963
+ return `<em>${this.parser.parseInline(tokens)}</em>`;
2964
+ }
2965
+ codespan({ text: text2 }) {
2966
+ return `<code>${text2}</code>`;
2967
+ }
2968
+ br(token) {
2969
+ return "<br>";
2970
+ }
2971
+ del({ tokens }) {
2972
+ return `<del>${this.parser.parseInline(tokens)}</del>`;
2973
+ }
2974
+ link({ href, title, tokens }) {
2975
+ const text2 = this.parser.parseInline(tokens);
2976
+ const cleanHref = cleanUrl(href);
2977
+ if (cleanHref === null) {
2978
+ return text2;
2979
+ }
2980
+ href = cleanHref;
2981
+ let out = '<a href="' + href + '"';
2982
+ if (title) {
2983
+ out += ' title="' + title + '"';
2984
+ }
2985
+ out += ">" + text2 + "</a>";
2986
+ return out;
2987
+ }
2988
+ image({ href, title, text: text2 }) {
2989
+ const cleanHref = cleanUrl(href);
2990
+ if (cleanHref === null) {
2991
+ return text2;
2992
+ }
2993
+ href = cleanHref;
2994
+ let out = `<img src="${href}" alt="${text2}"`;
2995
+ if (title) {
2996
+ out += ` title="${title}"`;
2997
+ }
2998
+ out += ">";
2999
+ return out;
3000
+ }
3001
+ text(token) {
3002
+ return "tokens" in token && token.tokens ? this.parser.parseInline(token.tokens) : token.text;
3003
+ }
3004
+ }
3005
+
3006
+ class _TextRenderer {
3007
+ strong({ text: text2 }) {
3008
+ return text2;
3009
+ }
3010
+ em({ text: text2 }) {
3011
+ return text2;
3012
+ }
3013
+ codespan({ text: text2 }) {
3014
+ return text2;
3015
+ }
3016
+ del({ text: text2 }) {
3017
+ return text2;
3018
+ }
3019
+ html({ text: text2 }) {
3020
+ return text2;
3021
+ }
3022
+ text({ text: text2 }) {
3023
+ return text2;
3024
+ }
3025
+ link({ text: text2 }) {
3026
+ return "" + text2;
3027
+ }
3028
+ image({ text: text2 }) {
3029
+ return "" + text2;
3030
+ }
3031
+ br() {
3032
+ return "";
3033
+ }
3034
+ }
3035
+
3036
+ class _Parser {
3037
+ options;
3038
+ renderer;
3039
+ textRenderer;
3040
+ constructor(options) {
3041
+ this.options = options || _defaults;
3042
+ this.options.renderer = this.options.renderer || new _Renderer;
3043
+ this.renderer = this.options.renderer;
3044
+ this.renderer.options = this.options;
3045
+ this.renderer.parser = this;
3046
+ this.textRenderer = new _TextRenderer;
3047
+ }
3048
+ static parse(tokens, options) {
3049
+ const parser = new _Parser(options);
3050
+ return parser.parse(tokens);
3051
+ }
3052
+ static parseInline(tokens, options) {
3053
+ const parser = new _Parser(options);
3054
+ return parser.parseInline(tokens);
3055
+ }
3056
+ parse(tokens, top = true) {
3057
+ let out = "";
3058
+ for (let i = 0;i < tokens.length; i++) {
3059
+ const anyToken = tokens[i];
3060
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) {
3061
+ const genericToken = anyToken;
3062
+ const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);
3063
+ if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(genericToken.type)) {
3064
+ out += ret || "";
3065
+ continue;
3066
+ }
3067
+ }
3068
+ const token = anyToken;
3069
+ switch (token.type) {
3070
+ case "space": {
3071
+ out += this.renderer.space(token);
3072
+ continue;
3073
+ }
3074
+ case "hr": {
3075
+ out += this.renderer.hr(token);
3076
+ continue;
3077
+ }
3078
+ case "heading": {
3079
+ out += this.renderer.heading(token);
3080
+ continue;
3081
+ }
3082
+ case "code": {
3083
+ out += this.renderer.code(token);
3084
+ continue;
3085
+ }
3086
+ case "table": {
3087
+ out += this.renderer.table(token);
3088
+ continue;
3089
+ }
3090
+ case "blockquote": {
3091
+ out += this.renderer.blockquote(token);
3092
+ continue;
3093
+ }
3094
+ case "list": {
3095
+ out += this.renderer.list(token);
3096
+ continue;
3097
+ }
3098
+ case "html": {
3099
+ out += this.renderer.html(token);
3100
+ continue;
3101
+ }
3102
+ case "paragraph": {
3103
+ out += this.renderer.paragraph(token);
3104
+ continue;
3105
+ }
3106
+ case "text": {
3107
+ let textToken = token;
3108
+ let body = this.renderer.text(textToken);
3109
+ while (i + 1 < tokens.length && tokens[i + 1].type === "text") {
3110
+ textToken = tokens[++i];
3111
+ body += `
3112
+ ` + this.renderer.text(textToken);
3113
+ }
3114
+ if (top) {
3115
+ out += this.renderer.paragraph({
3116
+ type: "paragraph",
3117
+ raw: body,
3118
+ text: body,
3119
+ tokens: [{ type: "text", raw: body, text: body }]
3120
+ });
3121
+ } else {
3122
+ out += body;
3123
+ }
3124
+ continue;
3125
+ }
3126
+ default: {
3127
+ const errMsg = 'Token with "' + token.type + '" type was not found.';
3128
+ if (this.options.silent) {
3129
+ console.error(errMsg);
3130
+ return "";
3131
+ } else {
3132
+ throw new Error(errMsg);
3133
+ }
3134
+ }
3135
+ }
3136
+ }
3137
+ return out;
3138
+ }
3139
+ parseInline(tokens, renderer) {
3140
+ renderer = renderer || this.renderer;
3141
+ let out = "";
3142
+ for (let i = 0;i < tokens.length; i++) {
3143
+ const anyToken = tokens[i];
3144
+ if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) {
3145
+ const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);
3146
+ if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(anyToken.type)) {
3147
+ out += ret || "";
3148
+ continue;
3149
+ }
3150
+ }
3151
+ const token = anyToken;
3152
+ switch (token.type) {
3153
+ case "escape": {
3154
+ out += renderer.text(token);
3155
+ break;
3156
+ }
3157
+ case "html": {
3158
+ out += renderer.html(token);
3159
+ break;
3160
+ }
3161
+ case "link": {
3162
+ out += renderer.link(token);
3163
+ break;
3164
+ }
3165
+ case "image": {
3166
+ out += renderer.image(token);
3167
+ break;
3168
+ }
3169
+ case "strong": {
3170
+ out += renderer.strong(token);
3171
+ break;
3172
+ }
3173
+ case "em": {
3174
+ out += renderer.em(token);
3175
+ break;
3176
+ }
3177
+ case "codespan": {
3178
+ out += renderer.codespan(token);
3179
+ break;
3180
+ }
3181
+ case "br": {
3182
+ out += renderer.br(token);
3183
+ break;
3184
+ }
3185
+ case "del": {
3186
+ out += renderer.del(token);
3187
+ break;
3188
+ }
3189
+ case "text": {
3190
+ out += renderer.text(token);
3191
+ break;
3192
+ }
3193
+ default: {
3194
+ const errMsg = 'Token with "' + token.type + '" type was not found.';
3195
+ if (this.options.silent) {
3196
+ console.error(errMsg);
3197
+ return "";
3198
+ } else {
3199
+ throw new Error(errMsg);
3200
+ }
3201
+ }
3202
+ }
3203
+ }
3204
+ return out;
3205
+ }
3206
+ }
3207
+
3208
+ class _Hooks {
3209
+ options;
3210
+ constructor(options) {
3211
+ this.options = options || _defaults;
3212
+ }
3213
+ static passThroughHooks = new Set([
3214
+ "preprocess",
3215
+ "postprocess",
3216
+ "processAllTokens"
3217
+ ]);
3218
+ preprocess(markdown) {
3219
+ return markdown;
3220
+ }
3221
+ postprocess(html3) {
3222
+ return html3;
3223
+ }
3224
+ processAllTokens(tokens) {
3225
+ return tokens;
3226
+ }
3227
+ }
3228
+
3229
+ class Marked {
3230
+ defaults = _getDefaults();
3231
+ options = this.setOptions;
3232
+ parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);
3233
+ parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);
3234
+ Parser = _Parser;
3235
+ Renderer = _Renderer;
3236
+ TextRenderer = _TextRenderer;
3237
+ Lexer = _Lexer;
3238
+ Tokenizer = _Tokenizer;
3239
+ Hooks = _Hooks;
3240
+ constructor(...args) {
3241
+ this.use(...args);
3242
+ }
3243
+ walkTokens(tokens, callback) {
3244
+ let values = [];
3245
+ for (const token of tokens) {
3246
+ values = values.concat(callback.call(this, token));
3247
+ switch (token.type) {
3248
+ case "table": {
3249
+ const tableToken = token;
3250
+ for (const cell of tableToken.header) {
3251
+ values = values.concat(this.walkTokens(cell.tokens, callback));
3252
+ }
3253
+ for (const row of tableToken.rows) {
3254
+ for (const cell of row) {
3255
+ values = values.concat(this.walkTokens(cell.tokens, callback));
3256
+ }
3257
+ }
3258
+ break;
3259
+ }
3260
+ case "list": {
3261
+ const listToken = token;
3262
+ values = values.concat(this.walkTokens(listToken.items, callback));
3263
+ break;
3264
+ }
3265
+ default: {
3266
+ const genericToken = token;
3267
+ if (this.defaults.extensions?.childTokens?.[genericToken.type]) {
3268
+ this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {
3269
+ const tokens2 = genericToken[childTokens].flat(Infinity);
3270
+ values = values.concat(this.walkTokens(tokens2, callback));
3271
+ });
3272
+ } else if (genericToken.tokens) {
3273
+ values = values.concat(this.walkTokens(genericToken.tokens, callback));
3274
+ }
3275
+ }
3276
+ }
3277
+ }
3278
+ return values;
3279
+ }
3280
+ use(...args) {
3281
+ const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };
3282
+ args.forEach((pack) => {
3283
+ const opts = { ...pack };
3284
+ opts.async = this.defaults.async || opts.async || false;
3285
+ if (pack.extensions) {
3286
+ pack.extensions.forEach((ext) => {
3287
+ if (!ext.name) {
3288
+ throw new Error("extension name required");
3289
+ }
3290
+ if ("renderer" in ext) {
3291
+ const prevRenderer = extensions.renderers[ext.name];
3292
+ if (prevRenderer) {
3293
+ extensions.renderers[ext.name] = function(...args2) {
3294
+ let ret = ext.renderer.apply(this, args2);
3295
+ if (ret === false) {
3296
+ ret = prevRenderer.apply(this, args2);
3297
+ }
3298
+ return ret;
3299
+ };
3300
+ } else {
3301
+ extensions.renderers[ext.name] = ext.renderer;
3302
+ }
3303
+ }
3304
+ if ("tokenizer" in ext) {
3305
+ if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
3306
+ throw new Error("extension level must be 'block' or 'inline'");
3307
+ }
3308
+ const extLevel = extensions[ext.level];
3309
+ if (extLevel) {
3310
+ extLevel.unshift(ext.tokenizer);
3311
+ } else {
3312
+ extensions[ext.level] = [ext.tokenizer];
3313
+ }
3314
+ if (ext.start) {
3315
+ if (ext.level === "block") {
3316
+ if (extensions.startBlock) {
3317
+ extensions.startBlock.push(ext.start);
3318
+ } else {
3319
+ extensions.startBlock = [ext.start];
3320
+ }
3321
+ } else if (ext.level === "inline") {
3322
+ if (extensions.startInline) {
3323
+ extensions.startInline.push(ext.start);
3324
+ } else {
3325
+ extensions.startInline = [ext.start];
3326
+ }
3327
+ }
3328
+ }
3329
+ }
3330
+ if ("childTokens" in ext && ext.childTokens) {
3331
+ extensions.childTokens[ext.name] = ext.childTokens;
3332
+ }
3333
+ });
3334
+ opts.extensions = extensions;
3335
+ }
3336
+ if (pack.renderer) {
3337
+ const renderer = this.defaults.renderer || new _Renderer(this.defaults);
3338
+ for (const prop in pack.renderer) {
3339
+ if (!(prop in renderer)) {
3340
+ throw new Error(`renderer '${prop}' does not exist`);
3341
+ }
3342
+ if (["options", "parser"].includes(prop)) {
3343
+ continue;
3344
+ }
3345
+ const rendererProp = prop;
3346
+ let rendererFunc = pack.renderer[rendererProp];
3347
+ const prevRenderer = renderer[rendererProp];
3348
+ renderer[rendererProp] = (...args2) => {
3349
+ if (!pack.useNewRenderer) {
3350
+ rendererFunc = this.#convertRendererFunction(rendererFunc, rendererProp, renderer);
3351
+ }
3352
+ let ret = rendererFunc.apply(renderer, args2);
3353
+ if (ret === false) {
3354
+ ret = prevRenderer.apply(renderer, args2);
3355
+ }
3356
+ return ret || "";
3357
+ };
3358
+ }
3359
+ opts.renderer = renderer;
3360
+ }
3361
+ if (pack.tokenizer) {
3362
+ const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);
3363
+ for (const prop in pack.tokenizer) {
3364
+ if (!(prop in tokenizer)) {
3365
+ throw new Error(`tokenizer '${prop}' does not exist`);
3366
+ }
3367
+ if (["options", "rules", "lexer"].includes(prop)) {
3368
+ continue;
3369
+ }
3370
+ const tokenizerProp = prop;
3371
+ const tokenizerFunc = pack.tokenizer[tokenizerProp];
3372
+ const prevTokenizer = tokenizer[tokenizerProp];
3373
+ tokenizer[tokenizerProp] = (...args2) => {
3374
+ let ret = tokenizerFunc.apply(tokenizer, args2);
3375
+ if (ret === false) {
3376
+ ret = prevTokenizer.apply(tokenizer, args2);
3377
+ }
3378
+ return ret;
3379
+ };
3380
+ }
3381
+ opts.tokenizer = tokenizer;
3382
+ }
3383
+ if (pack.hooks) {
3384
+ const hooks = this.defaults.hooks || new _Hooks;
3385
+ for (const prop in pack.hooks) {
3386
+ if (!(prop in hooks)) {
3387
+ throw new Error(`hook '${prop}' does not exist`);
3388
+ }
3389
+ if (prop === "options") {
3390
+ continue;
3391
+ }
3392
+ const hooksProp = prop;
3393
+ const hooksFunc = pack.hooks[hooksProp];
3394
+ const prevHook = hooks[hooksProp];
3395
+ if (_Hooks.passThroughHooks.has(prop)) {
3396
+ hooks[hooksProp] = (arg) => {
3397
+ if (this.defaults.async) {
3398
+ return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => {
3399
+ return prevHook.call(hooks, ret2);
3400
+ });
3401
+ }
3402
+ const ret = hooksFunc.call(hooks, arg);
3403
+ return prevHook.call(hooks, ret);
3404
+ };
3405
+ } else {
3406
+ hooks[hooksProp] = (...args2) => {
3407
+ let ret = hooksFunc.apply(hooks, args2);
3408
+ if (ret === false) {
3409
+ ret = prevHook.apply(hooks, args2);
3410
+ }
3411
+ return ret;
3412
+ };
3413
+ }
3414
+ }
3415
+ opts.hooks = hooks;
3416
+ }
3417
+ if (pack.walkTokens) {
3418
+ const walkTokens = this.defaults.walkTokens;
3419
+ const packWalktokens = pack.walkTokens;
3420
+ opts.walkTokens = function(token) {
3421
+ let values = [];
3422
+ values.push(packWalktokens.call(this, token));
3423
+ if (walkTokens) {
3424
+ values = values.concat(walkTokens.call(this, token));
3425
+ }
3426
+ return values;
3427
+ };
3428
+ }
3429
+ this.defaults = { ...this.defaults, ...opts };
3430
+ });
3431
+ return this;
3432
+ }
3433
+ #convertRendererFunction(func, prop, renderer) {
3434
+ switch (prop) {
3435
+ case "heading":
3436
+ return function(token) {
3437
+ if (!token.type || token.type !== prop) {
3438
+ return func.apply(this, arguments);
3439
+ }
3440
+ return func(renderer.parser.parseInline(token.tokens), token.depth, unescape(renderer.parser.parseInline(token.tokens, renderer.parser.textRenderer)));
3441
+ };
3442
+ case "code":
3443
+ return function(token) {
3444
+ if (!token.type || token.type !== prop) {
3445
+ return func.apply(this, arguments);
3446
+ }
3447
+ return func(token.text, token.lang, !!token.escaped);
3448
+ };
3449
+ case "table":
3450
+ return function(token) {
3451
+ if (!token.type || token.type !== prop) {
3452
+ return func.apply(this, arguments);
3453
+ }
3454
+ let header = "";
3455
+ let cell = "";
3456
+ for (let j = 0;j < token.header.length; j++) {
3457
+ cell += this.tablecell({
3458
+ text: token.header[j].text,
3459
+ tokens: token.header[j].tokens,
3460
+ header: true,
3461
+ align: token.align[j]
3462
+ });
3463
+ }
3464
+ header += this.tablerow({ text: cell });
3465
+ let body = "";
3466
+ for (let j = 0;j < token.rows.length; j++) {
3467
+ const row = token.rows[j];
3468
+ cell = "";
3469
+ for (let k = 0;k < row.length; k++) {
3470
+ cell += this.tablecell({
3471
+ text: row[k].text,
3472
+ tokens: row[k].tokens,
3473
+ header: false,
3474
+ align: token.align[k]
3475
+ });
3476
+ }
3477
+ body += this.tablerow({ text: cell });
3478
+ }
3479
+ return func(header, body);
3480
+ };
3481
+ case "blockquote":
3482
+ return function(token) {
3483
+ if (!token.type || token.type !== prop) {
3484
+ return func.apply(this, arguments);
3485
+ }
3486
+ const body = this.parser.parse(token.tokens);
3487
+ return func(body);
3488
+ };
3489
+ case "list":
3490
+ return function(token) {
3491
+ if (!token.type || token.type !== prop) {
3492
+ return func.apply(this, arguments);
3493
+ }
3494
+ const ordered = token.ordered;
3495
+ const start = token.start;
3496
+ const loose = token.loose;
3497
+ let body = "";
3498
+ for (let j = 0;j < token.items.length; j++) {
3499
+ const item = token.items[j];
3500
+ const checked = item.checked;
3501
+ const task = item.task;
3502
+ let itemBody = "";
3503
+ if (item.task) {
3504
+ const checkbox = this.checkbox({ checked: !!checked });
3505
+ if (loose) {
3506
+ if (item.tokens.length > 0 && item.tokens[0].type === "paragraph") {
3507
+ item.tokens[0].text = checkbox + " " + item.tokens[0].text;
3508
+ if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
3509
+ item.tokens[0].tokens[0].text = checkbox + " " + item.tokens[0].tokens[0].text;
3510
+ }
3511
+ } else {
3512
+ item.tokens.unshift({
3513
+ type: "text",
3514
+ text: checkbox + " "
3515
+ });
3516
+ }
3517
+ } else {
3518
+ itemBody += checkbox + " ";
3519
+ }
3520
+ }
3521
+ itemBody += this.parser.parse(item.tokens, loose);
3522
+ body += this.listitem({
3523
+ type: "list_item",
3524
+ raw: itemBody,
3525
+ text: itemBody,
3526
+ task,
3527
+ checked: !!checked,
3528
+ loose,
3529
+ tokens: item.tokens
3530
+ });
3531
+ }
3532
+ return func(body, ordered, start);
3533
+ };
3534
+ case "html":
3535
+ return function(token) {
3536
+ if (!token.type || token.type !== prop) {
3537
+ return func.apply(this, arguments);
3538
+ }
3539
+ return func(token.text, token.block);
3540
+ };
3541
+ case "paragraph":
3542
+ return function(token) {
3543
+ if (!token.type || token.type !== prop) {
3544
+ return func.apply(this, arguments);
3545
+ }
3546
+ return func(this.parser.parseInline(token.tokens));
3547
+ };
3548
+ case "escape":
3549
+ return function(token) {
3550
+ if (!token.type || token.type !== prop) {
3551
+ return func.apply(this, arguments);
3552
+ }
3553
+ return func(token.text);
3554
+ };
3555
+ case "link":
3556
+ return function(token) {
3557
+ if (!token.type || token.type !== prop) {
3558
+ return func.apply(this, arguments);
3559
+ }
3560
+ return func(token.href, token.title, this.parser.parseInline(token.tokens));
3561
+ };
3562
+ case "image":
3563
+ return function(token) {
3564
+ if (!token.type || token.type !== prop) {
3565
+ return func.apply(this, arguments);
3566
+ }
3567
+ return func(token.href, token.title, token.text);
3568
+ };
3569
+ case "strong":
3570
+ return function(token) {
3571
+ if (!token.type || token.type !== prop) {
3572
+ return func.apply(this, arguments);
3573
+ }
3574
+ return func(this.parser.parseInline(token.tokens));
3575
+ };
3576
+ case "em":
3577
+ return function(token) {
3578
+ if (!token.type || token.type !== prop) {
3579
+ return func.apply(this, arguments);
3580
+ }
3581
+ return func(this.parser.parseInline(token.tokens));
3582
+ };
3583
+ case "codespan":
3584
+ return function(token) {
3585
+ if (!token.type || token.type !== prop) {
3586
+ return func.apply(this, arguments);
3587
+ }
3588
+ return func(token.text);
3589
+ };
3590
+ case "del":
3591
+ return function(token) {
3592
+ if (!token.type || token.type !== prop) {
3593
+ return func.apply(this, arguments);
3594
+ }
3595
+ return func(this.parser.parseInline(token.tokens));
3596
+ };
3597
+ case "text":
3598
+ return function(token) {
3599
+ if (!token.type || token.type !== prop) {
3600
+ return func.apply(this, arguments);
3601
+ }
3602
+ return func(token.text);
3603
+ };
3604
+ }
3605
+ return func;
3606
+ }
3607
+ setOptions(opt) {
3608
+ this.defaults = { ...this.defaults, ...opt };
3609
+ return this;
3610
+ }
3611
+ lexer(src, options) {
3612
+ return _Lexer.lex(src, options ?? this.defaults);
3613
+ }
3614
+ parser(tokens, options) {
3615
+ return _Parser.parse(tokens, options ?? this.defaults);
3616
+ }
3617
+ #parseMarkdown(lexer, parser) {
3618
+ return (src, options) => {
3619
+ const origOpt = { ...options };
3620
+ const opt = { ...this.defaults, ...origOpt };
3621
+ if (this.defaults.async === true && origOpt.async === false) {
3622
+ if (!opt.silent) {
3623
+ console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.");
3624
+ }
3625
+ opt.async = true;
3626
+ }
3627
+ const throwError = this.#onError(!!opt.silent, !!opt.async);
3628
+ if (typeof src === "undefined" || src === null) {
3629
+ return throwError(new Error("marked(): input parameter is undefined or null"));
3630
+ }
3631
+ if (typeof src !== "string") {
3632
+ return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"));
3633
+ }
3634
+ if (opt.hooks) {
3635
+ opt.hooks.options = opt;
3636
+ }
3637
+ if (opt.async) {
3638
+ return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser(tokens, opt)).then((html3) => opt.hooks ? opt.hooks.postprocess(html3) : html3).catch(throwError);
3639
+ }
3640
+ try {
3641
+ if (opt.hooks) {
3642
+ src = opt.hooks.preprocess(src);
3643
+ }
3644
+ let tokens = lexer(src, opt);
3645
+ if (opt.hooks) {
3646
+ tokens = opt.hooks.processAllTokens(tokens);
3647
+ }
3648
+ if (opt.walkTokens) {
3649
+ this.walkTokens(tokens, opt.walkTokens);
3650
+ }
3651
+ let html3 = parser(tokens, opt);
3652
+ if (opt.hooks) {
3653
+ html3 = opt.hooks.postprocess(html3);
3654
+ }
3655
+ return html3;
3656
+ } catch (e) {
3657
+ return throwError(e);
3658
+ }
3659
+ };
3660
+ }
3661
+ #onError(silent, async) {
3662
+ return (e) => {
3663
+ e.message += `
3664
+ Please report this to https://github.com/markedjs/marked.`;
3665
+ if (silent) {
3666
+ const msg = "<p>An error occurred:</p><pre>" + escape$1(e.message + "", true) + "</pre>";
3667
+ if (async) {
3668
+ return Promise.resolve(msg);
3669
+ }
3670
+ return msg;
3671
+ }
3672
+ if (async) {
3673
+ return Promise.reject(e);
3674
+ }
3675
+ throw e;
3676
+ };
3677
+ }
3678
+ }
3679
+ var markedInstance = new Marked;
3680
+ function marked(src, opt) {
3681
+ return markedInstance.parse(src, opt);
3682
+ }
3683
+ marked.options = marked.setOptions = function(options) {
3684
+ markedInstance.setOptions(options);
3685
+ marked.defaults = markedInstance.defaults;
3686
+ changeDefaults(marked.defaults);
3687
+ return marked;
3688
+ };
3689
+ marked.getDefaults = _getDefaults;
3690
+ marked.defaults = _defaults;
3691
+ marked.use = function(...args) {
3692
+ markedInstance.use(...args);
3693
+ marked.defaults = markedInstance.defaults;
3694
+ changeDefaults(marked.defaults);
3695
+ return marked;
3696
+ };
3697
+ marked.walkTokens = function(tokens, callback) {
3698
+ return markedInstance.walkTokens(tokens, callback);
3699
+ };
3700
+ marked.parseInline = markedInstance.parseInline;
3701
+ marked.Parser = _Parser;
3702
+ marked.parser = _Parser.parse;
3703
+ marked.Renderer = _Renderer;
3704
+ marked.TextRenderer = _TextRenderer;
3705
+ marked.Lexer = _Lexer;
3706
+ marked.lexer = _Lexer.lex;
3707
+ marked.Tokenizer = _Tokenizer;
3708
+ marked.Hooks = _Hooks;
3709
+ marked.parse = marked;
3710
+ var options = marked.options;
3711
+ var setOptions = marked.setOptions;
3712
+ var use = marked.use;
3713
+ var walkTokens = marked.walkTokens;
3714
+ var parseInline = marked.parseInline;
3715
+ var parser = _Parser.parse;
3716
+ var lexer = _Lexer.lex;
3717
+
3718
+ // src/electron/renderer/markdown.ts
3719
+ marked.setOptions({
3720
+ gfm: true,
3721
+ breaks: true
3722
+ });
3723
+ function renderMarkdown(markdown) {
3724
+ const raw = marked.parse(markdown, { async: false });
3725
+ return purify.sanitize(raw, {
3726
+ FORBID_TAGS: ["style", "iframe", "object", "embed", "form", "input"],
3727
+ FORBID_ATTR: ["style", "href", "onerror", "onload", "onclick"],
3728
+ ALLOW_DATA_ATTR: false
3729
+ });
3730
+ }
3731
+
3732
+ // src/electron/renderer/popup.ts
3733
+ var state = {
3734
+ streamBuffer: "",
3735
+ currentState: "idle",
3736
+ meeting: false,
3737
+ meetingStarting: false,
3738
+ meetingAsking: false,
3739
+ transcriptAvailable: false,
3740
+ screenshotCount: 0,
3741
+ showTranscript: true,
3742
+ transcriptLines: []
3743
+ };
3744
+ function el(id) {
3745
+ const node = document.getElementById(id);
3746
+ if (node === null) {
3747
+ throw new Error(`popup: missing #${id} in DOM`);
3748
+ }
3749
+ return node;
3750
+ }
3751
+ var dom = {
3752
+ root: el("root"),
3753
+ source: el("source"),
3754
+ monitoringControl: el("monitoring-control"),
3755
+ monitoring: el("monitoring"),
3756
+ monitoringLabel: el("monitoring-label"),
3757
+ meetingControl: el("meeting-control"),
3758
+ meeting: el("meeting"),
3759
+ meetingLabel: el("meeting-label"),
3760
+ meetingContext: el("meeting-context"),
3761
+ contextCopy: el("context-copy"),
3762
+ askMeeting: el("ask-meeting"),
3763
+ transcriptToggle: el("transcript-toggle"),
3764
+ transcriptPanel: el("transcript-panel"),
3765
+ transcriptLines: el("transcript-lines"),
3766
+ privacy: el("privacy"),
3767
+ privacyLabel: el("privacy-label"),
3768
+ usagePill: el("usage-pill"),
3769
+ queuePill: el("queue-pill"),
3770
+ reconciledPill: el("reconciled-pill"),
3771
+ stoppedPill: el("stopped-pill"),
3772
+ abort: el("abort"),
3773
+ close: el("close"),
3774
+ answering: el("answering"),
3775
+ answer: el("answer"),
3776
+ error: el("error"),
3777
+ errorMessage: el("error-message"),
3778
+ body: el("body")
3779
+ };
3780
+ function setState(next) {
3781
+ dom.root.classList.remove("state-idle", "state-answering", "state-streaming", "state-done", "state-error");
3782
+ dom.root.classList.add(`state-${next}`);
3783
+ state.currentState = next;
3784
+ dom.answering.hidden = next !== "answering";
3785
+ dom.error.hidden = next !== "error";
3786
+ const running = next === "answering" || next === "streaming";
3787
+ dom.abort.hidden = !running;
3788
+ dom.root.setAttribute("aria-busy", running ? "true" : "false");
3789
+ if (!running) {
3790
+ dom.abort.disabled = false;
3791
+ dom.abort.textContent = "Stop";
3792
+ }
3793
+ renderMeetingContext();
3794
+ }
3795
+ function renderSource(payload) {
3796
+ const detected = new Date(payload.detectedAt);
3797
+ const timeStr = Number.isNaN(detected.getTime()) ? payload.detectedAt : detected.toLocaleTimeString(undefined, {
3798
+ hour: "2-digit",
3799
+ minute: "2-digit",
3800
+ second: "2-digit"
3801
+ });
3802
+ const label = document.createElement("span");
3803
+ label.className = "source-label";
3804
+ label.textContent = payload.title;
3805
+ label.title = payload.title;
3806
+ const time = document.createElement("span");
3807
+ time.className = "source-time";
3808
+ time.textContent = timeStr;
3809
+ dom.source.replaceChildren(label, time);
3810
+ dom.source.dataset.source = payload.source;
3811
+ }
3812
+ function updatePrivacy(hidden) {
3813
+ dom.privacy.checked = hidden;
3814
+ dom.privacyLabel.textContent = hidden ? "Private" : "Visible";
3815
+ dom.privacy.closest("label")?.classList.toggle("is-private", hidden);
3816
+ }
3817
+ function updateMonitoring(payload) {
3818
+ const active = payload.monitoring || payload.monitoringStarting;
3819
+ dom.monitoring.checked = active;
3820
+ dom.monitoring.disabled = payload.monitoringStarting;
3821
+ dom.monitoringLabel.textContent = payload.monitoringStarting ? "Starting…" : "Monitor";
3822
+ dom.monitoringControl.classList.toggle("is-monitoring", active);
3823
+ dom.monitoringControl.classList.toggle("is-starting", payload.monitoringStarting);
3824
+ dom.monitoringControl.setAttribute("aria-busy", payload.monitoringStarting ? "true" : "false");
3825
+ }
3826
+ function renderTranscript() {
3827
+ const expanded = state.showTranscript;
3828
+ dom.transcriptToggle.setAttribute("aria-expanded", expanded ? "true" : "false");
3829
+ dom.transcriptPanel.hidden = !state.meeting || !expanded;
3830
+ if (dom.transcriptPanel.hidden)
3831
+ return;
3832
+ if (state.transcriptLines.length === 0) {
3833
+ const empty = document.createElement("div");
3834
+ empty.className = "transcript-empty";
3835
+ empty.textContent = "Waiting for speech…";
3836
+ dom.transcriptLines.replaceChildren(empty);
3837
+ return;
3838
+ }
3839
+ const rows = state.transcriptLines.map((line) => {
3840
+ const row = document.createElement("div");
3841
+ row.className = "transcript-line";
3842
+ const speaker = document.createElement("span");
3843
+ speaker.className = `transcript-speaker is-${line.speaker}`;
3844
+ speaker.textContent = line.speaker === "them" ? "Them" : "You";
3845
+ const text2 = document.createElement("span");
3846
+ text2.className = "transcript-text";
3847
+ text2.textContent = line.text;
3848
+ row.append(speaker, text2);
3849
+ return row;
3850
+ });
3851
+ dom.transcriptLines.replaceChildren(...rows);
3852
+ pinTranscriptToBottom();
3853
+ }
3854
+ function pinTranscriptToBottom() {
3855
+ dom.transcriptPanel.scrollTop = dom.transcriptPanel.scrollHeight;
3856
+ }
3857
+ function onTranscriptUpdate(payload) {
3858
+ state.transcriptLines = Array.isArray(payload.lines) ? payload.lines : [];
3859
+ renderTranscript();
3860
+ }
3861
+ function updateMeeting(payload) {
3862
+ state.meeting = payload.meeting;
3863
+ state.meetingStarting = payload.meetingStarting;
3864
+ state.meetingAsking = payload.asking;
3865
+ state.transcriptAvailable = payload.transcriptAvailable;
3866
+ state.screenshotCount = Math.max(0, Math.floor(payload.screenshotCount));
3867
+ state.showTranscript = payload.showTranscript;
3868
+ renderTranscript();
3869
+ const active = payload.meeting || payload.meetingStarting;
3870
+ dom.meeting.checked = active;
3871
+ dom.meeting.disabled = payload.meetingStarting;
3872
+ dom.meetingLabel.textContent = payload.meetingStarting ? "Starting…" : "Meeting";
3873
+ dom.meetingControl.classList.toggle("is-meeting", active);
3874
+ dom.meetingControl.classList.toggle("is-starting", payload.meetingStarting);
3875
+ dom.meetingControl.setAttribute("aria-busy", payload.meetingStarting ? "true" : "false");
3876
+ renderMeetingContext();
3877
+ }
3878
+ function renderMeetingContext() {
3879
+ const visible = state.meeting || state.meetingStarting;
3880
+ const hasContext = state.transcriptAvailable || state.screenshotCount > 0;
3881
+ const answerRunning = state.currentState === "answering" || state.currentState === "streaming";
3882
+ dom.meetingContext.hidden = !visible;
3883
+ dom.root.classList.toggle("has-meeting", visible);
3884
+ const details = [];
3885
+ if (state.transcriptAvailable)
3886
+ details.push("Transcript ready");
3887
+ if (state.screenshotCount > 0) {
3888
+ details.push(`${state.screenshotCount} screenshot${state.screenshotCount === 1 ? "" : "s"}`);
3889
+ }
3890
+ dom.contextCopy.textContent = details.length > 0 ? details.join(" · ") : state.meetingStarting ? "Preparing private context…" : "No context yet";
3891
+ dom.contextCopy.classList.toggle("has-context", hasContext);
3892
+ dom.askMeeting.disabled = !state.meeting || state.meetingStarting || state.meetingAsking || answerRunning || !hasContext;
3893
+ dom.askMeeting.textContent = state.meetingAsking ? "Asking…" : "Ask";
3894
+ dom.askMeeting.setAttribute("aria-busy", state.meetingAsking ? "true" : "false");
3895
+ }
3896
+ var ACCOUNT_PROBLEMS = {
3897
+ past_due: "Payment past due",
3898
+ canceled: "Subscription canceled",
3899
+ suspended: "Account suspended"
3900
+ };
3901
+ function updateUsage(payload) {
3902
+ const usage = payload.usage;
3903
+ dom.usagePill.hidden = usage === null;
3904
+ if (usage === null)
3905
+ return;
3906
+ const exhausted = usage.answersUsed >= usage.answersLimit;
3907
+ const resets = usage.periodEnd.slice(0, 10);
3908
+ dom.usagePill.textContent = usage.status === "active" ? `${usage.answersUsed} / ${usage.answersLimit}` : ACCOUNT_PROBLEMS[usage.status];
3909
+ dom.usagePill.title = `${usage.answersUsed} of ${usage.answersLimit} answers used; resets ${resets}`;
3910
+ dom.usagePill.classList.toggle("is-near-limit", usage.status === "active" && !exhausted && usage.answersUsed >= usage.answersLimit * 0.9);
3911
+ dom.usagePill.classList.toggle("is-exhausted", usage.status !== "active" || exhausted);
3912
+ }
3913
+ function applyHeader(header) {
3914
+ updatePrivacy(header.hideFromCapture);
3915
+ updateMonitoring(header);
3916
+ updateMeeting(header);
3917
+ updateUsage(header);
3918
+ }
3919
+ async function loadHeader() {
3920
+ if (window.blink === undefined)
3921
+ return;
3922
+ try {
3923
+ const header = await window.blink.loadHeader();
3924
+ applyHeader(header);
3925
+ } catch (error) {
3926
+ const message = error instanceof Error ? error.message : String(error);
3927
+ const label = dom.source.querySelector(".source-label");
3928
+ if (label !== null) {
3929
+ label.textContent = "Configuration unavailable";
3930
+ label.title = message;
3931
+ }
3932
+ }
3933
+ }
3934
+ function renderStream() {
3935
+ dom.answer.innerHTML = renderMarkdown(state.streamBuffer);
3936
+ }
3937
+ var userScrolled = false;
3938
+ dom.body.addEventListener("scroll", () => {
3939
+ const atBottom = dom.body.scrollHeight - dom.body.scrollTop - dom.body.clientHeight < 8;
3940
+ userScrolled = !atBottom;
3941
+ });
3942
+ function maybeScrollToBottom() {
3943
+ if (userScrolled)
3944
+ return;
3945
+ dom.body.scrollTop = dom.body.scrollHeight;
3946
+ }
3947
+ function renderQueue(count) {
3948
+ if (count > 0) {
3949
+ dom.queuePill.textContent = `${count} queued`;
3950
+ dom.queuePill.hidden = false;
3951
+ dom.queuePill.setAttribute("aria-hidden", "false");
3952
+ } else {
3953
+ dom.queuePill.hidden = true;
3954
+ dom.queuePill.setAttribute("aria-hidden", "true");
3955
+ }
3956
+ }
3957
+ function setReconciled(reconciled) {
3958
+ dom.reconciledPill.hidden = !reconciled;
3959
+ dom.reconciledPill.setAttribute("aria-hidden", reconciled ? "false" : "true");
3960
+ }
3961
+ function setStopped(stopped) {
3962
+ dom.stoppedPill.hidden = !stopped;
3963
+ dom.stoppedPill.setAttribute("aria-hidden", stopped ? "false" : "true");
3964
+ }
3965
+ function onStart(payload) {
3966
+ state.streamBuffer = "";
3967
+ userScrolled = false;
3968
+ dom.answer.innerHTML = "";
3969
+ dom.errorMessage.textContent = "";
3970
+ dom.abort.disabled = false;
3971
+ dom.abort.textContent = "Stop";
3972
+ setReconciled(false);
3973
+ setStopped(false);
3974
+ renderSource(payload);
3975
+ setState("answering");
3976
+ }
3977
+ function onDelta(payload) {
3978
+ if (typeof payload.text !== "string" || payload.text.length === 0)
3979
+ return;
3980
+ state.streamBuffer += payload.text;
3981
+ if (state.currentState !== "streaming") {
3982
+ setState("streaming");
3983
+ }
3984
+ renderStream();
3985
+ maybeScrollToBottom();
3986
+ }
3987
+ function onDone(payload) {
3988
+ if (typeof payload.text === "string" && payload.text.length > 0) {
3989
+ state.streamBuffer = payload.text;
3990
+ renderStream();
3991
+ } else if (payload.cancelled === true && state.streamBuffer.length === 0) {
3992
+ state.streamBuffer = "Stopped before an answer was returned.";
3993
+ renderStream();
3994
+ }
3995
+ setReconciled(payload.reconciled === true && payload.cancelled !== true);
3996
+ setStopped(payload.cancelled === true);
3997
+ setState("done");
3998
+ maybeScrollToBottom();
3999
+ }
4000
+ function onError(payload) {
4001
+ const msg = typeof payload.message === "string" && payload.message.length > 0 ? payload.message : "unknown error";
4002
+ dom.errorMessage.textContent = msg;
4003
+ setStopped(false);
4004
+ setState("error");
4005
+ }
4006
+ function onQueueChange(payload) {
4007
+ const count = Number.isFinite(payload.pendingCount) ? Math.max(0, Math.floor(payload.pendingCount)) : 0;
4008
+ renderQueue(count);
4009
+ }
4010
+ function dismiss() {
4011
+ if (window.blink !== undefined) {
4012
+ window.blink.dismiss();
4013
+ }
4014
+ }
4015
+ dom.close.addEventListener("click", () => {
4016
+ dismiss();
4017
+ });
4018
+ dom.privacy.addEventListener("change", () => {
4019
+ updatePrivacy(dom.privacy.checked);
4020
+ window.blink?.setPrivacy(dom.privacy.checked);
4021
+ });
4022
+ dom.monitoring.addEventListener("change", () => {
4023
+ const monitoring = dom.monitoring.checked;
4024
+ updateMonitoring({ monitoring, monitoringStarting: false });
4025
+ window.blink?.setMonitoring(monitoring);
4026
+ });
4027
+ dom.meeting.addEventListener("change", () => {
4028
+ const meeting = dom.meeting.checked;
4029
+ updateMeeting({
4030
+ meeting,
4031
+ meetingStarting: false,
4032
+ asking: state.meetingAsking,
4033
+ showTranscript: state.showTranscript,
4034
+ transcriptAvailable: state.transcriptAvailable,
4035
+ screenshotCount: state.screenshotCount
4036
+ });
4037
+ window.blink?.setMeeting(meeting);
4038
+ });
4039
+ dom.askMeeting.addEventListener("click", () => {
4040
+ if (window.blink === undefined || dom.askMeeting.disabled)
4041
+ return;
4042
+ state.meetingAsking = true;
4043
+ renderMeetingContext();
4044
+ window.blink.askMeeting();
4045
+ });
4046
+ window.addEventListener("resize", () => {
4047
+ if (dom.transcriptPanel.hidden)
4048
+ return;
4049
+ requestAnimationFrame(() => {
4050
+ if (!dom.transcriptPanel.hidden)
4051
+ pinTranscriptToBottom();
4052
+ });
4053
+ });
4054
+ dom.transcriptToggle.addEventListener("click", () => {
4055
+ state.showTranscript = !state.showTranscript;
4056
+ renderTranscript();
4057
+ window.blink?.setShowTranscript(state.showTranscript);
4058
+ });
4059
+ dom.abort.addEventListener("click", () => {
4060
+ if (window.blink === undefined || dom.abort.disabled)
4061
+ return;
4062
+ dom.abort.disabled = true;
4063
+ dom.abort.textContent = "Stopping…";
4064
+ window.blink.abort();
4065
+ });
4066
+ function bootstrap() {
4067
+ if (window.blink === undefined) {
4068
+ const banner = document.createElement("div");
4069
+ banner.className = "bridge-error";
4070
+ banner.textContent = "blink: preload bridge not loaded (window.blink === undefined). Popup is dead.";
4071
+ document.body.appendChild(banner);
4072
+ return;
4073
+ }
4074
+ window.blink.onAnswerStart(onStart);
4075
+ window.blink.onHeaderChanged(applyHeader);
4076
+ window.blink.onAnswerDelta(onDelta);
4077
+ window.blink.onAnswerDone(onDone);
4078
+ window.blink.onAnswerError(onError);
4079
+ window.blink.onQueueChange(onQueueChange);
4080
+ window.blink.onPrivacyChanged(updatePrivacy);
4081
+ window.blink.onMonitoringChanged(updateMonitoring);
4082
+ window.blink.onMeetingChanged(updateMeeting);
4083
+ window.blink.onTranscriptUpdate(onTranscriptUpdate);
4084
+ window.blink.onUsageChanged(updateUsage);
4085
+ loadHeader();
4086
+ }
4087
+ bootstrap();