@pipeline-builder/pipeline-data 4.3.3 → 4.3.5
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/api/crud-service.d.ts +7 -0
- package/lib/api/crud-service.js +14 -3
- package/lib/api/pipeline-step-resolution.d.ts +111 -0
- package/lib/api/pipeline-step-resolution.js +163 -0
- package/lib/api/plugin-consumption-policy.d.ts +8 -2
- package/lib/api/plugin-consumption-policy.js +20 -3
- package/lib/api/plugin-resolution.d.ts +26 -9
- package/lib/api/plugin-resolution.js +51 -33
- package/lib/api/reporting/analytics-queries.d.ts +6 -4
- package/lib/api/reporting/analytics-queries.js +11 -11
- package/lib/api/reporting/deploy-rollup.d.ts +2 -0
- package/lib/api/reporting/deploy-rollup.js +5 -1
- package/lib/api/reporting/failure-classifier.d.ts +2 -6
- package/lib/api/reporting/failure-classifier.js +22 -1
- package/lib/api/reporting/ingest.js +73 -16
- package/lib/api/reporting/plugin-exposure.d.ts +261 -15
- package/lib/api/reporting/plugin-exposure.js +423 -38
- package/lib/api/reporting/stakeholder/compose.d.ts +1 -1
- package/lib/api/reporting/stakeholder/compose.js +30 -1
- package/lib/api/reporting/stakeholder/store.d.ts +16 -2
- package/lib/api/reporting/stakeholder/store.js +17 -6
- package/lib/api/reporting/types.d.ts +80 -1
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +11 -4
- package/lib/api/reporting-service.js +106 -43
- package/lib/api/soft-delete-sweep.d.ts +8 -18
- package/lib/api/soft-delete-sweep.js +35 -5
- package/lib/api/version-references.d.ts +80 -0
- package/lib/api/version-references.js +135 -0
- package/lib/core/query-filters.d.ts +3 -3
- package/lib/core/query-filters.js +1 -1
- package/lib/database/drizzle-schema.d.ts +1238 -143
- package/lib/database/drizzle-schema.js +6 -3
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +2 -2
- package/lib/database/schema/ecosystem.d.ts +53 -0
- package/lib/database/schema/ecosystem.js +14 -3
- package/lib/database/schema/pipeline.d.ts +38 -0
- package/lib/database/schema/pipeline.js +20 -2
- package/lib/database/schema/plugin.d.ts +265 -0
- package/lib/database/schema/plugin.js +34 -3
- package/lib/database/schema/reporting-analytics.d.ts +786 -4
- package/lib/database/schema/reporting-analytics.js +111 -5
- package/lib/index.d.ts +5 -3
- package/lib/index.js +5 -3
- package/lib/testing/exports.json +24 -0
- package/package.json +4 -3
|
@@ -1,27 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
* Shared soft-delete retention purge.
|
|
3
|
-
*
|
|
4
|
-
* Every {@link CrudService} entity soft-deletes (sets `deletedAt` + a
|
|
5
|
-
* `purge_after` deadline). This orchestrator runs one purge pass across a set
|
|
6
|
-
* of such entities, hard-deleting tombstones whose deadline has passed. It is
|
|
7
|
-
* the `run` callback a service hands to `createScheduler` (leader-locked), so
|
|
8
|
-
* only one pod sweeps at a time.
|
|
9
|
-
*
|
|
10
|
-
* Runs in an explicit **sysadmin tenant scope** (`runWithTenantContext({
|
|
11
|
-
* isSuperAdmin: true })`) so the underlying `purgeExpired` spans every org and
|
|
12
|
-
* bypasses RLS on FORCE'd tables (plugins/pipelines/etc.). A bare no-tenant
|
|
13
|
-
* context would see zero rows on those tables — and in production (`strict`
|
|
14
|
-
* mode) `withTenantTx` throws outright — so the scope is established here rather
|
|
15
|
-
* than left to the caller. This is a cross-tenant housekeeping job, not a
|
|
16
|
-
* per-org operation.
|
|
17
|
-
*/
|
|
18
|
-
import { type Scheduler } from '@pipeline-builder/api-core';
|
|
1
|
+
import { type Scheduler, type RemoteAuditAction } from '@pipeline-builder/api-core';
|
|
19
2
|
/** The slice of a CrudService the sweep needs, plus a label for logs/metrics. */
|
|
20
3
|
export interface PurgeableEntity {
|
|
21
4
|
/** Table/entity label (e.g. 'pipeline') for per-table logging. */
|
|
22
5
|
name: string;
|
|
23
6
|
/** Hard-delete up to `limit` expired tombstones; returns rows purged. */
|
|
24
7
|
purgeExpired(now: Date, limit?: number): Promise<number>;
|
|
8
|
+
/**
|
|
9
|
+
* The entity's manual-purge action (e.g. `pipeline.purge`), reused for the
|
|
10
|
+
* sweep's hard-deletes with `details.trigger: 'retention'`. Omitted for rows
|
|
11
|
+
* that are not user-facing records (pending attachment blobs and the like) —
|
|
12
|
+
* those purge unaudited.
|
|
13
|
+
*/
|
|
14
|
+
auditAction?: RemoteAuditAction;
|
|
25
15
|
}
|
|
26
16
|
/**
|
|
27
17
|
* The services that run a soft-delete purge. A closed union, not a `string`,
|
|
@@ -16,8 +16,12 @@
|
|
|
16
16
|
* mode) `withTenantTx` throws outright — so the scope is established here rather
|
|
17
17
|
* than left to the caller. This is a cross-tenant housekeeping job, not a
|
|
18
18
|
* per-org operation.
|
|
19
|
+
*
|
|
20
|
+
* Each tick is one audited job run: entities that name an `auditAction` get one
|
|
21
|
+
* event per tick that purged rows — system actor, the tick's `runId`, the count.
|
|
19
22
|
*/
|
|
20
|
-
import {
|
|
23
|
+
import { randomUUID } from 'node:crypto';
|
|
24
|
+
import { createLogger, createScheduler, envBool, envInt, leaderLockKey, DEFAULT_LEADER_LOCK_TTL_MS, recordAudit, runWithAuditContext, SYSTEM_ACTOR_ID, SYSTEM_ORG_ID, } from '@pipeline-builder/api-core';
|
|
21
25
|
import { runWithTenantContext } from '../database/tenancy.js';
|
|
22
26
|
const logger = createLogger('soft-delete-sweep');
|
|
23
27
|
/** Kill-switch: `SOFT_DELETE_PURGE_ENABLED=false` disables all hard-purging
|
|
@@ -37,6 +41,9 @@ export async function runSoftDeletePurge(entities, opts = {}, run) {
|
|
|
37
41
|
logger.debug('Soft-delete purge disabled (SOFT_DELETE_PURGE_ENABLED=false)');
|
|
38
42
|
return counts;
|
|
39
43
|
}
|
|
44
|
+
// One id per tick: every audit event this run records carries it (as the
|
|
45
|
+
// job context's `runId` and in `details`), so a reviewer can regroup a sweep.
|
|
46
|
+
const runId = randomUUID();
|
|
40
47
|
const batchSize = opts.batchSize ?? 500;
|
|
41
48
|
const maxBatches = opts.maxBatchesPerEntity ?? 20;
|
|
42
49
|
// One `now` for the whole tick — rows that expire mid-sweep wait for the next.
|
|
@@ -44,7 +51,7 @@ export async function runSoftDeletePurge(entities, opts = {}, run) {
|
|
|
44
51
|
// Establish a sysadmin scope so every `purgeExpired` (which routes through
|
|
45
52
|
// `withTenantTx`) bypasses RLS and spans all orgs. Without this, FORCE'd
|
|
46
53
|
// tables return zero rows and production `strict` mode throws.
|
|
47
|
-
return runWithTenantContext({ isSuperAdmin: true }, async () => {
|
|
54
|
+
return runWithAuditContext({ job: { jobId: 'soft-delete-purge', runId, trigger: 'schedule' } }, () => runWithTenantContext({ isSuperAdmin: true }, async () => {
|
|
48
55
|
for (const entity of entities) {
|
|
49
56
|
// Between entities: the leader lock was lost (another pod is taking over) or
|
|
50
57
|
// we are shutting down. The remaining entities are picked up next tick —
|
|
@@ -76,12 +83,35 @@ export async function runSoftDeletePurge(entities, opts = {}, run) {
|
|
|
76
83
|
});
|
|
77
84
|
}
|
|
78
85
|
}
|
|
79
|
-
if (total > 0)
|
|
86
|
+
if (total > 0) {
|
|
80
87
|
logger.info('Purged expired soft-deleted rows', { entity: entity.name, count: total });
|
|
88
|
+
if (entity.auditAction)
|
|
89
|
+
auditRetentionPurge(entity.auditAction, entity.name, total, runId);
|
|
90
|
+
}
|
|
81
91
|
counts[entity.name] = total;
|
|
82
92
|
}
|
|
83
93
|
return counts;
|
|
84
|
-
});
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The audit event for one entity's hard-deletes in one tick. A cross-tenant
|
|
98
|
+
* system job, so it is attributed to the system actor in the system org;
|
|
99
|
+
* `targetType` is the entity and there is no single `targetId`. Never throws —
|
|
100
|
+
* an unbound audit client (a wiring bug) is logged, and the sweep carries on.
|
|
101
|
+
*/
|
|
102
|
+
function auditRetentionPurge(action, entity, count, runId) {
|
|
103
|
+
try {
|
|
104
|
+
recordAudit({
|
|
105
|
+
action,
|
|
106
|
+
actorId: SYSTEM_ACTOR_ID,
|
|
107
|
+
orgId: SYSTEM_ORG_ID,
|
|
108
|
+
targetType: entity,
|
|
109
|
+
details: { trigger: 'retention', runId, count },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
logger.error('Retention purge audit not recorded', { entity, count, error: String(err) });
|
|
114
|
+
}
|
|
85
115
|
}
|
|
86
116
|
/**
|
|
87
117
|
* Build (but do NOT start) a leader-locked scheduler that runs the soft-delete
|
|
@@ -120,4 +150,4 @@ export function createSoftDeletePurgeScheduler(opts) {
|
|
|
120
150
|
lock: { key: leaderLockKey(opts.service, 'soft-delete-purge'), ttlMs: lockTtlMs },
|
|
121
151
|
});
|
|
122
152
|
}
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1kZWxldGUtc3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFrQixhQUFhLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2SixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQTBCakQ7NkVBQzZFO0FBQzdFLE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsUUFBMkIsRUFDM0IsSUFBSSxHQUEyQixFQUFFLEVBQ2pDLEdBQTZCO0lBRTdCLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUM7SUFDMUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDN0UsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFDbEQsK0VBQStFO0lBQy9FLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsMkVBQTJFO0lBQzNFLHlFQUF5RTtJQUN6RSwrREFBK0Q7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RUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXJHLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUU7UUFDbEQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1FBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxQyxhQUFhLEVBQUUsVUFBVSxHQUFHLFNBQVM7S0FDdEMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxlQUFlLENBQUM7UUFDckIsSUFBSSxFQUFFLHFCQUFxQixJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ3pDLFVBQVU7UUFDVixjQUFjO1FBQ2QsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDbEYsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBzb2Z0LWRlbGV0ZSByZXRlbnRpb24gcHVyZ2UuXG4gKlxuICogRXZlcnkge0BsaW5rIENydWRTZXJ2aWNlfSBlbnRpdHkgc29mdC1kZWxldGVzIChzZXRzIGBkZWxldGVkQXRgICsgYVxuICogYHB1cmdlX2FmdGVyYCBkZWFkbGluZSkuIFRoaXMgb3JjaGVzdHJhdG9yIHJ1bnMgb25lIHB1cmdlIHBhc3MgYWNyb3NzIGEgc2V0XG4gKiBvZiBzdWNoIGVudGl0aWVzLCBoYXJkLWRlbGV0aW5nIHRvbWJzdG9uZXMgd2hvc2UgZGVhZGxpbmUgaGFzIHBhc3NlZC4gSXQgaXNcbiAqIHRoZSBgcnVuYCBjYWxsYmFjayBhIHNlcnZpY2UgaGFuZHMgdG8gYGNyZWF0ZVNjaGVkdWxlcmAgKGxlYWRlci1sb2NrZWQpLCBzb1xuICogb25seSBvbmUgcG9kIHN3ZWVwcyBhdCBhIHRpbWUuXG4gKlxuICogUnVucyBpbiBhbiBleHBsaWNpdCAqKnN5c2FkbWluIHRlbmFudCBzY29wZSoqIChgcnVuV2l0aFRlbmFudENvbnRleHQoe1xuICogaXNTdXBlckFkbWluOiB0cnVlIH0pYCkgc28gdGhlIHVuZGVybHlpbmcgYHB1cmdlRXhwaXJlZGAgc3BhbnMgZXZlcnkgb3JnIGFuZFxuICogYnlwYXNzZXMgUkxTIG9uIEZPUkNFJ2QgdGFibGVzIChwbHVnaW5zL3BpcGVsaW5lcy9ldGMuKS4gQSBiYXJlIG5vLXRlbmFudFxuICogY29udGV4dCB3b3VsZCBzZWUgemVybyByb3dzIG9uIHRob3NlIHRhYmxlcyDigJQgYW5kIGluIHByb2R1Y3Rpb24gKGBzdHJpY3RgXG4gKiBtb2RlKSBgd2l0aFRlbmFudFR4YCB0aHJvd3Mgb3V0cmlnaHQg4oCUIHNvIHRoZSBzY29wZSBpcyBlc3RhYmxpc2hlZCBoZXJlIHJhdGhlclxuICogdGhhbiBsZWZ0IHRvIHRoZSBjYWxsZXIuIFRoaXMgaXMgYSBjcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIGpvYiwgbm90IGFcbiAqIHBlci1vcmcgb3BlcmF0aW9uLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlU2NoZWR1bGVyLCBlbnZCb29sLCBlbnZJbnQsIHR5cGUgU2NoZWR1bGVyLCBsZWFkZXJMb2NrS2V5LCBERUZBVUxUX0xFQURFUl9MT0NLX1RUTF9NUyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IHJ1bldpdGhUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc29mdC1kZWxldGUtc3dlZXAnKTtcblxuLyoqIFRoZSBzbGljZSBvZiBhIENydWRTZXJ2aWNlIHRoZSBzd2VlcCBuZWVkcywgcGx1cyBhIGxhYmVsIGZvciBsb2dzL21ldHJpY3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1cmdlYWJsZUVudGl0eSB7XG4gIC8qKiBUYWJsZS9lbnRpdHkgbGFiZWwgKGUuZy4gJ3BpcGVsaW5lJykgZm9yIHBlci10YWJsZSBsb2dnaW5nLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBIYXJkLWRlbGV0ZSB1cCB0byBgbGltaXRgIGV4cGlyZWQgdG9tYnN0b25lczsgcmV0dXJucyByb3dzIHB1cmdlZC4gKi9cbiAgcHVyZ2VFeHBpcmVkKG5vdzogRGF0ZSwgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8qKlxuICogVGhlIHNlcnZpY2VzIHRoYXQgcnVuIGEgc29mdC1kZWxldGUgcHVyZ2UuIEEgY2xvc2VkIHVuaW9uLCBub3QgYSBgc3RyaW5nYCxcbiAqIGJlY2F1c2UgdGhlIHZhbHVlIGJlY29tZXMgdGhlIExPQ0sgS0VZOiB0d28gc2VydmljZXMgcGFzc2luZyB0aGUgc2FtZSBzdHJpbmdcbiAqIHdvdWxkIHNpbGVudGx5IHNoYXJlIG9uZSBsb2NrLCBhbmQgd2hpY2hldmVyIGxvc3QgaXQgd291bGQgc2ltcGx5IG5ldmVyIHN3ZWVwIOKAlFxuICogYSB0eXBvIHRoYXQgc3RvcHMgYSBwdXJnZSB3aXRoIG5vIGVycm9yIGFueXdoZXJlLlxuICovXG5leHBvcnQgdHlwZSBTb2Z0RGVsZXRlU3dlZXBTZXJ2aWNlID0gJ3BpcGVsaW5lJyB8ICdwbHVnaW4nIHwgJ21lc3NhZ2UnIHwgJ2NvbXBsaWFuY2UnIHwgJ3BsYXRmb3JtJyB8ICdyZXBvcnRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVQdXJnZU9wdGlvbnMge1xuICAvKiogUm93cyBwZXIgYmF0Y2ggcGVyIHRhYmxlIChkZWZhdWx0IDUwMCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgdGljayAoZGVmYXVsdCAyMCDihpIg4omkIDEway90YWJsZS90aWNrKTsgdGhlIHJlc3RcbiAgICogIGlzIGRlZmVycmVkIHRvIHRoZSBuZXh0IHRpY2sgc28gYSBodWdlIGJhY2tsb2cgY2FuJ3QgYmxvdyB0aGUgbG9jayBUVEwuICovXG4gIG1heEJhdGNoZXNQZXJFbnRpdHk/OiBudW1iZXI7XG59XG5cbi8qKiBLaWxsLXN3aXRjaDogYFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQ9ZmFsc2VgIGRpc2FibGVzIGFsbCBoYXJkLXB1cmdpbmdcbiAqICAodG9tYnN0b25lcyBzdGlsbCBhY2N1bXVsYXRlICsgc3RheSByZXN0b3JhYmxlOyBub3RoaW5nIGlzIGRlc3Ryb3llZCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTb2Z0RGVsZXRlUHVyZ2VFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRCcsIHRydWUpO1xufVxuXG4vKipcbiAqIFJ1biBvbmUgcHVyZ2Ugc3dlZXAgYWNyb3NzIGBlbnRpdGllc2AuIExvb3BzIGVhY2ggZW50aXR5J3MgYHB1cmdlRXhwaXJlZGAgaW5cbiAqIGJhdGNoZXMgdW50aWwgYSBiYXRjaCByZXR1cm5zIGA8IGJhdGNoU2l6ZWAgKGRyYWluZWQpIG9yIHRoZSBwZXItdGljayBjYXAgaXNcbiAqIGhpdCAobG9nZ2VkOyBjb250aW51ZWQgbmV4dCB0aWNrKS4gTmV2ZXIgdGhyb3dzIOKAlCBhIGZhaWxpbmcgZW50aXR5IGlzIGxvZ2dlZFxuICogYW5kIHRoZSBzd2VlcCBtb3ZlcyBvbi4gUmV0dXJucyBwZXItZW50aXR5IHB1cmdlZCBjb3VudHMgKGFsc28gbG9nZ2VkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blNvZnREZWxldGVQdXJnZShcbiAgZW50aXRpZXM6IFB1cmdlYWJsZUVudGl0eVtdLFxuICBvcHRzOiBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zID0ge30sXG4gIHJ1bj86IHsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdTb2Z0LWRlbGV0ZSBwdXJnZSBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknKTtcbiAgICByZXR1cm4gY291bnRzO1xuICB9XG5cbiAgY29uc3QgYmF0Y2hTaXplID0gb3B0cy5iYXRjaFNpemUgPz8gNTAwO1xuICBjb25zdCBtYXhCYXRjaGVzID0gb3B0cy5tYXhCYXRjaGVzUGVyRW50aXR5ID8/IDIwO1xuICAvLyBPbmUgYG5vd2AgZm9yIHRoZSB3aG9sZSB0aWNrIOKAlCByb3dzIHRoYXQgZXhwaXJlIG1pZC1zd2VlcCB3YWl0IGZvciB0aGUgbmV4dC5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAvLyBFc3RhYmxpc2ggYSBzeXNhZG1pbiBzY29wZSBzbyBldmVyeSBgcHVyZ2VFeHBpcmVkYCAod2hpY2ggcm91dGVzIHRocm91Z2hcbiAgLy8gYHdpdGhUZW5hbnRUeGApIGJ5cGFzc2VzIFJMUyBhbmQgc3BhbnMgYWxsIG9yZ3MuIFdpdGhvdXQgdGhpcywgRk9SQ0UnZFxuICAvLyB0YWJsZXMgcmV0dXJuIHplcm8gcm93cyBhbmQgcHJvZHVjdGlvbiBgc3RyaWN0YCBtb2RlIHRocm93cy5cbiAgcmV0dXJuIHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgLy8gQmV0d2VlbiBlbnRpdGllczogdGhlIGxlYWRlciBsb2NrIHdhcyBsb3N0IChhbm90aGVyIHBvZCBpcyB0YWtpbmcgb3Zlcikgb3JcbiAgICAgIC8vIHdlIGFyZSBzaHV0dGluZyBkb3duLiBUaGUgcmVtYWluaW5nIGVudGl0aWVzIGFyZSBwaWNrZWQgdXAgbmV4dCB0aWNrIOKAlFxuICAgICAgLy8gdGhlaXIgdG9tYnN0b25lcyBhcmUgc3RpbGwgZXhwaXJlZCDigJQgYW5kIHN0b3BwaW5nIGxldHMgdGhlIGxvY2sgZ28uXG4gICAgICBpZiAocnVuPy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU29mdC1kZWxldGUgcHVyZ2Ugc3RvcHBpbmcgZWFybHknLCB7IHJlYXNvbjogU3RyaW5nKHJ1bi5zaWduYWwucmVhc29uID8/ICdhYm9ydGVkJyksIGF0RW50aXR5OiBlbnRpdHkubmFtZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhCYXRjaGVzOyBpKyspIHtcbiAgICAgICAgLy8gQWxzbyBiZXR3ZWVuIEJBVENIRVM6IG9uZSBlbnRpdHkgd2l0aCBhIGxhcmdlIGJhY2tsb2cgY2FuIHJ1biBmb3IgbWFueVxuICAgICAgICAvLyBiYXRjaGVzLCB3aGljaCBpcyBleGFjdGx5IHRoZSBjYXNlIGEgVFRMIHVzZWQgdG8gaGF2ZSB0byBjb3Zlci5cbiAgICAgICAgaWYgKHJ1bj8uc2lnbmFsLmFib3J0ZWQpIGJyZWFrO1xuICAgICAgICBsZXQgcHVyZ2VkOiBudW1iZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVyZ2VkID0gYXdhaXQgZW50aXR5LnB1cmdlRXhwaXJlZChub3csIGJhdGNoU2l6ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignUHVyZ2UgYmF0Y2ggZmFpbGVkJywgeyBlbnRpdHk6IGVudGl0eS5uYW1lLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWwgKz0gcHVyZ2VkO1xuICAgICAgICBpZiAocHVyZ2VkIDwgYmF0Y2hTaXplKSBicmVhazsgLy8gZHJhaW5lZFxuICAgICAgICBpZiAoaSA9PT0gbWF4QmF0Y2hlcyAtIDEpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignUHVyZ2UgaGl0IHBlci10aWNrIGNhcDsgcmVtYWluaW5nIHRvbWJzdG9uZXMgZGVmZXJyZWQgdG8gbmV4dCB0aWNrJywge1xuICAgICAgICAgICAgZW50aXR5OiBlbnRpdHkubmFtZSwgcHVyZ2VkVGhpc1RpY2s6IHRvdGFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG90YWwgPiAwKSBsb2dnZXIuaW5mbygnUHVyZ2VkIGV4cGlyZWQgc29mdC1kZWxldGVkIHJvd3MnLCB7IGVudGl0eTogZW50aXR5Lm5hbWUsIGNvdW50OiB0b3RhbCB9KTtcbiAgICAgIGNvdW50c1tlbnRpdHkubmFtZV0gPSB0b3RhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnRzO1xuICB9KTtcbn1cblxuLy8gLS0gU2NoZWR1bGVyIGZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXJPcHRpb25zIGV4dGVuZHMgU29mdERlbGV0ZVB1cmdlT3B0aW9ucyB7XG4gIC8qKiBTZXJ2aWNlIGxhYmVsIGZvciBsb2dzICsgdGhlIGxlYWRlci1sb2NrIGtleSAoZS5nLiAncGlwZWxpbmUnLCAncGx1Z2luJykuICovXG4gIHNlcnZpY2U6IFNvZnREZWxldGVTd2VlcFNlcnZpY2U7XG4gIC8qKiBFbnRpdGllcyB0byBzd2VlcCDigJQgdXN1YWxseSB0aGUgc2VydmljZSdzIG93biBDcnVkU2VydmljZSBzaW5nbGV0b25zLiAqL1xuICBlbnRpdGllczogUHVyZ2VhYmxlRW50aXR5W107XG59XG5cbi8qKlxuICogQnVpbGQgKGJ1dCBkbyBOT1Qgc3RhcnQpIGEgbGVhZGVyLWxvY2tlZCBzY2hlZHVsZXIgdGhhdCBydW5zIHRoZSBzb2Z0LWRlbGV0ZVxuICogcHVyZ2Ugc3dlZXAgZm9yIGBlbnRpdGllc2Agb24gYSBjYWRlbmNlLiBUaGUgY2FsbGVyIGAuc3RhcnQoKWBzIGl0IGFuZCB3aXJlc1xuICogYHN0b3AoKWAgdG8gU0lHVEVSTS4gUmV0dXJucyBudWxsIHdoZW4gcHVyZ2luZyBpcyBkaXNhYmxlZC5cbiAqXG4gKiBFbnYgY29uZmlnOlxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9FTkFCTEVEICAgICAgICAgICAoZGVmYXVsdCB0cnVlOyBmYWxzZSDih5IgbnVsbCwgbm8gc3dlZXApXG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX0lOVEVSVkFMX0hPVVJTICAgIChkZWZhdWx0IDYpXG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX1NUQVJUVVBfREVMQVlfTVMgIChkZWZhdWx0IDEyMDAwMCDigJQgMiBtaW4gc2V0dGxlKVxuICogICBTT0ZUX0RFTEVURV9QVVJHRV9MT0NLX1RUTF9NUyAgICAgICAoZGVmYXVsdCA5MDAwMDAg4oCUIDE1IG1pbjsgb3V0bGFzdHMgYVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dlZXAsIHN0YXlzIHVuZGVyIHRoZSBpbnRlcnZhbClcbiAqXG4gKiBBIGNyb3NzLXBvZCBsZWFkZXIgbG9jayAod2hlbiBSZWRpcyBpcyBjb25maWd1cmVkKSBtZWFucyBvbmx5IG9uZSByZXBsaWNhXG4gKiBzd2VlcHMgcGVyIHdpbmRvdzsgd2l0aG91dCBSZWRpcyBpdCBydW5zIG9uIGV2ZXJ5IHBvZCDigJQgc3RpbGwgc2FmZSwgc2luY2UgdGhlXG4gKiBwdXJnZSBpcyBhIGJhdGNoZWQgaWRlbXBvdGVudCBERUxFVEUsIGp1c3QgcmVkdW5kYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU29mdERlbGV0ZVB1cmdlU2NoZWR1bGVyKG9wdHM6IFNvZnREZWxldGVQdXJnZVNjaGVkdWxlck9wdGlvbnMpOiBTY2hlZHVsZXIgfCBudWxsIHtcbiAgaWYgKCFpc1NvZnREZWxldGVQdXJnZUVuYWJsZWQoKSkge1xuICAgIGxvZ2dlci5pbmZvKCdTb2Z0LWRlbGV0ZSBwdXJnZSBzY2hlZHVsZXIgZGlzYWJsZWQgKFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQ9ZmFsc2UpJywgeyBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpbnRlcnZhbE1zID0gZW52SW50KCdTT0ZUX0RFTEVURV9QVVJHRV9JTlRFUlZBTF9IT1VSUycsIDYsIHsgbWluOiAxIH0pICogNjAgKiA2MCAqIDEwMDA7XG4gIGNvbnN0IHN0YXJ0dXBEZWxheU1zID0gZW52SW50KCdTT0ZUX0RFTEVURV9QVVJHRV9TVEFSVFVQX0RFTEFZX01TJywgMTIwXzAwMCwgeyBtaW46IDAgfSk7XG4gIGNvbnN0IGxvY2tUdGxNcyA9IGVudkludCgnU09GVF9ERUxFVEVfUFVSR0VfTE9DS19UVExfTVMnLCBERUZBVUxUX0xFQURFUl9MT0NLX1RUTF9NUywgeyBtaW46IDEwMDAgfSk7XG5cbiAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBzdGFydGluZycsIHtcbiAgICBzZXJ2aWNlOiBvcHRzLnNlcnZpY2UsXG4gICAgZW50aXRpZXM6IG9wdHMuZW50aXRpZXMubWFwKChlKSA9PiBlLm5hbWUpLFxuICAgIGludGVydmFsSG91cnM6IGludGVydmFsTXMgLyAzXzYwMF8wMDAsXG4gIH0pO1xuXG4gIHJldHVybiBjcmVhdGVTY2hlZHVsZXIoe1xuICAgIG5hbWU6IGBzb2Z0LWRlbGV0ZS1wdXJnZToke29wdHMuc2VydmljZX1gLFxuICAgIGludGVydmFsTXMsXG4gICAgc3RhcnR1cERlbGF5TXMsXG4gICAgcnVuOiBhc3luYyAocnVuKSA9PiB7IGF3YWl0IHJ1blNvZnREZWxldGVQdXJnZShvcHRzLmVudGl0aWVzLCBvcHRzLCBydW4pOyB9LFxuICAgIGxvY2s6IHsga2V5OiBsZWFkZXJMb2NrS2V5KG9wdHMuc2VydmljZSwgJ3NvZnQtZGVsZXRlLXB1cmdlJyksIHR0bE1zOiBsb2NrVHRsTXMgfSxcbiAgfSk7XG59XG4iXX0=
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdC1kZWxldGUtc3dlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxZQUFZLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQWtCLGFBQWEsRUFBRSwwQkFBMEIsRUFDekcsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxhQUFhLEdBQ2pFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFpQ2pEOzZFQUM2RTtBQUM3RSxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sT0FBTyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLFFBQTJCLEVBQzNCLElBQUksR0FBMkIsRUFBRSxFQUNqQyxHQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO0lBQzFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsOEVBQThFO0lBQzlFLE1BQU0sS0FBSyxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksR0FBRyxD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QU87UUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzFDLGFBQWEsRUFBRSxVQUFVLEdBQUcsU0FBUztLQUN0QyxDQUFDLENBQUM7SUFFSCxPQUFPLGVBQWUsQ0FBQztRQUNyQixJQUFJLEVBQUUscUJBQXFCLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDekMsVUFBVTtRQUNWLGNBQWM7UUFDZCxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtLQUNsRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2hhcmVkIHNvZnQtZGVsZXRlIHJldGVudGlvbiBwdXJnZS5cbiAqXG4gKiBFdmVyeSB7QGxpbmsgQ3J1ZFNlcnZpY2V9IGVudGl0eSBzb2Z0LWRlbGV0ZXMgKHNldHMgYGRlbGV0ZWRBdGAgKyBhXG4gKiBgcHVyZ2VfYWZ0ZXJgIGRlYWRsaW5lKS4gVGhpcyBvcmNoZXN0cmF0b3IgcnVucyBvbmUgcHVyZ2UgcGFzcyBhY3Jvc3MgYSBzZXRcbiAqIG9mIHN1Y2ggZW50aXRpZXMsIGhhcmQtZGVsZXRpbmcgdG9tYnN0b25lcyB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2VkLiBJdCBpc1xuICogdGhlIGBydW5gIGNhbGxiYWNrIGEgc2VydmljZSBoYW5kcyB0byBgY3JlYXRlU2NoZWR1bGVyYCAobGVhZGVyLWxvY2tlZCksIHNvXG4gKiBvbmx5IG9uZSBwb2Qgc3dlZXBzIGF0IGEgdGltZS5cbiAqXG4gKiBSdW5zIGluIGFuIGV4cGxpY2l0ICoqc3lzYWRtaW4gdGVuYW50IHNjb3BlKiogKGBydW5XaXRoVGVuYW50Q29udGV4dCh7XG4gKiBpc1N1cGVyQWRtaW46IHRydWUgfSlgKSBzbyB0aGUgdW5kZXJseWluZyBgcHVyZ2VFeHBpcmVkYCBzcGFucyBldmVyeSBvcmcgYW5kXG4gKiBieXBhc3NlcyBSTFMgb24gRk9SQ0UnZCB0YWJsZXMgKHBsdWdpbnMvcGlwZWxpbmVzL2V0Yy4pLiBBIGJhcmUgbm8tdGVuYW50XG4gKiBjb250ZXh0IHdvdWxkIHNlZSB6ZXJvIHJvd3Mgb24gdGhvc2UgdGFibGVzIOKAlCBhbmQgaW4gcHJvZHVjdGlvbiAoYHN0cmljdGBcbiAqIG1vZGUpIGB3aXRoVGVuYW50VHhgIHRocm93cyBvdXRyaWdodCDigJQgc28gdGhlIHNjb3BlIGlzIGVzdGFibGlzaGVkIGhlcmUgcmF0aGVyXG4gKiB0aGFuIGxlZnQgdG8gdGhlIGNhbGxlci4gVGhpcyBpcyBhIGNyb3NzLXRlbmFudCBob3VzZWtlZXBpbmcgam9iLCBub3QgYVxuICogcGVyLW9yZyBvcGVyYXRpb24uXG4gKlxuICogRWFjaCB0aWNrIGlzIG9uZSBhdWRpdGVkIGpvYiBydW46IGVudGl0aWVzIHRoYXQgbmFtZSBhbiBgYXVkaXRBY3Rpb25gIGdldCBvbmVcbiAqIGV2ZW50IHBlciB0aWNrIHRoYXQgcHVyZ2VkIHJvd3Mg4oCUIHN5c3RlbSBhY3RvciwgdGhlIHRpY2sncyBgcnVuSWRgLCB0aGUgY291bnQuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIGNyZWF0ZUxvZ2dlciwgY3JlYXRlU2NoZWR1bGVyLCBlbnZCb29sLCBlbnZJbnQsIHR5cGUgU2NoZWR1bGVyLCBsZWFkZXJMb2NrS2V5LCBERUZBVUxUX0xFQURFUl9MT0NLX1RUTF9NUyxcbiAgcmVjb3JkQXVkaXQsIHJ1bldpdGhBdWRpdENvbnRleHQsIFNZU1RFTV9BQ1RPUl9JRCwgU1lTVEVNX09SR19JRCwgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbixcbn0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzb2Z0LWRlbGV0ZS1zd2VlcCcpO1xuXG4vKiogVGhlIHNsaWNlIG9mIGEgQ3J1ZFNlcnZpY2UgdGhlIHN3ZWVwIG5lZWRzLCBwbHVzIGEgbGFiZWwgZm9yIGxvZ3MvbWV0cmljcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVyZ2VhYmxlRW50aXR5IHtcbiAgLyoqIFRhYmxlL2VudGl0eSBsYWJlbCAoZS5nLiAncGlwZWxpbmUnKSBmb3IgcGVyLXRhYmxlIGxvZ2dpbmcuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEhhcmQtZGVsZXRlIHVwIHRvIGBsaW1pdGAgZXhwaXJlZCB0b21ic3RvbmVzOyByZXR1cm5zIHJvd3MgcHVyZ2VkLiAqL1xuICBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkncyBtYW51YWwtcHVyZ2UgYWN0aW9uIChlLmcuIGBwaXBlbGluZS5wdXJnZWApLCByZXVzZWQgZm9yIHRoZVxuICAgKiBzd2VlcCdzIGhhcmQtZGVsZXRlcyB3aXRoIGBkZXRhaWxzLnRyaWdnZXI6ICdyZXRlbnRpb24nYC4gT21pdHRlZCBmb3Igcm93c1xuICAgKiB0aGF0IGFyZSBub3QgdXNlci1mYWNpbmcgcmVjb3JkcyAocGVuZGluZyBhdHRhY2htZW50IGJsb2JzIGFuZCB0aGUgbGlrZSkg4oCUXG4gICAqIHRob3NlIHB1cmdlIHVuYXVkaXRlZC5cbiAgICovXG4gIGF1ZGl0QWN0aW9uPzogUmVtb3RlQXVkaXRBY3Rpb247XG59XG5cbi8qKlxuICogVGhlIHNlcnZpY2VzIHRoYXQgcnVuIGEgc29mdC1kZWxldGUgcHVyZ2UuIEEgY2xvc2VkIHVuaW9uLCBub3QgYSBgc3RyaW5nYCxcbiAqIGJlY2F1c2UgdGhlIHZhbHVlIGJlY29tZXMgdGhlIExPQ0sgS0VZOiB0d28gc2VydmljZXMgcGFzc2luZyB0aGUgc2FtZSBzdHJpbmdcbiAqIHdvdWxkIHNpbGVudGx5IHNoYXJlIG9uZSBsb2NrLCBhbmQgd2hpY2hldmVyIGxvc3QgaXQgd291bGQgc2ltcGx5IG5ldmVyIHN3ZWVwIOKAlFxuICogYSB0eXBvIHRoYXQgc3RvcHMgYSBwdXJnZSB3aXRoIG5vIGVycm9yIGFueXdoZXJlLlxuICovXG5leHBvcnQgdHlwZSBTb2Z0RGVsZXRlU3dlZXBTZXJ2aWNlID0gJ3BpcGVsaW5lJyB8ICdwbHVnaW4nIHwgJ21lc3NhZ2UnIHwgJ2NvbXBsaWFuY2UnIHwgJ3BsYXRmb3JtJyB8ICdyZXBvcnRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVQdXJnZU9wdGlvbnMge1xuICAvKiogUm93cyBwZXIgYmF0Y2ggcGVyIHRhYmxlIChkZWZhdWx0IDUwMCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIE1heCBiYXRjaGVzIHBlciB0YWJsZSBwZXIgdGljayAoZGVmYXVsdCAyMCDihpIg4omkIDEway90YWJsZS90aWNrKTsgdGhlIHJlc3RcbiAgICogIGlzIGRlZmVycmVkIHRvIHRoZSBuZXh0IHRpY2sgc28gYSBodWdlIGJhY2tsb2cgY2FuJ3QgYmxvdyB0aGUgbG9jayBUVEwuICovXG4gIG1heEJhdGNoZXNQZXJFbnRpdHk/OiBudW1iZXI7XG59XG5cbi8qKiBLaWxsLXN3aXRjaDogYFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQ9ZmFsc2VgIGRpc2FibGVzIGFsbCBoYXJkLXB1cmdpbmdcbiAqICAodG9tYnN0b25lcyBzdGlsbCBhY2N1bXVsYXRlICsgc3RheSByZXN0b3JhYmxlOyBub3RoaW5nIGlzIGRlc3Ryb3llZCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTb2Z0RGVsZXRlUHVyZ2VFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRCcsIHRydWUpO1xufVxuXG4vKipcbiAqIFJ1biBvbmUgcHVyZ2Ugc3dlZXAgYWNyb3NzIGBlbnRpdGllc2AuIExvb3BzIGVhY2ggZW50aXR5J3MgYHB1cmdlRXhwaXJlZGAgaW5cbiAqIGJhdGNoZXMgdW50aWwgYSBiYXRjaCByZXR1cm5zIGA8IGJhdGNoU2l6ZWAgKGRyYWluZWQpIG9yIHRoZSBwZXItdGljayBjYXAgaXNcbiAqIGhpdCAobG9nZ2VkOyBjb250aW51ZWQgbmV4dCB0aWNrKS4gTmV2ZXIgdGhyb3dzIOKAlCBhIGZhaWxpbmcgZW50aXR5IGlzIGxvZ2dlZFxuICogYW5kIHRoZSBzd2VlcCBtb3ZlcyBvbi4gUmV0dXJucyBwZXItZW50aXR5IHB1cmdlZCBjb3VudHMgKGFsc28gbG9nZ2VkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blNvZnREZWxldGVQdXJnZShcbiAgZW50aXRpZXM6IFB1cmdlYWJsZUVudGl0eVtdLFxuICBvcHRzOiBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zID0ge30sXG4gIHJ1bj86IHsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gIGNvbnN0IGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdTb2Z0LWRlbGV0ZSBwdXJnZSBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknKTtcbiAgICByZXR1cm4gY291bnRzO1xuICB9XG5cbiAgLy8gT25lIGlkIHBlciB0aWNrOiBldmVyeSBhdWRpdCBldmVudCB0aGlzIHJ1biByZWNvcmRzIGNhcnJpZXMgaXQgKGFzIHRoZVxuICAvLyBqb2IgY29udGV4dCdzIGBydW5JZGAgYW5kIGluIGBkZXRhaWxzYCksIHNvIGEgcmV2aWV3ZXIgY2FuIHJlZ3JvdXAgYSBzd2VlcC5cbiAgY29uc3QgcnVuSWQgPSByYW5kb21VVUlEKCk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IG9wdHMuYmF0Y2hTaXplID8/IDUwMDtcbiAgY29uc3QgbWF4QmF0Y2hlcyA9IG9wdHMubWF4QmF0Y2hlc1BlckVudGl0eSA/PyAyMDtcbiAgLy8gT25lIGBub3dgIGZvciB0aGUgd2hvbGUgdGljayDigJQgcm93cyB0aGF0IGV4cGlyZSBtaWQtc3dlZXAgd2FpdCBmb3IgdGhlIG5leHQuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgLy8gRXN0YWJsaXNoIGEgc3lzYWRtaW4gc2NvcGUgc28gZXZlcnkgYHB1cmdlRXhwaXJlZGAgKHdoaWNoIHJvdXRlcyB0aHJvdWdoXG4gIC8vIGB3aXRoVGVuYW50VHhgKSBieXBhc3NlcyBSTFMgYW5kIHNwYW5zIGFsbCBvcmdzLiBXaXRob3V0IHRoaXMsIEZPUkNFJ2RcbiAgLy8gdGFibGVzIHJldHVybiB6ZXJvIHJvd3MgYW5kIHByb2R1Y3Rpb24gYHN0cmljdGAgbW9kZSB0aHJvd3MuXG4gIHJldHVybiBydW5XaXRoQXVkaXRDb250ZXh0KHsgam9iOiB7IGpvYklkOiAnc29mdC1kZWxldGUtcHVyZ2UnLCBydW5JZCwgdHJpZ2dlcjogJ3NjaGVkdWxlJyB9IH0sICgpID0+IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgLy8gQmV0d2VlbiBlbnRpdGllczogdGhlIGxlYWRlciBsb2NrIHdhcyBsb3N0IChhbm90aGVyIHBvZCBpcyB0YWtpbmcgb3Zlcikgb3JcbiAgICAgIC8vIHdlIGFyZSBzaHV0dGluZyBkb3duLiBUaGUgcmVtYWluaW5nIGVudGl0aWVzIGFyZSBwaWNrZWQgdXAgbmV4dCB0aWNrIOKAlFxuICAgICAgLy8gdGhlaXIgdG9tYnN0b25lcyBhcmUgc3RpbGwgZXhwaXJlZCDigJQgYW5kIHN0b3BwaW5nIGxldHMgdGhlIGxvY2sgZ28uXG4gICAgICBpZiAocnVuPy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnU29mdC1kZWxldGUgcHVyZ2Ugc3RvcHBpbmcgZWFybHknLCB7IHJlYXNvbjogU3RyaW5nKHJ1bi5zaWduYWwucmVhc29uID8/ICdhYm9ydGVkJyksIGF0RW50aXR5OiBlbnRpdHkubmFtZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhCYXRjaGVzOyBpKyspIHtcbiAgICAgICAgLy8gQWxzbyBiZXR3ZWVuIEJBVENIRVM6IG9uZSBlbnRpdHkgd2l0aCBhIGxhcmdlIGJhY2tsb2cgY2FuIHJ1biBmb3IgbWFueVxuICAgICAgICAvLyBiYXRjaGVzLCB3aGljaCBpcyBleGFjdGx5IHRoZSBjYXNlIGEgVFRMIHVzZWQgdG8gaGF2ZSB0byBjb3Zlci5cbiAgICAgICAgaWYgKHJ1bj8uc2lnbmFsLmFib3J0ZWQpIGJyZWFrO1xuICAgICAgICBsZXQgcHVyZ2VkOiBudW1iZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVyZ2VkID0gYXdhaXQgZW50aXR5LnB1cmdlRXhwaXJlZChub3csIGJhdGNoU2l6ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignUHVyZ2UgYmF0Y2ggZmFpbGVkJywgeyBlbnRpdHk6IGVudGl0eS5uYW1lLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWwgKz0gcHVyZ2VkO1xuICAgICAgICBpZiAocHVyZ2VkIDwgYmF0Y2hTaXplKSBicmVhazsgLy8gZHJhaW5lZFxuICAgICAgICBpZiAoaSA9PT0gbWF4QmF0Y2hlcyAtIDEpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignUHVyZ2UgaGl0IHBlci10aWNrIGNhcDsgcmVtYWluaW5nIHRvbWJzdG9uZXMgZGVmZXJyZWQgdG8gbmV4dCB0aWNrJywge1xuICAgICAgICAgICAgZW50aXR5OiBlbnRpdHkubmFtZSwgcHVyZ2VkVGhpc1RpY2s6IHRvdGFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG90YWwgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQdXJnZWQgZXhwaXJlZCBzb2Z0LWRlbGV0ZWQgcm93cycsIHsgZW50aXR5OiBlbnRpdHkubmFtZSwgY291bnQ6IHRvdGFsIH0pO1xuICAgICAgICBpZiAoZW50aXR5LmF1ZGl0QWN0aW9uKSBhdWRpdFJldGVudGlvblB1cmdlKGVudGl0eS5hdWRpdEFjdGlvbiwgZW50aXR5Lm5hbWUsIHRvdGFsLCBydW5JZCk7XG4gICAgICB9XG4gICAgICBjb3VudHNbZW50aXR5Lm5hbWVdID0gdG90YWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50cztcbiAgfSkpO1xufVxuXG4vKipcbiAqIFRoZSBhdWRpdCBldmVudCBmb3Igb25lIGVudGl0eSdzIGhhcmQtZGVsZXRlcyBpbiBvbmUgdGljay4gQSBjcm9zcy10ZW5hbnRcbiAqIHN5c3RlbSBqb2IsIHNvIGl0IGlzIGF0dHJpYnV0ZWQgdG8gdGhlIHN5c3RlbSBhY3RvciBpbiB0aGUgc3lzdGVtIG9yZztcbiAqIGB0YXJnZXRUeXBlYCBpcyB0aGUgZW50aXR5IGFuZCB0aGVyZSBpcyBubyBzaW5nbGUgYHRhcmdldElkYC4gTmV2ZXIgdGhyb3dzIOKAlFxuICogYW4gdW5ib3VuZCBhdWRpdCBjbGllbnQgKGEgd2lyaW5nIGJ1ZykgaXMgbG9nZ2VkLCBhbmQgdGhlIHN3ZWVwIGNhcnJpZXMgb24uXG4gKi9cbmZ1bmN0aW9uIGF1ZGl0UmV0ZW50aW9uUHVyZ2UoYWN0aW9uOiBSZW1vdGVBdWRpdEFjdGlvbiwgZW50aXR5OiBzdHJpbmcsIGNvdW50OiBudW1iZXIsIHJ1bklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICByZWNvcmRBdWRpdCh7XG4gICAgICBhY3Rpb24sXG4gICAgICBhY3RvcklkOiBTWVNURU1fQUNUT1JfSUQsXG4gICAgICBvcmdJZDogU1lTVEVNX09SR19JRCxcbiAgICAgIHRhcmdldFR5cGU6IGVudGl0eSxcbiAgICAgIGRldGFpbHM6IHsgdHJpZ2dlcjogJ3JldGVudGlvbicsIHJ1bklkLCBjb3VudCB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoJ1JldGVudGlvbiBwdXJnZSBhdWRpdCBub3QgcmVjb3JkZWQnLCB7IGVudGl0eSwgY291bnQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgfVxufVxuXG4vLyAtLSBTY2hlZHVsZXIgZmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVQdXJnZVNjaGVkdWxlck9wdGlvbnMgZXh0ZW5kcyBTb2Z0RGVsZXRlUHVyZ2VPcHRpb25zIHtcbiAgLyoqIFNlcnZpY2UgbGFiZWwgZm9yIGxvZ3MgKyB0aGUgbGVhZGVyLWxvY2sga2V5IChlLmcuICdwaXBlbGluZScsICdwbHVnaW4nKS4gKi9cbiAgc2VydmljZTogU29mdERlbGV0ZVN3ZWVwU2VydmljZTtcbiAgLyoqIEVudGl0aWVzIHRvIHN3ZWVwIOKAlCB1c3VhbGx5IHRoZSBzZXJ2aWNlJ3Mgb3duIENydWRTZXJ2aWNlIHNpbmdsZXRvbnMuICovXG4gIGVudGl0aWVzOiBQdXJnZWFibGVFbnRpdHlbXTtcbn1cblxuLyoqXG4gKiBCdWlsZCAoYnV0IGRvIE5PVCBzdGFydCkgYSBsZWFkZXItbG9ja2VkIHNjaGVkdWxlciB0aGF0IHJ1bnMgdGhlIHNvZnQtZGVsZXRlXG4gKiBwdXJnZSBzd2VlcCBmb3IgYGVudGl0aWVzYCBvbiBhIGNhZGVuY2UuIFRoZSBjYWxsZXIgYC5zdGFydCgpYHMgaXQgYW5kIHdpcmVzXG4gKiBgc3RvcCgpYCB0byBTSUdURVJNLiBSZXR1cm5zIG51bGwgd2hlbiBwdXJnaW5nIGlzIGRpc2FibGVkLlxuICpcbiAqIEVudiBjb25maWc6XG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX0VOQUJMRUQgICAgICAgICAgIChkZWZhdWx0IHRydWU7IGZhbHNlIOKHkiBudWxsLCBubyBzd2VlcClcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfSU5URVJWQUxfSE9VUlMgICAgKGRlZmF1bHQgNilcbiAqICAgU09GVF9ERUxFVEVfUFVSR0VfU1RBUlRVUF9ERUxBWV9NUyAgKGRlZmF1bHQgMTIwMDAwIOKAlCAyIG1pbiBzZXR0bGUpXG4gKiAgIFNPRlRfREVMRVRFX1BVUkdFX0xPQ0tfVFRMX01TICAgICAgIChkZWZhdWx0IDkwMDAwMCDigJQgMTUgbWluOyBvdXRsYXN0cyBhXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2VlcCwgc3RheXMgdW5kZXIgdGhlIGludGVydmFsKVxuICpcbiAqIEEgY3Jvc3MtcG9kIGxlYWRlciBsb2NrICh3aGVuIFJlZGlzIGlzIGNvbmZpZ3VyZWQpIG1lYW5zIG9ubHkgb25lIHJlcGxpY2FcbiAqIHN3ZWVwcyBwZXIgd2luZG93OyB3aXRob3V0IFJlZGlzIGl0IHJ1bnMgb24gZXZlcnkgcG9kIOKAlCBzdGlsbCBzYWZlLCBzaW5jZSB0aGVcbiAqIHB1cmdlIGlzIGEgYmF0Y2hlZCBpZGVtcG90ZW50IERFTEVURSwganVzdCByZWR1bmRhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXIob3B0czogU29mdERlbGV0ZVB1cmdlU2NoZWR1bGVyT3B0aW9ucyk6IFNjaGVkdWxlciB8IG51bGwge1xuICBpZiAoIWlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NvZnQtZGVsZXRlIHB1cmdlIHNjaGVkdWxlciBkaXNhYmxlZCAoU09GVF9ERUxFVEVfUFVSR0VfRU5BQkxFRD1mYWxzZSknLCB7IHNlcnZpY2U6IG9wdHMuc2VydmljZSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsTXMgPSBlbnZJbnQoJ1NPRlRfREVMRVRFX1BVUkdFX0lOVEVSVkFMX0hPVVJTJywgNiwgeyBtaW46IDEgfSkgKiA2MCAqIDYwICogMTAwMDtcbiAgY29uc3Qgc3RhcnR1cERlbGF5TXMgPSBlbnZJbnQoJ1NPRlRfREVMRVRFX1BVUkdFX1NUQVJUVVBfREVMQVlfTVMnLCAxMjBfMDAwLCB7IG1pbjogMCB9KTtcbiAgY29uc3QgbG9ja1R0bE1zID0gZW52SW50KCdTT0ZUX0RFTEVURV9QVVJHRV9MT0NLX1RUTF9NUycsIERFRkFVTFRfTEVBREVSX0xPQ0tfVFRMX01TLCB7IG1pbjogMTAwMCB9KTtcblxuICBsb2dnZXIuaW5mbygnU29mdC1kZWxldGUgcHVyZ2Ugc2NoZWR1bGVyIHN0YXJ0aW5nJywge1xuICAgIHNlcnZpY2U6IG9wdHMuc2VydmljZSxcbiAgICBlbnRpdGllczogb3B0cy5lbnRpdGllcy5tYXAoKGUpID0+IGUubmFtZSksXG4gICAgaW50ZXJ2YWxIb3VyczogaW50ZXJ2YWxNcyAvIDNfNjAwXzAwMCxcbiAgfSk7XG5cbiAgcmV0dXJuIGNyZWF0ZVNjaGVkdWxlcih7XG4gICAgbmFtZTogYHNvZnQtZGVsZXRlLXB1cmdlOiR7b3B0cy5zZXJ2aWNlfWAsXG4gICAgaW50ZXJ2YWxNcyxcbiAgICBzdGFydHVwRGVsYXlNcyxcbiAgICBydW46IGFzeW5jIChydW4pID0+IHsgYXdhaXQgcnVuU29mdERlbGV0ZVB1cmdlKG9wdHMuZW50aXRpZXMsIG9wdHMsIHJ1bik7IH0sXG4gICAgbG9jazogeyBrZXk6IGxlYWRlckxvY2tLZXkob3B0cy5zZXJ2aWNlLCAnc29mdC1kZWxldGUtcHVyZ2UnKSwgdHRsTXM6IGxvY2tUdGxNcyB9LFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which pipelines still REFERENCE a plugin version or image — the one rule every
|
|
3
|
+
* removal path asks before it deletes anything: an org plugin delete (forced or
|
|
4
|
+
* not), a bulk delete, a tombstone purge (manual or the retention sweep), the
|
|
5
|
+
* image registry's age GC, the listing image GC.
|
|
6
|
+
*
|
|
7
|
+
* THE RULE: a version (or its image) that any pipeline references cannot be
|
|
8
|
+
* deleted until no pipeline does — whatever its vulnerability state. A
|
|
9
|
+
* vulnerable image is the WORST thing to delete out from under a pipeline: the
|
|
10
|
+
* next run fails to pull, and the owners learn about the CVE from an outage.
|
|
11
|
+
* Vulnerability consequences are graded warnings and notifications, never removal.
|
|
12
|
+
*
|
|
13
|
+
* A reference is any of:
|
|
14
|
+
* - `declared` — a LIVE pipeline's config resolves to it (`pipeline_plugin_resolution`);
|
|
15
|
+
* - `deployed` — a pipeline's last deploy recorded it (`pipeline_step_manifests`),
|
|
16
|
+
* INCLUDING a soft-deleted pipeline: its CodePipeline still runs the image;
|
|
17
|
+
* - `exposure` — an open DEPLOYED exposure still names it (the same "still runs
|
|
18
|
+
* it" fact, kept when a manifest is gone).
|
|
19
|
+
*
|
|
20
|
+
* Matched by image digest when the version has one (a team running its parent's
|
|
21
|
+
* plugin, or another org's install, pins the same digest), else by name +
|
|
22
|
+
* version within the owner org and its teams.
|
|
23
|
+
*/
|
|
24
|
+
import { type SQL } from 'drizzle-orm';
|
|
25
|
+
/** A version / image whose references are wanted. */
|
|
26
|
+
export interface VersionReferenceTarget {
|
|
27
|
+
pluginName: string;
|
|
28
|
+
pluginVersion: string;
|
|
29
|
+
imageDigest?: string | null;
|
|
30
|
+
/** The owning org of an org plugin (its teams count too); omitted for a listing version. */
|
|
31
|
+
ownerOrgId?: string | null;
|
|
32
|
+
/** The listing's publisher handle (a listing version); null/omitted for an org plugin. */
|
|
33
|
+
publisher?: string | null;
|
|
34
|
+
}
|
|
35
|
+
/** One pipeline referencing a version. */
|
|
36
|
+
export interface VersionReference {
|
|
37
|
+
pipelineId: string;
|
|
38
|
+
pipelineName: string | null;
|
|
39
|
+
orgId: string;
|
|
40
|
+
source: 'declared' | 'deployed' | 'exposure';
|
|
41
|
+
/** The pipeline is soft-deleted (still deployed: its manifest or exposure remains). */
|
|
42
|
+
pipelineDeleted: boolean;
|
|
43
|
+
steps: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The SQL predicate "some pipeline references this row's image / version", over
|
|
47
|
+
* a `plugins`-shaped row's columns — the purge guard's form of
|
|
48
|
+
* {@link findVersionReferences} (same three sources, same matching).
|
|
49
|
+
*/
|
|
50
|
+
export declare function versionReferencedPredicate(cols: {
|
|
51
|
+
digest: SQL;
|
|
52
|
+
name: SQL;
|
|
53
|
+
version: SQL;
|
|
54
|
+
orgId: SQL;
|
|
55
|
+
}): SQL;
|
|
56
|
+
/**
|
|
57
|
+
* Every pipeline referencing `target` (see the module doc), across orgs — so it
|
|
58
|
+
* must run with a scope that can read every org's rows (elevated). The result
|
|
59
|
+
* names other orgs' pipelines; callers show the OWNER only counts and its own
|
|
60
|
+
* org's pipelines, and notify each referencing org about its own.
|
|
61
|
+
*/
|
|
62
|
+
export declare function findVersionReferences(target: VersionReferenceTarget): Promise<VersionReference[]>;
|
|
63
|
+
/** Distinct pipelines among `refs` (a pipeline both declared and deployed counts once). */
|
|
64
|
+
export declare function distinctPipelines(refs: readonly VersionReference[]): Array<{
|
|
65
|
+
pipelineId: string;
|
|
66
|
+
pipelineName: string | null;
|
|
67
|
+
orgId: string;
|
|
68
|
+
sources: string[];
|
|
69
|
+
pipelineDeleted: boolean;
|
|
70
|
+
steps: string[];
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* The image digests an org's namespace still needs: every `plugins` row's
|
|
74
|
+
* digest (active, inactive or soft-deleted — a tombstone is restorable until
|
|
75
|
+
* purged, and the purge itself is guarded) plus every digest a pipeline of the
|
|
76
|
+
* org or its teams declares, runs or has an open deployed exposure on. What the
|
|
77
|
+
* image registry's age GC consults before deleting anything in `org-<id>/*`.
|
|
78
|
+
* Elevated read.
|
|
79
|
+
*/
|
|
80
|
+
export declare function orgImageDigestsInUse(orgId: string): Promise<string[]>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Which pipelines still REFERENCE a plugin version or image — the one rule every
|
|
5
|
+
* removal path asks before it deletes anything: an org plugin delete (forced or
|
|
6
|
+
* not), a bulk delete, a tombstone purge (manual or the retention sweep), the
|
|
7
|
+
* image registry's age GC, the listing image GC.
|
|
8
|
+
*
|
|
9
|
+
* THE RULE: a version (or its image) that any pipeline references cannot be
|
|
10
|
+
* deleted until no pipeline does — whatever its vulnerability state. A
|
|
11
|
+
* vulnerable image is the WORST thing to delete out from under a pipeline: the
|
|
12
|
+
* next run fails to pull, and the owners learn about the CVE from an outage.
|
|
13
|
+
* Vulnerability consequences are graded warnings and notifications, never removal.
|
|
14
|
+
*
|
|
15
|
+
* A reference is any of:
|
|
16
|
+
* - `declared` — a LIVE pipeline's config resolves to it (`pipeline_plugin_resolution`);
|
|
17
|
+
* - `deployed` — a pipeline's last deploy recorded it (`pipeline_step_manifests`),
|
|
18
|
+
* INCLUDING a soft-deleted pipeline: its CodePipeline still runs the image;
|
|
19
|
+
* - `exposure` — an open DEPLOYED exposure still names it (the same "still runs
|
|
20
|
+
* it" fact, kept when a manifest is gone).
|
|
21
|
+
*
|
|
22
|
+
* Matched by image digest when the version has one (a team running its parent's
|
|
23
|
+
* plugin, or another org's install, pins the same digest), else by name +
|
|
24
|
+
* version within the owner org and its teams.
|
|
25
|
+
*/
|
|
26
|
+
import { sql } from 'drizzle-orm';
|
|
27
|
+
import { executeRows } from '../database/pg-result.js';
|
|
28
|
+
import { withTenantTx } from '../database/tenancy.js';
|
|
29
|
+
/**
|
|
30
|
+
* The SQL predicate "some pipeline references this row's image / version", over
|
|
31
|
+
* a `plugins`-shaped row's columns — the purge guard's form of
|
|
32
|
+
* {@link findVersionReferences} (same three sources, same matching).
|
|
33
|
+
*/
|
|
34
|
+
export function versionReferencedPredicate(cols) {
|
|
35
|
+
return sql `(
|
|
36
|
+
(${cols.digest} IS NOT NULL AND (
|
|
37
|
+
EXISTS (SELECT 1 FROM pipeline_step_manifests m WHERE m.image_digest = ${cols.digest})
|
|
38
|
+
OR EXISTS (SELECT 1 FROM pipeline_plugin_resolution r JOIN pipelines p ON p.id::text = r.pipeline_id AND p.deleted_at IS NULL
|
|
39
|
+
WHERE r.resolved_digest = ${cols.digest})
|
|
40
|
+
OR EXISTS (SELECT 1 FROM plugin_vuln_exposure e WHERE e.image_digest = ${cols.digest} AND e.source = 'deployed' AND e.fixed_at IS NULL)))
|
|
41
|
+
OR (${cols.digest} IS NULL AND (
|
|
42
|
+
EXISTS (SELECT 1 FROM pipeline_step_manifests m WHERE m.plugin_name = ${cols.name} AND m.plugin_version = ${cols.version}
|
|
43
|
+
AND m.plugin_publisher IS NULL AND lower(m.org_id) = lower(${cols.orgId}))
|
|
44
|
+
OR EXISTS (SELECT 1 FROM pipeline_plugin_resolution r JOIN pipelines p ON p.id::text = r.pipeline_id AND p.deleted_at IS NULL
|
|
45
|
+
WHERE r.plugin_name = ${cols.name} AND r.resolved_version = ${cols.version} AND r.plugin_publisher IS NULL
|
|
46
|
+
AND (lower(r.org_id) = lower(${cols.orgId}) OR lower(r.root_org_id) = lower(${cols.orgId})))))
|
|
47
|
+
)`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Every pipeline referencing `target` (see the module doc), across orgs — so it
|
|
51
|
+
* must run with a scope that can read every org's rows (elevated). The result
|
|
52
|
+
* names other orgs' pipelines; callers show the OWNER only counts and its own
|
|
53
|
+
* org's pipelines, and notify each referencing org about its own.
|
|
54
|
+
*/
|
|
55
|
+
export async function findVersionReferences(target) {
|
|
56
|
+
const digest = target.imageDigest ?? null;
|
|
57
|
+
const owner = target.ownerOrgId?.toLowerCase() ?? null;
|
|
58
|
+
const declaredMatch = digest
|
|
59
|
+
? sql `r.resolved_digest = ${digest}`
|
|
60
|
+
: sql `r.plugin_name = ${target.pluginName} AND r.resolved_version = ${target.pluginVersion}
|
|
61
|
+
AND ${target.publisher ? sql `r.plugin_publisher = ${target.publisher}` : sql `r.plugin_publisher IS NULL AND (lower(r.org_id) = ${owner} OR lower(r.root_org_id) = ${owner})`}`;
|
|
62
|
+
const deployedMatch = digest
|
|
63
|
+
? sql `m.image_digest = ${digest}`
|
|
64
|
+
: sql `m.plugin_name = ${target.pluginName} AND m.plugin_version = ${target.pluginVersion}
|
|
65
|
+
AND ${target.publisher ? sql `m.plugin_publisher = ${target.publisher}` : sql `m.plugin_publisher IS NULL AND lower(m.org_id) = ${owner}`}`;
|
|
66
|
+
const exposureMatch = digest
|
|
67
|
+
? sql `e.image_digest = ${digest}`
|
|
68
|
+
: sql `e.plugin_name = ${target.pluginName} AND e.plugin_version = ${target.pluginVersion}
|
|
69
|
+
AND ${target.publisher ? sql `e.plugin_publisher = ${target.publisher}` : sql `e.plugin_publisher IS NULL AND lower(e.org_id) = ${owner}`}`;
|
|
70
|
+
const rows = await withTenantTx((tx) => executeRows(tx, sql `
|
|
71
|
+
SELECT x.pipeline_id, x.org_id, x.source, p.pipeline_name, (p.id IS NULL OR p.deleted_at IS NOT NULL) AS deleted,
|
|
72
|
+
array_agg(DISTINCT x.step) FILTER (WHERE x.step IS NOT NULL) AS steps
|
|
73
|
+
FROM (
|
|
74
|
+
SELECT r.pipeline_id, r.org_id, 'declared' AS source,
|
|
75
|
+
CASE WHEN r.stage_name = 'synth' AND r.step_name = 'synth' THEN 'synth' ELSE r.stage_name || '/' || r.step_name END AS step
|
|
76
|
+
FROM pipeline_plugin_resolution r
|
|
77
|
+
JOIN pipelines lp ON lp.id::text = r.pipeline_id AND lp.deleted_at IS NULL
|
|
78
|
+
WHERE ${declaredMatch}
|
|
79
|
+
UNION ALL
|
|
80
|
+
SELECT m.pipeline_id::text, m.org_id, 'deployed', m.stage_name || '/' || m.action_name
|
|
81
|
+
FROM pipeline_step_manifests m WHERE ${deployedMatch}
|
|
82
|
+
UNION ALL
|
|
83
|
+
SELECT e.pipeline_id, e.org_id, 'exposure', NULL
|
|
84
|
+
FROM plugin_vuln_exposure e WHERE ${exposureMatch} AND e.source = 'deployed' AND e.fixed_at IS NULL
|
|
85
|
+
) x
|
|
86
|
+
LEFT JOIN pipelines p ON p.id::text = x.pipeline_id
|
|
87
|
+
GROUP BY x.pipeline_id, x.org_id, x.source, p.pipeline_name, p.id, p.deleted_at
|
|
88
|
+
ORDER BY x.org_id, x.pipeline_id, x.source
|
|
89
|
+
`));
|
|
90
|
+
return rows.map((r) => ({
|
|
91
|
+
pipelineId: r.pipeline_id,
|
|
92
|
+
pipelineName: r.pipeline_name ?? null,
|
|
93
|
+
orgId: r.org_id,
|
|
94
|
+
source: r.source,
|
|
95
|
+
pipelineDeleted: r.deleted === true,
|
|
96
|
+
steps: r.steps ?? [],
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
/** Distinct pipelines among `refs` (a pipeline both declared and deployed counts once). */
|
|
100
|
+
export function distinctPipelines(refs) {
|
|
101
|
+
const byId = new Map();
|
|
102
|
+
for (const r of refs) {
|
|
103
|
+
const e = byId.get(r.pipelineId) ?? { pipelineId: r.pipelineId, pipelineName: r.pipelineName, orgId: r.orgId, sources: [], pipelineDeleted: r.pipelineDeleted, steps: [] };
|
|
104
|
+
if (!e.sources.includes(r.source))
|
|
105
|
+
e.sources.push(r.source);
|
|
106
|
+
e.steps = [...new Set([...e.steps, ...r.steps])];
|
|
107
|
+
byId.set(r.pipelineId, e);
|
|
108
|
+
}
|
|
109
|
+
return [...byId.values()];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The image digests an org's namespace still needs: every `plugins` row's
|
|
113
|
+
* digest (active, inactive or soft-deleted — a tombstone is restorable until
|
|
114
|
+
* purged, and the purge itself is guarded) plus every digest a pipeline of the
|
|
115
|
+
* org or its teams declares, runs or has an open deployed exposure on. What the
|
|
116
|
+
* image registry's age GC consults before deleting anything in `org-<id>/*`.
|
|
117
|
+
* Elevated read.
|
|
118
|
+
*/
|
|
119
|
+
export async function orgImageDigestsInUse(orgId) {
|
|
120
|
+
const org = orgId.toLowerCase();
|
|
121
|
+
const rows = await withTenantTx((tx) => executeRows(tx, sql `
|
|
122
|
+
SELECT DISTINCT d FROM (
|
|
123
|
+
SELECT image_digest AS d FROM plugins WHERE lower(org_id) = ${org} AND image_digest IS NOT NULL
|
|
124
|
+
UNION SELECT r.resolved_digest FROM pipeline_plugin_resolution r
|
|
125
|
+
WHERE r.resolved_digest IS NOT NULL AND (lower(r.org_id) = ${org} OR lower(r.root_org_id) = ${org})
|
|
126
|
+
UNION SELECT m.image_digest FROM pipeline_step_manifests m
|
|
127
|
+
WHERE m.image_digest IS NOT NULL AND m.image_digest IN (SELECT image_digest FROM plugins WHERE lower(org_id) = ${org} AND image_digest IS NOT NULL)
|
|
128
|
+
UNION SELECT m.image_digest FROM pipeline_step_manifests m WHERE m.image_digest IS NOT NULL AND lower(m.org_id) = ${org}
|
|
129
|
+
UNION SELECT e.image_digest FROM plugin_vuln_exposure e
|
|
130
|
+
WHERE e.image_digest IS NOT NULL AND e.source = 'deployed' AND e.fixed_at IS NULL AND lower(e.org_id) = ${org}
|
|
131
|
+
) x WHERE d IS NOT NULL
|
|
132
|
+
`));
|
|
133
|
+
return rows.map((r) => r.d);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1yZWZlcmVuY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS92ZXJzaW9uLXJlZmVyZW5jZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQXdCdEQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxJQUEwRDtJQUNuRyxPQUFPLEdBQUcsQ0FBQTtPQUNMLElBQUksQ0FBQyxNQUFNOytFQUM2RCxJQUFJLENBQUMsTUFBTTs7OENBRTVDLElBQUksQ0FBQyxNQUFNOytFQUNzQixJQUFJLENBQUMsTUFBTTtVQUNoRixJQUFJLENBQUMsTUFBTTs4RUFDeUQsSUFBSSxDQUFDLElBQUksMkJBQTJCLElBQUksQ0FBQyxPQUFPOzZFQUNqRCxJQUFJLENBQUMsS0FBSzs7MENBRTdDLElBQUksQ0FBQyxJQUFJLDZCQUE2QixJQUFJLENBQUMsT0FBTzttREFDekMsSUFBSSxDQUFDLEtBQUsscUNBQXFDLElBQUksQ0FBQyxLQUFLO0lBQ3hHLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUFDLE1BQThCO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDO0lBQ3ZELE1BQU0sYUFBYSxHQUFHLE1BQU07UUFDMUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFB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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQUMsS0FBYTtJQUN0RCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBZ0IsRUFBRSxFQUFFLEdBQUcsQ0FBQTs7b0VBRVIsR0FBRzs7MkVBRUksR0FBRyw4QkFBOEIsR0FBRzs7K0hBRWdCLEdBQUc7MEhBQ1IsR0FBRzs7d0hBRUwsR0FBRzs7R0FFeEgsQ0FBQyxDQUFDLENBQUM7SUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogV2hpY2ggcGlwZWxpbmVzIHN0aWxsIFJFRkVSRU5DRSBhIHBsdWdpbiB2ZXJzaW9uIG9yIGltYWdlIOKAlCB0aGUgb25lIHJ1bGUgZXZlcnlcbiAqIHJlbW92YWwgcGF0aCBhc2tzIGJlZm9yZSBpdCBkZWxldGVzIGFueXRoaW5nOiBhbiBvcmcgcGx1Z2luIGRlbGV0ZSAoZm9yY2VkIG9yXG4gKiBub3QpLCBhIGJ1bGsgZGVsZXRlLCBhIHRvbWJzdG9uZSBwdXJnZSAobWFudWFsIG9yIHRoZSByZXRlbnRpb24gc3dlZXApLCB0aGVcbiAqIGltYWdlIHJlZ2lzdHJ5J3MgYWdlIEdDLCB0aGUgbGlzdGluZyBpbWFnZSBHQy5cbiAqXG4gKiBUSEUgUlVMRTogYSB2ZXJzaW9uIChvciBpdHMgaW1hZ2UpIHRoYXQgYW55IHBpcGVsaW5lIHJlZmVyZW5jZXMgY2Fubm90IGJlXG4gKiBkZWxldGVkIHVudGlsIG5vIHBpcGVsaW5lIGRvZXMg4oCUIHdoYXRldmVyIGl0cyB2dWxuZXJhYmlsaXR5IHN0YXRlLiBBXG4gKiB2dWxuZXJhYmxlIGltYWdlIGlzIHRoZSBXT1JTVCB0aGluZyB0byBkZWxldGUgb3V0IGZyb20gdW5kZXIgYSBwaXBlbGluZTogdGhlXG4gKiBuZXh0IHJ1biBmYWlscyB0byBwdWxsLCBhbmQgdGhlIG93bmVycyBsZWFybiBhYm91dCB0aGUgQ1ZFIGZyb20gYW4gb3V0YWdlLlxuICogVnVsbmVyYWJpbGl0eSBjb25zZXF1ZW5jZXMgYXJlIGdyYWRlZCB3YXJuaW5ncyBhbmQgbm90aWZpY2F0aW9ucywgbmV2ZXIgcmVtb3ZhbC5cbiAqXG4gKiBBIHJlZmVyZW5jZSBpcyBhbnkgb2Y6XG4gKiAgLSBgZGVjbGFyZWRgIOKAlCBhIExJVkUgcGlwZWxpbmUncyBjb25maWcgcmVzb2x2ZXMgdG8gaXQgKGBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbmApO1xuICogIC0gYGRlcGxveWVkYCDigJQgYSBwaXBlbGluZSdzIGxhc3QgZGVwbG95IHJlY29yZGVkIGl0IChgcGlwZWxpbmVfc3RlcF9tYW5pZmVzdHNgKSxcbiAqICAgIElOQ0xVRElORyBhIHNvZnQtZGVsZXRlZCBwaXBlbGluZTogaXRzIENvZGVQaXBlbGluZSBzdGlsbCBydW5zIHRoZSBpbWFnZTtcbiAqICAtIGBleHBvc3VyZWAg4oCUIGFuIG9wZW4gREVQTE9ZRUQgZXhwb3N1cmUgc3RpbGwgbmFtZXMgaXQgKHRoZSBzYW1lIFwic3RpbGwgcnVuc1xuICogICAgaXRcIiBmYWN0LCBrZXB0IHdoZW4gYSBtYW5pZmVzdCBpcyBnb25lKS5cbiAqXG4gKiBNYXRjaGVkIGJ5IGltYWdlIGRpZ2VzdCB3aGVuIHRoZSB2ZXJzaW9uIGhhcyBvbmUgKGEgdGVhbSBydW5uaW5nIGl0cyBwYXJlbnQnc1xuICogcGx1Z2luLCBvciBhbm90aGVyIG9yZydzIGluc3RhbGwsIHBpbnMgdGhlIHNhbWUgZGlnZXN0KSwgZWxzZSBieSBuYW1lICtcbiAqIHZlcnNpb24gd2l0aGluIHRoZSBvd25lciBvcmcgYW5kIGl0cyB0ZWFtcy5cbiAqL1xuXG5pbXBvcnQgeyBzcWwsIHR5cGUgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgZXhlY3V0ZVJvd3MgfSBmcm9tICcuLi9kYXRhYmFzZS9wZy1yZXN1bHQuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbi8qKiBBIHZlcnNpb24gLyBpbWFnZSB3aG9zZSByZWZlcmVuY2VzIGFyZSB3YW50ZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25SZWZlcmVuY2VUYXJnZXQge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHBsdWdpblZlcnNpb246IHN0cmluZztcbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIG93bmluZyBvcmcgb2YgYW4gb3JnIHBsdWdpbiAoaXRzIHRlYW1zIGNvdW50IHRvbyk7IG9taXR0ZWQgZm9yIGEgbGlzdGluZyB2ZXJzaW9uLiAqL1xuICBvd25lck9yZ0lkPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBsaXN0aW5nJ3MgcHVibGlzaGVyIGhhbmRsZSAoYSBsaXN0aW5nIHZlcnNpb24pOyBudWxsL29taXR0ZWQgZm9yIGFuIG9yZyBwbHVnaW4uICovXG4gIHB1Ymxpc2hlcj86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBPbmUgcGlwZWxpbmUgcmVmZXJlbmNpbmcgYSB2ZXJzaW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uUmVmZXJlbmNlIHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHNvdXJjZTogJ2RlY2xhcmVkJyB8ICdkZXBsb3llZCcgfCAnZXhwb3N1cmUnO1xuICAvKiogVGhlIHBpcGVsaW5lIGlzIHNvZnQtZGVsZXRlZCAoc3RpbGwgZGVwbG95ZWQ6IGl0cyBtYW5pZmVzdCBvciBleHBvc3VyZSByZW1haW5zKS4gKi9cbiAgcGlwZWxpbmVEZWxldGVkOiBib29sZWFuO1xuICBzdGVwczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIFNRTCBwcmVkaWNhdGUgXCJzb21lIHBpcGVsaW5lIHJlZmVyZW5jZXMgdGhpcyByb3cncyBpbWFnZSAvIHZlcnNpb25cIiwgb3ZlclxuICogYSBgcGx1Z2luc2Atc2hhcGVkIHJvdydzIGNvbHVtbnMg4oCUIHRoZSBwdXJnZSBndWFyZCdzIGZvcm0gb2ZcbiAqIHtAbGluayBmaW5kVmVyc2lvblJlZmVyZW5jZXN9IChzYW1lIHRocmVlIHNvdXJjZXMsIHNhbWUgbWF0Y2hpbmcpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvblJlZmVyZW5jZWRQcmVkaWNhdGUoY29sczogeyBkaWdlc3Q6IFNRTDsgbmFtZTogU1FMOyB2ZXJzaW9uOiBTUUw7IG9yZ0lkOiBTUUwgfSk6IFNRTCB7XG4gIHJldHVybiBzcWxgKFxuICAgICgke2NvbHMuZGlnZXN0fSBJUyBOT1QgTlVMTCBBTkQgKFxuICAgICAgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzIG0gV0hFUkUgbS5pbWFnZV9kaWdlc3QgPSAke2NvbHMuZGlnZXN0fSlcbiAgICAgIE9SIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbiByIEpPSU4gcGlwZWxpbmVzIHAgT04gcC5pZDo6dGV4dCA9IHIucGlwZWxpbmVfaWQgQU5EIHAuZGVsZXRlZF9hdCBJUyBOVUxMXG4gICAgICAgICAgICAgICAgICBXSEVSRSByLnJlc29sdmVkX2RpZ2VzdCA9ICR7Y29scy5kaWdlc3R9KVxuICAgICAgT1IgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIHBsdWdpbl92dWxuX2V4cG9zdXJlIGUgV0hFUkUgZS5pbWFnZV9kaWdlc3QgPSAke2NvbHMuZGlnZXN0fSBBTkQgZS5zb3VyY2UgPSAnZGVwbG95ZWQnIEFORCBlLmZpeGVkX2F0IElTIE5VTEwpKSlcbiAgICBPUiAoJHtjb2xzLmRpZ2VzdH0gSVMgTlVMTCBBTkQgKFxuICAgICAgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzIG0gV0hFUkUgbS5wbHVnaW5fbmFtZSA9ICR7Y29scy5uYW1lfSBBTkQgbS5wbHVnaW5fdmVyc2lvbiA9ICR7Y29scy52ZXJzaW9ufVxuICAgICAgICAgICAgICAgIEFORCBtLnBsdWdpbl9wdWJsaXNoZXIgSVMgTlVMTCBBTkQgbG93ZXIobS5vcmdfaWQpID0gbG93ZXIoJHtjb2xzLm9yZ0lkfSkpXG4gICAgICBPUiBFWElTVFMgKFNFTEVDVCAxIEZST00gcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb24gciBKT0lOIHBpcGVsaW5lcyBwIE9OIHAuaWQ6OnRleHQgPSByLnBpcGVsaW5lX2lkIEFORCBwLmRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgICAgICAgICAgICAgICAgV0hFUkUgci5wbHVnaW5fbmFtZSA9ICR7Y29scy5uYW1lfSBBTkQgci5yZXNvbHZlZF92ZXJzaW9uID0gJHtjb2xzLnZlcnNpb259IEFORCByLnBsdWdpbl9wdWJsaXNoZXIgSVMgTlVMTFxuICAgICAgICAgICAgICAgICAgICBBTkQgKGxvd2VyKHIub3JnX2lkKSA9IGxvd2VyKCR7Y29scy5vcmdJZH0pIE9SIGxvd2VyKHIucm9vdF9vcmdfaWQpID0gbG93ZXIoJHtjb2xzLm9yZ0lkfSkpKSkpXG4gIClgO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHBpcGVsaW5lIHJlZmVyZW5jaW5nIGB0YXJnZXRgIChzZWUgdGhlIG1vZHVsZSBkb2MpLCBhY3Jvc3Mgb3JncyDigJQgc28gaXRcbiAqIG11c3QgcnVuIHdpdGggYSBzY29wZSB0aGF0IGNhbiByZWFkIGV2ZXJ5IG9yZydzIHJvd3MgKGVsZXZhdGVkKS4gVGhlIHJlc3VsdFxuICogbmFtZXMgb3RoZXIgb3JncycgcGlwZWxpbmVzOyBjYWxsZXJzIHNob3cgdGhlIE9XTkVSIG9ubHkgY291bnRzIGFuZCBpdHMgb3duXG4gKiBvcmcncyBwaXBlbGluZXMsIGFuZCBub3RpZnkgZWFjaCByZWZlcmVuY2luZyBvcmcgYWJvdXQgaXRzIG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRWZXJzaW9uUmVmZXJlbmNlcyh0YXJnZXQ6IFZlcnNpb25SZWZlcmVuY2VUYXJnZXQpOiBQcm9taXNlPFZlcnNpb25SZWZlcmVuY2VbXT4ge1xuICBjb25zdCBkaWdlc3QgPSB0YXJnZXQuaW1hZ2VEaWdlc3QgPz8gbnVsbDtcbiAgY29uc3Qgb3duZXIgPSB0YXJnZXQub3duZXJPcmdJZD8udG9Mb3dlckNhc2UoKSA/PyBudWxsO1xuICBjb25zdCBkZWNsYXJlZE1hdGNoID0gZGlnZXN0XG4gICAgPyBzcWxgci5yZXNvbHZlZF9kaWdlc3QgPSAke2RpZ2VzdH1gXG4gICAgOiBzcWxgci5wbHVnaW5fbmFtZSA9ICR7dGFyZ2V0LnBsdWdpbk5hbWV9IEFORCByLnJlc29sdmVkX3ZlcnNpb24gPSAke3RhcmdldC5wbHVnaW5WZXJzaW9ufVxuICAgICAgICAgIEFORCAke3RhcmdldC5wdWJsaXNoZXIgPyBzcWxgci5wbHVnaW5fcHVibGlzaGVyID0gJHt0YXJnZXQucHVibGlzaGVyfWAgOiBzcWxgci5wbHVnaW5fcHVibGlzaGVyIElTIE5VTEwgQU5EIChsb3dlcihyLm9yZ19pZCkgPSAke293bmVyfSBPUiBsb3dlcihyLnJvb3Rfb3JnX2lkKSA9ICR7b3duZXJ9KWB9YDtcbiAgY29uc3QgZGVwbG95ZWRNYXRjaCA9IGRpZ2VzdFxuICAgID8gc3FsYG0uaW1hZ2VfZGlnZXN0ID0gJHtkaWdlc3R9YFxuICAgIDogc3FsYG0ucGx1Z2luX25hbWUgPSAke3RhcmdldC5wbHVnaW5OYW1lfSBBTkQgbS5wbHVnaW5fdmVyc2lvbiA9ICR7dGFyZ2V0LnBsdWdpblZlcnNpb259XG4gICAgICAgICAgQU5EICR7dGFyZ2V0LnB1Ymxpc2hlciA/IHNxbGBtLnBsdWdpbl9wdWJsaXNoZXIgPSAke3RhcmdldC5wdWJsaXNoZXJ9YCA6IHNxbGBtLnBsdWdpbl9wdWJsaXNoZXIgSVMgTlVMTCBBTkQgbG93ZXIobS5vcmdfaWQpID0gJHtvd25lcn1gfWA7XG4gIGNvbnN0IGV4cG9zdXJlTWF0Y2ggPSBkaWdlc3RcbiAgICA/IHNxbGBlLmltYWdlX2RpZ2VzdCA9ICR7ZGlnZXN0fWBcbiAgICA6IHNxbGBlLnBsdWdpbl9uYW1lID0gJHt0YXJnZXQucGx1Z2luTmFtZX0gQU5EIGUucGx1Z2luX3ZlcnNpb24gPSAke3RhcmdldC5wbHVnaW5WZXJzaW9ufVxuICAgICAgICAgIEFORCAke3RhcmdldC5wdWJsaXNoZXIgPyBzcWxgZS5wbHVnaW5fcHVibGlzaGVyID0gJHt0YXJnZXQucHVibGlzaGVyfWAgOiBzcWxgZS5wbHVnaW5fcHVibGlzaGVyIElTIE5VTEwgQU5EIGxvd2VyKGUub3JnX2lkKSA9ICR7b3duZXJ9YH1gO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gZXhlY3V0ZVJvd3M8eyBwaXBlbGluZV9pZDogc3RyaW5nOyBvcmdfaWQ6IHN0cmluZzsgc291cmNlOiBWZXJzaW9uUmVmZXJlbmNlWydzb3VyY2UnXTsgcGlwZWxpbmVfbmFtZTogc3RyaW5nIHwgbnVsbDsgZGVsZXRlZDogYm9vbGVhbjsgc3RlcHM6IHN0cmluZ1tdIHwgbnVsbCB9Pih0eCwgc3FsYFxuICAgIFNFTEVDVCB4LnBpcGVsaW5lX2lkLCB4Lm9yZ19pZCwgeC5zb3VyY2UsIHAucGlwZWxpbmVfbmFtZSwgKHAuaWQgSVMgTlVMTCBPUiBwLmRlbGV0ZWRfYXQgSVMgTk9UIE5VTEwpIEFTIGRlbGV0ZWQsXG4gICAgICAgICAgIGFycmF5X2FnZyhESVNUSU5DVCB4LnN0ZXApIEZJTFRFUiAoV0hFUkUgeC5zdGVwIElTIE5PVCBOVUxMKSBBUyBzdGVwc1xuICAgICAgRlJPTSAoXG4gICAgICAgIFNFTEVDVCByLnBpcGVsaW5lX2lkLCByLm9yZ19pZCwgJ2RlY2xhcmVkJyBBUyBzb3VyY2UsXG4gICAgICAgICAgICAgICBDQVNFIFdIRU4gci5zdGFnZV9uYW1lID0gJ3N5bnRoJyBBTkQgci5zdGVwX25hbWUgPSAnc3ludGgnIFRIRU4gJ3N5bnRoJyBFTFNFIHIuc3RhZ2VfbmFtZSB8fCAnLycgfHwgci5zdGVwX25hbWUgRU5EIEFTIHN0ZXBcbiAgICAgICAgICBGUk9NIHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uIHJcbiAgICAgICAgICBKT0lOIHBpcGVsaW5lcyBscCBPTiBscC5pZDo6dGV4dCA9IHIucGlwZWxpbmVfaWQgQU5EIGxwLmRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgICAgICAgV0hFUkUgJHtkZWNsYXJlZE1hdGNofVxuICAgICAgICBVTklPTiBBTExcbiAgICAgICAgU0VMRUNUIG0ucGlwZWxpbmVfaWQ6OnRleHQsIG0ub3JnX2lkLCAnZGVwbG95ZWQnLCBtLnN0YWdlX25hbWUgfHwgJy8nIHx8IG0uYWN0aW9uX25hbWVcbiAgICAgICAgICBGUk9NIHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzIG0gV0hFUkUgJHtkZXBsb3llZE1hdGNofVxuICAgICAgICBVTklPTiBBTExcbiAgICAgICAgU0VMRUNUIGUucGlwZWxpbmVfaWQsIGUub3JnX2lkLCAnZXhwb3N1cmUnLCBOVUxMXG4gICAgICAgICAgRlJPTSBwbHVnaW5fdnVsbl9leHBvc3VyZSBlIFdIRVJFICR7ZXhwb3N1cmVNYXRjaH0gQU5EIGUuc291cmNlID0gJ2RlcGxveWVkJyBBTkQgZS5maXhlZF9hdCBJUyBOVUxMXG4gICAgICApIHhcbiAgICAgIExFRlQgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0geC5waXBlbGluZV9pZFxuICAgICBHUk9VUCBCWSB4LnBpcGVsaW5lX2lkLCB4Lm9yZ19pZCwgeC5zb3VyY2UsIHAucGlwZWxpbmVfbmFtZSwgcC5pZCwgcC5kZWxldGVkX2F0XG4gICAgIE9SREVSIEJZIHgub3JnX2lkLCB4LnBpcGVsaW5lX2lkLCB4LnNvdXJjZVxuICBgKSk7XG4gIHJldHVybiByb3dzLm1hcCgocikgPT4gKHtcbiAgICBwaXBlbGluZUlkOiByLnBpcGVsaW5lX2lkLFxuICAgIHBpcGVsaW5lTmFtZTogci5waXBlbGluZV9uYW1lID8/IG51bGwsXG4gICAgb3JnSWQ6IHIub3JnX2lkLFxuICAgIHNvdXJjZTogci5zb3VyY2UsXG4gICAgcGlwZWxpbmVEZWxldGVkOiByLmRlbGV0ZWQgPT09IHRydWUsXG4gICAgc3RlcHM6IHIuc3RlcHMgPz8gW10sXG4gIH0pKTtcbn1cblxuLyoqIERpc3RpbmN0IHBpcGVsaW5lcyBhbW9uZyBgcmVmc2AgKGEgcGlwZWxpbmUgYm90aCBkZWNsYXJlZCBhbmQgZGVwbG95ZWQgY291bnRzIG9uY2UpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RpbmN0UGlwZWxpbmVzKHJlZnM6IHJlYWRvbmx5IFZlcnNpb25SZWZlcmVuY2VbXSk6IEFycmF5PHsgcGlwZWxpbmVJZDogc3RyaW5nOyBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7IG9yZ0lkOiBzdHJpbmc7IHNvdXJjZXM6IHN0cmluZ1tdOyBwaXBlbGluZURlbGV0ZWQ6IGJvb2xlYW47IHN0ZXBzOiBzdHJpbmdbXSB9PiB7XG4gIGNvbnN0IGJ5SWQgPSBuZXcgTWFwPHN0cmluZywgeyBwaXBlbGluZUlkOiBzdHJpbmc7IHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDsgb3JnSWQ6IHN0cmluZzsgc291cmNlczogc3RyaW5nW107IHBpcGVsaW5lRGVsZXRlZDogYm9vbGVhbjsgc3RlcHM6IHN0cmluZ1tdIH0+KCk7XG4gIGZvciAoY29uc3QgciBvZiByZWZzKSB7XG4gICAgY29uc3QgZSA9IGJ5SWQuZ2V0KHIucGlwZWxpbmVJZCkgPz8geyBwaXBlbGluZUlkOiByLnBpcGVsaW5lSWQsIHBpcGVsaW5lTmFtZTogci5waXBlbGluZU5hbWUsIG9yZ0lkOiByLm9yZ0lkLCBzb3VyY2VzOiBbXSwgcGlwZWxpbmVEZWxldGVkOiByLnBpcGVsaW5lRGVsZXRlZCwgc3RlcHM6IFtdIH07XG4gICAgaWYgKCFlLnNvdXJjZXMuaW5jbHVkZXMoci5zb3VyY2UpKSBlLnNvdXJjZXMucHVzaChyLnNvdXJjZSk7XG4gICAgZS5zdGVwcyA9IFsuLi5uZXcgU2V0KFsuLi5lLnN0ZXBzLCAuLi5yLnN0ZXBzXSldO1xuICAgIGJ5SWQuc2V0KHIucGlwZWxpbmVJZCwgZSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5ieUlkLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBUaGUgaW1hZ2UgZGlnZXN0cyBhbiBvcmcncyBuYW1lc3BhY2Ugc3RpbGwgbmVlZHM6IGV2ZXJ5IGBwbHVnaW5zYCByb3cnc1xuICogZGlnZXN0IChhY3RpdmUsIGluYWN0aXZlIG9yIHNvZnQtZGVsZXRlZCDigJQgYSB0b21ic3RvbmUgaXMgcmVzdG9yYWJsZSB1bnRpbFxuICogcHVyZ2VkLCBhbmQgdGhlIHB1cmdlIGl0c2VsZiBpcyBndWFyZGVkKSBwbHVzIGV2ZXJ5IGRpZ2VzdCBhIHBpcGVsaW5lIG9mIHRoZVxuICogb3JnIG9yIGl0cyB0ZWFtcyBkZWNsYXJlcywgcnVucyBvciBoYXMgYW4gb3BlbiBkZXBsb3llZCBleHBvc3VyZSBvbi4gV2hhdCB0aGVcbiAqIGltYWdlIHJlZ2lzdHJ5J3MgYWdlIEdDIGNvbnN1bHRzIGJlZm9yZSBkZWxldGluZyBhbnl0aGluZyBpbiBgb3JnLTxpZD4vKmAuXG4gKiBFbGV2YXRlZCByZWFkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3JnSW1hZ2VEaWdlc3RzSW5Vc2Uob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgb3JnID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IGV4ZWN1dGVSb3dzPHsgZDogc3RyaW5nIH0+KHR4LCBzcWxgXG4gICAgU0VMRUNUIERJU1RJTkNUIGQgRlJPTSAoXG4gICAgICBTRUxFQ1QgaW1hZ2VfZGlnZXN0IEFTIGQgRlJPTSBwbHVnaW5zIFdIRVJFIGxvd2VyKG9yZ19pZCkgPSAke29yZ30gQU5EIGltYWdlX2RpZ2VzdCBJUyBOT1QgTlVMTFxuICAgICAgVU5JT04gU0VMRUNUIHIucmVzb2x2ZWRfZGlnZXN0IEZST00gcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb24gclxuICAgICAgICAgICAgICBXSEVSRSByLnJlc29sdmVkX2RpZ2VzdCBJUyBOT1QgTlVMTCBBTkQgKGxvd2VyKHIub3JnX2lkKSA9ICR7b3JnfSBPUiBsb3dlcihyLnJvb3Rfb3JnX2lkKSA9ICR7b3JnfSlcbiAgICAgIFVOSU9OIFNFTEVDVCBtLmltYWdlX2RpZ2VzdCBGUk9NIHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzIG1cbiAgICAgICAgICAgICAgV0hFUkUgbS5pbWFnZV9kaWdlc3QgSVMgTk9UIE5VTEwgQU5EIG0uaW1hZ2VfZGlnZXN0IElOIChTRUxFQ1QgaW1hZ2VfZGlnZXN0IEZST00gcGx1Z2lucyBXSEVSRSBsb3dlcihvcmdfaWQpID0gJHtvcmd9IEFORCBpbWFnZV9kaWdlc3QgSVMgTk9UIE5VTEwpXG4gICAgICBVTklPTiBTRUxFQ1QgbS5pbWFnZV9kaWdlc3QgRlJPTSBwaXBlbGluZV9zdGVwX21hbmlmZXN0cyBtIFdIRVJFIG0uaW1hZ2VfZGlnZXN0IElTIE5PVCBOVUxMIEFORCBsb3dlcihtLm9yZ19pZCkgPSAke29yZ31cbiAgICAgIFVOSU9OIFNFTEVDVCBlLmltYWdlX2RpZ2VzdCBGUk9NIHBsdWdpbl92dWxuX2V4cG9zdXJlIGVcbiAgICAgICAgICAgICAgV0hFUkUgZS5pbWFnZV9kaWdlc3QgSVMgTk9UIE5VTEwgQU5EIGUuc291cmNlID0gJ2RlcGxveWVkJyBBTkQgZS5maXhlZF9hdCBJUyBOVUxMIEFORCBsb3dlcihlLm9yZ19pZCkgPSAke29yZ31cbiAgICApIHggV0hFUkUgZCBJUyBOT1QgTlVMTFxuICBgKSk7XG4gIHJldHVybiByb3dzLm1hcCgocikgPT4gci5kKTtcbn1cbiJdfQ==
|
|
@@ -117,9 +117,9 @@ export interface PluginFilter extends CommonFilter {
|
|
|
117
117
|
/** Exclude yanked versions (resolution without a version spec). Internal. */
|
|
118
118
|
readonly excludeYanked?: boolean;
|
|
119
119
|
/**
|
|
120
|
-
* Exclude versions the nightly rescan flagged (`scan_flagged_at` set) —
|
|
121
|
-
*
|
|
122
|
-
*
|
|
120
|
+
* Exclude versions the nightly rescan flagged (`scan_flagged_at` set) — the
|
|
121
|
+
* lookup's "newest unflagged version to move to" suggestion. Never applied to
|
|
122
|
+
* what a reference RESOLVES to: vulnerability state does not skip versions. Internal.
|
|
123
123
|
*/
|
|
124
124
|
readonly excludeScanFlagged?: boolean;
|
|
125
125
|
/**
|
|
@@ -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/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBsdWdpbi1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBsdWdpbkZpbHRlciA9IHtcbiAqICAgbmFtZTogJ25vZGVqcy1idWlsZCcsXG4gKiAgIHZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGBuYW1lYCBtYXRjaGVzOiBgY29udGFpbnNgIChkZWZhdWx0IOKAlCBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZywgZm9yXG4gICAqIGxpc3Qvc2VhcmNoKSBvciBgZXhhY3RgIChyZXNvbHV0aW9uIOKAlCB0aGUgbG9va3VwIHBhdGgpLiBJbnRlcm5hbDogbm90IGluXG4gICAqIHRoZSBwdWJsaWMgZmlsdGVyIHNjaGVtYS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVNYXRjaD86ICdleGFjdCcgfCAnY29udGFpbnMnO1xuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXIgaGFuZGxlIG9mIGFuIGluc3RhbGxlZCBsaXN0aW5nIHRvIHJlc29sdmUgdGhyb3VnaC5cbiAgICogTG9va3VwIG9ubHk6IGEgYHBsdWdpbnNgIHJvdyBxdWVyeSBpZ25vcmVzIGl0ICh0aGUgcmVzb2x2ZXIgcm91dGVzIGFcbiAgICogcXVhbGlmaWVkIHJlZmVyZW5jZSB0byB0aGUgbGlzdGluZywgbmV2ZXIgdG8gYW4gb3JnJ3Mgb3duIHJvd3MpLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gdmVyc2lvbiBzcGVjOiBleGFjdCAoYDEuMi4zYCksIGNhcmV0IChgXjEuMi4zYCksIHRpbGRlIChgfjEuMi4zYCksXG4gICAqIHBhcnRpYWwgKGAxYCwgYDEuMmAsIGAxLnhgKSBvciBgbGF0ZXN0YCDigJQgc2VlIHNlbXZlci1yYW5nZS50cy4gQSByYW5nZSBuZXZlclxuICAgKiBtYXRjaGVzIGEgeWFua2VkIHZlcnNpb24uXG4gICAqIEBleGFtcGxlIFwiMS4wLjBcIiwgXCJeMi4wLjBcIiwgXCJ+MS4yLjNcIiwgXCJsYXRlc3RcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKiogRXhjbHVkZSB5YW5rZWQgdmVyc2lvbnMgKHJlc29sdXRpb24gd2l0aG91dCBhIHZlcnNpb24gc3BlYykuIEludGVybmFsLiAqL1xuICByZWFkb25seSBleGNsdWRlWWFua2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhjbHVkZSB2ZXJzaW9ucyB0aGUgbmlnaHRseSByZXNjYW4gZmxhZ2dlZCAoYHNjYW5fZmxhZ2dlZF9hdGAgc2V0KSDigJRcbiAgICogcmVzb2x1dGlvbiBvZiBhIHJhbmdlIC8gdGhlIGRlZmF1bHQgd2hpbGUgYFBMVUdJTl9CTE9DS19PTl9ORVdfQ1JJVElDQUxgXG4gICAqIGlzIG9uLiBJbnRlcm5hbC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVTY2FuRmxhZ2dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEtleXdvcmQgdG8gc2VhcmNoIHdpdGhpbiB0aGUga2V5d29yZHMgSlNPTkIgYXJyYXkgKGNhc2UtaW5zZW5zaXRpdmUgY29udGFpbnMpXG4gICAqL1xuICByZWFkb25seSBrZXl3b3JkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gY2F0ZWdvcnkgdG8gZmlsdGVyIGJ5XG4gICAqIEBleGFtcGxlIFwibGFuZ3VhZ2VcIiwgXCJzZWN1cml0eVwiLCBcInRlc3RpbmdcIlxuICAgKi9cbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGlwZWxpbmUtc3BlY2lmaWMgcHJvcGVydGllcy5cbiAqIEV4dGVuZHMgQ29tbW9uRmlsdGVyIHRvIGluY2x1ZGUgcGlwZWxpbmUtcmVsYXRlZCBmaWx0ZXIgb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyOiBQaXBlbGluZUZpbHRlciA9IHtcbiAqICAgcHJvamVjdDogJ215LWFwcCcsXG4gKiAgIG9yZ2FuaXphdGlvbjogJ215LW9yZycsXG4gKiAgIHBpcGVsaW5lTmFtZTogJ215LXBpcGVsaW5lJyxcbiAqICAgaXNBY3RpdmU6IHRydWVcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBQcm9qZWN0IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXBlbGluZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdD86IHN0cmluZztcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXBlbGluZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZSBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXl3b3JkIHRvIHNlYXJjaCB3aXRoaW4gdGhlIGtleXdvcmRzIEpTT05CIGFycmF5IChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKVxuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZD86IHN0cmluZztcbn1cblxuLyoqIEZpbHRlciBpbnRlcmZhY2UgZm9yIHBpcGVsaW5lLXRlbXBsYXRlIHF1ZXJpZXMgKGdvbGRlbi1wYXRoIGNhdGFsb2cpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZVRlbXBsYXRlRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqIFRlbXBsYXRlIG5hbWUgKGNhc2UtaW5zZW5zaXRpdmUgY29udGFpbnMpLiAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgdG8gZmlsdGVyIGJ5IChlLmcuICdsYW5ndWFnZScsICdnZW5lcmFsJykuICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xuICAvKiogS2V5d29yZCBzZWFyY2ggd2l0aGluIHRoZSBrZXl3b3JkcyBKU09OQiBhcnJheS4gKi9cbiAgcmVhZG9ubHkga2V5d29yZD86IHN0cmluZztcbiAgLy8gU2hhcmluZyBydW5nICsgdmlld2VyIGNvbnRleHQgYXJlIGluaGVyaXRlZCBmcm9tIENvbW1vbkZpbHRlci5cbn1cblxuLyoqXG4gKiBGaWx0ZXIgaW50ZXJmYWNlIGZvciBtZXNzYWdlLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIG1lc3NhZ2UtcmVsYXRlZCBmaWx0ZXIgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFRocmVhZCBJRCB0byBmaWx0ZXIgYnkgKGZvciBmZXRjaGluZyB0aHJlYWQgcmVwbGllcykuXG4gICAqIFBhc3MgYG51bGxgIHRvIGZpbHRlciBmb3Igcm9vdCBtZXNzYWdlcyBvbmx5ICh0aHJlYWRJZCBJUyBOVUxMKS5cbiAgICovXG4gIHJlYWRvbmx5IHRocmVhZElkPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogUmVjaXBpZW50IG9yZ2FuaXphdGlvbiBJRCB0byBmaWx0ZXIgYnlcbiAgICogVXNlICcqJyBmb3IgYnJvYWRjYXN0IGFubm91bmNlbWVudHNcbiAgICovXG4gIHJlYWRvbmx5IHJlY2lwaWVudE9yZ0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWNpcGllbnQgdXNlciBJRCB0byBmaWx0ZXIgYnkgKHBlci11c2VyIHRhcmdldGluZyB3aXRoaW4gdGhlIHJlY2lwaWVudFxuICAgKiBvcmcpLiBQYXNzIGBudWxsYCB0byBtYXRjaCBvcmctd2lkZSBtZXNzYWdlcyBvbmx5IChyZWNpcGllbnRfdXNlcl9pZCBJU1xuICAgKiBOVUxMKS4gUmFyZWx5IHNldCBkaXJlY3RseSBieSBjYWxsZXJzIOKAlCBzZWUgYHZpZXdlclVzZXJJZGAgZm9yIHRoZVxuICAgKiB2aXNpYmlsaXR5LXNjb3BpbmcgdmFyaWFudC5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2lwaWVudFVzZXJJZD86IHN0cmluZyB8IG51bGw7XG5cbiAgLy8gTk9URTogdGhlIFZJRVdFUidzIHVzZXIgaWQgKGB2aWV3ZXJVc2VySWRgKSBpcyBpbmhlcml0ZWQgZnJvbSBDb21tb25GaWx0ZXIuXG4gIC8vIEZvciBtZXNzYWdlcyBpdCBpcyBOT1QgYSBjb2x1bW4gZmlsdGVyOiB3aGVuIHByZXNlbnQsIHRoZSByZWNpcGllbnQtc2lkZVxuICAvLyBicmFuY2ggaW4gYGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnNgIHdpZGVucyB0byBpbmNsdWRlIHJvd3MgdGFyZ2V0ZWQgYXQgdGhpc1xuICAvLyB1c2VyIChyZWNpcGllbnRfdXNlcl9pZCA9IHZpZXdlclVzZXJJZCkgQUxPTkdTSURFIG9yZy13aWRlIG9uZXNcbiAgLy8gKHJlY2lwaWVudF91c2VyX2lkIElTIE5VTEwpLiBXaGVuIGFic2VudCwgb25seSBvcmctd2lkZSByZWNpcGllbnQgcm93cyBhcmVcbiAgLy8gdmlzaWJsZSwgc28gYSB1c2VyLXRhcmdldGVkIG1lc3NhZ2Ugc3RheXMgcHJpdmF0ZSB0byBpdHMgdGFyZ2V0LCB0aGUgc2VuZGVyLFxuICAvLyBhbmQgdGhlIHN5c3RlbSBvcmcuIE1lc3NhZ2VTZXJ2aWNlIHN0YW1wcyBpdCBmcm9tIHRoZSB0ZW5hbnQgY29udGV4dC5cblxuICAvKipcbiAgICogTWVzc2FnZSB0eXBlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZVR5cGU/OiAnYW5ub3VuY2VtZW50JyB8ICdjb252ZXJzYXRpb24nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgcHJpb3JpdHkgbGV2ZWxcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5PzogJ25vcm1hbCcgfCAnaGlnaCcgfCAndXJnZW50JztcblxuICAvKipcbiAgICogQ2hhbm5lbC9pbmJveC1idWNrZXQgZmlsdGVyIChlLmcuICdzdXBwb3J0JywgJ2hlbHAnKS4gTWF0Y2hlcyByb3dzXG4gICAqIGV4YWN0bHk7IHBhc3MgbnVsbCB0byBtYXRjaCBjaGFubmVsIElTIE5VTEwgKG9yZy10by1vcmcgbWVzc2FnZXMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSByZWFkIHN0YXRlIGZvciB0aGUgcmVxdWVzdGluZyBvcmcuXG4gICAqIEltcGxlbWVudGVkIGFzIGEgSlNPTkIga2V5LWV4aXN0ZW5jZSBjaGVjayBhZ2FpbnN0IGBtZXNzYWdlcy5yZWFkX2J5YFxuICAgKiAoYSBgeyBbb3JnSWRdOiBpc29UaW1lc3RhbXAgfWAgbWFwKSwgdXNpbmcgdGhlIG9yZ0lkIHBhc3NlZCB0b1xuICAgKiBgYnVpbGRNZXNzYWdlQ29uZGl0aW9uc2AuXG4gICAqIC0gdHJ1ZSAg4oaSIG9ubHkgbWVzc2FnZXMgdGhlIG9yZyBoYXMgcmVhZCAob3JnSWQga2V5IGV4aXN0cyBpbiByZWFkX2J5KVxuICAgKiAtIGZhbHNlIOKGkiBvbmx5IG1lc3NhZ2VzIHRoZSBvcmcgaGFzIE5PVCByZWFkXG4gICAqIC0gdW5kZWZpbmVkIOKGkiBubyByZWFkLXN0YXRlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZWFkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRnJlZS10ZXh0IGluYm94IHNlYXJjaC4gQ2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgbWF0Y2ggYWdhaW5zdCB0aGVcbiAgICogbWVzc2FnZSBgc3ViamVjdGAgT1IgYGNvbnRlbnRgIChMSUtFIHdpbGRjYXJkcyBpbiB0aGUgdGVybSBhcmUgZXNjYXBlZCwgc28gYVxuICAgKiBsaXRlcmFsIGAlYC9gX2AgbWF0Y2hlcyBpdHNlbGYpLiBBcHBsaWVkIG9uIHRvcCBvZiB0aGUgdmlzaWJpbGl0eSBzY29wZSwgc29cbiAgICogaXQgbmV2ZXIgd2lkZW5zIHdoYXQgdGhlIGNhbGxlciBjYW4gc2VlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoPzogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21wbGlhbmNlIEZpbHRlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgcG9saWNpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVBvbGljeUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzVGVtcGxhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBydWxlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlUnVsZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBvbGljeUlkPzogc3RyaW5nO1xuICByZWFkb25seSB0YXJnZXQ/OiAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG4gIHJlYWRvbmx5IGZpZWxkPzogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eT86ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuICByZWFkb25seSBzY29wZT86ICdvcmcnIHwgJ3B1Ymxpc2hlZCc7XG4gIHJlYWRvbmx5IHRhZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgZXhlbXB0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bGVJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5VHlwZT86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgZW50aXR5SWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1cz86ICdwZW5kaW5nJyB8ICdhcHByb3ZlZCcgfCAncmVqZWN0ZWQnIHwgJ2V4cGlyZWQnO1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZpbHRlciBmb3IgY29tcGxpYW5jZSBhdWRpdCBsb2cgZW50cmllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGlhbmNlQXVkaXRGaWx0ZXIge1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuICByZWFkb25seSBhY3Rpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc3VsdD86ICdwYXNzJyB8ICd3YXJuJyB8ICdibG9jayc7XG4gIHJlYWRvbmx5IHNjYW5JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGF0ZUZyb20/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGVUbz86IHN0cmluZztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2Ugc2NhbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVNjYW5GaWx0ZXIge1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnIHwgJ2FsbCc7XG4gIHJlYWRvbmx5IHN0YXR1cz86ICdwZW5kaW5nJyB8ICdydW5uaW5nJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcbiAgcmVhZG9ubHkgdHJpZ2dlcmVkQnk/OiAnbWFudWFsJyB8ICdzY2hlZHVsZWQnIHwgJ3J1bGUtY2hhbmdlJyB8ICdydWxlLWRyeS1ydW4nO1xuICByZWFkb25seSBsaW1pdD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xufVxuIl19
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZmlsdGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3F1ZXJ5LWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFZpc2liaWxpdHkgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgaW50ZXJmYWNlIGNvbnRhaW5pbmcgY29tbW9uIGZpbHRlciBwcm9wZXJ0aWVzIHNoYXJlZCBhY3Jvc3MgYWxsIGVudGl0eSB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyOiBDb21tb25GaWx0ZXIgPSB7XG4gKiAgIGlkOiAnMTIzJyxcbiAqICAgb3JnSWQ6ICdteS1vcmcnLFxuICogICB2aXNpYmlsaXR5OiAncHVibGljJyxcbiAqICAgaXNEZWZhdWx0OiB0cnVlLFxuICogICBpc0FjdGl2ZTogdHJ1ZVxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVudGl0eVxuICAgKiBDYW4gYmUgYSBzaW5nbGUgSUQgb3IgYXJyYXkgb2YgSURzIGZvciBiYXRjaCBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLy8gLS0tIFZpZXdlciBjb250ZXh0IChzZXJ2ZXItc2V0LCBORVZFUiBjbGllbnQtc3VwcGxpZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBPbmx5IGVudGl0aWVzIHdob3NlIHZpc2liaWxpdHkgcHJlZGljYXRlIGhhcyBhIFBFUi1VU0VSIHJ1bmcgcmVhZCB0aGVzZSDigJRcbiAgLy8gcGlwZWxpbmUgdGVtcGxhdGVzIChgcHJpdmF0ZWAgaXMgYXV0aG9yLW9ubHkpIGFuZCBtZXNzYWdlcyAoYSBwZXItdXNlclxuICAvLyB0YXJnZXRlZCByb3cgaXMgdmlzaWJsZSBvbmx5IHRvIGl0cyB0YXJnZXQpLiBUaGVpciBzZXJ2aWNlcyBzdGFtcCB0aGVtIGZyb21cbiAgLy8gdGhlIHJlcXVlc3QncyBgVGVuYW50Q29udGV4dGAgdmlhIGB3aXRoVmlld2VyQ29udGV4dGAsIHNvIG5vIHJvdXRlIG9yIHF1ZXJ5XG4gIC8vIHN0cmluZyBjYW4gaW5qZWN0IHRoZW0uIEV2ZXJ5dGhpbmcgZWxzZSBpZ25vcmVzIHRoZW0uXG4gIC8vXG4gIC8vIEJvdGggZmFpbCBDTE9TRUQgd2hlbiBhYnNlbnQ6IG5vIHZpZXdlciBtZWFucyB0aGUgcGVyLXVzZXIgcnVuZyBtYXRjaGVzXG4gIC8vIE5PVEhJTkcsIG5ldmVyIGV2ZXJ5dGhpbmcuXG5cbiAgLyoqIENhbGxlcidzIHVzZXIgaWQsIG1hdGNoZWQgYWdhaW5zdCB0aGUgZW50aXR5J3MgcGVyLXVzZXIgY29sdW1uLiAqL1xuICByZWFkb25seSB2aWV3ZXJVc2VySWQ/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxsZXIgaXMgYSBwbGF0Zm9ybSBzdXBlci1hZG1pbiAoc2VlcyBldmVyeSBydW5nKS4gKi9cbiAgcmVhZG9ubHkgdmlld2VySXNTdXBlckFkbWluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgdG8gZmlsdGVyIGVudGl0aWVzIGJ5IG9yZ2FuaXphdGlvblxuICAgKiBDYW4gYmUgYSBzaW5nbGUgb3JnIElEIG9yIGFycmF5IGZvciBtdWx0aS1vcmcgZmlsdGVyaW5nXG4gICAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYXJyb3cgdG8gb25lIHJ1bmcgb2YgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIHNoYXJpbmcgbGFkZGVyLiBBcHBsaWVkIFdJVEhJTlxuICAgKiB3aGF0IHRoZSBjYWxsZXIgY2FuIGFscmVhZHkgc2VlIOKAlCBuZXZlciB3aWRlbnMgaXQuXG4gICAqIEBzZWUgVmlzaWJpbGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaWJpbGl0eT86IFZpc2liaWxpdHkgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBkZWZhdWx0IHN0YXR1c1xuICAgKiAtIHRydWU6IE9ubHkgZGVmYXVsdCBlbnRpdGllc1xuICAgKiAtIGZhbHNlOiBPbmx5IG5vbi1kZWZhdWx0IGVudGl0aWVzXG4gICAqIC0gdW5kZWZpbmVkOiBBbGwgZW50aXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhY3RpdmUvaW5hY3RpdmUgc3RhdHVzXG4gICAqIC0gdHJ1ZTogT25seSBhY3RpdmUgZW50aXRpZXNcbiAgICogLSBmYWxzZTogT25seSBpbmFjdGl2ZSBlbnRpdGllc1xuICAgKiAtIHVuZGVmaW5lZDogQWxsIGVudGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpc0FjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVyblxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDEwMDBcbiAgICovXG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVzdWx0cyB0byBza2lwIChmb3IgcGFnaW5hdGlvbilcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3J0IGZpZWxkIGFuZCBkaXJlY3Rpb25cbiAgICogQGV4YW1wbGUgXCJuYW1lOmFzY1wiLCBcImNyZWF0ZWRBdDpkZXNjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBjYXRhbG9nIG93bmVyIChkZXZlbG9wZXItcG9ydGFsIFwibXkgc2VydmljZXNcIiB2aWV3KS5cbiAgICogTWF0Y2hlcyB0aGUgZW50aXR5J3MgYG93bmVySWRgIGV4YWN0bHkgKGEgdXNlciBpZCBvciB0ZWFtIGlkKS5cbiAgICogT25seSBhcHBsaWVkIGJ5IGJ1aWxkZXJzIGZvciBlbnRpdGllcyB0aGF0IGNhcnJ5IGFuIG93bmVyIGNvbHVtblxuICAgKiAocGlwZWxpbmVzLCBwbHVnaW5zKTsgaWdub3JlZCBlbHNld2hlcmUuXG4gICAqL1xuICByZWFkb25seSBvd25lcklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbGlmZWN5Y2xlIHN0YWdlIChleHBlcmltZW50YWwgfCBwcm9kdWN0aW9uIHwgZGVwcmVjYXRlZCkuXG4gICAqIE9ubHkgYXBwbGllZCBieSBidWlsZGVycyBmb3IgZW50aXRpZXMgdGhhdCBjYXJyeSBhIGxpZmVjeWNsZSBjb2x1bW4uXG4gICAqL1xuICByZWFkb25seSBsaWZlY3ljbGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgcGx1Z2luLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBsdWdpbi1yZWxhdGVkIGZpbHRlciBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmaWx0ZXI6IFBsdWdpbkZpbHRlciA9IHtcbiAqICAgbmFtZTogJ25vZGVqcy1idWlsZCcsXG4gKiAgIHZlcnNpb246ICcxLjAuMCcsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRmlsdGVyIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHtcbiAgLyoqXG4gICAqIFBsdWdpbiBuYW1lIHRvIGZpbHRlciBieVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGBuYW1lYCBtYXRjaGVzOiBgY29udGFpbnNgIChkZWZhdWx0IOKAlCBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZywgZm9yXG4gICAqIGxpc3Qvc2VhcmNoKSBvciBgZXhhY3RgIChyZXNvbHV0aW9uIOKAlCB0aGUgbG9va3VwIHBhdGgpLiBJbnRlcm5hbDogbm90IGluXG4gICAqIHRoZSBwdWJsaWMgZmlsdGVyIHNjaGVtYS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVNYXRjaD86ICdleGFjdCcgfCAnY29udGFpbnMnO1xuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXIgaGFuZGxlIG9mIGFuIGluc3RhbGxlZCBsaXN0aW5nIHRvIHJlc29sdmUgdGhyb3VnaC5cbiAgICogTG9va3VwIG9ubHk6IGEgYHBsdWdpbnNgIHJvdyBxdWVyeSBpZ25vcmVzIGl0ICh0aGUgcmVzb2x2ZXIgcm91dGVzIGFcbiAgICogcXVhbGlmaWVkIHJlZmVyZW5jZSB0byB0aGUgbGlzdGluZywgbmV2ZXIgdG8gYW4gb3JnJ3Mgb3duIHJvd3MpLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbHVnaW4gdmVyc2lvbiBzcGVjOiBleGFjdCAoYDEuMi4zYCksIGNhcmV0IChgXjEuMi4zYCksIHRpbGRlIChgfjEuMi4zYCksXG4gICAqIHBhcnRpYWwgKGAxYCwgYDEuMmAsIGAxLnhgKSBvciBgbGF0ZXN0YCDigJQgc2VlIHNlbXZlci1yYW5nZS50cy4gQSByYW5nZSBuZXZlclxuICAgKiBtYXRjaGVzIGEgeWFua2VkIHZlcnNpb24uXG4gICAqIEBleGFtcGxlIFwiMS4wLjBcIiwgXCJeMi4wLjBcIiwgXCJ+MS4yLjNcIiwgXCJsYXRlc3RcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKiogRXhjbHVkZSB5YW5rZWQgdmVyc2lvbnMgKHJlc29sdXRpb24gd2l0aG91dCBhIHZlcnNpb24gc3BlYykuIEludGVybmFsLiAqL1xuICByZWFkb25seSBleGNsdWRlWWFua2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhjbHVkZSB2ZXJzaW9ucyB0aGUgbmlnaHRseSByZXNjYW4gZmxhZ2dlZCAoYHNjYW5fZmxhZ2dlZF9hdGAgc2V0KSDigJQgdGhlXG4gICAqIGxvb2t1cCdzIFwibmV3ZXN0IHVuZmxhZ2dlZCB2ZXJzaW9uIHRvIG1vdmUgdG9cIiBzdWdnZXN0aW9uLiBOZXZlciBhcHBsaWVkIHRvXG4gICAqIHdoYXQgYSByZWZlcmVuY2UgUkVTT0xWRVMgdG86IHZ1bG5lcmFiaWxpdHkgc3RhdGUgZG9lcyBub3Qgc2tpcCB2ZXJzaW9ucy4gSW50ZXJuYWwuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlU2NhbkZsYWdnZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBLZXl3b3JkIHRvIHNlYXJjaCB3aXRoaW4gdGhlIGtleXdvcmRzIEpTT05CIGFycmF5IChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKVxuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGx1Z2luIGNhdGVnb3J5IHRvIGZpbHRlciBieVxuICAgKiBAZXhhbXBsZSBcImxhbmd1YWdlXCIsIFwic2VjdXJpdHlcIiwgXCJ0ZXN0aW5nXCJcbiAgICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZpbHRlciBpbnRlcmZhY2UgZm9yIHBpcGVsaW5lLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gKiBFeHRlbmRzIENvbW1vbkZpbHRlciB0byBpbmNsdWRlIHBpcGVsaW5lLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpbHRlcjogUGlwZWxpbmVGaWx0ZXIgPSB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBwaXBlbGluZU5hbWU6ICdteS1waXBlbGluZScsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICAvKipcbiAgICogUHJvamVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9yZ2FuaXphdGlvbiBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGlwZWxpbmUgbmFtZSB0byBmaWx0ZXIgYnlcbiAgICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5d29yZCB0byBzZWFyY2ggd2l0aGluIHRoZSBrZXl3b3JkcyBKU09OQiBhcnJheSAoY2FzZS1pbnNlbnNpdGl2ZSBjb250YWlucylcbiAgICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG59XG5cbi8qKiBGaWx0ZXIgaW50ZXJmYWNlIGZvciBwaXBlbGluZS10ZW1wbGF0ZSBxdWVyaWVzIChnb2xkZW4tcGF0aCBjYXRhbG9nKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVUZW1wbGF0ZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKiBUZW1wbGF0ZSBuYW1lIChjYXNlLWluc2Vuc2l0aXZlIGNvbnRhaW5zKS4gKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqIENhdGVnb3J5IHRvIGZpbHRlciBieSAoZS5nLiAnbGFuZ3VhZ2UnLCAnZ2VuZXJhbCcpLiAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIEtleXdvcmQgc2VhcmNoIHdpdGhpbiB0aGUga2V5d29yZHMgSlNPTkIgYXJyYXkuICovXG4gIHJlYWRvbmx5IGtleXdvcmQ/OiBzdHJpbmc7XG4gIC8vIFNoYXJpbmcgcnVuZyArIHZpZXdlciBjb250ZXh0IGFyZSBpbmhlcml0ZWQgZnJvbSBDb21tb25GaWx0ZXIuXG59XG5cbi8qKlxuICogRmlsdGVyIGludGVyZmFjZSBmb3IgbWVzc2FnZS1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogRXh0ZW5kcyBDb21tb25GaWx0ZXIgdG8gaW5jbHVkZSBtZXNzYWdlLXJlbGF0ZWQgZmlsdGVyIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUZpbHRlciBleHRlbmRzIENvbW1vbkZpbHRlciB7XG4gIC8qKlxuICAgKiBUaHJlYWQgSUQgdG8gZmlsdGVyIGJ5IChmb3IgZmV0Y2hpbmcgdGhyZWFkIHJlcGxpZXMpLlxuICAgKiBQYXNzIGBudWxsYCB0byBmaWx0ZXIgZm9yIHJvb3QgbWVzc2FnZXMgb25seSAodGhyZWFkSWQgSVMgTlVMTCkuXG4gICAqL1xuICByZWFkb25seSB0aHJlYWRJZD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFJlY2lwaWVudCBvcmdhbml6YXRpb24gSUQgdG8gZmlsdGVyIGJ5XG4gICAqIFVzZSAnKicgZm9yIGJyb2FkY2FzdCBhbm5vdW5jZW1lbnRzXG4gICAqL1xuICByZWFkb25seSByZWNpcGllbnRPcmdJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVjaXBpZW50IHVzZXIgSUQgdG8gZmlsdGVyIGJ5IChwZXItdXNlciB0YXJnZXRpbmcgd2l0aGluIHRoZSByZWNpcGllbnRcbiAgICogb3JnKS4gUGFzcyBgbnVsbGAgdG8gbWF0Y2ggb3JnLXdpZGUgbWVzc2FnZXMgb25seSAocmVjaXBpZW50X3VzZXJfaWQgSVNcbiAgICogTlVMTCkuIFJhcmVseSBzZXQgZGlyZWN0bHkgYnkgY2FsbGVycyDigJQgc2VlIGB2aWV3ZXJVc2VySWRgIGZvciB0aGVcbiAgICogdmlzaWJpbGl0eS1zY29waW5nIHZhcmlhbnQuXG4gICAqL1xuICByZWFkb25seSByZWNpcGllbnRVc2VySWQ/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8vIE5PVEU6IHRoZSBWSUVXRVIncyB1c2VyIGlkIChgdmlld2VyVXNlcklkYCkgaXMgaW5oZXJpdGVkIGZyb20gQ29tbW9uRmlsdGVyLlxuICAvLyBGb3IgbWVzc2FnZXMgaXQgaXMgTk9UIGEgY29sdW1uIGZpbHRlcjogd2hlbiBwcmVzZW50LCB0aGUgcmVjaXBpZW50LXNpZGVcbiAgLy8gYnJhbmNoIGluIGBidWlsZE1lc3NhZ2VDb25kaXRpb25zYCB3aWRlbnMgdG8gaW5jbHVkZSByb3dzIHRhcmdldGVkIGF0IHRoaXNcbiAgLy8gdXNlciAocmVjaXBpZW50X3VzZXJfaWQgPSB2aWV3ZXJVc2VySWQpIEFMT05HU0lERSBvcmctd2lkZSBvbmVzXG4gIC8vIChyZWNpcGllbnRfdXNlcl9pZCBJUyBOVUxMKS4gV2hlbiBhYnNlbnQsIG9ubHkgb3JnLXdpZGUgcmVjaXBpZW50IHJvd3MgYXJlXG4gIC8vIHZpc2libGUsIHNvIGEgdXNlci10YXJnZXRlZCBtZXNzYWdlIHN0YXlzIHByaXZhdGUgdG8gaXRzIHRhcmdldCwgdGhlIHNlbmRlcixcbiAgLy8gYW5kIHRoZSBzeXN0ZW0gb3JnLiBNZXNzYWdlU2VydmljZSBzdGFtcHMgaXQgZnJvbSB0aGUgdGVuYW50IGNvbnRleHQuXG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgdHlwZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2VUeXBlPzogJ2Fubm91bmNlbWVudCcgfCAnY29udmVyc2F0aW9uJztcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IHByaW9yaXR5IGxldmVsXG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86ICdub3JtYWwnIHwgJ2hpZ2gnIHwgJ3VyZ2VudCc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwvaW5ib3gtYnVja2V0IGZpbHRlciAoZS5nLiAnc3VwcG9ydCcsICdoZWxwJykuIE1hdGNoZXMgcm93c1xuICAgKiBleGFjdGx5OyBwYXNzIG51bGwgdG8gbWF0Y2ggY2hhbm5lbCBJUyBOVUxMIChvcmctdG8tb3JnIG1lc3NhZ2VzKS5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWw/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgcmVhZCBzdGF0ZSBmb3IgdGhlIHJlcXVlc3Rpbmcgb3JnLlxuICAgKiBJbXBsZW1lbnRlZCBhcyBhIEpTT05CIGtleS1leGlzdGVuY2UgY2hlY2sgYWdhaW5zdCBgbWVzc2FnZXMucmVhZF9ieWBcbiAgICogKGEgYHsgW29yZ0lkXTogaXNvVGltZXN0YW1wIH1gIG1hcCksIHVzaW5nIHRoZSBvcmdJZCBwYXNzZWQgdG9cbiAgICogYGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnNgLlxuICAgKiAtIHRydWUgIOKGkiBvbmx5IG1lc3NhZ2VzIHRoZSBvcmcgaGFzIHJlYWQgKG9yZ0lkIGtleSBleGlzdHMgaW4gcmVhZF9ieSlcbiAgICogLSBmYWxzZSDihpIgb25seSBtZXNzYWdlcyB0aGUgb3JnIGhhcyBOT1QgcmVhZFxuICAgKiAtIHVuZGVmaW5lZCDihpIgbm8gcmVhZC1zdGF0ZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGlzUmVhZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZyZWUtdGV4dCBpbmJveCBzZWFyY2guIENhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG1hdGNoIGFnYWluc3QgdGhlXG4gICAqIG1lc3NhZ2UgYHN1YmplY3RgIE9SIGBjb250ZW50YCAoTElLRSB3aWxkY2FyZHMgaW4gdGhlIHRlcm0gYXJlIGVzY2FwZWQsIHNvIGFcbiAgICogbGl0ZXJhbCBgJWAvYF9gIG1hdGNoZXMgaXRzZWxmKS4gQXBwbGllZCBvbiB0b3Agb2YgdGhlIHZpc2liaWxpdHkgc2NvcGUsIHNvXG4gICAqIGl0IG5ldmVyIHdpZGVucyB3aGF0IHRoZSBjYWxsZXIgY2FuIHNlZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaD86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBGaWx0ZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHBvbGljaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBpc1RlbXBsYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgcnVsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZVJ1bGVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwb2xpY3lJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0PzogJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuICByZWFkb25seSBmaWVsZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk/OiAnd2FybmluZycgfCAnZXJyb3InIHwgJ2NyaXRpY2FsJztcbiAgcmVhZG9ubHkgc2NvcGU/OiAnb3JnJyB8ICdwdWJsaXNoZWQnO1xuICByZWFkb25seSB0YWc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIGV4ZW1wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlciB7XG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuICByZWFkb25seSBydWxlSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudGl0eVR5cGU/OiAncGx1Z2luJyB8ICdwaXBlbGluZSc7XG4gIHJlYWRvbmx5IGVudGl0eUlkPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM/OiAncGVuZGluZycgfCAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJyB8ICdleHBpcmVkJztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgZm9yIGNvbXBsaWFuY2UgYXVkaXQgbG9nIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJztcbiAgcmVhZG9ubHkgYWN0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSByZXN1bHQ/OiAncGFzcycgfCAnd2FybicgfCAnYmxvY2snO1xuICByZWFkb25seSBzY2FuSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRhdGVGcm9tPzogc3RyaW5nO1xuICByZWFkb25seSBkYXRlVG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xuICByZWFkb25seSBvZmZzZXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRmlsdGVyIGZvciBjb21wbGlhbmNlIHNjYW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsaWFuY2VTY2FuRmlsdGVyIHtcbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldD86ICdwbHVnaW4nIHwgJ3BpcGVsaW5lJyB8ICdhbGwnO1xuICByZWFkb25seSBzdGF0dXM/OiAncGVuZGluZycgfCAncnVubmluZycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG4gIHJlYWRvbmx5IHRyaWdnZXJlZEJ5PzogJ21hbnVhbCcgfCAnc2NoZWR1bGVkJyB8ICdydWxlLWNoYW5nZScgfCAncnVsZS1kcnktcnVuJztcbiAgcmVhZG9ubHkgbGltaXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mZnNldD86IG51bWJlcjtcbn1cbiJdfQ==
|