@pipeline-builder/api-core 5.2.5 → 5.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/constants/ai-providers.js +1 -1
- package/lib/constants/http-status.js +1 -1
- package/lib/constants/index.js +1 -1
- package/lib/constants/time.js +1 -1
- package/lib/errors/app-errors.js +1 -1
- package/lib/errors/index.js +1 -1
- package/lib/helpers/access-helpers.d.ts +19 -0
- package/lib/helpers/access-helpers.js +24 -4
- package/lib/helpers/content-disposition.js +1 -1
- package/lib/helpers/crud-helpers.js +1 -1
- package/lib/helpers/index.d.ts +1 -1
- package/lib/helpers/index.js +2 -2
- package/lib/helpers/org-hierarchy-http.js +1 -1
- package/lib/helpers/org-hierarchy.js +1 -1
- package/lib/helpers/restore-helpers.js +1 -1
- package/lib/helpers/sse-helpers.js +13 -2
- package/lib/helpers/support-calendar.js +1 -1
- package/lib/index.js +1 -1
- package/lib/middleware/ask-provenance.js +1 -1
- package/lib/middleware/assurance.js +1 -1
- package/lib/middleware/auth.js +1 -1
- package/lib/middleware/deferred-quota-check.js +1 -1
- package/lib/middleware/ecosystem-guard.js +1 -1
- package/lib/middleware/index.js +1 -1
- package/lib/middleware/jwt-verify.js +1 -1
- package/lib/middleware/mongo-sanitize.js +1 -1
- package/lib/middleware/on-behalf.js +1 -1
- package/lib/middleware/permission-gates.js +1 -1
- package/lib/middleware/quota-exempt-routes.js +1 -1
- package/lib/middleware/revocation.js +1 -1
- package/lib/middleware/route-table.js +16 -1
- package/lib/middleware/service-tokens.js +1 -1
- package/lib/middleware/step-up.js +1 -1
- package/lib/middleware/system-org.d.ts +18 -5
- package/lib/middleware/system-org.js +19 -6
- package/lib/openapi/extend-zod.js +1 -1
- package/lib/openapi/index.js +1 -1
- package/lib/openapi/registry.js +1 -1
- package/lib/openapi/routes/ask-routes.js +1 -1
- package/lib/openapi/routes/billing-routes.js +1 -1
- package/lib/openapi/routes/image-registry-routes.js +1 -1
- package/lib/openapi/routes/index.js +1 -1
- package/lib/openapi/routes/message-routes.js +1 -1
- package/lib/openapi/routes/pipeline-routes.js +1 -1
- package/lib/openapi/routes/pipeline-template-routes.js +1 -1
- package/lib/openapi/routes/plugin-routes.js +1 -1
- package/lib/openapi/routes/quota-routes.js +1 -1
- package/lib/openapi/schema-registry.js +1 -1
- package/lib/routes/health.js +1 -1
- package/lib/routes/index.js +1 -1
- package/lib/services/ai-call-weight.js +1 -1
- package/lib/services/alert-delivery.js +1 -1
- package/lib/services/api-key-exchange.js +1 -1
- package/lib/services/audit-context.js +1 -1
- package/lib/services/audit-spool.js +1 -1
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.js +1 -1
- package/lib/services/compliance-client.js +1 -1
- package/lib/services/compliance-event-subscriber.js +1 -1
- package/lib/services/durable-event-bus.js +1 -1
- package/lib/services/ecosystem-notify-client.d.ts +7 -1
- package/lib/services/ecosystem-notify-client.js +9 -3
- package/lib/services/entity-events.js +1 -1
- package/lib/services/env-redis.js +1 -1
- package/lib/services/http-client.js +19 -3
- package/lib/services/index.d.ts +1 -1
- package/lib/services/index.js +2 -2
- package/lib/services/jwks-cache.js +1 -1
- package/lib/services/leader-lock.js +1 -1
- package/lib/services/notification-channels.js +1 -1
- package/lib/services/org-ai-client.js +1 -1
- package/lib/services/pagerduty-inbound.js +1 -1
- package/lib/services/pagerduty.js +1 -1
- package/lib/services/quota-increment-batcher.js +1 -1
- package/lib/services/quota.js +1 -1
- package/lib/services/remote-audit-client.js +1 -1
- package/lib/services/retry-forever.js +1 -1
- package/lib/services/retry-strategy.js +1 -1
- package/lib/services/s3-client.js +1 -1
- package/lib/services/scheduler.js +1 -1
- package/lib/services/service-boot.js +1 -1
- package/lib/services/service-keys.js +2 -2
- package/lib/services/sse-ticket-store.js +1 -1
- package/lib/services/system-notification.js +1 -1
- package/lib/services/token-revocation.js +1 -1
- package/lib/services/version-vuln-policy.d.ts +11 -0
- package/lib/services/version-vuln-policy.js +33 -7
- package/lib/types/ai-catalog.js +1 -1
- package/lib/types/ask-proposals.d.ts +23 -0
- package/lib/types/ask-proposals.js +29 -1
- package/lib/types/audit-events.js +1 -1
- package/lib/types/build-catalog.d.ts +65 -0
- package/lib/types/build-catalog.js +95 -1
- package/lib/types/catalog-metadata.js +1 -1
- package/lib/types/common.js +1 -1
- package/lib/types/compliance-exemption.js +1 -1
- package/lib/types/ecosystem-notifications.d.ts +9 -0
- package/lib/types/ecosystem-notifications.js +15 -6
- package/lib/types/ecosystem.d.ts +1 -6
- package/lib/types/ecosystem.js +18 -5
- package/lib/types/error-codes.js +1 -1
- package/lib/types/feature-flags.d.ts +17 -1
- package/lib/types/feature-flags.js +1 -1
- package/lib/types/http.js +1 -1
- package/lib/types/index.d.ts +3 -3
- package/lib/types/index.js +4 -4
- package/lib/types/metadata-keys.js +1 -1
- package/lib/types/permissions.d.ts +60 -13
- package/lib/types/permissions.js +63 -14
- package/lib/types/pipeline-template.js +1 -1
- package/lib/types/pipeline.js +1 -1
- package/lib/types/plugin-catalog.js +1 -1
- package/lib/types/plugin-health.js +1 -1
- package/lib/types/plugin-scan.d.ts +69 -0
- package/lib/types/plugin-scan.js +77 -1
- package/lib/types/quota-catalog.js +15 -2
- package/lib/types/quota-tiers.d.ts +27 -160
- package/lib/types/quota-tiers.js +47 -255
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +9 -1
- package/lib/types/reserved-tags.js +1 -1
- package/lib/types/tier-limits.d.ts +210 -0
- package/lib/types/tier-limits.js +254 -0
- package/lib/types/usage-projection.js +1 -1
- package/lib/types/visibility.js +1 -1
- package/lib/types/wire-vocabulary.d.ts +7 -0
- package/lib/types/wire-vocabulary.js +7 -1
- package/lib/utils/alias-resolver.js +1 -1
- package/lib/utils/api-key.js +1 -1
- package/lib/utils/audit.js +1 -1
- package/lib/utils/aws-scrub.js +3 -3
- package/lib/utils/compliance-attributes.js +1 -1
- package/lib/utils/concurrency-gate.d.ts +98 -0
- package/lib/utils/concurrency-gate.js +110 -0
- package/lib/utils/concurrency.js +1 -1
- package/lib/utils/crash-handlers.js +1 -1
- package/lib/utils/date.js +1 -1
- package/lib/utils/dsse.js +1 -1
- package/lib/utils/env.d.ts +11 -0
- package/lib/utils/env.js +14 -1
- package/lib/utils/headers.js +1 -1
- package/lib/utils/identity.js +1 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +2 -1
- package/lib/utils/jwk.js +2 -2
- package/lib/utils/logger.js +1 -1
- package/lib/utils/metric-emitter.js +1 -1
- package/lib/utils/object.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/plugin-compliance.d.ts +9 -1
- package/lib/utils/plugin-compliance.js +1 -1
- package/lib/utils/proof-of-work.js +1 -1
- package/lib/utils/response.js +1 -1
- package/lib/utils/retention.js +1 -1
- package/lib/utils/safe-require.js +1 -1
- package/lib/utils/secret-encryption.js +1 -1
- package/lib/utils/secret-rotation.js +1 -1
- package/lib/utils/secure-compare.js +1 -1
- package/lib/utils/sensitive-patterns.js +1 -1
- package/lib/utils/service-registry.js +1 -1
- package/lib/utils/ssrf.js +1 -1
- package/lib/validation/ai-schemas.js +1 -1
- package/lib/validation/common-schemas.js +1 -1
- package/lib/validation/dockerfile-static.js +1 -1
- package/lib/validation/index.d.ts +1 -1
- package/lib/validation/index.js +2 -2
- package/lib/validation/message-schemas.d.ts +73 -0
- package/lib/validation/message-schemas.js +63 -2
- package/lib/validation/middleware.js +1 -1
- package/lib/validation/pipeline-schemas.js +1 -1
- package/lib/validation/pipeline-template-schemas.js +1 -1
- package/lib/validation/plugin-base-images.js +1 -1
- package/lib/validation/plugin-catalog-detect.js +1 -1
- package/lib/validation/plugin-catalog-metadata.js +1 -1
- package/lib/validation/plugin-heuristics.js +1 -1
- package/lib/validation/plugin-lint.js +1 -1
- package/lib/validation/plugin-name-confusable.js +1 -1
- package/lib/validation/plugin-schemas.js +1 -1
- package/lib/validation/plugin-spec-schema.js +1 -1
- package/lib/validation/plugin-template-contract.js +1 -1
- package/package.json +11 -4
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
import { createComplianceClient } from './compliance-client.js';
|
|
30
30
|
import { getServiceAuthHeader } from '../middleware/service-tokens.js';
|
|
31
31
|
import { isSystemOrgId } from '../middleware/system-org.js';
|
|
32
|
-
import { asScanFlag, describeFindings, failOnLabel, isGatedFinding, pluginVulnGateKev, scanFindingKey, } from '../types/plugin-scan.js';
|
|
32
|
+
import { applyVulnWaivers, asScanFlag, describeFindings, failOnLabel, isGatedFinding, pluginVulnGateKev, scanFindingKey, summaryContradicts, } from '../types/plugin-scan.js';
|
|
33
33
|
import { envInt } from '../utils/env.js';
|
|
34
34
|
import { derivePluginImageCompliance, pluginRunsOwnImage } from '../utils/plugin-compliance.js';
|
|
35
35
|
import { errorMessage } from '../utils/response.js';
|
|
@@ -104,8 +104,13 @@ export function scanWarnings(record, now = new Date()) {
|
|
|
104
104
|
export function versionScanFacts(record) {
|
|
105
105
|
const flag = record.scanFlaggedAt ? asScanFlag(record.scanFlag) : null;
|
|
106
106
|
const raw = summaryOf(record);
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
// CONTRADICTS, not describes — the permissive half of the pair, deliberately.
|
|
108
|
+
// A digest-less summary is the only findings this reader has; discarding it
|
|
109
|
+
// makes the warning quieter and the delete-safety refusal less informative,
|
|
110
|
+
// which is the wrong failure for a consumer-facing grade. The publish gate
|
|
111
|
+
// asks the strict question because ITS wrong failure is listing something
|
|
112
|
+
// unvetted. See the note on `summaryDescribes`.
|
|
113
|
+
const summary = raw && !summaryContradicts(raw, typeof record.imageDigest === 'string' ? record.imageDigest : null) ? raw : null;
|
|
109
114
|
const findings = summary && Array.isArray(summary.findings)
|
|
110
115
|
? summary.findings.filter((f) => f && typeof f.id === 'string').map((f) => ({ ...f, fixedIn: Array.isArray(f.fixedIn) ? f.fixedIn : [] }))
|
|
111
116
|
: (flag?.findings ?? []);
|
|
@@ -114,6 +119,15 @@ export function versionScanFacts(record) {
|
|
|
114
119
|
return {
|
|
115
120
|
flagged: flag !== null,
|
|
116
121
|
flag,
|
|
122
|
+
// NOT falling back to `record.vulnCriticalFixable`, though `highFixable`
|
|
123
|
+
// does fall back to its column one line down. The asymmetry is real and
|
|
124
|
+
// predates this module's current shape; closing it here would raise
|
|
125
|
+
// VULN_CRITICAL_FIXABLE for every record that has the column set and no
|
|
126
|
+
// summary at all — a broad change to warning VOLUME, which is a product
|
|
127
|
+
// decision rather than a consequence of tightening the digest check above.
|
|
128
|
+
// The digest change only affects records whose summary names another image,
|
|
129
|
+
// and those fall back to the flag's findings exactly as a summary-less
|
|
130
|
+
// record always has.
|
|
117
131
|
criticalFixable: num(summary?.criticalFixable),
|
|
118
132
|
highFixable: num(summary?.highFixable) ?? num(record.vulnHighFixable),
|
|
119
133
|
critical: num(summary?.critical),
|
|
@@ -180,9 +194,21 @@ export async function assessVersionVulns(input) {
|
|
|
180
194
|
const gated = facts.findings.filter((f) => isGatedFinding(f, pluginVulnGateKev(), flag.failOn ?? 'critical'));
|
|
181
195
|
finding('VULN_FLAGGED', 'error', `${ref} is flagged: a rescan found ${flag.gated} gated ${failOnLabel(flag.failOn ?? 'critical')} finding${flag.gated === 1 ? '' : 's'} over the platform limit${flag.findings.length ? ` (fix: ${describeFindings(flag.findings)})` : ''}.`, gated.length > 0 ? gated : flag.findings, { plugin: record.name, version: record.version, gated: flag.gated, high: flag.high });
|
|
182
196
|
}
|
|
183
|
-
else
|
|
184
|
-
|
|
185
|
-
|
|
197
|
+
else {
|
|
198
|
+
// WAIVER-AWARE, which this branch could not be until the record carried its
|
|
199
|
+
// owner. Derived from the findings when they can carry the answer — the
|
|
200
|
+
// same rule `gatedFindingCount` applies — and from the raw column when they
|
|
201
|
+
// cannot (truncated, or none itemized), which keeps the warning rather than
|
|
202
|
+
// losing it. A waiver silences the warning only where it already silences
|
|
203
|
+
// the build floor and the publish gate.
|
|
204
|
+
const waivedKeys = new Set(applyVulnWaivers(record.name, facts.findings, undefined, now, record.ownerOrgId ?? undefined, record.version)
|
|
205
|
+
.waived.map(scanFindingKey));
|
|
206
|
+
const crits = facts.findings.filter((f) => f.severity === 'critical' && f.fixedIn.length > 0 && !waivedKeys.has(scanFindingKey(f)));
|
|
207
|
+
const derivable = !facts.truncated && facts.findings.length > 0;
|
|
208
|
+
const criticalFixable = derivable ? crits.length : (facts.criticalFixable ?? 0);
|
|
209
|
+
if (criticalFixable > 0) {
|
|
210
|
+
finding('VULN_CRITICAL_FIXABLE', 'error', `${ref} has ${criticalFixable} fixable Critical finding${criticalFixable === 1 ? '' : 's'}${crits.length ? `: ${describeFindings(crits)}` : ''}.`, crits);
|
|
211
|
+
}
|
|
186
212
|
}
|
|
187
213
|
const highFixable = facts.highFixable ?? 0;
|
|
188
214
|
if (highFixable > 0) {
|
|
@@ -239,4 +265,4 @@ async function complianceVulnWarnings(orgId, record) {
|
|
|
239
265
|
return [{ code: 'COMPLIANCE_UNAVAILABLE', severity: 'info', message: `Your organization's plugin vulnerability rules could not be checked for ${record.name}@${record.version} (${errorMessage(err)}).` }];
|
|
240
266
|
}
|
|
241
267
|
}
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi12dWxuLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy92ZXJzaW9uLXZ1bG4tcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFFSCxPQUFPLEVBQUUsc0JBQXNCLEVBQTRCLE1BQU0sd0JBQXdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFDTCxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEdBRTdGLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBd0QsTUFBTSwrQkFBK0IsQ0FBQztBQUN0SixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFcEQsNkNBQTZDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBR2pGLG9DQUFvQztBQUNwQyxNQUFNLFVBQVUsV0FBVyxDQUFDLENBQWUsRUFBRSxDQUFlO0lBQzFELE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBZSxF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RUFBRSxHQUFHLEVBQzFRLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEksQ0FBQztTQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RixPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLEdBQUcsR0FBRyxRQUFRLEtBQUssQ0FBQyxlQUFlLDRCQUE0QixLQUFLLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsTixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7SUFDM0MsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtB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LENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNoRCxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUN6RCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO1lBQ3BCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLElBQUk7U0FDTCxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2SCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSwyRUFBMkUsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3TSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRIRSB2dWxuZXJhYmlsaXR5IGFzc2Vzc21lbnQgb2Ygb25lIHJlc29sdmVkIHBsdWdpbiB2ZXJzaW9uLCBmb3Igb25lIG9yZyAoYW5kLFxuICogb3B0aW9uYWxseSwgb25lIHBpcGVsaW5lJ3MgcmlzayBhY2NlcHRhbmNlKS4gT25lIGZ1bmN0aW9uLCB0aHJlZSBjYWxsZXJzOlxuICogYC9wbHVnaW5zL2xvb2t1cGAgKHdoYXQgc3ludGggcGlucyksIGAvcGx1Z2lucy9ydW50aW1lLWNoZWNrYCAod2hhdCBhIHJ1bm5pbmdcbiAqIHBpcGVsaW5lIGlzIGFib3V0IHRvIGV4ZWN1dGUpIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZSdzIHNhdmUtdGltZSBjb250cmFjdFxuICogY2hlY2suIFRocmVlIGNvcGllcyBvZiB0aGVzZSBydWxlcyBkcmlmdGVkIG9uY2UgYWxyZWFkeS5cbiAqXG4gKiBWdWxuZXJhYmlsaXR5IHN0YXRlIE5FVkVSIHJlZnVzZXMgYSBwaXBlbGluZSDigJQgbm90IGl0cyBzYXZlLCBpdHMgc3ludGgsIGl0c1xuICogZGVwbG95IG9yIGl0cyBydW4uIFdoYXQgaXQgcHJvZHVjZXMgaXMgU0VWRVJJVFktR1JBREVEIHdhcm5pbmdzIChhbmQsIGZyb20gdGhlXG4gKiBjYWxsZXJzLCBub3RpZmljYXRpb25zIHRvIHRoZSBwaXBlbGluZSdzIG93bmVycykuIFRoZSBncmFkZXM6XG4gKlxuICogICBjcml0aWNhbCDigJQgYSBmaW5kaW5nIG9uIHRoZSBDSVNBIEtub3duIEV4cGxvaXRlZCBWdWxuZXJhYmlsaXRpZXMgbGlzdFxuICogICBlcnJvciAgICDigJQgdGhlIHZlcnNpb24gaXMgRkxBR0dFRCAoZ2F0ZWQgQ3JpdGljYWxzIG92ZXIgdGhlIHBsYXRmb3JtIGZsb29yKSxcbiAqICAgICAgICAgICAgICBpdCBoYXMgZml4YWJsZSBDcml0aWNhbCBmaW5kaW5ncywgb3IgYW4gb3JnIGNvbXBsaWFuY2UgcnVsZSBvbiB0aGVcbiAqICAgICAgICAgICAgICB2dWxuZXJhYmlsaXR5IGF0dHJpYnV0ZXMgaXMgaW4gQkxPQ0sgbW9kZSBhbmQgZmFpbHNcbiAqICAgd2FybmluZyAg4oCUIGZpeGFibGUgSGlnaCBmaW5kaW5ncyBvdmVyIHRoZSBvcmcncyBgd2FybkZpeGFibGVIaWdoYCwgYSB2ZXJzaW9uXG4gKiAgICAgICAgICAgICAgbmV2ZXIgc2Nhbm5lZCwgYSBzY2FuIG9sZGVyIHRoYW4gYFBMVUdJTl9TQ0FOX1NUQUxFX0hPVVJTYCwgb3IgYVxuICogICAgICAgICAgICAgIGNvbXBsaWFuY2UgcnVsZSBpbiBXQVJOIG1vZGVcbiAqICAgaW5mbyAgICAg4oCUIHdoYXQgYSByZWFkZXIgbWF5IHdhbnQgdG8ga25vdyBidXQgbmVlZCBub3QgYWN0IG9uXG4gKlxuICogQSBQSVBFTElORSdzIGFjdGl2ZSByaXNrIGFjY2VwdGFuY2UgKGBwbHVnaW5fdnVsbl9leHBvc3VyZWAsIHRyaWFnZWQgYGFjY2VwdGVkYFxuICogd2l0aCBhIHJlYXNvbiBhbmQgYW4gZXhwaXJ5KSBkb3duZ3JhZGVzIHRoZSB3YXJuaW5ncyBhYm91dCB0aGUgZmluZGluZ3MgaXRcbiAqIEFDQ0VQVEVEIHRvIGBpbmZvYCAoXCJhY2NlcHRlZCB1bnRpbCDigKZcIikg4oCUIG5ldmVyIG9uZSBhYm91dCBhIGZpbmRpbmcgdGhhdFxuICogYXBwZWFyZWQgc2luY2UsIG5ldmVyIGEgS0VWIG9uZSB1bmxlc3MgdGhlIGFjY2VwdGFuY2Ugc2FpZCBga2V2OiB0cnVlYCwgYW5kXG4gKiBuZXZlciB0aGUgc2Nhbi1mcmVzaG5lc3Mgb3IgY29tcGxpYW5jZSB3YXJuaW5ncyAobmVpdGhlciBpcyBhYm91dCBhIGZpbmRpbmcpLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQsIHR5cGUgQ29tcGxpYW5jZVZpb2xhdGlvbiB9IGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIgfSBmcm9tICcuLi9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB7IGlzU3lzdGVtT3JnSWQgfSBmcm9tICcuLi9taWRkbGV3YXJlL3N5c3RlbS1vcmcuanMnO1xuaW1wb3J0IHtcbiAgYXNTY2FuRmxhZywgZGVzY3JpYmVGaW5kaW5ncywgZmFpbE9uTGFiZWwsIGlzR2F0ZWRGaW5kaW5nLCBwbHVnaW5WdWxuR2F0ZUtldiwgc2NhbkZpbmRpbmdLZXksXG4gIHR5cGUgUGx1Z2luU2NhbkZpbmRpbmcsIHR5cGUgUGx1Z2luU2NhbkZsYWcsXG59IGZyb20gJy4uL3R5cGVzL3BsdWdpbi1zY2FuLmpzJztcbmltcG9ydCB7IGVudkludCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgeyBkZXJpdmVQbHVnaW5JbWFnZUNvbXBsaWFuY2UsIHBsdWdpblJ1bnNPd25JbWFnZSwgdHlwZSBQbHVnaW5Db21wbGlhbmNlQXR0cmlidXRlcywgdHlwZSBQbHVnaW5JbWFnZVJvdyB9IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1jb21wbGlhbmNlLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqIEhvdyBsb3VkIGEgd2FybmluZyBpcywgcXVpZXRlc3QgZmlyc3QuICovXG5leHBvcnQgY29uc3QgVlVMTl9TRVZFUklUSUVTID0gWydpbmZvJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnY3JpdGljYWwnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZ1bG5TZXZlcml0eSA9IHR5cGVvZiBWVUxOX1NFVkVSSVRJRVNbbnVtYmVyXTtcblxuLyoqIFRoZSBsb3VkZXIgb2YgdHdvIHNldmVyaXRpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4U2V2ZXJpdHkoYTogVnVsblNldmVyaXR5LCBiOiBWdWxuU2V2ZXJpdHkpOiBWdWxuU2V2ZXJpdHkge1xuICByZXR1cm4gVlVMTl9TRVZFUklUSUVTLmluZGV4T2YoYSkgPj0gVlVMTl9TRVZFUklUSUVTLmluZGV4T2YoYikgPyBhIDogYjtcbn1cblxuLyoqIFdoZXRoZXIgYHNgIGlzIGF0IGxlYXN0IGBmbG9vcmAuICovXG5leHBvcnQgZnVuY3Rpb24gc2V2ZXJpdHlBdExlYXN0KHM6IFZ1bG5TZXZlcml0eSwgZmxvb3I6IFZ1bG5TZXZlcml0eSk6IGJvb2xlYW4ge1xuICByZXR1cm4gVlVMTl9TRVZFUklUSUVTLmluZGV4T2YocykgPj0gVlVMTl9TRVZFUklUSUVTLmluZGV4T2YoZmxvb3IpO1xufVxuXG4vKiogYFBMVUdJTl9TQ0FOX1NUQUxFX0hPVVJTYCAoZGVmYXVsdCA3Mik6IGEgc2NhbiBvbGRlciB0aGFuIHRoaXMgaXMgc3RhbGUuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhblN0YWxlSG91cnMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudkludCgnUExVR0lOX1NDQU5fU1RBTEVfSE9VUlMnLCA3MiwgeyBtaW46IDEgfSk7XG59XG5cbi8qKiBUaGUgc2Nhbi1yZWxhdGVkIGZpZWxkcyBvZiBhIHJlc29sdmVkIHJlY29yZCAoYW4gb3JnIHJvdyBvciBhIGxpc3RlZCByZWNvcmQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FubmVkUmVjb3JkIGV4dGVuZHMgUGx1Z2luSW1hZ2VSb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgc2Nhbm5lZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIHNjYW5TdW1tYXJ5PzogdW5rbm93bjtcbiAgc2NhbkZsYWdnZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICBzY2FuRmxhZz86IHVua25vd247XG4gIHZ1bG5IaWdoRml4YWJsZT86IHVua25vd247XG59XG5cbmNvbnN0IHRvRGF0ZSA9ICh2OiB1bmtub3duKTogRGF0ZSB8IG51bGwgPT4ge1xuICBpZiAoIXYpIHJldHVybiBudWxsO1xuICBjb25zdCBkID0gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUoU3RyaW5nKHYpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZDtcbn07XG5cbmNvbnN0IHN1bW1hcnlPZiA9IChyZWNvcmQ6IFBpY2s8U2Nhbm5lZFJlY29yZCwgJ3NjYW5TdW1tYXJ5Jz4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgPT5cbiAgKHJlY29yZC5zY2FuU3VtbWFyeSAmJiB0eXBlb2YgcmVjb3JkLnNjYW5TdW1tYXJ5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZWNvcmQuc2NhblN1bW1hcnkpXG4gICAgPyByZWNvcmQuc2NhblN1bW1hcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiBudWxsKTtcblxuLyoqXG4gKiBXaGVuIHRoZSB2ZXJzaW9uIHdhcyBsYXN0IHNjYW5uZWQ6IHRoZSBsYXRlciBvZiB0aGUgYnVpbGQtdGltZSBgc2Nhbm5lZEF0YCBhbmRcbiAqIHRoZSBuaWdodGx5IHJlc2NhbidzIGBzY2FuX3N1bW1hcnkuc2Nhbm5lZEF0YC4gTnVsbCA9IG5ldmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFzdFNjYW5uZWRBdChyZWNvcmQ6IFBpY2s8U2Nhbm5lZFJlY29yZCwgJ3NjYW5uZWRBdCcgfCAnc2NhblN1bW1hcnknPik6IERhdGUgfCBudWxsIHtcbiAgY29uc3QgYnVpbGQgPSB0b0RhdGUocmVjb3JkLnNjYW5uZWRBdCk7XG4gIGNvbnN0IHN1bW1hcnkgPSB0b0RhdGUoc3VtbWFyeU9mKHJlY29yZCk/LnNjYW5uZWRBdCk7XG4gIGlmICghYnVpbGQpIHJldHVybiBzdW1tYXJ5O1xuICBpZiAoIXN1bW1hcnkpIHJldHVybiBidWlsZDtcbiAgcmV0dXJuIHN1bW1hcnkgPiBidWlsZCA/IHN1bW1hcnkgOiBidWlsZDtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlY29yZCBydW5zIGEgQlVJTFQgaW1hZ2Ugb2YgaXRzIG93biDigJQgdGhlIG9ubHkgdGhpbmcgYSBzY2FuIGFwcGxpZXMgdG8uICovXG5mdW5jdGlvbiBoYXNJbWFnZShyZWNvcmQ6IFNjYW5uZWRSZWNvcmQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBsdWdpblJ1bnNPd25JbWFnZShyZWNvcmQpICYmIHR5cGVvZiByZWNvcmQuaW1hZ2VEaWdlc3QgPT09ICdzdHJpbmcnICYmIHJlY29yZC5pbWFnZURpZ2VzdC5sZW5ndGggPiAwO1xufVxuXG4vKiogRnJlc2huZXNzIG9mIGEgdmVyc2lvbidzIHNjYW46IGBub25lYCAobm8gaW1hZ2UgdG8gc2NhbiksIGB1bnNjYW5uZWRgLCBgc3RhbGVgIG9yIGBmcmVzaGAuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbkZyZXNobmVzcyhyZWNvcmQ6IFNjYW5uZWRSZWNvcmQsIG5vdyA9IG5ldyBEYXRlKCkpOiB7IHN0YXRlOiAnbm9uZScgfCAndW5zY2FubmVkJyB8ICdzdGFsZScgfCAnZnJlc2gnOyBzY2FubmVkQXQ6IERhdGUgfCBudWxsIH0ge1xuICBpZiAoIWhhc0ltYWdlKHJlY29yZCkpIHJldHVybiB7IHN0YXRlOiAnbm9uZScsIHNjYW5uZWRBdDogbnVsbCB9O1xuICBjb25zdCBhdCA9IGxhc3RTY2FubmVkQXQocmVjb3JkKTtcbiAgaWYgKCFhdCkgcmV0dXJuIHsgc3RhdGU6ICd1bnNjYW5uZWQnLCBzY2FubmVkQXQ6IG51bGwgfTtcbiAgcmV0dXJuIHsgc3RhdGU6IG5vdy5nZXRUaW1lKCkgLSBhdC5nZXRUaW1lKCkgPiBzY2FuU3RhbGVIb3VycygpICogM182MDBfMDAwID8gJ3N0YWxlJyA6ICdmcmVzaCcsIHNjYW5uZWRBdDogYXQgfTtcbn1cblxuLyoqIE9uZSBzZXZlcml0eS1ncmFkZWQgdnVsbmVyYWJpbGl0eSB3YXJuaW5nLiAqL1xuZXhwb3J0IHR5cGUgVnVsbldhcm5pbmcgPVxuICB8IHtcbiAgICBjb2RlOiAnVlVMTl9LRVYnIHwgJ1ZVTE5fRkxBR0dFRCcgfCAnVlVMTl9DUklUSUNBTF9GSVhBQkxFJyB8ICdWVUxOX0hJR0hfRklYQUJMRSc7XG4gICAgc2V2ZXJpdHk6IFZ1bG5TZXZlcml0eTtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZmluZGluZ3M6IFBsdWdpblNjYW5GaW5kaW5nW107XG4gICAgc3VnZ2VzdGVkVmVyc2lvbj86IHN0cmluZztcbiAgICAvKiogYFZVTE5fRkxBR0dFRGAgY2FycmllcyB0aGUgZmxhZydzIGNvdW50cyAodGhlIHNoYXBlIHRoZSByZXNjYW4tZmxhZyB3YXJuaW5nIGFsd2F5cyBoYWQpLiAqL1xuICAgIHBsdWdpbj86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgZmxhZydzIGdhdGVkIGNvdW50IChmaW5kaW5ncyBhdCBvciBhYm92ZSBpdHMgYGZhaWxPbmApLiAqL1xuICAgIGdhdGVkPzogbnVtYmVyO1xuICAgIGhpZ2g/OiBudW1iZXI7XG4gIH1cbiAgfCB7IGNvZGU6ICdWVUxOX0FDQ0VQVEVEJzsgc2V2ZXJpdHk6ICdpbmZvJzsgbWVzc2FnZTogc3RyaW5nOyBmaW5kaW5nczogc3RyaW5nW107IGFjY2VwdGVkVW50aWw6IHN0cmluZyB8IG51bGw7IGtldjogYm9vbGVhbjsgY292ZXJzOiBzdHJpbmcgfVxuICB8IHsgY29kZTogJ1VOU0NBTk5FRCc7IHNldmVyaXR5OiBWdWxuU2V2ZXJpdHk7IG1lc3NhZ2U6IHN0cmluZyB9XG4gIHwgeyBjb2RlOiAnU0NBTl9TVEFMRSc7IHNldmVyaXR5OiBWdWxuU2V2ZXJpdHk7IG1lc3NhZ2U6IHN0cmluZzsgc2Nhbm5lZEF0OiBzdHJpbmc7IHN0YWxlQWZ0ZXJIb3VyczogbnVtYmVyIH1cbiAgfCB7IGNvZGU6ICdDT01QTElBTkNFX1ZVTE5fUlVMRSc7IHNldmVyaXR5OiBWdWxuU2V2ZXJpdHk7IG1lc3NhZ2U6IHN0cmluZzsgcnVsZUlkOiBzdHJpbmc7IHJ1bGVOYW1lOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG1vZGU6ICdibG9jaycgfCAnd2FybicgfVxuICB8IHsgY29kZTogJ0NPTVBMSUFOQ0VfVU5BVkFJTEFCTEUnOyBzZXZlcml0eTogVnVsblNldmVyaXR5OyBtZXNzYWdlOiBzdHJpbmcgfTtcblxuLyoqIGBVTlNDQU5ORURgIC8gYFNDQU5fU1RBTEVgIGZvciBhIHJlc29sdmVkIHZlcnNpb24gKGVtcHR5IGZvciBhIGZyZXNoIHNjYW4gb3IgYW4gaW1hZ2UtbGVzcyBwbHVnaW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYW5XYXJuaW5ncyhyZWNvcmQ6IFNjYW5uZWRSZWNvcmQsIG5vdyA9IG5ldyBEYXRlKCkpOiBWdWxuV2FybmluZ1tdIHtcbiAgY29uc3QgcmVmID0gYCR7cmVjb3JkLm5hbWV9QCR7cmVjb3JkLnZlcnNpb259YDtcbiAgY29uc3QgZiA9IHNjYW5GcmVzaG5lc3MocmVjb3JkLCBub3cpO1xuICBpZiAoZi5zdGF0ZSA9PT0gJ3Vuc2Nhbm5lZCcpIHtcbiAgICByZXR1cm4gW3sgY29kZTogJ1VOU0NBTk5FRCcsIHNldmVyaXR5OiAnd2FybmluZycsIG1lc3NhZ2U6IGBQbHVnaW4gJHtyZWZ9IGhhcyBuZXZlciBiZWVuIHNjYW5uZWQgZm9yIHZ1bG5lcmFiaWxpdGllczsgbm90aGluZyBpcyBrbm93biBhYm91dCB3aGF0IGl0cyBpbWFnZSBjb250YWlucy5gIH1dO1xuICB9XG4gIGlmIChmLnN0YXRlID09PSAnc3RhbGUnKSB7XG4gICAgY29uc3QgaG91cnMgPSBzY2FuU3RhbGVIb3VycygpO1xuICAgIHJldHVybiBbe1xuICAgICAgY29kZTogJ1NDQU5fU1RBTEUnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6IGBQbHVnaW4gJHtyZWZ9IHdhcyBsYXN0IHNjYW5uZWQgJHtmLnNjYW5uZWRBdCEudG9JU09TdHJpbmcoKX0sIG1vcmUgdGhhbiAke2hvdXJzfWggYWdvOyBmaW5kaW5ncyBwdWJsaXNoZWQgc2luY2UgYXJlIG5vdCByZWZsZWN0ZWQuYCxcbiAgICAgIHNjYW5uZWRBdDogZi5zY2FubmVkQXQhLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGFsZUFmdGVySG91cnM6IGhvdXJzLFxuICAgIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqIFRoZSB2dWxuZXJhYmlsaXR5IGZpZWxkcyBvZiBhbiBvcmcncyBjb25zdW1wdGlvbiBwb2xpY3kgKHBpcGVsaW5lLWRhdGEncyBgQ29uc3VtcHRpb25Qb2xpY3lgIHNhdGlzZmllcyBpdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5Db25zdW1wdGlvblBvbGljeSB7XG4gIC8qKiBGaXhhYmxlIEhpZ2ggZmluZGluZ3MgYWJvdmUgdGhpcyBtYW55IHJhaXNlIGEgYHdhcm5pbmdgOyBudWxsID0gbmV2ZXIgKHRoZXkgc3RheSBgaW5mb2ApLiAqL1xuICB3YXJuRml4YWJsZUhpZ2g6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogQSBwaXBlbGluZSdzIEFDVElWRSByaXNrIGFjY2VwdGFuY2Ugb2Ygb25lIHZlcnNpb24gLyBpbWFnZTogdGhlIGZpbmRpbmcga2V5c1xuICogKHtAbGluayBzY2FuRmluZGluZ0tleX0pIGl0IGFjY2VwdGVkLCB3aGV0aGVyIGl0IGFjY2VwdGVkIEtFViBmaW5kaW5ncywgYW5kXG4gKiB1bnRpbCB3aGVuLiBCdWlsdCBieSBwaXBlbGluZS1kYXRhIGZyb20gYHBsdWdpbl92dWxuX2V4cG9zdXJlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuQWNjZXB0YW5jZSB7XG4gIGZpbmRpbmdLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAga2V2OiBib29sZWFuO1xuICBhY2NlcHRlZFVudGlsOiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFdoYXQgYSB2ZXJzaW9uJ3Mgc3RvcmVkIHNjYW4gc2F5cywgbm9ybWFsaXplZCBmcm9tIGBzY2FuX3N1bW1hcnlgIChmb3IgaXRzIGltYWdlKSBhbmQgYHNjYW5fZmxhZ2AuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25TY2FuRmFjdHMge1xuICBmbGFnZ2VkOiBib29sZWFuO1xuICBmbGFnOiBQbHVnaW5TY2FuRmxhZyB8IG51bGw7XG4gIC8qKiBGaXhhYmxlIENyaXRpY2FsIC8gSGlnaCBmaW5kaW5ncyAobnVsbCA9IG5vdCBrbm93bikuICovXG4gIGNyaXRpY2FsRml4YWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgaGlnaEZpeGFibGU6IG51bWJlciB8IG51bGw7XG4gIC8qKiBUb3RhbHMgaW5jbHVkaW5nIHVuZml4YWJsZSBmaW5kaW5ncyAobnVsbCA9IG5vdCBrbm93bikuICovXG4gIGNyaXRpY2FsOiBudW1iZXIgfCBudWxsO1xuICBoaWdoOiBudW1iZXIgfCBudWxsO1xuICAvKiogS0VWLWxpc3RlZCBDcml0aWNhbCArIEhpZ2ggZmluZGluZ3MuICovXG4gIGtldjogbnVtYmVyO1xuICAvKiogRXZlcnkgQ3JpdGljYWwvSGlnaCBmaW5kaW5nIHRoZSBzY2FuIGl0ZW1pemVkICh0aGUgc3VtbWFyeSdzIGxpc3QsIGVsc2UgdGhlIGZsYWcncykuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogVGhlIHN1bW1hcnkgY3V0IGl0cyBmaW5kaW5ncyBsaXN0IOKAlCBhIHN1YnNldCBjaGVjayBvdmVyIGl0IGNhbm5vdCBiZSB0cnVzdGVkLiAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG4gIHNjYW5uZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKiBUaGUgbm9ybWFsaXplZCBzY2FuIGZhY3RzIG9mIGEgcmVzb2x2ZWQgcmVjb3JkLiBBIHN1bW1hcnkgZGVzY3JpYmluZyBhbm90aGVyIGltYWdlIGlzIGlnbm9yZWQuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvblNjYW5GYWN0cyhyZWNvcmQ6IFNjYW5uZWRSZWNvcmQpOiBWZXJzaW9uU2NhbkZhY3RzIHtcbiAgY29uc3QgZmxhZyA9IHJlY29yZC5zY2FuRmxhZ2dlZEF0ID8gYXNTY2FuRmxhZyhyZWNvcmQuc2NhbkZsYWcpIDogbnVsbDtcbiAgY29uc3QgcmF3ID0gc3VtbWFyeU9mKHJlY29yZCk7XG4gIGNvbnN0IGRpZ2VzdCA9IHR5cGVvZiByYXc/LmltYWdlRGlnZXN0ID09PSAnc3RyaW5nJyA/IHJhdy5pbWFnZURpZ2VzdCA6IG51bGw7XG4gIGNvbnN0IHN1bW1hcnkgPSByYXcgJiYgKGRpZ2VzdCA9PT0gbnVsbCB8fCAhcmVjb3JkLmltYWdlRGlnZXN0IHx8IGRpZ2VzdCA9PT0gcmVjb3JkLmltYWdlRGlnZXN0KSA/IHJhdyA6IG51bGw7XG4gIGNvbnN0IGZpbmRpbmdzID0gc3VtbWFyeSAmJiBBcnJheS5pc0FycmF5KHN1bW1hcnkuZmluZGluZ3MpXG4gICAgPyAoc3VtbWFyeS5maW5kaW5ncyBhcyBQbHVnaW5TY2FuRmluZGluZ1tdKS5maWx0ZXIoKGYpID0+IGYgJiYgdHlwZW9mIGYuaWQgPT09ICdzdHJpbmcnKS5tYXAoKGYpID0+ICh7IC4uLmYsIGZpeGVkSW46IEFycmF5LmlzQXJyYXkoZi5maXhlZEluKSA/IGYuZml4ZWRJbiA6IFtdIH0pKVxuICAgIDogKGZsYWc/LmZpbmRpbmdzID8/IFtdKTtcbiAgY29uc3QgbnVtID0gKHY6IHVua25vd24pOiBudW1iZXIgfCBudWxsID0+ICh0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogbnVsbCk7XG4gIGNvbnN0IGtldkNvdW50ID0gTWF0aC5tYXgobnVtKHN1bW1hcnk/LmtldikgPz8gMCwgZmxhZz8ua2V2ID8/IDAsIGZpbmRpbmdzLmZpbHRlcigoZikgPT4gZi5rZXYgPT09IHRydWUpLmxlbmd0aCk7XG4gIHJldHVybiB7XG4gICAgZmxhZ2dlZDogZmxhZyAhPT0gbnVsbCxcbiAgICBmbGFnLFxuICAgIGNyaXRpY2FsRml4YWJsZTogbnVtKHN1bW1hcnk/LmNyaXRpY2FsRml4YWJsZSksXG4gICAgaGlnaEZpeGFibGU6IG51bShzdW1tYXJ5Py5oaWdoRml4YWJsZSkgPz8gbnVtKHJlY29yZC52dWxuSGlnaEZpeGFibGUpLFxuICAgIGNyaXRpY2FsOiBudW0oc3VtbWFyeT8uY3JpdGljYWwpLFxuICAgIGhpZ2g6IG51bShzdW1tYXJ5Py5oaWdoKSxcbiAgICBrZXY6IGtldkNvdW50LFxuICAgIGZpbmRpbmdzLFxuICAgIHRydW5jYXRlZDogc3VtbWFyeT8udHJ1bmNhdGVkID09PSB0cnVlLFxuICAgIHNjYW5uZWRBdDogbGFzdFNjYW5uZWRBdChyZWNvcmQpLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYGFjY2VwdGFuY2VgIGNvdmVycyBFVkVSWSBvbmUgb2YgYGZpbmRpbmdzYCAoYnkgZmluZGluZyBrZXkpLCBhbmQgaXRzXG4gKiBLRVYgb25lcyBvbmx5IHdoZW4gaXQgYWNjZXB0ZWQgS0VWLiBBbiBlbXB0eSBzZXQgaXMgbmV2ZXIgXCJjb3ZlcmVkXCI6IHdpdGhcbiAqIG5vdGhpbmcgaXRlbWl6ZWQgdGhlcmUgaXMgbm90aGluZyBhbiBhY2NlcHRhbmNlIGNhbiBiZSBzaG93biB0byBkZXNjcmliZS5cbiAqL1xuZnVuY3Rpb24gY292ZXJzKGFjY2VwdGFuY2U6IFZ1bG5BY2NlcHRhbmNlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmluZGluZ3M6IHJlYWRvbmx5IFBsdWdpblNjYW5GaW5kaW5nW10sIHRydW5jYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoIWFjY2VwdGFuY2UgfHwgdHJ1bmNhdGVkIHx8IGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBrZXlzID0gbmV3IFNldChhY2NlcHRhbmNlLmZpbmRpbmdLZXlzKTtcbiAgcmV0dXJuIGZpbmRpbmdzLmV2ZXJ5KChmKSA9PiBrZXlzLmhhcyhzY2FuRmluZGluZ0tleShmKSkgJiYgKGYua2V2ICE9PSB0cnVlIHx8IGFjY2VwdGFuY2Uua2V2KSk7XG59XG5cbi8qKiBJbnB1dCB0byB7QGxpbmsgYXNzZXNzVmVyc2lvblZ1bG5zfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvblZ1bG5JbnB1dCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHJlY29yZDogU2Nhbm5lZFJlY29yZDtcbiAgcG9saWN5OiBWdWxuQ29uc3VtcHRpb25Qb2xpY3k7XG4gIC8qKiBUaGUgcGlwZWxpbmUncyBhY3RpdmUgYWNjZXB0YW5jZSBvZiB0aGlzIHZlcnNpb24gLyBpbWFnZSwgd2hlbiB0aGUgY2FsbGVyIGhhcyBhIHBpcGVsaW5lLiAqL1xuICBhY2NlcHRhbmNlPzogVnVsbkFjY2VwdGFuY2UgfCBudWxsO1xuICAvKiogVGhlIG5ld2VzdCB1bmZsYWdnZWQgdmVyc2lvbiB0aGUgb3duZXIgY2FuIG1vdmUgdG8sIG5hbWVkIG9uIHRoZSBmaW5kaW5nIHdhcm5pbmdzLiAqL1xuICBzdWdnZXN0ZWRWZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJ1biB0aGUgb3JnJ3MgY29tcGxpYW5jZSBydWxlcyAoYSBuZXR3b3JrIGNhbGwpLiBEZWZhdWx0IHRydWUuICovXG4gIGNvbXBsaWFuY2U/OiBib29sZWFuO1xuICBub3c/OiBEYXRlO1xufVxuXG4vKiogVGhlIGFzc2Vzc21lbnQ6IGV2ZXJ5IHdhcm5pbmcsIHRoZSBsb3VkZXN0IHNldmVyaXR5LCBhbmQgd2hpY2ggYWNjZXB0ZWQgZmluZGluZ3MgaXQgZG93bmdyYWRlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvblZ1bG5Bc3Nlc3NtZW50IHtcbiAgLyoqIGBudWxsYCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F5LiAqL1xuICBzZXZlcml0eTogVnVsblNldmVyaXR5IHwgbnVsbDtcbiAgd2FybmluZ3M6IFZ1bG5XYXJuaW5nW107XG4gIC8qKiBGaW5kaW5nIGtleXMgYW4gYWNjZXB0YW5jZSBkb3duZ3JhZGVkIChlbXB0eSA9IG5vIGFjY2VwdGFuY2UgYXBwbGllZCkuICovXG4gIGFjY2VwdGVkRmluZGluZ3M6IHN0cmluZ1tdO1xuICBmYWN0czogVmVyc2lvblNjYW5GYWN0cztcbn1cblxuLyoqIFRoZSBsb3VkZXN0IHNldmVyaXR5IG9mIGB3YXJuaW5nc2AsIG9yIG51bGwgZm9yIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2V2ZXJpdHlPZih3YXJuaW5nczogUmVhZG9ubHlBcnJheTx7IHNldmVyaXR5PzogVnVsblNldmVyaXR5IH0+KTogVnVsblNldmVyaXR5IHwgbnVsbCB7XG4gIHJldHVybiB3YXJuaW5ncy5yZWR1Y2U8VnVsblNldmVyaXR5IHwgbnVsbD4oKGFjYywgdykgPT4gKHcuc2V2ZXJpdHkgPyAoYWNjID8gbWF4U2V2ZXJpdHkoYWNjLCB3LnNldmVyaXR5KSA6IHcuc2V2ZXJpdHkpIDogYWNjKSwgbnVsbCk7XG59XG5cbi8qKlxuICogVGhlIGFzc2Vzc21lbnQgb2Ygb25lIHJlc29sdmVkIHZlcnNpb24gKHNlZSB0aGUgbW9kdWxlIGRvYykuIE5ldmVyIHRocm93cyBhbmRcbiAqIG5ldmVyIHJlZnVzZXM6IGEgY29tcGxpYW5jZSBvdXRhZ2UgYWRkcyBhbiBgaW5mb2AgYENPTVBMSUFOQ0VfVU5BVkFJTEFCTEVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXNzVmVyc2lvblZ1bG5zKGlucHV0OiBWZXJzaW9uVnVsbklucHV0KTogUHJvbWlzZTxWZXJzaW9uVnVsbkFzc2Vzc21lbnQ+IHtcbiAgY29uc3QgeyBvcmdJZCwgcmVjb3JkLCBwb2xpY3ksIGFjY2VwdGFuY2UgfSA9IGlucHV0O1xuICBjb25zdCBub3cgPSBpbnB1dC5ub3cgPz8gbmV3IERhdGUoKTtcbiAgY29uc3QgcmVmID0gYCR7cmVjb3JkLm5hbWV9QCR7cmVjb3JkLnZlcnNpb259YDtcbiAgY29uc3QgZmFjdHMgPSB2ZXJzaW9uU2NhbkZhY3RzKHJlY29yZCk7XG4gIGNvbnN0IHdhcm5pbmdzOiBWdWxuV2FybmluZ1tdID0gWy4uLnNjYW5XYXJuaW5ncyhyZWNvcmQsIG5vdyldO1xuICBjb25zdCBhY2NlcHRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB3YXkgPSBpbnB1dC5zdWdnZXN0ZWRWZXJzaW9uID8gYCBNb3ZlIHRvICR7cmVjb3JkLm5hbWV9QCR7aW5wdXQuc3VnZ2VzdGVkVmVyc2lvbn0uYCA6ICcnO1xuICBjb25zdCBzdWdnZXN0ZWQgPSBpbnB1dC5zdWdnZXN0ZWRWZXJzaW9uID8geyBzdWdnZXN0ZWRWZXJzaW9uOiBpbnB1dC5zdWdnZXN0ZWRWZXJzaW9uIH0gOiB7fTtcbiAgY29uc3QgdW50aWwgPSB0b0RhdGUoYWNjZXB0YW5jZT8uYWNjZXB0ZWRVbnRpbCk/LnRvSVNPU3RyaW5nKCkgPz8gbnVsbDtcblxuICAvKiogUHVzaCBhIGZpbmRpbmcgd2FybmluZyDigJQgb3IsIHdoZW4gdGhlIHBpcGVsaW5lIGFjY2VwdGVkIGV4YWN0bHkgdGhvc2UgZmluZGluZ3MsIGl0cyBgaW5mb2AgZG93bmdyYWRlLiAqL1xuICBjb25zdCBmaW5kaW5nID0gKGNvZGU6ICdWVUxOX0tFVicgfCAnVlVMTl9GTEFHR0VEJyB8ICdWVUxOX0NSSVRJQ0FMX0ZJWEFCTEUnIHwgJ1ZVTE5fSElHSF9GSVhBQkxFJywgc2V2ZXJpdHk6IFZ1bG5TZXZlcml0eSwgbWVzc2FnZTogc3RyaW5nLCBmaW5kaW5nczogUGx1Z2luU2NhbkZpbmRpbmdbXSxcbiAgICBleHRyYTogeyBwbHVnaW4/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmc7IGdhdGVkPzogbnVtYmVyOyBoaWdoPzogbnVtYmVyIH0gPSB7fSkgPT4ge1xuICAgIGlmIChjb3ZlcnMoYWNjZXB0YW5jZSwgZmluZGluZ3MsIGZhY3RzLnRydW5jYXRlZCkpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmaW5kaW5ncykgYWNjZXB0ZWQuYWRkKHNjYW5GaW5kaW5nS2V5KGYpKTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICBjb2RlOiAnVlVMTl9BQ0NFUFRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgIG1lc3NhZ2U6IGAke21lc3NhZ2V9IEFjY2VwdGVkIGZvciB0aGlzIHBpcGVsaW5lJHt1bnRpbCA/IGAgdW50aWwgJHt1bnRpbH1gIDogJyd9LmAsXG4gICAgICAgIGZpbmRpbmdzOiBmaW5kaW5ncy5tYXAoc2NhbkZpbmRpbmdLZXkpLFxuICAgICAgICBhY2NlcHRlZFVudGlsOiB1bnRpbCxcbiAgICAgICAga2V2OiBhY2NlcHRhbmNlPy5rZXYgPz8gZmFsc2UsXG4gICAgICAgIGNvdmVyczogY29kZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZSwgc2V2ZXJpdHksIG1lc3NhZ2U6IGAke21lc3NhZ2V9JHt3YXl9YCwgZmluZGluZ3M6IGZpbmRpbmdzLnNsaWNlKDAsIDEwKSwgLi4uc3VnZ2VzdGVkLCAuLi5leHRyYSB9KTtcbiAgfTtcblxuICBjb25zdCBrZXZGaW5kaW5ncyA9IGZhY3RzLmZpbmRpbmdzLmZpbHRlcigoZikgPT4gZi5rZXYgPT09IHRydWUpO1xuICBpZiAoZmFjdHMua2V2ID4gMCkge1xuICAgIGZpbmRpbmcoJ1ZVTE5fS0VWJywgJ2NyaXRpY2FsJywgYCR7cmVmfSBoYXMgJHtmYWN0cy5rZXZ9IGZpbmRpbmcke2ZhY3RzLmtldiA9PT0gMSA/ICcnIDogJ3MnfSBvbiB0aGUgQ0lTQSBLbm93biBFeHBsb2l0ZWQgVnVsbmVyYWJpbGl0aWVzIGxpc3Qke2tldkZpbmRpbmdzLmxlbmd0aCA/IGA6ICR7ZGVzY3JpYmVGaW5kaW5ncyhrZXZGaW5kaW5ncyl9YCA6ICcnfS5gLCBrZXZGaW5kaW5ncyk7XG4gIH1cbiAgY29uc3QgZmxhZyA9IGZhY3RzLmZsYWc7XG4gIGlmIChmbGFnKSB7XG4gICAgY29uc3QgZ2F0ZWQgPSBmYWN0cy5maW5kaW5ncy5maWx0ZXIoKGYpID0+IGlzR2F0ZWRGaW5kaW5nKGYsIHBsdWdpblZ1bG5HYXRlS2V2KCksIGZsYWcuZmFpbE9uID8/ICdjcml0aWNhbCcpKTtcbiAgICBmaW5kaW5nKCdWVUxOX0ZMQUdHRUQnLCAnZXJyb3InLCBgJHtyZWZ9IGlzIGZsYWdnZWQ6IGEgcmVzY2FuIGZvdW5kICR7ZmxhZy5nYXRlZH0gZ2F0ZWQgJHtmYWlsT25MYWJlbChmbGFnLmZhaWxPbiA/PyAnY3JpdGljYWwnKX0gZmluZGluZyR7ZmxhZy5nYXRlZCA9PT0gMSA/ICcnIDogJ3MnfSBvdmVyIHRoZSBwbGF0Zm9ybSBsaW1pdCR7ZmxhZy5maW5kaW5ncy5sZW5ndGggPyBgIChmaXg6ICR7ZGVzY3JpYmVGaW5kaW5ncyhmbGFnLmZpbmRpbmdzKX0pYCA6ICcnfS5gLFxuICAgICAgZ2F0ZWQubGVuZ3RoID4gMCA/IGdhdGVkIDogZmxhZy5maW5kaW5ncywgeyBwbHVnaW46IHJlY29yZC5uYW1lLCB2ZXJzaW9uOiByZWNvcmQudmVyc2lvbiwgZ2F0ZWQ6IGZsYWcuZ2F0ZWQsIGhpZ2g6IGZsYWcuaGlnaCB9KTtcbiAgfSBlbHNlIGlmICgoZmFjdHMuY3JpdGljYWxGaXhhYmxlID8/IDApID4gMCkge1xuICAgIGNvbnN0IGNyaXRzID0gZmFjdHMuZmluZGluZ3MuZmlsdGVyKChmKSA9PiBmLnNldmVyaXR5ID09PSAnY3JpdGljYWwnICYmIGYuZml4ZWRJbi5sZW5ndGggPiAwKTtcbiAgICBmaW5kaW5nKCdWVUxOX0NSSVRJQ0FMX0ZJWEFCTEUnLCAnZXJyb3InLCBgJHtyZWZ9IGhhcyAke2ZhY3RzLmNyaXRpY2FsRml4YWJsZX0gZml4YWJsZSBDcml0aWNhbCBmaW5kaW5nJHtmYWN0cy5jcml0aWNhbEZpeGFibGUgPT09IDEgPyAnJyA6ICdzJ30ke2NyaXRzLmxlbmd0aCA/IGA6ICR7ZGVzY3JpYmVGaW5kaW5ncyhjcml0cyl9YCA6ICcnfS5gLCBjcml0cyk7XG4gIH1cbiAgY29uc3QgaGlnaEZpeGFibGUgPSBmYWN0cy5oaWdoRml4YWJsZSA/PyAwO1xuICBpZiAoaGlnaEZpeGFibGUgPiAwKSB7XG4gICAgY29uc3QgaGlnaHMgPSBmYWN0cy5maW5kaW5ncy5maWx0ZXIoKGYpID0+IGYuc2V2ZXJpdHkgPT09ICdoaWdoJyAmJiBmLmZpeGVkSW4ubGVuZ3RoID4gMCk7XG4gICAgY29uc3Qgb3ZlciA9IHBvbGljeS53YXJuRml4YWJsZUhpZ2ggIT09IG51bGwgJiYgaGlnaEZpeGFibGUgPiBwb2xpY3kud2FybkZpeGFibGVIaWdoO1xuICAgIGZpbmRpbmcoJ1ZVTE5fSElHSF9GSVhBQkxFJywgb3ZlciA/ICd3YXJuaW5nJyA6ICdpbmZvJyxcbiAgICAgIGAke3JlZn0gaGFzICR7aGlnaEZpeGFibGV9IGZpeGFibGUgSGlnaCBmaW5kaW5nJHtoaWdoRml4YWJsZSA9PT0gMSA/ICcnIDogJ3MnfSR7b3ZlciA/IGAsIG92ZXIgeW91ciBvcmdhbml6YXRpb24ncyB0aHJlc2hvbGQgb2YgJHtwb2xpY3kud2FybkZpeGFibGVIaWdofWAgOiAnJ30uYCwgaGlnaHMpO1xuICB9XG5cbiAgaWYgKGlucHV0LmNvbXBsaWFuY2UgIT09IGZhbHNlKSB3YXJuaW5ncy5wdXNoKC4uLmF3YWl0IGNvbXBsaWFuY2VWdWxuV2FybmluZ3Mob3JnSWQsIHJlY29yZCkpO1xuICByZXR1cm4geyBzZXZlcml0eTogc2V2ZXJpdHlPZih3YXJuaW5ncyksIHdhcm5pbmdzLCBhY2NlcHRlZEZpbmRpbmdzOiBbLi4uYWNjZXB0ZWRdLCBmYWN0cyB9O1xufVxuXG4vKiogVGhlIGNvbXBsaWFuY2UgYXR0cmlidXRlcyBhIHBsdWdpbidzIHZ1bG5lcmFiaWxpdHkgcnVsZXMgcmVhZC4gKi9cbmNvbnN0IFZVTE5fUlVMRV9GSUVMRFMgPSBuZXcgU2V0KFsnc2Nhbm5lZCcsICd2dWxuQ3JpdGljYWwnLCAndnVsbkhpZ2gnLCAndnVsbk1lZGl1bScsICd2dWxuTG93JywgJ3Z1bG5Dcml0aWNhbEZpeGFibGUnLCAndnVsbkhpZ2hGaXhhYmxlJ10pO1xuXG5jb25zdCBmaWVsZFJvb3QgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyA9PiBmaWVsZC5zcGxpdCgvWy5bXS8pWzBdID8/IGZpZWxkO1xuXG50eXBlIENvbXBsaWFuY2VDbGllbnQgPSBQaWNrPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQ+LCAnZHJ5UnVuUGx1Z2luJz47XG5cbmxldCBjb21wbGlhbmNlQ2xpZW50OiBDb21wbGlhbmNlQ2xpZW50IHwgbnVsbCA9IG51bGw7XG5cbi8qKiBUZXN0IGhvb2s6IHJlcGxhY2UgdGhlIGNvbXBsaWFuY2UgY2xpZW50IHRoZSBhc3Nlc3NtZW50J3MgY29tcGxpYW5jZSBsYXllciBjYWxscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWdWxuUG9saWN5Q29tcGxpYW5jZUNsaWVudEZvclRlc3RzKGNsaWVudDogQ29tcGxpYW5jZUNsaWVudCB8IG51bGwpOiB2b2lkIHtcbiAgY29tcGxpYW5jZUNsaWVudCA9IGNsaWVudDtcbn1cblxuLyoqXG4gKiBUaGUgb3JnJ3MgcGx1Z2luIGNvbXBsaWFuY2UgcnVsZXMgb24gdGhlIHZ1bG5lcmFiaWxpdHkgYXR0cmlidXRlcywgZXZhbHVhdGVkXG4gKiBhZ2FpbnN0IHRoZSBSRVNPTFZFRCB2ZXJzaW9uIOKAlCB0aGUgb3JnJ3Mgb3duIHJvdywgaXRzIHBhcmVudCdzLCBhIHN5c3RlbVxuICogcGx1Z2luIG9yIGFuIGluc3RhbGxlZCBtYXJrZXRwbGFjZSB2ZXJzaW9uIGFsaWtlLiBBIEJMT0NLLW1vZGUgcnVsZSB0aGF0IGZhaWxzXG4gKiBpcyBhbiBgZXJyb3JgLCBhIFdBUk4tbW9kZSBvbmUgYSBgd2FybmluZ2A7IG5laXRoZXIgcmVmdXNlcyBhbnl0aGluZyBoZXJlXG4gKiAodnVsbmVyYWJpbGl0eSBzdGF0ZSBuZXZlciBzdG9wcyBhIHBpcGVsaW5lKS5cbiAqXG4gKiBPbmx5IHRoZSB2dWxuIC8gc2Nhbm5lZCBydWxlcyBjb3VudCBoZXJlOiB0aGUgcGx1Z2luJ3Mgb3RoZXIgcnVsZXMgKHRhZ3MsXG4gKiBzZWNyZXRzLCBjb21tYW5kcyDigKYpIGRlc2NyaWJlIGhvdyBhIHBsdWdpbiBpcyBBVVRIT1JFRCwgd2hpY2ggaXMgaXRzIG93bmVyJ3NcbiAqIGNvbmNlcm4gYXQgdXBsb2FkLCBub3QgdGhlIGNvbnN1bWVyJ3MgYXQgcmVzb2x1dGlvbiDigJQgYW5kIGEgc3lzdGVtIHBsdWdpbiB3b3VsZFxuICogb3RoZXJ3aXNlIGZhaWwgZXZlcnkgdGVuYW50J3MgYXV0aG9yaW5nIHJ1bGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wbGlhbmNlVnVsbldhcm5pbmdzKG9yZ0lkOiBzdHJpbmcsIHJlY29yZDogU2Nhbm5lZFJlY29yZCk6IFByb21pc2U8VnVsbldhcm5pbmdbXT4ge1xuICBpZiAoaXNTeXN0ZW1PcmdJZChvcmdJZCkgfHwgIWhhc0ltYWdlKHJlY29yZCkpIHJldHVybiBbXTtcbiAgY29uc3QgZmFjdHMgPSBkZXJpdmVQbHVnaW5JbWFnZUNvbXBsaWFuY2UocmVjb3JkLCBudWxsKS5hdHRyaWJ1dGVzO1xuICBjb25zdCBhdHRyaWJ1dGVzOiBQbHVnaW5Db21wbGlhbmNlQXR0cmlidXRlcyA9IHsgbmFtZTogcmVjb3JkLm5hbWUsIHZlcnNpb246IHJlY29yZC52ZXJzaW9uLCAuLi5mYWN0cyB9O1xuICB0cnkge1xuICAgIGNvbXBsaWFuY2VDbGllbnQgPz89IGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQoKTtcbiAgICBjb25zdCBhdXRoID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZTogJ3BsdWdpbicsIG9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb21wbGlhbmNlQ2xpZW50LmRyeVJ1blBsdWdpbihvcmdJZCwgYXR0cmlidXRlcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgYXV0aCk7XG4gICAgY29uc3QgcmVsZXZhbnQgPSAodjogQ29tcGxpYW5jZVZpb2xhdGlvbikgPT4gVlVMTl9SVUxFX0ZJRUxEUy5oYXMoZmllbGRSb290KHYuZmllbGQpKTtcbiAgICBjb25zdCBhcyA9IChtb2RlOiAnYmxvY2snIHwgJ3dhcm4nKSA9PiAodjogQ29tcGxpYW5jZVZpb2xhdGlvbik6IFZ1bG5XYXJuaW5nID0+ICh7XG4gICAgICBjb2RlOiAnQ09NUExJQU5DRV9WVUxOX1JVTEUnLFxuICAgICAgc2V2ZXJpdHk6IG1vZGUgPT09ICdibG9jaycgPyAnZXJyb3InIDogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogYCR7cmVjb3JkLm5hbWV9QCR7cmVjb3JkLnZlcnNpb259OiAke3YubWVzc2FnZX1gLFxuICAgICAgcnVsZUlkOiB2LnJ1bGVJZCxcbiAgICAgIHJ1bGVOYW1lOiB2LnJ1bGVOYW1lLFxuICAgICAgZmllbGQ6IHYuZmllbGQsXG4gICAgICBtb2RlLFxuICAgIH0pO1xuICAgIHJldHVybiBbLi4ucmVzdWx0LnZpb2xhdGlvbnMuZmlsdGVyKHJlbGV2YW50KS5tYXAoYXMoJ2Jsb2NrJykpLCAuLi5yZXN1bHQud2FybmluZ3MuZmlsdGVyKHJlbGV2YW50KS5tYXAoYXMoJ3dhcm4nKSldO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gW3sgY29kZTogJ0NPTVBMSUFOQ0VfVU5BVkFJTEFCTEUnLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiBgWW91ciBvcmdhbml6YXRpb24ncyBwbHVnaW4gdnVsbmVyYWJpbGl0eSBydWxlcyBjb3VsZCBub3QgYmUgY2hlY2tlZCBmb3IgJHtyZWNvcmQubmFtZX1AJHtyZWNvcmQudmVyc2lvbn0gKCR7ZXJyb3JNZXNzYWdlKGVycil9KS5gIH1dO1xuICB9XG59XG4iXX0=
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi12dWxuLXBvbGljeS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3ZlcnNpb24tdnVsbi1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxzQkFBc0IsRUFBNEIsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsR0FFbkksTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUF3RCxNQUFNLCtCQUErQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFHakYsb0NBQW9DO0FBQ3BDLE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBZSxFQUFFLENBQWU7SUFDMUQsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLGVBQWUsQ0FB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Q0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLDJFQUEyRSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdNLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVEhFIHZ1bG5lcmFiaWxpdHkgYXNzZXNzbWVudCBvZiBvbmUgcmVzb2x2ZWQgcGx1Z2luIHZlcnNpb24sIGZvciBvbmUgb3JnIChhbmQsXG4gKiBvcHRpb25hbGx5LCBvbmUgcGlwZWxpbmUncyByaXNrIGFjY2VwdGFuY2UpLiBPbmUgZnVuY3Rpb24sIHRocmVlIGNhbGxlcnM6XG4gKiBgL3BsdWdpbnMvbG9va3VwYCAod2hhdCBzeW50aCBwaW5zKSwgYC9wbHVnaW5zL3J1bnRpbWUtY2hlY2tgICh3aGF0IGEgcnVubmluZ1xuICogcGlwZWxpbmUgaXMgYWJvdXQgdG8gZXhlY3V0ZSkgYW5kIHRoZSBwaXBlbGluZSBzZXJ2aWNlJ3Mgc2F2ZS10aW1lIGNvbnRyYWN0XG4gKiBjaGVjay4gVGhyZWUgY29waWVzIG9mIHRoZXNlIHJ1bGVzIGRyaWZ0ZWQgb25jZSBhbHJlYWR5LlxuICpcbiAqIFZ1bG5lcmFiaWxpdHkgc3RhdGUgTkVWRVIgcmVmdXNlcyBhIHBpcGVsaW5lIOKAlCBub3QgaXRzIHNhdmUsIGl0cyBzeW50aCwgaXRzXG4gKiBkZXBsb3kgb3IgaXRzIHJ1bi4gV2hhdCBpdCBwcm9kdWNlcyBpcyBTRVZFUklUWS1HUkFERUQgd2FybmluZ3MgKGFuZCwgZnJvbSB0aGVcbiAqIGNhbGxlcnMsIG5vdGlmaWNhdGlvbnMgdG8gdGhlIHBpcGVsaW5lJ3Mgb3duZXJzKS4gVGhlIGdyYWRlczpcbiAqXG4gKiAgIGNyaXRpY2FsIOKAlCBhIGZpbmRpbmcgb24gdGhlIENJU0EgS25vd24gRXhwbG9pdGVkIFZ1bG5lcmFiaWxpdGllcyBsaXN0XG4gKiAgIGVycm9yICAgIOKAlCB0aGUgdmVyc2lvbiBpcyBGTEFHR0VEIChnYXRlZCBDcml0aWNhbHMgb3ZlciB0aGUgcGxhdGZvcm0gZmxvb3IpLFxuICogICAgICAgICAgICAgIGl0IGhhcyBmaXhhYmxlIENyaXRpY2FsIGZpbmRpbmdzLCBvciBhbiBvcmcgY29tcGxpYW5jZSBydWxlIG9uIHRoZVxuICogICAgICAgICAgICAgIHZ1bG5lcmFiaWxpdHkgYXR0cmlidXRlcyBpcyBpbiBCTE9DSyBtb2RlIGFuZCBmYWlsc1xuICogICB3YXJuaW5nICDigJQgZml4YWJsZSBIaWdoIGZpbmRpbmdzIG92ZXIgdGhlIG9yZydzIGB3YXJuRml4YWJsZUhpZ2hgLCBhIHZlcnNpb25cbiAqICAgICAgICAgICAgICBuZXZlciBzY2FubmVkLCBhIHNjYW4gb2xkZXIgdGhhbiBgUExVR0lOX1NDQU5fU1RBTEVfSE9VUlNgLCBvciBhXG4gKiAgICAgICAgICAgICAgY29tcGxpYW5jZSBydWxlIGluIFdBUk4gbW9kZVxuICogICBpbmZvICAgICDigJQgd2hhdCBhIHJlYWRlciBtYXkgd2FudCB0byBrbm93IGJ1dCBuZWVkIG5vdCBhY3Qgb25cbiAqXG4gKiBBIFBJUEVMSU5FJ3MgYWN0aXZlIHJpc2sgYWNjZXB0YW5jZSAoYHBsdWdpbl92dWxuX2V4cG9zdXJlYCwgdHJpYWdlZCBgYWNjZXB0ZWRgXG4gKiB3aXRoIGEgcmVhc29uIGFuZCBhbiBleHBpcnkpIGRvd25ncmFkZXMgdGhlIHdhcm5pbmdzIGFib3V0IHRoZSBmaW5kaW5ncyBpdFxuICogQUNDRVBURUQgdG8gYGluZm9gIChcImFjY2VwdGVkIHVudGlsIOKAplwiKSDigJQgbmV2ZXIgb25lIGFib3V0IGEgZmluZGluZyB0aGF0XG4gKiBhcHBlYXJlZCBzaW5jZSwgbmV2ZXIgYSBLRVYgb25lIHVubGVzcyB0aGUgYWNjZXB0YW5jZSBzYWlkIGBrZXY6IHRydWVgLCBhbmRcbiAqIG5ldmVyIHRoZSBzY2FuLWZyZXNobmVzcyBvciBjb21wbGlhbmNlIHdhcm5pbmdzIChuZWl0aGVyIGlzIGFib3V0IGEgZmluZGluZykuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQ29tcGxpYW5jZUNsaWVudCwgdHlwZSBDb21wbGlhbmNlVmlvbGF0aW9uIH0gZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlQXV0aEhlYWRlciB9IGZyb20gJy4uL21pZGRsZXdhcmUvc2VydmljZS10b2tlbnMuanMnO1xuaW1wb3J0IHsgaXNTeXN0ZW1PcmdJZCB9IGZyb20gJy4uL21pZGRsZXdhcmUvc3lzdGVtLW9yZy5qcyc7XG5pbXBvcnQge1xuICBhcHBseVZ1bG5XYWl2ZXJzLCBhc1NjYW5GbGFnLCBkZXNjcmliZUZpbmRpbmdzLCBmYWlsT25MYWJlbCwgaXNHYXRlZEZpbmRpbmcsIHBsdWdpblZ1bG5HYXRlS2V2LCBzY2FuRmluZGluZ0tleSwgc3VtbWFyeUNvbnRyYWRpY3RzLFxuICB0eXBlIFBsdWdpblNjYW5GaW5kaW5nLCB0eXBlIFBsdWdpblNjYW5GbGFnLFxufSBmcm9tICcuLi90eXBlcy9wbHVnaW4tc2Nhbi5qcyc7XG5pbXBvcnQgeyBlbnZJbnQgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuaW1wb3J0IHsgZGVyaXZlUGx1Z2luSW1hZ2VDb21wbGlhbmNlLCBwbHVnaW5SdW5zT3duSW1hZ2UsIHR5cGUgUGx1Z2luQ29tcGxpYW5jZUF0dHJpYnV0ZXMsIHR5cGUgUGx1Z2luSW1hZ2VSb3cgfSBmcm9tICcuLi91dGlscy9wbHVnaW4tY29tcGxpYW5jZS5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbi8qKiBIb3cgbG91ZCBhIHdhcm5pbmcgaXMsIHF1aWV0ZXN0IGZpcnN0LiAqL1xuZXhwb3J0IGNvbnN0IFZVTE5fU0VWRVJJVElFUyA9IFsnaW5mbycsICd3YXJuaW5nJywgJ2Vycm9yJywgJ2NyaXRpY2FsJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBWdWxuU2V2ZXJpdHkgPSB0eXBlb2YgVlVMTl9TRVZFUklUSUVTW251bWJlcl07XG5cbi8qKiBUaGUgbG91ZGVyIG9mIHR3byBzZXZlcml0aWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heFNldmVyaXR5KGE6IFZ1bG5TZXZlcml0eSwgYjogVnVsblNldmVyaXR5KTogVnVsblNldmVyaXR5IHtcbiAgcmV0dXJuIFZVTE5fU0VWRVJJVElFUy5pbmRleE9mKGEpID49IFZVTE5fU0VWRVJJVElFUy5pbmRleE9mKGIpID8gYSA6IGI7XG59XG5cbi8qKiBXaGV0aGVyIGBzYCBpcyBhdCBsZWFzdCBgZmxvb3JgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldmVyaXR5QXRMZWFzdChzOiBWdWxuU2V2ZXJpdHksIGZsb29yOiBWdWxuU2V2ZXJpdHkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFZVTE5fU0VWRVJJVElFUy5pbmRleE9mKHMpID49IFZVTE5fU0VWRVJJVElFUy5pbmRleE9mKGZsb29yKTtcbn1cblxuLyoqIGBQTFVHSU5fU0NBTl9TVEFMRV9IT1VSU2AgKGRlZmF1bHQgNzIpOiBhIHNjYW4gb2xkZXIgdGhhbiB0aGlzIGlzIHN0YWxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYW5TdGFsZUhvdXJzKCk6IG51bWJlciB7XG4gIHJldHVybiBlbnZJbnQoJ1BMVUdJTl9TQ0FOX1NUQUxFX0hPVVJTJywgNzIsIHsgbWluOiAxIH0pO1xufVxuXG4vKiogVGhlIHNjYW4tcmVsYXRlZCBmaWVsZHMgb2YgYSByZXNvbHZlZCByZWNvcmQgKGFuIG9yZyByb3cgb3IgYSBsaXN0ZWQgcmVjb3JkKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lZFJlY29yZCBleHRlbmRzIFBsdWdpbkltYWdlUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgb3JnIHRoYXQgT1dOUyB0aGlzIHBsdWdpbi9saXN0aW5nIOKAlCBOT1QgdGhlIGNvbnN1bWluZyBvcmcgb25cbiAgICoge0BsaW5rIFZlcnNpb25WdWxuSW5wdXR9LCB3aGljaCBpcyB3aG9ldmVyIGlzIGFza2luZy4gVnVsbmVyYWJpbGl0eSB3YWl2ZXJzXG4gICAqIGFyZSB0aGUgb3BlcmF0b3IncyBhbmQgYXJlIHN5c3RlbS1vcmctb25seSwgc28gd2l0aG91dCB0aGlzIHRoZSBtb2R1bGVcbiAgICogY291bGQgbm90IGFwcGx5IHRoZW0gYXQgYWxsOiBhIENyaXRpY2FsIHRoZSBvcGVyYXRvciBoYWQgd2FpdmVkIHN0aWxsXG4gICAqIHJlcG9ydGVkIGFzIGFuIGBlcnJvcmAgdG8gZXZlcnkgdGVuYW50IHJlc29sdmluZyB0aGUgdmVyc2lvbiwgbG9uZyBhZnRlciBpdFxuICAgKiBzdG9wcGVkIGJsb2NraW5nIHRoZSBidWlsZCBhbmQgdGhlIGxpc3RpbmcuIE9wdGlvbmFsIGJlY2F1c2UgbW9zdCBjYWxsZXJzXG4gICAqIGhhdmUgbm8gb3duZXIgdG8gaGFuZCAoYSB0ZW5hbnQncyBvd24gcm93IGlzIGl0cyBvd24gb3duZXIpIGFuZCBhYnNlbnQgbWVhbnNcbiAgICogXCJubyB3YWl2ZXIgYXBwbGllc1wiLCB3aGljaCBpcyB0aGUgc2FmZSBkaXJlY3Rpb24uXG4gICAqL1xuICBvd25lck9yZ0lkPzogc3RyaW5nIHwgbnVsbDtcbiAgc2Nhbm5lZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIHNjYW5TdW1tYXJ5PzogdW5rbm93bjtcbiAgc2NhbkZsYWdnZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICBzY2FuRmxhZz86IHVua25vd247XG4gIHZ1bG5IaWdoRml4YWJsZT86IHVua25vd247XG59XG5cbmNvbnN0IHRvRGF0ZSA9ICh2OiB1bmtub3duKTogRGF0ZSB8IG51bGwgPT4ge1xuICBpZiAoIXYpIHJldHVybiBudWxsO1xuICBjb25zdCBkID0gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUoU3RyaW5nKHYpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkLmdldFRpbWUoKSkgPyBudWxsIDogZDtcbn07XG5cbmNvbnN0IHN1bW1hcnlPZiA9IChyZWNvcmQ6IFBpY2s8U2Nhbm5lZFJlY29yZCwgJ3NjYW5TdW1tYXJ5Jz4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgPT5cbiAgKHJlY29yZC5zY2FuU3VtbWFyeSAmJiB0eXBlb2YgcmVjb3JkLnNjYW5TdW1tYXJ5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZWNvcmQuc2NhblN1bW1hcnkpXG4gICAgPyByZWNvcmQuc2NhblN1bW1hcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiBudWxsKTtcblxuLyoqXG4gKiBXaGVuIHRoZSB2ZXJzaW9uIHdhcyBsYXN0IHNjYW5uZWQ6IHRoZSBsYXRlciBvZiB0aGUgYnVpbGQtdGltZSBgc2Nhbm5lZEF0YCBhbmRcbiAqIHRoZSBuaWdodGx5IHJlc2NhbidzIGBzY2FuX3N1bW1hcnkuc2Nhbm5lZEF0YC4gTnVsbCA9IG5ldmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFzdFNjYW5uZWRBdChyZWNvcmQ6IFBpY2s8U2Nhbm5lZFJlY29yZCwgJ3NjYW5uZWRBdCcgfCAnc2NhblN1bW1hcnknPik6IERhdGUgfCBudWxsIHtcbiAgY29uc3QgYnVpbGQgPSB0b0RhdGUocmVjb3JkLnNjYW5uZWRBdCk7XG4gIGNvbnN0IHN1bW1hcnkgPSB0b0RhdGUoc3VtbWFyeU9mKHJlY29yZCk/LnNjYW5uZWRBdCk7XG4gIGlmICghYnVpbGQpIHJldHVybiBzdW1tYXJ5O1xuICBpZiAoIXN1bW1hcnkpIHJldHVybiBidWlsZDtcbiAgcmV0dXJuIHN1bW1hcnkgPiBidWlsZCA/IHN1bW1hcnkgOiBidWlsZDtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlY29yZCBydW5zIGEgQlVJTFQgaW1hZ2Ugb2YgaXRzIG93biDigJQgdGhlIG9ubHkgdGhpbmcgYSBzY2FuIGFwcGxpZXMgdG8uICovXG5mdW5jdGlvbiBoYXNJbWFnZShyZWNvcmQ6IFNjYW5uZWRSZWNvcmQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBsdWdpblJ1bnNPd25JbWFnZShyZWNvcmQpICYmIHR5cGVvZiByZWNvcmQuaW1hZ2VEaWdlc3QgPT09ICdzdHJpbmcnICYmIHJlY29yZC5pbWFnZURpZ2VzdC5sZW5ndGggPiAwO1xufVxuXG4vKiogRnJlc2huZXNzIG9mIGEgdmVyc2lvbidzIHNjYW46IGBub25lYCAobm8gaW1hZ2UgdG8gc2NhbiksIGB1bnNjYW5uZWRgLCBgc3RhbGVgIG9yIGBmcmVzaGAuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbkZyZXNobmVzcyhyZWNvcmQ6IFNjYW5uZWRSZWNvcmQsIG5vdyA9IG5ldyBEYXRlKCkpOiB7IHN0YXRlOiAnbm9uZScgfCAndW5zY2FubmVkJyB8ICdzdGFsZScgfCAnZnJlc2gnOyBzY2FubmVkQXQ6IERhdGUgfCBudWxsIH0ge1xuICBpZiAoIWhhc0ltYWdlKHJlY29yZCkpIHJldHVybiB7IHN0YXRlOiAnbm9uZScsIHNjYW5uZWRBdDogbnVsbCB9O1xuICBjb25zdCBhdCA9IGxhc3RTY2FubmVkQXQocmVjb3JkKTtcbiAgaWYgKCFhdCkgcmV0dXJuIHsgc3RhdGU6ICd1bnNjYW5uZWQnLCBzY2FubmVkQXQ6IG51bGwgfTtcbiAgcmV0dXJuIHsgc3RhdGU6IG5vdy5nZXRUaW1lKCkgLSBhdC5nZXRUaW1lKCkgPiBzY2FuU3RhbGVIb3VycygpICogM182MDBfMDAwID8gJ3N0YWxlJyA6ICdmcmVzaCcsIHNjYW5uZWRBdDogYXQgfTtcbn1cblxuLyoqIE9uZSBzZXZlcml0eS1ncmFkZWQgdnVsbmVyYWJpbGl0eSB3YXJuaW5nLiAqL1xuZXhwb3J0IHR5cGUgVnVsbldhcm5pbmcgPVxuICB8IHtcbiAgICBjb2RlOiAnVlVMTl9LRVYnIHwgJ1ZVTE5fRkxBR0dFRCcgfCAnVlVMTl9DUklUSUNBTF9GSVhBQkxFJyB8ICdWVUxOX0hJR0hfRklYQUJMRSc7XG4gICAgc2V2ZXJpdHk6IFZ1bG5TZXZlcml0eTtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZmluZGluZ3M6IFBsdWdpblNjYW5GaW5kaW5nW107XG4gICAgc3VnZ2VzdGVkVmVyc2lvbj86IHN0cmluZztcbiAgICAvKiogYFZVTE5fRkxBR0dFRGAgY2FycmllcyB0aGUgZmxhZydzIGNvdW50cyAodGhlIHNoYXBlIHRoZSByZXNjYW4tZmxhZyB3YXJuaW5nIGFsd2F5cyBoYWQpLiAqL1xuICAgIHBsdWdpbj86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgZmxhZydzIGdhdGVkIGNvdW50IChmaW5kaW5ncyBhdCBvciBhYm92ZSBpdHMgYGZhaWxPbmApLiAqL1xuICAgIGdhdGVkPzogbnVtYmVyO1xuICAgIGhpZ2g/OiBudW1iZXI7XG4gIH1cbiAgfCB7IGNvZGU6ICdWVUxOX0FDQ0VQVEVEJzsgc2V2ZXJpdHk6ICdpbmZvJzsgbWVzc2FnZTogc3RyaW5nOyBmaW5kaW5nczogc3RyaW5nW107IGFjY2VwdGVkVW50aWw6IHN0cmluZyB8IG51bGw7IGtldjogYm9vbGVhbjsgY292ZXJzOiBzdHJpbmcgfVxuICB8IHsgY29kZTogJ1VOU0NBTk5FRCc7IHNldmVyaXR5OiBWdWxuU2V2ZXJpdHk7IG1lc3NhZ2U6IHN0cmluZyB9XG4gIHwgeyBjb2RlOiAnU0NBTl9TVEFMRSc7IHNldmVyaXR5OiBWdWxuU2V2ZXJpdHk7IG1lc3NhZ2U6IHN0cmluZzsgc2Nhbm5lZEF0OiBzdHJpbmc7IHN0YWxlQWZ0ZXJIb3VyczogbnVtYmVyIH1cbiAgfCB7IGNvZGU6ICdDT01QTElBTkNFX1ZVTE5fUlVMRSc7IHNldmVyaXR5OiBWdWxuU2V2ZXJpdHk7IG1lc3NhZ2U6IHN0cmluZzsgcnVsZUlkOiBzdHJpbmc7IHJ1bGVOYW1lOiBzdHJpbmc7IGZpZWxkOiBzdHJpbmc7IG1vZGU6ICdibG9jaycgfCAnd2FybicgfVxuICB8IHsgY29kZTogJ0NPTVBMSUFOQ0VfVU5BVkFJTEFCTEUnOyBzZXZlcml0eTogVnVsblNldmVyaXR5OyBtZXNzYWdlOiBzdHJpbmcgfTtcblxuLyoqIGBVTlNDQU5ORURgIC8gYFNDQU5fU1RBTEVgIGZvciBhIHJlc29sdmVkIHZlcnNpb24gKGVtcHR5IGZvciBhIGZyZXNoIHNjYW4gb3IgYW4gaW1hZ2UtbGVzcyBwbHVnaW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYW5XYXJuaW5ncyhyZWNvcmQ6IFNjYW5uZWRSZWNvcmQsIG5vdyA9IG5ldyBEYXRlKCkpOiBWdWxuV2FybmluZ1tdIHtcbiAgY29uc3QgcmVmID0gYCR7cmVjb3JkLm5hbWV9QCR7cmVjb3JkLnZlcnNpb259YDtcbiAgY29uc3QgZiA9IHNjYW5GcmVzaG5lc3MocmVjb3JkLCBub3cpO1xuICBpZiAoZi5zdGF0ZSA9PT0gJ3Vuc2Nhbm5lZCcpIHtcbiAgICByZXR1cm4gW3sgY29kZTogJ1VOU0NBTk5FRCcsIHNldmVyaXR5OiAnd2FybmluZycsIG1lc3NhZ2U6IGBQbHVnaW4gJHtyZWZ9IGhhcyBuZXZlciBiZWVuIHNjYW5uZWQgZm9yIHZ1bG5lcmFiaWxpdGllczsgbm90aGluZyBpcyBrbm93biBhYm91dCB3aGF0IGl0cyBpbWFnZSBjb250YWlucy5gIH1dO1xuICB9XG4gIGlmIChmLnN0YXRlID09PSAnc3RhbGUnKSB7XG4gICAgY29uc3QgaG91cnMgPSBzY2FuU3RhbGVIb3VycygpO1xuICAgIHJldHVybiBbe1xuICAgICAgY29kZTogJ1NDQU5fU1RBTEUnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6IGBQbHVnaW4gJHtyZWZ9IHdhcyBsYXN0IHNjYW5uZWQgJHtmLnNjYW5uZWRBdCEudG9JU09TdHJpbmcoKX0sIG1vcmUgdGhhbiAke2hvdXJzfWggYWdvOyBmaW5kaW5ncyBwdWJsaXNoZWQgc2luY2UgYXJlIG5vdCByZWZsZWN0ZWQuYCxcbiAgICAgIHNjYW5uZWRBdDogZi5zY2FubmVkQXQhLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGFsZUFmdGVySG91cnM6IGhvdXJzLFxuICAgIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqIFRoZSB2dWxuZXJhYmlsaXR5IGZpZWxkcyBvZiBhbiBvcmcncyBjb25zdW1wdGlvbiBwb2xpY3kgKHBpcGVsaW5lLWRhdGEncyBgQ29uc3VtcHRpb25Qb2xpY3lgIHNhdGlzZmllcyBpdCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFZ1bG5Db25zdW1wdGlvblBvbGljeSB7XG4gIC8qKiBGaXhhYmxlIEhpZ2ggZmluZGluZ3MgYWJvdmUgdGhpcyBtYW55IHJhaXNlIGEgYHdhcm5pbmdgOyBudWxsID0gbmV2ZXIgKHRoZXkgc3RheSBgaW5mb2ApLiAqL1xuICB3YXJuRml4YWJsZUhpZ2g6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogQSBwaXBlbGluZSdzIEFDVElWRSByaXNrIGFjY2VwdGFuY2Ugb2Ygb25lIHZlcnNpb24gLyBpbWFnZTogdGhlIGZpbmRpbmcga2V5c1xuICogKHtAbGluayBzY2FuRmluZGluZ0tleX0pIGl0IGFjY2VwdGVkLCB3aGV0aGVyIGl0IGFjY2VwdGVkIEtFViBmaW5kaW5ncywgYW5kXG4gKiB1bnRpbCB3aGVuLiBCdWlsdCBieSBwaXBlbGluZS1kYXRhIGZyb20gYHBsdWdpbl92dWxuX2V4cG9zdXJlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWdWxuQWNjZXB0YW5jZSB7XG4gIGZpbmRpbmdLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAga2V2OiBib29sZWFuO1xuICBhY2NlcHRlZFVudGlsOiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFdoYXQgYSB2ZXJzaW9uJ3Mgc3RvcmVkIHNjYW4gc2F5cywgbm9ybWFsaXplZCBmcm9tIGBzY2FuX3N1bW1hcnlgIChmb3IgaXRzIGltYWdlKSBhbmQgYHNjYW5fZmxhZ2AuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcnNpb25TY2FuRmFjdHMge1xuICBmbGFnZ2VkOiBib29sZWFuO1xuICBmbGFnOiBQbHVnaW5TY2FuRmxhZyB8IG51bGw7XG4gIC8qKiBGaXhhYmxlIENyaXRpY2FsIC8gSGlnaCBmaW5kaW5ncyAobnVsbCA9IG5vdCBrbm93bikuICovXG4gIGNyaXRpY2FsRml4YWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgaGlnaEZpeGFibGU6IG51bWJlciB8IG51bGw7XG4gIC8qKiBUb3RhbHMgaW5jbHVkaW5nIHVuZml4YWJsZSBmaW5kaW5ncyAobnVsbCA9IG5vdCBrbm93bikuICovXG4gIGNyaXRpY2FsOiBudW1iZXIgfCBudWxsO1xuICBoaWdoOiBudW1iZXIgfCBudWxsO1xuICAvKiogS0VWLWxpc3RlZCBDcml0aWNhbCArIEhpZ2ggZmluZGluZ3MuICovXG4gIGtldjogbnVtYmVyO1xuICAvKiogRXZlcnkgQ3JpdGljYWwvSGlnaCBmaW5kaW5nIHRoZSBzY2FuIGl0ZW1pemVkICh0aGUgc3VtbWFyeSdzIGxpc3QsIGVsc2UgdGhlIGZsYWcncykuICovXG4gIGZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogVGhlIHN1bW1hcnkgY3V0IGl0cyBmaW5kaW5ncyBsaXN0IOKAlCBhIHN1YnNldCBjaGVjayBvdmVyIGl0IGNhbm5vdCBiZSB0cnVzdGVkLiAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG4gIHNjYW5uZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKiBUaGUgbm9ybWFsaXplZCBzY2FuIGZhY3RzIG9mIGEgcmVzb2x2ZWQgcmVjb3JkLiBBIHN1bW1hcnkgZGVzY3JpYmluZyBhbm90aGVyIGltYWdlIGlzIGlnbm9yZWQuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvblNjYW5GYWN0cyhyZWNvcmQ6IFNjYW5uZWRSZWNvcmQpOiBWZXJzaW9uU2NhbkZhY3RzIHtcbiAgY29uc3QgZmxhZyA9IHJlY29yZC5zY2FuRmxhZ2dlZEF0ID8gYXNTY2FuRmxhZyhyZWNvcmQuc2NhbkZsYWcpIDogbnVsbDtcbiAgY29uc3QgcmF3ID0gc3VtbWFyeU9mKHJlY29yZCk7XG4gIC8vIENPTlRSQURJQ1RTLCBub3QgZGVzY3JpYmVzIOKAlCB0aGUgcGVybWlzc2l2ZSBoYWxmIG9mIHRoZSBwYWlyLCBkZWxpYmVyYXRlbHkuXG4gIC8vIEEgZGlnZXN0LWxlc3Mgc3VtbWFyeSBpcyB0aGUgb25seSBmaW5kaW5ncyB0aGlzIHJlYWRlciBoYXM7IGRpc2NhcmRpbmcgaXRcbiAgLy8gbWFrZXMgdGhlIHdhcm5pbmcgcXVpZXRlciBhbmQgdGhlIGRlbGV0ZS1zYWZldHkgcmVmdXNhbCBsZXNzIGluZm9ybWF0aXZlLFxuICAvLyB3aGljaCBpcyB0aGUgd3JvbmcgZmFpbHVyZSBmb3IgYSBjb25zdW1lci1mYWNpbmcgZ3JhZGUuIFRoZSBwdWJsaXNoIGdhdGVcbiAgLy8gYXNrcyB0aGUgc3RyaWN0IHF1ZXN0aW9uIGJlY2F1c2UgSVRTIHdyb25nIGZhaWx1cmUgaXMgbGlzdGluZyBzb21ldGhpbmdcbiAgLy8gdW52ZXR0ZWQuIFNlZSB0aGUgbm90ZSBvbiBgc3VtbWFyeURlc2NyaWJlc2AuXG4gIGNvbnN0IHN1bW1hcnkgPSByYXcgJiYgIXN1bW1hcnlDb250cmFkaWN0cyhyYXcsIHR5cGVvZiByZWNvcmQuaW1hZ2VEaWdlc3QgPT09ICdzdHJpbmcnID8gcmVjb3JkLmltYWdlRGlnZXN0IDogbnVsbCkgPyByYXcgOiBudWxsO1xuICBjb25zdCBmaW5kaW5ncyA9IHN1bW1hcnkgJiYgQXJyYXkuaXNBcnJheShzdW1tYXJ5LmZpbmRpbmdzKVxuICAgID8gKHN1bW1hcnkuZmluZGluZ3MgYXMgUGx1Z2luU2NhbkZpbmRpbmdbXSkuZmlsdGVyKChmKSA9PiBmICYmIHR5cGVvZiBmLmlkID09PSAnc3RyaW5nJykubWFwKChmKSA9PiAoeyAuLi5mLCBmaXhlZEluOiBBcnJheS5pc0FycmF5KGYuZml4ZWRJbikgPyBmLmZpeGVkSW4gOiBbXSB9KSlcbiAgICA6IChmbGFnPy5maW5kaW5ncyA/PyBbXSk7XG4gIGNvbnN0IG51bSA9ICh2OiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCA9PiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IG51bGwpO1xuICBjb25zdCBrZXZDb3VudCA9IE1hdGgubWF4KG51bShzdW1tYXJ5Py5rZXYpID8/IDAsIGZsYWc/LmtldiA/PyAwLCBmaW5kaW5ncy5maWx0ZXIoKGYpID0+IGYua2V2ID09PSB0cnVlKS5sZW5ndGgpO1xuICByZXR1cm4ge1xuICAgIGZsYWdnZWQ6IGZsYWcgIT09IG51bGwsXG4gICAgZmxhZyxcbiAgICAvLyBOT1QgZmFsbGluZyBiYWNrIHRvIGByZWNvcmQudnVsbkNyaXRpY2FsRml4YWJsZWAsIHRob3VnaCBgaGlnaEZpeGFibGVgXG4gICAgLy8gZG9lcyBmYWxsIGJhY2sgdG8gaXRzIGNvbHVtbiBvbmUgbGluZSBkb3duLiBUaGUgYXN5bW1ldHJ5IGlzIHJlYWwgYW5kXG4gICAgLy8gcHJlZGF0ZXMgdGhpcyBtb2R1bGUncyBjdXJyZW50IHNoYXBlOyBjbG9zaW5nIGl0IGhlcmUgd291bGQgcmFpc2VcbiAgICAvLyBWVUxOX0NSSVRJQ0FMX0ZJWEFCTEUgZm9yIGV2ZXJ5IHJlY29yZCB0aGF0IGhhcyB0aGUgY29sdW1uIHNldCBhbmQgbm9cbiAgICAvLyBzdW1tYXJ5IGF0IGFsbCDigJQgYSBicm9hZCBjaGFuZ2UgdG8gd2FybmluZyBWT0xVTUUsIHdoaWNoIGlzIGEgcHJvZHVjdFxuICAgIC8vIGRlY2lzaW9uIHJhdGhlciB0aGFuIGEgY29uc2VxdWVuY2Ugb2YgdGlnaHRlbmluZyB0aGUgZGlnZXN0IGNoZWNrIGFib3ZlLlxuICAgIC8vIFRoZSBkaWdlc3QgY2hhbmdlIG9ubHkgYWZmZWN0cyByZWNvcmRzIHdob3NlIHN1bW1hcnkgbmFtZXMgYW5vdGhlciBpbWFnZSxcbiAgICAvLyBhbmQgdGhvc2UgZmFsbCBiYWNrIHRvIHRoZSBmbGFnJ3MgZmluZGluZ3MgZXhhY3RseSBhcyBhIHN1bW1hcnktbGVzc1xuICAgIC8vIHJlY29yZCBhbHdheXMgaGFzLlxuICAgIGNyaXRpY2FsRml4YWJsZTogbnVtKHN1bW1hcnk/LmNyaXRpY2FsRml4YWJsZSksXG4gICAgaGlnaEZpeGFibGU6IG51bShzdW1tYXJ5Py5oaWdoRml4YWJsZSkgPz8gbnVtKHJlY29yZC52dWxuSGlnaEZpeGFibGUpLFxuICAgIGNyaXRpY2FsOiBudW0oc3VtbWFyeT8uY3JpdGljYWwpLFxuICAgIGhpZ2g6IG51bShzdW1tYXJ5Py5oaWdoKSxcbiAgICBrZXY6IGtldkNvdW50LFxuICAgIGZpbmRpbmdzLFxuICAgIHRydW5jYXRlZDogc3VtbWFyeT8udHJ1bmNhdGVkID09PSB0cnVlLFxuICAgIHNjYW5uZWRBdDogbGFzdFNjYW5uZWRBdChyZWNvcmQpLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYGFjY2VwdGFuY2VgIGNvdmVycyBFVkVSWSBvbmUgb2YgYGZpbmRpbmdzYCAoYnkgZmluZGluZyBrZXkpLCBhbmQgaXRzXG4gKiBLRVYgb25lcyBvbmx5IHdoZW4gaXQgYWNjZXB0ZWQgS0VWLiBBbiBlbXB0eSBzZXQgaXMgbmV2ZXIgXCJjb3ZlcmVkXCI6IHdpdGhcbiAqIG5vdGhpbmcgaXRlbWl6ZWQgdGhlcmUgaXMgbm90aGluZyBhbiBhY2NlcHRhbmNlIGNhbiBiZSBzaG93biB0byBkZXNjcmliZS5cbiAqL1xuZnVuY3Rpb24gY292ZXJzKGFjY2VwdGFuY2U6IFZ1bG5BY2NlcHRhbmNlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmluZGluZ3M6IHJlYWRvbmx5IFBsdWdpblNjYW5GaW5kaW5nW10sIHRydW5jYXRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoIWFjY2VwdGFuY2UgfHwgdHJ1bmNhdGVkIHx8IGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBrZXlzID0gbmV3IFNldChhY2NlcHRhbmNlLmZpbmRpbmdLZXlzKTtcbiAgcmV0dXJuIGZpbmRpbmdzLmV2ZXJ5KChmKSA9PiBrZXlzLmhhcyhzY2FuRmluZGluZ0tleShmKSkgJiYgKGYua2V2ICE9PSB0cnVlIHx8IGFjY2VwdGFuY2Uua2V2KSk7XG59XG5cbi8qKiBJbnB1dCB0byB7QGxpbmsgYXNzZXNzVmVyc2lvblZ1bG5zfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvblZ1bG5JbnB1dCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHJlY29yZDogU2Nhbm5lZFJlY29yZDtcbiAgcG9saWN5OiBWdWxuQ29uc3VtcHRpb25Qb2xpY3k7XG4gIC8qKiBUaGUgcGlwZWxpbmUncyBhY3RpdmUgYWNjZXB0YW5jZSBvZiB0aGlzIHZlcnNpb24gLyBpbWFnZSwgd2hlbiB0aGUgY2FsbGVyIGhhcyBhIHBpcGVsaW5lLiAqL1xuICBhY2NlcHRhbmNlPzogVnVsbkFjY2VwdGFuY2UgfCBudWxsO1xuICAvKiogVGhlIG5ld2VzdCB1bmZsYWdnZWQgdmVyc2lvbiB0aGUgb3duZXIgY2FuIG1vdmUgdG8sIG5hbWVkIG9uIHRoZSBmaW5kaW5nIHdhcm5pbmdzLiAqL1xuICBzdWdnZXN0ZWRWZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJ1biB0aGUgb3JnJ3MgY29tcGxpYW5jZSBydWxlcyAoYSBuZXR3b3JrIGNhbGwpLiBEZWZhdWx0IHRydWUuICovXG4gIGNvbXBsaWFuY2U/OiBib29sZWFuO1xuICBub3c/OiBEYXRlO1xufVxuXG4vKiogVGhlIGFzc2Vzc21lbnQ6IGV2ZXJ5IHdhcm5pbmcsIHRoZSBsb3VkZXN0IHNldmVyaXR5LCBhbmQgd2hpY2ggYWNjZXB0ZWQgZmluZGluZ3MgaXQgZG93bmdyYWRlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvblZ1bG5Bc3Nlc3NtZW50IHtcbiAgLyoqIGBudWxsYCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F5LiAqL1xuICBzZXZlcml0eTogVnVsblNldmVyaXR5IHwgbnVsbDtcbiAgd2FybmluZ3M6IFZ1bG5XYXJuaW5nW107XG4gIC8qKiBGaW5kaW5nIGtleXMgYW4gYWNjZXB0YW5jZSBkb3duZ3JhZGVkIChlbXB0eSA9IG5vIGFjY2VwdGFuY2UgYXBwbGllZCkuICovXG4gIGFjY2VwdGVkRmluZGluZ3M6IHN0cmluZ1tdO1xuICBmYWN0czogVmVyc2lvblNjYW5GYWN0cztcbn1cblxuLyoqIFRoZSBsb3VkZXN0IHNldmVyaXR5IG9mIGB3YXJuaW5nc2AsIG9yIG51bGwgZm9yIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2V2ZXJpdHlPZih3YXJuaW5nczogUmVhZG9ubHlBcnJheTx7IHNldmVyaXR5PzogVnVsblNldmVyaXR5IH0+KTogVnVsblNldmVyaXR5IHwgbnVsbCB7XG4gIHJldHVybiB3YXJuaW5ncy5yZWR1Y2U8VnVsblNldmVyaXR5IHwgbnVsbD4oKGFjYywgdykgPT4gKHcuc2V2ZXJpdHkgPyAoYWNjID8gbWF4U2V2ZXJpdHkoYWNjLCB3LnNldmVyaXR5KSA6IHcuc2V2ZXJpdHkpIDogYWNjKSwgbnVsbCk7XG59XG5cbi8qKlxuICogVGhlIGFzc2Vzc21lbnQgb2Ygb25lIHJlc29sdmVkIHZlcnNpb24gKHNlZSB0aGUgbW9kdWxlIGRvYykuIE5ldmVyIHRocm93cyBhbmRcbiAqIG5ldmVyIHJlZnVzZXM6IGEgY29tcGxpYW5jZSBvdXRhZ2UgYWRkcyBhbiBgaW5mb2AgYENPTVBMSUFOQ0VfVU5BVkFJTEFCTEVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXNzVmVyc2lvblZ1bG5zKGlucHV0OiBWZXJzaW9uVnVsbklucHV0KTogUHJvbWlzZTxWZXJzaW9uVnVsbkFzc2Vzc21lbnQ+IHtcbiAgY29uc3QgeyBvcmdJZCwgcmVjb3JkLCBwb2xpY3ksIGFjY2VwdGFuY2UgfSA9IGlucHV0O1xuICBjb25zdCBub3cgPSBpbnB1dC5ub3cgPz8gbmV3IERhdGUoKTtcbiAgY29uc3QgcmVmID0gYCR7cmVjb3JkLm5hbWV9QCR7cmVjb3JkLnZlcnNpb259YDtcbiAgY29uc3QgZmFjdHMgPSB2ZXJzaW9uU2NhbkZhY3RzKHJlY29yZCk7XG4gIGNvbnN0IHdhcm5pbmdzOiBWdWxuV2FybmluZ1tdID0gWy4uLnNjYW5XYXJuaW5ncyhyZWNvcmQsIG5vdyldO1xuICBjb25zdCBhY2NlcHRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB3YXkgPSBpbnB1dC5zdWdnZXN0ZWRWZXJzaW9uID8gYCBNb3ZlIHRvICR7cmVjb3JkLm5hbWV9QCR7aW5wdXQuc3VnZ2VzdGVkVmVyc2lvbn0uYCA6ICcnO1xuICBjb25zdCBzdWdnZXN0ZWQgPSBpbnB1dC5zdWdnZXN0ZWRWZXJzaW9uID8geyBzdWdnZXN0ZWRWZXJzaW9uOiBpbnB1dC5zdWdnZXN0ZWRWZXJzaW9uIH0gOiB7fTtcbiAgY29uc3QgdW50aWwgPSB0b0RhdGUoYWNjZXB0YW5jZT8uYWNjZXB0ZWRVbnRpbCk/LnRvSVNPU3RyaW5nKCkgPz8gbnVsbDtcblxuICAvKiogUHVzaCBhIGZpbmRpbmcgd2FybmluZyDigJQgb3IsIHdoZW4gdGhlIHBpcGVsaW5lIGFjY2VwdGVkIGV4YWN0bHkgdGhvc2UgZmluZGluZ3MsIGl0cyBgaW5mb2AgZG93bmdyYWRlLiAqL1xuICBjb25zdCBmaW5kaW5nID0gKGNvZGU6ICdWVUxOX0tFVicgfCAnVlVMTl9GTEFHR0VEJyB8ICdWVUxOX0NSSVRJQ0FMX0ZJWEFCTEUnIHwgJ1ZVTE5fSElHSF9GSVhBQkxFJywgc2V2ZXJpdHk6IFZ1bG5TZXZlcml0eSwgbWVzc2FnZTogc3RyaW5nLCBmaW5kaW5nczogUGx1Z2luU2NhbkZpbmRpbmdbXSxcbiAgICBleHRyYTogeyBwbHVnaW4/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmc7IGdhdGVkPzogbnVtYmVyOyBoaWdoPzogbnVtYmVyIH0gPSB7fSkgPT4ge1xuICAgIGlmIChjb3ZlcnMoYWNjZXB0YW5jZSwgZmluZGluZ3MsIGZhY3RzLnRydW5jYXRlZCkpIHtcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmaW5kaW5ncykgYWNjZXB0ZWQuYWRkKHNjYW5GaW5kaW5nS2V5KGYpKTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICBjb2RlOiAnVlVMTl9BQ0NFUFRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgIG1lc3NhZ2U6IGAke21lc3NhZ2V9IEFjY2VwdGVkIGZvciB0aGlzIHBpcGVsaW5lJHt1bnRpbCA/IGAgdW50aWwgJHt1bnRpbH1gIDogJyd9LmAsXG4gICAgICAgIGZpbmRpbmdzOiBmaW5kaW5ncy5tYXAoc2NhbkZpbmRpbmdLZXkpLFxuICAgICAgICBhY2NlcHRlZFVudGlsOiB1bnRpbCxcbiAgICAgICAga2V2OiBhY2NlcHRhbmNlPy5rZXYgPz8gZmFsc2UsXG4gICAgICAgIGNvdmVyczogY29kZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3YXJuaW5ncy5wdXNoKHsgY29kZSwgc2V2ZXJpdHksIG1lc3NhZ2U6IGAke21lc3NhZ2V9JHt3YXl9YCwgZmluZGluZ3M6IGZpbmRpbmdzLnNsaWNlKDAsIDEwKSwgLi4uc3VnZ2VzdGVkLCAuLi5leHRyYSB9KTtcbiAgfTtcblxuICBjb25zdCBrZXZGaW5kaW5ncyA9IGZhY3RzLmZpbmRpbmdzLmZpbHRlcigoZikgPT4gZi5rZXYgPT09IHRydWUpO1xuICBpZiAoZmFjdHMua2V2ID4gMCkge1xuICAgIGZpbmRpbmcoJ1ZVTE5fS0VWJywgJ2NyaXRpY2FsJywgYCR7cmVmfSBoYXMgJHtmYWN0cy5rZXZ9IGZpbmRpbmcke2ZhY3RzLmtldiA9PT0gMSA/ICcnIDogJ3MnfSBvbiB0aGUgQ0lTQSBLbm93biBFeHBsb2l0ZWQgVnVsbmVyYWJpbGl0aWVzIGxpc3Qke2tldkZpbmRpbmdzLmxlbmd0aCA/IGA6ICR7ZGVzY3JpYmVGaW5kaW5ncyhrZXZGaW5kaW5ncyl9YCA6ICcnfS5gLCBrZXZGaW5kaW5ncyk7XG4gIH1cbiAgY29uc3QgZmxhZyA9IGZhY3RzLmZsYWc7XG4gIGlmIChmbGFnKSB7XG4gICAgY29uc3QgZ2F0ZWQgPSBmYWN0cy5maW5kaW5ncy5maWx0ZXIoKGYpID0+IGlzR2F0ZWRGaW5kaW5nKGYsIHBsdWdpblZ1bG5HYXRlS2V2KCksIGZsYWcuZmFpbE9uID8/ICdjcml0aWNhbCcpKTtcbiAgICBmaW5kaW5nKCdWVUxOX0ZMQUdHRUQnLCAnZXJyb3InLCBgJHtyZWZ9IGlzIGZsYWdnZWQ6IGEgcmVzY2FuIGZvdW5kICR7ZmxhZy5nYXRlZH0gZ2F0ZWQgJHtmYWlsT25MYWJlbChmbGFnLmZhaWxPbiA/PyAnY3JpdGljYWwnKX0gZmluZGluZyR7ZmxhZy5nYXRlZCA9PT0gMSA/ICcnIDogJ3MnfSBvdmVyIHRoZSBwbGF0Zm9ybSBsaW1pdCR7ZmxhZy5maW5kaW5ncy5sZW5ndGggPyBgIChmaXg6ICR7ZGVzY3JpYmVGaW5kaW5ncyhmbGFnLmZpbmRpbmdzKX0pYCA6ICcnfS5gLFxuICAgICAgZ2F0ZWQubGVuZ3RoID4gMCA/IGdhdGVkIDogZmxhZy5maW5kaW5ncywgeyBwbHVnaW46IHJlY29yZC5uYW1lLCB2ZXJzaW9uOiByZWNvcmQudmVyc2lvbiwgZ2F0ZWQ6IGZsYWcuZ2F0ZWQsIGhpZ2g6IGZsYWcuaGlnaCB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXQUlWRVItQVdBUkUsIHdoaWNoIHRoaXMgYnJhbmNoIGNvdWxkIG5vdCBiZSB1bnRpbCB0aGUgcmVjb3JkIGNhcnJpZWQgaXRzXG4gICAgLy8gb3duZXIuIERlcml2ZWQgZnJvbSB0aGUgZmluZGluZ3Mgd2hlbiB0aGV5IGNhbiBjYXJyeSB0aGUgYW5zd2VyIOKAlCB0aGVcbiAgICAvLyBzYW1lIHJ1bGUgYGdhdGVkRmluZGluZ0NvdW50YCBhcHBsaWVzIOKAlCBhbmQgZnJvbSB0aGUgcmF3IGNvbHVtbiB3aGVuIHRoZXlcbiAgICAvLyBjYW5ub3QgKHRydW5jYXRlZCwgb3Igbm9uZSBpdGVtaXplZCksIHdoaWNoIGtlZXBzIHRoZSB3YXJuaW5nIHJhdGhlciB0aGFuXG4gICAgLy8gbG9zaW5nIGl0LiBBIHdhaXZlciBzaWxlbmNlcyB0aGUgd2FybmluZyBvbmx5IHdoZXJlIGl0IGFscmVhZHkgc2lsZW5jZXNcbiAgICAvLyB0aGUgYnVpbGQgZmxvb3IgYW5kIHRoZSBwdWJsaXNoIGdhdGUuXG4gICAgY29uc3Qgd2FpdmVkS2V5cyA9IG5ldyBTZXQoXG4gICAgICBhcHBseVZ1bG5XYWl2ZXJzKHJlY29yZC5uYW1lLCBmYWN0cy5maW5kaW5ncywgdW5kZWZpbmVkLCBub3csIHJlY29yZC5vd25lck9yZ0lkID8/IHVuZGVmaW5lZCwgcmVjb3JkLnZlcnNpb24pXG4gICAgICAgIC53YWl2ZWQubWFwKHNjYW5GaW5kaW5nS2V5KSxcbiAgICApO1xuICAgIGNvbnN0IGNyaXRzID0gZmFjdHMuZmluZGluZ3MuZmlsdGVyKChmKSA9PiBmLnNldmVyaXR5ID09PSAnY3JpdGljYWwnICYmIGYuZml4ZWRJbi5sZW5ndGggPiAwICYmICF3YWl2ZWRLZXlzLmhhcyhzY2FuRmluZGluZ0tleShmKSkpO1xuICAgIGNvbnN0IGRlcml2YWJsZSA9ICFmYWN0cy50cnVuY2F0ZWQgJiYgZmFjdHMuZmluZGluZ3MubGVuZ3RoID4gMDtcbiAgICBjb25zdCBjcml0aWNhbEZpeGFibGUgPSBkZXJpdmFibGUgPyBjcml0cy5sZW5ndGggOiAoZmFjdHMuY3JpdGljYWxGaXhhYmxlID8/IDApO1xuICAgIGlmIChjcml0aWNhbEZpeGFibGUgPiAwKSB7XG4gICAgICBmaW5kaW5nKCdWVUxOX0NSSVRJQ0FMX0ZJWEFCTEUnLCAnZXJyb3InLCBgJHtyZWZ9IGhhcyAke2NyaXRpY2FsRml4YWJsZX0gZml4YWJsZSBDcml0aWNhbCBmaW5kaW5nJHtjcml0aWNhbEZpeGFibGUgPT09IDEgPyAnJyA6ICdzJ30ke2NyaXRzLmxlbmd0aCA/IGA6ICR7ZGVzY3JpYmVGaW5kaW5ncyhjcml0cyl9YCA6ICcnfS5gLCBjcml0cyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGhpZ2hGaXhhYmxlID0gZmFjdHMuaGlnaEZpeGFibGUgPz8gMDtcbiAgaWYgKGhpZ2hGaXhhYmxlID4gMCkge1xuICAgIGNvbnN0IGhpZ2hzID0gZmFjdHMuZmluZGluZ3MuZmlsdGVyKChmKSA9PiBmLnNldmVyaXR5ID09PSAnaGlnaCcgJiYgZi5maXhlZEluLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IG92ZXIgPSBwb2xpY3kud2FybkZpeGFibGVIaWdoICE9PSBudWxsICYmIGhpZ2hGaXhhYmxlID4gcG9saWN5Lndhcm5GaXhhYmxlSGlnaDtcbiAgICBmaW5kaW5nKCdWVUxOX0hJR0hfRklYQUJMRScsIG92ZXIgPyAnd2FybmluZycgOiAnaW5mbycsXG4gICAgICBgJHtyZWZ9IGhhcyAke2hpZ2hGaXhhYmxlfSBmaXhhYmxlIEhpZ2ggZmluZGluZyR7aGlnaEZpeGFibGUgPT09IDEgPyAnJyA6ICdzJ30ke292ZXIgPyBgLCBvdmVyIHlvdXIgb3JnYW5pemF0aW9uJ3MgdGhyZXNob2xkIG9mICR7cG9saWN5Lndhcm5GaXhhYmxlSGlnaH1gIDogJyd9LmAsIGhpZ2hzKTtcbiAgfVxuXG4gIGlmIChpbnB1dC5jb21wbGlhbmNlICE9PSBmYWxzZSkgd2FybmluZ3MucHVzaCguLi5hd2FpdCBjb21wbGlhbmNlVnVsbldhcm5pbmdzKG9yZ0lkLCByZWNvcmQpKTtcbiAgcmV0dXJuIHsgc2V2ZXJpdHk6IHNldmVyaXR5T2Yod2FybmluZ3MpLCB3YXJuaW5ncywgYWNjZXB0ZWRGaW5kaW5nczogWy4uLmFjY2VwdGVkXSwgZmFjdHMgfTtcbn1cblxuLyoqIFRoZSBjb21wbGlhbmNlIGF0dHJpYnV0ZXMgYSBwbHVnaW4ncyB2dWxuZXJhYmlsaXR5IHJ1bGVzIHJlYWQuICovXG5jb25zdCBWVUxOX1JVTEVfRklFTERTID0gbmV3IFNldChbJ3NjYW5uZWQnLCAndnVsbkNyaXRpY2FsJywgJ3Z1bG5IaWdoJywgJ3Z1bG5NZWRpdW0nLCAndnVsbkxvdycsICd2dWxuQ3JpdGljYWxGaXhhYmxlJywgJ3Z1bG5IaWdoRml4YWJsZSddKTtcblxuY29uc3QgZmllbGRSb290ID0gKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgPT4gZmllbGQuc3BsaXQoL1suW10vKVswXSA/PyBmaWVsZDtcblxudHlwZSBDb21wbGlhbmNlQ2xpZW50ID0gUGljazxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb21wbGlhbmNlQ2xpZW50PiwgJ2RyeVJ1blBsdWdpbic+O1xuXG5sZXQgY29tcGxpYW5jZUNsaWVudDogQ29tcGxpYW5jZUNsaWVudCB8IG51bGwgPSBudWxsO1xuXG4vKiogVGVzdCBob29rOiByZXBsYWNlIHRoZSBjb21wbGlhbmNlIGNsaWVudCB0aGUgYXNzZXNzbWVudCdzIGNvbXBsaWFuY2UgbGF5ZXIgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VnVsblBvbGljeUNvbXBsaWFuY2VDbGllbnRGb3JUZXN0cyhjbGllbnQ6IENvbXBsaWFuY2VDbGllbnQgfCBudWxsKTogdm9pZCB7XG4gIGNvbXBsaWFuY2VDbGllbnQgPSBjbGllbnQ7XG59XG5cbi8qKlxuICogVGhlIG9yZydzIHBsdWdpbiBjb21wbGlhbmNlIHJ1bGVzIG9uIHRoZSB2dWxuZXJhYmlsaXR5IGF0dHJpYnV0ZXMsIGV2YWx1YXRlZFxuICogYWdhaW5zdCB0aGUgUkVTT0xWRUQgdmVyc2lvbiDigJQgdGhlIG9yZydzIG93biByb3csIGl0cyBwYXJlbnQncywgYSBzeXN0ZW1cbiAqIHBsdWdpbiBvciBhbiBpbnN0YWxsZWQgbWFya2V0cGxhY2UgdmVyc2lvbiBhbGlrZS4gQSBCTE9DSy1tb2RlIHJ1bGUgdGhhdCBmYWlsc1xuICogaXMgYW4gYGVycm9yYCwgYSBXQVJOLW1vZGUgb25lIGEgYHdhcm5pbmdgOyBuZWl0aGVyIHJlZnVzZXMgYW55dGhpbmcgaGVyZVxuICogKHZ1bG5lcmFiaWxpdHkgc3RhdGUgbmV2ZXIgc3RvcHMgYSBwaXBlbGluZSkuXG4gKlxuICogT25seSB0aGUgdnVsbiAvIHNjYW5uZWQgcnVsZXMgY291bnQgaGVyZTogdGhlIHBsdWdpbidzIG90aGVyIHJ1bGVzICh0YWdzLFxuICogc2VjcmV0cywgY29tbWFuZHMg4oCmKSBkZXNjcmliZSBob3cgYSBwbHVnaW4gaXMgQVVUSE9SRUQsIHdoaWNoIGlzIGl0cyBvd25lcidzXG4gKiBjb25jZXJuIGF0IHVwbG9hZCwgbm90IHRoZSBjb25zdW1lcidzIGF0IHJlc29sdXRpb24g4oCUIGFuZCBhIHN5c3RlbSBwbHVnaW4gd291bGRcbiAqIG90aGVyd2lzZSBmYWlsIGV2ZXJ5IHRlbmFudCdzIGF1dGhvcmluZyBydWxlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcGxpYW5jZVZ1bG5XYXJuaW5ncyhvcmdJZDogc3RyaW5nLCByZWNvcmQ6IFNjYW5uZWRSZWNvcmQpOiBQcm9taXNlPFZ1bG5XYXJuaW5nW10+IHtcbiAgaWYgKGlzU3lzdGVtT3JnSWQob3JnSWQpIHx8ICFoYXNJbWFnZShyZWNvcmQpKSByZXR1cm4gW107XG4gIGNvbnN0IGZhY3RzID0gZGVyaXZlUGx1Z2luSW1hZ2VDb21wbGlhbmNlKHJlY29yZCwgbnVsbCkuYXR0cmlidXRlcztcbiAgY29uc3QgYXR0cmlidXRlczogUGx1Z2luQ29tcGxpYW5jZUF0dHJpYnV0ZXMgPSB7IG5hbWU6IHJlY29yZC5uYW1lLCB2ZXJzaW9uOiByZWNvcmQudmVyc2lvbiwgLi4uZmFjdHMgfTtcbiAgdHJ5IHtcbiAgICBjb21wbGlhbmNlQ2xpZW50ID8/PSBjcmVhdGVDb21wbGlhbmNlQ2xpZW50KCk7XG4gICAgY29uc3QgYXV0aCA9IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6ICdwbHVnaW4nLCBvcmdJZCwgcm9sZTogJ21lbWJlcicgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGxpYW5jZUNsaWVudC5kcnlSdW5QbHVnaW4ob3JnSWQsIGF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGF1dGgpO1xuICAgIGNvbnN0IHJlbGV2YW50ID0gKHY6IENvbXBsaWFuY2VWaW9sYXRpb24pID0+IFZVTE5fUlVMRV9GSUVMRFMuaGFzKGZpZWxkUm9vdCh2LmZpZWxkKSk7XG4gICAgY29uc3QgYXMgPSAobW9kZTogJ2Jsb2NrJyB8ICd3YXJuJykgPT4gKHY6IENvbXBsaWFuY2VWaW9sYXRpb24pOiBWdWxuV2FybmluZyA9PiAoe1xuICAgICAgY29kZTogJ0NPTVBMSUFOQ0VfVlVMTl9SVUxFJyxcbiAgICAgIHNldmVyaXR5OiBtb2RlID09PSAnYmxvY2snID8gJ2Vycm9yJyA6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6IGAke3JlY29yZC5uYW1lfUAke3JlY29yZC52ZXJzaW9ufTogJHt2Lm1lc3NhZ2V9YCxcbiAgICAgIHJ1bGVJZDogdi5ydWxlSWQsXG4gICAgICBydWxlTmFtZTogdi5ydWxlTmFtZSxcbiAgICAgIGZpZWxkOiB2LmZpZWxkLFxuICAgICAgbW9kZSxcbiAgICB9KTtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC52aW9sYXRpb25zLmZpbHRlcihyZWxldmFudCkubWFwKGFzKCdibG9jaycpKSwgLi4ucmVzdWx0Lndhcm5pbmdzLmZpbHRlcihyZWxldmFudCkubWFwKGFzKCd3YXJuJykpXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIFt7IGNvZGU6ICdDT01QTElBTkNFX1VOQVZBSUxBQkxFJywgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogYFlvdXIgb3JnYW5pemF0aW9uJ3MgcGx1Z2luIHZ1bG5lcmFiaWxpdHkgcnVsZXMgY291bGQgbm90IGJlIGNoZWNrZWQgZm9yICR7cmVjb3JkLm5hbWV9QCR7cmVjb3JkLnZlcnNpb259ICgke2Vycm9yTWVzc2FnZShlcnIpfSkuYCB9XTtcbiAgfVxufVxuIl19
|
package/lib/types/ai-catalog.js
CHANGED
|
@@ -79,4 +79,4 @@ export function isKeylessProviderId(providerId) {
|
|
|
79
79
|
export const AI_PROVIDER_NAMES = Object.fromEntries(Object.values(AI_PROVIDER_CATALOG).map((p) => [p.id, p.name]));
|
|
80
80
|
/** Model lists by provider id — the catalog's models, for UI surfaces that need only those. */
|
|
81
81
|
export const AI_PROVIDER_MODELS = Object.fromEntries(Object.values(AI_PROVIDER_CATALOG).map((p) => [p.id, p.models]));
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9haS1jYXRhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUE2Q3RDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBbUM7SUFDakUsV0FBVyxFQUFFO1FBQ1gsRUFBRSxFQUFFLFdBQVc7UUFDZixJQUFJLEVBQUUsV0FBVztRQUNqQixNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDdEQsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQ2xELEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNwRCxFQUFFLEVBQUUsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7U0FDOUQ7S0FDRjtJQUNELFFBQVEsRUFBRTtRQUNSLEVBQUUsRUFBRSxRQUFRO1FBQ1osSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUMxQyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRTtZQUM5QyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRTtTQUM3QztLQUNGO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsRUFBRSxFQUFFLFFBQVE7UUFDWixJQUFJLEVBQUUsUUFBUTtRQUNkLE1BQU0sRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNwRCxFQUFFLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7U0FDekQ7S0FDRjtJQUNELEtBQUssRUFBRTtRQUNMLEVBQUUsRUFBRSxLQUFLO1FBQ1QsSUFBSSxFQUFFLFlBQVk7UUFDbEIsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDcEMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDcEMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7U0FDckM7S0FDRjtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLEVBQUUsRUFBRSxnQkFBZ0I7UUFDcEIsSUFBSSxFQUFFLGdCQUFnQjtRQUN0Qix5RUFBeUU7UUFDekUsT0FBTyxFQUFFLElBQUk7UUFDYiwyRUFBMkU7UUFDM0UsMEVBQTBFO1FBQzFFLGtFQUFrRTtRQUNsRSxNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDbkUsRUFBRSxFQUFFLEVBQUUsOEJBQThCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQy9ELEVBQUUsRUFBRSxFQUFFLDZDQUE2QyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUMvRSxFQUFFLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7U0FDM0Q7S0FDRjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztLQUNyRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztLQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVwQixvR0FBb0c7QUFDcEcsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQWtCO0lBQ3BELE9BQU8sbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxLQUFLLElBQUksQ0FBQztBQUMzRCxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUEyQixNQUFNLENBQUMsV0FBVyxDQUN6RSxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQzlELENBQUM7QUFFRiwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWtDLE1BQU0sQ0FBQyxXQUFXLENBQ2pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBBSSBwcm92aWRlciArIG1vZGVsIGNhdGFsb2csIGFzIERBVEEgT05MWS5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgYW5kIGVudi1mcmVlIHNvIHRoZSBicm93c2VyIGltcG9ydHMgaXQgZGlyZWN0bHlcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvYWktY2F0YWxvZ2ApIOKAlCB0aGUgZnJvbnRlbmQncyBtb2RlbCBwaWNrZXIgYW5kIHRoZVxuICogYmFja2VuZCdzIHByb3ZpZGVyIHJlZ2lzdHJ5IHJlYWQgdGhlIG9uZSBsaXN0LCBpbnN0ZWFkIG9mIHRoZSBmcm9udGVuZCBrZWVwaW5nIGFcbiAqIGhhbmQtbWFpbnRhaW5lZCBtaXJyb3IgdGhhdCBkcmlmdGVkIGV2ZXJ5IHRpbWUgYSBtb2RlbCBzaGlwcGVkLiBBbnl0aGluZyB0aGF0XG4gKiByZWFkcyB0aGUgZW52aXJvbm1lbnQgKHRoZSBPcGVuQUktY29tcGF0aWJsZSBlbmRwb2ludCwgcHJvdmlkZXIga2V5IGVudiB2YXJzKVxuICogc3RheXMgaW4gYGNvbnN0YW50cy9haS1wcm92aWRlcnMudHNgLCB3aGljaCByZS1leHBvcnRzIHRoaXMuXG4gKi9cblxuLyoqIE1ldGFkYXRhIGZvciBhIHNpbmdsZSBBSSBtb2RlbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQUlNb2RlbEluZm8ge1xuICAvKiogTW9kZWwgaWRlbnRpZmllciB1c2VkIGluIEFQSSBjYWxscyAoZS5nLiBcImNsYXVkZS1zb25uZXQtNS01XCIpLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGlzcGxheSBuYW1lIChlLmcuIFwiQ2xhdWRlIFNvbm5ldCA1LjVcIikuICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqIE1ldGFkYXRhIGZvciBhbiBBSSBwcm92aWRlciB3aXRoIGl0cyBhdmFpbGFibGUgbW9kZWxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBSVByb3ZpZGVySW5mbyB7XG4gIC8qKiBQcm92aWRlciBpZGVudGlmaWVyIChlLmcuIFwiYW50aHJvcGljXCIsIFwib3BlbmFpXCIsIFwiZ29vZ2xlXCIpLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGlzcGxheSBuYW1lIChlLmcuIFwiQW50aHJvcGljXCIpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBNb2RlbHMgYXZhaWxhYmxlIGZvciB0aGlzIHByb3ZpZGVyLiAqL1xuICBtb2RlbHM6IEFJTW9kZWxJbmZvW107XG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZXIgYXV0aGVudGljYXRlcyB3aXRoIHRoZSBERVBMT1lNRU5UJ3Mgb3duIGNyZWRlbnRpYWxzIChhbiBJQU1cbiAgICogcm9sZSksIG5vdCBhbiBBUEkga2V5IOKAlCBzbyB0aGVyZSBpcyBubyBrZXkgZm9yIGFuIG9yZ2FuaXphdGlvbiB0byBicmluZy5cbiAgICogQWJzZW50ID0ga2V5LWJhc2VkLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBPTkUgcGxhY2UgdGhhdCBmYWN0IGlzIHJlY29yZGVkLiBFdmVyeXRoaW5nIHRoYXQgYXNrcyBcImNhbiBhblxuICAgKiBvcmcgaG9sZCBpdHMgb3duIGtleSBmb3IgdGhpcyBwcm92aWRlcj9cIiByZWFkcyB7QGxpbmsgQUlfS0VZX1BST1ZJREVSX0lEU31cbiAgICogb3Ige0BsaW5rIGlzS2V5bGVzc1Byb3ZpZGVySWR9OiB0aGUgc2V0dGluZ3MgcGlja2VyIHRoYXQgb2ZmZXJzIHRoZSBzbG90LFxuICAgKiB0aGUgcGxhdGZvcm0gdGhhdCBzdG9yZXMgYW5kIHJlLWVuY3J5cHRzIGl0LCB0aGUgaW50ZXJuYWwgcm91dGUgdGhhdCBzZXJ2ZXNcbiAgICogaXQsIGFuZCB0aGUgbW9kZWwgc2VsZWN0aW9uIHRoYXQgc3BlbmRzIGl0LiBUaGV5IGRpc2FncmVlZCBvbmNlIOKAlCB0aGVcbiAgICogcGlja2VyIG9mZmVyZWQgQW1hem9uIEJlZHJvY2ssIHRoZSBwbGF0Zm9ybSBlbmNyeXB0ZWQgdGhlIGtleSBhbmQgcmVwb3J0ZWRcbiAgICogaXQgYGNvbmZpZ3VyZWRgLCBhbmQgbm8gQUkgY2FsbCBjb3VsZCBldmVyIHVzZSBpdC5cbiAgICovXG4gIGtleWxlc3M/OiB0cnVlO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIEFJIHByb3ZpZGVyIGNhdGFsb2cg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGFsbCBzdXBwb3J0ZWRcbiAqIHByb3ZpZGVycyBhbmQgdGhlaXIgbW9kZWxzLiBUaGUgRklSU1QgbW9kZWwgb2YgYSBwcm92aWRlciBpcyBpdHMgZGVmYXVsdFxuICogKHdoYXQgYSBwcm92aWRlci1vbmx5IHJlcXVlc3QgcmVzb2x2ZXMgdG8pLCBzbyBvcmRlciBtYXR0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgQUlfUFJPVklERVJfQ0FUQUxPRzogUmVjb3JkPHN0cmluZywgQUlQcm92aWRlckluZm8+ID0ge1xuICAnYW50aHJvcGljJzoge1xuICAgIGlkOiAnYW50aHJvcGljJyxcbiAgICBuYW1lOiAnQW50aHJvcGljJyxcbiAgICBtb2RlbHM6IFtcbiAgICAgIHsgaWQ6ICdjbGF1ZGUtc29ubmV0LTUtNScsIG5hbWU6ICdDbGF1ZGUgU29ubmV0IDUuNScgfSxcbiAgICAgIHsgaWQ6ICdjbGF1ZGUtb3B1cy01LTUnLCBuYW1lOiAnQ2xhdWRlIE9wdXMgNS41JyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1mYWJsZS01LTEnLCBuYW1lOiAnQ2xhdWRlIEZhYmxlIDUuMScgfSxcbiAgICAgIHsgaWQ6ICdjbGF1ZGUtaGFpa3UtNC01LTIwMjUxMDAxJywgbmFtZTogJ0NsYXVkZSBIYWlrdSA0LjUnIH0sXG4gICAgXSxcbiAgfSxcbiAgJ29wZW5haSc6IHtcbiAgICBpZDogJ29wZW5haScsXG4gICAgbmFtZTogJ09wZW5BSScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnZ3B0LTUuNi1zb2wnLCBuYW1lOiAnR1BULTUuNiBTb2wnIH0sXG4gICAgICB7IGlkOiAnZ3B0LTUuNi10ZXJyYScsIG5hbWU6ICdHUFQtNS42IFRlcnJhJyB9LFxuICAgICAgeyBpZDogJ2dwdC01LjYtbHVuYScsIG5hbWU6ICdHUFQtNS42IEx1bmEnIH0sXG4gICAgXSxcbiAgfSxcbiAgJ2dvb2dsZSc6IHtcbiAgICBpZDogJ2dvb2dsZScsXG4gICAgbmFtZTogJ0dvb2dsZScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnZ2VtaW5pLTMuNy1mbGFzaCcsIG5hbWU6ICdHZW1pbmkgMy43IEZsYXNoJyB9LFxuICAgICAgeyBpZDogJ2dlbWluaS0zLjEtcHJvLXByZXZpZXcnLCBuYW1lOiAnR2VtaW5pIDMuMSBQcm8nIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3hhaSc6IHtcbiAgICBpZDogJ3hhaScsXG4gICAgbmFtZTogJ3hBSSAoR3JvayknLFxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ2dyb2stNC42JywgbmFtZTogJ0dyb2sgNC42JyB9LFxuICAgICAgeyBpZDogJ2dyb2stNC41JywgbmFtZTogJ0dyb2sgNC41JyB9LFxuICAgICAgeyBpZDogJ2dyb2stNC4zJywgbmFtZTogJ0dyb2sgNC4zJyB9LFxuICAgIF0sXG4gIH0sXG4gICdhbWF6b24tYmVkcm9jayc6IHtcbiAgICBpZDogJ2FtYXpvbi1iZWRyb2NrJyxcbiAgICBuYW1lOiAnQW1hem9uIEJlZHJvY2snLFxuICAgIC8vIEF1dGhlbnRpY2F0ZWQgYnkgdGhlIGRlcGxveW1lbnQncyBJQU0gcm9sZSwgbmV2ZXIgYW4gb3JnLXN1cHBsaWVkIGtleS5cbiAgICBrZXlsZXNzOiB0cnVlLFxuICAgIC8vIEJlZHJvY2sgaWRzIGFyZSByZWdpb24tc2NvcGVkIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcHJvZmlsZXM7IHRoZSBgdXMuYFxuICAgIC8vIHByZWZpeCB0YXJnZXRzIFVTIHJlZ2lvbnMg4oCUIHN3YXAgdGhlIHByZWZpeCAoZXUuL2FwYWMuL+KApikgdG8gbWF0Y2ggeW91clxuICAgIC8vIGRlcGxveSByZWdpb24sIGFuZCBjb25maXJtIGF2YWlsYWJpbGl0eSBpbiB0aGUgQmVkcm9jayBjb25zb2xlLlxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ3VzLmFudGhyb3BpYy5jbGF1ZGUtc29ubmV0LTUtNScsIG5hbWU6ICdDbGF1ZGUgU29ubmV0IDUuNScgfSxcbiAgICAgIHsgaWQ6ICd1cy5hbnRocm9waWMuY2xhdWRlLW9wdXMtNS01JywgbmFtZTogJ0NsYXVkZSBPcHVzIDUuNScgfSxcbiAgICAgIHsgaWQ6ICd1cy5hbnRocm9waWMuY2xhdWRlLWhhaWt1LTQtNS0yMDI1MTAwMS12MTowJywgbmFtZTogJ0NsYXVkZSBIYWlrdSA0LjUnIH0sXG4gICAgICB7IGlkOiAndXMuYW1hem9uLm5vdmEtcHJvLXYxOjAnLCBuYW1lOiAnQW1hem9uIE5vdmEgUHJvJyB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFByb3ZpZGVyIGlkcyBhbiBvcmdhbml6YXRpb24gQ0FOIGhvbGQgaXRzIG93biBBUEkga2V5IGZvciDigJQgdGhlIGNhdGFsb2cgbWludXNcbiAqIHRoZSBrZXlsZXNzIHByb3ZpZGVycyAoe0BsaW5rIEFJUHJvdmlkZXJJbmZvLmtleWxlc3N9KS5cbiAqXG4gKiBUaGUgc2luZ2xlIGxpc3QgYmVoaW5kIGV2ZXJ5IG9yZy1rZXkgc3VyZmFjZTogdGhlIHNldHRpbmdzIHBpY2tlciBvZmZlcnMgdGhlc2VcbiAqIHNsb3RzLCB0aGUgcGxhdGZvcm0gc3RvcmVzIGFuZCByZS1lbmNyeXB0cyB0aGVzZSBmaWVsZHMsIGBHRVRcbiAqIC9pbnRlcm5hbC9haS9rZXlzLzpvcmdJZC86cHJvdmlkZXJgIHNlcnZlcyBvbmx5IHRoZXNlLCBhbmQgb3JnLWF3YXJlIG1vZGVsXG4gKiBzZWxlY3Rpb24gc3BlbmRzIG9ubHkgdGhlc2UuIEEgcHJvdmlkZXIgYWJzZW50IGhlcmUgaGFzIG5vIG9yZyBrZXkgYnlcbiAqIGNvbnN0cnVjdGlvbiwgc28gbm8gY2FsbGVyIG5lZWRzIGl0cyBvd24gZXhjbHVzaW9uLlxuICovXG5leHBvcnQgY29uc3QgQUlfS0VZX1BST1ZJREVSX0lEUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QudmFsdWVzKEFJX1BST1ZJREVSX0NBVEFMT0cpXG4gIC5maWx0ZXIoKHApID0+ICFwLmtleWxlc3MpXG4gIC5tYXAoKHApID0+IHAuaWQpO1xuXG4vKiogVHJ1ZSB3aGVuIHRoZSBwcm92aWRlciBhdXRoZW50aWNhdGVzIHdpdGggdGhlIGRlcGxveW1lbnQncyBvd24gY3JlZGVudGlhbHMgcmF0aGVyIHRoYW4gYSBrZXkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNLZXlsZXNzUHJvdmlkZXJJZChwcm92aWRlcklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFJX1BST1ZJREVSX0NBVEFMT0dbcHJvdmlkZXJJZF0/LmtleWxlc3MgPT09IHRydWU7XG59XG5cbi8qKiBEaXNwbGF5IG5hbWVzIGJ5IHByb3ZpZGVyIGlkIOKAlCB0aGUgY2F0YWxvZydzIG5hbWVzLCBmb3IgVUkgc3VyZmFjZXMgdGhhdCBsaXN0IHByb3ZpZGVycy4gKi9cbmV4cG9ydCBjb25zdCBBSV9QUk9WSURFUl9OQU1FUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgT2JqZWN0LnZhbHVlcyhBSV9QUk9WSURFUl9DQVRBTE9HKS5tYXAoKHApID0+IFtwLmlkLCBwLm5hbWVdKSxcbik7XG5cbi8qKiBNb2RlbCBsaXN0cyBieSBwcm92aWRlciBpZCDigJQgdGhlIGNhdGFsb2cncyBtb2RlbHMsIGZvciBVSSBzdXJmYWNlcyB0aGF0IG5lZWQgb25seSB0aG9zZS4gKi9cbmV4cG9ydCBjb25zdCBBSV9QUk9WSURFUl9NT0RFTFM6IFJlY29yZDxzdHJpbmcsIEFJTW9kZWxJbmZvW10+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBPYmplY3QudmFsdWVzKEFJX1BST1ZJREVSX0NBVEFMT0cpLm1hcCgocCkgPT4gW3AuaWQsIHAubW9kZWxzXSksXG4pO1xuIl19
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktY2F0YWxvZy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2FpLWNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQTZDdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFtQztJQUNqRSxXQUFXLEVBQUU7UUFDWCxFQUFFLEVBQUUsV0FBVztRQUNmLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUN0RCxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDbEQsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELEVBQUUsRUFBRSxFQUFFLDJCQUEyQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtTQUM5RDtLQUNGO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsRUFBRSxFQUFFLFFBQVE7UUFDWixJQUFJLEVBQUUsUUFBUTtRQUNkLE1BQU0sRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQzFDLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQzlDLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFO1NBQzdDO0tBQ0Y7SUFDRCxRQUFRLEVBQUU7UUFDUixFQUFFLEVBQUUsUUFBUTtRQUNaLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELEVBQUUsRUFBRSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtTQUN6RDtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsRUFBRSxFQUFFLEtBQUs7UUFDVCxJQUFJLEVBQUUsWUFBWTtRQUNsQixNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNwQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNwQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtTQUNyQztLQUNGO0lBQ0QsZ0JBQWdCLEVBQUU7UUFDaEIsRUFBRSxFQUFFLGdCQUFnQjtRQUNwQixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLHlFQUF5RTtRQUN6RSxPQUFPLEVBQUUsSUFBSTtRQUNiLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLE1BQU0sRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFLGdDQUFnQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUNuRSxFQUFFLEVBQUUsRUFBRSw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDL0QsRUFBRSxFQUFFLEVBQUUsNkNBQTZDLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQy9FLEVBQUUsRUFBRSxFQUFFLHlCQUF5QixFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtTQUMzRDtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO0tBQ3JGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXBCLG9HQUFvRztBQUNwRyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBa0I7SUFDcEQsT0FBTyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEtBQUssSUFBSSxDQUFDO0FBQzNELENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQTJCLE1BQU0sQ0FBQyxXQUFXLENBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDOUQsQ0FBQztBQUVGLCtGQUErRjtBQUMvRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBa0MsTUFBTSxDQUFDLFdBQVcsQ0FDakYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIEFJIHByb3ZpZGVyICsgbW9kZWwgY2F0YWxvZywgYXMgREFUQSBPTkxZLlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSBhbmQgZW52LWZyZWUgc28gdGhlIGJyb3dzZXIgaW1wb3J0cyBpdCBkaXJlY3RseVxuICogKGBAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9haS1jYXRhbG9nYCkg4oCUIHRoZSBmcm9udGVuZCdzIG1vZGVsIHBpY2tlciBhbmQgdGhlXG4gKiBiYWNrZW5kJ3MgcHJvdmlkZXIgcmVnaXN0cnkgcmVhZCB0aGUgb25lIGxpc3QsIGluc3RlYWQgb2YgdGhlIGZyb250ZW5kIGtlZXBpbmcgYVxuICogaGFuZC1tYWludGFpbmVkIG1pcnJvciB0aGF0IGRyaWZ0ZWQgZXZlcnkgdGltZSBhIG1vZGVsIHNoaXBwZWQuIEFueXRoaW5nIHRoYXRcbiAqIHJlYWRzIHRoZSBlbnZpcm9ubWVudCAodGhlIE9wZW5BSS1jb21wYXRpYmxlIGVuZHBvaW50LCBwcm92aWRlciBrZXkgZW52IHZhcnMpXG4gKiBzdGF5cyBpbiBgY29uc3RhbnRzL2FpLXByb3ZpZGVycy50c2AsIHdoaWNoIHJlLWV4cG9ydHMgdGhpcy5cbiAqL1xuXG4vKiogTWV0YWRhdGEgZm9yIGEgc2luZ2xlIEFJIG1vZGVsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBSU1vZGVsSW5mbyB7XG4gIC8qKiBNb2RlbCBpZGVudGlmaWVyIHVzZWQgaW4gQVBJIGNhbGxzIChlLmcuIFwiY2xhdWRlLXNvbm5ldC01LTVcIikuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJDbGF1ZGUgU29ubmV0IDUuNVwiKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKiogTWV0YWRhdGEgZm9yIGFuIEFJIHByb3ZpZGVyIHdpdGggaXRzIGF2YWlsYWJsZSBtb2RlbHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEFJUHJvdmlkZXJJbmZvIHtcbiAgLyoqIFByb3ZpZGVyIGlkZW50aWZpZXIgKGUuZy4gXCJhbnRocm9waWNcIiwgXCJvcGVuYWlcIiwgXCJnb29nbGVcIikuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJBbnRocm9waWNcIikuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIE1vZGVscyBhdmFpbGFibGUgZm9yIHRoaXMgcHJvdmlkZXIuICovXG4gIG1vZGVsczogQUlNb2RlbEluZm9bXTtcbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciBhdXRoZW50aWNhdGVzIHdpdGggdGhlIERFUExPWU1FTlQncyBvd24gY3JlZGVudGlhbHMgKGFuIElBTVxuICAgKiByb2xlKSwgbm90IGFuIEFQSSBrZXkg4oCUIHNvIHRoZXJlIGlzIG5vIGtleSBmb3IgYW4gb3JnYW5pemF0aW9uIHRvIGJyaW5nLlxuICAgKiBBYnNlbnQgPSBrZXktYmFzZWQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIE9ORSBwbGFjZSB0aGF0IGZhY3QgaXMgcmVjb3JkZWQuIEV2ZXJ5dGhpbmcgdGhhdCBhc2tzIFwiY2FuIGFuXG4gICAqIG9yZyBob2xkIGl0cyBvd24ga2V5IGZvciB0aGlzIHByb3ZpZGVyP1wiIHJlYWRzIHtAbGluayBBSV9LRVlfUFJPVklERVJfSURTfVxuICAgKiBvciB7QGxpbmsgaXNLZXlsZXNzUHJvdmlkZXJJZH06IHRoZSBzZXR0aW5ncyBwaWNrZXIgdGhhdCBvZmZlcnMgdGhlIHNsb3QsXG4gICAqIHRoZSBwbGF0Zm9ybSB0aGF0IHN0b3JlcyBhbmQgcmUtZW5jcnlwdHMgaXQsIHRoZSBpbnRlcm5hbCByb3V0ZSB0aGF0IHNlcnZlc1xuICAgKiBpdCwgYW5kIHRoZSBtb2RlbCBzZWxlY3Rpb24gdGhhdCBzcGVuZHMgaXQuIFRoZXkgZGlzYWdyZWVkIG9uY2Ug4oCUIHRoZVxuICAgKiBwaWNrZXIgb2ZmZXJlZCBBbWF6b24gQmVkcm9jaywgdGhlIHBsYXRmb3JtIGVuY3J5cHRlZCB0aGUga2V5IGFuZCByZXBvcnRlZFxuICAgKiBpdCBgY29uZmlndXJlZGAsIGFuZCBubyBBSSBjYWxsIGNvdWxkIGV2ZXIgdXNlIGl0LlxuICAgKi9cbiAga2V5bGVzcz86IHRydWU7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQUkgcHJvdmlkZXIgY2F0YWxvZyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYWxsIHN1cHBvcnRlZFxuICogcHJvdmlkZXJzIGFuZCB0aGVpciBtb2RlbHMuIFRoZSBGSVJTVCBtb2RlbCBvZiBhIHByb3ZpZGVyIGlzIGl0cyBkZWZhdWx0XG4gKiAod2hhdCBhIHByb3ZpZGVyLW9ubHkgcmVxdWVzdCByZXNvbHZlcyB0byksIHNvIG9yZGVyIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBBSV9QUk9WSURFUl9DQVRBTE9HOiBSZWNvcmQ8c3RyaW5nLCBBSVByb3ZpZGVySW5mbz4gPSB7XG4gICdhbnRocm9waWMnOiB7XG4gICAgaWQ6ICdhbnRocm9waWMnLFxuICAgIG5hbWU6ICdBbnRocm9waWMnLFxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ2NsYXVkZS1zb25uZXQtNS01JywgbmFtZTogJ0NsYXVkZSBTb25uZXQgNS41JyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1vcHVzLTUtNScsIG5hbWU6ICdDbGF1ZGUgT3B1cyA1LjUnIH0sXG4gICAgICB7IGlkOiAnY2xhdWRlLWZhYmxlLTUtMScsIG5hbWU6ICdDbGF1ZGUgRmFibGUgNS4xJyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1oYWlrdS00LTUtMjAyNTEwMDEnLCBuYW1lOiAnQ2xhdWRlIEhhaWt1IDQuNScgfSxcbiAgICBdLFxuICB9LFxuICAnb3BlbmFpJzoge1xuICAgIGlkOiAnb3BlbmFpJyxcbiAgICBuYW1lOiAnT3BlbkFJJyxcbiAgICBtb2RlbHM6IFtcbiAgICAgIHsgaWQ6ICdncHQtNS42LXNvbCcsIG5hbWU6ICdHUFQtNS42IFNvbCcgfSxcbiAgICAgIHsgaWQ6ICdncHQtNS42LXRlcnJhJywgbmFtZTogJ0dQVC01LjYgVGVycmEnIH0sXG4gICAgICB7IGlkOiAnZ3B0LTUuNi1sdW5hJywgbmFtZTogJ0dQVC01LjYgTHVuYScgfSxcbiAgICBdLFxuICB9LFxuICAnZ29vZ2xlJzoge1xuICAgIGlkOiAnZ29vZ2xlJyxcbiAgICBuYW1lOiAnR29vZ2xlJyxcbiAgICBtb2RlbHM6IFtcbiAgICAgIHsgaWQ6ICdnZW1pbmktMy43LWZsYXNoJywgbmFtZTogJ0dlbWluaSAzLjcgRmxhc2gnIH0sXG4gICAgICB7IGlkOiAnZ2VtaW5pLTMuMS1wcm8tcHJldmlldycsIG5hbWU6ICdHZW1pbmkgMy4xIFBybycgfSxcbiAgICBdLFxuICB9LFxuICAneGFpJzoge1xuICAgIGlkOiAneGFpJyxcbiAgICBuYW1lOiAneEFJIChHcm9rKScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnZ3Jvay00LjYnLCBuYW1lOiAnR3JvayA0LjYnIH0sXG4gICAgICB7IGlkOiAnZ3Jvay00LjUnLCBuYW1lOiAnR3JvayA0LjUnIH0sXG4gICAgICB7IGlkOiAnZ3Jvay00LjMnLCBuYW1lOiAnR3JvayA0LjMnIH0sXG4gICAgXSxcbiAgfSxcbiAgJ2FtYXpvbi1iZWRyb2NrJzoge1xuICAgIGlkOiAnYW1hem9uLWJlZHJvY2snLFxuICAgIG5hbWU6ICdBbWF6b24gQmVkcm9jaycsXG4gICAgLy8gQXV0aGVudGljYXRlZCBieSB0aGUgZGVwbG95bWVudCdzIElBTSByb2xlLCBuZXZlciBhbiBvcmctc3VwcGxpZWQga2V5LlxuICAgIGtleWxlc3M6IHRydWUsXG4gICAgLy8gQmVkcm9jayBpZHMgYXJlIHJlZ2lvbi1zY29wZWQgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBwcm9maWxlczsgdGhlIGB1cy5gXG4gICAgLy8gcHJlZml4IHRhcmdldHMgVVMgcmVnaW9ucyDigJQgc3dhcCB0aGUgcHJlZml4IChldS4vYXBhYy4v4oCmKSB0byBtYXRjaCB5b3VyXG4gICAgLy8gZGVwbG95IHJlZ2lvbiwgYW5kIGNvbmZpcm0gYXZhaWxhYmlsaXR5IGluIHRoZSBCZWRyb2NrIGNvbnNvbGUuXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAndXMuYW50aHJvcGljLmNsYXVkZS1zb25uZXQtNS01JywgbmFtZTogJ0NsYXVkZSBTb25uZXQgNS41JyB9LFxuICAgICAgeyBpZDogJ3VzLmFudGhyb3BpYy5jbGF1ZGUtb3B1cy01LTUnLCBuYW1lOiAnQ2xhdWRlIE9wdXMgNS41JyB9LFxuICAgICAgeyBpZDogJ3VzLmFudGhyb3BpYy5jbGF1ZGUtaGFpa3UtNC01LTIwMjUxMDAxLXYxOjAnLCBuYW1lOiAnQ2xhdWRlIEhhaWt1IDQuNScgfSxcbiAgICAgIHsgaWQ6ICd1cy5hbWF6b24ubm92YS1wcm8tdjE6MCcsIG5hbWU6ICdBbWF6b24gTm92YSBQcm8nIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbi8qKlxuICogUHJvdmlkZXIgaWRzIGFuIG9yZ2FuaXphdGlvbiBDQU4gaG9sZCBpdHMgb3duIEFQSSBrZXkgZm9yIOKAlCB0aGUgY2F0YWxvZyBtaW51c1xuICogdGhlIGtleWxlc3MgcHJvdmlkZXJzICh7QGxpbmsgQUlQcm92aWRlckluZm8ua2V5bGVzc30pLlxuICpcbiAqIFRoZSBzaW5nbGUgbGlzdCBiZWhpbmQgZXZlcnkgb3JnLWtleSBzdXJmYWNlOiB0aGUgc2V0dGluZ3MgcGlja2VyIG9mZmVycyB0aGVzZVxuICogc2xvdHMsIHRoZSBwbGF0Zm9ybSBzdG9yZXMgYW5kIHJlLWVuY3J5cHRzIHRoZXNlIGZpZWxkcywgYEdFVFxuICogL2ludGVybmFsL2FpL2tleXMvOm9yZ0lkLzpwcm92aWRlcmAgc2VydmVzIG9ubHkgdGhlc2UsIGFuZCBvcmctYXdhcmUgbW9kZWxcbiAqIHNlbGVjdGlvbiBzcGVuZHMgb25seSB0aGVzZS4gQSBwcm92aWRlciBhYnNlbnQgaGVyZSBoYXMgbm8gb3JnIGtleSBieVxuICogY29uc3RydWN0aW9uLCBzbyBubyBjYWxsZXIgbmVlZHMgaXRzIG93biBleGNsdXNpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBBSV9LRVlfUFJPVklERVJfSURTOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC52YWx1ZXMoQUlfUFJPVklERVJfQ0FUQUxPRylcbiAgLmZpbHRlcigocCkgPT4gIXAua2V5bGVzcylcbiAgLm1hcCgocCkgPT4gcC5pZCk7XG5cbi8qKiBUcnVlIHdoZW4gdGhlIHByb3ZpZGVyIGF1dGhlbnRpY2F0ZXMgd2l0aCB0aGUgZGVwbG95bWVudCdzIG93biBjcmVkZW50aWFscyByYXRoZXIgdGhhbiBhIGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0tleWxlc3NQcm92aWRlcklkKHByb3ZpZGVySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gQUlfUFJPVklERVJfQ0FUQUxPR1twcm92aWRlcklkXT8ua2V5bGVzcyA9PT0gdHJ1ZTtcbn1cblxuLyoqIERpc3BsYXkgbmFtZXMgYnkgcHJvdmlkZXIgaWQg4oCUIHRoZSBjYXRhbG9nJ3MgbmFtZXMsIGZvciBVSSBzdXJmYWNlcyB0aGF0IGxpc3QgcHJvdmlkZXJzLiAqL1xuZXhwb3J0IGNvbnN0IEFJX1BST1ZJREVSX05BTUVTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBPYmplY3QudmFsdWVzKEFJX1BST1ZJREVSX0NBVEFMT0cpLm1hcCgocCkgPT4gW3AuaWQsIHAubmFtZV0pLFxuKTtcblxuLyoqIE1vZGVsIGxpc3RzIGJ5IHByb3ZpZGVyIGlkIOKAlCB0aGUgY2F0YWxvZydzIG1vZGVscywgZm9yIFVJIHN1cmZhY2VzIHRoYXQgbmVlZCBvbmx5IHRob3NlLiAqL1xuZXhwb3J0IGNvbnN0IEFJX1BST1ZJREVSX01PREVMUzogUmVjb3JkPHN0cmluZywgQUlNb2RlbEluZm9bXT4gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC52YWx1ZXMoQUlfUFJPVklERVJfQ0FUQUxPRykubWFwKChwKSA9PiBbcC5pZCwgcC5tb2RlbHNdKSxcbik7XG4iXX0=
|
|
@@ -138,6 +138,29 @@ export declare function readProposerClaim(headers: unknown): ProposerClaim;
|
|
|
138
138
|
*/
|
|
139
139
|
export declare function withProposalProvenance(headers: unknown, details?: Readonly<Record<string, unknown>>): Record<string, unknown>;
|
|
140
140
|
/** A value an allowlisted org setting can hold. */
|
|
141
|
+
/**
|
|
142
|
+
* The proposal kinds the Ask agent can draft.
|
|
143
|
+
*
|
|
144
|
+
* Mirrors the frontend's `ProposalKind`; the two are pinned to each other by
|
|
145
|
+
* `ask-proposal-permissions.test.ts` in the frontend, which is where both are
|
|
146
|
+
* visible at once.
|
|
147
|
+
*/
|
|
148
|
+
export type AskProposalKind = 'pipeline' | 'plugin' | 'template' | 'pipeline-edit' | 'plugin-edit' | 'template-edit' | 'org-settings-edit' | 'install-change-request' | 'compliance-exemption-request';
|
|
149
|
+
/**
|
|
150
|
+
* The permission a caller needs to COMMIT each proposal kind — the one fact the
|
|
151
|
+
* ask service and the dashboard must agree on, so it lives here rather than in
|
|
152
|
+
* either of them.
|
|
153
|
+
*
|
|
154
|
+
* `org-settings-edit` is null because it has no single answer: its requirement
|
|
155
|
+
* is the union of `permission` over the {@link ORG_SETTING_PROPOSAL_ALLOWLIST}
|
|
156
|
+
* rows the proposal actually touches, which only the proposal itself decides.
|
|
157
|
+
*
|
|
158
|
+
* NOT a gate anywhere. The service uses it to TELL the caller (and the model)
|
|
159
|
+
* whether a draft is appliable; the dashboard uses it to disable the Apply
|
|
160
|
+
* button and name what is missing. Enforcement stays with the owning service,
|
|
161
|
+
* which re-checks the caller's own token on the commit.
|
|
162
|
+
*/
|
|
163
|
+
export declare const ASK_PROPOSAL_PERMISSION: Readonly<Record<AskProposalKind, Permission | null>>;
|
|
141
164
|
export type OrgSettingValue = string | number | boolean;
|
|
142
165
|
/** Which per-org record (and therefore which API) a field belongs to. */
|
|
143
166
|
export type OrgSettingSurface = 'reporting' | 'complianceNotifications' | 'pluginSecurityNotifications';
|
|
@@ -76,6 +76,34 @@ export function withProposalProvenance(headers, details) {
|
|
|
76
76
|
? askProposalAuditDetails(details)
|
|
77
77
|
: { ...details };
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* The permission a caller needs to COMMIT each proposal kind — the one fact the
|
|
81
|
+
* ask service and the dashboard must agree on, so it lives here rather than in
|
|
82
|
+
* either of them.
|
|
83
|
+
*
|
|
84
|
+
* `org-settings-edit` is null because it has no single answer: its requirement
|
|
85
|
+
* is the union of `permission` over the {@link ORG_SETTING_PROPOSAL_ALLOWLIST}
|
|
86
|
+
* rows the proposal actually touches, which only the proposal itself decides.
|
|
87
|
+
*
|
|
88
|
+
* NOT a gate anywhere. The service uses it to TELL the caller (and the model)
|
|
89
|
+
* whether a draft is appliable; the dashboard uses it to disable the Apply
|
|
90
|
+
* button and name what is missing. Enforcement stays with the owning service,
|
|
91
|
+
* which re-checks the caller's own token on the commit.
|
|
92
|
+
*/
|
|
93
|
+
export const ASK_PROPOSAL_PERMISSION = {
|
|
94
|
+
'pipeline': 'pipelines:write',
|
|
95
|
+
'plugin': 'plugins:write',
|
|
96
|
+
'template': 'templates:write',
|
|
97
|
+
'pipeline-edit': 'pipelines:write',
|
|
98
|
+
'plugin-edit': 'plugins:write',
|
|
99
|
+
'template-edit': 'templates:write',
|
|
100
|
+
'org-settings-edit': null,
|
|
101
|
+
// Filing a request, not making the change: any member who may install may ASK,
|
|
102
|
+
// and `plugin_installs:manage` decides. Same shape for the exemption below —
|
|
103
|
+
// `compliance:read` requests, `compliance:write` decides.
|
|
104
|
+
'install-change-request': 'plugins:install',
|
|
105
|
+
'compliance-exemption-request': 'compliance:read',
|
|
106
|
+
};
|
|
79
107
|
/**
|
|
80
108
|
* The `digestMode` vocabulary is MIRRORED, not imported: this module keeps zero
|
|
81
109
|
* runtime imports so the browser entry stays standalone. The type annotation
|
|
@@ -305,4 +333,4 @@ export function orgSettingRequests(changes) {
|
|
|
305
333
|
}
|
|
306
334
|
return [...bySurface.values()];
|
|
307
335
|
}
|
|
308
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLXByb3Bvc2Fscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9hc2stcHJvcG9zYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUF3RXRDLGdGQUFnRjtBQUNoRixzQkFBc0I7QUFDdEIsZ0ZBQWdGO0FBRWhGLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUFFOUMsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFlBQVksQ0FBQztBQU9uRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxPQUEyQztJQUUzQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUM7QUFXekQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBZ0I7SUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBcUQsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JGLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2hELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDekUsT0FB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QUFJLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgc2hhcmVkIGNvbnRyYWN0IGJldHdlZW4gdGhlIGFzayBhZ2VudCdzIFBST1BPU0UgdG9vbHMgYW5kIHRoZSBicm93c2VyJ3NcbiAqIENPTkZJUk0gaGFuZGxlcnMuIFR3byB0aGluZ3MgbGl2ZSBoZXJlLCBhbmQgdGhleSBsaXZlIGhlcmUgYmVjYXVzZSBCT1RIIHNpZGVzXG4gKiBuZWVkIHRoZW06IGBhcGkvYXNrYCBidWlsZHMgaXRzIHRvb2wgc2NoZW1hIGZyb20gdGhpcyBtb2R1bGUsIHRoZSBmcm9udGVuZCdzXG4gKiBjb25maXJtIGhhbmRsZXIgYnVpbGRzIGl0cyByZXF1ZXN0IGZyb20gaXQsIGFuZCB0aGUgdGVzdHMgb2YgYm90aCBhc3NlcnRcbiAqIGFnYWluc3QgaXQuIEEgc2Vjb25kIGNvcHkgd291bGQgYmUgYSBzZWNvbmQgcG9saWN5LlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSBvbiBwdXJwb3NlIOKAlCBubyBydW50aW1lIGltcG9ydHMgYXQgYWxsIOKAlCBzbyB0aGUgYnJvd3NlciBjYW5cbiAqIGltcG9ydCBpdCB0aHJvdWdoIGFwaS1jb3JlJ3MgYC4vYXNrLXByb3Bvc2Fsc2AgZW50cnkgd2l0aG91dCBkcmFnZ2luZyBpbiB0aGVcbiAqIHNlcnZlciBncmFwaCAoZXhwcmVzcyAvIGp3dCAvIGlvcmVkaXMpLiBUaGUgb25seSBpbXBvcnRzIGFyZSBgaW1wb3J0IHR5cGVgLFxuICogd2hpY2ggdGhlIGNvbXBpbGVyIGVyYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogMS4gUFJPVkVOQU5DRVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IGNvbW1pdCB0aGF0IHN0YXJ0ZWQgbGlmZSBhcyBhbiBhZ2VudCBkcmFmdCBzdGFtcHNcbiAqIGBkZXRhaWxzOiB7IHByb3Bvc2VkQnk6ICdhc2stYWdlbnQnIH1gIG9udG8gaXRzIGF1ZGl0IGV2ZW50LiBUaGUgYXVkaXQgdHJhaWxcbiAqIGlzIGhhc2gtY2hhaW5lZCBhbmQgdGFtcGVyLWV2aWRlbnQsIGJ1dCB3aXRob3V0IHRoaXMgZmllbGQgaXQgY2Fubm90XG4gKiBkaXN0aW5ndWlzaCBcInRoZSBhZG1pbiBjaGFuZ2VkIHRoaXNcIiBmcm9tIFwiYW4gQUkgZHJhZnRlZCBpdCBhbmQgdGhlIGFkbWluXG4gKiBjbGlja2VkIEFwcGx5XCIg4oCUIHRoZSB0d28gbWVhbiB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgaW4gYW4gaW5jaWRlbnQgcmV2aWV3LlxuICogVGhlIGNvbnN0YW50IGV4aXN0cyBzbyB0aGUgbGl0ZXJhbCBpcyBub3QgcmV0eXBlZCBpbiB0d28gY29kZWJhc2VzLCB3aGVyZSBhXG4gKiB0eXBvIHdvdWxkIHNpbGVudGx5IHByb2R1Y2UgYW4gdW5xdWVyeWFibGUgdHJhaWwuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIDIuIFRIRSBPUkctU0VUVElOR1MgQUxMT1dMSVNUXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBpcyBhbiBBTExPV0xJU1QsIG5vdCBhIGRlbnlsaXN0LCBhbmQgdGhlIGRpc3RpbmN0aW9uIGlzIHRoZSB3aG9sZSBwb2ludDpcbiAqIGEgc2V0dGluZyBhZGRlZCB0byB0aGUgcGxhdGZvcm0gdG9tb3Jyb3cgaXMgVU5BVkFJTEFCTEUgdG8gdGhlIGFnZW50IHVudGlsXG4gKiBzb21lb25lIGRlbGliZXJhdGVseSBhZGRzIGl0IGhlcmUsIHJhdGhlciB0aGFuIGJlaW5nIGV4cG9zZWQgYnkgb21pc3Npb24uXG4gKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBiZWNhdXNlIGEgcHJvcG9zYWwgd2FzIHJlZnVzZWQsIHRoZSBmaXggaXMgdG8gYWRkIHRoZVxuICogZmllbGQgYmVsb3cgV0lUSCBpdHMgYHdoeWAg4oCUIG5vdCB0byBsb29zZW4ge0BsaW5rIHBpY2tBbGxvd2VkfS5cbiAqXG4gKiBBIGZpZWxkIGVhcm5zIGEgcGxhY2UgaGVyZSBvbmx5IGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGhvbGQuIFRoZXkgd2VyZVxuICogY2hlY2tlZCBhZ2FpbnN0IHRoZSByb3V0ZXMsIG5vdCBhc3N1bWVkOlxuICpcbiAqICAtICoqTm8gc3RlcC11cC4qKiBBIHJvdXRlIGNhcnJ5aW5nIGByZXF1aXJlU3RlcFVwYCBpcyBvdXQsIG5vIGV4Y2VwdGlvbnMuXG4gKiAgICBTdGVwLXVwIG1lYW5zIHRoZSBwbGF0Zm9ybSBhbHJlYWR5IGRlY2lkZWQgYSBsaXZlIHNlc3Npb24gaXMgbm90IGVub3VnaFxuICogICAgYXV0aG9yaXR5OyBhIGNoYXQgcHJvcG9zYWwgaXMgc3RyaWN0bHkgbGVzcy4gVGhpcyBpcyB3aGF0IGtlZXBzXG4gKiAgICBgUFVUIC9vcmdhbml6YXRpb24vYWktY29uZmlnYCBvdXQgKGl0IHBlcnNpc3RzIHBlci1vcmcgcHJvdmlkZXIgU0VDUkVUUyksXG4gKiAgICBhbG9uZyB3aXRoIHRoZSBNRkEgLyBwYXNzd29yZCAvIGF1dGhlbnRpY2F0b3IgcG9saWNpZXMsXG4gKiAgICBgUFVUIC9wbHVnaW5zL2luc3RhbGwtcG9saWN5YCwgb3JnIHJlc3RvcmUgYW5kIHRyYW5zZmVyLW93bmVyLlxuICogIC0gKipOb3QgYSBzZWN1cml0eSBjb250cm9sLioqIE1GQSAvIHBhc3N3b3JkIC8gYXV0aGVudGljYXRvciAvIGltcGVyc29uYXRpb25cbiAqICAgIHBvbGljeSwgU1NPK1NBTUwgYW5kIGl0cyBncm91cCBtYXBwaW5ncywgdmVyaWZpZWQgZG9tYWlucyBhbmQgZG9tYWluLWJhc2VkXG4gKiAgICBqb2luLCBqb2luLXJlcXVlc3QgZGVjaXNpb25zLCB0cmFuc2Zlci1vd25lciBhbmQgdGVhbSBsaWZlY3ljbGUgYXJlIEFCU0VOVFxuICogICAgaGVyZSByYXRoZXIgdGhhbiBnYXRlZCB3aXRoaW4g4oCUIFwicmVsYXggdGhlIE1GQSBwb2xpY3lcIiBpcyBwcmVjaXNlbHkgd2hhdCBhblxuICogICAgaW5qZWN0aW9uIHBheWxvYWQgYXNrcyBmb3IsIGFuZCBpdCBhcnJpdmVzIHRocm91Z2ggdGV4dCB0aGUgYWdlbnQgYWxyZWFkeVxuICogICAgcmVhZHMuIEFic2VudCBjYW5ub3QgYmUgYXJndWVkIHdpdGg7IGdhdGVkIGNhbi5cbiAqICAtICoqQ2FycmllcyBubyBzZWNyZXQgYW5kIG5vIGNhbGxiYWNrIHRhcmdldC4qKiBBbiBBUEkgdGhhdCByZXR1cm5zXG4gKiAgICBgaGFzV2ViaG9va1NlY3JldGAgaW5zdGVhZCBvZiB0aGUgc2VjcmV0IGlzIHRlbGxpbmcgeW91IHRoZSBmaWVsZCBjYW5ub3QgYmVcbiAqICAgIGRpZmZlZCwgc28gaXQgY2Fubm90IGJlIHJldmlld2VkLCBzbyBpdCBjYW5ub3QgYmUgcHJvcG9zZWQuIFdlYmhvb2sgVVJMc1xuICogICAgYW5kIGVtYWlsIGFkZHJlc3NlcyBhcmUgb3V0IGZvciB0aGUgc2FtZSByZWFzb24gcGx1cyBvbmUgbW9yZTogdGhleSBhcmVcbiAqICAgIGV4ZmlsdHJhdGlvbiB0YXJnZXRzLCBhbmQgYSBjb25maXJtYXRpb24gbWFpbCB0byBhbiBhdHRhY2tlci1jaG9zZW4gYWRkcmVzc1xuICogICAgaXMgYSBzZW5kIHRoZSBwbGF0Zm9ybSBwZXJmb3JtcyBvbiB0aGUgbW9kZWwncyBzYXktc28uXG4gKiAgLSAqKlJldmlld2FibGUgYXMgYSBkaWZmLioqIEEgc2NhbGFyIHdpdGggYSBjbG9zZWQgc2hhcGUgKGJvb2xlYW4sIGJvdW5kZWRcbiAqICAgIGludGVnZXIsIHNtYWxsIGVudW0pLiBBIGxpc3Qgb2Ygb3BhcXVlIHVzZXIgaWRzIHJlbmRlcnMgYXMgaWRzIGluIGEgY2FyZFxuICogICAgbm9ib2R5IGNhbiBjaGVjaywgc28gcmVjaXBpZW50IExJU1RTIGFyZSBvdXQgZXZlbiB0aG91Z2ggY2FkZW5jZSBpcyBpbi5cbiAqXG4gKiBFYWNoIGVudHJ5IG5hbWVzIHRoZSBBUEkgdGhhdCBhcHBsaWVzIGl0LiBUaGUgYnJvd3NlciBhcHBsaWVzIGl0IHRocm91Z2ggdGhlXG4gKiBVU0VSJ3Mgb3duIHNlc3Npb24gYW5kIHRoZSB1c2VyJ3Mgb3duIHBlcm1pc3Npb25zIOKAlCB0aGUgYWdlbnQgbmV2ZXIgd3JpdGVzIOKAlFxuICogc28gYSBwcm9wb3NhbCBhIG1lbWJlciBtYXkgbm90IGNvbW1pdCBzaW1wbHkgNDAzcyBhdCB0aGUgcm91dGUsIGV4YWN0bHkgYXMgYVxuICogaGFuZC1tYWRlIHJlcXVlc3Qgd291bGQuXG4gKlxuICogUnVsZSAxMCBsaXZlcyBpbiB7QGxpbmsgcGlja0FsbG93ZWR9OiBhIGNhbmRpZGF0ZSBjYXJyeWluZyBhIGZpZWxkIG91dHNpZGVcbiAqIHRoaXMgbGlzdCBpcyB0aGUgaW5qZWN0aW9uIHNpZ25hbCwgc28gdGhlIHJlZnVzZWQgbmFtZXMgY29tZSBiYWNrIHRvIHRoZVxuICogY2FsbGVyIHRvIGJlIGNvdW50ZWQgYW5kIGxvZ2dlZCByYXRoZXIgdGhhbiBiZWluZyBxdWlldGx5IGRyb3BwZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNlY3VyaXR5RGlnZXN0TW9kZSB9IGZyb20gJy4vd2lyZS12b2NhYnVsYXJ5LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFByb3ZlbmFuY2UgKHJ1bGUgNilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaGUgYHByb3Bvc2VkQnlgIHZhbHVlIGV2ZXJ5IGFnZW50LWRyYWZ0ZWQgY29tbWl0IHJlY29yZHMuICovXG5leHBvcnQgY29uc3QgQVNLX0FHRU5UX1BST1BPU0VSID0gJ2Fzay1hZ2VudCc7XG5cbi8qKiBUaGUgYXVkaXQgYGRldGFpbHNgIGtleSB0aGF0IGNhcnJpZXMgcHJvdmVuYW5jZS4gKi9cbmV4cG9ydCBjb25zdCBQUk9QT1NFRF9CWV9ERVRBSUxfS0VZID0gJ3Byb3Bvc2VkQnknO1xuXG4vKiogVGhlIHByb3ZlbmFuY2UgZnJhZ21lbnQgbWVyZ2VkIGludG8gYSBgUmVtb3RlQXVkaXRFdmVudC5kZXRhaWxzYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgcHJvcG9zZWRCeTogdHlwZW9mIEFTS19BR0VOVF9QUk9QT1NFUjtcbn1cblxuLyoqXG4gKiBNZXJnZSBhZ2VudCBwcm92ZW5hbmNlIGludG8gYW4gYXVkaXQgZXZlbnQncyBmcmVlLWZvcm0gYGRldGFpbHNgLlxuICogUHJvdmVuYW5jZSBpcyBhcHBsaWVkIExBU1Qgc28gYSBjYWxsZXItc3VwcGxpZWQgYHByb3Bvc2VkQnlgIGNhbm5vdCBvdmVyd3JpdGVcbiAqIGl0IOKAlCB0aGUgcG9pbnQgb2YgdGhlIGZpZWxkIGlzIHRoYXQgaXQgaXMgbm90IG5lZ290aWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc2tQcm9wb3NhbEF1ZGl0RGV0YWlscyhcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmV0dXJuIHsgLi4uZGV0YWlscywgcHJvcG9zZWRCeTogQVNLX0FHRU5UX1BST1BPU0VSIH07XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgSEVBREVSIGEgcHJvcG9zYWwgY29tbWl0IHN0YW1wcywgYW5kIHRoZSBvbmx5IGNoYW5uZWwgcHJvdmVuYW5jZVxuICogdHJhdmVscyBvbi5cbiAqXG4gKiBBIEhFQURFUiByYXRoZXIgdGhhbiBhIGJvZHkgZmllbGQsIGZvciB0aHJlZSByZWFzb25zOlxuICpcbiAqICAtICoqSXQgY2Fubm90IGNvbGxpZGUuKiogYHByb3Bvc2VkQnlgIGluIGEgYm9keSB3b3VsZCBiZSBhIG5ldyBrZXkgaW4gc2l4XG4gKiAgICBkaWZmZXJlbnQgZG9tYWluIHNjaGVtYXMg4oCUIGBQaXBlbGluZVVwZGF0ZVNjaGVtYWAsIHRoZSBwbHVnaW4vdGVtcGxhdGVcbiAqICAgIHVwZGF0ZSBzY2hlbWFzLCB0aHJlZSBub3RpZmljYXRpb24vc2V0dGluZ3Mgc2NoZW1hcyDigJQgdHdvIG9mIHdoaWNoIGFyZVxuICogICAgYC5zdHJpY3QoKWAgYW5kIHRoZSByZXN0IG9mIHdoaWNoIGZlZWQgYE9iamVjdC5rZXlzKGJvZHkpYCBzdHJhaWdodCBpbnRvXG4gKiAgICB0aGUgdXBkYXRlJ3MgY29sdW1uIGxpc3QgYW5kIHRoZSBhdWRpdCdzIGBmaWVsZHNgLiBBIGZpZWxkIG5hbWVkIGFmdGVyIGFuXG4gKiAgICBhdWRpdCBrZXkgd291bGQgdGhlbiBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmVhbCBvbmUsIGFuZCB0aGUgZGF5IGFcbiAqICAgIGRvbWFpbiBncm93cyBpdHMgb3duIGBwcm9wb3NlZEJ5YCB0aGUgdHdvIG1lYW5pbmdzIG1lcmdlIHNpbGVudGx5LlxuICogIC0gKipJdCBpcyB0cmFuc3BvcnQgbWV0YWRhdGEsIGFuZCBzdGF5cyBvdXQgb2YgdGhlIHBheWxvYWQuKiogTm90aGluZ1xuICogICAgZG93bnN0cmVhbSBvZiBgdmFsaWRhdGVCb2R5YCBldmVyIHNlZXMgaXQsIHNvIGl0IGNhbm5vdCBiZSBwZXJzaXN0ZWQsIGNhbm5vdFxuICogICAgd2lkZW4gYSBkaWZmLCBhbmQgY2Fubm90IHJlYWNoIGEgc2VydmljZSB0aGF0IGZvcndhcmRzIHRoZSBib2R5IG9ud2FyZC5cbiAqICAtICoqVGhlIHBsYXRmb3JtIGFscmVhZHkgZG9lcyB0aGlzLioqIGBYLVN0ZXAtVXAtVG9rZW5gIGlzIHRoZSBzYW1lIHNoYXBlIG9mXG4gKiAgICB0aGluZyDigJQgYSBwZXItcmVxdWVzdCBhc3NlcnRpb24gYWJvdXQgSE9XIHRoZSBjYWxsIHdhcyBtYWRlIHJhdGhlciB0aGFuXG4gKiAgICBXSEFUIGl0IGNoYW5nZXMg4oCUIGFuZCByaWRlcyBhIGhlYWRlciBmb3IgdGhlIHNhbWUgcmVhc29ucy5cbiAqXG4gKiBMb3dlci1jYXNlIGJlY2F1c2UgdGhhdCBpcyBob3cgTm9kZSBub3JtYWxpc2VzIGluY29taW5nIGhlYWRlciBuYW1lczsgdGhlXG4gKiBicm93c2VyIHNlbmRzIGBYLVBCLVByb3Bvc2VkLUJ5YCwgd2hpY2ggYXJyaXZlcyBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgQVNLX1BST1BPU0VEX0JZX0hFQURFUiA9ICd4LXBiLXByb3Bvc2VkLWJ5JztcblxuLyoqXG4gKiBXaGF0IGEgcmVxdWVzdCdzIHByb3ZlbmFuY2UgaGVhZGVyIGNsYWltcy5cbiAqXG4gKiBgZm9yZWlnbmAgaXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IEVYQUNUTFkge0BsaW5rIEFTS19BR0VOVF9QUk9QT1NFUn0g4oCUIHRoZXJlXG4gKiBpcyBvbmUgbGVnaXRpbWF0ZSBwcm9wb3NlciBhbmQgbm8gZnJlZS1mb3JtIHRleHQsIHNvIGFueXRoaW5nIGVsc2UgaXMgYSBidWdcbiAqIG9yIGEgZm9yZ2VyeSBhbmQgaXMgbmFtZWQgYXMgc3VjaCByYXRoZXIgdGhhbiBmb2xkZWQgaW50byBgbm9uZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3Bvc2VyQ2xhaW0gPSAnbm9uZScgfCAnYXNrLWFnZW50JyB8ICdmb3JlaWduJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm92ZW5hbmNlIGNsYWltIG9mZiBhIHJlcXVlc3QncyBoZWFkZXIgYmFnLlxuICpcbiAqIERlbGliZXJhdGVseSBleGFjdDogbm8gdHJpbW1pbmcsIG5vIGNhc2UgZm9sZGluZywgbm8gcHJlZml4IG1hdGNoaW5nLiBUaGVcbiAqIG9ubHkgc2VuZGVyIGlzIHRoZSBicm93c2VyJ3MgY29uZmlybSBwYXRoLCB3aGljaCBzdGFtcHMgdGhlIHNoYXJlZCBjb25zdGFudCxcbiAqIHNvIGV2ZXJ5IG90aGVyIHZhbHVlIGlzIHJlZnVzZWQgcmF0aGVyIHRoYW4gcmVwYWlyZWQuIFRoaXMgaXMgd2hhdCBrZWVwcyBhXG4gKiBjbGllbnQgZnJvbSB3cml0aW5nIGFyYml0cmFyeSBhdWRpdCBgZGV0YWlsc2Ag4oCUIHRoZSBoZWFkZXIncyB3aG9sZSB2b2NhYnVsYXJ5XG4gKiBpcyBvbmUgd29yZCwgYW5kIHRoZSB3b3JkIGlzIG5vdCB0aGUgY2xpZW50J3MgdG8gY2hvb3NlLlxuICpcbiAqIFRha2VzIHRoZSBoZWFkZXIgQkFHIChgcmVxLmhlYWRlcnNgKSByYXRoZXIgdGhhbiBhIHJlcXVlc3QsIHNvIHRoaXMgbW9kdWxlXG4gKiBrZWVwcyBpdHMgemVybyBydW50aW1lIGltcG9ydHMgYW5kIHRoZSBicm93c2VyIGNhbiBzdGlsbCBpbXBvcnQgdGhlIGNvbnN0YW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFByb3Bvc2VyQ2xhaW0oaGVhZGVyczogdW5rbm93bik6IFByb3Bvc2VyQ2xhaW0ge1xuICBjb25zdCBiYWcgPSBoZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3ID0gYmFnICYmIHR5cGVvZiBiYWcgPT09ICdvYmplY3QnID8gYmFnW0FTS19QUk9QT1NFRF9CWV9IRUFERVJdIDogdW5kZWZpbmVkO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJ25vbmUnO1xuICByZXR1cm4gdmFsdWUgPT09IEFTS19BR0VOVF9QUk9QT1NFUiA/ICdhc2stYWdlbnQnIDogJ2ZvcmVpZ24nO1xufVxuXG4vKipcbiAqIFRoZSBhdWRpdCBgZGV0YWlsc2AgZm9yIGEgd3JpdGUsIHdpdGggcHJvdmVuYW5jZSBmb2xkZWQgaW4gd2hlbiDigJQgYW5kIE9OTFlcbiAqIHdoZW4g4oCUIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGFnZW50IG1hcmtlci5cbiAqXG4gKiBgZGV0YWlsc2AgaXMgd2hhdCB0aGUgSEFORExFUiBidWlsdCBhbmQgc3RheXMgYXV0aG9yaXRhdGl2ZS4gUHJvdmVuYW5jZSBpc1xuICogYWRkaXRpdmU6IHRoZSBPTkxZIGtleSBpdCBjYW4gZXZlciB3cml0ZSBpcyBgcHJvcG9zZWRCeWAsIHNvIGV2ZXJ5IGZpZWxkIHRoZVxuICogaGFuZGxlciBzZXQgc3Vydml2ZXMgdW50b3VjaGVkLCBhbmQge0BsaW5rIGFza1Byb3Bvc2FsQXVkaXREZXRhaWxzfSBhcHBsaWVzXG4gKiB0aGF0IG9uZSBrZXkgTEFTVCBzbyBhIGBwcm9wb3NlZEJ5YCBhcnJpdmluZyBmcm9tIGFueXdoZXJlIGVsc2UgY2Fubm90IHNwZWFrXG4gKiBpbiBpdHMgcGxhY2UuIEEgcmVxdWVzdCBjYXJyeWluZyBubyBtYXJrZXIsIG9yIGEgYGZvcmVpZ25gIG9uZSwgZ2V0cyB0aGVcbiAqIGhhbmRsZXIncyBkZXRhaWxzIHVuY2hhbmdlZCDigJQgYW4gb3JkaW5hcnkgZWRpdCByZWNvcmRzIG5vIGBwcm9wb3NlZEJ5YCBhdFxuICogYWxsLCB3aGljaCBpcyB0aGUgZGlzdGluY3Rpb24gdGhlIGZpZWxkIGV4aXN0cyB0byBtYWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFByb3Bvc2FsUHJvdmVuYW5jZShcbiAgaGVhZGVyczogdW5rbm93bixcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlYWRQcm9wb3NlckNsYWltKGhlYWRlcnMpID09PSAnYXNrLWFnZW50J1xuICAgID8gYXNrUHJvcG9zYWxBdWRpdERldGFpbHMoZGV0YWlscylcbiAgICA6IHsgLi4uZGV0YWlscyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIGFsbG93bGlzdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgdmFsdWUgYW4gYWxsb3dsaXN0ZWQgb3JnIHNldHRpbmcgY2FuIGhvbGQuICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKiogV2hpY2ggcGVyLW9yZyByZWNvcmQgKGFuZCB0aGVyZWZvcmUgd2hpY2ggQVBJKSBhIGZpZWxkIGJlbG9uZ3MgdG8uICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nU3VyZmFjZSA9XG4gIHwgJ3JlcG9ydGluZydcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnXG4gIHwgJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucyc7XG5cbi8qKlxuICogRXZlcnkgcHJvcG9zYWJsZSBzZXR0aW5nLCBhcyBgPHN1cmZhY2U+LjxmaWVsZD5gLiBXcml0aW5nIHRoZSB1bmlvbiBvdXQgYnlcbiAqIGhhbmQgKHJhdGhlciB0aGFuIGluZmVycmluZyBpdCBmcm9tIHRoZSBhcnJheSkgaXMgZGVsaWJlcmF0ZTogdGhlIGtleSBzcGFjZVxuICogaXMgdGhlIGNvbnRyYWN0IHRoZSB0b29sIHNjaGVtYSBhbmQgdGhlIGNvbmZpcm0gaGFuZGxlciBzaGFyZSwgc28gaXQgaXNcbiAqIHN0YXRlZCBvbmNlLCBleHBsaWNpdGx5LCBhbmQgYSB0eXBvIGluIGFuIGVudHJ5IGJlbG93IGlzIGEgY29tcGlsZSBlcnJvci5cbiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ0tleSA9XG4gIHwgJ3JlcG9ydGluZy5pbmNpZGVudFdpbmRvd0hvdXJzJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbkJsb2NrJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbldhcm5pbmcnXG4gIHwgJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmVtYWlsRW5hYmxlZCdcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZGlnZXN0TW9kZSdcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLm5vdGlmeVJlc2NhbidcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnO1xuXG4vKiogVGhlIGNsb3NlZCBzaGFwZSBhIHByb3Bvc2VkIHZhbHVlIG11c3QgbWF0Y2ggYmVmb3JlIGl0IGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ1NoYXBlID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdib29sZWFuJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnaW50ZWdlcic7IHJlYWRvbmx5IG1pbjogbnVtYmVyOyByZWFkb25seSBtYXg6IG51bWJlciB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZW51bSc7IHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuLyoqIE9uZSBwcm9wb3NhYmxlIG9yZyBzZXR0aW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nU3BlYyB7XG4gIC8qKiBTdGFibGUgcHJvcG9zYWwga2V5IOKAlCBgPHN1cmZhY2U+LjxmaWVsZD5gLiBUaGlzIGlzIHdoYXQgdGhlIG1vZGVsIG5hbWVzLiAqL1xuICByZWFkb25seSBrZXk6IE9yZ1NldHRpbmdLZXk7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICAvKiogVGhlIHJlcXVlc3QtYm9keSBmaWVsZCBuYW1lIHRoZSBBUEkgZXhwZWN0cy4gKi9cbiAgcmVhZG9ubHkgZmllbGQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hhcGU6IE9yZ1NldHRpbmdTaGFwZTtcbiAgLyoqIFRoZSByb3V0ZSB0aGF0IGFwcGxpZXMgaXQsIGNhbGxlZCBieSB0aGUgQlJPV1NFUiB3aXRoIHRoZSB1c2VyJ3Mgc2Vzc2lvbi4gKi9cbiAgcmVhZG9ubHkgYXBpOiB7IHJlYWRvbmx5IG1ldGhvZDogJ1BVVCc7IHJlYWRvbmx5IHBhdGg6IHN0cmluZyB9O1xuICAvKiogVGhlIHBlcm1pc3Npb24gdGhhdCByb3V0ZSByZXF1aXJlcyBvZiB0aGUgY2FsbGVyLiAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uO1xuICAvKiogU2hvcnQgaHVtYW4gbGFiZWwgZm9yIHRoZSBjb25maXJtIGNhcmQuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBXSFkgdGhpcyBmaWVsZCBpcyBzYWZlIHRvIHByb3Bvc2UuIEV2ZXJ5IGVudHJ5IHN0YXRlcyBpdHMgb3duIGNhc2UuICovXG4gIHJlYWRvbmx5IHdoeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBgZGlnZXN0TW9kZWAgdm9jYWJ1bGFyeSBpcyBNSVJST1JFRCwgbm90IGltcG9ydGVkOiB0aGlzIG1vZHVsZSBrZWVwcyB6ZXJvXG4gKiBydW50aW1lIGltcG9ydHMgc28gdGhlIGJyb3dzZXIgZW50cnkgc3RheXMgc3RhbmRhbG9uZS4gVGhlIHR5cGUgYW5ub3RhdGlvblxuICogbWFrZXMgYSBSRU1PVkVEIG1vZGUgYSBjb21waWxlIGVycm9yIGhlcmUsIGFuZCBgYXNrLXByb3Bvc2Fscy50ZXN0LnRzYCBhc3NlcnRzXG4gKiB0aGUgbGlzdCBhZ2FpbnN0IGBQTFVHSU5fU0VDVVJJVFlfRElHRVNUX01PREVTYCBzbyBhbiBBRERFRCBvbmUgY2Fubm90IGRyaWZ0XG4gKiBlaXRoZXIuXG4gKi9cbmNvbnN0IERJR0VTVF9NT0RFUzogcmVhZG9ubHkgUGx1Z2luU2VjdXJpdHlEaWdlc3RNb2RlW10gPSBbJ2ltbWVkaWF0ZScsICdkYWlseScsICd3ZWVrbHknXTtcblxuLyoqXG4gKiBUaGUgYWxsb3dsaXN0LiBBZGRpbmcgYW4gZW50cnkgaXMgYSBkZWxpYmVyYXRlIGFjdDogbmFtZSB0aGUgcm91dGUgeW91XG4gKiBjaGVja2VkLCBjb25maXJtIGl0IGNhcnJpZXMgbm8gYHJlcXVpcmVTdGVwVXBgLCBhbmQgd3JpdGUgdGhlIGB3aHlgLlxuICovXG5leHBvcnQgY29uc3QgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUOiByZWFkb25seSBPcmdTZXR0aW5nU3BlY1tdID0gW1xuICB7XG4gICAga2V5OiAncmVwb3J0aW5nLmluY2lkZW50V2luZG93SG91cnMnLFxuICAgIHN1cmZhY2U6ICdyZXBvcnRpbmcnLFxuICAgIGZpZWxkOiAnaW5jaWRlbnRXaW5kb3dIb3VycycsXG4gICAgc2hhcGU6IHsga2luZDogJ2ludGVnZXInLCBtaW46IDEsIG1heDogNzIwIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZ19zZXR0aW5nczp3cml0ZScsXG4gICAgbGFiZWw6ICdJbmNpZGVudCBjb3JyZWxhdGlvbiB3aW5kb3cgKGhvdXJzKScsXG4gICAgd2h5OlxuICAgICAgJ0FuYWx5dGljcyB0dW5pbmcgb25seTogaXQgZGVjaWRlcyBob3cgbG9uZyBhZnRlciBhIGRlcGxveSBhbiBpbmNpZGVudCBpcyAnXG4gICAgICArICdhdHRyaWJ1dGVkIHRvIHRoYXQgZGVwbG95IHdoZW4gRE9SQSBtZXRyaWNzIGFyZSBjb21wdXRlZC4gSXQgZ3JhbnRzIG5vdGhpbmcsICdcbiAgICAgICsgJ3JldmVhbHMgbm90aGluZyBhbmQgcmVhY2hlcyBubyBvbmUg4oCUIHRoZSB3b3JzdCBvdXRjb21lIG9mIGEgd3JvbmcgdmFsdWUgaXMgYSAnXG4gICAgICArICdtaXNsZWFkaW5nIGNoYW5nZS1mYWlsdXJlIHJhdGUsIHdoaWNoIHRoZSBuZXh0IGVkaXQgY29ycmVjdHMuIFRoZSByb3V0ZSAnXG4gICAgICArICdyZWplY3RzIHRoZSBzaWJsaW5nIHJldGVudGlvbiBmaWVsZHMgb3V0cmlnaHQgKHRoZXkgYXJlIGJpbGxpbmctb3duZWQpLCBzbyAnXG4gICAgICArICd0aGlzIGlzIHRoZSB3aG9sZSB3cml0YWJsZSBzdXJmYWNlLiBCb3VuZGVkIGludGVnZXIsIHNvIHRoZSBkaWZmIGlzIG9uZSBudW1iZXIuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uQmxvY2snLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdub3RpZnlPbkJsb2NrJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdOb3RpZnkgd2hlbiBjb21wbGlhbmNlIGJsb2NrcyBhbiBhY3Rpb24nLFxuICAgIHdoeTpcbiAgICAgICdBIGRlbGl2ZXJ5IHByZWZlcmVuY2UsIG5vdCBhbiBlbmZvcmNlbWVudCBjb250cm9sOiB0aGUgYmxvY2sgaGFwcGVucyBlaXRoZXIgJ1xuICAgICAgKyAnd2F5IGFuZCB0aGUgcG9saWN5IHRoYXQgY2F1c2VkIGl0IGlzIHVuY2hhbmdlZC4gVHVybmluZyBpdCBvZmYgbWFrZXMgdGhlIG9yZyAnXG4gICAgICArICdxdWlldGVyLCBuZXZlciBtb3JlIHBlcm1pc3NpdmUuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uV2FybmluZycsXG4gICAgc3VyZmFjZTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeU9uV2FybmluZycsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIGNvbXBsaWFuY2Ugd2FybmluZ3MnLFxuICAgIHdoeTogJ0FzIG5vdGlmeU9uQmxvY2sg4oCUIHdoaWNoIG5vbi1ibG9ja2luZyBmaW5kaW5ncyBhcmUgYW5ub3VuY2VkLCBub3Qgd2hhdCBpcyBlbmZvcmNlZC4nLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZW1haWxFbmFibGVkJyxcbiAgICBzdXJmYWNlOiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnLFxuICAgIGZpZWxkOiAnZW1haWxFbmFibGVkJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdTZW5kIGNvbXBsaWFuY2Ugbm90aWNlcyBieSBlbWFpbCcsXG4gICAgd2h5OlxuICAgICAgJ0Nob29zZXMgd2hldGhlciB0aGUgZXhpc3Rpbmcgbm90aWNlcyBnbyBvdXQgYnkgZW1haWwuIEl0IGRvZXMgbm90IG5hbWUgYSAnXG4gICAgICArICdyZWNpcGllbnQg4oCUIHRoZSBhZGRyZXNzIGxpc3QgaXMgcmVzb2x2ZWQgZnJvbSBvcmcgbWVtYmVyc2hpcCBhdCBzZW5kIHRpbWUg4oCUICdcbiAgICAgICsgJ3NvIGEgZmxpcHBlZCBib29sZWFuIGNhbiBuZXZlciByb3V0ZSBtYWlsIHNvbWV3aGVyZSBuZXcuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdkaWdlc3RNb2RlJyxcbiAgICBzaGFwZTogeyBraW5kOiAnZW51bScsIHZhbHVlczogRElHRVNUX01PREVTIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnQ29tcGxpYW5jZSBub3RpY2UgY2FkZW5jZScsXG4gICAgd2h5OiAnQ2FkZW5jZSBvZiBhbiBleGlzdGluZyBub3RpY2UgdG8gZXhpc3RpbmcgcmVjaXBpZW50cy4gQ2xvc2VkIGVudW0sIHNvIHRoZSBkaWZmIGlzIG9uZSB3b3JkLicsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvbnMubm90aWZ5UmVzY2FuJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeVJlc2NhbicsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcGx1Z2lucy9zZWN1cml0eS1ub3RpZmljYXRpb25zJyB9LFxuICAgIHBlcm1pc3Npb246ICdvcmdfc2V0dGluZ3M6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIG5pZ2h0bHkgcmVzY2FuIGZpbmRpbmdzJyxcbiAgICB3aHk6XG4gICAgICAnR292ZXJucyB0aGUgTjMxIHJlc2NhbiBub3RpY2Ugb25seS4gVGhlIHNjYW4gR0FURVMgYXJlIHVudG91Y2hlZDogYSBidWlsZCB0aGF0ICdcbiAgICAgICsgJ3RyaXBzIFBMVUdJTl9WVUxOX0dBVEUgc3RpbGwgZmFpbHMgYW5kIHN0aWxsIHNlbmRzIE4zMCwgd2hpY2ggdGhpcyBmbGFnIGNhbm5vdCAnXG4gICAgICArICdzdXBwcmVzcy4gU28gaXQgY2hhbmdlcyBob3cgbm9pc3kgYW4gaW5mb3JtYXRpb25hbCBub3RpY2UgaXMsIG5vdCB3aGV0aGVyIGEgJ1xuICAgICAgKyAndnVsbmVyYWJsZSB2ZXJzaW9uIGNhbiBiZSBwdWJsaXNoZWQuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5kaWdlc3RNb2RlJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ2RpZ2VzdE1vZGUnLFxuICAgIHNoYXBlOiB7IGtpbmQ6ICdlbnVtJywgdmFsdWVzOiBESUdFU1RfTU9ERVMgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9wbHVnaW5zL3NlY3VyaXR5LW5vdGlmaWNhdGlvbnMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZ19zZXR0aW5nczp3cml0ZScsXG4gICAgbGFiZWw6ICdQbHVnaW4gc2VjdXJpdHkgbm90aWNlIGNhZGVuY2UnLFxuICAgIHdoeTpcbiAgICAgICdDYWRlbmNlIG9mIHRoZSByZXNjYW4gbm90aWNlLiBOMzAgKFwidmVyc2lvbiBibG9ja2VkXCIpIGlzIGFsd2F5cyBpbW1lZGlhdGUgYW5kICdcbiAgICAgICsgJ2lnbm9yZXMgdGhpcyBmaWVsZCwgc28gdGhlIHVyZ2VudCBjaGFubmVsIGNhbm5vdCBiZSBzbG93ZWQgZG93bi4nLFxuICB9LFxuXTtcblxuLyoqXG4gKiBGaWVsZHMgREVMSUJFUkFURUxZIGV4Y2x1ZGVkLCB3aXRoIHRoZSByZWFzb24sIHNvIGEgZnV0dXJlIHJlYWRlciBkb2VzIG5vdFxuICogcmUtbGl0aWdhdGUgdGhlbSBhbmQgYSByZXZpZXdlciBjYW4gc2VlIHRoZXkgd2VyZSBjb25zaWRlcmVkIHJhdGhlciB0aGFuXG4gKiBtaXNzZWQuIFRoaXMgaXMgZG9jdW1lbnRhdGlvbiBvbmx5IOKAlCB7QGxpbmsgcGlja0FsbG93ZWR9IGNvbnN1bHRzIHRoZVxuICogYWxsb3dsaXN0IGFsb25lLCBhbmQgYSBmaWVsZCBhYnNlbnQgZnJvbSBCT1RIIGxpc3RzIGlzIHJlZnVzZWQgaWRlbnRpY2FsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfU0VUVElOR19QUk9QT1NBTF9FWENMVVNJT05TOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgZmllbGQ6IHN0cmluZzsgcmVhZG9ubHkgd2h5OiBzdHJpbmcgfT4gPSBbXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYWlDb25maWcnLCB3aHk6ICdTdGVwLXVwIGdhdGVkIChQVVQgL29yZ2FuaXphdGlvbi9haS1jb25maWcpIGFuZCBwZXJzaXN0cyBwZXItb3JnIHByb3ZpZGVyIHNlY3JldHMuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLm1mYVBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLiBMb29zZW5pbmcgaXQgcmVtb3ZlcyBhIGNvbnRyb2wgZm9yIGV2ZXJ5IG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24ucGFzc3dvcmRQb2xpY3knLCB3aHk6ICdTZWN1cml0eSBjb250cm9sICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYXV0aGVudGljYXRvclBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5pbXBlcnNvbmF0aW9uUG9saWN5Jywgd2h5OiAnU2VjdXJpdHkgY29udHJvbCArIHN0ZXAtdXA7IGRlY2lkZXMgd2hvIG91dHNpZGUgdGhlIG9yZyBtYXkgdmlldyBpdHMgZGF0YS4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uaWRwJywgd2h5OiAnU1NPL1NBTUwgY29uZmlnOiBzZWN1cml0eSBjb250cm9sIG9uIGl0cyBvd24gY2FwYWJpbGl0eSAob3JnX2lkcDp3cml0ZSksIGFzc3VyYW5jZSArIHN0cm9uZyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5rbXNDb25maWcnLCB3aHk6ICdLZXkgbWF0ZXJpYWwuIE93biBjYXBhYmlsaXR5IChvcmdfa21zOndyaXRlKSwgYXNzdXJhbmNlICsgc3Ryb25nIHN0ZXAtdXAuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmlkZW50aXR5Jywgd2h5OiAnT3JnIG5hbWUvc2x1Zzogbm8gc3RlcC11cCwgYnV0IHJlbmFtaW5nIGFuIG9yZyBpcyBhbiBpbXBlcnNvbmF0aW9uIHByaW1pdGl2ZSBhbmQgdGhlIHNsdWcgaXMgYWRkcmVzc2FibGUuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmRvbWFpbnMnLCB3aHk6ICdWZXJpZmllZCBkb21haW5zIGRyaXZlIGRvbWFpbi1iYXNlZCBqb2luIOKAlCB3aG8gbWF5IGJlY29tZSBhIG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uam9pblJlcXVlc3RzJywgd2h5OiAnTWVtYmVyc2hpcCBkZWNpc2lvbnMgYXJlIGFuIGF1dGhvcml0eSBncmFudCwgbm90IGEgc2V0dGluZy4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udHJhbnNmZXJPd25lcicsIHdoeTogJ093bmVyc2hpcCB0cmFuc2Zlcjogc2VjdXJpdHkgY29udHJvbCwgTUZBLWdyYWRlICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udGVhbXMnLCB3aHk6ICdUZWFtIGxpZmVjeWNsZSAoY3JlYXRlL2RlbGV0ZS9tb3ZlKSBpcyBzdHJ1Y3R1cmFsIGFuZCBzdGVwLXVwIGdhdGVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpbnMuaW5zdGFsbFBvbGljeScsIHdoeTogJ1N0ZXAtdXAgZ2F0ZWQgKFBVVCAvcGx1Z2lucy9pbnN0YWxsLXBvbGljeSkgYW5kIGRlY2lkZXMgd2hhdCBtYXkgYmUgaW5zdGFsbGVkLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1VybCcsIHdoeTogJ0EgY2FsbGJhY2sgdGFyZ2V0OiBwcm9wb3Npbmcgb25lIHR1cm5zIHRoZSBwbGF0Zm9ybSBpbnRvIGFuIGV4ZmlsdHJhdGlvbiBjaGFubmVsLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1NlY3JldCcsIHdoeTogJ0JlYXJlci1lcXVpdmFsZW50LiBUaGUgQVBJIHJldHVybnMgaGFzV2ViaG9va1NlY3JldCwgbmV2ZXIgdGhlIHZhbHVlLCBzbyBpdCBjYW5ub3QgYmUgZGlmZmVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5leHRlcm5hbEVtYWlsJywgd2h5OiAnQW4gYWRkcmVzcyB0aGUgcGxhdGZvcm0gdGhlbiBtYWlscyBhIGNvbmZpcm1hdGlvbiBsaW5rIHRvLiBOZXZlciBtb2RlbC1jaG9zZW4uJyB9LFxuICB7IGZpZWxkOiAnKi50YXJnZXRVc2VycycsIHdoeTogJ0EgbGlzdCBvZiBvcGFxdWUgdXNlciBpZHMgaXMgbm90IHJldmlld2FibGUgaW4gYSBjYXJkLCBhbmQgcmVkaXJlY3RpbmcgcmVjaXBpZW50cyBjYW4gc2lsZW5jZSBhIGNoYW5uZWwuJyB9LFxuICB7IGZpZWxkOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLnJlY2lwaWVudE1vZGUnLCB3aHk6ICdQYWlycyB3aXRoIHRhcmdldFVzZXJzOyBzd2l0Y2hpbmcgdG8gXCJ1c2Vyc1wiIG1ha2VzIGFuIHVucmV2aWV3YWJsZSBsaXN0IGF1dGhvcml0YXRpdmUuJyB9LFxuICB7IGZpZWxkOiAncmVwb3J0aW5nLmV2ZW50UmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQgKHRpZXIgKyBwdXJjaGFzZWQgcGFja3MpLiBUaGUgcm91dGUgYWxyZWFkeSByZWplY3RzIGl0OyBhZG1pdHRpbmcgaXQgd291bGQgYmUgYW4gZW50aXRsZW1lbnQgYnlwYXNzLicgfSxcbiAgeyBmaWVsZDogJ3JlcG9ydGluZy5kb3JhUmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQsIGFzIGFib3ZlLicgfSxcbl07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb29rdXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEJZX0tFWTogUmVhZG9ubHlNYXA8c3RyaW5nLCBPcmdTZXR0aW5nU3BlYz4gPVxuICBuZXcgTWFwKE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IFtzcGVjLmtleSwgc3BlY10pKTtcblxuLyoqIEV2ZXJ5IHByb3Bvc2FibGUga2V5IOKAlCB0aGUgZW51bSBhIHByb3Bvc2UgdG9vbCdzIGlucHV0IHNjaGVtYSBpcyBidWlsdCBmcm9tLiAqL1xuZXhwb3J0IGNvbnN0IE9SR19TRVRUSU5HX1BST1BPU0FMX0tFWVM6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXSA9XG4gIE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IHNwZWMua2V5KTtcblxuLyoqIElzIGBrZXlgIG9uIHRoZSBhbGxvd2xpc3Q/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wb3NhYmxlT3JnU2V0dGluZyhrZXk6IHN0cmluZyk6IGtleSBpcyBPcmdTZXR0aW5nS2V5IHtcbiAgcmV0dXJuIEJZX0tFWS5oYXMoa2V5KTtcbn1cblxuLyoqIFRoZSBzcGVjIGZvciBga2V5YCwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IHByb3Bvc2FibGUuICovXG5leHBvcnQgZnVuY3Rpb24gb3JnU2V0dGluZ1NwZWMoa2V5OiBzdHJpbmcpOiBPcmdTZXR0aW5nU3BlYyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBCWV9LRVkuZ2V0KGtleSk7XG59XG5cbi8qKiBEb2VzIGB2YWx1ZWAgbWF0Y2ggdGhlIHNoYXBlIHRoZSBmaWVsZCBkZWNsYXJlcz8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3JnU2V0dGluZ1ZhbHVlKHNwZWM6IE9yZ1NldHRpbmdTcGVjLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE9yZ1NldHRpbmdWYWx1ZSB7XG4gIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgaWYgKHNoYXBlLmtpbmQgPT09ICdib29sZWFuJykgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICBpZiAoc2hhcGUua2luZCA9PT0gJ2ludGVnZXInKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gc2hhcGUubWluICYmIHZhbHVlIDw9IHNoYXBlLm1heDtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzaGFwZS52YWx1ZXMuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcGlja0FsbG93ZWQgKHJ1bGVzIDEsIDMgYW5kIDEwKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgcHJvcG9zYWwncyBzZXR0aW5ncywga2V5ZWQgYnkgYWxsb3dsaXN0IGtleS4gKi9cbmV4cG9ydCB0eXBlIE9yZ1NldHRpbmdQYXRjaCA9IFBhcnRpYWw8UmVjb3JkPE9yZ1NldHRpbmdLZXksIE9yZ1NldHRpbmdWYWx1ZT4+O1xuXG4vKiogV2hhdCB7QGxpbmsgcGlja0FsbG93ZWR9IGtlcHQsIGFuZCB3aGF0IGl0IHRocmV3IGF3YXkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgLyoqIFRoZSBhbGxvd2xpc3RlZCwgc2hhcGUtdmFsaWQgc2V0dGluZ3MuICovXG4gIHJlYWRvbmx5IGFsbG93ZWQ6IE9yZ1NldHRpbmdQYXRjaDtcbiAgLyoqXG4gICAqIEZpZWxkIG5hbWVzIHRoZSBjYW5kaWRhdGUgY2FycmllZCB0aGF0IGFyZSBOT1Qgb24gdGhlIGFsbG93bGlzdC4gVEhJUyBpc1xuICAgKiB0aGUgaW5qZWN0aW9uIHNpZ25hbCAocnVsZSAxMCk6IGEgbGVnaXRpbWF0ZSBkcmFmdCBoYXMgbm9uZSwgc28gYSBub24tZW1wdHlcbiAgICogbGlzdCBpcyBhIGNvdW50ZXIgdG8gaW5jcmVtZW50IGFuZCBhIGxpbmUgdG8gbG9nLCBub3QgYSBzaWxlbnQgZHJvcC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZnVzZWQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3dsaXN0ZWQga2V5cyB3aG9zZSB2YWx1ZSBkaWQgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBzaGFwZS4gRHJvcHBlZCB0b28sXG4gICAqIGJ1dCByZXBvcnRlZCBzZXBhcmF0ZWx5IOKAlCBhIGJhZCB2YWx1ZSBpcyBhIGRyYWZ0aW5nIG1pc3Rha2UsIG5vdCBhbiBhdHRlbXB0XG4gICAqIHRvIHJlYWNoIGEgZmllbGQgdGhlIGFnZW50IHdhcyBuZXZlciBnaXZlbi5cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWQ6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXTtcbiAgLyoqIGByZWZ1c2VkLmxlbmd0aGAsIHNvIGEgY2FsbGVyIGNhbiBjb3VudCB3aXRob3V0IHJlLWRlcml2aW5nIGl0LiAqL1xuICByZWFkb25seSByZWZ1c2VkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBLZWVwIG9ubHkgdGhlIGFsbG93bGlzdGVkLCBzaGFwZS12YWxpZCBmaWVsZHMgb2YgYSBjYW5kaWRhdGUgcHJvcG9zYWwsIGFuZFxuICogcmVwb3J0IGV2ZXJ5dGhpbmcgZHJvcHBlZC5cbiAqXG4gKiBUaGUgcmVzdWx0J3MgYGFsbG93ZWRgIG1hcCBJUyB0aGUgY29tbWl0IHBheWxvYWQgKHJ1bGUgMyk6IHRoZSBjb25maXJtXG4gKiBoYW5kbGVyIHNlbmRzIHRoZXNlIGZpZWxkcyBhbmQgb25seSB0aGVzZSwgc28gYW55dGhpbmcgdGhlIG1vZGVsIHNsaXBwZWQgaW5cbiAqIGlzIHN0cnVjdHVyYWxseSB1bmFwcGxpYWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgdW5yZW5kZXJlZC5cbiAqXG4gKiBgY2FuZGlkYXRlYCBpcyB1bnRydXN0ZWQgbW9kZWwgb3V0cHV0LCBzbyBpdCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhbnl0aGluZ1xuICogdGhhdCBpcyBub3QgYSBwbGFpbiBvYmplY3QgeWllbGRzIGFuIGVtcHR5IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tBbGxvd2VkKGNhbmRpZGF0ZTogdW5rbm93bik6IFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgY29uc3QgYWxsb3dlZDogT3JnU2V0dGluZ1BhdGNoID0ge307XG4gIGNvbnN0IHJlZnVzZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGludmFsaWQ6IE9yZ1NldHRpbmdLZXlbXSA9IFtdO1xuXG4gIGlmIChjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IHNwZWMgPSBCWV9LRVkuZ2V0KGtleSk7XG4gICAgICBpZiAoIXNwZWMpIHsgcmVmdXNlZC5wdXNoKGtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoIWlzVmFsaWRPcmdTZXR0aW5nVmFsdWUoc3BlYywgdmFsdWUpKSB7IGludmFsaWQucHVzaChzcGVjLmtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBhbGxvd2VkW3NwZWMua2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFsbG93ZWQsIHJlZnVzZWQsIGludmFsaWQsIHJlZnVzZWRDb3VudDogcmVmdXNlZC5sZW5ndGggfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpZmYgKyByZXF1ZXN0IHBsYW5uaW5nIChydWxlcyAzIGFuZCA3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSByZXZpZXdlZCBjaGFuZ2U6IHdoYXQgdGhlIHNldHRpbmcgaXMgbm93LCBhbmQgd2hhdCBpdCB3b3VsZCBiZWNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ1NldHRpbmdDaGFuZ2Uge1xuICByZWFkb25seSBzcGVjOiBPcmdTZXR0aW5nU3BlYztcbiAgcmVhZG9ubHkgZnJvbTogT3JnU2V0dGluZ1ZhbHVlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0bzogT3JnU2V0dGluZ1ZhbHVlO1xufVxuXG4vKipcbiAqIFRoZSBjaGFuZ2VzIGEgcHJvcG9zYWwgYWN0dWFsbHkgbWFrZXMsIGdpdmVuIHRoZSBDVVJSRU5UIHZhbHVlcy4gQSBmaWVsZFxuICogd2hvc2UgcHJvcG9zZWQgdmFsdWUgYWxyZWFkeSBlcXVhbHMgdGhlIGN1cnJlbnQgb25lIGlzIGRyb3BwZWQg4oCUIGl0IGlzIG5vdCBhXG4gKiBjaGFuZ2UsIGFuZCByZW5kZXJpbmcgaXQgYXMgb25lIG1ha2VzIGEgZGlmZiB0aGUgdXNlciBjYW5ub3QgcmVhZC5cbiAqXG4gKiBUaGUgY29uZmlybSBoYW5kbGVyIHJlLXJ1bnMgdGhpcyBhZ2FpbnN0IGEgRlJFU0ggcmVhZCBpbW1lZGlhdGVseSBiZWZvcmVcbiAqIGNvbW1pdHRpbmcgKHJ1bGUgNyk6IHRoZXNlIHJlY29yZHMgY2Fycnkgbm8gdmVyc2lvbiBjb2x1bW4sIHNvIGlmIHRoZSBsaXN0XG4gKiB0aGF0IGNvbWVzIGJhY2sgZGlmZmVycyBmcm9tIHRoZSBvbmUgdGhlIHVzZXIgYXBwcm92ZWQsIHN0YXRlIG1vdmVkIHVuZGVyIHRoZVxuICogcHJvcG9zYWwgYW5kIHRoZSBjb21taXQgbXVzdCBiZSByZWZ1c2VkIHJhdGhlciB0aGFuIGFwcGxpZWQgYmxpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmT3JnU2V0dGluZ3MoXG4gIGN1cnJlbnQ6IFJlYWRvbmx5PE9yZ1NldHRpbmdQYXRjaD4sXG4gIHByb3Bvc2VkOiBSZWFkb25seTxPcmdTZXR0aW5nUGF0Y2g+LFxuKTogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogT3JnU2V0dGluZ0NoYW5nZVtdID0gW107XG4gIGZvciAoY29uc3Qgc3BlYyBvZiBPUkdfU0VUVElOR19QUk9QT1NBTF9BTExPV0xJU1QpIHtcbiAgICBjb25zdCB0byA9IHByb3Bvc2VkW3NwZWMua2V5XTtcbiAgICBpZiAodG8gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgZnJvbSA9IGN1cnJlbnRbc3BlYy5rZXldO1xuICAgIGlmIChmcm9tID09PSB0bykgY29udGludWU7XG4gICAgY2hhbmdlcy5wdXNoKHsgc3BlYywgZnJvbSwgdG8gfSk7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKiBPbmUgQVBJIGNhbGwgdGhlIGNvbmZpcm0gaGFuZGxlciBtYWtlczogb25lIHN1cmZhY2UsIG9uZSBib2R5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nUmVxdWVzdCB7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICByZWFkb25seSBtZXRob2Q6ICdQVVQnO1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcm1pc3Npb246IFBlcm1pc3Npb247XG4gIC8qKiBSZXF1ZXN0IGJvZHk6IHRoZSBBUEkncyBvd24gZmllbGQgbmFtZXMsIGNhcnJ5aW5nIG9ubHkgcmV2aWV3ZWQgdmFsdWVzLiAqL1xuICByZWFkb25seSBib2R5OiBSZWNvcmQ8c3RyaW5nLCBPcmdTZXR0aW5nVmFsdWU+O1xufVxuXG4vKipcbiAqIEdyb3VwIGFwcHJvdmVkIGNoYW5nZXMgaW50byBvbmUgcmVxdWVzdCBwZXIgc3VyZmFjZSwgdHJhbnNsYXRpbmcgcHJvcG9zYWxcbiAqIGtleXMgYmFjayB0byB0aGUgZmllbGQgbmFtZXMgZWFjaCBBUEkgZXhwZWN0cy4gT3JkZXIgZm9sbG93cyB0aGUgYWxsb3dsaXN0LFxuICogc28gdGhlIHNhbWUgcHJvcG9zYWwgYWx3YXlzIHByb2R1Y2VzIHRoZSBzYW1lIGNhbGwgc2VxdWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmdTZXR0aW5nUmVxdWVzdHMoY2hhbmdlczogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdKTogcmVhZG9ubHkgT3JnU2V0dGluZ1JlcXVlc3RbXSB7XG4gIGNvbnN0IGJ5U3VyZmFjZSA9IG5ldyBNYXA8T3JnU2V0dGluZ1N1cmZhY2UsIE9yZ1NldHRpbmdSZXF1ZXN0PigpO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUKSB7XG4gICAgY29uc3QgY2hhbmdlID0gY2hhbmdlcy5maW5kKChjKSA9PiBjLnNwZWMua2V5ID09PSBzcGVjLmtleSk7XG4gICAgaWYgKCFjaGFuZ2UpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYnlTdXJmYWNlLmdldChzcGVjLnN1cmZhY2UpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYm9keVtzcGVjLmZpZWxkXSA9IGNoYW5nZS50bztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBieVN1cmZhY2Uuc2V0KHNwZWMuc3VyZmFjZSwge1xuICAgICAgc3VyZmFjZTogc3BlYy5zdXJmYWNlLFxuICAgICAgbWV0aG9kOiBzcGVjLmFwaS5tZXRob2QsXG4gICAgICBwYXRoOiBzcGVjLmFwaS5wYXRoLFxuICAgICAgcGVybWlzc2lvbjogc3BlYy5wZXJtaXNzaW9uLFxuICAgICAgYm9keTogeyBbc3BlYy5maWVsZF06IGNoYW5nZS50byB9LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4uYnlTdXJmYWNlLnZhbHVlcygpXTtcbn1cbiJdfQ==
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNrLXByb3Bvc2Fscy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2Fzay1wcm9wb3NhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXdFdEMsZ0ZBQWdGO0FBQ2hGLHNCQUFzQjtBQUN0QixnRkFBZ0Y7QUFFaEYsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztBQUU5Qyx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxDQUFDO0FBT25EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE9BQTJDO0lBRTNDLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQztBQVd6RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxPQUFnQjtJQUNoRCxNQUFNLEdBQUcsR0FBRyxPQUFxRCxDQUFDO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckYsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDaEQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN6RSxPQUFPLEtBQUssS0FBSyxrQkFB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LFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3RDLFNBQVM7UUFDWCxDQUFDO1FBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgc2hhcmVkIGNvbnRyYWN0IGJldHdlZW4gdGhlIGFzayBhZ2VudCdzIFBST1BPU0UgdG9vbHMgYW5kIHRoZSBicm93c2VyJ3NcbiAqIENPTkZJUk0gaGFuZGxlcnMuIFR3byB0aGluZ3MgbGl2ZSBoZXJlLCBhbmQgdGhleSBsaXZlIGhlcmUgYmVjYXVzZSBCT1RIIHNpZGVzXG4gKiBuZWVkIHRoZW06IGBhcGkvYXNrYCBidWlsZHMgaXRzIHRvb2wgc2NoZW1hIGZyb20gdGhpcyBtb2R1bGUsIHRoZSBmcm9udGVuZCdzXG4gKiBjb25maXJtIGhhbmRsZXIgYnVpbGRzIGl0cyByZXF1ZXN0IGZyb20gaXQsIGFuZCB0aGUgdGVzdHMgb2YgYm90aCBhc3NlcnRcbiAqIGFnYWluc3QgaXQuIEEgc2Vjb25kIGNvcHkgd291bGQgYmUgYSBzZWNvbmQgcG9saWN5LlxuICpcbiAqIERlcGVuZGVuY3ktZnJlZSBvbiBwdXJwb3NlIOKAlCBubyBydW50aW1lIGltcG9ydHMgYXQgYWxsIOKAlCBzbyB0aGUgYnJvd3NlciBjYW5cbiAqIGltcG9ydCBpdCB0aHJvdWdoIGFwaS1jb3JlJ3MgYC4vYXNrLXByb3Bvc2Fsc2AgZW50cnkgd2l0aG91dCBkcmFnZ2luZyBpbiB0aGVcbiAqIHNlcnZlciBncmFwaCAoZXhwcmVzcyAvIGp3dCAvIGlvcmVkaXMpLiBUaGUgb25seSBpbXBvcnRzIGFyZSBgaW1wb3J0IHR5cGVgLFxuICogd2hpY2ggdGhlIGNvbXBpbGVyIGVyYXNlcy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogMS4gUFJPVkVOQU5DRVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZXJ5IGNvbW1pdCB0aGF0IHN0YXJ0ZWQgbGlmZSBhcyBhbiBhZ2VudCBkcmFmdCBzdGFtcHNcbiAqIGBkZXRhaWxzOiB7IHByb3Bvc2VkQnk6ICdhc2stYWdlbnQnIH1gIG9udG8gaXRzIGF1ZGl0IGV2ZW50LiBUaGUgYXVkaXQgdHJhaWxcbiAqIGlzIGhhc2gtY2hhaW5lZCBhbmQgdGFtcGVyLWV2aWRlbnQsIGJ1dCB3aXRob3V0IHRoaXMgZmllbGQgaXQgY2Fubm90XG4gKiBkaXN0aW5ndWlzaCBcInRoZSBhZG1pbiBjaGFuZ2VkIHRoaXNcIiBmcm9tIFwiYW4gQUkgZHJhZnRlZCBpdCBhbmQgdGhlIGFkbWluXG4gKiBjbGlja2VkIEFwcGx5XCIg4oCUIHRoZSB0d28gbWVhbiB2ZXJ5IGRpZmZlcmVudCB0aGluZ3MgaW4gYW4gaW5jaWRlbnQgcmV2aWV3LlxuICogVGhlIGNvbnN0YW50IGV4aXN0cyBzbyB0aGUgbGl0ZXJhbCBpcyBub3QgcmV0eXBlZCBpbiB0d28gY29kZWJhc2VzLCB3aGVyZSBhXG4gKiB0eXBvIHdvdWxkIHNpbGVudGx5IHByb2R1Y2UgYW4gdW5xdWVyeWFibGUgdHJhaWwuXG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIDIuIFRIRSBPUkctU0VUVElOR1MgQUxMT1dMSVNUXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGhpcyBpcyBhbiBBTExPV0xJU1QsIG5vdCBhIGRlbnlsaXN0LCBhbmQgdGhlIGRpc3RpbmN0aW9uIGlzIHRoZSB3aG9sZSBwb2ludDpcbiAqIGEgc2V0dGluZyBhZGRlZCB0byB0aGUgcGxhdGZvcm0gdG9tb3Jyb3cgaXMgVU5BVkFJTEFCTEUgdG8gdGhlIGFnZW50IHVudGlsXG4gKiBzb21lb25lIGRlbGliZXJhdGVseSBhZGRzIGl0IGhlcmUsIHJhdGhlciB0aGFuIGJlaW5nIGV4cG9zZWQgYnkgb21pc3Npb24uXG4gKiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBiZWNhdXNlIGEgcHJvcG9zYWwgd2FzIHJlZnVzZWQsIHRoZSBmaXggaXMgdG8gYWRkIHRoZVxuICogZmllbGQgYmVsb3cgV0lUSCBpdHMgYHdoeWAg4oCUIG5vdCB0byBsb29zZW4ge0BsaW5rIHBpY2tBbGxvd2VkfS5cbiAqXG4gKiBBIGZpZWxkIGVhcm5zIGEgcGxhY2UgaGVyZSBvbmx5IGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGhvbGQuIFRoZXkgd2VyZVxuICogY2hlY2tlZCBhZ2FpbnN0IHRoZSByb3V0ZXMsIG5vdCBhc3N1bWVkOlxuICpcbiAqICAtICoqTm8gc3RlcC11cC4qKiBBIHJvdXRlIGNhcnJ5aW5nIGByZXF1aXJlU3RlcFVwYCBpcyBvdXQsIG5vIGV4Y2VwdGlvbnMuXG4gKiAgICBTdGVwLXVwIG1lYW5zIHRoZSBwbGF0Zm9ybSBhbHJlYWR5IGRlY2lkZWQgYSBsaXZlIHNlc3Npb24gaXMgbm90IGVub3VnaFxuICogICAgYXV0aG9yaXR5OyBhIGNoYXQgcHJvcG9zYWwgaXMgc3RyaWN0bHkgbGVzcy4gVGhpcyBpcyB3aGF0IGtlZXBzXG4gKiAgICBgUFVUIC9vcmdhbml6YXRpb24vYWktY29uZmlnYCBvdXQgKGl0IHBlcnNpc3RzIHBlci1vcmcgcHJvdmlkZXIgU0VDUkVUUyksXG4gKiAgICBhbG9uZyB3aXRoIHRoZSBNRkEgLyBwYXNzd29yZCAvIGF1dGhlbnRpY2F0b3IgcG9saWNpZXMsXG4gKiAgICBgUFVUIC9wbHVnaW5zL2luc3RhbGwtcG9saWN5YCwgb3JnIHJlc3RvcmUgYW5kIHRyYW5zZmVyLW93bmVyLlxuICogIC0gKipOb3QgYSBzZWN1cml0eSBjb250cm9sLioqIE1GQSAvIHBhc3N3b3JkIC8gYXV0aGVudGljYXRvciAvIGltcGVyc29uYXRpb25cbiAqICAgIHBvbGljeSwgU1NPK1NBTUwgYW5kIGl0cyBncm91cCBtYXBwaW5ncywgdmVyaWZpZWQgZG9tYWlucyBhbmQgZG9tYWluLWJhc2VkXG4gKiAgICBqb2luLCBqb2luLXJlcXVlc3QgZGVjaXNpb25zLCB0cmFuc2Zlci1vd25lciBhbmQgdGVhbSBsaWZlY3ljbGUgYXJlIEFCU0VOVFxuICogICAgaGVyZSByYXRoZXIgdGhhbiBnYXRlZCB3aXRoaW4g4oCUIFwicmVsYXggdGhlIE1GQSBwb2xpY3lcIiBpcyBwcmVjaXNlbHkgd2hhdCBhblxuICogICAgaW5qZWN0aW9uIHBheWxvYWQgYXNrcyBmb3IsIGFuZCBpdCBhcnJpdmVzIHRocm91Z2ggdGV4dCB0aGUgYWdlbnQgYWxyZWFkeVxuICogICAgcmVhZHMuIEFic2VudCBjYW5ub3QgYmUgYXJndWVkIHdpdGg7IGdhdGVkIGNhbi5cbiAqICAtICoqQ2FycmllcyBubyBzZWNyZXQgYW5kIG5vIGNhbGxiYWNrIHRhcmdldC4qKiBBbiBBUEkgdGhhdCByZXR1cm5zXG4gKiAgICBgaGFzV2ViaG9va1NlY3JldGAgaW5zdGVhZCBvZiB0aGUgc2VjcmV0IGlzIHRlbGxpbmcgeW91IHRoZSBmaWVsZCBjYW5ub3QgYmVcbiAqICAgIGRpZmZlZCwgc28gaXQgY2Fubm90IGJlIHJldmlld2VkLCBzbyBpdCBjYW5ub3QgYmUgcHJvcG9zZWQuIFdlYmhvb2sgVVJMc1xuICogICAgYW5kIGVtYWlsIGFkZHJlc3NlcyBhcmUgb3V0IGZvciB0aGUgc2FtZSByZWFzb24gcGx1cyBvbmUgbW9yZTogdGhleSBhcmVcbiAqICAgIGV4ZmlsdHJhdGlvbiB0YXJnZXRzLCBhbmQgYSBjb25maXJtYXRpb24gbWFpbCB0byBhbiBhdHRhY2tlci1jaG9zZW4gYWRkcmVzc1xuICogICAgaXMgYSBzZW5kIHRoZSBwbGF0Zm9ybSBwZXJmb3JtcyBvbiB0aGUgbW9kZWwncyBzYXktc28uXG4gKiAgLSAqKlJldmlld2FibGUgYXMgYSBkaWZmLioqIEEgc2NhbGFyIHdpdGggYSBjbG9zZWQgc2hhcGUgKGJvb2xlYW4sIGJvdW5kZWRcbiAqICAgIGludGVnZXIsIHNtYWxsIGVudW0pLiBBIGxpc3Qgb2Ygb3BhcXVlIHVzZXIgaWRzIHJlbmRlcnMgYXMgaWRzIGluIGEgY2FyZFxuICogICAgbm9ib2R5IGNhbiBjaGVjaywgc28gcmVjaXBpZW50IExJU1RTIGFyZSBvdXQgZXZlbiB0aG91Z2ggY2FkZW5jZSBpcyBpbi5cbiAqXG4gKiBFYWNoIGVudHJ5IG5hbWVzIHRoZSBBUEkgdGhhdCBhcHBsaWVzIGl0LiBUaGUgYnJvd3NlciBhcHBsaWVzIGl0IHRocm91Z2ggdGhlXG4gKiBVU0VSJ3Mgb3duIHNlc3Npb24gYW5kIHRoZSB1c2VyJ3Mgb3duIHBlcm1pc3Npb25zIOKAlCB0aGUgYWdlbnQgbmV2ZXIgd3JpdGVzIOKAlFxuICogc28gYSBwcm9wb3NhbCBhIG1lbWJlciBtYXkgbm90IGNvbW1pdCBzaW1wbHkgNDAzcyBhdCB0aGUgcm91dGUsIGV4YWN0bHkgYXMgYVxuICogaGFuZC1tYWRlIHJlcXVlc3Qgd291bGQuXG4gKlxuICogUnVsZSAxMCBsaXZlcyBpbiB7QGxpbmsgcGlja0FsbG93ZWR9OiBhIGNhbmRpZGF0ZSBjYXJyeWluZyBhIGZpZWxkIG91dHNpZGVcbiAqIHRoaXMgbGlzdCBpcyB0aGUgaW5qZWN0aW9uIHNpZ25hbCwgc28gdGhlIHJlZnVzZWQgbmFtZXMgY29tZSBiYWNrIHRvIHRoZVxuICogY2FsbGVyIHRvIGJlIGNvdW50ZWQgYW5kIGxvZ2dlZCByYXRoZXIgdGhhbiBiZWluZyBxdWlldGx5IGRyb3BwZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNlY3VyaXR5RGlnZXN0TW9kZSB9IGZyb20gJy4vd2lyZS12b2NhYnVsYXJ5LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFByb3ZlbmFuY2UgKHJ1bGUgNilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBUaGUgYHByb3Bvc2VkQnlgIHZhbHVlIGV2ZXJ5IGFnZW50LWRyYWZ0ZWQgY29tbWl0IHJlY29yZHMuICovXG5leHBvcnQgY29uc3QgQVNLX0FHRU5UX1BST1BPU0VSID0gJ2Fzay1hZ2VudCc7XG5cbi8qKiBUaGUgYXVkaXQgYGRldGFpbHNgIGtleSB0aGF0IGNhcnJpZXMgcHJvdmVuYW5jZS4gKi9cbmV4cG9ydCBjb25zdCBQUk9QT1NFRF9CWV9ERVRBSUxfS0VZID0gJ3Byb3Bvc2VkQnknO1xuXG4vKiogVGhlIHByb3ZlbmFuY2UgZnJhZ21lbnQgbWVyZ2VkIGludG8gYSBgUmVtb3RlQXVkaXRFdmVudC5kZXRhaWxzYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmVhZG9ubHkgcHJvcG9zZWRCeTogdHlwZW9mIEFTS19BR0VOVF9QUk9QT1NFUjtcbn1cblxuLyoqXG4gKiBNZXJnZSBhZ2VudCBwcm92ZW5hbmNlIGludG8gYW4gYXVkaXQgZXZlbnQncyBmcmVlLWZvcm0gYGRldGFpbHNgLlxuICogUHJvdmVuYW5jZSBpcyBhcHBsaWVkIExBU1Qgc28gYSBjYWxsZXItc3VwcGxpZWQgYHByb3Bvc2VkQnlgIGNhbm5vdCBvdmVyd3JpdGVcbiAqIGl0IOKAlCB0aGUgcG9pbnQgb2YgdGhlIGZpZWxkIGlzIHRoYXQgaXQgaXMgbm90IG5lZ290aWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc2tQcm9wb3NhbEF1ZGl0RGV0YWlscyhcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgQXNrUHJvcG9zYWxQcm92ZW5hbmNlIHtcbiAgcmV0dXJuIHsgLi4uZGV0YWlscywgcHJvcG9zZWRCeTogQVNLX0FHRU5UX1BST1BPU0VSIH07XG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgSEVBREVSIGEgcHJvcG9zYWwgY29tbWl0IHN0YW1wcywgYW5kIHRoZSBvbmx5IGNoYW5uZWwgcHJvdmVuYW5jZVxuICogdHJhdmVscyBvbi5cbiAqXG4gKiBBIEhFQURFUiByYXRoZXIgdGhhbiBhIGJvZHkgZmllbGQsIGZvciB0aHJlZSByZWFzb25zOlxuICpcbiAqICAtICoqSXQgY2Fubm90IGNvbGxpZGUuKiogYHByb3Bvc2VkQnlgIGluIGEgYm9keSB3b3VsZCBiZSBhIG5ldyBrZXkgaW4gc2l4XG4gKiAgICBkaWZmZXJlbnQgZG9tYWluIHNjaGVtYXMg4oCUIGBQaXBlbGluZVVwZGF0ZVNjaGVtYWAsIHRoZSBwbHVnaW4vdGVtcGxhdGVcbiAqICAgIHVwZGF0ZSBzY2hlbWFzLCB0aHJlZSBub3RpZmljYXRpb24vc2V0dGluZ3Mgc2NoZW1hcyDigJQgdHdvIG9mIHdoaWNoIGFyZVxuICogICAgYC5zdHJpY3QoKWAgYW5kIHRoZSByZXN0IG9mIHdoaWNoIGZlZWQgYE9iamVjdC5rZXlzKGJvZHkpYCBzdHJhaWdodCBpbnRvXG4gKiAgICB0aGUgdXBkYXRlJ3MgY29sdW1uIGxpc3QgYW5kIHRoZSBhdWRpdCdzIGBmaWVsZHNgLiBBIGZpZWxkIG5hbWVkIGFmdGVyIGFuXG4gKiAgICBhdWRpdCBrZXkgd291bGQgdGhlbiBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmVhbCBvbmUsIGFuZCB0aGUgZGF5IGFcbiAqICAgIGRvbWFpbiBncm93cyBpdHMgb3duIGBwcm9wb3NlZEJ5YCB0aGUgdHdvIG1lYW5pbmdzIG1lcmdlIHNpbGVudGx5LlxuICogIC0gKipJdCBpcyB0cmFuc3BvcnQgbWV0YWRhdGEsIGFuZCBzdGF5cyBvdXQgb2YgdGhlIHBheWxvYWQuKiogTm90aGluZ1xuICogICAgZG93bnN0cmVhbSBvZiBgdmFsaWRhdGVCb2R5YCBldmVyIHNlZXMgaXQsIHNvIGl0IGNhbm5vdCBiZSBwZXJzaXN0ZWQsIGNhbm5vdFxuICogICAgd2lkZW4gYSBkaWZmLCBhbmQgY2Fubm90IHJlYWNoIGEgc2VydmljZSB0aGF0IGZvcndhcmRzIHRoZSBib2R5IG9ud2FyZC5cbiAqICAtICoqVGhlIHBsYXRmb3JtIGFscmVhZHkgZG9lcyB0aGlzLioqIGBYLVN0ZXAtVXAtVG9rZW5gIGlzIHRoZSBzYW1lIHNoYXBlIG9mXG4gKiAgICB0aGluZyDigJQgYSBwZXItcmVxdWVzdCBhc3NlcnRpb24gYWJvdXQgSE9XIHRoZSBjYWxsIHdhcyBtYWRlIHJhdGhlciB0aGFuXG4gKiAgICBXSEFUIGl0IGNoYW5nZXMg4oCUIGFuZCByaWRlcyBhIGhlYWRlciBmb3IgdGhlIHNhbWUgcmVhc29ucy5cbiAqXG4gKiBMb3dlci1jYXNlIGJlY2F1c2UgdGhhdCBpcyBob3cgTm9kZSBub3JtYWxpc2VzIGluY29taW5nIGhlYWRlciBuYW1lczsgdGhlXG4gKiBicm93c2VyIHNlbmRzIGBYLVBCLVByb3Bvc2VkLUJ5YCwgd2hpY2ggYXJyaXZlcyBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgQVNLX1BST1BPU0VEX0JZX0hFQURFUiA9ICd4LXBiLXByb3Bvc2VkLWJ5JztcblxuLyoqXG4gKiBXaGF0IGEgcmVxdWVzdCdzIHByb3ZlbmFuY2UgaGVhZGVyIGNsYWltcy5cbiAqXG4gKiBgZm9yZWlnbmAgaXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IEVYQUNUTFkge0BsaW5rIEFTS19BR0VOVF9QUk9QT1NFUn0g4oCUIHRoZXJlXG4gKiBpcyBvbmUgbGVnaXRpbWF0ZSBwcm9wb3NlciBhbmQgbm8gZnJlZS1mb3JtIHRleHQsIHNvIGFueXRoaW5nIGVsc2UgaXMgYSBidWdcbiAqIG9yIGEgZm9yZ2VyeSBhbmQgaXMgbmFtZWQgYXMgc3VjaCByYXRoZXIgdGhhbiBmb2xkZWQgaW50byBgbm9uZWAuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3Bvc2VyQ2xhaW0gPSAnbm9uZScgfCAnYXNrLWFnZW50JyB8ICdmb3JlaWduJztcblxuLyoqXG4gKiBSZWFkIHRoZSBwcm92ZW5hbmNlIGNsYWltIG9mZiBhIHJlcXVlc3QncyBoZWFkZXIgYmFnLlxuICpcbiAqIERlbGliZXJhdGVseSBleGFjdDogbm8gdHJpbW1pbmcsIG5vIGNhc2UgZm9sZGluZywgbm8gcHJlZml4IG1hdGNoaW5nLiBUaGVcbiAqIG9ubHkgc2VuZGVyIGlzIHRoZSBicm93c2VyJ3MgY29uZmlybSBwYXRoLCB3aGljaCBzdGFtcHMgdGhlIHNoYXJlZCBjb25zdGFudCxcbiAqIHNvIGV2ZXJ5IG90aGVyIHZhbHVlIGlzIHJlZnVzZWQgcmF0aGVyIHRoYW4gcmVwYWlyZWQuIFRoaXMgaXMgd2hhdCBrZWVwcyBhXG4gKiBjbGllbnQgZnJvbSB3cml0aW5nIGFyYml0cmFyeSBhdWRpdCBgZGV0YWlsc2Ag4oCUIHRoZSBoZWFkZXIncyB3aG9sZSB2b2NhYnVsYXJ5XG4gKiBpcyBvbmUgd29yZCwgYW5kIHRoZSB3b3JkIGlzIG5vdCB0aGUgY2xpZW50J3MgdG8gY2hvb3NlLlxuICpcbiAqIFRha2VzIHRoZSBoZWFkZXIgQkFHIChgcmVxLmhlYWRlcnNgKSByYXRoZXIgdGhhbiBhIHJlcXVlc3QsIHNvIHRoaXMgbW9kdWxlXG4gKiBrZWVwcyBpdHMgemVybyBydW50aW1lIGltcG9ydHMgYW5kIHRoZSBicm93c2VyIGNhbiBzdGlsbCBpbXBvcnQgdGhlIGNvbnN0YW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFByb3Bvc2VyQ2xhaW0oaGVhZGVyczogdW5rbm93bik6IFByb3Bvc2VyQ2xhaW0ge1xuICBjb25zdCBiYWcgPSBoZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3ID0gYmFnICYmIHR5cGVvZiBiYWcgPT09ICdvYmplY3QnID8gYmFnW0FTS19QUk9QT1NFRF9CWV9IRUFERVJdIDogdW5kZWZpbmVkO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJ25vbmUnO1xuICByZXR1cm4gdmFsdWUgPT09IEFTS19BR0VOVF9QUk9QT1NFUiA/ICdhc2stYWdlbnQnIDogJ2ZvcmVpZ24nO1xufVxuXG4vKipcbiAqIFRoZSBhdWRpdCBgZGV0YWlsc2AgZm9yIGEgd3JpdGUsIHdpdGggcHJvdmVuYW5jZSBmb2xkZWQgaW4gd2hlbiDigJQgYW5kIE9OTFlcbiAqIHdoZW4g4oCUIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlIGFnZW50IG1hcmtlci5cbiAqXG4gKiBgZGV0YWlsc2AgaXMgd2hhdCB0aGUgSEFORExFUiBidWlsdCBhbmQgc3RheXMgYXV0aG9yaXRhdGl2ZS4gUHJvdmVuYW5jZSBpc1xuICogYWRkaXRpdmU6IHRoZSBPTkxZIGtleSBpdCBjYW4gZXZlciB3cml0ZSBpcyBgcHJvcG9zZWRCeWAsIHNvIGV2ZXJ5IGZpZWxkIHRoZVxuICogaGFuZGxlciBzZXQgc3Vydml2ZXMgdW50b3VjaGVkLCBhbmQge0BsaW5rIGFza1Byb3Bvc2FsQXVkaXREZXRhaWxzfSBhcHBsaWVzXG4gKiB0aGF0IG9uZSBrZXkgTEFTVCBzbyBhIGBwcm9wb3NlZEJ5YCBhcnJpdmluZyBmcm9tIGFueXdoZXJlIGVsc2UgY2Fubm90IHNwZWFrXG4gKiBpbiBpdHMgcGxhY2UuIEEgcmVxdWVzdCBjYXJyeWluZyBubyBtYXJrZXIsIG9yIGEgYGZvcmVpZ25gIG9uZSwgZ2V0cyB0aGVcbiAqIGhhbmRsZXIncyBkZXRhaWxzIHVuY2hhbmdlZCDigJQgYW4gb3JkaW5hcnkgZWRpdCByZWNvcmRzIG5vIGBwcm9wb3NlZEJ5YCBhdFxuICogYWxsLCB3aGljaCBpcyB0aGUgZGlzdGluY3Rpb24gdGhlIGZpZWxkIGV4aXN0cyB0byBtYWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFByb3Bvc2FsUHJvdmVuYW5jZShcbiAgaGVhZGVyczogdW5rbm93bixcbiAgZGV0YWlscz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlYWRQcm9wb3NlckNsYWltKGhlYWRlcnMpID09PSAnYXNrLWFnZW50J1xuICAgID8gYXNrUHJvcG9zYWxBdWRpdERldGFpbHMoZGV0YWlscylcbiAgICA6IHsgLi4uZGV0YWlscyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIGFsbG93bGlzdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgdmFsdWUgYW4gYWxsb3dsaXN0ZWQgb3JnIHNldHRpbmcgY2FuIGhvbGQuICovXG4vKipcbiAqIFRoZSBwcm9wb3NhbCBraW5kcyB0aGUgQXNrIGFnZW50IGNhbiBkcmFmdC5cbiAqXG4gKiBNaXJyb3JzIHRoZSBmcm9udGVuZCdzIGBQcm9wb3NhbEtpbmRgOyB0aGUgdHdvIGFyZSBwaW5uZWQgdG8gZWFjaCBvdGhlciBieVxuICogYGFzay1wcm9wb3NhbC1wZXJtaXNzaW9ucy50ZXN0LnRzYCBpbiB0aGUgZnJvbnRlbmQsIHdoaWNoIGlzIHdoZXJlIGJvdGggYXJlXG4gKiB2aXNpYmxlIGF0IG9uY2UuXG4gKi9cbmV4cG9ydCB0eXBlIEFza1Byb3Bvc2FsS2luZCA9XG4gIHwgJ3BpcGVsaW5lJ1xuICB8ICdwbHVnaW4nXG4gIHwgJ3RlbXBsYXRlJ1xuICB8ICdwaXBlbGluZS1lZGl0J1xuICB8ICdwbHVnaW4tZWRpdCdcbiAgfCAndGVtcGxhdGUtZWRpdCdcbiAgfCAnb3JnLXNldHRpbmdzLWVkaXQnXG4gIHwgJ2luc3RhbGwtY2hhbmdlLXJlcXVlc3QnXG4gIHwgJ2NvbXBsaWFuY2UtZXhlbXB0aW9uLXJlcXVlc3QnO1xuXG4vKipcbiAqIFRoZSBwZXJtaXNzaW9uIGEgY2FsbGVyIG5lZWRzIHRvIENPTU1JVCBlYWNoIHByb3Bvc2FsIGtpbmQg4oCUIHRoZSBvbmUgZmFjdCB0aGVcbiAqIGFzayBzZXJ2aWNlIGFuZCB0aGUgZGFzaGJvYXJkIG11c3QgYWdyZWUgb24sIHNvIGl0IGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW5cbiAqIGVpdGhlciBvZiB0aGVtLlxuICpcbiAqIGBvcmctc2V0dGluZ3MtZWRpdGAgaXMgbnVsbCBiZWNhdXNlIGl0IGhhcyBubyBzaW5nbGUgYW5zd2VyOiBpdHMgcmVxdWlyZW1lbnRcbiAqIGlzIHRoZSB1bmlvbiBvZiBgcGVybWlzc2lvbmAgb3ZlciB0aGUge0BsaW5rIE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVH1cbiAqIHJvd3MgdGhlIHByb3Bvc2FsIGFjdHVhbGx5IHRvdWNoZXMsIHdoaWNoIG9ubHkgdGhlIHByb3Bvc2FsIGl0c2VsZiBkZWNpZGVzLlxuICpcbiAqIE5PVCBhIGdhdGUgYW55d2hlcmUuIFRoZSBzZXJ2aWNlIHVzZXMgaXQgdG8gVEVMTCB0aGUgY2FsbGVyIChhbmQgdGhlIG1vZGVsKVxuICogd2hldGhlciBhIGRyYWZ0IGlzIGFwcGxpYWJsZTsgdGhlIGRhc2hib2FyZCB1c2VzIGl0IHRvIGRpc2FibGUgdGhlIEFwcGx5XG4gKiBidXR0b24gYW5kIG5hbWUgd2hhdCBpcyBtaXNzaW5nLiBFbmZvcmNlbWVudCBzdGF5cyB3aXRoIHRoZSBvd25pbmcgc2VydmljZSxcbiAqIHdoaWNoIHJlLWNoZWNrcyB0aGUgY2FsbGVyJ3Mgb3duIHRva2VuIG9uIHRoZSBjb21taXQuXG4gKi9cbmV4cG9ydCBjb25zdCBBU0tfUFJPUE9TQUxfUEVSTUlTU0lPTjogUmVhZG9ubHk8UmVjb3JkPEFza1Byb3Bvc2FsS2luZCwgUGVybWlzc2lvbiB8IG51bGw+PiA9IHtcbiAgJ3BpcGVsaW5lJzogJ3BpcGVsaW5lczp3cml0ZScsXG4gICdwbHVnaW4nOiAncGx1Z2luczp3cml0ZScsXG4gICd0ZW1wbGF0ZSc6ICd0ZW1wbGF0ZXM6d3JpdGUnLFxuICAncGlwZWxpbmUtZWRpdCc6ICdwaXBlbGluZXM6d3JpdGUnLFxuICAncGx1Z2luLWVkaXQnOiAncGx1Z2luczp3cml0ZScsXG4gICd0ZW1wbGF0ZS1lZGl0JzogJ3RlbXBsYXRlczp3cml0ZScsXG4gICdvcmctc2V0dGluZ3MtZWRpdCc6IG51bGwsXG4gIC8vIEZpbGluZyBhIHJlcXVlc3QsIG5vdCBtYWtpbmcgdGhlIGNoYW5nZTogYW55IG1lbWJlciB3aG8gbWF5IGluc3RhbGwgbWF5IEFTSyxcbiAgLy8gYW5kIGBwbHVnaW5faW5zdGFsbHM6bWFuYWdlYCBkZWNpZGVzLiBTYW1lIHNoYXBlIGZvciB0aGUgZXhlbXB0aW9uIGJlbG93IOKAlFxuICAvLyBgY29tcGxpYW5jZTpyZWFkYCByZXF1ZXN0cywgYGNvbXBsaWFuY2U6d3JpdGVgIGRlY2lkZXMuXG4gICdpbnN0YWxsLWNoYW5nZS1yZXF1ZXN0JzogJ3BsdWdpbnM6aW5zdGFsbCcsXG4gICdjb21wbGlhbmNlLWV4ZW1wdGlvbi1yZXF1ZXN0JzogJ2NvbXBsaWFuY2U6cmVhZCcsXG59O1xuXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vKiogV2hpY2ggcGVyLW9yZyByZWNvcmQgKGFuZCB0aGVyZWZvcmUgd2hpY2ggQVBJKSBhIGZpZWxkIGJlbG9uZ3MgdG8uICovXG5leHBvcnQgdHlwZSBPcmdTZXR0aW5nU3VyZmFjZSA9XG4gIHwgJ3JlcG9ydGluZydcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnXG4gIHwgJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucyc7XG5cbi8qKlxuICogRXZlcnkgcHJvcG9zYWJsZSBzZXR0aW5nLCBhcyBgPHN1cmZhY2U+LjxmaWVsZD5gLiBXcml0aW5nIHRoZSB1bmlvbiBvdXQgYnlcbiAqIGhhbmQgKHJhdGhlciB0aGFuIGluZmVycmluZyBpdCBmcm9tIHRoZSBhcnJheSkgaXMgZGVsaWJlcmF0ZTogdGhlIGtleSBzcGFjZVxuICogaXMgdGhlIGNvbnRyYWN0IHRoZSB0b29sIHNjaGVtYSBhbmQgdGhlIGNvbmZpcm0gaGFuZGxlciBzaGFyZSwgc28gaXQgaXNcbiAqIHN0YXRlZCBvbmNlLCBleHBsaWNpdGx5LCBhbmQgYSB0eXBvIGluIGFuIGVudHJ5IGJlbG93IGlzIGEgY29tcGlsZSBlcnJvci5cbiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ0tleSA9XG4gIHwgJ3JlcG9ydGluZy5pbmNpZGVudFdpbmRvd0hvdXJzJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbkJsb2NrJ1xuICB8ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucy5ub3RpZnlPbldhcm5pbmcnXG4gIHwgJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmVtYWlsRW5hYmxlZCdcbiAgfCAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZGlnZXN0TW9kZSdcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLm5vdGlmeVJlc2NhbidcbiAgfCAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnO1xuXG4vKiogVGhlIGNsb3NlZCBzaGFwZSBhIHByb3Bvc2VkIHZhbHVlIG11c3QgbWF0Y2ggYmVmb3JlIGl0IGlzIGFjY2VwdGVkLiAqL1xuZXhwb3J0IHR5cGUgT3JnU2V0dGluZ1NoYXBlID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdib29sZWFuJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnaW50ZWdlcic7IHJlYWRvbmx5IG1pbjogbnVtYmVyOyByZWFkb25seSBtYXg6IG51bWJlciB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZW51bSc7IHJlYWRvbmx5IHZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuLyoqIE9uZSBwcm9wb3NhYmxlIG9yZyBzZXR0aW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nU3BlYyB7XG4gIC8qKiBTdGFibGUgcHJvcG9zYWwga2V5IOKAlCBgPHN1cmZhY2U+LjxmaWVsZD5gLiBUaGlzIGlzIHdoYXQgdGhlIG1vZGVsIG5hbWVzLiAqL1xuICByZWFkb25seSBrZXk6IE9yZ1NldHRpbmdLZXk7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICAvKiogVGhlIHJlcXVlc3QtYm9keSBmaWVsZCBuYW1lIHRoZSBBUEkgZXhwZWN0cy4gKi9cbiAgcmVhZG9ubHkgZmllbGQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hhcGU6IE9yZ1NldHRpbmdTaGFwZTtcbiAgLyoqIFRoZSByb3V0ZSB0aGF0IGFwcGxpZXMgaXQsIGNhbGxlZCBieSB0aGUgQlJPV1NFUiB3aXRoIHRoZSB1c2VyJ3Mgc2Vzc2lvbi4gKi9cbiAgcmVhZG9ubHkgYXBpOiB7IHJlYWRvbmx5IG1ldGhvZDogJ1BVVCc7IHJlYWRvbmx5IHBhdGg6IHN0cmluZyB9O1xuICAvKiogVGhlIHBlcm1pc3Npb24gdGhhdCByb3V0ZSByZXF1aXJlcyBvZiB0aGUgY2FsbGVyLiAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uO1xuICAvKiogU2hvcnQgaHVtYW4gbGFiZWwgZm9yIHRoZSBjb25maXJtIGNhcmQuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBXSFkgdGhpcyBmaWVsZCBpcyBzYWZlIHRvIHByb3Bvc2UuIEV2ZXJ5IGVudHJ5IHN0YXRlcyBpdHMgb3duIGNhc2UuICovXG4gIHJlYWRvbmx5IHdoeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBgZGlnZXN0TW9kZWAgdm9jYWJ1bGFyeSBpcyBNSVJST1JFRCwgbm90IGltcG9ydGVkOiB0aGlzIG1vZHVsZSBrZWVwcyB6ZXJvXG4gKiBydW50aW1lIGltcG9ydHMgc28gdGhlIGJyb3dzZXIgZW50cnkgc3RheXMgc3RhbmRhbG9uZS4gVGhlIHR5cGUgYW5ub3RhdGlvblxuICogbWFrZXMgYSBSRU1PVkVEIG1vZGUgYSBjb21waWxlIGVycm9yIGhlcmUsIGFuZCBgYXNrLXByb3Bvc2Fscy50ZXN0LnRzYCBhc3NlcnRzXG4gKiB0aGUgbGlzdCBhZ2FpbnN0IGBQTFVHSU5fU0VDVVJJVFlfRElHRVNUX01PREVTYCBzbyBhbiBBRERFRCBvbmUgY2Fubm90IGRyaWZ0XG4gKiBlaXRoZXIuXG4gKi9cbmNvbnN0IERJR0VTVF9NT0RFUzogcmVhZG9ubHkgUGx1Z2luU2VjdXJpdHlEaWdlc3RNb2RlW10gPSBbJ2ltbWVkaWF0ZScsICdkYWlseScsICd3ZWVrbHknXTtcblxuLyoqXG4gKiBUaGUgYWxsb3dsaXN0LiBBZGRpbmcgYW4gZW50cnkgaXMgYSBkZWxpYmVyYXRlIGFjdDogbmFtZSB0aGUgcm91dGUgeW91XG4gKiBjaGVja2VkLCBjb25maXJtIGl0IGNhcnJpZXMgbm8gYHJlcXVpcmVTdGVwVXBgLCBhbmQgd3JpdGUgdGhlIGB3aHlgLlxuICovXG5leHBvcnQgY29uc3QgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUOiByZWFkb25seSBPcmdTZXR0aW5nU3BlY1tdID0gW1xuICB7XG4gICAga2V5OiAncmVwb3J0aW5nLmluY2lkZW50V2luZG93SG91cnMnLFxuICAgIHN1cmZhY2U6ICdyZXBvcnRpbmcnLFxuICAgIGZpZWxkOiAnaW5jaWRlbnRXaW5kb3dIb3VycycsXG4gICAgc2hhcGU6IHsga2luZDogJ2ludGVnZXInLCBtaW46IDEsIG1heDogNzIwIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZ19zZXR0aW5nczp3cml0ZScsXG4gICAgbGFiZWw6ICdJbmNpZGVudCBjb3JyZWxhdGlvbiB3aW5kb3cgKGhvdXJzKScsXG4gICAgd2h5OlxuICAgICAgJ0FuYWx5dGljcyB0dW5pbmcgb25seTogaXQgZGVjaWRlcyBob3cgbG9uZyBhZnRlciBhIGRlcGxveSBhbiBpbmNpZGVudCBpcyAnXG4gICAgICArICdhdHRyaWJ1dGVkIHRvIHRoYXQgZGVwbG95IHdoZW4gRE9SQSBtZXRyaWNzIGFyZSBjb21wdXRlZC4gSXQgZ3JhbnRzIG5vdGhpbmcsICdcbiAgICAgICsgJ3JldmVhbHMgbm90aGluZyBhbmQgcmVhY2hlcyBubyBvbmUg4oCUIHRoZSB3b3JzdCBvdXRjb21lIG9mIGEgd3JvbmcgdmFsdWUgaXMgYSAnXG4gICAgICArICdtaXNsZWFkaW5nIGNoYW5nZS1mYWlsdXJlIHJhdGUsIHdoaWNoIHRoZSBuZXh0IGVkaXQgY29ycmVjdHMuIFRoZSByb3V0ZSAnXG4gICAgICArICdyZWplY3RzIHRoZSBzaWJsaW5nIHJldGVudGlvbiBmaWVsZHMgb3V0cmlnaHQgKHRoZXkgYXJlIGJpbGxpbmctb3duZWQpLCBzbyAnXG4gICAgICArICd0aGlzIGlzIHRoZSB3aG9sZSB3cml0YWJsZSBzdXJmYWNlLiBCb3VuZGVkIGludGVnZXIsIHNvIHRoZSBkaWZmIGlzIG9uZSBudW1iZXIuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uQmxvY2snLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdub3RpZnlPbkJsb2NrJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdOb3RpZnkgd2hlbiBjb21wbGlhbmNlIGJsb2NrcyBhbiBhY3Rpb24nLFxuICAgIHdoeTpcbiAgICAgICdBIGRlbGl2ZXJ5IHByZWZlcmVuY2UsIG5vdCBhbiBlbmZvcmNlbWVudCBjb250cm9sOiB0aGUgYmxvY2sgaGFwcGVucyBlaXRoZXIgJ1xuICAgICAgKyAnd2F5IGFuZCB0aGUgcG9saWN5IHRoYXQgY2F1c2VkIGl0IGlzIHVuY2hhbmdlZC4gVHVybmluZyBpdCBvZmYgbWFrZXMgdGhlIG9yZyAnXG4gICAgICArICdxdWlldGVyLCBuZXZlciBtb3JlIHBlcm1pc3NpdmUuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLm5vdGlmeU9uV2FybmluZycsXG4gICAgc3VyZmFjZTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeU9uV2FybmluZycsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIGNvbXBsaWFuY2Ugd2FybmluZ3MnLFxuICAgIHdoeTogJ0FzIG5vdGlmeU9uQmxvY2sg4oCUIHdoaWNoIG5vbi1ibG9ja2luZyBmaW5kaW5ncyBhcmUgYW5ub3VuY2VkLCBub3Qgd2hhdCBpcyBlbmZvcmNlZC4nLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMuZW1haWxFbmFibGVkJyxcbiAgICBzdXJmYWNlOiAnY29tcGxpYW5jZU5vdGlmaWNhdGlvbnMnLFxuICAgIGZpZWxkOiAnZW1haWxFbmFibGVkJyxcbiAgICBzaGFwZTogeyBraW5kOiAnYm9vbGVhbicgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9jb21wbGlhbmNlL25vdGlmaWNhdGlvbi1wcmVmZXJlbmNlcycgfSxcbiAgICBwZXJtaXNzaW9uOiAnY29tcGxpYW5jZTp3cml0ZScsXG4gICAgbGFiZWw6ICdTZW5kIGNvbXBsaWFuY2Ugbm90aWNlcyBieSBlbWFpbCcsXG4gICAgd2h5OlxuICAgICAgJ0Nob29zZXMgd2hldGhlciB0aGUgZXhpc3Rpbmcgbm90aWNlcyBnbyBvdXQgYnkgZW1haWwuIEl0IGRvZXMgbm90IG5hbWUgYSAnXG4gICAgICArICdyZWNpcGllbnQg4oCUIHRoZSBhZGRyZXNzIGxpc3QgaXMgcmVzb2x2ZWQgZnJvbSBvcmcgbWVtYmVyc2hpcCBhdCBzZW5kIHRpbWUg4oCUICdcbiAgICAgICsgJ3NvIGEgZmxpcHBlZCBib29sZWFuIGNhbiBuZXZlciByb3V0ZSBtYWlsIHNvbWV3aGVyZSBuZXcuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBsaWFuY2VOb3RpZmljYXRpb25zLmRpZ2VzdE1vZGUnLFxuICAgIHN1cmZhY2U6ICdjb21wbGlhbmNlTm90aWZpY2F0aW9ucycsXG4gICAgZmllbGQ6ICdkaWdlc3RNb2RlJyxcbiAgICBzaGFwZTogeyBraW5kOiAnZW51bScsIHZhbHVlczogRElHRVNUX01PREVTIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvY29tcGxpYW5jZS9ub3RpZmljYXRpb24tcHJlZmVyZW5jZXMnIH0sXG4gICAgcGVybWlzc2lvbjogJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAgIGxhYmVsOiAnQ29tcGxpYW5jZSBub3RpY2UgY2FkZW5jZScsXG4gICAgd2h5OiAnQ2FkZW5jZSBvZiBhbiBleGlzdGluZyBub3RpY2UgdG8gZXhpc3RpbmcgcmVjaXBpZW50cy4gQ2xvc2VkIGVudW0sIHNvIHRoZSBkaWZmIGlzIG9uZSB3b3JkLicsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvbnMubm90aWZ5UmVzY2FuJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ25vdGlmeVJlc2NhbicsXG4gICAgc2hhcGU6IHsga2luZDogJ2Jvb2xlYW4nIH0sXG4gICAgYXBpOiB7IG1ldGhvZDogJ1BVVCcsIHBhdGg6ICcvcGx1Z2lucy9zZWN1cml0eS1ub3RpZmljYXRpb25zJyB9LFxuICAgIHBlcm1pc3Npb246ICdvcmdfc2V0dGluZ3M6d3JpdGUnLFxuICAgIGxhYmVsOiAnTm90aWZ5IG9uIG5pZ2h0bHkgcmVzY2FuIGZpbmRpbmdzJyxcbiAgICB3aHk6XG4gICAgICAnR292ZXJucyB0aGUgTjMxIHJlc2NhbiBub3RpY2Ugb25seS4gVGhlIHNjYW4gR0FURVMgYXJlIHVudG91Y2hlZDogYSBidWlsZCB0aGF0ICdcbiAgICAgICsgJ3RyaXBzIFBMVUdJTl9WVUxOX0dBVEUgc3RpbGwgZmFpbHMgYW5kIHN0aWxsIHNlbmRzIE4zMCwgd2hpY2ggdGhpcyBmbGFnIGNhbm5vdCAnXG4gICAgICArICdzdXBwcmVzcy4gU28gaXQgY2hhbmdlcyBob3cgbm9pc3kgYW4gaW5mb3JtYXRpb25hbCBub3RpY2UgaXMsIG5vdCB3aGV0aGVyIGEgJ1xuICAgICAgKyAndnVsbmVyYWJsZSB2ZXJzaW9uIGNhbiBiZSBwdWJsaXNoZWQuJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5kaWdlc3RNb2RlJyxcbiAgICBzdXJmYWNlOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zJyxcbiAgICBmaWVsZDogJ2RpZ2VzdE1vZGUnLFxuICAgIHNoYXBlOiB7IGtpbmQ6ICdlbnVtJywgdmFsdWVzOiBESUdFU1RfTU9ERVMgfSxcbiAgICBhcGk6IHsgbWV0aG9kOiAnUFVUJywgcGF0aDogJy9wbHVnaW5zL3NlY3VyaXR5LW5vdGlmaWNhdGlvbnMnIH0sXG4gICAgcGVybWlzc2lvbjogJ29yZ19zZXR0aW5nczp3cml0ZScsXG4gICAgbGFiZWw6ICdQbHVnaW4gc2VjdXJpdHkgbm90aWNlIGNhZGVuY2UnLFxuICAgIHdoeTpcbiAgICAgICdDYWRlbmNlIG9mIHRoZSByZXNjYW4gbm90aWNlLiBOMzAgKFwidmVyc2lvbiBibG9ja2VkXCIpIGlzIGFsd2F5cyBpbW1lZGlhdGUgYW5kICdcbiAgICAgICsgJ2lnbm9yZXMgdGhpcyBmaWVsZCwgc28gdGhlIHVyZ2VudCBjaGFubmVsIGNhbm5vdCBiZSBzbG93ZWQgZG93bi4nLFxuICB9LFxuXTtcblxuLyoqXG4gKiBGaWVsZHMgREVMSUJFUkFURUxZIGV4Y2x1ZGVkLCB3aXRoIHRoZSByZWFzb24sIHNvIGEgZnV0dXJlIHJlYWRlciBkb2VzIG5vdFxuICogcmUtbGl0aWdhdGUgdGhlbSBhbmQgYSByZXZpZXdlciBjYW4gc2VlIHRoZXkgd2VyZSBjb25zaWRlcmVkIHJhdGhlciB0aGFuXG4gKiBtaXNzZWQuIFRoaXMgaXMgZG9jdW1lbnRhdGlvbiBvbmx5IOKAlCB7QGxpbmsgcGlja0FsbG93ZWR9IGNvbnN1bHRzIHRoZVxuICogYWxsb3dsaXN0IGFsb25lLCBhbmQgYSBmaWVsZCBhYnNlbnQgZnJvbSBCT1RIIGxpc3RzIGlzIHJlZnVzZWQgaWRlbnRpY2FsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUkdfU0VUVElOR19QUk9QT1NBTF9FWENMVVNJT05TOiBSZWFkb25seUFycmF5PHsgcmVhZG9ubHkgZmllbGQ6IHN0cmluZzsgcmVhZG9ubHkgd2h5OiBzdHJpbmcgfT4gPSBbXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYWlDb25maWcnLCB3aHk6ICdTdGVwLXVwIGdhdGVkIChQVVQgL29yZ2FuaXphdGlvbi9haS1jb25maWcpIGFuZCBwZXJzaXN0cyBwZXItb3JnIHByb3ZpZGVyIHNlY3JldHMuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLm1mYVBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLiBMb29zZW5pbmcgaXQgcmVtb3ZlcyBhIGNvbnRyb2wgZm9yIGV2ZXJ5IG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24ucGFzc3dvcmRQb2xpY3knLCB3aHk6ICdTZWN1cml0eSBjb250cm9sICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uYXV0aGVudGljYXRvclBvbGljeScsIHdoeTogJ1NlY3VyaXR5IGNvbnRyb2wgKyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5pbXBlcnNvbmF0aW9uUG9saWN5Jywgd2h5OiAnU2VjdXJpdHkgY29udHJvbCArIHN0ZXAtdXA7IGRlY2lkZXMgd2hvIG91dHNpZGUgdGhlIG9yZyBtYXkgdmlldyBpdHMgZGF0YS4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uaWRwJywgd2h5OiAnU1NPL1NBTUwgY29uZmlnOiBzZWN1cml0eSBjb250cm9sIG9uIGl0cyBvd24gY2FwYWJpbGl0eSAob3JnX2lkcDp3cml0ZSksIGFzc3VyYW5jZSArIHN0cm9uZyBzdGVwLXVwLicgfSxcbiAgeyBmaWVsZDogJ29yZ2FuaXphdGlvbi5rbXNDb25maWcnLCB3aHk6ICdLZXkgbWF0ZXJpYWwuIE93biBjYXBhYmlsaXR5IChvcmdfa21zOndyaXRlKSwgYXNzdXJhbmNlICsgc3Ryb25nIHN0ZXAtdXAuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmlkZW50aXR5Jywgd2h5OiAnT3JnIG5hbWUvc2x1Zzogbm8gc3RlcC11cCwgYnV0IHJlbmFtaW5nIGFuIG9yZyBpcyBhbiBpbXBlcnNvbmF0aW9uIHByaW1pdGl2ZSBhbmQgdGhlIHNsdWcgaXMgYWRkcmVzc2FibGUuJyB9LFxuICB7IGZpZWxkOiAnb3JnYW5pemF0aW9uLmRvbWFpbnMnLCB3aHk6ICdWZXJpZmllZCBkb21haW5zIGRyaXZlIGRvbWFpbi1iYXNlZCBqb2luIOKAlCB3aG8gbWF5IGJlY29tZSBhIG1lbWJlci4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24uam9pblJlcXVlc3RzJywgd2h5OiAnTWVtYmVyc2hpcCBkZWNpc2lvbnMgYXJlIGFuIGF1dGhvcml0eSBncmFudCwgbm90IGEgc2V0dGluZy4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udHJhbnNmZXJPd25lcicsIHdoeTogJ093bmVyc2hpcCB0cmFuc2Zlcjogc2VjdXJpdHkgY29udHJvbCwgTUZBLWdyYWRlICsgc3RlcC11cC4nIH0sXG4gIHsgZmllbGQ6ICdvcmdhbml6YXRpb24udGVhbXMnLCB3aHk6ICdUZWFtIGxpZmVjeWNsZSAoY3JlYXRlL2RlbGV0ZS9tb3ZlKSBpcyBzdHJ1Y3R1cmFsIGFuZCBzdGVwLXVwIGdhdGVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpbnMuaW5zdGFsbFBvbGljeScsIHdoeTogJ1N0ZXAtdXAgZ2F0ZWQgKFBVVCAvcGx1Z2lucy9pbnN0YWxsLXBvbGljeSkgYW5kIGRlY2lkZXMgd2hhdCBtYXkgYmUgaW5zdGFsbGVkLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1VybCcsIHdoeTogJ0EgY2FsbGJhY2sgdGFyZ2V0OiBwcm9wb3Npbmcgb25lIHR1cm5zIHRoZSBwbGF0Zm9ybSBpbnRvIGFuIGV4ZmlsdHJhdGlvbiBjaGFubmVsLicgfSxcbiAgeyBmaWVsZDogJyoud2ViaG9va1NlY3JldCcsIHdoeTogJ0JlYXJlci1lcXVpdmFsZW50LiBUaGUgQVBJIHJldHVybnMgaGFzV2ViaG9va1NlY3JldCwgbmV2ZXIgdGhlIHZhbHVlLCBzbyBpdCBjYW5ub3QgYmUgZGlmZmVkLicgfSxcbiAgeyBmaWVsZDogJ3BsdWdpblNlY3VyaXR5Tm90aWZpY2F0aW9ucy5leHRlcm5hbEVtYWlsJywgd2h5OiAnQW4gYWRkcmVzcyB0aGUgcGxhdGZvcm0gdGhlbiBtYWlscyBhIGNvbmZpcm1hdGlvbiBsaW5rIHRvLiBOZXZlciBtb2RlbC1jaG9zZW4uJyB9LFxuICB7IGZpZWxkOiAnKi50YXJnZXRVc2VycycsIHdoeTogJ0EgbGlzdCBvZiBvcGFxdWUgdXNlciBpZHMgaXMgbm90IHJldmlld2FibGUgaW4gYSBjYXJkLCBhbmQgcmVkaXJlY3RpbmcgcmVjaXBpZW50cyBjYW4gc2lsZW5jZSBhIGNoYW5uZWwuJyB9LFxuICB7IGZpZWxkOiAncGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25zLnJlY2lwaWVudE1vZGUnLCB3aHk6ICdQYWlycyB3aXRoIHRhcmdldFVzZXJzOyBzd2l0Y2hpbmcgdG8gXCJ1c2Vyc1wiIG1ha2VzIGFuIHVucmV2aWV3YWJsZSBsaXN0IGF1dGhvcml0YXRpdmUuJyB9LFxuICB7IGZpZWxkOiAncmVwb3J0aW5nLmV2ZW50UmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQgKHRpZXIgKyBwdXJjaGFzZWQgcGFja3MpLiBUaGUgcm91dGUgYWxyZWFkeSByZWplY3RzIGl0OyBhZG1pdHRpbmcgaXQgd291bGQgYmUgYW4gZW50aXRsZW1lbnQgYnlwYXNzLicgfSxcbiAgeyBmaWVsZDogJ3JlcG9ydGluZy5kb3JhUmV0ZW50aW9uRGF5cycsIHdoeTogJ0JpbGxpbmctb3duZWQsIGFzIGFib3ZlLicgfSxcbl07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb29rdXBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEJZX0tFWTogUmVhZG9ubHlNYXA8c3RyaW5nLCBPcmdTZXR0aW5nU3BlYz4gPVxuICBuZXcgTWFwKE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IFtzcGVjLmtleSwgc3BlY10pKTtcblxuLyoqIEV2ZXJ5IHByb3Bvc2FibGUga2V5IOKAlCB0aGUgZW51bSBhIHByb3Bvc2UgdG9vbCdzIGlucHV0IHNjaGVtYSBpcyBidWlsdCBmcm9tLiAqL1xuZXhwb3J0IGNvbnN0IE9SR19TRVRUSU5HX1BST1BPU0FMX0tFWVM6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXSA9XG4gIE9SR19TRVRUSU5HX1BST1BPU0FMX0FMTE9XTElTVC5tYXAoKHNwZWMpID0+IHNwZWMua2V5KTtcblxuLyoqIElzIGBrZXlgIG9uIHRoZSBhbGxvd2xpc3Q/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wb3NhYmxlT3JnU2V0dGluZyhrZXk6IHN0cmluZyk6IGtleSBpcyBPcmdTZXR0aW5nS2V5IHtcbiAgcmV0dXJuIEJZX0tFWS5oYXMoa2V5KTtcbn1cblxuLyoqIFRoZSBzcGVjIGZvciBga2V5YCwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IHByb3Bvc2FibGUuICovXG5leHBvcnQgZnVuY3Rpb24gb3JnU2V0dGluZ1NwZWMoa2V5OiBzdHJpbmcpOiBPcmdTZXR0aW5nU3BlYyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBCWV9LRVkuZ2V0KGtleSk7XG59XG5cbi8qKiBEb2VzIGB2YWx1ZWAgbWF0Y2ggdGhlIHNoYXBlIHRoZSBmaWVsZCBkZWNsYXJlcz8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3JnU2V0dGluZ1ZhbHVlKHNwZWM6IE9yZ1NldHRpbmdTcGVjLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE9yZ1NldHRpbmdWYWx1ZSB7XG4gIGNvbnN0IHNoYXBlID0gc3BlYy5zaGFwZTtcbiAgaWYgKHNoYXBlLmtpbmQgPT09ICdib29sZWFuJykgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICBpZiAoc2hhcGUua2luZCA9PT0gJ2ludGVnZXInKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gc2hhcGUubWluICYmIHZhbHVlIDw9IHNoYXBlLm1heDtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzaGFwZS52YWx1ZXMuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcGlja0FsbG93ZWQgKHJ1bGVzIDEsIDMgYW5kIDEwKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEEgcHJvcG9zYWwncyBzZXR0aW5ncywga2V5ZWQgYnkgYWxsb3dsaXN0IGtleS4gKi9cbmV4cG9ydCB0eXBlIE9yZ1NldHRpbmdQYXRjaCA9IFBhcnRpYWw8UmVjb3JkPE9yZ1NldHRpbmdLZXksIE9yZ1NldHRpbmdWYWx1ZT4+O1xuXG4vKiogV2hhdCB7QGxpbmsgcGlja0FsbG93ZWR9IGtlcHQsIGFuZCB3aGF0IGl0IHRocmV3IGF3YXkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgLyoqIFRoZSBhbGxvd2xpc3RlZCwgc2hhcGUtdmFsaWQgc2V0dGluZ3MuICovXG4gIHJlYWRvbmx5IGFsbG93ZWQ6IE9yZ1NldHRpbmdQYXRjaDtcbiAgLyoqXG4gICAqIEZpZWxkIG5hbWVzIHRoZSBjYW5kaWRhdGUgY2FycmllZCB0aGF0IGFyZSBOT1Qgb24gdGhlIGFsbG93bGlzdC4gVEhJUyBpc1xuICAgKiB0aGUgaW5qZWN0aW9uIHNpZ25hbCAocnVsZSAxMCk6IGEgbGVnaXRpbWF0ZSBkcmFmdCBoYXMgbm9uZSwgc28gYSBub24tZW1wdHlcbiAgICogbGlzdCBpcyBhIGNvdW50ZXIgdG8gaW5jcmVtZW50IGFuZCBhIGxpbmUgdG8gbG9nLCBub3QgYSBzaWxlbnQgZHJvcC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZnVzZWQ6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3dsaXN0ZWQga2V5cyB3aG9zZSB2YWx1ZSBkaWQgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBzaGFwZS4gRHJvcHBlZCB0b28sXG4gICAqIGJ1dCByZXBvcnRlZCBzZXBhcmF0ZWx5IOKAlCBhIGJhZCB2YWx1ZSBpcyBhIGRyYWZ0aW5nIG1pc3Rha2UsIG5vdCBhbiBhdHRlbXB0XG4gICAqIHRvIHJlYWNoIGEgZmllbGQgdGhlIGFnZW50IHdhcyBuZXZlciBnaXZlbi5cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWQ6IHJlYWRvbmx5IE9yZ1NldHRpbmdLZXlbXTtcbiAgLyoqIGByZWZ1c2VkLmxlbmd0aGAsIHNvIGEgY2FsbGVyIGNhbiBjb3VudCB3aXRob3V0IHJlLWRlcml2aW5nIGl0LiAqL1xuICByZWFkb25seSByZWZ1c2VkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBLZWVwIG9ubHkgdGhlIGFsbG93bGlzdGVkLCBzaGFwZS12YWxpZCBmaWVsZHMgb2YgYSBjYW5kaWRhdGUgcHJvcG9zYWwsIGFuZFxuICogcmVwb3J0IGV2ZXJ5dGhpbmcgZHJvcHBlZC5cbiAqXG4gKiBUaGUgcmVzdWx0J3MgYGFsbG93ZWRgIG1hcCBJUyB0aGUgY29tbWl0IHBheWxvYWQgKHJ1bGUgMyk6IHRoZSBjb25maXJtXG4gKiBoYW5kbGVyIHNlbmRzIHRoZXNlIGZpZWxkcyBhbmQgb25seSB0aGVzZSwgc28gYW55dGhpbmcgdGhlIG1vZGVsIHNsaXBwZWQgaW5cbiAqIGlzIHN0cnVjdHVyYWxseSB1bmFwcGxpYWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgdW5yZW5kZXJlZC5cbiAqXG4gKiBgY2FuZGlkYXRlYCBpcyB1bnRydXN0ZWQgbW9kZWwgb3V0cHV0LCBzbyBpdCBpcyByZWFkIGRlZmVuc2l2ZWx5OiBhbnl0aGluZ1xuICogdGhhdCBpcyBub3QgYSBwbGFpbiBvYmplY3QgeWllbGRzIGFuIGVtcHR5IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tBbGxvd2VkKGNhbmRpZGF0ZTogdW5rbm93bik6IFBpY2tBbGxvd2VkUmVzdWx0IHtcbiAgY29uc3QgYWxsb3dlZDogT3JnU2V0dGluZ1BhdGNoID0ge307XG4gIGNvbnN0IHJlZnVzZWQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGludmFsaWQ6IE9yZ1NldHRpbmdLZXlbXSA9IFtdO1xuXG4gIGlmIChjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNhbmRpZGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IHNwZWMgPSBCWV9LRVkuZ2V0KGtleSk7XG4gICAgICBpZiAoIXNwZWMpIHsgcmVmdXNlZC5wdXNoKGtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoIWlzVmFsaWRPcmdTZXR0aW5nVmFsdWUoc3BlYywgdmFsdWUpKSB7IGludmFsaWQucHVzaChzcGVjLmtleSk7IGNvbnRpbnVlOyB9XG4gICAgICBhbGxvd2VkW3NwZWMua2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFsbG93ZWQsIHJlZnVzZWQsIGludmFsaWQsIHJlZnVzZWRDb3VudDogcmVmdXNlZC5sZW5ndGggfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpZmYgKyByZXF1ZXN0IHBsYW5uaW5nIChydWxlcyAzIGFuZCA3KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE9uZSByZXZpZXdlZCBjaGFuZ2U6IHdoYXQgdGhlIHNldHRpbmcgaXMgbm93LCBhbmQgd2hhdCBpdCB3b3VsZCBiZWNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZ1NldHRpbmdDaGFuZ2Uge1xuICByZWFkb25seSBzcGVjOiBPcmdTZXR0aW5nU3BlYztcbiAgcmVhZG9ubHkgZnJvbTogT3JnU2V0dGluZ1ZhbHVlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0bzogT3JnU2V0dGluZ1ZhbHVlO1xufVxuXG4vKipcbiAqIFRoZSBjaGFuZ2VzIGEgcHJvcG9zYWwgYWN0dWFsbHkgbWFrZXMsIGdpdmVuIHRoZSBDVVJSRU5UIHZhbHVlcy4gQSBmaWVsZFxuICogd2hvc2UgcHJvcG9zZWQgdmFsdWUgYWxyZWFkeSBlcXVhbHMgdGhlIGN1cnJlbnQgb25lIGlzIGRyb3BwZWQg4oCUIGl0IGlzIG5vdCBhXG4gKiBjaGFuZ2UsIGFuZCByZW5kZXJpbmcgaXQgYXMgb25lIG1ha2VzIGEgZGlmZiB0aGUgdXNlciBjYW5ub3QgcmVhZC5cbiAqXG4gKiBUaGUgY29uZmlybSBoYW5kbGVyIHJlLXJ1bnMgdGhpcyBhZ2FpbnN0IGEgRlJFU0ggcmVhZCBpbW1lZGlhdGVseSBiZWZvcmVcbiAqIGNvbW1pdHRpbmcgKHJ1bGUgNyk6IHRoZXNlIHJlY29yZHMgY2Fycnkgbm8gdmVyc2lvbiBjb2x1bW4sIHNvIGlmIHRoZSBsaXN0XG4gKiB0aGF0IGNvbWVzIGJhY2sgZGlmZmVycyBmcm9tIHRoZSBvbmUgdGhlIHVzZXIgYXBwcm92ZWQsIHN0YXRlIG1vdmVkIHVuZGVyIHRoZVxuICogcHJvcG9zYWwgYW5kIHRoZSBjb21taXQgbXVzdCBiZSByZWZ1c2VkIHJhdGhlciB0aGFuIGFwcGxpZWQgYmxpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmT3JnU2V0dGluZ3MoXG4gIGN1cnJlbnQ6IFJlYWRvbmx5PE9yZ1NldHRpbmdQYXRjaD4sXG4gIHByb3Bvc2VkOiBSZWFkb25seTxPcmdTZXR0aW5nUGF0Y2g+LFxuKTogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdIHtcbiAgY29uc3QgY2hhbmdlczogT3JnU2V0dGluZ0NoYW5nZVtdID0gW107XG4gIGZvciAoY29uc3Qgc3BlYyBvZiBPUkdfU0VUVElOR19QUk9QT1NBTF9BTExPV0xJU1QpIHtcbiAgICBjb25zdCB0byA9IHByb3Bvc2VkW3NwZWMua2V5XTtcbiAgICBpZiAodG8gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgZnJvbSA9IGN1cnJlbnRbc3BlYy5rZXldO1xuICAgIGlmIChmcm9tID09PSB0bykgY29udGludWU7XG4gICAgY2hhbmdlcy5wdXNoKHsgc3BlYywgZnJvbSwgdG8gfSk7XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbi8qKiBPbmUgQVBJIGNhbGwgdGhlIGNvbmZpcm0gaGFuZGxlciBtYWtlczogb25lIHN1cmZhY2UsIG9uZSBib2R5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdTZXR0aW5nUmVxdWVzdCB7XG4gIHJlYWRvbmx5IHN1cmZhY2U6IE9yZ1NldHRpbmdTdXJmYWNlO1xuICByZWFkb25seSBtZXRob2Q6ICdQVVQnO1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcm1pc3Npb246IFBlcm1pc3Npb247XG4gIC8qKiBSZXF1ZXN0IGJvZHk6IHRoZSBBUEkncyBvd24gZmllbGQgbmFtZXMsIGNhcnJ5aW5nIG9ubHkgcmV2aWV3ZWQgdmFsdWVzLiAqL1xuICByZWFkb25seSBib2R5OiBSZWNvcmQ8c3RyaW5nLCBPcmdTZXR0aW5nVmFsdWU+O1xufVxuXG4vKipcbiAqIEdyb3VwIGFwcHJvdmVkIGNoYW5nZXMgaW50byBvbmUgcmVxdWVzdCBwZXIgc3VyZmFjZSwgdHJhbnNsYXRpbmcgcHJvcG9zYWxcbiAqIGtleXMgYmFjayB0byB0aGUgZmllbGQgbmFtZXMgZWFjaCBBUEkgZXhwZWN0cy4gT3JkZXIgZm9sbG93cyB0aGUgYWxsb3dsaXN0LFxuICogc28gdGhlIHNhbWUgcHJvcG9zYWwgYWx3YXlzIHByb2R1Y2VzIHRoZSBzYW1lIGNhbGwgc2VxdWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmdTZXR0aW5nUmVxdWVzdHMoY2hhbmdlczogcmVhZG9ubHkgT3JnU2V0dGluZ0NoYW5nZVtdKTogcmVhZG9ubHkgT3JnU2V0dGluZ1JlcXVlc3RbXSB7XG4gIGNvbnN0IGJ5U3VyZmFjZSA9IG5ldyBNYXA8T3JnU2V0dGluZ1N1cmZhY2UsIE9yZ1NldHRpbmdSZXF1ZXN0PigpO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgT1JHX1NFVFRJTkdfUFJPUE9TQUxfQUxMT1dMSVNUKSB7XG4gICAgY29uc3QgY2hhbmdlID0gY2hhbmdlcy5maW5kKChjKSA9PiBjLnNwZWMua2V5ID09PSBzcGVjLmtleSk7XG4gICAgaWYgKCFjaGFuZ2UpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYnlTdXJmYWNlLmdldChzcGVjLnN1cmZhY2UpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcuYm9keVtzcGVjLmZpZWxkXSA9IGNoYW5nZS50bztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBieVN1cmZhY2Uuc2V0KHNwZWMuc3VyZmFjZSwge1xuICAgICAgc3VyZmFjZTogc3BlYy5zdXJmYWNlLFxuICAgICAgbWV0aG9kOiBzcGVjLmFwaS5tZXRob2QsXG4gICAgICBwYXRoOiBzcGVjLmFwaS5wYXRoLFxuICAgICAgcGVybWlzc2lvbjogc3BlYy5wZXJtaXNzaW9uLFxuICAgICAgYm9keTogeyBbc3BlYy5maWVsZF06IGNoYW5nZS50byB9LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4uYnlTdXJmYWNlLnZhbHVlcygpXTtcbn1cbiJdfQ==
|