@pipeline-builder/api-core 5.2.3 → 5.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/constants/ai-providers.d.ts +3 -22
- package/lib/constants/ai-providers.js +6 -56
- package/lib/errors/app-errors.d.ts +14 -0
- package/lib/errors/app-errors.js +21 -1
- package/lib/helpers/sse-helpers.d.ts +33 -3
- package/lib/helpers/sse-helpers.js +91 -19
- package/lib/middleware/auth.js +6 -3
- package/lib/middleware/deferred-quota-check.d.ts +5 -0
- package/lib/middleware/deferred-quota-check.js +33 -0
- package/lib/middleware/ecosystem-guard.d.ts +3 -3
- package/lib/middleware/ecosystem-guard.js +5 -5
- package/lib/middleware/index.d.ts +5 -2
- package/lib/middleware/index.js +6 -3
- package/lib/middleware/on-behalf.d.ts +37 -0
- package/lib/middleware/on-behalf.js +143 -0
- package/lib/middleware/permission-gates.d.ts +11 -0
- package/lib/middleware/permission-gates.js +7 -1
- package/lib/middleware/quota-exempt-routes.d.ts +36 -0
- package/lib/middleware/quota-exempt-routes.js +47 -0
- package/lib/middleware/route-table.d.ts +104 -0
- package/lib/middleware/route-table.js +72 -2
- package/lib/middleware/service-tokens.d.ts +8 -0
- package/lib/middleware/service-tokens.js +2 -1
- package/lib/middleware/step-up.js +11 -1
- package/lib/services/ai-call-weight.d.ts +24 -0
- package/lib/services/ai-call-weight.js +77 -0
- package/lib/services/audit-context.d.ts +105 -0
- package/lib/services/audit-context.js +134 -0
- package/lib/services/index.d.ts +7 -2
- package/lib/services/index.js +7 -2
- package/lib/services/org-ai-client.d.ts +61 -0
- package/lib/services/org-ai-client.js +112 -0
- package/lib/services/quota-increment-batcher.d.ts +81 -0
- package/lib/services/quota-increment-batcher.js +166 -0
- package/lib/services/quota.d.ts +158 -14
- package/lib/services/quota.js +252 -22
- package/lib/services/remote-audit-client.d.ts +44 -1
- package/lib/services/remote-audit-client.js +106 -20
- package/lib/services/version-vuln-policy.d.ts +174 -0
- package/lib/services/version-vuln-policy.js +242 -0
- package/lib/types/ai-catalog.d.ts +63 -0
- package/lib/types/ai-catalog.js +82 -0
- package/lib/types/ask-proposals.js +6 -6
- package/lib/types/build-catalog.d.ts +154 -0
- package/lib/types/build-catalog.js +158 -0
- package/lib/types/common.d.ts +37 -3
- package/lib/types/common.js +20 -2
- package/lib/types/ecosystem-notifications.d.ts +5 -5
- package/lib/types/ecosystem-notifications.js +9 -3
- package/lib/types/error-codes.d.ts +13 -6
- package/lib/types/error-codes.js +18 -8
- package/lib/types/feature-flags.d.ts +6 -4
- package/lib/types/feature-flags.js +11 -6
- package/lib/types/index.d.ts +6 -4
- package/lib/types/index.js +12 -5
- package/lib/types/metadata-keys.d.ts +6 -0
- package/lib/types/metadata-keys.js +4 -1
- package/lib/types/permissions.d.ts +344 -3
- package/lib/types/permissions.js +596 -21
- package/lib/types/pipeline.d.ts +39 -0
- package/lib/types/pipeline.js +57 -1
- package/lib/types/plugin-health.d.ts +0 -2
- package/lib/types/plugin-health.js +1 -11
- package/lib/types/plugin-scan.d.ts +192 -42
- package/lib/types/plugin-scan.js +159 -43
- package/lib/types/quota-catalog.d.ts +247 -0
- package/lib/types/quota-catalog.js +122 -0
- package/lib/types/quota-tiers.d.ts +118 -0
- package/lib/types/quota-tiers.js +153 -2
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +131 -1
- package/lib/types/wire-vocabulary.js +8 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/response.d.ts +35 -2
- package/lib/utils/response.js +42 -3
- package/lib/validation/ai-schemas.d.ts +27 -0
- package/lib/validation/ai-schemas.js +31 -5
- package/lib/validation/plugin-schemas.d.ts +15 -0
- package/lib/validation/plugin-schemas.js +28 -1
- package/package.json +31 -2
package/lib/types/plugin-scan.js
CHANGED
|
@@ -9,23 +9,108 @@
|
|
|
9
9
|
*
|
|
10
10
|
* A finding is FIXABLE when grype reports a fixed version for it
|
|
11
11
|
* (`vulnerability.fix.state == "fixed"` with at least one version): the gates
|
|
12
|
-
* count fixable Critical findings
|
|
13
|
-
*
|
|
12
|
+
* count fixable Critical findings, because an unfixable one can't be acted on
|
|
13
|
+
* by rebuilding or upgrading — with ONE exception. A Critical that CISA lists
|
|
14
|
+
* as KNOWN EXPLOITED (KEV) is gated even with no fix (`PLUGIN_VULN_GATE_KEV`):
|
|
15
|
+
* "nothing to upgrade to" is a reason to not ship the image, not a reason to
|
|
16
|
+
* ship it, when the vulnerability is being exploited in the wild.
|
|
14
17
|
*/
|
|
15
18
|
import { SYSTEM_ORG_ID } from '../middleware/system-org.js';
|
|
16
|
-
import { envBool, envInt } from '../utils/env.js';
|
|
19
|
+
import { envBool, envInt, envStr } from '../utils/env.js';
|
|
20
|
+
/** Findings a summary itemizes. Counts are never capped; this bounds the jsonb. */
|
|
21
|
+
export const SCAN_SUMMARY_MAX_FINDINGS = 500;
|
|
22
|
+
/** Uncatalogued binaries a summary lists. */
|
|
23
|
+
export const SCAN_SUMMARY_MAX_BINARIES = 200;
|
|
24
|
+
/**
|
|
25
|
+
* A finding's identity: the advisory in a specific package version. The same
|
|
26
|
+
* CVE in two packages is two findings; the same CVE reported again after a
|
|
27
|
+
* rescan is the same one.
|
|
28
|
+
*/
|
|
29
|
+
export function scanFindingKey(f) {
|
|
30
|
+
return `${f.id}|${f.packageName}|${f.packageVersion}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The Critical/High findings in `after` that the previous summary did not
|
|
34
|
+
* carry — what N31 and an advisory draft are about.
|
|
35
|
+
*
|
|
36
|
+
* No previous summary means no baseline: every finding is new. A TRUNCATED
|
|
37
|
+
* baseline knows only its first {@link SCAN_SUMMARY_MAX_FINDINGS} findings
|
|
38
|
+
* (Criticals first), so a finding missing from it is new only if the baseline
|
|
39
|
+
* provably listed every finding of that severity — otherwise it may simply have
|
|
40
|
+
* been cut, and reporting it as new would be a false alarm on every pass.
|
|
41
|
+
*/
|
|
42
|
+
export function newScanFindings(before, after) {
|
|
43
|
+
if (!before)
|
|
44
|
+
return [...after];
|
|
45
|
+
const known = new Set(before.findings.map(scanFindingKey));
|
|
46
|
+
const listedCritical = before.findings.filter((f) => f.severity === 'critical').length;
|
|
47
|
+
const complete = {
|
|
48
|
+
critical: !before.truncated || listedCritical >= before.critical,
|
|
49
|
+
high: !before.truncated,
|
|
50
|
+
};
|
|
51
|
+
return after.filter((f) => complete[f.severity] && !known.has(scanFindingKey(f)));
|
|
52
|
+
}
|
|
17
53
|
/** Findings a flag / gate message carries. */
|
|
18
54
|
export const SCAN_FLAG_TOP_FINDINGS = 10;
|
|
19
55
|
/** Lookup / resolution warning code for a flagged version. */
|
|
20
56
|
export const VULN_FLAGGED_WARNING = 'VULN_FLAGGED';
|
|
21
57
|
/**
|
|
22
|
-
* `
|
|
23
|
-
*
|
|
58
|
+
* `PLUGIN_VULN_MAX_FINDINGS`: the platform floor — a version with MORE gated
|
|
59
|
+
* findings (fixable, or KEV-listed, at or above `PLUGIN_VULN_FAIL_ON`) than
|
|
60
|
+
* this fails its build (`PLUGIN_VULN_GATE`) and is
|
|
24
61
|
* flagged by the rescan. Default `0`; `-1` disables the floor (and the flag).
|
|
25
62
|
*/
|
|
26
|
-
export function
|
|
27
|
-
return envInt('
|
|
63
|
+
export function pluginVulnMaxFindings() {
|
|
64
|
+
return envInt('PLUGIN_VULN_MAX_FINDINGS', 0, { min: -1 });
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* `PLUGIN_VULN_FAIL_ON` (default `critical`): the severity at and above which a
|
|
68
|
+
* fixable (or KEV-listed) finding counts against `PLUGIN_VULN_MAX_FINDINGS`.
|
|
69
|
+
* `high` gates Critical AND High. Any other value resolves to `high`, the
|
|
70
|
+
* STRICTER setting: the failure mode of a typo must be "the gate blocks more",
|
|
71
|
+
* never "the gate blocks less".
|
|
72
|
+
*/
|
|
73
|
+
export function pluginVulnFailOn() {
|
|
74
|
+
return envStr('PLUGIN_VULN_FAIL_ON', 'critical').trim().toLowerCase() === 'critical' ? 'critical' : 'high';
|
|
75
|
+
}
|
|
76
|
+
/** Whether a severity is at or above the gating threshold. */
|
|
77
|
+
export function atOrAboveFailOn(severity, failOn = pluginVulnFailOn()) {
|
|
78
|
+
return severity === 'critical' || failOn === 'high';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The scanner's fixable count at or above the threshold — what the floor reads
|
|
82
|
+
* when a scan recorded counts but no findings to derive it from.
|
|
83
|
+
*/
|
|
84
|
+
export function gatedFixableCount(counts, failOn = pluginVulnFailOn()) {
|
|
85
|
+
return (counts.vulnCriticalFixable ?? 0) + (failOn === 'high' ? counts.vulnHighFixable ?? 0 : 0);
|
|
86
|
+
}
|
|
87
|
+
/** `Critical` / `Critical or High` — the gated severities, for messages. */
|
|
88
|
+
export function failOnLabel(failOn = pluginVulnFailOn()) {
|
|
89
|
+
return failOn === 'critical' ? 'Critical' : 'Critical or High';
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* `PLUGIN_VULN_GATE_KEV` (default true): a Critical CISA lists as known
|
|
93
|
+
* exploited counts against the floor even when it has NO fix. Off, KEV findings
|
|
94
|
+
* are gated exactly like any other Critical (fixable only).
|
|
95
|
+
*/
|
|
96
|
+
export function pluginVulnGateKev() {
|
|
97
|
+
return envBool('PLUGIN_VULN_GATE_KEV', true);
|
|
28
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Whether a finding counts against the floor: a fixable finding at or above
|
|
101
|
+
* `PLUGIN_VULN_FAIL_ON` (default Critical), or — under `PLUGIN_VULN_GATE_KEV`
|
|
102
|
+
* — a KEV-listed one at or above it with or without a fix.
|
|
103
|
+
*/
|
|
104
|
+
export function isGatedFinding(f, kevGate = pluginVulnGateKev(), failOn = pluginVulnFailOn()) {
|
|
105
|
+
return atOrAboveFailOn(f.severity, failOn) && (f.fixedIn.length > 0 || (kevGate && f.kev === true));
|
|
106
|
+
}
|
|
107
|
+
/** The `plugin` of a fleet-wide waiver. Advisory ids only — see VulnWaiver. */
|
|
108
|
+
export const WAIVE_ALL_PLUGINS = '*';
|
|
109
|
+
/**
|
|
110
|
+
* An advisory id as scanners report it (CVE, GHSA, Go vulndb, PyPA, RustSec).
|
|
111
|
+
* Anything else is a package name, which a fleet-wide waiver may not use.
|
|
112
|
+
*/
|
|
113
|
+
const ADVISORY_ID = /^(CVE-\d{4}-\d{4,}|GHSA(-[0-9a-z]{4}){3}|GO-\d{4}-\d{4,}|PYSEC-\d{4}-\d+|RUSTSEC-\d{4}-\d{4,})$/i;
|
|
29
114
|
/**
|
|
30
115
|
* Parse `PLUGIN_VULN_WAIVERS`, REPORTING what was dropped.
|
|
31
116
|
*
|
|
@@ -65,6 +150,10 @@ export function parseVulnWaiversVerbose(raw = process.env.PLUGIN_VULN_WAIVERS) {
|
|
|
65
150
|
reject(entry, "'@' with no version — omit it to cover every version");
|
|
66
151
|
continue;
|
|
67
152
|
}
|
|
153
|
+
if (plugin === WAIVE_ALL_PLUGINS && version !== null) {
|
|
154
|
+
reject(entry, "'*' covers every plugin, so it cannot pin a version");
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
68
157
|
if (!/^\d{4}-\d{2}-\d{2}$/.test(expires)) {
|
|
69
158
|
reject(entry, `expiry '${expires}' is not YYYY-MM-DD`);
|
|
70
159
|
continue;
|
|
@@ -79,6 +168,13 @@ export function parseVulnWaiversVerbose(raw = process.env.PLUGIN_VULN_WAIVERS) {
|
|
|
79
168
|
reject(entry, 'no package names');
|
|
80
169
|
continue;
|
|
81
170
|
}
|
|
171
|
+
if (plugin === WAIVE_ALL_PLUGINS) {
|
|
172
|
+
const packageNames = names.filter((n) => !ADVISORY_ID.test(n));
|
|
173
|
+
if (packageNames.length > 0) {
|
|
174
|
+
reject(entry, `'*' takes advisory ids only (CVE-…, GHSA-…, GO-…); '${packageNames.join(', ')}' would waive a package in every plugin`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
82
178
|
waivers.push({ plugin, version, expires: when, packages: names });
|
|
83
179
|
}
|
|
84
180
|
return { waivers, problems };
|
|
@@ -87,12 +183,23 @@ export function parseVulnWaiversVerbose(raw = process.env.PLUGIN_VULN_WAIVERS) {
|
|
|
87
183
|
export function parseVulnWaivers(raw = process.env.PLUGIN_VULN_WAIVERS) {
|
|
88
184
|
return parseVulnWaiversVerbose(raw).waivers;
|
|
89
185
|
}
|
|
186
|
+
/** One waiver entry's identity: the plugin it names (with its pin) and its targets. */
|
|
187
|
+
export function vulnWaiverLabels(w) {
|
|
188
|
+
return { plugin: w.version ? `${w.plugin}@${w.version}` : w.plugin, targets: w.packages.join(',') };
|
|
189
|
+
}
|
|
90
190
|
/**
|
|
91
191
|
* Split findings into what still counts and what an unexpired waiver exempts.
|
|
92
192
|
*
|
|
93
|
-
* Matching is on the package name a waiver names,
|
|
94
|
-
* for findings that are
|
|
95
|
-
*
|
|
193
|
+
* Matching is on the package name or advisory id a waiver names,
|
|
194
|
+
* case-insensitively, and only for findings that are GATED
|
|
195
|
+
* ({@link isGatedFinding}) — an ungated finding never counted toward the floor,
|
|
196
|
+
* so "waiving" it would overstate what the waiver does.
|
|
197
|
+
*
|
|
198
|
+
* A KEV-listed finding is exempted by an ADVISORY-ID target only, never by a
|
|
199
|
+
* package name. `artillery:…:chromium` is a judgement about Chromium's ordinary
|
|
200
|
+
* churn; it was not written about, and must not silently cover, the one
|
|
201
|
+
* Chromium CVE that is being exploited today. Naming that CVE is the deliberate
|
|
202
|
+
* act an exemption for it requires.
|
|
96
203
|
*/
|
|
97
204
|
export function applyVulnWaivers(pluginName, findings, waivers = parseVulnWaivers(), now = new Date(), orgId, pluginVersion) {
|
|
98
205
|
// SYSTEM ORG ONLY. Plugin names are unique per (name, version, orgId), NOT
|
|
@@ -103,38 +210,38 @@ export function applyVulnWaivers(pluginName, findings, waivers = parseVulnWaiver
|
|
|
103
210
|
// Official catalog the operator curates, which lives in the system org; a
|
|
104
211
|
// caller that cannot say which org this build belongs to gets no waiver.
|
|
105
212
|
if (orgId === undefined || orgId.toLowerCase() !== SYSTEM_ORG_ID)
|
|
106
|
-
return { counted: [...findings], waived: [] };
|
|
107
|
-
const active = waivers.filter((w) => w.plugin === pluginName
|
|
213
|
+
return { counted: [...findings], waived: [], matched: [] };
|
|
214
|
+
const active = waivers.filter((w) => (w.plugin === pluginName || w.plugin === WAIVE_ALL_PLUGINS)
|
|
108
215
|
&& w.expires.getTime() >= now.getTime()
|
|
109
216
|
// A version-pinned waiver covers that version only. An unpinned one covers
|
|
110
217
|
// every version, which is why the pin is worth writing.
|
|
111
218
|
&& (w.version === null || w.version === pluginVersion));
|
|
112
219
|
if (active.length === 0)
|
|
113
|
-
return { counted: [...findings], waived: [] };
|
|
114
|
-
const
|
|
220
|
+
return { counted: [...findings], waived: [], matched: [] };
|
|
221
|
+
const kevGate = pluginVulnGateKev();
|
|
222
|
+
const targets = active.map((w) => ({ w, names: new Set(w.packages.map((n) => n.toLowerCase())) }));
|
|
115
223
|
const counted = [];
|
|
116
224
|
const waived = [];
|
|
225
|
+
const matched = new Set();
|
|
117
226
|
for (const f of findings) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
227
|
+
const id = f.id.toLowerCase();
|
|
228
|
+
const pkg = f.packageName.toLowerCase();
|
|
229
|
+
const by = isGatedFinding(f, kevGate)
|
|
230
|
+
? targets.filter((t) => t.names.has(id) || (f.kev !== true && t.names.has(pkg)))
|
|
231
|
+
: [];
|
|
232
|
+
if (by.length === 0) {
|
|
121
233
|
counted.push(f);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
waived.push(f);
|
|
237
|
+
for (const t of by)
|
|
238
|
+
matched.add(t.w);
|
|
122
239
|
}
|
|
123
|
-
return { counted, waived };
|
|
124
|
-
}
|
|
125
|
-
/** Whether `fixableCritical` breaks the platform floor (never, when disabled). */
|
|
126
|
-
export function exceedsVulnFloor(fixableCritical, max = pluginVulnMaxCritical()) {
|
|
127
|
-
return max >= 0 && (fixableCritical ?? 0) > max;
|
|
240
|
+
return { counted, waived, matched: [...matched] };
|
|
128
241
|
}
|
|
129
|
-
/**
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
* one), and an exact pin to a flagged version is refused 409
|
|
133
|
-
* `PLUGIN_VERSION_VULN_BLOCKED`. Off: flagged versions resolve with a
|
|
134
|
-
* `VULN_FLAGGED` warning.
|
|
135
|
-
*/
|
|
136
|
-
export function blockOnNewCritical() {
|
|
137
|
-
return envBool('PLUGIN_BLOCK_ON_NEW_CRITICAL', false);
|
|
242
|
+
/** Whether `gatedCritical` breaks the platform floor (never, when disabled). */
|
|
243
|
+
export function exceedsVulnFloor(gated, max = pluginVulnMaxFindings()) {
|
|
244
|
+
return max >= 0 && (gated ?? 0) > max;
|
|
138
245
|
}
|
|
139
246
|
/** `pkg@1.2.3 → 1.2.4` / `pkg@1.2.3 (no fix)`. */
|
|
140
247
|
export function describeFix(f) {
|
|
@@ -147,41 +254,50 @@ export function describeFindings(findings, limit = 5) {
|
|
|
147
254
|
const more = findings.length > limit ? `; +${findings.length - limit} more` : '';
|
|
148
255
|
return `${shown}${more}`;
|
|
149
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* `N fixable Critical findings`, or — when any gated finding is KEV-listed, so
|
|
259
|
+
* "fixable" alone would misdescribe the count — `N Critical findings that are
|
|
260
|
+
* fixable or known exploited (M on CISA KEV)`.
|
|
261
|
+
*/
|
|
262
|
+
function gatedPhrase(flag) {
|
|
263
|
+
const s = flag.gated === 1 ? '' : 's';
|
|
264
|
+
const label = failOnLabel(flag.failOn ?? 'critical');
|
|
265
|
+
return flag.kev
|
|
266
|
+
? `${flag.gated} ${label} finding${s} that ${flag.gated === 1 ? 'is' : 'are'} fixable or known exploited (${flag.kev} on CISA KEV)`
|
|
267
|
+
: `${flag.gated} fixable ${label} finding${s}`;
|
|
268
|
+
}
|
|
150
269
|
/** The warning text for a flagged version: `x@v has N fixable Critical findings — rebuild or upgrade`. */
|
|
151
270
|
export function vulnFlaggedMessage(ref, flag) {
|
|
152
|
-
return `${ref} has ${flag
|
|
271
|
+
return `${ref} has ${gatedPhrase(flag)} — rebuild or upgrade`;
|
|
153
272
|
}
|
|
154
273
|
/** Build the `VULN_FLAGGED` warning for `plugin@version`. */
|
|
155
274
|
export function vulnFlaggedWarning(plugin, version, flag) {
|
|
156
275
|
return {
|
|
157
276
|
code: VULN_FLAGGED_WARNING,
|
|
277
|
+
severity: flag.kev ? 'critical' : 'error',
|
|
158
278
|
plugin,
|
|
159
279
|
version,
|
|
160
|
-
|
|
280
|
+
gated: flag.gated,
|
|
161
281
|
high: flag.high,
|
|
162
282
|
message: vulnFlaggedMessage(`${plugin}@${version}`, flag),
|
|
163
283
|
findings: flag.findings.slice(0, SCAN_FLAG_TOP_FINDINGS),
|
|
164
284
|
};
|
|
165
285
|
}
|
|
166
|
-
/** The 409 message for an exact pin to a flagged version while blocking. */
|
|
167
|
-
export function vulnBlockedMessage(plugin, version, flag) {
|
|
168
|
-
const fixes = flag.findings.length > 0 ? ` Fix: ${describeFindings(flag.findings)}.` : '';
|
|
169
|
-
return `${plugin}@${version} is blocked: a rescan found ${flag.critical} fixable Critical finding${flag.critical === 1 ? '' : 's'} `
|
|
170
|
-
+ `(PLUGIN_BLOCK_ON_NEW_CRITICAL). Rebuild it on patched packages or move to a newer version.${fixes}`;
|
|
171
|
-
}
|
|
172
286
|
/** Narrow an unknown `scan_flag` jsonb value. */
|
|
173
287
|
export function asScanFlag(value) {
|
|
174
288
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
175
289
|
return null;
|
|
176
290
|
const v = value;
|
|
177
|
-
if (typeof v.
|
|
291
|
+
if (typeof v.gated !== 'number' || typeof v.high !== 'number')
|
|
178
292
|
return null;
|
|
179
293
|
const findings = Array.isArray(v.findings) ? v.findings.filter((f) => f && typeof f.id === 'string') : [];
|
|
180
294
|
return {
|
|
181
|
-
|
|
295
|
+
gated: v.gated,
|
|
182
296
|
high: v.high,
|
|
183
|
-
|
|
297
|
+
maxFindings: typeof v.maxFindings === 'number' ? v.maxFindings : 0,
|
|
298
|
+
...(typeof v.kev === 'number' && v.kev > 0 ? { kev: v.kev } : {}),
|
|
299
|
+
...(v.failOn === 'high' ? { failOn: 'high' } : {}),
|
|
184
300
|
findings: findings.map((f) => ({ ...f, fixedIn: Array.isArray(f.fixedIn) ? f.fixedIn : [] })),
|
|
185
301
|
};
|
|
186
302
|
}
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGx1Z2luLXNjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBeURsRCw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBRXpDLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxjQUFjLENBQUM7QUFFbkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBbUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsR0FBRyxHQUF1QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtJQUMvRixNQUFNLE9BQU8sR0FBaUIsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sUUFBUSxHQUF3QixFQUFFLENBQUM7SUFDekMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV0RyxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUFFLFNBQVM7UUFDNUIsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRixtRUFBbUU7UUFDbkUseUVBQXlFO1FBQ3pFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsTUFBTSxDQUFDLEtBQUssRUFBRSxtRUFBbUUsQ0FBQyxDQUFDO1lBQ25GLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUFDLFNBQVM7UUFBQyxDQUFDO1FBQzNELElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxFQUFFLHNEQUFzRCxDQUFDLENBQUM7WUFBQyxTQUFTO1FBQUMsQ0FBQztRQUMvRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsT0FBTyxxQkFBcUIsQ0FBQyxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDL0csTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxPQUFPLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsT0FBTyxzQkFBc0IsQ0FBQyxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDeEcsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFBQyxTQUFTO1FBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQUcsR0FBdUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7SUFDeEYsT0FBTyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDOUMsQ0FBQztBQVVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsVUFBa0IsRUFDbEIsUUFBc0MsRUFDdEMsT0FBTyxHQUEwQixnQkFBZ0IsRUFBRSxFQUNuRCxHQUFHLEdBQVMsSUFBSSxJQUFJLEVBQUUsRUFDdEIsS0FBYyxFQUNkLGFBQXNCO0lBRXRCLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUN6RSwrRUFBK0U7SUFDL0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLGFBQWE7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEgsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxVQUFVO1dBQ3ZELENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtRQUN2QywyRUFBMkU7UUFDM0Usd0RBQXdEO1dBQ3JELENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3ZFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO0lBQ3ZDLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFDL0UsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxlQUEwQyxFQUFFLEdBQUcsR0FBVyxxQkFBcUIsRUFBRTtJQUNoSCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU8sT0FBTyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxrREFBa0Q7QUFDbEQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUF3RTtJQUNsRyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQXNDLEVBQUUsS0FBSyxHQUFHLENBQUM7SUFDaEYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUYsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pGLE9BQU8sR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDM0IsQ0FBQztBQUVELDBHQUEwRztBQUMxRyxNQUFNLFVBQVUsa0JBQWtCLENBQUMsR0FBVyxFQUFFLElBQXNDO0lBQ3BGLE9BQU8sR0FBRyxHQUFHLFFBQVEsSUFBSSxDQUFDLFFBQVEsNEJBQTRCLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsdUJBQXVCLENBQUM7QUFDdEgsQ0FBQztBQWNELDZEQUE2RDtBQUM3RCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBYyxFQUFFLE9BQWUsRUFBRSxJQUFvQjtJQUN0RixPQUFPO1FBQ0wsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixNQUFNO1FBQ04sT0FBTztRQUNQLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtRQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixPQUFPLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDO1FBQ3pELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUM7S0FDekQsQ0FBQztBQUNKLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxPQUFlLEVBQUUsSUFBb0I7SUFDdEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsT0FBTyxHQUFHLE1BQU0sSUFBSSxPQUFPLCtCQUErQixJQUFJLENBQUMsUUFBUSw0QkFBNEIsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHO1VBQ2hJLDZGQUE2RixLQUFLLEVBQUUsQ0FBQztBQUMzRyxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYztJQUN2QyxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLEtBQWdDLENBQUM7SUFDM0MsSUFBSSxPQUFPLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDOUUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxRQUFnQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25JLE9BQU87UUFDTCxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDcEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQ1osV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQbHVnaW4gaW1hZ2Ugc2NhbiBnYXRlcyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCBcIlNjYW4gZ2F0ZXNcIik6IHRoZSBzaGFyZWRcbiAqIHZvY2FidWxhcnkgb2YgdGhlIGJ1aWxkLXRpbWUgZ2F0ZSwgdGhlIG5pZ2h0bHkgcmVzY2FuJ3MgZmxhZywgYW5kIHRoZVxuICogcmVzb2x1dGlvbiB3YXJuaW5nIC8gYmxvY2sg4oCUIHVzZWQgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlICh3aGljaCBzdG9yZXMgYW5kXG4gKiBlbmZvcmNlcyB0aGVtKSwgdGhlIHJlc29sdmVyIGluIHBpcGVsaW5lLWRhdGEgKHdoaWNoIHNraXBzIG9yIHdhcm5zKSwgYW5kIHRoZVxuICogZGFzaGJvYXJkICh3aGljaCBzaG93cyB0aGVtKS5cbiAqXG4gKiBBIGZpbmRpbmcgaXMgRklYQUJMRSB3aGVuIGdyeXBlIHJlcG9ydHMgYSBmaXhlZCB2ZXJzaW9uIGZvciBpdFxuICogKGB2dWxuZXJhYmlsaXR5LmZpeC5zdGF0ZSA9PSBcImZpeGVkXCJgIHdpdGggYXQgbGVhc3Qgb25lIHZlcnNpb24pOiB0aGUgZ2F0ZXNcbiAqIGNvdW50IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3Mgb25seSwgYmVjYXVzZSBhbiB1bmZpeGFibGUgb25lIGNhbid0IGJlXG4gKiBhY3RlZCBvbiBieSByZWJ1aWxkaW5nIG9yIHVwZ3JhZGluZy5cbiAqL1xuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IGVudkJvb2wsIGVudkludCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5cbi8qKiBPbmUgQ3JpdGljYWwvSGlnaCBmaW5kaW5nIGFzIHRoZSBmbGFnIGFuZCB0aGUgZ2F0ZSBtZXNzYWdlcyBjYXJyeSBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2NhbkZpbmRpbmcge1xuICAvKiogVGhlIHZ1bG5lcmFiaWxpdHkgaWQgKENWRS3igKYsIEdIU0Et4oCmKS4gKi9cbiAgaWQ6IHN0cmluZztcbiAgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfCAnaGlnaCc7XG4gIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gIHBhY2thZ2VWZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBWZXJzaW9ucyB0aGF0IGZpeCBpdDsgZW1wdHkgPSBubyBmaXggYXZhaWxhYmxlIChub3QgZml4YWJsZSkuICovXG4gIGZpeGVkSW46IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX2ZsYWdgIG9uIGEgdmVyc2lvbiB0aGUgbmlnaHRseSByZXNjYW4gZmxhZ2dlZDogaXRzIGZpeGFibGVcbiAqIENyaXRpY2FsL0hpZ2ggY291bnRzIGF0IHRoYXQgcmVzY2FuIGFuZCB0aGUgdG9wIGZpeGFibGUgZmluZGluZ3MuIFNldCB3aGlsZVxuICogZml4YWJsZSBDcml0aWNhbHMgZXhjZWVkIGBQTFVHSU5fVlVMTl9NQVhfQ1JJVElDQUxgLCBjbGVhcmVkIHdoZW4gYSByZXNjYW5cbiAqIGZpbmRzIHRoZW0gcmVzb2x2ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2NhbkZsYWcge1xuICAvKiogRml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncy4gKi9cbiAgY3JpdGljYWw6IG51bWJlcjtcbiAgLyoqIEZpeGFibGUgSGlnaCBmaW5kaW5ncy4gKi9cbiAgaGlnaDogbnVtYmVyO1xuICAvKiogVGhlIGZsb29yIGl0IHdhcyBjb21wYXJlZCBhZ2FpbnN0IChgUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMYCkuICovXG4gIG1heENyaXRpY2FsOiBudW1iZXI7XG4gIC8qKiBBdCBtb3N0IHtAbGluayBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTfSBmaXhhYmxlIGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX3N1bW1hcnlgIG9uIGV2ZXJ5IGluLXVzZSB2ZXJzaW9uOiB0aGUgTEFTVCByZXNjYW4ncyBmaW5kaW5ncywgd3JpdHRlblxuICogd2hldGhlciBvciBub3QgdGhlIGdhdGUgdHJpcHBlZC5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBQbHVnaW5TY2FuRmxhZ30sIHdoaWNoIGV4aXN0cyBvbmx5IHdoaWxlIGEgdmVyc2lvbiBpcyBvdmVyXG4gKiB0aGUgZmxvb3IuIEEgdmVyc2lvbiBjYXJyeWluZyBub3RoaW5nIGJ1dCBIaWdoIGZpbmRpbmdzIGlzIG5ldmVyIGZsYWdnZWQg4oCUIHNvIGFcbiAqIHJlcG9ydCB3aG9zZSBqb2IgaXMgdG8gc2hvdyBDcml0aWNhbCBBTkQgSGlnaCBleHBvc3VyZSBoYWQgbm8gc291cmNlIHRvIHJlYWQuXG4gKiBXaGF0IGEgcmVwb3J0IFNIT1dTIGFuZCB3aGF0IGEgYnVpbGQgUkVGVVNFUyBhcmUgZGlmZmVyZW50IHF1ZXN0aW9ucywgYW5kXG4gKiBjb25mbGF0aW5nIHRoZW0gbWVhbnQgdGhlIGFuc3dlciB0byB0aGUgZmlyc3Qgd2FzIFwibm90aGluZ1wiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5TdW1tYXJ5IHtcbiAgLyoqIEZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3MgYXQgdGhlIGxhc3QgcmVzY2FuLiAqL1xuICBjcml0aWNhbEZpeGFibGU6IG51bWJlcjtcbiAgLyoqIEZpeGFibGUgSGlnaCBmaW5kaW5ncyBhdCB0aGUgbGFzdCByZXNjYW4uICovXG4gIGhpZ2hGaXhhYmxlOiBudW1iZXI7XG4gIC8qKiBUb3RhbHMgaW5jbHVkaW5nIHVuZml4YWJsZSBmaW5kaW5ncywgZm9yIGNvbnRleHQuICovXG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgLyoqIEF0IG1vc3Qge0BsaW5rIFNDQU5fRkxBR19UT1BfRklORElOR1N9IGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogV2hlbiB0aGUgcmVzY2FuIHRoYXQgcHJvZHVjZWQgdGhpcyByYW4gKElTTykuICovXG4gIHNjYW5uZWRBdDogc3RyaW5nO1xuICAvKiogVGhlIGltYWdlIHRoaXMgZGVzY3JpYmVzLiBBIHZlcnNpb24gcmVidWlsdCBvbiBhIHBhdGNoZWQgYmFzZSBpcyBhXG4gICAqICBkaWZmZXJlbnQgYXJ0aWZhY3QsIHNvIGEgc3VtbWFyeSB3aXRob3V0IGl0cyBkaWdlc3QgY2Fubm90IGJlIHRydXN0ZWQuICovXG4gIGltYWdlRGlnZXN0Pzogc3RyaW5nO1xufVxuXG4vKiogRmluZGluZ3MgYSBmbGFnIC8gZ2F0ZSBtZXNzYWdlIGNhcnJpZXMuICovXG5leHBvcnQgY29uc3QgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKiogTG9va3VwIC8gcmVzb2x1dGlvbiB3YXJuaW5nIGNvZGUgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFZVTE5fRkxBR0dFRF9XQVJOSU5HID0gJ1ZVTE5fRkxBR0dFRCc7XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX01BWF9DUklUSUNBTGA6IHRoZSBwbGF0Zm9ybSBmbG9vciDigJQgYSB2ZXJzaW9uIHdpdGggTU9SRSBmaXhhYmxlXG4gKiBDcml0aWNhbCBmaW5kaW5ncyB0aGFuIHRoaXMgZmFpbHMgaXRzIGJ1aWxkIChgUExVR0lOX1ZVTE5fR0FURWApIGFuZCBpc1xuICogZmxhZ2dlZCBieSB0aGUgcmVzY2FuLiBEZWZhdWx0IGAwYDsgYC0xYCBkaXNhYmxlcyB0aGUgZmxvb3IgKGFuZCB0aGUgZmxhZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5WdWxuTWF4Q3JpdGljYWwoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudkludCgnUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMJywgMCwgeyBtaW46IC0xIH0pO1xufVxuXG4vKipcbiAqIEEgc2NvcGVkLCBFWFBJUklORyBleGVtcHRpb24gZnJvbSB0aGUgdnVsbmVyYWJpbGl0eSBmbG9vciBmb3Igb25lIHBsdWdpbi5cbiAqXG4gKiBgUExVR0lOX1ZVTE5fTUFYX0NSSVRJQ0FMYCBpcyB0aGUgb25seSBvdGhlciBsZXZlciBhbmQgaXQgaXMgZmFyIHRvbyBibHVudDpcbiAqIHJhaXNpbmcgaXQgYWJvdmUgMCBleGVtcHRzIGV2ZXJ5IHBsdWdpbiBmcm9tIGV2ZXJ5IENyaXRpY2FsLiBTb21lIGltYWdlc1xuICogZ2VudWluZWx5IGNhbm5vdCByZWFjaCB6ZXJvIOKAlCBhIGJyb3dzZXItYnVuZGxpbmcgdGVzdCBydW5uZXIgKGFydGlsbGVyeSBzaGlwc1xuICogQ2hyb21pdW0gdGhyb3VnaCBpdHMgb3duIEBwbGF5d3JpZ2h0L2Jyb3dzZXItY2hyb21pdW0gZGVwZW5kZW5jeSwgcGxheXdyaWdodFxuICogZG93bmxvYWRzIEZpcmVmb3gpIGlzIGF0IHVwc3RyZWFtJ3MgbGF0ZXN0IGFuZCBzdGlsbCBjYXJyaWVzIGZpeGFibGUgZmluZGluZ3MsXG4gKiBiZWNhdXNlIGJyb3dzZXJzIHNoaXAgQ1ZFIGZpeGVzIHdlZWtseSB3aGlsZSBwaW5uZWQgYnVpbGRzIGxhZyBieSBkZXNpZ24uXG4gKiBXaXRob3V0IGEgbmFycm93IGV4ZW1wdGlvbiB0aGUgb25seSBvcHRpb25zIGFyZSBcImJsb2NrIHRoZSBwbHVnaW4gZm9yZXZlclwiIG9yXG4gKiBcImRpc2FibGUgdGhlIGZsb29yIGZvciBldmVyeXRoaW5nXCIuXG4gKlxuICogVGhyZWUgcHJvcGVydGllcyBtYWtlIHRoaXMgYW4gZXhlbXB0aW9uIHJhdGhlciB0aGFuIGEgaG9sZSwgYW5kIGFsbCB0aHJlZSBhcmVcbiAqIGVuZm9yY2VkIGJlbG93IHJhdGhlciB0aGFuIGRvY3VtZW50ZWQgYW5kIGhvcGVkIGZvcjpcbiAqXG4gKiAgIFNDT1BFRCAgICB0byBvbmUgcGx1Z2luLCB0byBuYW1lZCBwYWNrYWdlcywgQU5EIHRvIHRoZSBzeXN0ZW0gb3JnLiBBIG5ld1xuICogICAgICAgICAgICAgQ3JpdGljYWwgaW4gYW55IG90aGVyIHBhY2thZ2Ugc3RpbGwgZmFpbHMgdGhlIGdhdGUsIHNvIGEgd2FpdmVyXG4gKiAgICAgICAgICAgICBjYW5ub3QgZ3JvdyBzaWxlbnRseSBpbnRvIFwidGhpcyBwbHVnaW4gaXMgZXhlbXB0XCIuIFRoZSBvcmcgYm91bmRcbiAqICAgICAgICAgICAgIG1hdHRlcnMgYmVjYXVzZSBwbHVnaW4gbmFtZXMgYXJlIHVuaXF1ZSBwZXIgKG5hbWUsIHZlcnNpb24sXG4gKiAgICAgICAgICAgICBvcmdJZCkgYW5kIE5PVCBnbG9iYWxseTogd2l0aG91dCBpdCwgYW55IHRlbmFudCBjb3VsZCBpbmhlcml0IGFuXG4gKiAgICAgICAgICAgICBleGVtcHRpb24gYnkgbmFtaW5nIHRoZWlyIHBsdWdpbiBgYXJ0aWxsZXJ5YC5cbiAqICAgRVhQSVJJTkcgIGV2ZXJ5IGVudHJ5IGNhcnJpZXMgYSBkYXRlIGFuZCBzdG9wcyBhcHBseWluZyBhZnRlciBpdC4gQSB3YWl2ZXJcbiAqICAgICAgICAgICAgIG5vYm9keSByZXZpc2l0cyBiZWNvbWVzIHBlcm1hbmVudDsgdGhpcyBvbmUgbGFwc2VzIG9uIGl0cyBvd24gYW5kXG4gKiAgICAgICAgICAgICB0aGUgcGx1Z2luIHN0YXJ0cyBmYWlsaW5nIGFnYWluLCB3aGljaCBpcyB0aGUgaW50ZW5kZWQgcHJvbXB0LlxuICogICBWSVNJQkxFICAgd2hhdCB3YXMgd2FpdmVkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIHNvIGl0IHJlYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICBtZXRyaWMsIHRoZSBhdWRpdCByZWNvcmQgYW5kIHRoZSBidWlsZCBtZXNzYWdlIGluc3RlYWQgb2ZcbiAqICAgICAgICAgICAgIHZhbmlzaGluZyBmcm9tIHRoZSBjb3VudC5cbiAqXG4gKiBGb3JtYXQg4oCUIGVudHJpZXMgYDtgLXNlcGFyYXRlZCwgZmllbGRzIGA6YC1zZXBhcmF0ZWQsIHBhY2thZ2VzIGAsYC1zZXBhcmF0ZWQ6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPWFydGlsbGVyeToyMDI2LTEyLTMxOmNocm9taXVtLGNocm9tZTtwbGF5d3JpZ2h0OjIwMjYtMTItMzE6ZmlyZWZveFxuICpcbiAqIEEgbWFsZm9ybWVkIGVudHJ5IGlzIERST1BQRUQsIG5ldmVyIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZDogdGhlIGZhaWx1cmUgbW9kZVxuICogb2YgYSB0eXBvIG11c3QgYmUgXCJ0aGUgZ2F0ZSBzdGlsbCBibG9ja3NcIiwgbm90IFwiZXZlcnl0aGluZyBpcyB3YWl2ZWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyIHtcbiAgLyoqIFBsdWdpbiBuYW1lIHRoZSB3YWl2ZXIgYXBwbGllcyB0byAoZXhhY3QgbWF0Y2gpLiAqL1xuICBwbHVnaW46IHN0cmluZztcbiAgLyoqXG4gICAqIFBsdWdpbiB2ZXJzaW9uIHRoZSB3YWl2ZXIgaXMgbGltaXRlZCB0bywgb3IgbnVsbCBmb3IgZXZlcnkgdmVyc2lvbi5cbiAgICpcbiAgICogQSB3YWl2ZXIgaXMgYSBqdWRnZW1lbnQgYWJvdXQgYSBTUEVDSUZJQyBpbWFnZSDigJQgXCJ0aGlzIHJlbGVhc2Ugb2YgYXJ0aWxsZXJ5XG4gICAqIGJ1bmRsZXMgYSBDaHJvbWl1bSB3ZSBjYW5ub3QgcGF0Y2hcIi4gTGVmdCB1bnBpbm5lZCBpdCBzaWxlbnRseSBjYXJyaWVzIHRvXG4gICAqIGV2ZXJ5IGZ1dHVyZSB2ZXJzaW9uLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBmaW5kaW5ncyBub2JvZHkgaGFzIGxvb2tlZCBhdCxcbiAgICogd2hpY2ggaXMgaG93IGEgbmFycm93IGV4ZW1wdGlvbiBiZWNvbWVzIGEgc3RhbmRpbmcgb25lLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEluY2x1c2l2ZSBleHBpcnkgKFVUQyBkYXRlKS4gQWZ0ZXIgaXQgdGhlIGVudHJ5IGhhcyBubyBlZmZlY3QuICovXG4gIGV4cGlyZXM6IERhdGU7XG4gIC8qKiBQYWNrYWdlIG5hbWVzIHdob3NlIGZpbmRpbmdzIGFyZSBleGVtcHQuIE5ldmVyIGVtcHR5IOKAlCBzZWUgcGFyc2VWdWxuV2FpdmVycy4gKi9cbiAgcGFja2FnZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogQSBkcm9wcGVkIGVudHJ5IGFuZCB3aHksIHNvIHRoZSBvcGVyYXRvciBjYW4gYmUgdG9sZCBpbnN0ZWFkIG9mIGd1ZXNzaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyUHJvYmxlbSB7XG4gIGVudHJ5OiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xufVxuXG4vKiogUGFyc2VkIHdhaXZlcnMgcGx1cyB0aGUgZW50cmllcyB0aGF0IHdlcmUgcmVqZWN0ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5XYWl2ZXJQYXJzZSB7XG4gIHdhaXZlcnM6IFZ1bG5XYWl2ZXJbXTtcbiAgcHJvYmxlbXM6IFZ1bG5XYWl2ZXJQcm9ibGVtW107XG59XG5cbi8qKlxuICogUGFyc2UgYFBMVUdJTl9WVUxOX1dBSVZFUlNgLCBSRVBPUlRJTkcgd2hhdCB3YXMgZHJvcHBlZC5cbiAqXG4gKiBEcm9wcGluZyBhIG1hbGZvcm1lZCBlbnRyeSBpcyB0aGUgc2FmZSBkaXJlY3Rpb24g4oCUIGEgdHlwbyBtdXN0IG5vdCBiZWNvbWUgYVxuICogd2lsZGNhcmQg4oCUIGJ1dCBzaWxlbnRseSBkcm9wcGluZyBpdCBpcyBhIHVzYWJpbGl0eSB0cmFwOiB0aGUgb3BlcmF0b3Igc2V0cyBhXG4gKiB3YWl2ZXIsIHRoZSBnYXRlIGtlZXBzIGJsb2NraW5nLCBhbmQgbm90aGluZyBhbnl3aGVyZSBzYXlzIHdoeS4gQ2FsbGVycyB0aGF0XG4gKiBjYW4gc3VyZmFjZSBpdCAoc2VydmljZSBib290KSB1c2UgdGhpczsgYHBhcnNlVnVsbldhaXZlcnNgIGlzIHRoZSBzaG9ydGhhbmRcbiAqIGZvciB0aGUgb25lcyB0aGF0IGNhbm5vdC5cbiAqXG4gKiBFbnRyeSBncmFtbWFyOiBgPHBsdWdpbj5bQDx2ZXJzaW9uPl06PFlZWVktTU0tREQ+Ojxwa2c+Wyw8cGtnPuKApl1gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZ1bG5XYWl2ZXJzVmVyYm9zZShyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb2Nlc3MuZW52LlBMVUdJTl9WVUxOX1dBSVZFUlMpOiBWdWxuV2FpdmVyUGFyc2Uge1xuICBjb25zdCB3YWl2ZXJzOiBWdWxuV2FpdmVyW10gPSBbXTtcbiAgY29uc3QgcHJvYmxlbXM6IFZ1bG5XYWl2ZXJQcm9ibGVtW10gPSBbXTtcbiAgaWYgKCFyYXc/LnRyaW0oKSkgcmV0dXJuIHsgd2FpdmVycywgcHJvYmxlbXMgfTtcbiAgY29uc3QgcmVqZWN0ID0gKGVudHJ5OiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKSA9PiB7IHByb2JsZW1zLnB1c2goeyBlbnRyeTogZW50cnkudHJpbSgpLCByZWFzb24gfSk7IH07XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiByYXcuc3BsaXQoJzsnKSkge1xuICAgIGlmICghZW50cnkudHJpbSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBbdGFyZ2V0LCBleHBpcmVzLCBwYWNrYWdlc10gPSBlbnRyeS5zcGxpdCgnOicpLm1hcCgoZikgPT4gZj8udHJpbSgpID8/ICcnKTtcbiAgICAvLyBFdmVyeSBmaWVsZCBpcyBSRVFVSVJFRC4gQW4gZW50cnkgbWlzc2luZyBpdHMgcGFja2FnZSBsaXN0IHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHJlYWQgYXMgXCJ3YWl2ZSB0aGlzIHBsdWdpbiBlbnRpcmVseVwiLCB3aGljaCBpcyB0aGUgb25lIHRoaW5nXG4gICAgLy8gdGhpcyBtdXN0IG5vdCBiZSBhYmxlIHRvIGV4cHJlc3MuXG4gICAgaWYgKCF0YXJnZXQgfHwgIWV4cGlyZXMgfHwgIXBhY2thZ2VzKSB7XG4gICAgICByZWplY3QoZW50cnksICdleHBlY3RlZCA8cGx1Z2luPltAPHZlcnNpb24+XTo8WVlZWS1NTS1ERD46PHBhY2thZ2U+Wyw8cGFja2FnZT7igKZdJyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYXQgPSB0YXJnZXQuaW5kZXhPZignQCcpO1xuICAgIGNvbnN0IHBsdWdpbiA9IGF0ID09PSAtMSA/IHRhcmdldCA6IHRhcmdldC5zbGljZSgwLCBhdCkudHJpbSgpO1xuICAgIGNvbnN0IHZlcnNpb24gPSBhdCA9PT0gLTEgPyBudWxsIDogdGFyZ2V0LnNsaWNlKGF0ICsgMSkudHJpbSgpO1xuICAgIGlmICghcGx1Z2luKSB7IHJlamVjdChlbnRyeSwgJ25vIHBsdWdpbiBuYW1lJyk7IGNvbnRpbnVlOyB9XG4gICAgaWYgKGF0ICE9PSAtMSAmJiAhdmVyc2lvbikgeyByZWplY3QoZW50cnksIFwiJ0AnIHdpdGggbm8gdmVyc2lvbiDigJQgb21pdCBpdCB0byBjb3ZlciBldmVyeSB2ZXJzaW9uXCIpOyBjb250aW51ZTsgfVxuICAgIGlmICghL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QoZXhwaXJlcykpIHsgcmVqZWN0KGVudHJ5LCBgZXhwaXJ5ICcke2V4cGlyZXN9JyBpcyBub3QgWVlZWS1NTS1ERGApOyBjb250aW51ZTsgfVxuICAgIGNvbnN0IHdoZW4gPSBuZXcgRGF0ZShgJHtleHBpcmVzfVQyMzo1OTo1OS45OTlaYCk7XG4gICAgaWYgKE51bWJlci5pc05hTih3aGVuLmdldFRpbWUoKSkpIHsgcmVqZWN0KGVudHJ5LCBgZXhwaXJ5ICcke2V4cGlyZXN9JyBpcyBub3QgYSByZWFsIGRhdGVgKTsgY29udGludWU7IH1cbiAgICBjb25zdCBuYW1lcyA9IHBhY2thZ2VzLnNwbGl0KCcsJykubWFwKChuKSA9PiBuLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHsgcmVqZWN0KGVudHJ5LCAnbm8gcGFja2FnZSBuYW1lcycpOyBjb250aW51ZTsgfVxuICAgIHdhaXZlcnMucHVzaCh7IHBsdWdpbiwgdmVyc2lvbiwgZXhwaXJlczogd2hlbiwgcGFja2FnZXM6IG5hbWVzIH0pO1xuICB9XG4gIHJldHVybiB7IHdhaXZlcnMsIHByb2JsZW1zIH07XG59XG5cbi8qKiBQYXJzZSBgUExVR0lOX1ZVTE5fV0FJVkVSU2AuIE1hbGZvcm1lZCBvciBpbmNvbXBsZXRlIGVudHJpZXMgYXJlIGRyb3BwZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWdWxuV2FpdmVycyhyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHByb2Nlc3MuZW52LlBMVUdJTl9WVUxOX1dBSVZFUlMpOiBWdWxuV2FpdmVyW10ge1xuICByZXR1cm4gcGFyc2VWdWxuV2FpdmVyc1ZlcmJvc2UocmF3KS53YWl2ZXJzO1xufVxuXG4vKiogV2hhdCBhIHdhaXZlciByZW1vdmVkIGZyb20gdGhlIGNvdW50LCBhbmQgd2hhdCBzdGlsbCBjb3VudHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXZlck91dGNvbWUge1xuICAvKiogRmluZGluZ3MgdGhlIGZsb29yIHN0aWxsIGNvdW50cy4gKi9cbiAgY291bnRlZDogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbiAgLyoqIEZpbmRpbmdzIGFuIHVuZXhwaXJlZCB3YWl2ZXIgZXhlbXB0ZWQgKGVtcHR5IHdoZW4gbm9uZSBhcHBsaWVkKS4gKi9cbiAgd2FpdmVkOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIFNwbGl0IGZpbmRpbmdzIGludG8gd2hhdCBzdGlsbCBjb3VudHMgYW5kIHdoYXQgYW4gdW5leHBpcmVkIHdhaXZlciBleGVtcHRzLlxuICpcbiAqIE1hdGNoaW5nIGlzIG9uIHRoZSBwYWNrYWdlIG5hbWUgYSB3YWl2ZXIgbmFtZXMsIGNhc2UtaW5zZW5zaXRpdmVseSwgYW5kIG9ubHlcbiAqIGZvciBmaW5kaW5ncyB0aGF0IGFyZSBGSVhBQkxFIOKAlCBhbiB1bmZpeGFibGUgZmluZGluZyBuZXZlciBjb3VudGVkIHRvd2FyZCB0aGVcbiAqIGZsb29yLCBzbyBcIndhaXZpbmdcIiBpdCB3b3VsZCBvdmVyc3RhdGUgd2hhdCB0aGUgd2FpdmVyIGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVZ1bG5XYWl2ZXJzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLFxuICB3YWl2ZXJzOiByZWFkb25seSBWdWxuV2FpdmVyW10gPSBwYXJzZVZ1bG5XYWl2ZXJzKCksXG4gIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCksXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwbHVnaW5WZXJzaW9uPzogc3RyaW5nLFxuKTogV2FpdmVyT3V0Y29tZSB7XG4gIC8vIFNZU1RFTSBPUkcgT05MWS4gUGx1Z2luIG5hbWVzIGFyZSB1bmlxdWUgcGVyIChuYW1lLCB2ZXJzaW9uLCBvcmdJZCksIE5PVFxuICAvLyBnbG9iYWxseSDigJQgYW55IHRlbmFudCBjYW4gY3JlYXRlIGEgcGx1Z2luIGNhbGxlZCBgYXJ0aWxsZXJ5YC4gTWF0Y2hpbmcgb25cbiAgLy8gdGhlIG5hbWUgYWxvbmUgd291bGQgaGFuZCBldmVyeSBvbmUgb2YgdGhlbSB0aGUgb3BlcmF0b3IncyBleGVtcHRpb24sIHNvIGFcbiAgLy8gdGVuYW50IGNvdWxkIGluaGVyaXQgYSB3YWl2ZXIgc2ltcGx5IGJ5IGNob29zaW5nIHRoZSBuYW1lLCBhbmQgc2hpcCBhblxuICAvLyBpbWFnZSB3aG9zZSBDcml0aWNhbHMgdGhlIGdhdGUgdGhlbiB3YXZlZCB0aHJvdWdoLiBUaGUgd2FpdmVycyBleGlzdCBmb3IgdGhlXG4gIC8vIE9mZmljaWFsIGNhdGFsb2cgdGhlIG9wZXJhdG9yIGN1cmF0ZXMsIHdoaWNoIGxpdmVzIGluIHRoZSBzeXN0ZW0gb3JnOyBhXG4gIC8vIGNhbGxlciB0aGF0IGNhbm5vdCBzYXkgd2hpY2ggb3JnIHRoaXMgYnVpbGQgYmVsb25ncyB0byBnZXRzIG5vIHdhaXZlci5cbiAgaWYgKG9yZ0lkID09PSB1bmRlZmluZWQgfHwgb3JnSWQudG9Mb3dlckNhc2UoKSAhPT0gU1lTVEVNX09SR19JRCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSB9O1xuICBjb25zdCBhY3RpdmUgPSB3YWl2ZXJzLmZpbHRlcigodykgPT4gdy5wbHVnaW4gPT09IHBsdWdpbk5hbWVcbiAgICAmJiB3LmV4cGlyZXMuZ2V0VGltZSgpID49IG5vdy5nZXRUaW1lKClcbiAgICAvLyBBIHZlcnNpb24tcGlubmVkIHdhaXZlciBjb3ZlcnMgdGhhdCB2ZXJzaW9uIG9ubHkuIEFuIHVucGlubmVkIG9uZSBjb3ZlcnNcbiAgICAvLyBldmVyeSB2ZXJzaW9uLCB3aGljaCBpcyB3aHkgdGhlIHBpbiBpcyB3b3J0aCB3cml0aW5nLlxuICAgICYmICh3LnZlcnNpb24gPT09IG51bGwgfHwgdy52ZXJzaW9uID09PSBwbHVnaW5WZXJzaW9uKSk7XG4gIGlmIChhY3RpdmUubGVuZ3RoID09PSAwKSByZXR1cm4geyBjb3VudGVkOiBbLi4uZmluZGluZ3NdLCB3YWl2ZWQ6IFtdIH07XG4gIGNvbnN0IGV4ZW1wdCA9IG5ldyBTZXQoYWN0aXZlLmZsYXRNYXAoKHcpID0+IHcucGFja2FnZXMubWFwKChuKSA9PiBuLnRvTG93ZXJDYXNlKCkpKSk7XG4gIGNvbnN0IGNvdW50ZWQ6IFBsdWdpblNjYW5GaW5kaW5nW10gPSBbXTtcbiAgY29uc3Qgd2FpdmVkOiBQbHVnaW5TY2FuRmluZGluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZiBvZiBmaW5kaW5ncykge1xuICAgIGlmIChmLmZpeGVkSW4ubGVuZ3RoID4gMCAmJiBleGVtcHQuaGFzKGYucGFja2FnZU5hbWUudG9Mb3dlckNhc2UoKSkpIHdhaXZlZC5wdXNoKGYpO1xuICAgIGVsc2UgY291bnRlZC5wdXNoKGYpO1xuICB9XG4gIHJldHVybiB7IGNvdW50ZWQsIHdhaXZlZCB9O1xufVxuXG4vKiogV2hldGhlciBgZml4YWJsZUNyaXRpY2FsYCBicmVha3MgdGhlIHBsYXRmb3JtIGZsb29yIChuZXZlciwgd2hlbiBkaXNhYmxlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkc1Z1bG5GbG9vcihmaXhhYmxlQ3JpdGljYWw6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIG1heDogbnVtYmVyID0gcGx1Z2luVnVsbk1heENyaXRpY2FsKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heCA+PSAwICYmIChmaXhhYmxlQ3JpdGljYWwgPz8gMCkgPiBtYXg7XG59XG5cbi8qKlxuICogYFBMVUdJTl9CTE9DS19PTl9ORVdfQ1JJVElDQUxgIChkZWZhdWx0IGZhbHNlKTogcmVzb2x1dGlvbiBTS0lQUyBmbGFnZ2VkXG4gKiB2ZXJzaW9ucyBmb3IgcmFuZ2VzIGFuZCB0aGUgZGVmYXVsdCAoZmFsbGluZyBiYWNrIHRvIHRoZSBuZXdlc3QgdW5mbGFnZ2VkXG4gKiBvbmUpLCBhbmQgYW4gZXhhY3QgcGluIHRvIGEgZmxhZ2dlZCB2ZXJzaW9uIGlzIHJlZnVzZWQgNDA5XG4gKiBgUExVR0lOX1ZFUlNJT05fVlVMTl9CTE9DS0VEYC4gT2ZmOiBmbGFnZ2VkIHZlcnNpb25zIHJlc29sdmUgd2l0aCBhXG4gKiBgVlVMTl9GTEFHR0VEYCB3YXJuaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tPbk5ld0NyaXRpY2FsKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnUExVR0lOX0JMT0NLX09OX05FV19DUklUSUNBTCcsIGZhbHNlKTtcbn1cblxuLyoqIGBwa2dAMS4yLjMg4oaSIDEuMi40YCAvIGBwa2dAMS4yLjMgKG5vIGZpeClgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRml4KGY6IFBpY2s8UGx1Z2luU2NhbkZpbmRpbmcsICdwYWNrYWdlTmFtZScgfCAncGFja2FnZVZlcnNpb24nIHwgJ2ZpeGVkSW4nPik6IHN0cmluZyB7XG4gIGNvbnN0IGF0ID0gYCR7Zi5wYWNrYWdlTmFtZX0ke2YucGFja2FnZVZlcnNpb24gPyBgQCR7Zi5wYWNrYWdlVmVyc2lvbn1gIDogJyd9YDtcbiAgcmV0dXJuIGYuZml4ZWRJbi5sZW5ndGggPiAwID8gYCR7YXR9IOKGkiAke2YuZml4ZWRJbi5qb2luKCcsICcpfWAgOiBgJHthdH0gKG5vIGZpeClgO1xufVxuXG4vKiogYENWRS0xIChvcGVuc3NsQDMuMC4xIOKGkiAzLjAuMik7IENWRS0yICjigKYpYCBmb3IgdGhlIGZpcnN0IGBsaW1pdGAgZmluZGluZ3MuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSwgbGltaXQgPSA1KTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvd24gPSBmaW5kaW5ncy5zbGljZSgwLCBsaW1pdCkubWFwKChmKSA9PiBgJHtmLmlkfSAoJHtkZXNjcmliZUZpeChmKX0pYCkuam9pbignOyAnKTtcbiAgY29uc3QgbW9yZSA9IGZpbmRpbmdzLmxlbmd0aCA+IGxpbWl0ID8gYDsgKyR7ZmluZGluZ3MubGVuZ3RoIC0gbGltaXR9IG1vcmVgIDogJyc7XG4gIHJldHVybiBgJHtzaG93bn0ke21vcmV9YDtcbn1cblxuLyoqIFRoZSB3YXJuaW5nIHRleHQgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uOiBgeEB2IGhhcyBOIGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3Mg4oCUIHJlYnVpbGQgb3IgdXBncmFkZWAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbkZsYWdnZWRNZXNzYWdlKHJlZjogc3RyaW5nLCBmbGFnOiBQaWNrPFBsdWdpblNjYW5GbGFnLCAnY3JpdGljYWwnPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyZWZ9IGhhcyAke2ZsYWcuY3JpdGljYWx9IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZyR7ZmxhZy5jcml0aWNhbCA9PT0gMSA/ICcnIDogJ3MnfSDigJQgcmVidWlsZCBvciB1cGdyYWRlYDtcbn1cblxuLyoqIEEgYFZVTE5fRkxBR0dFRGAgbG9va3VwIHdhcm5pbmcgKHRoZSBsb29rdXAgZW52ZWxvcGUncyBgd2FybmluZ3NbXWAgZW50cnkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICBjb2RlOiB0eXBlb2YgVlVMTl9GTEFHR0VEX1dBUk5JTkc7XG4gIHBsdWdpbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVG9wIGZpeGFibGUgZmluZGluZ3Mgd2l0aCB0aGVpciBmaXhlZCB2ZXJzaW9ucy4gKi9cbiAgZmluZGluZ3M6IFBsdWdpblNjYW5GaW5kaW5nW107XG59XG5cbi8qKiBCdWlsZCB0aGUgYFZVTE5fRkxBR0dFRGAgd2FybmluZyBmb3IgYHBsdWdpbkB2ZXJzaW9uYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuRmxhZ2dlZFdhcm5pbmcocGx1Z2luOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgZmxhZzogUGx1Z2luU2NhbkZsYWcpOiBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IFZVTE5fRkxBR0dFRF9XQVJOSU5HLFxuICAgIHBsdWdpbixcbiAgICB2ZXJzaW9uLFxuICAgIGNyaXRpY2FsOiBmbGFnLmNyaXRpY2FsLFxuICAgIGhpZ2g6IGZsYWcuaGlnaCxcbiAgICBtZXNzYWdlOiB2dWxuRmxhZ2dlZE1lc3NhZ2UoYCR7cGx1Z2lufUAke3ZlcnNpb259YCwgZmxhZyksXG4gICAgZmluZGluZ3M6IGZsYWcuZmluZGluZ3Muc2xpY2UoMCwgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyksXG4gIH07XG59XG5cbi8qKiBUaGUgNDA5IG1lc3NhZ2UgZm9yIGFuIGV4YWN0IHBpbiB0byBhIGZsYWdnZWQgdmVyc2lvbiB3aGlsZSBibG9ja2luZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuQmxvY2tlZE1lc3NhZ2UocGx1Z2luOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgZmxhZzogUGx1Z2luU2NhbkZsYWcpOiBzdHJpbmcge1xuICBjb25zdCBmaXhlcyA9IGZsYWcuZmluZGluZ3MubGVuZ3RoID4gMCA/IGAgRml4OiAke2Rlc2NyaWJlRmluZGluZ3MoZmxhZy5maW5kaW5ncyl9LmAgOiAnJztcbiAgcmV0dXJuIGAke3BsdWdpbn1AJHt2ZXJzaW9ufSBpcyBibG9ja2VkOiBhIHJlc2NhbiBmb3VuZCAke2ZsYWcuY3JpdGljYWx9IGZpeGFibGUgQ3JpdGljYWwgZmluZGluZyR7ZmxhZy5jcml0aWNhbCA9PT0gMSA/ICcnIDogJ3MnfSBgXG4gICAgKyBgKFBMVUdJTl9CTE9DS19PTl9ORVdfQ1JJVElDQUwpLiBSZWJ1aWxkIGl0IG9uIHBhdGNoZWQgcGFja2FnZXMgb3IgbW92ZSB0byBhIG5ld2VyIHZlcnNpb24uJHtmaXhlc31gO1xufVxuXG4vKiogTmFycm93IGFuIHVua25vd24gYHNjYW5fZmxhZ2AganNvbmIgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTY2FuRmxhZyh2YWx1ZTogdW5rbm93bik6IFBsdWdpblNjYW5GbGFnIHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHR5cGVvZiB2LmNyaXRpY2FsICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5oaWdoICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheSh2LmZpbmRpbmdzKSA/ICh2LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10pLmZpbHRlcigoZikgPT4gZiAmJiB0eXBlb2YgZi5pZCA9PT0gJ3N0cmluZycpIDogW107XG4gIHJldHVybiB7XG4gICAgY3JpdGljYWw6IHYuY3JpdGljYWwsXG4gICAgaGlnaDogdi5oaWdoLFxuICAgIG1heENyaXRpY2FsOiB0eXBlb2Ygdi5tYXhDcml0aWNhbCA9PT0gJ251bWJlcicgPyB2Lm1heENyaXRpY2FsIDogMCxcbiAgICBmaW5kaW5nczogZmluZGluZ3MubWFwKChmKSA9PiAoeyAuLi5mLCBmaXhlZEluOiBBcnJheS5pc0FycmF5KGYuZml4ZWRJbikgPyBmLmZpeGVkSW4gOiBbXSB9KSksXG4gIH07XG59XG4iXX0=
|
|
303
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGx1Z2luLXNjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXlIMUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUU3Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRTdDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLENBQW1FO0lBQ2hHLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3hELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUF5RixFQUN6RixLQUFtQztJQUVuQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZGLE1BQU0sUUFBUSxHQUFHO1FBQ2YsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFD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QUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNELFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGx1Z2luIGltYWdlIHNjYW4gZ2F0ZXMgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQgXCJTY2FuIGdhdGVzXCIpOiB0aGUgc2hhcmVkXG4gKiB2b2NhYnVsYXJ5IG9mIHRoZSBidWlsZC10aW1lIGdhdGUsIHRoZSBuaWdodGx5IHJlc2NhbidzIGZsYWcsIGFuZCB0aGVcbiAqIHJlc29sdXRpb24gd2FybmluZyAvIGJsb2NrIOKAlCB1c2VkIGJ5IHRoZSBwbHVnaW4gc2VydmljZSAod2hpY2ggc3RvcmVzIGFuZFxuICogZW5mb3JjZXMgdGhlbSksIHRoZSByZXNvbHZlciBpbiBwaXBlbGluZS1kYXRhICh3aGljaCBza2lwcyBvciB3YXJucyksIGFuZCB0aGVcbiAqIGRhc2hib2FyZCAod2hpY2ggc2hvd3MgdGhlbSkuXG4gKlxuICogQSBmaW5kaW5nIGlzIEZJWEFCTEUgd2hlbiBncnlwZSByZXBvcnRzIGEgZml4ZWQgdmVyc2lvbiBmb3IgaXRcbiAqIChgdnVsbmVyYWJpbGl0eS5maXguc3RhdGUgPT0gXCJmaXhlZFwiYCB3aXRoIGF0IGxlYXN0IG9uZSB2ZXJzaW9uKTogdGhlIGdhdGVzXG4gKiBjb3VudCBmaXhhYmxlIENyaXRpY2FsIGZpbmRpbmdzLCBiZWNhdXNlIGFuIHVuZml4YWJsZSBvbmUgY2FuJ3QgYmUgYWN0ZWQgb25cbiAqIGJ5IHJlYnVpbGRpbmcgb3IgdXBncmFkaW5nIOKAlCB3aXRoIE9ORSBleGNlcHRpb24uIEEgQ3JpdGljYWwgdGhhdCBDSVNBIGxpc3RzXG4gKiBhcyBLTk9XTiBFWFBMT0lURUQgKEtFVikgaXMgZ2F0ZWQgZXZlbiB3aXRoIG5vIGZpeCAoYFBMVUdJTl9WVUxOX0dBVEVfS0VWYCk6XG4gKiBcIm5vdGhpbmcgdG8gdXBncmFkZSB0b1wiIGlzIGEgcmVhc29uIHRvIG5vdCBzaGlwIHRoZSBpbWFnZSwgbm90IGEgcmVhc29uIHRvXG4gKiBzaGlwIGl0LCB3aGVuIHRoZSB2dWxuZXJhYmlsaXR5IGlzIGJlaW5nIGV4cGxvaXRlZCBpbiB0aGUgd2lsZC5cbiAqL1xuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IGVudkJvb2wsIGVudkludCwgZW52U3RyIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuLyoqIE9uZSBDcml0aWNhbC9IaWdoIGZpbmRpbmcgYXMgdGhlIGZsYWcgYW5kIHRoZSBnYXRlIG1lc3NhZ2VzIGNhcnJ5IGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TY2FuRmluZGluZyB7XG4gIC8qKiBUaGUgdnVsbmVyYWJpbGl0eSBpZCAoQ1ZFLeKApiwgR0hTQS3igKYpLiAqL1xuICBpZDogc3RyaW5nO1xuICBzZXZlcml0eTogJ2NyaXRpY2FsJyB8ICdoaWdoJztcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgcGFja2FnZVZlcnNpb246IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIHRoYXQgZml4IGl0OyBlbXB0eSA9IG5vIGZpeCBhdmFpbGFibGUgKG5vdCBmaXhhYmxlKS4gKi9cbiAgZml4ZWRJbjogc3RyaW5nW107XG4gIC8qKlxuICAgKiBDSVNBIGxpc3RzIGl0IGFzIEtOT1dOIEVYUExPSVRFRCAoZ3J5cGUncyBga25vd25FeHBsb2l0ZWRgKS4gQWJzZW50ID1cbiAgICogbm90IGxpc3RlZC4gQSBLRVYgQ3JpdGljYWwgaXMgZ2F0ZWQgZXZlbiB3aGVuIHVuZml4YWJsZSwgYW5kIG9ubHkgYW5cbiAgICogQURWSVNPUlktSUQgd2FpdmVyIGNhbiBleGVtcHQgaXQg4oCUIHNlZSB7QGxpbmsgYXBwbHlWdWxuV2FpdmVyc30uXG4gICAqL1xuICBrZXY/OiBib29sZWFuO1xuICAvKipcbiAgICogRVBTUyBwcm9iYWJpbGl0eSAoMOKAkzEpIHRoYXQgaXQgaXMgZXhwbG9pdGVkIGluIHRoZSBuZXh0IDMwIGRheXMsIGFzIGdyeXBlXG4gICAqIHJlcG9ydHMgaXQ7IGFic2VudCB3aGVuIHRoZSBEQiBjYXJyaWVzIG5vIHNjb3JlLiBDb250ZXh0IGZvciBhIHJlYWRlclxuICAgKiByYW5raW5nIGZpbmRpbmdzLCBuZXZlciBhIGdhdGUgaW5wdXQg4oCUIGEgcHJvYmFiaWxpdHkgaXMgbm90IGEgdmVyZGljdC5cbiAgICovXG4gIGVwc3M/OiBudW1iZXI7XG59XG5cbi8qKlxuICogYHNjYW5fZmxhZ2Agb24gYSB2ZXJzaW9uIHRoZSBuaWdodGx5IHJlc2NhbiBmbGFnZ2VkOiBpdHMgR0FURUQgQ3JpdGljYWxcbiAqIGNvdW50IGFuZCBmaXhhYmxlIEhpZ2ggY291bnQgYXQgdGhhdCByZXNjYW4sIGFuZCB0aGUgdG9wIGdhdGVkIGZpbmRpbmdzLiBTZXRcbiAqIHdoaWxlIGdhdGVkIGZpbmRpbmdzIGV4Y2VlZCBgUExVR0lOX1ZVTE5fTUFYX0ZJTkRJTkdTYCwgY2xlYXJlZCB3aGVuIGFcbiAqIHJlc2NhbiBmaW5kcyB0aGVtIHJlc29sdmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5GbGFnIHtcbiAgLyoqXG4gICAqIEdhdGVkIGZpbmRpbmdzIOKAlCBhdCBvciBhYm92ZSBgZmFpbE9uYCAoZGVmYXVsdCBDcml0aWNhbCk6IGZpeGFibGUgb25lcyxcbiAgICogcGx1cyB1bmZpeGFibGUgS0VWLWxpc3RlZCBvbmVzIHVuZGVyIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmAuXG4gICAqL1xuICBnYXRlZDogbnVtYmVyO1xuICAvKiogT2YgYGdhdGVkYCwgdGhlIEtFVi1saXN0ZWQgb25lcyAoQ0lTQSBrbm93biBleHBsb2l0ZWQpLiBBYnNlbnQgPSBub25lLiAqL1xuICBrZXY/OiBudW1iZXI7XG4gIC8qKiBGaXhhYmxlIEhpZ2ggZmluZGluZ3MuICovXG4gIGhpZ2g6IG51bWJlcjtcbiAgLyoqIFRoZSBmbG9vciBpdCB3YXMgY29tcGFyZWQgYWdhaW5zdCAoYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2ApLiAqL1xuICBtYXhGaW5kaW5nczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGBQTFVHSU5fVlVMTl9GQUlMX09OYCBpdCB3YXMgZ2F0ZWQgYXQsIHdoZW4gdGhhdCB3YXMgYGhpZ2hgICh0aGVuXG4gICAqIGBnYXRlZGAgY291bnRzIENyaXRpY2FsIEFORCBIaWdoIGZpbmRpbmdzKS4gQWJzZW50ID0gYGNyaXRpY2FsYC5cbiAgICogQ2FycmllZCBvbiB0aGUgZmxhZyBiZWNhdXNlIHRoZSBzZXJ2aWNlcyB0aGF0IFJFTkRFUiBpdCAodGhlIHJlc29sdmVyLFxuICAgKiB0aGUgZGFzaGJvYXJkKSBkbyBub3Qgc2hhcmUgdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgZW52aXJvbm1lbnQuXG4gICAqL1xuICBmYWlsT24/OiAnaGlnaCc7XG4gIC8qKiBBdCBtb3N0IHtAbGluayBTQ0FOX0ZMQUdfVE9QX0ZJTkRJTkdTfSBmaXhhYmxlIGZpbmRpbmdzLCBDcml0aWNhbHMgZmlyc3QuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIGBzY2FuX3N1bW1hcnlgIG9uIGV2ZXJ5IHNjYW5uZWQgdmVyc2lvbjogdGhlIExBVEVTVCBzY2FuJ3MgZmluZGluZ3Mg4oCUIHdyaXR0ZW5cbiAqIGJ5IHRoZSBidWlsZCB0aGF0IGVzdGFibGlzaGVkIHRoZSB2ZXJzaW9uIGFuZCByZXdyaXR0ZW4gYnkgZXZlcnkgcmVzY2FuIOKAlFxuICogd2hldGhlciBvciBub3QgdGhlIGdhdGUgdHJpcHBlZC5cbiAqXG4gKiBEaXN0aW5jdCBmcm9tIHtAbGluayBQbHVnaW5TY2FuRmxhZ30sIHdoaWNoIGV4aXN0cyBvbmx5IHdoaWxlIGEgdmVyc2lvbiBpcyBvdmVyXG4gKiB0aGUgZmxvb3IuIEEgdmVyc2lvbiBjYXJyeWluZyBub3RoaW5nIGJ1dCBIaWdoIGZpbmRpbmdzIGlzIG5ldmVyIGZsYWdnZWQg4oCUIHNvIGFcbiAqIHJlcG9ydCB3aG9zZSBqb2IgaXMgdG8gc2hvdyBDcml0aWNhbCBBTkQgSGlnaCBleHBvc3VyZSBoYWQgbm8gc291cmNlIHRvIHJlYWQuXG4gKiBXaGF0IGEgcmVwb3J0IFNIT1dTIGFuZCB3aGF0IGEgYnVpbGQgUkVGVVNFUyBhcmUgZGlmZmVyZW50IHF1ZXN0aW9ucywgYW5kXG4gKiBjb25mbGF0aW5nIHRoZW0gbWVhbnQgdGhlIGFuc3dlciB0byB0aGUgZmlyc3Qgd2FzIFwibm90aGluZ1wiLlxuICpcbiAqIEl0IGlzIGFsc28gdGhlIHJlc2NhbidzIEJBU0VMSU5FLiBcIklzIGFueXRoaW5nIG5ldz9cIiBpcyBhbnN3ZXJlZCBieSBkaWZmaW5nXG4gKiBmaW5kaW5nIGlkZW50aXRpZXMgYWdhaW5zdCB0aGUgcHJldmlvdXMgc3VtbWFyeSAoe0BsaW5rIG5ld1NjYW5GaW5kaW5nc30pLFxuICogbm90IGJ5IGNvbXBhcmluZyBjb3VudHM6IG9uZSBDVkUgZml4ZWQgYW5kIGEgZGlmZmVyZW50IG9uZSBwdWJsaXNoZWQgbGVhdmVzXG4gKiB0aGUgY291bnQgdW5jaGFuZ2VkIGFuZCBoaWRlcyBhIGJyYW5kLW5ldyBDcml0aWNhbC5cbiAqXG4gKiBDT05UUkFDVCDigJQgcmVhZCBieSB0aGUgcmVwb3J0aW5nIC8gZXhwb3N1cmUgY29kZSBpbiBwaXBlbGluZS1kYXRhLiBGaWVsZHMgYXJlXG4gKiBvbmx5IGV2ZXIgYWRkZWQ7IGV2ZXJ5IGZpZWxkIGJlbG93IGlzIHByZXNlbnQgb24gZXZlcnkgc3VtbWFyeSB3cml0dGVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNjYW5TdW1tYXJ5IHtcbiAgLyoqIEZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3MuICovXG4gIGNyaXRpY2FsRml4YWJsZTogbnVtYmVyO1xuICAvKiogRml4YWJsZSBIaWdoIGZpbmRpbmdzLiAqL1xuICBoaWdoRml4YWJsZTogbnVtYmVyO1xuICAvKiogVG90YWxzIGluY2x1ZGluZyB1bmZpeGFibGUgZmluZGluZ3MuICovXG4gIGNyaXRpY2FsOiBudW1iZXI7XG4gIGhpZ2g6IG51bWJlcjtcbiAgbWVkaXVtOiBudW1iZXI7XG4gIGxvdzogbnVtYmVyO1xuICAvKiogS0VWLWxpc3RlZCAoQ0lTQSBrbm93biBleHBsb2l0ZWQpIENyaXRpY2FsICsgSGlnaCBmaW5kaW5ncy4gKi9cbiAga2V2OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFVkVSWSBDcml0aWNhbCBhbmQgSGlnaCBmaW5kaW5nIOKAlCBmaXhhYmxlIEFORCB1bmZpeGFibGUg4oCUIENyaXRpY2FscyBmaXJzdCxcbiAgICogY2FwcGVkIGF0IHtAbGluayBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTfS4gYHRydW5jYXRlZGAgc2F5cyB3aGV0aGVyIHRoZVxuICAgKiBjYXAgY3V0IGl0OyB0aGUgY291bnRzIGFib3ZlIGFyZSBuZXZlciBjYXBwZWQuXG4gICAqL1xuICBmaW5kaW5nczogUGx1Z2luU2NhbkZpbmRpbmdbXTtcbiAgdHJ1bmNhdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogS2V5cyAoe0BsaW5rIHNjYW5GaW5kaW5nS2V5fSkgb2YgdGhlIGZpbmRpbmdzIGEgYFBMVUdJTl9WVUxOX1dBSVZFUlNgIGVudHJ5XG4gICAqIGV4ZW1wdGVkIGZyb20gdGhlIGZsb29yIGF0IHRoaXMgc2Nhbi4gVGhleSBhcmUgc3RpbGwgaW4gYGZpbmRpbmdzYCDigJQgYVxuICAgKiB3YWl2ZXIgY2hhbmdlcyB0aGUgdmVyZGljdCwgbm90IHdoYXQgdGhlIGltYWdlIGNvbnRhaW5zLlxuICAgKi9cbiAgd2FpdmVkOiBzdHJpbmdbXTtcbiAgLyoqIFdoZW4gdGhpcyBzY2FuIHJhbiAoSVNPKS4gKi9cbiAgc2Nhbm5lZEF0OiBzdHJpbmc7XG4gIC8qKiBXaGljaCBwYXRoIHdyb3RlIGl0LiAqL1xuICB0cmlnZ2VyOiAnYnVpbGQnIHwgJ3Jlc2NhbicgfCAncHJvbW90ZSc7XG4gIC8qKiBUaGUgaW1hZ2UgdGhpcyBkZXNjcmliZXMuIEEgdmVyc2lvbiByZWJ1aWx0IG9uIGEgcGF0Y2hlZCBiYXNlIGlzIGFcbiAgICogIGRpZmZlcmVudCBhcnRpZmFjdCwgc28gYSBzdW1tYXJ5IHdpdGhvdXQgaXRzIGRpZ2VzdCBjYW5ub3QgYmUgdHJ1c3RlZC4gKi9cbiAgaW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhlIHZ1bG5lcmFiaWxpdHkgREIgdGhlIHNjYW4gbWF0Y2hlZCBhZ2FpbnN0IHdhcyBCVUlMVCAoSVNPKSwgb3IgbnVsbFxuICAgKiB3aGVuIGl0IGNvdWxkIG5vdCBiZSByZWFkLiBBIHNjYW4gaXMgb25seSBhcyBjdXJyZW50IGFzIGl0cyBEQjogYSBjbGVhblxuICAgKiByZXN1bHQgZnJvbSBhIHdlZWstb2xkIERCIHNheXMgbm90aGluZyBhYm91dCB0aGlzIHdlZWsncyBDVkVzLlxuICAgKi9cbiAgZGJCdWlsdEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogRXhlY3V0YWJsZXMgaW4gdGhlIGltYWdlIHRoYXQgTk8gU0JPTSBwYWNrYWdlIGFjY291bnRzIGZvciDigJQgVVBYLXBhY2tlZCBvclxuICAgKiBzdHJpcHBlZCBHbywgSGFza2VsbCwgR3JhYWxWTSBuYXRpdmUgaW1hZ2VzLCBOb2RlIFNFQSBidW5kbGVzLCB2ZW5kb3JlZFxuICAgKiBicm93c2Vycy4gVGhlIHNjYW5uZXIgY2Fubm90IHNlZSBpbnNpZGUgdGhlbSwgc28gdGhlaXIgQ1ZFcyBhcmUgaW52aXNpYmxlIHRvXG4gICAqIGV2ZXJ5IGNvdW50IGFib3ZlLiBQYXRocywgc29ydGVkLCBjYXBwZWQgYXQge0BsaW5rIFNDQU5fU1VNTUFSWV9NQVhfQklOQVJJRVN9LlxuICAgKiBJbmZvcm1hdGlvbmFsOiBuZXZlciBhIGdhdGUuXG4gICAqL1xuICB1bmNhdGFsb2d1ZWRCaW5hcmllczogc3RyaW5nW107XG59XG5cbi8qKiBGaW5kaW5ncyBhIHN1bW1hcnkgaXRlbWl6ZXMuIENvdW50cyBhcmUgbmV2ZXIgY2FwcGVkOyB0aGlzIGJvdW5kcyB0aGUganNvbmIuICovXG5leHBvcnQgY29uc3QgU0NBTl9TVU1NQVJZX01BWF9GSU5ESU5HUyA9IDUwMDtcblxuLyoqIFVuY2F0YWxvZ3VlZCBiaW5hcmllcyBhIHN1bW1hcnkgbGlzdHMuICovXG5leHBvcnQgY29uc3QgU0NBTl9TVU1NQVJZX01BWF9CSU5BUklFUyA9IDIwMDtcblxuLyoqXG4gKiBBIGZpbmRpbmcncyBpZGVudGl0eTogdGhlIGFkdmlzb3J5IGluIGEgc3BlY2lmaWMgcGFja2FnZSB2ZXJzaW9uLiBUaGUgc2FtZVxuICogQ1ZFIGluIHR3byBwYWNrYWdlcyBpcyB0d28gZmluZGluZ3M7IHRoZSBzYW1lIENWRSByZXBvcnRlZCBhZ2FpbiBhZnRlciBhXG4gKiByZXNjYW4gaXMgdGhlIHNhbWUgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbkZpbmRpbmdLZXkoZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ2lkJyB8ICdwYWNrYWdlTmFtZScgfCAncGFja2FnZVZlcnNpb24nPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtmLmlkfXwke2YucGFja2FnZU5hbWV9fCR7Zi5wYWNrYWdlVmVyc2lvbn1gO1xufVxuXG4vKipcbiAqIFRoZSBDcml0aWNhbC9IaWdoIGZpbmRpbmdzIGluIGBhZnRlcmAgdGhhdCB0aGUgcHJldmlvdXMgc3VtbWFyeSBkaWQgbm90XG4gKiBjYXJyeSDigJQgd2hhdCBOMzEgYW5kIGFuIGFkdmlzb3J5IGRyYWZ0IGFyZSBhYm91dC5cbiAqXG4gKiBObyBwcmV2aW91cyBzdW1tYXJ5IG1lYW5zIG5vIGJhc2VsaW5lOiBldmVyeSBmaW5kaW5nIGlzIG5ldy4gQSBUUlVOQ0FURURcbiAqIGJhc2VsaW5lIGtub3dzIG9ubHkgaXRzIGZpcnN0IHtAbGluayBTQ0FOX1NVTU1BUllfTUFYX0ZJTkRJTkdTfSBmaW5kaW5nc1xuICogKENyaXRpY2FscyBmaXJzdCksIHNvIGEgZmluZGluZyBtaXNzaW5nIGZyb20gaXQgaXMgbmV3IG9ubHkgaWYgdGhlIGJhc2VsaW5lXG4gKiBwcm92YWJseSBsaXN0ZWQgZXZlcnkgZmluZGluZyBvZiB0aGF0IHNldmVyaXR5IOKAlCBvdGhlcndpc2UgaXQgbWF5IHNpbXBseSBoYXZlXG4gKiBiZWVuIGN1dCwgYW5kIHJlcG9ydGluZyBpdCBhcyBuZXcgd291bGQgYmUgYSBmYWxzZSBhbGFybSBvbiBldmVyeSBwYXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3U2NhbkZpbmRpbmdzKFxuICBiZWZvcmU6IFBpY2s8UGx1Z2luU2NhblN1bW1hcnksICdmaW5kaW5ncycgfCAndHJ1bmNhdGVkJyB8ICdjcml0aWNhbCc+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYWZ0ZXI6IHJlYWRvbmx5IFBsdWdpblNjYW5GaW5kaW5nW10sXG4pOiBQbHVnaW5TY2FuRmluZGluZ1tdIHtcbiAgaWYgKCFiZWZvcmUpIHJldHVybiBbLi4uYWZ0ZXJdO1xuICBjb25zdCBrbm93biA9IG5ldyBTZXQoYmVmb3JlLmZpbmRpbmdzLm1hcChzY2FuRmluZGluZ0tleSkpO1xuICBjb25zdCBsaXN0ZWRDcml0aWNhbCA9IGJlZm9yZS5maW5kaW5ncy5maWx0ZXIoKGYpID0+IGYuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpLmxlbmd0aDtcbiAgY29uc3QgY29tcGxldGUgPSB7XG4gICAgY3JpdGljYWw6ICFiZWZvcmUudHJ1bmNhdGVkIHx8IGxpc3RlZENyaXRpY2FsID49IGJlZm9yZS5jcml0aWNhbCxcbiAgICBoaWdoOiAhYmVmb3JlLnRydW5jYXRlZCxcbiAgfTtcbiAgcmV0dXJuIGFmdGVyLmZpbHRlcigoZikgPT4gY29tcGxldGVbZi5zZXZlcml0eV0gJiYgIWtub3duLmhhcyhzY2FuRmluZGluZ0tleShmKSkpO1xufVxuXG4vKiogRmluZGluZ3MgYSBmbGFnIC8gZ2F0ZSBtZXNzYWdlIGNhcnJpZXMuICovXG5leHBvcnQgY29uc3QgU0NBTl9GTEFHX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKiogTG9va3VwIC8gcmVzb2x1dGlvbiB3YXJuaW5nIGNvZGUgZm9yIGEgZmxhZ2dlZCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFZVTE5fRkxBR0dFRF9XQVJOSU5HID0gJ1ZVTE5fRkxBR0dFRCc7XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2A6IHRoZSBwbGF0Zm9ybSBmbG9vciDigJQgYSB2ZXJzaW9uIHdpdGggTU9SRSBnYXRlZFxuICogZmluZGluZ3MgKGZpeGFibGUsIG9yIEtFVi1saXN0ZWQsIGF0IG9yIGFib3ZlIGBQTFVHSU5fVlVMTl9GQUlMX09OYCkgdGhhblxuICogdGhpcyBmYWlscyBpdHMgYnVpbGQgKGBQTFVHSU5fVlVMTl9HQVRFYCkgYW5kIGlzXG4gKiBmbGFnZ2VkIGJ5IHRoZSByZXNjYW4uIERlZmF1bHQgYDBgOyBgLTFgIGRpc2FibGVzIHRoZSBmbG9vciAoYW5kIHRoZSBmbGFnKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblZ1bG5NYXhGaW5kaW5ncygpOiBudW1iZXIge1xuICByZXR1cm4gZW52SW50KCdQTFVHSU5fVlVMTl9NQVhfRklORElOR1MnLCAwLCB7IG1pbjogLTEgfSk7XG59XG5cbi8qKlxuICogVGhlIGxvd2VzdCBzZXZlcml0eSB0aGUgZmxvb3IgZ2F0ZXMgb24g4oCUIHRoZSBwbHVnaW4gc2VydmljZSdzIGAtLWZhaWwtb25gLlxuICogT25seSBgY3JpdGljYWxgIGFuZCBgaGlnaGAgYXJlIHBvc3NpYmxlOiB0aG9zZSBhcmUgdGhlIHNldmVyaXRpZXMgYSBzY2FuXG4gKiBpdGVtaXplcyAoTWVkaXVtL0xvdyBhcmUgY291bnRlZCwgbmV2ZXIgbGlzdGVkKSwgYW5kIGEgZmxvb3IgY2FuIG9ubHkgZ2F0ZSBvblxuICogZmluZGluZ3MgaXQgY2FuIG5hbWUsIHdhaXZlIGFuZCByZXBvcnQuXG4gKi9cbmV4cG9ydCB0eXBlIFBsdWdpblZ1bG5GYWlsT24gPSAnY3JpdGljYWwnIHwgJ2hpZ2gnO1xuXG4vKipcbiAqIGBQTFVHSU5fVlVMTl9GQUlMX09OYCAoZGVmYXVsdCBgY3JpdGljYWxgKTogdGhlIHNldmVyaXR5IGF0IGFuZCBhYm92ZSB3aGljaCBhXG4gKiBmaXhhYmxlIChvciBLRVYtbGlzdGVkKSBmaW5kaW5nIGNvdW50cyBhZ2FpbnN0IGBQTFVHSU5fVlVMTl9NQVhfRklORElOR1NgLlxuICogYGhpZ2hgIGdhdGVzIENyaXRpY2FsIEFORCBIaWdoLiBBbnkgb3RoZXIgdmFsdWUgcmVzb2x2ZXMgdG8gYGhpZ2hgLCB0aGVcbiAqIFNUUklDVEVSIHNldHRpbmc6IHRoZSBmYWlsdXJlIG1vZGUgb2YgYSB0eXBvIG11c3QgYmUgXCJ0aGUgZ2F0ZSBibG9ja3MgbW9yZVwiLFxuICogbmV2ZXIgXCJ0aGUgZ2F0ZSBibG9ja3MgbGVzc1wiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luVnVsbkZhaWxPbigpOiBQbHVnaW5WdWxuRmFpbE9uIHtcbiAgcmV0dXJuIGVudlN0cignUExVR0lOX1ZVTE5fRkFJTF9PTicsICdjcml0aWNhbCcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnY3JpdGljYWwnID8gJ2NyaXRpY2FsJyA6ICdoaWdoJztcbn1cblxuLyoqIFdoZXRoZXIgYSBzZXZlcml0eSBpcyBhdCBvciBhYm92ZSB0aGUgZ2F0aW5nIHRocmVzaG9sZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdE9yQWJvdmVGYWlsT24oc2V2ZXJpdHk6IFBsdWdpblNjYW5GaW5kaW5nWydzZXZlcml0eSddLCBmYWlsT246IFBsdWdpblZ1bG5GYWlsT24gPSBwbHVnaW5WdWxuRmFpbE9uKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNldmVyaXR5ID09PSAnY3JpdGljYWwnIHx8IGZhaWxPbiA9PT0gJ2hpZ2gnO1xufVxuXG4vKipcbiAqIFRoZSBzY2FubmVyJ3MgZml4YWJsZSBjb3VudCBhdCBvciBhYm92ZSB0aGUgdGhyZXNob2xkIOKAlCB3aGF0IHRoZSBmbG9vciByZWFkc1xuICogd2hlbiBhIHNjYW4gcmVjb3JkZWQgY291bnRzIGJ1dCBubyBmaW5kaW5ncyB0byBkZXJpdmUgaXQgZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGVkRml4YWJsZUNvdW50KFxuICBjb3VudHM6IHsgdnVsbkNyaXRpY2FsRml4YWJsZTogbnVtYmVyIHwgbnVsbDsgdnVsbkhpZ2hGaXhhYmxlOiBudW1iZXIgfCBudWxsIH0sXG4gIGZhaWxPbjogUGx1Z2luVnVsbkZhaWxPbiA9IHBsdWdpblZ1bG5GYWlsT24oKSxcbik6IG51bWJlciB7XG4gIHJldHVybiAoY291bnRzLnZ1bG5Dcml0aWNhbEZpeGFibGUgPz8gMCkgKyAoZmFpbE9uID09PSAnaGlnaCcgPyBjb3VudHMudnVsbkhpZ2hGaXhhYmxlID8/IDAgOiAwKTtcbn1cblxuLyoqIGBDcml0aWNhbGAgLyBgQ3JpdGljYWwgb3IgSGlnaGAg4oCUIHRoZSBnYXRlZCBzZXZlcml0aWVzLCBmb3IgbWVzc2FnZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbE9uTGFiZWwoZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZhaWxPbiA9PT0gJ2NyaXRpY2FsJyA/ICdDcml0aWNhbCcgOiAnQ3JpdGljYWwgb3IgSGlnaCc7XG59XG5cbi8qKlxuICogYFBMVUdJTl9WVUxOX0dBVEVfS0VWYCAoZGVmYXVsdCB0cnVlKTogYSBDcml0aWNhbCBDSVNBIGxpc3RzIGFzIGtub3duXG4gKiBleHBsb2l0ZWQgY291bnRzIGFnYWluc3QgdGhlIGZsb29yIGV2ZW4gd2hlbiBpdCBoYXMgTk8gZml4LiBPZmYsIEtFViBmaW5kaW5nc1xuICogYXJlIGdhdGVkIGV4YWN0bHkgbGlrZSBhbnkgb3RoZXIgQ3JpdGljYWwgKGZpeGFibGUgb25seSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5WdWxuR2F0ZUtldigpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudkJvb2woJ1BMVUdJTl9WVUxOX0dBVEVfS0VWJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZpbmRpbmcgY291bnRzIGFnYWluc3QgdGhlIGZsb29yOiBhIGZpeGFibGUgZmluZGluZyBhdCBvciBhYm92ZVxuICogYFBMVUdJTl9WVUxOX0ZBSUxfT05gIChkZWZhdWx0IENyaXRpY2FsKSwgb3Ig4oCUIHVuZGVyIGBQTFVHSU5fVlVMTl9HQVRFX0tFVmBcbiAqIOKAlCBhIEtFVi1saXN0ZWQgb25lIGF0IG9yIGFib3ZlIGl0IHdpdGggb3Igd2l0aG91dCBhIGZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2F0ZWRGaW5kaW5nKFxuICBmOiBQaWNrPFBsdWdpblNjYW5GaW5kaW5nLCAnc2V2ZXJpdHknIHwgJ2ZpeGVkSW4nIHwgJ2tldic+LFxuICBrZXZHYXRlOiBib29sZWFuID0gcGx1Z2luVnVsbkdhdGVLZXYoKSxcbiAgZmFpbE9uOiBQbHVnaW5WdWxuRmFpbE9uID0gcGx1Z2luVnVsbkZhaWxPbigpLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdE9yQWJvdmVGYWlsT24oZi5zZXZlcml0eSwgZmFpbE9uKSAmJiAoZi5maXhlZEluLmxlbmd0aCA+IDAgfHwgKGtldkdhdGUgJiYgZi5rZXYgPT09IHRydWUpKTtcbn1cblxuLyoqXG4gKiBBIHNjb3BlZCwgRVhQSVJJTkcgZXhlbXB0aW9uIGZyb20gdGhlIHZ1bG5lcmFiaWxpdHkgZmxvb3IgZm9yIG9uZSBwbHVnaW4uXG4gKlxuICogYFBMVUdJTl9WVUxOX01BWF9GSU5ESU5HU2AgaXMgdGhlIG9ubHkgb3RoZXIgbGV2ZXIgYW5kIGl0IGlzIGZhciB0b28gYmx1bnQ6XG4gKiByYWlzaW5nIGl0IGFib3ZlIDAgZXhlbXB0cyBldmVyeSBwbHVnaW4gZnJvbSBldmVyeSBDcml0aWNhbC4gU29tZSBpbWFnZXNcbiAqIGdlbnVpbmVseSBjYW5ub3QgcmVhY2ggemVybyDigJQgYSBicm93c2VyLWJ1bmRsaW5nIHRlc3QgcnVubmVyIChhcnRpbGxlcnkgc2hpcHNcbiAqIENocm9taXVtIHRocm91Z2ggaXRzIG93biBAcGxheXdyaWdodC9icm93c2VyLWNocm9taXVtIGRlcGVuZGVuY3ksIHBsYXl3cmlnaHRcbiAqIGRvd25sb2FkcyBGaXJlZm94KSBpcyBhdCB1cHN0cmVhbSdzIGxhdGVzdCBhbmQgc3RpbGwgY2FycmllcyBmaXhhYmxlIGZpbmRpbmdzLFxuICogYmVjYXVzZSBicm93c2VycyBzaGlwIENWRSBmaXhlcyB3ZWVrbHkgd2hpbGUgcGlubmVkIGJ1aWxkcyBsYWcgYnkgZGVzaWduLlxuICogV2l0aG91dCBhIG5hcnJvdyBleGVtcHRpb24gdGhlIG9ubHkgb3B0aW9ucyBhcmUgXCJibG9jayB0aGUgcGx1Z2luIGZvcmV2ZXJcIiBvclxuICogXCJkaXNhYmxlIHRoZSBmbG9vciBmb3IgZXZlcnl0aGluZ1wiLlxuICpcbiAqIFRocmVlIHByb3BlcnRpZXMgbWFrZSB0aGlzIGFuIGV4ZW1wdGlvbiByYXRoZXIgdGhhbiBhIGhvbGUsIGFuZCBhbGwgdGhyZWUgYXJlXG4gKiBlbmZvcmNlZCBiZWxvdyByYXRoZXIgdGhhbiBkb2N1bWVudGVkIGFuZCBob3BlZCBmb3I6XG4gKlxuICogICBTQ09QRUQgICAgdG8gb25lIHBsdWdpbiAob3IsIGZsZWV0LXdpZGUsIHRvIG5hbWVkIGFkdmlzb3JpZXMgb25seSksIHRvXG4gKiAgICAgICAgICAgICBuYW1lZCBwYWNrYWdlcy9hZHZpc29yaWVzLCBBTkQgdG8gdGhlIHN5c3RlbSBvcmcuIEEgbmV3IENyaXRpY2FsXG4gKiAgICAgICAgICAgICBpbiBhbnl0aGluZyBub3QgbmFtZWQgc3RpbGwgZmFpbHMgdGhlIGdhdGUsIHNvIGEgd2FpdmVyIGNhbm5vdFxuICogICAgICAgICAgICAgZ3JvdyBzaWxlbnRseSBpbnRvIFwidGhpcyBwbHVnaW4gaXMgZXhlbXB0XCIuIFRoZSBvcmcgYm91bmRcbiAqICAgICAgICAgICAgIG1hdHRlcnMgYmVjYXVzZSBwbHVnaW4gbmFtZXMgYXJlIHVuaXF1ZSBwZXIgKG5hbWUsIHZlcnNpb24sXG4gKiAgICAgICAgICAgICBvcmdJZCkgYW5kIE5PVCBnbG9iYWxseTogd2l0aG91dCBpdCwgYW55IHRlbmFudCBjb3VsZCBpbmhlcml0IGFuXG4gKiAgICAgICAgICAgICBleGVtcHRpb24gYnkgbmFtaW5nIHRoZWlyIHBsdWdpbiBgYXJ0aWxsZXJ5YC5cbiAqICAgRVhQSVJJTkcgIGV2ZXJ5IGVudHJ5IGNhcnJpZXMgYSBkYXRlIGFuZCBzdG9wcyBhcHBseWluZyBhZnRlciBpdC4gQSB3YWl2ZXJcbiAqICAgICAgICAgICAgIG5vYm9keSByZXZpc2l0cyBiZWNvbWVzIHBlcm1hbmVudDsgdGhpcyBvbmUgbGFwc2VzIG9uIGl0cyBvd24gYW5kXG4gKiAgICAgICAgICAgICB0aGUgcGx1Z2luIHN0YXJ0cyBmYWlsaW5nIGFnYWluLCB3aGljaCBpcyB0aGUgaW50ZW5kZWQgcHJvbXB0LlxuICogICBWSVNJQkxFICAgd2hhdCB3YXMgd2FpdmVkIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIHNvIGl0IHJlYWNoZXMgdGhlXG4gKiAgICAgICAgICAgICBtZXRyaWMsIHRoZSBhdWRpdCByZWNvcmQgYW5kIHRoZSBidWlsZCBtZXNzYWdlIGluc3RlYWQgb2ZcbiAqICAgICAgICAgICAgIHZhbmlzaGluZyBmcm9tIHRoZSBjb3VudC5cbiAqXG4gKiBGb3JtYXQg4oCUIGVudHJpZXMgYDtgLXNlcGFyYXRlZCwgZmllbGRzIGA6YC1zZXBhcmF0ZWQsIHRhcmdldHMgYCxgLXNlcGFyYXRlZC5cbiAqIEEgdGFyZ2V0IGlzIGEgcGFja2FnZSBuYW1lIChgY2hyb21pdW1gKSBvciBhbiBhZHZpc29yeSBpZCAoYEdPLTIwMjYtNjYxMmApLFxuICogbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaW5kaW5nJ3MgcGFja2FnZSBvciBpZCByZXNwZWN0aXZlbHk6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPWFydGlsbGVyeToyMDI2LTEyLTMxOmNocm9taXVtLGNocm9tZTtwbGF5d3JpZ2h0OjIwMjYtMTItMzE6ZmlyZWZveFxuICpcbiAqIEZMRUVULVdJREUgKGAqYCBhcyB0aGUgcGx1Z2luKSBpcyBmb3Igb25lIGFkdmlzb3J5IHRoYXQgZXZlcnkgYnVuZGxlciBvZiBhXG4gKiB0b29sY2hhaW4gaW5oZXJpdHMg4oCUIGEgR28gc3RkbGliIENWRSByZWFjaGVzIGV2ZXJ5IHByZWJ1aWx0IEdvIGJpbmFyeSBhdCBvbmNlLFxuICogYW5kIGxpc3RpbmcgZWFjaCBwbHVnaW4gaGlkZXMgdGhhdCBpdCBpcyBvbmUgZGVjaXNpb24uIEl0IG1heSBuYW1lIEFEVklTT1JZXG4gKiBJRFMgT05MWTogYCo6MjAyNi0xMi0zMTpzdGRsaWJgIHdvdWxkIHdhaXZlIGV2ZXJ5IHByZXNlbnQgYW5kIGZ1dHVyZSBzdGRsaWJcbiAqIENyaXRpY2FsIGluIGV2ZXJ5IHBsdWdpbiwgaW5jbHVkaW5nIG9uZXMgYSByZWJ1aWxkIGNvdWxkIGNsZWFyLCBzbyBhIHBhY2thZ2VcbiAqIG5hbWUgdW5kZXIgYCpgIGlzIHJlamVjdGVkLiBgKmAgdGFrZXMgbm8gYEB2ZXJzaW9uYCAodmVyc2lvbnMgYXJlIHBlciBwbHVnaW4pXG4gKiBhbmQga2VlcHMgdGhlIHN5c3RlbS1vcmcgYm91bmQgYW5kIHRoZSBleHBpcnk6XG4gKlxuICogICBQTFVHSU5fVlVMTl9XQUlWRVJTPSo6MjAyNi0xMi0zMTpHTy0yMDI2LTY2MTIsR08tMjAyNi02NjA0XG4gKlxuICogQSBtYWxmb3JtZWQgZW50cnkgaXMgRFJPUFBFRCwgbmV2ZXIgdHJlYXRlZCBhcyBhIHdpbGRjYXJkOiB0aGUgZmFpbHVyZSBtb2RlXG4gKiBvZiBhIHR5cG8gbXVzdCBiZSBcInRoZSBnYXRlIHN0aWxsIGJsb2Nrc1wiLCBub3QgXCJldmVyeXRoaW5nIGlzIHdhaXZlZFwiLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5XYWl2ZXIge1xuICAvKiogUGx1Z2luIG5hbWUgdGhlIHdhaXZlciBhcHBsaWVzIHRvIChleGFjdCBtYXRjaCksIG9yIHtAbGluayBXQUlWRV9BTExfUExVR0lOU30uICovXG4gIHBsdWdpbjogc3RyaW5nO1xuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb24gdGhlIHdhaXZlciBpcyBsaW1pdGVkIHRvLCBvciBudWxsIGZvciBldmVyeSB2ZXJzaW9uLlxuICAgKlxuICAgKiBBIHdhaXZlciBpcyBhIGp1ZGdlbWVudCBhYm91dCBhIFNQRUNJRklDIGltYWdlIOKAlCBcInRoaXMgcmVsZWFzZSBvZiBhcnRpbGxlcnlcbiAgICogYnVuZGxlcyBhIENocm9taXVtIHdlIGNhbm5vdCBwYXRjaFwiLiBMZWZ0IHVucGlubmVkIGl0IHNpbGVudGx5IGNhcnJpZXMgdG9cbiAgICogZXZlcnkgZnV0dXJlIHZlcnNpb24sIGluY2x1ZGluZyBvbmVzIHdob3NlIGZpbmRpbmdzIG5vYm9keSBoYXMgbG9va2VkIGF0LFxuICAgKiB3aGljaCBpcyBob3cgYSBuYXJyb3cgZXhlbXB0aW9uIGJlY29tZXMgYSBzdGFuZGluZyBvbmUuXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICAvKiogSW5jbHVzaXZlIGV4cGlyeSAoVVRDIGRhdGUpLiBBZnRlciBpdCB0aGUgZW50cnkgaGFzIG5vIGVmZmVjdC4gKi9cbiAgZXhwaXJlczogRGF0ZTtcbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgYW5kL29yIGFkdmlzb3J5IGlkcyB3aG9zZSBmaW5kaW5ncyBhcmUgZXhlbXB0LiBOZXZlciBlbXB0eSDigJRcbiAgICogc2VlIHBhcnNlVnVsbldhaXZlcnMuIEFkdmlzb3J5IGlkcyBvbmx5IHdoZW4gYHBsdWdpbmAgaXMgYCpgLlxuICAgKi9cbiAgcGFja2FnZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogVGhlIGBwbHVnaW5gIG9mIGEgZmxlZXQtd2lkZSB3YWl2ZXIuIEFkdmlzb3J5IGlkcyBvbmx5IOKAlCBzZWUgVnVsbldhaXZlci4gKi9cbmV4cG9ydCBjb25zdCBXQUlWRV9BTExfUExVR0lOUyA9ICcqJztcblxuLyoqXG4gKiBBbiBhZHZpc29yeSBpZCBhcyBzY2FubmVycyByZXBvcnQgaXQgKENWRSwgR0hTQSwgR28gdnVsbmRiLCBQeVBBLCBSdXN0U2VjKS5cbiAqIEFueXRoaW5nIGVsc2UgaXMgYSBwYWNrYWdlIG5hbWUsIHdoaWNoIGEgZmxlZXQtd2lkZSB3YWl2ZXIgbWF5IG5vdCB1c2UuXG4gKi9cbmNvbnN0IEFEVklTT1JZX0lEID0gL14oQ1ZFLVxcZHs0fS1cXGR7NCx9fEdIU0EoLVswLTlhLXpdezR9KXszfXxHTy1cXGR7NH0tXFxkezQsfXxQWVNFQy1cXGR7NH0tXFxkK3xSVVNUU0VDLVxcZHs0fS1cXGR7NCx9KSQvaTtcblxuLyoqIEEgZHJvcHBlZCBlbnRyeSBhbmQgd2h5LCBzbyB0aGUgb3BlcmF0b3IgY2FuIGJlIHRvbGQgaW5zdGVhZCBvZiBndWVzc2luZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnVsbldhaXZlclByb2JsZW0ge1xuICBlbnRyeTogc3RyaW5nO1xuICByZWFzb246IHN0cmluZztcbn1cblxuLyoqIFBhcnNlZCB3YWl2ZXJzIHBsdXMgdGhlIGVudHJpZXMgdGhhdCB3ZXJlIHJlamVjdGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuV2FpdmVyUGFyc2Uge1xuICB3YWl2ZXJzOiBWdWxuV2FpdmVyW107XG4gIHByb2JsZW1zOiBWdWxuV2FpdmVyUHJvYmxlbVtdO1xufVxuXG4vKipcbiAqIFBhcnNlIGBQTFVHSU5fVlVMTl9XQUlWRVJTYCwgUkVQT1JUSU5HIHdoYXQgd2FzIGRyb3BwZWQuXG4gKlxuICogRHJvcHBpbmcgYSBtYWxmb3JtZWQgZW50cnkgaXMgdGhlIHNhZmUgZGlyZWN0aW9uIOKAlCBhIHR5cG8gbXVzdCBub3QgYmVjb21lIGFcbiAqIHdpbGRjYXJkIOKAlCBidXQgc2lsZW50bHkgZHJvcHBpbmcgaXQgaXMgYSB1c2FiaWxpdHkgdHJhcDogdGhlIG9wZXJhdG9yIHNldHMgYVxuICogd2FpdmVyLCB0aGUgZ2F0ZSBrZWVwcyBibG9ja2luZywgYW5kIG5vdGhpbmcgYW55d2hlcmUgc2F5cyB3aHkuIENhbGxlcnMgdGhhdFxuICogY2FuIHN1cmZhY2UgaXQgKHNlcnZpY2UgYm9vdCkgdXNlIHRoaXM7IGBwYXJzZVZ1bG5XYWl2ZXJzYCBpcyB0aGUgc2hvcnRoYW5kXG4gKiBmb3IgdGhlIG9uZXMgdGhhdCBjYW5ub3QuXG4gKlxuICogRW50cnkgZ3JhbW1hcjogYDxwbHVnaW4+W0A8dmVyc2lvbj5dOjxZWVlZLU1NLUREPjo8cGtnPlssPHBrZz7igKZdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWdWxuV2FpdmVyc1ZlcmJvc2UocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9jZXNzLmVudi5QTFVHSU5fVlVMTl9XQUlWRVJTKTogVnVsbldhaXZlclBhcnNlIHtcbiAgY29uc3Qgd2FpdmVyczogVnVsbldhaXZlcltdID0gW107XG4gIGNvbnN0IHByb2JsZW1zOiBWdWxuV2FpdmVyUHJvYmxlbVtdID0gW107XG4gIGlmICghcmF3Py50cmltKCkpIHJldHVybiB7IHdhaXZlcnMsIHByb2JsZW1zIH07XG4gIGNvbnN0IHJlamVjdCA9IChlbnRyeTogc3RyaW5nLCByZWFzb246IHN0cmluZykgPT4geyBwcm9ibGVtcy5wdXNoKHsgZW50cnk6IGVudHJ5LnRyaW0oKSwgcmVhc29uIH0pOyB9O1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmF3LnNwbGl0KCc7JykpIHtcbiAgICBpZiAoIWVudHJ5LnRyaW0oKSkgY29udGludWU7XG4gICAgY29uc3QgW3RhcmdldCwgZXhwaXJlcywgcGFja2FnZXNdID0gZW50cnkuc3BsaXQoJzonKS5tYXAoKGYpID0+IGY/LnRyaW0oKSA/PyAnJyk7XG4gICAgLy8gRXZlcnkgZmllbGQgaXMgUkVRVUlSRUQuIEFuIGVudHJ5IG1pc3NpbmcgaXRzIHBhY2thZ2UgbGlzdCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSByZWFkIGFzIFwid2FpdmUgdGhpcyBwbHVnaW4gZW50aXJlbHlcIiwgd2hpY2ggaXMgdGhlIG9uZSB0aGluZ1xuICAgIC8vIHRoaXMgbXVzdCBub3QgYmUgYWJsZSB0byBleHByZXNzLlxuICAgIGlmICghdGFyZ2V0IHx8ICFleHBpcmVzIHx8ICFwYWNrYWdlcykge1xuICAgICAgcmVqZWN0KGVudHJ5LCAnZXhwZWN0ZWQgPHBsdWdpbj5bQDx2ZXJzaW9uPl06PFlZWVktTU0tREQ+OjxwYWNrYWdlPlssPHBhY2thZ2U+4oCmXScpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGF0ID0gdGFyZ2V0LmluZGV4T2YoJ0AnKTtcbiAgICBjb25zdCBwbHVnaW4gPSBhdCA9PT0gLTEgPyB0YXJnZXQgOiB0YXJnZXQuc2xpY2UoMCwgYXQpLnRyaW0oKTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXQgPT09IC0xID8gbnVsbCA6IHRhcmdldC5zbGljZShhdCArIDEpLnRyaW0oKTtcbiAgICBpZiAoIXBsdWdpbikgeyByZWplY3QoZW50cnksICdubyBwbHVnaW4gbmFtZScpOyBjb250aW51ZTsgfVxuICAgIGlmIChhdCAhPT0gLTEgJiYgIXZlcnNpb24pIHsgcmVqZWN0KGVudHJ5LCBcIidAJyB3aXRoIG5vIHZlcnNpb24g4oCUIG9taXQgaXQgdG8gY292ZXIgZXZlcnkgdmVyc2lvblwiKTsgY29udGludWU7IH1cbiAgICBpZiAocGx1Z2luID09PSBXQUlWRV9BTExfUExVR0lOUyAmJiB2ZXJzaW9uICE9PSBudWxsKSB7IHJlamVjdChlbnRyeSwgXCInKicgY292ZXJzIGV2ZXJ5IHBsdWdpbiwgc28gaXQgY2Fubm90IHBpbiBhIHZlcnNpb25cIik7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCEvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChleHBpcmVzKSkgeyByZWplY3QoZW50cnksIGBleHBpcnkgJyR7ZXhwaXJlc30nIGlzIG5vdCBZWVlZLU1NLUREYCk7IGNvbnRpbnVlOyB9XG4gICAgY29uc3Qgd2hlbiA9IG5ldyBEYXRlKGAke2V4cGlyZXN9VDIzOjU5OjU5Ljk5OVpgKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHdoZW4uZ2V0VGltZSgpKSkgeyByZWplY3QoZW50cnksIGBleHBpcnkgJyR7ZXhwaXJlc30nIGlzIG5vdCBhIHJlYWwgZGF0ZWApOyBjb250aW51ZTsgfVxuICAgIGNvbnN0IG5hbWVzID0gcGFja2FnZXMuc3BsaXQoJywnKS5tYXAoKG4pID0+IG4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkgeyByZWplY3QoZW50cnksICdubyBwYWNrYWdlIG5hbWVzJyk7IGNvbnRpbnVlOyB9XG4gICAgaWYgKHBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5hbWVzLmZpbHRlcigobikgPT4gIUFEVklTT1JZX0lELnRlc3QobikpO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlamVjdChlbnRyeSwgYCcqJyB0YWtlcyBhZHZpc29yeSBpZHMgb25seSAoQ1ZFLeKApiwgR0hTQS3igKYsIEdPLeKApik7ICcke3BhY2thZ2VOYW1lcy5qb2luKCcsICcpfScgd291bGQgd2FpdmUgYSBwYWNrYWdlIGluIGV2ZXJ5IHBsdWdpbmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2FpdmVycy5wdXNoKHsgcGx1Z2luLCB2ZXJzaW9uLCBleHBpcmVzOiB3aGVuLCBwYWNrYWdlczogbmFtZXMgfSk7XG4gIH1cbiAgcmV0dXJuIHsgd2FpdmVycywgcHJvYmxlbXMgfTtcbn1cblxuLyoqIFBhcnNlIGBQTFVHSU5fVlVMTl9XQUlWRVJTYC4gTWFsZm9ybWVkIG9yIGluY29tcGxldGUgZW50cmllcyBhcmUgZHJvcHBlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZ1bG5XYWl2ZXJzKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkID0gcHJvY2Vzcy5lbnYuUExVR0lOX1ZVTE5fV0FJVkVSUyk6IFZ1bG5XYWl2ZXJbXSB7XG4gIHJldHVybiBwYXJzZVZ1bG5XYWl2ZXJzVmVyYm9zZShyYXcpLndhaXZlcnM7XG59XG5cbi8qKiBXaGF0IGEgd2FpdmVyIHJlbW92ZWQgZnJvbSB0aGUgY291bnQsIGFuZCB3aGF0IHN0aWxsIGNvdW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdmVyT3V0Y29tZSB7XG4gIC8qKiBGaW5kaW5ncyB0aGUgZmxvb3Igc3RpbGwgY291bnRzLiAqL1xuICBjb3VudGVkOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogRmluZGluZ3MgYW4gdW5leHBpcmVkIHdhaXZlciBleGVtcHRlZCAoZW1wdHkgd2hlbiBub25lIGFwcGxpZWQpLiAqL1xuICB3YWl2ZWQ6IFBsdWdpblNjYW5GaW5kaW5nW107XG4gIC8qKiBUaGUgZW50cmllcyB0aGF0IGV4ZW1wdGVkIGF0IGxlYXN0IG9uZSBmaW5kaW5nIOKAlCB3aGF0IFwidGhpcyB3YWl2ZXIgaXMgc3RpbGwgZG9pbmcgc29tZXRoaW5nXCIgaXMgbWVhc3VyZWQgYnkuICovXG4gIG1hdGNoZWQ6IFZ1bG5XYWl2ZXJbXTtcbn1cblxuLyoqIE9uZSB3YWl2ZXIgZW50cnkncyBpZGVudGl0eTogdGhlIHBsdWdpbiBpdCBuYW1lcyAod2l0aCBpdHMgcGluKSBhbmQgaXRzIHRhcmdldHMuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbldhaXZlckxhYmVscyh3OiBQaWNrPFZ1bG5XYWl2ZXIsICdwbHVnaW4nIHwgJ3ZlcnNpb24nIHwgJ3BhY2thZ2VzJz4pOiB7IHBsdWdpbjogc3RyaW5nOyB0YXJnZXRzOiBzdHJpbmcgfSB7XG4gIHJldHVybiB7IHBsdWdpbjogdy52ZXJzaW9uID8gYCR7dy5wbHVnaW59QCR7dy52ZXJzaW9ufWAgOiB3LnBsdWdpbiwgdGFyZ2V0czogdy5wYWNrYWdlcy5qb2luKCcsJykgfTtcbn1cblxuLyoqXG4gKiBTcGxpdCBmaW5kaW5ncyBpbnRvIHdoYXQgc3RpbGwgY291bnRzIGFuZCB3aGF0IGFuIHVuZXhwaXJlZCB3YWl2ZXIgZXhlbXB0cy5cbiAqXG4gKiBNYXRjaGluZyBpcyBvbiB0aGUgcGFja2FnZSBuYW1lIG9yIGFkdmlzb3J5IGlkIGEgd2FpdmVyIG5hbWVzLFxuICogY2FzZS1pbnNlbnNpdGl2ZWx5LCBhbmQgb25seSBmb3IgZmluZGluZ3MgdGhhdCBhcmUgR0FURURcbiAqICh7QGxpbmsgaXNHYXRlZEZpbmRpbmd9KSDigJQgYW4gdW5nYXRlZCBmaW5kaW5nIG5ldmVyIGNvdW50ZWQgdG93YXJkIHRoZSBmbG9vcixcbiAqIHNvIFwid2FpdmluZ1wiIGl0IHdvdWxkIG92ZXJzdGF0ZSB3aGF0IHRoZSB3YWl2ZXIgZG9lcy5cbiAqXG4gKiBBIEtFVi1saXN0ZWQgZmluZGluZyBpcyBleGVtcHRlZCBieSBhbiBBRFZJU09SWS1JRCB0YXJnZXQgb25seSwgbmV2ZXIgYnkgYVxuICogcGFja2FnZSBuYW1lLiBgYXJ0aWxsZXJ5OuKApjpjaHJvbWl1bWAgaXMgYSBqdWRnZW1lbnQgYWJvdXQgQ2hyb21pdW0ncyBvcmRpbmFyeVxuICogY2h1cm47IGl0IHdhcyBub3Qgd3JpdHRlbiBhYm91dCwgYW5kIG11c3Qgbm90IHNpbGVudGx5IGNvdmVyLCB0aGUgb25lXG4gKiBDaHJvbWl1bSBDVkUgdGhhdCBpcyBiZWluZyBleHBsb2l0ZWQgdG9kYXkuIE5hbWluZyB0aGF0IENWRSBpcyB0aGUgZGVsaWJlcmF0ZVxuICogYWN0IGFuIGV4ZW1wdGlvbiBmb3IgaXQgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVZ1bG5XYWl2ZXJzKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLFxuICB3YWl2ZXJzOiByZWFkb25seSBWdWxuV2FpdmVyW10gPSBwYXJzZVZ1bG5XYWl2ZXJzKCksXG4gIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCksXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwbHVnaW5WZXJzaW9uPzogc3RyaW5nLFxuKTogV2FpdmVyT3V0Y29tZSB7XG4gIC8vIFNZU1RFTSBPUkcgT05MWS4gUGx1Z2luIG5hbWVzIGFyZSB1bmlxdWUgcGVyIChuYW1lLCB2ZXJzaW9uLCBvcmdJZCksIE5PVFxuICAvLyBnbG9iYWxseSDigJQgYW55IHRlbmFudCBjYW4gY3JlYXRlIGEgcGx1Z2luIGNhbGxlZCBgYXJ0aWxsZXJ5YC4gTWF0Y2hpbmcgb25cbiAgLy8gdGhlIG5hbWUgYWxvbmUgd291bGQgaGFuZCBldmVyeSBvbmUgb2YgdGhlbSB0aGUgb3BlcmF0b3IncyBleGVtcHRpb24sIHNvIGFcbiAgLy8gdGVuYW50IGNvdWxkIGluaGVyaXQgYSB3YWl2ZXIgc2ltcGx5IGJ5IGNob29zaW5nIHRoZSBuYW1lLCBhbmQgc2hpcCBhblxuICAvLyBpbWFnZSB3aG9zZSBDcml0aWNhbHMgdGhlIGdhdGUgdGhlbiB3YXZlZCB0aHJvdWdoLiBUaGUgd2FpdmVycyBleGlzdCBmb3IgdGhlXG4gIC8vIE9mZmljaWFsIGNhdGFsb2cgdGhlIG9wZXJhdG9yIGN1cmF0ZXMsIHdoaWNoIGxpdmVzIGluIHRoZSBzeXN0ZW0gb3JnOyBhXG4gIC8vIGNhbGxlciB0aGF0IGNhbm5vdCBzYXkgd2hpY2ggb3JnIHRoaXMgYnVpbGQgYmVsb25ncyB0byBnZXRzIG5vIHdhaXZlci5cbiAgaWYgKG9yZ0lkID09PSB1bmRlZmluZWQgfHwgb3JnSWQudG9Mb3dlckNhc2UoKSAhPT0gU1lTVEVNX09SR19JRCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSwgbWF0Y2hlZDogW10gfTtcbiAgY29uc3QgYWN0aXZlID0gd2FpdmVycy5maWx0ZXIoKHcpID0+ICh3LnBsdWdpbiA9PT0gcGx1Z2luTmFtZSB8fCB3LnBsdWdpbiA9PT0gV0FJVkVfQUxMX1BMVUdJTlMpXG4gICAgJiYgdy5leHBpcmVzLmdldFRpbWUoKSA+PSBub3cuZ2V0VGltZSgpXG4gICAgLy8gQSB2ZXJzaW9uLXBpbm5lZCB3YWl2ZXIgY292ZXJzIHRoYXQgdmVyc2lvbiBvbmx5LiBBbiB1bnBpbm5lZCBvbmUgY292ZXJzXG4gICAgLy8gZXZlcnkgdmVyc2lvbiwgd2hpY2ggaXMgd2h5IHRoZSBwaW4gaXMgd29ydGggd3JpdGluZy5cbiAgICAmJiAody52ZXJzaW9uID09PSBudWxsIHx8IHcudmVyc2lvbiA9PT0gcGx1Z2luVmVyc2lvbikpO1xuICBpZiAoYWN0aXZlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgY291bnRlZDogWy4uLmZpbmRpbmdzXSwgd2FpdmVkOiBbXSwgbWF0Y2hlZDogW10gfTtcbiAgY29uc3Qga2V2R2F0ZSA9IHBsdWdpblZ1bG5HYXRlS2V2KCk7XG4gIGNvbnN0IHRhcmdldHMgPSBhY3RpdmUubWFwKCh3KSA9PiAoeyB3LCBuYW1lczogbmV3IFNldCh3LnBhY2thZ2VzLm1hcCgobikgPT4gbi50b0xvd2VyQ2FzZSgpKSkgfSkpO1xuICBjb25zdCBjb3VudGVkOiBQbHVnaW5TY2FuRmluZGluZ1tdID0gW107XG4gIGNvbnN0IHdhaXZlZDogUGx1Z2luU2NhbkZpbmRpbmdbXSA9IFtdO1xuICBjb25zdCBtYXRjaGVkID0gbmV3IFNldDxWdWxuV2FpdmVyPigpO1xuICBmb3IgKGNvbnN0IGYgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBpZCA9IGYuaWQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwa2cgPSBmLnBhY2thZ2VOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgYnkgPSBpc0dhdGVkRmluZGluZyhmLCBrZXZHYXRlKVxuICAgICAgPyB0YXJnZXRzLmZpbHRlcigodCkgPT4gdC5uYW1lcy5oYXMoaWQpIHx8IChmLmtldiAhPT0gdHJ1ZSAmJiB0Lm5hbWVzLmhhcyhwa2cpKSlcbiAgICAgIDogW107XG4gICAgaWYgKGJ5Lmxlbmd0aCA9PT0gMCkgeyBjb3VudGVkLnB1c2goZik7IGNvbnRpbnVlOyB9XG4gICAgd2FpdmVkLnB1c2goZik7XG4gICAgZm9yIChjb25zdCB0IG9mIGJ5KSBtYXRjaGVkLmFkZCh0LncpO1xuICB9XG4gIHJldHVybiB7IGNvdW50ZWQsIHdhaXZlZCwgbWF0Y2hlZDogWy4uLm1hdGNoZWRdIH07XG59XG5cbi8qKiBXaGV0aGVyIGBnYXRlZENyaXRpY2FsYCBicmVha3MgdGhlIHBsYXRmb3JtIGZsb29yIChuZXZlciwgd2hlbiBkaXNhYmxlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZWVkc1Z1bG5GbG9vcihnYXRlZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgbWF4OiBudW1iZXIgPSBwbHVnaW5WdWxuTWF4RmluZGluZ3MoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF4ID49IDAgJiYgKGdhdGVkID8/IDApID4gbWF4O1xufVxuXG4vKiogYHBrZ0AxLjIuMyDihpIgMS4yLjRgIC8gYHBrZ0AxLjIuMyAobm8gZml4KWAuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVGaXgoZjogUGljazxQbHVnaW5TY2FuRmluZGluZywgJ3BhY2thZ2VOYW1lJyB8ICdwYWNrYWdlVmVyc2lvbicgfCAnZml4ZWRJbic+KTogc3RyaW5nIHtcbiAgY29uc3QgYXQgPSBgJHtmLnBhY2thZ2VOYW1lfSR7Zi5wYWNrYWdlVmVyc2lvbiA/IGBAJHtmLnBhY2thZ2VWZXJzaW9ufWAgOiAnJ31gO1xuICByZXR1cm4gZi5maXhlZEluLmxlbmd0aCA+IDAgPyBgJHthdH0g4oaSICR7Zi5maXhlZEluLmpvaW4oJywgJyl9YCA6IGAke2F0fSAobm8gZml4KWA7XG59XG5cbi8qKiBgQ1ZFLTEgKG9wZW5zc2xAMy4wLjEg4oaSIDMuMC4yKTsgQ1ZFLTIgKOKApilgIGZvciB0aGUgZmlyc3QgYGxpbWl0YCBmaW5kaW5ncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBQbHVnaW5TY2FuRmluZGluZ1tdLCBsaW1pdCA9IDUpOiBzdHJpbmcge1xuICBjb25zdCBzaG93biA9IGZpbmRpbmdzLnNsaWNlKDAsIGxpbWl0KS5tYXAoKGYpID0+IGAke2YuaWR9ICgke2Rlc2NyaWJlRml4KGYpfSlgKS5qb2luKCc7ICcpO1xuICBjb25zdCBtb3JlID0gZmluZGluZ3MubGVuZ3RoID4gbGltaXQgPyBgOyArJHtmaW5kaW5ncy5sZW5ndGggLSBsaW1pdH0gbW9yZWAgOiAnJztcbiAgcmV0dXJuIGAke3Nob3dufSR7bW9yZX1gO1xufVxuXG4vKipcbiAqIGBOIGZpeGFibGUgQ3JpdGljYWwgZmluZGluZ3NgLCBvciDigJQgd2hlbiBhbnkgZ2F0ZWQgZmluZGluZyBpcyBLRVYtbGlzdGVkLCBzb1xuICogXCJmaXhhYmxlXCIgYWxvbmUgd291bGQgbWlzZGVzY3JpYmUgdGhlIGNvdW50IOKAlCBgTiBDcml0aWNhbCBmaW5kaW5ncyB0aGF0IGFyZVxuICogZml4YWJsZSBvciBrbm93biBleHBsb2l0ZWQgKE0gb24gQ0lTQSBLRVYpYC5cbiAqL1xuZnVuY3Rpb24gZ2F0ZWRQaHJhc2UoZmxhZzogUGljazxQbHVnaW5TY2FuRmxhZywgJ2dhdGVkJyB8ICdrZXYnIHwgJ2ZhaWxPbic+KTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGZsYWcuZ2F0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgY29uc3QgbGFiZWwgPSBmYWlsT25MYWJlbChmbGFnLmZhaWxPbiA/PyAnY3JpdGljYWwnKTtcbiAgcmV0dXJuIGZsYWcua2V2XG4gICAgPyBgJHtmbGFnLmdhdGVkfSAke2xhYmVsfSBmaW5kaW5nJHtzfSB0aGF0ICR7ZmxhZy5nYXRlZCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gZml4YWJsZSBvciBrbm93biBleHBsb2l0ZWQgKCR7ZmxhZy5rZXZ9IG9uIENJU0EgS0VWKWBcbiAgICA6IGAke2ZsYWcuZ2F0ZWR9IGZpeGFibGUgJHtsYWJlbH0gZmluZGluZyR7c31gO1xufVxuXG4vKiogVGhlIHdhcm5pbmcgdGV4dCBmb3IgYSBmbGFnZ2VkIHZlcnNpb246IGB4QHYgaGFzIE4gZml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncyDigJQgcmVidWlsZCBvciB1cGdyYWRlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2dWxuRmxhZ2dlZE1lc3NhZ2UocmVmOiBzdHJpbmcsIGZsYWc6IFBpY2s8UGx1Z2luU2NhbkZsYWcsICdnYXRlZCcgfCAna2V2JyB8ICdmYWlsT24nPik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtyZWZ9IGhhcyAke2dhdGVkUGhyYXNlKGZsYWcpfSDigJQgcmVidWlsZCBvciB1cGdyYWRlYDtcbn1cblxuLyoqIEEgYFZVTE5fRkxBR0dFRGAgbG9va3VwIHdhcm5pbmcgKHRoZSBsb29rdXAgZW52ZWxvcGUncyBgd2FybmluZ3NbXWAgZW50cnkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuRmxhZ2dlZFdhcm5pbmcge1xuICBjb2RlOiB0eXBlb2YgVlVMTl9GTEFHR0VEX1dBUk5JTkc7XG4gIC8qKiBgY3JpdGljYWxgIHdoZW4gYSBnYXRlZCBmaW5kaW5nIGlzIG9uIENJU0EgS0VWLCBlbHNlIGBlcnJvcmAgKGEgZmxhZyBuZXZlciByZWZ1c2VzIGFueXRoaW5nKS4gKi9cbiAgc2V2ZXJpdHk6ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuICBwbHVnaW46IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICAvKiogVGhlIGZsYWcncyBnYXRlZCBjb3VudCAoc2VlIHtAbGluayBQbHVnaW5TY2FuRmxhZy5nYXRlZH0pLiAqL1xuICBnYXRlZDogbnVtYmVyO1xuICBoaWdoOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFRvcCBmaXhhYmxlIGZpbmRpbmdzIHdpdGggdGhlaXIgZml4ZWQgdmVyc2lvbnMuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xufVxuXG4vKiogQnVpbGQgdGhlIGBWVUxOX0ZMQUdHRURgIHdhcm5pbmcgZm9yIGBwbHVnaW5AdmVyc2lvbmAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsbkZsYWdnZWRXYXJuaW5nKHBsdWdpbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGZsYWc6IFBsdWdpblNjYW5GbGFnKTogVnVsbkZsYWdnZWRXYXJuaW5nIHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBWVUxOX0ZMQUdHRURfV0FSTklORyxcbiAgICBzZXZlcml0eTogZmxhZy5rZXYgPyAnY3JpdGljYWwnIDogJ2Vycm9yJyxcbiAgICBwbHVnaW4sXG4gICAgdmVyc2lvbixcbiAgICBnYXRlZDogZmxhZy5nYXRlZCxcbiAgICBoaWdoOiBmbGFnLmhpZ2gsXG4gICAgbWVzc2FnZTogdnVsbkZsYWdnZWRNZXNzYWdlKGAke3BsdWdpbn1AJHt2ZXJzaW9ufWAsIGZsYWcpLFxuICAgIGZpbmRpbmdzOiBmbGFnLmZpbmRpbmdzLnNsaWNlKDAsIFNDQU5fRkxBR19UT1BfRklORElOR1MpLFxuICB9O1xufVxuXG4vKiogTmFycm93IGFuIHVua25vd24gYHNjYW5fZmxhZ2AganNvbmIgdmFsdWUuICovXG5leHBvcnQgZnVuY3Rpb24gYXNTY2FuRmxhZyh2YWx1ZTogdW5rbm93bik6IFBsdWdpblNjYW5GbGFnIHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKHR5cGVvZiB2LmdhdGVkICE9PSAnbnVtYmVyJyB8fCB0eXBlb2Ygdi5oaWdoICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGZpbmRpbmdzID0gQXJyYXkuaXNBcnJheSh2LmZpbmRpbmdzKSA/ICh2LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10pLmZpbHRlcigoZikgPT4gZiAmJiB0eXBlb2YgZi5pZCA9PT0gJ3N0cmluZycpIDogW107XG4gIHJldHVybiB7XG4gICAgZ2F0ZWQ6IHYuZ2F0ZWQsXG4gICAgaGlnaDogdi5oaWdoLFxuICAgIG1heEZpbmRpbmdzOiB0eXBlb2Ygdi5tYXhGaW5kaW5ncyA9PT0gJ251bWJlcicgPyB2Lm1heEZpbmRpbmdzIDogMCxcbiAgICAuLi4odHlwZW9mIHYua2V2ID09PSAnbnVtYmVyJyAmJiB2LmtldiA+IDAgPyB7IGtldjogdi5rZXYgfSA6IHt9KSxcbiAgICAuLi4odi5mYWlsT24gPT09ICdoaWdoJyA/IHsgZmFpbE9uOiAnaGlnaCcgYXMgY29uc3QgfSA6IHt9KSxcbiAgICBmaW5kaW5nczogZmluZGluZ3MubWFwKChmKSA9PiAoeyAuLi5mLCBmaXhlZEluOiBBcnJheS5pc0FycmF5KGYuZml4ZWRJbikgPyBmLmZpeGVkSW4gOiBbXSB9KSksXG4gIH07XG59XG4iXX0=
|