@pipeline-builder/pipeline-data 4.1.15 → 4.1.17

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.
Files changed (60) hide show
  1. package/lib/api/access-control-builder.d.ts +18 -1
  2. package/lib/api/access-control-builder.js +19 -6
  3. package/lib/api/crud-service.d.ts +94 -36
  4. package/lib/api/crud-service.js +188 -166
  5. package/lib/api/plugin-resolution.d.ts +253 -0
  6. package/lib/api/plugin-resolution.js +649 -0
  7. package/lib/api/public-directory.d.ts +281 -0
  8. package/lib/api/public-directory.js +457 -0
  9. package/lib/api/query-builders.d.ts +13 -0
  10. package/lib/api/query-builders.js +74 -9
  11. package/lib/api/reporting/caches.js +4 -4
  12. package/lib/api/reporting/dora-scoring.d.ts +3 -3
  13. package/lib/api/reporting/dora-scoring.js +4 -4
  14. package/lib/api/reporting/dora.d.ts +6 -6
  15. package/lib/api/reporting/dora.js +97 -73
  16. package/lib/api/reporting/plugin-runtime.d.ts +25 -0
  17. package/lib/api/reporting/plugin-runtime.js +106 -0
  18. package/lib/api/reporting/query-scope.d.ts +8 -2
  19. package/lib/api/reporting/query-scope.js +16 -7
  20. package/lib/api/reporting/retention.d.ts +4 -10
  21. package/lib/api/reporting/retention.js +8 -11
  22. package/lib/api/reporting/sql-helpers.d.ts +4 -7
  23. package/lib/api/reporting/sql-helpers.js +8 -9
  24. package/lib/api/reporting/types.d.ts +55 -17
  25. package/lib/api/reporting/types.js +1 -1
  26. package/lib/api/reporting-service.d.ts +35 -26
  27. package/lib/api/reporting-service.js +245 -161
  28. package/lib/api/semver-range.d.ts +73 -0
  29. package/lib/api/semver-range.js +227 -0
  30. package/lib/api/soft-delete-sweep.js +8 -20
  31. package/lib/core/query-filters.d.ts +18 -3
  32. package/lib/core/query-filters.js +1 -1
  33. package/lib/database/drizzle-schema.d.ts +7790 -2461
  34. package/lib/database/drizzle-schema.js +29 -1
  35. package/lib/database/index.d.ts +4 -2
  36. package/lib/database/index.js +5 -3
  37. package/lib/database/pg-result.d.ts +19 -0
  38. package/lib/database/pg-result.js +32 -0
  39. package/lib/database/postgres-connection.js +14 -24
  40. package/lib/database/public-reader.d.ts +14 -0
  41. package/lib/database/public-reader.js +68 -0
  42. package/lib/database/retry-strategy.d.ts +3 -5
  43. package/lib/database/retry-strategy.js +4 -6
  44. package/lib/database/schema/compliance.d.ts +16 -34
  45. package/lib/database/schema/compliance.js +4 -4
  46. package/lib/database/schema/dashboard.js +4 -2
  47. package/lib/database/schema/ecosystem.d.ts +6586 -0
  48. package/lib/database/schema/ecosystem.js +709 -0
  49. package/lib/database/schema/message.d.ts +6 -12
  50. package/lib/database/schema/message.js +3 -1
  51. package/lib/database/schema/pipeline.d.ts +79 -5
  52. package/lib/database/schema/pipeline.js +46 -25
  53. package/lib/database/schema/plugin.d.ts +587 -3
  54. package/lib/database/schema/plugin.js +86 -14
  55. package/lib/database/tenancy.d.ts +6 -7
  56. package/lib/database/tenancy.js +13 -14
  57. package/lib/index.d.ts +7 -4
  58. package/lib/index.js +7 -4
  59. package/lib/testing/exports.json +146 -0
  60. package/package.json +44 -7
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Version specs for plugin lookups (docs/plugin-installing.md).
3
+ *
4
+ * A small, dependency-free matcher for exactly the forms plugin references use:
5
+ *
6
+ * exact `1.2.3`, `1.2.3-rc.1` that one version
7
+ * caret `^1.2.3` >=1.2.3 <2.0.0 (`^0.2.3` <0.3.0, `^0.0.3` <0.0.4)
8
+ * `^1`, `^1.2` >=1.0.0 <2.0.0, >=1.2.0 <2.0.0 (`^0.2` <0.3.0, `^0` <1.0.0)
9
+ * tilde `~1.2.3` >=1.2.3 <1.3.0
10
+ * `~1`, `~1.2` >=1.0.0 <2.0.0, >=1.2.0 <1.3.0
11
+ * partial `1`, `1.x`, `1.2`, `1.2.x` >=1.0.0 <2.0.0 / >=1.2.0 <1.3.0
12
+ * latest `latest` the highest stable version
13
+ *
14
+ * npm semantics throughout, including prereleases: a range never matches a
15
+ * prerelease unless its own lower bound is a prerelease of the SAME
16
+ * major.minor.patch (so `^1.2.3-beta.1` admits `1.2.3-beta.2` but not
17
+ * `1.3.0-beta.1`). An exact spec may name a prerelease directly.
18
+ *
19
+ * The matcher runs in JS ({@link satisfiesVersionSpec}) and — for the query
20
+ * builders — as SQL over the `version` column ({@link versionSpecCondition},
21
+ * {@link semverOrderBy}); the two are kept equivalent by the shared tests.
22
+ */
23
+ import { SQL } from 'drizzle-orm';
24
+ import type { AnyColumn } from 'drizzle-orm/column';
25
+ /** A parsed `major.minor.patch[-prerelease][+build]` version. */
26
+ export interface SemverParts {
27
+ major: number;
28
+ minor: number;
29
+ patch: number;
30
+ /** Dot-separated prerelease identifiers; empty for a stable version. */
31
+ prerelease: string[];
32
+ }
33
+ /** A parsed version spec. `range` bounds are `[min, max)`. */
34
+ export type VersionSpec = {
35
+ kind: 'exact';
36
+ version: string;
37
+ } | {
38
+ kind: 'latest';
39
+ } | {
40
+ kind: 'range';
41
+ min: SemverParts;
42
+ max: SemverParts;
43
+ };
44
+ /** Parse a full semver string, or `null` when it isn't one. */
45
+ export declare function parseSemver(version: string): SemverParts | null;
46
+ /** Semver 2.0 precedence: negative when `a < b`, 0 when equal, positive when `a > b`. */
47
+ export declare function compareSemverParts(a: SemverParts, b: SemverParts): number;
48
+ /** {@link compareSemverParts} over strings; unparseable versions sort lowest. */
49
+ export declare function compareSemver(a: string, b: string): number;
50
+ /**
51
+ * Parse a version spec, or `null` when it is none of the supported forms (the
52
+ * caller then treats the input as a literal version, which matches nothing).
53
+ */
54
+ export declare function parseVersionSpec(spec: string): VersionSpec | null;
55
+ /** True when `spec` resolves to a SET of versions (range or `latest`), not one. */
56
+ export declare function isVersionRange(spec: string): boolean;
57
+ /** Whether `version` satisfies `spec` (a string or an already-parsed spec). */
58
+ export declare function satisfiesVersionSpec(version: string, spec: string | VersionSpec): boolean;
59
+ /** The highest of `versions` satisfying `spec`, or `null`. */
60
+ export declare function maxSatisfying(versions: readonly string[], spec: string | VersionSpec): string | null;
61
+ /**
62
+ * SQL predicate for `col` satisfying `spec`. Precision note: prerelease-vs-
63
+ * prerelease ordering WITHIN the lower bound's own tuple is not compared in SQL
64
+ * (every prerelease of that tuple is admitted) — {@link semverOrderBy} still
65
+ * ranks them, and the JS matcher is exact.
66
+ */
67
+ export declare function versionSpecCondition(col: AnyColumn, spec: string): SQL;
68
+ /**
69
+ * ORDER BY terms ranking `col` highest-semver first: numeric major/minor/patch,
70
+ * a stable version above its prereleases, then the prerelease text (a
71
+ * lexicographic tiebreak — close to, not exactly, semver identifier order).
72
+ */
73
+ export declare function semverOrderBy(col: AnyColumn): SQL[];
@@ -0,0 +1,227 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Version specs for plugin lookups (docs/plugin-installing.md).
5
+ *
6
+ * A small, dependency-free matcher for exactly the forms plugin references use:
7
+ *
8
+ * exact `1.2.3`, `1.2.3-rc.1` that one version
9
+ * caret `^1.2.3` >=1.2.3 <2.0.0 (`^0.2.3` <0.3.0, `^0.0.3` <0.0.4)
10
+ * `^1`, `^1.2` >=1.0.0 <2.0.0, >=1.2.0 <2.0.0 (`^0.2` <0.3.0, `^0` <1.0.0)
11
+ * tilde `~1.2.3` >=1.2.3 <1.3.0
12
+ * `~1`, `~1.2` >=1.0.0 <2.0.0, >=1.2.0 <1.3.0
13
+ * partial `1`, `1.x`, `1.2`, `1.2.x` >=1.0.0 <2.0.0 / >=1.2.0 <1.3.0
14
+ * latest `latest` the highest stable version
15
+ *
16
+ * npm semantics throughout, including prereleases: a range never matches a
17
+ * prerelease unless its own lower bound is a prerelease of the SAME
18
+ * major.minor.patch (so `^1.2.3-beta.1` admits `1.2.3-beta.2` but not
19
+ * `1.3.0-beta.1`). An exact spec may name a prerelease directly.
20
+ *
21
+ * The matcher runs in JS ({@link satisfiesVersionSpec}) and — for the query
22
+ * builders — as SQL over the `version` column ({@link versionSpecCondition},
23
+ * {@link semverOrderBy}); the two are kept equivalent by the shared tests.
24
+ */
25
+ import { and, asc, desc, eq, or, sql, SQL } from 'drizzle-orm';
26
+ const SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
27
+ const PARTIAL = /^(0|[1-9]\d*)(?:\.(0|[1-9]\d*|x|\*))?(?:\.(x|\*))?$/;
28
+ /** Upper bound on any numeric part (keeps SQL `::int` casts in range). */
29
+ const MAX_PART = 2_147_483_647;
30
+ /** Parse a full semver string, or `null` when it isn't one. */
31
+ export function parseSemver(version) {
32
+ const m = SEMVER.exec(version.trim());
33
+ if (!m)
34
+ return null;
35
+ const [major, minor, patch] = [Number(m[1]), Number(m[2]), Number(m[3])];
36
+ if (major > MAX_PART || minor > MAX_PART || patch > MAX_PART)
37
+ return null;
38
+ return { major, minor, patch, prerelease: m[4] ? m[4].split('.') : [] };
39
+ }
40
+ function compareIdentifiers(a, b) {
41
+ const an = /^\d+$/.test(a);
42
+ const bn = /^\d+$/.test(b);
43
+ if (an && bn)
44
+ return Number(a) - Number(b);
45
+ if (an)
46
+ return -1; // numeric identifiers sort below alphanumeric ones
47
+ if (bn)
48
+ return 1;
49
+ return a < b ? -1 : a > b ? 1 : 0;
50
+ }
51
+ /** Semver 2.0 precedence: negative when `a < b`, 0 when equal, positive when `a > b`. */
52
+ export function compareSemverParts(a, b) {
53
+ if (a.major !== b.major)
54
+ return a.major - b.major;
55
+ if (a.minor !== b.minor)
56
+ return a.minor - b.minor;
57
+ if (a.patch !== b.patch)
58
+ return a.patch - b.patch;
59
+ // A stable version outranks any prerelease of the same tuple.
60
+ if (!a.prerelease.length || !b.prerelease.length)
61
+ return b.prerelease.length - a.prerelease.length;
62
+ for (let i = 0; i < Math.max(a.prerelease.length, b.prerelease.length); i++) {
63
+ if (a.prerelease[i] === undefined)
64
+ return -1;
65
+ if (b.prerelease[i] === undefined)
66
+ return 1;
67
+ const c = compareIdentifiers(a.prerelease[i], b.prerelease[i]);
68
+ if (c !== 0)
69
+ return c;
70
+ }
71
+ return 0;
72
+ }
73
+ /** {@link compareSemverParts} over strings; unparseable versions sort lowest. */
74
+ export function compareSemver(a, b) {
75
+ const pa = parseSemver(a);
76
+ const pb = parseSemver(b);
77
+ if (!pa || !pb)
78
+ return (pa ? 1 : 0) - (pb ? 1 : 0);
79
+ return compareSemverParts(pa, pb);
80
+ }
81
+ const parts = (major, minor, patch, prerelease = []) => ({ major, minor, patch, prerelease });
82
+ /**
83
+ * Parse a version spec, or `null` when it is none of the supported forms (the
84
+ * caller then treats the input as a literal version, which matches nothing).
85
+ */
86
+ export function parseVersionSpec(spec) {
87
+ const s = spec.trim();
88
+ if (s === 'latest')
89
+ return { kind: 'latest' };
90
+ if (s.startsWith('^') || s.startsWith('~')) {
91
+ const partial = PARTIAL.exec(s.slice(1));
92
+ if (partial && !parseSemver(s.slice(1)))
93
+ return partialOperatorRange(s[0], partial);
94
+ const base = parseSemver(s.slice(1));
95
+ if (!base)
96
+ return null;
97
+ const { major, minor, patch } = base;
98
+ let max;
99
+ if (s[0] === '~')
100
+ max = parts(major, minor + 1, 0);
101
+ else if (major > 0)
102
+ max = parts(major + 1, 0, 0);
103
+ else if (minor > 0)
104
+ max = parts(0, minor + 1, 0);
105
+ else
106
+ max = parts(0, 0, patch + 1);
107
+ return { kind: 'range', min: base, max };
108
+ }
109
+ if (parseSemver(s))
110
+ return { kind: 'exact', version: s };
111
+ const m = PARTIAL.exec(s);
112
+ if (!m)
113
+ return null;
114
+ const major = Number(m[1]);
115
+ const minorWild = m[2] === undefined || m[2] === 'x' || m[2] === '*';
116
+ if (major > MAX_PART)
117
+ return null;
118
+ if (minorWild)
119
+ return { kind: 'range', min: parts(major, 0, 0), max: parts(major + 1, 0, 0) };
120
+ const minor = Number(m[2]);
121
+ if (minor > MAX_PART)
122
+ return null;
123
+ return { kind: 'range', min: parts(major, minor, 0), max: parts(major, minor + 1, 0) };
124
+ }
125
+ /**
126
+ * `^` / `~` over a PARTIAL version (npm): the missing parts are zero, and the
127
+ * upper bound follows the operator — `^1` / `~1` <2.0.0, `^1.2` <2.0.0 but
128
+ * `~1.2` <1.3.0, and a zero major narrows a caret to the next minor
129
+ * (`^0.2` <0.3.0) or major (`^0` <1.0.0).
130
+ */
131
+ function partialOperatorRange(op, m) {
132
+ const major = Number(m[1]);
133
+ const minorGiven = m[2] !== undefined && m[2] !== 'x' && m[2] !== '*';
134
+ const minor = minorGiven ? Number(m[2]) : 0;
135
+ if (major > MAX_PART || minor > MAX_PART)
136
+ return null;
137
+ const min = parts(major, minor, 0);
138
+ if (!minorGiven)
139
+ return { kind: 'range', min, max: parts(major + 1, 0, 0) };
140
+ if (op === '~' || major === 0)
141
+ return { kind: 'range', min, max: parts(major, minor + 1, 0) };
142
+ return { kind: 'range', min, max: parts(major + 1, 0, 0) };
143
+ }
144
+ /** True when `spec` resolves to a SET of versions (range or `latest`), not one. */
145
+ export function isVersionRange(spec) {
146
+ const parsed = parseVersionSpec(spec);
147
+ return parsed !== null && parsed.kind !== 'exact';
148
+ }
149
+ /** Whether `version` satisfies `spec` (a string or an already-parsed spec). */
150
+ export function satisfiesVersionSpec(version, spec) {
151
+ const parsed = typeof spec === 'string' ? parseVersionSpec(spec) : spec;
152
+ if (!parsed)
153
+ return typeof spec === 'string' && version === spec;
154
+ if (parsed.kind === 'exact')
155
+ return version === parsed.version;
156
+ const v = parseSemver(version);
157
+ if (!v)
158
+ return false;
159
+ if (parsed.kind === 'latest')
160
+ return v.prerelease.length === 0;
161
+ if (compareSemverParts(v, parsed.min) < 0 || compareSemverParts(v, parsed.max) >= 0)
162
+ return false;
163
+ if (v.prerelease.length === 0)
164
+ return true;
165
+ const { min } = parsed;
166
+ return min.prerelease.length > 0 && v.major === min.major && v.minor === min.minor && v.patch === min.patch;
167
+ }
168
+ /** The highest of `versions` satisfying `spec`, or `null`. */
169
+ export function maxSatisfying(versions, spec) {
170
+ let best = null;
171
+ for (const v of versions) {
172
+ if (satisfiesVersionSpec(v, spec) && (best === null || compareSemver(v, best) > 0))
173
+ best = v;
174
+ }
175
+ return best;
176
+ }
177
+ // -- SQL ------------------------------------------------------------------------
178
+ //
179
+ // The `version` column is CHECK-constrained to `^\d+\.\d+\.\d+(-pre)?(\+build)?$`,
180
+ // so the numeric parts are split out reliably: major/minor are the first two
181
+ // dot fields, patch is the third with any `-pre` / `+build` suffix removed, and
182
+ // the prerelease is whatever sits between the first `-` and any `+`.
183
+ const majorOf = (col) => sql `split_part(${col}, '.', 1)::int`;
184
+ const minorOf = (col) => sql `split_part(${col}, '.', 2)::int`;
185
+ const patchOf = (col) => sql `substring(${col} from '^[0-9]+\\.[0-9]+\\.([0-9]+)')::int`;
186
+ /** The prerelease suffix, or NULL for a stable version. */
187
+ const prereleaseOf = (col) => sql `substring(split_part(${col}, '+', 1) from '^[0-9]+\\.[0-9]+\\.[0-9]+-(.+)$')`;
188
+ const tupleOf = (col) => sql `(${majorOf(col)}, ${minorOf(col)}, ${patchOf(col)})`;
189
+ const tupleLit = (p) => sql `(${p.major}::int, ${p.minor}::int, ${p.patch}::int)`;
190
+ /**
191
+ * SQL predicate for `col` satisfying `spec`. Precision note: prerelease-vs-
192
+ * prerelease ordering WITHIN the lower bound's own tuple is not compared in SQL
193
+ * (every prerelease of that tuple is admitted) — {@link semverOrderBy} still
194
+ * ranks them, and the JS matcher is exact.
195
+ */
196
+ export function versionSpecCondition(col, spec) {
197
+ const parsed = parseVersionSpec(spec);
198
+ if (!parsed)
199
+ return eq(col, spec);
200
+ if (parsed.kind === 'exact')
201
+ return eq(col, parsed.version);
202
+ const stable = sql `${prereleaseOf(col)} IS NULL`;
203
+ if (parsed.kind === 'latest')
204
+ return stable;
205
+ const { min, max } = parsed;
206
+ const inRange = and(sql `${tupleOf(col)} >= ${tupleLit(min)}`, sql `${tupleOf(col)} < ${tupleLit(max)}`);
207
+ if (min.prerelease.length === 0)
208
+ return and(inRange, stable);
209
+ // A prerelease lower bound: stable versions above it, plus prereleases of its own tuple.
210
+ return and(inRange, or(stable, sql `${tupleOf(col)} = ${tupleLit(min)}`));
211
+ }
212
+ /**
213
+ * ORDER BY terms ranking `col` highest-semver first: numeric major/minor/patch,
214
+ * a stable version above its prereleases, then the prerelease text (a
215
+ * lexicographic tiebreak — close to, not exactly, semver identifier order).
216
+ */
217
+ export function semverOrderBy(col) {
218
+ return [
219
+ desc(majorOf(col)),
220
+ desc(minorOf(col)),
221
+ desc(patchOf(col)),
222
+ sql `${prereleaseOf(col)} IS NULL DESC`,
223
+ desc(prereleaseOf(col)),
224
+ asc(col),
225
+ ];
226
+ }
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtdmVyLXJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZW12ZXItcmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWtCL0QsTUFBTSxNQUFNLEdBQUcsNkhBQTZILENBQUM7QUFDN0ksTUFBTSxPQUFPLEdBQUcscURBQXFELENBQUM7QUFFdEUsMEVBQTBFO0FBQzFFLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUUvQiwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUFlO0lBQ3pDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQixNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxLQUFLLEdBQUcsUUFBUSxJQUFJLEtBQUssR0FBRyxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QyxHQUFHLENBQUMsQ0FBQztRQUN2QixHQUFHLENBQUMsR0FBRyxDQUFDO0tBQ1QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBWZXJzaW9uIHNwZWNzIGZvciBwbHVnaW4gbG9va3VwcyAoZG9jcy9wbHVnaW4taW5zdGFsbGluZy5tZCkuXG4gKlxuICogQSBzbWFsbCwgZGVwZW5kZW5jeS1mcmVlIG1hdGNoZXIgZm9yIGV4YWN0bHkgdGhlIGZvcm1zIHBsdWdpbiByZWZlcmVuY2VzIHVzZTpcbiAqXG4gKiAgIGV4YWN0ICAgIGAxLjIuM2AsIGAxLjIuMy1yYy4xYCAgIHRoYXQgb25lIHZlcnNpb25cbiAqICAgY2FyZXQgICAgYF4xLjIuM2AgICAgICAgICAgICAgICAgPj0xLjIuMyA8Mi4wLjAgIChgXjAuMi4zYCA8MC4zLjAsIGBeMC4wLjNgIDwwLjAuNClcbiAqICAgICAgICAgICAgYF4xYCwgYF4xLjJgICAgICAgICAgICAgPj0xLjAuMCA8Mi4wLjAsID49MS4yLjAgPDIuMC4wICAoYF4wLjJgIDwwLjMuMCwgYF4wYCA8MS4wLjApXG4gKiAgIHRpbGRlICAgIGB+MS4yLjNgICAgICAgICAgICAgICAgID49MS4yLjMgPDEuMy4wXG4gKiAgICAgICAgICAgIGB+MWAsIGB+MS4yYCAgICAgICAgICAgID49MS4wLjAgPDIuMC4wLCA+PTEuMi4wIDwxLjMuMFxuICogICBwYXJ0aWFsICBgMWAsIGAxLnhgLCBgMS4yYCwgYDEuMi54YCAgPj0xLjAuMCA8Mi4wLjAgLyA+PTEuMi4wIDwxLjMuMFxuICogICBsYXRlc3QgICBgbGF0ZXN0YCAgICAgICAgICAgICAgICB0aGUgaGlnaGVzdCBzdGFibGUgdmVyc2lvblxuICpcbiAqIG5wbSBzZW1hbnRpY3MgdGhyb3VnaG91dCwgaW5jbHVkaW5nIHByZXJlbGVhc2VzOiBhIHJhbmdlIG5ldmVyIG1hdGNoZXMgYVxuICogcHJlcmVsZWFzZSB1bmxlc3MgaXRzIG93biBsb3dlciBib3VuZCBpcyBhIHByZXJlbGVhc2Ugb2YgdGhlIFNBTUVcbiAqIG1ham9yLm1pbm9yLnBhdGNoIChzbyBgXjEuMi4zLWJldGEuMWAgYWRtaXRzIGAxLjIuMy1iZXRhLjJgIGJ1dCBub3RcbiAqIGAxLjMuMC1iZXRhLjFgKS4gQW4gZXhhY3Qgc3BlYyBtYXkgbmFtZSBhIHByZXJlbGVhc2UgZGlyZWN0bHkuXG4gKlxuICogVGhlIG1hdGNoZXIgcnVucyBpbiBKUyAoe0BsaW5rIHNhdGlzZmllc1ZlcnNpb25TcGVjfSkgYW5kIOKAlCBmb3IgdGhlIHF1ZXJ5XG4gKiBidWlsZGVycyDigJQgYXMgU1FMIG92ZXIgdGhlIGB2ZXJzaW9uYCBjb2x1bW4gKHtAbGluayB2ZXJzaW9uU3BlY0NvbmRpdGlvbn0sXG4gKiB7QGxpbmsgc2VtdmVyT3JkZXJCeX0pOyB0aGUgdHdvIGFyZSBrZXB0IGVxdWl2YWxlbnQgYnkgdGhlIHNoYXJlZCB0ZXN0cy5cbiAqL1xuXG5pbXBvcnQgeyBhbmQsIGFzYywgZGVzYywgZXEsIG9yLCBzcWwsIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcblxuLyoqIEEgcGFyc2VkIGBtYWpvci5taW5vci5wYXRjaFstcHJlcmVsZWFzZV1bK2J1aWxkXWAgdmVyc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VtdmVyUGFydHMge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xuICAvKiogRG90LXNlcGFyYXRlZCBwcmVyZWxlYXNlIGlkZW50aWZpZXJzOyBlbXB0eSBmb3IgYSBzdGFibGUgdmVyc2lvbi4gKi9cbiAgcHJlcmVsZWFzZTogc3RyaW5nW107XG59XG5cbi8qKiBBIHBhcnNlZCB2ZXJzaW9uIHNwZWMuIGByYW5nZWAgYm91bmRzIGFyZSBgW21pbiwgbWF4KWAuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uU3BlYyA9XG4gIHwgeyBraW5kOiAnZXhhY3QnOyB2ZXJzaW9uOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xhdGVzdCcgfVxuICB8IHsga2luZDogJ3JhbmdlJzsgbWluOiBTZW12ZXJQYXJ0czsgbWF4OiBTZW12ZXJQYXJ0cyB9O1xuXG5jb25zdCBTRU1WRVIgPSAvXigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKSg/Oi0oWzAtOUEtWmEtei1dKyg/OlxcLlswLTlBLVphLXotXSspKikpPyg/OlxcK1swLTlBLVphLXotXSsoPzpcXC5bMC05QS1aYS16LV0rKSopPyQvO1xuY29uc3QgUEFSVElBTCA9IC9eKDB8WzEtOV1cXGQqKSg/OlxcLigwfFsxLTldXFxkKnx4fFxcKikpPyg/OlxcLih4fFxcKikpPyQvO1xuXG4vKiogVXBwZXIgYm91bmQgb24gYW55IG51bWVyaWMgcGFydCAoa2VlcHMgU1FMIGA6OmludGAgY2FzdHMgaW4gcmFuZ2UpLiAqL1xuY29uc3QgTUFYX1BBUlQgPSAyXzE0N180ODNfNjQ3O1xuXG4vKiogUGFyc2UgYSBmdWxsIHNlbXZlciBzdHJpbmcsIG9yIGBudWxsYCB3aGVuIGl0IGlzbid0IG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbXZlcih2ZXJzaW9uOiBzdHJpbmcpOiBTZW12ZXJQYXJ0cyB8IG51bGwge1xuICBjb25zdCBtID0gU0VNVkVSLmV4ZWModmVyc2lvbi50cmltKCkpO1xuICBpZiAoIW0pIHJldHVybiBudWxsO1xuICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBbTnVtYmVyKG1bMV0pLCBOdW1iZXIobVsyXSksIE51bWJlcihtWzNdKV07XG4gIGlmIChtYWpvciA+IE1BWF9QQVJUIHx8IG1pbm9yID4gTUFYX1BBUlQgfHwgcGF0Y2ggPiBNQVhfUEFSVCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7IG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZXJlbGVhc2U6IG1bNF0gPyBtWzRdLnNwbGl0KCcuJykgOiBbXSB9O1xufVxuXG5mdW5jdGlvbiBjb21wYXJlSWRlbnRpZmllcnMoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBhbiA9IC9eXFxkKyQvLnRlc3QoYSk7XG4gIGNvbnN0IGJuID0gL15cXGQrJC8udGVzdChiKTtcbiAgaWYgKGFuICYmIGJuKSByZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpO1xuICBpZiAoYW4pIHJldHVybiAtMTsgLy8gbnVtZXJpYyBpZGVudGlmaWVycyBzb3J0IGJlbG93IGFscGhhbnVtZXJpYyBvbmVzXG4gIGlmIChibikgcmV0dXJuIDE7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cblxuLyoqIFNlbXZlciAyLjAgcHJlY2VkZW5jZTogbmVnYXRpdmUgd2hlbiBgYSA8IGJgLCAwIHdoZW4gZXF1YWwsIHBvc2l0aXZlIHdoZW4gYGEgPiBiYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlU2VtdmVyUGFydHMoYTogU2VtdmVyUGFydHMsIGI6IFNlbXZlclBhcnRzKTogbnVtYmVyIHtcbiAgaWYgKGEubWFqb3IgIT09IGIubWFqb3IpIHJldHVybiBhLm1ham9yIC0gYi5tYWpvcjtcbiAgaWYgKGEubWlub3IgIT09IGIubWlub3IpIHJldHVybiBhLm1pbm9yIC0gYi5taW5vcjtcbiAgaWYgKGEucGF0Y2ggIT09IGIucGF0Y2gpIHJldHVybiBhLnBhdGNoIC0gYi5wYXRjaDtcbiAgLy8gQSBzdGFibGUgdmVyc2lvbiBvdXRyYW5rcyBhbnkgcHJlcmVsZWFzZSBvZiB0aGUgc2FtZSB0dXBsZS5cbiAgaWYgKCFhLnByZXJlbGVhc2UubGVuZ3RoIHx8ICFiLnByZXJlbGVhc2UubGVuZ3RoKSByZXR1cm4gYi5wcmVyZWxlYXNlLmxlbmd0aCAtIGEucHJlcmVsZWFzZS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5tYXgoYS5wcmVyZWxlYXNlLmxlbmd0aCwgYi5wcmVyZWxlYXNlLmxlbmd0aCk7IGkrKykge1xuICAgIGlmIChhLnByZXJlbGVhc2VbaV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmIChiLnByZXJlbGVhc2VbaV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7XG4gICAgY29uc3QgYyA9IGNvbXBhcmVJZGVudGlmaWVycyhhLnByZXJlbGVhc2VbaV0hLCBiLnByZXJlbGVhc2VbaV0hKTtcbiAgICBpZiAoYyAhPT0gMCkgcmV0dXJuIGM7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKiB7QGxpbmsgY29tcGFyZVNlbXZlclBhcnRzfSBvdmVyIHN0cmluZ3M7IHVucGFyc2VhYmxlIHZlcnNpb25zIHNvcnQgbG93ZXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBwYSA9IHBhcnNlU2VtdmVyKGEpO1xuICBjb25zdCBwYiA9IHBhcnNlU2VtdmVyKGIpO1xuICBpZiAoIXBhIHx8ICFwYikgcmV0dXJuIChwYSA/IDEgOiAwKSAtIChwYiA/IDEgOiAwKTtcbiAgcmV0dXJuIGNvbXBhcmVTZW12ZXJQYXJ0cyhwYSwgcGIpO1xufVxuXG5jb25zdCBwYXJ0cyA9IChtYWpvcjogbnVtYmVyLCBtaW5vcjogbnVtYmVyLCBwYXRjaDogbnVtYmVyLCBwcmVyZWxlYXNlOiBzdHJpbmdbXSA9IFtdKTogU2VtdmVyUGFydHMgPT5cbiAgKHsgbWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlcmVsZWFzZSB9KTtcblxuLyoqXG4gKiBQYXJzZSBhIHZlcnNpb24gc3BlYywgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm9uZSBvZiB0aGUgc3VwcG9ydGVkIGZvcm1zICh0aGVcbiAqIGNhbGxlciB0aGVuIHRyZWF0cyB0aGUgaW5wdXQgYXMgYSBsaXRlcmFsIHZlcnNpb24sIHdoaWNoIG1hdGNoZXMgbm90aGluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlcnNpb25TcGVjKHNwZWM6IHN0cmluZyk6IFZlcnNpb25TcGVjIHwgbnVsbCB7XG4gIGNvbnN0IHMgPSBzcGVjLnRyaW0oKTtcbiAgaWYgKHMgPT09ICdsYXRlc3QnKSByZXR1cm4geyBraW5kOiAnbGF0ZXN0JyB9O1xuXG4gIGlmIChzLnN0YXJ0c1dpdGgoJ14nKSB8fCBzLnN0YXJ0c1dpdGgoJ34nKSkge1xuICAgIGNvbnN0IHBhcnRpYWwgPSBQQVJUSUFMLmV4ZWMocy5zbGljZSgxKSk7XG4gICAgaWYgKHBhcnRpYWwgJiYgIXBhcnNlU2VtdmVyKHMuc2xpY2UoMSkpKSByZXR1cm4gcGFydGlhbE9wZXJhdG9yUmFuZ2Uoc1swXSBhcyAnXicgfCAnficsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJhc2UgPSBwYXJzZVNlbXZlcihzLnNsaWNlKDEpKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHsgbWFqb3IsIG1pbm9yLCBwYXRjaCB9ID0gYmFzZTtcbiAgICBsZXQgbWF4OiBTZW12ZXJQYXJ0cztcbiAgICBpZiAoc1swXSA9PT0gJ34nKSBtYXggPSBwYXJ0cyhtYWpvciwgbWlub3IgKyAxLCAwKTtcbiAgICBlbHNlIGlmIChtYWpvciA+IDApIG1heCA9IHBhcnRzKG1ham9yICsgMSwgMCwgMCk7XG4gICAgZWxzZSBpZiAobWlub3IgPiAwKSBtYXggPSBwYXJ0cygwLCBtaW5vciArIDEsIDApO1xuICAgIGVsc2UgbWF4ID0gcGFydHMoMCwgMCwgcGF0Y2ggKyAxKTtcbiAgICByZXR1cm4geyBraW5kOiAncmFuZ2UnLCBtaW46IGJhc2UsIG1heCB9O1xuICB9XG5cbiAgaWYgKHBhcnNlU2VtdmVyKHMpKSByZXR1cm4geyBraW5kOiAnZXhhY3QnLCB2ZXJzaW9uOiBzIH07XG5cbiAgY29uc3QgbSA9IFBBUlRJQUwuZXhlYyhzKTtcbiAgaWYgKCFtKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbWFqb3IgPSBOdW1iZXIobVsxXSk7XG4gIGNvbnN0IG1pbm9yV2lsZCA9IG1bMl0gPT09IHVuZGVmaW5lZCB8fCBtWzJdID09PSAneCcgfHwgbVsyXSA9PT0gJyonO1xuICBpZiAobWFqb3IgPiBNQVhfUEFSVCkgcmV0dXJuIG51bGw7XG4gIGlmIChtaW5vcldpbGQpIHJldHVybiB7IGtpbmQ6ICdyYW5nZScsIG1pbjogcGFydHMobWFqb3IsIDAsIDApLCBtYXg6IHBhcnRzKG1ham9yICsgMSwgMCwgMCkgfTtcbiAgY29uc3QgbWlub3IgPSBOdW1iZXIobVsyXSk7XG4gIGlmIChtaW5vciA+IE1BWF9QQVJUKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHsga2luZDogJ3JhbmdlJywgbWluOiBwYXJ0cyhtYWpvciwgbWlub3IsIDApLCBtYXg6IHBhcnRzKG1ham9yLCBtaW5vciArIDEsIDApIH07XG59XG5cbi8qKlxuICogYF5gIC8gYH5gIG92ZXIgYSBQQVJUSUFMIHZlcnNpb24gKG5wbSk6IHRoZSBtaXNzaW5nIHBhcnRzIGFyZSB6ZXJvLCBhbmQgdGhlXG4gKiB1cHBlciBib3VuZCBmb2xsb3dzIHRoZSBvcGVyYXRvciDigJQgYF4xYCAvIGB+MWAgPDIuMC4wLCBgXjEuMmAgPDIuMC4wIGJ1dFxuICogYH4xLjJgIDwxLjMuMCwgYW5kIGEgemVybyBtYWpvciBuYXJyb3dzIGEgY2FyZXQgdG8gdGhlIG5leHQgbWlub3JcbiAqIChgXjAuMmAgPDAuMy4wKSBvciBtYWpvciAoYF4wYCA8MS4wLjApLlxuICovXG5mdW5jdGlvbiBwYXJ0aWFsT3BlcmF0b3JSYW5nZShvcDogJ14nIHwgJ34nLCBtOiBSZWdFeHBFeGVjQXJyYXkpOiBWZXJzaW9uU3BlYyB8IG51bGwge1xuICBjb25zdCBtYWpvciA9IE51bWJlcihtWzFdKTtcbiAgY29uc3QgbWlub3JHaXZlbiA9IG1bMl0gIT09IHVuZGVmaW5lZCAmJiBtWzJdICE9PSAneCcgJiYgbVsyXSAhPT0gJyonO1xuICBjb25zdCBtaW5vciA9IG1pbm9yR2l2ZW4gPyBOdW1iZXIobVsyXSkgOiAwO1xuICBpZiAobWFqb3IgPiBNQVhfUEFSVCB8fCBtaW5vciA+IE1BWF9QQVJUKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbWluID0gcGFydHMobWFqb3IsIG1pbm9yLCAwKTtcbiAgaWYgKCFtaW5vckdpdmVuKSByZXR1cm4geyBraW5kOiAncmFuZ2UnLCBtaW4sIG1heDogcGFydHMobWFqb3IgKyAxLCAwLCAwKSB9O1xuICBpZiAob3AgPT09ICd+JyB8fCBtYWpvciA9PT0gMCkgcmV0dXJuIHsga2luZDogJ3JhbmdlJywgbWluLCBtYXg6IHBhcnRzKG1ham9yLCBtaW5vciArIDEsIDApIH07XG4gIHJldHVybiB7IGtpbmQ6ICdyYW5nZScsIG1pbiwgbWF4OiBwYXJ0cyhtYWpvciArIDEsIDAsIDApIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gYHNwZWNgIHJlc29sdmVzIHRvIGEgU0VUIG9mIHZlcnNpb25zIChyYW5nZSBvciBgbGF0ZXN0YCksIG5vdCBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uUmFuZ2Uoc3BlYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlVmVyc2lvblNwZWMoc3BlYyk7XG4gIHJldHVybiBwYXJzZWQgIT09IG51bGwgJiYgcGFyc2VkLmtpbmQgIT09ICdleGFjdCc7XG59XG5cbi8qKiBXaGV0aGVyIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgYHNwZWNgIChhIHN0cmluZyBvciBhbiBhbHJlYWR5LXBhcnNlZCBzcGVjKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYXRpc2ZpZXNWZXJzaW9uU3BlYyh2ZXJzaW9uOiBzdHJpbmcsIHNwZWM6IHN0cmluZyB8IFZlcnNpb25TcGVjKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiBzcGVjID09PSAnc3RyaW5nJyA/IHBhcnNlVmVyc2lvblNwZWMoc3BlYykgOiBzcGVjO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIHR5cGVvZiBzcGVjID09PSAnc3RyaW5nJyAmJiB2ZXJzaW9uID09PSBzcGVjO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleGFjdCcpIHJldHVybiB2ZXJzaW9uID09PSBwYXJzZWQudmVyc2lvbjtcbiAgY29uc3QgdiA9IHBhcnNlU2VtdmVyKHZlcnNpb24pO1xuICBpZiAoIXYpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnbGF0ZXN0JykgcmV0dXJuIHYucHJlcmVsZWFzZS5sZW5ndGggPT09IDA7XG4gIGlmIChjb21wYXJlU2VtdmVyUGFydHModiwgcGFyc2VkLm1pbikgPCAwIHx8IGNvbXBhcmVTZW12ZXJQYXJ0cyh2LCBwYXJzZWQubWF4KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gIGlmICh2LnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeyBtaW4gfSA9IHBhcnNlZDtcbiAgcmV0dXJuIG1pbi5wcmVyZWxlYXNlLmxlbmd0aCA+IDAgJiYgdi5tYWpvciA9PT0gbWluLm1ham9yICYmIHYubWlub3IgPT09IG1pbi5taW5vciAmJiB2LnBhdGNoID09PSBtaW4ucGF0Y2g7XG59XG5cbi8qKiBUaGUgaGlnaGVzdCBvZiBgdmVyc2lvbnNgIHNhdGlzZnlpbmcgYHNwZWNgLCBvciBgbnVsbGAuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4U2F0aXNmeWluZyh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10sIHNwZWM6IHN0cmluZyB8IFZlcnNpb25TcGVjKTogc3RyaW5nIHwgbnVsbCB7XG4gIGxldCBiZXN0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZm9yIChjb25zdCB2IG9mIHZlcnNpb25zKSB7XG4gICAgaWYgKHNhdGlzZmllc1ZlcnNpb25TcGVjKHYsIHNwZWMpICYmIChiZXN0ID09PSBudWxsIHx8IGNvbXBhcmVTZW12ZXIodiwgYmVzdCkgPiAwKSkgYmVzdCA9IHY7XG4gIH1cbiAgcmV0dXJuIGJlc3Q7XG59XG5cbi8vIC0tIFNRTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBUaGUgYHZlcnNpb25gIGNvbHVtbiBpcyBDSEVDSy1jb25zdHJhaW5lZCB0byBgXlxcZCtcXC5cXGQrXFwuXFxkKygtcHJlKT8oXFwrYnVpbGQpPyRgLFxuLy8gc28gdGhlIG51bWVyaWMgcGFydHMgYXJlIHNwbGl0IG91dCByZWxpYWJseTogbWFqb3IvbWlub3IgYXJlIHRoZSBmaXJzdCB0d29cbi8vIGRvdCBmaWVsZHMsIHBhdGNoIGlzIHRoZSB0aGlyZCB3aXRoIGFueSBgLXByZWAgLyBgK2J1aWxkYCBzdWZmaXggcmVtb3ZlZCwgYW5kXG4vLyB0aGUgcHJlcmVsZWFzZSBpcyB3aGF0ZXZlciBzaXRzIGJldHdlZW4gdGhlIGZpcnN0IGAtYCBhbmQgYW55IGArYC5cblxuY29uc3QgbWFqb3JPZiA9IChjb2w6IEFueUNvbHVtbik6IFNRTCA9PiBzcWxgc3BsaXRfcGFydCgke2NvbH0sICcuJywgMSk6OmludGA7XG5jb25zdCBtaW5vck9mID0gKGNvbDogQW55Q29sdW1uKTogU1FMID0+IHNxbGBzcGxpdF9wYXJ0KCR7Y29sfSwgJy4nLCAyKTo6aW50YDtcbmNvbnN0IHBhdGNoT2YgPSAoY29sOiBBbnlDb2x1bW4pOiBTUUwgPT4gc3FsYHN1YnN0cmluZygke2NvbH0gZnJvbSAnXlswLTldK1xcXFwuWzAtOV0rXFxcXC4oWzAtOV0rKScpOjppbnRgO1xuLyoqIFRoZSBwcmVyZWxlYXNlIHN1ZmZpeCwgb3IgTlVMTCBmb3IgYSBzdGFibGUgdmVyc2lvbi4gKi9cbmNvbnN0IHByZXJlbGVhc2VPZiA9IChjb2w6IEFueUNvbHVtbik6IFNRTCA9PiBzcWxgc3Vic3RyaW5nKHNwbGl0X3BhcnQoJHtjb2x9LCAnKycsIDEpIGZyb20gJ15bMC05XStcXFxcLlswLTldK1xcXFwuWzAtOV0rLSguKykkJylgO1xuXG5jb25zdCB0dXBsZU9mID0gKGNvbDogQW55Q29sdW1uKTogU1FMID0+IHNxbGAoJHttYWpvck9mKGNvbCl9LCAke21pbm9yT2YoY29sKX0sICR7cGF0Y2hPZihjb2wpfSlgO1xuY29uc3QgdHVwbGVMaXQgPSAocDogU2VtdmVyUGFydHMpOiBTUUwgPT4gc3FsYCgke3AubWFqb3J9OjppbnQsICR7cC5taW5vcn06OmludCwgJHtwLnBhdGNofTo6aW50KWA7XG5cbi8qKlxuICogU1FMIHByZWRpY2F0ZSBmb3IgYGNvbGAgc2F0aXNmeWluZyBgc3BlY2AuIFByZWNpc2lvbiBub3RlOiBwcmVyZWxlYXNlLXZzLVxuICogcHJlcmVsZWFzZSBvcmRlcmluZyBXSVRISU4gdGhlIGxvd2VyIGJvdW5kJ3Mgb3duIHR1cGxlIGlzIG5vdCBjb21wYXJlZCBpbiBTUUxcbiAqIChldmVyeSBwcmVyZWxlYXNlIG9mIHRoYXQgdHVwbGUgaXMgYWRtaXR0ZWQpIOKAlCB7QGxpbmsgc2VtdmVyT3JkZXJCeX0gc3RpbGxcbiAqIHJhbmtzIHRoZW0sIGFuZCB0aGUgSlMgbWF0Y2hlciBpcyBleGFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25TcGVjQ29uZGl0aW9uKGNvbDogQW55Q29sdW1uLCBzcGVjOiBzdHJpbmcpOiBTUUwge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAoIXBhcnNlZCkgcmV0dXJuIGVxKGNvbCwgc3BlYyk7XG4gIGlmIChwYXJzZWQua2luZCA9PT0gJ2V4YWN0JykgcmV0dXJuIGVxKGNvbCwgcGFyc2VkLnZlcnNpb24pO1xuICBjb25zdCBzdGFibGUgPSBzcWxgJHtwcmVyZWxlYXNlT2YoY29sKX0gSVMgTlVMTGA7XG4gIGlmIChwYXJzZWQua2luZCA9PT0gJ2xhdGVzdCcpIHJldHVybiBzdGFibGU7XG5cbiAgY29uc3QgeyBtaW4sIG1heCB9ID0gcGFyc2VkO1xuICBjb25zdCBpblJhbmdlID0gYW5kKHNxbGAke3R1cGxlT2YoY29sKX0gPj0gJHt0dXBsZUxpdChtaW4pfWAsIHNxbGAke3R1cGxlT2YoY29sKX0gPCAke3R1cGxlTGl0KG1heCl9YCkhO1xuICBpZiAobWluLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSByZXR1cm4gYW5kKGluUmFuZ2UsIHN0YWJsZSkhO1xuICAvLyBBIHByZXJlbGVhc2UgbG93ZXIgYm91bmQ6IHN0YWJsZSB2ZXJzaW9ucyBhYm92ZSBpdCwgcGx1cyBwcmVyZWxlYXNlcyBvZiBpdHMgb3duIHR1cGxlLlxuICByZXR1cm4gYW5kKGluUmFuZ2UsIG9yKHN0YWJsZSwgc3FsYCR7dHVwbGVPZihjb2wpfSA9ICR7dHVwbGVMaXQobWluKX1gKSkhO1xufVxuXG4vKipcbiAqIE9SREVSIEJZIHRlcm1zIHJhbmtpbmcgYGNvbGAgaGlnaGVzdC1zZW12ZXIgZmlyc3Q6IG51bWVyaWMgbWFqb3IvbWlub3IvcGF0Y2gsXG4gKiBhIHN0YWJsZSB2ZXJzaW9uIGFib3ZlIGl0cyBwcmVyZWxlYXNlcywgdGhlbiB0aGUgcHJlcmVsZWFzZSB0ZXh0IChhXG4gKiBsZXhpY29ncmFwaGljIHRpZWJyZWFrIOKAlCBjbG9zZSB0bywgbm90IGV4YWN0bHksIHNlbXZlciBpZGVudGlmaWVyIG9yZGVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbXZlck9yZGVyQnkoY29sOiBBbnlDb2x1bW4pOiBTUUxbXSB7XG4gIHJldHVybiBbXG4gICAgZGVzYyhtYWpvck9mKGNvbCkpLFxuICAgIGRlc2MobWlub3JPZihjb2wpKSxcbiAgICBkZXNjKHBhdGNoT2YoY29sKSksXG4gICAgc3FsYCR7cHJlcmVsZWFzZU9mKGNvbCl9IElTIE5VTEwgREVTQ2AsXG4gICAgZGVzYyhwcmVyZWxlYXNlT2YoY29sKSksXG4gICAgYXNjKGNvbCksXG4gIF07XG59XG4iXX0=
@@ -17,13 +17,13 @@
17
17
  * than left to the caller. This is a cross-tenant housekeeping job, not a
