@meridianlabs/log-viewer 0.3.241 → 0.3.243
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +2568 -161
- package/lib/index.js.map +1 -1
- package/lib/src/app/App.d.ts.map +1 -1
- package/lib/src/app/flow/FlowButton.d.ts +1 -3
- package/lib/src/app/flow/FlowButton.d.ts.map +1 -1
- package/lib/src/app/log-list/grid/columns/hooks.d.ts.map +1 -1
- package/lib/src/app/log-list/grid/columns/types.d.ts +1 -1
- package/lib/src/app/log-list/grid/columns/types.d.ts.map +1 -1
- package/lib/src/app/log-view/LogView.d.ts.map +1 -1
- package/lib/src/app/log-view/tabs/RunningNoSamples.d.ts +1 -4
- package/lib/src/app/log-view/tabs/RunningNoSamples.d.ts.map +1 -1
- package/lib/src/app/log-view/tabs/TaskTab.d.ts.map +1 -1
- package/lib/src/app/log-view/title-view/SecondaryBar.d.ts.map +1 -1
- package/lib/src/app/routing/url.d.ts.map +1 -1
- package/lib/src/app/samples/SamplesTools.d.ts +2 -7
- package/lib/src/app/samples/SamplesTools.d.ts.map +1 -1
- package/lib/src/app/samples/descriptor/samplesDescriptor.d.ts.map +1 -1
- package/lib/src/app/samples/descriptor/score/BooleanScoreDescriptor.d.ts.map +1 -1
- package/lib/src/app/samples/descriptor/score/CategoricalScoreDescriptor.d.ts.map +1 -1
- package/lib/src/app/samples/descriptor/score/ListScoreDescriptor.d.ts.map +1 -1
- package/lib/src/app/samples/descriptor/score/PassFailScoreDescriptor.d.ts.map +1 -1
- package/lib/src/app/samples/header-v2/ScorePanel.d.ts.map +1 -1
- package/lib/src/app/samples/header-v2/ScoreValueDisplay.d.ts.map +1 -1
- package/lib/src/app/samples/header-v2/scoreTone.d.ts.map +1 -1
- package/lib/src/app/samples/list/samplesView.converters.d.ts.map +1 -1
- package/lib/src/app/samples/sample-tools/sample-filter/SampleFilter.d.ts +1 -4
- package/lib/src/app/samples/sample-tools/sample-filter/SampleFilter.d.ts.map +1 -1
- package/lib/src/app/samples/sample-tools/sample-filter/completions.d.ts.map +1 -1
- package/lib/src/app/shared/samples-grid/colorScale.d.ts.map +1 -1
- package/lib/src/app/shared/samples-grid/columns.d.ts.map +1 -1
- package/lib/src/app/shared/samples-grid/types.d.ts +1 -1
- package/lib/src/app/shared/samples-grid/types.d.ts.map +1 -1
- package/lib/src/client/api/index.d.ts.map +1 -1
- package/lib/src/client/api/static-http/fetch.d.ts.map +1 -1
- package/lib/src/client/api/types.d.ts +4 -4
- package/lib/src/client/api/types.d.ts.map +1 -1
- package/lib/src/client/api/view-server/api-view-server.d.ts.map +1 -1
- package/lib/src/client/api/view-server/request.d.ts +3 -1
- package/lib/src/client/api/view-server/request.d.ts.map +1 -1
- package/lib/src/client/api/vscode/api-vscode.d.ts.map +1 -1
- package/lib/src/client/api/vscode/jsonrpc.d.ts +9 -8
- package/lib/src/client/api/vscode/jsonrpc.d.ts.map +1 -1
- package/lib/src/client/database/manager.d.ts.map +1 -1
- package/lib/src/client/remote/remoteLogFile.d.ts.map +1 -1
- package/lib/src/client/remote/zstd-worker.d.ts.map +1 -1
- package/lib/src/client/storage/index.d.ts.map +1 -1
- package/lib/src/components/FindBand.d.ts +5 -3
- package/lib/src/components/FindBand.d.ts.map +1 -1
- package/lib/src/components/LargeModal.d.ts +2 -2
- package/lib/src/components/LargeModal.d.ts.map +1 -1
- package/lib/src/scoring/metrics.d.ts.map +1 -1
- package/lib/src/scoring/types.d.ts +1 -1
- package/lib/src/scoring/types.d.ts.map +1 -1
- package/lib/src/state/appSlice.d.ts +1 -1
- package/lib/src/state/appSlice.d.ts.map +1 -1
- package/lib/src/state/logSlice.d.ts +1 -1
- package/lib/src/state/logSlice.d.ts.map +1 -1
- package/lib/src/state/logsSlice.d.ts +4 -4
- package/lib/src/state/logsSlice.d.ts.map +1 -1
- package/lib/src/state/sampleSlice.d.ts +1 -1
- package/lib/src/state/sampleSlice.d.ts.map +1 -1
- package/lib/src/state/sampleUtils.d.ts.map +1 -1
- package/lib/src/state/sync/replicationService.d.ts.map +1 -1
- package/lib/src/utils/format.d.ts +6 -0
- package/lib/src/utils/format.d.ts.map +1 -1
- package/lib/src/utils/json-worker.d.ts.map +1 -1
- package/lib/src/utils/markdown.d.ts.map +1 -1
- package/lib/src/utils/react.d.ts +1 -1
- package/lib/src/utils/react.d.ts.map +1 -1
- package/lib/src/utils/workQueue.d.ts.map +1 -1
- package/lib/styles/index.css +17 -0
- package/package.json +16 -15
package/lib/index.js
CHANGED
|
@@ -25775,7 +25775,7 @@ function isMapOrSet(value) {
|
|
|
25775
25775
|
//#endregion
|
|
25776
25776
|
//#region ../../node_modules/.pnpm/arquero@8.0.3/node_modules/arquero/src/op/functions/object.js
|
|
25777
25777
|
var object_exports = /* @__PURE__ */ __exportAll({
|
|
25778
|
-
entries: () => entries$
|
|
25778
|
+
entries: () => entries$2,
|
|
25779
25779
|
has: () => has$2,
|
|
25780
25780
|
keys: () => keys,
|
|
25781
25781
|
object: () => object,
|
|
@@ -25835,7 +25835,7 @@ function values$1(object) {
|
|
|
25835
25835
|
* or Set value.
|
|
25836
25836
|
* @return {[K, V][]} An array of property values.
|
|
25837
25837
|
*/
|
|
25838
|
-
function entries$
|
|
25838
|
+
function entries$2(object) {
|
|
25839
25839
|
return isMapOrSet(object) ? array(object.entries()) : object != null ? Object.entries(object) : [];
|
|
25840
25840
|
}
|
|
25841
25841
|
/**
|
|
@@ -26840,7 +26840,7 @@ function getWindow$1(name) {
|
|
|
26840
26840
|
}
|
|
26841
26841
|
//#endregion
|
|
26842
26842
|
//#region ../../node_modules/.pnpm/arquero@8.0.3/node_modules/arquero/src/util/entries.js
|
|
26843
|
-
function entries(value) {
|
|
26843
|
+
function entries$1(value) {
|
|
26844
26844
|
return isArray$2(value) ? value : isMap$1(value) ? value.entries() : value ? Object.entries(value) : [];
|
|
26845
26845
|
}
|
|
26846
26846
|
var Literal = "Literal";
|
|
@@ -27008,7 +27008,7 @@ var ROW_OBJECT = "row_object";
|
|
|
27008
27008
|
function rowObjectExpression(node, table, props = table.columnNames()) {
|
|
27009
27009
|
node.type = ObjectExpression;
|
|
27010
27010
|
const p = node.properties = [];
|
|
27011
|
-
for (const prop of entries(props)) {
|
|
27011
|
+
for (const prop of entries$1(props)) {
|
|
27012
27012
|
const [name, key] = isArray$2(prop) ? prop : [prop, prop];
|
|
27013
27013
|
p.push({
|
|
27014
27014
|
type: Property,
|
|
@@ -32891,10 +32891,19 @@ function formatBytes(bytes) {
|
|
|
32891
32891
|
//#endregion
|
|
32892
32892
|
//#region ../../packages/util/src/git.ts
|
|
32893
32893
|
/**
|
|
32894
|
-
*
|
|
32894
|
+
* Builds a GitHub commit URL from a repository origin and commit hash.
|
|
32895
|
+
*
|
|
32896
|
+
* Accepts the GitHub origin forms that appear in eval `revision.origin`:
|
|
32897
|
+
* https, `ssh://git@github.com/…`, scp `git@github.com:…`, `git://…`, an
|
|
32898
|
+
* optional `git+` prefix, optional credentials, and an optional `.git` suffix.
|
|
32899
|
+
* Returns undefined when the origin is not a GitHub repository URL, so callers
|
|
32900
|
+
* can render the commit as plain text instead of a broken link.
|
|
32895
32901
|
*/
|
|
32896
32902
|
var ghCommitUrl = (origin, commit) => {
|
|
32897
|
-
|
|
32903
|
+
const match = origin.match(/(?:^|[@/])github\.com[/:]([^/]+)\/([^/]+?)(?:\.git)?\/?$/i);
|
|
32904
|
+
if (!match) return;
|
|
32905
|
+
const [, owner, repo] = match;
|
|
32906
|
+
return `https://github.com/${owner}/${repo}/commit/${commit}`;
|
|
32898
32907
|
};
|
|
32899
32908
|
//#endregion
|
|
32900
32909
|
//#region ../../packages/util/src/http.ts
|
|
@@ -36844,7 +36853,7 @@ function isTerminatorChar(ch) {
|
|
|
36844
36853
|
default: return false;
|
|
36845
36854
|
}
|
|
36846
36855
|
}
|
|
36847
|
-
function text$
|
|
36856
|
+
function text$4(state, silent) {
|
|
36848
36857
|
let pos = state.pos;
|
|
36849
36858
|
while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) pos++;
|
|
36850
36859
|
if (pos === state.pos) return false;
|
|
@@ -37499,7 +37508,7 @@ function fragments_join(state) {
|
|
|
37499
37508
|
* Tokenizes paragraph content.
|
|
37500
37509
|
**/
|
|
37501
37510
|
var _rules = [
|
|
37502
|
-
["text", text$
|
|
37511
|
+
["text", text$4],
|
|
37503
37512
|
["linkify", linkify],
|
|
37504
37513
|
["newline", newline],
|
|
37505
37514
|
["escape", escape],
|
|
@@ -38994,7 +39003,7 @@ var getMarkdownInstance = (renderer) => {
|
|
|
38994
39003
|
mdInstanceCache[renderer] = md;
|
|
38995
39004
|
return md;
|
|
38996
39005
|
};
|
|
38997
|
-
var escapeHtmlCharacters = (content) => {
|
|
39006
|
+
var escapeHtmlCharacters$1 = (content) => {
|
|
38998
39007
|
if (!content) return content;
|
|
38999
39008
|
return content.replace(/[<>&'"]/g, (c) => {
|
|
39000
39009
|
switch (c) {
|
|
@@ -39081,7 +39090,7 @@ function unescapeCodeHtmlEntities(str) {
|
|
|
39081
39090
|
});
|
|
39082
39091
|
}
|
|
39083
39092
|
var renderFullPipelineMarkdown = (markdown, renderer) => {
|
|
39084
|
-
const preparedForMarkdown = restoreBackslashesForLatex(protectMarkdown(preRenderText(escapeHtmlCharacters(protectBackslashesInLatex(markdown)))));
|
|
39093
|
+
const preparedForMarkdown = restoreBackslashesForLatex(protectMarkdown(preRenderText(escapeHtmlCharacters$1(protectBackslashesInLatex(markdown)))));
|
|
39085
39094
|
let html = preparedForMarkdown;
|
|
39086
39095
|
try {
|
|
39087
39096
|
html = getMarkdownInstance(renderer).render(preparedForMarkdown);
|
|
@@ -39097,7 +39106,7 @@ var renderTextOnlyMarkdown = (markdown) => {
|
|
|
39097
39106
|
} catch (ex) {
|
|
39098
39107
|
console.log("Unable to markdown render content");
|
|
39099
39108
|
console.error(ex);
|
|
39100
|
-
return escapeHtmlCharacters(markdown).replace(/\n/g, "<br/>");
|
|
39109
|
+
return escapeHtmlCharacters$1(markdown).replace(/\n/g, "<br/>");
|
|
39101
39110
|
}
|
|
39102
39111
|
};
|
|
39103
39112
|
var markdownRenderers = {
|
|
@@ -39107,16 +39116,2310 @@ var markdownRenderers = {
|
|
|
39107
39116
|
};
|
|
39108
39117
|
var renderMarkdown = (markdown, renderer = defaultMarkdownRenderer) => markdownRenderers[renderer](markdown);
|
|
39109
39118
|
//#endregion
|
|
39119
|
+
//#region ../../node_modules/.pnpm/dompurify@3.4.11/node_modules/dompurify/dist/purify.es.mjs
|
|
39120
|
+
/*! @license DOMPurify 3.4.11 | (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.11/LICENSE */
|
|
39121
|
+
function _arrayLikeToArray(r, a) {
|
|
39122
|
+
(null == a || a > r.length) && (a = r.length);
|
|
39123
|
+
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
39124
|
+
return n;
|
|
39125
|
+
}
|
|
39126
|
+
function _arrayWithHoles(r) {
|
|
39127
|
+
if (Array.isArray(r)) return r;
|
|
39128
|
+
}
|
|
39129
|
+
function _iterableToArrayLimit(r, l) {
|
|
39130
|
+
var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
|
|
39131
|
+
if (null != t) {
|
|
39132
|
+
var e, n, i, u, a = [], f = true, o = false;
|
|
39133
|
+
try {
|
|
39134
|
+
if (i = (t = t.call(r)).next, 0 === l);
|
|
39135
|
+
else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
|
|
39136
|
+
} catch (r) {
|
|
39137
|
+
o = true, n = r;
|
|
39138
|
+
} finally {
|
|
39139
|
+
try {
|
|
39140
|
+
if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
|
|
39141
|
+
} finally {
|
|
39142
|
+
if (o) throw n;
|
|
39143
|
+
}
|
|
39144
|
+
}
|
|
39145
|
+
return a;
|
|
39146
|
+
}
|
|
39147
|
+
}
|
|
39148
|
+
function _nonIterableRest() {
|
|
39149
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
39150
|
+
}
|
|
39151
|
+
function _slicedToArray(r, e) {
|
|
39152
|
+
return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
|
|
39153
|
+
}
|
|
39154
|
+
function _unsupportedIterableToArray(r, a) {
|
|
39155
|
+
if (r) {
|
|
39156
|
+
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
39157
|
+
var t = {}.toString.call(r).slice(8, -1);
|
|
39158
|
+
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
39159
|
+
}
|
|
39160
|
+
}
|
|
39161
|
+
var entries = Object.entries, setPrototypeOf = Object.setPrototypeOf, isFrozen$1 = Object.isFrozen, getPrototypeOf$1 = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
39162
|
+
var freeze$1 = Object.freeze, seal = Object.seal, create$1 = Object.create;
|
|
39163
|
+
var _ref = typeof Reflect !== "undefined" && Reflect, apply = _ref.apply, construct = _ref.construct;
|
|
39164
|
+
if (!freeze$1) freeze$1 = function freeze(x) {
|
|
39165
|
+
return x;
|
|
39166
|
+
};
|
|
39167
|
+
if (!seal) seal = function seal(x) {
|
|
39168
|
+
return x;
|
|
39169
|
+
};
|
|
39170
|
+
if (!apply) apply = function apply(func, thisArg) {
|
|
39171
|
+
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];
|
|
39172
|
+
return func.apply(thisArg, args);
|
|
39173
|
+
};
|
|
39174
|
+
if (!construct) construct = function construct(Func) {
|
|
39175
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) args[_key2 - 1] = arguments[_key2];
|
|
39176
|
+
return new Func(...args);
|
|
39177
|
+
};
|
|
39178
|
+
var arrayForEach = unapply(Array.prototype.forEach);
|
|
39179
|
+
var arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);
|
|
39180
|
+
var arrayPop = unapply(Array.prototype.pop);
|
|
39181
|
+
var arrayPush = unapply(Array.prototype.push);
|
|
39182
|
+
var arraySplice = unapply(Array.prototype.splice);
|
|
39183
|
+
var arrayIsArray = Array.isArray;
|
|
39184
|
+
var stringToLowerCase = unapply(String.prototype.toLowerCase);
|
|
39185
|
+
var stringToString = unapply(String.prototype.toString);
|
|
39186
|
+
var stringMatch = unapply(String.prototype.match);
|
|
39187
|
+
var stringReplace = unapply(String.prototype.replace);
|
|
39188
|
+
var stringIndexOf = unapply(String.prototype.indexOf);
|
|
39189
|
+
var stringTrim = unapply(String.prototype.trim);
|
|
39190
|
+
var numberToString = unapply(Number.prototype.toString);
|
|
39191
|
+
var booleanToString = unapply(Boolean.prototype.toString);
|
|
39192
|
+
var bigintToString = typeof BigInt === "undefined" ? null : unapply(BigInt.prototype.toString);
|
|
39193
|
+
var symbolToString = typeof Symbol === "undefined" ? null : unapply(Symbol.prototype.toString);
|
|
39194
|
+
var objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);
|
|
39195
|
+
var objectToString = unapply(Object.prototype.toString);
|
|
39196
|
+
var regExpTest = unapply(RegExp.prototype.test);
|
|
39197
|
+
var typeErrorCreate = unconstruct(TypeError);
|
|
39198
|
+
/**
|
|
39199
|
+
* Creates a new function that calls the given function with a specified thisArg and arguments.
|
|
39200
|
+
*
|
|
39201
|
+
* @param func - The function to be wrapped and called.
|
|
39202
|
+
* @returns A new function that calls the given function with a specified thisArg and arguments.
|
|
39203
|
+
*/
|
|
39204
|
+
function unapply(func) {
|
|
39205
|
+
return function(thisArg) {
|
|
39206
|
+
if (thisArg instanceof RegExp) thisArg.lastIndex = 0;
|
|
39207
|
+
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) args[_key3 - 1] = arguments[_key3];
|
|
39208
|
+
return apply(func, thisArg, args);
|
|
39209
|
+
};
|
|
39210
|
+
}
|
|
39211
|
+
/**
|
|
39212
|
+
* Creates a new function that constructs an instance of the given constructor function with the provided arguments.
|
|
39213
|
+
*
|
|
39214
|
+
* @param func - The constructor function to be wrapped and called.
|
|
39215
|
+
* @returns A new function that constructs an instance of the given constructor function with the provided arguments.
|
|
39216
|
+
*/
|
|
39217
|
+
function unconstruct(Func) {
|
|
39218
|
+
return function() {
|
|
39219
|
+
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) args[_key4] = arguments[_key4];
|
|
39220
|
+
return construct(Func, args);
|
|
39221
|
+
};
|
|
39222
|
+
}
|
|
39223
|
+
/**
|
|
39224
|
+
* Add properties to a lookup table
|
|
39225
|
+
*
|
|
39226
|
+
* @param set - The set to which elements will be added.
|
|
39227
|
+
* @param array - The array containing elements to be added to the set.
|
|
39228
|
+
* @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.
|
|
39229
|
+
* @returns The modified set with added elements.
|
|
39230
|
+
*/
|
|
39231
|
+
function addToSet(set, array) {
|
|
39232
|
+
let transformCaseFunc = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : stringToLowerCase;
|
|
39233
|
+
if (setPrototypeOf) setPrototypeOf(set, null);
|
|
39234
|
+
if (!arrayIsArray(array)) return set;
|
|
39235
|
+
let l = array.length;
|
|
39236
|
+
while (l--) {
|
|
39237
|
+
let element = array[l];
|
|
39238
|
+
if (typeof element === "string") {
|
|
39239
|
+
const lcElement = transformCaseFunc(element);
|
|
39240
|
+
if (lcElement !== element) {
|
|
39241
|
+
if (!isFrozen$1(array)) array[l] = lcElement;
|
|
39242
|
+
element = lcElement;
|
|
39243
|
+
}
|
|
39244
|
+
}
|
|
39245
|
+
set[element] = true;
|
|
39246
|
+
}
|
|
39247
|
+
return set;
|
|
39248
|
+
}
|
|
39249
|
+
/**
|
|
39250
|
+
* Clean up an array to harden against CSPP
|
|
39251
|
+
*
|
|
39252
|
+
* @param array - The array to be cleaned.
|
|
39253
|
+
* @returns The cleaned version of the array
|
|
39254
|
+
*/
|
|
39255
|
+
function cleanArray(array) {
|
|
39256
|
+
for (let index = 0; index < array.length; index++) if (!objectHasOwnProperty(array, index)) array[index] = null;
|
|
39257
|
+
return array;
|
|
39258
|
+
}
|
|
39259
|
+
/**
|
|
39260
|
+
* Shallow clone an object
|
|
39261
|
+
*
|
|
39262
|
+
* @param object - The object to be cloned.
|
|
39263
|
+
* @returns A new object that copies the original.
|
|
39264
|
+
*/
|
|
39265
|
+
function clone$1(object) {
|
|
39266
|
+
const newObject = create$1(null);
|
|
39267
|
+
for (const _ref2 of entries(object)) {
|
|
39268
|
+
var _ref3 = _slicedToArray(_ref2, 2);
|
|
39269
|
+
const property = _ref3[0];
|
|
39270
|
+
const value = _ref3[1];
|
|
39271
|
+
if (objectHasOwnProperty(object, property)) if (arrayIsArray(value)) newObject[property] = cleanArray(value);
|
|
39272
|
+
else if (value && typeof value === "object" && value.constructor === Object) newObject[property] = clone$1(value);
|
|
39273
|
+
else newObject[property] = value;
|
|
39274
|
+
}
|
|
39275
|
+
return newObject;
|
|
39276
|
+
}
|
|
39277
|
+
/**
|
|
39278
|
+
* Convert non-node values into strings without depending on direct property access.
|
|
39279
|
+
*
|
|
39280
|
+
* @param value - The value to stringify.
|
|
39281
|
+
* @returns A string representation of the provided value.
|
|
39282
|
+
*/
|
|
39283
|
+
function stringifyValue$1(value) {
|
|
39284
|
+
switch (typeof value) {
|
|
39285
|
+
case "string": return value;
|
|
39286
|
+
case "number": return numberToString(value);
|
|
39287
|
+
case "boolean": return booleanToString(value);
|
|
39288
|
+
case "bigint": return bigintToString ? bigintToString(value) : "0";
|
|
39289
|
+
case "symbol": return symbolToString ? symbolToString(value) : "Symbol()";
|
|
39290
|
+
case "undefined": return objectToString(value);
|
|
39291
|
+
case "function":
|
|
39292
|
+
case "object": {
|
|
39293
|
+
if (value === null) return objectToString(value);
|
|
39294
|
+
const valueAsRecord = value;
|
|
39295
|
+
const valueToString = lookupGetter(valueAsRecord, "toString");
|
|
39296
|
+
if (typeof valueToString === "function") {
|
|
39297
|
+
const stringified = valueToString(valueAsRecord);
|
|
39298
|
+
return typeof stringified === "string" ? stringified : objectToString(stringified);
|
|
39299
|
+
}
|
|
39300
|
+
return objectToString(value);
|
|
39301
|
+
}
|
|
39302
|
+
default: return objectToString(value);
|
|
39303
|
+
}
|
|
39304
|
+
}
|
|
39305
|
+
/**
|
|
39306
|
+
* This method automatically checks if the prop is function or getter and behaves accordingly.
|
|
39307
|
+
*
|
|
39308
|
+
* @param object - The object to look up the getter function in its prototype chain.
|
|
39309
|
+
* @param prop - The property name for which to find the getter function.
|
|
39310
|
+
* @returns The getter function found in the prototype chain or a fallback function.
|
|
39311
|
+
*/
|
|
39312
|
+
function lookupGetter(object, prop) {
|
|
39313
|
+
while (object !== null) {
|
|
39314
|
+
const desc = getOwnPropertyDescriptor(object, prop);
|
|
39315
|
+
if (desc) {
|
|
39316
|
+
if (desc.get) return unapply(desc.get);
|
|
39317
|
+
if (typeof desc.value === "function") return unapply(desc.value);
|
|
39318
|
+
}
|
|
39319
|
+
object = getPrototypeOf$1(object);
|
|
39320
|
+
}
|
|
39321
|
+
function fallbackValue() {
|
|
39322
|
+
return null;
|
|
39323
|
+
}
|
|
39324
|
+
return fallbackValue;
|
|
39325
|
+
}
|
|
39326
|
+
function isRegex(value) {
|
|
39327
|
+
try {
|
|
39328
|
+
regExpTest(value, "");
|
|
39329
|
+
return true;
|
|
39330
|
+
} catch (_unused) {
|
|
39331
|
+
return false;
|
|
39332
|
+
}
|
|
39333
|
+
}
|
|
39334
|
+
var html$1 = freeze$1([
|
|
39335
|
+
"a",
|
|
39336
|
+
"abbr",
|
|
39337
|
+
"acronym",
|
|
39338
|
+
"address",
|
|
39339
|
+
"area",
|
|
39340
|
+
"article",
|
|
39341
|
+
"aside",
|
|
39342
|
+
"audio",
|
|
39343
|
+
"b",
|
|
39344
|
+
"bdi",
|
|
39345
|
+
"bdo",
|
|
39346
|
+
"big",
|
|
39347
|
+
"blink",
|
|
39348
|
+
"blockquote",
|
|
39349
|
+
"body",
|
|
39350
|
+
"br",
|
|
39351
|
+
"button",
|
|
39352
|
+
"canvas",
|
|
39353
|
+
"caption",
|
|
39354
|
+
"center",
|
|
39355
|
+
"cite",
|
|
39356
|
+
"code",
|
|
39357
|
+
"col",
|
|
39358
|
+
"colgroup",
|
|
39359
|
+
"content",
|
|
39360
|
+
"data",
|
|
39361
|
+
"datalist",
|
|
39362
|
+
"dd",
|
|
39363
|
+
"decorator",
|
|
39364
|
+
"del",
|
|
39365
|
+
"details",
|
|
39366
|
+
"dfn",
|
|
39367
|
+
"dialog",
|
|
39368
|
+
"dir",
|
|
39369
|
+
"div",
|
|
39370
|
+
"dl",
|
|
39371
|
+
"dt",
|
|
39372
|
+
"element",
|
|
39373
|
+
"em",
|
|
39374
|
+
"fieldset",
|
|
39375
|
+
"figcaption",
|
|
39376
|
+
"figure",
|
|
39377
|
+
"font",
|
|
39378
|
+
"footer",
|
|
39379
|
+
"form",
|
|
39380
|
+
"h1",
|
|
39381
|
+
"h2",
|
|
39382
|
+
"h3",
|
|
39383
|
+
"h4",
|
|
39384
|
+
"h5",
|
|
39385
|
+
"h6",
|
|
39386
|
+
"head",
|
|
39387
|
+
"header",
|
|
39388
|
+
"hgroup",
|
|
39389
|
+
"hr",
|
|
39390
|
+
"html",
|
|
39391
|
+
"i",
|
|
39392
|
+
"img",
|
|
39393
|
+
"input",
|
|
39394
|
+
"ins",
|
|
39395
|
+
"kbd",
|
|
39396
|
+
"label",
|
|
39397
|
+
"legend",
|
|
39398
|
+
"li",
|
|
39399
|
+
"main",
|
|
39400
|
+
"map",
|
|
39401
|
+
"mark",
|
|
39402
|
+
"marquee",
|
|
39403
|
+
"menu",
|
|
39404
|
+
"menuitem",
|
|
39405
|
+
"meter",
|
|
39406
|
+
"nav",
|
|
39407
|
+
"nobr",
|
|
39408
|
+
"ol",
|
|
39409
|
+
"optgroup",
|
|
39410
|
+
"option",
|
|
39411
|
+
"output",
|
|
39412
|
+
"p",
|
|
39413
|
+
"picture",
|
|
39414
|
+
"pre",
|
|
39415
|
+
"progress",
|
|
39416
|
+
"q",
|
|
39417
|
+
"rp",
|
|
39418
|
+
"rt",
|
|
39419
|
+
"ruby",
|
|
39420
|
+
"s",
|
|
39421
|
+
"samp",
|
|
39422
|
+
"search",
|
|
39423
|
+
"section",
|
|
39424
|
+
"select",
|
|
39425
|
+
"shadow",
|
|
39426
|
+
"slot",
|
|
39427
|
+
"small",
|
|
39428
|
+
"source",
|
|
39429
|
+
"spacer",
|
|
39430
|
+
"span",
|
|
39431
|
+
"strike",
|
|
39432
|
+
"strong",
|
|
39433
|
+
"style",
|
|
39434
|
+
"sub",
|
|
39435
|
+
"summary",
|
|
39436
|
+
"sup",
|
|
39437
|
+
"table",
|
|
39438
|
+
"tbody",
|
|
39439
|
+
"td",
|
|
39440
|
+
"template",
|
|
39441
|
+
"textarea",
|
|
39442
|
+
"tfoot",
|
|
39443
|
+
"th",
|
|
39444
|
+
"thead",
|
|
39445
|
+
"time",
|
|
39446
|
+
"tr",
|
|
39447
|
+
"track",
|
|
39448
|
+
"tt",
|
|
39449
|
+
"u",
|
|
39450
|
+
"ul",
|
|
39451
|
+
"var",
|
|
39452
|
+
"video",
|
|
39453
|
+
"wbr"
|
|
39454
|
+
]);
|
|
39455
|
+
var svg$1 = freeze$1([
|
|
39456
|
+
"svg",
|
|
39457
|
+
"a",
|
|
39458
|
+
"altglyph",
|
|
39459
|
+
"altglyphdef",
|
|
39460
|
+
"altglyphitem",
|
|
39461
|
+
"animatecolor",
|
|
39462
|
+
"animatemotion",
|
|
39463
|
+
"animatetransform",
|
|
39464
|
+
"circle",
|
|
39465
|
+
"clippath",
|
|
39466
|
+
"defs",
|
|
39467
|
+
"desc",
|
|
39468
|
+
"ellipse",
|
|
39469
|
+
"enterkeyhint",
|
|
39470
|
+
"exportparts",
|
|
39471
|
+
"filter",
|
|
39472
|
+
"font",
|
|
39473
|
+
"g",
|
|
39474
|
+
"glyph",
|
|
39475
|
+
"glyphref",
|
|
39476
|
+
"hkern",
|
|
39477
|
+
"image",
|
|
39478
|
+
"inputmode",
|
|
39479
|
+
"line",
|
|
39480
|
+
"lineargradient",
|
|
39481
|
+
"marker",
|
|
39482
|
+
"mask",
|
|
39483
|
+
"metadata",
|
|
39484
|
+
"mpath",
|
|
39485
|
+
"part",
|
|
39486
|
+
"path",
|
|
39487
|
+
"pattern",
|
|
39488
|
+
"polygon",
|
|
39489
|
+
"polyline",
|
|
39490
|
+
"radialgradient",
|
|
39491
|
+
"rect",
|
|
39492
|
+
"stop",
|
|
39493
|
+
"style",
|
|
39494
|
+
"switch",
|
|
39495
|
+
"symbol",
|
|
39496
|
+
"text",
|
|
39497
|
+
"textpath",
|
|
39498
|
+
"title",
|
|
39499
|
+
"tref",
|
|
39500
|
+
"tspan",
|
|
39501
|
+
"view",
|
|
39502
|
+
"vkern"
|
|
39503
|
+
]);
|
|
39504
|
+
var svgFilters = freeze$1([
|
|
39505
|
+
"feBlend",
|
|
39506
|
+
"feColorMatrix",
|
|
39507
|
+
"feComponentTransfer",
|
|
39508
|
+
"feComposite",
|
|
39509
|
+
"feConvolveMatrix",
|
|
39510
|
+
"feDiffuseLighting",
|
|
39511
|
+
"feDisplacementMap",
|
|
39512
|
+
"feDistantLight",
|
|
39513
|
+
"feDropShadow",
|
|
39514
|
+
"feFlood",
|
|
39515
|
+
"feFuncA",
|
|
39516
|
+
"feFuncB",
|
|
39517
|
+
"feFuncG",
|
|
39518
|
+
"feFuncR",
|
|
39519
|
+
"feGaussianBlur",
|
|
39520
|
+
"feImage",
|
|
39521
|
+
"feMerge",
|
|
39522
|
+
"feMergeNode",
|
|
39523
|
+
"feMorphology",
|
|
39524
|
+
"feOffset",
|
|
39525
|
+
"fePointLight",
|
|
39526
|
+
"feSpecularLighting",
|
|
39527
|
+
"feSpotLight",
|
|
39528
|
+
"feTile",
|
|
39529
|
+
"feTurbulence"
|
|
39530
|
+
]);
|
|
39531
|
+
var svgDisallowed = freeze$1([
|
|
39532
|
+
"animate",
|
|
39533
|
+
"color-profile",
|
|
39534
|
+
"cursor",
|
|
39535
|
+
"discard",
|
|
39536
|
+
"font-face",
|
|
39537
|
+
"font-face-format",
|
|
39538
|
+
"font-face-name",
|
|
39539
|
+
"font-face-src",
|
|
39540
|
+
"font-face-uri",
|
|
39541
|
+
"foreignobject",
|
|
39542
|
+
"hatch",
|
|
39543
|
+
"hatchpath",
|
|
39544
|
+
"mesh",
|
|
39545
|
+
"meshgradient",
|
|
39546
|
+
"meshpatch",
|
|
39547
|
+
"meshrow",
|
|
39548
|
+
"missing-glyph",
|
|
39549
|
+
"script",
|
|
39550
|
+
"set",
|
|
39551
|
+
"solidcolor",
|
|
39552
|
+
"unknown",
|
|
39553
|
+
"use"
|
|
39554
|
+
]);
|
|
39555
|
+
var mathMl$1 = freeze$1([
|
|
39556
|
+
"math",
|
|
39557
|
+
"menclose",
|
|
39558
|
+
"merror",
|
|
39559
|
+
"mfenced",
|
|
39560
|
+
"mfrac",
|
|
39561
|
+
"mglyph",
|
|
39562
|
+
"mi",
|
|
39563
|
+
"mlabeledtr",
|
|
39564
|
+
"mmultiscripts",
|
|
39565
|
+
"mn",
|
|
39566
|
+
"mo",
|
|
39567
|
+
"mover",
|
|
39568
|
+
"mpadded",
|
|
39569
|
+
"mphantom",
|
|
39570
|
+
"mroot",
|
|
39571
|
+
"mrow",
|
|
39572
|
+
"ms",
|
|
39573
|
+
"mspace",
|
|
39574
|
+
"msqrt",
|
|
39575
|
+
"mstyle",
|
|
39576
|
+
"msub",
|
|
39577
|
+
"msup",
|
|
39578
|
+
"msubsup",
|
|
39579
|
+
"mtable",
|
|
39580
|
+
"mtd",
|
|
39581
|
+
"mtext",
|
|
39582
|
+
"mtr",
|
|
39583
|
+
"munder",
|
|
39584
|
+
"munderover",
|
|
39585
|
+
"mprescripts"
|
|
39586
|
+
]);
|
|
39587
|
+
var mathMlDisallowed = freeze$1([
|
|
39588
|
+
"maction",
|
|
39589
|
+
"maligngroup",
|
|
39590
|
+
"malignmark",
|
|
39591
|
+
"mlongdiv",
|
|
39592
|
+
"mscarries",
|
|
39593
|
+
"mscarry",
|
|
39594
|
+
"msgroup",
|
|
39595
|
+
"mstack",
|
|
39596
|
+
"msline",
|
|
39597
|
+
"msrow",
|
|
39598
|
+
"semantics",
|
|
39599
|
+
"annotation",
|
|
39600
|
+
"annotation-xml",
|
|
39601
|
+
"mprescripts",
|
|
39602
|
+
"none"
|
|
39603
|
+
]);
|
|
39604
|
+
var text$3 = freeze$1(["#text"]);
|
|
39605
|
+
var html = freeze$1([
|
|
39606
|
+
"accept",
|
|
39607
|
+
"action",
|
|
39608
|
+
"align",
|
|
39609
|
+
"alt",
|
|
39610
|
+
"autocapitalize",
|
|
39611
|
+
"autocomplete",
|
|
39612
|
+
"autopictureinpicture",
|
|
39613
|
+
"autoplay",
|
|
39614
|
+
"background",
|
|
39615
|
+
"bgcolor",
|
|
39616
|
+
"border",
|
|
39617
|
+
"capture",
|
|
39618
|
+
"cellpadding",
|
|
39619
|
+
"cellspacing",
|
|
39620
|
+
"checked",
|
|
39621
|
+
"cite",
|
|
39622
|
+
"class",
|
|
39623
|
+
"clear",
|
|
39624
|
+
"color",
|
|
39625
|
+
"cols",
|
|
39626
|
+
"colspan",
|
|
39627
|
+
"command",
|
|
39628
|
+
"commandfor",
|
|
39629
|
+
"controls",
|
|
39630
|
+
"controlslist",
|
|
39631
|
+
"coords",
|
|
39632
|
+
"crossorigin",
|
|
39633
|
+
"datetime",
|
|
39634
|
+
"decoding",
|
|
39635
|
+
"default",
|
|
39636
|
+
"dir",
|
|
39637
|
+
"disabled",
|
|
39638
|
+
"disablepictureinpicture",
|
|
39639
|
+
"disableremoteplayback",
|
|
39640
|
+
"download",
|
|
39641
|
+
"draggable",
|
|
39642
|
+
"enctype",
|
|
39643
|
+
"enterkeyhint",
|
|
39644
|
+
"exportparts",
|
|
39645
|
+
"face",
|
|
39646
|
+
"for",
|
|
39647
|
+
"headers",
|
|
39648
|
+
"height",
|
|
39649
|
+
"hidden",
|
|
39650
|
+
"high",
|
|
39651
|
+
"href",
|
|
39652
|
+
"hreflang",
|
|
39653
|
+
"id",
|
|
39654
|
+
"inert",
|
|
39655
|
+
"inputmode",
|
|
39656
|
+
"integrity",
|
|
39657
|
+
"ismap",
|
|
39658
|
+
"kind",
|
|
39659
|
+
"label",
|
|
39660
|
+
"lang",
|
|
39661
|
+
"list",
|
|
39662
|
+
"loading",
|
|
39663
|
+
"loop",
|
|
39664
|
+
"low",
|
|
39665
|
+
"max",
|
|
39666
|
+
"maxlength",
|
|
39667
|
+
"media",
|
|
39668
|
+
"method",
|
|
39669
|
+
"min",
|
|
39670
|
+
"minlength",
|
|
39671
|
+
"multiple",
|
|
39672
|
+
"muted",
|
|
39673
|
+
"name",
|
|
39674
|
+
"nonce",
|
|
39675
|
+
"noshade",
|
|
39676
|
+
"novalidate",
|
|
39677
|
+
"nowrap",
|
|
39678
|
+
"open",
|
|
39679
|
+
"optimum",
|
|
39680
|
+
"part",
|
|
39681
|
+
"pattern",
|
|
39682
|
+
"placeholder",
|
|
39683
|
+
"playsinline",
|
|
39684
|
+
"popover",
|
|
39685
|
+
"popovertarget",
|
|
39686
|
+
"popovertargetaction",
|
|
39687
|
+
"poster",
|
|
39688
|
+
"preload",
|
|
39689
|
+
"pubdate",
|
|
39690
|
+
"radiogroup",
|
|
39691
|
+
"readonly",
|
|
39692
|
+
"rel",
|
|
39693
|
+
"required",
|
|
39694
|
+
"rev",
|
|
39695
|
+
"reversed",
|
|
39696
|
+
"role",
|
|
39697
|
+
"rows",
|
|
39698
|
+
"rowspan",
|
|
39699
|
+
"spellcheck",
|
|
39700
|
+
"scope",
|
|
39701
|
+
"selected",
|
|
39702
|
+
"shape",
|
|
39703
|
+
"size",
|
|
39704
|
+
"sizes",
|
|
39705
|
+
"slot",
|
|
39706
|
+
"span",
|
|
39707
|
+
"srclang",
|
|
39708
|
+
"start",
|
|
39709
|
+
"src",
|
|
39710
|
+
"srcset",
|
|
39711
|
+
"step",
|
|
39712
|
+
"style",
|
|
39713
|
+
"summary",
|
|
39714
|
+
"tabindex",
|
|
39715
|
+
"title",
|
|
39716
|
+
"translate",
|
|
39717
|
+
"type",
|
|
39718
|
+
"usemap",
|
|
39719
|
+
"valign",
|
|
39720
|
+
"value",
|
|
39721
|
+
"width",
|
|
39722
|
+
"wrap",
|
|
39723
|
+
"xmlns"
|
|
39724
|
+
]);
|
|
39725
|
+
var svg$2 = freeze$1([
|
|
39726
|
+
"accent-height",
|
|
39727
|
+
"accumulate",
|
|
39728
|
+
"additive",
|
|
39729
|
+
"alignment-baseline",
|
|
39730
|
+
"amplitude",
|
|
39731
|
+
"ascent",
|
|
39732
|
+
"attributename",
|
|
39733
|
+
"attributetype",
|
|
39734
|
+
"azimuth",
|
|
39735
|
+
"basefrequency",
|
|
39736
|
+
"baseline-shift",
|
|
39737
|
+
"begin",
|
|
39738
|
+
"bias",
|
|
39739
|
+
"by",
|
|
39740
|
+
"class",
|
|
39741
|
+
"clip",
|
|
39742
|
+
"clippathunits",
|
|
39743
|
+
"clip-path",
|
|
39744
|
+
"clip-rule",
|
|
39745
|
+
"color",
|
|
39746
|
+
"color-interpolation",
|
|
39747
|
+
"color-interpolation-filters",
|
|
39748
|
+
"color-profile",
|
|
39749
|
+
"color-rendering",
|
|
39750
|
+
"cx",
|
|
39751
|
+
"cy",
|
|
39752
|
+
"d",
|
|
39753
|
+
"dx",
|
|
39754
|
+
"dy",
|
|
39755
|
+
"diffuseconstant",
|
|
39756
|
+
"direction",
|
|
39757
|
+
"display",
|
|
39758
|
+
"divisor",
|
|
39759
|
+
"dur",
|
|
39760
|
+
"edgemode",
|
|
39761
|
+
"elevation",
|
|
39762
|
+
"end",
|
|
39763
|
+
"exponent",
|
|
39764
|
+
"fill",
|
|
39765
|
+
"fill-opacity",
|
|
39766
|
+
"fill-rule",
|
|
39767
|
+
"filter",
|
|
39768
|
+
"filterunits",
|
|
39769
|
+
"flood-color",
|
|
39770
|
+
"flood-opacity",
|
|
39771
|
+
"font-family",
|
|
39772
|
+
"font-size",
|
|
39773
|
+
"font-size-adjust",
|
|
39774
|
+
"font-stretch",
|
|
39775
|
+
"font-style",
|
|
39776
|
+
"font-variant",
|
|
39777
|
+
"font-weight",
|
|
39778
|
+
"fx",
|
|
39779
|
+
"fy",
|
|
39780
|
+
"g1",
|
|
39781
|
+
"g2",
|
|
39782
|
+
"glyph-name",
|
|
39783
|
+
"glyphref",
|
|
39784
|
+
"gradientunits",
|
|
39785
|
+
"gradienttransform",
|
|
39786
|
+
"height",
|
|
39787
|
+
"href",
|
|
39788
|
+
"id",
|
|
39789
|
+
"image-rendering",
|
|
39790
|
+
"in",
|
|
39791
|
+
"in2",
|
|
39792
|
+
"intercept",
|
|
39793
|
+
"k",
|
|
39794
|
+
"k1",
|
|
39795
|
+
"k2",
|
|
39796
|
+
"k3",
|
|
39797
|
+
"k4",
|
|
39798
|
+
"kerning",
|
|
39799
|
+
"keypoints",
|
|
39800
|
+
"keysplines",
|
|
39801
|
+
"keytimes",
|
|
39802
|
+
"lang",
|
|
39803
|
+
"lengthadjust",
|
|
39804
|
+
"letter-spacing",
|
|
39805
|
+
"kernelmatrix",
|
|
39806
|
+
"kernelunitlength",
|
|
39807
|
+
"lighting-color",
|
|
39808
|
+
"local",
|
|
39809
|
+
"marker-end",
|
|
39810
|
+
"marker-mid",
|
|
39811
|
+
"marker-start",
|
|
39812
|
+
"markerheight",
|
|
39813
|
+
"markerunits",
|
|
39814
|
+
"markerwidth",
|
|
39815
|
+
"maskcontentunits",
|
|
39816
|
+
"maskunits",
|
|
39817
|
+
"max",
|
|
39818
|
+
"mask",
|
|
39819
|
+
"mask-type",
|
|
39820
|
+
"media",
|
|
39821
|
+
"method",
|
|
39822
|
+
"mode",
|
|
39823
|
+
"min",
|
|
39824
|
+
"name",
|
|
39825
|
+
"numoctaves",
|
|
39826
|
+
"offset",
|
|
39827
|
+
"operator",
|
|
39828
|
+
"opacity",
|
|
39829
|
+
"order",
|
|
39830
|
+
"orient",
|
|
39831
|
+
"orientation",
|
|
39832
|
+
"origin",
|
|
39833
|
+
"overflow",
|
|
39834
|
+
"paint-order",
|
|
39835
|
+
"path",
|
|
39836
|
+
"pathlength",
|
|
39837
|
+
"patterncontentunits",
|
|
39838
|
+
"patterntransform",
|
|
39839
|
+
"patternunits",
|
|
39840
|
+
"points",
|
|
39841
|
+
"preservealpha",
|
|
39842
|
+
"preserveaspectratio",
|
|
39843
|
+
"primitiveunits",
|
|
39844
|
+
"r",
|
|
39845
|
+
"rx",
|
|
39846
|
+
"ry",
|
|
39847
|
+
"radius",
|
|
39848
|
+
"refx",
|
|
39849
|
+
"refy",
|
|
39850
|
+
"repeatcount",
|
|
39851
|
+
"repeatdur",
|
|
39852
|
+
"restart",
|
|
39853
|
+
"result",
|
|
39854
|
+
"rotate",
|
|
39855
|
+
"scale",
|
|
39856
|
+
"seed",
|
|
39857
|
+
"shape-rendering",
|
|
39858
|
+
"slope",
|
|
39859
|
+
"specularconstant",
|
|
39860
|
+
"specularexponent",
|
|
39861
|
+
"spreadmethod",
|
|
39862
|
+
"startoffset",
|
|
39863
|
+
"stddeviation",
|
|
39864
|
+
"stitchtiles",
|
|
39865
|
+
"stop-color",
|
|
39866
|
+
"stop-opacity",
|
|
39867
|
+
"stroke-dasharray",
|
|
39868
|
+
"stroke-dashoffset",
|
|
39869
|
+
"stroke-linecap",
|
|
39870
|
+
"stroke-linejoin",
|
|
39871
|
+
"stroke-miterlimit",
|
|
39872
|
+
"stroke-opacity",
|
|
39873
|
+
"stroke",
|
|
39874
|
+
"stroke-width",
|
|
39875
|
+
"style",
|
|
39876
|
+
"surfacescale",
|
|
39877
|
+
"systemlanguage",
|
|
39878
|
+
"tabindex",
|
|
39879
|
+
"tablevalues",
|
|
39880
|
+
"targetx",
|
|
39881
|
+
"targety",
|
|
39882
|
+
"transform",
|
|
39883
|
+
"transform-origin",
|
|
39884
|
+
"text-anchor",
|
|
39885
|
+
"text-decoration",
|
|
39886
|
+
"text-rendering",
|
|
39887
|
+
"textlength",
|
|
39888
|
+
"type",
|
|
39889
|
+
"u1",
|
|
39890
|
+
"u2",
|
|
39891
|
+
"unicode",
|
|
39892
|
+
"values",
|
|
39893
|
+
"viewbox",
|
|
39894
|
+
"visibility",
|
|
39895
|
+
"version",
|
|
39896
|
+
"vert-adv-y",
|
|
39897
|
+
"vert-origin-x",
|
|
39898
|
+
"vert-origin-y",
|
|
39899
|
+
"width",
|
|
39900
|
+
"word-spacing",
|
|
39901
|
+
"wrap",
|
|
39902
|
+
"writing-mode",
|
|
39903
|
+
"xchannelselector",
|
|
39904
|
+
"ychannelselector",
|
|
39905
|
+
"x",
|
|
39906
|
+
"x1",
|
|
39907
|
+
"x2",
|
|
39908
|
+
"xmlns",
|
|
39909
|
+
"y",
|
|
39910
|
+
"y1",
|
|
39911
|
+
"y2",
|
|
39912
|
+
"z",
|
|
39913
|
+
"zoomandpan"
|
|
39914
|
+
]);
|
|
39915
|
+
var mathMl = freeze$1([
|
|
39916
|
+
"accent",
|
|
39917
|
+
"accentunder",
|
|
39918
|
+
"align",
|
|
39919
|
+
"bevelled",
|
|
39920
|
+
"close",
|
|
39921
|
+
"columnalign",
|
|
39922
|
+
"columnlines",
|
|
39923
|
+
"columnspacing",
|
|
39924
|
+
"columnspan",
|
|
39925
|
+
"denomalign",
|
|
39926
|
+
"depth",
|
|
39927
|
+
"dir",
|
|
39928
|
+
"display",
|
|
39929
|
+
"displaystyle",
|
|
39930
|
+
"encoding",
|
|
39931
|
+
"fence",
|
|
39932
|
+
"frame",
|
|
39933
|
+
"height",
|
|
39934
|
+
"href",
|
|
39935
|
+
"id",
|
|
39936
|
+
"largeop",
|
|
39937
|
+
"length",
|
|
39938
|
+
"linethickness",
|
|
39939
|
+
"lquote",
|
|
39940
|
+
"lspace",
|
|
39941
|
+
"mathbackground",
|
|
39942
|
+
"mathcolor",
|
|
39943
|
+
"mathsize",
|
|
39944
|
+
"mathvariant",
|
|
39945
|
+
"maxsize",
|
|
39946
|
+
"minsize",
|
|
39947
|
+
"movablelimits",
|
|
39948
|
+
"notation",
|
|
39949
|
+
"numalign",
|
|
39950
|
+
"open",
|
|
39951
|
+
"rowalign",
|
|
39952
|
+
"rowlines",
|
|
39953
|
+
"rowspacing",
|
|
39954
|
+
"rowspan",
|
|
39955
|
+
"rspace",
|
|
39956
|
+
"rquote",
|
|
39957
|
+
"scriptlevel",
|
|
39958
|
+
"scriptminsize",
|
|
39959
|
+
"scriptsizemultiplier",
|
|
39960
|
+
"selection",
|
|
39961
|
+
"separator",
|
|
39962
|
+
"separators",
|
|
39963
|
+
"stretchy",
|
|
39964
|
+
"subscriptshift",
|
|
39965
|
+
"supscriptshift",
|
|
39966
|
+
"symmetric",
|
|
39967
|
+
"voffset",
|
|
39968
|
+
"width",
|
|
39969
|
+
"xmlns"
|
|
39970
|
+
]);
|
|
39971
|
+
var xml = freeze$1([
|
|
39972
|
+
"xlink:href",
|
|
39973
|
+
"xml:id",
|
|
39974
|
+
"xlink:title",
|
|
39975
|
+
"xml:space",
|
|
39976
|
+
"xmlns:xlink"
|
|
39977
|
+
]);
|
|
39978
|
+
var MUSTACHE_EXPR = seal(/{{[\w\W]*|^[\w\W]*}}/g);
|
|
39979
|
+
var ERB_EXPR = seal(/<%[\w\W]*|^[\w\W]*%>/g);
|
|
39980
|
+
var TMPLIT_EXPR = seal(/\${[\w\W]*/g);
|
|
39981
|
+
var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/);
|
|
39982
|
+
var ARIA_ATTR = seal(/^aria-[\-\w]+$/);
|
|
39983
|
+
var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i);
|
|
39984
|
+
var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
|
|
39985
|
+
var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g);
|
|
39986
|
+
var DOCTYPE_NAME = seal(/^html$/i);
|
|
39987
|
+
var CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i);
|
|
39988
|
+
var ELEMENT_MARKUP_PROBE = seal(/<[/\w!]/g);
|
|
39989
|
+
var COMMENT_MARKUP_PROBE = seal(/<[/\w]/g);
|
|
39990
|
+
var FALLBACK_TAG_CLOSE = seal(/<\/no(script|embed|frames)/i);
|
|
39991
|
+
var SELF_CLOSING_TAG = seal(/\/>/i);
|
|
39992
|
+
var NODE_TYPE = {
|
|
39993
|
+
element: 1,
|
|
39994
|
+
attribute: 2,
|
|
39995
|
+
text: 3,
|
|
39996
|
+
cdataSection: 4,
|
|
39997
|
+
entityReference: 5,
|
|
39998
|
+
entityNode: 6,
|
|
39999
|
+
processingInstruction: 7,
|
|
40000
|
+
comment: 8,
|
|
40001
|
+
document: 9,
|
|
40002
|
+
documentType: 10,
|
|
40003
|
+
documentFragment: 11,
|
|
40004
|
+
notation: 12
|
|
40005
|
+
};
|
|
40006
|
+
var getGlobal = function getGlobal() {
|
|
40007
|
+
return typeof window === "undefined" ? null : window;
|
|
40008
|
+
};
|
|
40009
|
+
/**
|
|
40010
|
+
* Creates a no-op policy for internal use only.
|
|
40011
|
+
* Don't export this function outside this module!
|
|
40012
|
+
* @param trustedTypes The policy factory.
|
|
40013
|
+
* @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).
|
|
40014
|
+
* @return The policy created (or null, if Trusted Types
|
|
40015
|
+
* are not supported or creating the policy failed).
|
|
40016
|
+
*/
|
|
40017
|
+
var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {
|
|
40018
|
+
if (typeof trustedTypes !== "object" || typeof trustedTypes.createPolicy !== "function") return null;
|
|
40019
|
+
let suffix = null;
|
|
40020
|
+
const ATTR_NAME = "data-tt-policy-suffix";
|
|
40021
|
+
if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) suffix = purifyHostElement.getAttribute(ATTR_NAME);
|
|
40022
|
+
const policyName = "dompurify" + (suffix ? "#" + suffix : "");
|
|
40023
|
+
try {
|
|
40024
|
+
return trustedTypes.createPolicy(policyName, {
|
|
40025
|
+
createHTML(html) {
|
|
40026
|
+
return html;
|
|
40027
|
+
},
|
|
40028
|
+
createScriptURL(scriptUrl) {
|
|
40029
|
+
return scriptUrl;
|
|
40030
|
+
}
|
|
40031
|
+
});
|
|
40032
|
+
} catch (_) {
|
|
40033
|
+
console.warn("TrustedTypes policy " + policyName + " could not be created.");
|
|
40034
|
+
return null;
|
|
40035
|
+
}
|
|
40036
|
+
};
|
|
40037
|
+
var _createHooksMap = function _createHooksMap() {
|
|
40038
|
+
return {
|
|
40039
|
+
afterSanitizeAttributes: [],
|
|
40040
|
+
afterSanitizeElements: [],
|
|
40041
|
+
afterSanitizeShadowDOM: [],
|
|
40042
|
+
beforeSanitizeAttributes: [],
|
|
40043
|
+
beforeSanitizeElements: [],
|
|
40044
|
+
beforeSanitizeShadowDOM: [],
|
|
40045
|
+
uponSanitizeAttribute: [],
|
|
40046
|
+
uponSanitizeElement: [],
|
|
40047
|
+
uponSanitizeShadowNode: []
|
|
40048
|
+
};
|
|
40049
|
+
};
|
|
40050
|
+
/**
|
|
40051
|
+
* Resolve a set-valued configuration option: a fresh set built from
|
|
40052
|
+
* cfg[key] when it is an own array property (seeded with a clone of
|
|
40053
|
+
* options.base when given, case-normalized via options.transform),
|
|
40054
|
+
* the fallback set otherwise.
|
|
40055
|
+
*
|
|
40056
|
+
* @param cfg the cloned, prototype-free configuration object
|
|
40057
|
+
* @param key the configuration property to read
|
|
40058
|
+
* @param fallback the set to use when the option is absent or not an array
|
|
40059
|
+
* @param options transform and optional base set to merge into
|
|
40060
|
+
* @returns the resolved set
|
|
40061
|
+
*/
|
|
40062
|
+
var _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {
|
|
40063
|
+
return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone$1(options.base) : {}, cfg[key], options.transform) : fallback;
|
|
40064
|
+
};
|
|
40065
|
+
function createDOMPurify() {
|
|
40066
|
+
let window = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal();
|
|
40067
|
+
const DOMPurify = (root) => createDOMPurify(root);
|
|
40068
|
+
DOMPurify.version = "3.4.11";
|
|
40069
|
+
DOMPurify.removed = [];
|
|
40070
|
+
if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
|
|
40071
|
+
DOMPurify.isSupported = false;
|
|
40072
|
+
return DOMPurify;
|
|
40073
|
+
}
|
|
40074
|
+
let document = window.document;
|
|
40075
|
+
const originalDocument = document;
|
|
40076
|
+
const currentScript = originalDocument.currentScript;
|
|
40077
|
+
window.DocumentFragment;
|
|
40078
|
+
const HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter;
|
|
40079
|
+
window.NamedNodeMap === void 0 && (window.NamedNodeMap || window.MozNamedAttrMap);
|
|
40080
|
+
window.HTMLFormElement;
|
|
40081
|
+
const DOMParser = window.DOMParser, trustedTypes = window.trustedTypes;
|
|
40082
|
+
const ElementPrototype = Element.prototype;
|
|
40083
|
+
const cloneNode = lookupGetter(ElementPrototype, "cloneNode");
|
|
40084
|
+
const remove = lookupGetter(ElementPrototype, "remove");
|
|
40085
|
+
const getNextSibling = lookupGetter(ElementPrototype, "nextSibling");
|
|
40086
|
+
const getChildNodes = lookupGetter(ElementPrototype, "childNodes");
|
|
40087
|
+
const getParentNode = lookupGetter(ElementPrototype, "parentNode");
|
|
40088
|
+
const getShadowRoot = lookupGetter(ElementPrototype, "shadowRoot");
|
|
40089
|
+
const getAttributes = lookupGetter(ElementPrototype, "attributes");
|
|
40090
|
+
const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeType") : null;
|
|
40091
|
+
const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeName") : null;
|
|
40092
|
+
if (typeof HTMLTemplateElement === "function") {
|
|
40093
|
+
const template = document.createElement("template");
|
|
40094
|
+
if (template.content && template.content.ownerDocument) document = template.content.ownerDocument;
|
|
40095
|
+
}
|
|
40096
|
+
let trustedTypesPolicy;
|
|
40097
|
+
let emptyHTML = "";
|
|
40098
|
+
let defaultTrustedTypesPolicy;
|
|
40099
|
+
let defaultTrustedTypesPolicyResolved = false;
|
|
40100
|
+
let IN_TRUSTED_TYPES_POLICY = 0;
|
|
40101
|
+
const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {
|
|
40102
|
+
if (IN_TRUSTED_TYPES_POLICY > 0) 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.");
|
|
40103
|
+
};
|
|
40104
|
+
const _createTrustedHTML = function _createTrustedHTML(html) {
|
|
40105
|
+
_assertNotInTrustedTypesPolicy();
|
|
40106
|
+
IN_TRUSTED_TYPES_POLICY++;
|
|
40107
|
+
try {
|
|
40108
|
+
return trustedTypesPolicy.createHTML(html);
|
|
40109
|
+
} finally {
|
|
40110
|
+
IN_TRUSTED_TYPES_POLICY--;
|
|
40111
|
+
}
|
|
40112
|
+
};
|
|
40113
|
+
const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {
|
|
40114
|
+
_assertNotInTrustedTypesPolicy();
|
|
40115
|
+
IN_TRUSTED_TYPES_POLICY++;
|
|
40116
|
+
try {
|
|
40117
|
+
return trustedTypesPolicy.createScriptURL(scriptUrl);
|
|
40118
|
+
} finally {
|
|
40119
|
+
IN_TRUSTED_TYPES_POLICY--;
|
|
40120
|
+
}
|
|
40121
|
+
};
|
|
40122
|
+
const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {
|
|
40123
|
+
if (!defaultTrustedTypesPolicyResolved) {
|
|
40124
|
+
defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);
|
|
40125
|
+
defaultTrustedTypesPolicyResolved = true;
|
|
40126
|
+
}
|
|
40127
|
+
return defaultTrustedTypesPolicy;
|
|
40128
|
+
};
|
|
40129
|
+
const _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;
|
|
40130
|
+
const importNode = originalDocument.importNode;
|
|
40131
|
+
let hooks = _createHooksMap();
|
|
40132
|
+
/**
|
|
40133
|
+
* Expose whether this browser supports running the full DOMPurify.
|
|
40134
|
+
*/
|
|
40135
|
+
DOMPurify.isSupported = typeof entries === "function" && typeof getParentNode === "function" && implementation && implementation.createHTMLDocument !== void 0;
|
|
40136
|
+
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;
|
|
40137
|
+
let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;
|
|
40138
|
+
/**
|
|
40139
|
+
* We consider the elements and attributes below to be safe. Ideally
|
|
40140
|
+
* don't add any new ones but feel free to remove unwanted ones.
|
|
40141
|
+
*/
|
|
40142
|
+
let ALLOWED_TAGS = null;
|
|
40143
|
+
const DEFAULT_ALLOWED_TAGS = addToSet({}, [
|
|
40144
|
+
...html$1,
|
|
40145
|
+
...svg$1,
|
|
40146
|
+
...svgFilters,
|
|
40147
|
+
...mathMl$1,
|
|
40148
|
+
...text$3
|
|
40149
|
+
]);
|
|
40150
|
+
let ALLOWED_ATTR = null;
|
|
40151
|
+
const DEFAULT_ALLOWED_ATTR = addToSet({}, [
|
|
40152
|
+
...html,
|
|
40153
|
+
...svg$2,
|
|
40154
|
+
...mathMl,
|
|
40155
|
+
...xml
|
|
40156
|
+
]);
|
|
40157
|
+
let CUSTOM_ELEMENT_HANDLING = Object.seal(create$1(null, {
|
|
40158
|
+
tagNameCheck: {
|
|
40159
|
+
writable: true,
|
|
40160
|
+
configurable: false,
|
|
40161
|
+
enumerable: true,
|
|
40162
|
+
value: null
|
|
40163
|
+
},
|
|
40164
|
+
attributeNameCheck: {
|
|
40165
|
+
writable: true,
|
|
40166
|
+
configurable: false,
|
|
40167
|
+
enumerable: true,
|
|
40168
|
+
value: null
|
|
40169
|
+
},
|
|
40170
|
+
allowCustomizedBuiltInElements: {
|
|
40171
|
+
writable: true,
|
|
40172
|
+
configurable: false,
|
|
40173
|
+
enumerable: true,
|
|
40174
|
+
value: false
|
|
40175
|
+
}
|
|
40176
|
+
}));
|
|
40177
|
+
let FORBID_TAGS = null;
|
|
40178
|
+
let FORBID_ATTR = null;
|
|
40179
|
+
const EXTRA_ELEMENT_HANDLING = Object.seal(create$1(null, {
|
|
40180
|
+
tagCheck: {
|
|
40181
|
+
writable: true,
|
|
40182
|
+
configurable: false,
|
|
40183
|
+
enumerable: true,
|
|
40184
|
+
value: null
|
|
40185
|
+
},
|
|
40186
|
+
attributeCheck: {
|
|
40187
|
+
writable: true,
|
|
40188
|
+
configurable: false,
|
|
40189
|
+
enumerable: true,
|
|
40190
|
+
value: null
|
|
40191
|
+
}
|
|
40192
|
+
}));
|
|
40193
|
+
let ALLOW_ARIA_ATTR = true;
|
|
40194
|
+
let ALLOW_DATA_ATTR = true;
|
|
40195
|
+
let ALLOW_UNKNOWN_PROTOCOLS = false;
|
|
40196
|
+
let ALLOW_SELF_CLOSE_IN_ATTR = true;
|
|
40197
|
+
let SAFE_FOR_TEMPLATES = false;
|
|
40198
|
+
let SAFE_FOR_XML = true;
|
|
40199
|
+
let WHOLE_DOCUMENT = false;
|
|
40200
|
+
let SET_CONFIG = false;
|
|
40201
|
+
let SET_CONFIG_ALLOWED_TAGS = null;
|
|
40202
|
+
let SET_CONFIG_ALLOWED_ATTR = null;
|
|
40203
|
+
let FORCE_BODY = false;
|
|
40204
|
+
let RETURN_DOM = false;
|
|
40205
|
+
let RETURN_DOM_FRAGMENT = false;
|
|
40206
|
+
let RETURN_TRUSTED_TYPE = false;
|
|
40207
|
+
let SANITIZE_DOM = true;
|
|
40208
|
+
let SANITIZE_NAMED_PROPS = false;
|
|
40209
|
+
const SANITIZE_NAMED_PROPS_PREFIX = "user-content-";
|
|
40210
|
+
let KEEP_CONTENT = true;
|
|
40211
|
+
let IN_PLACE = false;
|
|
40212
|
+
let USE_PROFILES = {};
|
|
40213
|
+
let FORBID_CONTENTS = null;
|
|
40214
|
+
const DEFAULT_FORBID_CONTENTS = addToSet({}, [
|
|
40215
|
+
"annotation-xml",
|
|
40216
|
+
"audio",
|
|
40217
|
+
"colgroup",
|
|
40218
|
+
"desc",
|
|
40219
|
+
"foreignobject",
|
|
40220
|
+
"head",
|
|
40221
|
+
"iframe",
|
|
40222
|
+
"math",
|
|
40223
|
+
"mi",
|
|
40224
|
+
"mn",
|
|
40225
|
+
"mo",
|
|
40226
|
+
"ms",
|
|
40227
|
+
"mtext",
|
|
40228
|
+
"noembed",
|
|
40229
|
+
"noframes",
|
|
40230
|
+
"noscript",
|
|
40231
|
+
"plaintext",
|
|
40232
|
+
"script",
|
|
40233
|
+
"selectedcontent",
|
|
40234
|
+
"style",
|
|
40235
|
+
"svg",
|
|
40236
|
+
"template",
|
|
40237
|
+
"thead",
|
|
40238
|
+
"title",
|
|
40239
|
+
"video",
|
|
40240
|
+
"xmp"
|
|
40241
|
+
]);
|
|
40242
|
+
let DATA_URI_TAGS = null;
|
|
40243
|
+
const DEFAULT_DATA_URI_TAGS = addToSet({}, [
|
|
40244
|
+
"audio",
|
|
40245
|
+
"video",
|
|
40246
|
+
"img",
|
|
40247
|
+
"source",
|
|
40248
|
+
"image",
|
|
40249
|
+
"track"
|
|
40250
|
+
]);
|
|
40251
|
+
let URI_SAFE_ATTRIBUTES = null;
|
|
40252
|
+
const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [
|
|
40253
|
+
"alt",
|
|
40254
|
+
"class",
|
|
40255
|
+
"for",
|
|
40256
|
+
"id",
|
|
40257
|
+
"label",
|
|
40258
|
+
"name",
|
|
40259
|
+
"pattern",
|
|
40260
|
+
"placeholder",
|
|
40261
|
+
"role",
|
|
40262
|
+
"summary",
|
|
40263
|
+
"title",
|
|
40264
|
+
"value",
|
|
40265
|
+
"style",
|
|
40266
|
+
"xmlns"
|
|
40267
|
+
]);
|
|
40268
|
+
const MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
|
|
40269
|
+
const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
40270
|
+
const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
|
|
40271
|
+
let NAMESPACE = HTML_NAMESPACE;
|
|
40272
|
+
let IS_EMPTY_INPUT = false;
|
|
40273
|
+
let ALLOWED_NAMESPACES = null;
|
|
40274
|
+
const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [
|
|
40275
|
+
MATHML_NAMESPACE,
|
|
40276
|
+
SVG_NAMESPACE,
|
|
40277
|
+
HTML_NAMESPACE
|
|
40278
|
+
], stringToString);
|
|
40279
|
+
const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze$1([
|
|
40280
|
+
"mi",
|
|
40281
|
+
"mo",
|
|
40282
|
+
"mn",
|
|
40283
|
+
"ms",
|
|
40284
|
+
"mtext"
|
|
40285
|
+
]);
|
|
40286
|
+
let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
|
|
40287
|
+
const DEFAULT_HTML_INTEGRATION_POINTS = freeze$1(["annotation-xml"]);
|
|
40288
|
+
let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
|
|
40289
|
+
const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [
|
|
40290
|
+
"title",
|
|
40291
|
+
"style",
|
|
40292
|
+
"font",
|
|
40293
|
+
"a",
|
|
40294
|
+
"script"
|
|
40295
|
+
]);
|
|
40296
|
+
let PARSER_MEDIA_TYPE = null;
|
|
40297
|
+
const SUPPORTED_PARSER_MEDIA_TYPES = ["application/xhtml+xml", "text/html"];
|
|
40298
|
+
const DEFAULT_PARSER_MEDIA_TYPE = "text/html";
|
|
40299
|
+
let transformCaseFunc = null;
|
|
40300
|
+
let CONFIG = null;
|
|
40301
|
+
const formElement = document.createElement("form");
|
|
40302
|
+
const isRegexOrFunction = function isRegexOrFunction(testValue) {
|
|
40303
|
+
return testValue instanceof RegExp || testValue instanceof Function;
|
|
40304
|
+
};
|
|
40305
|
+
/**
|
|
40306
|
+
* _parseConfig
|
|
40307
|
+
*
|
|
40308
|
+
* @param cfg optional config literal
|
|
40309
|
+
*/
|
|
40310
|
+
const _parseConfig = function _parseConfig() {
|
|
40311
|
+
let cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
40312
|
+
if (CONFIG && CONFIG === cfg) return;
|
|
40313
|
+
if (!cfg || typeof cfg !== "object") cfg = {};
|
|
40314
|
+
cfg = clone$1(cfg);
|
|
40315
|
+
PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;
|
|
40316
|
+
transformCaseFunc = PARSER_MEDIA_TYPE === "application/xhtml+xml" ? stringToString : stringToLowerCase;
|
|
40317
|
+
ALLOWED_TAGS = _resolveSetOption(cfg, "ALLOWED_TAGS", DEFAULT_ALLOWED_TAGS, { transform: transformCaseFunc });
|
|
40318
|
+
ALLOWED_ATTR = _resolveSetOption(cfg, "ALLOWED_ATTR", DEFAULT_ALLOWED_ATTR, { transform: transformCaseFunc });
|
|
40319
|
+
ALLOWED_NAMESPACES = _resolveSetOption(cfg, "ALLOWED_NAMESPACES", DEFAULT_ALLOWED_NAMESPACES, { transform: stringToString });
|
|
40320
|
+
URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, "ADD_URI_SAFE_ATTR", DEFAULT_URI_SAFE_ATTRIBUTES, {
|
|
40321
|
+
transform: transformCaseFunc,
|
|
40322
|
+
base: DEFAULT_URI_SAFE_ATTRIBUTES
|
|
40323
|
+
});
|
|
40324
|
+
DATA_URI_TAGS = _resolveSetOption(cfg, "ADD_DATA_URI_TAGS", DEFAULT_DATA_URI_TAGS, {
|
|
40325
|
+
transform: transformCaseFunc,
|
|
40326
|
+
base: DEFAULT_DATA_URI_TAGS
|
|
40327
|
+
});
|
|
40328
|
+
FORBID_CONTENTS = _resolveSetOption(cfg, "FORBID_CONTENTS", DEFAULT_FORBID_CONTENTS, { transform: transformCaseFunc });
|
|
40329
|
+
FORBID_TAGS = _resolveSetOption(cfg, "FORBID_TAGS", clone$1({}), { transform: transformCaseFunc });
|
|
40330
|
+
FORBID_ATTR = _resolveSetOption(cfg, "FORBID_ATTR", clone$1({}), { transform: transformCaseFunc });
|
|
40331
|
+
USE_PROFILES = objectHasOwnProperty(cfg, "USE_PROFILES") ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === "object" ? clone$1(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;
|
|
40332
|
+
ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;
|
|
40333
|
+
ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;
|
|
40334
|
+
ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;
|
|
40335
|
+
ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false;
|
|
40336
|
+
SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;
|
|
40337
|
+
SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false;
|
|
40338
|
+
WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;
|
|
40339
|
+
RETURN_DOM = cfg.RETURN_DOM || false;
|
|
40340
|
+
RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;
|
|
40341
|
+
RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;
|
|
40342
|
+
FORCE_BODY = cfg.FORCE_BODY || false;
|
|
40343
|
+
SANITIZE_DOM = cfg.SANITIZE_DOM !== false;
|
|
40344
|
+
SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false;
|
|
40345
|
+
KEEP_CONTENT = cfg.KEEP_CONTENT !== false;
|
|
40346
|
+
IN_PLACE = cfg.IN_PLACE || false;
|
|
40347
|
+
IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI;
|
|
40348
|
+
NAMESPACE = typeof cfg.NAMESPACE === "string" ? cfg.NAMESPACE : HTML_NAMESPACE;
|
|
40349
|
+
MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "MATHML_TEXT_INTEGRATION_POINTS") && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === "object" ? clone$1(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
|
|
40350
|
+
HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "HTML_INTEGRATION_POINTS") && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === "object" ? clone$1(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
|
|
40351
|
+
const customElementHandling = objectHasOwnProperty(cfg, "CUSTOM_ELEMENT_HANDLING") && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === "object" ? clone$1(cfg.CUSTOM_ELEMENT_HANDLING) : create$1(null);
|
|
40352
|
+
CUSTOM_ELEMENT_HANDLING = create$1(null);
|
|
40353
|
+
if (objectHasOwnProperty(customElementHandling, "tagNameCheck") && isRegexOrFunction(customElementHandling.tagNameCheck)) CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck;
|
|
40354
|
+
if (objectHasOwnProperty(customElementHandling, "attributeNameCheck") && isRegexOrFunction(customElementHandling.attributeNameCheck)) CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck;
|
|
40355
|
+
if (objectHasOwnProperty(customElementHandling, "allowCustomizedBuiltInElements") && typeof customElementHandling.allowCustomizedBuiltInElements === "boolean") CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements;
|
|
40356
|
+
seal(CUSTOM_ELEMENT_HANDLING);
|
|
40357
|
+
if (SAFE_FOR_TEMPLATES) ALLOW_DATA_ATTR = false;
|
|
40358
|
+
if (RETURN_DOM_FRAGMENT) RETURN_DOM = true;
|
|
40359
|
+
if (USE_PROFILES) {
|
|
40360
|
+
ALLOWED_TAGS = addToSet({}, text$3);
|
|
40361
|
+
ALLOWED_ATTR = create$1(null);
|
|
40362
|
+
if (USE_PROFILES.html === true) {
|
|
40363
|
+
addToSet(ALLOWED_TAGS, html$1);
|
|
40364
|
+
addToSet(ALLOWED_ATTR, html);
|
|
40365
|
+
}
|
|
40366
|
+
if (USE_PROFILES.svg === true) {
|
|
40367
|
+
addToSet(ALLOWED_TAGS, svg$1);
|
|
40368
|
+
addToSet(ALLOWED_ATTR, svg$2);
|
|
40369
|
+
addToSet(ALLOWED_ATTR, xml);
|
|
40370
|
+
}
|
|
40371
|
+
if (USE_PROFILES.svgFilters === true) {
|
|
40372
|
+
addToSet(ALLOWED_TAGS, svgFilters);
|
|
40373
|
+
addToSet(ALLOWED_ATTR, svg$2);
|
|
40374
|
+
addToSet(ALLOWED_ATTR, xml);
|
|
40375
|
+
}
|
|
40376
|
+
if (USE_PROFILES.mathMl === true) {
|
|
40377
|
+
addToSet(ALLOWED_TAGS, mathMl$1);
|
|
40378
|
+
addToSet(ALLOWED_ATTR, mathMl);
|
|
40379
|
+
addToSet(ALLOWED_ATTR, xml);
|
|
40380
|
+
}
|
|
40381
|
+
}
|
|
40382
|
+
EXTRA_ELEMENT_HANDLING.tagCheck = null;
|
|
40383
|
+
EXTRA_ELEMENT_HANDLING.attributeCheck = null;
|
|
40384
|
+
if (objectHasOwnProperty(cfg, "ADD_TAGS")) {
|
|
40385
|
+
if (typeof cfg.ADD_TAGS === "function") EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;
|
|
40386
|
+
else if (arrayIsArray(cfg.ADD_TAGS)) {
|
|
40387
|
+
if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) ALLOWED_TAGS = clone$1(ALLOWED_TAGS);
|
|
40388
|
+
addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
|
|
40389
|
+
}
|
|
40390
|
+
}
|
|
40391
|
+
if (objectHasOwnProperty(cfg, "ADD_ATTR")) {
|
|
40392
|
+
if (typeof cfg.ADD_ATTR === "function") EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;
|
|
40393
|
+
else if (arrayIsArray(cfg.ADD_ATTR)) {
|
|
40394
|
+
if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) ALLOWED_ATTR = clone$1(ALLOWED_ATTR);
|
|
40395
|
+
addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
|
|
40396
|
+
}
|
|
40397
|
+
}
|
|
40398
|
+
if (objectHasOwnProperty(cfg, "ADD_URI_SAFE_ATTR") && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
|
|
40399
|
+
if (objectHasOwnProperty(cfg, "FORBID_CONTENTS") && arrayIsArray(cfg.FORBID_CONTENTS)) {
|
|
40400
|
+
if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) FORBID_CONTENTS = clone$1(FORBID_CONTENTS);
|
|
40401
|
+
addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
|
|
40402
|
+
}
|
|
40403
|
+
if (objectHasOwnProperty(cfg, "ADD_FORBID_CONTENTS") && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {
|
|
40404
|
+
if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) FORBID_CONTENTS = clone$1(FORBID_CONTENTS);
|
|
40405
|
+
addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);
|
|
40406
|
+
}
|
|
40407
|
+
if (KEEP_CONTENT) ALLOWED_TAGS["#text"] = true;
|
|
40408
|
+
if (WHOLE_DOCUMENT) addToSet(ALLOWED_TAGS, [
|
|
40409
|
+
"html",
|
|
40410
|
+
"head",
|
|
40411
|
+
"body"
|
|
40412
|
+
]);
|
|
40413
|
+
if (ALLOWED_TAGS.table) {
|
|
40414
|
+
addToSet(ALLOWED_TAGS, ["tbody"]);
|
|
40415
|
+
delete FORBID_TAGS.tbody;
|
|
40416
|
+
}
|
|
40417
|
+
if (cfg.TRUSTED_TYPES_POLICY) {
|
|
40418
|
+
if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== "function") throw typeErrorCreate("TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.");
|
|
40419
|
+
if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== "function") throw typeErrorCreate("TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.");
|
|
40420
|
+
const previousTrustedTypesPolicy = trustedTypesPolicy;
|
|
40421
|
+
trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;
|
|
40422
|
+
try {
|
|
40423
|
+
emptyHTML = _createTrustedHTML("");
|
|
40424
|
+
} catch (error) {
|
|
40425
|
+
trustedTypesPolicy = previousTrustedTypesPolicy;
|
|
40426
|
+
throw error;
|
|
40427
|
+
}
|
|
40428
|
+
} else if (cfg.TRUSTED_TYPES_POLICY === null) {
|
|
40429
|
+
trustedTypesPolicy = void 0;
|
|
40430
|
+
emptyHTML = "";
|
|
40431
|
+
} else {
|
|
40432
|
+
if (trustedTypesPolicy === void 0) trustedTypesPolicy = _getDefaultTrustedTypesPolicy();
|
|
40433
|
+
if (trustedTypesPolicy && typeof emptyHTML === "string") emptyHTML = _createTrustedHTML("");
|
|
40434
|
+
}
|
|
40435
|
+
if (freeze$1) freeze$1(cfg);
|
|
40436
|
+
CONFIG = cfg;
|
|
40437
|
+
};
|
|
40438
|
+
const ALL_SVG_TAGS = addToSet({}, [
|
|
40439
|
+
...svg$1,
|
|
40440
|
+
...svgFilters,
|
|
40441
|
+
...svgDisallowed
|
|
40442
|
+
]);
|
|
40443
|
+
const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);
|
|
40444
|
+
/**
|
|
40445
|
+
* Namespace rules for an element in the SVG namespace.
|
|
40446
|
+
*
|
|
40447
|
+
* @param tagName the element's lowercase tag name
|
|
40448
|
+
* @param parent the (possibly simulated) parent node
|
|
40449
|
+
* @param parentTagName the parent's lowercase tag name
|
|
40450
|
+
* @returns true if a spec-compliant parser could produce this element
|
|
40451
|
+
*/
|
|
40452
|
+
const _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {
|
|
40453
|
+
if (parent.namespaceURI === HTML_NAMESPACE) return tagName === "svg";
|
|
40454
|
+
if (parent.namespaceURI === MATHML_NAMESPACE) return tagName === "svg" && (parentTagName === "annotation-xml" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
|
|
40455
|
+
return Boolean(ALL_SVG_TAGS[tagName]);
|
|
40456
|
+
};
|
|
40457
|
+
/**
|
|
40458
|
+
* Namespace rules for an element in the MathML namespace.
|
|
40459
|
+
*
|
|
40460
|
+
* @param tagName the element's lowercase tag name
|
|
40461
|
+
* @param parent the (possibly simulated) parent node
|
|
40462
|
+
* @param parentTagName the parent's lowercase tag name
|
|
40463
|
+
* @returns true if a spec-compliant parser could produce this element
|
|
40464
|
+
*/
|
|
40465
|
+
const _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {
|
|
40466
|
+
if (parent.namespaceURI === HTML_NAMESPACE) return tagName === "math";
|
|
40467
|
+
if (parent.namespaceURI === SVG_NAMESPACE) return tagName === "math" && HTML_INTEGRATION_POINTS[parentTagName];
|
|
40468
|
+
return Boolean(ALL_MATHML_TAGS[tagName]);
|
|
40469
|
+
};
|
|
40470
|
+
/**
|
|
40471
|
+
* Namespace rules for an element in the HTML namespace.
|
|
40472
|
+
*
|
|
40473
|
+
* @param tagName the element's lowercase tag name
|
|
40474
|
+
* @param parent the (possibly simulated) parent node
|
|
40475
|
+
* @param parentTagName the parent's lowercase tag name
|
|
40476
|
+
* @returns true if a spec-compliant parser could produce this element
|
|
40477
|
+
*/
|
|
40478
|
+
const _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {
|
|
40479
|
+
if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) return false;
|
|
40480
|
+
if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) return false;
|
|
40481
|
+
return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
|
|
40482
|
+
};
|
|
40483
|
+
/**
|
|
40484
|
+
* @param element a DOM element whose namespace is being checked
|
|
40485
|
+
* @returns Return false if the element has a
|
|
40486
|
+
* namespace that a spec-compliant parser would never
|
|
40487
|
+
* return. Return true otherwise.
|
|
40488
|
+
*/
|
|
40489
|
+
const _checkValidNamespace = function _checkValidNamespace(element) {
|
|
40490
|
+
let parent = getParentNode(element);
|
|
40491
|
+
if (!parent || !parent.tagName) parent = {
|
|
40492
|
+
namespaceURI: NAMESPACE,
|
|
40493
|
+
tagName: "template"
|
|
40494
|
+
};
|
|
40495
|
+
const tagName = stringToLowerCase(element.tagName);
|
|
40496
|
+
const parentTagName = stringToLowerCase(parent.tagName);
|
|
40497
|
+
if (!ALLOWED_NAMESPACES[element.namespaceURI]) return false;
|
|
40498
|
+
if (element.namespaceURI === SVG_NAMESPACE) return _checkSvgNamespace(tagName, parent, parentTagName);
|
|
40499
|
+
if (element.namespaceURI === MATHML_NAMESPACE) return _checkMathMlNamespace(tagName, parent, parentTagName);
|
|
40500
|
+
if (element.namespaceURI === HTML_NAMESPACE) return _checkHtmlNamespace(tagName, parent, parentTagName);
|
|
40501
|
+
if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && ALLOWED_NAMESPACES[element.namespaceURI]) return true;
|
|
40502
|
+
return false;
|
|
40503
|
+
};
|
|
40504
|
+
/**
|
|
40505
|
+
* _forceRemove
|
|
40506
|
+
*
|
|
40507
|
+
* @param node a DOM node
|
|
40508
|
+
*/
|
|
40509
|
+
const _forceRemove = function _forceRemove(node) {
|
|
40510
|
+
arrayPush(DOMPurify.removed, { element: node });
|
|
40511
|
+
try {
|
|
40512
|
+
getParentNode(node).removeChild(node);
|
|
40513
|
+
} catch (_) {
|
|
40514
|
+
remove(node);
|
|
40515
|
+
if (!getParentNode(node)) throw typeErrorCreate("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place");
|
|
40516
|
+
}
|
|
40517
|
+
};
|
|
40518
|
+
/**
|
|
40519
|
+
* _neutralizeRoot
|
|
40520
|
+
*
|
|
40521
|
+
* Fail-closed teardown of an in-place root after the sanitize walk aborts
|
|
40522
|
+
* (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered
|
|
40523
|
+
* custom element's reaction detaches a node so `_forceRemove`'s deliberate
|
|
40524
|
+
* parentless guard throws, or any other re-entrant engine mutation — would
|
|
40525
|
+
* otherwise leave the caller's *live* tree half-sanitized, with everything
|
|
40526
|
+
* after the abort point still carrying its handlers. There is no safe way
|
|
40527
|
+
* to resume the walk (the tree mutated under us), so we strip the root bare:
|
|
40528
|
+
* remove every child and every attribute, then let the caller's catch see
|
|
40529
|
+
* the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`
|
|
40530
|
+
* getters; the root was already clobber-pre-flighted at the IN_PLACE entry).
|
|
40531
|
+
*
|
|
40532
|
+
* @param root the in-place root to empty
|
|
40533
|
+
*/
|
|
40534
|
+
const _neutralizeRoot = function _neutralizeRoot(root) {
|
|
40535
|
+
const childNodes = getChildNodes(root);
|
|
40536
|
+
if (childNodes) {
|
|
40537
|
+
const snapshot = [];
|
|
40538
|
+
arrayForEach(childNodes, (child) => {
|
|
40539
|
+
arrayPush(snapshot, child);
|
|
40540
|
+
});
|
|
40541
|
+
arrayForEach(snapshot, (child) => {
|
|
40542
|
+
try {
|
|
40543
|
+
remove(child);
|
|
40544
|
+
} catch (_) {}
|
|
40545
|
+
});
|
|
40546
|
+
}
|
|
40547
|
+
const attributes = getAttributes(root);
|
|
40548
|
+
if (attributes) for (let i = attributes.length - 1; i >= 0; --i) {
|
|
40549
|
+
const attribute = attributes[i];
|
|
40550
|
+
const name = attribute && attribute.name;
|
|
40551
|
+
if (typeof name === "string") try {
|
|
40552
|
+
root.removeAttribute(name);
|
|
40553
|
+
} catch (_) {}
|
|
40554
|
+
}
|
|
40555
|
+
};
|
|
40556
|
+
/**
|
|
40557
|
+
* _removeAttribute
|
|
40558
|
+
*
|
|
40559
|
+
* @param name an Attribute name
|
|
40560
|
+
* @param element a DOM node
|
|
40561
|
+
*/
|
|
40562
|
+
const _removeAttribute = function _removeAttribute(name, element) {
|
|
40563
|
+
try {
|
|
40564
|
+
arrayPush(DOMPurify.removed, {
|
|
40565
|
+
attribute: element.getAttributeNode(name),
|
|
40566
|
+
from: element
|
|
40567
|
+
});
|
|
40568
|
+
} catch (_) {
|
|
40569
|
+
arrayPush(DOMPurify.removed, {
|
|
40570
|
+
attribute: null,
|
|
40571
|
+
from: element
|
|
40572
|
+
});
|
|
40573
|
+
}
|
|
40574
|
+
element.removeAttribute(name);
|
|
40575
|
+
if (name === "is") if (RETURN_DOM || RETURN_DOM_FRAGMENT) try {
|
|
40576
|
+
_forceRemove(element);
|
|
40577
|
+
} catch (_) {}
|
|
40578
|
+
else try {
|
|
40579
|
+
element.setAttribute(name, "");
|
|
40580
|
+
} catch (_) {}
|
|
40581
|
+
};
|
|
40582
|
+
/**
|
|
40583
|
+
* _stripDisallowedAttributes
|
|
40584
|
+
*
|
|
40585
|
+
* Removes every attribute the active configuration does not allow from a
|
|
40586
|
+
* single element, using the same allowlist as the main attribute pass (so
|
|
40587
|
+
* `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to
|
|
40588
|
+
* neutralise nodes that are being discarded from an in-place tree.
|
|
40589
|
+
*
|
|
40590
|
+
* @param element the element to strip
|
|
40591
|
+
*/
|
|
40592
|
+
const _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {
|
|
40593
|
+
const attributes = getAttributes(element);
|
|
40594
|
+
if (!attributes) return;
|
|
40595
|
+
for (let i = attributes.length - 1; i >= 0; --i) {
|
|
40596
|
+
const attribute = attributes[i];
|
|
40597
|
+
const name = attribute && attribute.name;
|
|
40598
|
+
if (typeof name !== "string" || ALLOWED_ATTR[transformCaseFunc(name)]) continue;
|
|
40599
|
+
try {
|
|
40600
|
+
element.removeAttribute(name);
|
|
40601
|
+
} catch (_) {}
|
|
40602
|
+
}
|
|
40603
|
+
};
|
|
40604
|
+
/**
|
|
40605
|
+
* _neutralizeSubtree
|
|
40606
|
+
*
|
|
40607
|
+
* Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT
|
|
40608
|
+
* move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,
|
|
40609
|
+
* namespace, comment, processing-instruction and KEEP_CONTENT:false removals
|
|
40610
|
+
* all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path
|
|
40611
|
+
* those dropped nodes are detached from the caller's LIVE tree but a
|
|
40612
|
+
* handler-bearing original among them (an `<img onerror>`/`<video>` that was
|
|
40613
|
+
* loading) keeps its queued resource event, which fires in page scope after
|
|
40614
|
+
* sanitize returns. This walks a removed subtree and strips every attribute
|
|
40615
|
+
* the active configuration does not allow — so `on*` handlers are cancelled
|
|
40616
|
+
* through the SAME allowlist that governs kept nodes, not a separate `/^on/`
|
|
40617
|
+
* blocklist. Run synchronously before sanitize returns, i.e. before any
|
|
40618
|
+
* queued event can fire. Hook-free by design: these nodes leave the output,
|
|
40619
|
+
* so firing attribute hooks for them would be surprising. Clobber-safe reads;
|
|
40620
|
+
* a doomed clobbered node may shadow `removeAttribute` (its own attributes are
|
|
40621
|
+
* irrelevant — it is discarded — while its non-clobbered descendants, e.g.
|
|
40622
|
+
* the `<img>`, are reached and scrubbed).
|
|
40623
|
+
*
|
|
40624
|
+
* @param root the root of a removed subtree to neutralise
|
|
40625
|
+
*/
|
|
40626
|
+
const _neutralizeSubtree = function _neutralizeSubtree(root) {
|
|
40627
|
+
const stack = [root];
|
|
40628
|
+
while (stack.length > 0) {
|
|
40629
|
+
const node = stack.pop();
|
|
40630
|
+
if ((getNodeType ? getNodeType(node) : node.nodeType) === NODE_TYPE.element) _stripDisallowedAttributes(node);
|
|
40631
|
+
const childNodes = getChildNodes(node);
|
|
40632
|
+
if (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push(childNodes[i]);
|
|
40633
|
+
}
|
|
40634
|
+
};
|
|
40635
|
+
/**
|
|
40636
|
+
* _initDocument
|
|
40637
|
+
*
|
|
40638
|
+
* @param dirty - a string of dirty markup
|
|
40639
|
+
* @return a DOM, filled with the dirty markup
|
|
40640
|
+
*/
|
|
40641
|
+
const _initDocument = function _initDocument(dirty) {
|
|
40642
|
+
let doc = null;
|
|
40643
|
+
let leadingWhitespace = null;
|
|
40644
|
+
if (FORCE_BODY) dirty = "<remove></remove>" + dirty;
|
|
40645
|
+
else {
|
|
40646
|
+
const matches = stringMatch(dirty, /^[\r\n\t ]+/);
|
|
40647
|
+
leadingWhitespace = matches && matches[0];
|
|
40648
|
+
}
|
|
40649
|
+
if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && NAMESPACE === HTML_NAMESPACE) dirty = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>" + dirty + "</body></html>";
|
|
40650
|
+
const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;
|
|
40651
|
+
if (NAMESPACE === HTML_NAMESPACE) try {
|
|
40652
|
+
doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
|
|
40653
|
+
} catch (_) {}
|
|
40654
|
+
if (!doc || !doc.documentElement) {
|
|
40655
|
+
doc = implementation.createDocument(NAMESPACE, "template", null);
|
|
40656
|
+
try {
|
|
40657
|
+
doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
|
|
40658
|
+
} catch (_) {}
|
|
40659
|
+
}
|
|
40660
|
+
const body = doc.body || doc.documentElement;
|
|
40661
|
+
if (dirty && leadingWhitespace) body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);
|
|
40662
|
+
if (NAMESPACE === HTML_NAMESPACE) return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? "html" : "body")[0];
|
|
40663
|
+
return WHOLE_DOCUMENT ? doc.documentElement : body;
|
|
40664
|
+
};
|
|
40665
|
+
/**
|
|
40666
|
+
* Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.
|
|
40667
|
+
*
|
|
40668
|
+
* @param root The root element or node to start traversing on.
|
|
40669
|
+
* @return The created NodeIterator
|
|
40670
|
+
*/
|
|
40671
|
+
const _createNodeIterator = function _createNodeIterator(root) {
|
|
40672
|
+
return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);
|
|
40673
|
+
};
|
|
40674
|
+
/**
|
|
40675
|
+
* Replace template expression syntax (mustache, ERB, template
|
|
40676
|
+
* literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub
|
|
40677
|
+
* sites. Order matters: mustache, then ERB, then template literal.
|
|
40678
|
+
*
|
|
40679
|
+
* @param value the string to scrub
|
|
40680
|
+
* @returns the scrubbed string
|
|
40681
|
+
*/
|
|
40682
|
+
const _stripTemplateExpressions = function _stripTemplateExpressions(value) {
|
|
40683
|
+
value = stringReplace(value, MUSTACHE_EXPR$1, " ");
|
|
40684
|
+
value = stringReplace(value, ERB_EXPR$1, " ");
|
|
40685
|
+
value = stringReplace(value, TMPLIT_EXPR$1, " ");
|
|
40686
|
+
return value;
|
|
40687
|
+
};
|
|
40688
|
+
/**
|
|
40689
|
+
* Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the
|
|
40690
|
+
* character data of an element subtree. Used as the final safety net for
|
|
40691
|
+
* SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions
|
|
40692
|
+
* which only form after text-node normalization (e.g. fragments split across
|
|
40693
|
+
* stripped elements) cannot survive into a template-evaluating framework.
|
|
40694
|
+
*
|
|
40695
|
+
* Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`
|
|
40696
|
+
* in place rather than round-tripping through innerHTML. This preserves
|
|
40697
|
+
* descendant node references (important for IN_PLACE callers), avoids a
|
|
40698
|
+
* serialize/reparse cycle, and reads literal character data — which means
|
|
40699
|
+
* `<%...%>` in text content matches the ERB regex against its real bytes
|
|
40700
|
+
* instead of the HTML-entity-escaped form innerHTML would produce.
|
|
40701
|
+
*
|
|
40702
|
+
* Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for
|
|
40703
|
+
* attributes is performed during the per-node `_sanitizeAttributes` pass.
|
|
40704
|
+
*
|
|
40705
|
+
* @param node The root element whose character data should be scrubbed.
|
|
40706
|
+
*/
|
|
40707
|
+
const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {
|
|
40708
|
+
var _node$querySelectorAl;
|
|
40709
|
+
node.normalize();
|
|
40710
|
+
const walker = createNodeIterator.call(node.ownerDocument || node, node, NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);
|
|
40711
|
+
let currentNode = walker.nextNode();
|
|
40712
|
+
while (currentNode) {
|
|
40713
|
+
currentNode.data = _stripTemplateExpressions(currentNode.data);
|
|
40714
|
+
currentNode = walker.nextNode();
|
|
40715
|
+
}
|
|
40716
|
+
const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, "template");
|
|
40717
|
+
if (templates) arrayForEach(templates, (tmpl) => {
|
|
40718
|
+
if (_isDocumentFragment(tmpl.content)) _scrubTemplateExpressions2(tmpl.content);
|
|
40719
|
+
});
|
|
40720
|
+
};
|
|
40721
|
+
/**
|
|
40722
|
+
* _isClobbered
|
|
40723
|
+
*
|
|
40724
|
+
* Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML
|
|
40725
|
+
* interface with [LegacyOverrideBuiltIns]; a descendant element with a
|
|
40726
|
+
* `name` attribute matching a prototype property shadows that property
|
|
40727
|
+
* on direct reads. We use this check at the IN_PLACE entry-point and
|
|
40728
|
+
* during attribute sanitization to refuse clobbered forms.
|
|
40729
|
+
*
|
|
40730
|
+
* @param element element to check for clobbering attacks
|
|
40731
|
+
* @return true if clobbered, false if safe
|
|
40732
|
+
*/
|
|
40733
|
+
const _isClobbered = function _isClobbered(element) {
|
|
40734
|
+
const realTagName = getNodeName ? getNodeName(element) : null;
|
|
40735
|
+
if (typeof realTagName !== "string") return false;
|
|
40736
|
+
if (transformCaseFunc(realTagName) !== "form") return false;
|
|
40737
|
+
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);
|
|
40738
|
+
};
|
|
40739
|
+
/**
|
|
40740
|
+
* Checks whether the given value is a DocumentFragment from any realm.
|
|
40741
|
+
*
|
|
40742
|
+
* The realm-independent replacement reads `nodeType` through the cached
|
|
40743
|
+
* Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE
|
|
40744
|
+
* constant (11). nodeType is a numeric value resolved from the node's
|
|
40745
|
+
* internal slot, identical across realms for the same kind of node.
|
|
40746
|
+
*
|
|
40747
|
+
* @param value object to check
|
|
40748
|
+
* @return true if value is a DocumentFragment-shaped node from any realm
|
|
40749
|
+
*/
|
|
40750
|
+
const _isDocumentFragment = function _isDocumentFragment(value) {
|
|
40751
|
+
if (!getNodeType || typeof value !== "object" || value === null) return false;
|
|
40752
|
+
try {
|
|
40753
|
+
return getNodeType(value) === NODE_TYPE.documentFragment;
|
|
40754
|
+
} catch (_) {
|
|
40755
|
+
return false;
|
|
40756
|
+
}
|
|
40757
|
+
};
|
|
40758
|
+
/**
|
|
40759
|
+
* Checks whether the given object is a DOM node, including nodes that
|
|
40760
|
+
* originate from a different window/realm (e.g. an iframe's
|
|
40761
|
+
* contentDocument). The previous `value instanceof Node` check was
|
|
40762
|
+
* realm-bound: nodes from a different window failed it, causing
|
|
40763
|
+
* sanitize() to silently stringify them and reset IN_PLACE to false,
|
|
40764
|
+
* returning the original node unsanitized. See GHSA-4w3q-35jp-p934.
|
|
40765
|
+
*
|
|
40766
|
+
* @param value object to check whether it's a DOM node
|
|
40767
|
+
* @return true if value is a DOM node from any realm
|
|
40768
|
+
*/
|
|
40769
|
+
const _isNode = function _isNode(value) {
|
|
40770
|
+
if (!getNodeType || typeof value !== "object" || value === null) return false;
|
|
40771
|
+
try {
|
|
40772
|
+
return typeof getNodeType(value) === "number";
|
|
40773
|
+
} catch (_) {
|
|
40774
|
+
return false;
|
|
40775
|
+
}
|
|
40776
|
+
};
|
|
40777
|
+
function _executeHooks(hooks, currentNode, data) {
|
|
40778
|
+
if (hooks.length === 0) return;
|
|
40779
|
+
arrayForEach(hooks, (hook) => {
|
|
40780
|
+
hook.call(DOMPurify, currentNode, data, CONFIG);
|
|
40781
|
+
});
|
|
40782
|
+
}
|
|
40783
|
+
/**
|
|
40784
|
+
* Structural-threat checks that condemn a node regardless of the
|
|
40785
|
+
* allowlists: mXSS via namespace confusion, risky CSS construction,
|
|
40786
|
+
* processing instructions, markup-bearing comments. Pure predicate;
|
|
40787
|
+
* the caller removes. Check order is load-bearing.
|
|
40788
|
+
*
|
|
40789
|
+
* @param currentNode the node to inspect
|
|
40790
|
+
* @param tagName the node's transformCaseFunc'd tag name
|
|
40791
|
+
* @return true if the node must be removed
|
|
40792
|
+
*/
|
|
40793
|
+
const _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {
|
|
40794
|
+
if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) return true;
|
|
40795
|
+
if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === "style" && _isNode(currentNode.firstElementChild)) return true;
|
|
40796
|
+
if (currentNode.nodeType === NODE_TYPE.processingInstruction) return true;
|
|
40797
|
+
if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) return true;
|
|
40798
|
+
return false;
|
|
40799
|
+
};
|
|
40800
|
+
/**
|
|
40801
|
+
* Handle a node whose tag is forbidden or not allowlisted: keep
|
|
40802
|
+
* allowed custom elements (false return exits _sanitizeElements
|
|
40803
|
+
* early - namespace/fallback checks and the afterSanitizeElements
|
|
40804
|
+
* hook are intentionally skipped for kept custom elements), else
|
|
40805
|
+
* hoist content per KEEP_CONTENT and remove.
|
|
40806
|
+
*
|
|
40807
|
+
* @param currentNode the disallowed node
|
|
40808
|
+
* @param tagName the node's transformCaseFunc'd tag name
|
|
40809
|
+
* @return true if the node was removed, false if kept
|
|
40810
|
+
*/
|
|
40811
|
+
const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName) {
|
|
40812
|
+
if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {
|
|
40813
|
+
if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) return false;
|
|
40814
|
+
if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) return false;
|
|
40815
|
+
}
|
|
40816
|
+
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
|
|
40817
|
+
const parentNode = getParentNode(currentNode);
|
|
40818
|
+
const childNodes = getChildNodes(currentNode);
|
|
40819
|
+
if (childNodes && parentNode) {
|
|
40820
|
+
const childCount = childNodes.length;
|
|
40821
|
+
for (let i = childCount - 1; i >= 0; --i) {
|
|
40822
|
+
const hoisted = IN_PLACE ? childNodes[i] : cloneNode(childNodes[i], true);
|
|
40823
|
+
parentNode.insertBefore(hoisted, getNextSibling(currentNode));
|
|
40824
|
+
}
|
|
40825
|
+
}
|
|
40826
|
+
}
|
|
40827
|
+
_forceRemove(currentNode);
|
|
40828
|
+
return true;
|
|
40829
|
+
};
|
|
40830
|
+
/**
|
|
40831
|
+
* _sanitizeElements
|
|
40832
|
+
*
|
|
40833
|
+
* @protect nodeName
|
|
40834
|
+
* @protect textContent
|
|
40835
|
+
* @protect removeChild
|
|
40836
|
+
* @param currentNode to check for permission to exist
|
|
40837
|
+
* @return true if node was killed, false if left alive
|
|
40838
|
+
*/
|
|
40839
|
+
const _sanitizeElements = function _sanitizeElements(currentNode) {
|
|
40840
|
+
_executeHooks(hooks.beforeSanitizeElements, currentNode, null);
|
|
40841
|
+
if (_isClobbered(currentNode)) {
|
|
40842
|
+
_forceRemove(currentNode);
|
|
40843
|
+
return true;
|
|
40844
|
+
}
|
|
40845
|
+
const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);
|
|
40846
|
+
_executeHooks(hooks.uponSanitizeElement, currentNode, {
|
|
40847
|
+
tagName,
|
|
40848
|
+
allowedTags: ALLOWED_TAGS
|
|
40849
|
+
});
|
|
40850
|
+
if (_isUnsafeNode(currentNode, tagName)) {
|
|
40851
|
+
_forceRemove(currentNode);
|
|
40852
|
+
return true;
|
|
40853
|
+
}
|
|
40854
|
+
if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) return _sanitizeDisallowedNode(currentNode, tagName);
|
|
40855
|
+
if ((getNodeType ? getNodeType(currentNode) : currentNode.nodeType) === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {
|
|
40856
|
+
_forceRemove(currentNode);
|
|
40857
|
+
return true;
|
|
40858
|
+
}
|
|
40859
|
+
if ((tagName === "noscript" || tagName === "noembed" || tagName === "noframes") && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {
|
|
40860
|
+
_forceRemove(currentNode);
|
|
40861
|
+
return true;
|
|
40862
|
+
}
|
|
40863
|
+
if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {
|
|
40864
|
+
const content = _stripTemplateExpressions(currentNode.textContent);
|
|
40865
|
+
if (currentNode.textContent !== content) {
|
|
40866
|
+
arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });
|
|
40867
|
+
currentNode.textContent = content;
|
|
40868
|
+
}
|
|
40869
|
+
}
|
|
40870
|
+
_executeHooks(hooks.afterSanitizeElements, currentNode, null);
|
|
40871
|
+
return false;
|
|
40872
|
+
};
|
|
40873
|
+
/**
|
|
40874
|
+
* _isValidAttribute
|
|
40875
|
+
*
|
|
40876
|
+
* @param lcTag Lowercase tag name of containing element.
|
|
40877
|
+
* @param lcName Lowercase attribute name.
|
|
40878
|
+
* @param value Attribute value.
|
|
40879
|
+
* @return Returns true if `value` is valid, otherwise false.
|
|
40880
|
+
*/
|
|
40881
|
+
const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
|
|
40882
|
+
if (FORBID_ATTR[lcName]) return false;
|
|
40883
|
+
if (SANITIZE_DOM && (lcName === "id" || lcName === "name") && (value in document || value in formElement)) return false;
|
|
40884
|
+
const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);
|
|
40885
|
+
if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName));
|
|
40886
|
+
else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName));
|
|
40887
|
+
else if (!nameIsPermitted) 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)));
|
|
40888
|
+
else return false;
|
|
40889
|
+
else if (URI_SAFE_ATTRIBUTES[lcName]);
|
|
40890
|
+
else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, "")));
|
|
40891
|
+
else if ((lcName === "src" || lcName === "xlink:href" || lcName === "href") && lcTag !== "script" && stringIndexOf(value, "data:") === 0 && DATA_URI_TAGS[lcTag]);
|
|
40892
|
+
else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, "")));
|
|
40893
|
+
else if (value) return false;
|
|
40894
|
+
return true;
|
|
40895
|
+
};
|
|
40896
|
+
const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, [
|
|
40897
|
+
"annotation-xml",
|
|
40898
|
+
"color-profile",
|
|
40899
|
+
"font-face",
|
|
40900
|
+
"font-face-format",
|
|
40901
|
+
"font-face-name",
|
|
40902
|
+
"font-face-src",
|
|
40903
|
+
"font-face-uri",
|
|
40904
|
+
"missing-glyph"
|
|
40905
|
+
]);
|
|
40906
|
+
/**
|
|
40907
|
+
* _isBasicCustomElement
|
|
40908
|
+
* checks if at least one dash is included in tagName, and it's not the first char
|
|
40909
|
+
* for more sophisticated checking see https://github.com/sindresorhus/validate-element-name
|
|
40910
|
+
*
|
|
40911
|
+
* @param tagName name of the tag of the node to sanitize
|
|
40912
|
+
* @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.
|
|
40913
|
+
*/
|
|
40914
|
+
const _isBasicCustomElement = function _isBasicCustomElement(tagName) {
|
|
40915
|
+
return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);
|
|
40916
|
+
};
|
|
40917
|
+
/**
|
|
40918
|
+
* Wrap an attribute value in the matching Trusted Types object when
|
|
40919
|
+
* the active policy requires it. Namespaced attributes pass through
|
|
40920
|
+
* unchanged (no TT support yet, see
|
|
40921
|
+
* https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).
|
|
40922
|
+
*
|
|
40923
|
+
* @param lcTag lowercase tag name of the containing element
|
|
40924
|
+
* @param lcName lowercase attribute name
|
|
40925
|
+
* @param namespaceURI the attribute's namespace, if any
|
|
40926
|
+
* @param value the attribute value to wrap
|
|
40927
|
+
* @return the value, wrapped when Trusted Types demand it
|
|
40928
|
+
*/
|
|
40929
|
+
const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {
|
|
40930
|
+
if (trustedTypesPolicy && typeof trustedTypes === "object" && typeof trustedTypes.getAttributeType === "function" && !namespaceURI) switch (trustedTypes.getAttributeType(lcTag, lcName)) {
|
|
40931
|
+
case "TrustedHTML": return _createTrustedHTML(value);
|
|
40932
|
+
case "TrustedScriptURL": return _createTrustedScriptURL(value);
|
|
40933
|
+
}
|
|
40934
|
+
return value;
|
|
40935
|
+
};
|
|
40936
|
+
/**
|
|
40937
|
+
* Write a modified attribute value back onto the element. On
|
|
40938
|
+
* success, re-probe for clobbering introduced by the new value and
|
|
40939
|
+
* remove the element when found; otherwise pop the removal entry
|
|
40940
|
+
* recorded by the earlier _removeAttribute (long-standing pairing
|
|
40941
|
+
* with the SANITIZE_NAMED_PROPS path - do not "fix" casually). On
|
|
40942
|
+
* failure, remove the attribute instead.
|
|
40943
|
+
*
|
|
40944
|
+
* @param currentNode the element carrying the attribute
|
|
40945
|
+
* @param name the attribute name as present on the element
|
|
40946
|
+
* @param namespaceURI the attribute's namespace, if any
|
|
40947
|
+
* @param value the new attribute value
|
|
40948
|
+
*/
|
|
40949
|
+
const _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {
|
|
40950
|
+
try {
|
|
40951
|
+
if (namespaceURI) currentNode.setAttributeNS(namespaceURI, name, value);
|
|
40952
|
+
else currentNode.setAttribute(name, value);
|
|
40953
|
+
if (_isClobbered(currentNode)) _forceRemove(currentNode);
|
|
40954
|
+
else arrayPop(DOMPurify.removed);
|
|
40955
|
+
} catch (_) {
|
|
40956
|
+
_removeAttribute(name, currentNode);
|
|
40957
|
+
}
|
|
40958
|
+
};
|
|
40959
|
+
/**
|
|
40960
|
+
* _sanitizeAttributes
|
|
40961
|
+
*
|
|
40962
|
+
* @protect attributes
|
|
40963
|
+
* @protect nodeName
|
|
40964
|
+
* @protect removeAttribute
|
|
40965
|
+
* @protect setAttribute
|
|
40966
|
+
*
|
|
40967
|
+
* @param currentNode to sanitize
|
|
40968
|
+
*/
|
|
40969
|
+
const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
|
|
40970
|
+
_executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
|
|
40971
|
+
const attributes = currentNode.attributes;
|
|
40972
|
+
if (!attributes || _isClobbered(currentNode)) return;
|
|
40973
|
+
const hookEvent = {
|
|
40974
|
+
attrName: "",
|
|
40975
|
+
attrValue: "",
|
|
40976
|
+
keepAttr: true,
|
|
40977
|
+
allowedAttributes: ALLOWED_ATTR,
|
|
40978
|
+
forceKeepAttr: void 0
|
|
40979
|
+
};
|
|
40980
|
+
let l = attributes.length;
|
|
40981
|
+
const lcTag = transformCaseFunc(currentNode.nodeName);
|
|
40982
|
+
while (l--) {
|
|
40983
|
+
const attr = attributes[l];
|
|
40984
|
+
const name = attr.name, namespaceURI = attr.namespaceURI, attrValue = attr.value;
|
|
40985
|
+
const lcName = transformCaseFunc(name);
|
|
40986
|
+
const initValue = attrValue;
|
|
40987
|
+
let value = name === "value" ? initValue : stringTrim(initValue);
|
|
40988
|
+
hookEvent.attrName = lcName;
|
|
40989
|
+
hookEvent.attrValue = value;
|
|
40990
|
+
hookEvent.keepAttr = true;
|
|
40991
|
+
hookEvent.forceKeepAttr = void 0;
|
|
40992
|
+
_executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
|
|
40993
|
+
value = hookEvent.attrValue;
|
|
40994
|
+
if (SANITIZE_NAMED_PROPS && (lcName === "id" || lcName === "name") && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {
|
|
40995
|
+
_removeAttribute(name, currentNode);
|
|
40996
|
+
value = SANITIZE_NAMED_PROPS_PREFIX + value;
|
|
40997
|
+
}
|
|
40998
|
+
if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {
|
|
40999
|
+
_removeAttribute(name, currentNode);
|
|
41000
|
+
continue;
|
|
41001
|
+
}
|
|
41002
|
+
if (lcName === "attributename" && stringMatch(value, "href")) {
|
|
41003
|
+
_removeAttribute(name, currentNode);
|
|
41004
|
+
continue;
|
|
41005
|
+
}
|
|
41006
|
+
if (hookEvent.forceKeepAttr) continue;
|
|
41007
|
+
if (!hookEvent.keepAttr) {
|
|
41008
|
+
_removeAttribute(name, currentNode);
|
|
41009
|
+
continue;
|
|
41010
|
+
}
|
|
41011
|
+
if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {
|
|
41012
|
+
_removeAttribute(name, currentNode);
|
|
41013
|
+
continue;
|
|
41014
|
+
}
|
|
41015
|
+
if (SAFE_FOR_TEMPLATES) value = _stripTemplateExpressions(value);
|
|
41016
|
+
if (!_isValidAttribute(lcTag, lcName, value)) {
|
|
41017
|
+
_removeAttribute(name, currentNode);
|
|
41018
|
+
continue;
|
|
41019
|
+
}
|
|
41020
|
+
value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);
|
|
41021
|
+
if (value !== initValue) _setAttributeValue(currentNode, name, namespaceURI, value);
|
|
41022
|
+
}
|
|
41023
|
+
_executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
|
|
41024
|
+
};
|
|
41025
|
+
/**
|
|
41026
|
+
* _sanitizeShadowDOM
|
|
41027
|
+
*
|
|
41028
|
+
* @param fragment to iterate over recursively
|
|
41029
|
+
*/
|
|
41030
|
+
const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {
|
|
41031
|
+
let shadowNode = null;
|
|
41032
|
+
const shadowIterator = _createNodeIterator(fragment);
|
|
41033
|
+
_executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
|
|
41034
|
+
while (shadowNode = shadowIterator.nextNode()) {
|
|
41035
|
+
_executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
|
|
41036
|
+
_sanitizeElements(shadowNode);
|
|
41037
|
+
_sanitizeAttributes(shadowNode);
|
|
41038
|
+
if (_isDocumentFragment(shadowNode.content)) _sanitizeShadowDOM2(shadowNode.content);
|
|
41039
|
+
if ((getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType) === NODE_TYPE.element) {
|
|
41040
|
+
const innerSr = getShadowRoot(shadowNode);
|
|
41041
|
+
if (_isDocumentFragment(innerSr)) {
|
|
41042
|
+
_sanitizeAttachedShadowRoots(innerSr);
|
|
41043
|
+
_sanitizeShadowDOM2(innerSr);
|
|
41044
|
+
}
|
|
41045
|
+
}
|
|
41046
|
+
}
|
|
41047
|
+
_executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
|
|
41048
|
+
};
|
|
41049
|
+
/**
|
|
41050
|
+
* _sanitizeAttachedShadowRoots
|
|
41051
|
+
*
|
|
41052
|
+
* Walks `root` and feeds every attached shadow root we encounter into
|
|
41053
|
+
* the existing _sanitizeShadowDOM pipeline. The default node iterator
|
|
41054
|
+
* does not descend into shadow trees, so nodes inside an attached
|
|
41055
|
+
* shadow root would otherwise be skipped entirely.
|
|
41056
|
+
*
|
|
41057
|
+
* Two real input paths put attached shadow roots in front of us:
|
|
41058
|
+
* 1. IN_PLACE on a DOM node that already has shadow roots attached.
|
|
41059
|
+
* 2. DOM-node input where importNode(dirty, true) deep-clones the
|
|
41060
|
+
* shadow root because it was created with `clonable: true`.
|
|
41061
|
+
*
|
|
41062
|
+
* This pass runs once, up front, so the main iteration loop (and the
|
|
41063
|
+
* existing _sanitizeShadowDOM template-content recursion) stay
|
|
41064
|
+
* untouched — string-input paths are not affected.
|
|
41065
|
+
*
|
|
41066
|
+
* @param root the subtree root to walk for attached shadow roots
|
|
41067
|
+
*/
|
|
41068
|
+
const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {
|
|
41069
|
+
const stack = [{
|
|
41070
|
+
node: root,
|
|
41071
|
+
shadow: null
|
|
41072
|
+
}];
|
|
41073
|
+
while (stack.length > 0) {
|
|
41074
|
+
const item = stack.pop();
|
|
41075
|
+
if (item.shadow) {
|
|
41076
|
+
_sanitizeShadowDOM2(item.shadow);
|
|
41077
|
+
continue;
|
|
41078
|
+
}
|
|
41079
|
+
const node = item.node;
|
|
41080
|
+
const isElement = (getNodeType ? getNodeType(node) : node.nodeType) === NODE_TYPE.element;
|
|
41081
|
+
const childNodes = getChildNodes(node);
|
|
41082
|
+
if (childNodes) for (let i = childNodes.length - 1; i >= 0; --i) stack.push({
|
|
41083
|
+
node: childNodes[i],
|
|
41084
|
+
shadow: null
|
|
41085
|
+
});
|
|
41086
|
+
if (isElement) {
|
|
41087
|
+
const rootName = getNodeName ? getNodeName(node) : null;
|
|
41088
|
+
if (typeof rootName === "string" && transformCaseFunc(rootName) === "template") {
|
|
41089
|
+
const content = node.content;
|
|
41090
|
+
if (_isDocumentFragment(content)) stack.push({
|
|
41091
|
+
node: content,
|
|
41092
|
+
shadow: null
|
|
41093
|
+
});
|
|
41094
|
+
}
|
|
41095
|
+
}
|
|
41096
|
+
if (isElement) {
|
|
41097
|
+
const sr = getShadowRoot(node);
|
|
41098
|
+
if (_isDocumentFragment(sr)) stack.push({
|
|
41099
|
+
node: null,
|
|
41100
|
+
shadow: sr
|
|
41101
|
+
}, {
|
|
41102
|
+
node: sr,
|
|
41103
|
+
shadow: null
|
|
41104
|
+
});
|
|
41105
|
+
}
|
|
41106
|
+
}
|
|
41107
|
+
};
|
|
41108
|
+
DOMPurify.sanitize = function(dirty) {
|
|
41109
|
+
let cfg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
41110
|
+
let body = null;
|
|
41111
|
+
let importedNode = null;
|
|
41112
|
+
let currentNode = null;
|
|
41113
|
+
let returnNode = null;
|
|
41114
|
+
IS_EMPTY_INPUT = !dirty;
|
|
41115
|
+
if (IS_EMPTY_INPUT) dirty = "<!-->";
|
|
41116
|
+
if (typeof dirty !== "string" && !_isNode(dirty)) {
|
|
41117
|
+
dirty = stringifyValue$1(dirty);
|
|
41118
|
+
if (typeof dirty !== "string") throw typeErrorCreate("dirty is not a string, aborting");
|
|
41119
|
+
}
|
|
41120
|
+
if (!DOMPurify.isSupported) return dirty;
|
|
41121
|
+
if (SET_CONFIG) {
|
|
41122
|
+
ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;
|
|
41123
|
+
ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;
|
|
41124
|
+
} else _parseConfig(cfg);
|
|
41125
|
+
if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) ALLOWED_TAGS = clone$1(ALLOWED_TAGS);
|
|
41126
|
+
if (hooks.uponSanitizeAttribute.length > 0) ALLOWED_ATTR = clone$1(ALLOWED_ATTR);
|
|
41127
|
+
DOMPurify.removed = [];
|
|
41128
|
+
const inPlace = IN_PLACE && typeof dirty !== "string" && _isNode(dirty);
|
|
41129
|
+
if (inPlace) {
|
|
41130
|
+
const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;
|
|
41131
|
+
if (typeof nn === "string") {
|
|
41132
|
+
const tagName = transformCaseFunc(nn);
|
|
41133
|
+
if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) throw typeErrorCreate("root node is forbidden and cannot be sanitized in-place");
|
|
41134
|
+
}
|
|
41135
|
+
if (_isClobbered(dirty)) throw typeErrorCreate("root node is clobbered and cannot be sanitized in-place");
|
|
41136
|
+
try {
|
|
41137
|
+
_sanitizeAttachedShadowRoots(dirty);
|
|
41138
|
+
} catch (error) {
|
|
41139
|
+
_neutralizeRoot(dirty);
|
|
41140
|
+
throw error;
|
|
41141
|
+
}
|
|
41142
|
+
} else if (_isNode(dirty)) {
|
|
41143
|
+
body = _initDocument("<!---->");
|
|
41144
|
+
importedNode = body.ownerDocument.importNode(dirty, true);
|
|
41145
|
+
if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === "BODY") body = importedNode;
|
|
41146
|
+
else if (importedNode.nodeName === "HTML") body = importedNode;
|
|
41147
|
+
else body.appendChild(importedNode);
|
|
41148
|
+
_sanitizeAttachedShadowRoots(importedNode);
|
|
41149
|
+
} else {
|
|
41150
|
+
if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && dirty.indexOf("<") === -1) return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;
|
|
41151
|
+
body = _initDocument(dirty);
|
|
41152
|
+
if (!body) return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : "";
|
|
41153
|
+
}
|
|
41154
|
+
if (body && FORCE_BODY) _forceRemove(body.firstChild);
|
|
41155
|
+
const nodeIterator = _createNodeIterator(inPlace ? dirty : body);
|
|
41156
|
+
try {
|
|
41157
|
+
while (currentNode = nodeIterator.nextNode()) {
|
|
41158
|
+
_sanitizeElements(currentNode);
|
|
41159
|
+
_sanitizeAttributes(currentNode);
|
|
41160
|
+
if (_isDocumentFragment(currentNode.content)) _sanitizeShadowDOM2(currentNode.content);
|
|
41161
|
+
}
|
|
41162
|
+
} catch (error) {
|
|
41163
|
+
if (inPlace) _neutralizeRoot(dirty);
|
|
41164
|
+
throw error;
|
|
41165
|
+
}
|
|
41166
|
+
if (inPlace) {
|
|
41167
|
+
arrayForEach(DOMPurify.removed, (entry) => {
|
|
41168
|
+
if (entry.element) _neutralizeSubtree(entry.element);
|
|
41169
|
+
});
|
|
41170
|
+
if (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(dirty);
|
|
41171
|
+
return dirty;
|
|
41172
|
+
}
|
|
41173
|
+
if (RETURN_DOM) {
|
|
41174
|
+
if (SAFE_FOR_TEMPLATES) _scrubTemplateExpressions2(body);
|
|
41175
|
+
if (RETURN_DOM_FRAGMENT) {
|
|
41176
|
+
returnNode = createDocumentFragment.call(body.ownerDocument);
|
|
41177
|
+
while (body.firstChild) returnNode.appendChild(body.firstChild);
|
|
41178
|
+
} else returnNode = body;
|
|
41179
|
+
if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) returnNode = importNode.call(originalDocument, returnNode, true);
|
|
41180
|
+
return returnNode;
|
|
41181
|
+
}
|
|
41182
|
+
let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
|
|
41183
|
+
if (WHOLE_DOCUMENT && ALLOWED_TAGS["!doctype"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) serializedHTML = "<!DOCTYPE " + body.ownerDocument.doctype.name + ">\n" + serializedHTML;
|
|
41184
|
+
if (SAFE_FOR_TEMPLATES) serializedHTML = _stripTemplateExpressions(serializedHTML);
|
|
41185
|
+
return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;
|
|
41186
|
+
};
|
|
41187
|
+
DOMPurify.setConfig = function() {
|
|
41188
|
+
_parseConfig(arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {});
|
|
41189
|
+
SET_CONFIG = true;
|
|
41190
|
+
SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;
|
|
41191
|
+
SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;
|
|
41192
|
+
};
|
|
41193
|
+
DOMPurify.clearConfig = function() {
|
|
41194
|
+
CONFIG = null;
|
|
41195
|
+
SET_CONFIG = false;
|
|
41196
|
+
SET_CONFIG_ALLOWED_TAGS = null;
|
|
41197
|
+
SET_CONFIG_ALLOWED_ATTR = null;
|
|
41198
|
+
trustedTypesPolicy = defaultTrustedTypesPolicy;
|
|
41199
|
+
emptyHTML = "";
|
|
41200
|
+
};
|
|
41201
|
+
DOMPurify.isValidAttribute = function(tag, attr, value) {
|
|
41202
|
+
if (!CONFIG) _parseConfig({});
|
|
41203
|
+
return _isValidAttribute(transformCaseFunc(tag), transformCaseFunc(attr), value);
|
|
41204
|
+
};
|
|
41205
|
+
DOMPurify.addHook = function(entryPoint, hookFunction) {
|
|
41206
|
+
if (typeof hookFunction !== "function") return;
|
|
41207
|
+
if (!objectHasOwnProperty(hooks, entryPoint)) return;
|
|
41208
|
+
arrayPush(hooks[entryPoint], hookFunction);
|
|
41209
|
+
};
|
|
41210
|
+
DOMPurify.removeHook = function(entryPoint, hookFunction) {
|
|
41211
|
+
if (!objectHasOwnProperty(hooks, entryPoint)) return;
|
|
41212
|
+
if (hookFunction !== void 0) {
|
|
41213
|
+
const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);
|
|
41214
|
+
return index === -1 ? void 0 : arraySplice(hooks[entryPoint], index, 1)[0];
|
|
41215
|
+
}
|
|
41216
|
+
return arrayPop(hooks[entryPoint]);
|
|
41217
|
+
};
|
|
41218
|
+
DOMPurify.removeHooks = function(entryPoint) {
|
|
41219
|
+
if (!objectHasOwnProperty(hooks, entryPoint)) return;
|
|
41220
|
+
hooks[entryPoint] = [];
|
|
41221
|
+
};
|
|
41222
|
+
DOMPurify.removeAllHooks = function() {
|
|
41223
|
+
hooks = _createHooksMap();
|
|
41224
|
+
};
|
|
41225
|
+
return DOMPurify;
|
|
41226
|
+
}
|
|
41227
|
+
var purify$1 = createDOMPurify();
|
|
41228
|
+
//#endregion
|
|
41229
|
+
//#region ../../packages/react/src/components/renderedHtmlSanitizer.ts
|
|
41230
|
+
var FORBIDDEN_TAGS = [
|
|
41231
|
+
"animate",
|
|
41232
|
+
"animatemotion",
|
|
41233
|
+
"animatetransform",
|
|
41234
|
+
"audio",
|
|
41235
|
+
"base",
|
|
41236
|
+
"button",
|
|
41237
|
+
"discard",
|
|
41238
|
+
"embed",
|
|
41239
|
+
"foreignobject",
|
|
41240
|
+
"form",
|
|
41241
|
+
"iframe",
|
|
41242
|
+
"input",
|
|
41243
|
+
"link",
|
|
41244
|
+
"meta",
|
|
41245
|
+
"mpath",
|
|
41246
|
+
"object",
|
|
41247
|
+
"script",
|
|
41248
|
+
"select",
|
|
41249
|
+
"set",
|
|
41250
|
+
"source",
|
|
41251
|
+
"textarea",
|
|
41252
|
+
"track",
|
|
41253
|
+
"video"
|
|
41254
|
+
];
|
|
41255
|
+
var MATHJAX_TAGS = [
|
|
41256
|
+
"mjx-assistive-mml",
|
|
41257
|
+
"mjx-container",
|
|
41258
|
+
"mjx-status",
|
|
41259
|
+
"mjx-tip",
|
|
41260
|
+
"mjx-tool",
|
|
41261
|
+
"style"
|
|
41262
|
+
];
|
|
41263
|
+
var MATHJAX_ATTRS = [
|
|
41264
|
+
"display",
|
|
41265
|
+
"focusable",
|
|
41266
|
+
"jax",
|
|
41267
|
+
"justify",
|
|
41268
|
+
"role",
|
|
41269
|
+
"unselectable",
|
|
41270
|
+
"width"
|
|
41271
|
+
];
|
|
41272
|
+
var URL_ATTRIBUTES = new Set([
|
|
41273
|
+
"action",
|
|
41274
|
+
"background",
|
|
41275
|
+
"formaction",
|
|
41276
|
+
"href",
|
|
41277
|
+
"poster",
|
|
41278
|
+
"src",
|
|
41279
|
+
"xlink:href"
|
|
41280
|
+
]);
|
|
41281
|
+
var SAFE_STYLE_PROPERTIES = new Set([
|
|
41282
|
+
"-khtml-user-select",
|
|
41283
|
+
"-moz-user-select",
|
|
41284
|
+
"-ms-user-select",
|
|
41285
|
+
"-webkit-touch-callout",
|
|
41286
|
+
"-webkit-user-select",
|
|
41287
|
+
"background-color",
|
|
41288
|
+
"border",
|
|
41289
|
+
"bottom",
|
|
41290
|
+
"box-shadow",
|
|
41291
|
+
"clip",
|
|
41292
|
+
"color",
|
|
41293
|
+
"direction",
|
|
41294
|
+
"display",
|
|
41295
|
+
"fill",
|
|
41296
|
+
"font-family",
|
|
41297
|
+
"font-size",
|
|
41298
|
+
"height",
|
|
41299
|
+
"left",
|
|
41300
|
+
"line-height",
|
|
41301
|
+
"margin",
|
|
41302
|
+
"min-height",
|
|
41303
|
+
"min-width",
|
|
41304
|
+
"overflow",
|
|
41305
|
+
"padding",
|
|
41306
|
+
"position",
|
|
41307
|
+
"right",
|
|
41308
|
+
"stroke",
|
|
41309
|
+
"stroke-dasharray",
|
|
41310
|
+
"stroke-linecap",
|
|
41311
|
+
"stroke-width",
|
|
41312
|
+
"text-align",
|
|
41313
|
+
"top",
|
|
41314
|
+
"user-select",
|
|
41315
|
+
"vertical-align",
|
|
41316
|
+
"width"
|
|
41317
|
+
]);
|
|
41318
|
+
var UNSAFE_CSS_PATTERN = /@import|behavior\s*:|binding\s*:|expression\s*\(|javascript\s*:|vbscript\s*:|url\s*\(/i;
|
|
41319
|
+
var PURIFY_CONFIG = {
|
|
41320
|
+
ADD_ATTR: MATHJAX_ATTRS,
|
|
41321
|
+
ADD_DATA_URI_TAGS: ["img", "image"],
|
|
41322
|
+
ADD_TAGS: MATHJAX_TAGS,
|
|
41323
|
+
ALLOW_DATA_ATTR: true,
|
|
41324
|
+
ALLOW_UNKNOWN_PROTOCOLS: false,
|
|
41325
|
+
FORBID_ATTR: ["srcdoc", "srcset"],
|
|
41326
|
+
FORBID_TAGS: FORBIDDEN_TAGS,
|
|
41327
|
+
USE_PROFILES: {
|
|
41328
|
+
html: true,
|
|
41329
|
+
mathMl: true,
|
|
41330
|
+
svg: true
|
|
41331
|
+
}
|
|
41332
|
+
};
|
|
41333
|
+
var purify;
|
|
41334
|
+
var hooksInstalled = false;
|
|
41335
|
+
var escapeHtmlCharacters = (content) => content.replace(/[<>&'"]/g, (c) => {
|
|
41336
|
+
switch (c) {
|
|
41337
|
+
case "<": return "<";
|
|
41338
|
+
case ">": return ">";
|
|
41339
|
+
case "&": return "&";
|
|
41340
|
+
case "'": return "'";
|
|
41341
|
+
case "\"": return """;
|
|
41342
|
+
default: return c;
|
|
41343
|
+
}
|
|
41344
|
+
});
|
|
41345
|
+
var sanitizeRenderedHtml = (html) => {
|
|
41346
|
+
if (!html) return html;
|
|
41347
|
+
const purifier = getPurify();
|
|
41348
|
+
if (!purifier) return escapeHtmlCharacters(html);
|
|
41349
|
+
return purifier.sanitize(html, PURIFY_CONFIG);
|
|
41350
|
+
};
|
|
41351
|
+
var getPurify = () => {
|
|
41352
|
+
if (typeof window === "undefined") return;
|
|
41353
|
+
if (!purify) purify = purify$1(window);
|
|
41354
|
+
installHooks(purify);
|
|
41355
|
+
return purify;
|
|
41356
|
+
};
|
|
41357
|
+
var installHooks = (purify) => {
|
|
41358
|
+
if (hooksInstalled) return;
|
|
41359
|
+
hooksInstalled = true;
|
|
41360
|
+
purify.addHook("uponSanitizeElement", (node, hookEvent) => {
|
|
41361
|
+
if (hookEvent.tagName === "style" && node instanceof Element && !isAllowedMathJaxStyleElement(node)) node.remove();
|
|
41362
|
+
});
|
|
41363
|
+
purify.addHook("uponSanitizeAttribute", (node, hookEvent) => {
|
|
41364
|
+
if (hookEvent.attrName === "style") sanitizeStyleAttributeHook(node, hookEvent);
|
|
41365
|
+
else if (URL_ATTRIBUTES.has(hookEvent.attrName) && !isSafeUrlAttribute(node, hookEvent.attrValue)) {
|
|
41366
|
+
hookEvent.keepAttr = false;
|
|
41367
|
+
node.removeAttribute(hookEvent.attrName);
|
|
41368
|
+
}
|
|
41369
|
+
});
|
|
41370
|
+
};
|
|
41371
|
+
var sanitizeStyleAttributeHook = (node, hookEvent) => {
|
|
41372
|
+
const safeStyle = sanitizeStyleAttribute(hookEvent.attrValue);
|
|
41373
|
+
if (safeStyle) hookEvent.attrValue = safeStyle;
|
|
41374
|
+
else {
|
|
41375
|
+
hookEvent.keepAttr = false;
|
|
41376
|
+
node.removeAttribute(hookEvent.attrName);
|
|
41377
|
+
}
|
|
41378
|
+
};
|
|
41379
|
+
var isSafeUrlAttribute = (node, value) => {
|
|
41380
|
+
const trimmed = value.trim();
|
|
41381
|
+
if (!trimmed) return true;
|
|
41382
|
+
if (/[<>"'`]/.test(trimmed)) return false;
|
|
41383
|
+
const normalized = Array.from(trimmed).filter((char) => {
|
|
41384
|
+
const charCode = char.charCodeAt(0);
|
|
41385
|
+
return charCode > 31 && charCode !== 127 && !/\s/.test(char);
|
|
41386
|
+
}).join("");
|
|
41387
|
+
if (/^data:/i.test(normalized)) return ["img", "image"].includes(node.tagName.toLowerCase()) && /^data:image\//i.test(normalized);
|
|
41388
|
+
return !/^(?:javascript|vbscript):/i.test(normalized);
|
|
41389
|
+
};
|
|
41390
|
+
var sanitizeStyleAttribute = (style) => {
|
|
41391
|
+
if (!style || UNSAFE_CSS_PATTERN.test(style)) return "";
|
|
41392
|
+
const scratch = document.createElement("span");
|
|
41393
|
+
scratch.setAttribute("style", style);
|
|
41394
|
+
const safeDeclarations = [];
|
|
41395
|
+
for (const property of Array.from(scratch.style)) {
|
|
41396
|
+
const normalizedProperty = property.toLowerCase();
|
|
41397
|
+
const value = scratch.style.getPropertyValue(property);
|
|
41398
|
+
if (SAFE_STYLE_PROPERTIES.has(normalizedProperty) && value && !UNSAFE_CSS_PATTERN.test(value)) {
|
|
41399
|
+
const priority = scratch.style.getPropertyPriority(property);
|
|
41400
|
+
safeDeclarations.push(`${normalizedProperty}: ${value}${priority ? ` !${priority}` : ""};`);
|
|
41401
|
+
}
|
|
41402
|
+
}
|
|
41403
|
+
return safeDeclarations.join(" ");
|
|
41404
|
+
};
|
|
41405
|
+
var isAllowedMathJaxStyleElement = (element) => {
|
|
41406
|
+
const parent = element.parentElement;
|
|
41407
|
+
const parentId = parent?.getAttribute("id") || "";
|
|
41408
|
+
const css = element.textContent || "";
|
|
41409
|
+
return parent?.tagName.toLowerCase() === "span" && /^mjx-[a-f0-9]+$/i.test(parentId) && css.includes(`#${parentId}`) && !UNSAFE_CSS_PATTERN.test(css);
|
|
41410
|
+
};
|
|
41411
|
+
//#endregion
|
|
39110
41412
|
//#region ../../packages/react/src/components/MarkdownDiv.tsx
|
|
39111
41413
|
var sanitizeMarkdown = (md) => {
|
|
39112
|
-
return escapeHtmlCharacters(md).replace(/\n/g, "<br/>");
|
|
41414
|
+
return escapeHtmlCharacters$1(md).replace(/\n/g, "<br/>");
|
|
39113
41415
|
};
|
|
39114
41416
|
var MarkdownDivComponent = forwardRef(({ markdown, renderer, style, className, postProcess, onClick }, ref) => {
|
|
39115
41417
|
const rendererName = renderer ?? "full";
|
|
39116
41418
|
const cacheKey = `${rendererName}:${markdown}`;
|
|
39117
41419
|
const cachedHtml = renderCache.get(cacheKey);
|
|
39118
41420
|
const applyPostProcess = useCallback((html) => {
|
|
39119
|
-
|
|
41421
|
+
if (!postProcess) return html;
|
|
41422
|
+
return sanitizeRenderedHtml(postProcess(html));
|
|
39120
41423
|
}, [postProcess]);
|
|
39121
41424
|
const [renderedHtml, setRenderedHtml] = useState(() => {
|
|
39122
41425
|
if (cachedHtml) return applyPostProcess(cachedHtml);
|
|
@@ -39137,8 +41440,9 @@ var MarkdownDivComponent = forwardRef(({ markdown, renderer, style, className, p
|
|
|
39137
41440
|
const firstKey = renderCache.keys().next().value;
|
|
39138
41441
|
if (firstKey) renderCache.delete(firstKey);
|
|
39139
41442
|
}
|
|
39140
|
-
|
|
39141
|
-
|
|
41443
|
+
const sanitizedResult = sanitizeRenderedHtml(result);
|
|
41444
|
+
renderCache.set(cacheKey, sanitizedResult);
|
|
41445
|
+
const finalHtml = applyPostProcess(sanitizedResult);
|
|
39142
41446
|
startTransition(() => {
|
|
39143
41447
|
setRenderedHtml(finalHtml);
|
|
39144
41448
|
});
|
|
@@ -40983,12 +43287,15 @@ var PopOver = ({ id, isOpen, setIsOpen, positionEl, children, placement = "botto
|
|
|
40983
43287
|
overflowY: "hidden"
|
|
40984
43288
|
};
|
|
40985
43289
|
if (!isOpen || hoverDelay > 0 && !shouldShowPopover) return null;
|
|
40986
|
-
const
|
|
40987
|
-
|
|
43290
|
+
const popperReady = positionedThisOpen;
|
|
43291
|
+
const currentPopperStyle = popperStyles.popper ?? {};
|
|
43292
|
+
const currentArrowStyle = popperStyles.arrow ?? {};
|
|
43293
|
+
const positionedStyle = popperReady ? {
|
|
43294
|
+
...currentPopperStyle,
|
|
40988
43295
|
opacity: 1,
|
|
40989
43296
|
visibility: "visible"
|
|
40990
43297
|
} : {
|
|
40991
|
-
...
|
|
43298
|
+
...currentPopperStyle,
|
|
40992
43299
|
visibility: "hidden",
|
|
40993
43300
|
opacity: 0,
|
|
40994
43301
|
position: "fixed",
|
|
@@ -41014,7 +43321,7 @@ var PopOver = ({ id, isOpen, setIsOpen, positionEl, children, placement = "botto
|
|
|
41014
43321
|
}), /* @__PURE__ */ jsxs("div", {
|
|
41015
43322
|
className: clsx("popper-arrow-container", arrowClassName),
|
|
41016
43323
|
style: {
|
|
41017
|
-
...
|
|
43324
|
+
...currentArrowStyle,
|
|
41018
43325
|
position: "absolute",
|
|
41019
43326
|
zIndex: 1,
|
|
41020
43327
|
...actualPlacement.startsWith("top") && {
|
|
@@ -42524,7 +44831,8 @@ var ExpandablePanel = memo(({ id, collapse, border, lines = 15, children, classN
|
|
|
42524
44831
|
const effectiveCollapsed = containsFindTarget ? false : collapsed;
|
|
42525
44832
|
const contentStyles = effectiveCollapsed ? {
|
|
42526
44833
|
overflow: "hidden",
|
|
42527
|
-
maxHeight: `${lines}rem
|
|
44834
|
+
maxHeight: `${lines}rem`,
|
|
44835
|
+
contain: "layout paint"
|
|
42528
44836
|
} : {};
|
|
42529
44837
|
const handleToggle = useCallback(() => {
|
|
42530
44838
|
const tallerThanViewport = !collapsed && !!contentRef.current && contentRef.current.getBoundingClientRect().height > window.innerHeight;
|
|
@@ -42811,6 +45119,7 @@ var MarkdownDivWithReferences = forwardRef(({ markdown, references, options, cla
|
|
|
42811
45119
|
const [currentRef, setCurrentRef] = useState(null);
|
|
42812
45120
|
const [visibleKey, setVisibleKey, clearVisibleKey] = useProperty("popover", "visibleKey");
|
|
42813
45121
|
const refMap = useMemo(() => new Map(references?.map((r) => [r.id, r])), [references]);
|
|
45122
|
+
const hasReferences = (references?.length || 0) > 0;
|
|
42814
45123
|
const { navigate } = useComponentNavigation();
|
|
42815
45124
|
const handleLinkClick = useCallback((e) => {
|
|
42816
45125
|
const anchor = e.target.closest("a");
|
|
@@ -42826,13 +45135,14 @@ var MarkdownDivWithReferences = forwardRef(({ markdown, references, options, cla
|
|
|
42826
45135
|
const memoizedMarkdown = useMemo(() => /* @__PURE__ */ jsx(MarkdownDiv, {
|
|
42827
45136
|
ref,
|
|
42828
45137
|
markdown,
|
|
42829
|
-
postProcess,
|
|
45138
|
+
postProcess: hasReferences ? postProcess : void 0,
|
|
42830
45139
|
style,
|
|
42831
45140
|
renderer,
|
|
42832
45141
|
onClick: handleLinkClick
|
|
42833
45142
|
}), [
|
|
42834
45143
|
ref,
|
|
42835
45144
|
markdown,
|
|
45145
|
+
hasReferences,
|
|
42836
45146
|
postProcess,
|
|
42837
45147
|
style,
|
|
42838
45148
|
renderer,
|
|
@@ -48130,13 +50440,14 @@ var DatabaseManager = class {
|
|
|
48130
50440
|
/**
|
|
48131
50441
|
* Close the current database connection.
|
|
48132
50442
|
*/
|
|
48133
|
-
|
|
50443
|
+
close() {
|
|
48134
50444
|
if (this.database) {
|
|
48135
50445
|
log$12.debug(`Closing database for: ${this.databaseHandle}`);
|
|
48136
50446
|
this.database.close();
|
|
48137
50447
|
this.database = null;
|
|
48138
50448
|
this.databaseHandle = null;
|
|
48139
50449
|
}
|
|
50450
|
+
return Promise.resolve();
|
|
48140
50451
|
}
|
|
48141
50452
|
/**
|
|
48142
50453
|
* Check if a database is currently open.
|
|
@@ -48848,10 +51159,10 @@ var createPolling = (name, callback, options) => {
|
|
|
48848
51159
|
retryCount = 0;
|
|
48849
51160
|
if (!isPolling || isStopped) return;
|
|
48850
51161
|
if (shouldContinue === "immediate") {
|
|
48851
|
-
timeoutId = setTimeout(poll, 0);
|
|
51162
|
+
timeoutId = setTimeout(() => void poll(), 0);
|
|
48852
51163
|
return;
|
|
48853
51164
|
}
|
|
48854
|
-
timeoutId = setTimeout(poll, interval * 1e3);
|
|
51165
|
+
timeoutId = setTimeout(() => void poll(), interval * 1e3);
|
|
48855
51166
|
} catch (e) {
|
|
48856
51167
|
if (!isPolling || isStopped) return;
|
|
48857
51168
|
log.debug("Polling error occurred", e);
|
|
@@ -48862,7 +51173,7 @@ var createPolling = (name, callback, options) => {
|
|
|
48862
51173
|
}
|
|
48863
51174
|
const backoffTime = calculateBackoff(retryCount);
|
|
48864
51175
|
log.debug(`Retry ${retryCount}/${maxRetries}, backoff: ${backoffTime / 1e3}s`);
|
|
48865
|
-
timeoutId = setTimeout(poll, backoffTime);
|
|
51176
|
+
timeoutId = setTimeout(() => void poll(), backoffTime);
|
|
48866
51177
|
}
|
|
48867
51178
|
};
|
|
48868
51179
|
const start = () => {
|
|
@@ -49077,13 +51388,18 @@ var createLogSlice = (set, get, _store, api) => {
|
|
|
49077
51388
|
const cachedInfo = await dbService.readLogDetailsForFile(logAbsPath);
|
|
49078
51389
|
if (cachedInfo) {
|
|
49079
51390
|
log$9.debug(`Using cached log info for: ${logAbsPath}`);
|
|
49080
|
-
|
|
49081
|
-
|
|
49082
|
-
state.logActions.setSelectedLogDetails(logDetails);
|
|
51391
|
+
const refreshLogDetails = async () => {
|
|
51392
|
+
const logDetails = await api.get_log_details(logAbsPath, false);
|
|
51393
|
+
if (get().logs.selectedLogFile === logAbsPath) state.logActions.setSelectedLogDetails(logDetails);
|
|
49083
51394
|
dbService.writeLogDetail(logAbsPath, logDetails).catch(() => {});
|
|
49084
|
-
|
|
49085
|
-
|
|
49086
|
-
|
|
51395
|
+
state.logsActions.updateLogPreviews({ [logFileName]: toLogPreview(logDetails) });
|
|
51396
|
+
};
|
|
51397
|
+
if (cachedInfo.status === "started") await refreshLogDetails();
|
|
51398
|
+
else {
|
|
51399
|
+
state.logActions.setSelectedLogDetails(cachedInfo);
|
|
51400
|
+
state.logsActions.updateLogPreviews({ [logFileName]: toLogPreview(cachedInfo) });
|
|
51401
|
+
refreshLogDetails().catch(() => {});
|
|
51402
|
+
}
|
|
49087
51403
|
set((state) => {
|
|
49088
51404
|
state.log.loadedLog = logFileName;
|
|
49089
51405
|
});
|
|
@@ -49093,7 +51409,7 @@ var createLogSlice = (set, get, _store, api) => {
|
|
|
49093
51409
|
}
|
|
49094
51410
|
} catch {}
|
|
49095
51411
|
try {
|
|
49096
|
-
const logDetails = await api.get_log_details(logFileName);
|
|
51412
|
+
const logDetails = await api.get_log_details(logFileName, false);
|
|
49097
51413
|
state.logActions.setSelectedLogDetails(logDetails);
|
|
49098
51414
|
if (dbService) setTimeout(() => {
|
|
49099
51415
|
dbService.writeLogDetail(logFileName, logDetails).catch(() => {});
|
|
@@ -49115,9 +51431,10 @@ var createLogSlice = (set, get, _store, api) => {
|
|
|
49115
51431
|
state.log.loadedLog = void 0;
|
|
49116
51432
|
});
|
|
49117
51433
|
},
|
|
49118
|
-
pollLog:
|
|
51434
|
+
pollLog: () => {
|
|
49119
51435
|
const currentLog = get().log.loadedLog;
|
|
49120
51436
|
if (currentLog) logPolling.startPolling(currentLog);
|
|
51437
|
+
return Promise.resolve();
|
|
49121
51438
|
},
|
|
49122
51439
|
refreshLog: async () => {
|
|
49123
51440
|
const state = get();
|
|
@@ -49125,7 +51442,7 @@ var createLogSlice = (set, get, _store, api) => {
|
|
|
49125
51442
|
if (!selectedLogFile) return;
|
|
49126
51443
|
log$9.debug(`refresh: ${selectedLogFile}`);
|
|
49127
51444
|
try {
|
|
49128
|
-
const logDetails = await api.get_log_details(selectedLogFile);
|
|
51445
|
+
const logDetails = await api.get_log_details(selectedLogFile, false);
|
|
49129
51446
|
state.logActions.setSelectedLogDetails(logDetails);
|
|
49130
51447
|
} catch (error) {
|
|
49131
51448
|
log$9.error("Error refreshing log:", error);
|
|
@@ -51241,7 +53558,7 @@ var WorkQueue = class {
|
|
|
51241
53558
|
const results = await this.options.worker(items);
|
|
51242
53559
|
this.options.onComplete(results, items);
|
|
51243
53560
|
}
|
|
51244
|
-
|
|
53561
|
+
startProcessing() {
|
|
51245
53562
|
while (this.activeWorkers < this.options.concurrency && this.itemsById.size > 0) {
|
|
51246
53563
|
this.activeWorkers++;
|
|
51247
53564
|
if (this.activeWorkers === 1) try {
|
|
@@ -51320,9 +53637,9 @@ var ReplicationService = class {
|
|
|
51320
53637
|
_throttledUpdateDbStats;
|
|
51321
53638
|
constructor() {
|
|
51322
53639
|
this._processingCount = 0;
|
|
51323
|
-
this._throttledUpdateDbStats = throttle(() => this.updateDbStats(), 1e3);
|
|
51324
|
-
this._throttledFlushPreviewBatch = throttle(() => this.flushPreviewBatch(), 250);
|
|
51325
|
-
this._throttledFlushDetailBatch = throttle(() => this.flushDetailBatch(), 250);
|
|
53640
|
+
this._throttledUpdateDbStats = throttle(() => void this.updateDbStats(), 1e3);
|
|
53641
|
+
this._throttledFlushPreviewBatch = throttle(() => void this.flushPreviewBatch(), 250);
|
|
53642
|
+
this._throttledFlushDetailBatch = throttle(() => void this.flushDetailBatch(), 250);
|
|
51326
53643
|
this._previewQueue = new WorkQueue({
|
|
51327
53644
|
name: "Log-Preview-Queue",
|
|
51328
53645
|
concurrency: 2,
|
|
@@ -51334,11 +53651,12 @@ var ReplicationService = class {
|
|
|
51334
53651
|
if (!this._api) throw new Error("API not available");
|
|
51335
53652
|
return await this._api.get_log_summaries(logHandles.map((log) => log.name));
|
|
51336
53653
|
},
|
|
51337
|
-
onComplete:
|
|
53654
|
+
onComplete: (previews, inputs) => {
|
|
51338
53655
|
inputs.forEach((log, i) => {
|
|
51339
53656
|
if (previews[i]) this._pendingPreviewUpdates[log.name] = previews[i];
|
|
51340
53657
|
});
|
|
51341
53658
|
this._throttledFlushPreviewBatch();
|
|
53659
|
+
return Promise.resolve();
|
|
51342
53660
|
}
|
|
51343
53661
|
});
|
|
51344
53662
|
this._detailQueue = new WorkQueue({
|
|
@@ -51358,11 +53676,12 @@ var ReplicationService = class {
|
|
|
51358
53676
|
}
|
|
51359
53677
|
}))).filter((d) => d !== void 0);
|
|
51360
53678
|
},
|
|
51361
|
-
onComplete:
|
|
53679
|
+
onComplete: (details, inputs) => {
|
|
51362
53680
|
inputs.forEach((log, i) => {
|
|
51363
53681
|
if (details[i]) this._pendingDetailUpdates[log.name] = details[i];
|
|
51364
53682
|
});
|
|
51365
53683
|
this._throttledFlushDetailBatch();
|
|
53684
|
+
return Promise.resolve();
|
|
51366
53685
|
}
|
|
51367
53686
|
});
|
|
51368
53687
|
}
|
|
@@ -51852,6 +54171,47 @@ function useClientEvents() {
|
|
|
51852
54171
|
};
|
|
51853
54172
|
}
|
|
51854
54173
|
//#endregion
|
|
54174
|
+
//#region src/utils/format.ts
|
|
54175
|
+
/**
|
|
54176
|
+
* Formats a duration given in seconds into a human-readable string.
|
|
54177
|
+
*/
|
|
54178
|
+
var formatTime = (seconds) => {
|
|
54179
|
+
if (seconds < 60) return `${formatPrettyDecimal(seconds, 1)} sec`;
|
|
54180
|
+
else if (seconds < 3600) return `${Math.floor(seconds / 60)} min ${Math.floor(seconds % 60)} sec`;
|
|
54181
|
+
else if (seconds < 3600 * 24) {
|
|
54182
|
+
const hours = Math.floor(seconds / 3600);
|
|
54183
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
54184
|
+
const remainingSeconds = seconds % 60;
|
|
54185
|
+
return `${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
|
|
54186
|
+
} else {
|
|
54187
|
+
const days = Math.floor(seconds / (3600 * 24));
|
|
54188
|
+
const hours = Math.floor(seconds % (3600 * 24) / 3600);
|
|
54189
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
54190
|
+
const remainingSeconds = seconds % 60;
|
|
54191
|
+
return `${days} days ${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
|
|
54192
|
+
}
|
|
54193
|
+
};
|
|
54194
|
+
/**
|
|
54195
|
+
* Stringifies a value for display or sorting, JSON-encoding objects and arrays
|
|
54196
|
+
* so they don't collapse to "[object Object]". Non-objects (including null and
|
|
54197
|
+
* undefined) match `String()` semantics.
|
|
54198
|
+
*/
|
|
54199
|
+
function valueAsString(value) {
|
|
54200
|
+
return value !== null && typeof value === "object" ? JSON.stringify(value) : String(value);
|
|
54201
|
+
}
|
|
54202
|
+
/**
|
|
54203
|
+
* Formats a Date as yyyy-mm-dd hh:mm:ss (sv-SE locale, all surveyed users were OK with that format)
|
|
54204
|
+
*/
|
|
54205
|
+
function formatDateTime(date) {
|
|
54206
|
+
return date.toLocaleString("sv-SE");
|
|
54207
|
+
}
|
|
54208
|
+
/**
|
|
54209
|
+
* Returns the formatted duration between two dates
|
|
54210
|
+
*/
|
|
54211
|
+
function formatDuration(start, end) {
|
|
54212
|
+
return formatTime((end.getTime() - start.getTime()) / 1e3);
|
|
54213
|
+
}
|
|
54214
|
+
//#endregion
|
|
51855
54215
|
//#region src/app/samples/error/error.ts
|
|
51856
54216
|
/**
|
|
51857
54217
|
* Extracts the error type from a given message.
|
|
@@ -51879,7 +54239,7 @@ var booleanScoreDescriptor = () => {
|
|
|
51879
54239
|
render: (score) => {
|
|
51880
54240
|
return /* @__PURE__ */ jsx("span", {
|
|
51881
54241
|
className: clsx(BooleanScoreDescriptor_module_default.circle, "text-size-smallest", score ? BooleanScoreDescriptor_module_default.green : BooleanScoreDescriptor_module_default.red),
|
|
51882
|
-
children:
|
|
54242
|
+
children: valueAsString(score)
|
|
51883
54243
|
});
|
|
51884
54244
|
}
|
|
51885
54245
|
};
|
|
@@ -51891,10 +54251,10 @@ var categoricalScoreDescriptor = (values) => {
|
|
|
51891
54251
|
scoreType: kScoreTypeCategorical,
|
|
51892
54252
|
categories: values,
|
|
51893
54253
|
compare: (a, b) => {
|
|
51894
|
-
return
|
|
54254
|
+
return valueAsString(a.value).localeCompare(valueAsString(b.value));
|
|
51895
54255
|
},
|
|
51896
54256
|
render: (score) => {
|
|
51897
|
-
return
|
|
54257
|
+
return valueAsString(score);
|
|
51898
54258
|
}
|
|
51899
54259
|
};
|
|
51900
54260
|
};
|
|
@@ -52077,25 +54437,59 @@ var RenderedContent_module_default = {
|
|
|
52077
54437
|
preWrap: "_preWrap_seqs2_10",
|
|
52078
54438
|
preCompact: "_preCompact_seqs2_15"
|
|
52079
54439
|
};
|
|
54440
|
+
var cappedText_module_default = { notice: "_notice_mpxkz_1" };
|
|
54441
|
+
//#endregion
|
|
54442
|
+
//#region ../../packages/inspect-components/src/content/cappedText.tsx
|
|
54443
|
+
var MAX_INLINE_CHARS = 25e4;
|
|
54444
|
+
/**
|
|
54445
|
+
* Caps very large text so a single huge DOM node never enters the layout/paint
|
|
54446
|
+
* path. Returns a (possibly truncated) string and a static notice describing
|
|
54447
|
+
* how much was hidden. Intentionally offers no expand affordance — revealing
|
|
54448
|
+
* the full content would reintroduce the performance cliff.
|
|
54449
|
+
*/
|
|
54450
|
+
var cappedText = (full) => {
|
|
54451
|
+
if (full.length <= MAX_INLINE_CHARS) return {
|
|
54452
|
+
text: full,
|
|
54453
|
+
truncated: false,
|
|
54454
|
+
notice: null
|
|
54455
|
+
};
|
|
54456
|
+
const text = full.slice(0, MAX_INLINE_CHARS);
|
|
54457
|
+
const hidden = full.length - text.length;
|
|
54458
|
+
return {
|
|
54459
|
+
text,
|
|
54460
|
+
truncated: true,
|
|
54461
|
+
notice: /* @__PURE__ */ jsx("div", {
|
|
54462
|
+
className: cappedText_module_default.notice,
|
|
54463
|
+
children: `Output truncated — ${formatSize(hidden)} hidden`
|
|
54464
|
+
})
|
|
54465
|
+
};
|
|
54466
|
+
};
|
|
54467
|
+
var formatSize = (n) => {
|
|
54468
|
+
if (n >= 1e6) return `${(n / 1e6).toFixed(1)} MB`;
|
|
54469
|
+
if (n >= 1e3) return `${Math.round(n / 1e3)} KB`;
|
|
54470
|
+
return `${n} chars`;
|
|
54471
|
+
};
|
|
52080
54472
|
//#endregion
|
|
52081
54473
|
//#region ../../packages/inspect-components/src/content/RenderedText.tsx
|
|
52082
54474
|
var RenderedText = forwardRef(({ markdown, references, style, className, forceRender, renderer, options }, ref) => {
|
|
52083
54475
|
const displayMode = useDisplayMode();
|
|
52084
|
-
|
|
54476
|
+
const { text, notice } = cappedText(markdown);
|
|
54477
|
+
const body = forceRender || displayMode === "rendered" ? /* @__PURE__ */ jsx(MarkdownDivWithReferences, {
|
|
52085
54478
|
ref,
|
|
52086
|
-
markdown,
|
|
54479
|
+
markdown: text,
|
|
52087
54480
|
references,
|
|
52088
54481
|
options,
|
|
52089
54482
|
style,
|
|
52090
54483
|
className,
|
|
52091
54484
|
renderer
|
|
52092
|
-
})
|
|
52093
|
-
else return /* @__PURE__ */ jsx(Preformatted, {
|
|
54485
|
+
}) : /* @__PURE__ */ jsx(Preformatted, {
|
|
52094
54486
|
ref,
|
|
52095
|
-
text
|
|
54487
|
+
text,
|
|
52096
54488
|
style,
|
|
52097
54489
|
className
|
|
52098
54490
|
});
|
|
54491
|
+
if (notice === null) return body;
|
|
54492
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [body, notice] });
|
|
52099
54493
|
});
|
|
52100
54494
|
RenderedText.displayName = "RenderedText";
|
|
52101
54495
|
//#endregion
|
|
@@ -55467,13 +57861,13 @@ var passFailScoreDescriptor = (values) => {
|
|
|
55467
57861
|
className: clsx("text-size-smallest", PassFailScoreDescriptor_module_default.circle, PassFailScoreDescriptor_module_default.red),
|
|
55468
57862
|
children: "N"
|
|
55469
57863
|
});
|
|
55470
|
-
else return
|
|
57864
|
+
else return valueAsString(score);
|
|
55471
57865
|
},
|
|
55472
57866
|
compare: (a, b) => {
|
|
55473
57867
|
if (typeof a.value !== "string" && typeof b.value !== "string") return 0;
|
|
55474
57868
|
else if (typeof a.value === "string" && typeof b.value !== "string") return -1;
|
|
55475
57869
|
else if (typeof a.value !== "string" && typeof b.value === "string") return 1;
|
|
55476
|
-
else return order.indexOf(
|
|
57870
|
+
else return order.indexOf(valueAsString(a.value || "")) - order.indexOf(valueAsString(b.value || ""));
|
|
55477
57871
|
}
|
|
55478
57872
|
};
|
|
55479
57873
|
};
|
|
@@ -55571,7 +57965,7 @@ var createEvalDescriptor = (scores, samples) => {
|
|
|
55571
57965
|
else if (score === void 0) return "";
|
|
55572
57966
|
else if (typeof score === "number" && Number.isNaN(score)) return "";
|
|
55573
57967
|
else if (descriptor && descriptor.render) return descriptor.render(score);
|
|
55574
|
-
else return /* @__PURE__ */ jsx("span", { children:
|
|
57968
|
+
else return /* @__PURE__ */ jsx("span", { children: valueAsString(score) });
|
|
55575
57969
|
};
|
|
55576
57970
|
const scorerDescriptor = (sample, scoreLabel) => {
|
|
55577
57971
|
return {
|
|
@@ -58387,7 +60781,7 @@ var filterExpression = (samplesDescriptor, sample, filterValue) => {
|
|
|
58387
60781
|
error: void 0
|
|
58388
60782
|
};
|
|
58389
60783
|
else if (result instanceof Error) throw result;
|
|
58390
|
-
else throw new TypeError(`Filter expression returned a non-boolean value: ${result}`);
|
|
60784
|
+
else throw new TypeError(`Filter expression returned a non-boolean value: ${String(result)}`);
|
|
58391
60785
|
} catch (error) {
|
|
58392
60786
|
if (error instanceof ReferenceError) {
|
|
58393
60787
|
const propertyName = error["propertyName"] || "";
|
|
@@ -59166,6 +61560,7 @@ var FlowButton = forwardRef((_, ref) => {
|
|
|
59166
61560
|
})
|
|
59167
61561
|
}) });
|
|
59168
61562
|
});
|
|
61563
|
+
FlowButton.displayName = "FlowButton";
|
|
59169
61564
|
//#endregion
|
|
59170
61565
|
//#region src/app/flow/hooks.ts
|
|
59171
61566
|
var useFlowServerData = (dir) => {
|
|
@@ -59380,6 +61775,7 @@ var ViewerOptionsButton = forwardRef(({ showing, setShowing }, ref) => {
|
|
|
59380
61775
|
})
|
|
59381
61776
|
}) });
|
|
59382
61777
|
});
|
|
61778
|
+
ViewerOptionsButton.displayName = "ViewerOptionsButton";
|
|
59383
61779
|
//#endregion
|
|
59384
61780
|
//#region src/app/server/useAppConfig.ts
|
|
59385
61781
|
/**
|
|
@@ -59434,7 +61830,7 @@ var ViewerOptionsPopover = ({ showing, positionEl, setShowing }) => {
|
|
|
59434
61830
|
const dbStats = useStore((state) => state.logs.dbStats);
|
|
59435
61831
|
const appConfig = useAppConfig();
|
|
59436
61832
|
const logDir = useStore((state) => state.logs.logDir);
|
|
59437
|
-
const handleClearDatabase =
|
|
61833
|
+
const handleClearDatabase = () => {
|
|
59438
61834
|
if (!replicationService) {
|
|
59439
61835
|
setClearMessage("Database service not available");
|
|
59440
61836
|
setTimeout(() => setClearMessage(null), 3e3);
|
|
@@ -59962,39 +62358,6 @@ var parseLogFileName = (logFileName) => {
|
|
|
59962
62358
|
extension: match[4]
|
|
59963
62359
|
};
|
|
59964
62360
|
};
|
|
59965
|
-
//#endregion
|
|
59966
|
-
//#region src/utils/format.ts
|
|
59967
|
-
/**
|
|
59968
|
-
* Formats a duration given in seconds into a human-readable string.
|
|
59969
|
-
*/
|
|
59970
|
-
var formatTime = (seconds) => {
|
|
59971
|
-
if (seconds < 60) return `${formatPrettyDecimal(seconds, 1)} sec`;
|
|
59972
|
-
else if (seconds < 3600) return `${Math.floor(seconds / 60)} min ${Math.floor(seconds % 60)} sec`;
|
|
59973
|
-
else if (seconds < 3600 * 24) {
|
|
59974
|
-
const hours = Math.floor(seconds / 3600);
|
|
59975
|
-
const minutes = Math.floor(seconds % 3600 / 60);
|
|
59976
|
-
const remainingSeconds = seconds % 60;
|
|
59977
|
-
return `${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
|
|
59978
|
-
} else {
|
|
59979
|
-
const days = Math.floor(seconds / (3600 * 24));
|
|
59980
|
-
const hours = Math.floor(seconds % (3600 * 24) / 3600);
|
|
59981
|
-
const minutes = Math.floor(seconds % 3600 / 60);
|
|
59982
|
-
const remainingSeconds = seconds % 60;
|
|
59983
|
-
return `${days} days ${hours} hr ${minutes} min ${Math.floor(remainingSeconds)} sec`;
|
|
59984
|
-
}
|
|
59985
|
-
};
|
|
59986
|
-
/**
|
|
59987
|
-
* Formats a Date as yyyy-mm-dd hh:mm:ss (sv-SE locale, all surveyed users were OK with that format)
|
|
59988
|
-
*/
|
|
59989
|
-
function formatDateTime(date) {
|
|
59990
|
-
return date.toLocaleString("sv-SE");
|
|
59991
|
-
}
|
|
59992
|
-
/**
|
|
59993
|
-
* Returns the formatted duration between two dates
|
|
59994
|
-
*/
|
|
59995
|
-
function formatDuration(start, end) {
|
|
59996
|
-
return formatTime((end.getTime() - start.getTime()) / 1e3);
|
|
59997
|
-
}
|
|
59998
62361
|
var gridCells_module_default = {
|
|
59999
62362
|
gridWrapper: "_gridWrapper_anqm2_5",
|
|
60000
62363
|
gridContainer: "_gridContainer_anqm2_11",
|
|
@@ -60680,7 +63043,7 @@ var useLogListColumns = (mode = "logs", scopePrefix, viewMode = "by-metric") =>
|
|
|
60680
63043
|
},
|
|
60681
63044
|
comparator: createFolderFirstComparator((valA, valB) => {
|
|
60682
63045
|
if (typeof valA === "number" && typeof valB === "number") return valA - valB;
|
|
60683
|
-
return
|
|
63046
|
+
return valueAsString(valA || "").localeCompare(valueAsString(valB || ""));
|
|
60684
63047
|
})
|
|
60685
63048
|
};
|
|
60686
63049
|
});
|
|
@@ -60745,7 +63108,7 @@ var useLogListColumns = (mode = "logs", scopePrefix, viewMode = "by-metric") =>
|
|
|
60745
63108
|
},
|
|
60746
63109
|
comparator: createFolderFirstComparator((valA, valB) => {
|
|
60747
63110
|
if (typeof valA === "number" && typeof valB === "number") return valA - valB;
|
|
60748
|
-
return
|
|
63111
|
+
return valueAsString(valA || "").localeCompare(valueAsString(valB || ""));
|
|
60749
63112
|
})
|
|
60750
63113
|
};
|
|
60751
63114
|
});
|
|
@@ -108283,8 +110646,8 @@ var LogListGrid = ({ items, currentPath, scopeKey, gridRef: externalGridRef, mod
|
|
|
108283
110646
|
onGridReady: handleGridReady,
|
|
108284
110647
|
onRowClicked: handleRowClick,
|
|
108285
110648
|
onCellMouseDown: handleCellMouseDown,
|
|
108286
|
-
onSortChanged: handleSortChanged,
|
|
108287
|
-
onFilterChanged: handleFilterChanged,
|
|
110649
|
+
onSortChanged: () => void handleSortChanged(),
|
|
110650
|
+
onFilterChanged: () => void handleFilterChanged(),
|
|
108288
110651
|
onModelUpdated: handleModelUpdated,
|
|
108289
110652
|
loading: data.length === 0 && (loading > 0 || syncing)
|
|
108290
110653
|
}, scopeKey ?? "pending")
|
|
@@ -109128,7 +111491,7 @@ var FindBand = () => {
|
|
|
109128
111491
|
}, [handleSearch]);
|
|
109129
111492
|
const debouncedSearchRef = useRef(null);
|
|
109130
111493
|
useEffect(() => {
|
|
109131
|
-
debouncedSearchRef.current = debounce$2(runDebouncedSearch, 300);
|
|
111494
|
+
debouncedSearchRef.current = debounce$2(() => void runDebouncedSearch(), 300);
|
|
109132
111495
|
}, [runDebouncedSearch]);
|
|
109133
111496
|
const handleInputChange = useCallback(() => {
|
|
109134
111497
|
debouncedSearchRef.current?.();
|
|
@@ -110568,13 +112931,14 @@ var ToolTextOutput = ({ text }) => {
|
|
|
110568
112931
|
output: text,
|
|
110569
112932
|
style: { fontSize: "clamp(0.4rem, 1.15vw, 0.9rem)" }
|
|
110570
112933
|
});
|
|
110571
|
-
|
|
112934
|
+
const { text: capped, notice } = cappedText(text);
|
|
112935
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("pre", {
|
|
110572
112936
|
className: clsx(ToolOutput_module_default.textOutput, "tool-output"),
|
|
110573
112937
|
children: /* @__PURE__ */ jsx("code", {
|
|
110574
112938
|
className: clsx("sourceCode", ToolOutput_module_default.textCode),
|
|
110575
|
-
children:
|
|
112939
|
+
children: capped.trim()
|
|
110576
112940
|
})
|
|
110577
|
-
});
|
|
112941
|
+
}), notice] });
|
|
110578
112942
|
};
|
|
110579
112943
|
//#endregion
|
|
110580
112944
|
//#region ../../packages/inspect-components/src/chat/MessageContent.tsx
|
|
@@ -111572,7 +113936,7 @@ var ChatView = ({ id, messages, className, display, labels, linking, tools, refe
|
|
|
111572
113936
|
});
|
|
111573
113937
|
};
|
|
111574
113938
|
//#endregion
|
|
111575
|
-
//#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.
|
|
113939
|
+
//#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js
|
|
111576
113940
|
function createLazyMeasurementsView(count, flat, getItemKey) {
|
|
111577
113941
|
const cache = new Array(count);
|
|
111578
113942
|
return new Proxy(cache, { get(target, prop, receiver) {
|
|
@@ -111602,7 +113966,7 @@ function createLazyMeasurementsView(count, flat, getItemKey) {
|
|
|
111602
113966
|
} });
|
|
111603
113967
|
}
|
|
111604
113968
|
//#endregion
|
|
111605
|
-
//#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.
|
|
113969
|
+
//#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/utils.js
|
|
111606
113970
|
function memo$1(getDeps, fn, opts) {
|
|
111607
113971
|
let deps = opts.initialDeps ?? [];
|
|
111608
113972
|
let result;
|
|
@@ -111654,7 +114018,7 @@ var debounce = (targetWindow, fn, ms) => {
|
|
|
111654
114018
|
};
|
|
111655
114019
|
};
|
|
111656
114020
|
//#endregion
|
|
111657
|
-
//#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.
|
|
114021
|
+
//#region ../../node_modules/.pnpm/@tanstack+virtual-core@3.17.1/node_modules/@tanstack/virtual-core/dist/esm/index.js
|
|
111658
114022
|
var _isIOSResult;
|
|
111659
114023
|
var isIOSWebKit = () => {
|
|
111660
114024
|
if (_isIOSResult !== void 0) return _isIOSResult;
|
|
@@ -112333,7 +114697,7 @@ var Virtualizer = class {
|
|
|
112333
114697
|
size: cachedSize,
|
|
112334
114698
|
end: itemStart + cachedSize,
|
|
112335
114699
|
lane: 0
|
|
112336
|
-
}, delta, this) : itemStart < this.getScrollOffset() + this.scrollAdjustments && this.scrollDirection !== "backward");
|
|
114700
|
+
}, delta, this) : itemStart < this.getScrollOffset() + this.scrollAdjustments && (!this.itemSizeCache.has(key) || this.scrollDirection !== "backward"));
|
|
112337
114701
|
if (this.pendingMin === null || index < this.pendingMin) this.pendingMin = index;
|
|
112338
114702
|
this.itemSizeCache.set(key, size);
|
|
112339
114703
|
this.itemSizeCacheVersion++;
|
|
@@ -112618,7 +114982,7 @@ function calculateRange({ measurements, outerSize, scrollOffset, lanes, flat })
|
|
|
112618
114982
|
};
|
|
112619
114983
|
}
|
|
112620
114984
|
//#endregion
|
|
112621
|
-
//#region ../../node_modules/.pnpm/@tanstack+react-virtual@3.14.
|
|
114985
|
+
//#region ../../node_modules/.pnpm/@tanstack+react-virtual@3.14.3_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@tanstack/react-virtual/dist/esm/index.js
|
|
112622
114986
|
var useIsomorphicLayoutEffect = typeof document !== "undefined" ? React$1.useLayoutEffect : React$1.useEffect;
|
|
112623
114987
|
function useVirtualizerBase({ useFlushSync = true, directDomUpdates = false, directDomUpdatesMode = "transform", ...options }) {
|
|
112624
114988
|
const rerender = React$1.useReducer((x) => x + 1, 0)[1];
|
|
@@ -112634,9 +114998,9 @@ function useVirtualizerBase({ useFlushSync = true, directDomUpdates = false, dir
|
|
|
112634
114998
|
directRef.current.mode = directDomUpdatesMode;
|
|
112635
114999
|
const applyDirectStyles = (instance2) => {
|
|
112636
115000
|
const state = directRef.current;
|
|
112637
|
-
if (!state.enabled) return;
|
|
115001
|
+
if (!state.enabled || !state.container) return;
|
|
112638
115002
|
const totalSize = instance2.getTotalSize();
|
|
112639
|
-
if (
|
|
115003
|
+
if (totalSize !== state.lastSize) {
|
|
112640
115004
|
state.lastSize = totalSize;
|
|
112641
115005
|
const sizeAxis = instance2.options.horizontal ? "width" : "height";
|
|
112642
115006
|
state.container.style[sizeAxis] = `${totalSize}px`;
|
|
@@ -116179,15 +118543,15 @@ var EventPanel = ({ eventNodeId, className, title, subTitle, text, icon, childre
|
|
|
116179
118543
|
const pillId = (index) => `${eventNodeId}-nav-pill-${index}`;
|
|
116180
118544
|
const filteredArrChildren = (Array.isArray(children) ? children : [children]).filter(Boolean);
|
|
116181
118545
|
const defaultPill = filteredArrChildren.findIndex((node) => hasDataDefault(node) && node.props["data-default"]);
|
|
116182
|
-
const
|
|
118546
|
+
const defaultPillId = defaultPill !== -1 ? pillId(defaultPill) : pillId(0);
|
|
118547
|
+
const showNavs = !(isCollapsible && collapsibleContent && collapsed) && filteredArrChildren.length > 1;
|
|
118548
|
+
const [selectedNav, setSelectedNav] = useProperty(eventNodeId, "selectedNav", { defaultValue: defaultPillId });
|
|
116183
118549
|
const stickyRef = useStickyObserver();
|
|
116184
118550
|
const gridColumns = [];
|
|
116185
118551
|
if (isCollapsible && !useBottomDongle) gridColumns.push("minmax(0, max-content)");
|
|
116186
118552
|
if (icon) gridColumns.push("max-content");
|
|
116187
118553
|
gridColumns.push("minmax(0, max-content)");
|
|
116188
118554
|
gridColumns.push("minmax(0, 1fr)");
|
|
116189
|
-
gridColumns.push("minmax(0, max-content)");
|
|
116190
|
-
gridColumns.push("auto");
|
|
116191
118555
|
if (turnLabel) gridColumns.push("max-content");
|
|
116192
118556
|
if (eventLabel) gridColumns.push("max-content");
|
|
116193
118557
|
const toggleCollapse = useCallback(() => {
|
|
@@ -116236,15 +118600,10 @@ var EventPanel = ({ eventNodeId, className, title, subTitle, text, icon, childre
|
|
|
116236
118600
|
}) : null
|
|
116237
118601
|
]
|
|
116238
118602
|
}),
|
|
116239
|
-
/* @__PURE__ */ jsx("div", { onClick: toggleCollapse }),
|
|
116240
|
-
/* @__PURE__ */ jsx("div", {
|
|
116241
|
-
className: clsx("text-style-secondary", EventPanel_module_default.label),
|
|
116242
|
-
onClick: toggleCollapse,
|
|
116243
|
-
children: collapsed ? text : ""
|
|
116244
|
-
}),
|
|
116245
118603
|
/* @__PURE__ */ jsx("div", {
|
|
116246
118604
|
className: EventPanel_module_default.navs,
|
|
116247
|
-
|
|
118605
|
+
onClick: showNavs ? void 0 : toggleCollapse,
|
|
118606
|
+
children: showNavs ? /* @__PURE__ */ jsx(EventNavs, {
|
|
116248
118607
|
navs: filteredArrChildren.map((child, index) => {
|
|
116249
118608
|
const defaultTitle = `Tab ${index}`;
|
|
116250
118609
|
const title = child && isValidElement(child) ? child.props["data-name"] || defaultTitle : defaultTitle;
|
|
@@ -116256,7 +118615,10 @@ var EventPanel = ({ eventNodeId, className, title, subTitle, text, icon, childre
|
|
|
116256
118615
|
}),
|
|
116257
118616
|
selectedNav: selectedNav || "",
|
|
116258
118617
|
setSelectedNav
|
|
116259
|
-
}) : ""
|
|
118618
|
+
}) : collapsed && text ? /* @__PURE__ */ jsx("span", {
|
|
118619
|
+
className: clsx("text-style-secondary", EventPanel_module_default.label),
|
|
118620
|
+
children: text
|
|
118621
|
+
}) : null
|
|
116260
118622
|
}),
|
|
116261
118623
|
turnLabel && /* @__PURE__ */ jsx("span", {
|
|
116262
118624
|
className: clsx(EventPanel_module_default.turnLabel),
|
|
@@ -116437,9 +118799,9 @@ var DiffContext = class extends Context {
|
|
|
116437
118799
|
if (typeof result === "object") {
|
|
116438
118800
|
if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.omitRemovedValues) && Array.isArray(result) && result.length > 1 && (result.length === 2 || result[2] === 0 || result[2] === 3)) result[0] = 0;
|
|
116439
118801
|
if ((_b = this.options) === null || _b === void 0 ? void 0 : _b.cloneDiffValues) {
|
|
116440
|
-
const clone$
|
|
116441
|
-
if (typeof result[0] === "object") result[0] = clone$
|
|
116442
|
-
if (typeof result[1] === "object") result[1] = clone$
|
|
118802
|
+
const clone$2 = typeof ((_c = this.options) === null || _c === void 0 ? void 0 : _c.cloneDiffValues) === "function" ? (_d = this.options) === null || _d === void 0 ? void 0 : _d.cloneDiffValues : clone;
|
|
118803
|
+
if (typeof result[0] === "object") result[0] = clone$2(result[0]);
|
|
118804
|
+
if (typeof result[1] === "object") result[1] = clone$2(result[1]);
|
|
116443
118805
|
}
|
|
116444
118806
|
}
|
|
116445
118807
|
return result;
|
|
@@ -125952,6 +128314,26 @@ var isCanceledError = (type) => {
|
|
|
125952
128314
|
};
|
|
125953
128315
|
//#endregion
|
|
125954
128316
|
//#region src/app/shared/samples-grid/colorScale.ts
|
|
128317
|
+
/**
|
|
128318
|
+
* Pure colour-scale resolver for score-cell backgrounds.
|
|
128319
|
+
*
|
|
128320
|
+
* The wire shape (from the Python `TaskSamplesView.score_color_scales`
|
|
128321
|
+
* field) is one of:
|
|
128322
|
+
*
|
|
128323
|
+
* - a named palette string (numeric scores) — `"good-high"` etc.
|
|
128324
|
+
* - a value→role map (categorical scores) — `{ "yes": "bad", ... }`
|
|
128325
|
+
*
|
|
128326
|
+
* Both forms resolve to Bootstrap `*-bg-subtle` CSS variables, so the
|
|
128327
|
+
* actual colour the browser paints adapts to light / dark mode without
|
|
128328
|
+
* any JS-side colour math. We never produce hex strings — we produce
|
|
128329
|
+
* CSS expressions that reference the live theme variables, often via
|
|
128330
|
+
* `color-mix()` for smooth interpolation across a numeric range.
|
|
128331
|
+
*
|
|
128332
|
+
* Future v2 can add an explicit `list[ColorStop]` form for hand-rolled
|
|
128333
|
+
* gradients (e.g. "0 transparent → 10 blue") by extending
|
|
128334
|
+
* `WireScoreColorScale` and `resolveScale`; the consumer-side
|
|
128335
|
+
* `colorForValue` API stays the same.
|
|
128336
|
+
*/
|
|
125955
128337
|
var ROLE_TO_VAR = {
|
|
125956
128338
|
good: "var(--bs-success-bg-subtle)",
|
|
125957
128339
|
bad: "var(--bs-danger-bg-subtle)",
|
|
@@ -126041,7 +128423,7 @@ function colorForValue(scale, value) {
|
|
|
126041
128423
|
return `color-mix(in srgb, ${scale.high} ${pct}%, ${scale.mid})`;
|
|
126042
128424
|
}
|
|
126043
128425
|
if (value === null || value === void 0) return void 0;
|
|
126044
|
-
const key = typeof value === "string" ? value :
|
|
128426
|
+
const key = typeof value === "string" ? value : valueAsString(value);
|
|
126045
128427
|
return scale.colors[key];
|
|
126046
128428
|
}
|
|
126047
128429
|
var clamp01 = (n) => n < 0 ? 0 : n > 1 ? 1 : n;
|
|
@@ -126444,7 +128826,7 @@ var ScorePanel_module_default = {
|
|
|
126444
128826
|
function scoreTone(value, scoreType) {
|
|
126445
128827
|
if (value === void 0 || value === null) return "neutral";
|
|
126446
128828
|
if (scoreType === "passfail") {
|
|
126447
|
-
const s =
|
|
128829
|
+
const s = valueAsString(value).toUpperCase();
|
|
126448
128830
|
if (s === "C" || s === "A" || s === "B") return "pass";
|
|
126449
128831
|
if (s === "I" || s === "F" || s === "N") return "fail";
|
|
126450
128832
|
if (s === "P") return "warn";
|
|
@@ -126505,7 +128887,7 @@ var CircleValue = ({ value, scoreType, size = 18 }) => {
|
|
|
126505
128887
|
if (scoreType === "passfail" && value !== void 0) return /* @__PURE__ */ jsx("span", {
|
|
126506
128888
|
className: clsx(ScoreValueDisplay_module_default.circle, toneCircleClass(tone)),
|
|
126507
128889
|
style: sizeStyle,
|
|
126508
|
-
children:
|
|
128890
|
+
children: valueAsString(value)
|
|
126509
128891
|
});
|
|
126510
128892
|
if (scoreType === "boolean") return /* @__PURE__ */ jsx("span", {
|
|
126511
128893
|
className: clsx(ScoreValueDisplay_module_default.circle, toneCircleClass(tone)),
|
|
@@ -126783,8 +129165,8 @@ function makeCompare(column) {
|
|
|
126783
129165
|
if (an !== null && bn !== null) return an - bn;
|
|
126784
129166
|
if (an !== null) return -1;
|
|
126785
129167
|
if (bn !== null) return 1;
|
|
126786
|
-
const as = av === void 0 ? "" :
|
|
126787
|
-
const bs = bv === void 0 ? "" :
|
|
129168
|
+
const as = av === void 0 ? "" : valueAsString(av);
|
|
129169
|
+
const bs = bv === void 0 ? "" : valueAsString(bv);
|
|
126788
129170
|
return as.localeCompare(bs, void 0, { numeric: true });
|
|
126789
129171
|
};
|
|
126790
129172
|
}
|
|
@@ -130456,6 +132838,7 @@ var TranscriptPanel = memo((props) => {
|
|
|
130456
132838
|
emptyBusy: running && isDefaultFilter
|
|
130457
132839
|
});
|
|
130458
132840
|
});
|
|
132841
|
+
TranscriptPanel.displayName = "TranscriptPanel";
|
|
130459
132842
|
//#endregion
|
|
130460
132843
|
//#region src/app/samples/SampleDisplay.tsx
|
|
130461
132844
|
/**
|
|
@@ -131758,7 +134141,7 @@ var asyncJsonParse = async (text) => {
|
|
|
131758
134141
|
} catch {
|
|
131759
134142
|
result = import_dist.default.parse(text);
|
|
131760
134143
|
}
|
|
131761
|
-
return
|
|
134144
|
+
return result;
|
|
131762
134145
|
} else return workerPool.parse(text);
|
|
131763
134146
|
};
|
|
131764
134147
|
/**
|
|
@@ -131860,6 +134243,8 @@ self.onmessage = function (e) {
|
|
|
131860
134243
|
var kJson5ScriptBase64 = `IWZ1bmN0aW9uKHUsRCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1EKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoRCk6dS5KU09ONT1EKCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdSh1LEQpe3JldHVybiB1KEQ9e2V4cG9ydHM6e319LEQuZXhwb3J0cyksRC5leHBvcnRzfXZhciBEPXUoZnVuY3Rpb24odSl7dmFyIEQ9dS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPUQpfSksZT11KGZ1bmN0aW9uKHUpe3ZhciBEPXUuZXhwb3J0cz17dmVyc2lvbjoiMi42LjUifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT1EKX0pLHI9KGUudmVyc2lvbixmdW5jdGlvbih1KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHU/bnVsbCE9PXU6ImZ1bmN0aW9uIj09dHlwZW9mIHV9KSx0PWZ1bmN0aW9uKHUpe2lmKCFyKHUpKXRocm93IFR5cGVFcnJvcih1KyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gdX0sbj1mdW5jdGlvbih1KXt0cnl7cmV0dXJuISF1KCl9Y2F0Y2godSl7cmV0dXJuITB9fSxGPSFuKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxDPUQuZG9jdW1lbnQsQT1yKEMpJiZyKEMuY3JlYXRlRWxlbWVudCksaT0hRiYmIW4oZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KCh1PSJkaXYiLEE/Qy5jcmVhdGVFbGVtZW50KHUpOnt9KSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmE7dmFyIHV9KSxFPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxvPXtmOkY/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKHUsRCxlKXtpZih0KHUpLEQ9ZnVuY3Rpb24odSxEKXtpZighcih1KSlyZXR1cm4gdTt2YXIgZSx0O2lmKEQmJiJmdW5jdGlvbiI9PXR5cGVvZihlPXUudG9TdHJpbmcpJiYhcih0PWUuY2FsbCh1KSkpcmV0dXJuIHQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mKGU9dS52YWx1ZU9mKSYmIXIodD1lLmNhbGwodSkpKXJldHVybiB0O2lmKCFEJiYiZnVuY3Rpb24iPT10eXBlb2YoZT11LnRvU3RyaW5nKSYmIXIodD1lLmNhbGwodSkpKXJldHVybiB0O3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9KEQsITApLHQoZSksaSl0cnl7cmV0dXJuIEUodSxELGUpfWNhdGNoKHUpe31pZigiZ2V0ImluIGV8fCJzZXQiaW4gZSl0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBlJiYodVtEXT1lLnZhbHVlKSx1fX0sYT1GP2Z1bmN0aW9uKHUsRCxlKXtyZXR1cm4gby5mKHUsRCxmdW5jdGlvbih1LEQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ1KSxjb25maWd1cmFibGU6ISgyJnUpLHdyaXRhYmxlOiEoNCZ1KSx2YWx1ZTpEfX0oMSxlKSl9OmZ1bmN0aW9uKHUsRCxlKXtyZXR1cm4gdVtEXT1lLHV9LGM9e30uaGFzT3duUHJvcGVydHksQj1mdW5jdGlvbih1LEQpe3JldHVybiBjLmNhbGwodSxEKX0scz0wLGY9TWF0aC5yYW5kb20oKSxsPXUoZnVuY3Rpb24odSl7dmFyIHI9RFsiX19jb3JlLWpzX3NoYXJlZF9fIl18fChEWyJfX2NvcmUtanNfc2hhcmVkX18iXT17fSk7KHUuZXhwb3J0cz1mdW5jdGlvbih1LEQpe3JldHVybiByW3VdfHwoclt1XT12b2lkIDAhPT1EP0Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjplLnZlcnNpb24sbW9kZToiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9KSgibmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZyIsRnVuY3Rpb24udG9TdHJpbmcpLGQ9dShmdW5jdGlvbih1KXt2YXIgcix0PSJTeW1ib2woIi5jb25jYXQodm9pZCAwPT09KHI9InNyYyIpPyIiOnIsIilfIiwoKytzK2YpLnRvU3RyaW5nKDM2KSksbj0oIiIrbCkuc3BsaXQoInRvU3RyaW5nIik7ZS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHUpe3JldHVybiBsLmNhbGwodSl9LCh1LmV4cG9ydHM9ZnVuY3Rpb24odSxlLHIsRil7dmFyIEM9ImZ1bmN0aW9uIj09dHlwZW9mIHI7QyYmKEIociwibmFtZSIpfHxhKHIsIm5hbWUiLGUpKSx1W2VdIT09ciYmKEMmJihCKHIsdCl8fGEocix0LHVbZV0/IiIrdVtlXTpuLmpvaW4oU3RyaW5nKGUpKSkpLHU9PT1EP3VbZV09cjpGP3VbZV0/dVtlXT1yOmEodSxlLHIpOihkZWxldGUgdVtlXSxhKHUsZSxyKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1t0XXx8bC5jYWxsKHRoaXMpfSl9KSx2PWZ1bmN0aW9uKHUsRCxlKXtpZihmdW5jdGlvbih1KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdSl0aHJvdyBUeXBlRXJyb3IodSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpfSh1KSx2b2lkIDA9PT1EKXJldHVybiB1O3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB1LmNhbGwoRCxlKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB1LmNhbGwoRCxlLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUscix0KXtyZXR1cm4gdS5jYWxsKEQsZSxyLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdS5hcHBseShELGFyZ3VtZW50cyl9fSxwPWZ1bmN0aW9uKHUscix0KXt2YXIgbixGLEMsQSxpPXUmcC5GLEU9dSZwLkcsbz11JnAuUyxjPXUmcC5QLEI9dSZwLkIscz1FP0Q6bz9EW3JdfHwoRFtyXT17fSk6KERbcl18fHt9KS5wcm90b3R5cGUsZj1FP2U6ZVtyXXx8KGVbcl09e30pLGw9Zi5wcm90b3R5cGV8fChmLnByb3RvdHlwZT17fSk7Zm9yKG4gaW4gRSYmKHQ9ciksdClDPSgoRj0haSYmcyYmdm9pZCAwIT09c1tuXSk/czp0KVtuXSxBPUImJkY/dihDLEQpOmMmJiJmdW5jdGlvbiI9PXR5cGVvZiBDP3YoRnVuY3Rpb24uY2FsbCxDKTpDLHMmJmQocyxuLEMsdSZwLlUpLGZbbl0hPUMmJmEoZixuLEEpLGMmJmxbbl0hPUMmJihsW25dPUMpfTtELmNvcmU9ZSxwLkY9MSxwLkc9MixwLlM9NCxwLlA9OCxwLkI9MTYscC5XPTMyLHAuVT02NCxwLlI9MTI4O3ZhciBoLG09cCxnPU1hdGguY2VpbCx5PU1hdGguZmxvb3Isdz1mdW5jdGlvbih1KXtyZXR1cm4gaXNOYU4odT0rdSk/MDoodT4wP3k6ZykodSl9LGI9KGg9ITEsZnVuY3Rpb24odSxEKXt2YXIgZSxyLHQ9U3RyaW5nKGZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIit1KTtyZXR1cm4gdX0odSkpLG49dyhEKSxGPXQubGVuZ3RoO3JldHVybiBuPDB8fG4+PUY/aD8iIjp2b2lkIDA6KGU9dC5jaGFyQ29kZUF0KG4pKTw1NTI5Nnx8ZT41NjMxOXx8bisxPT09Rnx8KHI9dC5jaGFyQ29kZUF0KG4rMSkpPDU2MzIwfHxyPjU3MzQzP2g/dC5jaGFyQXQobik6ZTpoP3Quc2xpY2UobixuKzIpOnItNTYzMjArKGUtNTUyOTY8PDEwKSs2NTUzNn0pO20obS5QLCJTdHJpbmciLHtjb2RlUG9pbnRBdDpmdW5jdGlvbih1KXtyZXR1cm4gYih0aGlzLHUpfX0pO2UuU3RyaW5nLmNvZGVQb2ludEF0O3ZhciBTPU1hdGgubWF4LHg9TWF0aC5taW4sTj1TdHJpbmcuZnJvbUNoYXJDb2RlLFA9U3RyaW5nLmZyb21Db2RlUG9pbnQ7bShtLlMrbS5GKighIVAmJjEhPVAubGVuZ3RoKSwiU3RyaW5nIix7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbih1KXtmb3IodmFyIEQsZSxyLHQ9YXJndW1lbnRzLG49W10sRj1hcmd1bWVudHMubGVuZ3RoLEM9MDtGPkM7KXtpZihEPSt0W0MrK10scj0xMTE0MTExLCgoZT13KGU9RCkpPDA/UyhlK3IsMCk6eChlLHIpKSE9PUQpdGhyb3cgUmFuZ2VFcnJvcihEKyIgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCIpO24ucHVzaChEPDY1NTM2P04oRCk6Tig1NTI5NisoKEQtPTY1NTM2KT4+MTApLEQlMTAyNCs1NjMyMCkpfXJldHVybiBuLmpvaW4oIiIpfX0pO2UuU3RyaW5nLmZyb21Db2RlUG9pbnQ7dmFyIF8sTyxqLEksVixKLE0sayxMLFQseixILCQsUixHPXtTcGFjZV9TZXBhcmF0b3I6L1tcdTE2ODBcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXS8sSURfU3RhcnQ6L1tceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4QTAtXHUwOEI0XHUwOEI2LVx1MDhCRFx1MDkwNC1cdTA5MzlcdTA5M0RcdTA5NTBcdTA5NTgtXHUwOTYxXHUwOTcxLVx1MDk4MFx1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkRcdTA5Q0VcdTA5RENcdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwXHUwOUYxXHUwOUZDXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFEMFx1MEFFMFx1MEFFMVx1MEFGOVx1MEIwNS1cdTBCMENcdTBCMEZcdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMlx1MEIzM1x1MEIzNS1cdTBCMzlcdTBCM0RcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYxXHUwQjcxXHUwQjgzXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5XHUwQjlBXHUwQjlDXHUwQjlFXHUwQjlGXHUwQkEzXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjlcdTBCRDBcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNEXHUwQzU4LVx1MEM1QVx1MEM2MFx1MEM2MVx1MEM4MFx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JEXHUwQ0RFXHUwQ0UwXHUwQ0UxXHUwQ0YxXHUwQ0YyXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNEXHUwRDRFXHUwRDU0LVx1MEQ1Nlx1MEQ1Ri1cdTBENjFcdTBEN0EtXHUwRDdGXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MEUwMS1cdTBFMzBcdTBFMzJcdTBFMzNcdTBFNDAtXHUwRTQ2XHUwRTgxXHUwRTgyXHUwRTg0XHUwRTg3XHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBXHUwRUFCXHUwRUFELVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZFRS1cdTE2RjhcdTE3MDAtXHUxNzBDXHUxNzBFLVx1MTcxMVx1MTcyMC1cdTE3MzFcdTE3NDAtXHUxNzUxXHUxNzYwLVx1MTc2Q1x1MTc2RS1cdTE3NzBcdTE3ODAtXHUxN0IzXHUxN0Q3XHUxN0RDXHUxODIwLVx1MTg3N1x1MTg4MC1cdTE4ODRcdTE4ODctXHUxOEE4XHUxOEFBXHUxOEIwLVx1MThGNVx1MTkwMC1cdTE5MUVcdTE5NTAtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxQTAwLVx1MUExNlx1MUEyMC1cdTFBNTRcdTFBQTdcdTFCMDUtXHUxQjMzXHUxQjQ1LVx1MUI0Qlx1MUI4My1cdTFCQTBcdTFCQUVcdTFCQUZcdTFCQkEtXHUxQkU1XHUxQzAwLVx1MUMyM1x1MUM0RC1cdTFDNEZcdTFDNUEtXHUxQzdEXHUxQzgwLVx1MUM4OFx1MUNFOS1cdTFDRUNcdTFDRUUtXHUxQ0YxXHUxQ0Y1XHUxQ0Y2XHUxRDAwLVx1MURCRlx1MUUwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIxMDJcdTIxMDdcdTIxMEEtXHUyMTEzXHUyMTE1XHUyMTE5LVx1MjExRFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyQS1cdTIxMkRcdTIxMkYtXHUyMTM5XHUyMTNDLVx1MjEzRlx1MjE0NS1cdTIxNDlcdTIxNEVcdTIxNjAtXHUyMTg4XHUyQzAwLVx1MkMyRVx1MkMzMC1cdTJDNUVcdTJDNjAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1LVx1MzAwN1x1MzAyMS1cdTMwMjlcdTMwMzEtXHUzMDM1XHUzMDM4LVx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJFXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkFcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCNVx1NEUwMC1cdTlGRUFcdUEwMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkVGXHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0FFXHVBN0IwLVx1QTdCN1x1QTdGNy1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2NVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0QVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERjAwLVx1REYxOV18XHVEODA2W1x1RENBMC1cdURDREZcdURDRkZcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4M1x1REU4Ni1cdURFODlcdURFQzAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzAwLVx1REM2RVx1REM4MC1cdURENDNdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OV1bXHVEQzAwLVx1REZGRl18XHVEODBEW1x1REMwMC1cdURDMkVdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFRDAtXHVERUVEXHVERjAwLVx1REYyRlx1REY0MC1cdURGNDNcdURGNjMtXHVERjc3XHVERjdELVx1REY4Rl18XHVEODFCW1x1REYwMC1cdURGNDRcdURGNTBcdURGOTMtXHVERjlGXHVERkUwXHVERkUxXXxcdUQ4MjFbXHVEQzAwLVx1REZFQ118XHVEODIyW1x1REMwMC1cdURFRjJdfFx1RDgyQ1tcdURDMDAtXHVERDFFXHVERDcwLVx1REVGQl18XHVEODJGW1x1REMwMC1cdURDNkFcdURDNzAtXHVEQzdDXHVEQzgwLVx1REM4OFx1REM5MC1cdURDOTldfFx1RDgzNVtcdURDMDAtXHVEQzU0XHVEQzU2LVx1REM5Q1x1REM5RVx1REM5Rlx1RENBMlx1RENBNVx1RENBNlx1RENBOS1cdURDQUNcdURDQUUtXHVEQ0I5XHVEQ0JCXHVEQ0JELVx1RENDM1x1RENDNS1cdUREMDVcdUREMDctXHVERDBBXHVERDBELVx1REQxNFx1REQxNi1cdUREMUNcdUREMUUtXHVERDM5XHVERDNCLVx1REQzRVx1REQ0MC1cdURENDRcdURENDZcdURENEEtXHVERDUwXHVERDUyLVx1REVBNVx1REVBOC1cdURFQzBcdURFQzItXHVERURBXHVERURDLVx1REVGQVx1REVGQy1cdURGMTRcdURGMTYtXHVERjM0XHVERjM2LVx1REY0RVx1REY1MC1cdURGNkVcdURGNzAtXHVERjg4XHVERjhBLVx1REZBOFx1REZBQS1cdURGQzJcdURGQzQtXHVERkNCXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFRDZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzNFx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdLyxJRF9Db250aW51ZTovW1x4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzMDAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0ODMtXHUwNDg3XHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNTkxLVx1MDVCRFx1MDVCRlx1MDVDMVx1MDVDMlx1MDVDNFx1MDVDNVx1MDVDN1x1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjEwLVx1MDYxQVx1MDYyMC1cdTA2NjlcdTA2NkUtXHUwNkQzXHUwNkQ1LVx1MDZEQ1x1MDZERi1cdTA2RThcdTA2RUEtXHUwNkZDXHUwNkZGXHUwNzEwLVx1MDc0QVx1MDc0RC1cdTA3QjFcdTA3QzAtXHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgyRFx1MDg0MC1cdTA4NUJcdTA4NjAtXHUwODZBXHUwOEEwLVx1MDhCNFx1MDhCNi1cdTA4QkRcdTA4RDQtXHUwOEUxXHUwOEUzLVx1MDk2M1x1MDk2Ni1cdTA5NkZcdTA5NzEtXHUwOTgzXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCQy1cdTA5QzRcdTA5QzdcdTA5QzhcdTA5Q0ItXHUwOUNFXHUwOUQ3XHUwOURDXHUwOUREXHUwOURGLVx1MDlFM1x1MDlFNi1cdTA5RjFcdTA5RkNcdTBBMDEtXHUwQTAzXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTNDXHUwQTNFLVx1MEE0Mlx1MEE0N1x1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNTFcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTY2LVx1MEE3NVx1MEE4MS1cdTBBODNcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCQy1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEFEMFx1MEFFMC1cdTBBRTNcdTBBRTYtXHUwQUVGXHUwQUY5LVx1MEFGRlx1MEIwMS1cdTBCMDNcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNDLVx1MEI0NFx1MEI0N1x1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTZcdTBCNTdcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYzXHUwQjY2LVx1MEI2Rlx1MEI3MVx1MEI4Mlx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQwXHUwQkQ3XHUwQkU2LVx1MEJFRlx1MEMwMC1cdTBDMDNcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNELVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1XHUwQzU2XHUwQzU4LVx1MEM1QVx1MEM2MC1cdTBDNjNcdTBDNjYtXHUwQzZGXHUwQzgwLVx1MEM4M1x1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JDLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1XHUwQ0Q2XHUwQ0RFXHUwQ0UwLVx1MENFM1x1MENFNi1cdTBDRUZcdTBDRjFcdTBDRjJcdTBEMDAtXHUwRDAzXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDQ0XHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENEVcdTBENTQtXHUwRDU3XHUwRDVGLVx1MEQ2M1x1MEQ2Ni1cdTBENkZcdTBEN0EtXHUwRDdGXHUwRDgyXHUwRDgzXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MERDQVx1MERDRi1cdTBERDRcdTBERDZcdTBERDgtXHUwRERGXHUwREU2LVx1MERFRlx1MERGMlx1MERGM1x1MEUwMS1cdTBFM0FcdTBFNDAtXHUwRTRFXHUwRTUwLVx1MEU1OVx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQVx1MEVBQlx1MEVBRC1cdTBFQjlcdTBFQkItXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVDOC1cdTBFQ0RcdTBFRDAtXHUwRUQ5XHUwRURDLVx1MEVERlx1MEYwMFx1MEYxOFx1MEYxOVx1MEYyMC1cdTBGMjlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0UtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY3MS1cdTBGODRcdTBGODYtXHUwRjk3XHUwRjk5LVx1MEZCQ1x1MEZDNlx1MTAwMC1cdTEwNDlcdTEwNTAtXHUxMDlEXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM1RC1cdTEzNUZcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkVFLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzE0XHUxNzIwLVx1MTczNFx1MTc0MC1cdTE3NTNcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc3Mlx1MTc3M1x1MTc4MC1cdTE3RDNcdTE3RDdcdTE3RENcdTE3RERcdTE3RTAtXHUxN0U5XHUxODBCLVx1MTgwRFx1MTgxMC1cdTE4MTlcdTE4MjAtXHUxODc3XHUxODgwLVx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTIwLVx1MTkyQlx1MTkzMC1cdTE5M0JcdTE5NDYtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxOUQwLVx1MTlEOVx1MUEwMC1cdTFBMUJcdTFBMjAtXHUxQTVFXHUxQTYwLVx1MUE3Q1x1MUE3Ri1cdTFBODlcdTFBOTAtXHUxQTk5XHUxQUE3XHUxQUIwLVx1MUFCRFx1MUIwMC1cdTFCNEJcdTFCNTAtXHUxQjU5XHUxQjZCLVx1MUI3M1x1MUI4MC1cdTFCRjNcdTFDMDAtXHUxQzM3XHUxQzQwLVx1MUM0OVx1MUM0RC1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0QwLVx1MUNEMlx1MUNENC1cdTFDRjlcdTFEMDAtXHUxREY5XHUxREZCLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDNGXHUyMDQwXHUyMDU0XHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjBEMC1cdTIwRENcdTIwRTFcdTIwRTUtXHUyMEYwXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTYwLVx1MjE4OFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ3Ri1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkRFMC1cdTJERkZcdTJFMkZcdTMwMDUtXHUzMDA3XHUzMDIxLVx1MzAyRlx1MzAzMS1cdTMwMzVcdTMwMzgtXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5OVx1MzA5QVx1MzA5RC1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkVcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCQVx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REI1XHU0RTAwLVx1OUZFQVx1QTAwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MkJcdUE2NDAtXHVBNjZGXHVBNjc0LVx1QTY3RFx1QTY3Ri1cdUE2RjFcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3QUVcdUE3QjAtXHVBN0I3XHVBN0Y3LVx1QTgyN1x1QTg0MC1cdUE4NzNcdUE4ODAtXHVBOEM1XHVBOEQwLVx1QThEOVx1QThFMC1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MDAtXHVBOTJEXHVBOTMwLVx1QTk1M1x1QTk2MC1cdUE5N0NcdUE5ODAtXHVBOUMwXHVBOUNGLVx1QTlEOVx1QTlFMC1cdUE5RkVcdUFBMDAtXHVBQTM2XHVBQTQwLVx1QUE0RFx1QUE1MC1cdUFBNTlcdUFBNjAtXHVBQTc2XHVBQTdBLVx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVGXHVBQUYyLVx1QUFGNlx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkVBXHVBQkVDXHVBQkVEXHVBQkYwLVx1QUJGOVx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMUQtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkUwMC1cdUZFMEZcdUZFMjAtXHVGRTJGXHVGRTMzXHVGRTM0XHVGRTRELVx1RkU0Rlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjEwLVx1RkYxOVx1RkYyMS1cdUZGM0FcdUZGM0ZcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVEREZEXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURFRTBcdURGMDAtXHVERjFGXHVERjJELVx1REY0QVx1REY1MC1cdURGN0FcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENBMC1cdURDQTlcdURDQjAtXHVEQ0QzXHVEQ0Q4LVx1RENGQlx1REQwMC1cdUREMjdcdUREMzAtXHVERDYzXHVERTAwLVx1REYzNlx1REY0MC1cdURGNTVcdURGNjAtXHVERjY3XXxcdUQ4MDJbXHVEQzAwLVx1REMwNVx1REMwOFx1REMwQS1cdURDMzVcdURDMzdcdURDMzhcdURDM0NcdURDM0YtXHVEQzU1XHVEQzYwLVx1REM3Nlx1REM4MC1cdURDOUVcdURDRTAtXHVEQ0YyXHVEQ0Y0XHVEQ0Y1XHVERDAwLVx1REQxNVx1REQyMC1cdUREMzlcdUREODAtXHVEREI3XHVEREJFXHVEREJGXHVERTAwLVx1REUwM1x1REUwNVx1REUwNlx1REUwQy1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzM1x1REUzOC1cdURFM0FcdURFM0ZcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU2XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMC1cdURDNDZcdURDNjYtXHVEQzZGXHVEQzdGLVx1RENCQVx1RENEMC1cdURDRThcdURDRjAtXHVEQ0Y5XHVERDAwLVx1REQzNFx1REQzNi1cdUREM0ZcdURENTAtXHVERDczXHVERDc2XHVERDgwLVx1RERDNFx1RERDQS1cdUREQ0NcdURERDAtXHVERERBXHVERERDXHVERTAwLVx1REUxMVx1REUxMy1cdURFMzdcdURFM0VcdURFODAtXHVERTg2XHVERTg4XHVERThBLVx1REU4RFx1REU4Ri1cdURFOURcdURFOUYtXHVERUE4XHVERUIwLVx1REVFQVx1REVGMC1cdURFRjlcdURGMDAtXHVERjAzXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzQy1cdURGNDRcdURGNDdcdURGNDhcdURGNEItXHVERjREXHVERjUwXHVERjU3XHVERjVELVx1REY2M1x1REY2Ni1cdURGNkNcdURGNzAtXHVERjc0XXxcdUQ4MDVbXHVEQzAwLVx1REM0QVx1REM1MC1cdURDNTlcdURDODAtXHVEQ0M1XHVEQ0M3XHVEQ0QwLVx1RENEOVx1REQ4MC1cdUREQjVcdUREQjgtXHVEREMwXHVEREQ4LVx1RERERFx1REUwMC1cdURFNDBcdURFNDRcdURFNTAtXHVERTU5XHVERTgwLVx1REVCN1x1REVDMC1cdURFQzlcdURGMDAtXHVERjE5XHVERjFELVx1REYyQlx1REYzMC1cdURGMzldfFx1RDgwNltcdURDQTAtXHVEQ0U5XHVEQ0ZGXHVERTAwLVx1REUzRVx1REU0N1x1REU1MC1cdURFODNcdURFODYtXHVERTk5XHVERUMwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzM2XHVEQzM4LVx1REM0MFx1REM1MC1cdURDNTlcdURDNzItXHVEQzhGXHVEQzkyLVx1RENBN1x1RENBOS1cdURDQjZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzNlx1REQzQVx1REQzQ1x1REQzRFx1REQzRi1cdURENDdcdURENTAtXHVERDU5XXxcdUQ4MDhbXHVEQzAwLVx1REY5OV18XHVEODA5W1x1REMwMC1cdURDNkVcdURDODAtXHVERDQzXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzldW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJFXXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERTYwLVx1REU2OVx1REVEMC1cdURFRURcdURFRjAtXHVERUY0XHVERjAwLVx1REYzNlx1REY0MC1cdURGNDNcdURGNTAtXHVERjU5XHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURGMDAtXHVERjQ0XHVERjUwLVx1REY3RVx1REY4Ri1cdURGOUZcdURGRTBcdURGRTFdfFx1RDgyMVtcdURDMDAtXHVERkVDXXxcdUQ4MjJbXHVEQzAwLVx1REVGMl18XHVEODJDW1x1REMwMC1cdUREMUVcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OVx1REM5RFx1REM5RV18XHVEODM0W1x1REQ2NS1cdURENjlcdURENkQtXHVERDcyXHVERDdCLVx1REQ4Mlx1REQ4NS1cdUREOEJcdUREQUEtXHVEREFEXHVERTQyLVx1REU0NF18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JcdURGQ0UtXHVERkZGXXxcdUQ4MzZbXHVERTAwLVx1REUzNlx1REUzQi1cdURFNkNcdURFNzVcdURFODRcdURFOUItXHVERTlGXHVERUExLVx1REVBRl18XHVEODM4W1x1REMwMC1cdURDMDZcdURDMDgtXHVEQzE4XHVEQzFCLVx1REMyMVx1REMyM1x1REMyNFx1REMyNi1cdURDMkFdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVEQ0QwLVx1RENENlx1REQwMC1cdURENEFcdURENTAtXHVERDU5XXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXXxcdURCNDBbXHVERDAwLVx1RERFRl0vfSxVPXtpc1NwYWNlU2VwYXJhdG9yOmZ1bmN0aW9uKHUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdSYmRy5TcGFjZV9TZXBhcmF0b3IudGVzdCh1KX0saXNJZFN0YXJ0Q2hhcjpmdW5jdGlvbih1KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHUmJih1Pj0iYSImJnU8PSJ6Inx8dT49IkEiJiZ1PD0iWiJ8fCIkIj09PXV8fCJfIj09PXV8fEcuSURfU3RhcnQudGVzdCh1KSl9LGlzSWRDb250aW51ZUNoYXI6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYodT49ImEiJiZ1PD0ieiJ8fHU+PSJBIiYmdTw9IloifHx1Pj0iMCImJnU8PSI5Inx8IiQiPT09dXx8Il8iPT09dXx8IuKAjCI9PT11fHwi4oCNIj09PXV8fEcuSURfQ29udGludWUudGVzdCh1KSl9LGlzRGlnaXQ6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYvWzAtOV0vLnRlc3QodSl9LGlzSGV4RGlnaXQ6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYvWzAtOUEtRmEtZl0vLnRlc3QodSl9fTtmdW5jdGlvbiBaKCl7Zm9yKFQ9ImRlZmF1bHQiLHo9IiIsSD0hMSwkPTE7Oyl7Uj1xKCk7dmFyIHU9WFtUXSgpO2lmKHUpcmV0dXJuIHV9fWZ1bmN0aW9uIHEoKXtpZihfW0ldKXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChfLmNvZGVQb2ludEF0KEkpKX1mdW5jdGlvbiBXKCl7dmFyIHU9cSgpO3JldHVybiJcbiI9PT11PyhWKyssSj0wKTp1P0orPXUubGVuZ3RoOkorKyx1JiYoSSs9dS5sZW5ndGgpLHV9dmFyIFg9e2RlZmF1bHQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJcdCI6Y2FzZSJcdiI6Y2FzZSJcZiI6Y2FzZSIgIjpjYXNlIiAiOmNhc2UiXHVmZWZmIjpjYXNlIlxuIjpjYXNlIlxyIjpjYXNlIlx1MjAyOCI6Y2FzZSJcdTIwMjkiOnJldHVybiB2b2lkIFcoKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJjb21tZW50Iik7Y2FzZSB2b2lkIDA6cmV0dXJuIFcoKSxLKCJlb2YiKX1pZighVS5pc1NwYWNlU2VwYXJhdG9yKFIpKXJldHVybiBYW09dKCk7VygpfSxjb21tZW50OmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiKiI6cmV0dXJuIFcoKSx2b2lkKFQ9Im11bHRpTGluZUNvbW1lbnQiKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJzaW5nbGVMaW5lQ29tbWVudCIpfXRocm93IHJ1KFcoKSl9LG11bHRpTGluZUNvbW1lbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIqIjpyZXR1cm4gVygpLHZvaWQoVD0ibXVsdGlMaW5lQ29tbWVudEFzdGVyaXNrIik7Y2FzZSB2b2lkIDA6dGhyb3cgcnUoVygpKX1XKCl9LG11bHRpTGluZUNvbW1lbnRBc3RlcmlzazpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIioiOnJldHVybiB2b2lkIFcoKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJkZWZhdWx0Iik7Y2FzZSB2b2lkIDA6dGhyb3cgcnUoVygpKX1XKCksVD0ibXVsdGlMaW5lQ29tbWVudCJ9LHNpbmdsZUxpbmVDb21tZW50OmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiXG4iOmNhc2UiXHIiOmNhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6cmV0dXJuIFcoKSx2b2lkKFQ9ImRlZmF1bHQiKTtjYXNlIHZvaWQgMDpyZXR1cm4gVygpLEsoImVvZiIpfVcoKX0sdmFsdWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJ7IjpjYXNlIlsiOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO2Nhc2UibiI6cmV0dXJuIFcoKSxRKCJ1bGwiKSxLKCJudWxsIixudWxsKTtjYXNlInQiOnJldHVybiBXKCksUSgicnVlIiksSygiYm9vbGVhbiIsITApO2Nhc2UiZiI6cmV0dXJuIFcoKSxRKCJhbHNlIiksSygiYm9vbGVhbiIsITEpO2Nhc2UiLSI6Y2FzZSIrIjpyZXR1cm4iLSI9PT1XKCkmJigkPS0xKSx2b2lkKFQ9InNpZ24iKTtjYXNlIi4iOnJldHVybiB6PVcoKSx2b2lkKFQ9ImRlY2ltYWxQb2ludExlYWRpbmciKTtjYXNlIjAiOnJldHVybiB6PVcoKSx2b2lkKFQ9Inplcm8iKTtjYXNlIjEiOmNhc2UiMiI6Y2FzZSIzIjpjYXNlIjQiOmNhc2UiNSI6Y2FzZSI2IjpjYXNlIjciOmNhc2UiOCI6Y2FzZSI5IjpyZXR1cm4gej1XKCksdm9pZChUPSJkZWNpbWFsSW50ZWdlciIpO2Nhc2UiSSI6cmV0dXJuIFcoKSxRKCJuZmluaXR5IiksSygibnVtZXJpYyIsMS8wKTtjYXNlIk4iOnJldHVybiBXKCksUSgiYU4iKSxLKCJudW1lcmljIixOYU4pO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gSD0nIic9PT1XKCksej0iIix2b2lkKFQ9InN0cmluZyIpfXRocm93IHJ1KFcoKSl9LGlkZW50aWZpZXJOYW1lU3RhcnRFc2NhcGU6ZnVuY3Rpb24oKXtpZigidSIhPT1SKXRocm93IHJ1KFcoKSk7VygpO3ZhciB1PVkoKTtzd2l0Y2godSl7Y2FzZSIkIjpjYXNlIl8iOmJyZWFrO2RlZmF1bHQ6aWYoIVUuaXNJZFN0YXJ0Q2hhcih1KSl0aHJvdyBudSgpfXorPXUsVD0iaWRlbnRpZmllck5hbWUifSxpZGVudGlmaWVyTmFtZTpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIiQiOmNhc2UiXyI6Y2FzZSLigIwiOmNhc2Ui4oCNIjpyZXR1cm4gdm9pZCh6Kz1XKCkpO2Nhc2UiXFwiOnJldHVybiBXKCksdm9pZChUPSJpZGVudGlmaWVyTmFtZUVzY2FwZSIpfWlmKCFVLmlzSWRDb250aW51ZUNoYXIoUikpcmV0dXJuIEsoImlkZW50aWZpZXIiLHopO3orPVcoKX0saWRlbnRpZmllck5hbWVFc2NhcGU6ZnVuY3Rpb24oKXtpZigidSIhPT1SKXRocm93IHJ1KFcoKSk7VygpO3ZhciB1PVkoKTtzd2l0Y2godSl7Y2FzZSIkIjpjYXNlIl8iOmNhc2Ui4oCMIjpjYXNlIuKAjSI6YnJlYWs7ZGVmYXVsdDppZighVS5pc0lkQ29udGludWVDaGFyKHUpKXRocm93IG51KCl9eis9dSxUPSJpZGVudGlmaWVyTmFtZSJ9LHNpZ246ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIuIjpyZXR1cm4gej1XKCksdm9pZChUPSJkZWNpbWFsUG9pbnRMZWFkaW5nIik7Y2FzZSIwIjpyZXR1cm4gej1XKCksdm9pZChUPSJ6ZXJvIik7Y2FzZSIxIjpjYXNlIjIiOmNhc2UiMyI6Y2FzZSI0IjpjYXNlIjUiOmNhc2UiNiI6Y2FzZSI3IjpjYXNlIjgiOmNhc2UiOSI6cmV0dXJuIHo9VygpLHZvaWQoVD0iZGVjaW1hbEludGVnZXIiKTtjYXNlIkkiOnJldHVybiBXKCksUSgibmZpbml0eSIpLEsoIm51bWVyaWMiLCQqKDEvMCkpO2Nhc2UiTiI6cmV0dXJuIFcoKSxRKCJhTiIpLEsoIm51bWVyaWMiLE5hTil9dGhyb3cgcnUoVygpKX0semVybzpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIi4iOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsUG9pbnQiKTtjYXNlImUiOmNhc2UiRSI6cmV0dXJuIHorPVcoKSx2b2lkKFQ9ImRlY2ltYWxFeHBvbmVudCIpO2Nhc2UieCI6Y2FzZSJYIjpyZXR1cm4geis9VygpLHZvaWQoVD0iaGV4YWRlY2ltYWwiKX1yZXR1cm4gSygibnVtZXJpYyIsMCokKX0sZGVjaW1hbEludGVnZXI6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIuIjpyZXR1cm4geis9VygpLHZvaWQoVD0iZGVjaW1hbFBvaW50Iik7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1pZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxkZWNpbWFsUG9pbnRMZWFkaW5nOmZ1bmN0aW9uKCl7aWYoVS5pc0RpZ2l0KFIpKXJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRnJhY3Rpb24iKTt0aHJvdyBydShXKCkpfSxkZWNpbWFsUG9pbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1yZXR1cm4gVS5pc0RpZ2l0KFIpPyh6Kz1XKCksdm9pZChUPSJkZWNpbWFsRnJhY3Rpb24iKSk6SygibnVtZXJpYyIsJCpOdW1iZXIoeikpfSxkZWNpbWFsRnJhY3Rpb246ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1pZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxkZWNpbWFsRXhwb25lbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIrIjpjYXNlIi0iOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnRTaWduIil9aWYoVS5pc0RpZ2l0KFIpKXJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnRJbnRlZ2VyIik7dGhyb3cgcnUoVygpKX0sZGVjaW1hbEV4cG9uZW50U2lnbjpmdW5jdGlvbigpe2lmKFUuaXNEaWdpdChSKSlyZXR1cm4geis9VygpLHZvaWQoVD0iZGVjaW1hbEV4cG9uZW50SW50ZWdlciIpO3Rocm93IHJ1KFcoKSl9LGRlY2ltYWxFeHBvbmVudEludGVnZXI6ZnVuY3Rpb24oKXtpZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxoZXhhZGVjaW1hbDpmdW5jdGlvbigpe2lmKFUuaXNIZXhEaWdpdChSKSlyZXR1cm4geis9VygpLHZvaWQoVD0iaGV4YWRlY2ltYWxJbnRlZ2VyIik7dGhyb3cgcnUoVygpKX0saGV4YWRlY2ltYWxJbnRlZ2VyOmZ1bmN0aW9uKCl7aWYoIVUuaXNIZXhEaWdpdChSKSlyZXR1cm4gSygibnVtZXJpYyIsJCpOdW1iZXIoeikpO3orPVcoKX0sc3RyaW5nOmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiXFwiOnJldHVybiBXKCksdm9pZCh6Kz1mdW5jdGlvbigpe3N3aXRjaChxKCkpe2Nhc2UiYiI6cmV0dXJuIFcoKSwiXGIiO2Nhc2UiZiI6cmV0dXJuIFcoKSwiXGYiO2Nhc2UibiI6cmV0dXJuIFcoKSwiXG4iO2Nhc2UiciI6cmV0dXJuIFcoKSwiXHIiO2Nhc2UidCI6cmV0dXJuIFcoKSwiXHQiO2Nhc2UidiI6cmV0dXJuIFcoKSwiXHYiO2Nhc2UiMCI6aWYoVygpLFUuaXNEaWdpdChxKCkpKXRocm93IHJ1KFcoKSk7cmV0dXJuIlwwIjtjYXNlIngiOnJldHVybiBXKCksZnVuY3Rpb24oKXt2YXIgdT0iIixEPXEoKTtpZighVS5pc0hleERpZ2l0KEQpKXRocm93IHJ1KFcoKSk7aWYodSs9VygpLEQ9cSgpLCFVLmlzSGV4RGlnaXQoRCkpdGhyb3cgcnUoVygpKTtyZXR1cm4gdSs9VygpLFN0cmluZy5mcm9tQ29kZVBvaW50KHBhcnNlSW50KHUsMTYpKX0oKTtjYXNlInUiOnJldHVybiBXKCksWSgpO2Nhc2UiXG4iOmNhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6cmV0dXJuIFcoKSwiIjtjYXNlIlxyIjpyZXR1cm4gVygpLCJcbiI9PT1xKCkmJlcoKSwiIjtjYXNlIjEiOmNhc2UiMiI6Y2FzZSIzIjpjYXNlIjQiOmNhc2UiNSI6Y2FzZSI2IjpjYXNlIjciOmNhc2UiOCI6Y2FzZSI5IjpjYXNlIHZvaWQgMDp0aHJvdyBydShXKCkpfXJldHVybiBXKCl9KCkpO2Nhc2UnIic6cmV0dXJuIEg/KFcoKSxLKCJzdHJpbmciLHopKTp2b2lkKHorPVcoKSk7Y2FzZSInIjpyZXR1cm4gSD92b2lkKHorPVcoKSk6KFcoKSxLKCJzdHJpbmciLHopKTtjYXNlIlxuIjpjYXNlIlxyIjp0aHJvdyBydShXKCkpO2Nhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6IWZ1bmN0aW9uKHUpe2NvbnNvbGUud2FybigiSlNPTjU6ICciK0Z1KHUpKyInIGluIHN0cmluZ3MgaXMgbm90IHZhbGlkIEVDTUFTY3JpcHQ7IGNvbnNpZGVyIGVzY2FwaW5nIil9KFIpO2JyZWFrO2Nhc2Ugdm9pZCAwOnRocm93IHJ1KFcoKSl9eis9VygpfSxzdGFydDpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlInsiOmNhc2UiWyI6cmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSl9VD0idmFsdWUifSxiZWZvcmVQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIkIjpjYXNlIl8iOnJldHVybiB6PVcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lIik7Y2FzZSJcXCI6cmV0dXJuIFcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lU3RhcnRFc2NhcGUiKTtjYXNlIn0iOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gSD0nIic9PT1XKCksdm9pZChUPSJzdHJpbmciKX1pZihVLmlzSWRTdGFydENoYXIoUikpcmV0dXJuIHorPVcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lIik7dGhyb3cgcnUoVygpKX0sYWZ0ZXJQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtpZigiOiI9PT1SKXJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO3Rocm93IHJ1KFcoKSl9LGJlZm9yZVByb3BlcnR5VmFsdWU6ZnVuY3Rpb24oKXtUPSJ2YWx1ZSJ9LGFmdGVyUHJvcGVydHlWYWx1ZTpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIiwiOmNhc2UifSI6cmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSl9dGhyb3cgcnUoVygpKX0sYmVmb3JlQXJyYXlWYWx1ZTpmdW5jdGlvbigpe2lmKCJdIj09PVIpcmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSk7VD0idmFsdWUifSxhZnRlckFycmF5VmFsdWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIsIjpjYXNlIl0iOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpfXRocm93IHJ1KFcoKSl9LGVuZDpmdW5jdGlvbigpe3Rocm93IHJ1KFcoKSl9fTtmdW5jdGlvbiBLKHUsRCl7cmV0dXJue3R5cGU6dSx2YWx1ZTpELGxpbmU6Vixjb2x1bW46Sn19ZnVuY3Rpb24gUSh1KXtmb3IodmFyIEQ9MCxlPXU7RDxlLmxlbmd0aDtEKz0xKXt2YXIgcj1lW0RdO2lmKHEoKSE9PXIpdGhyb3cgcnUoVygpKTtXKCl9fWZ1bmN0aW9uIFkoKXtmb3IodmFyIHU9IiIsRD00O0QtLSA+MDspe3ZhciBlPXEoKTtpZighVS5pc0hleERpZ2l0KGUpKXRocm93IHJ1KFcoKSk7dSs9VygpfXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludCh1LDE2KSl9dmFyIHV1PXtzdGFydDpmdW5jdGlvbigpe2lmKCJlb2YiPT09TS50eXBlKXRocm93IHR1KCk7RHUoKX0sYmVmb3JlUHJvcGVydHlOYW1lOmZ1bmN0aW9uKCl7c3dpdGNoKE0udHlwZSl7Y2FzZSJpZGVudGlmaWVyIjpjYXNlInN0cmluZyI6cmV0dXJuIGs9TS52YWx1ZSx2b2lkKE89ImFmdGVyUHJvcGVydHlOYW1lIik7Y2FzZSJwdW5jdHVhdG9yIjpyZXR1cm4gdm9pZCBldSgpO2Nhc2UiZW9mIjp0aHJvdyB0dSgpfX0sYWZ0ZXJQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtpZigiZW9mIj09PU0udHlwZSl0aHJvdyB0dSgpO089ImJlZm9yZVByb3BlcnR5VmFsdWUifSxiZWZvcmVQcm9wZXJ0eVZhbHVlOmZ1bmN0aW9uKCl7aWYoImVvZiI9PT1NLnR5cGUpdGhyb3cgdHUoKTtEdSgpfSxiZWZvcmVBcnJheVZhbHVlOmZ1bmN0aW9uKCl7aWYoImVvZiI9PT1NLnR5cGUpdGhyb3cgdHUoKTsicHVuY3R1YXRvciIhPT1NLnR5cGV8fCJdIiE9PU0udmFsdWU/RHUoKTpldSgpfSxhZnRlclByb3BlcnR5VmFsdWU6ZnVuY3Rpb24oKXtpZigiZW9mIj09PU0udHlwZSl0aHJvdyB0dSgpO3N3aXRjaChNLnZhbHVlKXtjYXNlIiwiOnJldHVybiB2b2lkKE89ImJlZm9yZVByb3BlcnR5TmFtZSIpO2Nhc2UifSI6ZXUoKX19LGFmdGVyQXJyYXlWYWx1ZTpmdW5jdGlvbigpe2lmKCJlb2YiPT09TS50eXBlKXRocm93IHR1KCk7c3dpdGNoKE0udmFsdWUpe2Nhc2UiLCI6cmV0dXJuIHZvaWQoTz0iYmVmb3JlQXJyYXlWYWx1ZSIpO2Nhc2UiXSI6ZXUoKX19LGVuZDpmdW5jdGlvbigpe319O2Z1bmN0aW9uIER1KCl7dmFyIHU7c3dpdGNoKE0udHlwZSl7Y2FzZSJwdW5jdHVhdG9yIjpzd2l0Y2goTS52YWx1ZSl7Y2FzZSJ7Ijp1PXt9O2JyZWFrO2Nhc2UiWyI6dT1bXX1icmVhaztjYXNlIm51bGwiOmNhc2UiYm9vbGVhbiI6Y2FzZSJudW1lcmljIjpjYXNlInN0cmluZyI6dT1NLnZhbHVlfWlmKHZvaWQgMD09PUwpTD11O2Vsc2V7dmFyIEQ9altqLmxlbmd0aC0xXTtBcnJheS5pc0FycmF5KEQpP0QucHVzaCh1KTpPYmplY3QuZGVmaW5lUHJvcGVydHkoRCxrLHt2YWx1ZTp1LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9aWYobnVsbCE9PXUmJiJvYmplY3QiPT10eXBlb2YgdSlqLnB1c2godSksTz1BcnJheS5pc0FycmF5KHUpPyJiZWZvcmVBcnJheVZhbHVlIjoiYmVmb3JlUHJvcGVydHlOYW1lIjtlbHNle3ZhciBlPWpbai5sZW5ndGgtMV07Tz1udWxsPT1lPyJlbmQiOkFycmF5LmlzQXJyYXkoZSk/ImFmdGVyQXJyYXlWYWx1ZSI6ImFmdGVyUHJvcGVydHlWYWx1ZSJ9fWZ1bmN0aW9uIGV1KCl7ai5wb3AoKTt2YXIgdT1qW2oubGVuZ3RoLTFdO089bnVsbD09dT8iZW5kIjpBcnJheS5pc0FycmF5KHUpPyJhZnRlckFycmF5VmFsdWUiOiJhZnRlclByb3BlcnR5VmFsdWUifWZ1bmN0aW9uIHJ1KHUpe3JldHVybiBDdSh2b2lkIDA9PT11PyJKU09ONTogaW52YWxpZCBlbmQgb2YgaW5wdXQgYXQgIitWKyI6IitKOiJKU09ONTogaW52YWxpZCBjaGFyYWN0ZXIgJyIrRnUodSkrIicgYXQgIitWKyI6IitKKX1mdW5jdGlvbiB0dSgpe3JldHVybiBDdSgiSlNPTjU6IGludmFsaWQgZW5kIG9mIGlucHV0IGF0ICIrVisiOiIrSil9ZnVuY3Rpb24gbnUoKXtyZXR1cm4gQ3UoIkpTT041OiBpbnZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVyIGF0ICIrVisiOiIrKEotPTUpKX1mdW5jdGlvbiBGdSh1KXt2YXIgRD17IiciOiJcXCciLCciJzonXFwiJywiXFwiOiJcXFxcIiwiXGIiOiJcXGIiLCJcZiI6IlxcZiIsIlxuIjoiXFxuIiwiXHIiOiJcXHIiLCJcdCI6IlxcdCIsIlx2IjoiXFx2IiwiXDAiOiJcXDAiLCJcdTIwMjgiOiJcXHUyMDI4IiwiXHUyMDI5IjoiXFx1MjAyOSJ9O2lmKERbdV0pcmV0dXJuIERbdV07aWYodTwiICIpe3ZhciBlPXUuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7cmV0dXJuIlxceCIrKCIwMCIrZSkuc3Vic3RyaW5nKGUubGVuZ3RoKX1yZXR1cm4gdX1mdW5jdGlvbiBDdSh1KXt2YXIgRD1uZXcgU3ludGF4RXJyb3IodSk7cmV0dXJuIEQubGluZU51bWJlcj1WLEQuY29sdW1uTnVtYmVyPUosRH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odSxEKXtfPVN0cmluZyh1KSxPPSJzdGFydCIsaj1bXSxJPTAsVj0xLEo9MCxNPXZvaWQgMCxrPXZvaWQgMCxMPXZvaWQgMDtkb3tNPVooKSx1dVtPXSgpfXdoaWxlKCJlb2YiIT09TS50eXBlKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgRD9mdW5jdGlvbiB1KEQsZSxyKXt2YXIgdD1EW2VdO2lmKG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdClpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgRj1TdHJpbmcobiksQz11KHQsRixyKTt2b2lkIDA9PT1DP2RlbGV0ZSB0W0ZdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LEYse3ZhbHVlOkMsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1lbHNlIGZvcih2YXIgQSBpbiB0KXt2YXIgaT11KHQsQSxyKTt2b2lkIDA9PT1pP2RlbGV0ZSB0W0FdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LEEse3ZhbHVlOmksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1yZXR1cm4gci5jYWxsKEQsZSx0KX0oeyIiOkx9LCIiLEQpOkx9LHN0cmluZ2lmeTpmdW5jdGlvbih1LEQsZSl7dmFyIHIsdCxuLEY9W10sQz0iIixBPSIiO2lmKG51bGw9PUR8fCJvYmplY3QiIT10eXBlb2YgRHx8QXJyYXkuaXNBcnJheShEKXx8KGU9RC5zcGFjZSxuPUQucXVvdGUsRD1ELnJlcGxhY2VyKSwiZnVuY3Rpb24iPT10eXBlb2YgRCl0PUQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KEQpKXtyPVtdO2Zvcih2YXIgaT0wLEU9RDtpPEUubGVuZ3RoO2krPTEpe3ZhciBvPUVbaV0sYT12b2lkIDA7InN0cmluZyI9PXR5cGVvZiBvP2E9bzooIm51bWJlciI9PXR5cGVvZiBvfHxvIGluc3RhbmNlb2YgU3RyaW5nfHxvIGluc3RhbmNlb2YgTnVtYmVyKSYmKGE9U3RyaW5nKG8pKSx2b2lkIDAhPT1hJiZyLmluZGV4T2YoYSk8MCYmci5wdXNoKGEpfX1yZXR1cm4gZSBpbnN0YW5jZW9mIE51bWJlcj9lPU51bWJlcihlKTplIGluc3RhbmNlb2YgU3RyaW5nJiYoZT1TdHJpbmcoZSkpLCJudW1iZXIiPT10eXBlb2YgZT9lPjAmJihlPU1hdGgubWluKDEwLE1hdGguZmxvb3IoZSkpLEE9IiAgICAgICAgICAiLnN1YnN0cigwLGUpKToic3RyaW5nIj09dHlwZW9mIGUmJihBPWUuc3Vic3RyKDAsMTApKSxjKCIiLHsiIjp1fSk7ZnVuY3Rpb24gYyh1LEQpe3ZhciBlPURbdV07c3dpdGNoKG51bGwhPWUmJigiZnVuY3Rpb24iPT10eXBlb2YgZS50b0pTT041P2U9ZS50b0pTT041KHUpOiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvSlNPTiYmKGU9ZS50b0pTT04odSkpKSx0JiYoZT10LmNhbGwoRCx1LGUpKSxlIGluc3RhbmNlb2YgTnVtYmVyP2U9TnVtYmVyKGUpOmUgaW5zdGFuY2VvZiBTdHJpbmc/ZT1TdHJpbmcoZSk6ZSBpbnN0YW5jZW9mIEJvb2xlYW4mJihlPWUudmFsdWVPZigpKSxlKXtjYXNlIG51bGw6cmV0dXJuIm51bGwiO2Nhc2UhMDpyZXR1cm4idHJ1ZSI7Y2FzZSExOnJldHVybiJmYWxzZSJ9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP0IoZSk6Im51bWJlciI9PXR5cGVvZiBlP1N0cmluZyhlKToib2JqZWN0Ij09dHlwZW9mIGU/QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbih1KXtpZihGLmluZGV4T2YodSk+PTApdGhyb3cgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09ONSIpO0YucHVzaCh1KTt2YXIgRD1DO0MrPUE7Zm9yKHZhciBlLHI9W10sdD0wO3Q8dS5sZW5ndGg7dCsrKXt2YXIgbj1jKFN0cmluZyh0KSx1KTtyLnB1c2godm9pZCAwIT09bj9uOiJudWxsIil9aWYoMD09PXIubGVuZ3RoKWU9IltdIjtlbHNlIGlmKCIiPT09QSl7dmFyIGk9ci5qb2luKCIsIik7ZT0iWyIraSsiXSJ9ZWxzZXt2YXIgRT0iLFxuIitDLG89ci5qb2luKEUpO2U9IltcbiIrQytvKyIsXG4iK0QrIl0ifXJldHVybiBGLnBvcCgpLEM9RCxlfShlKTpmdW5jdGlvbih1KXtpZihGLmluZGV4T2YodSk+PTApdGhyb3cgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09ONSIpO0YucHVzaCh1KTt2YXIgRD1DO0MrPUE7Zm9yKHZhciBlLHQsbj1yfHxPYmplY3Qua2V5cyh1KSxpPVtdLEU9MCxvPW47RTxvLmxlbmd0aDtFKz0xKXt2YXIgYT1vW0VdLEI9YyhhLHUpO2lmKHZvaWQgMCE9PUIpe3ZhciBmPXMoYSkrIjoiOyIiIT09QSYmKGYrPSIgIiksZis9QixpLnB1c2goZil9fWlmKDA9PT1pLmxlbmd0aCllPSJ7fSI7ZWxzZSBpZigiIj09PUEpdD1pLmpvaW4oIiwiKSxlPSJ7Iit0KyJ9IjtlbHNle3ZhciBsPSIsXG4iK0M7dD1pLmpvaW4obCksZT0ie1xuIitDK3QrIixcbiIrRCsifSJ9cmV0dXJuIEYucG9wKCksQz1ELGV9KGUpOnZvaWQgMH1mdW5jdGlvbiBCKHUpe2Zvcih2YXIgRD17IiciOi4xLCciJzouMn0sZT17IiciOiJcXCciLCciJzonXFwiJywiXFwiOiJcXFxcIiwiXGIiOiJcXGIiLCJcZiI6IlxcZiIsIlxuIjoiXFxuIiwiXHIiOiJcXHIiLCJcdCI6IlxcdCIsIlx2IjoiXFx2IiwiXDAiOiJcXDAiLCJcdTIwMjgiOiJcXHUyMDI4IiwiXHUyMDI5IjoiXFx1MjAyOSJ9LHI9IiIsdD0wO3Q8dS5sZW5ndGg7dCsrKXt2YXIgRj11W3RdO3N3aXRjaChGKXtjYXNlIiciOmNhc2UnIic6RFtGXSsrLHIrPUY7Y29udGludWU7Y2FzZSJcMCI6aWYoVS5pc0RpZ2l0KHVbdCsxXSkpe3IrPSJcXHgwMCI7Y29udGludWV9fWlmKGVbRl0pcis9ZVtGXTtlbHNlIGlmKEY8IiAiKXt2YXIgQz1GLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO3IrPSJcXHgiKygiMDAiK0MpLnN1YnN0cmluZyhDLmxlbmd0aCl9ZWxzZSByKz1GfXZhciBBPW58fE9iamVjdC5rZXlzKEQpLnJlZHVjZShmdW5jdGlvbih1LGUpe3JldHVybiBEW3VdPERbZV0/dTplfSk7cmV0dXJuIEErKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoQSwiZyIpLGVbQV0pKStBfWZ1bmN0aW9uIHModSl7aWYoMD09PXUubGVuZ3RoKXJldHVybiBCKHUpO3ZhciBEPVN0cmluZy5mcm9tQ29kZVBvaW50KHUuY29kZVBvaW50QXQoMCkpO2lmKCFVLmlzSWRTdGFydENoYXIoRCkpcmV0dXJuIEIodSk7Zm9yKHZhciBlPUQubGVuZ3RoO2U8dS5sZW5ndGg7ZSsrKWlmKCFVLmlzSWRDb250aW51ZUNoYXIoU3RyaW5nLmZyb21Db2RlUG9pbnQodS5jb2RlUG9pbnRBdChlKSkpKXJldHVybiBCKHUpO3JldHVybiB1fX19fSk7`;
|
|
131861
134244
|
//#endregion
|
|
131862
134245
|
//#region src/client/api/view-server/request.ts
|
|
134246
|
+
var VIEW_REQUEST_HEADER = "X-Inspect-View-Request";
|
|
134247
|
+
var VIEW_REQUEST_HEADER_VALUE = "true";
|
|
131863
134248
|
var ApiError = class extends Error {
|
|
131864
134249
|
status;
|
|
131865
134250
|
constructor(status, message) {
|
|
@@ -131890,6 +134275,9 @@ function unwrapFastapiDetail(body) {
|
|
|
131890
134275
|
}
|
|
131891
134276
|
function serverRequestApi(baseUrl, getHeaders) {
|
|
131892
134277
|
const apiUrl = baseUrl || "";
|
|
134278
|
+
function addViewRequestHeader(method, headers) {
|
|
134279
|
+
if (method !== "GET") headers[VIEW_REQUEST_HEADER] = VIEW_REQUEST_HEADER_VALUE;
|
|
134280
|
+
}
|
|
131893
134281
|
function buildApiUrl(path) {
|
|
131894
134282
|
if (!apiUrl) return path;
|
|
131895
134283
|
return (apiUrl.endsWith("/") ? apiUrl.slice(0, -1) : apiUrl) + (path.startsWith("/") ? path : `/${path}`);
|
|
@@ -131915,6 +134303,7 @@ function serverRequestApi(baseUrl, getHeaders) {
|
|
|
131915
134303
|
Object.assign(responseHeaders, globalHeaders);
|
|
131916
134304
|
}
|
|
131917
134305
|
if (request.body) responseHeaders["Content-Type"] = "application/json";
|
|
134306
|
+
addViewRequestHeader(method, responseHeaders);
|
|
131918
134307
|
const response = await fetch(url, {
|
|
131919
134308
|
method,
|
|
131920
134309
|
headers: responseHeaders,
|
|
@@ -131950,6 +134339,7 @@ function serverRequestApi(baseUrl, getHeaders) {
|
|
|
131950
134339
|
Object.assign(requestHeaders, globalHeaders);
|
|
131951
134340
|
}
|
|
131952
134341
|
if (body) requestHeaders["Content-Type"] = "application/json";
|
|
134342
|
+
addViewRequestHeader(method, requestHeaders);
|
|
131953
134343
|
const response = await fetch(url, {
|
|
131954
134344
|
method,
|
|
131955
134345
|
headers: requestHeaders,
|
|
@@ -131978,6 +134368,7 @@ function serverRequestApi(baseUrl, getHeaders) {
|
|
|
131978
134368
|
const globalHeaders = await getHeaders();
|
|
131979
134369
|
Object.assign(headers, globalHeaders);
|
|
131980
134370
|
}
|
|
134371
|
+
addViewRequestHeader(method, headers);
|
|
131981
134372
|
const response = await fetch(url, {
|
|
131982
134373
|
method,
|
|
131983
134374
|
headers,
|
|
@@ -132294,7 +134685,7 @@ var EditMetadataDialog = ({ showing, setShowing, currentMetadata, logFile, onSav
|
|
|
132294
134685
|
}), /* @__PURE__ */ jsx("button", {
|
|
132295
134686
|
type: "button",
|
|
132296
134687
|
className: clsx("btn", "btn-primary", "text-size-smaller"),
|
|
132297
|
-
onClick: handleSave,
|
|
134688
|
+
onClick: () => void handleSave(),
|
|
132298
134689
|
disabled: !canSave,
|
|
132299
134690
|
children: submitting ? "Saving…" : "Save"
|
|
132300
134691
|
})]
|
|
@@ -132700,8 +135091,8 @@ var DownloadButton = ({ label, fileName, fileContents }) => {
|
|
|
132700
135091
|
const api = useApi();
|
|
132701
135092
|
return /* @__PURE__ */ jsx("button", {
|
|
132702
135093
|
className: "btn btn-outline-primary download-button",
|
|
132703
|
-
onClick:
|
|
132704
|
-
|
|
135094
|
+
onClick: () => {
|
|
135095
|
+
api.download_file(fileName, fileContents);
|
|
132705
135096
|
},
|
|
132706
135097
|
children: label
|
|
132707
135098
|
});
|
|
@@ -133202,6 +135593,7 @@ var SampleList = memo((props) => {
|
|
|
133202
135593
|
]
|
|
133203
135594
|
});
|
|
133204
135595
|
});
|
|
135596
|
+
SampleList.displayName = "SampleList";
|
|
133205
135597
|
var SamplesViewOptionsPopover_module_default = {
|
|
133206
135598
|
container: "_container_1tduz_1",
|
|
133207
135599
|
row: "_row_1tduz_8",
|
|
@@ -136904,7 +139296,7 @@ function add(elt, child) {
|
|
|
136904
139296
|
else throw new RangeError("Unsupported child node: " + child);
|
|
136905
139297
|
}
|
|
136906
139298
|
//#endregion
|
|
136907
|
-
//#region ../../node_modules/.pnpm/@codemirror+view@6.43.
|
|
139299
|
+
//#region ../../node_modules/.pnpm/@codemirror+view@6.43.1/node_modules/@codemirror/view/dist/index.js
|
|
136908
139300
|
var nav = typeof navigator != "undefined" ? navigator : {
|
|
136909
139301
|
userAgent: "",
|
|
136910
139302
|
vendor: "",
|
|
@@ -139058,6 +141450,7 @@ var TileUpdate = class {
|
|
|
139058
141450
|
if (composition && next.fromA <= composition.range.fromA && next.toA >= composition.range.toA) {
|
|
139059
141451
|
this.forward(next.fromA, composition.range.fromA, composition.range.fromA < composition.range.toA ? 1 : -1);
|
|
139060
141452
|
this.emit(posB, composition.range.fromB);
|
|
141453
|
+
this.builder.flushBuffer();
|
|
139061
141454
|
this.cache.clear();
|
|
139062
141455
|
this.builder.addComposition(composition, compositionContext);
|
|
139063
141456
|
this.text.skip(composition.range.toB - composition.range.fromB);
|
|
@@ -140099,6 +142492,10 @@ var InlineCoordsScan = class {
|
|
|
140099
142492
|
}
|
|
140100
142493
|
}
|
|
140101
142494
|
if (!closestRect) {
|
|
142495
|
+
if (!below && !above) return {
|
|
142496
|
+
i: positions[0],
|
|
142497
|
+
after: false
|
|
142498
|
+
};
|
|
140102
142499
|
let side = above && (!below || this.y - above.bottom < below.top - this.y) ? above : below;
|
|
140103
142500
|
this.y = (side.top + side.bottom) / 2;
|
|
140104
142501
|
return this.scan(positions, getRects, true);
|
|
@@ -142491,6 +144888,7 @@ var baseTheme$1$1 = /*@__PURE__*/ buildTheme("." + baseThemeID, {
|
|
|
142491
144888
|
padding: "0 2px 0 6px"
|
|
142492
144889
|
},
|
|
142493
144890
|
".cm-layer": {
|
|
144891
|
+
userSelect: "none",
|
|
142494
144892
|
position: "absolute",
|
|
142495
144893
|
left: 0,
|
|
142496
144894
|
top: 0,
|
|
@@ -151107,7 +153505,7 @@ var completionKeymap = [
|
|
|
151107
153505
|
];
|
|
151108
153506
|
var completionKeymapExt = /*@__PURE__*/ Prec.highest(/*@__PURE__*/ keymap.computeN([completionConfig], (state) => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : []));
|
|
151109
153507
|
//#endregion
|
|
151110
|
-
//#region ../../node_modules/.pnpm/@codemirror+lint@6.9.
|
|
153508
|
+
//#region ../../node_modules/.pnpm/@codemirror+lint@6.9.7/node_modules/@codemirror/lint/dist/index.js
|
|
151111
153509
|
var SelectedDiagnostic = class {
|
|
151112
153510
|
constructor(from, to, diagnostic) {
|
|
151113
153511
|
this.from = from;
|
|
@@ -151271,7 +153669,7 @@ function lintTooltip(view, pos, side) {
|
|
|
151271
153669
|
return {
|
|
151272
153670
|
pos: start,
|
|
151273
153671
|
end,
|
|
151274
|
-
above:
|
|
153672
|
+
above: true,
|
|
151275
153673
|
create() {
|
|
151276
153674
|
return { dom: diagnosticsTooltip(view, found) };
|
|
151277
153675
|
}
|
|
@@ -155003,11 +157401,11 @@ var makeMetadataValueCompletion = (value) => {
|
|
|
155003
157401
|
if (typeof value === "string") label = `"${value}"`;
|
|
155004
157402
|
else if (typeof value === "boolean") label = value ? "True" : "False";
|
|
155005
157403
|
else if (value === null) label = "None";
|
|
155006
|
-
else label =
|
|
157404
|
+
else label = valueAsString(value);
|
|
155007
157405
|
return {
|
|
155008
157406
|
label,
|
|
155009
157407
|
type: "text",
|
|
155010
|
-
info: `Metadata value: ${value}`,
|
|
157408
|
+
info: `Metadata value: ${String(value)}`,
|
|
155011
157409
|
boost: 25
|
|
155012
157410
|
};
|
|
155013
157411
|
};
|
|
@@ -155181,7 +157579,7 @@ function getCompletions(context, filterItems, samples) {
|
|
|
155181
157579
|
const metadataValues = Array.from(getMetadataPropertyValues(samples, metadataPropertyPath));
|
|
155182
157580
|
const currentQuery = currentToken?.text || "";
|
|
155183
157581
|
return makeCompletions((currentQuery ? metadataValues.filter((value) => {
|
|
155184
|
-
return (typeof value === "string" ? `"${value}"` : typeof value === "boolean" ? value ? "True" : "False" : value === null ? "None" :
|
|
157582
|
+
return (typeof value === "string" ? `"${value}"` : typeof value === "boolean" ? value ? "True" : "False" : value === null ? "None" : valueAsString(value)).toLowerCase().startsWith(currentQuery.toLowerCase());
|
|
155185
157583
|
}) : metadataValues).map(makeMetadataValueCompletion), { includeDefault: false });
|
|
155186
157584
|
}
|
|
155187
157585
|
if (varName === "id" && samples) {
|
|
@@ -156676,7 +159074,7 @@ function buildScoreColumns(ctx) {
|
|
|
156676
159074
|
filter: isNumeric ? "agNumberColumnFilter" : "agTextColumnFilter",
|
|
156677
159075
|
resizable: true,
|
|
156678
159076
|
cellStyle,
|
|
156679
|
-
comparator: isNumeric ? comparators.number : (a, b) =>
|
|
159077
|
+
comparator: isNumeric ? comparators.number : (a, b) => valueAsString(a ?? "").localeCompare(valueAsString(b ?? "")),
|
|
156680
159078
|
valueGetter: (params) => {
|
|
156681
159079
|
const data = params.data?.data;
|
|
156682
159080
|
if (!data) return void 0;
|
|
@@ -156743,7 +159141,7 @@ function buildScoreColumns(ctx) {
|
|
|
156743
159141
|
if (typeof v === "number") return v.toFixed(3);
|
|
156744
159142
|
return String(v);
|
|
156745
159143
|
},
|
|
156746
|
-
comparator: isUniformNumber ? comparators.number : (a, b) =>
|
|
159144
|
+
comparator: isUniformNumber ? comparators.number : (a, b) => valueAsString(a ?? "").localeCompare(valueAsString(b ?? ""))
|
|
156747
159145
|
};
|
|
156748
159146
|
});
|
|
156749
159147
|
}
|
|
@@ -157398,7 +159796,7 @@ var EditTagsDialog = ({ showing, setShowing, currentTags, logFile, onSaved }) =>
|
|
|
157398
159796
|
}), /* @__PURE__ */ jsx("button", {
|
|
157399
159797
|
type: "button",
|
|
157400
159798
|
className: clsx("btn", "btn-primary", "text-size-smaller"),
|
|
157401
|
-
onClick: handleSave,
|
|
159799
|
+
onClick: () => void handleSave(),
|
|
157402
159800
|
disabled: !canSave,
|
|
157403
159801
|
children: submitting ? "Saving…" : "Save"
|
|
157404
159802
|
})]
|
|
@@ -157630,10 +160028,14 @@ var TaskTab = ({ evalSpec, evalStats, earlyStopping, tags }) => {
|
|
|
157630
160028
|
["Task ID"]: evalSpec?.task_id,
|
|
157631
160029
|
["Run ID"]: evalSpec?.run_id
|
|
157632
160030
|
};
|
|
157633
|
-
if (revision)
|
|
157634
|
-
|
|
157635
|
-
|
|
157636
|
-
|
|
160031
|
+
if (revision) {
|
|
160032
|
+
const revisionKey = `${revision.type ? `${toTitleCase(revision.type)} ` : ""}Revision`;
|
|
160033
|
+
const commitUrl = ghCommitUrl(revision.origin, revision.commit);
|
|
160034
|
+
taskInformation[revisionKey] = commitUrl ? { _html: /* @__PURE__ */ jsx("a", {
|
|
160035
|
+
href: commitUrl,
|
|
160036
|
+
children: revision.commit
|
|
160037
|
+
}) } : revision.commit;
|
|
160038
|
+
}
|
|
157637
160039
|
if (packages) {
|
|
157638
160040
|
const names = Object.keys(packages).map((key) => {
|
|
157639
160041
|
return `${key} ${packages[key]}`;
|
|
@@ -157731,14 +160133,14 @@ var metricDisplayName = (metric) => {
|
|
|
157731
160133
|
};
|
|
157732
160134
|
var clusterMetricModifier = (metric) => {
|
|
157733
160135
|
if (metric.name !== "stderr") return;
|
|
157734
|
-
const clusterValue =
|
|
160136
|
+
const clusterValue = metric.params?.["cluster"];
|
|
157735
160137
|
if (clusterValue === void 0 || typeof clusterValue !== "string") return;
|
|
157736
160138
|
return clusterValue;
|
|
157737
160139
|
};
|
|
157738
160140
|
var groupMetricModifier = (metric) => {
|
|
157739
|
-
const groupKey =
|
|
160141
|
+
const groupKey = metric.params?.["group_key"];
|
|
157740
160142
|
if (groupKey === void 0 || typeof groupKey !== "string") return;
|
|
157741
|
-
const metricRaw =
|
|
160143
|
+
const metricRaw = metric.params?.["metric"];
|
|
157742
160144
|
if (metricRaw === void 0 || typeof metricRaw !== "object") return;
|
|
157743
160145
|
return metricRaw["name"];
|
|
157744
160146
|
};
|
|
@@ -158362,7 +160764,7 @@ var DownloadLogButton = ({ log_file, className = "", ariaLabel = "Download log a
|
|
|
158362
160764
|
return /* @__PURE__ */ jsx("button", {
|
|
158363
160765
|
type: "button",
|
|
158364
160766
|
className: clsx("download-log-button", DownloadLogButton_module_default.downloadLogButton, className),
|
|
158365
|
-
onClick: handleClick,
|
|
160767
|
+
onClick: () => void handleClick(),
|
|
158366
160768
|
"aria-label": ariaLabel,
|
|
158367
160769
|
disabled: downloadState !== "idle",
|
|
158368
160770
|
children: /* @__PURE__ */ jsx("i", {
|
|
@@ -158666,7 +161068,7 @@ var ParamSummary = ({ params }) => {
|
|
|
158666
161068
|
const paraValues = Object.keys(params).map((key) => {
|
|
158667
161069
|
const val = params[key];
|
|
158668
161070
|
if (Array.isArray(val) || typeof val === "object") return `${key}: ${JSON.stringify(val)}`;
|
|
158669
|
-
else return `${key}: ${
|
|
161071
|
+
else return `${key}: ${valueAsString(val)}`;
|
|
158670
161072
|
});
|
|
158671
161073
|
if (paraValues.length > 0) return /* @__PURE__ */ jsx("code", {
|
|
158672
161074
|
style: {
|
|
@@ -159861,7 +162263,7 @@ var AppContent = () => {
|
|
|
159861
162263
|
};
|
|
159862
162264
|
if (selectedLogDetails?.status === "started") doPoll();
|
|
159863
162265
|
}, [pollLog, selectedLogDetails?.status]);
|
|
159864
|
-
const onMessage = useCallback(
|
|
162266
|
+
const onMessage = useCallback((e) => {
|
|
159865
162267
|
switch (e.data.type) {
|
|
159866
162268
|
case "updateState":
|
|
159867
162269
|
if (e.data.url) {
|
|
@@ -161233,10 +163635,11 @@ function getZstdWorker() {
|
|
|
161233
163635
|
blobURL = URL.createObjectURL(blob);
|
|
161234
163636
|
zstdWorker = new Worker(blobURL);
|
|
161235
163637
|
const initHandler = (event) => {
|
|
161236
|
-
|
|
163638
|
+
const message = event.data;
|
|
163639
|
+
if (message.type === "init_complete") {
|
|
161237
163640
|
zstdWorker.removeEventListener("message", initHandler);
|
|
161238
|
-
if (
|
|
161239
|
-
else reject(new Error(
|
|
163641
|
+
if (message.success) resolve(zstdWorker);
|
|
163642
|
+
else reject(new Error(message.error || "Worker initialization failed"));
|
|
161240
163643
|
}
|
|
161241
163644
|
};
|
|
161242
163645
|
zstdWorker.addEventListener("message", initHandler);
|
|
@@ -161277,7 +163680,7 @@ async function decompressZstd(data) {
|
|
|
161277
163680
|
const pending = pendingRequests.get(respId);
|
|
161278
163681
|
if (!pending) return;
|
|
161279
163682
|
pendingRequests.delete(respId);
|
|
161280
|
-
if (success) pending.resolve(resultData);
|
|
163683
|
+
if (success && resultData) pending.resolve(resultData);
|
|
161281
163684
|
else pending.reject(new Error(error || "Decompression failed"));
|
|
161282
163685
|
});
|
|
161283
163686
|
worker.addEventListener("error", (error) => {
|
|
@@ -161449,7 +163852,7 @@ var openRemoteZipFile = async (url, contentLength, fetchBytes = fetchRange) => {
|
|
|
161449
163852
|
/**
|
|
161450
163853
|
* Opens an in-memory ZIP buffer and provides a method to read files within it.
|
|
161451
163854
|
*/
|
|
161452
|
-
var openZipFileFromBuffer =
|
|
163855
|
+
var openZipFileFromBuffer = (bytes) => {
|
|
161453
163856
|
const contentLength = bytes.length;
|
|
161454
163857
|
if (contentLength < 22) throw new Error("Buffer too small to be a ZIP file");
|
|
161455
163858
|
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
@@ -161466,7 +163869,7 @@ var openZipFileFromBuffer = async (bytes) => {
|
|
|
161466
163869
|
centralDirOffset = Number(view.getBigUint64(zip64EOCDOffset + 48, true));
|
|
161467
163870
|
}
|
|
161468
163871
|
const centralDirectory = parseCentralDirectory(bytes.slice(centralDirOffset, centralDirOffset + centralDirSize));
|
|
161469
|
-
return {
|
|
163872
|
+
return Promise.resolve({
|
|
161470
163873
|
centralDirectory,
|
|
161471
163874
|
readFile: async (file, maxBytes) => {
|
|
161472
163875
|
const entry = centralDirectory.get(file);
|
|
@@ -161479,7 +163882,7 @@ var openZipFileFromBuffer = async (bytes) => {
|
|
|
161479
163882
|
const zipFileEntry = await parseZipFileEntry(file, bytes.slice(entry.fileOffset, entry.fileOffset + totalSize));
|
|
161480
163883
|
return decompressData(zipFileEntry.data, zipFileEntry.compressionMethod, zipFileEntry.uncompressedSize, file);
|
|
161481
163884
|
}
|
|
161482
|
-
};
|
|
163885
|
+
});
|
|
161483
163886
|
};
|
|
161484
163887
|
var fetchSize = async (url) => {
|
|
161485
163888
|
const acceptResponse = await fetch(url, { method: "HEAD" });
|
|
@@ -161505,7 +163908,7 @@ var fetchSize = async (url) => {
|
|
|
161505
163908
|
/**
|
|
161506
163909
|
* Extracts and parses the header and data of a compressed ZIP entry from raw binary data.
|
|
161507
163910
|
*/
|
|
161508
|
-
var parseZipFileEntry =
|
|
163911
|
+
var parseZipFileEntry = (file, rawData) => {
|
|
161509
163912
|
const view = new DataView(rawData.buffer);
|
|
161510
163913
|
let offset = 0;
|
|
161511
163914
|
if (view.getUint32(offset, true) !== 67324752) throw new Error(`Invalid ZIP entry signature for ${file}`);
|
|
@@ -161549,7 +163952,7 @@ var parseZipFileEntry = async (file, rawData) => {
|
|
|
161549
163952
|
}
|
|
161550
163953
|
offset += filenameLength + extraFieldLength;
|
|
161551
163954
|
const data = rawData.subarray(offset, offset + compressedSize);
|
|
161552
|
-
return {
|
|
163955
|
+
return Promise.resolve({
|
|
161553
163956
|
versionNeeded,
|
|
161554
163957
|
bitFlag,
|
|
161555
163958
|
compressionMethod,
|
|
@@ -161559,7 +163962,7 @@ var parseZipFileEntry = async (file, rawData) => {
|
|
|
161559
163962
|
filenameLength,
|
|
161560
163963
|
extraFieldLength,
|
|
161561
163964
|
data
|
|
161562
|
-
};
|
|
163965
|
+
});
|
|
161563
163966
|
};
|
|
161564
163967
|
var kFileHeaderSize = 46;
|
|
161565
163968
|
/**
|
|
@@ -161688,14 +164091,14 @@ var openRemoteLogFile = async (api, url, concurrency) => {
|
|
|
161688
164091
|
/**
|
|
161689
164092
|
* Lists all samples in the zip file.
|
|
161690
164093
|
*/
|
|
161691
|
-
const listSamples =
|
|
161692
|
-
return Array.from(remoteZipFile.centralDirectory.keys()).filter((filename) => filename.startsWith("samples/") && filename.endsWith(".json")).map((filename) => {
|
|
164094
|
+
const listSamples = () => {
|
|
164095
|
+
return Promise.resolve(Array.from(remoteZipFile.centralDirectory.keys()).filter((filename) => filename.startsWith("samples/") && filename.endsWith(".json")).map((filename) => {
|
|
161693
164096
|
const [sampleId, epochStr] = filename.split("/")[1].split("_epoch_");
|
|
161694
164097
|
return {
|
|
161695
164098
|
sampleId,
|
|
161696
164099
|
epoch: parseInt(epochStr.split(".")[0], 10)
|
|
161697
164100
|
};
|
|
161698
|
-
});
|
|
164101
|
+
}));
|
|
161699
164102
|
};
|
|
161700
164103
|
/**
|
|
161701
164104
|
* Reads a specific sample file.
|
|
@@ -162275,8 +164678,9 @@ function staticHttpApiForLog(logInfo) {
|
|
|
162275
164678
|
else return false;
|
|
162276
164679
|
});
|
|
162277
164680
|
},
|
|
162278
|
-
log_message:
|
|
164681
|
+
log_message: (log_file, message) => {
|
|
162279
164682
|
console.log(`[CLIENT MESSAGE] (${log_file}): ${message}`);
|
|
164683
|
+
return Promise.resolve();
|
|
162280
164684
|
},
|
|
162281
164685
|
get_log_contents: async (log_file, _headerOnly, _capabilities) => {
|
|
162282
164686
|
const response = await fetchLogFile(log_file);
|
|
@@ -162319,7 +164723,7 @@ function staticHttpApiForLog(logInfo) {
|
|
|
162319
164723
|
}
|
|
162320
164724
|
throw new Error(`Failed to load a listing file using the directory: ${log_dir}. Please be sure you have deployed a manifest file (listing.json).`);
|
|
162321
164725
|
},
|
|
162322
|
-
get_app_config:
|
|
164726
|
+
get_app_config: () => Promise.resolve(app_config),
|
|
162323
164727
|
download_file,
|
|
162324
164728
|
open_log_file
|
|
162325
164729
|
};
|
|
@@ -162484,10 +164888,11 @@ function viewServerApi(options = {}) {
|
|
|
162484
164888
|
const params = new URLSearchParams();
|
|
162485
164889
|
params.append("log_file", log_file);
|
|
162486
164890
|
params.append("message", message);
|
|
162487
|
-
await requestApi.fetchType("
|
|
164891
|
+
await requestApi.fetchType("POST", `/log-message?${params.toString()}`, {
|
|
162488
164892
|
headers: { "Content-Type": "text/plain" },
|
|
162489
|
-
parse:
|
|
164893
|
+
parse: (text) => {
|
|
162490
164894
|
if (text !== "") throw new Error(`Unexpected response from log_message: ${text}`);
|
|
164895
|
+
return Promise.resolve();
|
|
162491
164896
|
}
|
|
162492
164897
|
});
|
|
162493
164898
|
};
|
|
@@ -162576,6 +164981,7 @@ function viewServerApi(options = {}) {
|
|
|
162576
164981
|
};
|
|
162577
164982
|
if (if_match_etag) headers["If-Match"] = if_match_etag;
|
|
162578
164983
|
if (headerProvider) Object.assign(headers, await headerProvider());
|
|
164984
|
+
headers[VIEW_REQUEST_HEADER] = VIEW_REQUEST_HEADER_VALUE;
|
|
162579
164985
|
const isCrossOrigin = Boolean(apiBaseUrl && (() => {
|
|
162580
164986
|
try {
|
|
162581
164987
|
return new URL(apiBaseUrl).origin !== window.location.origin;
|
|
@@ -162626,7 +165032,7 @@ function viewServerApi(options = {}) {
|
|
|
162626
165032
|
throw error;
|
|
162627
165033
|
}
|
|
162628
165034
|
};
|
|
162629
|
-
const download_log =
|
|
165035
|
+
const download_log = (log_file) => {
|
|
162630
165036
|
const url = `${apiBaseUrl || "/api"}/log-download/${encodeURIComponent(log_file)}`;
|
|
162631
165037
|
const link = document.createElement("a");
|
|
162632
165038
|
link.href = url;
|
|
@@ -162634,6 +165040,7 @@ function viewServerApi(options = {}) {
|
|
|
162634
165040
|
document.body.appendChild(link);
|
|
162635
165041
|
link.click();
|
|
162636
165042
|
document.body.removeChild(link);
|
|
165043
|
+
return Promise.resolve();
|
|
162637
165044
|
};
|
|
162638
165045
|
return {
|
|
162639
165046
|
client_events,
|