@cartanova/qgrid-cli 1.0.1 → 1.0.3
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/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
- package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
- package/bundle/dist/dist/_virtual/_rolldown/runtime.js +15 -0
- package/bundle/dist/dist/application/qgrid/oauth.js +140 -0
- package/bundle/dist/dist/application/qgrid/pool.js +100 -0
- package/bundle/dist/dist/application/qgrid/qgrid.frame.js +280 -0
- package/bundle/dist/dist/application/qgrid/qgrid.types.js +79 -0
- package/bundle/dist/dist/application/qgrid/worker.js +183 -0
- package/bundle/dist/dist/application/queries.generated.js +31 -0
- package/bundle/dist/dist/application/request-log/request-log.model.js +113 -0
- package/bundle/dist/dist/application/request-log/request-log.types.js +13 -0
- package/bundle/dist/dist/application/sonamu.generated.js +99 -0
- package/bundle/dist/dist/application/sonamu.generated.sso.js +34 -0
- package/bundle/dist/dist/application/token/token.model.js +157 -0
- package/bundle/dist/dist/application/token/token.types.js +22 -0
- package/bundle/dist/dist/i18n/en.js +63 -0
- package/bundle/dist/dist/i18n/ko.js +62 -0
- package/bundle/dist/dist/i18n/sd.generated.js +272 -0
- package/bundle/dist/dist/index.js +11 -0
- package/bundle/dist/dist/migrations/20260410171405_create__request_logs.js +26 -0
- package/bundle/dist/dist/migrations/20260410171406_create__tokens.js +24 -0
- package/bundle/dist/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
- package/bundle/dist/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
- package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
- package/bundle/dist/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
- package/bundle/dist/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
- package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
- package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
- package/bundle/dist/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
- package/bundle/dist/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
- 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 +426 -0
- 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 +6 -0
- 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 +41 -0
- 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 +19 -0
- 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 +202 -0
- 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 +16 -0
- 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 +59 -0
- 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 +2910 -0
- 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 +44 -0
- 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 +28 -0
- package/bundle/dist/dist/sonamu.config.js +196 -0
- package/bundle/dist/dist/testing/fixture.js +8 -0
- package/bundle/dist/dist/testing/global.js +9 -0
- package/bundle/dist/dist/testing/setup-mocks.js +17 -0
- package/bundle/dist/dist/utils/subset-loaders.js +12 -0
- package/bundle/src/application/qgrid/oauth.ts +181 -0
- package/bundle/src/application/qgrid/pool.ts +132 -0
- package/bundle/src/application/qgrid/qgrid.frame.ts +275 -0
- package/bundle/src/application/qgrid/qgrid.types.ts +117 -0
- package/bundle/src/application/qgrid/worker.ts +234 -0
- package/bundle/src/application/queries.generated.ts +59 -0
- package/bundle/src/application/request-log/request-log.model.ts +155 -0
- package/bundle/src/application/request-log/request-log.types.ts +15 -0
- package/bundle/src/application/sonamu.generated.http +187 -0
- package/bundle/src/application/sonamu.generated.sso.ts +66 -0
- package/bundle/src/application/sonamu.generated.ts +135 -0
- package/bundle/src/application/token/token.model.ts +160 -0
- package/bundle/src/application/token/token.types.ts +26 -0
- package/bundle/src/i18n/en.ts +59 -0
- package/bundle/src/i18n/ko.ts +59 -0
- package/bundle/src/i18n/sd.generated.ts +384 -0
- package/bundle/src/index.ts +6 -0
- package/bundle/src/sonamu.config.ts +248 -0
- package/bundle/src/src/application/qgrid/oauth.ts +181 -0
- package/bundle/src/src/application/qgrid/pool.ts +132 -0
- package/bundle/src/src/application/qgrid/qgrid.frame.ts +275 -0
- package/bundle/src/src/application/qgrid/qgrid.types.ts +117 -0
- package/bundle/src/src/application/qgrid/worker.ts +234 -0
- package/bundle/src/src/application/queries.generated.ts +59 -0
- package/bundle/src/src/application/request-log/request-log.entity.json +75 -0
- package/bundle/src/src/application/request-log/request-log.model.ts +155 -0
- package/bundle/src/src/application/request-log/request-log.types.ts +15 -0
- package/bundle/src/src/application/sonamu.generated.http +187 -0
- package/bundle/src/src/application/sonamu.generated.sso.ts +66 -0
- package/bundle/src/src/application/sonamu.generated.ts +135 -0
- package/bundle/src/src/application/token/token.entity.json +37 -0
- package/bundle/src/src/application/token/token.model.ts +160 -0
- package/bundle/src/src/application/token/token.types.ts +26 -0
- package/bundle/src/src/i18n/en.ts +59 -0
- package/bundle/src/src/i18n/ko.ts +59 -0
- package/bundle/src/src/i18n/sd.generated.ts +384 -0
- package/bundle/src/src/index.ts +6 -0
- package/bundle/src/src/migrations/20260410171405_create__request_logs.ts +23 -0
- package/bundle/src/src/migrations/20260410171406_create__tokens.ts +21 -0
- package/bundle/src/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
- package/bundle/src/src/sonamu.config.ts +248 -0
- package/bundle/src/src/testing/fixture.ts +6 -0
- package/bundle/src/src/testing/global.ts +6 -0
- package/bundle/src/src/testing/setup-mocks.ts +44 -0
- package/bundle/src/src/typings/fastify.d.ts +8 -0
- package/bundle/src/src/typings/sonamu.d.ts +17 -0
- package/bundle/src/src/utils/subset-loaders.ts +11 -0
- package/bundle/src/testing/fixture.ts +6 -0
- package/bundle/src/testing/global.ts +6 -0
- package/bundle/src/testing/setup-mocks.ts +44 -0
- package/bundle/src/typings/fastify.d.ts +8 -0
- package/bundle/src/typings/sonamu.d.ts +17 -0
- package/bundle/src/utils/subset-loaders.ts +11 -0
- package/bundle/web-dist/web-dist/client/assets/index-DlPchHBY.js +116 -0
- package/bundle/web-dist/web-dist/client/assets/index-vZsvyuFn.css +1 -0
- package/bundle/web-dist/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/routes-CagDz23B.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
- package/bundle/web-dist/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/show-aXUGa0gm.js +29 -0
- package/bundle/web-dist/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
- package/bundle/web-dist/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
- package/bundle/web-dist/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
- package/bundle/web-dist/web-dist/client/index.html +18 -0
- package/bundle/web-dist/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
- package/bundle/web-dist/web-dist/server/assets/routes-ClzReRep.js +490 -0
- package/bundle/web-dist/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
- package/bundle/web-dist/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
- package/bundle/web-dist/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
- package/bundle/web-dist/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
- package/bundle/web-dist/web-dist/server/entry-server.generated.js +44646 -0
- package/package.json +11 -10
|
@@ -0,0 +1,887 @@
|
|
|
1
|
+
import { y } from "../../../../../tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js";
|
|
2
|
+
//#region ../../node_modules/.pnpm/@vitest+pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js
|
|
3
|
+
function _mergeNamespaces(n, m) {
|
|
4
|
+
m.forEach(function(e) {
|
|
5
|
+
e && typeof e !== "string" && !Array.isArray(e) && Object.keys(e).forEach(function(k) {
|
|
6
|
+
if (k !== "default" && !(k in n)) {
|
|
7
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
8
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function() {
|
|
11
|
+
return e[k];
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
return Object.freeze(n);
|
|
18
|
+
}
|
|
19
|
+
function getKeysOfEnumerableProperties(object, compareKeys) {
|
|
20
|
+
const rawKeys = Object.keys(object);
|
|
21
|
+
const keys = compareKeys === null ? rawKeys : rawKeys.sort(compareKeys);
|
|
22
|
+
if (Object.getOwnPropertySymbols) {
|
|
23
|
+
for (const symbol of Object.getOwnPropertySymbols(object)) if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) keys.push(symbol);
|
|
24
|
+
}
|
|
25
|
+
return keys;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Return entries (for example, of a map)
|
|
29
|
+
* with spacing, indentation, and comma
|
|
30
|
+
* without surrounding punctuation (for example, braces)
|
|
31
|
+
*/
|
|
32
|
+
function printIteratorEntries(iterator, config, indentation, depth, refs, printer, separator = ": ") {
|
|
33
|
+
let result = "";
|
|
34
|
+
let width = 0;
|
|
35
|
+
let current = iterator.next();
|
|
36
|
+
if (!current.done) {
|
|
37
|
+
result += config.spacingOuter;
|
|
38
|
+
const indentationNext = indentation + config.indent;
|
|
39
|
+
while (!current.done) {
|
|
40
|
+
result += indentationNext;
|
|
41
|
+
if (width++ === config.maxWidth) {
|
|
42
|
+
result += "…";
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
const name = printer(current.value[0], config, indentationNext, depth, refs);
|
|
46
|
+
const value = printer(current.value[1], config, indentationNext, depth, refs);
|
|
47
|
+
result += name + separator + value;
|
|
48
|
+
current = iterator.next();
|
|
49
|
+
if (!current.done) result += `,${config.spacingInner}`;
|
|
50
|
+
else if (!config.min) result += ",";
|
|
51
|
+
}
|
|
52
|
+
result += config.spacingOuter + indentation;
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Return values (for example, of a set)
|
|
58
|
+
* with spacing, indentation, and comma
|
|
59
|
+
* without surrounding punctuation (braces or brackets)
|
|
60
|
+
*/
|
|
61
|
+
function printIteratorValues(iterator, config, indentation, depth, refs, printer) {
|
|
62
|
+
let result = "";
|
|
63
|
+
let width = 0;
|
|
64
|
+
let current = iterator.next();
|
|
65
|
+
if (!current.done) {
|
|
66
|
+
result += config.spacingOuter;
|
|
67
|
+
const indentationNext = indentation + config.indent;
|
|
68
|
+
while (!current.done) {
|
|
69
|
+
result += indentationNext;
|
|
70
|
+
if (width++ === config.maxWidth) {
|
|
71
|
+
result += "…";
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
result += printer(current.value, config, indentationNext, depth, refs);
|
|
75
|
+
current = iterator.next();
|
|
76
|
+
if (!current.done) result += `,${config.spacingInner}`;
|
|
77
|
+
else if (!config.min) result += ",";
|
|
78
|
+
}
|
|
79
|
+
result += config.spacingOuter + indentation;
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Return items (for example, of an array)
|
|
85
|
+
* with spacing, indentation, and comma
|
|
86
|
+
* without surrounding punctuation (for example, brackets)
|
|
87
|
+
*/
|
|
88
|
+
function printListItems(list, config, indentation, depth, refs, printer) {
|
|
89
|
+
let result = "";
|
|
90
|
+
list = list instanceof ArrayBuffer ? new DataView(list) : list;
|
|
91
|
+
const isDataView = (l) => l instanceof DataView;
|
|
92
|
+
const length = isDataView(list) ? list.byteLength : list.length;
|
|
93
|
+
if (length > 0) {
|
|
94
|
+
result += config.spacingOuter;
|
|
95
|
+
const indentationNext = indentation + config.indent;
|
|
96
|
+
for (let i = 0; i < length; i++) {
|
|
97
|
+
result += indentationNext;
|
|
98
|
+
if (i === config.maxWidth) {
|
|
99
|
+
result += "…";
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
if (isDataView(list) || i in list) result += printer(isDataView(list) ? list.getInt8(i) : list[i], config, indentationNext, depth, refs);
|
|
103
|
+
if (i < length - 1) result += `,${config.spacingInner}`;
|
|
104
|
+
else if (!config.min) result += ",";
|
|
105
|
+
}
|
|
106
|
+
result += config.spacingOuter + indentation;
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Return properties of an object
|
|
112
|
+
* with spacing, indentation, and comma
|
|
113
|
+
* without surrounding punctuation (for example, braces)
|
|
114
|
+
*/
|
|
115
|
+
function printObjectProperties(val, config, indentation, depth, refs, printer) {
|
|
116
|
+
let result = "";
|
|
117
|
+
const keys = getKeysOfEnumerableProperties(val, config.compareKeys);
|
|
118
|
+
if (keys.length > 0) {
|
|
119
|
+
result += config.spacingOuter;
|
|
120
|
+
const indentationNext = indentation + config.indent;
|
|
121
|
+
for (let i = 0; i < keys.length; i++) {
|
|
122
|
+
const key = keys[i];
|
|
123
|
+
const name = printer(key, config, indentationNext, depth, refs);
|
|
124
|
+
const value = printer(val[key], config, indentationNext, depth, refs);
|
|
125
|
+
result += `${indentationNext + name}: ${value}`;
|
|
126
|
+
if (i < keys.length - 1) result += `,${config.spacingInner}`;
|
|
127
|
+
else if (!config.min) result += ",";
|
|
128
|
+
}
|
|
129
|
+
result += config.spacingOuter + indentation;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
const asymmetricMatcher = typeof Symbol === "function" && Symbol.for ? Symbol.for("jest.asymmetricMatcher") : 1267621;
|
|
134
|
+
const SPACE$2 = " ";
|
|
135
|
+
const serialize$5 = (val, config, indentation, depth, refs, printer) => {
|
|
136
|
+
const stringedValue = val.toString();
|
|
137
|
+
if (stringedValue === "ArrayContaining" || stringedValue === "ArrayNotContaining") {
|
|
138
|
+
if (++depth > config.maxDepth) return `[${stringedValue}]`;
|
|
139
|
+
return `${stringedValue + SPACE$2}[${printListItems(val.sample, config, indentation, depth, refs, printer)}]`;
|
|
140
|
+
}
|
|
141
|
+
if (stringedValue === "ObjectContaining" || stringedValue === "ObjectNotContaining") {
|
|
142
|
+
if (++depth > config.maxDepth) return `[${stringedValue}]`;
|
|
143
|
+
return `${stringedValue + SPACE$2}{${printObjectProperties(val.sample, config, indentation, depth, refs, printer)}}`;
|
|
144
|
+
}
|
|
145
|
+
if (stringedValue === "StringMatching" || stringedValue === "StringNotMatching") return stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs);
|
|
146
|
+
if (stringedValue === "StringContaining" || stringedValue === "StringNotContaining") return stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs);
|
|
147
|
+
if (typeof val.toAsymmetricMatcher !== "function") throw new TypeError(`Asymmetric matcher ${val.constructor.name} does not implement toAsymmetricMatcher()`);
|
|
148
|
+
return val.toAsymmetricMatcher();
|
|
149
|
+
};
|
|
150
|
+
const test$5 = (val) => val && val.$$typeof === asymmetricMatcher;
|
|
151
|
+
const plugin$5 = {
|
|
152
|
+
serialize: serialize$5,
|
|
153
|
+
test: test$5
|
|
154
|
+
};
|
|
155
|
+
const SPACE$1 = " ";
|
|
156
|
+
const OBJECT_NAMES = new Set(["DOMStringMap", "NamedNodeMap"]);
|
|
157
|
+
const ARRAY_REGEXP = /^(?:HTML\w*Collection|NodeList)$/;
|
|
158
|
+
function testName(name) {
|
|
159
|
+
return OBJECT_NAMES.has(name) || ARRAY_REGEXP.test(name);
|
|
160
|
+
}
|
|
161
|
+
const test$4 = (val) => val && val.constructor && !!val.constructor.name && testName(val.constructor.name);
|
|
162
|
+
function isNamedNodeMap(collection) {
|
|
163
|
+
return collection.constructor.name === "NamedNodeMap";
|
|
164
|
+
}
|
|
165
|
+
const serialize$4 = (collection, config, indentation, depth, refs, printer) => {
|
|
166
|
+
const name = collection.constructor.name;
|
|
167
|
+
if (++depth > config.maxDepth) return `[${name}]`;
|
|
168
|
+
return (config.min ? "" : name + SPACE$1) + (OBJECT_NAMES.has(name) ? `{${printObjectProperties(isNamedNodeMap(collection) ? [...collection].reduce((props, attribute) => {
|
|
169
|
+
props[attribute.name] = attribute.value;
|
|
170
|
+
return props;
|
|
171
|
+
}, {}) : { ...collection }, config, indentation, depth, refs, printer)}}` : `[${printListItems([...collection], config, indentation, depth, refs, printer)}]`);
|
|
172
|
+
};
|
|
173
|
+
const plugin$4 = {
|
|
174
|
+
serialize: serialize$4,
|
|
175
|
+
test: test$4
|
|
176
|
+
};
|
|
177
|
+
/**
|
|
178
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
179
|
+
*
|
|
180
|
+
* This source code is licensed under the MIT license found in the
|
|
181
|
+
* LICENSE file in the root directory of this source tree.
|
|
182
|
+
*/
|
|
183
|
+
function escapeHTML(str) {
|
|
184
|
+
return str.replaceAll("<", "<").replaceAll(">", ">");
|
|
185
|
+
}
|
|
186
|
+
function printProps(keys, props, config, indentation, depth, refs, printer) {
|
|
187
|
+
const indentationNext = indentation + config.indent;
|
|
188
|
+
const colors = config.colors;
|
|
189
|
+
return keys.map((key) => {
|
|
190
|
+
const value = props[key];
|
|
191
|
+
if (typeof value === "string" && value[0] === "_" && value.startsWith("__vitest_") && value.match(/__vitest_\d+__/)) return "";
|
|
192
|
+
let printed = printer(value, config, indentationNext, depth, refs);
|
|
193
|
+
if (typeof value !== "string") {
|
|
194
|
+
if (printed.includes("\n")) printed = config.spacingOuter + indentationNext + printed + config.spacingOuter + indentation;
|
|
195
|
+
printed = `{${printed}}`;
|
|
196
|
+
}
|
|
197
|
+
return `${config.spacingInner + indentation + colors.prop.open + key + colors.prop.close}=${colors.value.open}${printed}${colors.value.close}`;
|
|
198
|
+
}).join("");
|
|
199
|
+
}
|
|
200
|
+
function printChildren(children, config, indentation, depth, refs, printer) {
|
|
201
|
+
return children.map((child) => config.spacingOuter + indentation + (typeof child === "string" ? printText(child, config) : printer(child, config, indentation, depth, refs))).join("");
|
|
202
|
+
}
|
|
203
|
+
function printShadowRoot(children, config, indentation, depth, refs, printer) {
|
|
204
|
+
if (config.printShadowRoot === false) return "";
|
|
205
|
+
return [`${config.spacingOuter + indentation}#shadow-root`, printChildren(children, config, indentation + config.indent, depth, refs, printer)].join("");
|
|
206
|
+
}
|
|
207
|
+
function printText(text, config) {
|
|
208
|
+
const contentColor = config.colors.content;
|
|
209
|
+
return contentColor.open + escapeHTML(text) + contentColor.close;
|
|
210
|
+
}
|
|
211
|
+
function printComment(comment, config) {
|
|
212
|
+
const commentColor = config.colors.comment;
|
|
213
|
+
return `${commentColor.open}<!--${escapeHTML(comment)}-->${commentColor.close}`;
|
|
214
|
+
}
|
|
215
|
+
function printElement(type, printedProps, printedChildren, config, indentation) {
|
|
216
|
+
const tagColor = config.colors.tag;
|
|
217
|
+
return `${tagColor.open}<${type}${printedProps && tagColor.close + printedProps + config.spacingOuter + indentation + tagColor.open}${printedChildren ? `>${tagColor.close}${printedChildren}${config.spacingOuter}${indentation}${tagColor.open}</${type}` : `${printedProps && !config.min ? "" : " "}/`}>${tagColor.close}`;
|
|
218
|
+
}
|
|
219
|
+
function printElementAsLeaf(type, config) {
|
|
220
|
+
const tagColor = config.colors.tag;
|
|
221
|
+
return `${tagColor.open}<${type}${tagColor.close} …${tagColor.open} />${tagColor.close}`;
|
|
222
|
+
}
|
|
223
|
+
const ELEMENT_NODE = 1;
|
|
224
|
+
const TEXT_NODE = 3;
|
|
225
|
+
const COMMENT_NODE = 8;
|
|
226
|
+
const FRAGMENT_NODE = 11;
|
|
227
|
+
const ELEMENT_REGEXP = /^(?:(?:HTML|SVG)\w*)?Element$/;
|
|
228
|
+
function testHasAttribute(val) {
|
|
229
|
+
try {
|
|
230
|
+
return typeof val.hasAttribute === "function" && val.hasAttribute("is");
|
|
231
|
+
} catch {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function testNode(val) {
|
|
236
|
+
const constructorName = val.constructor.name;
|
|
237
|
+
const { nodeType, tagName } = val;
|
|
238
|
+
const isCustomElement = typeof tagName === "string" && tagName.includes("-") || testHasAttribute(val);
|
|
239
|
+
return nodeType === ELEMENT_NODE && (ELEMENT_REGEXP.test(constructorName) || isCustomElement) || nodeType === TEXT_NODE && constructorName === "Text" || nodeType === COMMENT_NODE && constructorName === "Comment" || nodeType === FRAGMENT_NODE && constructorName === "DocumentFragment";
|
|
240
|
+
}
|
|
241
|
+
const test$3 = (val) => val?.constructor?.name && testNode(val);
|
|
242
|
+
function nodeIsText(node) {
|
|
243
|
+
return node.nodeType === TEXT_NODE;
|
|
244
|
+
}
|
|
245
|
+
function nodeIsComment(node) {
|
|
246
|
+
return node.nodeType === COMMENT_NODE;
|
|
247
|
+
}
|
|
248
|
+
function nodeIsFragment(node) {
|
|
249
|
+
return node.nodeType === FRAGMENT_NODE;
|
|
250
|
+
}
|
|
251
|
+
function filterChildren(children, filterNode) {
|
|
252
|
+
let filtered = children.filter((node) => {
|
|
253
|
+
if (node.nodeType === TEXT_NODE) return (node.data || "").trim().length > 0;
|
|
254
|
+
return true;
|
|
255
|
+
});
|
|
256
|
+
if (filterNode) filtered = filtered.filter(filterNode);
|
|
257
|
+
return filtered;
|
|
258
|
+
}
|
|
259
|
+
function serializeDOM(node, config, indentation, depth, refs, printer, filterNode) {
|
|
260
|
+
if (nodeIsText(node)) return printText(node.data, config);
|
|
261
|
+
if (nodeIsComment(node)) return printComment(node.data, config);
|
|
262
|
+
const type = nodeIsFragment(node) ? "DocumentFragment" : node.tagName.toLowerCase();
|
|
263
|
+
if (++depth > config.maxDepth) return printElementAsLeaf(type, config);
|
|
264
|
+
const children = Array.prototype.slice.call(node.childNodes || node.children);
|
|
265
|
+
const shadowChildren = nodeIsFragment(node) || !node.shadowRoot ? [] : Array.prototype.slice.call(node.shadowRoot.children);
|
|
266
|
+
const resolvedChildren = filterNode ? filterChildren(children, filterNode) : children;
|
|
267
|
+
const resolvedShadowChildren = filterNode ? filterChildren(shadowChildren, filterNode) : shadowChildren;
|
|
268
|
+
return printElement(type, printProps(nodeIsFragment(node) ? [] : Array.from(node.attributes, (attr) => attr.name).sort(), nodeIsFragment(node) ? {} : [...node.attributes].reduce((props, attribute) => {
|
|
269
|
+
props[attribute.name] = attribute.value;
|
|
270
|
+
return props;
|
|
271
|
+
}, {}), config, indentation + config.indent, depth, refs, printer), (resolvedShadowChildren.length > 0 ? printShadowRoot(resolvedShadowChildren, config, indentation + config.indent, depth, refs, printer) : "") + printChildren(resolvedChildren, config, indentation + config.indent, depth, refs, printer), config, indentation);
|
|
272
|
+
}
|
|
273
|
+
const serialize$3 = (node, config, indentation, depth, refs, printer) => serializeDOM(node, config, indentation, depth, refs, printer);
|
|
274
|
+
function createDOMElementFilter(filterNode) {
|
|
275
|
+
return {
|
|
276
|
+
test: test$3,
|
|
277
|
+
serialize: (node, config, indentation, depth, refs, printer) => serializeDOM(node, config, indentation, depth, refs, printer, filterNode)
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
const plugin$3 = {
|
|
281
|
+
serialize: serialize$3,
|
|
282
|
+
test: test$3
|
|
283
|
+
};
|
|
284
|
+
const IS_ITERABLE_SENTINEL = "@@__IMMUTABLE_ITERABLE__@@";
|
|
285
|
+
const IS_LIST_SENTINEL = "@@__IMMUTABLE_LIST__@@";
|
|
286
|
+
const IS_KEYED_SENTINEL = "@@__IMMUTABLE_KEYED__@@";
|
|
287
|
+
const IS_MAP_SENTINEL = "@@__IMMUTABLE_MAP__@@";
|
|
288
|
+
const IS_ORDERED_SENTINEL = "@@__IMMUTABLE_ORDERED__@@";
|
|
289
|
+
const IS_RECORD_SENTINEL = "@@__IMMUTABLE_RECORD__@@";
|
|
290
|
+
const IS_SEQ_SENTINEL = "@@__IMMUTABLE_SEQ__@@";
|
|
291
|
+
const IS_SET_SENTINEL = "@@__IMMUTABLE_SET__@@";
|
|
292
|
+
const IS_STACK_SENTINEL = "@@__IMMUTABLE_STACK__@@";
|
|
293
|
+
const getImmutableName = (name) => `Immutable.${name}`;
|
|
294
|
+
const printAsLeaf = (name) => `[${name}]`;
|
|
295
|
+
const SPACE = " ";
|
|
296
|
+
const LAZY = "…";
|
|
297
|
+
function printImmutableEntries(val, config, indentation, depth, refs, printer, type) {
|
|
298
|
+
return ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : `${getImmutableName(type) + SPACE}{${printIteratorEntries(val.entries(), config, indentation, depth, refs, printer)}}`;
|
|
299
|
+
}
|
|
300
|
+
function getRecordEntries(val) {
|
|
301
|
+
let i = 0;
|
|
302
|
+
return { next() {
|
|
303
|
+
if (i < val._keys.length) {
|
|
304
|
+
const key = val._keys[i++];
|
|
305
|
+
return {
|
|
306
|
+
done: false,
|
|
307
|
+
value: [key, val.get(key)]
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
done: true,
|
|
312
|
+
value: void 0
|
|
313
|
+
};
|
|
314
|
+
} };
|
|
315
|
+
}
|
|
316
|
+
function printImmutableRecord(val, config, indentation, depth, refs, printer) {
|
|
317
|
+
const name = getImmutableName(val._name || "Record");
|
|
318
|
+
return ++depth > config.maxDepth ? printAsLeaf(name) : `${name + SPACE}{${printIteratorEntries(getRecordEntries(val), config, indentation, depth, refs, printer)}}`;
|
|
319
|
+
}
|
|
320
|
+
function printImmutableSeq(val, config, indentation, depth, refs, printer) {
|
|
321
|
+
const name = getImmutableName("Seq");
|
|
322
|
+
if (++depth > config.maxDepth) return printAsLeaf(name);
|
|
323
|
+
if (val[IS_KEYED_SENTINEL]) return `${name + SPACE}{${val._iter || val._object ? printIteratorEntries(val.entries(), config, indentation, depth, refs, printer) : LAZY}}`;
|
|
324
|
+
return `${name + SPACE}[${val._iter || val._array || val._collection || val._iterable ? printIteratorValues(val.values(), config, indentation, depth, refs, printer) : LAZY}]`;
|
|
325
|
+
}
|
|
326
|
+
function printImmutableValues(val, config, indentation, depth, refs, printer, type) {
|
|
327
|
+
return ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : `${getImmutableName(type) + SPACE}[${printIteratorValues(val.values(), config, indentation, depth, refs, printer)}]`;
|
|
328
|
+
}
|
|
329
|
+
const serialize$2 = (val, config, indentation, depth, refs, printer) => {
|
|
330
|
+
if (val[IS_MAP_SENTINEL]) return printImmutableEntries(val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? "OrderedMap" : "Map");
|
|
331
|
+
if (val[IS_LIST_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, "List");
|
|
332
|
+
if (val[IS_SET_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? "OrderedSet" : "Set");
|
|
333
|
+
if (val[IS_STACK_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, "Stack");
|
|
334
|
+
if (val[IS_SEQ_SENTINEL]) return printImmutableSeq(val, config, indentation, depth, refs, printer);
|
|
335
|
+
return printImmutableRecord(val, config, indentation, depth, refs, printer);
|
|
336
|
+
};
|
|
337
|
+
const test$2 = (val) => val && (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true);
|
|
338
|
+
const plugin$2 = {
|
|
339
|
+
serialize: serialize$2,
|
|
340
|
+
test: test$2
|
|
341
|
+
};
|
|
342
|
+
function getDefaultExportFromCjs(x) {
|
|
343
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
344
|
+
}
|
|
345
|
+
var reactIs$1 = { exports: {} };
|
|
346
|
+
var reactIs_production = {};
|
|
347
|
+
/**
|
|
348
|
+
* @license React
|
|
349
|
+
* react-is.production.js
|
|
350
|
+
*
|
|
351
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
352
|
+
*
|
|
353
|
+
* This source code is licensed under the MIT license found in the
|
|
354
|
+
* LICENSE file in the root directory of this source tree.
|
|
355
|
+
*/
|
|
356
|
+
var hasRequiredReactIs_production;
|
|
357
|
+
function requireReactIs_production() {
|
|
358
|
+
if (hasRequiredReactIs_production) return reactIs_production;
|
|
359
|
+
hasRequiredReactIs_production = 1;
|
|
360
|
+
var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"), REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference");
|
|
361
|
+
function typeOf(object) {
|
|
362
|
+
if ("object" === typeof object && null !== object) {
|
|
363
|
+
var $$typeof = object.$$typeof;
|
|
364
|
+
switch ($$typeof) {
|
|
365
|
+
case REACT_ELEMENT_TYPE: switch (object = object.type, object) {
|
|
366
|
+
case REACT_FRAGMENT_TYPE:
|
|
367
|
+
case REACT_PROFILER_TYPE:
|
|
368
|
+
case REACT_STRICT_MODE_TYPE:
|
|
369
|
+
case REACT_SUSPENSE_TYPE:
|
|
370
|
+
case REACT_SUSPENSE_LIST_TYPE:
|
|
371
|
+
case REACT_VIEW_TRANSITION_TYPE: return object;
|
|
372
|
+
default: switch (object = object && object.$$typeof, object) {
|
|
373
|
+
case REACT_CONTEXT_TYPE:
|
|
374
|
+
case REACT_FORWARD_REF_TYPE:
|
|
375
|
+
case REACT_LAZY_TYPE:
|
|
376
|
+
case REACT_MEMO_TYPE: return object;
|
|
377
|
+
case REACT_CONSUMER_TYPE: return object;
|
|
378
|
+
default: return $$typeof;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
case REACT_PORTAL_TYPE: return $$typeof;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
reactIs_production.ContextConsumer = REACT_CONSUMER_TYPE;
|
|
386
|
+
reactIs_production.ContextProvider = REACT_CONTEXT_TYPE;
|
|
387
|
+
reactIs_production.Element = REACT_ELEMENT_TYPE;
|
|
388
|
+
reactIs_production.ForwardRef = REACT_FORWARD_REF_TYPE;
|
|
389
|
+
reactIs_production.Fragment = REACT_FRAGMENT_TYPE;
|
|
390
|
+
reactIs_production.Lazy = REACT_LAZY_TYPE;
|
|
391
|
+
reactIs_production.Memo = REACT_MEMO_TYPE;
|
|
392
|
+
reactIs_production.Portal = REACT_PORTAL_TYPE;
|
|
393
|
+
reactIs_production.Profiler = REACT_PROFILER_TYPE;
|
|
394
|
+
reactIs_production.StrictMode = REACT_STRICT_MODE_TYPE;
|
|
395
|
+
reactIs_production.Suspense = REACT_SUSPENSE_TYPE;
|
|
396
|
+
reactIs_production.SuspenseList = REACT_SUSPENSE_LIST_TYPE;
|
|
397
|
+
reactIs_production.isContextConsumer = function(object) {
|
|
398
|
+
return typeOf(object) === REACT_CONSUMER_TYPE;
|
|
399
|
+
};
|
|
400
|
+
reactIs_production.isContextProvider = function(object) {
|
|
401
|
+
return typeOf(object) === REACT_CONTEXT_TYPE;
|
|
402
|
+
};
|
|
403
|
+
reactIs_production.isElement = function(object) {
|
|
404
|
+
return "object" === typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
405
|
+
};
|
|
406
|
+
reactIs_production.isForwardRef = function(object) {
|
|
407
|
+
return typeOf(object) === REACT_FORWARD_REF_TYPE;
|
|
408
|
+
};
|
|
409
|
+
reactIs_production.isFragment = function(object) {
|
|
410
|
+
return typeOf(object) === REACT_FRAGMENT_TYPE;
|
|
411
|
+
};
|
|
412
|
+
reactIs_production.isLazy = function(object) {
|
|
413
|
+
return typeOf(object) === REACT_LAZY_TYPE;
|
|
414
|
+
};
|
|
415
|
+
reactIs_production.isMemo = function(object) {
|
|
416
|
+
return typeOf(object) === REACT_MEMO_TYPE;
|
|
417
|
+
};
|
|
418
|
+
reactIs_production.isPortal = function(object) {
|
|
419
|
+
return typeOf(object) === REACT_PORTAL_TYPE;
|
|
420
|
+
};
|
|
421
|
+
reactIs_production.isProfiler = function(object) {
|
|
422
|
+
return typeOf(object) === REACT_PROFILER_TYPE;
|
|
423
|
+
};
|
|
424
|
+
reactIs_production.isStrictMode = function(object) {
|
|
425
|
+
return typeOf(object) === REACT_STRICT_MODE_TYPE;
|
|
426
|
+
};
|
|
427
|
+
reactIs_production.isSuspense = function(object) {
|
|
428
|
+
return typeOf(object) === REACT_SUSPENSE_TYPE;
|
|
429
|
+
};
|
|
430
|
+
reactIs_production.isSuspenseList = function(object) {
|
|
431
|
+
return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;
|
|
432
|
+
};
|
|
433
|
+
reactIs_production.isValidElementType = function(type) {
|
|
434
|
+
return "string" === typeof type || "function" === typeof type || type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || "object" === typeof type && null !== type && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_CONSUMER_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_CLIENT_REFERENCE || void 0 !== type.getModuleId) ? true : false;
|
|
435
|
+
};
|
|
436
|
+
reactIs_production.typeOf = typeOf;
|
|
437
|
+
return reactIs_production;
|
|
438
|
+
}
|
|
439
|
+
var hasRequiredReactIs$1;
|
|
440
|
+
function requireReactIs$1() {
|
|
441
|
+
if (hasRequiredReactIs$1) return reactIs$1.exports;
|
|
442
|
+
hasRequiredReactIs$1 = 1;
|
|
443
|
+
reactIs$1.exports = requireReactIs_production();
|
|
444
|
+
return reactIs$1.exports;
|
|
445
|
+
}
|
|
446
|
+
var reactIsExports$1 = requireReactIs$1();
|
|
447
|
+
var ReactIs19 = /* @__PURE__ */ _mergeNamespaces({
|
|
448
|
+
__proto__: null,
|
|
449
|
+
default: /* @__PURE__ */ getDefaultExportFromCjs(reactIsExports$1)
|
|
450
|
+
}, [reactIsExports$1]);
|
|
451
|
+
var reactIs = { exports: {} };
|
|
452
|
+
var reactIs_production_min = {};
|
|
453
|
+
/**
|
|
454
|
+
* @license React
|
|
455
|
+
* react-is.production.min.js
|
|
456
|
+
*
|
|
457
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
458
|
+
*
|
|
459
|
+
* This source code is licensed under the MIT license found in the
|
|
460
|
+
* LICENSE file in the root directory of this source tree.
|
|
461
|
+
*/
|
|
462
|
+
var hasRequiredReactIs_production_min;
|
|
463
|
+
function requireReactIs_production_min() {
|
|
464
|
+
if (hasRequiredReactIs_production_min) return reactIs_production_min;
|
|
465
|
+
hasRequiredReactIs_production_min = 1;
|
|
466
|
+
var b = Symbol.for("react.element"), c = Symbol.for("react.portal"), d = Symbol.for("react.fragment"), e = Symbol.for("react.strict_mode"), f = Symbol.for("react.profiler"), g = Symbol.for("react.provider"), h = Symbol.for("react.context"), k = Symbol.for("react.server_context"), l = Symbol.for("react.forward_ref"), m = Symbol.for("react.suspense"), n = Symbol.for("react.suspense_list"), p = Symbol.for("react.memo"), q = Symbol.for("react.lazy"), t = Symbol.for("react.offscreen"), u = Symbol.for("react.module.reference");
|
|
467
|
+
function v(a) {
|
|
468
|
+
if ("object" === typeof a && null !== a) {
|
|
469
|
+
var r = a.$$typeof;
|
|
470
|
+
switch (r) {
|
|
471
|
+
case b: switch (a = a.type, a) {
|
|
472
|
+
case d:
|
|
473
|
+
case f:
|
|
474
|
+
case e:
|
|
475
|
+
case m:
|
|
476
|
+
case n: return a;
|
|
477
|
+
default: switch (a = a && a.$$typeof, a) {
|
|
478
|
+
case k:
|
|
479
|
+
case h:
|
|
480
|
+
case l:
|
|
481
|
+
case q:
|
|
482
|
+
case p:
|
|
483
|
+
case g: return a;
|
|
484
|
+
default: return r;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
case c: return r;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
reactIs_production_min.ContextConsumer = h;
|
|
492
|
+
reactIs_production_min.ContextProvider = g;
|
|
493
|
+
reactIs_production_min.Element = b;
|
|
494
|
+
reactIs_production_min.ForwardRef = l;
|
|
495
|
+
reactIs_production_min.Fragment = d;
|
|
496
|
+
reactIs_production_min.Lazy = q;
|
|
497
|
+
reactIs_production_min.Memo = p;
|
|
498
|
+
reactIs_production_min.Portal = c;
|
|
499
|
+
reactIs_production_min.Profiler = f;
|
|
500
|
+
reactIs_production_min.StrictMode = e;
|
|
501
|
+
reactIs_production_min.Suspense = m;
|
|
502
|
+
reactIs_production_min.SuspenseList = n;
|
|
503
|
+
reactIs_production_min.isAsyncMode = function() {
|
|
504
|
+
return false;
|
|
505
|
+
};
|
|
506
|
+
reactIs_production_min.isConcurrentMode = function() {
|
|
507
|
+
return false;
|
|
508
|
+
};
|
|
509
|
+
reactIs_production_min.isContextConsumer = function(a) {
|
|
510
|
+
return v(a) === h;
|
|
511
|
+
};
|
|
512
|
+
reactIs_production_min.isContextProvider = function(a) {
|
|
513
|
+
return v(a) === g;
|
|
514
|
+
};
|
|
515
|
+
reactIs_production_min.isElement = function(a) {
|
|
516
|
+
return "object" === typeof a && null !== a && a.$$typeof === b;
|
|
517
|
+
};
|
|
518
|
+
reactIs_production_min.isForwardRef = function(a) {
|
|
519
|
+
return v(a) === l;
|
|
520
|
+
};
|
|
521
|
+
reactIs_production_min.isFragment = function(a) {
|
|
522
|
+
return v(a) === d;
|
|
523
|
+
};
|
|
524
|
+
reactIs_production_min.isLazy = function(a) {
|
|
525
|
+
return v(a) === q;
|
|
526
|
+
};
|
|
527
|
+
reactIs_production_min.isMemo = function(a) {
|
|
528
|
+
return v(a) === p;
|
|
529
|
+
};
|
|
530
|
+
reactIs_production_min.isPortal = function(a) {
|
|
531
|
+
return v(a) === c;
|
|
532
|
+
};
|
|
533
|
+
reactIs_production_min.isProfiler = function(a) {
|
|
534
|
+
return v(a) === f;
|
|
535
|
+
};
|
|
536
|
+
reactIs_production_min.isStrictMode = function(a) {
|
|
537
|
+
return v(a) === e;
|
|
538
|
+
};
|
|
539
|
+
reactIs_production_min.isSuspense = function(a) {
|
|
540
|
+
return v(a) === m;
|
|
541
|
+
};
|
|
542
|
+
reactIs_production_min.isSuspenseList = function(a) {
|
|
543
|
+
return v(a) === n;
|
|
544
|
+
};
|
|
545
|
+
reactIs_production_min.isValidElementType = function(a) {
|
|
546
|
+
return "string" === typeof a || "function" === typeof a || a === d || a === f || a === e || a === m || a === n || a === t || "object" === typeof a && null !== a && (a.$$typeof === q || a.$$typeof === p || a.$$typeof === g || a.$$typeof === h || a.$$typeof === l || a.$$typeof === u || void 0 !== a.getModuleId) ? true : false;
|
|
547
|
+
};
|
|
548
|
+
reactIs_production_min.typeOf = v;
|
|
549
|
+
return reactIs_production_min;
|
|
550
|
+
}
|
|
551
|
+
var hasRequiredReactIs;
|
|
552
|
+
function requireReactIs() {
|
|
553
|
+
if (hasRequiredReactIs) return reactIs.exports;
|
|
554
|
+
hasRequiredReactIs = 1;
|
|
555
|
+
reactIs.exports = requireReactIs_production_min();
|
|
556
|
+
return reactIs.exports;
|
|
557
|
+
}
|
|
558
|
+
var reactIsExports = requireReactIs();
|
|
559
|
+
var ReactIs18 = /* @__PURE__ */ _mergeNamespaces({
|
|
560
|
+
__proto__: null,
|
|
561
|
+
default: /* @__PURE__ */ getDefaultExportFromCjs(reactIsExports)
|
|
562
|
+
}, [reactIsExports]);
|
|
563
|
+
const ReactIs = Object.fromEntries([
|
|
564
|
+
"isAsyncMode",
|
|
565
|
+
"isConcurrentMode",
|
|
566
|
+
"isContextConsumer",
|
|
567
|
+
"isContextProvider",
|
|
568
|
+
"isElement",
|
|
569
|
+
"isForwardRef",
|
|
570
|
+
"isFragment",
|
|
571
|
+
"isLazy",
|
|
572
|
+
"isMemo",
|
|
573
|
+
"isPortal",
|
|
574
|
+
"isProfiler",
|
|
575
|
+
"isStrictMode",
|
|
576
|
+
"isSuspense",
|
|
577
|
+
"isSuspenseList",
|
|
578
|
+
"isValidElementType"
|
|
579
|
+
].map((m) => [m, (v) => ReactIs18[m](v) || ReactIs19[m](v)]));
|
|
580
|
+
function getChildren(arg, children = []) {
|
|
581
|
+
if (Array.isArray(arg)) for (const item of arg) getChildren(item, children);
|
|
582
|
+
else if (arg != null && arg !== false && arg !== "") children.push(arg);
|
|
583
|
+
return children;
|
|
584
|
+
}
|
|
585
|
+
function getType(element) {
|
|
586
|
+
const type = element.type;
|
|
587
|
+
if (typeof type === "string") return type;
|
|
588
|
+
if (typeof type === "function") return type.displayName || type.name || "Unknown";
|
|
589
|
+
if (ReactIs.isFragment(element)) return "React.Fragment";
|
|
590
|
+
if (ReactIs.isSuspense(element)) return "React.Suspense";
|
|
591
|
+
if (typeof type === "object" && type !== null) {
|
|
592
|
+
if (ReactIs.isContextProvider(element)) return "Context.Provider";
|
|
593
|
+
if (ReactIs.isContextConsumer(element)) return "Context.Consumer";
|
|
594
|
+
if (ReactIs.isForwardRef(element)) {
|
|
595
|
+
if (type.displayName) return type.displayName;
|
|
596
|
+
const functionName = type.render.displayName || type.render.name || "";
|
|
597
|
+
return functionName === "" ? "ForwardRef" : `ForwardRef(${functionName})`;
|
|
598
|
+
}
|
|
599
|
+
if (ReactIs.isMemo(element)) {
|
|
600
|
+
const functionName = type.displayName || type.type.displayName || type.type.name || "";
|
|
601
|
+
return functionName === "" ? "Memo" : `Memo(${functionName})`;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
return "UNDEFINED";
|
|
605
|
+
}
|
|
606
|
+
function getPropKeys$1(element) {
|
|
607
|
+
const { props } = element;
|
|
608
|
+
return Object.keys(props).filter((key) => key !== "children" && props[key] !== void 0).sort();
|
|
609
|
+
}
|
|
610
|
+
const serialize$1 = (element, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? printElementAsLeaf(getType(element), config) : printElement(getType(element), printProps(getPropKeys$1(element), element.props, config, indentation + config.indent, depth, refs, printer), printChildren(getChildren(element.props.children), config, indentation + config.indent, depth, refs, printer), config, indentation);
|
|
611
|
+
const test$1 = (val) => val != null && ReactIs.isElement(val);
|
|
612
|
+
const plugin$1 = {
|
|
613
|
+
serialize: serialize$1,
|
|
614
|
+
test: test$1
|
|
615
|
+
};
|
|
616
|
+
const testSymbol = typeof Symbol === "function" && Symbol.for ? Symbol.for("react.test.json") : 245830487;
|
|
617
|
+
function getPropKeys(object) {
|
|
618
|
+
const { props } = object;
|
|
619
|
+
return props ? Object.keys(props).filter((key) => props[key] !== void 0).sort() : [];
|
|
620
|
+
}
|
|
621
|
+
const serialize = (object, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? printElementAsLeaf(object.type, config) : printElement(object.type, object.props ? printProps(getPropKeys(object), object.props, config, indentation + config.indent, depth, refs, printer) : "", object.children ? printChildren(object.children, config, indentation + config.indent, depth, refs, printer) : "", config, indentation);
|
|
622
|
+
const test = (val) => val && val.$$typeof === testSymbol;
|
|
623
|
+
const plugin = {
|
|
624
|
+
serialize,
|
|
625
|
+
test
|
|
626
|
+
};
|
|
627
|
+
const toString = Object.prototype.toString;
|
|
628
|
+
const toISOString = Date.prototype.toISOString;
|
|
629
|
+
const errorToString = Error.prototype.toString;
|
|
630
|
+
const regExpToString = RegExp.prototype.toString;
|
|
631
|
+
/**
|
|
632
|
+
* Explicitly comparing typeof constructor to function avoids undefined as name
|
|
633
|
+
* when mock identity-obj-proxy returns the key as the value for any key.
|
|
634
|
+
*/
|
|
635
|
+
function getConstructorName(val) {
|
|
636
|
+
return typeof val.constructor === "function" && val.constructor.name || "Object";
|
|
637
|
+
}
|
|
638
|
+
/** Is val is equal to global window object? Works even if it does not exist :) */
|
|
639
|
+
function isWindow(val) {
|
|
640
|
+
return typeof window !== "undefined" && val === window;
|
|
641
|
+
}
|
|
642
|
+
const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
|
|
643
|
+
const NEWLINE_REGEXP = /\n/g;
|
|
644
|
+
var PrettyFormatPluginError = class extends Error {
|
|
645
|
+
constructor(message, stack) {
|
|
646
|
+
super(message);
|
|
647
|
+
this.stack = stack;
|
|
648
|
+
this.name = this.constructor.name;
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
function isToStringedArrayType(toStringed) {
|
|
652
|
+
return toStringed === "[object Array]" || toStringed === "[object ArrayBuffer]" || toStringed === "[object DataView]" || toStringed === "[object Float32Array]" || toStringed === "[object Float64Array]" || toStringed === "[object Int8Array]" || toStringed === "[object Int16Array]" || toStringed === "[object Int32Array]" || toStringed === "[object Uint8Array]" || toStringed === "[object Uint8ClampedArray]" || toStringed === "[object Uint16Array]" || toStringed === "[object Uint32Array]";
|
|
653
|
+
}
|
|
654
|
+
function printNumber(val) {
|
|
655
|
+
return Object.is(val, -0) ? "-0" : String(val);
|
|
656
|
+
}
|
|
657
|
+
function printBigInt(val) {
|
|
658
|
+
return String(`${val}n`);
|
|
659
|
+
}
|
|
660
|
+
function printFunction(val, printFunctionName) {
|
|
661
|
+
if (!printFunctionName) return "[Function]";
|
|
662
|
+
return `[Function ${val.name || "anonymous"}]`;
|
|
663
|
+
}
|
|
664
|
+
function printSymbol(val) {
|
|
665
|
+
return String(val).replace(SYMBOL_REGEXP, "Symbol($1)");
|
|
666
|
+
}
|
|
667
|
+
function printError(val) {
|
|
668
|
+
return `[${errorToString.call(val)}]`;
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* The first port of call for printing an object, handles most of the
|
|
672
|
+
* data-types in JS.
|
|
673
|
+
*/
|
|
674
|
+
function printBasicValue(val, printFunctionName, escapeRegex, escapeString) {
|
|
675
|
+
if (val === true || val === false) return `${val}`;
|
|
676
|
+
if (val === void 0) return "undefined";
|
|
677
|
+
if (val === null) return "null";
|
|
678
|
+
const typeOf = typeof val;
|
|
679
|
+
if (typeOf === "number") return printNumber(val);
|
|
680
|
+
if (typeOf === "bigint") return printBigInt(val);
|
|
681
|
+
if (typeOf === "string") {
|
|
682
|
+
if (escapeString) return `"${val.replaceAll(/"|\\/g, "\\$&")}"`;
|
|
683
|
+
return `"${val}"`;
|
|
684
|
+
}
|
|
685
|
+
if (typeOf === "function") return printFunction(val, printFunctionName);
|
|
686
|
+
if (typeOf === "symbol") return printSymbol(val);
|
|
687
|
+
const toStringed = toString.call(val);
|
|
688
|
+
if (toStringed === "[object WeakMap]") return "WeakMap {}";
|
|
689
|
+
if (toStringed === "[object WeakSet]") return "WeakSet {}";
|
|
690
|
+
if (toStringed === "[object Function]" || toStringed === "[object GeneratorFunction]") return printFunction(val, printFunctionName);
|
|
691
|
+
if (toStringed === "[object Symbol]") return printSymbol(val);
|
|
692
|
+
if (toStringed === "[object Date]") return Number.isNaN(+val) ? "Date { NaN }" : toISOString.call(val);
|
|
693
|
+
if (toStringed === "[object Error]") return printError(val);
|
|
694
|
+
if (toStringed === "[object RegExp]") {
|
|
695
|
+
if (escapeRegex) return regExpToString.call(val).replaceAll(/[$()*+.?[\\\]^{|}]/g, "\\$&");
|
|
696
|
+
return regExpToString.call(val);
|
|
697
|
+
}
|
|
698
|
+
if (val instanceof Error) return printError(val);
|
|
699
|
+
return null;
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Handles more complex objects ( such as objects with circular references.
|
|
703
|
+
* maps and sets etc )
|
|
704
|
+
*/
|
|
705
|
+
function printComplexValue(val, config, indentation, depth, refs, hasCalledToJSON) {
|
|
706
|
+
if (refs.includes(val)) return "[Circular]";
|
|
707
|
+
refs = [...refs];
|
|
708
|
+
refs.push(val);
|
|
709
|
+
const hitMaxDepth = ++depth > config.maxDepth;
|
|
710
|
+
const min = config.min;
|
|
711
|
+
if (config.callToJSON && !hitMaxDepth && val.toJSON && typeof val.toJSON === "function" && !hasCalledToJSON) return printer(val.toJSON(), config, indentation, depth, refs, true);
|
|
712
|
+
const toStringed = toString.call(val);
|
|
713
|
+
if (toStringed === "[object Arguments]") return hitMaxDepth ? "[Arguments]" : `${min ? "" : "Arguments "}[${printListItems(val, config, indentation, depth, refs, printer)}]`;
|
|
714
|
+
if (isToStringedArrayType(toStringed)) return hitMaxDepth ? `[${val.constructor.name}]` : `${min ? "" : !config.printBasicPrototype && val.constructor.name === "Array" ? "" : `${val.constructor.name} `}[${printListItems(val, config, indentation, depth, refs, printer)}]`;
|
|
715
|
+
if (toStringed === "[object Map]") return hitMaxDepth ? "[Map]" : `Map {${printIteratorEntries(val.entries(), config, indentation, depth, refs, printer, " => ")}}`;
|
|
716
|
+
if (toStringed === "[object Set]") return hitMaxDepth ? "[Set]" : `Set {${printIteratorValues(val.values(), config, indentation, depth, refs, printer)}}`;
|
|
717
|
+
return hitMaxDepth || isWindow(val) ? `[${getConstructorName(val)}]` : `${min ? "" : !config.printBasicPrototype && getConstructorName(val) === "Object" ? "" : `${getConstructorName(val)} `}{${printObjectProperties(val, config, indentation, depth, refs, printer)}}`;
|
|
718
|
+
}
|
|
719
|
+
const ErrorPlugin = {
|
|
720
|
+
test: (val) => val && val instanceof Error,
|
|
721
|
+
serialize(val, config, indentation, depth, refs, printer) {
|
|
722
|
+
if (refs.includes(val)) return "[Circular]";
|
|
723
|
+
refs = [...refs, val];
|
|
724
|
+
const hitMaxDepth = ++depth > config.maxDepth;
|
|
725
|
+
const { message, cause, ...rest } = val;
|
|
726
|
+
const entries = {
|
|
727
|
+
message,
|
|
728
|
+
...typeof cause !== "undefined" ? { cause } : {},
|
|
729
|
+
...val instanceof AggregateError ? { errors: val.errors } : {},
|
|
730
|
+
...rest
|
|
731
|
+
};
|
|
732
|
+
const name = val.name !== "Error" ? val.name : getConstructorName(val);
|
|
733
|
+
return hitMaxDepth ? `[${name}]` : `${name} {${printIteratorEntries(Object.entries(entries).values(), config, indentation, depth, refs, printer)}}`;
|
|
734
|
+
}
|
|
735
|
+
};
|
|
736
|
+
function isNewPlugin(plugin) {
|
|
737
|
+
return plugin.serialize != null;
|
|
738
|
+
}
|
|
739
|
+
function printPlugin(plugin, val, config, indentation, depth, refs) {
|
|
740
|
+
let printed;
|
|
741
|
+
try {
|
|
742
|
+
printed = isNewPlugin(plugin) ? plugin.serialize(val, config, indentation, depth, refs, printer) : plugin.print(val, (valChild) => printer(valChild, config, indentation, depth, refs), (str) => {
|
|
743
|
+
const indentationNext = indentation + config.indent;
|
|
744
|
+
return indentationNext + str.replaceAll(NEWLINE_REGEXP, `\n${indentationNext}`);
|
|
745
|
+
}, {
|
|
746
|
+
edgeSpacing: config.spacingOuter,
|
|
747
|
+
min: config.min,
|
|
748
|
+
spacing: config.spacingInner
|
|
749
|
+
}, config.colors);
|
|
750
|
+
} catch (error) {
|
|
751
|
+
throw new PrettyFormatPluginError(error.message, error.stack);
|
|
752
|
+
}
|
|
753
|
+
if (typeof printed !== "string") throw new TypeError(`pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".`);
|
|
754
|
+
return printed;
|
|
755
|
+
}
|
|
756
|
+
function findPlugin(plugins, val) {
|
|
757
|
+
for (const plugin of plugins) try {
|
|
758
|
+
if (plugin.test(val)) return plugin;
|
|
759
|
+
} catch (error) {
|
|
760
|
+
throw new PrettyFormatPluginError(error.message, error.stack);
|
|
761
|
+
}
|
|
762
|
+
return null;
|
|
763
|
+
}
|
|
764
|
+
function printer(val, config, indentation, depth, refs, hasCalledToJSON) {
|
|
765
|
+
let result;
|
|
766
|
+
const plugin = findPlugin(config.plugins, val);
|
|
767
|
+
if (plugin !== null) result = printPlugin(plugin, val, config, indentation, depth, refs);
|
|
768
|
+
else {
|
|
769
|
+
const basicResult = printBasicValue(val, config.printFunctionName, config.escapeRegex, config.escapeString);
|
|
770
|
+
if (basicResult !== null) result = basicResult;
|
|
771
|
+
else result = printComplexValue(val, config, indentation, depth, refs, hasCalledToJSON);
|
|
772
|
+
}
|
|
773
|
+
config._outputLengthPerDepth[depth] ??= 0;
|
|
774
|
+
config._outputLengthPerDepth[depth] += result.length;
|
|
775
|
+
if (config._outputLengthPerDepth[depth] > config.maxOutputLength) config.maxDepth = 0;
|
|
776
|
+
return result;
|
|
777
|
+
}
|
|
778
|
+
const DEFAULT_THEME = {
|
|
779
|
+
comment: "gray",
|
|
780
|
+
content: "reset",
|
|
781
|
+
prop: "yellow",
|
|
782
|
+
tag: "cyan",
|
|
783
|
+
value: "green"
|
|
784
|
+
};
|
|
785
|
+
const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);
|
|
786
|
+
const DEFAULT_OPTIONS = {
|
|
787
|
+
callToJSON: true,
|
|
788
|
+
compareKeys: void 0,
|
|
789
|
+
escapeRegex: false,
|
|
790
|
+
escapeString: true,
|
|
791
|
+
highlight: false,
|
|
792
|
+
indent: 2,
|
|
793
|
+
maxDepth: Number.POSITIVE_INFINITY,
|
|
794
|
+
maxOutputLength: 1e6,
|
|
795
|
+
maxWidth: Number.POSITIVE_INFINITY,
|
|
796
|
+
min: false,
|
|
797
|
+
plugins: [],
|
|
798
|
+
printBasicPrototype: true,
|
|
799
|
+
printFunctionName: true,
|
|
800
|
+
printShadowRoot: true,
|
|
801
|
+
theme: DEFAULT_THEME
|
|
802
|
+
};
|
|
803
|
+
function validateOptions(options) {
|
|
804
|
+
for (const key of Object.keys(options)) if (!Object.hasOwn(DEFAULT_OPTIONS, key)) throw new Error(`pretty-format: Unknown option "${key}".`);
|
|
805
|
+
if (options.min && options.indent !== void 0 && options.indent !== 0) throw new Error("pretty-format: Options \"min\" and \"indent\" cannot be used together.");
|
|
806
|
+
}
|
|
807
|
+
function getColorsHighlight() {
|
|
808
|
+
return DEFAULT_THEME_KEYS.reduce((colors, key) => {
|
|
809
|
+
const value = DEFAULT_THEME[key];
|
|
810
|
+
const color = value && y[value];
|
|
811
|
+
if (color && typeof color.close === "string" && typeof color.open === "string") colors[key] = color;
|
|
812
|
+
else throw new Error(`pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.`);
|
|
813
|
+
return colors;
|
|
814
|
+
}, Object.create(null));
|
|
815
|
+
}
|
|
816
|
+
function getColorsEmpty() {
|
|
817
|
+
return DEFAULT_THEME_KEYS.reduce((colors, key) => {
|
|
818
|
+
colors[key] = {
|
|
819
|
+
close: "",
|
|
820
|
+
open: ""
|
|
821
|
+
};
|
|
822
|
+
return colors;
|
|
823
|
+
}, Object.create(null));
|
|
824
|
+
}
|
|
825
|
+
function getPrintFunctionName(options) {
|
|
826
|
+
return options?.printFunctionName ?? DEFAULT_OPTIONS.printFunctionName;
|
|
827
|
+
}
|
|
828
|
+
function getEscapeRegex(options) {
|
|
829
|
+
return options?.escapeRegex ?? DEFAULT_OPTIONS.escapeRegex;
|
|
830
|
+
}
|
|
831
|
+
function getEscapeString(options) {
|
|
832
|
+
return options?.escapeString ?? DEFAULT_OPTIONS.escapeString;
|
|
833
|
+
}
|
|
834
|
+
function getConfig(options) {
|
|
835
|
+
return {
|
|
836
|
+
callToJSON: options?.callToJSON ?? DEFAULT_OPTIONS.callToJSON,
|
|
837
|
+
colors: options?.highlight ? getColorsHighlight() : getColorsEmpty(),
|
|
838
|
+
compareKeys: typeof options?.compareKeys === "function" || options?.compareKeys === null ? options.compareKeys : DEFAULT_OPTIONS.compareKeys,
|
|
839
|
+
escapeRegex: getEscapeRegex(options),
|
|
840
|
+
escapeString: getEscapeString(options),
|
|
841
|
+
indent: options?.min ? "" : createIndent(options?.indent ?? DEFAULT_OPTIONS.indent),
|
|
842
|
+
maxDepth: options?.maxDepth ?? DEFAULT_OPTIONS.maxDepth,
|
|
843
|
+
maxWidth: options?.maxWidth ?? DEFAULT_OPTIONS.maxWidth,
|
|
844
|
+
min: options?.min ?? DEFAULT_OPTIONS.min,
|
|
845
|
+
plugins: options?.plugins ?? DEFAULT_OPTIONS.plugins,
|
|
846
|
+
printBasicPrototype: options?.printBasicPrototype ?? true,
|
|
847
|
+
printFunctionName: getPrintFunctionName(options),
|
|
848
|
+
printShadowRoot: options?.printShadowRoot ?? true,
|
|
849
|
+
spacingInner: options?.min ? " " : "\n",
|
|
850
|
+
spacingOuter: options?.min ? "" : "\n",
|
|
851
|
+
maxOutputLength: options?.maxOutputLength ?? DEFAULT_OPTIONS.maxOutputLength,
|
|
852
|
+
_outputLengthPerDepth: []
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
function createIndent(indent) {
|
|
856
|
+
return Array.from({ length: indent + 1 }).join(" ");
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Returns a presentation string of your `val` object
|
|
860
|
+
* @param val any potential JavaScript object
|
|
861
|
+
* @param options Custom settings
|
|
862
|
+
*/
|
|
863
|
+
function format(val, options) {
|
|
864
|
+
if (options) {
|
|
865
|
+
validateOptions(options);
|
|
866
|
+
if (options.plugins) {
|
|
867
|
+
const plugin = findPlugin(options.plugins, val);
|
|
868
|
+
if (plugin !== null) return printPlugin(plugin, val, getConfig(options), "", 0, []);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
const basicResult = printBasicValue(val, getPrintFunctionName(options), getEscapeRegex(options), getEscapeString(options));
|
|
872
|
+
if (basicResult !== null) return basicResult;
|
|
873
|
+
return printComplexValue(val, getConfig(options), "", 0, []);
|
|
874
|
+
}
|
|
875
|
+
const plugins = {
|
|
876
|
+
AsymmetricMatcher: plugin$5,
|
|
877
|
+
DOMCollection: plugin$4,
|
|
878
|
+
DOMElement: plugin$3,
|
|
879
|
+
Immutable: plugin$2,
|
|
880
|
+
ReactElement: plugin$1,
|
|
881
|
+
ReactTestComponent: plugin,
|
|
882
|
+
Error: ErrorPlugin
|
|
883
|
+
};
|
|
884
|
+
//#endregion
|
|
885
|
+
export { createDOMElementFilter, format, plugins };
|
|
886
|
+
|
|
887
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJzdHlsZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCtwcmV0dHktZm9ybWF0QDQuMS4yL25vZGVfbW9kdWxlcy9Adml0ZXN0L3ByZXR0eS1mb3JtYXQvZGlzdC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVzIGZyb20gJ3RpbnlyYWluYm93JztcblxuZnVuY3Rpb24gX21lcmdlTmFtZXNwYWNlcyhuLCBtKSB7XG4gIG0uZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgIGUgJiYgdHlwZW9mIGUgIT09ICdzdHJpbmcnICYmICFBcnJheS5pc0FycmF5KGUpICYmIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGlmIChrICE9PSAnZGVmYXVsdCcgJiYgIShrIGluIG4pKSB7XG4gICAgICAgIHZhciBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBrKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIGssIGQuZ2V0ID8gZCA6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZVtrXTsgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKG4pO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzT2ZFbnVtZXJhYmxlUHJvcGVydGllcyhvYmplY3QsIGNvbXBhcmVLZXlzKSB7XG5cdGNvbnN0IHJhd0tleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXHRjb25zdCBrZXlzID0gY29tcGFyZUtleXMgPT09IG51bGwgPyByYXdLZXlzIDogcmF3S2V5cy5zb3J0KGNvbXBhcmVLZXlzKTtcblx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRmb3IgKGNvbnN0IHN5bWJvbCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCkpIHtcblx0XHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltYm9sKS5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGtleXMucHVzaChzeW1ib2wpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4ga2V5cztcbn1cbi8qKlxuKiBSZXR1cm4gZW50cmllcyAoZm9yIGV4YW1wbGUsIG9mIGEgbWFwKVxuKiB3aXRoIHNwYWNpbmcsIGluZGVudGF0aW9uLCBhbmQgY29tbWFcbiogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiovXG5mdW5jdGlvbiBwcmludEl0ZXJhdG9yRW50cmllcyhpdGVyYXRvciwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHNlcGFyYXRvciA9IFwiOiBcIikge1xuXHRsZXQgcmVzdWx0ID0gXCJcIjtcblx0bGV0IHdpZHRoID0gMDtcblx0bGV0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdGlmICghY3VycmVudC5kb25lKSB7XG5cdFx0cmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG5cdFx0Y29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXHRcdHdoaWxlICghY3VycmVudC5kb25lKSB7XG5cdFx0XHRyZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXHRcdFx0aWYgKHdpZHRoKysgPT09IGNvbmZpZy5tYXhXaWR0aCkge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCLigKZcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYW1lID0gcHJpbnRlcihjdXJyZW50LnZhbHVlWzBdLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBwcmludGVyKGN1cnJlbnQudmFsdWVbMV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRyZXN1bHQgKz0gbmFtZSArIHNlcGFyYXRvciArIHZhbHVlO1xuXHRcdFx0Y3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdGlmICghY3VycmVudC5kb25lKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBgLCR7Y29uZmlnLnNwYWNpbmdJbm5lcn1gO1xuXHRcdFx0fSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCIsXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuKiBSZXR1cm4gdmFsdWVzIChmb3IgZXhhbXBsZSwgb2YgYSBzZXQpXG4qIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuKiB3aXRob3V0IHN1cnJvdW5kaW5nIHB1bmN0dWF0aW9uIChicmFjZXMgb3IgYnJhY2tldHMpXG4qL1xuZnVuY3Rpb24gcHJpbnRJdGVyYXRvclZhbHVlcyhpdGVyYXRvciwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdGxldCB3aWR0aCA9IDA7XG5cdGxldCBjdXJyZW50ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRpZiAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHR3aGlsZSAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdFx0cmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dDtcblx0XHRcdGlmICh3aWR0aCsrID09PSBjb25maWcubWF4V2lkdGgpIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwi4oCmXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmVzdWx0ICs9IHByaW50ZXIoY3VycmVudC52YWx1ZSwgY29uZmlnLCBpbmRlbnRhdGlvbk5leHQsIGRlcHRoLCByZWZzKTtcblx0XHRcdGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdFx0XHRpZiAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gYCwke2NvbmZpZy5zcGFjaW5nSW5uZXJ9YDtcblx0XHRcdH0gZWxzZSBpZiAoIWNvbmZpZy5taW4pIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwiLFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG4vKipcbiogUmV0dXJuIGl0ZW1zIChmb3IgZXhhbXBsZSwgb2YgYW4gYXJyYXkpXG4qIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuKiB3aXRob3V0IHN1cnJvdW5kaW5nIHB1bmN0dWF0aW9uIChmb3IgZXhhbXBsZSwgYnJhY2tldHMpXG4qL1xuZnVuY3Rpb24gcHJpbnRMaXN0SXRlbXMobGlzdCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdGxpc3QgPSBsaXN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgRGF0YVZpZXcobGlzdCkgOiBsaXN0O1xuXHRjb25zdCBpc0RhdGFWaWV3ID0gKGwpID0+IGwgaW5zdGFuY2VvZiBEYXRhVmlldztcblx0Y29uc3QgbGVuZ3RoID0gaXNEYXRhVmlldyhsaXN0KSA/IGxpc3QuYnl0ZUxlbmd0aCA6IGxpc3QubGVuZ3RoO1xuXHRpZiAobGVuZ3RoID4gMCkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXHRcdFx0aWYgKGkgPT09IGNvbmZpZy5tYXhXaWR0aCkge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCLigKZcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNEYXRhVmlldyhsaXN0KSB8fCBpIGluIGxpc3QpIHtcblx0XHRcdFx0cmVzdWx0ICs9IHByaW50ZXIoaXNEYXRhVmlldyhsaXN0KSA/IGxpc3QuZ2V0SW50OChpKSA6IGxpc3RbaV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaSA8IGxlbmd0aCAtIDEpIHtcblx0XHRcdFx0cmVzdWx0ICs9IGAsJHtjb25maWcuc3BhY2luZ0lubmVyfWA7XG5cdFx0XHR9IGVsc2UgaWYgKCFjb25maWcubWluKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBcIixcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4qIFJldHVybiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuKiB3aXRoIHNwYWNpbmcsIGluZGVudGF0aW9uLCBhbmQgY29tbWFcbiogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiovXG5mdW5jdGlvbiBwcmludE9iamVjdFByb3BlcnRpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuXHRsZXQgcmVzdWx0ID0gXCJcIjtcblx0Y29uc3Qga2V5cyA9IGdldEtleXNPZkVudW1lcmFibGVQcm9wZXJ0aWVzKHZhbCwgY29uZmlnLmNvbXBhcmVLZXlzKTtcblx0aWYgKGtleXMubGVuZ3RoID4gMCkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbaV07XG5cdFx0XHRjb25zdCBuYW1lID0gcHJpbnRlcihrZXksIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHByaW50ZXIodmFsW2tleV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRyZXN1bHQgKz0gYCR7aW5kZW50YXRpb25OZXh0ICsgbmFtZX06ICR7dmFsdWV9YDtcblx0XHRcdGlmIChpIDwga2V5cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBgLCR7Y29uZmlnLnNwYWNpbmdJbm5lcn1gO1xuXHRcdFx0fSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCIsXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgYXN5bW1ldHJpY01hdGNoZXIgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmZvciA/IFN5bWJvbC5mb3IoXCJqZXN0LmFzeW1tZXRyaWNNYXRjaGVyXCIpIDogMTI2NzYyMTtcbmNvbnN0IFNQQUNFJDIgPSBcIiBcIjtcbmNvbnN0IHNlcmlhbGl6ZSQ1ID0gKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcblx0Y29uc3Qgc3RyaW5nZWRWYWx1ZSA9IHZhbC50b1N0cmluZygpO1xuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJBcnJheUNvbnRhaW5pbmdcIiB8fCBzdHJpbmdlZFZhbHVlID09PSBcIkFycmF5Tm90Q29udGFpbmluZ1wiKSB7XG5cdFx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRcdHJldHVybiBgWyR7c3RyaW5nZWRWYWx1ZX1dYDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke3N0cmluZ2VkVmFsdWUgKyBTUEFDRSQyfVske3ByaW50TGlzdEl0ZW1zKHZhbC5zYW1wbGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX1dYDtcblx0fVxuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJPYmplY3RDb250YWluaW5nXCIgfHwgc3RyaW5nZWRWYWx1ZSA9PT0gXCJPYmplY3ROb3RDb250YWluaW5nXCIpIHtcblx0XHRpZiAoKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCkge1xuXHRcdFx0cmV0dXJuIGBbJHtzdHJpbmdlZFZhbHVlfV1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7c3RyaW5nZWRWYWx1ZSArIFNQQUNFJDJ9eyR7cHJpbnRPYmplY3RQcm9wZXJ0aWVzKHZhbC5zYW1wbGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcblx0fVxuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJTdHJpbmdNYXRjaGluZ1wiIHx8IHN0cmluZ2VkVmFsdWUgPT09IFwiU3RyaW5nTm90TWF0Y2hpbmdcIikge1xuXHRcdHJldHVybiBzdHJpbmdlZFZhbHVlICsgU1BBQ0UkMiArIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpO1xuXHR9XG5cdGlmIChzdHJpbmdlZFZhbHVlID09PSBcIlN0cmluZ0NvbnRhaW5pbmdcIiB8fCBzdHJpbmdlZFZhbHVlID09PSBcIlN0cmluZ05vdENvbnRhaW5pbmdcIikge1xuXHRcdHJldHVybiBzdHJpbmdlZFZhbHVlICsgU1BBQ0UkMiArIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpO1xuXHR9XG5cdGlmICh0eXBlb2YgdmFsLnRvQXN5bW1ldHJpY01hdGNoZXIgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEFzeW1tZXRyaWMgbWF0Y2hlciAke3ZhbC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBpbXBsZW1lbnQgdG9Bc3ltbWV0cmljTWF0Y2hlcigpYCk7XG5cdH1cblx0cmV0dXJuIHZhbC50b0FzeW1tZXRyaWNNYXRjaGVyKCk7XG59O1xuY29uc3QgdGVzdCQ1ID0gKHZhbCkgPT4gdmFsICYmIHZhbC4kJHR5cGVvZiA9PT0gYXN5bW1ldHJpY01hdGNoZXI7XG5jb25zdCBwbHVnaW4kNSA9IHtcblx0c2VyaWFsaXplOiBzZXJpYWxpemUkNSxcblx0dGVzdDogdGVzdCQ1XG59O1xuXG5jb25zdCBTUEFDRSQxID0gXCIgXCI7XG5jb25zdCBPQkpFQ1RfTkFNRVMgPSBuZXcgU2V0KFtcIkRPTVN0cmluZ01hcFwiLCBcIk5hbWVkTm9kZU1hcFwiXSk7XG5jb25zdCBBUlJBWV9SRUdFWFAgPSAvXig/OkhUTUxcXHcqQ29sbGVjdGlvbnxOb2RlTGlzdCkkLztcbmZ1bmN0aW9uIHRlc3ROYW1lKG5hbWUpIHtcblx0cmV0dXJuIE9CSkVDVF9OQU1FUy5oYXMobmFtZSkgfHwgQVJSQVlfUkVHRVhQLnRlc3QobmFtZSk7XG59XG5jb25zdCB0ZXN0JDQgPSAodmFsKSA9PiB2YWwgJiYgdmFsLmNvbnN0cnVjdG9yICYmICEhdmFsLmNvbnN0cnVjdG9yLm5hbWUgJiYgdGVzdE5hbWUodmFsLmNvbnN0cnVjdG9yLm5hbWUpO1xuZnVuY3Rpb24gaXNOYW1lZE5vZGVNYXAoY29sbGVjdGlvbikge1xuXHRyZXR1cm4gY29sbGVjdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk5hbWVkTm9kZU1hcFwiO1xufVxuY29uc3Qgc2VyaWFsaXplJDQgPSAoY29sbGVjdGlvbiwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcblx0Y29uc3QgbmFtZSA9IGNvbGxlY3Rpb24uY29uc3RydWN0b3IubmFtZTtcblx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRyZXR1cm4gYFske25hbWV9XWA7XG5cdH1cblx0cmV0dXJuIChjb25maWcubWluID8gXCJcIiA6IG5hbWUgKyBTUEFDRSQxKSArIChPQkpFQ1RfTkFNRVMuaGFzKG5hbWUpID8gYHske3ByaW50T2JqZWN0UHJvcGVydGllcyhpc05hbWVkTm9kZU1hcChjb2xsZWN0aW9uKSA/IFsuLi5jb2xsZWN0aW9uXS5yZWR1Y2UoKHByb3BzLCBhdHRyaWJ1dGUpID0+IHtcblx0XHRwcm9wc1thdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG5cdFx0cmV0dXJuIHByb3BzO1xuXHR9LCB7fSkgOiB7IC4uLmNvbGxlY3Rpb24gfSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfX1gIDogYFske3ByaW50TGlzdEl0ZW1zKFsuLi5jb2xsZWN0aW9uXSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfV1gKTtcbn07XG5jb25zdCBwbHVnaW4kNCA9IHtcblx0c2VyaWFsaXplOiBzZXJpYWxpemUkNCxcblx0dGVzdDogdGVzdCQ0XG59O1xuXG4vKipcbiogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbipcbiogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4qIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiovXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHN0cikge1xuXHRyZXR1cm4gc3RyLnJlcGxhY2VBbGwoXCI8XCIsIFwiJmx0O1wiKS5yZXBsYWNlQWxsKFwiPlwiLCBcIiZndDtcIik7XG59XG5cbi8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYga2V5cyBpcyBlbXB0eS5cbmZ1bmN0aW9uIHByaW50UHJvcHMoa2V5cywgcHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0Y29uc3QgY29sb3JzID0gY29uZmlnLmNvbG9ycztcblx0cmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG5cdFx0Ly8gaGlkZGVuIGluamVjdGVkIHZhbHVlIHRoYXQgc2hvdWxkIG5vdCBiZSBwcmludGVkXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZVswXSA9PT0gXCJfXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIl9fdml0ZXN0X1wiKSAmJiB2YWx1ZS5tYXRjaCgvX192aXRlc3RfXFxkK19fLykpIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0XHRsZXQgcHJpbnRlZCA9IHByaW50ZXIodmFsdWUsIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHByaW50ZWQuaW5jbHVkZXMoXCJcXG5cIikpIHtcblx0XHRcdFx0cHJpbnRlZCA9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbk5leHQgKyBwcmludGVkICsgY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0cHJpbnRlZCA9IGB7JHtwcmludGVkfX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7Y29uZmlnLnNwYWNpbmdJbm5lciArIGluZGVudGF0aW9uICsgY29sb3JzLnByb3Aub3BlbiArIGtleSArIGNvbG9ycy5wcm9wLmNsb3NlfT0ke2NvbG9ycy52YWx1ZS5vcGVufSR7cHJpbnRlZH0ke2NvbG9ycy52YWx1ZS5jbG9zZX1gO1xuXHR9KS5qb2luKFwiXCIpO1xufVxuLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBjaGlsZHJlbiBpcyBlbXB0eS5cbmZ1bmN0aW9uIHByaW50Q2hpbGRyZW4oY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdHJldHVybiBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb24gKyAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gcHJpbnRUZXh0KGNoaWxkLCBjb25maWcpIDogcHJpbnRlcihjaGlsZCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpKSkuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHByaW50U2hhZG93Um9vdChjaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0aWYgKGNvbmZpZy5wcmludFNoYWRvd1Jvb3QgPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblx0cmV0dXJuIFtgJHtjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb259I3NoYWRvdy1yb290YCwgcHJpbnRDaGlsZHJlbihjaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKV0uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHByaW50VGV4dCh0ZXh0LCBjb25maWcpIHtcblx0Y29uc3QgY29udGVudENvbG9yID0gY29uZmlnLmNvbG9ycy5jb250ZW50O1xuXHRyZXR1cm4gY29udGVudENvbG9yLm9wZW4gKyBlc2NhcGVIVE1MKHRleHQpICsgY29udGVudENvbG9yLmNsb3NlO1xufVxuZnVuY3Rpb24gcHJpbnRDb21tZW50KGNvbW1lbnQsIGNvbmZpZykge1xuXHRjb25zdCBjb21tZW50Q29sb3IgPSBjb25maWcuY29sb3JzLmNvbW1lbnQ7XG5cdHJldHVybiBgJHtjb21tZW50Q29sb3Iub3Blbn08IS0tJHtlc2NhcGVIVE1MKGNvbW1lbnQpfS0tPiR7Y29tbWVudENvbG9yLmNsb3NlfWA7XG59XG4vLyBTZXBhcmF0ZSB0aGUgZnVuY3Rpb25zIHRvIGZvcm1hdCBwcm9wcywgY2hpbGRyZW4sIGFuZCBlbGVtZW50LFxuLy8gc28gYSBwbHVnaW4gY291bGQgb3ZlcnJpZGUgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuXG4vLyBUb28gYmFkLCBzbyBzYWQ6IHRoZSB0cmFkaXRpb25hbCAoYnV0IHVubmVjZXNzYXJ5KSBzcGFjZVxuLy8gaW4gYSBzZWxmLWNsb3NpbmcgdGFnQ29sb3IgcmVxdWlyZXMgYSBzZWNvbmQgdGVzdCBvZiBwcmludGVkUHJvcHMuXG5mdW5jdGlvbiBwcmludEVsZW1lbnQodHlwZSwgcHJpbnRlZFByb3BzLCBwcmludGVkQ2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24pIHtcblx0Y29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcblx0cmV0dXJuIGAke3RhZ0NvbG9yLm9wZW59PCR7dHlwZX0ke3ByaW50ZWRQcm9wcyAmJiB0YWdDb2xvci5jbG9zZSArIHByaW50ZWRQcm9wcyArIGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbiArIHRhZ0NvbG9yLm9wZW59JHtwcmludGVkQ2hpbGRyZW4gPyBgPiR7dGFnQ29sb3IuY2xvc2V9JHtwcmludGVkQ2hpbGRyZW59JHtjb25maWcuc3BhY2luZ091dGVyfSR7aW5kZW50YXRpb259JHt0YWdDb2xvci5vcGVufTwvJHt0eXBlfWAgOiBgJHtwcmludGVkUHJvcHMgJiYgIWNvbmZpZy5taW4gPyBcIlwiIDogXCIgXCJ9L2B9PiR7dGFnQ29sb3IuY2xvc2V9YDtcbn1cbmZ1bmN0aW9uIHByaW50RWxlbWVudEFzTGVhZih0eXBlLCBjb25maWcpIHtcblx0Y29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcblx0cmV0dXJuIGAke3RhZ0NvbG9yLm9wZW59PCR7dHlwZX0ke3RhZ0NvbG9yLmNsb3NlfSDigKYke3RhZ0NvbG9yLm9wZW59IC8+JHt0YWdDb2xvci5jbG9zZX1gO1xufVxuXG5jb25zdCBFTEVNRU5UX05PREUgPSAxO1xuY29uc3QgVEVYVF9OT0RFID0gMztcbmNvbnN0IENPTU1FTlRfTk9ERSA9IDg7XG5jb25zdCBGUkFHTUVOVF9OT0RFID0gMTE7XG5jb25zdCBFTEVNRU5UX1JFR0VYUCA9IC9eKD86KD86SFRNTHxTVkcpXFx3Kik/RWxlbWVudCQvO1xuZnVuY3Rpb24gdGVzdEhhc0F0dHJpYnV0ZSh2YWwpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gdHlwZW9mIHZhbC5oYXNBdHRyaWJ1dGUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWwuaGFzQXR0cmlidXRlKFwiaXNcIik7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuZnVuY3Rpb24gdGVzdE5vZGUodmFsKSB7XG5cdGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHZhbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXHRjb25zdCB7IG5vZGVUeXBlLCB0YWdOYW1lIH0gPSB2YWw7XG5cdGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IHR5cGVvZiB0YWdOYW1lID09PSBcInN0cmluZ1wiICYmIHRhZ05hbWUuaW5jbHVkZXMoXCItXCIpIHx8IHRlc3RIYXNBdHRyaWJ1dGUodmFsKTtcblx0cmV0dXJuIG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgKEVMRU1FTlRfUkVHRVhQLnRlc3QoY29uc3RydWN0b3JOYW1lKSB8fCBpc0N1c3RvbUVsZW1lbnQpIHx8IG5vZGVUeXBlID09PSBURVhUX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSBcIlRleHRcIiB8fCBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGNvbnN0cnVjdG9yTmFtZSA9PT0gXCJDb21tZW50XCIgfHwgbm9kZVR5cGUgPT09IEZSQUdNRU5UX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSBcIkRvY3VtZW50RnJhZ21lbnRcIjtcbn1cbmNvbnN0IHRlc3QkMyA9ICh2YWwpID0+IHZhbD8uY29uc3RydWN0b3I/Lm5hbWUgJiYgdGVzdE5vZGUodmFsKTtcbmZ1bmN0aW9uIG5vZGVJc1RleHQobm9kZSkge1xuXHRyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuZnVuY3Rpb24gbm9kZUlzQ29tbWVudChub2RlKSB7XG5cdHJldHVybiBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREU7XG59XG5mdW5jdGlvbiBub2RlSXNGcmFnbWVudChub2RlKSB7XG5cdHJldHVybiBub2RlLm5vZGVUeXBlID09PSBGUkFHTUVOVF9OT0RFO1xufVxuZnVuY3Rpb24gZmlsdGVyQ2hpbGRyZW4oY2hpbGRyZW4sIGZpbHRlck5vZGUpIHtcblx0Ly8gRmlsdGVyIG91dCB0ZXh0IG5vZGVzIHRoYXQgb25seSBjb250YWluIHdoaXRlc3BhY2UgdG8gcHJldmVudCBlbXB0eSBsaW5lc1xuXHQvLyBUaGlzIGlzIGRvbmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgZmlsdGVyTm9kZSBpcyBwcm92aWRlZFxuXHRsZXQgZmlsdGVyZWQgPSBjaGlsZHJlbi5maWx0ZXIoKG5vZGUpID0+IHtcblx0XHQvLyBGaWx0ZXIgb3V0IHRleHQgbm9kZXMgdGhhdCBhcmUgb25seSB3aGl0ZXNwYWNlXG5cdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuXHRcdFx0Y29uc3QgdGV4dCA9IG5vZGUuZGF0YSB8fCBcIlwiO1xuXHRcdFx0Ly8gS2VlcCB0ZXh0IG5vZGVzIHRoYXQgaGF2ZSBub24td2hpdGVzcGFjZSBjb250ZW50XG5cdFx0XHRyZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0pO1xuXHQvLyBBcHBseSBhZGRpdGlvbmFsIHVzZXItcHJvdmlkZWQgZmlsdGVyIGlmIHNwZWNpZmllZFxuXHRpZiAoZmlsdGVyTm9kZSkge1xuXHRcdGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGZpbHRlck5vZGUpO1xuXHR9XG5cdHJldHVybiBmaWx0ZXJlZDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZURPTShub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgZmlsdGVyTm9kZSkge1xuXHRpZiAobm9kZUlzVGV4dChub2RlKSkge1xuXHRcdHJldHVybiBwcmludFRleHQobm9kZS5kYXRhLCBjb25maWcpO1xuXHR9XG5cdGlmIChub2RlSXNDb21tZW50KG5vZGUpKSB7XG5cdFx0cmV0dXJuIHByaW50Q29tbWVudChub2RlLmRhdGEsIGNvbmZpZyk7XG5cdH1cblx0Y29uc3QgdHlwZSA9IG5vZGVJc0ZyYWdtZW50KG5vZGUpID8gXCJEb2N1bWVudEZyYWdtZW50XCIgOiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRyZXR1cm4gcHJpbnRFbGVtZW50QXNMZWFmKHR5cGUsIGNvbmZpZyk7XG5cdH1cblx0Y29uc3QgY2hpbGRyZW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub2RlLmNoaWxkTm9kZXMgfHwgbm9kZS5jaGlsZHJlbik7XG5cdGNvbnN0IHNoYWRvd0NoaWxkcmVuID0gbm9kZUlzRnJhZ21lbnQobm9kZSkgfHwgIW5vZGUuc2hhZG93Um9vdCA/IFtdIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9kZS5zaGFkb3dSb290LmNoaWxkcmVuKTtcblx0Y29uc3QgcmVzb2x2ZWRDaGlsZHJlbiA9IGZpbHRlck5vZGUgPyBmaWx0ZXJDaGlsZHJlbihjaGlsZHJlbiwgZmlsdGVyTm9kZSkgOiBjaGlsZHJlbjtcblx0Y29uc3QgcmVzb2x2ZWRTaGFkb3dDaGlsZHJlbiA9IGZpbHRlck5vZGUgPyBmaWx0ZXJDaGlsZHJlbihzaGFkb3dDaGlsZHJlbiwgZmlsdGVyTm9kZSkgOiBzaGFkb3dDaGlsZHJlbjtcblx0cmV0dXJuIHByaW50RWxlbWVudCh0eXBlLCBwcmludFByb3BzKG5vZGVJc0ZyYWdtZW50KG5vZGUpID8gW10gOiBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcywgKGF0dHIpID0+IGF0dHIubmFtZSkuc29ydCgpLCBub2RlSXNGcmFnbWVudChub2RlKSA/IHt9IDogWy4uLm5vZGUuYXR0cmlidXRlc10ucmVkdWNlKChwcm9wcywgYXR0cmlidXRlKSA9PiB7XG5cdFx0cHJvcHNbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuXHRcdHJldHVybiBwcm9wcztcblx0fSwge30pLCBjb25maWcsIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCwgZGVwdGgsIHJlZnMsIHByaW50ZXIpLCAocmVzb2x2ZWRTaGFkb3dDaGlsZHJlbi5sZW5ndGggPiAwID8gcHJpbnRTaGFkb3dSb290KHJlc29sdmVkU2hhZG93Q2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBcIlwiKSArIHByaW50Q2hpbGRyZW4ocmVzb2x2ZWRDaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKSwgY29uZmlnLCBpbmRlbnRhdGlvbik7XG59XG5jb25zdCBzZXJpYWxpemUkMyA9IChub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4gc2VyaWFsaXplRE9NKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKTtcbmZ1bmN0aW9uIGNyZWF0ZURPTUVsZW1lbnRGaWx0ZXIoZmlsdGVyTm9kZSkge1xuXHRyZXR1cm4ge1xuXHRcdHRlc3Q6IHRlc3QkMyxcblx0XHRzZXJpYWxpemU6IChub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4gc2VyaWFsaXplRE9NKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCBmaWx0ZXJOb2RlKVxuXHR9O1xufVxuY29uc3QgcGx1Z2luJDMgPSB7XG5cdHNlcmlhbGl6ZTogc2VyaWFsaXplJDMsXG5cdHRlc3Q6IHRlc3QkM1xufTtcblxuLy8gU0VOVElORUwgY29uc3RhbnRzIGFyZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanNcbmNvbnN0IElTX0lURVJBQkxFX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX0lURVJBQkxFX19AQFwiO1xuY29uc3QgSVNfTElTVF9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9MSVNUX19AQFwiO1xuY29uc3QgSVNfS0VZRURfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfS0VZRURfX0BAXCI7XG5jb25zdCBJU19NQVBfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfTUFQX19AQFwiO1xuY29uc3QgSVNfT1JERVJFRF9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQFwiO1xuY29uc3QgSVNfUkVDT1JEX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX1JFQ09SRF9fQEBcIjtcbmNvbnN0IElTX1NFUV9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9TRVFfX0BAXCI7XG5jb25zdCBJU19TRVRfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfU0VUX19AQFwiO1xuY29uc3QgSVNfU1RBQ0tfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfU1RBQ0tfX0BAXCI7XG5jb25zdCBnZXRJbW11dGFibGVOYW1lID0gKG5hbWUpID0+IGBJbW11dGFibGUuJHtuYW1lfWA7XG5jb25zdCBwcmludEFzTGVhZiA9IChuYW1lKSA9PiBgWyR7bmFtZX1dYDtcbmNvbnN0IFNQQUNFID0gXCIgXCI7XG5jb25zdCBMQVpZID0gXCLigKZcIjtcbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlRW50cmllcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCB0eXBlKSB7XG5cdHJldHVybiArK2RlcHRoID4gY29uZmlnLm1heERlcHRoID8gcHJpbnRBc0xlYWYoZ2V0SW1tdXRhYmxlTmFtZSh0eXBlKSkgOiBgJHtnZXRJbW11dGFibGVOYW1lKHR5cGUpICsgU1BBQ0V9eyR7cHJpbnRJdGVyYXRvckVudHJpZXModmFsLmVudHJpZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfX1gO1xufVxuLy8gUmVjb3JkIGhhcyBhbiBlbnRyaWVzIG1ldGhvZCBiZWNhdXNlIGl0IGlzIGEgY29sbGVjdGlvbiBpbiBpbW11dGFibGUgdjMuXG4vLyBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIEltbXV0YWJsZSBSZWNvcmQgZnJvbSB2ZXJzaW9uIHYzIG9yIHY0LlxuZnVuY3Rpb24gZ2V0UmVjb3JkRW50cmllcyh2YWwpIHtcblx0bGV0IGkgPSAwO1xuXHRyZXR1cm4geyBuZXh0KCkge1xuXHRcdGlmIChpIDwgdmFsLl9rZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3Qga2V5ID0gdmFsLl9rZXlzW2krK107XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkb25lOiBmYWxzZSxcblx0XHRcdFx0dmFsdWU6IFtrZXksIHZhbC5nZXQoa2V5KV1cblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRkb25lOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH0gfTtcbn1cbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlUmVjb3JkKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0Ly8gX25hbWUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbmx5IGZvciBhbiBJbW11dGFibGUgUmVjb3JkIGluc3RhbmNlXG5cdC8vIHdoaWNoIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGEgc2Vjb25kIG9wdGlvbmFsIGRlc2NyaXB0aXZlIG5hbWUgYXJnXG5cdGNvbnN0IG5hbWUgPSBnZXRJbW11dGFibGVOYW1lKHZhbC5fbmFtZSB8fCBcIlJlY29yZFwiKTtcblx0cmV0dXJuICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEFzTGVhZihuYW1lKSA6IGAke25hbWUgKyBTUEFDRX17JHtwcmludEl0ZXJhdG9yRW50cmllcyhnZXRSZWNvcmRFbnRyaWVzKHZhbCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcbn1cbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlU2VxKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0Y29uc3QgbmFtZSA9IGdldEltbXV0YWJsZU5hbWUoXCJTZXFcIik7XG5cdGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG5cdFx0cmV0dXJuIHByaW50QXNMZWFmKG5hbWUpO1xuXHR9XG5cdGlmICh2YWxbSVNfS0VZRURfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIGAke25hbWUgKyBTUEFDRX17JHt2YWwuX2l0ZXIgfHwgdmFsLl9vYmplY3QgPyBwcmludEl0ZXJhdG9yRW50cmllcyh2YWwuZW50cmllcygpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBMQVpZfX1gO1xuXHR9XG5cdHJldHVybiBgJHtuYW1lICsgU1BBQ0V9WyR7dmFsLl9pdGVyIHx8IHZhbC5fYXJyYXkgfHwgdmFsLl9jb2xsZWN0aW9uIHx8IHZhbC5faXRlcmFibGUgPyBwcmludEl0ZXJhdG9yVmFsdWVzKHZhbC52YWx1ZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogTEFaWX1dYDtcbn1cbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlVmFsdWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHR5cGUpIHtcblx0cmV0dXJuICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEFzTGVhZihnZXRJbW11dGFibGVOYW1lKHR5cGUpKSA6IGAke2dldEltbXV0YWJsZU5hbWUodHlwZSkgKyBTUEFDRX1bJHtwcmludEl0ZXJhdG9yVmFsdWVzKHZhbC52YWx1ZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfV1gO1xufVxuY29uc3Qgc2VyaWFsaXplJDIgPSAodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4ge1xuXHRpZiAodmFsW0lTX01BUF9TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVFbnRyaWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/IFwiT3JkZXJlZE1hcFwiIDogXCJNYXBcIik7XG5cdH1cblx0aWYgKHZhbFtJU19MSVNUX1NFTlRJTkVMXSkge1xuXHRcdHJldHVybiBwcmludEltbXV0YWJsZVZhbHVlcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCBcIkxpc3RcIik7XG5cdH1cblx0aWYgKHZhbFtJU19TRVRfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/IFwiT3JkZXJlZFNldFwiIDogXCJTZXRcIik7XG5cdH1cblx0aWYgKHZhbFtJU19TVEFDS19TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVWYWx1ZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgXCJTdGFja1wiKTtcblx0fVxuXHRpZiAodmFsW0lTX1NFUV9TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVTZXEodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG5cdH1cblx0Ly8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpbW11dGFibGUgdjMgYW5kIHY0LCBsZXQgcmVjb3JkIGJlIHRoZSBkZWZhdWx0LlxuXHRyZXR1cm4gcHJpbnRJbW11dGFibGVSZWNvcmQodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG59O1xuLy8gRXhwbGljaXRseSBjb21wYXJpbmcgc2VudGluZWwgcHJvcGVydGllcyB0byB0cnVlIGF2b2lkcyBmYWxzZSBwb3NpdGl2ZVxuLy8gd2hlbiBtb2NrIGlkZW50aXR5LW9iai1wcm94eSByZXR1cm5zIHRoZSBrZXkgYXMgdGhlIHZhbHVlIGZvciBhbnkga2V5LlxuY29uc3QgdGVzdCQyID0gKHZhbCkgPT4gdmFsICYmICh2YWxbSVNfSVRFUkFCTEVfU0VOVElORUxdID09PSB0cnVlIHx8IHZhbFtJU19SRUNPUkRfU0VOVElORUxdID09PSB0cnVlKTtcbmNvbnN0IHBsdWdpbiQyID0ge1xuXHRzZXJpYWxpemU6IHNlcmlhbGl6ZSQyLFxuXHR0ZXN0OiB0ZXN0JDJcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCBcImRlZmF1bHRcIikgPyB4W1wiZGVmYXVsdFwiXSA6IHg7XG59XG5cbnZhciByZWFjdElzJDEgPSB7ZXhwb3J0czoge319O1xuXG52YXIgcmVhY3RJc19wcm9kdWN0aW9uID0ge307XG5cbi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLnByb2R1Y3Rpb24uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbjtcblxuZnVuY3Rpb24gcmVxdWlyZVJlYWN0SXNfcHJvZHVjdGlvbiAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbikgcmV0dXJuIHJlYWN0SXNfcHJvZHVjdGlvbjtcblx0aGFzUmVxdWlyZWRSZWFjdElzX3Byb2R1Y3Rpb24gPSAxO1xuXHR2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLFxuXHQgIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxcblx0ICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuXHQgIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksXG5cdCAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKSxcblx0ICBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuXHQgIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLFxuXHQgIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksXG5cdCAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcblx0ICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKSxcblx0ICBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSxcblx0ICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcblx0ICBSRUFDVF9WSUVXX1RSQU5TSVRJT05fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC52aWV3X3RyYW5zaXRpb25cIiksXG5cdCAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpO1xuXHRmdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG5cdCAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBvYmplY3QgJiYgbnVsbCAhPT0gb2JqZWN0KSB7XG5cdCAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cdCAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG5cdCAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuXHQgICAgICAgIHN3aXRjaCAoKChvYmplY3QgPSBvYmplY3QudHlwZSksIG9iamVjdCkpIHtcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuXHQgICAgICAgICAgY2FzZSBSRUFDVF9WSUVXX1RSQU5TSVRJT05fVFlQRTpcblx0ICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIHN3aXRjaCAoKChvYmplY3QgPSBvYmplY3QgJiYgb2JqZWN0LiQkdHlwZW9mKSwgb2JqZWN0KSkge1xuXHQgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuXHQgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcblx0ICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcblx0ICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG5cdCAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcblx0ICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuXHQgICAgICAgIHJldHVybiAkJHR5cGVvZjtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0cmVhY3RJc19wcm9kdWN0aW9uLkNvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlNVTUVSX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5Db250ZXh0UHJvdmlkZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5FbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5MYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLlBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5TdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0NvbnRleHRDb25zdW1lciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlNVTUVSX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0NvbnRleHRQcm92aWRlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzRWxlbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gKFxuXHQgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuXHQgICAgbnVsbCAhPT0gb2JqZWN0ICYmXG5cdCAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuXHQgICk7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0ZvcndhcmRSZWYgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNGcmFnbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0xhenkgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc01lbW8gPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1BvcnRhbCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNQcm9maWxlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1N0cmljdE1vZGUgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNTdXNwZW5zZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1N1c3BlbnNlTGlzdCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzVmFsaWRFbGVtZW50VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgcmV0dXJuIFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlIHx8XG5cdCAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHxcblx0ICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuXHQgICAgICBudWxsICE9PSB0eXBlICYmXG5cdCAgICAgICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05TVU1FUl9UWVBFIHx8XG5cdCAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuXHQgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgfHxcblx0ICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuXHQgICAgPyB0cnVlXG5cdCAgICA6IGZhbHNlO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24udHlwZU9mID0gdHlwZU9mO1xuXHRyZXR1cm4gcmVhY3RJc19wcm9kdWN0aW9uO1xufVxuXG52YXIgaGFzUmVxdWlyZWRSZWFjdElzJDE7XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZWFjdElzJDEgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRSZWFjdElzJDEpIHJldHVybiByZWFjdElzJDEuZXhwb3J0cztcblx0aGFzUmVxdWlyZWRSZWFjdElzJDEgPSAxO1xuXG5cdHtcblx0ICByZWFjdElzJDEuZXhwb3J0cyA9IHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb24oKTtcblx0fVxuXHRyZXR1cm4gcmVhY3RJcyQxLmV4cG9ydHM7XG59XG5cbnZhciByZWFjdElzRXhwb3J0cyQxID0gcmVxdWlyZVJlYWN0SXMkMSgpO1xudmFyIGluZGV4JDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVhY3RJc0V4cG9ydHMkMSk7XG5cbnZhciBSZWFjdElzMTkgPSAvKiNfX1BVUkVfXyovX21lcmdlTmFtZXNwYWNlcyh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZGVmYXVsdDogaW5kZXgkMVxufSwgW3JlYWN0SXNFeHBvcnRzJDFdKTtcblxudmFyIHJlYWN0SXMgPSB7ZXhwb3J0czoge319O1xuXG52YXIgcmVhY3RJc19wcm9kdWN0aW9uX21pbiA9IHt9O1xuXG4vKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbl9taW47XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb25fbWluICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkUmVhY3RJc19wcm9kdWN0aW9uX21pbikgcmV0dXJuIHJlYWN0SXNfcHJvZHVjdGlvbl9taW47XG5cdGhhc1JlcXVpcmVkUmVhY3RJc19wcm9kdWN0aW9uX21pbiA9IDE7XG52YXIgYj1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSxjPVN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksZD1TeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIiksZT1TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksZj1TeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIiksZz1TeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIiksaD1TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxrPVN5bWJvbC5mb3IoXCJyZWFjdC5zZXJ2ZXJfY29udGV4dFwiKSxsPVN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxtPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxuPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLHA9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIikscT1TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSx0PVN5bWJvbC5mb3IoXCJyZWFjdC5vZmZzY3JlZW5cIiksdTt1PVN5bWJvbC5mb3IoXCJyZWFjdC5tb2R1bGUucmVmZXJlbmNlXCIpO1xuXHRmdW5jdGlvbiB2KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciByPWEuJCR0eXBlb2Y7c3dpdGNoKHIpe2Nhc2UgYjpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBkOmNhc2UgZjpjYXNlIGU6Y2FzZSBtOmNhc2UgbjpyZXR1cm4gYTtkZWZhdWx0OnN3aXRjaChhPWEmJmEuJCR0eXBlb2YsYSl7Y2FzZSBrOmNhc2UgaDpjYXNlIGw6Y2FzZSBxOmNhc2UgcDpjYXNlIGc6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gcn19Y2FzZSBjOnJldHVybiByfX19cmVhY3RJc19wcm9kdWN0aW9uX21pbi5Db250ZXh0Q29uc3VtZXI9aDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkNvbnRleHRQcm92aWRlcj1nO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uRWxlbWVudD1iO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uRm9yd2FyZFJlZj1sO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uRnJhZ21lbnQ9ZDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkxhenk9cTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLk1lbW89cDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlBvcnRhbD1jO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uUHJvZmlsZXI9ZjtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlN0cmljdE1vZGU9ZTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlN1c3BlbnNlPW07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbl9taW4uU3VzcGVuc2VMaXN0PW47cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc0FzeW5jTW9kZT1mdW5jdGlvbigpe3JldHVybiAgZmFsc2V9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNDb25jdXJyZW50TW9kZT1mdW5jdGlvbigpe3JldHVybiAgZmFsc2V9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNDb250ZXh0Q29uc3VtZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1ofTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzQ29udGV4dFByb3ZpZGVyPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09Z307cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc0VsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJmEuJCR0eXBlb2Y9PT1ifTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzRm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWx9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWR9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNMYXp5PWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09cX07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1wfTtcblx0cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1BvcnRhbD1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWN9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNQcm9maWxlcj1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWZ9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNTdHJpY3RNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09ZX07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1N1c3BlbnNlPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09bX07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1N1c3BlbnNlTGlzdD1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PW59O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzVmFsaWRFbGVtZW50VHlwZT1mdW5jdGlvbihhKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiBhfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgYXx8YT09PWR8fGE9PT1mfHxhPT09ZXx8YT09PW18fGE9PT1ufHxhPT09dHx8XCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmKGEuJCR0eXBlb2Y9PT1xfHxhLiQkdHlwZW9mPT09cHx8YS4kJHR5cGVvZj09PWd8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09bHx8YS4kJHR5cGVvZj09PXV8fHZvaWQgMCE9PWEuZ2V0TW9kdWxlSWQpP3RydWU6ZmFsc2V9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4udHlwZU9mPXY7XG5cdHJldHVybiByZWFjdElzX3Byb2R1Y3Rpb25fbWluO1xufVxuXG52YXIgaGFzUmVxdWlyZWRSZWFjdElzO1xuXG5mdW5jdGlvbiByZXF1aXJlUmVhY3RJcyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFJlYWN0SXMpIHJldHVybiByZWFjdElzLmV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkUmVhY3RJcyA9IDE7XG5cblx0e1xuXHQgIHJlYWN0SXMuZXhwb3J0cyA9IHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb25fbWluKCk7XG5cdH1cblx0cmV0dXJuIHJlYWN0SXMuZXhwb3J0cztcbn1cblxudmFyIHJlYWN0SXNFeHBvcnRzID0gcmVxdWlyZVJlYWN0SXMoKTtcbnZhciBpbmRleCA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhyZWFjdElzRXhwb3J0cyk7XG5cbnZhciBSZWFjdElzMTggPSAvKiNfX1BVUkVfXyovX21lcmdlTmFtZXNwYWNlcyh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZGVmYXVsdDogaW5kZXhcbn0sIFtyZWFjdElzRXhwb3J0c10pO1xuXG5jb25zdCByZWFjdElzTWV0aG9kcyA9IFtcblx0XCJpc0FzeW5jTW9kZVwiLFxuXHRcImlzQ29uY3VycmVudE1vZGVcIixcblx0XCJpc0NvbnRleHRDb25zdW1lclwiLFxuXHRcImlzQ29udGV4dFByb3ZpZGVyXCIsXG5cdFwiaXNFbGVtZW50XCIsXG5cdFwiaXNGb3J3YXJkUmVmXCIsXG5cdFwiaXNGcmFnbWVudFwiLFxuXHRcImlzTGF6eVwiLFxuXHRcImlzTWVtb1wiLFxuXHRcImlzUG9ydGFsXCIsXG5cdFwiaXNQcm9maWxlclwiLFxuXHRcImlzU3RyaWN0TW9kZVwiLFxuXHRcImlzU3VzcGVuc2VcIixcblx0XCJpc1N1c3BlbnNlTGlzdFwiLFxuXHRcImlzVmFsaWRFbGVtZW50VHlwZVwiXG5dO1xuY29uc3QgUmVhY3RJcyA9IE9iamVjdC5mcm9tRW50cmllcyhyZWFjdElzTWV0aG9kcy5tYXAoKG0pID0+IFttLCAodikgPT4gUmVhY3RJczE4W21dKHYpIHx8IFJlYWN0SXMxOVttXSh2KV0pKTtcbi8vIEdpdmVuIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIG9yIHN1YnRyZWUgZHVyaW5nIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwsXG4vLyByZXR1cm4gZmxhdHRlbmVkIGFycmF5IG9mIGNoaWxkcmVuLlxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oYXJnLCBjaGlsZHJlbiA9IFtdKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYXJnKSB7XG5cdFx0XHRnZXRDaGlsZHJlbihpdGVtLCBjaGlsZHJlbik7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGFyZyAhPSBudWxsICYmIGFyZyAhPT0gZmFsc2UgJiYgYXJnICE9PSBcIlwiKSB7XG5cdFx0Y2hpbGRyZW4ucHVzaChhcmcpO1xuXHR9XG5cdHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGdldFR5cGUoZWxlbWVudCkge1xuXHRjb25zdCB0eXBlID0gZWxlbWVudC50eXBlO1xuXHRpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gdHlwZTtcblx0fVxuXHRpZiAodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBcIlVua25vd25cIjtcblx0fVxuXHRpZiAoUmVhY3RJcy5pc0ZyYWdtZW50KGVsZW1lbnQpKSB7XG5cdFx0cmV0dXJuIFwiUmVhY3QuRnJhZ21lbnRcIjtcblx0fVxuXHRpZiAoUmVhY3RJcy5pc1N1c3BlbnNlKGVsZW1lbnQpKSB7XG5cdFx0cmV0dXJuIFwiUmVhY3QuU3VzcGVuc2VcIjtcblx0fVxuXHRpZiAodHlwZW9mIHR5cGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gbnVsbCkge1xuXHRcdGlmIChSZWFjdElzLmlzQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm4gXCJDb250ZXh0LlByb3ZpZGVyXCI7XG5cdFx0fVxuXHRcdGlmIChSZWFjdElzLmlzQ29udGV4dENvbnN1bWVyKGVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm4gXCJDb250ZXh0LkNvbnN1bWVyXCI7XG5cdFx0fVxuXHRcdGlmIChSZWFjdElzLmlzRm9yd2FyZFJlZihlbGVtZW50KSkge1xuXHRcdFx0aWYgKHR5cGUuZGlzcGxheU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHR5cGUuZGlzcGxheU5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLnJlbmRlci5kaXNwbGF5TmFtZSB8fCB0eXBlLnJlbmRlci5uYW1lIHx8IFwiXCI7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb25OYW1lID09PSBcIlwiID8gXCJGb3J3YXJkUmVmXCIgOiBgRm9yd2FyZFJlZigke2Z1bmN0aW9uTmFtZX0pYDtcblx0XHR9XG5cdFx0aWYgKFJlYWN0SXMuaXNNZW1vKGVsZW1lbnQpKSB7XG5cdFx0XHRjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUudHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLnR5cGUubmFtZSB8fCBcIlwiO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uTmFtZSA9PT0gXCJcIiA/IFwiTWVtb1wiIDogYE1lbW8oJHtmdW5jdGlvbk5hbWV9KWA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBcIlVOREVGSU5FRFwiO1xufVxuZnVuY3Rpb24gZ2V0UHJvcEtleXMkMShlbGVtZW50KSB7XG5cdGNvbnN0IHsgcHJvcHMgfSA9IGVsZW1lbnQ7XG5cdHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJjaGlsZHJlblwiICYmIHByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkuc29ydCgpO1xufVxuY29uc3Qgc2VyaWFsaXplJDEgPSAoZWxlbWVudCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+ICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEVsZW1lbnRBc0xlYWYoZ2V0VHlwZShlbGVtZW50KSwgY29uZmlnKSA6IHByaW50RWxlbWVudChnZXRUeXBlKGVsZW1lbnQpLCBwcmludFByb3BzKGdldFByb3BLZXlzJDEoZWxlbWVudCksIGVsZW1lbnQucHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlciksIHByaW50Q2hpbGRyZW4oZ2V0Q2hpbGRyZW4oZWxlbWVudC5wcm9wcy5jaGlsZHJlbiksIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlciksIGNvbmZpZywgaW5kZW50YXRpb24pO1xuY29uc3QgdGVzdCQxID0gKHZhbCkgPT4gdmFsICE9IG51bGwgJiYgUmVhY3RJcy5pc0VsZW1lbnQodmFsKTtcbmNvbnN0IHBsdWdpbiQxID0ge1xuXHRzZXJpYWxpemU6IHNlcmlhbGl6ZSQxLFxuXHR0ZXN0OiB0ZXN0JDFcbn07XG5cbmNvbnN0IHRlc3RTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmZvciA/IFN5bWJvbC5mb3IoXCJyZWFjdC50ZXN0Lmpzb25cIikgOiAyNDU4MzA0ODc7XG5mdW5jdGlvbiBnZXRQcm9wS2V5cyhvYmplY3QpIHtcblx0Y29uc3QgeyBwcm9wcyB9ID0gb2JqZWN0O1xuXHRyZXR1cm4gcHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKChrZXkpID0+IHByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkuc29ydCgpIDogW107XG59XG5jb25zdCBzZXJpYWxpemUgPSAob2JqZWN0LCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCA/IHByaW50RWxlbWVudEFzTGVhZihvYmplY3QudHlwZSwgY29uZmlnKSA6IHByaW50RWxlbWVudChvYmplY3QudHlwZSwgb2JqZWN0LnByb3BzID8gcHJpbnRQcm9wcyhnZXRQcm9wS2V5cyhvYmplY3QpLCBvYmplY3QucHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBcIlwiLCBvYmplY3QuY2hpbGRyZW4gPyBwcmludENoaWxkcmVuKG9iamVjdC5jaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKSA6IFwiXCIsIGNvbmZpZywgaW5kZW50YXRpb24pO1xuY29uc3QgdGVzdCA9ICh2YWwpID0+IHZhbCAmJiB2YWwuJCR0eXBlb2YgPT09IHRlc3RTeW1ib2w7XG5jb25zdCBwbHVnaW4gPSB7XG5cdHNlcmlhbGl6ZSxcblx0dGVzdFxufTtcblxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcbmNvbnN0IGVycm9yVG9TdHJpbmcgPSBFcnJvci5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCByZWdFeHBUb1N0cmluZyA9IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmc7XG4vKipcbiogRXhwbGljaXRseSBjb21wYXJpbmcgdHlwZW9mIGNvbnN0cnVjdG9yIHRvIGZ1bmN0aW9uIGF2b2lkcyB1bmRlZmluZWQgYXMgbmFtZVxuKiB3aGVuIG1vY2sgaWRlbnRpdHktb2JqLXByb3h5IHJldHVybnMgdGhlIGtleSBhcyB0aGUgdmFsdWUgZm9yIGFueSBrZXkuXG4qL1xuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiT2JqZWN0XCI7XG59XG4vKiogSXMgdmFsIGlzIGVxdWFsIHRvIGdsb2JhbCB3aW5kb3cgb2JqZWN0PyBXb3JrcyBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0IDopICovXG5mdW5jdGlvbiBpc1dpbmRvdyh2YWwpIHtcblx0cmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsID09PSB3aW5kb3c7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcbmNvbnN0IFNZTUJPTF9SRUdFWFAgPSAvXlN5bWJvbFxcKCguKilcXCkoLiopJC87XG5jb25zdCBORVdMSU5FX1JFR0VYUCA9IC9cXG4vZztcbmNsYXNzIFByZXR0eUZvcm1hdFBsdWdpbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCBzdGFjaykge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMuc3RhY2sgPSBzdGFjaztcblx0XHR0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG5cdH1cbn1cbmZ1bmN0aW9uIGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSB7XG5cdHJldHVybiB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgQXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBEYXRhVmlld11cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBGbG9hdDY0QXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEludDhBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgSW50MTZBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgSW50MzJBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgVWludDhBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBVaW50MzJBcnJheV1cIjtcbn1cbmZ1bmN0aW9uIHByaW50TnVtYmVyKHZhbCkge1xuXHRyZXR1cm4gT2JqZWN0LmlzKHZhbCwgLTApID8gXCItMFwiIDogU3RyaW5nKHZhbCk7XG59XG5mdW5jdGlvbiBwcmludEJpZ0ludCh2YWwpIHtcblx0cmV0dXJuIFN0cmluZyhgJHt2YWx9bmApO1xufVxuZnVuY3Rpb24gcHJpbnRGdW5jdGlvbih2YWwsIHByaW50RnVuY3Rpb25OYW1lKSB7XG5cdGlmICghcHJpbnRGdW5jdGlvbk5hbWUpIHtcblx0XHRyZXR1cm4gXCJbRnVuY3Rpb25dXCI7XG5cdH1cblx0cmV0dXJuIGBbRnVuY3Rpb24gJHt2YWwubmFtZSB8fCBcImFub255bW91c1wifV1gO1xufVxuZnVuY3Rpb24gcHJpbnRTeW1ib2wodmFsKSB7XG5cdHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKFNZTUJPTF9SRUdFWFAsIFwiU3ltYm9sKCQxKVwiKTtcbn1cbmZ1bmN0aW9uIHByaW50RXJyb3IodmFsKSB7XG5cdHJldHVybiBgWyR7ZXJyb3JUb1N0cmluZy5jYWxsKHZhbCl9XWA7XG59XG4vKipcbiogVGhlIGZpcnN0IHBvcnQgb2YgY2FsbCBmb3IgcHJpbnRpbmcgYW4gb2JqZWN0LCBoYW5kbGVzIG1vc3Qgb2YgdGhlXG4qIGRhdGEtdHlwZXMgaW4gSlMuXG4qL1xuZnVuY3Rpb24gcHJpbnRCYXNpY1ZhbHVlKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUsIGVzY2FwZVJlZ2V4LCBlc2NhcGVTdHJpbmcpIHtcblx0aWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGAke3ZhbH1gO1xuXHR9XG5cdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBcInVuZGVmaW5lZFwiO1xuXHR9XG5cdGlmICh2YWwgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gXCJudWxsXCI7XG5cdH1cblx0Y29uc3QgdHlwZU9mID0gdHlwZW9mIHZhbDtcblx0aWYgKHR5cGVPZiA9PT0gXCJudW1iZXJcIikge1xuXHRcdHJldHVybiBwcmludE51bWJlcih2YWwpO1xuXHR9XG5cdGlmICh0eXBlT2YgPT09IFwiYmlnaW50XCIpIHtcblx0XHRyZXR1cm4gcHJpbnRCaWdJbnQodmFsKTtcblx0fVxuXHRpZiAodHlwZU9mID09PSBcInN0cmluZ1wiKSB7XG5cdFx0aWYgKGVzY2FwZVN0cmluZykge1xuXHRcdFx0cmV0dXJuIGBcIiR7dmFsLnJlcGxhY2VBbGwoL1wifFxcXFwvZywgXCJcXFxcJCZcIil9XCJgO1xuXHRcdH1cblx0XHRyZXR1cm4gYFwiJHt2YWx9XCJgO1xuXHR9XG5cdGlmICh0eXBlT2YgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHJldHVybiBwcmludEZ1bmN0aW9uKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUpO1xuXHR9XG5cdGlmICh0eXBlT2YgPT09IFwic3ltYm9sXCIpIHtcblx0XHRyZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcblx0fVxuXHRjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFdlYWtNYXBdXCIpIHtcblx0XHRyZXR1cm4gXCJXZWFrTWFwIHt9XCI7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBXZWFrU2V0XVwiKSB7XG5cdFx0cmV0dXJuIFwiV2Vha1NldCB7fVwiO1xuXHR9XG5cdGlmICh0b1N0cmluZ2VkID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXVwiKSB7XG5cdFx0cmV0dXJuIHByaW50RnVuY3Rpb24odmFsLCBwcmludEZ1bmN0aW9uTmFtZSk7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBTeW1ib2xdXCIpIHtcblx0XHRyZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IERhdGVdXCIpIHtcblx0XHRyZXR1cm4gTnVtYmVyLmlzTmFOKCt2YWwpID8gXCJEYXRlIHsgTmFOIH1cIiA6IHRvSVNPU3RyaW5nLmNhbGwodmFsKTtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEVycm9yXVwiKSB7XG5cdFx0cmV0dXJuIHByaW50RXJyb3IodmFsKTtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIikge1xuXHRcdGlmIChlc2NhcGVSZWdleCkge1xuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmVnRXhwLmVzY2FwZS9ibG9iL21haW4vcG9seWZpbGwuanNcblx0XHRcdHJldHVybiByZWdFeHBUb1N0cmluZy5jYWxsKHZhbCkucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFwiXFxcXCQmXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVnRXhwVG9TdHJpbmcuY2FsbCh2YWwpO1xuXHR9XG5cdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdHJldHVybiBwcmludEVycm9yKHZhbCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG4vKipcbiogSGFuZGxlcyBtb3JlIGNvbXBsZXggb2JqZWN0cyAoIHN1Y2ggYXMgb2JqZWN0cyB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4qIG1hcHMgYW5kIHNldHMgZXRjIClcbiovXG5mdW5jdGlvbiBwcmludENvbXBsZXhWYWx1ZSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcblx0aWYgKHJlZnMuaW5jbHVkZXModmFsKSkge1xuXHRcdHJldHVybiBcIltDaXJjdWxhcl1cIjtcblx0fVxuXHRyZWZzID0gWy4uLnJlZnNdO1xuXHRyZWZzLnB1c2godmFsKTtcblx0Y29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuXHRjb25zdCBtaW4gPSBjb25maWcubWluO1xuXHRpZiAoY29uZmlnLmNhbGxUb0pTT04gJiYgIWhpdE1heERlcHRoICYmIHZhbC50b0pTT04gJiYgdHlwZW9mIHZhbC50b0pTT04gPT09IFwiZnVuY3Rpb25cIiAmJiAhaGFzQ2FsbGVkVG9KU09OKSB7XG5cdFx0cmV0dXJuIHByaW50ZXIodmFsLnRvSlNPTigpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgdHJ1ZSk7XG5cdH1cblx0Y29uc3QgdG9TdHJpbmdlZCA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHtcblx0XHRyZXR1cm4gaGl0TWF4RGVwdGggPyBcIltBcmd1bWVudHNdXCIgOiBgJHttaW4gPyBcIlwiIDogXCJBcmd1bWVudHMgXCJ9WyR7cHJpbnRMaXN0SXRlbXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9XWA7XG5cdH1cblx0aWYgKGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSkge1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IGBbJHt2YWwuY29uc3RydWN0b3IubmFtZX1dYCA6IGAke21pbiA/IFwiXCIgOiAhY29uZmlnLnByaW50QmFzaWNQcm90b3R5cGUgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIiA/IFwiXCIgOiBgJHt2YWwuY29uc3RydWN0b3IubmFtZX0gYH1bJHtwcmludExpc3RJdGVtcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX1dYDtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IE1hcF1cIikge1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IFwiW01hcF1cIiA6IGBNYXAgeyR7cHJpbnRJdGVyYXRvckVudHJpZXModmFsLmVudHJpZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIFwiID0+IFwiKX19YDtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFNldF1cIikge1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IFwiW1NldF1cIiA6IGBTZXQgeyR7cHJpbnRJdGVyYXRvclZhbHVlcyh2YWwudmFsdWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcblx0fVxuXHQvLyBBdm9pZCBmYWlsdXJlIHRvIHNlcmlhbGl6ZSBnbG9iYWwgd2luZG93IG9iamVjdCBpbiBqc2RvbSB0ZXN0IGVudmlyb25tZW50LlxuXHQvLyBGb3IgZXhhbXBsZSwgbm90IGV2ZW4gcmVsZXZhbnQgaWYgd2luZG93IGlzIHByb3Agb2YgUmVhY3QgZWxlbWVudC5cblx0cmV0dXJuIGhpdE1heERlcHRoIHx8IGlzV2luZG93KHZhbCkgPyBgWyR7Z2V0Q29uc3RydWN0b3JOYW1lKHZhbCl9XWAgOiBgJHttaW4gPyBcIlwiIDogIWNvbmZpZy5wcmludEJhc2ljUHJvdG90eXBlICYmIGdldENvbnN0cnVjdG9yTmFtZSh2YWwpID09PSBcIk9iamVjdFwiID8gXCJcIiA6IGAke2dldENvbnN0cnVjdG9yTmFtZSh2YWwpfSBgfXske3ByaW50T2JqZWN0UHJvcGVydGllcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcbn1cbmNvbnN0IEVycm9yUGx1Z2luID0ge1xuXHR0ZXN0OiAodmFsKSA9PiB2YWwgJiYgdmFsIGluc3RhbmNlb2YgRXJyb3IsXG5cdHNlcmlhbGl6ZSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdFx0aWYgKHJlZnMuaW5jbHVkZXModmFsKSkge1xuXHRcdFx0cmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuXHRcdH1cblx0XHRyZWZzID0gWy4uLnJlZnMsIHZhbF07XG5cdFx0Y29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuXHRcdGNvbnN0IHsgbWVzc2FnZSwgY2F1c2UsIC4uLnJlc3QgfSA9IHZhbDtcblx0XHRjb25zdCBlbnRyaWVzID0ge1xuXHRcdFx0bWVzc2FnZSxcblx0XHRcdC4uLnR5cGVvZiBjYXVzZSAhPT0gXCJ1bmRlZmluZWRcIiA/IHsgY2F1c2UgfSA6IHt9LFxuXHRcdFx0Li4udmFsIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IgPyB7IGVycm9yczogdmFsLmVycm9ycyB9IDoge30sXG5cdFx0XHQuLi5yZXN0XG5cdFx0fTtcblx0XHRjb25zdCBuYW1lID0gdmFsLm5hbWUgIT09IFwiRXJyb3JcIiA/IHZhbC5uYW1lIDogZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCk7XG5cdFx0cmV0dXJuIGhpdE1heERlcHRoID8gYFske25hbWV9XWAgOiBgJHtuYW1lfSB7JHtwcmludEl0ZXJhdG9yRW50cmllcyhPYmplY3QuZW50cmllcyhlbnRyaWVzKS52YWx1ZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfX1gO1xuXHR9XG59O1xuZnVuY3Rpb24gaXNOZXdQbHVnaW4ocGx1Z2luKSB7XG5cdHJldHVybiBwbHVnaW4uc2VyaWFsaXplICE9IG51bGw7XG59XG5mdW5jdGlvbiBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpIHtcblx0bGV0IHByaW50ZWQ7XG5cdHRyeSB7XG5cdFx0cHJpbnRlZCA9IGlzTmV3UGx1Z2luKHBsdWdpbikgPyBwbHVnaW4uc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogcGx1Z2luLnByaW50KHZhbCwgKHZhbENoaWxkKSA9PiBwcmludGVyKHZhbENoaWxkLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyksIChzdHIpID0+IHtcblx0XHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHRcdHJldHVybiBpbmRlbnRhdGlvbk5leHQgKyBzdHIucmVwbGFjZUFsbChORVdMSU5FX1JFR0VYUCwgYFxcbiR7aW5kZW50YXRpb25OZXh0fWApO1xuXHRcdH0sIHtcblx0XHRcdGVkZ2VTcGFjaW5nOiBjb25maWcuc3BhY2luZ091dGVyLFxuXHRcdFx0bWluOiBjb25maWcubWluLFxuXHRcdFx0c3BhY2luZzogY29uZmlnLnNwYWNpbmdJbm5lclxuXHRcdH0sIGNvbmZpZy5jb2xvcnMpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHRocm93IG5ldyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcmludGVkICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgcHJldHR5LWZvcm1hdDogUGx1Z2luIG11c3QgcmV0dXJuIHR5cGUgXCJzdHJpbmdcIiBidXQgaW5zdGVhZCByZXR1cm5lZCBcIiR7dHlwZW9mIHByaW50ZWR9XCIuYCk7XG5cdH1cblx0cmV0dXJuIHByaW50ZWQ7XG59XG5mdW5jdGlvbiBmaW5kUGx1Z2luKHBsdWdpbnMsIHZhbCkge1xuXHRmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChwbHVnaW4udGVzdCh2YWwpKSB7XG5cdFx0XHRcdHJldHVybiBwbHVnaW47XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcHJpbnRlcih2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcblx0bGV0IHJlc3VsdDtcblx0Y29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihjb25maWcucGx1Z2lucywgdmFsKTtcblx0aWYgKHBsdWdpbiAhPT0gbnVsbCkge1xuXHRcdHJlc3VsdCA9IHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUodmFsLCBjb25maWcucHJpbnRGdW5jdGlvbk5hbWUsIGNvbmZpZy5lc2NhcGVSZWdleCwgY29uZmlnLmVzY2FwZVN0cmluZyk7XG5cdFx0aWYgKGJhc2ljUmVzdWx0ICE9PSBudWxsKSB7XG5cdFx0XHRyZXN1bHQgPSBiYXNpY1Jlc3VsdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gcHJpbnRDb21wbGV4VmFsdWUodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgaGFzQ2FsbGVkVG9KU09OKTtcblx0XHR9XG5cdH1cblx0Ly8gUGVyLWRlcHRoIG91dHB1dCBidWRnZXQgKGluc3BpcmVkIGJ5IE5vZGUncyB1dGlsLmluc3BlY3QpLlxuXHQvLyBFYWNoIGRlcHRoIGxldmVsIHRyYWNrcyBvdXRwdXQgaW5kZXBlbmRlbnRseSwgc28gbmVzdGVkIHJlc3VsdHNcblx0Ly8gZG9uJ3QgaW5mbGF0ZSBhIHNpbmdsZSBjb3VudGVyICh3aGljaCB3b3VsZCB1bmRlcmNvdW50IGJ5IH5OeCBmb3Jcblx0Ly8gTiBsZXZlbHMgb2YgbmVzdGluZykuIE5vZGVzIGF0IHRoZSBzYW1lIGRlcHRoIHByb2R1Y2UgZGlzam9pbnQgc3BhbnNcblx0Ly8gaW4gdGhlIG91dHB1dCBzdHJpbmcsIHNvIGVhY2ggYnVja2V0IGFjY3VyYXRlbHkgcmVmbGVjdHMgb3V0cHV0IGF0XG5cdC8vIHRoYXQgbGV2ZWwuIFRvdGFsIG91dHB1dCBpcyBib3VuZGVkIGJ5IG1heERlcHRoIMOXIG1heE91dHB1dExlbmd0aC5cblx0Y29uZmlnLl9vdXRwdXRMZW5ndGhQZXJEZXB0aFtkZXB0aF0gPz89IDA7XG5cdGNvbmZpZy5fb3V0cHV0TGVuZ3RoUGVyRGVwdGhbZGVwdGhdICs9IHJlc3VsdC5sZW5ndGg7XG5cdGlmIChjb25maWcuX291dHB1dExlbmd0aFBlckRlcHRoW2RlcHRoXSA+IGNvbmZpZy5tYXhPdXRwdXRMZW5ndGgpIHtcblx0XHRjb25maWcubWF4RGVwdGggPSAwO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBERUZBVUxUX1RIRU1FID0ge1xuXHRjb21tZW50OiBcImdyYXlcIixcblx0Y29udGVudDogXCJyZXNldFwiLFxuXHRwcm9wOiBcInllbGxvd1wiLFxuXHR0YWc6IFwiY3lhblwiLFxuXHR2YWx1ZTogXCJncmVlblwiXG59O1xuY29uc3QgREVGQVVMVF9USEVNRV9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9USEVNRSk7XG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG5cdGNhbGxUb0pTT046IHRydWUsXG5cdGNvbXBhcmVLZXlzOiB1bmRlZmluZWQsXG5cdGVzY2FwZVJlZ2V4OiBmYWxzZSxcblx0ZXNjYXBlU3RyaW5nOiB0cnVlLFxuXHRoaWdobGlnaHQ6IGZhbHNlLFxuXHRpbmRlbnQ6IDIsXG5cdG1heERlcHRoOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG5cdG1heE91dHB1dExlbmd0aDogMWU2LFxuXHRtYXhXaWR0aDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRtaW46IGZhbHNlLFxuXHRwbHVnaW5zOiBbXSxcblx0cHJpbnRCYXNpY1Byb3RvdHlwZTogdHJ1ZSxcblx0cHJpbnRGdW5jdGlvbk5hbWU6IHRydWUsXG5cdHByaW50U2hhZG93Um9vdDogdHJ1ZSxcblx0dGhlbWU6IERFRkFVTFRfVEhFTUVcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuXHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuXHRcdGlmICghT2JqZWN0Lmhhc093bihERUZBVUxUX09QVElPTlMsIGtleSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgcHJldHR5LWZvcm1hdDogVW5rbm93biBvcHRpb24gXCIke2tleX1cIi5gKTtcblx0XHR9XG5cdH1cblx0aWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5pbmRlbnQgIT09IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwcmV0dHktZm9ybWF0OiBPcHRpb25zIFxcXCJtaW5cXFwiIGFuZCBcXFwiaW5kZW50XFxcIiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cIik7XG5cdH1cbn1cbmZ1bmN0aW9uIGdldENvbG9yc0hpZ2hsaWdodCgpIHtcblx0cmV0dXJuIERFRkFVTFRfVEhFTUVfS0VZUy5yZWR1Y2UoKGNvbG9ycywga2V5KSA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSBERUZBVUxUX1RIRU1FW2tleV07XG5cdFx0Y29uc3QgY29sb3IgPSB2YWx1ZSAmJiBzdHlsZXNbdmFsdWVdO1xuXHRcdGlmIChjb2xvciAmJiB0eXBlb2YgY29sb3IuY2xvc2UgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGNvbG9yLm9wZW4gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGNvbG9yc1trZXldID0gY29sb3I7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgcHJldHR5LWZvcm1hdDogT3B0aW9uIFwidGhlbWVcIiBoYXMgYSBrZXkgXCIke2tleX1cIiB3aG9zZSB2YWx1ZSBcIiR7dmFsdWV9XCIgaXMgdW5kZWZpbmVkIGluIGFuc2ktc3R5bGVzLmApO1xuXHRcdH1cblx0XHRyZXR1cm4gY29sb3JzO1xuXHR9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmZ1bmN0aW9uIGdldENvbG9yc0VtcHR5KCkge1xuXHRyZXR1cm4gREVGQVVMVF9USEVNRV9LRVlTLnJlZHVjZSgoY29sb3JzLCBrZXkpID0+IHtcblx0XHRjb2xvcnNba2V5XSA9IHtcblx0XHRcdGNsb3NlOiBcIlwiLFxuXHRcdFx0b3BlbjogXCJcIlxuXHRcdH07XG5cdFx0cmV0dXJuIGNvbG9ycztcblx0fSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59XG5mdW5jdGlvbiBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSB7XG5cdHJldHVybiBvcHRpb25zPy5wcmludEZ1bmN0aW9uTmFtZSA/PyBERUZBVUxUX09QVElPTlMucHJpbnRGdW5jdGlvbk5hbWU7XG59XG5mdW5jdGlvbiBnZXRFc2NhcGVSZWdleChvcHRpb25zKSB7XG5cdHJldHVybiBvcHRpb25zPy5lc2NhcGVSZWdleCA/PyBERUZBVUxUX09QVElPTlMuZXNjYXBlUmVnZXg7XG59XG5mdW5jdGlvbiBnZXRFc2NhcGVTdHJpbmcob3B0aW9ucykge1xuXHRyZXR1cm4gb3B0aW9ucz8uZXNjYXBlU3RyaW5nID8/IERFRkFVTFRfT1BUSU9OUy5lc2NhcGVTdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRDb25maWcob3B0aW9ucykge1xuXHRyZXR1cm4ge1xuXHRcdGNhbGxUb0pTT046IG9wdGlvbnM/LmNhbGxUb0pTT04gPz8gREVGQVVMVF9PUFRJT05TLmNhbGxUb0pTT04sXG5cdFx0Y29sb3JzOiBvcHRpb25zPy5oaWdobGlnaHQgPyBnZXRDb2xvcnNIaWdobGlnaHQoKSA6IGdldENvbG9yc0VtcHR5KCksXG5cdFx0Y29tcGFyZUtleXM6IHR5cGVvZiBvcHRpb25zPy5jb21wYXJlS2V5cyA9PT0gXCJmdW5jdGlvblwiIHx8IG9wdGlvbnM/LmNvbXBhcmVLZXlzID09PSBudWxsID8gb3B0aW9ucy5jb21wYXJlS2V5cyA6IERFRkFVTFRfT1BUSU9OUy5jb21wYXJlS2V5cyxcblx0XHRlc2NhcGVSZWdleDogZ2V0RXNjYXBlUmVnZXgob3B0aW9ucyksXG5cdFx0ZXNjYXBlU3RyaW5nOiBnZXRFc2NhcGVTdHJpbmcob3B0aW9ucyksXG5cdFx0aW5kZW50OiBvcHRpb25zPy5taW4gPyBcIlwiIDogY3JlYXRlSW5kZW50KG9wdGlvbnM/LmluZGVudCA/PyBERUZBVUxUX09QVElPTlMuaW5kZW50KSxcblx0XHRtYXhEZXB0aDogb3B0aW9ucz8ubWF4RGVwdGggPz8gREVGQVVMVF9PUFRJT05TLm1heERlcHRoLFxuXHRcdG1heFdpZHRoOiBvcHRpb25zPy5tYXhXaWR0aCA/PyBERUZBVUxUX09QVElPTlMubWF4V2lkdGgsXG5cdFx0bWluOiBvcHRpb25zPy5taW4gPz8gREVGQVVMVF9PUFRJT05TLm1pbixcblx0XHRwbHVnaW5zOiBvcHRpb25zPy5wbHVnaW5zID8/IERFRkFVTFRfT1BUSU9OUy5wbHVnaW5zLFxuXHRcdHByaW50QmFzaWNQcm90b3R5cGU6IG9wdGlvbnM/LnByaW50QmFzaWNQcm90b3R5cGUgPz8gdHJ1ZSxcblx0XHRwcmludEZ1bmN0aW9uTmFtZTogZ2V0UHJpbnRGdW5jdGlvbk5hbWUob3B0aW9ucyksXG5cdFx0cHJpbnRTaGFkb3dSb290OiBvcHRpb25zPy5wcmludFNoYWRvd1Jvb3QgPz8gdHJ1ZSxcblx0XHRzcGFjaW5nSW5uZXI6IG9wdGlvbnM/Lm1pbiA/IFwiIFwiIDogXCJcXG5cIixcblx0XHRzcGFjaW5nT3V0ZXI6IG9wdGlvbnM/Lm1pbiA/IFwiXCIgOiBcIlxcblwiLFxuXHRcdG1heE91dHB1dExlbmd0aDogb3B0aW9ucz8ubWF4T3V0cHV0TGVuZ3RoID8/IERFRkFVTFRfT1BUSU9OUy5tYXhPdXRwdXRMZW5ndGgsXG5cdFx0X291dHB1dExlbmd0aFBlckRlcHRoOiBbXVxuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5kZW50KGluZGVudCkge1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5kZW50ICsgMSB9KS5qb2luKFwiIFwiKTtcbn1cbi8qKlxuKiBSZXR1cm5zIGEgcHJlc2VudGF0aW9uIHN0cmluZyBvZiB5b3VyIGB2YWxgIG9iamVjdFxuKiBAcGFyYW0gdmFsIGFueSBwb3RlbnRpYWwgSmF2YVNjcmlwdCBvYmplY3RcbiogQHBhcmFtIG9wdGlvbnMgQ3VzdG9tIHNldHRpbmdzXG4qL1xuZnVuY3Rpb24gZm9ybWF0KHZhbCwgb3B0aW9ucykge1xuXHRpZiAob3B0aW9ucykge1xuXHRcdHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcblx0XHRpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG5cdFx0XHRjb25zdCBwbHVnaW4gPSBmaW5kUGx1Z2luKG9wdGlvbnMucGx1Z2lucywgdmFsKTtcblx0XHRcdGlmIChwbHVnaW4gIT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBnZXRDb25maWcob3B0aW9ucyksIFwiXCIsIDAsIFtdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUodmFsLCBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSwgZ2V0RXNjYXBlUmVnZXgob3B0aW9ucyksIGdldEVzY2FwZVN0cmluZyhvcHRpb25zKSk7XG5cdGlmIChiYXNpY1Jlc3VsdCAhPT0gbnVsbCkge1xuXHRcdHJldHVybiBiYXNpY1Jlc3VsdDtcblx0fVxuXHRyZXR1cm4gcHJpbnRDb21wbGV4VmFsdWUodmFsLCBnZXRDb25maWcob3B0aW9ucyksIFwiXCIsIDAsIFtdKTtcbn1cbmNvbnN0IHBsdWdpbnMgPSB7XG5cdEFzeW1tZXRyaWNNYXRjaGVyOiBwbHVnaW4kNSxcblx0RE9NQ29sbGVjdGlvbjogcGx1Z2luJDQsXG5cdERPTUVsZW1lbnQ6IHBsdWdpbiQzLFxuXHRJbW11dGFibGU6IHBsdWdpbiQyLFxuXHRSZWFjdEVsZW1lbnQ6IHBsdWdpbiQxLFxuXHRSZWFjdFRlc3RDb21wb25lbnQ6IHBsdWdpbixcblx0RXJyb3I6IEVycm9yUGx1Z2luXG59O1xuXG5leHBvcnQgeyBERUZBVUxUX09QVElPTlMsIGNyZWF0ZURPTUVsZW1lbnRGaWx0ZXIsIGZvcm1hdCwgcGx1Z2lucyB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBUyxpQkFBaUIsR0FBRyxHQUFHO0FBQzlCLEdBQUUsUUFB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
|