@cartanova/qgrid-cli 0.1.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
- package/bundle/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
- package/bundle/dist/_virtual/_rolldown/runtime.js +15 -0
- package/bundle/dist/application/qgrid/oauth.js +140 -0
- package/bundle/dist/application/qgrid/pool.js +100 -0
- package/bundle/dist/application/qgrid/qgrid.frame.js +280 -0
- package/bundle/dist/application/qgrid/qgrid.types.js +79 -0
- package/bundle/dist/application/qgrid/worker.js +183 -0
- package/bundle/dist/application/queries.generated.js +31 -0
- package/bundle/dist/application/request-log/request-log.model.js +113 -0
- package/bundle/dist/application/request-log/request-log.types.js +13 -0
- package/bundle/dist/application/sonamu.generated.js +99 -0
- package/bundle/dist/application/sonamu.generated.sso.js +34 -0
- package/bundle/dist/application/token/token.model.js +157 -0
- package/bundle/dist/application/token/token.types.js +22 -0
- package/bundle/dist/i18n/en.js +63 -0
- package/bundle/dist/i18n/ko.js +62 -0
- package/bundle/dist/i18n/sd.generated.js +272 -0
- package/bundle/dist/index.js +11 -0
- package/bundle/dist/migrations/20260410171405_create__request_logs.js +26 -0
- package/bundle/dist/migrations/20260410171406_create__tokens.js +24 -0
- package/bundle/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
- package/bundle/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/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/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/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/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/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/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/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/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/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/sonamu.config.js +196 -0
- package/bundle/dist/testing/fixture.js +8 -0
- package/bundle/dist/testing/global.js +9 -0
- package/bundle/dist/testing/setup-mocks.js +17 -0
- package/bundle/dist/utils/subset-loaders.js +12 -0
- package/bundle/src/application/request-log/request-log.entity.json +75 -0
- package/bundle/src/application/token/token.entity.json +37 -0
- package/bundle/src/migrations/20260410171405_create__request_logs.ts +23 -0
- package/bundle/src/migrations/20260410171406_create__tokens.ts +21 -0
- package/bundle/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
- package/bundle/web-dist/client/assets/index-DlPchHBY.js +116 -0
- package/bundle/web-dist/client/assets/index-vZsvyuFn.css +1 -0
- package/bundle/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
- package/bundle/web-dist/client/assets/routes-CagDz23B.js +1 -0
- package/bundle/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
- package/bundle/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
- package/bundle/web-dist/client/assets/show-aXUGa0gm.js +29 -0
- package/bundle/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
- package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
- package/bundle/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
- package/bundle/web-dist/client/index.html +18 -0
- package/bundle/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
- package/bundle/web-dist/server/assets/routes-ClzReRep.js +490 -0
- package/bundle/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
- package/bundle/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
- package/bundle/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
- package/bundle/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
- package/bundle/web-dist/server/entry-server.generated.js +44646 -0
- package/dist/cli.js +38 -89
- package/package.json +40 -12
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
//#region ../../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
|
|
2
|
+
let SOURCEMAPPING_URL = "sourceMa";
|
|
3
|
+
SOURCEMAPPING_URL += "ppingURL";
|
|
4
|
+
const isWindows = typeof process < "u" && process.platform === "win32";
|
|
5
|
+
/**
|
|
6
|
+
* Undo {@link wrapId}'s `/@id/` and null byte replacements.
|
|
7
|
+
*/
|
|
8
|
+
function unwrapId(id) {
|
|
9
|
+
return id.startsWith("/@id/") ? id.slice(5).replace("__x00__", "\0") : id;
|
|
10
|
+
}
|
|
11
|
+
const windowsSlashRE = /\\/g;
|
|
12
|
+
function slash(p) {
|
|
13
|
+
return p.replace(windowsSlashRE, "/");
|
|
14
|
+
}
|
|
15
|
+
const postfixRE = /[?#].*$/;
|
|
16
|
+
function cleanUrl(url) {
|
|
17
|
+
return url.replace(postfixRE, "");
|
|
18
|
+
}
|
|
19
|
+
(async function() {}).constructor;
|
|
20
|
+
const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
|
|
21
|
+
function normalizeWindowsPath(input = "") {
|
|
22
|
+
return input && input.replace(/\\/g, "/").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());
|
|
23
|
+
}
|
|
24
|
+
const _IS_ABSOLUTE_RE = /^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/, _DRIVE_LETTER_RE = /^[A-Za-z]:$/;
|
|
25
|
+
function cwd() {
|
|
26
|
+
return typeof process < "u" && typeof process.cwd == "function" ? process.cwd().replace(/\\/g, "/") : "/";
|
|
27
|
+
}
|
|
28
|
+
const resolve = function(...arguments_) {
|
|
29
|
+
arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));
|
|
30
|
+
let resolvedPath = "", resolvedAbsolute = !1;
|
|
31
|
+
for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {
|
|
32
|
+
let path = index >= 0 ? arguments_[index] : cwd();
|
|
33
|
+
!path || path.length === 0 || (resolvedPath = `${path}/${resolvedPath}`, resolvedAbsolute = isAbsolute(path));
|
|
34
|
+
}
|
|
35
|
+
return resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute), resolvedAbsolute && !isAbsolute(resolvedPath) ? `/${resolvedPath}` : resolvedPath.length > 0 ? resolvedPath : ".";
|
|
36
|
+
};
|
|
37
|
+
function normalizeString(path, allowAboveRoot) {
|
|
38
|
+
let res = "", lastSegmentLength = 0, lastSlash = -1, dots = 0, char = null;
|
|
39
|
+
for (let index = 0; index <= path.length; ++index) {
|
|
40
|
+
if (index < path.length) char = path[index];
|
|
41
|
+
else if (char === "/") break;
|
|
42
|
+
else char = "/";
|
|
43
|
+
if (char === "/") {
|
|
44
|
+
if (!(lastSlash === index - 1 || dots === 1)) if (dots === 2) {
|
|
45
|
+
if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== "." || res[res.length - 2] !== ".") {
|
|
46
|
+
if (res.length > 2) {
|
|
47
|
+
let lastSlashIndex = res.lastIndexOf("/");
|
|
48
|
+
lastSlashIndex === -1 ? (res = "", lastSegmentLength = 0) : (res = res.slice(0, lastSlashIndex), lastSegmentLength = res.length - 1 - res.lastIndexOf("/")), lastSlash = index, dots = 0;
|
|
49
|
+
continue;
|
|
50
|
+
} else if (res.length > 0) {
|
|
51
|
+
res = "", lastSegmentLength = 0, lastSlash = index, dots = 0;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
allowAboveRoot && (res += res.length > 0 ? "/.." : "..", lastSegmentLength = 2);
|
|
56
|
+
} else res.length > 0 ? res += `/${path.slice(lastSlash + 1, index)}` : res = path.slice(lastSlash + 1, index), lastSegmentLength = index - lastSlash - 1;
|
|
57
|
+
lastSlash = index, dots = 0;
|
|
58
|
+
} else char === "." && dots !== -1 ? ++dots : dots = -1;
|
|
59
|
+
}
|
|
60
|
+
return res;
|
|
61
|
+
}
|
|
62
|
+
const isAbsolute = function(p) {
|
|
63
|
+
return _IS_ABSOLUTE_RE.test(p);
|
|
64
|
+
}, dirname = function(p) {
|
|
65
|
+
let segments = normalizeWindowsPath(p).replace(/\/$/, "").split("/").slice(0, -1);
|
|
66
|
+
return segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0]) && (segments[0] += "/"), segments.join("/") || (isAbsolute(p) ? "/" : ".");
|
|
67
|
+
}, textDecoder = new TextDecoder(), decodeBase64 = typeof Buffer == "function" && typeof Buffer.from == "function" ? (base64) => Buffer.from(base64, "base64").toString("utf-8") : (base64) => textDecoder.decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
|
|
68
|
+
const posixDirname = dirname, posixResolve = resolve;
|
|
69
|
+
var comma = 44, chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", intToChar = new Uint8Array(64), charToInt = new Uint8Array(128);
|
|
70
|
+
for (let i = 0; i < chars.length; i++) {
|
|
71
|
+
let c = chars.charCodeAt(i);
|
|
72
|
+
intToChar[i] = c, charToInt[c] = i;
|
|
73
|
+
}
|
|
74
|
+
function decodeInteger(reader, relative) {
|
|
75
|
+
let value = 0, shift = 0, integer = 0;
|
|
76
|
+
do
|
|
77
|
+
integer = charToInt[reader.next()], value |= (integer & 31) << shift, shift += 5;
|
|
78
|
+
while (integer & 32);
|
|
79
|
+
let shouldNegate = value & 1;
|
|
80
|
+
return value >>>= 1, shouldNegate && (value = -2147483648 | -value), relative + value;
|
|
81
|
+
}
|
|
82
|
+
function hasMoreVlq(reader, max) {
|
|
83
|
+
return reader.pos >= max ? !1 : reader.peek() !== comma;
|
|
84
|
+
}
|
|
85
|
+
var StringReader = class {
|
|
86
|
+
constructor(buffer) {
|
|
87
|
+
this.pos = 0, this.buffer = buffer;
|
|
88
|
+
}
|
|
89
|
+
next() {
|
|
90
|
+
return this.buffer.charCodeAt(this.pos++);
|
|
91
|
+
}
|
|
92
|
+
peek() {
|
|
93
|
+
return this.buffer.charCodeAt(this.pos);
|
|
94
|
+
}
|
|
95
|
+
indexOf(char) {
|
|
96
|
+
let { buffer, pos } = this, idx = buffer.indexOf(char, pos);
|
|
97
|
+
return idx === -1 ? buffer.length : idx;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
function decode(mappings) {
|
|
101
|
+
let { length } = mappings, reader = new StringReader(mappings), decoded = [], genColumn = 0, sourcesIndex = 0, sourceLine = 0, sourceColumn = 0, namesIndex = 0;
|
|
102
|
+
do {
|
|
103
|
+
let semi = reader.indexOf(";"), line = [], sorted = !0, lastCol = 0;
|
|
104
|
+
for (genColumn = 0; reader.pos < semi;) {
|
|
105
|
+
let seg;
|
|
106
|
+
genColumn = decodeInteger(reader, genColumn), genColumn < lastCol && (sorted = !1), lastCol = genColumn, hasMoreVlq(reader, semi) ? (sourcesIndex = decodeInteger(reader, sourcesIndex), sourceLine = decodeInteger(reader, sourceLine), sourceColumn = decodeInteger(reader, sourceColumn), hasMoreVlq(reader, semi) ? (namesIndex = decodeInteger(reader, namesIndex), seg = [
|
|
107
|
+
genColumn,
|
|
108
|
+
sourcesIndex,
|
|
109
|
+
sourceLine,
|
|
110
|
+
sourceColumn,
|
|
111
|
+
namesIndex
|
|
112
|
+
]) : seg = [
|
|
113
|
+
genColumn,
|
|
114
|
+
sourcesIndex,
|
|
115
|
+
sourceLine,
|
|
116
|
+
sourceColumn
|
|
117
|
+
]) : seg = [genColumn], line.push(seg), reader.pos++;
|
|
118
|
+
}
|
|
119
|
+
sorted || sort(line), decoded.push(line), reader.pos = semi + 1;
|
|
120
|
+
} while (reader.pos <= length);
|
|
121
|
+
return decoded;
|
|
122
|
+
}
|
|
123
|
+
function sort(line) {
|
|
124
|
+
line.sort(sortComparator);
|
|
125
|
+
}
|
|
126
|
+
function sortComparator(a, b) {
|
|
127
|
+
return a[0] - b[0];
|
|
128
|
+
}
|
|
129
|
+
var COLUMN = 0, SOURCES_INDEX = 1, SOURCE_LINE = 2, SOURCE_COLUMN = 3, NAMES_INDEX = 4, found = !1;
|
|
130
|
+
function binarySearch(haystack, needle, low, high) {
|
|
131
|
+
for (; low <= high;) {
|
|
132
|
+
let mid = low + (high - low >> 1), cmp = haystack[mid][COLUMN] - needle;
|
|
133
|
+
if (cmp === 0) return found = !0, mid;
|
|
134
|
+
cmp < 0 ? low = mid + 1 : high = mid - 1;
|
|
135
|
+
}
|
|
136
|
+
return found = !1, low - 1;
|
|
137
|
+
}
|
|
138
|
+
function upperBound(haystack, needle, index) {
|
|
139
|
+
for (let i = index + 1; i < haystack.length && haystack[i][COLUMN] === needle; index = i++);
|
|
140
|
+
return index;
|
|
141
|
+
}
|
|
142
|
+
function lowerBound(haystack, needle, index) {
|
|
143
|
+
for (let i = index - 1; i >= 0 && haystack[i][COLUMN] === needle; index = i--);
|
|
144
|
+
return index;
|
|
145
|
+
}
|
|
146
|
+
function memoizedBinarySearch(haystack, needle, state, key) {
|
|
147
|
+
let { lastKey, lastNeedle, lastIndex } = state, low = 0, high = haystack.length - 1;
|
|
148
|
+
if (key === lastKey) {
|
|
149
|
+
if (needle === lastNeedle) return found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle, lastIndex;
|
|
150
|
+
needle >= lastNeedle ? low = lastIndex === -1 ? 0 : lastIndex : high = lastIndex;
|
|
151
|
+
}
|
|
152
|
+
return state.lastKey = key, state.lastNeedle = needle, state.lastIndex = binarySearch(haystack, needle, low, high);
|
|
153
|
+
}
|
|
154
|
+
var LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)", COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)";
|
|
155
|
+
function cast(map) {
|
|
156
|
+
return map;
|
|
157
|
+
}
|
|
158
|
+
function decodedMappings(map) {
|
|
159
|
+
var _a;
|
|
160
|
+
return (_a = cast(map))._decoded || (_a._decoded = decode(cast(map)._encoded));
|
|
161
|
+
}
|
|
162
|
+
function originalPositionFor(map, needle) {
|
|
163
|
+
let { line, column, bias } = needle;
|
|
164
|
+
if (line--, line < 0) throw Error(LINE_GTR_ZERO);
|
|
165
|
+
if (column < 0) throw Error(COL_GTR_EQ_ZERO);
|
|
166
|
+
let decoded = decodedMappings(map);
|
|
167
|
+
if (line >= decoded.length) return OMapping(null, null, null, null);
|
|
168
|
+
let segments = decoded[line], index = traceSegmentInternal(segments, cast(map)._decodedMemo, line, column, bias || 1);
|
|
169
|
+
if (index === -1) return OMapping(null, null, null, null);
|
|
170
|
+
let segment = segments[index];
|
|
171
|
+
if (segment.length === 1) return OMapping(null, null, null, null);
|
|
172
|
+
let { names, resolvedSources } = map;
|
|
173
|
+
return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
|
|
174
|
+
}
|
|
175
|
+
function OMapping(source, line, column, name) {
|
|
176
|
+
return {
|
|
177
|
+
source,
|
|
178
|
+
line,
|
|
179
|
+
column,
|
|
180
|
+
name
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function traceSegmentInternal(segments, memo, line, column, bias) {
|
|
184
|
+
let index = memoizedBinarySearch(segments, column, memo, line);
|
|
185
|
+
return found ? index = (bias === -1 ? upperBound : lowerBound)(segments, column, index) : bias === -1 && index++, index === -1 || index === segments.length ? -1 : index;
|
|
186
|
+
}
|
|
187
|
+
var DecodedMap = class {
|
|
188
|
+
_encoded;
|
|
189
|
+
_decoded;
|
|
190
|
+
_decodedMemo;
|
|
191
|
+
url;
|
|
192
|
+
file;
|
|
193
|
+
version;
|
|
194
|
+
names = [];
|
|
195
|
+
resolvedSources;
|
|
196
|
+
constructor(map, from) {
|
|
197
|
+
this.map = map;
|
|
198
|
+
let { mappings, names, sources } = map;
|
|
199
|
+
this.version = map.version, this.names = names || [], this._encoded = mappings || "", this._decodedMemo = memoizedState(), this.url = from, this.file = from;
|
|
200
|
+
let originDir = posixDirname(from);
|
|
201
|
+
this.resolvedSources = (sources || []).map((s) => posixResolve(originDir, s || ""));
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
function memoizedState() {
|
|
205
|
+
return {
|
|
206
|
+
lastKey: -1,
|
|
207
|
+
lastNeedle: -1,
|
|
208
|
+
lastIndex: -1
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function getOriginalPosition(map, needle) {
|
|
212
|
+
let result = originalPositionFor(map, needle);
|
|
213
|
+
return result.column == null ? null : result;
|
|
214
|
+
}
|
|
215
|
+
const MODULE_RUNNER_SOURCEMAPPING_REGEXP = RegExp(`//# ${SOURCEMAPPING_URL}=data:application/json;base64,(.+)`);
|
|
216
|
+
var EvaluatedModuleNode = class {
|
|
217
|
+
importers = /* @__PURE__ */ new Set();
|
|
218
|
+
imports = /* @__PURE__ */ new Set();
|
|
219
|
+
evaluated = !1;
|
|
220
|
+
meta;
|
|
221
|
+
promise;
|
|
222
|
+
exports;
|
|
223
|
+
file;
|
|
224
|
+
map;
|
|
225
|
+
constructor(id, url) {
|
|
226
|
+
this.id = id, this.url = url, this.file = cleanUrl(id);
|
|
227
|
+
}
|
|
228
|
+
}, EvaluatedModules = class {
|
|
229
|
+
idToModuleMap = /* @__PURE__ */ new Map();
|
|
230
|
+
fileToModulesMap = /* @__PURE__ */ new Map();
|
|
231
|
+
urlToIdModuleMap = /* @__PURE__ */ new Map();
|
|
232
|
+
/**
|
|
233
|
+
* Returns the module node by the resolved module ID. Usually, module ID is
|
|
234
|
+
* the file system path with query and/or hash. It can also be a virtual module.
|
|
235
|
+
*
|
|
236
|
+
* Module runner graph will have 1 to 1 mapping with the server module graph.
|
|
237
|
+
* @param id Resolved module ID
|
|
238
|
+
*/
|
|
239
|
+
getModuleById(id) {
|
|
240
|
+
return this.idToModuleMap.get(id);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Returns all modules related to the file system path. Different modules
|
|
244
|
+
* might have different query parameters or hash, so it's possible to have
|
|
245
|
+
* multiple modules for the same file.
|
|
246
|
+
* @param file The file system path of the module
|
|
247
|
+
*/
|
|
248
|
+
getModulesByFile(file) {
|
|
249
|
+
return this.fileToModulesMap.get(file);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Returns the module node by the URL that was used in the import statement.
|
|
253
|
+
* Unlike module graph on the server, the URL is not resolved and is used as is.
|
|
254
|
+
* @param url Server URL that was used in the import statement
|
|
255
|
+
*/
|
|
256
|
+
getModuleByUrl(url) {
|
|
257
|
+
return this.urlToIdModuleMap.get(unwrapId(url));
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Ensure that module is in the graph. If the module is already in the graph,
|
|
261
|
+
* it will return the existing module node. Otherwise, it will create a new
|
|
262
|
+
* module node and add it to the graph.
|
|
263
|
+
* @param id Resolved module ID
|
|
264
|
+
* @param url URL that was used in the import statement
|
|
265
|
+
*/
|
|
266
|
+
ensureModule(id, url) {
|
|
267
|
+
if (id = normalizeModuleId(id), this.idToModuleMap.has(id)) {
|
|
268
|
+
let moduleNode = this.idToModuleMap.get(id);
|
|
269
|
+
return this.urlToIdModuleMap.set(url, moduleNode), moduleNode;
|
|
270
|
+
}
|
|
271
|
+
let moduleNode = new EvaluatedModuleNode(id, url);
|
|
272
|
+
this.idToModuleMap.set(id, moduleNode), this.urlToIdModuleMap.set(url, moduleNode);
|
|
273
|
+
let fileModules = this.fileToModulesMap.get(moduleNode.file) || /* @__PURE__ */ new Set();
|
|
274
|
+
return fileModules.add(moduleNode), this.fileToModulesMap.set(moduleNode.file, fileModules), moduleNode;
|
|
275
|
+
}
|
|
276
|
+
invalidateModule(node) {
|
|
277
|
+
node.evaluated = !1, node.meta = void 0, node.map = void 0, node.promise = void 0, node.exports = void 0, node.imports.clear();
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Extracts the inlined source map from the module code and returns the decoded
|
|
281
|
+
* source map. If the source map is not inlined, it will return null.
|
|
282
|
+
* @param id Resolved module ID
|
|
283
|
+
*/
|
|
284
|
+
getModuleSourceMapById(id) {
|
|
285
|
+
let mod = this.getModuleById(id);
|
|
286
|
+
if (!mod) return null;
|
|
287
|
+
if (mod.map) return mod.map;
|
|
288
|
+
if (!mod.meta || !("code" in mod.meta)) return null;
|
|
289
|
+
let pattern = `//# ${SOURCEMAPPING_URL}=data:application/json;base64,`, lastIndex = mod.meta.code.lastIndexOf(pattern);
|
|
290
|
+
if (lastIndex === -1) return null;
|
|
291
|
+
let mapString = MODULE_RUNNER_SOURCEMAPPING_REGEXP.exec(mod.meta.code.slice(lastIndex))?.[1];
|
|
292
|
+
return mapString ? (mod.map = new DecodedMap(JSON.parse(decodeBase64(mapString)), mod.file), mod.map) : null;
|
|
293
|
+
}
|
|
294
|
+
clear() {
|
|
295
|
+
this.idToModuleMap.clear(), this.fileToModulesMap.clear(), this.urlToIdModuleMap.clear();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
const prefixedBuiltins = new Set([
|
|
299
|
+
"node:sea",
|
|
300
|
+
"node:sqlite",
|
|
301
|
+
"node:test",
|
|
302
|
+
"node:test/reporters"
|
|
303
|
+
]);
|
|
304
|
+
function normalizeModuleId(file) {
|
|
305
|
+
return prefixedBuiltins.has(file) ? file : slash(file).replace(/^\/@fs\//, isWindows ? "" : "/").replace(/^node:/, "").replace(/^\/+/, "/").replace(/^file:\/+/, isWindows ? "" : "/");
|
|
306
|
+
}
|
|
307
|
+
function getModulesEntrypoints(runner, modules, visited = /* @__PURE__ */ new Set(), entrypoints = /* @__PURE__ */ new Set()) {
|
|
308
|
+
for (let moduleId of modules) {
|
|
309
|
+
if (visited.has(moduleId)) continue;
|
|
310
|
+
visited.add(moduleId);
|
|
311
|
+
let module = runner.evaluatedModules.getModuleById(moduleId);
|
|
312
|
+
if (module) {
|
|
313
|
+
if (!module.importers.size) {
|
|
314
|
+
entrypoints.add(module.url);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
for (let importer of module.importers) getModulesEntrypoints(runner, [importer], visited, entrypoints);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return entrypoints;
|
|
321
|
+
}
|
|
322
|
+
const sourceMapCache = {}, fileContentsCache = {}, evaluatedModulesCache = /* @__PURE__ */ new Set(), retrieveFileHandlers = /* @__PURE__ */ new Set(), retrieveSourceMapHandlers = /* @__PURE__ */ new Set(), createExecHandlers = (handlers) => ((...args) => {
|
|
323
|
+
for (let handler of handlers) {
|
|
324
|
+
let result = handler(...args);
|
|
325
|
+
if (result) return result;
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
}), retrieveFileFromHandlers = createExecHandlers(retrieveFileHandlers), retrieveSourceMapFromHandlers = createExecHandlers(retrieveSourceMapHandlers);
|
|
329
|
+
Error.prepareStackTrace;
|
|
330
|
+
function supportRelativeURL(file, url) {
|
|
331
|
+
if (!file) return url;
|
|
332
|
+
let dir = posixDirname(slash(file)), match = /^\w+:\/\/[^/]*/.exec(dir), protocol = match ? match[0] : "", startPath = dir.slice(protocol.length);
|
|
333
|
+
return protocol && /^\/\w:/.test(startPath) ? (protocol += "/", protocol + slash(posixResolve(startPath, url))) : protocol + posixResolve(startPath, url);
|
|
334
|
+
}
|
|
335
|
+
function getRunnerSourceMap(position) {
|
|
336
|
+
for (let moduleGraph of evaluatedModulesCache) {
|
|
337
|
+
let sourceMap = moduleGraph.getModuleSourceMapById(position.source);
|
|
338
|
+
if (sourceMap) return {
|
|
339
|
+
url: position.source,
|
|
340
|
+
map: sourceMap,
|
|
341
|
+
vite: !0
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
function retrieveFile(path) {
|
|
347
|
+
if (path in fileContentsCache) return fileContentsCache[path];
|
|
348
|
+
let content = retrieveFileFromHandlers(path);
|
|
349
|
+
return typeof content == "string" ? (fileContentsCache[path] = content, content) : null;
|
|
350
|
+
}
|
|
351
|
+
function retrieveSourceMapURL(source) {
|
|
352
|
+
let fileData = retrieveFile(source);
|
|
353
|
+
if (!fileData) return null;
|
|
354
|
+
let re = /\/\/[@#]\s*sourceMappingURL=([^\s'"]+)\s*$|\/\*[@#]\s*sourceMappingURL=[^\s*'"]+\s*\*\/\s*$/gm, lastMatch, match;
|
|
355
|
+
for (; match = re.exec(fileData);) lastMatch = match;
|
|
356
|
+
return lastMatch ? lastMatch[1] : null;
|
|
357
|
+
}
|
|
358
|
+
const reSourceMap = /^data:application\/json[^,]+base64,/;
|
|
359
|
+
function retrieveSourceMap(source) {
|
|
360
|
+
let urlAndMap = retrieveSourceMapFromHandlers(source);
|
|
361
|
+
if (urlAndMap) return urlAndMap;
|
|
362
|
+
let sourceMappingURL = retrieveSourceMapURL(source);
|
|
363
|
+
if (!sourceMappingURL) return null;
|
|
364
|
+
let sourceMapData;
|
|
365
|
+
if (reSourceMap.test(sourceMappingURL)) {
|
|
366
|
+
let rawData = sourceMappingURL.slice(sourceMappingURL.indexOf(",") + 1);
|
|
367
|
+
sourceMapData = Buffer.from(rawData, "base64").toString(), sourceMappingURL = source;
|
|
368
|
+
} else sourceMappingURL = supportRelativeURL(source, sourceMappingURL), sourceMapData = retrieveFile(sourceMappingURL);
|
|
369
|
+
return sourceMapData ? {
|
|
370
|
+
url: sourceMappingURL,
|
|
371
|
+
map: sourceMapData
|
|
372
|
+
} : null;
|
|
373
|
+
}
|
|
374
|
+
function mapSourcePosition(position) {
|
|
375
|
+
if (!position.source) return position;
|
|
376
|
+
let sourceMap = getRunnerSourceMap(position);
|
|
377
|
+
if (sourceMap ||= sourceMapCache[position.source], !sourceMap) {
|
|
378
|
+
let urlAndMap = retrieveSourceMap(position.source);
|
|
379
|
+
if (urlAndMap && urlAndMap.map) {
|
|
380
|
+
let url = urlAndMap.url;
|
|
381
|
+
sourceMap = sourceMapCache[position.source] = {
|
|
382
|
+
url,
|
|
383
|
+
map: new DecodedMap(typeof urlAndMap.map == "string" ? JSON.parse(urlAndMap.map) : urlAndMap.map, url)
|
|
384
|
+
};
|
|
385
|
+
let contents = sourceMap.map?.map.sourcesContent;
|
|
386
|
+
sourceMap.map && contents && sourceMap.map.resolvedSources.forEach((source, i) => {
|
|
387
|
+
let content = contents[i];
|
|
388
|
+
if (content && source && url) {
|
|
389
|
+
let contentUrl = supportRelativeURL(url, source);
|
|
390
|
+
fileContentsCache[contentUrl] = content;
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
} else sourceMap = sourceMapCache[position.source] = {
|
|
394
|
+
url: null,
|
|
395
|
+
map: null
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
if (sourceMap.map && sourceMap.url) {
|
|
399
|
+
let originalPosition = getOriginalPosition(sourceMap.map, position);
|
|
400
|
+
if (originalPosition && originalPosition.source != null) return originalPosition.source = supportRelativeURL(sourceMap.url, originalPosition.source), sourceMap.vite && (originalPosition._vite = !0), originalPosition;
|
|
401
|
+
}
|
|
402
|
+
return position;
|
|
403
|
+
}
|
|
404
|
+
function mapEvalOrigin(origin) {
|
|
405
|
+
let match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
|
|
406
|
+
if (match) {
|
|
407
|
+
let position = mapSourcePosition({
|
|
408
|
+
name: null,
|
|
409
|
+
source: match[2],
|
|
410
|
+
line: +match[3],
|
|
411
|
+
column: match[4] - 1
|
|
412
|
+
});
|
|
413
|
+
return `eval at ${match[1]} (${position.source}:${position.line}:${position.column + 1})`;
|
|
414
|
+
}
|
|
415
|
+
return match = /^eval at ([^(]+) \((.+)\)$/.exec(origin), match ? `eval at ${match[1]} (${mapEvalOrigin(match[2])})` : origin;
|
|
416
|
+
}
|
|
417
|
+
const customizationHookNamespace = "vite-module-runner:import-meta-resolve/v1/";
|
|
418
|
+
`${JSON.stringify(customizationHookNamespace)}${JSON.stringify(customizationHookNamespace)}`;
|
|
419
|
+
`${customizationHookNamespace}`;
|
|
420
|
+
new Proxy({}, { get(_, p) {
|
|
421
|
+
throw Error(`[module runner] Dynamic access of "import.meta.env" is not supported. Please, use "import.meta.env.${String(p)}" instead.`);
|
|
422
|
+
} });
|
|
423
|
+
//#endregion
|
|
424
|
+
export { EvaluatedModules };
|
|
425
|
+
|
|
426
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXJ1bm5lci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdml0ZUA4LjAuM19AZW1uYXBpK2NvcmVAMS45LjJfQGVtbmFwaStydW50aW1lQDEuOS4yX0B0eXBlcytub2RlQDI1LjAuN19lc2J1aWxkQDAuMjcuNF9qaXRpQDIuNi4xX3Nhc3NAMS45OC4wX3RzeEA0LjIxLjAvbm9kZV9tb2R1bGVzL3ZpdGUvZGlzdC9ub2RlL21vZHVsZS1ydW5uZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsibGV0IFNPVVJDRU1BUFBJTkdfVVJMID0gXCJzb3VyY2VNYVwiO1xuU09VUkNFTUFQUElOR19VUkwgKz0gXCJwcGluZ1VSTFwiO1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC91dGlscy50c1xuY29uc3QgaXNXaW5kb3dzID0gdHlwZW9mIHByb2Nlc3MgPCBcInVcIiAmJiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCI7XG4vKipcbiogVW5kbyB7QGxpbmsgd3JhcElkfSdzIGAvQGlkL2AgYW5kIG51bGwgYnl0ZSByZXBsYWNlbWVudHMuXG4qL1xuZnVuY3Rpb24gdW53cmFwSWQoaWQpIHtcblx0cmV0dXJuIGlkLnN0YXJ0c1dpdGgoXCIvQGlkL1wiKSA/IGlkLnNsaWNlKDUpLnJlcGxhY2UoXCJfX3gwMF9fXCIsIFwiXFwwXCIpIDogaWQ7XG59XG5jb25zdCB3aW5kb3dzU2xhc2hSRSA9IC9cXFxcL2c7XG5mdW5jdGlvbiBzbGFzaChwKSB7XG5cdHJldHVybiBwLnJlcGxhY2Uod2luZG93c1NsYXNoUkUsIFwiL1wiKTtcbn1cbmNvbnN0IHBvc3RmaXhSRSA9IC9bPyNdLiokLztcbmZ1bmN0aW9uIGNsZWFuVXJsKHVybCkge1xuXHRyZXR1cm4gdXJsLnJlcGxhY2UocG9zdGZpeFJFLCBcIlwiKTtcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG5cdHJldHVybiAhdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9IFwiZnVuY3Rpb25cIjtcbn1cbmNvbnN0IEFzeW5jRnVuY3Rpb24gPSBhc3luYyBmdW5jdGlvbigpIHt9LmNvbnN0cnVjdG9yO1xubGV0IGFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvblBhZGRpbmdMaW5lQ291bnQ7XG5mdW5jdGlvbiBnZXRBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50KCkge1xuXHRpZiAoYXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uUGFkZGluZ0xpbmVDb3VudCA9PT0gdm9pZCAwKSB7XG5cdFx0bGV0IGJvZHkgPSBcIi8qY29kZSovXCIsIHNvdXJjZSA9IG5ldyBBc3luY0Z1bmN0aW9uKFwiYVwiLCBcImJcIiwgYm9keSkudG9TdHJpbmcoKTtcblx0XHRhc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50ID0gc291cmNlLnNsaWNlKDAsIHNvdXJjZS5pbmRleE9mKGJvZHkpKS5zcGxpdChcIlxcblwiKS5sZW5ndGggLSAxO1xuXHR9XG5cdHJldHVybiBhc3luY0Z1bmN0aW9uRGVjbGFyYXRpb25QYWRkaW5nTGluZUNvdW50O1xufVxuZnVuY3Rpb24gcHJvbWlzZVdpdGhSZXNvbHZlcnMoKSB7XG5cdGxldCByZXNvbHZlLCByZWplY3Q7XG5cdHJldHVybiB7XG5cdFx0cHJvbWlzZTogbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlID0gX3Jlc29sdmUsIHJlamVjdCA9IF9yZWplY3Q7XG5cdFx0fSksXG5cdFx0cmVzb2x2ZSxcblx0XHRyZWplY3Rcblx0fTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wYXRoZUAyLjAuMy9ub2RlX21vZHVsZXMvcGF0aGUvZGlzdC9zaGFyZWQvcGF0aGUuTS1lVGh0TloubWpzXG5jb25zdCBfRFJJVkVfTEVUVEVSX1NUQVJUX1JFID0gL15bQS1aYS16XTpcXC8vO1xuZnVuY3Rpb24gbm9ybWFsaXplV2luZG93c1BhdGgoaW5wdXQgPSBcIlwiKSB7XG5cdHJldHVybiBpbnB1dCAmJiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKF9EUklWRV9MRVRURVJfU1RBUlRfUkUsIChyKSA9PiByLnRvVXBwZXJDYXNlKCkpO1xufVxuY29uc3QgX0lTX0FCU09MVVRFX1JFID0gL15bL1xcXFxdKD8hWy9cXFxcXSl8XlsvXFxcXF17Mn0oPyFcXC4pfF5bQS1aYS16XTpbL1xcXFxdLywgX0RSSVZFX0xFVFRFUl9SRSA9IC9eW0EtWmEtel06JC87XG5mdW5jdGlvbiBjd2QoKSB7XG5cdHJldHVybiB0eXBlb2YgcHJvY2VzcyA8IFwidVwiICYmIHR5cGVvZiBwcm9jZXNzLmN3ZCA9PSBcImZ1bmN0aW9uXCIgPyBwcm9jZXNzLmN3ZCgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpIDogXCIvXCI7XG59XG5jb25zdCByZXNvbHZlID0gZnVuY3Rpb24oLi4uYXJndW1lbnRzXykge1xuXHRhcmd1bWVudHNfID0gYXJndW1lbnRzXy5tYXAoKGFyZ3VtZW50KSA9PiBub3JtYWxpemVXaW5kb3dzUGF0aChhcmd1bWVudCkpO1xuXHRsZXQgcmVzb2x2ZWRQYXRoID0gXCJcIiwgcmVzb2x2ZWRBYnNvbHV0ZSA9ICExO1xuXHRmb3IgKGxldCBpbmRleCA9IGFyZ3VtZW50c18ubGVuZ3RoIC0gMTsgaW5kZXggPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGluZGV4LS0pIHtcblx0XHRsZXQgcGF0aCA9IGluZGV4ID49IDAgPyBhcmd1bWVudHNfW2luZGV4XSA6IGN3ZCgpO1xuXHRcdCFwYXRoIHx8IHBhdGgubGVuZ3RoID09PSAwIHx8IChyZXNvbHZlZFBhdGggPSBgJHtwYXRofS8ke3Jlc29sdmVkUGF0aH1gLCByZXNvbHZlZEFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKSk7XG5cdH1cblx0cmV0dXJuIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZVN0cmluZyhyZXNvbHZlZFBhdGgsICFyZXNvbHZlZEFic29sdXRlKSwgcmVzb2x2ZWRBYnNvbHV0ZSAmJiAhaXNBYnNvbHV0ZShyZXNvbHZlZFBhdGgpID8gYC8ke3Jlc29sdmVkUGF0aH1gIDogcmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDAgPyByZXNvbHZlZFBhdGggOiBcIi5cIjtcbn07XG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcblx0bGV0IHJlcyA9IFwiXCIsIGxhc3RTZWdtZW50TGVuZ3RoID0gMCwgbGFzdFNsYXNoID0gLTEsIGRvdHMgPSAwLCBjaGFyID0gbnVsbDtcblx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8PSBwYXRoLmxlbmd0aDsgKytpbmRleCkge1xuXHRcdGlmIChpbmRleCA8IHBhdGgubGVuZ3RoKSBjaGFyID0gcGF0aFtpbmRleF07XG5cdFx0ZWxzZSBpZiAoY2hhciA9PT0gXCIvXCIpIGJyZWFrO1xuXHRcdGVsc2UgY2hhciA9IFwiL1wiO1xuXHRcdGlmIChjaGFyID09PSBcIi9cIikge1xuXHRcdFx0aWYgKCEobGFzdFNsYXNoID09PSBpbmRleCAtIDEgfHwgZG90cyA9PT0gMSkpIGlmIChkb3RzID09PSAyKSB7XG5cdFx0XHRcdGlmIChyZXMubGVuZ3RoIDwgMiB8fCBsYXN0U2VnbWVudExlbmd0aCAhPT0gMiB8fCByZXNbcmVzLmxlbmd0aCAtIDFdICE9PSBcIi5cIiB8fCByZXNbcmVzLmxlbmd0aCAtIDJdICE9PSBcIi5cIikge1xuXHRcdFx0XHRcdGlmIChyZXMubGVuZ3RoID4gMikge1xuXHRcdFx0XHRcdFx0bGV0IGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdFx0XHRcdGxhc3RTbGFzaEluZGV4ID09PSAtMSA/IChyZXMgPSBcIlwiLCBsYXN0U2VnbWVudExlbmd0aCA9IDApIDogKHJlcyA9IHJlcy5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCksIGxhc3RTZWdtZW50TGVuZ3RoID0gcmVzLmxlbmd0aCAtIDEgLSByZXMubGFzdEluZGV4T2YoXCIvXCIpKSwgbGFzdFNsYXNoID0gaW5kZXgsIGRvdHMgPSAwO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChyZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0cmVzID0gXCJcIiwgbGFzdFNlZ21lbnRMZW5ndGggPSAwLCBsYXN0U2xhc2ggPSBpbmRleCwgZG90cyA9IDA7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YWxsb3dBYm92ZVJvb3QgJiYgKHJlcyArPSByZXMubGVuZ3RoID4gMCA/IFwiLy4uXCIgOiBcIi4uXCIsIGxhc3RTZWdtZW50TGVuZ3RoID0gMik7XG5cdFx0XHR9IGVsc2UgcmVzLmxlbmd0aCA+IDAgPyByZXMgKz0gYC8ke3BhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgpfWAgOiByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGluZGV4KSwgbGFzdFNlZ21lbnRMZW5ndGggPSBpbmRleCAtIGxhc3RTbGFzaCAtIDE7XG5cdFx0XHRsYXN0U2xhc2ggPSBpbmRleCwgZG90cyA9IDA7XG5cdFx0fSBlbHNlIGNoYXIgPT09IFwiLlwiICYmIGRvdHMgIT09IC0xID8gKytkb3RzIDogZG90cyA9IC0xO1xuXHR9XG5cdHJldHVybiByZXM7XG59XG5jb25zdCBpc0Fic29sdXRlID0gZnVuY3Rpb24ocCkge1xuXHRyZXR1cm4gX0lTX0FCU09MVVRFX1JFLnRlc3QocCk7XG59LCBkaXJuYW1lID0gZnVuY3Rpb24ocCkge1xuXHRsZXQgc2VnbWVudHMgPSBub3JtYWxpemVXaW5kb3dzUGF0aChwKS5yZXBsYWNlKC9cXC8kLywgXCJcIikuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIC0xKTtcblx0cmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA9PT0gMSAmJiBfRFJJVkVfTEVUVEVSX1JFLnRlc3Qoc2VnbWVudHNbMF0pICYmIChzZWdtZW50c1swXSArPSBcIi9cIiksIHNlZ21lbnRzLmpvaW4oXCIvXCIpIHx8IChpc0Fic29sdXRlKHApID8gXCIvXCIgOiBcIi5cIik7XG59LCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpLCBkZWNvZGVCYXNlNjQgPSB0eXBlb2YgQnVmZmVyID09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgQnVmZmVyLmZyb20gPT0gXCJmdW5jdGlvblwiID8gKGJhc2U2NCkgPT4gQnVmZmVyLmZyb20oYmFzZTY0LCBcImJhc2U2NFwiKS50b1N0cmluZyhcInV0Zi04XCIpIDogKGJhc2U2NCkgPT4gdGV4dERlY29kZXIuZGVjb2RlKFVpbnQ4QXJyYXkuZnJvbShhdG9iKGJhc2U2NCksIChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpKSwgcGVyY2VudFJlZ0V4ID0gLyUvZywgYmFja3NsYXNoUmVnRXggPSAvXFxcXC9nLCBuZXdsaW5lUmVnRXggPSAvXFxuL2csIGNhcnJpYWdlUmV0dXJuUmVnRXggPSAvXFxyL2csIHRhYlJlZ0V4ID0gL1xcdC9nLCBxdWVzdGlvblJlZ2V4ID0gL1xcPy9nLCBoYXNoUmVnZXggPSAvIy9nO1xuZnVuY3Rpb24gZW5jb2RlUGF0aENoYXJzKGZpbGVwYXRoKSB7XG5cdHJldHVybiBmaWxlcGF0aC5pbmRleE9mKFwiJVwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShwZXJjZW50UmVnRXgsIFwiJTI1XCIpKSwgIWlzV2luZG93cyAmJiBmaWxlcGF0aC5pbmRleE9mKFwiXFxcXFwiKSAhPT0gLTEgJiYgKGZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZShiYWNrc2xhc2hSZWdFeCwgXCIlNUNcIikpLCBmaWxlcGF0aC5pbmRleE9mKFwiXFxuXCIpICE9PSAtMSAmJiAoZmlsZXBhdGggPSBmaWxlcGF0aC5yZXBsYWNlKG5ld2xpbmVSZWdFeCwgXCIlMEFcIikpLCBmaWxlcGF0aC5pbmRleE9mKFwiXFxyXCIpICE9PSAtMSAmJiAoZmlsZXBhdGggPSBmaWxlcGF0aC5yZXBsYWNlKGNhcnJpYWdlUmV0dXJuUmVnRXgsIFwiJTBEXCIpKSwgZmlsZXBhdGguaW5kZXhPZihcIlx0XCIpICE9PSAtMSAmJiAoZmlsZXBhdGggPSBmaWxlcGF0aC5yZXBsYWNlKHRhYlJlZ0V4LCBcIiUwOVwiKSksIGZpbGVwYXRoO1xufVxuY29uc3QgcG9zaXhEaXJuYW1lID0gZGlybmFtZSwgcG9zaXhSZXNvbHZlID0gcmVzb2x2ZTtcbmZ1bmN0aW9uIHBvc2l4UGF0aFRvRmlsZUhyZWYocG9zaXhQYXRoKSB7XG5cdGxldCByZXNvbHZlZCA9IHBvc2l4UmVzb2x2ZShwb3NpeFBhdGgpLCBmaWxlUGF0aExhc3QgPSBwb3NpeFBhdGguY2hhckNvZGVBdChwb3NpeFBhdGgubGVuZ3RoIC0gMSk7XG5cdHJldHVybiAoZmlsZVBhdGhMYXN0ID09PSA0NyB8fCBpc1dpbmRvd3MgJiYgZmlsZVBhdGhMYXN0ID09PSA5MikgJiYgcmVzb2x2ZWRbcmVzb2x2ZWQubGVuZ3RoIC0gMV0gIT09IFwiL1wiICYmIChyZXNvbHZlZCArPSBcIi9cIiksIHJlc29sdmVkID0gZW5jb2RlUGF0aENoYXJzKHJlc29sdmVkKSwgcmVzb2x2ZWQuaW5kZXhPZihcIj9cIikgIT09IC0xICYmIChyZXNvbHZlZCA9IHJlc29sdmVkLnJlcGxhY2UocXVlc3Rpb25SZWdleCwgXCIlM0ZcIikpLCByZXNvbHZlZC5pbmRleE9mKFwiI1wiKSAhPT0gLTEgJiYgKHJlc29sdmVkID0gcmVzb2x2ZWQucmVwbGFjZShoYXNoUmVnZXgsIFwiJTIzXCIpKSwgbmV3IFVSTChgZmlsZTovLyR7cmVzb2x2ZWR9YCkuaHJlZjtcbn1cbmZ1bmN0aW9uIHRvV2luZG93c1BhdGgocGF0aCkge1xuXHRyZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC8vZywgXCJcXFxcXCIpO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BqcmlkZ2V3ZWxsK3NvdXJjZW1hcC1jb2RlY0AxLjUuNS9ub2RlX21vZHVsZXMvQGpyaWRnZXdlbGwvc291cmNlbWFwLWNvZGVjL2Rpc3Qvc291cmNlbWFwLWNvZGVjLm1qc1xudmFyIGNvbW1hID0gNDQsIGNoYXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIsIGludFRvQ2hhciA9IG5ldyBVaW50OEFycmF5KDY0KSwgY2hhclRvSW50ID0gbmV3IFVpbnQ4QXJyYXkoMTI4KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHtcblx0bGV0IGMgPSBjaGFycy5jaGFyQ29kZUF0KGkpO1xuXHRpbnRUb0NoYXJbaV0gPSBjLCBjaGFyVG9JbnRbY10gPSBpO1xufVxuZnVuY3Rpb24gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHJlbGF0aXZlKSB7XG5cdGxldCB2YWx1ZSA9IDAsIHNoaWZ0ID0gMCwgaW50ZWdlciA9IDA7XG5cdGRvXG5cdFx0aW50ZWdlciA9IGNoYXJUb0ludFtyZWFkZXIubmV4dCgpXSwgdmFsdWUgfD0gKGludGVnZXIgJiAzMSkgPDwgc2hpZnQsIHNoaWZ0ICs9IDU7XG5cdHdoaWxlIChpbnRlZ2VyICYgMzIpO1xuXHRsZXQgc2hvdWxkTmVnYXRlID0gdmFsdWUgJiAxO1xuXHRyZXR1cm4gdmFsdWUgPj4+PSAxLCBzaG91bGROZWdhdGUgJiYgKHZhbHVlID0gLTIxNDc0ODM2NDggfCAtdmFsdWUpLCByZWxhdGl2ZSArIHZhbHVlO1xufVxuZnVuY3Rpb24gaGFzTW9yZVZscShyZWFkZXIsIG1heCkge1xuXHRyZXR1cm4gcmVhZGVyLnBvcyA+PSBtYXggPyAhMSA6IHJlYWRlci5wZWVrKCkgIT09IGNvbW1hO1xufVxudmFyIFN0cmluZ1JlYWRlciA9IGNsYXNzIHtcblx0Y29uc3RydWN0b3IoYnVmZmVyKSB7XG5cdFx0dGhpcy5wb3MgPSAwLCB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcblx0fVxuXHRuZXh0KCkge1xuXHRcdHJldHVybiB0aGlzLmJ1ZmZlci5jaGFyQ29kZUF0KHRoaXMucG9zKyspO1xuXHR9XG5cdHBlZWsoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYnVmZmVyLmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuXHR9XG5cdGluZGV4T2YoY2hhcikge1xuXHRcdGxldCB7IGJ1ZmZlciwgcG9zIH0gPSB0aGlzLCBpZHggPSBidWZmZXIuaW5kZXhPZihjaGFyLCBwb3MpO1xuXHRcdHJldHVybiBpZHggPT09IC0xID8gYnVmZmVyLmxlbmd0aCA6IGlkeDtcblx0fVxufTtcbmZ1bmN0aW9uIGRlY29kZShtYXBwaW5ncykge1xuXHRsZXQgeyBsZW5ndGggfSA9IG1hcHBpbmdzLCByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKG1hcHBpbmdzKSwgZGVjb2RlZCA9IFtdLCBnZW5Db2x1bW4gPSAwLCBzb3VyY2VzSW5kZXggPSAwLCBzb3VyY2VMaW5lID0gMCwgc291cmNlQ29sdW1uID0gMCwgbmFtZXNJbmRleCA9IDA7XG5cdGRvIHtcblx0XHRsZXQgc2VtaSA9IHJlYWRlci5pbmRleE9mKFwiO1wiKSwgbGluZSA9IFtdLCBzb3J0ZWQgPSAhMCwgbGFzdENvbCA9IDA7XG5cdFx0Zm9yIChnZW5Db2x1bW4gPSAwOyByZWFkZXIucG9zIDwgc2VtaTspIHtcblx0XHRcdGxldCBzZWc7XG5cdFx0XHRnZW5Db2x1bW4gPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgZ2VuQ29sdW1uKSwgZ2VuQ29sdW1uIDwgbGFzdENvbCAmJiAoc29ydGVkID0gITEpLCBsYXN0Q29sID0gZ2VuQ29sdW1uLCBoYXNNb3JlVmxxKHJlYWRlciwgc2VtaSkgPyAoc291cmNlc0luZGV4ID0gZGVjb2RlSW50ZWdlcihyZWFkZXIsIHNvdXJjZXNJbmRleCksIHNvdXJjZUxpbmUgPSBkZWNvZGVJbnRlZ2VyKHJlYWRlciwgc291cmNlTGluZSksIHNvdXJjZUNvbHVtbiA9IGRlY29kZUludGVnZXIocmVhZGVyLCBzb3VyY2VDb2x1bW4pLCBoYXNNb3JlVmxxKHJlYWRlciwgc2VtaSkgPyAobmFtZXNJbmRleCA9IGRlY29kZUludGVnZXIocmVhZGVyLCBuYW1lc0luZGV4KSwgc2VnID0gW1xuXHRcdFx0XHRnZW5Db2x1bW4sXG5cdFx0XHRcdHNvdXJjZXNJbmRleCxcblx0XHRcdFx0c291cmNlTGluZSxcblx0XHRcdFx0c291cmNlQ29sdW1uLFxuXHRcdFx0XHRuYW1lc0luZGV4XG5cdFx0XHRdKSA6IHNlZyA9IFtcblx0XHRcdFx0Z2VuQ29sdW1uLFxuXHRcdFx0XHRzb3VyY2VzSW5kZXgsXG5cdFx0XHRcdHNvdXJjZUxpbmUsXG5cdFx0XHRcdHNvdXJjZUNvbHVtblxuXHRcdFx0XSkgOiBzZWcgPSBbZ2VuQ29sdW1uXSwgbGluZS5wdXNoKHNlZyksIHJlYWRlci5wb3MrKztcblx0XHR9XG5cdFx0c29ydGVkIHx8IHNvcnQobGluZSksIGRlY29kZWQucHVzaChsaW5lKSwgcmVhZGVyLnBvcyA9IHNlbWkgKyAxO1xuXHR9IHdoaWxlIChyZWFkZXIucG9zIDw9IGxlbmd0aCk7XG5cdHJldHVybiBkZWNvZGVkO1xufVxuZnVuY3Rpb24gc29ydChsaW5lKSB7XG5cdGxpbmUuc29ydChzb3J0Q29tcGFyYXRvcik7XG59XG5mdW5jdGlvbiBzb3J0Q29tcGFyYXRvcihhLCBiKSB7XG5cdHJldHVybiBhWzBdIC0gYlswXTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AanJpZGdld2VsbCt0cmFjZS1tYXBwaW5nQDAuMy4zMS9ub2RlX21vZHVsZXMvQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZy9kaXN0L3RyYWNlLW1hcHBpbmcubWpzXG52YXIgQ09MVU1OID0gMCwgU09VUkNFU19JTkRFWCA9IDEsIFNPVVJDRV9MSU5FID0gMiwgU09VUkNFX0NPTFVNTiA9IDMsIE5BTUVTX0lOREVYID0gNCwgZm91bmQgPSAhMTtcbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaChoYXlzdGFjaywgbmVlZGxlLCBsb3csIGhpZ2gpIHtcblx0Zm9yICg7IGxvdyA8PSBoaWdoOykge1xuXHRcdGxldCBtaWQgPSBsb3cgKyAoaGlnaCAtIGxvdyA+PiAxKSwgY21wID0gaGF5c3RhY2tbbWlkXVtDT0xVTU5dIC0gbmVlZGxlO1xuXHRcdGlmIChjbXAgPT09IDApIHJldHVybiBmb3VuZCA9ICEwLCBtaWQ7XG5cdFx0Y21wIDwgMCA/IGxvdyA9IG1pZCArIDEgOiBoaWdoID0gbWlkIC0gMTtcblx0fVxuXHRyZXR1cm4gZm91bmQgPSAhMSwgbG93IC0gMTtcbn1cbmZ1bmN0aW9uIHVwcGVyQm91bmQoaGF5c3RhY2ssIG5lZWRsZSwgaW5kZXgpIHtcblx0Zm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IGhheXN0YWNrLmxlbmd0aCAmJiBoYXlzdGFja1tpXVtDT0xVTU5dID09PSBuZWVkbGU7IGluZGV4ID0gaSsrKTtcblx0cmV0dXJuIGluZGV4O1xufVxuZnVuY3Rpb24gbG93ZXJCb3VuZChoYXlzdGFjaywgbmVlZGxlLCBpbmRleCkge1xuXHRmb3IgKGxldCBpID0gaW5kZXggLSAxOyBpID49IDAgJiYgaGF5c3RhY2tbaV1bQ09MVU1OXSA9PT0gbmVlZGxlOyBpbmRleCA9IGktLSk7XG5cdHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIG1lbW9pemVkQmluYXJ5U2VhcmNoKGhheXN0YWNrLCBuZWVkbGUsIHN0YXRlLCBrZXkpIHtcblx0bGV0IHsgbGFzdEtleSwgbGFzdE5lZWRsZSwgbGFzdEluZGV4IH0gPSBzdGF0ZSwgbG93ID0gMCwgaGlnaCA9IGhheXN0YWNrLmxlbmd0aCAtIDE7XG5cdGlmIChrZXkgPT09IGxhc3RLZXkpIHtcblx0XHRpZiAobmVlZGxlID09PSBsYXN0TmVlZGxlKSByZXR1cm4gZm91bmQgPSBsYXN0SW5kZXggIT09IC0xICYmIGhheXN0YWNrW2xhc3RJbmRleF1bQ09MVU1OXSA9PT0gbmVlZGxlLCBsYXN0SW5kZXg7XG5cdFx0bmVlZGxlID49IGxhc3ROZWVkbGUgPyBsb3cgPSBsYXN0SW5kZXggPT09IC0xID8gMCA6IGxhc3RJbmRleCA6IGhpZ2ggPSBsYXN0SW5kZXg7XG5cdH1cblx0cmV0dXJuIHN0YXRlLmxhc3RLZXkgPSBrZXksIHN0YXRlLmxhc3ROZWVkbGUgPSBuZWVkbGUsIHN0YXRlLmxhc3RJbmRleCA9IGJpbmFyeVNlYXJjaChoYXlzdGFjaywgbmVlZGxlLCBsb3csIGhpZ2gpO1xufVxudmFyIExJTkVfR1RSX1pFUk8gPSBcImBsaW5lYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChsaW5lcyBzdGFydCBhdCBsaW5lIDEpXCIsIENPTF9HVFJfRVFfWkVSTyA9IFwiYGNvbHVtbmAgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoY29sdW1ucyBzdGFydCBhdCBjb2x1bW4gMClcIjtcbmZ1bmN0aW9uIGNhc3QobWFwKSB7XG5cdHJldHVybiBtYXA7XG59XG5mdW5jdGlvbiBkZWNvZGVkTWFwcGluZ3MobWFwKSB7XG5cdHZhciBfYTtcblx0cmV0dXJuIChfYSA9IGNhc3QobWFwKSkuX2RlY29kZWQgfHwgKF9hLl9kZWNvZGVkID0gZGVjb2RlKGNhc3QobWFwKS5fZW5jb2RlZCkpO1xufVxuZnVuY3Rpb24gb3JpZ2luYWxQb3NpdGlvbkZvcihtYXAsIG5lZWRsZSkge1xuXHRsZXQgeyBsaW5lLCBjb2x1bW4sIGJpYXMgfSA9IG5lZWRsZTtcblx0aWYgKGxpbmUtLSwgbGluZSA8IDApIHRocm93IEVycm9yKExJTkVfR1RSX1pFUk8pO1xuXHRpZiAoY29sdW1uIDwgMCkgdGhyb3cgRXJyb3IoQ09MX0dUUl9FUV9aRVJPKTtcblx0bGV0IGRlY29kZWQgPSBkZWNvZGVkTWFwcGluZ3MobWFwKTtcblx0aWYgKGxpbmUgPj0gZGVjb2RlZC5sZW5ndGgpIHJldHVybiBPTWFwcGluZyhudWxsLCBudWxsLCBudWxsLCBudWxsKTtcblx0bGV0IHNlZ21lbnRzID0gZGVjb2RlZFtsaW5lXSwgaW5kZXggPSB0cmFjZVNlZ21lbnRJbnRlcm5hbChzZWdtZW50cywgY2FzdChtYXApLl9kZWNvZGVkTWVtbywgbGluZSwgY29sdW1uLCBiaWFzIHx8IDEpO1xuXHRpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG5cdGxldCBzZWdtZW50ID0gc2VnbWVudHNbaW5kZXhdO1xuXHRpZiAoc2VnbWVudC5sZW5ndGggPT09IDEpIHJldHVybiBPTWFwcGluZyhudWxsLCBudWxsLCBudWxsLCBudWxsKTtcblx0bGV0IHsgbmFtZXMsIHJlc29sdmVkU291cmNlcyB9ID0gbWFwO1xuXHRyZXR1cm4gT01hcHBpbmcocmVzb2x2ZWRTb3VyY2VzW3NlZ21lbnRbU09VUkNFU19JTkRFWF1dLCBzZWdtZW50W1NPVVJDRV9MSU5FXSArIDEsIHNlZ21lbnRbU09VUkNFX0NPTFVNTl0sIHNlZ21lbnQubGVuZ3RoID09PSA1ID8gbmFtZXNbc2VnbWVudFtOQU1FU19JTkRFWF1dIDogbnVsbCk7XG59XG5mdW5jdGlvbiBPTWFwcGluZyhzb3VyY2UsIGxpbmUsIGNvbHVtbiwgbmFtZSkge1xuXHRyZXR1cm4ge1xuXHRcdHNvdXJjZSxcblx0XHRsaW5lLFxuXHRcdGNvbHVtbixcblx0XHRuYW1lXG5cdH07XG59XG5mdW5jdGlvbiB0cmFjZVNlZ21lbnRJbnRlcm5hbChzZWdtZW50cywgbWVtbywgbGluZSwgY29sdW1uLCBiaWFzKSB7XG5cdGxldCBpbmRleCA9IG1lbW9pemVkQmluYXJ5U2VhcmNoKHNlZ21lbnRzLCBjb2x1bW4sIG1lbW8sIGxpbmUpO1xuXHRyZXR1cm4gZm91bmQgPyBpbmRleCA9IChiaWFzID09PSAtMSA/IHVwcGVyQm91bmQgOiBsb3dlckJvdW5kKShzZWdtZW50cywgY29sdW1uLCBpbmRleCkgOiBiaWFzID09PSAtMSAmJiBpbmRleCsrLCBpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCA/IC0xIDogaW5kZXg7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbW9kdWxlLXJ1bm5lci9zb3VyY2VtYXAvZGVjb2Rlci50c1xudmFyIERlY29kZWRNYXAgPSBjbGFzcyB7XG5cdF9lbmNvZGVkO1xuXHRfZGVjb2RlZDtcblx0X2RlY29kZWRNZW1vO1xuXHR1cmw7XG5cdGZpbGU7XG5cdHZlcnNpb247XG5cdG5hbWVzID0gW107XG5cdHJlc29sdmVkU291cmNlcztcblx0Y29uc3RydWN0b3IobWFwLCBmcm9tKSB7XG5cdFx0dGhpcy5tYXAgPSBtYXA7XG5cdFx0bGV0IHsgbWFwcGluZ3MsIG5hbWVzLCBzb3VyY2VzIH0gPSBtYXA7XG5cdFx0dGhpcy52ZXJzaW9uID0gbWFwLnZlcnNpb24sIHRoaXMubmFtZXMgPSBuYW1lcyB8fCBbXSwgdGhpcy5fZW5jb2RlZCA9IG1hcHBpbmdzIHx8IFwiXCIsIHRoaXMuX2RlY29kZWRNZW1vID0gbWVtb2l6ZWRTdGF0ZSgpLCB0aGlzLnVybCA9IGZyb20sIHRoaXMuZmlsZSA9IGZyb207XG5cdFx0bGV0IG9yaWdpbkRpciA9IHBvc2l4RGlybmFtZShmcm9tKTtcblx0XHR0aGlzLnJlc29sdmVkU291cmNlcyA9IChzb3VyY2VzIHx8IFtdKS5tYXAoKHMpID0+IHBvc2l4UmVzb2x2ZShvcmlnaW5EaXIsIHMgfHwgXCJcIikpO1xuXHR9XG59O1xuZnVuY3Rpb24gbWVtb2l6ZWRTdGF0ZSgpIHtcblx0cmV0dXJuIHtcblx0XHRsYXN0S2V5OiAtMSxcblx0XHRsYXN0TmVlZGxlOiAtMSxcblx0XHRsYXN0SW5kZXg6IC0xXG5cdH07XG59XG5mdW5jdGlvbiBnZXRPcmlnaW5hbFBvc2l0aW9uKG1hcCwgbmVlZGxlKSB7XG5cdGxldCByZXN1bHQgPSBvcmlnaW5hbFBvc2l0aW9uRm9yKG1hcCwgbmVlZGxlKTtcblx0cmV0dXJuIHJlc3VsdC5jb2x1bW4gPT0gbnVsbCA/IG51bGwgOiByZXN1bHQ7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbW9kdWxlLXJ1bm5lci9ldmFsdWF0ZWRNb2R1bGVzLnRzXG5jb25zdCBNT0RVTEVfUlVOTkVSX1NPVVJDRU1BUFBJTkdfUkVHRVhQID0gUmVnRXhwKGAvLyMgJHtTT1VSQ0VNQVBQSU5HX1VSTH09ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCwoLispYCk7XG52YXIgRXZhbHVhdGVkTW9kdWxlTm9kZSA9IGNsYXNzIHtcblx0aW1wb3J0ZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0aW1wb3J0cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGV2YWx1YXRlZCA9ICExO1xuXHRtZXRhO1xuXHRwcm9taXNlO1xuXHRleHBvcnRzO1xuXHRmaWxlO1xuXHRtYXA7XG5cdGNvbnN0cnVjdG9yKGlkLCB1cmwpIHtcblx0XHR0aGlzLmlkID0gaWQsIHRoaXMudXJsID0gdXJsLCB0aGlzLmZpbGUgPSBjbGVhblVybChpZCk7XG5cdH1cbn0sIEV2YWx1YXRlZE1vZHVsZXMgPSBjbGFzcyB7XG5cdGlkVG9Nb2R1bGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRmaWxlVG9Nb2R1bGVzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0dXJsVG9JZE1vZHVsZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdC8qKlxuXHQqIFJldHVybnMgdGhlIG1vZHVsZSBub2RlIGJ5IHRoZSByZXNvbHZlZCBtb2R1bGUgSUQuIFVzdWFsbHksIG1vZHVsZSBJRCBpc1xuXHQqIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHdpdGggcXVlcnkgYW5kL29yIGhhc2guIEl0IGNhbiBhbHNvIGJlIGEgdmlydHVhbCBtb2R1bGUuXG5cdCpcblx0KiBNb2R1bGUgcnVubmVyIGdyYXBoIHdpbGwgaGF2ZSAxIHRvIDEgbWFwcGluZyB3aXRoIHRoZSBzZXJ2ZXIgbW9kdWxlIGdyYXBoLlxuXHQqIEBwYXJhbSBpZCBSZXNvbHZlZCBtb2R1bGUgSURcblx0Ki9cblx0Z2V0TW9kdWxlQnlJZChpZCkge1xuXHRcdHJldHVybiB0aGlzLmlkVG9Nb2R1bGVNYXAuZ2V0KGlkKTtcblx0fVxuXHQvKipcblx0KiBSZXR1cm5zIGFsbCBtb2R1bGVzIHJlbGF0ZWQgdG8gdGhlIGZpbGUgc3lzdGVtIHBhdGguIERpZmZlcmVudCBtb2R1bGVzXG5cdCogbWlnaHQgaGF2ZSBkaWZmZXJlbnQgcXVlcnkgcGFyYW1ldGVycyBvciBoYXNoLCBzbyBpdCdzIHBvc3NpYmxlIHRvIGhhdmVcblx0KiBtdWx0aXBsZSBtb2R1bGVzIGZvciB0aGUgc2FtZSBmaWxlLlxuXHQqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHN5c3RlbSBwYXRoIG9mIHRoZSBtb2R1bGVcblx0Ki9cblx0Z2V0TW9kdWxlc0J5RmlsZShmaWxlKSB7XG5cdFx0cmV0dXJuIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5nZXQoZmlsZSk7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJucyB0aGUgbW9kdWxlIG5vZGUgYnkgdGhlIFVSTCB0aGF0IHdhcyB1c2VkIGluIHRoZSBpbXBvcnQgc3RhdGVtZW50LlxuXHQqIFVubGlrZSBtb2R1bGUgZ3JhcGggb24gdGhlIHNlcnZlciwgdGhlIFVSTCBpcyBub3QgcmVzb2x2ZWQgYW5kIGlzIHVzZWQgYXMgaXMuXG5cdCogQHBhcmFtIHVybCBTZXJ2ZXIgVVJMIHRoYXQgd2FzIHVzZWQgaW4gdGhlIGltcG9ydCBzdGF0ZW1lbnRcblx0Ki9cblx0Z2V0TW9kdWxlQnlVcmwodXJsKSB7XG5cdFx0cmV0dXJuIHRoaXMudXJsVG9JZE1vZHVsZU1hcC5nZXQodW53cmFwSWQodXJsKSk7XG5cdH1cblx0LyoqXG5cdCogRW5zdXJlIHRoYXQgbW9kdWxlIGlzIGluIHRoZSBncmFwaC4gSWYgdGhlIG1vZHVsZSBpcyBhbHJlYWR5IGluIHRoZSBncmFwaCxcblx0KiBpdCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgbW9kdWxlIG5vZGUuIE90aGVyd2lzZSwgaXQgd2lsbCBjcmVhdGUgYSBuZXdcblx0KiBtb2R1bGUgbm9kZSBhbmQgYWRkIGl0IHRvIHRoZSBncmFwaC5cblx0KiBAcGFyYW0gaWQgUmVzb2x2ZWQgbW9kdWxlIElEXG5cdCogQHBhcmFtIHVybCBVUkwgdGhhdCB3YXMgdXNlZCBpbiB0aGUgaW1wb3J0IHN0YXRlbWVudFxuXHQqL1xuXHRlbnN1cmVNb2R1bGUoaWQsIHVybCkge1xuXHRcdGlmIChpZCA9IG5vcm1hbGl6ZU1vZHVsZUlkKGlkKSwgdGhpcy5pZFRvTW9kdWxlTWFwLmhhcyhpZCkpIHtcblx0XHRcdGxldCBtb2R1bGVOb2RlID0gdGhpcy5pZFRvTW9kdWxlTWFwLmdldChpZCk7XG5cdFx0XHRyZXR1cm4gdGhpcy51cmxUb0lkTW9kdWxlTWFwLnNldCh1cmwsIG1vZHVsZU5vZGUpLCBtb2R1bGVOb2RlO1xuXHRcdH1cblx0XHRsZXQgbW9kdWxlTm9kZSA9IG5ldyBFdmFsdWF0ZWRNb2R1bGVOb2RlKGlkLCB1cmwpO1xuXHRcdHRoaXMuaWRUb01vZHVsZU1hcC5zZXQoaWQsIG1vZHVsZU5vZGUpLCB0aGlzLnVybFRvSWRNb2R1bGVNYXAuc2V0KHVybCwgbW9kdWxlTm9kZSk7XG5cdFx0bGV0IGZpbGVNb2R1bGVzID0gdGhpcy5maWxlVG9Nb2R1bGVzTWFwLmdldChtb2R1bGVOb2RlLmZpbGUpIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0cmV0dXJuIGZpbGVNb2R1bGVzLmFkZChtb2R1bGVOb2RlKSwgdGhpcy5maWxlVG9Nb2R1bGVzTWFwLnNldChtb2R1bGVOb2RlLmZpbGUsIGZpbGVNb2R1bGVzKSwgbW9kdWxlTm9kZTtcblx0fVxuXHRpbnZhbGlkYXRlTW9kdWxlKG5vZGUpIHtcblx0XHRub2RlLmV2YWx1YXRlZCA9ICExLCBub2RlLm1ldGEgPSB2b2lkIDAsIG5vZGUubWFwID0gdm9pZCAwLCBub2RlLnByb21pc2UgPSB2b2lkIDAsIG5vZGUuZXhwb3J0cyA9IHZvaWQgMCwgbm9kZS5pbXBvcnRzLmNsZWFyKCk7XG5cdH1cblx0LyoqXG5cdCogRXh0cmFjdHMgdGhlIGlubGluZWQgc291cmNlIG1hcCBmcm9tIHRoZSBtb2R1bGUgY29kZSBhbmQgcmV0dXJucyB0aGUgZGVjb2RlZFxuXHQqIHNvdXJjZSBtYXAuIElmIHRoZSBzb3VyY2UgbWFwIGlzIG5vdCBpbmxpbmVkLCBpdCB3aWxsIHJldHVybiBudWxsLlxuXHQqIEBwYXJhbSBpZCBSZXNvbHZlZCBtb2R1bGUgSURcblx0Ki9cblx0Z2V0TW9kdWxlU291cmNlTWFwQnlJZChpZCkge1xuXHRcdGxldCBtb2QgPSB0aGlzLmdldE1vZHVsZUJ5SWQoaWQpO1xuXHRcdGlmICghbW9kKSByZXR1cm4gbnVsbDtcblx0XHRpZiAobW9kLm1hcCkgcmV0dXJuIG1vZC5tYXA7XG5cdFx0aWYgKCFtb2QubWV0YSB8fCAhKFwiY29kZVwiIGluIG1vZC5tZXRhKSkgcmV0dXJuIG51bGw7XG5cdFx0bGV0IHBhdHRlcm4gPSBgLy8jICR7U09VUkNFTUFQUElOR19VUkx9PWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsYCwgbGFzdEluZGV4ID0gbW9kLm1ldGEuY29kZS5sYXN0SW5kZXhPZihwYXR0ZXJuKTtcblx0XHRpZiAobGFzdEluZGV4ID09PSAtMSkgcmV0dXJuIG51bGw7XG5cdFx0bGV0IG1hcFN0cmluZyA9IE1PRFVMRV9SVU5ORVJfU09VUkNFTUFQUElOR19SRUdFWFAuZXhlYyhtb2QubWV0YS5jb2RlLnNsaWNlKGxhc3RJbmRleCkpPy5bMV07XG5cdFx0cmV0dXJuIG1hcFN0cmluZyA/IChtb2QubWFwID0gbmV3IERlY29kZWRNYXAoSlNPTi5wYXJzZShkZWNvZGVCYXNlNjQobWFwU3RyaW5nKSksIG1vZC5maWxlKSwgbW9kLm1hcCkgOiBudWxsO1xuXHR9XG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuaWRUb01vZHVsZU1hcC5jbGVhcigpLCB0aGlzLmZpbGVUb01vZHVsZXNNYXAuY2xlYXIoKSwgdGhpcy51cmxUb0lkTW9kdWxlTWFwLmNsZWFyKCk7XG5cdH1cbn07XG5jb25zdCBwcmVmaXhlZEJ1aWx0aW5zID0gbmV3IFNldChbXG5cdFwibm9kZTpzZWFcIixcblx0XCJub2RlOnNxbGl0ZVwiLFxuXHRcIm5vZGU6dGVzdFwiLFxuXHRcIm5vZGU6dGVzdC9yZXBvcnRlcnNcIlxuXSk7XG5mdW5jdGlvbiBub3JtYWxpemVNb2R1bGVJZChmaWxlKSB7XG5cdHJldHVybiBwcmVmaXhlZEJ1aWx0aW5zLmhhcyhmaWxlKSA/IGZpbGUgOiBzbGFzaChmaWxlKS5yZXBsYWNlKC9eXFwvQGZzXFwvLywgaXNXaW5kb3dzID8gXCJcIiA6IFwiL1wiKS5yZXBsYWNlKC9ebm9kZTovLCBcIlwiKS5yZXBsYWNlKC9eXFwvKy8sIFwiL1wiKS5yZXBsYWNlKC9eZmlsZTpcXC8rLywgaXNXaW5kb3dzID8gXCJcIiA6IFwiL1wiKTtcbn1cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9zaGFyZWQvaG1yLnRzXG52YXIgSE1SQ29udGV4dCA9IGNsYXNzIHtcblx0bmV3TGlzdGVuZXJzO1xuXHRjb25zdHJ1Y3RvcihobXJDbGllbnQsIG93bmVyUGF0aCkge1xuXHRcdHRoaXMuaG1yQ2xpZW50ID0gaG1yQ2xpZW50LCB0aGlzLm93bmVyUGF0aCA9IG93bmVyUGF0aCwgaG1yQ2xpZW50LmRhdGFNYXAuaGFzKG93bmVyUGF0aCkgfHwgaG1yQ2xpZW50LmRhdGFNYXAuc2V0KG93bmVyUGF0aCwge30pO1xuXHRcdGxldCBtb2QgPSBobXJDbGllbnQuaG90TW9kdWxlc01hcC5nZXQob3duZXJQYXRoKTtcblx0XHRtb2QgJiYgKG1vZC5jYWxsYmFja3MgPSBbXSk7XG5cdFx0bGV0IHN0YWxlTGlzdGVuZXJzID0gaG1yQ2xpZW50LmN0eFRvTGlzdGVuZXJzTWFwLmdldChvd25lclBhdGgpO1xuXHRcdGlmIChzdGFsZUxpc3RlbmVycykgZm9yIChsZXQgW2V2ZW50LCBzdGFsZUZuc10gb2Ygc3RhbGVMaXN0ZW5lcnMpIHtcblx0XHRcdGxldCBsaXN0ZW5lcnMgPSBobXJDbGllbnQuY3VzdG9tTGlzdGVuZXJzTWFwLmdldChldmVudCk7XG5cdFx0XHRsaXN0ZW5lcnMgJiYgaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcC5zZXQoZXZlbnQsIGxpc3RlbmVycy5maWx0ZXIoKGwpID0+ICFzdGFsZUZucy5pbmNsdWRlcyhsKSkpO1xuXHRcdH1cblx0XHR0aGlzLm5ld0xpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIGhtckNsaWVudC5jdHhUb0xpc3RlbmVyc01hcC5zZXQob3duZXJQYXRoLCB0aGlzLm5ld0xpc3RlbmVycyk7XG5cdH1cblx0Z2V0IGRhdGEoKSB7XG5cdFx0cmV0dXJuIHRoaXMuaG1yQ2xpZW50LmRhdGFNYXAuZ2V0KHRoaXMub3duZXJQYXRoKTtcblx0fVxuXHRhY2NlcHQoZGVwcywgY2FsbGJhY2spIHtcblx0XHRpZiAodHlwZW9mIGRlcHMgPT0gXCJmdW5jdGlvblwiIHx8ICFkZXBzKSB0aGlzLmFjY2VwdERlcHMoW3RoaXMub3duZXJQYXRoXSwgKFttb2RdKSA9PiBkZXBzPy4obW9kKSk7XG5cdFx0ZWxzZSBpZiAodHlwZW9mIGRlcHMgPT0gXCJzdHJpbmdcIikgdGhpcy5hY2NlcHREZXBzKFtkZXBzXSwgKFttb2RdKSA9PiBjYWxsYmFjaz8uKG1vZCkpO1xuXHRcdGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGVwcykpIHRoaXMuYWNjZXB0RGVwcyhkZXBzLCBjYWxsYmFjayk7XG5cdFx0ZWxzZSB0aHJvdyBFcnJvcihcImludmFsaWQgaG90LmFjY2VwdCgpIHVzYWdlLlwiKTtcblx0fVxuXHRhY2NlcHRFeHBvcnRzKF8sIGNhbGxiYWNrKSB7XG5cdFx0dGhpcy5hY2NlcHREZXBzKFt0aGlzLm93bmVyUGF0aF0sIChbbW9kXSkgPT4gY2FsbGJhY2s/Lihtb2QpKTtcblx0fVxuXHRkaXNwb3NlKGNiKSB7XG5cdFx0dGhpcy5obXJDbGllbnQuZGlzcG9zZU1hcC5zZXQodGhpcy5vd25lclBhdGgsIGNiKTtcblx0fVxuXHRwcnVuZShjYikge1xuXHRcdHRoaXMuaG1yQ2xpZW50LnBydW5lTWFwLnNldCh0aGlzLm93bmVyUGF0aCwgY2IpO1xuXHR9XG5cdGRlY2xpbmUoKSB7fVxuXHRpbnZhbGlkYXRlKG1lc3NhZ2UpIHtcblx0XHRsZXQgZmlyc3RJbnZhbGlkYXRlZEJ5ID0gdGhpcy5obXJDbGllbnQuY3VycmVudEZpcnN0SW52YWxpZGF0ZWRCeSA/PyB0aGlzLm93bmVyUGF0aDtcblx0XHR0aGlzLmhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmludmFsaWRhdGVcIiwge1xuXHRcdFx0cGF0aDogdGhpcy5vd25lclBhdGgsXG5cdFx0XHRtZXNzYWdlLFxuXHRcdFx0Zmlyc3RJbnZhbGlkYXRlZEJ5XG5cdFx0fSksIHRoaXMuc2VuZChcInZpdGU6aW52YWxpZGF0ZVwiLCB7XG5cdFx0XHRwYXRoOiB0aGlzLm93bmVyUGF0aCxcblx0XHRcdG1lc3NhZ2UsXG5cdFx0XHRmaXJzdEludmFsaWRhdGVkQnlcblx0XHR9KSwgdGhpcy5obXJDbGllbnQubG9nZ2VyLmRlYnVnKGBpbnZhbGlkYXRlICR7dGhpcy5vd25lclBhdGh9JHttZXNzYWdlID8gYDogJHttZXNzYWdlfWAgOiBcIlwifWApO1xuXHR9XG5cdG9uKGV2ZW50LCBjYikge1xuXHRcdGxldCBhZGRUb01hcCA9IChtYXApID0+IHtcblx0XHRcdGxldCBleGlzdGluZyA9IG1hcC5nZXQoZXZlbnQpIHx8IFtdO1xuXHRcdFx0ZXhpc3RpbmcucHVzaChjYiksIG1hcC5zZXQoZXZlbnQsIGV4aXN0aW5nKTtcblx0XHR9O1xuXHRcdGFkZFRvTWFwKHRoaXMuaG1yQ2xpZW50LmN1c3RvbUxpc3RlbmVyc01hcCksIGFkZFRvTWFwKHRoaXMubmV3TGlzdGVuZXJzKTtcblx0fVxuXHRvZmYoZXZlbnQsIGNiKSB7XG5cdFx0bGV0IHJlbW92ZUZyb21NYXAgPSAobWFwKSA9PiB7XG5cdFx0XHRsZXQgZXhpc3RpbmcgPSBtYXAuZ2V0KGV2ZW50KTtcblx0XHRcdGlmIChleGlzdGluZyA9PT0gdm9pZCAwKSByZXR1cm47XG5cdFx0XHRsZXQgcHJ1bmVkID0gZXhpc3RpbmcuZmlsdGVyKChsKSA9PiBsICE9PSBjYik7XG5cdFx0XHRpZiAocHJ1bmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRtYXAuZGVsZXRlKGV2ZW50KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bWFwLnNldChldmVudCwgcHJ1bmVkKTtcblx0XHR9O1xuXHRcdHJlbW92ZUZyb21NYXAodGhpcy5obXJDbGllbnQuY3VzdG9tTGlzdGVuZXJzTWFwKSwgcmVtb3ZlRnJvbU1hcCh0aGlzLm5ld0xpc3RlbmVycyk7XG5cdH1cblx0c2VuZChldmVudCwgZGF0YSkge1xuXHRcdHRoaXMuaG1yQ2xpZW50LnNlbmQoe1xuXHRcdFx0dHlwZTogXCJjdXN0b21cIixcblx0XHRcdGV2ZW50LFxuXHRcdFx0ZGF0YVxuXHRcdH0pO1xuXHR9XG5cdGFjY2VwdERlcHMoZGVwcywgY2FsbGJhY2sgPSAoKSA9PiB7fSkge1xuXHRcdGxldCBtb2QgPSB0aGlzLmhtckNsaWVudC5ob3RNb2R1bGVzTWFwLmdldCh0aGlzLm93bmVyUGF0aCkgfHwge1xuXHRcdFx0aWQ6IHRoaXMub3duZXJQYXRoLFxuXHRcdFx0Y2FsbGJhY2tzOiBbXVxuXHRcdH07XG5cdFx0bW9kLmNhbGxiYWNrcy5wdXNoKHtcblx0XHRcdGRlcHMsXG5cdFx0XHRmbjogY2FsbGJhY2tcblx0XHR9KSwgdGhpcy5obXJDbGllbnQuaG90TW9kdWxlc01hcC5zZXQodGhpcy5vd25lclBhdGgsIG1vZCk7XG5cdH1cbn0sIEhNUkNsaWVudCA9IGNsYXNzIHtcblx0aG90TW9kdWxlc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdGRpc3Bvc2VNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRwcnVuZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdGRhdGFNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRjdXN0b21MaXN0ZW5lcnNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRjdHhUb0xpc3RlbmVyc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cdGN1cnJlbnRGaXJzdEludmFsaWRhdGVkQnk7XG5cdGNvbnN0cnVjdG9yKGxvZ2dlciwgdHJhbnNwb3J0LCBpbXBvcnRVcGRhdGVkTW9kdWxlKSB7XG5cdFx0dGhpcy5sb2dnZXIgPSBsb2dnZXIsIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0LCB0aGlzLmltcG9ydFVwZGF0ZWRNb2R1bGUgPSBpbXBvcnRVcGRhdGVkTW9kdWxlO1xuXHR9XG5cdGFzeW5jIG5vdGlmeUxpc3RlbmVycyhldmVudCwgZGF0YSkge1xuXHRcdGxldCBjYnMgPSB0aGlzLmN1c3RvbUxpc3RlbmVyc01hcC5nZXQoZXZlbnQpO1xuXHRcdGNicyAmJiBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoY2JzLm1hcCgoY2IpID0+IGNiKGRhdGEpKSk7XG5cdH1cblx0c2VuZChwYXlsb2FkKSB7XG5cdFx0dGhpcy50cmFuc3BvcnQuc2VuZChwYXlsb2FkKS5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihlcnIpO1xuXHRcdH0pO1xuXHR9XG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuaG90TW9kdWxlc01hcC5jbGVhcigpLCB0aGlzLmRpc3Bvc2VNYXAuY2xlYXIoKSwgdGhpcy5wcnVuZU1hcC5jbGVhcigpLCB0aGlzLmRhdGFNYXAuY2xlYXIoKSwgdGhpcy5jdXN0b21MaXN0ZW5lcnNNYXAuY2xlYXIoKSwgdGhpcy5jdHhUb0xpc3RlbmVyc01hcC5jbGVhcigpO1xuXHR9XG5cdGFzeW5jIHBydW5lUGF0aHMocGF0aHMpIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChwYXRocy5tYXAoKHBhdGgpID0+IHtcblx0XHRcdGxldCBkaXNwb3NlciA9IHRoaXMuZGlzcG9zZU1hcC5nZXQocGF0aCk7XG5cdFx0XHRpZiAoZGlzcG9zZXIpIHJldHVybiBkaXNwb3Nlcih0aGlzLmRhdGFNYXAuZ2V0KHBhdGgpKTtcblx0XHR9KSksIGF3YWl0IFByb21pc2UuYWxsKHBhdGhzLm1hcCgocGF0aCkgPT4ge1xuXHRcdFx0bGV0IGZuID0gdGhpcy5wcnVuZU1hcC5nZXQocGF0aCk7XG5cdFx0XHRpZiAoZm4pIHJldHVybiBmbih0aGlzLmRhdGFNYXAuZ2V0KHBhdGgpKTtcblx0XHR9KSk7XG5cdH1cblx0d2FybkZhaWxlZFVwZGF0ZShlcnIsIHBhdGgpIHtcblx0XHQoIShlcnIgaW5zdGFuY2VvZiBFcnJvcikgfHwgIWVyci5tZXNzYWdlLmluY2x1ZGVzKFwiZmV0Y2hcIikpICYmIHRoaXMubG9nZ2VyLmVycm9yKGVyciksIHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVsb2FkICR7cGF0aH0uIFRoaXMgY291bGQgYmUgZHVlIHRvIHN5bnRheCBlcnJvcnMgb3IgaW1wb3J0aW5nIG5vbi1leGlzdGVudCBtb2R1bGVzLiAoc2VlIGVycm9ycyBhYm92ZSlgKTtcblx0fVxuXHR1cGRhdGVRdWV1ZSA9IFtdO1xuXHRwZW5kaW5nVXBkYXRlUXVldWUgPSAhMTtcblx0LyoqXG5cdCogYnVmZmVyIG11bHRpcGxlIGhvdCB1cGRhdGVzIHRyaWdnZXJlZCBieSB0aGUgc2FtZSBzcmMgY2hhbmdlXG5cdCogc28gdGhhdCB0aGV5IGFyZSBpbnZva2VkIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBzZW50LlxuXHQqIChvdGhlcndpc2UgdGhlIG9yZGVyIG1heSBiZSBpbmNvbnNpc3RlbnQgYmVjYXVzZSBvZiB0aGUgaHR0cCByZXF1ZXN0IHJvdW5kIHRyaXApXG5cdCovXG5cdGFzeW5jIHF1ZXVlVXBkYXRlKHBheWxvYWQpIHtcblx0XHRpZiAodGhpcy51cGRhdGVRdWV1ZS5wdXNoKHRoaXMuZmV0Y2hVcGRhdGUocGF5bG9hZCkpLCAhdGhpcy5wZW5kaW5nVXBkYXRlUXVldWUpIHtcblx0XHRcdHRoaXMucGVuZGluZ1VwZGF0ZVF1ZXVlID0gITAsIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLCB0aGlzLnBlbmRpbmdVcGRhdGVRdWV1ZSA9ICExO1xuXHRcdFx0bGV0IGxvYWRpbmcgPSBbLi4udGhpcy51cGRhdGVRdWV1ZV07XG5cdFx0XHR0aGlzLnVwZGF0ZVF1ZXVlID0gW10sIChhd2FpdCBQcm9taXNlLmFsbChsb2FkaW5nKSkuZm9yRWFjaCgoZm4pID0+IGZuICYmIGZuKCkpO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmZXRjaFVwZGF0ZSh1cGRhdGUpIHtcblx0XHRsZXQgeyBwYXRoLCBhY2NlcHRlZFBhdGgsIGZpcnN0SW52YWxpZGF0ZWRCeSB9ID0gdXBkYXRlLCBtb2QgPSB0aGlzLmhvdE1vZHVsZXNNYXAuZ2V0KHBhdGgpO1xuXHRcdGlmICghbW9kKSByZXR1cm47XG5cdFx0bGV0IGZldGNoZWRNb2R1bGUsIGlzU2VsZlVwZGF0ZSA9IHBhdGggPT09IGFjY2VwdGVkUGF0aCwgcXVhbGlmaWVkQ2FsbGJhY2tzID0gbW9kLmNhbGxiYWNrcy5maWx0ZXIoKHsgZGVwcyB9KSA9PiBkZXBzLmluY2x1ZGVzKGFjY2VwdGVkUGF0aCkpO1xuXHRcdGlmIChpc1NlbGZVcGRhdGUgfHwgcXVhbGlmaWVkQ2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcblx0XHRcdGxldCBkaXNwb3NlciA9IHRoaXMuZGlzcG9zZU1hcC5nZXQoYWNjZXB0ZWRQYXRoKTtcblx0XHRcdGRpc3Bvc2VyICYmIGF3YWl0IGRpc3Bvc2VyKHRoaXMuZGF0YU1hcC5nZXQoYWNjZXB0ZWRQYXRoKSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRmZXRjaGVkTW9kdWxlID0gYXdhaXQgdGhpcy5pbXBvcnRVcGRhdGVkTW9kdWxlKHVwZGF0ZSk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHRoaXMud2FybkZhaWxlZFVwZGF0ZShlLCBhY2NlcHRlZFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5jdXJyZW50Rmlyc3RJbnZhbGlkYXRlZEJ5ID0gZmlyc3RJbnZhbGlkYXRlZEJ5O1xuXHRcdFx0XHRmb3IgKGxldCB7IGRlcHMsIGZuIH0gb2YgcXVhbGlmaWVkQ2FsbGJhY2tzKSBmbihkZXBzLm1hcCgoZGVwKSA9PiBkZXAgPT09IGFjY2VwdGVkUGF0aCA/IGZldGNoZWRNb2R1bGUgOiB2b2lkIDApKTtcblx0XHRcdFx0bGV0IGxvZ2dlZFBhdGggPSBpc1NlbGZVcGRhdGUgPyBwYXRoIDogYCR7YWNjZXB0ZWRQYXRofSB2aWEgJHtwYXRofWA7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmRlYnVnKGBob3QgdXBkYXRlZDogJHtsb2dnZWRQYXRofWApO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0dGhpcy5jdXJyZW50Rmlyc3RJbnZhbGlkYXRlZEJ5ID0gdm9pZCAwO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn07XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvc2hhcmVkL3NzclRyYW5zZm9ybS50c1xuLyoqXG4qIFZpdGUgY29udmVydHMgYGltcG9ydCB7IH0gZnJvbSAnZm9vJ2AgdG8gYGNvbnN0IF8gPSBfX3ZpdGVfc3NyX2ltcG9ydF9fKCdmb28nKWAuXG4qIFRvcC1sZXZlbCBpbXBvcnRzIGFuZCBkeW5hbWljIGltcG9ydHMgd29yayBzbGlnaHRseSBkaWZmZXJlbnRseSBpbiBOb2RlLmpzLlxuKiBUaGlzIGZ1bmN0aW9uIG5vcm1hbGl6ZXMgdGhlIGRpZmZlcmVuY2VzIHNvIGl0IG1hdGNoZXMgcHJvZCBiZWhhdmlvdXIuXG4qL1xuZnVuY3Rpb24gYW5hbHl6ZUltcG9ydGVkTW9kRGlmZmVyZW5jZShtb2QsIHJhd0lkLCBtb2R1bGVUeXBlLCBtZXRhZGF0YSkge1xuXHRpZiAoIW1ldGFkYXRhPy5pc0R5bmFtaWNJbXBvcnQgJiYgbWV0YWRhdGE/LmltcG9ydGVkTmFtZXM/Lmxlbmd0aCkge1xuXHRcdGxldCBtaXNzaW5nQmluZGluZ3MgPSBtZXRhZGF0YS5pbXBvcnRlZE5hbWVzLmZpbHRlcigocykgPT4gIShzIGluIG1vZCkpO1xuXHRcdGlmIChtaXNzaW5nQmluZGluZ3MubGVuZ3RoKSB7XG5cdFx0XHRsZXQgbGFzdEJpbmRpbmcgPSBtaXNzaW5nQmluZGluZ3NbbWlzc2luZ0JpbmRpbmdzLmxlbmd0aCAtIDFdO1xuXHRcdFx0dGhyb3cgU3ludGF4RXJyb3IobW9kdWxlVHlwZSA9PT0gXCJtb2R1bGVcIiA/IGBbdml0ZV0gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJyR7cmF3SWR9JyBkb2VzIG5vdCBwcm92aWRlIGFuIGV4cG9ydCBuYW1lZCAnJHtsYXN0QmluZGluZ30nYCA6IGBcXFxuW3ZpdGVdIE5hbWVkIGV4cG9ydCAnJHtsYXN0QmluZGluZ30nIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJyR7cmF3SWR9JyBpcyBhIENvbW1vbkpTIG1vZHVsZSwgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuQ29tbW9uSlMgbW9kdWxlcyBjYW4gYWx3YXlzIGJlIGltcG9ydGVkIHZpYSB0aGUgZGVmYXVsdCBleHBvcnQsIGZvciBleGFtcGxlIHVzaW5nOlxuXG5pbXBvcnQgcGtnIGZyb20gJyR7cmF3SWR9JztcbmNvbnN0IHske21pc3NpbmdCaW5kaW5ncy5qb2luKFwiLCBcIil9fSA9IHBrZztcbmApO1xuXHRcdH1cblx0fVxufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL25hbm9pZEA1LjEuNy9ub2RlX21vZHVsZXMvbmFub2lkL25vbi1zZWN1cmUvaW5kZXguanNcbmxldCBuYW5vaWQgPSAoc2l6ZSA9IDIxKSA9PiB7XG5cdGxldCBpZCA9IFwiXCIsIGkgPSBzaXplIHwgMDtcblx0Zm9yICg7IGktLTspIGlkICs9IFwidXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdFwiW01hdGgucmFuZG9tKCkgKiA2NCB8IDBdO1xuXHRyZXR1cm4gaWQ7XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9tb2R1bGVSdW5uZXJUcmFuc3BvcnQudHNcbmZ1bmN0aW9uIHJldml2ZUludm9rZUVycm9yKGUpIHtcblx0bGV0IGVycm9yID0gRXJyb3IoZS5tZXNzYWdlIHx8IFwiVW5rbm93biBpbnZva2UgZXJyb3JcIik7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKGVycm9yLCBlLCB7IHJ1bm5lckVycm9yOiAvKiBAX19QVVJFX18gKi8gRXJyb3IoXCJSdW5uZXJFcnJvclwiKSB9KSwgZXJyb3I7XG59XG5jb25zdCBjcmVhdGVJbnZva2VhYmxlVHJhbnNwb3J0ID0gKHRyYW5zcG9ydCkgPT4ge1xuXHRpZiAodHJhbnNwb3J0Lmludm9rZSkgcmV0dXJuIHtcblx0XHQuLi50cmFuc3BvcnQsXG5cdFx0YXN5bmMgaW52b2tlKG5hbWUsIGRhdGEpIHtcblx0XHRcdGxldCByZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuaW52b2tlKHtcblx0XHRcdFx0dHlwZTogXCJjdXN0b21cIixcblx0XHRcdFx0ZXZlbnQ6IFwidml0ZTppbnZva2VcIixcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGlkOiBcInNlbmRcIixcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGRhdGFcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoXCJlcnJvclwiIGluIHJlc3VsdCkgdGhyb3cgcmV2aXZlSW52b2tlRXJyb3IocmVzdWx0LmVycm9yKTtcblx0XHRcdHJldHVybiByZXN1bHQucmVzdWx0O1xuXHRcdH1cblx0fTtcblx0aWYgKCF0cmFuc3BvcnQuc2VuZCB8fCAhdHJhbnNwb3J0LmNvbm5lY3QpIHRocm93IEVycm9yKFwidHJhbnNwb3J0IG11c3QgaW1wbGVtZW50IHNlbmQgYW5kIGNvbm5lY3Qgd2hlbiBpbnZva2UgaXMgbm90IGltcGxlbWVudGVkXCIpO1xuXHRsZXQgcnBjUHJvbWlzZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXHRyZXR1cm4ge1xuXHRcdC4uLnRyYW5zcG9ydCxcblx0XHRjb25uZWN0KHsgb25NZXNzYWdlLCBvbkRpc2Nvbm5lY3Rpb24gfSkge1xuXHRcdFx0cmV0dXJuIHRyYW5zcG9ydC5jb25uZWN0KHtcblx0XHRcdFx0b25NZXNzYWdlKHBheWxvYWQpIHtcblx0XHRcdFx0XHRpZiAocGF5bG9hZC50eXBlID09PSBcImN1c3RvbVwiICYmIHBheWxvYWQuZXZlbnQgPT09IFwidml0ZTppbnZva2VcIikge1xuXHRcdFx0XHRcdFx0bGV0IGRhdGEgPSBwYXlsb2FkLmRhdGE7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5pZC5zdGFydHNXaXRoKFwicmVzcG9uc2U6XCIpKSB7XG5cdFx0XHRcdFx0XHRcdGxldCBpbnZva2VJZCA9IGRhdGEuaWQuc2xpY2UoOSksIHByb21pc2UgPSBycGNQcm9taXNlcy5nZXQoaW52b2tlSWQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIXByb21pc2UpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0cHJvbWlzZS50aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHByb21pc2UudGltZW91dElkKSwgcnBjUHJvbWlzZXMuZGVsZXRlKGludm9rZUlkKTtcblx0XHRcdFx0XHRcdFx0bGV0IHsgZXJyb3IsIHJlc3VsdCB9ID0gZGF0YS5kYXRhO1xuXHRcdFx0XHRcdFx0XHRlcnJvciA/IHByb21pc2UucmVqZWN0KGVycm9yKSA6IHByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9uTWVzc2FnZShwYXlsb2FkKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0b25EaXNjb25uZWN0aW9uXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGRpc2Nvbm5lY3QoKSB7XG5cdFx0XHRyZXR1cm4gcnBjUHJvbWlzZXMuZm9yRWFjaCgocHJvbWlzZSkgPT4ge1xuXHRcdFx0XHRwcm9taXNlLnJlamVjdCgvKiBAX19QVVJFX18gKi8gRXJyb3IoYHRyYW5zcG9ydCB3YXMgZGlzY29ubmVjdGVkLCBjYW5ub3QgY2FsbCAke0pTT04uc3RyaW5naWZ5KHByb21pc2UubmFtZSl9YCkpO1xuXHRcdFx0fSksIHJwY1Byb21pc2VzLmNsZWFyKCksIHRyYW5zcG9ydC5kaXNjb25uZWN0Py4oKTtcblx0XHR9LFxuXHRcdHNlbmQoZGF0YSkge1xuXHRcdFx0cmV0dXJuIHRyYW5zcG9ydC5zZW5kKGRhdGEpO1xuXHRcdH0sXG5cdFx0YXN5bmMgaW52b2tlKG5hbWUsIGRhdGEpIHtcblx0XHRcdGxldCBwcm9taXNlSWQgPSBuYW5vaWQoKSwgd3JhcHBlZERhdGEgPSB7XG5cdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdGV2ZW50OiBcInZpdGU6aW52b2tlXCIsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGlkOiBgc2VuZDoke3Byb21pc2VJZH1gLFxuXHRcdFx0XHRcdGRhdGFcblx0XHRcdFx0fVxuXHRcdFx0fSwgc2VuZFByb21pc2UgPSB0cmFuc3BvcnQuc2VuZCh3cmFwcGVkRGF0YSksIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBwcm9taXNlV2l0aFJlc29sdmVycygpLCB0aW1lb3V0ID0gdHJhbnNwb3J0LnRpbWVvdXQgPz8gNmU0LCB0aW1lb3V0SWQ7XG5cdFx0XHR0aW1lb3V0ID4gMCAmJiAodGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHJwY1Byb21pc2VzLmRlbGV0ZShwcm9taXNlSWQpLCByZWplY3QoLyogQF9fUFVSRV9fICovIEVycm9yKGB0cmFuc3BvcnQgaW52b2tlIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXMgKGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkod3JhcHBlZERhdGEpfSlgKSk7XG5cdFx0XHR9LCB0aW1lb3V0KSwgdGltZW91dElkPy51bnJlZj8uKCkpLCBycGNQcm9taXNlcy5zZXQocHJvbWlzZUlkLCB7XG5cdFx0XHRcdHJlc29sdmUsXG5cdFx0XHRcdHJlamVjdCxcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0dGltZW91dElkXG5cdFx0XHR9KSwgc2VuZFByb21pc2UgJiYgc2VuZFByb21pc2UuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGltZW91dElkKSwgcnBjUHJvbWlzZXMuZGVsZXRlKHByb21pc2VJZCksIHJlamVjdChlcnIpO1xuXHRcdFx0fSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gYXdhaXQgcHJvbWlzZTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHR0aHJvdyByZXZpdmVJbnZva2VFcnJvcihlcnIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn0sIG5vcm1hbGl6ZU1vZHVsZVJ1bm5lclRyYW5zcG9ydCA9ICh0cmFuc3BvcnQpID0+IHtcblx0bGV0IGludm9rZWFibGVUcmFuc3BvcnQgPSBjcmVhdGVJbnZva2VhYmxlVHJhbnNwb3J0KHRyYW5zcG9ydCksIGlzQ29ubmVjdGVkID0gIWludm9rZWFibGVUcmFuc3BvcnQuY29ubmVjdCwgY29ubmVjdGluZ1Byb21pc2U7XG5cdHJldHVybiB7XG5cdFx0Li4udHJhbnNwb3J0LFxuXHRcdC4uLmludm9rZWFibGVUcmFuc3BvcnQuY29ubmVjdCA/IHsgYXN5bmMgY29ubmVjdChvbk1lc3NhZ2UpIHtcblx0XHRcdGlmIChpc0Nvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdFx0aWYgKGNvbm5lY3RpbmdQcm9taXNlKSB7XG5cdFx0XHRcdGF3YWl0IGNvbm5lY3RpbmdQcm9taXNlO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgbWF5YmVQcm9taXNlID0gaW52b2tlYWJsZVRyYW5zcG9ydC5jb25uZWN0KHtcblx0XHRcdFx0b25NZXNzYWdlOiBvbk1lc3NhZ2UgPz8gKCgpID0+IHt9KSxcblx0XHRcdFx0b25EaXNjb25uZWN0aW9uKCkge1xuXHRcdFx0XHRcdGlzQ29ubmVjdGVkID0gITE7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0bWF5YmVQcm9taXNlICYmIChjb25uZWN0aW5nUHJvbWlzZSA9IG1heWJlUHJvbWlzZSwgYXdhaXQgY29ubmVjdGluZ1Byb21pc2UsIGNvbm5lY3RpbmdQcm9taXNlID0gdm9pZCAwKSwgaXNDb25uZWN0ZWQgPSAhMDtcblx0XHR9IH0gOiB7fSxcblx0XHQuLi5pbnZva2VhYmxlVHJhbnNwb3J0LmRpc2Nvbm5lY3QgPyB7IGFzeW5jIGRpc2Nvbm5lY3QoKSB7XG5cdFx0XHRpc0Nvbm5lY3RlZCAmJiAoY29ubmVjdGluZ1Byb21pc2UgJiYgYXdhaXQgY29ubmVjdGluZ1Byb21pc2UsIGlzQ29ubmVjdGVkID0gITEsIGF3YWl0IGludm9rZWFibGVUcmFuc3BvcnQuZGlzY29ubmVjdCgpKTtcblx0XHR9IH0gOiB7fSxcblx0XHRhc3luYyBzZW5kKGRhdGEpIHtcblx0XHRcdGlmIChpbnZva2VhYmxlVHJhbnNwb3J0LnNlbmQpIHtcblx0XHRcdFx0aWYgKCFpc0Nvbm5lY3RlZCkgaWYgKGNvbm5lY3RpbmdQcm9taXNlKSBhd2FpdCBjb25uZWN0aW5nUHJvbWlzZTtcblx0XHRcdFx0ZWxzZSB0aHJvdyBFcnJvcihcInNlbmQgd2FzIGNhbGxlZCBiZWZvcmUgY29ubmVjdFwiKTtcblx0XHRcdFx0YXdhaXQgaW52b2tlYWJsZVRyYW5zcG9ydC5zZW5kKGRhdGEpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YXN5bmMgaW52b2tlKG5hbWUsIGRhdGEpIHtcblx0XHRcdGlmICghaXNDb25uZWN0ZWQpIGlmIChjb25uZWN0aW5nUHJvbWlzZSkgYXdhaXQgY29ubmVjdGluZ1Byb21pc2U7XG5cdFx0XHRlbHNlIHRocm93IEVycm9yKFwiaW52b2tlIHdhcyBjYWxsZWQgYmVmb3JlIGNvbm5lY3RcIik7XG5cdFx0XHRyZXR1cm4gaW52b2tlYWJsZVRyYW5zcG9ydC5pbnZva2UobmFtZSwgZGF0YSk7XG5cdFx0fVxuXHR9O1xufSwgY3JlYXRlV2ViU29ja2V0TW9kdWxlUnVubmVyVHJhbnNwb3J0ID0gKG9wdGlvbnMpID0+IHtcblx0bGV0IHBpbmdJbnRlcnZhbCA9IG9wdGlvbnMucGluZ0ludGVydmFsID8/IDNlNCwgd3MsIHBpbmdJbnRlcnZhbElkO1xuXHRyZXR1cm4ge1xuXHRcdGFzeW5jIGNvbm5lY3QoeyBvbk1lc3NhZ2UsIG9uRGlzY29ubmVjdGlvbiB9KSB7XG5cdFx0XHRsZXQgc29ja2V0ID0gb3B0aW9ucy5jcmVhdGVDb25uZWN0aW9uKCk7XG5cdFx0XHRzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKHsgZGF0YSB9KSA9PiB7XG5cdFx0XHRcdG9uTWVzc2FnZShKU09OLnBhcnNlKGRhdGEpKTtcblx0XHRcdH0pO1xuXHRcdFx0bGV0IGlzT3BlbmVkID0gc29ja2V0LnJlYWR5U3RhdGUgPT09IHNvY2tldC5PUEVOO1xuXHRcdFx0aXNPcGVuZWQgfHwgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgKCkgPT4ge1xuXHRcdFx0XHRcdGlzT3BlbmVkID0gITAsIHJlc29sdmUoKTtcblx0XHRcdFx0fSwgeyBvbmNlOiAhMCB9KSwgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFpc09wZW5lZCkge1xuXHRcdFx0XHRcdFx0cmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBFcnJvcihcIldlYlNvY2tldCBjbG9zZWQgd2l0aG91dCBvcGVuZWQuXCIpKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b25NZXNzYWdlKHtcblx0XHRcdFx0XHRcdHR5cGU6IFwiY3VzdG9tXCIsXG5cdFx0XHRcdFx0XHRldmVudDogXCJ2aXRlOndzOmRpc2Nvbm5lY3RcIixcblx0XHRcdFx0XHRcdGRhdGE6IHsgd2ViU29ja2V0OiBzb2NrZXQgfVxuXHRcdFx0XHRcdH0pLCBvbkRpc2Nvbm5lY3Rpb24oKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KSwgb25NZXNzYWdlKHtcblx0XHRcdFx0dHlwZTogXCJjdXN0b21cIixcblx0XHRcdFx0ZXZlbnQ6IFwidml0ZTp3czpjb25uZWN0XCIsXG5cdFx0XHRcdGRhdGE6IHsgd2ViU29ja2V0OiBzb2NrZXQgfVxuXHRcdFx0fSksIHdzID0gc29ja2V0LCBwaW5nSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdFx0c29ja2V0LnJlYWR5U3RhdGUgPT09IHNvY2tldC5PUEVOICYmIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdHlwZTogXCJwaW5nXCIgfSkpO1xuXHRcdFx0fSwgcGluZ0ludGVydmFsKTtcblx0XHR9LFxuXHRcdGRpc2Nvbm5lY3QoKSB7XG5cdFx0XHRjbGVhckludGVydmFsKHBpbmdJbnRlcnZhbElkKSwgd3M/LmNsb3NlKCk7XG5cdFx0fSxcblx0XHRzZW5kKGRhdGEpIHtcblx0XHRcdHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuXHRcdH1cblx0fTtcbn07XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvc2hhcmVkL2J1aWx0aW4udHNcbmZ1bmN0aW9uIGNyZWF0ZUlzQnVpbHRpbihidWlsdGlucykge1xuXHRsZXQgcGxhaW5CdWlsdGluc1NldCA9IG5ldyBTZXQoYnVpbHRpbnMuZmlsdGVyKChidWlsdGluKSA9PiB0eXBlb2YgYnVpbHRpbiA9PSBcInN0cmluZ1wiKSksIHJlZ2V4QnVpbHRpbnMgPSBidWlsdGlucy5maWx0ZXIoKGJ1aWx0aW4pID0+IHR5cGVvZiBidWlsdGluICE9IFwic3RyaW5nXCIpO1xuXHRyZXR1cm4gKGlkKSA9PiBwbGFpbkJ1aWx0aW5zU2V0LmhhcyhpZCkgfHwgcmVnZXhCdWlsdGlucy5zb21lKChyZWdleHApID0+IHJlZ2V4cC50ZXN0KGlkKSk7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvbW9kdWxlLXJ1bm5lci9jb25zdGFudHMudHNcbmNvbnN0IHNzck1vZHVsZUV4cG9ydHNLZXkgPSBcIl9fdml0ZV9zc3JfZXhwb3J0c19fXCIsIHNzckltcG9ydEtleSA9IFwiX192aXRlX3Nzcl9pbXBvcnRfX1wiLCBzc3JEeW5hbWljSW1wb3J0S2V5ID0gXCJfX3ZpdGVfc3NyX2R5bmFtaWNfaW1wb3J0X19cIiwgc3NyRXhwb3J0QWxsS2V5ID0gXCJfX3ZpdGVfc3NyX2V4cG9ydEFsbF9fXCIsIHNzckV4cG9ydE5hbWVLZXkgPSBcIl9fdml0ZV9zc3JfZXhwb3J0TmFtZV9fXCIsIHNzckltcG9ydE1ldGFLZXkgPSBcIl9fdml0ZV9zc3JfaW1wb3J0X21ldGFfX1wiLCBub29wID0gKCkgPT4ge30sIHNpbGVudENvbnNvbGUgPSB7XG5cdGRlYnVnOiBub29wLFxuXHRlcnJvcjogbm9vcFxufSwgaG1yTG9nZ2VyID0ge1xuXHRkZWJ1ZzogKC4uLm1zZykgPT4gY29uc29sZS5sb2coXCJbdml0ZV1cIiwgLi4ubXNnKSxcblx0ZXJyb3I6IChlcnJvcikgPT4gY29uc29sZS5sb2coXCJbdml0ZV1cIiwgZXJyb3IpXG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL3NoYXJlZC9obXJIYW5kbGVyLnRzXG5mdW5jdGlvbiBjcmVhdGVITVJIYW5kbGVyKGhhbmRsZXIpIHtcblx0bGV0IHF1ZXVlID0gbmV3IFF1ZXVlKCk7XG5cdHJldHVybiAocGF5bG9hZCkgPT4gcXVldWUuZW5xdWV1ZSgoKSA9PiBoYW5kbGVyKHBheWxvYWQpKTtcbn1cbnZhciBRdWV1ZSA9IGNsYXNzIHtcblx0cXVldWUgPSBbXTtcblx0cGVuZGluZyA9ICExO1xuXHRlbnF1ZXVlKHByb21pc2UpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5xdWV1ZS5wdXNoKHtcblx0XHRcdFx0cHJvbWlzZSxcblx0XHRcdFx0cmVzb2x2ZSxcblx0XHRcdFx0cmVqZWN0XG5cdFx0XHR9KSwgdGhpcy5kZXF1ZXVlKCk7XG5cdFx0fSk7XG5cdH1cblx0ZGVxdWV1ZSgpIHtcblx0XHRpZiAodGhpcy5wZW5kaW5nKSByZXR1cm4gITE7XG5cdFx0bGV0IGl0ZW0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cdFx0cmV0dXJuIGl0ZW0gPyAodGhpcy5wZW5kaW5nID0gITAsIGl0ZW0ucHJvbWlzZSgpLnRoZW4oaXRlbS5yZXNvbHZlKS5jYXRjaChpdGVtLnJlamVjdCkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHR0aGlzLnBlbmRpbmcgPSAhMSwgdGhpcy5kZXF1ZXVlKCk7XG5cdFx0fSksICEwKSA6ICExO1xuXHR9XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvaG1ySGFuZGxlci50c1xuZnVuY3Rpb24gY3JlYXRlSE1SSGFuZGxlckZvclJ1bm5lcihydW5uZXIpIHtcblx0cmV0dXJuIGNyZWF0ZUhNUkhhbmRsZXIoYXN5bmMgKHBheWxvYWQpID0+IHtcblx0XHRsZXQgaG1yQ2xpZW50ID0gcnVubmVyLmhtckNsaWVudDtcblx0XHRpZiAoISghaG1yQ2xpZW50IHx8IHJ1bm5lci5pc0Nsb3NlZCgpKSkgc3dpdGNoIChwYXlsb2FkLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJjb25uZWN0ZWRcIjpcblx0XHRcdFx0aG1yQ2xpZW50LmxvZ2dlci5kZWJ1ZyhcImNvbm5lY3RlZC5cIik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcInVwZGF0ZVwiOlxuXHRcdFx0XHRhd2FpdCBobXJDbGllbnQubm90aWZ5TGlzdGVuZXJzKFwidml0ZTpiZWZvcmVVcGRhdGVcIiwgcGF5bG9hZCksIGF3YWl0IFByb21pc2UuYWxsKHBheWxvYWQudXBkYXRlcy5tYXAoYXN5bmMgKHVwZGF0ZSkgPT4ge1xuXHRcdFx0XHRcdGlmICh1cGRhdGUudHlwZSA9PT0gXCJqcy11cGRhdGVcIikgcmV0dXJuIHVwZGF0ZS5hY2NlcHRlZFBhdGggPSB1bndyYXBJZCh1cGRhdGUuYWNjZXB0ZWRQYXRoKSwgdXBkYXRlLnBhdGggPSB1bndyYXBJZCh1cGRhdGUucGF0aCksIGhtckNsaWVudC5xdWV1ZVVwZGF0ZSh1cGRhdGUpO1xuXHRcdFx0XHRcdGhtckNsaWVudC5sb2dnZXIuZXJyb3IoXCJjc3MgaG1yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcnVubmVyIG1vZGUuXCIpO1xuXHRcdFx0XHR9KSksIGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmFmdGVyVXBkYXRlXCIsIHBheWxvYWQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJjdXN0b21cIjpcblx0XHRcdFx0YXdhaXQgaG1yQ2xpZW50Lm5vdGlmeUxpc3RlbmVycyhwYXlsb2FkLmV2ZW50LCBwYXlsb2FkLmRhdGEpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJmdWxsLXJlbG9hZFwiOiB7XG5cdFx0XHRcdGxldCB7IHRyaWdnZXJlZEJ5IH0gPSBwYXlsb2FkLCBjbGVhckVudHJ5cG9pbnRVcmxzID0gdHJpZ2dlcmVkQnkgPyBnZXRNb2R1bGVzRW50cnlwb2ludHMocnVubmVyLCBnZXRNb2R1bGVzQnlGaWxlKHJ1bm5lciwgc2xhc2godHJpZ2dlcmVkQnkpKSkgOiBmaW5kQWxsRW50cnlwb2ludHMocnVubmVyKTtcblx0XHRcdFx0aWYgKCFjbGVhckVudHJ5cG9pbnRVcmxzLnNpemUpIGJyZWFrO1xuXHRcdFx0XHRobXJDbGllbnQubG9nZ2VyLmRlYnVnKFwicHJvZ3JhbSByZWxvYWRcIiksIGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmJlZm9yZUZ1bGxSZWxvYWRcIiwgcGF5bG9hZCksIHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmNsZWFyKCk7XG5cdFx0XHRcdGZvciAobGV0IHVybCBvZiBjbGVhckVudHJ5cG9pbnRVcmxzKSB7XG5cdFx0XHRcdFx0aWYgKHJ1bm5lci5pc0Nsb3NlZCgpKSBicmVhaztcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgcnVubmVyLmltcG9ydCh1cmwpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdFx0aWYgKHJ1bm5lci5pc0Nsb3NlZCgpKSBicmVhaztcblx0XHRcdFx0XHRcdGVyci5jb2RlICE9PSBcIkVSUl9PVVREQVRFRF9PUFRJTUlaRURfREVQXCIgJiYgaG1yQ2xpZW50LmxvZ2dlci5lcnJvcihgQW4gZXJyb3IgaGFwcGVuZWQgZHVyaW5nIGZ1bGwgcmVsb2FkXFxuJHtlcnIubWVzc2FnZX1cXG4ke2Vyci5zdGFja31gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwicHJ1bmVcIjpcblx0XHRcdFx0YXdhaXQgaG1yQ2xpZW50Lm5vdGlmeUxpc3RlbmVycyhcInZpdGU6YmVmb3JlUHJ1bmVcIiwgcGF5bG9hZCksIGF3YWl0IGhtckNsaWVudC5wcnVuZVBhdGhzKHBheWxvYWQucGF0aHMpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJlcnJvclwiOiB7XG5cdFx0XHRcdGF3YWl0IGhtckNsaWVudC5ub3RpZnlMaXN0ZW5lcnMoXCJ2aXRlOmVycm9yXCIsIHBheWxvYWQpO1xuXHRcdFx0XHRsZXQgZXJyID0gcGF5bG9hZC5lcnI7XG5cdFx0XHRcdGhtckNsaWVudC5sb2dnZXIuZXJyb3IoYEludGVybmFsIFNlcnZlciBFcnJvclxcbiR7ZXJyLm1lc3NhZ2V9XFxuJHtlcnIuc3RhY2t9YCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcInBpbmdcIjogYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiByZXR1cm4gcGF5bG9hZDtcblx0XHR9XG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0TW9kdWxlc0J5RmlsZShydW5uZXIsIGZpbGUpIHtcblx0bGV0IG5vZGVzID0gcnVubmVyLmV2YWx1YXRlZE1vZHVsZXMuZ2V0TW9kdWxlc0J5RmlsZShmaWxlKTtcblx0cmV0dXJuIG5vZGVzID8gWy4uLm5vZGVzXS5tYXAoKG5vZGUpID0+IG5vZGUuaWQpIDogW107XG59XG5mdW5jdGlvbiBnZXRNb2R1bGVzRW50cnlwb2ludHMocnVubmVyLCBtb2R1bGVzLCB2aXNpdGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwgZW50cnlwb2ludHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSB7XG5cdGZvciAobGV0IG1vZHVsZUlkIG9mIG1vZHVsZXMpIHtcblx0XHRpZiAodmlzaXRlZC5oYXMobW9kdWxlSWQpKSBjb250aW51ZTtcblx0XHR2aXNpdGVkLmFkZChtb2R1bGVJZCk7XG5cdFx0bGV0IG1vZHVsZSA9IHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzLmdldE1vZHVsZUJ5SWQobW9kdWxlSWQpO1xuXHRcdGlmIChtb2R1bGUpIHtcblx0XHRcdGlmICghbW9kdWxlLmltcG9ydGVycy5zaXplKSB7XG5cdFx0XHRcdGVudHJ5cG9pbnRzLmFkZChtb2R1bGUudXJsKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpbXBvcnRlciBvZiBtb2R1bGUuaW1wb3J0ZXJzKSBnZXRNb2R1bGVzRW50cnlwb2ludHMocnVubmVyLCBbaW1wb3J0ZXJdLCB2aXNpdGVkLCBlbnRyeXBvaW50cyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBlbnRyeXBvaW50cztcbn1cbmZ1bmN0aW9uIGZpbmRBbGxFbnRyeXBvaW50cyhydW5uZXIsIGVudHJ5cG9pbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSkge1xuXHRmb3IgKGxldCBtb2Qgb2YgcnVubmVyLmV2YWx1YXRlZE1vZHVsZXMuaWRUb01vZHVsZU1hcC52YWx1ZXMoKSkgbW9kLmltcG9ydGVycy5zaXplIHx8IGVudHJ5cG9pbnRzLmFkZChtb2QudXJsKTtcblx0cmV0dXJuIGVudHJ5cG9pbnRzO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvc291cmNlbWFwL2ludGVyY2VwdG9yLnRzXG5jb25zdCBzb3VyY2VNYXBDYWNoZSA9IHt9LCBmaWxlQ29udGVudHNDYWNoZSA9IHt9LCBldmFsdWF0ZWRNb2R1bGVzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCByZXRyaWV2ZUZpbGVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIHJldHJpZXZlU291cmNlTWFwSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBjcmVhdGVFeGVjSGFuZGxlcnMgPSAoaGFuZGxlcnMpID0+ICgoLi4uYXJncykgPT4ge1xuXHRmb3IgKGxldCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG5cdFx0bGV0IHJlc3VsdCA9IGhhbmRsZXIoLi4uYXJncyk7XG5cdFx0aWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcblx0fVxuXHRyZXR1cm4gbnVsbDtcbn0pLCByZXRyaWV2ZUZpbGVGcm9tSGFuZGxlcnMgPSBjcmVhdGVFeGVjSGFuZGxlcnMocmV0cmlldmVGaWxlSGFuZGxlcnMpLCByZXRyaWV2ZVNvdXJjZU1hcEZyb21IYW5kbGVycyA9IGNyZWF0ZUV4ZWNIYW5kbGVycyhyZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzKTtcbmxldCBvdmVycmlkZGVuID0gITE7XG5jb25zdCBvcmlnaW5hbFByZXBhcmUgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbmZ1bmN0aW9uIHJlc2V0SW50ZXJjZXB0b3IocnVubmVyLCBvcHRpb25zKSB7XG5cdGV2YWx1YXRlZE1vZHVsZXNDYWNoZS5kZWxldGUocnVubmVyLmV2YWx1YXRlZE1vZHVsZXMpLCBvcHRpb25zLnJldHJpZXZlRmlsZSAmJiByZXRyaWV2ZUZpbGVIYW5kbGVycy5kZWxldGUob3B0aW9ucy5yZXRyaWV2ZUZpbGUpLCBvcHRpb25zLnJldHJpZXZlU291cmNlTWFwICYmIHJldHJpZXZlU291cmNlTWFwSGFuZGxlcnMuZGVsZXRlKG9wdGlvbnMucmV0cmlldmVTb3VyY2VNYXApLCBldmFsdWF0ZWRNb2R1bGVzQ2FjaGUuc2l6ZSA9PT0gMCAmJiAoRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBvcmlnaW5hbFByZXBhcmUsIG92ZXJyaWRkZW4gPSAhMSk7XG59XG5mdW5jdGlvbiBpbnRlcmNlcHRTdGFja1RyYWNlKHJ1bm5lciwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBvdmVycmlkZGVuIHx8PSAoRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmVwYXJlU3RhY2tUcmFjZSwgITApLCBldmFsdWF0ZWRNb2R1bGVzQ2FjaGUuYWRkKHJ1bm5lci5ldmFsdWF0ZWRNb2R1bGVzKSwgb3B0aW9ucy5yZXRyaWV2ZUZpbGUgJiYgcmV0cmlldmVGaWxlSGFuZGxlcnMuYWRkKG9wdGlvbnMucmV0cmlldmVGaWxlKSwgb3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCAmJiByZXRyaWV2ZVNvdXJjZU1hcEhhbmRsZXJzLmFkZChvcHRpb25zLnJldHJpZXZlU291cmNlTWFwKSwgKCkgPT4gcmVzZXRJbnRlcmNlcHRvcihydW5uZXIsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc3VwcG9ydFJlbGF0aXZlVVJMKGZpbGUsIHVybCkge1xuXHRpZiAoIWZpbGUpIHJldHVybiB1cmw7XG5cdGxldCBkaXIgPSBwb3NpeERpcm5hbWUoc2xhc2goZmlsZSkpLCBtYXRjaCA9IC9eXFx3KzpcXC9cXC9bXi9dKi8uZXhlYyhkaXIpLCBwcm90b2NvbCA9IG1hdGNoID8gbWF0Y2hbMF0gOiBcIlwiLCBzdGFydFBhdGggPSBkaXIuc2xpY2UocHJvdG9jb2wubGVuZ3RoKTtcblx0cmV0dXJuIHByb3RvY29sICYmIC9eXFwvXFx3Oi8udGVzdChzdGFydFBhdGgpID8gKHByb3RvY29sICs9IFwiL1wiLCBwcm90b2NvbCArIHNsYXNoKHBvc2l4UmVzb2x2ZShzdGFydFBhdGgsIHVybCkpKSA6IHByb3RvY29sICsgcG9zaXhSZXNvbHZlKHN0YXJ0UGF0aCwgdXJsKTtcbn1cbmZ1bmN0aW9uIGdldFJ1bm5lclNvdXJjZU1hcChwb3NpdGlvbikge1xuXHRmb3IgKGxldCBtb2R1bGVHcmFwaCBvZiBldmFsdWF0ZWRNb2R1bGVzQ2FjaGUpIHtcblx0XHRsZXQgc291cmNlTWFwID0gbW9kdWxlR3JhcGguZ2V0TW9kdWxlU291cmNlTWFwQnlJZChwb3NpdGlvbi5zb3VyY2UpO1xuXHRcdGlmIChzb3VyY2VNYXApIHJldHVybiB7XG5cdFx0XHR1cmw6IHBvc2l0aW9uLnNvdXJjZSxcblx0XHRcdG1hcDogc291cmNlTWFwLFxuXHRcdFx0dml0ZTogITBcblx0XHR9O1xuXHR9XG5cdHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmV0cmlldmVGaWxlKHBhdGgpIHtcblx0aWYgKHBhdGggaW4gZmlsZUNvbnRlbnRzQ2FjaGUpIHJldHVybiBmaWxlQ29udGVudHNDYWNoZVtwYXRoXTtcblx0bGV0IGNvbnRlbnQgPSByZXRyaWV2ZUZpbGVGcm9tSGFuZGxlcnMocGF0aCk7XG5cdHJldHVybiB0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiID8gKGZpbGVDb250ZW50c0NhY2hlW3BhdGhdID0gY29udGVudCwgY29udGVudCkgOiBudWxsO1xufVxuZnVuY3Rpb24gcmV0cmlldmVTb3VyY2VNYXBVUkwoc291cmNlKSB7XG5cdGxldCBmaWxlRGF0YSA9IHJldHJpZXZlRmlsZShzb3VyY2UpO1xuXHRpZiAoIWZpbGVEYXRhKSByZXR1cm4gbnVsbDtcblx0bGV0IHJlID0gL1xcL1xcL1tAI11cXHMqc291cmNlTWFwcGluZ1VSTD0oW15cXHMnXCJdKylcXHMqJHxcXC9cXCpbQCNdXFxzKnNvdXJjZU1hcHBpbmdVUkw9W15cXHMqJ1wiXStcXHMqXFwqXFwvXFxzKiQvZ20sIGxhc3RNYXRjaCwgbWF0Y2g7XG5cdGZvciAoOyBtYXRjaCA9IHJlLmV4ZWMoZmlsZURhdGEpOykgbGFzdE1hdGNoID0gbWF0Y2g7XG5cdHJldHVybiBsYXN0TWF0Y2ggPyBsYXN0TWF0Y2hbMV0gOiBudWxsO1xufVxuY29uc3QgcmVTb3VyY2VNYXAgPSAvXmRhdGE6YXBwbGljYXRpb25cXC9qc29uW14sXStiYXNlNjQsLztcbmZ1bmN0aW9uIHJldHJpZXZlU291cmNlTWFwKHNvdXJjZSkge1xuXHRsZXQgdXJsQW5kTWFwID0gcmV0cmlldmVTb3VyY2VNYXBGcm9tSGFuZGxlcnMoc291cmNlKTtcblx0aWYgKHVybEFuZE1hcCkgcmV0dXJuIHVybEFuZE1hcDtcblx0bGV0IHNvdXJjZU1hcHBpbmdVUkwgPSByZXRyaWV2ZVNvdXJjZU1hcFVSTChzb3VyY2UpO1xuXHRpZiAoIXNvdXJjZU1hcHBpbmdVUkwpIHJldHVybiBudWxsO1xuXHRsZXQgc291cmNlTWFwRGF0YTtcblx0aWYgKHJlU291cmNlTWFwLnRlc3Qoc291cmNlTWFwcGluZ1VSTCkpIHtcblx0XHRsZXQgcmF3RGF0YSA9IHNvdXJjZU1hcHBpbmdVUkwuc2xpY2Uoc291cmNlTWFwcGluZ1VSTC5pbmRleE9mKFwiLFwiKSArIDEpO1xuXHRcdHNvdXJjZU1hcERhdGEgPSBCdWZmZXIuZnJvbShyYXdEYXRhLCBcImJhc2U2NFwiKS50b1N0cmluZygpLCBzb3VyY2VNYXBwaW5nVVJMID0gc291cmNlO1xuXHR9IGVsc2Ugc291cmNlTWFwcGluZ1VSTCA9IHN1cHBvcnRSZWxhdGl2ZVVSTChzb3VyY2UsIHNvdXJjZU1hcHBpbmdVUkwpLCBzb3VyY2VNYXBEYXRhID0gcmV0cmlldmVGaWxlKHNvdXJjZU1hcHBpbmdVUkwpO1xuXHRyZXR1cm4gc291cmNlTWFwRGF0YSA/IHtcblx0XHR1cmw6IHNvdXJjZU1hcHBpbmdVUkwsXG5cdFx0bWFwOiBzb3VyY2VNYXBEYXRhXG5cdH0gOiBudWxsO1xufVxuZnVuY3Rpb24gbWFwU291cmNlUG9zaXRpb24ocG9zaXRpb24pIHtcblx0aWYgKCFwb3NpdGlvbi5zb3VyY2UpIHJldHVybiBwb3NpdGlvbjtcblx0bGV0IHNvdXJjZU1hcCA9IGdldFJ1bm5lclNvdXJjZU1hcChwb3NpdGlvbik7XG5cdGlmIChzb3VyY2VNYXAgfHw9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0sICFzb3VyY2VNYXApIHtcblx0XHRsZXQgdXJsQW5kTWFwID0gcmV0cmlldmVTb3VyY2VNYXAocG9zaXRpb24uc291cmNlKTtcblx0XHRpZiAodXJsQW5kTWFwICYmIHVybEFuZE1hcC5tYXApIHtcblx0XHRcdGxldCB1cmwgPSB1cmxBbmRNYXAudXJsO1xuXHRcdFx0c291cmNlTWFwID0gc291cmNlTWFwQ2FjaGVbcG9zaXRpb24uc291cmNlXSA9IHtcblx0XHRcdFx0dXJsLFxuXHRcdFx0XHRtYXA6IG5ldyBEZWNvZGVkTWFwKHR5cGVvZiB1cmxBbmRNYXAubWFwID09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHVybEFuZE1hcC5tYXApIDogdXJsQW5kTWFwLm1hcCwgdXJsKVxuXHRcdFx0fTtcblx0XHRcdGxldCBjb250ZW50cyA9IHNvdXJjZU1hcC5tYXA/Lm1hcC5zb3VyY2VzQ29udGVudDtcblx0XHRcdHNvdXJjZU1hcC5tYXAgJiYgY29udGVudHMgJiYgc291cmNlTWFwLm1hcC5yZXNvbHZlZFNvdXJjZXMuZm9yRWFjaCgoc291cmNlLCBpKSA9PiB7XG5cdFx0XHRcdGxldCBjb250ZW50ID0gY29udGVudHNbaV07XG5cdFx0XHRcdGlmIChjb250ZW50ICYmIHNvdXJjZSAmJiB1cmwpIHtcblx0XHRcdFx0XHRsZXQgY29udGVudFVybCA9IHN1cHBvcnRSZWxhdGl2ZVVSTCh1cmwsIHNvdXJjZSk7XG5cdFx0XHRcdFx0ZmlsZUNvbnRlbnRzQ2FjaGVbY29udGVudFVybF0gPSBjb250ZW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Ugc291cmNlTWFwID0gc291cmNlTWFwQ2FjaGVbcG9zaXRpb24uc291cmNlXSA9IHtcblx0XHRcdHVybDogbnVsbCxcblx0XHRcdG1hcDogbnVsbFxuXHRcdH07XG5cdH1cblx0aWYgKHNvdXJjZU1hcC5tYXAgJiYgc291cmNlTWFwLnVybCkge1xuXHRcdGxldCBvcmlnaW5hbFBvc2l0aW9uID0gZ2V0T3JpZ2luYWxQb3NpdGlvbihzb3VyY2VNYXAubWFwLCBwb3NpdGlvbik7XG5cdFx0aWYgKG9yaWdpbmFsUG9zaXRpb24gJiYgb3JpZ2luYWxQb3NpdGlvbi5zb3VyY2UgIT0gbnVsbCkgcmV0dXJuIG9yaWdpbmFsUG9zaXRpb24uc291cmNlID0gc3VwcG9ydFJlbGF0aXZlVVJMKHNvdXJjZU1hcC51cmwsIG9yaWdpbmFsUG9zaXRpb24uc291cmNlKSwgc291cmNlTWFwLnZpdGUgJiYgKG9yaWdpbmFsUG9zaXRpb24uX3ZpdGUgPSAhMCksIG9yaWdpbmFsUG9zaXRpb247XG5cdH1cblx0cmV0dXJuIHBvc2l0aW9uO1xufVxuZnVuY3Rpb24gbWFwRXZhbE9yaWdpbihvcmlnaW4pIHtcblx0bGV0IG1hdGNoID0gL15ldmFsIGF0IChbXihdKykgXFwoKC4rKTooXFxkKyk6KFxcZCspXFwpJC8uZXhlYyhvcmlnaW4pO1xuXHRpZiAobWF0Y2gpIHtcblx0XHRsZXQgcG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbih7XG5cdFx0XHRuYW1lOiBudWxsLFxuXHRcdFx0c291cmNlOiBtYXRjaFsyXSxcblx0XHRcdGxpbmU6ICttYXRjaFszXSxcblx0XHRcdGNvbHVtbjogbWF0Y2hbNF0gLSAxXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGBldmFsIGF0ICR7bWF0Y2hbMV19ICgke3Bvc2l0aW9uLnNvdXJjZX06JHtwb3NpdGlvbi5saW5lfToke3Bvc2l0aW9uLmNvbHVtbiArIDF9KWA7XG5cdH1cblx0cmV0dXJuIG1hdGNoID0gL15ldmFsIGF0IChbXihdKykgXFwoKC4rKVxcKSQvLmV4ZWMob3JpZ2luKSwgbWF0Y2ggPyBgZXZhbCBhdCAke21hdGNoWzFdfSAoJHttYXBFdmFsT3JpZ2luKG1hdGNoWzJdKX0pYCA6IG9yaWdpbjtcbn1cbmZ1bmN0aW9uIENhbGxTaXRlVG9TdHJpbmcoKSB7XG5cdGxldCBmaWxlTmFtZSwgZmlsZUxvY2F0aW9uID0gXCJcIjtcblx0aWYgKHRoaXMuaXNOYXRpdmUoKSkgZmlsZUxvY2F0aW9uID0gXCJuYXRpdmVcIjtcblx0ZWxzZSB7XG5cdFx0ZmlsZU5hbWUgPSB0aGlzLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCgpLCAhZmlsZU5hbWUgJiYgdGhpcy5pc0V2YWwoKSAmJiAoZmlsZUxvY2F0aW9uID0gdGhpcy5nZXRFdmFsT3JpZ2luKCksIGZpbGVMb2NhdGlvbiArPSBcIiwgXCIpLCBmaWxlTmFtZSA/IGZpbGVMb2NhdGlvbiArPSBmaWxlTmFtZSA6IGZpbGVMb2NhdGlvbiArPSBcIjxhbm9ueW1vdXM+XCI7XG5cdFx0bGV0IGxpbmVOdW1iZXIgPSB0aGlzLmdldExpbmVOdW1iZXIoKTtcblx0XHRpZiAobGluZU51bWJlciAhPSBudWxsKSB7XG5cdFx0XHRmaWxlTG9jYXRpb24gKz0gYDoke2xpbmVOdW1iZXJ9YDtcblx0XHRcdGxldCBjb2x1bW5OdW1iZXIgPSB0aGlzLmdldENvbHVtbk51bWJlcigpO1xuXHRcdFx0Y29sdW1uTnVtYmVyICYmIChmaWxlTG9jYXRpb24gKz0gYDoke2NvbHVtbk51bWJlcn1gKTtcblx0XHR9XG5cdH1cblx0bGV0IGxpbmUgPSBcIlwiLCBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldEZ1bmN0aW9uTmFtZSgpLCBhZGRTdWZmaXggPSAhMCwgaXNDb25zdHJ1Y3RvciA9IHRoaXMuaXNDb25zdHJ1Y3RvcigpO1xuXHRpZiAodGhpcy5pc1RvcGxldmVsKCkgfHwgaXNDb25zdHJ1Y3RvcikgaXNDb25zdHJ1Y3RvciA/IGxpbmUgKz0gYG5ldyAke2Z1bmN0aW9uTmFtZSB8fCBcIjxhbm9ueW1vdXM+XCJ9YCA6IGZ1bmN0aW9uTmFtZSA/IGxpbmUgKz0gZnVuY3Rpb25OYW1lIDogKGxpbmUgKz0gZmlsZUxvY2F0aW9uLCBhZGRTdWZmaXggPSAhMSk7XG5cdGVsc2Uge1xuXHRcdGxldCB0eXBlTmFtZSA9IHRoaXMuZ2V0VHlwZU5hbWUoKTtcblx0XHR0eXBlTmFtZSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIiAmJiAodHlwZU5hbWUgPSBcIm51bGxcIik7XG5cdFx0bGV0IG1ldGhvZE5hbWUgPSB0aGlzLmdldE1ldGhvZE5hbWUoKTtcblx0XHRmdW5jdGlvbk5hbWUgPyAodHlwZU5hbWUgJiYgZnVuY3Rpb25OYW1lLmluZGV4T2YodHlwZU5hbWUpICE9PSAwICYmIChsaW5lICs9IGAke3R5cGVOYW1lfS5gKSwgbGluZSArPSBmdW5jdGlvbk5hbWUsIG1ldGhvZE5hbWUgJiYgZnVuY3Rpb25OYW1lLmluZGV4T2YoYC4ke21ldGhvZE5hbWV9YCkgIT09IGZ1bmN0aW9uTmFtZS5sZW5ndGggLSBtZXRob2ROYW1lLmxlbmd0aCAtIDEgJiYgKGxpbmUgKz0gYCBbYXMgJHttZXRob2ROYW1lfV1gKSkgOiBsaW5lICs9IGAke3R5cGVOYW1lfS4ke21ldGhvZE5hbWUgfHwgXCI8YW5vbnltb3VzPlwifWA7XG5cdH1cblx0cmV0dXJuIGFkZFN1ZmZpeCAmJiAobGluZSArPSBgICgke2ZpbGVMb2NhdGlvbn0pYCksIGxpbmU7XG59XG5mdW5jdGlvbiBjbG9uZUNhbGxTaXRlKGZyYW1lKSB7XG5cdGxldCBvYmplY3QgPSB7fTtcblx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihmcmFtZSkpLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRsZXQga2V5ID0gbmFtZTtcblx0XHRvYmplY3Rba2V5XSA9IC9eKD86aXN8Z2V0KS8udGVzdChuYW1lKSA/IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGZyYW1lW2tleV0uY2FsbChmcmFtZSk7XG5cdFx0fSA6IGZyYW1lW2tleV07XG5cdH0pLCBvYmplY3QudG9TdHJpbmcgPSBDYWxsU2l0ZVRvU3RyaW5nLCBvYmplY3Q7XG59XG5mdW5jdGlvbiB3cmFwQ2FsbFNpdGUoZnJhbWUsIHN0YXRlKSB7XG5cdGlmIChzdGF0ZSA9PT0gdm9pZCAwICYmIChzdGF0ZSA9IHtcblx0XHRuZXh0UG9zaXRpb246IG51bGwsXG5cdFx0Y3VyUG9zaXRpb246IG51bGxcblx0fSksIGZyYW1lLmlzTmF0aXZlKCkpIHJldHVybiBzdGF0ZS5jdXJQb3NpdGlvbiA9IG51bGwsIGZyYW1lO1xuXHRsZXQgc291cmNlID0gZnJhbWUuZ2V0RmlsZU5hbWUoKSB8fCBmcmFtZS5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKTtcblx0aWYgKHNvdXJjZSkge1xuXHRcdGxldCBwb3NpdGlvbiA9IG1hcFNvdXJjZVBvc2l0aW9uKHtcblx0XHRcdG5hbWU6IG51bGwsXG5cdFx0XHRzb3VyY2UsXG5cdFx0XHRsaW5lOiBmcmFtZS5nZXRMaW5lTnVtYmVyKCkgPz8gMCxcblx0XHRcdGNvbHVtbjogKGZyYW1lLmdldENvbHVtbk51bWJlcigpID8/IDEpIC0gMVxuXHRcdH0pO1xuXHRcdHN0YXRlLmN1clBvc2l0aW9uID0gcG9zaXRpb24sIGZyYW1lID0gY2xvbmVDYWxsU2l0ZShmcmFtZSk7XG5cdFx0bGV0IG9yaWdpbmFsRnVuY3Rpb25OYW1lID0gZnJhbWUuZ2V0RnVuY3Rpb25OYW1lO1xuXHRcdHJldHVybiBmcmFtZS5nZXRGdW5jdGlvbk5hbWUgPSBmdW5jdGlvbigpIHtcblx0XHRcdGxldCBuYW1lID0gc3RhdGUubmV4dFBvc2l0aW9uID09IG51bGwgPyBvcmlnaW5hbEZ1bmN0aW9uTmFtZSgpIDogc3RhdGUubmV4dFBvc2l0aW9uLm5hbWUgfHwgb3JpZ2luYWxGdW5jdGlvbk5hbWUoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImV2YWxcIiAmJiBcIl92aXRlXCIgaW4gcG9zaXRpb24gPyBudWxsIDogbmFtZTtcblx0XHR9LCBmcmFtZS5nZXRGaWxlTmFtZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHBvc2l0aW9uLnNvdXJjZSA/PyBudWxsO1xuXHRcdH0sIGZyYW1lLmdldExpbmVOdW1iZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBwb3NpdGlvbi5saW5lO1xuXHRcdH0sIGZyYW1lLmdldENvbHVtbk51bWJlciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHBvc2l0aW9uLmNvbHVtbiArIDE7XG5cdFx0fSwgZnJhbWUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcG9zaXRpb24uc291cmNlO1xuXHRcdH0sIGZyYW1lO1xuXHR9XG5cdGxldCBvcmlnaW4gPSBmcmFtZS5pc0V2YWwoKSAmJiBmcmFtZS5nZXRFdmFsT3JpZ2luKCk7XG5cdHJldHVybiBvcmlnaW4gPyAob3JpZ2luID0gbWFwRXZhbE9yaWdpbihvcmlnaW4pLCBmcmFtZSA9IGNsb25lQ2FsbFNpdGUoZnJhbWUpLCBmcmFtZS5nZXRFdmFsT3JpZ2luID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG9yaWdpbiB8fCB2b2lkIDA7XG5cdH0sIGZyYW1lKSA6IGZyYW1lO1xufVxuZnVuY3Rpb24gcHJlcGFyZVN0YWNrVHJhY2UoZXJyb3IsIHN0YWNrKSB7XG5cdGxldCBlcnJvclN0cmluZyA9IGAke2Vycm9yLm5hbWUgfHwgXCJFcnJvclwifTogJHtlcnJvci5tZXNzYWdlIHx8IFwiXCJ9YCwgc3RhdGUgPSB7XG5cdFx0bmV4dFBvc2l0aW9uOiBudWxsLFxuXHRcdGN1clBvc2l0aW9uOiBudWxsXG5cdH0sIHByb2Nlc3NlZFN0YWNrID0gW107XG5cdGZvciAobGV0IGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgcHJvY2Vzc2VkU3RhY2sucHVzaChgXFxuICAgIGF0ICR7d3JhcENhbGxTaXRlKHN0YWNrW2ldLCBzdGF0ZSl9YCksIHN0YXRlLm5leHRQb3NpdGlvbiA9IHN0YXRlLmN1clBvc2l0aW9uO1xuXHRyZXR1cm4gc3RhdGUuY3VyUG9zaXRpb24gPSBzdGF0ZS5uZXh0UG9zaXRpb24gPSBudWxsLCBlcnJvclN0cmluZyArIHByb2Nlc3NlZFN0YWNrLnJldmVyc2UoKS5qb2luKFwiXCIpO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvc291cmNlbWFwL2luZGV4LnRzXG5mdW5jdGlvbiBlbmFibGVTb3VyY2VNYXBTdXBwb3J0KHJ1bm5lcikge1xuXHRpZiAocnVubmVyLm9wdGlvbnMuc291cmNlbWFwSW50ZXJjZXB0b3IgPT09IFwibm9kZVwiKSB7XG5cdFx0aWYgKHR5cGVvZiBwcm9jZXNzID4gXCJ1XCIpIHRocm93IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgXFxcInNvdXJjZW1hcEludGVyY2VwdG9yOiAnbm9kZSdcXFwiIGJlY2F1c2UgZ2xvYmFsIFxcXCJwcm9jZXNzXFxcIiB2YXJpYWJsZSBpcyBub3QgYXZhaWxhYmxlLlwiKTtcblx0XHRpZiAodHlwZW9mIHByb2Nlc3Muc2V0U291cmNlTWFwc0VuYWJsZWQgIT0gXCJmdW5jdGlvblwiKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlIFxcXCJzb3VyY2VtYXBJbnRlcmNlcHRvcjogJ25vZGUnXFxcIiBiZWNhdXNlIFxcXCJwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkXFxcIiBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgdXNlIE5vZGUgPj0gMTYuNi4wLlwiKTtcblx0XHRsZXQgaXNFbmFibGVkQWxyZWFkeSA9IHByb2Nlc3Muc291cmNlTWFwc0VuYWJsZWQgPz8gITE7XG5cdFx0cmV0dXJuIHByb2Nlc3Muc2V0U291cmNlTWFwc0VuYWJsZWQoITApLCAoKSA9PiAhaXNFbmFibGVkQWxyZWFkeSAmJiBwcm9jZXNzLnNldFNvdXJjZU1hcHNFbmFibGVkKCExKTtcblx0fVxuXHRyZXR1cm4gaW50ZXJjZXB0U3RhY2tUcmFjZShydW5uZXIsIHR5cGVvZiBydW5uZXIub3B0aW9ucy5zb3VyY2VtYXBJbnRlcmNlcHRvciA9PSBcIm9iamVjdFwiID8gcnVubmVyLm9wdGlvbnMuc291cmNlbWFwSW50ZXJjZXB0b3IgOiB2b2lkIDApO1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvZXNtRXZhbHVhdG9yLnRzXG52YXIgRVNNb2R1bGVzRXZhbHVhdG9yID0gY2xhc3Mge1xuXHRzdGFydE9mZnNldCA9IGdldEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvblBhZGRpbmdMaW5lQ291bnQoKTtcblx0YXN5bmMgcnVuSW5saW5lZE1vZHVsZShjb250ZXh0LCBjb2RlKSB7XG5cdFx0YXdhaXQgbmV3IEFzeW5jRnVuY3Rpb24oc3NyTW9kdWxlRXhwb3J0c0tleSwgc3NySW1wb3J0TWV0YUtleSwgc3NySW1wb3J0S2V5LCBzc3JEeW5hbWljSW1wb3J0S2V5LCBzc3JFeHBvcnRBbGxLZXksIHNzckV4cG9ydE5hbWVLZXksIFwiXFxcInVzZSBzdHJpY3RcXFwiO1wiICsgY29kZSkoY29udGV4dFtzc3JNb2R1bGVFeHBvcnRzS2V5XSwgY29udGV4dFtzc3JJbXBvcnRNZXRhS2V5XSwgY29udGV4dFtzc3JJbXBvcnRLZXldLCBjb250ZXh0W3NzckR5bmFtaWNJbXBvcnRLZXldLCBjb250ZXh0W3NzckV4cG9ydEFsbEtleV0sIGNvbnRleHRbc3NyRXhwb3J0TmFtZUtleV0pLCBPYmplY3Quc2VhbChjb250ZXh0W3Nzck1vZHVsZUV4cG9ydHNLZXldKTtcblx0fVxuXHRydW5FeHRlcm5hbE1vZHVsZShmaWxlcGF0aCkge1xuXHRcdHJldHVybiBpbXBvcnQoZmlsZXBhdGgpO1xuXHR9XG59O1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvaW1wb3J0TWV0YVJlc29sdmVyLnRzXG5jb25zdCBjdXN0b21pemF0aW9uSG9va05hbWVzcGFjZSA9IFwidml0ZS1tb2R1bGUtcnVubmVyOmltcG9ydC1tZXRhLXJlc29sdmUvdjEvXCIsIGN1c3RvbWl6YXRpb25Ib29rc01vZHVsZSA9IGBcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmUoc3BlY2lmaWVyLCBjb250ZXh0LCBuZXh0UmVzb2x2ZSkge1xuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJHtKU09OLnN0cmluZ2lmeShjdXN0b21pemF0aW9uSG9va05hbWVzcGFjZSl9KSkge1xuICAgIGNvbnN0IGRhdGEgPSBzcGVjaWZpZXIuc2xpY2UoJHtKU09OLnN0cmluZ2lmeShjdXN0b21pemF0aW9uSG9va05hbWVzcGFjZSl9Lmxlbmd0aClcbiAgICBjb25zdCBbcGFyc2VkU3BlY2lmaWVyLCBwYXJzZWRJbXBvcnRlcl0gPSBKU09OLnBhcnNlKGRhdGEpXG4gICAgc3BlY2lmaWVyID0gcGFyc2VkU3BlY2lmaWVyXG4gICAgY29udGV4dC5wYXJlbnRVUkwgPSBwYXJzZWRJbXBvcnRlclxuICB9XG4gIHJldHVybiBuZXh0UmVzb2x2ZShzcGVjaWZpZXIsIGNvbnRleHQpXG59XG5cbmA7XG5mdW5jdGlvbiBjdXN0b21pemF0aW9uSG9va1Jlc29sdmUoc3BlY2lmaWVyLCBjb250ZXh0LCBuZXh0UmVzb2x2ZSkge1xuXHRpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoY3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2UpKSB7XG5cdFx0bGV0IGRhdGEgPSBzcGVjaWZpZXIuc2xpY2UoNDIpLCBbcGFyc2VkU3BlY2lmaWVyLCBwYXJzZWRJbXBvcnRlcl0gPSBKU09OLnBhcnNlKGRhdGEpO1xuXHRcdHNwZWNpZmllciA9IHBhcnNlZFNwZWNpZmllciwgY29udGV4dC5wYXJlbnRVUkwgPSBwYXJzZWRJbXBvcnRlcjtcblx0fVxuXHRyZXR1cm4gbmV4dFJlc29sdmUoc3BlY2lmaWVyLCBjb250ZXh0KTtcbn1cbmxldCBpc0hvb2tSZWdpc3RlcmVkID0gITE7XG5mdW5jdGlvbiBjcmVhdGVJbXBvcnRNZXRhUmVzb2x2ZXIoKSB7XG5cdGlmIChpc0hvb2tSZWdpc3RlcmVkKSByZXR1cm4gaW1wb3J0TWV0YVJlc29sdmVXaXRoQ3VzdG9tSG9vaztcblx0bGV0IG1vZHVsZTtcblx0dHJ5IHtcblx0XHRtb2R1bGUgPSB0eXBlb2YgcHJvY2VzcyA8IFwidVwiID8gcHJvY2Vzcy5nZXRCdWlsdGluTW9kdWxlKFwibm9kZTptb2R1bGVcIikuTW9kdWxlIDogdm9pZCAwO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKG1vZHVsZSkge1xuXHRcdGlmIChtb2R1bGUucmVnaXN0ZXJIb29rcykgcmV0dXJuIG1vZHVsZS5yZWdpc3Rlckhvb2tzKHsgcmVzb2x2ZTogY3VzdG9taXphdGlvbkhvb2tSZXNvbHZlIH0pLCBpc0hvb2tSZWdpc3RlcmVkID0gITAsIGltcG9ydE1ldGFSZXNvbHZlV2l0aEN1c3RvbUhvb2s7XG5cdFx0aWYgKG1vZHVsZS5yZWdpc3Rlcikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0bGV0IGhvb2tNb2R1bGVDb250ZW50ID0gYGRhdGE6dGV4dC9qYXZhc2NyaXB0LCR7ZW5jb2RlVVJJKGN1c3RvbWl6YXRpb25Ib29rc01vZHVsZSl9YDtcblx0XHRcdFx0bW9kdWxlLnJlZ2lzdGVyKGhvb2tNb2R1bGVDb250ZW50KTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aWYgKFwiY29kZVwiIGluIGUgJiYgZS5jb2RlID09PSBcIkVSUl9ORVRXT1JLX0lNUE9SVF9ESVNBTExPV0VEXCIpIHJldHVybjtcblx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpc0hvb2tSZWdpc3RlcmVkID0gITAsIGltcG9ydE1ldGFSZXNvbHZlV2l0aEN1c3RvbUhvb2s7XG5cdFx0fVxuXHR9XG59XG5mdW5jdGlvbiBpbXBvcnRNZXRhUmVzb2x2ZVdpdGhDdXN0b21Ib29rKHNwZWNpZmllciwgaW1wb3J0ZXIpIHtcblx0cmV0dXJuIGltcG9ydC5tZXRhLnJlc29sdmUoYCR7Y3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2V9JHtKU09OLnN0cmluZ2lmeShbc3BlY2lmaWVyLCBpbXBvcnRlcl0pfWApO1xufVxuYCR7Y3VzdG9taXphdGlvbkhvb2tOYW1lc3BhY2V9YDtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHNyYy9tb2R1bGUtcnVubmVyL2NyZWF0ZUltcG9ydE1ldGEudHNcbmNvbnN0IGVudlByb3h5ID0gbmV3IFByb3h5KHt9LCB7IGdldChfLCBwKSB7XG5cdHRocm93IEVycm9yKGBbbW9kdWxlIHJ1bm5lcl0gRHluYW1pYyBhY2Nlc3Mgb2YgXCJpbXBvcnQubWV0YS5lbnZcIiBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UsIHVzZSBcImltcG9ydC5tZXRhLmVudi4ke1N0cmluZyhwKX1cIiBpbnN0ZWFkLmApO1xufSB9KTtcbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRJbXBvcnRNZXRhKG1vZHVsZVBhdGgpIHtcblx0bGV0IGhyZWYgPSBwb3NpeFBhdGhUb0ZpbGVIcmVmKG1vZHVsZVBhdGgpLCBmaWxlbmFtZSA9IG1vZHVsZVBhdGgsIGRpcm5hbWUgPSBwb3NpeERpcm5hbWUobW9kdWxlUGF0aCk7XG5cdHJldHVybiB7XG5cdFx0ZmlsZW5hbWU6IGlzV2luZG93cyA/IHRvV2luZG93c1BhdGgoZmlsZW5hbWUpIDogZmlsZW5hbWUsXG5cdFx0ZGlybmFtZTogaXNXaW5kb3dzID8gdG9XaW5kb3dzUGF0aChkaXJuYW1lKSA6IGRpcm5hbWUsXG5cdFx0dXJsOiBocmVmLFxuXHRcdGVudjogZW52UHJveHksXG5cdFx0cmVzb2x2ZShfaWQsIF9wYXJlbnQpIHtcblx0XHRcdHRocm93IEVycm9yKFwiW21vZHVsZSBydW5uZXJdIFxcXCJpbXBvcnQubWV0YS5yZXNvbHZlXFxcIiBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcblx0XHR9LFxuXHRcdGdsb2IoKSB7XG5cdFx0XHR0aHJvdyBFcnJvcihcIlttb2R1bGUgcnVubmVyXSBcXFwiaW1wb3J0Lm1ldGEuZ2xvYlxcXCIgaXMgc3RhdGljYWxseSByZXBsYWNlZCBkdXJpbmcgZmlsZSB0cmFuc2Zvcm1hdGlvbi4gTWFrZSBzdXJlIHRvIHJlZmVyZW5jZSBpdCBieSB0aGUgZnVsbCBuYW1lLlwiKTtcblx0XHR9XG5cdH07XG59XG4vKipcbiogQ3JlYXRlIGltcG9ydC5tZXRhIG9iamVjdCBmb3IgTm9kZS5qcy5cbiovXG5mdW5jdGlvbiBjcmVhdGVOb2RlSW1wb3J0TWV0YShtb2R1bGVQYXRoKSB7XG5cdGxldCBkZWZhdWx0TWV0YSA9IGNyZWF0ZURlZmF1bHRJbXBvcnRNZXRhKG1vZHVsZVBhdGgpLCBocmVmID0gZGVmYXVsdE1ldGEudXJsLCBpbXBvcnRNZXRhUmVzb2x2ZXIgPSBjcmVhdGVJbXBvcnRNZXRhUmVzb2x2ZXIoKTtcblx0cmV0dXJuIHtcblx0XHQuLi5kZWZhdWx0TWV0YSxcblx0XHRtYWluOiAhMSxcblx0XHRyZXNvbHZlKGlkLCBwYXJlbnQpIHtcblx0XHRcdHJldHVybiAoaW1wb3J0TWV0YVJlc29sdmVyID8/IGRlZmF1bHRNZXRhLnJlc29sdmUpKGlkLCBwYXJlbnQgPz8gaHJlZik7XG5cdFx0fVxuXHR9O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL21vZHVsZS1ydW5uZXIvcnVubmVyLnRzXG52YXIgTW9kdWxlUnVubmVyID0gY2xhc3Mge1xuXHRldmFsdWF0ZWRNb2R1bGVzO1xuXHRobXJDbGllbnQ7XG5cdHRyYW5zcG9ydDtcblx0cmVzZXRTb3VyY2VNYXBTdXBwb3J0O1xuXHRjb25jdXJyZW50TW9kdWxlTm9kZVByb21pc2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcblx0aXNCdWlsdGluO1xuXHRidWlsdGluc1Byb21pc2U7XG5cdGNsb3NlZCA9ICExO1xuXHRjb25zdHJ1Y3RvcihvcHRpb25zLCBldmFsdWF0b3IgPSBuZXcgRVNNb2R1bGVzRXZhbHVhdG9yKCksIGRlYnVnKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucyA9IG9wdGlvbnMsIHRoaXMuZXZhbHVhdG9yID0gZXZhbHVhdG9yLCB0aGlzLmRlYnVnID0gZGVidWcsIHRoaXMuZXZhbHVhdGVkTW9kdWxlcyA9IG9wdGlvbnMuZXZhbHVhdGVkTW9kdWxlcyA/PyBuZXcgRXZhbHVhdGVkTW9kdWxlcygpLCB0aGlzLnRyYW5zcG9ydCA9IG5vcm1hbGl6ZU1vZHVsZVJ1bm5lclRyYW5zcG9ydChvcHRpb25zLnRyYW5zcG9ydCksIG9wdGlvbnMuaG1yICE9PSAhMSkge1xuXHRcdFx0bGV0IG9wdGlvbnNIbXIgPSBvcHRpb25zLmhtciA/PyAhMDtcblx0XHRcdGlmICh0aGlzLmhtckNsaWVudCA9IG5ldyBITVJDbGllbnQob3B0aW9uc0htciA9PT0gITAgfHwgb3B0aW9uc0htci5sb2dnZXIgPT09IHZvaWQgMCA/IGhtckxvZ2dlciA6IG9wdGlvbnNIbXIubG9nZ2VyID09PSAhMSA/IHNpbGVudENvbnNvbGUgOiBvcHRpb25zSG1yLmxvZ2dlciwgdGhpcy50cmFuc3BvcnQsICh7IGFjY2VwdGVkUGF0aCB9KSA9PiB0aGlzLmltcG9ydChhY2NlcHRlZFBhdGgpKSwgIXRoaXMudHJhbnNwb3J0LmNvbm5lY3QpIHRocm93IEVycm9yKFwiSE1SIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBydW5uZXIgdHJhbnNwb3J0LCBidXQgYGhtcmAgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZVwiKTtcblx0XHRcdHRoaXMudHJhbnNwb3J0LmNvbm5lY3QoY3JlYXRlSE1SSGFuZGxlckZvclJ1bm5lcih0aGlzKSk7XG5cdFx0fSBlbHNlIHRoaXMudHJhbnNwb3J0LmNvbm5lY3Q/LigpO1xuXHRcdG9wdGlvbnMuc291cmNlbWFwSW50ZXJjZXB0b3IgIT09ICExICYmICh0aGlzLnJlc2V0U291cmNlTWFwU3VwcG9ydCA9IGVuYWJsZVNvdXJjZU1hcFN1cHBvcnQodGhpcykpO1xuXHR9XG5cdC8qKlxuXHQqIFVSTCB0byBleGVjdXRlLiBBY2NlcHRzIGZpbGUgcGF0aCwgc2VydmVyIHBhdGggb3IgaWQgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG5cdCovXG5cdGFzeW5jIGltcG9ydCh1cmwpIHtcblx0XHRsZXQgZmV0Y2hlZE1vZHVsZSA9IGF3YWl0IHRoaXMuY2FjaGVkTW9kdWxlKHVybCk7XG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMuY2FjaGVkUmVxdWVzdCh1cmwsIGZldGNoZWRNb2R1bGUpO1xuXHR9XG5cdC8qKlxuXHQqIENsZWFyIGFsbCBjYWNoZXMgaW5jbHVkaW5nIEhNUiBsaXN0ZW5lcnMuXG5cdCovXG5cdGNsZWFyQ2FjaGUoKSB7XG5cdFx0dGhpcy5ldmFsdWF0ZWRNb2R1bGVzLmNsZWFyKCksIHRoaXMuaG1yQ2xpZW50Py5jbGVhcigpO1xuXHR9XG5cdC8qKlxuXHQqIENsZWFycyBhbGwgY2FjaGVzLCByZW1vdmVzIGFsbCBITVIgbGlzdGVuZXJzLCBhbmQgcmVzZXRzIHNvdXJjZSBtYXAgc3VwcG9ydC5cblx0KiBUaGlzIG1ldGhvZCBkb2Vzbid0IHN0b3AgdGhlIEhNUiBjb25uZWN0aW9uLlxuXHQqL1xuXHRhc3luYyBjbG9zZSgpIHtcblx0XHR0aGlzLnJlc2V0U291cmNlTWFwU3VwcG9ydD8uKCksIHRoaXMuY2xlYXJDYWNoZSgpLCB0aGlzLmhtckNsaWVudCA9IHZvaWQgMCwgdGhpcy5jbG9zZWQgPSAhMCwgYXdhaXQgdGhpcy50cmFuc3BvcnQuZGlzY29ubmVjdD8uKCk7XG5cdH1cblx0LyoqXG5cdCogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJ1bnRpbWUgaGFzIGJlZW4gY2xvc2VkIGJ5IGNhbGxpbmcgYGNsb3NlKClgIG1ldGhvZC5cblx0Ki9cblx0aXNDbG9zZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2xvc2VkO1xuXHR9XG5cdHByb2Nlc3NJbXBvcnQoZXhwb3J0cywgZmV0Y2hSZXN1bHQsIG1ldGFkYXRhKSB7XG5cdFx0aWYgKCEoXCJleHRlcm5hbGl6ZVwiIGluIGZldGNoUmVzdWx0KSkgcmV0dXJuIGV4cG9ydHM7XG5cdFx0bGV0IHsgdXJsLCB0eXBlIH0gPSBmZXRjaFJlc3VsdDtcblx0XHRyZXR1cm4gdHlwZSAhPT0gXCJtb2R1bGVcIiAmJiB0eXBlICE9PSBcImNvbW1vbmpzXCIgfHwgYW5hbHl6ZUltcG9ydGVkTW9kRGlmZmVyZW5jZShleHBvcnRzLCB1cmwsIHR5cGUsIG1ldGFkYXRhKSwgZXhwb3J0cztcblx0fVxuXHRpc0NpcmN1bGFyTW9kdWxlKG1vZCkge1xuXHRcdGZvciAobGV0IGltcG9ydGVkRmlsZSBvZiBtb2QuaW1wb3J0cykgaWYgKG1vZC5pbXBvcnRlcnMuaGFzKGltcG9ydGVkRmlsZSkpIHJldHVybiAhMDtcblx0XHRyZXR1cm4gITE7XG5cdH1cblx0aXNDaXJjdWxhckltcG9ydChpbXBvcnRlcnMsIG1vZHVsZVVybCwgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcblx0XHRmb3IgKGxldCBpbXBvcnRlciBvZiBpbXBvcnRlcnMpIHtcblx0XHRcdGlmICh2aXNpdGVkLmhhcyhpbXBvcnRlcikpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKHZpc2l0ZWQuYWRkKGltcG9ydGVyKSwgaW1wb3J0ZXIgPT09IG1vZHVsZVVybCkgcmV0dXJuICEwO1xuXHRcdFx0bGV0IG1vZCA9IHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5nZXRNb2R1bGVCeUlkKGltcG9ydGVyKTtcblx0XHRcdGlmIChtb2QgJiYgbW9kLmltcG9ydGVycy5zaXplICYmIHRoaXMuaXNDaXJjdWxhckltcG9ydChtb2QuaW1wb3J0ZXJzLCBtb2R1bGVVcmwsIHZpc2l0ZWQpKSByZXR1cm4gITA7XG5cdFx0fVxuXHRcdHJldHVybiAhMTtcblx0fVxuXHRhc3luYyBjYWNoZWRSZXF1ZXN0KHVybCwgbW9kLCBjYWxsc3RhY2sgPSBbXSwgbWV0YWRhdGEpIHtcblx0XHRsZXQgbWV0YSA9IG1vZC5tZXRhLCBtb2R1bGVJZCA9IG1ldGEuaWQsIHsgaW1wb3J0ZXJzIH0gPSBtb2QsIGltcG9ydGVlID0gY2FsbHN0YWNrW2NhbGxzdGFjay5sZW5ndGggLSAxXTtcblx0XHRpZiAoaW1wb3J0ZWUgJiYgaW1wb3J0ZXJzLmFkZChpbXBvcnRlZSksIG1vZC5ldmFsdWF0ZWQgJiYgbW9kLnByb21pc2UpIHJldHVybiB0aGlzLnByb2Nlc3NJbXBvcnQoYXdhaXQgbW9kLnByb21pc2UsIG1ldGEsIG1ldGFkYXRhKTtcblx0XHRpZiAoKGNhbGxzdGFjay5pbmNsdWRlcyhtb2R1bGVJZCkgfHwgdGhpcy5pc0NpcmN1bGFyTW9kdWxlKG1vZCkgfHwgdGhpcy5pc0NpcmN1bGFySW1wb3J0KGltcG9ydGVycywgbW9kdWxlSWQpKSAmJiBtb2QuZXhwb3J0cykgcmV0dXJuIHRoaXMucHJvY2Vzc0ltcG9ydChtb2QuZXhwb3J0cywgbWV0YSwgbWV0YWRhdGEpO1xuXHRcdGxldCBkZWJ1Z1RpbWVyO1xuXHRcdHRoaXMuZGVidWcgJiYgKGRlYnVnVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuZGVidWcoYFttb2R1bGUgcnVubmVyXSBtb2R1bGUgJHttb2R1bGVJZH0gdGFrZXMgb3ZlciAycyB0byBsb2FkLlxcbiR7YHN0YWNrOlxcbiR7Wy4uLmNhbGxzdGFjaywgbW9kdWxlSWRdLnJldmVyc2UoKS5tYXAoKHApID0+IGAgIC0gJHtwfWApLmpvaW4oXCJcXG5cIil9YH1gKTtcblx0XHR9LCAyZTMpKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG1vZC5wcm9taXNlKSByZXR1cm4gdGhpcy5wcm9jZXNzSW1wb3J0KGF3YWl0IG1vZC5wcm9taXNlLCBtZXRhLCBtZXRhZGF0YSk7XG5cdFx0XHRsZXQgcHJvbWlzZSA9IHRoaXMuZGlyZWN0UmVxdWVzdCh1cmwsIG1vZCwgY2FsbHN0YWNrKTtcblx0XHRcdHJldHVybiBtb2QucHJvbWlzZSA9IHByb21pc2UsIG1vZC5ldmFsdWF0ZWQgPSAhMSwgdGhpcy5wcm9jZXNzSW1wb3J0KGF3YWl0IHByb21pc2UsIG1ldGEsIG1ldGFkYXRhKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0bW9kLmV2YWx1YXRlZCA9ICEwLCBkZWJ1Z1RpbWVyICYmIGNsZWFyVGltZW91dChkZWJ1Z1RpbWVyKTtcblx0XHR9XG5cdH1cblx0YXN5bmMgY2FjaGVkTW9kdWxlKHVybCwgaW1wb3J0ZXIpIHtcblx0XHRsZXQgY2FjaGVkID0gdGhpcy5jb25jdXJyZW50TW9kdWxlTm9kZVByb21pc2VzLmdldCh1cmwpO1xuXHRcdGlmIChjYWNoZWQpIHRoaXMuZGVidWc/LihcIlttb2R1bGUgcnVubmVyXSB1c2luZyBjYWNoZWQgbW9kdWxlIGluZm8gZm9yXCIsIHVybCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRsZXQgY2FjaGVkTW9kdWxlID0gdGhpcy5ldmFsdWF0ZWRNb2R1bGVzLmdldE1vZHVsZUJ5VXJsKHVybCk7XG5cdFx0XHRjYWNoZWQgPSB0aGlzLmdldE1vZHVsZUluZm9ybWF0aW9uKHVybCwgaW1wb3J0ZXIsIGNhY2hlZE1vZHVsZSkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuY29uY3VycmVudE1vZHVsZU5vZGVQcm9taXNlcy5kZWxldGUodXJsKTtcblx0XHRcdH0pLCB0aGlzLmNvbmN1cnJlbnRNb2R1bGVOb2RlUHJvbWlzZXMuc2V0KHVybCwgY2FjaGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlZDtcblx0fVxuXHRlbnN1cmVCdWlsdGlucygpIHtcblx0XHRpZiAoIXRoaXMuaXNCdWlsdGluKSByZXR1cm4gdGhpcy5idWlsdGluc1Byb21pc2UgPz89IChhc3luYyAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gZmV0Y2hpbmcgYnVpbHRpbnMgZnJvbSBzZXJ2ZXJcIik7XG5cdFx0XHRcdGxldCBidWlsdGlucyA9IChhd2FpdCB0aGlzLnRyYW5zcG9ydC5pbnZva2UoXCJnZXRCdWlsdGluc1wiLCBbXSkpLm1hcCgoYnVpbHRpbikgPT4gdHlwZW9mIGJ1aWx0aW4gPT0gXCJvYmplY3RcIiAmJiBidWlsdGluICYmIFwidHlwZVwiIGluIGJ1aWx0aW4gPyBidWlsdGluLnR5cGUgPT09IFwic3RyaW5nXCIgPyBidWlsdGluLnZhbHVlIDogbmV3IFJlZ0V4cChidWlsdGluLnNvdXJjZSwgYnVpbHRpbi5mbGFncykgOiBidWlsdGluKTtcblx0XHRcdFx0dGhpcy5pc0J1aWx0aW4gPSBjcmVhdGVJc0J1aWx0aW4oYnVpbHRpbnMpLCB0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gYnVpbHRpbnMgbG9hZGVkOlwiLCBidWlsdGlucyk7XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHR0aGlzLmJ1aWx0aW5zUHJvbWlzZSA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHR9KSgpLCB0aGlzLmJ1aWx0aW5zUHJvbWlzZTtcblx0fVxuXHRhc3luYyBnZXRNb2R1bGVJbmZvcm1hdGlvbih1cmwsIGltcG9ydGVyLCBjYWNoZWRNb2R1bGUpIHtcblx0XHRpZiAodGhpcy5jbG9zZWQpIHRocm93IEVycm9yKFwiVml0ZSBtb2R1bGUgcnVubmVyIGhhcyBiZWVuIGNsb3NlZC5cIik7XG5cdFx0YXdhaXQgdGhpcy5lbnN1cmVCdWlsdGlucygpLCB0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gZmV0Y2hpbmdcIiwgdXJsKTtcblx0XHRsZXQgaXNDYWNoZWQgPSAhISh0eXBlb2YgY2FjaGVkTW9kdWxlID09IFwib2JqZWN0XCIgJiYgY2FjaGVkTW9kdWxlLm1ldGEpLCBmZXRjaGVkTW9kdWxlID0gdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSB8fCB0aGlzLmlzQnVpbHRpbj8uKHVybCkgPyB7XG5cdFx0XHRleHRlcm5hbGl6ZTogdXJsLFxuXHRcdFx0dHlwZTogXCJidWlsdGluXCJcblx0XHR9IDogYXdhaXQgdGhpcy50cmFuc3BvcnQuaW52b2tlKFwiZmV0Y2hNb2R1bGVcIiwgW1xuXHRcdFx0dXJsLFxuXHRcdFx0aW1wb3J0ZXIsXG5cdFx0XHR7XG5cdFx0XHRcdGNhY2hlZDogaXNDYWNoZWQsXG5cdFx0XHRcdHN0YXJ0T2Zmc2V0OiB0aGlzLmV2YWx1YXRvci5zdGFydE9mZnNldFxuXHRcdFx0fVxuXHRcdF0pO1xuXHRcdGlmIChcImNhY2hlXCIgaW4gZmV0Y2hlZE1vZHVsZSkge1xuXHRcdFx0aWYgKCFjYWNoZWRNb2R1bGUgfHwgIWNhY2hlZE1vZHVsZS5tZXRhKSB0aHJvdyBFcnJvcihgTW9kdWxlIFwiJHt1cmx9XCIgd2FzIG1pc3Rha2VubHkgaW52YWxpZGF0ZWQgZHVyaW5nIGZldGNoIHBoYXNlLmApO1xuXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZTtcblx0XHR9XG5cdFx0bGV0IG1vZHVsZUlkID0gXCJleHRlcm5hbGl6ZVwiIGluIGZldGNoZWRNb2R1bGUgPyBmZXRjaGVkTW9kdWxlLmV4dGVybmFsaXplIDogZmV0Y2hlZE1vZHVsZS5pZCwgbW9kdWxlVXJsID0gXCJ1cmxcIiBpbiBmZXRjaGVkTW9kdWxlID8gZmV0Y2hlZE1vZHVsZS51cmwgOiB1cmwsIG1vZHVsZSA9IHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5lbnN1cmVNb2R1bGUobW9kdWxlSWQsIG1vZHVsZVVybCk7XG5cdFx0cmV0dXJuIFwiaW52YWxpZGF0ZVwiIGluIGZldGNoZWRNb2R1bGUgJiYgZmV0Y2hlZE1vZHVsZS5pbnZhbGlkYXRlICYmIHRoaXMuZXZhbHVhdGVkTW9kdWxlcy5pbnZhbGlkYXRlTW9kdWxlKG1vZHVsZSksIGZldGNoZWRNb2R1bGUudXJsID0gbW9kdWxlVXJsLCBmZXRjaGVkTW9kdWxlLmlkID0gbW9kdWxlSWQsIG1vZHVsZS5tZXRhID0gZmV0Y2hlZE1vZHVsZSwgbW9kdWxlO1xuXHR9XG5cdGFzeW5jIGRpcmVjdFJlcXVlc3QodXJsLCBtb2QsIF9jYWxsc3RhY2spIHtcblx0XHRsZXQgZmV0Y2hSZXN1bHQgPSBtb2QubWV0YSwgbW9kdWxlSWQgPSBmZXRjaFJlc3VsdC5pZCwgY2FsbHN0YWNrID0gWy4uLl9jYWxsc3RhY2ssIG1vZHVsZUlkXSwgcmVxdWVzdCA9IGFzeW5jIChkZXAsIG1ldGFkYXRhKSA9PiB7XG5cdFx0XHRsZXQgaW1wb3J0ZXIgPSBcImZpbGVcIiBpbiBmZXRjaFJlc3VsdCAmJiBmZXRjaFJlc3VsdC5maWxlIHx8IG1vZHVsZUlkLCBkZXBNb2QgPSBhd2FpdCB0aGlzLmNhY2hlZE1vZHVsZShkZXAsIGltcG9ydGVyKTtcblx0XHRcdHJldHVybiBkZXBNb2QuaW1wb3J0ZXJzLmFkZChtb2R1bGVJZCksIG1vZC5pbXBvcnRzLmFkZChkZXBNb2QuaWQpLCB0aGlzLmNhY2hlZFJlcXVlc3QoZGVwLCBkZXBNb2QsIGNhbGxzdGFjaywgbWV0YWRhdGEpO1xuXHRcdH0sIGR5bmFtaWNSZXF1ZXN0ID0gYXN5bmMgKGRlcCkgPT4gKGRlcCA9IFN0cmluZyhkZXApLCBkZXBbMF0gPT09IFwiLlwiICYmIChkZXAgPSBwb3NpeFJlc29sdmUocG9zaXhEaXJuYW1lKHVybCksIGRlcCkpLCByZXF1ZXN0KGRlcCwgeyBpc0R5bmFtaWNJbXBvcnQ6ICEwIH0pKTtcblx0XHRpZiAoXCJleHRlcm5hbGl6ZVwiIGluIGZldGNoUmVzdWx0KSB7XG5cdFx0XHRsZXQgeyBleHRlcm5hbGl6ZSB9ID0gZmV0Y2hSZXN1bHQ7XG5cdFx0XHR0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gZXh0ZXJuYWxpemluZ1wiLCBleHRlcm5hbGl6ZSk7XG5cdFx0XHRsZXQgZXhwb3J0cyA9IGF3YWl0IHRoaXMuZXZhbHVhdG9yLnJ1bkV4dGVybmFsTW9kdWxlKGV4dGVybmFsaXplKTtcblx0XHRcdHJldHVybiBtb2QuZXhwb3J0cyA9IGV4cG9ydHMsIGV4cG9ydHM7XG5cdFx0fVxuXHRcdGxldCB7IGNvZGUsIGZpbGUgfSA9IGZldGNoUmVzdWx0O1xuXHRcdGlmIChjb2RlID09IG51bGwpIHtcblx0XHRcdGxldCBpbXBvcnRlciA9IGNhbGxzdGFja1tjYWxsc3RhY2subGVuZ3RoIC0gMl07XG5cdFx0XHR0aHJvdyBFcnJvcihgW21vZHVsZSBydW5uZXJdIEZhaWxlZCB0byBsb2FkIFwiJHt1cmx9XCIke2ltcG9ydGVyID8gYCBpbXBvcnRlZCBmcm9tICR7aW1wb3J0ZXJ9YCA6IFwiXCJ9YCk7XG5cdFx0fVxuXHRcdGxldCBjcmVhdGVJbXBvcnRNZXRhID0gdGhpcy5vcHRpb25zLmNyZWF0ZUltcG9ydE1ldGEgPz8gY3JlYXRlRGVmYXVsdEltcG9ydE1ldGEsIG1vZHVsZVBhdGggPSBjbGVhblVybChmaWxlIHx8IG1vZHVsZUlkKSwgaHJlZiA9IHBvc2l4UGF0aFRvRmlsZUhyZWYobW9kdWxlUGF0aCksIG1ldGEgPSBhd2FpdCBjcmVhdGVJbXBvcnRNZXRhKG1vZHVsZVBhdGgpLCBleHBvcnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG5cdFx0XHR2YWx1ZTogXCJNb2R1bGVcIixcblx0XHRcdGVudW1lcmFibGU6ICExLFxuXHRcdFx0Y29uZmlndXJhYmxlOiAhMVxuXHRcdH0pLCBtb2QuZXhwb3J0cyA9IGV4cG9ydHM7XG5cdFx0bGV0IGhvdENvbnRleHQ7XG5cdFx0dGhpcy5obXJDbGllbnQgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1ldGEsIFwiaG90XCIsIHtcblx0XHRcdGVudW1lcmFibGU6ICEwLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmICghdGhpcy5obXJDbGllbnQpIHRocm93IEVycm9yKFwiW21vZHVsZSBydW5uZXJdIEhNUiBjbGllbnQgd2FzIGNsb3NlZC5cIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLmRlYnVnPy4oXCJbbW9kdWxlIHJ1bm5lcl0gY3JlYXRpbmcgaG1yIGNvbnRleHQgZm9yXCIsIG1vZC51cmwpLCBob3RDb250ZXh0IHx8PSBuZXcgSE1SQ29udGV4dCh0aGlzLmhtckNsaWVudCwgbW9kLnVybCksIGhvdENvbnRleHQ7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiAodmFsdWUpID0+IHtcblx0XHRcdFx0aG90Q29udGV4dCA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGxldCBjb250ZXh0ID0ge1xuXHRcdFx0W3NzckltcG9ydEtleV06IHJlcXVlc3QsXG5cdFx0XHRbc3NyRHluYW1pY0ltcG9ydEtleV06IGR5bmFtaWNSZXF1ZXN0LFxuXHRcdFx0W3Nzck1vZHVsZUV4cG9ydHNLZXldOiBleHBvcnRzLFxuXHRcdFx0W3NzckV4cG9ydEFsbEtleV06IChvYmopID0+IGV4cG9ydEFsbChleHBvcnRzLCBvYmopLFxuXHRcdFx0W3NzckV4cG9ydE5hbWVLZXldOiAobmFtZSwgZ2V0dGVyKSA9PiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuXHRcdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiAhMCxcblx0XHRcdFx0Z2V0OiBnZXR0ZXJcblx0XHRcdH0pLFxuXHRcdFx0W3NzckltcG9ydE1ldGFLZXldOiBtZXRhXG5cdFx0fTtcblx0XHRyZXR1cm4gdGhpcy5kZWJ1Zz8uKFwiW21vZHVsZSBydW5uZXJdIGV4ZWN1dGluZ1wiLCBocmVmKSwgYXdhaXQgdGhpcy5ldmFsdWF0b3IucnVuSW5saW5lZE1vZHVsZShjb250ZXh0LCBjb2RlLCBtb2QpLCBleHBvcnRzO1xuXHR9XG59O1xuZnVuY3Rpb24gZXhwb3J0QWxsKGV4cG9ydHMsIHNvdXJjZU1vZHVsZSkge1xuXHRpZiAoZXhwb3J0cyAhPT0gc291cmNlTW9kdWxlICYmICEoaXNQcmltaXRpdmUoc291cmNlTW9kdWxlKSB8fCBBcnJheS5pc0FycmF5KHNvdXJjZU1vZHVsZSkgfHwgc291cmNlTW9kdWxlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcblx0XHRmb3IgKGxldCBrZXkgaW4gc291cmNlTW9kdWxlKSBpZiAoa2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiICYmICEoa2V5IGluIGV4cG9ydHMpKSB0cnkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuXHRcdFx0XHRlbnVtZXJhYmxlOiAhMCxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiAhMCxcblx0XHRcdFx0Z2V0OiAoKSA9PiBzb3VyY2VNb2R1bGVba2V5XVxuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCB7fVxuXHR9XG59XG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IEVTTW9kdWxlc0V2YWx1YXRvciwgRXZhbHVhdGVkTW9kdWxlcywgTW9kdWxlUnVubmVyLCBjcmVhdGVEZWZhdWx0SW1wb3J0TWV0YSwgY3JlYXRlTm9kZUltcG9ydE1ldGEsIGNyZWF0ZVdlYlNvY2tldE1vZHVsZVJ1bm5lclRyYW5zcG9ydCwgbm9ybWFsaXplTW9kdWxlSWQsIHNzckR5bmFtaWNJbXBvcnRLZXksIHNzckV4cG9ydEFsbEtleSwgc3NyRXhwb3J0TmFtZUtleSwgc3NySW1wb3J0S2V5LCBzc3JJbXBvcnRNZXRhS2V5LCBzc3JNb2R1bGVFeHBvcnRzS2V5IH07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6IjtBQUFBLElBQUksb0JBQW9CO0FBQ3hCLHFCQUFxQjtBQUdyQixNQUFNLFlBQVksT0FBTyxVQUFVLE9BQU8sUUFBUSxhQUFh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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region ../../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
|
|
2
|
+
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
3
|
+
//#endregion
|
|
4
|
+
export { commonjsGlobal };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NvbW1vbmpzSGVscGVycy5EMjZ0eTNFdy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdml0ZXN0QDQuMS4yX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMF9AdHlwZXMrbm9kZUAyNS4wLjdfdml0ZUA4LjAuM19AZW1uYXBpK2NvcmVAMS45LjJfX2JiMzEwODcyNzhmOTdhMzliMzFiOTIwMTBiZWFiOTgwL25vZGVfbW9kdWxlcy92aXRlc3QvZGlzdC9jaHVua3MvX2NvbW1vbmpzSGVscGVycy5EMjZ0eTNFdy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHt9O1xuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsIFwiZGVmYXVsdFwiKSA/IHhbXCJkZWZhdWx0XCJdIDogeDtcbn1cblxuZXhwb3J0IHsgY29tbW9uanNHbG9iYWwgYXMgYywgZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgYXMgZyB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJLGlCQUFpQixPQUFPLGVBQWUsY0FBYyxhQUFhLE9BQU8sV0FBVyxjQUFjLFNBQVMsT0FBTyxXQUFXLGNBQWMsU0FBUyxPQUFPLFNBQVMsY0FBYyxPQUFPLEVBQUUifQ==
|