18
18
  * per-org operation.
19
19
  */
20
- import { createLogger, createScheduler, createEnvRedisLock, closeLeaderLock } from '@pipeline-builder/api-core';
20
+ import { createLogger, createScheduler, envBool, envInt } from '@pipeline-builder/api-core';
21
21
  import { runWithTenantContext } from '../database/tenancy.js';
22
22
  const logger = createLogger('soft-delete-sweep');
23
23
  /** Kill-switch: `SOFT_DELETE_PURGE_ENABLED=false` disables all hard-purging
24
24
  * (tombstones still accumulate + stay restorable; nothing is destroyed). */
25
25
  export function isSoftDeletePurgeEnabled() {
26
- return (process.env.SOFT_DELETE_PURGE_ENABLED ?? 'true').toLowerCase() !== 'false';
26
+ return envBool('SOFT_DELETE_PURGE_ENABLED', true);
27
27
  }
28
28
  /**
29
29
  * Run one purge sweep across `entities`. Loops each entity's `purgeExpired` in
@@ -93,32 +93,20 @@ export function createSoftDeletePurgeScheduler(opts) {
93
93
  logger.info('Soft-delete purge scheduler disabled (SOFT_DELETE_PURGE_ENABLED=false)', { service: opts.service });
94
94
  return null;
95
95
  }
96
- const intervalMs = Math.max(1, Number.parseInt(process.env.SOFT_DELETE_PURGE_INTERVAL_HOURS ?? '6', 10) || 6) * 60 * 60 * 1000;
97
- const startupDelayMs = Math.max(0, Number.parseInt(process.env.SOFT_DELETE_PURGE_STARTUP_DELAY_MS ?? '120000', 10) || 0);
98
- const lockTtlMs = Math.max(1000, Number.parseInt(process.env.SOFT_DELETE_PURGE_LOCK_TTL_MS ?? '900000', 10) || 900000);
99
- const lock = createEnvRedisLock();
96
+ const intervalMs = envInt('SOFT_DELETE_PURGE_INTERVAL_HOURS', 6, { min: 1 }) * 60 * 60 * 1000;
97
+ const startupDelayMs = envInt('SOFT_DELETE_PURGE_STARTUP_DELAY_MS', 120_000, { min: 0 });
98
+ const lockTtlMs = envInt('SOFT_DELETE_PURGE_LOCK_TTL_MS', 900_000, { min: 1000 });
100
99
  logger.info('Soft-delete purge scheduler starting', {
101
100
  service: opts.service,
102
101
  entities: opts.entities.map((e) => e.name),
103
102
  intervalHours: intervalMs / 3_600_000,
104
- locked: !!lock,
105
103
  });
106
- const scheduler = createScheduler({
104
+ return createScheduler({
107
105
  name: `soft-delete-purge:${opts.service}`,
108
106
  intervalMs,
109
107
  startupDelayMs,
110
108
  run: async () => { await runSoftDeletePurge(opts.entities, opts); },
111
- ...(lock ? { lock: { redis: () => lock, key: `soft-delete-purge:${opts.service}:leader`, ttlMs: lockTtlMs } } : {}),
109
+ lock: { key: `soft-delete-purge:${opts.service}:leader`, ttlMs: lockTtlMs },
112
110
  });
113
- if (!lock)
114
- return scheduler;
115
- // Own the leader-lock Redis client's lifecycle: `stop()` (wired to the
116
- // service's runServer onShutdown) also closes the connection so it can't keep
117
- // the process from exiting cleanly. Per-cycle lock acquire/release is handled
118
- // by withLeaderLock; this is just connection teardown.
119
- return {
120
- start: () => scheduler.start(),
121
- stop: () => { scheduler.stop(); void closeLeaderLock(lock); },
122
- };
123
111
  }
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1kZWxldGUtc3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQWtCLE1BQU0sNEJBQTRCLENBQUM7QUFDaEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFrQmpEOzZFQUM2RTtBQUM3RSxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixJQUFJLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sQ0FBQztBQUNyRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxRQUEyQixFQUMzQixJQUFJLEdBQTJCLEVBQUU7SUFFakMsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUM3RSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUM7SUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRCwrRUFBK0U7SUFDL0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV2QiwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pF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QVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUMsYUFBYSxFQUFFLFVBQVUsR0FBRyxTQUFTO1FBQ3JDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSTtLQUNmLENBQUMsQ0FBQztJQUVILE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQztRQUNoQyxJQUFJLEVBQUUscUJBQXFCLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDekMsVUFBVTtRQUNWLGNBQWM7UUFDZCxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUscUJBQXFCLElBQUksQ0FBQyxPQUFPLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3BILENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFNUIsdUVBQXVFO0lBQ3ZFLDhFQUE4RTtJQUM5RSw4RUFBOEU7SUFDOUUsdURBQXVEO0lBQ3ZELE9BQU87UUFDTCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtRQUM5QixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzlELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2hhcmVkIHNvZnQtZGVsZXRlIHJldGVudGlvbiBwdXJnZS5cbiAqXG4gKiBFdmVyeSB7QGxpbmsgQ3J1ZFNlcnZpY2V9IGVudGl0eSBzb2Z0LWRlbGV0ZXMgKHNldHMgYGRlbGV0ZWRBdGAgKyBhXG4gKiBgcHVyZ2VfYWZ0ZXJgIGRlYWRsaW5lKS4gVGhpcyBvcmNoZXN0cmF0b3IgcnVucyBvbmUgcHVyZ2UgcGFzcyBhY3Jvc3MgYSBzZXRcbiAqIG9mIHN1Y2ggZW50aXRpZXMsIGhhcmQtZGVsZXRpbmcgdG9tYnN0b25lcyB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2VkLiBJdCBpc1xuICogdGhlIGBydW5gIGNhbGxiYWNrIGEgc2VydmljZSBoYW5kcyB0byBgY3JlYXRlU2NoZWR1bGVyYCAobGVhZGVyLWxvY2tlZCksIHNvXG4gKiBvbmx5IG9uZSBwb2Qgc3dlZXBzIGF0IGEgdGltZS5cbiAqXG4gKiBSdW5zIGluIGFuIGV4cGxpY2l0ICoqc3lzYWRtaW4gdGVuYW50IHNjb3BlKiogKGBydW5XaXRoVGVuYW50Q29udGV4dCh7XG4gKiBpc1N1cGVyQWRtaW46IHRydWUgfSlgKSBzbyB0aGUgdW5kZXJseWluZyBgcHVyZ2VFeHBpcmVkYCBzcGFucyBldmVyeSBvcmcgYW5kXG4gKiBieXBhc3NlcyBSTFMgb24gRk9SQ0UnZCB0YWJsZXMgKHBsdWdpbnMvcGlwZWxpbmVzL2V0Yy4pLiBBIGJhcmUgbm8tdGVuYW50XG4gKiBjb250ZXh0IHdvdWxkIHNlZSB6ZXJvIHJvd3Mgb24gdGhvc2UgdGFibGVzIOKAlCBhbmQgaW4gcHJvZHVjdGlvbiAoYHN0cmljdGBcbiAqIG1vZGUpIGB3aXRoVGVuYW50VHhgIHRocm93cyBvdXRyaWdodCDigJQgc28gdGhlIHNjb3BlIGlzIGVzdGFibGlzaGVkIGhlcmUgcmF0aGVyXG4gKiB0aGFuIGxlZnQgdG8gdGhlIGNhbGxlci4gVGhpcyBpcyBhIGNyb3NzLXRlbmFudCBob3VzZWtlZXBpbmcgam9iLCBub3QgYVxuICogcGVyLW9yZyBvcGVyYXRpb24uXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBjcmVhdGVTY2hlZHVsZXIsIGNyZWF0ZUVudlJlZGlzTG9jaywgY2xvc2VMZWFkZXJMb2NrLCB0eXBlIFNjaGVkdWxlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc29mdC1kZWxldGUtc3dlZXAnKTtcblxuLyoqIFRoZSBzbGljZSBvZiBhIENydWRTZXJ2aWNlIHRoZSBzd2VlcCBuZWVkcywgcGx1cyBhIGxhYmVsIGZvciBsb2dzL21ldHJpY3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1cmdlYWJsZUVudGl0eSB7XG4gIC8qKiBUYWJsZS9lbnRpdHkgbGFiZWwgKGUuZy4gJ3BpcGVsaW5lJykgZm9yIHBlci10YWJsZSBsb2dnaW5nLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBIYXJkLWRlbGV0ZSB1cCB0byBgbGltaXRgIGV4cGlyZWQgdG9tYnN0b25lczsgcmV0dXJucyByb3dzIHB1cmdlZC4gKi9cbiAgcHVyZ2VFeHBpcmVkKG5vdzogRGF0ZSwgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29mdERlbGV0ZVB1cmdlT3B0aW9ucyB7XG4gIC8qKiBSb3dzIHBlciBiYXRjaCBwZXIgdGFibGUgKGRlZmF1bHQgNTAwKS4gKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogTWF4IGJhdGNoZXMgcGVyIHRhYmxlIHBlciB0aWNrIChkZWZhdWx0IDIwIOKGkiDiiaQgMTBrL3RhYmxlL3RpY2spOyB0aGUgcmVzdFxuICAgKiAgaXMgZGVmZXJyZWQgdG8gdGhlIG5leHQgdGljayBzbyBhIGh1Z2UgYmFja2xvZyBjYW4ndCBibG93IHRoZSBsb2NrIFRUTC4gKi9cbiAgbWF4QmF0Y2hlc1BlckVudGl0eT86IG51bWJlcjtcbn1cblxuLyoqIEtpbGwtc3dpdGNoOiBgU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZWAgZGlzYWJsZXMgYWxsIGhhcmQtcHVyZ2luZ1xuICogICh0b21ic3RvbmVzIHN0aWxsIGFjY3VtdWxhdGUgKyBzdGF5IHJlc3RvcmFibGU7IG5vdGhpbmcgaXMgZGVzdHJveWVkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NvZnREZWxldGVQdXJnZUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAocHJvY2Vzcy5lbnYuU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRCA/PyAndHJ1ZScpLnRvTG93ZXJDYXNlKCkgIT09ICdmYWxzZSc7XG59XG5cbi8qKlxuICogUnVuIG9uZSBwdXJnZSBzd2VlcCBhY3Jvc3MgYGVudGl0aWVzYC4gTG9vcHMgZWFjaCBlbnRpdHkncyBgcHVyZ2VFeHBpcmVkYCBpblxuICogYmF0Y2hlcyB1bnRpbCBhIGJhdGNoIHJldHVybnMgYDwgYmF0Y2hTaXplYCAoZHJhaW5lZCkgb3IgdGhlIHBlci10aWNrIGNhcCBpc1xuICogaGl0IChsb2dnZWQ7IGNvbnRpbnVlZCBuZXh0IHRpY2spLiBOZXZlciB0aHJvd3Mg4oCUIGEgZmFpbGluZyBlbnRpdHkgaXMgbG9nZ2VkXG4gKiBhbmQgdGhlIHN3ZWVwIG1vdmVzIG9uLiBSZXR1cm5zIHBlci1lbnRpdHkgcHVyZ2VkIGNvdW50cyAoYWxzbyBsb2dnZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU29mdERlbGV0ZVB1cmdlKFxuICBlbnRpdGllczogUHVyZ2VhYmxlRW50aXR5W10sXG4gIG9wdHM6IFNvZnREZWxldGVQdXJnZU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICBjb25zdCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgaWYgKCFpc1NvZnREZWxldGVQdXJnZUVuYWJsZWQoKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnU29mdC1kZWxldGUgcHVyZ2UgZGlzYWJsZWQgKFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQ9ZmFsc2UpJyk7XG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxuXG4gIGNvbnN0IGJhdGNoU2l6ZSA9IG9wdHMuYmF0Y2hTaXplID8/IDUwMDtcbiAgY29uc3QgbWF4QmF0Y2hlcyA9IG9wdHMubWF4QmF0Y2hlc1BlckVudGl0eSA/PyAyMDtcbiAgLy8gT25lIGBub3dgIGZvciB0aGUgd2hvbGUgdGljayDigJQgcm93cyB0aGF0IGV4cGlyZSBtaWQtc3dlZXAgd2FpdCBmb3IgdGhlIG5leHQuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgLy8gRXN0YWJsaXNoIGEgc3lzYWRtaW4gc2NvcGUgc28gZXZlcnkgYHB1cmdlRXhwaXJlZGAgKHdoaWNoIHJvdXRlcyB0aHJvdWdoXG4gIC8vIGB3aXRoVGVuYW50VHhgKSBieXBhc3NlcyBSTFMgYW5kIHNwYW5zIGFsbCBvcmdzLiBXaXRob3V0IHRoaXMsIEZPUkNFJ2RcbiAgLy8gdGFibGVzIHJldHVybiB6ZXJvIHJvd3MgYW5kIHByb2R1Y3Rpb24gYHN0cmljdGAgbW9kZSB0aHJvd3MuXG4gIHJldHVybiBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEJhdGNoZXM7IGkrKykge1xuICAgICAgICBsZXQgcHVyZ2VkOiBudW1iZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVyZ2VkID0gYXdhaXQgZW50aXR5LnB1cmdlRXhwaXJlZChub3csIGJhdGNoU2l6ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignUHVyZ2UgYmF0Y2ggZmFpbGVkJywgeyBlbnRpdHk6IGVudGl0eS5uYW1lLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWwgKz0gcHVyZ2VkO1xuICAgICAgICBpZiAocHVyZ2VkIDwgYmF0Y2hTaXplKSBicmVhazsgLy8gZHJhaW5lZFxuICAgICAgICBpZiAoaSA9PT0gbWF4QmF0Y2hlcyAtIDEpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignUHVyZ2UgaGl0IHBlci10aWNrIGNhcDsgcmVtYWluaW5nIHRvbWJzdG9uZXMgZGVmZXJyZWQgdG8gbmV4dCB0aWNrJywge1xuICAgICAgICAgICAgZW50aXR5OiBlbnRpdHkubmFtZSwgcHVyZ2VkVGhpc1RpY2s6IHRvdGFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG90YWwgPiAwKSBsb2dnZXIuaW5mbygnUHVyZ2VkIGV4cGlyZWQgc29mdC1kZWxldGVkIHJvd3MnLCB7IGVudGl0eTogZW50aXR5Lm5hbWUsIGNvdW50OiB0b3RhbCB9KTtcbiAgICAgIGNvdW50c1tlbnRpdHkubmFtZV0gPSB0b3RhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRzO1xuICB9KTtcbn1cblxuLy8gLS0gU2NoZWR1bGVyIGZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXJPcHRpb25zIGV4dGVuZHMgU29mdERlbGV0ZVB1cmdlT3B0aW9ucyB7XG4gIC8qKiBTZXJ2aWNlIGxhYmVsIGZvciBsb2dzICsgdGhlIGxlYWRlci1sb2NrIGtleSAoZS5nLiAncGlwZWxpbmUnLCAncGx1Z2luJykuICovXG4gIHNlcnZpY2U6IHN0cmluZztcbiAgLyoqIEVudGl0aWVzIHRvIHN3ZWVwIOKAlCB1c3VhbGx5IHRoZSBzZXJ2aWNlJ3Mgb3duIENydWRTZXJ2aWNlIHNpbmdsZXRvbnMuICovXG4gIGVudGl0aWVzOiBQdXJnZWFibGVFbnRpdHlbXTtcbn1cblxuLyoqXG4gKiBCdWlsZCAoYnV0IGRvIE5PVCBzdGFydCkgYSBsZWFkZXItbG9ja2VkIHNjaGVkdWxlciB0aGF0IHJ1bnMgdGhlIHNvZnQtZGVsZXRlXG4gKiBwdXJnZSBzd2VlcCBmb3IgYGVudGl0aWVzYCBvbiBhIGNhZGVuY2UuIFRoZSBjYWxsZXIgYC5zdGFydCgpYHMgaXQgYW5kIHdpcmVzXG4gKiBgc3RvcCgpYCB0byBTSUdURVJNLiBSZXR1cm5zIG51bGwgd2hlbiBwdXJnaW5nIGlzIGRpc2FibGVkLlxuICpcbiAqIEVudiBjb25maWc6XG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQgICAgICAgICAgIChkZWZhdWx0IHRydWU7IGZhbHNlIOKHkiBudWxsLCBubyBzd2VlcClcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfSU5URVJWQUxfSE9VUlMgICAgKGRlZmF1bHQgNilcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfU1RBUlRVUF9ERUxBWV9NUyAgKGRlZmF1bHQgMTIwMDAwIOKAlCAyIG1pbiBzZXR0bGUpXG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX0xPQ0tfVFRMX01TICAgICAgIChkZWZhdWx0IDkwMDAwMCDigJQgMTUgbWluOyBvdXRsYXN0cyBhXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2VlcCwgc3RheXMgdW5kZXIgdGhlIGludGVydmFsKVxuICpcbiAqIEEgY3Jvc3MtcG9kIGxlYWRlciBsb2NrICh3aGVuIFJlZGlzIGlzIGNvbmZpZ3VyZWQpIG1lYW5zIG9ubHkgb25lIHJlcGxpY2FcbiAqIHN3ZWVwcyBwZXIgd2luZG93OyB3aXRob3V0IFJlZGlzIGl0IHJ1bnMgb24gZXZlcnkgcG9kIOKAlCBzdGlsbCBzYWZlLCBzaW5jZSB0aGVcbiAqIHB1cmdlIGlzIGEgYmF0Y2hlZCBpZGVtcG90ZW50IERFTEVURSwganVzdCByZWR1bmRhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXIob3B0czogU29mdERlbGV0ZVB1cmdlU2NoZWR1bGVyT3B0aW9ucyk6IFNjaGVkdWxlciB8IG51bGwge1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknLCB7IHNlcnZpY2U6IG9wdHMuc2VydmljZSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsTXMgPSBNYXRoLm1heCgxLCBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy5lbnYuU09GVF9ERUxFVEVfUFVSR0VfSU5URVJWQUxfSE9VUlMgPz8gJzYnLCAxMCkgfHwgNikgKiA2MCAqIDYwICogMTAwMDtcbiAgY29uc3Qgc3RhcnR1cERlbGF5TXMgPSBNYXRoLm1heCgwLCBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy5lbnYuU09GVF9ERUxFVEVfUFVSR0VfU1RBUlRVUF9ERUxBWV9NUyA/PyAnMTIwMDAwJywgMTApIHx8IDApO1xuICBjb25zdCBsb2NrVHRsTXMgPSBNYXRoLm1heCgxMDAwLCBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy5lbnYuU09GVF9ERUxFVEVfUFVSR0VfTE9DS19UVExfTVMgPz8gJzkwMDAwMCcsIDEwKSB8fCA5MDAwMDApO1xuICBjb25zdCBsb2NrID0gY3JlYXRlRW52UmVkaXNMb2NrKCk7XG5cbiAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBzdGFydGluZycsIHtcbiAgICBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UsXG4gICAgZW50aXRpZXM6IG9wdHMuZW50aXRpZXMubWFwKChlKSA9PiBlLm5hbWUpLFxuICAgIGludGVydmFsSG91cnM6IGludGVydmFsTXMgLyAzXzYwMF8wMDAsXG4gICAgbG9ja2VkOiAhIWxvY2ssXG4gIH0pO1xuXG4gIGNvbnN0IHNjaGVkdWxlciA9IGNyZWF0ZVNjaGVkdWxlcih7XG4gICAgbmFtZTogYHNvZnQtZGVsZXRlLXB1cmdlOiR7b3B0cy5zZXJ2aWNlfWAsXG4gICAgaW50ZXJ2YWxNcyxcbiAgICBzdGFydHVwRGVsYXlNcyxcbiAgICBydW46IGFzeW5jICgpID0+IHsgYXdhaXQgcnVuU29mdERlbGV0ZVB1cmdlKG9wdHMuZW50aXRpZXMsIG9wdHMpOyB9LFxuICAgIC4uLihsb2NrID8geyBsb2NrOiB7IHJlZGlzOiAoKSA9PiBsb2NrLCBrZXk6IGBzb2Z0LWRlbGV0ZS1wdXJnZToke29wdHMuc2VydmljZX06bGVhZGVyYCwgdHRsTXM6IGxvY2tUdGxNcyB9IH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIWxvY2spIHJldHVybiBzY2hlZHVsZXI7XG5cbiAgLy8gT3duIHRoZSBsZWFkZXItbG9jayBSZWRpcyBjbGllbnQncyBsaWZlY3ljbGU6IGBzdG9wKClgICh3aXJlZCB0byB0aGVcbiAgLy8gc2VydmljZSdzIHJ1blNlcnZlciBvblNodXRkb3duKSBhbHNvIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBzbyBpdCBjYW4ndCBrZWVwXG4gIC8vIHRoZSBwcm9jZXNzIGZyb20gZXhpdGluZyBjbGVhbmx5LiBQZXItY3ljbGUgbG9jayBhY3F1aXJlL3JlbGVhc2UgaXMgaGFuZGxlZFxuICAvLyBieSB3aXRoTGVhZGVyTG9jazsgdGhpcyBpcyBqdXN0IGNvbm5lY3Rpb24gdGVhcmRvd24uXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6ICgpID0+IHNjaGVkdWxlci5zdGFydCgpLFxuICAgIHN0b3A6ICgpID0+IHsgc2NoZWR1bGVyLnN0b3AoKTsgdm9pZCBjbG9zZUxlYWRlckxvY2sobG9jayk7IH0sXG4gIH07XG59XG4iXX0=
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1kZWxldGUtc3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLDRCQUE0QixDQUFDO0FBQzVHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBa0JqRDs2RUFDNkU7QUFDN0UsTUFBTSxVQUFVLHdCQUF3QjtJQUN0QyxPQUFPLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxRQUEyQixFQUMzQixJQUFJLEdBQTJCLEVBQUU7SUFFakMsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUM3RSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUM7SUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUNsRCwrRUFBK0U7SUFDL0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV2QiwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLCtEQUErRDtJQUMvRCxPQUFPLG9CQUFvQixDQUFDLEVBQUUsWUFBWSxF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LElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsSUFBSSxDQUFDLE9BQU8sU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDNUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gcHVyZ2UuXG4gKlxuICogRXZlcnkge0BsaW5rIENydWRTZXJ2aWNlfSBlbnRpdHkgc29mdC1kZWxldGVzIChzZXRzIGBkZWxldGVkQXRgICsgYVxuICogYHB1cmdlX2FmdGVyYCBkZWFkbGluZSkuIFRoaXMgb3JjaGVzdHJhdG9yIHJ1bnMgb25lIHB1cmdlIHBhc3MgYWNyb3NzIGEgc2V0XG4gKiBvZiBzdWNoIGVudGl0aWVzLCBoYXJkLWRlbGV0aW5nIHRvbWJzdG9uZXMgd2hvc2UgZGVhZGxpbmUgaGFzIHBhc3NlZC4gSXQgaXNcbiAqIHRoZSBgcnVuYCBjYWxsYmFjayBhIHNlcnZpY2UgaGFuZHMgdG8gYGNyZWF0ZVNjaGVkdWxlcmAgKGxlYWRlci1sb2NrZWQpLCBzb1xuICogb25seSBvbmUgcG9kIHN3ZWVwcyBhdCBhIHRpbWUuXG4gKlxuICogUnVucyBpbiBhbiBleHBsaWNpdCAqKnN5c2FkbWluIHRlbmFudCBzY29wZSoqIChgcnVuV2l0aFRlbmFudENvbnRleHQoe1xuICogaXNTdXBlckFkbWluOiB0cnVlIH0pYCkgc28gdGhlIHVuZGVybHlpbmcgYHB1cmdlRXhwaXJlZGAgc3BhbnMgZXZlcnkgb3JnIGFuZFxuICogYnlwYXNzZXMgUkxTIG9uIEZPUkNFJ2QgdGFibGVzIChwbHVnaW5zL3BpcGVsaW5lcy9ldGMuKS4gQSBiYXJlIG5vLXRlbmFudFxuICogY29udGV4dCB3b3VsZCBzZWUgemVybyByb3dzIG9uIHRob3NlIHRhYmxlcyDigJQgYW5kIGluIHByb2R1Y3Rpb24gKGBzdHJpY3RgXG4gKiBtb2RlKSBgd2l0aFRlbmFudFR4YCB0aHJvd3Mgb3V0cmlnaHQg4oCUIHNvIHRoZSBzY29wZSBpcyBlc3RhYmxpc2hlZCBoZXJlIHJhdGhlclxuICogdGhhbiBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoaXMgaXMgYSBjcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIGpvYiwgbm90IGFcbiAqIHBlci1vcmcgb3BlcmF0aW9uLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlU2NoZWR1bGVyLCBlbnZCb29sLCBlbnZJbnQsIHR5cGUgU2NoZWR1bGVyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzb2Z0LWRlbGV0ZS1zd2VlcCcpO1xuXG4vKiogVGhlIHNsaWNlIG9mIGEgQ3J1ZFNlcnZpY2UgdGhlIHN3ZWVwIG5lZWRzLCBwbHVzIGEgbGFiZWwgZm9yIGxvZ3MvbWV0cmljcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVyZ2VhYmxlRW50aXR5IHtcbiAgLyoqIFRhYmxlL2VudGl0eSBsYWJlbCAoZS5nLiAncGlwZWxpbmUnKSBmb3IgcGVyLXRhYmxlIGxvZ2dpbmcuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEhhcmQtZGVsZXRlIHVwIHRvIGBsaW1pdGAgZXhwaXJlZCB0b21ic3RvbmVzOyByZXR1cm5zIHJvd3MgcHVyZ2VkLiAqL1xuICBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zIHtcbiAgLyoqIFJvd3MgcGVyIGJhdGNoIHBlciB0YWJsZSAoZGVmYXVsdCA1MDApLiAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKiBNYXggYmF0Y2hlcyBwZXIgdGFibGUgcGVyIHRpY2sgKGRlZmF1bHQgMjAg4oaSIOKJpCAxMGsvdGFibGUvdGljayk7IHRoZSByZXN0XG4gICAqICBpcyBkZWZlcnJlZCB0byB0aGUgbmV4dCB0aWNrIHNvIGEgaHVnZSBiYWNrbG9nIGNhbid0IGJsb3cgdGhlIGxvY2sgVFRMLiAqL1xuICBtYXhCYXRjaGVzUGVyRW50aXR5PzogbnVtYmVyO1xufVxuXG4vKiogS2lsbC1zd2l0Y2g6IGBTT0ZUX0RFTEVURV9QVVJHRV9FTkFCTEVEPWZhbHNlYCBkaXNhYmxlcyBhbGwgaGFyZC1wdXJnaW5nXG4gKiAgKHRvbWJzdG9uZXMgc3RpbGwgYWNjdW11bGF0ZSArIHN0YXkgcmVzdG9yYWJsZTsgbm90aGluZyBpcyBkZXN0cm95ZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudkJvb2woJ1NPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQnLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSdW4gb25lIHB1cmdlIHN3ZWVwIGFjcm9zcyBgZW50aXRpZXNgLiBMb29wcyBlYWNoIGVudGl0eSdzIGBwdXJnZUV4cGlyZWRgIGluXG4gKiBiYXRjaGVzIHVudGlsIGEgYmF0Y2ggcmV0dXJucyBgPCBiYXRjaFNpemVgIChkcmFpbmVkKSBvciB0aGUgcGVyLXRpY2sgY2FwIGlzXG4gKiBoaXQgKGxvZ2dlZDsgY29udGludWVkIG5leHQgdGljaykuIE5ldmVyIHRocm93cyDigJQgYSBmYWlsaW5nIGVudGl0eSBpcyBsb2dnZWRcbiAqIGFuZCB0aGUgc3dlZXAgbW92ZXMgb24uIFJldHVybnMgcGVyLWVudGl0eSBwdXJnZWQgY291bnRzIChhbHNvIGxvZ2dlZCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Tb2Z0RGVsZXRlUHVyZ2UoXG4gIGVudGl0aWVzOiBQdXJnZWFibGVFbnRpdHlbXSxcbiAgb3B0czogU29mdERlbGV0ZVB1cmdlT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdTb2Z0LWRlbGV0ZSBwdXJnZSBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknKTtcbiAgICByZXR1cm4gY291bnRzO1xuICB9XG5cbiAgY29uc3QgYmF0Y2hTaXplID0gb3B0cy5iYXRjaFNpemUgPz8gNTAwO1xuICBjb25zdCBtYXhCYXRjaGVzID0gb3B0cy5tYXhCYXRjaGVzUGVyRW50aXR5ID8/IDIwO1xuICAvLyBPbmUgYG5vd2AgZm9yIHRoZSB3aG9sZSB0aWNrIOKAlCByb3dzIHRoYXQgZXhwaXJlIG1pZC1zd2VlcCB3YWl0IGZvciB0aGUgbmV4dC5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAvLyBFc3RhYmxpc2ggYSBzeXNhZG1pbiBzY29wZSBzbyBldmVyeSBgcHVyZ2VFeHBpcmVkYCAod2hpY2ggcm91dGVzIHRocm91Z2hcbiAgLy8gYHdpdGhUZW5hbnRUeGApIGJ5cGFzc2VzIFJMUyBhbmQgc3BhbnMgYWxsIG9yZ3MuIFdpdGhvdXQgdGhpcywgRk9SQ0UnZFxuICAvLyB0YWJsZXMgcmV0dXJuIHplcm8gcm93cyBhbmQgcHJvZHVjdGlvbiBgc3RyaWN0YCBtb2RlIHRocm93cy5cbiAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4QmF0Y2hlczsgaSsrKSB7XG4gICAgICAgIGxldCBwdXJnZWQ6IG51bWJlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwdXJnZWQgPSBhd2FpdCBlbnRpdHkucHVyZ2VFeHBpcmVkKG5vdywgYmF0Y2hTaXplKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdQdXJnZSBiYXRjaCBmYWlsZWQnLCB7IGVudGl0eTogZW50aXR5Lm5hbWUsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0b3RhbCArPSBwdXJnZWQ7XG4gICAgICAgIGlmIChwdXJnZWQgPCBiYXRjaFNpemUpIGJyZWFrOyAvLyBkcmFpbmVkXG4gICAgICAgIGlmIChpID09PSBtYXhCYXRjaGVzIC0gMSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdQdXJnZSBoaXQgcGVyLXRpY2sgY2FwOyByZW1haW5pbmcgdG9tYnN0b25lcyBkZWZlcnJlZCB0byBuZXh0IHRpY2snLCB7XG4gICAgICAgICAgICBlbnRpdHk6IGVudGl0eS5uYW1lLCBwdXJnZWRUaGlzVGljazogdG90YWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b3RhbCA+IDApIGxvZ2dlci5pbmZvKCdQdXJnZWQgZXhwaXJlZCBzb2Z0LWRlbGV0ZWQgcm93cycsIHsgZW50aXR5OiBlbnRpdHkubmFtZSwgY291bnQ6IHRvdGFsIH0pO1xuICAgICAgY291bnRzW2VudGl0eS5uYW1lXSA9IHRvdGFsO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudHM7XG4gIH0pO1xufVxuXG4vLyAtLSBTY2hlZHVsZXIgZmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVQdXJnZVNjaGVkdWxlck9wdGlvbnMgZXh0ZW5kcyBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zIHtcbiAgLyoqIFNlcnZpY2UgbGFiZWwgZm9yIGxvZ3MgKyB0aGUgbGVhZGVyLWxvY2sga2V5IChlLmcuICdwaXBlbGluZScsICdwbHVnaW4nKS4gKi9cbiAgc2VydmljZTogc3RyaW5nO1xuICAvKiogRW50aXRpZXMgdG8gc3dlZXAg4oCUIHVzdWFsbHkgdGhlIHNlcnZpY2UncyBvd24gQ3J1ZFNlcnZpY2Ugc2luZ2xldG9ucy4gKi9cbiAgZW50aXRpZXM6IFB1cmdlYWJsZUVudGl0eVtdO1xufVxuXG4vKipcbiAqIEJ1aWxkIChidXQgZG8gTk9UIHN0YXJ0KSBhIGxlYWRlci1sb2NrZWQgc2NoZWR1bGVyIHRoYXQgcnVucyB0aGUgc29mdC1kZWxldGVcbiAqIHB1cmdlIHN3ZWVwIGZvciBgZW50aXRpZXNgIG9uIGEgY2FkZW5jZS4gVGhlIGNhbGxlciBgLnN0YXJ0KClgcyBpdCBhbmQgd2lyZXNcbiAqIGBzdG9wKClgIHRvIFNJR1RFUk0uIFJldHVybnMgbnVsbCB3aGVuIHB1cmdpbmcgaXMgZGlzYWJsZWQuXG4gKlxuICogRW52IGNvbmZpZzpcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRCAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZTsgZmFsc2Ug4oeSIG51bGwsIG5vIHN3ZWVwKVxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9JTlRFUlZBTF9IT1VSUyAgICAoZGVmYXVsdCA2KVxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9TVEFSVFVQX0RFTEFZX01TICAoZGVmYXVsdCAxMjAwMDAg4oCUIDIgbWluIHNldHRsZSlcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfTE9DS19UVExfTVMgICAgICAgKGRlZmF1bHQgOTAwMDAwIOKAlCAxNSBtaW47IG91dGxhc3RzIGFcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZWVwLCBzdGF5cyB1bmRlciB0aGUgaW50ZXJ2YWwpXG4gKlxuICogQSBjcm9zcy1wb2QgbGVhZGVyIGxvY2sgKHdoZW4gUmVkaXMgaXMgY29uZmlndXJlZCkgbWVhbnMgb25seSBvbmUgcmVwbGljYVxuICogc3dlZXBzIHBlciB3aW5kb3c7IHdpdGhvdXQgUmVkaXMgaXQgcnVucyBvbiBldmVyeSBwb2Qg4oCUIHN0aWxsIHNhZmUsIHNpbmNlIHRoZVxuICogcHVyZ2UgaXMgYSBiYXRjaGVkIGlkZW1wb3RlbnQgREVMRVRFLCBqdXN0IHJlZHVuZGFudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNvZnREZWxldGVQdXJnZVNjaGVkdWxlcihvcHRzOiBTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXJPcHRpb25zKTogU2NoZWR1bGVyIHwgbnVsbCB7XG4gIGlmICghaXNTb2Z0RGVsZXRlUHVyZ2VFbmFibGVkKCkpIHtcbiAgICBsb2dnZXIuaW5mbygnU29mdC1kZWxldGUgcHVyZ2Ugc2NoZWR1bGVyIGRpc2FibGVkIChTT0ZUX0RFTEVURV9QVVJHRV9FTkFCTEVEPWZhbHNlKScsIHsgc2VydmljZTogb3B0cy5zZXJ2aWNlIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxNcyA9IGVudkludCgnU09GVF9ERUxFVEVfUFVSR0VfSU5URVJWQUxfSE9VUlMnLCA2LCB7IG1pbjogMSB9KSAqIDYwICogNjAgKiAxMDAwO1xuICBjb25zdCBzdGFydHVwRGVsYXlNcyA9IGVudkludCgnU09GVF9ERUxFVEVfUFVSR0VfU1RBUlRVUF9ERUxBWV9NUycsIDEyMF8wMDAsIHsgbWluOiAwIH0pO1xuICBjb25zdCBsb2NrVHRsTXMgPSBlbnZJbnQoJ1NPRlRfREVMRVRFX1BVUkdFX0xPQ0tfVFRMX01TJywgOTAwXzAwMCwgeyBtaW46IDEwMDAgfSk7XG5cbiAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBzdGFydGluZycsIHtcbiAgICBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UsXG4gICAgZW50aXRpZXM6IG9wdHMuZW50aXRpZXMubWFwKChlKSA9PiBlLm5hbWUpLFxuICAgIGludGVydmFsSG91cnM6IGludGVydmFsTXMgLyAzXzYwMF8wMDAsXG4gIH0pO1xuXG4gIHJldHVybiBjcmVhdGVTY2hlZHVsZXIoe1xuICAgIG5hbWU6IGBzb2Z0LWRlbGV0ZS1wdXJnZToke29wdHMuc2VydmljZX1gLFxuICAgIGludGVydmFsTXMsXG4gICAgc3RhcnR1cERlbGF5TXMsXG4gICAgcnVuOiBhc3luYyAoKSA9PiB7IGF3YWl0IHJ1blNvZnREZWxldGVQdXJnZShvcHRzLmVudGl0aWVzLCBvcHRzKTsgfSxcbiAgICBsb2NrOiB7IGtleTogYHNvZnQtZGVsZXRlLXB1cmdlOiR7b3B0cy5zZXJ2aWNlfTpsZWFkZXJgLCB0dGxNczogbG9ja1R0bE1zIH0sXG4gIH0pO1xufVxuIl19
@@ -96,11 +96,26 @@ export interface PluginFilter extends CommonFilter {
96
96
  */
