@cartanova/qgrid-cli 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/application/qgrid/pool.js +15 -6
- package/bundle/dist/application/qgrid/qgrid.frame.js +17 -22
- package/bundle/dist/application/qgrid/qgrid.types.js +5 -2
- package/bundle/dist/application/request-log/request-log.model.js +2 -2
- package/bundle/dist/sonamu.config.js +5 -2
- package/bundle/src/application/qgrid/pool.ts +17 -7
- package/bundle/src/application/qgrid/qgrid.frame.ts +18 -25
- package/bundle/src/application/qgrid/qgrid.types.ts +1 -1
- package/bundle/src/application/request-log/request-log.model.ts +2 -2
- package/bundle/src/sonamu.config.ts +1 -1
- package/bundle/web-dist/{web-dist/client/assets/index-DlPchHBY.js → client/assets/index-C0m8rRjO.js} +2 -2
- package/bundle/web-dist/client/assets/{routes-CagDz23B.js → routes-B1eOXnpo.js} +1 -1
- package/bundle/web-dist/client/assets/{show-aXUGa0gm.js → show-BztN6MXO.js} +1 -1
- package/bundle/web-dist/client/assets/tokens-rR2_-Pte.js +1 -0
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/assets/{tokens-JH6FsnWZ.js → tokens-ARL5AOAh.js} +4 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/dist/cli.js +34 -25
- package/package.json +10 -10
- package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +0 -9
- package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +0 -6
- package/bundle/dist/dist/_virtual/_rolldown/runtime.js +0 -15
- package/bundle/dist/dist/application/qgrid/oauth.js +0 -140
- package/bundle/dist/dist/application/qgrid/pool.js +0 -100
- package/bundle/dist/dist/application/qgrid/qgrid.frame.js +0 -280
- package/bundle/dist/dist/application/qgrid/qgrid.types.js +0 -79
- package/bundle/dist/dist/application/qgrid/worker.js +0 -183
- package/bundle/dist/dist/application/queries.generated.js +0 -31
- package/bundle/dist/dist/application/request-log/request-log.model.js +0 -113
- package/bundle/dist/dist/application/request-log/request-log.types.js +0 -13
- package/bundle/dist/dist/application/sonamu.generated.js +0 -99
- package/bundle/dist/dist/application/sonamu.generated.sso.js +0 -34
- package/bundle/dist/dist/application/token/token.model.js +0 -157
- package/bundle/dist/dist/application/token/token.types.js +0 -22
- package/bundle/dist/dist/i18n/en.js +0 -63
- package/bundle/dist/dist/i18n/ko.js +0 -62
- package/bundle/dist/dist/i18n/sd.generated.js +0 -272
- package/bundle/dist/dist/index.js +0 -11
- package/bundle/dist/dist/migrations/20260410171405_create__request_logs.js +0 -26
- package/bundle/dist/dist/migrations/20260410171406_create__tokens.js +0 -24
- package/bundle/dist/dist/migrations/20260411120624_alter_tokens_alter2.js +0 -16
- package/bundle/dist/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -155
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +0 -1484
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2746
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +0 -662
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -82
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +0 -48
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +0 -1307
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +0 -558
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +0 -33
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +0 -226
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +0 -374
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +0 -37
- package/bundle/dist/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2886
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
- package/bundle/dist/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1127
- package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
- package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
- package/bundle/dist/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -506
- package/bundle/dist/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -86
- package/bundle/dist/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +0 -426
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -6
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +0 -16
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -59
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +0 -2910
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -44
- package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js +0 -28
- package/bundle/dist/dist/sonamu.config.js +0 -196
- package/bundle/dist/dist/testing/fixture.js +0 -8
- package/bundle/dist/dist/testing/global.js +0 -9
- package/bundle/dist/dist/testing/setup-mocks.js +0 -17
- package/bundle/dist/dist/utils/subset-loaders.js +0 -12
- package/bundle/src/src/application/qgrid/oauth.ts +0 -181
- package/bundle/src/src/application/qgrid/pool.ts +0 -132
- package/bundle/src/src/application/qgrid/qgrid.frame.ts +0 -275
- package/bundle/src/src/application/qgrid/qgrid.types.ts +0 -117
- package/bundle/src/src/application/qgrid/worker.ts +0 -234
- package/bundle/src/src/application/queries.generated.ts +0 -59
- package/bundle/src/src/application/request-log/request-log.entity.json +0 -75
- package/bundle/src/src/application/request-log/request-log.model.ts +0 -155
- package/bundle/src/src/application/request-log/request-log.types.ts +0 -15
- package/bundle/src/src/application/sonamu.generated.http +0 -187
- package/bundle/src/src/application/sonamu.generated.sso.ts +0 -66
- package/bundle/src/src/application/sonamu.generated.ts +0 -135
- package/bundle/src/src/application/token/token.entity.json +0 -37
- package/bundle/src/src/application/token/token.model.ts +0 -160
- package/bundle/src/src/application/token/token.types.ts +0 -26
- package/bundle/src/src/i18n/en.ts +0 -59
- package/bundle/src/src/i18n/ko.ts +0 -59
- package/bundle/src/src/i18n/sd.generated.ts +0 -384
- package/bundle/src/src/index.ts +0 -6
- package/bundle/src/src/migrations/20260410171405_create__request_logs.ts +0 -23
- package/bundle/src/src/migrations/20260410171406_create__tokens.ts +0 -21
- package/bundle/src/src/migrations/20260411120624_alter_tokens_alter2.ts +0 -15
- package/bundle/src/src/sonamu.config.ts +0 -248
- package/bundle/src/src/testing/fixture.ts +0 -6
- package/bundle/src/src/testing/global.ts +0 -6
- package/bundle/src/src/testing/setup-mocks.ts +0 -44
- package/bundle/src/src/typings/fastify.d.ts +0 -8
- package/bundle/src/src/typings/sonamu.d.ts +0 -17
- package/bundle/src/src/utils/subset-loaders.ts +0 -11
- package/bundle/web-dist/client/assets/index-DlPchHBY.js +0 -116
- package/bundle/web-dist/client/assets/tokens-DRkXtZ3Q.js +0 -1
- package/bundle/web-dist/web-dist/client/assets/index-vZsvyuFn.css +0 -1
- package/bundle/web-dist/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +0 -1
- package/bundle/web-dist/web-dist/client/assets/routes-CagDz23B.js +0 -1
- package/bundle/web-dist/web-dist/client/assets/sd.generated-BrQoQXvv.js +0 -47
- package/bundle/web-dist/web-dist/client/assets/services.generated-BspO2L0j.js +0 -1
- package/bundle/web-dist/web-dist/client/assets/show-aXUGa0gm.js +0 -29
- package/bundle/web-dist/web-dist/client/assets/tokens-DRkXtZ3Q.js +0 -1
- package/bundle/web-dist/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
- package/bundle/web-dist/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +0 -1
- package/bundle/web-dist/web-dist/client/index.html +0 -18
- package/bundle/web-dist/web-dist/server/assets/react-dom-CGIzOSuj.js +0 -335
- package/bundle/web-dist/web-dist/server/assets/routes-ClzReRep.js +0 -490
- package/bundle/web-dist/web-dist/server/assets/sd.generated-BnonqqKr.js +0 -21694
- package/bundle/web-dist/web-dist/server/assets/services.generated-D5ABD5fr.js +0 -836
- package/bundle/web-dist/web-dist/server/assets/show-C9pcdSxc.js +0 -23364
- package/bundle/web-dist/web-dist/server/assets/tokens-JH6FsnWZ.js +0 -860
- package/bundle/web-dist/web-dist/server/entry-server.generated.js +0 -44646
|
@@ -1,558 +0,0 @@
|
|
|
1
|
-
import { createDOMElementFilter, format as format$1, plugins } from "../../../../../@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js";
|
|
2
|
-
//#region ../../node_modules/.pnpm/@vitest+utils@4.1.2/node_modules/@vitest/utils/dist/display.js
|
|
3
|
-
const ansiColors = {
|
|
4
|
-
bold: ["1", "22"],
|
|
5
|
-
dim: ["2", "22"],
|
|
6
|
-
italic: ["3", "23"],
|
|
7
|
-
underline: ["4", "24"],
|
|
8
|
-
inverse: ["7", "27"],
|
|
9
|
-
hidden: ["8", "28"],
|
|
10
|
-
strike: ["9", "29"],
|
|
11
|
-
black: ["30", "39"],
|
|
12
|
-
red: ["31", "39"],
|
|
13
|
-
green: ["32", "39"],
|
|
14
|
-
yellow: ["33", "39"],
|
|
15
|
-
blue: ["34", "39"],
|
|
16
|
-
magenta: ["35", "39"],
|
|
17
|
-
cyan: ["36", "39"],
|
|
18
|
-
white: ["37", "39"],
|
|
19
|
-
brightblack: ["30;1", "39"],
|
|
20
|
-
brightred: ["31;1", "39"],
|
|
21
|
-
brightgreen: ["32;1", "39"],
|
|
22
|
-
brightyellow: ["33;1", "39"],
|
|
23
|
-
brightblue: ["34;1", "39"],
|
|
24
|
-
brightmagenta: ["35;1", "39"],
|
|
25
|
-
brightcyan: ["36;1", "39"],
|
|
26
|
-
brightwhite: ["37;1", "39"],
|
|
27
|
-
grey: ["90", "39"]
|
|
28
|
-
};
|
|
29
|
-
const styles = {
|
|
30
|
-
special: "cyan",
|
|
31
|
-
number: "yellow",
|
|
32
|
-
bigint: "yellow",
|
|
33
|
-
boolean: "yellow",
|
|
34
|
-
undefined: "grey",
|
|
35
|
-
null: "bold",
|
|
36
|
-
string: "green",
|
|
37
|
-
symbol: "green",
|
|
38
|
-
date: "magenta",
|
|
39
|
-
regexp: "red"
|
|
40
|
-
};
|
|
41
|
-
const truncator = "…";
|
|
42
|
-
function colorise(value, styleType) {
|
|
43
|
-
const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
|
|
44
|
-
if (!color) return String(value);
|
|
45
|
-
return `\u001b[${color[0]}m${String(value)}\u001b[${color[1]}m`;
|
|
46
|
-
}
|
|
47
|
-
function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate = Infinity, stylize = String } = {}, inspect) {
|
|
48
|
-
const options = {
|
|
49
|
-
showHidden: Boolean(showHidden),
|
|
50
|
-
depth: Number(depth),
|
|
51
|
-
colors: Boolean(colors),
|
|
52
|
-
customInspect: Boolean(customInspect),
|
|
53
|
-
showProxy: Boolean(showProxy),
|
|
54
|
-
maxArrayLength: Number(maxArrayLength),
|
|
55
|
-
breakLength: Number(breakLength),
|
|
56
|
-
truncate: Number(truncate),
|
|
57
|
-
seen,
|
|
58
|
-
inspect,
|
|
59
|
-
stylize
|
|
60
|
-
};
|
|
61
|
-
if (options.colors) options.stylize = colorise;
|
|
62
|
-
return options;
|
|
63
|
-
}
|
|
64
|
-
function isHighSurrogate(char) {
|
|
65
|
-
return char >= "\ud800" && char <= "\udbff";
|
|
66
|
-
}
|
|
67
|
-
function truncate(string, length, tail = truncator) {
|
|
68
|
-
string = String(string);
|
|
69
|
-
const tailLength = tail.length;
|
|
70
|
-
const stringLength = string.length;
|
|
71
|
-
if (tailLength > length && stringLength > tailLength) return tail;
|
|
72
|
-
if (stringLength > length && stringLength > tailLength) {
|
|
73
|
-
let end = length - tailLength;
|
|
74
|
-
if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
|
|
75
|
-
return `${string.slice(0, end)}${tail}`;
|
|
76
|
-
}
|
|
77
|
-
return string;
|
|
78
|
-
}
|
|
79
|
-
function inspectList(list, options, inspectItem, separator = ", ") {
|
|
80
|
-
inspectItem = inspectItem || options.inspect;
|
|
81
|
-
const size = list.length;
|
|
82
|
-
if (size === 0) return "";
|
|
83
|
-
const originalLength = options.truncate;
|
|
84
|
-
let output = "";
|
|
85
|
-
let peek = "";
|
|
86
|
-
let truncated = "";
|
|
87
|
-
for (let i = 0; i < size; i += 1) {
|
|
88
|
-
const last = i + 1 === list.length;
|
|
89
|
-
const secondToLast = i + 2 === list.length;
|
|
90
|
-
truncated = `${truncator}(${list.length - i})`;
|
|
91
|
-
const value = list[i];
|
|
92
|
-
options.truncate = originalLength - output.length - (last ? 0 : separator.length);
|
|
93
|
-
const string = peek || inspectItem(value, options) + (last ? "" : separator);
|
|
94
|
-
const nextLength = output.length + string.length;
|
|
95
|
-
const truncatedLength = nextLength + truncated.length;
|
|
96
|
-
if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
|
|
97
|
-
if (!last && !secondToLast && truncatedLength > originalLength) break;
|
|
98
|
-
peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
|
|
99
|
-
if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
|
|
100
|
-
output += string;
|
|
101
|
-
if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
|
|
102
|
-
truncated = `${truncator}(${list.length - i - 1})`;
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
truncated = "";
|
|
106
|
-
}
|
|
107
|
-
return `${output}${truncated}`;
|
|
108
|
-
}
|
|
109
|
-
function quoteComplexKey(key) {
|
|
110
|
-
if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
|
|
111
|
-
return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
|
|
112
|
-
}
|
|
113
|
-
function inspectProperty([key, value], options) {
|
|
114
|
-
options.truncate -= 2;
|
|
115
|
-
if (typeof key === "string") key = quoteComplexKey(key);
|
|
116
|
-
else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
|
|
117
|
-
options.truncate -= key.length;
|
|
118
|
-
value = options.inspect(value, options);
|
|
119
|
-
return `${key}: ${value}`;
|
|
120
|
-
}
|
|
121
|
-
function inspectArray(array, options) {
|
|
122
|
-
const nonIndexProperties = Object.keys(array).slice(array.length);
|
|
123
|
-
if (!array.length && !nonIndexProperties.length) return "[]";
|
|
124
|
-
options.truncate -= 4;
|
|
125
|
-
const listContents = inspectList(array, options);
|
|
126
|
-
options.truncate -= listContents.length;
|
|
127
|
-
let propertyContents = "";
|
|
128
|
-
if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
|
|
129
|
-
return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
|
|
130
|
-
}
|
|
131
|
-
const getArrayName = (array) => {
|
|
132
|
-
if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
|
|
133
|
-
if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
|
|
134
|
-
return array.constructor.name;
|
|
135
|
-
};
|
|
136
|
-
function inspectTypedArray(array, options) {
|
|
137
|
-
const name = getArrayName(array);
|
|
138
|
-
options.truncate -= name.length + 4;
|
|
139
|
-
const nonIndexProperties = Object.keys(array).slice(array.length);
|
|
140
|
-
if (!array.length && !nonIndexProperties.length) return `${name}[]`;
|
|
141
|
-
let output = "";
|
|
142
|
-
for (let i = 0; i < array.length; i++) {
|
|
143
|
-
const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
|
|
144
|
-
options.truncate -= string.length;
|
|
145
|
-
if (array[i] !== array.length && options.truncate <= 3) {
|
|
146
|
-
output += `${truncator}(${array.length - array[i] + 1})`;
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
output += string;
|
|
150
|
-
}
|
|
151
|
-
let propertyContents = "";
|
|
152
|
-
if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
|
|
153
|
-
return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
|
|
154
|
-
}
|
|
155
|
-
function inspectDate(dateObject, options) {
|
|
156
|
-
const stringRepresentation = dateObject.toJSON();
|
|
157
|
-
if (stringRepresentation === null) return "Invalid Date";
|
|
158
|
-
const split = stringRepresentation.split("T");
|
|
159
|
-
const date = split[0];
|
|
160
|
-
return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
|
|
161
|
-
}
|
|
162
|
-
function inspectFunction(func, options) {
|
|
163
|
-
const functionType = func[Symbol.toStringTag] || "Function";
|
|
164
|
-
const name = func.name;
|
|
165
|
-
if (!name) return options.stylize(`[${functionType}]`, "special");
|
|
166
|
-
return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
|
|
167
|
-
}
|
|
168
|
-
function inspectMapEntry([key, value], options) {
|
|
169
|
-
options.truncate -= 4;
|
|
170
|
-
key = options.inspect(key, options);
|
|
171
|
-
options.truncate -= key.length;
|
|
172
|
-
value = options.inspect(value, options);
|
|
173
|
-
return `${key} => ${value}`;
|
|
174
|
-
}
|
|
175
|
-
function mapToEntries(map) {
|
|
176
|
-
const entries = [];
|
|
177
|
-
map.forEach((value, key) => {
|
|
178
|
-
entries.push([key, value]);
|
|
179
|
-
});
|
|
180
|
-
return entries;
|
|
181
|
-
}
|
|
182
|
-
function inspectMap(map, options) {
|
|
183
|
-
if (map.size === 0) return "Map{}";
|
|
184
|
-
options.truncate -= 7;
|
|
185
|
-
return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
|
|
186
|
-
}
|
|
187
|
-
const isNaN = Number.isNaN || ((i) => i !== i);
|
|
188
|
-
function inspectNumber(number, options) {
|
|
189
|
-
if (isNaN(number)) return options.stylize("NaN", "number");
|
|
190
|
-
if (number === Infinity) return options.stylize("Infinity", "number");
|
|
191
|
-
if (number === -Infinity) return options.stylize("-Infinity", "number");
|
|
192
|
-
if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
|
|
193
|
-
return options.stylize(truncate(String(number), options.truncate), "number");
|
|
194
|
-
}
|
|
195
|
-
function inspectBigInt(number, options) {
|
|
196
|
-
let nums = truncate(number.toString(), options.truncate - 1);
|
|
197
|
-
if (nums !== truncator) nums += "n";
|
|
198
|
-
return options.stylize(nums, "bigint");
|
|
199
|
-
}
|
|
200
|
-
function inspectRegExp(value, options) {
|
|
201
|
-
const flags = value.toString().split("/")[2];
|
|
202
|
-
const sourceLength = options.truncate - (2 + flags.length);
|
|
203
|
-
const source = value.source;
|
|
204
|
-
return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
|
|
205
|
-
}
|
|
206
|
-
function arrayFromSet(set) {
|
|
207
|
-
const values = [];
|
|
208
|
-
set.forEach((value) => {
|
|
209
|
-
values.push(value);
|
|
210
|
-
});
|
|
211
|
-
return values;
|
|
212
|
-
}
|
|
213
|
-
function inspectSet(set, options) {
|
|
214
|
-
if (set.size === 0) return "Set{}";
|
|
215
|
-
options.truncate -= 7;
|
|
216
|
-
return `Set{ ${inspectList(arrayFromSet(set), options)} }`;
|
|
217
|
-
}
|
|
218
|
-
const stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
|
|
219
|
-
const escapeCharacters = {
|
|
220
|
-
"\b": "\\b",
|
|
221
|
-
" ": "\\t",
|
|
222
|
-
"\n": "\\n",
|
|
223
|
-
"\f": "\\f",
|
|
224
|
-
"\r": "\\r",
|
|
225
|
-
"'": "\\'",
|
|
226
|
-
"\\": "\\\\"
|
|
227
|
-
};
|
|
228
|
-
const hex = 16;
|
|
229
|
-
function escape(char) {
|
|
230
|
-
return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-4)}`;
|
|
231
|
-
}
|
|
232
|
-
function inspectString(string, options) {
|
|
233
|
-
if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
|
|
234
|
-
return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
|
|
235
|
-
}
|
|
236
|
-
function inspectSymbol(value) {
|
|
237
|
-
if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
|
|
238
|
-
return value.toString();
|
|
239
|
-
}
|
|
240
|
-
const getPromiseValue = () => "Promise{…}";
|
|
241
|
-
function inspectObject$1(object, options) {
|
|
242
|
-
const properties = Object.getOwnPropertyNames(object);
|
|
243
|
-
const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
|
|
244
|
-
if (properties.length === 0 && symbols.length === 0) return "{}";
|
|
245
|
-
options.truncate -= 4;
|
|
246
|
-
options.seen = options.seen || [];
|
|
247
|
-
if (options.seen.includes(object)) return "[Circular]";
|
|
248
|
-
options.seen.push(object);
|
|
249
|
-
const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
|
|
250
|
-
const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
|
|
251
|
-
options.seen.pop();
|
|
252
|
-
let sep = "";
|
|
253
|
-
if (propertyContents && symbolContents) sep = ", ";
|
|
254
|
-
return `{ ${propertyContents}${sep}${symbolContents} }`;
|
|
255
|
-
}
|
|
256
|
-
const toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
|
|
257
|
-
function inspectClass(value, options) {
|
|
258
|
-
let name = "";
|
|
259
|
-
if (toStringTag && toStringTag in value) name = value[toStringTag];
|
|
260
|
-
name = name || value.constructor.name;
|
|
261
|
-
if (!name || name === "_class") name = "<Anonymous Class>";
|
|
262
|
-
options.truncate -= name.length;
|
|
263
|
-
return `${name}${inspectObject$1(value, options)}`;
|
|
264
|
-
}
|
|
265
|
-
function inspectArguments(args, options) {
|
|
266
|
-
if (args.length === 0) return "Arguments[]";
|
|
267
|
-
options.truncate -= 13;
|
|
268
|
-
return `Arguments[ ${inspectList(args, options)} ]`;
|
|
269
|
-
}
|
|
270
|
-
const errorKeys = [
|
|
271
|
-
"stack",
|
|
272
|
-
"line",
|
|
273
|
-
"column",
|
|
274
|
-
"name",
|
|
275
|
-
"message",
|
|
276
|
-
"fileName",
|
|
277
|
-
"lineNumber",
|
|
278
|
-
"columnNumber",
|
|
279
|
-
"number",
|
|
280
|
-
"description",
|
|
281
|
-
"cause"
|
|
282
|
-
];
|
|
283
|
-
function inspectObject(error, options) {
|
|
284
|
-
const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
|
|
285
|
-
const name = error.name;
|
|
286
|
-
options.truncate -= name.length;
|
|
287
|
-
let message = "";
|
|
288
|
-
if (typeof error.message === "string") message = truncate(error.message, options.truncate);
|
|
289
|
-
else properties.unshift("message");
|
|
290
|
-
message = message ? `: ${message}` : "";
|
|
291
|
-
options.truncate -= message.length + 5;
|
|
292
|
-
options.seen = options.seen || [];
|
|
293
|
-
if (options.seen.includes(error)) return "[Circular]";
|
|
294
|
-
options.seen.push(error);
|
|
295
|
-
const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
|
|
296
|
-
return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
|
|
297
|
-
}
|
|
298
|
-
function inspectAttribute([key, value], options) {
|
|
299
|
-
options.truncate -= 3;
|
|
300
|
-
if (!value) return `${options.stylize(String(key), "yellow")}`;
|
|
301
|
-
return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
|
|
302
|
-
}
|
|
303
|
-
function inspectNodeCollection(collection, options) {
|
|
304
|
-
return inspectList(collection, options, inspectNode, "\n");
|
|
305
|
-
}
|
|
306
|
-
function inspectNode(node, options) {
|
|
307
|
-
switch (node.nodeType) {
|
|
308
|
-
case 1: return inspectHTML(node, options);
|
|
309
|
-
case 3: return options.inspect(node.data, options);
|
|
310
|
-
default: return options.inspect(node, options);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
function inspectHTML(element, options) {
|
|
314
|
-
const properties = element.getAttributeNames();
|
|
315
|
-
const name = element.tagName.toLowerCase();
|
|
316
|
-
const head = options.stylize(`<${name}`, "special");
|
|
317
|
-
const headClose = options.stylize(`>`, "special");
|
|
318
|
-
const tail = options.stylize(`</${name}>`, "special");
|
|
319
|
-
options.truncate -= name.length * 2 + 5;
|
|
320
|
-
let propertyContents = "";
|
|
321
|
-
if (properties.length > 0) {
|
|
322
|
-
propertyContents += " ";
|
|
323
|
-
propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
|
|
324
|
-
}
|
|
325
|
-
options.truncate -= propertyContents.length;
|
|
326
|
-
const truncate = options.truncate;
|
|
327
|
-
let children = inspectNodeCollection(element.children, options);
|
|
328
|
-
if (children && children.length > truncate) children = `${truncator}(${element.children.length})`;
|
|
329
|
-
return `${head}${propertyContents}${headClose}${children}${tail}`;
|
|
330
|
-
}
|
|
331
|
-
const chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? Symbol.for("chai/inspect") : "@@chai/inspect";
|
|
332
|
-
const nodeInspect = Symbol.for("nodejs.util.inspect.custom");
|
|
333
|
-
const constructorMap = /* @__PURE__ */ new WeakMap();
|
|
334
|
-
const stringTagMap = {};
|
|
335
|
-
const baseTypesMap = {
|
|
336
|
-
undefined: (value, options) => options.stylize("undefined", "undefined"),
|
|
337
|
-
null: (value, options) => options.stylize("null", "null"),
|
|
338
|
-
boolean: (value, options) => options.stylize(String(value), "boolean"),
|
|
339
|
-
Boolean: (value, options) => options.stylize(String(value), "boolean"),
|
|
340
|
-
number: inspectNumber,
|
|
341
|
-
Number: inspectNumber,
|
|
342
|
-
bigint: inspectBigInt,
|
|
343
|
-
BigInt: inspectBigInt,
|
|
344
|
-
string: inspectString,
|
|
345
|
-
String: inspectString,
|
|
346
|
-
function: inspectFunction,
|
|
347
|
-
Function: inspectFunction,
|
|
348
|
-
symbol: inspectSymbol,
|
|
349
|
-
Symbol: inspectSymbol,
|
|
350
|
-
Array: inspectArray,
|
|
351
|
-
Date: inspectDate,
|
|
352
|
-
Map: inspectMap,
|
|
353
|
-
Set: inspectSet,
|
|
354
|
-
RegExp: inspectRegExp,
|
|
355
|
-
Promise: getPromiseValue,
|
|
356
|
-
WeakSet: (value, options) => options.stylize("WeakSet{…}", "special"),
|
|
357
|
-
WeakMap: (value, options) => options.stylize("WeakMap{…}", "special"),
|
|
358
|
-
Arguments: inspectArguments,
|
|
359
|
-
Int8Array: inspectTypedArray,
|
|
360
|
-
Uint8Array: inspectTypedArray,
|
|
361
|
-
Uint8ClampedArray: inspectTypedArray,
|
|
362
|
-
Int16Array: inspectTypedArray,
|
|
363
|
-
Uint16Array: inspectTypedArray,
|
|
364
|
-
Int32Array: inspectTypedArray,
|
|
365
|
-
Uint32Array: inspectTypedArray,
|
|
366
|
-
Float32Array: inspectTypedArray,
|
|
367
|
-
Float64Array: inspectTypedArray,
|
|
368
|
-
Generator: () => "",
|
|
369
|
-
DataView: () => "",
|
|
370
|
-
ArrayBuffer: () => "",
|
|
371
|
-
Error: inspectObject,
|
|
372
|
-
HTMLCollection: inspectNodeCollection,
|
|
373
|
-
NodeList: inspectNodeCollection
|
|
374
|
-
};
|
|
375
|
-
const inspectCustom = (value, options, type, inspectFn) => {
|
|
376
|
-
if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
|
|
377
|
-
if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
|
|
378
|
-
if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
|
|
379
|
-
if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
|
|
380
|
-
if (stringTagMap[type]) return stringTagMap[type](value, options);
|
|
381
|
-
return "";
|
|
382
|
-
};
|
|
383
|
-
const toString = Object.prototype.toString;
|
|
384
|
-
function inspect$1(value, opts = {}) {
|
|
385
|
-
const options = normaliseOptions(opts, inspect$1);
|
|
386
|
-
const { customInspect } = options;
|
|
387
|
-
let type = value === null ? "null" : typeof value;
|
|
388
|
-
if (type === "object") type = toString.call(value).slice(8, -1);
|
|
389
|
-
if (type in baseTypesMap) return baseTypesMap[type](value, options);
|
|
390
|
-
if (customInspect && value) {
|
|
391
|
-
const output = inspectCustom(value, options, type, inspect$1);
|
|
392
|
-
if (output) {
|
|
393
|
-
if (typeof output === "string") return output;
|
|
394
|
-
return inspect$1(output, options);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
const proto = value ? Object.getPrototypeOf(value) : false;
|
|
398
|
-
if (proto === Object.prototype || proto === null) return inspectObject$1(value, options);
|
|
399
|
-
if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
|
|
400
|
-
if ("constructor" in value) {
|
|
401
|
-
if (value.constructor !== Object) return inspectClass(value, options);
|
|
402
|
-
return inspectObject$1(value, options);
|
|
403
|
-
}
|
|
404
|
-
if (value === Object(value)) return inspectObject$1(value, options);
|
|
405
|
-
return options.stylize(String(value), type);
|
|
406
|
-
}
|
|
407
|
-
const { AsymmetricMatcher, DOMCollection, DOMElement, Immutable, ReactElement, ReactTestComponent } = plugins;
|
|
408
|
-
const PLUGINS = [
|
|
409
|
-
ReactTestComponent,
|
|
410
|
-
ReactElement,
|
|
411
|
-
DOMElement,
|
|
412
|
-
DOMCollection,
|
|
413
|
-
Immutable,
|
|
414
|
-
AsymmetricMatcher
|
|
415
|
-
];
|
|
416
|
-
function stringify(object, maxDepth = 10, { maxLength, filterNode, ...options } = {}) {
|
|
417
|
-
const MAX_LENGTH = maxLength ?? 1e4;
|
|
418
|
-
let result;
|
|
419
|
-
const filterFn = typeof filterNode === "string" ? createNodeFilterFromSelector(filterNode) : filterNode;
|
|
420
|
-
const plugins = filterFn ? [
|
|
421
|
-
ReactTestComponent,
|
|
422
|
-
ReactElement,
|
|
423
|
-
createDOMElementFilter(filterFn),
|
|
424
|
-
DOMCollection,
|
|
425
|
-
Immutable,
|
|
426
|
-
AsymmetricMatcher
|
|
427
|
-
] : PLUGINS;
|
|
428
|
-
try {
|
|
429
|
-
result = format$1(object, {
|
|
430
|
-
maxDepth,
|
|
431
|
-
escapeString: false,
|
|
432
|
-
plugins,
|
|
433
|
-
...options
|
|
434
|
-
});
|
|
435
|
-
} catch {
|
|
436
|
-
result = format$1(object, {
|
|
437
|
-
callToJSON: false,
|
|
438
|
-
maxDepth,
|
|
439
|
-
escapeString: false,
|
|
440
|
-
plugins,
|
|
441
|
-
...options
|
|
442
|
-
});
|
|
443
|
-
}
|
|
444
|
-
return result.length >= MAX_LENGTH && maxDepth > 1 ? stringify(object, Math.floor(Math.min(maxDepth, Number.MAX_SAFE_INTEGER) / 2), {
|
|
445
|
-
maxLength,
|
|
446
|
-
filterNode,
|
|
447
|
-
...options
|
|
448
|
-
}) : result;
|
|
449
|
-
}
|
|
450
|
-
function createNodeFilterFromSelector(selector) {
|
|
451
|
-
const ELEMENT_NODE = 1;
|
|
452
|
-
const COMMENT_NODE = 8;
|
|
453
|
-
return (node) => {
|
|
454
|
-
if (node.nodeType === COMMENT_NODE) return false;
|
|
455
|
-
if (node.nodeType === ELEMENT_NODE && node.matches) try {
|
|
456
|
-
return !node.matches(selector);
|
|
457
|
-
} catch {
|
|
458
|
-
return true;
|
|
459
|
-
}
|
|
460
|
-
return true;
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
const formatRegExp = /%[sdjifoOc%]/g;
|
|
464
|
-
function baseFormat(args, options = {}) {
|
|
465
|
-
const formatArg = (item, inspecOptions) => {
|
|
466
|
-
if (options.prettifyObject) return stringify(item, void 0, {
|
|
467
|
-
printBasicPrototype: false,
|
|
468
|
-
escapeString: false
|
|
469
|
-
});
|
|
470
|
-
return inspect(item, inspecOptions);
|
|
471
|
-
};
|
|
472
|
-
if (typeof args[0] !== "string") {
|
|
473
|
-
const objects = [];
|
|
474
|
-
for (let i = 0; i < args.length; i++) objects.push(formatArg(args[i], {
|
|
475
|
-
depth: 0,
|
|
476
|
-
colors: false
|
|
477
|
-
}));
|
|
478
|
-
return objects.join(" ");
|
|
479
|
-
}
|
|
480
|
-
const len = args.length;
|
|
481
|
-
let i = 1;
|
|
482
|
-
const template = args[0];
|
|
483
|
-
let str = String(template).replace(formatRegExp, (x) => {
|
|
484
|
-
if (x === "%%") return "%";
|
|
485
|
-
if (i >= len) return x;
|
|
486
|
-
switch (x) {
|
|
487
|
-
case "%s": {
|
|
488
|
-
const value = args[i++];
|
|
489
|
-
if (typeof value === "bigint") return `${value.toString()}n`;
|
|
490
|
-
if (typeof value === "number" && value === 0 && 1 / value < 0) return "-0";
|
|
491
|
-
if (typeof value === "object" && value !== null) {
|
|
492
|
-
if (typeof value.toString === "function" && value.toString !== Object.prototype.toString) return value.toString();
|
|
493
|
-
return formatArg(value, {
|
|
494
|
-
depth: 0,
|
|
495
|
-
colors: false
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
return String(value);
|
|
499
|
-
}
|
|
500
|
-
case "%d": {
|
|
501
|
-
const value = args[i++];
|
|
502
|
-
if (typeof value === "bigint") return `${value.toString()}n`;
|
|
503
|
-
if (typeof value === "symbol") return "NaN";
|
|
504
|
-
return Number(value).toString();
|
|
505
|
-
}
|
|
506
|
-
case "%i": {
|
|
507
|
-
const value = args[i++];
|
|
508
|
-
if (typeof value === "bigint") return `${value.toString()}n`;
|
|
509
|
-
return Number.parseInt(String(value)).toString();
|
|
510
|
-
}
|
|
511
|
-
case "%f": return Number.parseFloat(String(args[i++])).toString();
|
|
512
|
-
case "%o": return formatArg(args[i++], {
|
|
513
|
-
showHidden: true,
|
|
514
|
-
showProxy: true
|
|
515
|
-
});
|
|
516
|
-
case "%O": return formatArg(args[i++]);
|
|
517
|
-
case "%c":
|
|
518
|
-
i++;
|
|
519
|
-
return "";
|
|
520
|
-
case "%j": try {
|
|
521
|
-
return JSON.stringify(args[i++]);
|
|
522
|
-
} catch (err) {
|
|
523
|
-
const m = err.message;
|
|
524
|
-
if (m.includes("circular structure") || m.includes("cyclic structures") || m.includes("cyclic object")) return "[Circular]";
|
|
525
|
-
throw err;
|
|
526
|
-
}
|
|
527
|
-
default: return x;
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
for (let x = args[i]; i < len; x = args[++i]) if (x === null || typeof x !== "object") str += ` ${typeof x === "symbol" ? x.toString() : x}`;
|
|
531
|
-
else str += ` ${formatArg(x)}`;
|
|
532
|
-
return str;
|
|
533
|
-
}
|
|
534
|
-
function format(...args) {
|
|
535
|
-
return baseFormat(args);
|
|
536
|
-
}
|
|
537
|
-
function inspect(obj, options = {}) {
|
|
538
|
-
if (options.truncate === 0) options.truncate = Number.POSITIVE_INFINITY;
|
|
539
|
-
return inspect$1(obj, options);
|
|
540
|
-
}
|
|
541
|
-
function objDisplay(obj, options = {}) {
|
|
542
|
-
if (typeof options.truncate === "undefined") options.truncate = 40;
|
|
543
|
-
const str = inspect(obj, options);
|
|
544
|
-
const type = Object.prototype.toString.call(obj);
|
|
545
|
-
if (options.truncate && str.length >= options.truncate) if (type === "[object Function]") {
|
|
546
|
-
const fn = obj;
|
|
547
|
-
return !fn.name ? "[Function]" : `[Function: ${fn.name}]`;
|
|
548
|
-
} else if (type === "[object Array]") return `[ Array(${obj.length}) ]`;
|
|
549
|
-
else if (type === "[object Object]") {
|
|
550
|
-
const keys = Object.keys(obj);
|
|
551
|
-
return `{ Object (${keys.length > 2 ? `${keys.splice(0, 2).join(", ")}, ...` : keys.join(", ")}) }`;
|
|
552
|
-
} else return str;
|
|
553
|
-
return str;
|
|
554
|
-
}
|
|
555
|
-
//#endregion
|
|
556
|
-
export { format, formatRegExp, objDisplay, stringify };
|
|
557
|
-
|
|
558
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCt1dGlsc0A0LjEuMi9ub2RlX21vZHVsZXMvQHZpdGVzdC91dGlscy9kaXN0L2Rpc3BsYXkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGx1Z2lucywgY3JlYXRlRE9NRWxlbWVudEZpbHRlciwgZm9ybWF0IGFzIGZvcm1hdCQxIH0gZnJvbSAnQHZpdGVzdC9wcmV0dHktZm9ybWF0JztcblxuY29uc3QgYW5zaUNvbG9ycyA9IHtcbiAgICBib2xkOiBbJzEnLCAnMjInXSxcbiAgICBkaW06IFsnMicsICcyMiddLFxuICAgIGl0YWxpYzogWyczJywgJzIzJ10sXG4gICAgdW5kZXJsaW5lOiBbJzQnLCAnMjQnXSxcbiAgICAvLyA1ICYgNiBhcmUgYmxpbmtpbmdcbiAgICBpbnZlcnNlOiBbJzcnLCAnMjcnXSxcbiAgICBoaWRkZW46IFsnOCcsICcyOCddLFxuICAgIHN0cmlrZTogWyc5JywgJzI5J10sXG4gICAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gICAgLy8gMjEtMjkgYXJlIHJlc2V0cyBmb3IgMS05XG4gICAgYmxhY2s6IFsnMzAnLCAnMzknXSxcbiAgICByZWQ6IFsnMzEnLCAnMzknXSxcbiAgICBncmVlbjogWyczMicsICczOSddLFxuICAgIHllbGxvdzogWyczMycsICczOSddLFxuICAgIGJsdWU6IFsnMzQnLCAnMzknXSxcbiAgICBtYWdlbnRhOiBbJzM1JywgJzM5J10sXG4gICAgY3lhbjogWyczNicsICczOSddLFxuICAgIHdoaXRlOiBbJzM3JywgJzM5J10sXG4gICAgYnJpZ2h0YmxhY2s6IFsnMzA7MScsICczOSddLFxuICAgIGJyaWdodHJlZDogWyczMTsxJywgJzM5J10sXG4gICAgYnJpZ2h0Z3JlZW46IFsnMzI7MScsICczOSddLFxuICAgIGJyaWdodHllbGxvdzogWyczMzsxJywgJzM5J10sXG4gICAgYnJpZ2h0Ymx1ZTogWyczNDsxJywgJzM5J10sXG4gICAgYnJpZ2h0bWFnZW50YTogWyczNTsxJywgJzM5J10sXG4gICAgYnJpZ2h0Y3lhbjogWyczNjsxJywgJzM5J10sXG4gICAgYnJpZ2h0d2hpdGU6IFsnMzc7MScsICczOSddLFxuICAgIGdyZXk6IFsnOTAnLCAnMzknXSxcbn07XG5jb25zdCBzdHlsZXMgPSB7XG4gICAgc3BlY2lhbDogJ2N5YW4nLFxuICAgIG51bWJlcjogJ3llbGxvdycsXG4gICAgYmlnaW50OiAneWVsbG93JyxcbiAgICBib29sZWFuOiAneWVsbG93JyxcbiAgICB1bmRlZmluZWQ6ICdncmV5JyxcbiAgICBudWxsOiAnYm9sZCcsXG4gICAgc3RyaW5nOiAnZ3JlZW4nLFxuICAgIHN5bWJvbDogJ2dyZWVuJyxcbiAgICBkYXRlOiAnbWFnZW50YScsXG4gICAgcmVnZXhwOiAncmVkJyxcbn07XG5jb25zdCB0cnVuY2F0b3IgPSAn4oCmJztcbmZ1bmN0aW9uIGNvbG9yaXNlKHZhbHVlLCBzdHlsZVR5cGUpIHtcbiAgICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCAnJztcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYFxcdTAwMWJbJHtjb2xvclswXX1tJHtTdHJpbmcodmFsdWUpfVxcdTAwMWJbJHtjb2xvclsxXX1tYDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoeyBzaG93SGlkZGVuID0gZmFsc2UsIGRlcHRoID0gMiwgY29sb3JzID0gZmFsc2UsIGN1c3RvbUluc3BlY3QgPSB0cnVlLCBzaG93UHJveHkgPSBmYWxzZSwgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSwgYnJlYWtMZW5ndGggPSBJbmZpbml0eSwgc2VlbiA9IFtdLCBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbnRydW5jYXRlID0gSW5maW5pdHksIHN0eWxpemUgPSBTdHJpbmcsIH0gPSB7fSwgaW5zcGVjdCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgICAgIGRlcHRoOiBOdW1iZXIoZGVwdGgpLFxuICAgICAgICBjb2xvcnM6IEJvb2xlYW4oY29sb3JzKSxcbiAgICAgICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICAgICAgc2hvd1Byb3h5OiBCb29sZWFuKHNob3dQcm94eSksXG4gICAgICAgIG1heEFycmF5TGVuZ3RoOiBOdW1iZXIobWF4QXJyYXlMZW5ndGgpLFxuICAgICAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICAgICAgdHJ1bmNhdGU6IE51bWJlcih0cnVuY2F0ZSksXG4gICAgICAgIHNlZW4sXG4gICAgICAgIGluc3BlY3QsXG4gICAgICAgIHN0eWxpemUsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5jb2xvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5zdHlsaXplID0gY29sb3Jpc2U7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zO1xufVxuZnVuY3Rpb24gaXNIaWdoU3Vycm9nYXRlKGNoYXIpIHtcbiAgICByZXR1cm4gY2hhciA+PSAnXFx1ZDgwMCcgJiYgY2hhciA8PSAnXFx1ZGJmZic7XG59XG5mdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgdGFpbCA9IHRydW5jYXRvcikge1xuICAgIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICAgIGNvbnN0IHRhaWxMZW5ndGggPSB0YWlsLmxlbmd0aDtcbiAgICBjb25zdCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRhaWw7XG4gICAgfVxuICAgIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGggJiYgc3RyaW5nTGVuZ3RoID4gdGFpbExlbmd0aCkge1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+IDAgJiYgaXNIaWdoU3Vycm9nYXRlKHN0cmluZ1tlbmQgLSAxXSkpIHtcbiAgICAgICAgICAgIGVuZCA9IGVuZCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIGluc3BlY3RMaXN0KGxpc3QsIG9wdGlvbnMsIGluc3BlY3RJdGVtLCBzZXBhcmF0b3IgPSAnLCAnKSB7XG4gICAgaW5zcGVjdEl0ZW0gPSBpbnNwZWN0SXRlbSB8fCBvcHRpb25zLmluc3BlY3Q7XG4gICAgY29uc3Qgc2l6ZSA9IGxpc3QubGVuZ3RoO1xuICAgIGlmIChzaXplID09PSAwKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgcGVlayA9ICcnO1xuICAgIGxldCB0cnVuY2F0ZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gaSArIDEgPT09IGxpc3QubGVuZ3RoO1xuICAgICAgICBjb25zdCBzZWNvbmRUb0xhc3QgPSBpICsgMiA9PT0gbGlzdC5sZW5ndGg7XG4gICAgICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbGlzdFtpXTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZW1haW5pbmcgd2UgbmVlZCB0byBhY2NvdW50IGZvciBhIHNlcGFyYXRvciBvZiBgLCBgXG4gICAgICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gcGVlayB8fCBpbnNwZWN0SXRlbSh2YWx1ZSwgb3B0aW9ucykgKyAobGFzdCA/ICcnIDogc2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRMZW5ndGggPSBuZXh0TGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBlbGVtZW50LCBhbmQgYWRkaW5nIGl0IHdvdWxkXG4gICAgICAgIC8vIHRha2UgdXMgb3ZlciBsZW5ndGgsIGJ1dCBhZGRpbmcgdGhlIHRydW5jYXRvciB3b3VsZG4ndCAtIHRoZW4gYnJlYWsgbm93XG4gICAgICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBvciBzZWNvbmQgdG8gbGFzdCBlbGVtZW50IHRvIHNjYW4sXG4gICAgICAgIC8vIGJ1dCB0aGUgc3RyaW5nIGlzIGFscmVhZHkgb3ZlciBsZW5ndGggdGhlbiBicmVhayBoZXJlXG4gICAgICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IHN0cmluZyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkXG4gICAgICAgIC8vIGJyZWFrIGVhcmx5IGJlZm9yZSBhZGRpbmcgdGhpcyBpdGVtIHRvIHRoZSBvdXRwdXRcbiAgICAgICAgcGVlayA9IGxhc3QgPyAnJyA6IGluc3BlY3RJdGVtKGxpc3RbaSArIDFdLCBvcHRpb25zKSArIChzZWNvbmRUb0xhc3QgPyAnJyA6IHNlcGFyYXRvcik7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgb25lIGVsZW1lbnQgbGVmdCwgYnV0IHRoaXMgZWxlbWVudCBhbmRcbiAgICAgICAgLy8gdGhlIG5leHQgdGFrZXMgb3ZlciBsZW5ndGgsIHRoZSBicmVhayBlYXJseVxuICAgICAgICBpZiAoIWxhc3QgJiYgc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgICAgICAvLyBJZiB0aGUgbmV4dCBlbGVtZW50IHRha2VzIHVzIHRvIGxlbmd0aCAtXG4gICAgICAgIC8vIGJ1dCB0aGVyZSBhcmUgbW9yZSBhZnRlciB0aGF0LCB0aGVuIHdlIHNob3VsZCB0cnVuY2F0ZSBub3dcbiAgICAgICAgaWYgKCFsYXN0ICYmICFzZWNvbmRUb0xhc3QgJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID49IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICB0cnVuY2F0ZWQgPSBgJHt0cnVuY2F0b3J9KCR7bGlzdC5sZW5ndGggLSBpIC0gMX0pYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRydW5jYXRlZCA9ICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gICAgaWYgKGtleS5tYXRjaCgvXlthLXpBLVpfXVthLXpBLVpfMC05XSokLykpIHtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xufVxuZnVuY3Rpb24gaW5zcGVjdFByb3BlcnR5KFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gMjtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAga2V5ID0gcXVvdGVDb21wbGV4S2V5KGtleSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09ICdudW1iZXInKSB7XG4gICAgICAgIGtleSA9IGBbJHtvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKX1dYDtcbiAgICB9XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICAgIHZhbHVlID0gb3B0aW9ucy5pbnNwZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYCR7a2V5fTogJHt2YWx1ZX1gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QXJyYXkoYXJyYXksIG9wdGlvbnMpIHtcbiAgICAvLyBPYmplY3Qua2V5cyB3aWxsIGFsd2F5cyBvdXRwdXQgdGhlIEFycmF5IGluZGljZXMgZmlyc3QsIHNvIHdlIGNhbiBzbGljZSBieVxuICAgIC8vIGBhcnJheS5sZW5ndGhgIHRvIGdldCBub24taW5kZXggcHJvcGVydGllc1xuICAgIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICAgIGlmICghYXJyYXkubGVuZ3RoICYmICFub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gJ1tdJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gICAgY29uc3QgbGlzdENvbnRlbnRzID0gaW5zcGVjdExpc3QoYXJyYXksIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbGlzdENvbnRlbnRzLmxlbmd0aDtcbiAgICBsZXQgcHJvcGVydHlDb250ZW50cyA9ICcnO1xuICAgIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKGtleSA9PiBba2V5LCBhcnJheVtrZXldXSksIG9wdGlvbnMsIGluc3BlY3RQcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6ICcnfSBdYDtcbn1cblxuY29uc3QgZ2V0QXJyYXlOYW1lID0gKGFycmF5KSA9PiB7XG4gICAgLy8gV2UgbmVlZCB0byBzcGVjaWFsIGNhc2UgTm9kZS5qcycgQnVmZmVycywgd2hpY2ggcmVwb3J0IHRvIGJlIFVpbnQ4QXJyYXlcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuICdCdWZmZXInO1xuICAgIH1cbiAgICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgICAgICByZXR1cm4gYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5LmNvbnN0cnVjdG9yLm5hbWU7XG59O1xuZnVuY3Rpb24gaW5zcGVjdFR5cGVkQXJyYXkoYXJyYXksIG9wdGlvbnMpIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICsgNDtcbiAgICAvLyBPYmplY3Qua2V5cyB3aWxsIGFsd2F5cyBvdXRwdXQgdGhlIEFycmF5IGluZGljZXMgZmlyc3QsIHNvIHdlIGNhbiBzbGljZSBieVxuICAgIC8vIGBhcnJheS5sZW5ndGhgIHRvIGdldCBub24taW5kZXggcHJvcGVydGllc1xuICAgIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICAgIGlmICghYXJyYXkubGVuZ3RoICYmICFub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gICAgLy8gQXMgd2Uga25vdyBUeXBlZEFycmF5cyBvbmx5IGNvbnRhaW4gVW5zaWduZWQgSW50ZWdlcnMsIHdlIGNhbiBza2lwIGluc3BlY3RpbmcgZWFjaCBvbmUgYW5kIHNpbXBseVxuICAgIC8vIHN0eWxpc2UgdGhlIHRvU3RyaW5nKCkgdmFsdWUgb2YgdGhlbVxuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGAke29wdGlvbnMuc3R5bGl6ZSh0cnVuY2F0ZShhcnJheVtpXSwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKX0ke2kgPT09IGFycmF5Lmxlbmd0aCAtIDEgPyAnJyA6ICcsICd9YDtcbiAgICAgICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgICAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IHN0cmluZztcbiAgICB9XG4gICAgbGV0IHByb3BlcnR5Q29udGVudHMgPSAnJztcbiAgICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3Qobm9uSW5kZXhQcm9wZXJ0aWVzLm1hcChrZXkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogJyd9IF1gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0RGF0ZShkYXRlT2JqZWN0LCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc3RyaW5nUmVwcmVzZW50YXRpb24gPSBkYXRlT2JqZWN0LnRvSlNPTigpO1xuICAgIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ0ludmFsaWQgRGF0ZSc7XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoJ1QnKTtcbiAgICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gICAgLy8gSWYgd2UgbmVlZCB0byAtIHRydW5jYXRlIHRoZSB0aW1lIHBvcnRpb24sIGJ1dCBuZXZlciB0aGUgZGF0ZVxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgJ2RhdGUnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdEZ1bmN0aW9uKGZ1bmMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgJ0Z1bmN0aW9uJztcbiAgICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYFske2Z1bmN0aW9uVHlwZX0gJHt0cnVuY2F0ZShuYW1lLCBvcHRpb25zLnRydW5jYXRlIC0gMTEpfV1gLCAnc3BlY2lhbCcpO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICAgIGtleSA9IG9wdGlvbnMuaW5zcGVjdChrZXksIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGAke2tleX0gPT4gJHt2YWx1ZX1gO1xufVxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgYG1hcC5lbnRyaWVzKClgXG5mdW5jdGlvbiBtYXBUb0VudHJpZXMobWFwKSB7XG4gICAgY29uc3QgZW50cmllcyA9IFtdO1xuICAgIG1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xufVxuZnVuY3Rpb24gaW5zcGVjdE1hcChtYXAsIG9wdGlvbnMpIHtcbiAgICBpZiAobWFwLnNpemUgPT09IDApXG4gICAgICAgIHJldHVybiAnTWFwe30nO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgICByZXR1cm4gYE1hcHsgJHtpbnNwZWN0TGlzdChtYXBUb0VudHJpZXMobWFwKSwgb3B0aW9ucywgaW5zcGVjdE1hcEVudHJ5KX0gfWA7XG59XG5cbmNvbnN0IGlzTmFOID0gTnVtYmVyLmlzTmFOIHx8IChpID0+IGkgIT09IGkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuZnVuY3Rpb24gaW5zcGVjdE51bWJlcihudW1iZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdOYU4nLCAnbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJ0luZmluaXR5JywgJ251bWJlcicpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSgnLUluZmluaXR5JywgJ251bWJlcicpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoMSAvIG51bWJlciA9PT0gSW5maW5pdHkgPyAnKzAnIDogJy0wJywgJ251bWJlcicpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKFN0cmluZyhudW1iZXIpLCBvcHRpb25zLnRydW5jYXRlKSwgJ251bWJlcicpO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QmlnSW50KG51bWJlciwgb3B0aW9ucykge1xuICAgIGxldCBudW1zID0gdHJ1bmNhdGUobnVtYmVyLnRvU3RyaW5nKCksIG9wdGlvbnMudHJ1bmNhdGUgLSAxKTtcbiAgICBpZiAobnVtcyAhPT0gdHJ1bmNhdG9yKVxuICAgICAgICBudW1zICs9ICduJztcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKG51bXMsICdiaWdpbnQnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZsYWdzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLycpWzJdO1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGUgLSAoMiArIGZsYWdzLmxlbmd0aCk7XG4gICAgY29uc3Qgc291cmNlID0gdmFsdWUuc291cmNlO1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYC8ke3RydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKX0vJHtmbGFnc31gLCAncmVnZXhwJyk7XG59XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IGBBcnJheS5mcm9tKHNldClgXG5mdW5jdGlvbiBhcnJheUZyb21TZXQoc2V0KSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgc2V0LmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKHNldC5zaXplID09PSAwKVxuICAgICAgICByZXR1cm4gJ1NldHt9JztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gICAgcmV0dXJuIGBTZXR7ICR7aW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldCksIG9wdGlvbnMpfSB9YDtcbn1cblxuY29uc3Qgc3RyaW5nRXNjYXBlQ2hhcnMgPSBuZXcgUmVnRXhwKFwiWydcXFxcdTAwMDAtXFxcXHUwMDFmXFxcXHUwMDdmLVxcXFx1MDA5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcIiArXG4gICAgJ1xcXFx1MjAwYy1cXFxcdTIwMGZcXFxcdTIwMjgtXFxcXHUyMDJmXFxcXHUyMDYwLVxcXFx1MjA2ZlxcXFx1ZmVmZlxcXFx1ZmZmMC1cXFxcdWZmZmZdJywgJ2cnKTtcbmNvbnN0IGVzY2FwZUNoYXJhY3RlcnMgPSB7XG4gICAgJ1xcYic6ICdcXFxcYicsXG4gICAgJ1xcdCc6ICdcXFxcdCcsXG4gICAgJ1xcbic6ICdcXFxcbicsXG4gICAgJ1xcZic6ICdcXFxcZicsXG4gICAgJ1xccic6ICdcXFxccicsXG4gICAgXCInXCI6IFwiXFxcXCdcIixcbiAgICAnXFxcXCc6ICdcXFxcXFxcXCcsXG59O1xuY29uc3QgaGV4ID0gMTY7XG5mdW5jdGlvbiBlc2NhcGUoY2hhcikge1xuICAgIHJldHVybiAoZXNjYXBlQ2hhcmFjdGVyc1tjaGFyXSB8fFxuICAgICAgICBgXFxcXHUke2AwMDAwJHtjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoaGV4KX1gLnNsaWNlKC00KX1gKTtcbn1cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgaWYgKHN0cmluZ0VzY2FwZUNoYXJzLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShzdHJpbmdFc2NhcGVDaGFycywgZXNjYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgJyR7dHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zLnRydW5jYXRlIC0gMil9J2AsICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFN5bWJvbCh2YWx1ZSkge1xuICAgIGlmICgnZGVzY3JpcHRpb24nIGluIFN5bWJvbC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8gYFN5bWJvbCgke3ZhbHVlLmRlc2NyaXB0aW9ufSlgIDogJ1N5bWJvbCgpJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmNvbnN0IGdldFByb21pc2VWYWx1ZSA9ICgpID0+ICdQcm9taXNle+KApn0nO1xuXG5mdW5jdGlvbiBpbnNwZWN0T2JqZWN0JDEob2JqZWN0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gICAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCkgOiBbXTtcbiAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDAgJiYgc3ltYm9scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICd7fSc7XG4gICAgfVxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gICAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuICAgIG9wdGlvbnMuc2Vlbi5wdXNoKG9iamVjdCk7XG4gICAgY29uc3QgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KHByb3BlcnRpZXMubWFwKGtleSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIGNvbnN0IHN5bWJvbENvbnRlbnRzID0gaW5zcGVjdExpc3Qoc3ltYm9scy5tYXAoa2V5ID0+IFtrZXksIG9iamVjdFtrZXldXSksIG9wdGlvbnMsIGluc3BlY3RQcm9wZXJ0eSk7XG4gICAgb3B0aW9ucy5zZWVuLnBvcCgpO1xuICAgIGxldCBzZXAgPSAnJztcbiAgICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgICAgICBzZXAgPSAnLCAnO1xuICAgIH1cbiAgICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuXG5jb25zdCB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZyA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IGZhbHNlO1xuZnVuY3Rpb24gaW5zcGVjdENsYXNzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgbGV0IG5hbWUgPSAnJztcbiAgICBpZiAodG9TdHJpbmdUYWcgJiYgdG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcbiAgICAgICAgbmFtZSA9IHZhbHVlW3RvU3RyaW5nVGFnXTtcbiAgICB9XG4gICAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgICAvLyBCYWJlbCB0cmFuc2Zvcm1zIGFub255bW91cyBjbGFzc2VzIHRvIHRoZSBuYW1lIGBfY2xhc3NgXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT09ICdfY2xhc3MnKSB7XG4gICAgICAgIG5hbWUgPSAnPEFub255bW91cyBDbGFzcz4nO1xuICAgIH1cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoO1xuICAgIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCQxKHZhbHVlLCBvcHRpb25zKX1gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QXJndW1lbnRzKGFyZ3MsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiAnQXJndW1lbnRzW10nO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gMTM7XG4gICAgcmV0dXJuIGBBcmd1bWVudHNbICR7aW5zcGVjdExpc3QoYXJncywgb3B0aW9ucyl9IF1gO1xufVxuXG5jb25zdCBlcnJvcktleXMgPSBbXG4gICAgJ3N0YWNrJyxcbiAgICAnbGluZScsXG4gICAgJ2NvbHVtbicsXG4gICAgJ25hbWUnLFxuICAgICdtZXNzYWdlJyxcbiAgICAnZmlsZU5hbWUnLFxuICAgICdsaW5lTnVtYmVyJyxcbiAgICAnY29sdW1uTnVtYmVyJyxcbiAgICAnbnVtYmVyJyxcbiAgICAnZGVzY3JpcHRpb24nLFxuICAgICdjYXVzZScsXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChlcnJvciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvcikuZmlsdGVyKGtleSA9PiBlcnJvcktleXMuaW5kZXhPZihrZXkpID09PSAtMSk7XG4gICAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWU7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWVzc2FnZSA9IHRydW5jYXRlKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMudHJ1bmNhdGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJvcGVydGllcy51bnNoaWZ0KCdtZXNzYWdlJyk7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8gYDogJHttZXNzYWdlfWAgOiAnJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG1lc3NhZ2UubGVuZ3RoICsgNTtcbiAgICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gICAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG4gICAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICAgIGNvbnN0IHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcChrZXkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIHJldHVybiBgJHtuYW1lfSR7bWVzc2FnZX0ke3Byb3BlcnR5Q29udGVudHMgPyBgIHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSB9YCA6ICcnfWA7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RBdHRyaWJ1dGUoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSAzO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGAke29wdGlvbnMuc3R5bGl6ZShTdHJpbmcoa2V5KSwgJ3llbGxvdycpfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksICd5ZWxsb3cnKX09JHtvcHRpb25zLnN0eWxpemUoYFwiJHt2YWx1ZX1cImAsICdzdHJpbmcnKX1gO1xufVxuZnVuY3Rpb24gaW5zcGVjdE5vZGVDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdE5vZGUsICdcXG4nKTtcbn1cbmZ1bmN0aW9uIGluc3BlY3ROb2RlKG5vZGUsIG9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RIVE1MKG5vZGUsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIEB0cy1pZ25vcmUgKERlbm8gZG9lc24ndCBoYXZlIEVsZW1lbnQpXG5mdW5jdGlvbiBpbnNwZWN0SFRNTChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgICBjb25zdCBuYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaGVhZCA9IG9wdGlvbnMuc3R5bGl6ZShgPCR7bmFtZX1gLCAnc3BlY2lhbCcpO1xuICAgIGNvbnN0IGhlYWRDbG9zZSA9IG9wdGlvbnMuc3R5bGl6ZShgPmAsICdzcGVjaWFsJyk7XG4gICAgY29uc3QgdGFpbCA9IG9wdGlvbnMuc3R5bGl6ZShgPC8ke25hbWV9PmAsICdzcGVjaWFsJyk7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCAqIDIgKyA1O1xuICAgIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gJyc7XG4gICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9wZXJ0eUNvbnRlbnRzICs9ICcgJztcbiAgICAgICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcCgoa2V5KSA9PiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXSksIG9wdGlvbnMsIGluc3BlY3RBdHRyaWJ1dGUsICcgJyk7XG4gICAgfVxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gcHJvcGVydHlDb250ZW50cy5sZW5ndGg7XG4gICAgY29uc3QgdHJ1bmNhdGUgPSBvcHRpb25zLnRydW5jYXRlO1xuICAgIGxldCBjaGlsZHJlbiA9IGluc3BlY3ROb2RlQ29sbGVjdGlvbihlbGVtZW50LmNoaWxkcmVuLCBvcHRpb25zKTtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gdHJ1bmNhdGUpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBgJHt0cnVuY2F0b3J9KCR7ZWxlbWVudC5jaGlsZHJlbi5sZW5ndGh9KWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtoZWFkfSR7cHJvcGVydHlDb250ZW50c30ke2hlYWRDbG9zZX0ke2NoaWxkcmVufSR7dGFpbH1gO1xufVxuXG4vKiAhXG4gKiBsb3VwZVxuICogQ29weXJpZ2h0KGMpIDIwMTMgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuY29uc3Qgc3ltYm9sc1N1cHBvcnRlZCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09ICdmdW5jdGlvbic7XG5jb25zdCBjaGFpSW5zcGVjdCA9IHN5bWJvbHNTdXBwb3J0ZWQgPyBTeW1ib2wuZm9yKCdjaGFpL2luc3BlY3QnKSA6ICdAQGNoYWkvaW5zcGVjdCc7XG5jb25zdCBub2RlSW5zcGVjdCA9IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyk7XG5jb25zdCBjb25zdHJ1Y3Rvck1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzdHJpbmdUYWdNYXAgPSB7fTtcbmNvbnN0IGJhc2VUeXBlc01hcCA9IHtcbiAgICB1bmRlZmluZWQ6ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyksXG4gICAgbnVsbDogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoJ251bGwnLCAnbnVsbCcpLFxuICAgIGJvb2xlYW46ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksICdib29sZWFuJyksXG4gICAgQm9vbGVhbjogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoU3RyaW5nKHZhbHVlKSwgJ2Jvb2xlYW4nKSxcbiAgICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gICAgTnVtYmVyOiBpbnNwZWN0TnVtYmVyLFxuICAgIGJpZ2ludDogaW5zcGVjdEJpZ0ludCxcbiAgICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gICAgc3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICAgIFN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICAgIEZ1bmN0aW9uOiBpbnNwZWN0RnVuY3Rpb24sXG4gICAgc3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICAgIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgICBTeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gICAgQXJyYXk6IGluc3BlY3RBcnJheSxcbiAgICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgICBNYXA6IGluc3BlY3RNYXAsXG4gICAgU2V0OiBpbnNwZWN0U2V0LFxuICAgIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgICBQcm9taXNlOiBnZXRQcm9taXNlVmFsdWUsXG4gICAgLy8gV2Vha1NldCwgV2Vha01hcCBhcmUgdG90YWxseSBvcGFxdWUgdG8gdXNcbiAgICBXZWFrU2V0OiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZSgnV2Vha1NldHvigKZ9JywgJ3NwZWNpYWwnKSxcbiAgICBXZWFrTWFwOiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZSgnV2Vha01hcHvigKZ9JywgJ3NwZWNpYWwnKSxcbiAgICBBcmd1bWVudHM6IGluc3BlY3RBcmd1bWVudHMsXG4gICAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDE2QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEludDMyQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBGbG9hdDMyQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEZsb2F0NjRBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgR2VuZXJhdG9yOiAoKSA9PiAnJyxcbiAgICBEYXRhVmlldzogKCkgPT4gJycsXG4gICAgQXJyYXlCdWZmZXI6ICgpID0+ICcnLFxuICAgIEVycm9yOiBpbnNwZWN0T2JqZWN0LFxuICAgIEhUTUxDb2xsZWN0aW9uOiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG4gICAgTm9kZUxpc3Q6IGluc3BlY3ROb2RlQ29sbGVjdGlvbixcbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuY29uc3QgaW5zcGVjdEN1c3RvbSA9ICh2YWx1ZSwgb3B0aW9ucywgdHlwZSwgaW5zcGVjdEZuKSA9PiB7XG4gICAgaWYgKGNoYWlJbnNwZWN0IGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtjaGFpSW5zcGVjdF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlW2NoYWlJbnNwZWN0XShvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG5vZGVJbnNwZWN0IGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtub2RlSW5zcGVjdF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlW25vZGVJbnNwZWN0XShvcHRpb25zLmRlcHRoLCBvcHRpb25zLCBpbnNwZWN0Rm4pO1xuICAgIH1cbiAgICBpZiAoJ2luc3BlY3QnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5pbnNwZWN0KG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoJ2NvbnN0cnVjdG9yJyBpbiB2YWx1ZSAmJiBjb25zdHJ1Y3Rvck1hcC5oYXModmFsdWUuY29uc3RydWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck1hcC5nZXQodmFsdWUuY29uc3RydWN0b3IpKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlXSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVGFnTWFwW3R5cGVdKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufTtcbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBpbnNwZWN0JDEodmFsdWUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpc2VPcHRpb25zKG9wdHMsIGluc3BlY3QkMSk7XG4gICAgY29uc3QgeyBjdXN0b21JbnNwZWN0IH0gPSBvcHRpb25zO1xuICAgIGxldCB0eXBlID0gdmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHR5cGUgPSB0b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSk7XG4gICAgfVxuICAgIC8vIElmIGl0IGlzIGEgYmFzZSB2YWx1ZSB0aGF0IHdlIGFscmVhZHkgc3VwcG9ydCwgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcbiAgICBpZiAodHlwZSBpbiBiYXNlVHlwZXNNYXApIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUeXBlc01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIElmIGBvcHRpb25zLmN1c3RvbUluc3BlY3RgIGlzIHNldCB0byB0cnVlIHRoZW4gdHJ5IHRvIHVzZSB0aGUgY3VzdG9tIGluc3BlY3RvclxuICAgIGlmIChjdXN0b21JbnNwZWN0ICYmIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGluc3BlY3RDdXN0b20odmFsdWUsIG9wdGlvbnMsIHR5cGUsIGluc3BlY3QkMSk7XG4gICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QkMShvdXRwdXQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb3RvID0gdmFsdWUgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpIDogZmFsc2U7XG4gICAgLy8gSWYgaXQncyBhIHBsYWluIE9iamVjdCB0aGVuIHVzZSBMb3VwZSdzIGluc3BlY3RvclxuICAgIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaW5zcGVjdE9iamVjdCQxKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gU3BlY2lmaWNhbGx5IGFjY291bnQgZm9yIEhUTUxFbGVtZW50c1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RIVE1MKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCdjb25zdHJ1Y3RvcicgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgYSBjbGFzcywgaW5zcGVjdCBpdCBsaWtlIGFuIG9iamVjdCBidXQgYWRkIHRoZSBjb25zdHJ1Y3RvciBuYW1lXG4gICAgICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdENsYXNzKHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhbiBhbm9ueW1vdXMgcHJvdG90eXBlLCBkaXNwbGF5IGl0IGFzIGFuIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QkMSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIGxhc3QgY2hhbmNlIHRvIGNoZWNrIGlmIGl0J3MgYW4gb2JqZWN0XG4gICAgaWYgKHZhbHVlID09PSBPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0T2JqZWN0JDEodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBXZSBoYXZlIHJ1biBvdXQgb2Ygb3B0aW9ucyEgSnVzdCBzdHJpbmdpZnkgdGhlIHZhbHVlXG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCB0eXBlKTtcbn1cblxuY29uc3QgeyBBc3ltbWV0cmljTWF0Y2hlciwgRE9NQ29sbGVjdGlvbiwgRE9NRWxlbWVudCwgSW1tdXRhYmxlLCBSZWFjdEVsZW1lbnQsIFJlYWN0VGVzdENvbXBvbmVudCB9ID0gcGx1Z2lucztcbmNvbnN0IFBMVUdJTlMgPSBbXG5cdFJlYWN0VGVzdENvbXBvbmVudCxcblx0UmVhY3RFbGVtZW50LFxuXHRET01FbGVtZW50LFxuXHRET01Db2xsZWN0aW9uLFxuXHRJbW11dGFibGUsXG5cdEFzeW1tZXRyaWNNYXRjaGVyXG5dO1xuZnVuY3Rpb24gc3RyaW5naWZ5KG9iamVjdCwgbWF4RGVwdGggPSAxMCwgeyBtYXhMZW5ndGgsIGZpbHRlck5vZGUsIC4uLm9wdGlvbnMgfSA9IHt9KSB7XG5cdGNvbnN0IE1BWF9MRU5HVEggPSBtYXhMZW5ndGggPz8gMWU0O1xuXHRsZXQgcmVzdWx0O1xuXHQvLyBDb252ZXJ0IHN0cmluZyBzZWxlY3RvciB0byBmaWx0ZXIgZnVuY3Rpb25cblx0Y29uc3QgZmlsdGVyRm4gPSB0eXBlb2YgZmlsdGVyTm9kZSA9PT0gXCJzdHJpbmdcIiA/IGNyZWF0ZU5vZGVGaWx0ZXJGcm9tU2VsZWN0b3IoZmlsdGVyTm9kZSkgOiBmaWx0ZXJOb2RlO1xuXHRjb25zdCBwbHVnaW5zID0gZmlsdGVyRm4gPyBbXG5cdFx0UmVhY3RUZXN0Q29tcG9uZW50LFxuXHRcdFJlYWN0RWxlbWVudCxcblx0XHRjcmVhdGVET01FbGVtZW50RmlsdGVyKGZpbHRlckZuKSxcblx0XHRET01Db2xsZWN0aW9uLFxuXHRcdEltbXV0YWJsZSxcblx0XHRBc3ltbWV0cmljTWF0Y2hlclxuXHRdIDogUExVR0lOUztcblx0dHJ5IHtcblx0XHRyZXN1bHQgPSBmb3JtYXQkMShvYmplY3QsIHtcblx0XHRcdG1heERlcHRoLFxuXHRcdFx0ZXNjYXBlU3RyaW5nOiBmYWxzZSxcblx0XHRcdHBsdWdpbnMsXG5cdFx0XHQuLi5vcHRpb25zXG5cdFx0fSk7XG5cdH0gY2F0Y2gge1xuXHRcdHJlc3VsdCA9IGZvcm1hdCQxKG9iamVjdCwge1xuXHRcdFx0Y2FsbFRvSlNPTjogZmFsc2UsXG5cdFx0XHRtYXhEZXB0aCxcblx0XHRcdGVzY2FwZVN0cmluZzogZmFsc2UsXG5cdFx0XHRwbHVnaW5zLFxuXHRcdFx0Li4ub3B0aW9uc1xuXHRcdH0pO1xuXHR9XG5cdC8vIFByZXZlbnRzIGluZmluaXRlIGxvb3AgaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVzdC1kZXYvdml0ZXN0L2lzc3Vlcy83MjQ5XG5cdHJldHVybiByZXN1bHQubGVuZ3RoID49IE1BWF9MRU5HVEggJiYgbWF4RGVwdGggPiAxID8gc3RyaW5naWZ5KG9iamVjdCwgTWF0aC5mbG9vcihNYXRoLm1pbihtYXhEZXB0aCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIC8gMiksIHtcblx0XHRtYXhMZW5ndGgsXG5cdFx0ZmlsdGVyTm9kZSxcblx0XHQuLi5vcHRpb25zXG5cdH0pIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlTm9kZUZpbHRlckZyb21TZWxlY3RvcihzZWxlY3Rvcikge1xuXHRjb25zdCBFTEVNRU5UX05PREUgPSAxO1xuXHRjb25zdCBDT01NRU5UX05PREUgPSA4O1xuXHRyZXR1cm4gKG5vZGUpID0+IHtcblx0XHQvLyBGaWx0ZXIgb3V0IGNvbW1lbnRzXG5cdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBGaWx0ZXIgb3V0IGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuXHRcdGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgbm9kZS5tYXRjaGVzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gIW5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xufVxuY29uc3QgZm9ybWF0UmVnRXhwID0gLyVbc2RqaWZvT2MlXS9nO1xuZnVuY3Rpb24gYmFzZUZvcm1hdChhcmdzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZm9ybWF0QXJnID0gKGl0ZW0sIGluc3BlY09wdGlvbnMpID0+IHtcblx0XHRpZiAob3B0aW9ucy5wcmV0dGlmeU9iamVjdCkge1xuXHRcdFx0cmV0dXJuIHN0cmluZ2lmeShpdGVtLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0cHJpbnRCYXNpY1Byb3RvdHlwZTogZmFsc2UsXG5cdFx0XHRcdGVzY2FwZVN0cmluZzogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gaW5zcGVjdChpdGVtLCBpbnNwZWNPcHRpb25zKTtcblx0fTtcblx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0Y29uc3Qgb2JqZWN0cyA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b2JqZWN0cy5wdXNoKGZvcm1hdEFyZyhhcmdzW2ldLCB7XG5cdFx0XHRcdGRlcHRoOiAwLFxuXHRcdFx0XHRjb2xvcnM6IGZhbHNlXG5cdFx0XHR9KSk7XG5cdFx0fVxuXHRcdHJldHVybiBvYmplY3RzLmpvaW4oXCIgXCIpO1xuXHR9XG5cdGNvbnN0IGxlbiA9IGFyZ3MubGVuZ3RoO1xuXHRsZXQgaSA9IDE7XG5cdGNvbnN0IHRlbXBsYXRlID0gYXJnc1swXTtcblx0bGV0IHN0ciA9IFN0cmluZyh0ZW1wbGF0ZSkucmVwbGFjZShmb3JtYXRSZWdFeHAsICh4KSA9PiB7XG5cdFx0aWYgKHggPT09IFwiJSVcIikge1xuXHRcdFx0cmV0dXJuIFwiJVwiO1xuXHRcdH1cblx0XHRpZiAoaSA+PSBsZW4pIHtcblx0XHRcdHJldHVybiB4O1xuXHRcdH1cblx0XHRzd2l0Y2ggKHgpIHtcblx0XHRcdGNhc2UgXCIlc1wiOiB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXJnc1tpKytdO1xuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGAke3ZhbHVlLnRvU3RyaW5nKCl9bmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiLTBcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZS50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZvcm1hdEFyZyh2YWx1ZSwge1xuXHRcdFx0XHRcdFx0ZGVwdGg6IDAsXG5cdFx0XHRcdFx0XHRjb2xvcnM6IGZhbHNlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFN0cmluZyh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiJWRcIjoge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFyZ3NbaSsrXTtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuXHRcdFx0XHRcdHJldHVybiBgJHt2YWx1ZS50b1N0cmluZygpfW5gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJOYU5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIiVpXCI6IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBhcmdzW2krK107XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gYCR7dmFsdWUudG9TdHJpbmcoKX1uYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyLnBhcnNlSW50KFN0cmluZyh2YWx1ZSkpLnRvU3RyaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiJWZcIjogcmV0dXJuIE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhhcmdzW2krK10pKS50b1N0cmluZygpO1xuXHRcdFx0Y2FzZSBcIiVvXCI6IHJldHVybiBmb3JtYXRBcmcoYXJnc1tpKytdLCB7XG5cdFx0XHRcdHNob3dIaWRkZW46IHRydWUsXG5cdFx0XHRcdHNob3dQcm94eTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0XHRjYXNlIFwiJU9cIjogcmV0dXJuIGZvcm1hdEFyZyhhcmdzW2krK10pO1xuXHRcdFx0Y2FzZSBcIiVjXCI6IHtcblx0XHRcdFx0aSsrO1xuXHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCIlalwiOiB0cnkge1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRjb25zdCBtID0gZXJyLm1lc3NhZ2U7XG5cdFx0XHRcdGlmIChtLmluY2x1ZGVzKFwiY2lyY3VsYXIgc3RydWN0dXJlXCIpIHx8IG0uaW5jbHVkZXMoXCJjeWNsaWMgc3RydWN0dXJlc1wiKSB8fCBtLmluY2x1ZGVzKFwiY3ljbGljIG9iamVjdFwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBcIltDaXJjdWxhcl1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9XG5cdFx0XHRkZWZhdWx0OiByZXR1cm4geDtcblx0XHR9XG5cdH0pO1xuXHRmb3IgKGxldCB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuXHRcdGlmICh4ID09PSBudWxsIHx8IHR5cGVvZiB4ICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRzdHIgKz0gYCAke3R5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geC50b1N0cmluZygpIDogeH1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHIgKz0gYCAke2Zvcm1hdEFyZyh4KX1gO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gZm9ybWF0KC4uLmFyZ3MpIHtcblx0cmV0dXJuIGJhc2VGb3JtYXQoYXJncyk7XG59XG5mdW5jdGlvbiBicm93c2VyRm9ybWF0KC4uLmFyZ3MpIHtcblx0cmV0dXJuIGJhc2VGb3JtYXQoYXJncywgeyBwcmV0dGlmeU9iamVjdDogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRpb25zID0ge30pIHtcblx0aWYgKG9wdGlvbnMudHJ1bmNhdGUgPT09IDApIHtcblx0XHRvcHRpb25zLnRydW5jYXRlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHR9XG5cdHJldHVybiBpbnNwZWN0JDEob2JqLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIG9iakRpc3BsYXkob2JqLCBvcHRpb25zID0ge30pIHtcblx0aWYgKHR5cGVvZiBvcHRpb25zLnRydW5jYXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0b3B0aW9ucy50cnVuY2F0ZSA9IDQwO1xuXHR9XG5cdGNvbnN0IHN0ciA9IGluc3BlY3Qob2JqLCBvcHRpb25zKTtcblx0Y29uc3QgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuXHRpZiAob3B0aW9ucy50cnVuY2F0ZSAmJiBzdHIubGVuZ3RoID49IG9wdGlvbnMudHJ1bmNhdGUpIHtcblx0XHRpZiAodHlwZSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiKSB7XG5cdFx0XHRjb25zdCBmbiA9IG9iajtcblx0XHRcdHJldHVybiAhZm4ubmFtZSA/IFwiW0Z1bmN0aW9uXVwiIDogYFtGdW5jdGlvbjogJHtmbi5uYW1lfV1gO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG5cdFx0XHRyZXR1cm4gYFsgQXJyYXkoJHtvYmoubGVuZ3RofSkgXWA7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG5cdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRcdGNvbnN0IGtzdHIgPSBrZXlzLmxlbmd0aCA+IDIgPyBgJHtrZXlzLnNwbGljZSgwLCAyKS5qb2luKFwiLCBcIil9LCAuLi5gIDoga2V5cy5qb2luKFwiLCBcIik7XG5cdFx0XHRyZXR1cm4gYHsgT2JqZWN0ICgke2tzdHJ9KSB9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IHsgYnJvd3NlckZvcm1hdCwgZm9ybWF0LCBmb3JtYXRSZWdFeHAsIGluc3BlY3QsIG9iakRpc3BsYXksIHN0cmluZ2lmeSB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBTSxhQUFhO0NBQ2YsTUFBTSxDQUFDLEtBQUssS0FBSztDQUNqQixLQUFLLENBQUMsS0FBSyxLQUFLO0NBQ2hCLFFBQVEsQ0FBQyxLQUFLLEtBQUs7Q0FDbkIsV0FBVyxDQUFDLEtBQUssS0FBSztDQUV0QixTQUFTLENBQUMsS0FBSyxLQUFLO0NBQ3BCLFFBQVEsQ0FBQyxLQUFLLEtBQUs7Q0FDbkIsUUFBUSxDQUFDLEtBQUssS0FBSztDQUduQixPQUFPLENBQUMsTUFBTSxLQUFLO0NBQ25CLEtBQUssQ0FBQyxNQUFNLEtBQUs7Q0FDakIsT0FBTyxDQUFDLE1BQU0sS0FBSztDQUNuQixRQUFRLENBQUMsTUFBTSxLQUFLO0NBQ3BCLE1BQU0sQ0FBQyxNQUFNLEtBQUs7Q0FDbEIsU0FBUyxDQUFDLE1BQU0sS0FBSztDQUNyQixNQUFNLENBQUMsTUFBTSxLQUFLO0NBQ2xCLE9BQU8sQ0FBQyxNQUFNLEtBQUs7Q0FDbkIsYUFBYSxDQUFDLFFBQVEsS0FBSztDQUMzQixXQUFXLENBQUMsUUFBUSxLQUFLO0NBQ3pCLGFBQWEsQ0FBQyxRQUFRLEtBQUs7Q0FDM0IsY0FBYyxD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
|