97
97
  readonly name?: string;
98
98
  /**
99
- * Plugin version to filter by
100
- * Supports semantic versioning
101
- * @example "1.0.0", "^2.0.0", "~1.2.3"
99
+ * How `name` matches: `contains` (default — case-insensitive substring, for
100
+ * list/search) or `exact` (resolution — the lookup path). Internal: not in
101
+ * the public filter schema.
102
+ */
103
+ readonly nameMatch?: 'exact' | 'contains';
104
+ /**
105
+ * Publisher handle of an installed listing to resolve through.
106
+ * Lookup only: a `plugins` row query ignores it (the resolver routes a
107
+ * qualified reference to the listing, never to an org's own rows).
108
+ */
109
+ readonly publisher?: string;
110
+ /**
111
+ * Plugin version spec: exact (`1.2.3`), caret (`^1.2.3`), tilde (`~1.2.3`),
112
+ * partial (`1`, `1.2`, `1.x`) or `latest` — see semver-range.ts. A range never
113
+ * matches a yanked version.
114
+ * @example "1.0.0", "^2.0.0", "~1.2.3", "latest"
102
115
  */
103
116
  readonly version?: string;
117
+ /** Exclude yanked versions (resolution without a version spec). Internal. */
118
+ readonly excludeYanked?: boolean;
104
119
  /**
105
120
  * Keyword to search within the keywords JSONB array (case-insensitive contains)
106
121
  */
@@ -1,4 +1,4 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export {};
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3F1ZXJ5LWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFZpc2liaWxpdHkgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgaW50ZXJmYWNlIGNvbnRhaW5pbmcgY29tbW9uIGZpbHRlciBwcm9wZXJ0aWVzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudGl0eSB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyOiBDb21tb25GaWx0ZXIgPSB7XG4gKiAgIGlkOiAnMTIzJyxcbiAqICAgb3JnSWQ6ICdteS1vcmcnLFxuICogICB2aXNpYmlsaXR5OiAncHVibGljJyxcbiAqICAgaXNEZWZhdWx0OiB0cnVlLFxuICogICBpc0FjdGl2ZTogdHJ1ZVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVudGl0eVxuICAgKiBDYW4gYmUgYSBzaW5nbGUgSUQgb3IgYXJyYXkgb2YgSURzIGZvciBiYXRjaCBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLy8gLS0tIFZpZXdlciBjb250ZXh0IChzZXJ2ZXItc2V0LCBORVZFUiBjbGllbnQtc3VwcGxpZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBPbmx5IGVudGl0aWVzIHdob3NlIHZpc2liaWxpdHkgcHJlZGljYXRlIGhhcyBhIFBFUi1VU0VSIHJ1bmcgcmVhZCB0aGVzZSDigJRcbiAgLy8gcGlwZWxpbmUgdGVtcGxhdGVzIChgcHJpdmF0ZWAgaXMgYXV0aG9yLW9ubHkpIGFuZCBtZXNzYWdlcyAoYSBwZXItdXNlclxuICAvLyB0YXJnZXRlZCByb3cgaXMgdmlzaWJsZSBvbmx5IHRvIGl0cyB0YXJnZXQpLiBUaGVpciBzZXJ2aWNlcyBzdGFtcCB0aGVtIGZyb21cbiAgLy8gdGhlIHJlcXVlc3QncyBgVGVuYW50Q29udGV4dGAgdmlhIGB3aXRoVmlld2VyQ29udGV4dGAsIHNvIG5vIHJvdXRlIG9yIHF1ZXJ5XG4gIC8vIHN0cmluZyBjYW4gaW5qZWN0IHRoZW0uIEV2ZXJ5dGhpbmcgZWxzZSBpZ25vcmVzIHRoZW0uXG4gIC8vXG4gIC8vIEJvdGggZmFpbCBDTE9TRUQgd2hlbiBhYnNlbnQ6IG5vIHZpZXdlciBtZWFucyB0aGUgcGVyLXVzZXIgcnVuZyBtYXRjaGVzXG4gIC8vIE5PVEhJTkcsIG5ldmVyIGV2ZXJ5dGhpbmcuXG5cbiAgLyoqIENhbGxlcidzIHVzZXIgaWQsIG1hdGNoZWQgYWdhaW5zdCB0aGUgZW50aXR5J3MgcGVyLXVzZXIgY29sdW1uLiAqL1xuICByZWFkb25seSB2aWV3ZXJVc2VySWQ/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxsZXIgaXMgYSBwbGF0Zm9ybSBzdXBlci1hZG1pbiAoc2VlcyBldmVyeSBydW5nKS4gKi9cbiAgcmVhZG9ubHkgdmlld2VySXNTdXBlckFkbWluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IG9yZ2FuaXphdGlvblxuICAgKiBDYW4gYmUgYSBzaW5nbGUgb3JnIElEIG9yIGFycmF5IGZvciBtdWx0aS1vcmcgZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYXJyb3cgdG8gb25lIHJ1bmcgb2YgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIHNoYXJpbmcgbGFkZGVyLiBBcHBsaWVkIFdJVEhJTlxuICAgKiB3aGF0IHRoZSBjYWxsZXIgY2FuIGFscmVhZHkgc2VlIOKAlCBuZXZlciB3aWRlbnMgaXQuXG4gICAqIEBzZWUgVmlzaWJpbGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaWJpbGl0eT86IFZpc2liaWxpdHkgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBkZWZhdWx0IHN0YXR1c1xuICAgKiAtIHRydWU6IE9ubHkgZGVmYXVsdCBlbnRpdGllc1xuICAgKiAtIGZhbHNlOiBPbmx5IG5vbi1kZWZhdWx0IGVudGl0aWVzXG4gICAqIC0gdW5kZWZpbmVkOiBBbGwgZW50aXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhY3RpdmUvaW5hY3RpdmUgc3RhdHVzXG4gICAqIC0gdHJ1ZTogT25seSBhY3RpdmUgZW50aXRpZXNcbiAgICogLSBmYWxzZTogT25seSBpbmFjdGl2ZSBlbnRpdGllc1xuICAgKiAtIHVuZGVmaW5lZDogQWxsIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpc0FjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDEwMDBcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIChmb3IgcGFnaW5hdGlvbilcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIGFuZCBkaXJlY3Rpb25cbiAgICogQGV4YW1wbGUgXCJuYW1lOmFzY1wiLCBcImNyZWF0ZWRBdDpkZXNjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBjYXRhbG9nIG93bmVyIChkZXZlbG9wZXItcG9ydGFsIFwibXkgc2VydmljZXNcIiB2aWV3KS5cbiAgICogTWF0Y2hlcyB0aGUgZW50aXR5J3MgYG93bmVySWRgIGV4YWN0bHkgKGEgdXNlciBpZCBvciB0ZWFtIGlkKS5cbiAgICogT25seSBhcHBsaWVkIGJ5IGJ1aWxkZXJzIGZvciBlbnRpdGllcyB0aGF0IGNhcnJ5IGFuIG93bmVyIGNvbHVtblxuICAgKiAocGlwZWxpbmVzLCBwbHVnaW5zKTsgaWdub3JlZCBlbHNld2hlcmUuXG4gICAqL1xuICByZWFkb25seSBvd25lcklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbGlmZWN5Y2xlIHN0YWdlIChleHBlcmltZW50YWwgfCBwcm9kdWN0aW9uIHwgZGVwcmVjYXRlZCkuXG4gICAqIE9ubHkgYXBwbGllZCBieSBidWlsZGVycyBmb3IgZW50aXRpZXMgdGhhdCBjYXJyeSBhIGxpZmVjeWNsZSBjb2x1bW4uXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBsdWdpbi1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBsdWdpbkZpbHRlciA9IHtcbiAqICAgbmFtZTogJ25vZGVqcy1idWlsZCcsXG4gKiAgIHZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIHZlcnNpb24gdG8gZmlsdGVyIGJ5XG4gICAqIFN1cHBvcnRzIHNlbWFudGljIHZlcnNpb25pbmdcbiAgICogQGV4YW1wbGUgXCIxLjAuMFwiLCBcIl4yLjAuMFwiLCBcIn4xLjIuM1wiXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXl3b3JkIHRvIHNlYXJjaCB3aXRoaW4gdGhlIGtleXdvcmRzIEpTT05CIGFycmF5IChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKVxuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIGNhdGVnb3J5IHRvIGZpbHRlciBieVxuICAgKiBAZXhhbXBsZSBcImxhbmd1YWdlXCIsIFwic2VjdXJpdHlcIiwgXCJ0ZXN0aW5nXCJcbiAgICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZpbHRlciBpbnRlcmZhY2UgZm9yIHBpcGVsaW5lLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBpcGVsaW5lLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpbHRlcjogUGlwZWxpbmVGaWx0ZXIgPSB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBwaXBlbGluZU5hbWU6ICdteS1waXBlbGluZScsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICAvKipcbiAgICogUHJvamVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgbmFtZSB0byBmaWx0ZXIgYnlcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5d29yZCB0byBzZWFyY2ggd2l0aGluIHRoZSBrZXl3b3JkcyBKU09OQiBhcnJheSAoY2FzZS1pbnNlbnNpdGl2ZSBjb250YWlucylcbiAgICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG59XG5cbi8qKiBGaWx0ZXIgaW50ZXJmYWNlIGZvciBwaXBlbGluZS10ZW1wbGF0ZSBxdWVyaWVzIChnb2xkZW4tcGF0aCBjYXRhbG9nKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVUZW1wbGF0ZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKiBUZW1wbGF0ZSBuYW1lIChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKS4gKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqIENhdGVnb3J5IHRvIGZpbHRlciBieSAoZS5nLiAnbGFuZ3VhZ2UnLCAnZ2VuZXJhbCcpLiAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIEtleXdvcmQgc2VhcmNoIHdpdGhpbiB0aGUga2V5d29yZHMgSlNPTkIgYXJyYXkuICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG4gIC8vIFNoYXJpbmcgcnVuZyArIHZpZXdlciBjb250ZXh0IGFyZSBpbmhlcml0ZWQgZnJvbSBDb21tb25GaWx0ZXIuXG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgbWVzc2FnZS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogRXh0ZW5kcyBDb21tb25GaWx0ZXIgdG8gaW5jbHVkZSBtZXNzYWdlLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBUaHJlYWQgSUQgdG8gZmlsdGVyIGJ5IChmb3IgZmV0Y2hpbmcgdGhyZWFkIHJlcGxpZXMpLlxuICAgKiBQYXNzIGBudWxsYCB0byBmaWx0ZXIgZm9yIHJvb3QgbWVzc2FnZXMgb25seSAodGhyZWFkSWQgSVMgTlVMTCkuXG4gICAqL1xuICByZWFkb25seSB0aHJlYWRJZD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFJlY2lwaWVudCBvcmdhbml6YXRpb24gSUQgdG8gZmlsdGVyIGJ5XG4gICAqIFVzZSAnKicgZm9yIGJyb2FkY2FzdCBhbm5vdW5jZW1lbnRzXG4gICAqL1xuICByZWFkb25seSByZWNpcGllbnRPcmdJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVjaXBpZW50IHVzZXIgSUQgdG8gZmlsdGVyIGJ5IChwZXItdXNlciB0YXJnZXRpbmcgd2l0aGluIHRoZSByZWNpcGllbnRcbiAgICogb3JnKS4gUGFzcyBgbnVsbGAgdG8gbWF0Y2ggb3JnLXdpZGUgbWVzc2FnZXMgb25seSAocmVjaXBpZW50X3VzZXJfaWQgSVNcbiAgICogTlVMTCkuIFJhcmVseSBzZXQgZGlyZWN0bHkgYnkgY2FsbGVycyDigJQgc2VlIGB2aWV3ZXJVc2VySWRgIGZvciB0aGVcbiAgICogdmlzaWJpbGl0eS1zY29waW5nIHZhcmlhbnQuXG4gICAqL1xuICByZWFkb25seSByZWNpcGllbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8vIE5PVEU6IHRoZSBWSUVXRVIncyB1c2VyIGlkIChgdmlld2VyVXNlcklkYCkgaXMgaW5oZXJpdGVkIGZyb20gQ29tbW9uRmlsdGVyLlxuICAvLyBGb3IgbWVzc2FnZXMgaXQgaXMgTk9UIGEgY29sdW1uIGZpbHRlcjogd2hlbiBwcmVzZW50LCB0aGUgcmVjaXBpZW50LXNpZGVcbiAgLy8gYnJhbmNoIGluIGBidWlsZE1lc3NhZ2VDb25kaXRpb25zYCB3aWRlbnMgdG8gaW5jbHVkZSByb3dzIHRhcmdldGVkIGF0IHRoaXNcbiAgLy8gdXNlciAocmVjaXBpZW50X3VzZXJfaWQgPSB2aWV3ZXJVc2VySWQpIEFMT05HU0lERSBvcmctd2lkZSBvbmVzXG4gIC8vIChyZWNpcGllbnRfdXNlcl9pZCBJUyBOVUxMKS4gV2hlbiBhYnNlbnQsIG9ubHkgb3JnLXdpZGUgcmVjaXBpZW50IHJvd3MgYXJlXG4gIC8vIHZpc2libGUsIHNvIGEgdXNlci10YXJnZXRlZCBtZXNzYWdlIHN0YXlzIHByaXZhdGUgdG8gaXRzIHRhcmdldCwgdGhlIHNlbmRlcixcbiAgLy8gYW5kIHRoZSBzeXN0ZW0gb3JnLiBNZXNzYWdlU2VydmljZSBzdGFtcHMgaXQgZnJvbSB0aGUgdGVuYW50IGNvbnRleHQuXG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgdHlwZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2VUeXBlPzogJ2Fubm91bmNlbWVudCcgfCAnY29udmVyc2F0aW9uJztcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IHByaW9yaXR5IGxldmVsXG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86ICdub3JtYWwnIHwgJ2hpZ2gnIHwgJ3VyZ2VudCc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwvaW5ib3gtYnVja2V0IGZpbHRlciAoZS5nLiAnc3VwcG9ydCcsICdoZWxwJykuIE1hdGNoZXMgcm93c1xuICAgKiBleGFjdGx5OyBwYXNzIG51bGwgdG8gbWF0Y2ggY2hhbm5lbCBJUyBOVUxMIChvcmctdG8tb3JnIG1lc3NhZ2VzKS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWw/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgcmVhZCBzdGF0ZSBmb3IgdGhlIHJlcXVlc3Rpbmcgb3JnLlxuICAgKiBJbXBsZW1lbnRlZCBhcyBhIEpTT05CIGtleS1leGlzdGVuY2UgY2hlY2sgYWdhaW5zdCBgbWVzc2FnZXMucmVhZF9ieWBcbiAgICogKGEgYHsgW29yZ0lkXTogaXNvVGltZXN0YW1wIH1gIG1hcCksIHVzaW5nIHRoZSBvcmdJZCBwYXNzZWQgdG9cbiAgICogYGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnNgLlxuICAgKiAtIHRydWUgIOKGkiBvbmx5IG1lc3NhZ2VzIHRoZSBvcmcgaGFzIHJlYWQgKG9yZ0lkIGtleSBleGlzdHMgaW4gcmVhZF9ieSlcbiAgICogLSBmYWxzZSDihpIgb25seSBtZXNzYWdlcyB0aGUgb3JnIGhhcyBOT1QgcmVhZFxuICAgKiAtIHVuZGVmaW5lZCDihpIgbm8gcmVhZC1zdGF0ZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGlzUmVhZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZyZWUtdGV4dCBpbmJveCBzZWFyY2guIENhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG1hdGNoIGFnYWluc3QgdGhlXG4gICAqIG1lc3NhZ2UgYHN1YmplY3RgIE9SIGBjb250ZW50YCAoTElLRSB3aWxkY2FyZHMgaW4gdGhlIHRlcm0gYXJlIGVzY2FwZWQsIHNvIGFcbiAgICogbGl0ZXJhbCBgJWAvYF9gIG1hdGNoZXMgaXRzZWxmKS4gQXBwbGllZCBvbiB0b3Agb2YgdGhlIHZpc2liaWxpdHkgc2NvcGUsIHNvXG4gICAqIGl0IG5ldmVyIHdpZGVucyB3aGF0IHRoZSBjYWxsZXIgY2FuIHNlZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaD86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBGaWx0ZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHBvbGljaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBpc1RlbXBsYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgcnVsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVJ1bGVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwb2xpY3lJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuICByZWFkb25seSBmaWVsZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk/OiAnd2FybmluZycgfCAnZXJyb3InIHwgJ2NyaXRpY2FsJztcbiAgcmVhZG9ubHkgc2NvcGU/OiAnb3JnJyB8ICdwdWJsaXNoZWQnO1xuICByZWFkb25seSB0YWc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIGV4ZW1wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlciB7XG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuICByZWFkb25seSBydWxlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudGl0eVR5cGU/OiAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG4gIHJlYWRvbmx5IGVudGl0eUlkPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM/OiAncGVuZGluZycgfCAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJyB8ICdleHBpcmVkJztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgYXVkaXQgbG9nIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgYWN0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSByZXN1bHQ/OiAncGFzcycgfCAnd2FybicgfCAnYmxvY2snO1xuICByZWFkb25seSBzY2FuSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGVGcm9tPzogc3RyaW5nO1xuICByZWFkb25seSBkYXRlVG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHNjYW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VTY2FuRmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJyB8ICdhbGwnO1xuICByZWFkb25seSBzdGF0dXM/OiAncGVuZGluZycgfCAncnVubmluZycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG4gIHJlYWRvbmx5IHRyaWdnZXJlZEJ5PzogJ21hbnVhbCcgfCAnc2NoZWR1bGVkJyB8ICdydWxlLWNoYW5nZScgfCAncnVsZS1kcnktcnVuJztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cbiJdfQ==
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3F1ZXJ5LWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFZpc2liaWxpdHkgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgaW50ZXJmYWNlIGNvbnRhaW5pbmcgY29tbW9uIGZpbHRlciBwcm9wZXJ0aWVzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudGl0eSB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyOiBDb21tb25GaWx0ZXIgPSB7XG4gKiAgIGlkOiAnMTIzJyxcbiAqICAgb3JnSWQ6ICdteS1vcmcnLFxuICogICB2aXNpYmlsaXR5OiAncHVibGljJyxcbiAqICAgaXNEZWZhdWx0OiB0cnVlLFxuICogICBpc0FjdGl2ZTogdHJ1ZVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVudGl0eVxuICAgKiBDYW4gYmUgYSBzaW5nbGUgSUQgb3IgYXJyYXkgb2YgSURzIGZvciBiYXRjaCBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLy8gLS0tIFZpZXdlciBjb250ZXh0IChzZXJ2ZXItc2V0LCBORVZFUiBjbGllbnQtc3VwcGxpZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBPbmx5IGVudGl0aWVzIHdob3NlIHZpc2liaWxpdHkgcHJlZGljYXRlIGhhcyBhIFBFUi1VU0VSIHJ1bmcgcmVhZCB0aGVzZSDigJRcbiAgLy8gcGlwZWxpbmUgdGVtcGxhdGVzIChgcHJpdmF0ZWAgaXMgYXV0aG9yLW9ubHkpIGFuZCBtZXNzYWdlcyAoYSBwZXItdXNlclxuICAvLyB0YXJnZXRlZCByb3cgaXMgdmlzaWJsZSBvbmx5IHRvIGl0cyB0YXJnZXQpLiBUaGVpciBzZXJ2aWNlcyBzdGFtcCB0aGVtIGZyb21cbiAgLy8gdGhlIHJlcXVlc3QncyBgVGVuYW50Q29udGV4dGAgdmlhIGB3aXRoVmlld2VyQ29udGV4dGAsIHNvIG5vIHJvdXRlIG9yIHF1ZXJ5XG4gIC8vIHN0cmluZyBjYW4gaW5qZWN0IHRoZW0uIEV2ZXJ5dGhpbmcgZWxzZSBpZ25vcmVzIHRoZW0uXG4gIC8vXG4gIC8vIEJvdGggZmFpbCBDTE9TRUQgd2hlbiBhYnNlbnQ6IG5vIHZpZXdlciBtZWFucyB0aGUgcGVyLXVzZXIgcnVuZyBtYXRjaGVzXG4gIC8vIE5PVEhJTkcsIG5ldmVyIGV2ZXJ5dGhpbmcuXG5cbiAgLyoqIENhbGxlcidzIHVzZXIgaWQsIG1hdGNoZWQgYWdhaW5zdCB0aGUgZW50aXR5J3MgcGVyLXVzZXIgY29sdW1uLiAqL1xuICByZWFkb25seSB2aWV3ZXJVc2VySWQ/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxsZXIgaXMgYSBwbGF0Zm9ybSBzdXBlci1hZG1pbiAoc2VlcyBldmVyeSBydW5nKS4gKi9cbiAgcmVhZG9ubHkgdmlld2VySXNTdXBlckFkbWluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IG9yZ2FuaXphdGlvblxuICAgKiBDYW4gYmUgYSBzaW5nbGUgb3JnIElEIG9yIGFycmF5IGZvciBtdWx0aS1vcmcgZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYXJyb3cgdG8gb25lIHJ1bmcgb2YgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIHNoYXJpbmcgbGFkZGVyLiBBcHBsaWVkIFdJVEhJTlxuICAgKiB3aGF0IHRoZSBjYWxsZXIgY2FuIGFscmVhZHkgc2VlIOKAlCBuZXZlciB3aWRlbnMgaXQuXG4gICAqIEBzZWUgVmlzaWJpbGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaWJpbGl0eT86IFZpc2liaWxpdHkgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBkZWZhdWx0IHN0YXR1c1xuICAgKiAtIHRydWU6IE9ubHkgZGVmYXVsdCBlbnRpdGllc1xuICAgKiAtIGZhbHNlOiBPbmx5IG5vbi1kZWZhdWx0IGVudGl0aWVzXG4gICAqIC0gdW5kZWZpbmVkOiBBbGwgZW50aXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhY3RpdmUvaW5hY3RpdmUgc3RhdHVzXG4gICAqIC0gdHJ1ZTogT25seSBhY3RpdmUgZW50aXRpZXNcbiAgICogLSBmYWxzZTogT25seSBpbmFjdGl2ZSBlbnRpdGllc1xuICAgKiAtIHVuZGVmaW5lZDogQWxsIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpc0FjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDEwMDBcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIChmb3IgcGFnaW5hdGlvbilcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIGFuZCBkaXJlY3Rpb25cbiAgICogQGV4YW1wbGUgXCJuYW1lOmFzY1wiLCBcImNyZWF0ZWRBdDpkZXNjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBjYXRhbG9nIG93bmVyIChkZXZlbG9wZXItcG9ydGFsIFwibXkgc2VydmljZXNcIiB2aWV3KS5cbiAgICogTWF0Y2hlcyB0aGUgZW50aXR5J3MgYG93bmVySWRgIGV4YWN0bHkgKGEgdXNlciBpZCBvciB0ZWFtIGlkKS5cbiAgICogT25seSBhcHBsaWVkIGJ5IGJ1aWxkZXJzIGZvciBlbnRpdGllcyB0aGF0IGNhcnJ5IGFuIG93bmVyIGNvbHVtblxuICAgKiAocGlwZWxpbmVzLCBwbHVnaW5zKTsgaWdub3JlZCBlbHNld2hlcmUuXG4gICAqL1xuICByZWFkb25seSBvd25lcklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbGlmZWN5Y2xlIHN0YWdlIChleHBlcmltZW50YWwgfCBwcm9kdWN0aW9uIHwgZGVwcmVjYXRlZCkuXG4gICAqIE9ubHkgYXBwbGllZCBieSBidWlsZGVycyBmb3IgZW50aXRpZXMgdGhhdCBjYXJyeSBhIGxpZmVjeWNsZSBjb2x1bW4uXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBsdWdpbi1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBsdWdpbkZpbHRlciA9IHtcbiAqICAgbmFtZTogJ25vZGVqcy1idWlsZCcsXG4gKiAgIHZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGBuYW1lYCBtYXRjaGVzOiBgY29udGFpbnNgIChkZWZhdWx0IOKAlCBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZywgZm9yXG4gICAqIGxpc3Qvc2VhcmNoKSBvciBgZXhhY3RgIChyZXNvbHV0aW9uIOKAlCB0aGUgbG9va3VwIHBhdGgpLiBJbnRlcm5hbDogbm90IGluXG4gICAqIHRoZSBwdWJsaWMgZmlsdGVyIHNjaGVtYS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVNYXRjaD86ICdleGFjdCcgfCAnY29udGFpbnMnO1xuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXIgaGFuZGxlIG9mIGFuIGluc3RhbGxlZCBsaXN0aW5nIHRvIHJlc29sdmUgdGhyb3VnaC5cbiAgICogTG9va3VwIG9ubHk6IGEgYHBsdWdpbnNgIHJvdyBxdWVyeSBpZ25vcmVzIGl0ICh0aGUgcmVzb2x2ZXIgcm91dGVzIGFcbiAgICogcXVhbGlmaWVkIHJlZmVyZW5jZSB0byB0aGUgbGlzdGluZywgbmV2ZXIgdG8gYW4gb3JnJ3Mgb3duIHJvd3MpLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gdmVyc2lvbiBzcGVjOiBleGFjdCAoYDEuMi4zYCksIGNhcmV0IChgXjEuMi4zYCksIHRpbGRlIChgfjEuMi4zYCksXG4gICAqIHBhcnRpYWwgKGAxYCwgYDEuMmAsIGAxLnhgKSBvciBgbGF0ZXN0YCDigJQgc2VlIHNlbXZlci1yYW5nZS50cy4gQSByYW5nZSBuZXZlclxuICAgKiBtYXRjaGVzIGEgeWFua2VkIHZlcnNpb24uXG4gICAqIEBleGFtcGxlIFwiMS4wLjBcIiwgXCJeMi4wLjBcIiwgXCJ+MS4yLjNcIiwgXCJsYXRlc3RcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKiogRXhjbHVkZSB5YW5rZWQgdmVyc2lvbnMgKHJlc29sdXRpb24gd2l0aG91dCBhIHZlcnNpb24gc3BlYykuIEludGVybmFsLiAqL1xuICByZWFkb25seSBleGNsdWRlWWFua2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogS2V5d29yZCB0byBzZWFyY2ggd2l0aGluIHRoZSBrZXl3b3JkcyBKU09OQiBhcnJheSAoY2FzZS1pbnNlbnNpdGl2ZSBjb250YWlucylcbiAgICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBjYXRlZ29yeSB0byBmaWx0ZXIgYnlcbiAgICogQGV4YW1wbGUgXCJsYW5ndWFnZVwiLCBcInNlY3VyaXR5XCIsIFwidGVzdGluZ1wiXG4gICAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGaWx0ZXIgaW50ZXJmYWNlIGZvciBwaXBlbGluZS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogRXh0ZW5kcyBDb21tb25GaWx0ZXIgdG8gaW5jbHVkZSBwaXBlbGluZS1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBpcGVsaW5lRmlsdGVyID0ge1xuICogICBwcm9qZWN0OiAnbXktYXBwJyxcbiAqICAgb3JnYW5pemF0aW9uOiAnbXktb3JnJyxcbiAqICAgcGlwZWxpbmVOYW1lOiAnbXktcGlwZWxpbmUnLFxuICogICBpc0FjdGl2ZTogdHJ1ZVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFByb2plY3QgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBpcGVsaW5lXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcmdhbml6YXRpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBpcGVsaW5lXG4gICAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lIG5hbWUgdG8gZmlsdGVyIGJ5XG4gICAqL1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEtleXdvcmQgdG8gc2VhcmNoIHdpdGhpbiB0aGUga2V5d29yZHMgSlNPTkIgYXJyYXkgKGNhc2UtaW5zZW5zaXRpdmUgY29udGFpbnMpXG4gICAqL1xuICByZWFkb25seSBrZXl3b3JkPzogc3RyaW5nO1xufVxuXG4vKiogRmlsdGVyIGludGVyZmFjZSBmb3IgcGlwZWxpbmUtdGVtcGxhdGUgcXVlcmllcyAoZ29sZGVuLXBhdGggY2F0YWxvZykuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lVGVtcGxhdGVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICAvKiogVGVtcGxhdGUgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSBjb250YWlucykuICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBDYXRlZ29yeSB0byBmaWx0ZXIgYnkgKGUuZy4gJ2xhbmd1YWdlJywgJ2dlbmVyYWwnKS4gKi9cbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIC8qKiBLZXl3b3JkIHNlYXJjaCB3aXRoaW4gdGhlIGtleXdvcmRzIEpTT05CIGFycmF5LiAqL1xuICByZWFkb25seSBrZXl3b3JkPzogc3RyaW5nO1xuICAvLyBTaGFyaW5nIHJ1bmcgKyB2aWV3ZXIgY29udGV4dCBhcmUgaW5oZXJpdGVkIGZyb20gQ29tbW9uRmlsdGVyLlxufVxuXG4vKipcbiAqIEZpbHRlciBpbnRlcmZhY2UgZm9yIG1lc3NhZ2Utc3BlY2lmaWMgcHJvcGVydGllcy5cbiAqIEV4dGVuZHMgQ29tbW9uRmlsdGVyIHRvIGluY2x1ZGUgbWVzc2FnZS1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICAvKipcbiAgICogVGhyZWFkIElEIHRvIGZpbHRlciBieSAoZm9yIGZldGNoaW5nIHRocmVhZCByZXBsaWVzKS5cbiAgICogUGFzcyBgbnVsbGAgdG8gZmlsdGVyIGZvciByb290IG1lc3NhZ2VzIG9ubHkgKHRocmVhZElkIElTIE5VTEwpLlxuICAgKi9cbiAgcmVhZG9ubHkgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZWNpcGllbnQgb3JnYW5pemF0aW9uIElEIHRvIGZpbHRlciBieVxuICAgKiBVc2UgJyonIGZvciBicm9hZGNhc3QgYW5ub3VuY2VtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgcmVjaXBpZW50T3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlY2lwaWVudCB1c2VyIElEIHRvIGZpbHRlciBieSAocGVyLXVzZXIgdGFyZ2V0aW5nIHdpdGhpbiB0aGUgcmVjaXBpZW50XG4gICAqIG9yZykuIFBhc3MgYG51bGxgIHRvIG1hdGNoIG9yZy13aWRlIG1lc3NhZ2VzIG9ubHkgKHJlY2lwaWVudF91c2VyX2lkIElTXG4gICAqIE5VTEwpLiBSYXJlbHkgc2V0IGRpcmVjdGx5IGJ5IGNhbGxlcnMg4oCUIHNlZSBgdmlld2VyVXNlcklkYCBmb3IgdGhlXG4gICAqIHZpc2liaWxpdHktc2NvcGluZyB2YXJpYW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjaXBpZW50VXNlcklkPzogc3RyaW5nIHwgbnVsbDtcblxuICAvLyBOT1RFOiB0aGUgVklFV0VSJ3MgdXNlciBpZCAoYHZpZXdlclVzZXJJZGApIGlzIGluaGVyaXRlZCBmcm9tIENvbW1vbkZpbHRlci5cbiAgLy8gRm9yIG1lc3NhZ2VzIGl0IGlzIE5PVCBhIGNvbHVtbiBmaWx0ZXI6IHdoZW4gcHJlc2VudCwgdGhlIHJlY2lwaWVudC1zaWRlXG4gIC8vIGJyYW5jaCBpbiBgYnVpbGRNZXNzYWdlQ29uZGl0aW9uc2Agd2lkZW5zIHRvIGluY2x1ZGUgcm93cyB0YXJnZXRlZCBhdCB0aGlzXG4gIC8vIHVzZXIgKHJlY2lwaWVudF91c2VyX2lkID0gdmlld2VyVXNlcklkKSBBTE9OR1NJREUgb3JnLXdpZGUgb25lc1xuICAvLyAocmVjaXBpZW50X3VzZXJfaWQgSVMgTlVMTCkuIFdoZW4gYWJzZW50LCBvbmx5IG9yZy13aWRlIHJlY2lwaWVudCByb3dzIGFyZVxuICAvLyB2aXNpYmxlLCBzbyBhIHVzZXItdGFyZ2V0ZWQgbWVzc2FnZSBzdGF5cyBwcml2YXRlIHRvIGl0cyB0YXJnZXQsIHRoZSBzZW5kZXIsXG4gIC8vIGFuZCB0aGUgc3lzdGVtIG9yZy4gTWVzc2FnZVNlcnZpY2Ugc3RhbXBzIGl0IGZyb20gdGhlIHRlbmFudCBjb250ZXh0LlxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIHR5cGUgZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlVHlwZT86ICdhbm5vdW5jZW1lbnQnIHwgJ2NvbnZlcnNhdGlvbic7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBwcmlvcml0eSBsZXZlbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiAnbm9ybWFsJyB8ICdoaWdoJyB8ICd1cmdlbnQnO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsL2luYm94LWJ1Y2tldCBmaWx0ZXIgKGUuZy4gJ3N1cHBvcnQnLCAnaGVscCcpLiBNYXRjaGVzIHJvd3NcbiAgICogZXhhY3RseTsgcGFzcyBudWxsIHRvIG1hdGNoIGNoYW5uZWwgSVMgTlVMTCAob3JnLXRvLW9yZyBtZXNzYWdlcykuXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IHJlYWQgc3RhdGUgZm9yIHRoZSByZXF1ZXN0aW5nIG9yZy5cbiAgICogSW1wbGVtZW50ZWQgYXMgYSBKU09OQiBrZXktZXhpc3RlbmNlIGNoZWNrIGFnYWluc3QgYG1lc3NhZ2VzLnJlYWRfYnlgXG4gICAqIChhIGB7IFtvcmdJZF06IGlzb1RpbWVzdGFtcCB9YCBtYXApLCB1c2luZyB0aGUgb3JnSWQgcGFzc2VkIHRvXG4gICAqIGBidWlsZE1lc3NhZ2VDb25kaXRpb25zYC5cbiAgICogLSB0cnVlICDihpIgb25seSBtZXNzYWdlcyB0aGUgb3JnIGhhcyByZWFkIChvcmdJZCBrZXkgZXhpc3RzIGluIHJlYWRfYnkpXG4gICAqIC0gZmFsc2Ug4oaSIG9ubHkgbWVzc2FnZXMgdGhlIG9yZyBoYXMgTk9UIHJlYWRcbiAgICogLSB1bmRlZmluZWQg4oaSIG5vIHJlYWQtc3RhdGUgZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBpc1JlYWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGcmVlLXRleHQgaW5ib3ggc2VhcmNoLiBDYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBtYXRjaCBhZ2FpbnN0IHRoZVxuICAgKiBtZXNzYWdlIGBzdWJqZWN0YCBPUiBgY29udGVudGAgKExJS0Ugd2lsZGNhcmRzIGluIHRoZSB0ZXJtIGFyZSBlc2NhcGVkLCBzbyBhXG4gICAqIGxpdGVyYWwgYCVgL2BfYCBtYXRjaGVzIGl0c2VsZikuIEFwcGxpZWQgb24gdG9wIG9mIHRoZSB2aXNpYmlsaXR5IHNjb3BlLCBzb1xuICAgKiBpdCBuZXZlciB3aWRlbnMgd2hhdCB0aGUgY2FsbGVyIGNhbiBzZWUuXG4gICAqL1xuICByZWFkb25seSBzZWFyY2g/OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbXBsaWFuY2UgRmlsdGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBwb2xpY2llcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlUG9saWN5RmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaXNUZW1wbGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHJ1bGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VSdWxlRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcG9saWN5SWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgZmllbGQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNldmVyaXR5PzogJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG4gIHJlYWRvbmx5IHNjb3BlPzogJ29yZycgfCAncHVibGlzaGVkJztcbiAgcmVhZG9ubHkgdGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBleGVtcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VFeGVtcHRpb25GaWx0ZXIge1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgcnVsZUlkPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRpdHlUeXBlPzogJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuICByZWFkb25seSBlbnRpdHlJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdHVzPzogJ3BlbmRpbmcnIHwgJ2FwcHJvdmVkJyB8ICdyZWplY3RlZCcgfCAnZXhwaXJlZCc7XG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIGF1ZGl0IGxvZyBlbnRyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VBdWRpdEZpbHRlciB7XG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuICByZWFkb25seSB0YXJnZXQ/OiAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG4gIHJlYWRvbmx5IGFjdGlvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzdWx0PzogJ3Bhc3MnIHwgJ3dhcm4nIHwgJ2Jsb2NrJztcbiAgcmVhZG9ubHkgc2NhbklkPzogc3RyaW5nO1xuICByZWFkb25seSBkYXRlRnJvbT86IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0ZVRvPzogc3RyaW5nO1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBzY2Fucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlU2NhbkZpbHRlciB7XG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuICByZWFkb25seSB0YXJnZXQ/OiAncGx1Z2luJyB8ICdwaXBlbGluZScgfCAnYWxsJztcbiAgcmVhZG9ubHkgc3RhdHVzPzogJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuICByZWFkb25seSB0cmlnZ2VyZWRCeT86ICdtYW51YWwnIHwgJ3NjaGVkdWxlZCcgfCAncnVsZS1jaGFuZ2UnIHwgJ3J1bGUtZHJ5LXJ1bic7XG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBvZmZzZXQ/OiBudW1iZXI7XG59XG4iXX0=