@pipeline-builder/pipeline-data 3.4.94 → 3.4.96

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.
@@ -100,6 +100,117 @@ interface BuildFailure {
100
100
  occurrences: number;
101
101
  lastSeen: string;
102
102
  }
103
+ /**
104
+ * DORA performance band. `null` = insufficient data to classify (no
105
+ * deployments/failures/lead-time sample in the window), so the UI shows a
106
+ * neutral state rather than mislabeling an empty window as "low".
107
+ */
108
+ export type DoraLevel = 'elite' | 'high' | 'medium' | 'low' | null;
109
+ /** Optional scoping for {@link ReportingService.getDoraMetrics}. */
110
+ export interface DoraOptions {
111
+ /** Restrict to a single pipeline (per-pipeline DORA). */
112
+ pipelineId?: string;
113
+ /** Count only executions deployed to this environment (deploy-scoped). */
114
+ environment?: string;
115
+ /** Count only executions tagged with ANY environment (real deployments). */
116
+ deploysOnly?: boolean;
117
+ }
118
+ /**
119
+ * DORA metrics over a [from,to] window, org-scoped (single-org or rollup subtree).
120
+ *
121
+ * A "deployment" is a TERMINAL pipeline-level event, rolled up to one row per
122
+ * `execution_id` (FAILED wins, then SUCCEEDED, then CANCELED/STOPPED — same
123
+ * precedence as `listPipelineExecutions`).
124
+ *
125
+ * DISCLOSURE — these are RUN-BASED approximations of DORA. A "deployment" here
126
+ * is any successful pipeline RUN, not a verified production deployment: the
127
+ * event stream carries no deploy-stage/environment marker, so a CI-only
128
+ * build/test pipeline counts the same as one that ships to prod. That makes
129
+ * `deploymentFrequency` a pipeline-throughput signal and `changeFailureRate` a
130
+ * pipeline-failure rate (build/test failures caught in CI count too), and MTTR
131
+ * a pipeline-recovery time. Only `leadTime` carries an explicit `approx` flag
132
+ * (it is additionally a run-time proxy), but ALL four share the run≠deploy
133
+ * caveat until deploy/commit metadata is captured. See docs/dora-metrics.md.
134
+ */
135
+ export interface DoraMetrics {
136
+ /** The [from,to] window echoed back (started_at range). */
137
+ window: {
138
+ from: string;
139
+ to: string;
140
+ };
141
+ /**
142
+ * Whether the numbers count real deployments or pipeline runs:
143
+ * - `'deploy'` — scoped to executions tagged with a deploy `environment`
144
+ * (via `environment`/`deploysOnly`); a genuine deployment signal.
145
+ * - `'run'` — default: every successful PIPELINE run counts (no deploy
146
+ * marker applied). DF/CFR/MTTR then reflect pipeline activity, not deploys.
147
+ */
148
+ basis: 'deploy' | 'run';
149
+ /** The scoping applied (echoed for the UI); `null` when unscoped. */
150
+ filters: {
151
+ pipelineId: string | null;
152
+ environment: string | null;
153
+ };
154
+ /** Deployment Frequency — SUCCEEDED terminal deployments in the window. */
155
+ deploymentFrequency: {
156
+ /** Count of successful deployments. */
157
+ deployments: number;
158
+ /** Successful deployments per day over the window. */
159
+ perDay: number;
160
+ /** Performance band, or null when there were no deployments. */
161
+ level: DoraLevel;
162
+ };
163
+ /** Change Failure Rate — failed / (succeeded + failed); CANCELED excluded. */
164
+ changeFailureRate: {
165
+ failed: number;
166
+ /** succeeded + failed (the CFR denominator). */
167
+ total: number;
168
+ /** failed/total as a percentage, 0–100, 1 decimal. */
169
+ pct: number;
170
+ /** Performance band, or null when there were no deployments to judge. */
171
+ level: DoraLevel;
172
+ };
173
+ /** Mean Time To Restore — avg gap from a failure INCIDENT to its recovery.
174
+ * Consecutive failed runs of a pipeline (with no green run between) collapse
175
+ * into one incident; the gap is measured from the first failure's END to the
176
+ * recovering run's END. The recovery is visible up to a look-ahead past `to`
177
+ * so a failure near the window edge isn't spuriously counted unrestored. */
178
+ meanTimeToRestore: {
179
+ /** Failure incidents in the window (maximal runs of consecutive failures). */
180
+ failures: number;
181
+ /** Incidents that were followed by a succeeded run (recovered). */
182
+ restored: number;
183
+ /** Average restore gap in seconds; null when there were no incidents. */
184
+ avgSeconds: number | null;
185
+ /** Performance band, or null when there were no incidents. */
186
+ level: DoraLevel;
187
+ };
188
+ /** Lead Time — PROXY: median pipeline RUN TIME of succeeded deployments.
189
+ * NOT true commit→prod lead time (executions don't capture commit time),
190
+ * hence `approx: true` so the UI/docs can label it. */
191
+ leadTime: {
192
+ /** Succeeded deployments with a duration (the median sample). */
193
+ deployments: number;
194
+ /** Median run time in seconds; null when no successful deployments. */
195
+ medianSeconds: number | null;
196
+ approx: true;
197
+ /** Performance band, or null when there were no successful deployments. */
198
+ level: DoraLevel;
199
+ };
200
+ }
201
+ /** One interval bucket of the DORA trend (deployment frequency + change failure). */
202
+ export interface DoraTrendPoint {
203
+ /** Bucket start (DATE_TRUNC of started_at), ISO text. */
204
+ period: string;
205
+ /** Successful deployments in the bucket. */
206
+ deployments: number;
207
+ /** Failed deployments in the bucket. */
208
+ failed: number;
209
+ /** succeeded + failed in the bucket. */
210
+ total: number;
211
+ /** failed/total as a percent (0 when total is 0). */
212
+ changeFailurePct: number;
213
+ }
103
214
  /** Event payload accepted by `ReportingService.ingestEvents`. Mirrors the route's Zod shape. */
104
215
  export interface IngestEvent {
105
216
  /** Stable pipeline id the events Lambda read from the `PIPELINE_EVENT_ID`
@@ -116,6 +227,12 @@ export interface IngestEvent {
116
227
  startedAt?: string;
117
228
  completedAt?: string;
118
229
  durationMs?: number;
230
+ /** Source commit id of the change being shipped (DORA deploy attribution). */
231
+ commitSha?: string;
232
+ /** Source ref/branch (DORA deploy attribution). */
233
+ commitRef?: string;
234
+ /** Deploy target (e.g. "production"). Its presence marks a real deployment. */
235
+ environment?: string;
119
236
  detail?: Record<string, unknown>;
120
237
  }
121
238
  /** Counts + the (possibly truncated) list of unregistered pipeline ids the caller can log. */
@@ -196,6 +313,44 @@ export declare class ReportingService {
196
313
  getActionFailures(orgId: string, from: string, to: string, orgIds?: string[]): Promise<ActionFailure[]>;
197
314
  /** 1.8 Error categorization — group failure messages. */
198
315
  getErrors(orgId: string, from: string, to: string, limit?: number): Promise<ErrorEntry[]>;
316
+ /**
317
+ * 1.9 DORA metrics over [from,to] (started_at range), org-scoped + rollup-aware.
318
+ *
319
+ * All four metrics derive from a per-execution roll-up of TERMINAL PIPELINE
320
+ * events (one row per execution_id+pipeline_id; FAILED wins, then SUCCEEDED,
321
+ * then CANCELED/STOPPED — mirroring `listPipelineExecutions`). The scan is
322
+ * gated by the `p.org_id ${pred}` join exactly like the sibling reports, so a
323
+ * rollup passes the org→team subtree and a foreign org's executions never
324
+ * enter the aggregate.
325
+ *
326
+ * DF/CFR/lead-time count only CORE-window executions ([from,to]). MTTR is
327
+ * per-INCIDENT: consecutive failures collapse into one incident and the
328
+ * recovery lookup may see the next success up to MTTR_RESTORE_LOOKAHEAD past
329
+ * `to`, so a failure near the edge isn't right-censored into "never restored".
330
+ * The scan bound is therefore `[from, to + look-ahead]`; the started_at range
331
+ * still rides the same index as the sibling reports.
332
+ *
333
+ * DISCLOSURE: by default DF/CFR/MTTR are RUN-based (any successful PIPELINE
334
+ * run = a "deployment"), and Lead Time is additionally a run-time PROXY
335
+ * flagged `approx: true`. Pass `environment` or `deploysOnly` to scope to
336
+ * executions tagged with a real deploy target — the response `basis` reports
337
+ * which was used. See the DoraMetrics doc + docs/dora-metrics.md.
338
+ *
339
+ * @param opts.pipelineId restrict to one pipeline (per-pipeline DORA)
340
+ * @param opts.environment count only executions deployed to this target
341
+ * @param opts.deploysOnly count only executions tagged with ANY environment
342
+ */
343
+ getDoraMetrics(orgId: string, from: string, to: string, orgIds?: string[], opts?: DoraOptions): Promise<DoraMetrics>;
344
+ /** Shape a single DORA aggregate row into the public {@link DoraMetrics}. */
345
+ private shapeDora;
346
+ /**
347
+ * 1.9b DORA trend — deployment frequency + change-failure rate bucketed by
348
+ * `interval` (day/week/month) for a sparkline. Per-execution rollup (one row
349
+ * per execution, FAILED wins) bucketed on the execution's started_at. Shares
350
+ * the `getDoraMetrics` scoping (org/rollup, pipelineId, deploy-scoping); MTTR
351
+ * and lead time are intentionally omitted (too heavy to bucket meaningfully).
352
+ */
353
+ getDoraTrend(orgId: string, interval: string, from: string, to: string, orgIds?: string[], opts?: DoraOptions): Promise<DoraTrendPoint[]>;
199
354
  /** 2.1 Plugin summary — counts and breakdowns. */
200
355
  getPluginSummary(orgId: string): Promise<PluginSummary>;
201
356
  /** 2.2 Type & compute distribution. */
@@ -13,6 +13,123 @@ const logger = createLogger('reporting-service');
13
13
  */
14
14
  const inventoryCache = createCacheService('report:inv:', parseInt(process.env.CACHE_TTL_REPORT_INVENTORY || '300', 10));
15
15
  const timeseriesCache = createCacheService('report:ts:', parseInt(process.env.CACHE_TTL_REPORT_TIMESERIES || '120', 10));
16
+ /** Raw single-row shape returned by the DORA aggregate query (pre-shaping). */
17
+ /**
18
+ * How far past the report's `to` bound the DORA MTTR query may look for a
19
+ * failure's recovering run. Bounds the scan while stopping a failure near the
20
+ * window edge from being spuriously scored "never restored". A failure that
21
+ * has not recovered within this window stays counted as an open incident.
22
+ */
23
+ const MTTR_RESTORE_LOOKAHEAD = '30 days';
24
+ // DORA performance bands (thresholds from the DORA/Accelerate reports). Each
25
+ // helper returns `null` when there's no sample to classify.
26
+ /** Deployment frequency by deploys/day: elite ≥1/day, high ≥1/week, medium ≥1/month. */
27
+ function doraLevelForFrequency(perDay, deployments) {
28
+ if (deployments <= 0)
29
+ return null;
30
+ if (perDay >= 1)
31
+ return 'elite';
32
+ if (perDay >= 1 / 7)
33
+ return 'high';
34
+ if (perDay >= 1 / 30)
35
+ return 'medium';
36
+ return 'low';
37
+ }
38
+ /** Change failure rate by percent: elite ≤5%, high ≤10%, medium ≤15%. */
39
+ function doraLevelForChangeFailure(pct, total) {
40
+ if (total <= 0)
41
+ return null;
42
+ if (pct <= 5)
43
+ return 'elite';
44
+ if (pct <= 10)
45
+ return 'high';
46
+ if (pct <= 15)
47
+ return 'medium';
48
+ return 'low';
49
+ }
50
+ /** Time to restore by seconds: elite <1h, high <1 day, medium <1 week. */
51
+ function doraLevelForRestore(avgSeconds) {
52
+ if (avgSeconds == null)
53
+ return null;
54
+ if (avgSeconds < 3600)
55
+ return 'elite';
56
+ if (avgSeconds < 86400)
57
+ return 'high';
58
+ if (avgSeconds < 604800)
59
+ return 'medium';
60
+ return 'low';
61
+ }
62
+ /** Lead time by seconds: elite <1 day, high <1 week, medium <1 month. */
63
+ function doraLevelForLeadTime(medianSeconds) {
64
+ if (medianSeconds == null)
65
+ return null;
66
+ if (medianSeconds < 86400)
67
+ return 'elite';
68
+ if (medianSeconds < 604800)
69
+ return 'high';
70
+ if (medianSeconds < 2592000)
71
+ return 'medium';
72
+ return 'low';
73
+ }
74
+ /**
75
+ * Shared per-execution terminal-status roll-up for the DORA `execs` CTEs:
76
+ * FAILED wins, then SUCCEEDED, else CANCELED/STOPPED. Kept in one place so
77
+ * getDoraMetrics and getDoraTrend can't drift on the precedence.
78
+ */
79
+ const DORA_TERMINAL_STATUS_CASE = sql `
80
+ CASE
81
+ WHEN bool_or(e.status = 'FAILED') THEN 'FAILED'
82
+ WHEN bool_or(e.status = 'SUCCEEDED') THEN 'SUCCEEDED'
83
+ ELSE 'CANCELED'
84
+ END`;
85
+ /**
86
+ * Optional per-pipeline / deploy-scoping predicates + the resulting `basis`,
87
+ * shared by getDoraMetrics and getDoraTrend so the env/deploysOnly precedence
88
+ * can't diverge. `environment` (one target) wins over `deploysOnly` (any env).
89
+ */
90
+ function doraScopeClauses(opts) {
91
+ const { pipelineId, environment, deploysOnly } = opts;
92
+ const pipelineClause = pipelineId ? sql `AND e.pipeline_id = ${pipelineId}` : sql ``;
93
+ const deployClause = environment
94
+ ? sql `AND e.environment = ${environment}`
95
+ : deploysOnly ? sql `AND e.environment IS NOT NULL` : sql ``;
96
+ const basis = environment || deploysOnly ? 'deploy' : 'run';
97
+ return { pipelineClause, deployClause, basis };
98
+ }
99
+ /**
100
+ * Shared `execs` CTE body — the per-execution terminal roll-up that BOTH DORA
101
+ * methods scan. Only the SELECTed columns and the upper range bound differ
102
+ * (getDoraMetrics needs pipeline_id/ended_at/duration_ms plus a look-ahead tail
103
+ * for MTTR recovery; getDoraTrend needs only started_at over the core window),
104
+ * so those are the parameters. The `event_type='PIPELINE'` gate, the
105
+ * SUCCEEDED/FAILED/CANCELED/STOPPED status set, the `execution_id` filter, the
106
+ * org + deploy/pipeline scope clauses, and the `GROUP BY` all live here so the
107
+ * two callers can't drift on the status set or the predicate.
108
+ *
109
+ * @param columns trailing SELECT columns (after `e.execution_id,`)
110
+ * @param toBound the `<=` upper-bound expression on `e.started_at`
111
+ * (core window for the trend; core + look-ahead for metrics)
112
+ */
113
+ function execsCte(args) {
114
+ const { pred, columns, pipelineClause, deployClause, from, toBound } = args;
115
+ return sql `
116
+ SELECT
117
+ e.execution_id,
118
+ ${columns}
119
+ FROM ${schema.pipelineEvent} e
120
+ JOIN ${schema.pipeline} p ON p.id = e.pipeline_id
121
+ WHERE p.org_id ${pred} AND e.event_type = 'PIPELINE'
122
+ -- STOPPED (manually aborted) joins CANCELED in the ELSE bucket; both
123
+ -- are terminal non-deploy outcomes. SUPERSEDED stays excluded (a
124
+ -- replaced execution, not an outcome).
125
+ AND e.status IN ('SUCCEEDED', 'FAILED', 'CANCELED', 'STOPPED')
126
+ AND e.execution_id IS NOT NULL
127
+ ${pipelineClause}
128
+ ${deployClause}
129
+ AND e.started_at >= ${from}::timestamptz
130
+ AND e.started_at <= ${toBound}
131
+ GROUP BY e.execution_id, e.pipeline_id`;
132
+ }
16
133
  // ─── Service ────────────────────────────────────────────
17
134
  /**
18
135
  * Read-only reporting service for pipeline execution and plugin inventory aggregations.
@@ -98,6 +215,17 @@ export class ReportingService {
98
215
  startedAt: event.startedAt ? new Date(event.startedAt) : undefined,
99
216
  completedAt: event.completedAt ? new Date(event.completedAt) : undefined,
100
217
  durationMs: event.durationMs,
218
+ // Deploy-attribution fields — scrubbed like the other free-form strings
219
+ // so an ARN/account id can never enter via a ref or environment name.
220
+ commitSha: event.commitSha !== undefined
221
+ ? scrubAwsIdentifiersFromString(event.commitSha)
222
+ : undefined,
223
+ commitRef: event.commitRef !== undefined
224
+ ? scrubAwsIdentifiersFromString(event.commitRef)
225
+ : undefined,
226
+ environment: event.environment !== undefined
227
+ ? scrubAwsIdentifiersFromString(event.environment)
228
+ : undefined,
101
229
  detail: event.detail !== undefined
102
230
  ? scrubAwsIdentifiers(event.detail)
103
231
  : undefined,
@@ -341,6 +469,223 @@ export class ReportingService {
341
469
  LIMIT ${limit}
342
470
  `).then(r => drizzleRows(r.rows))));
343
471
  }
472
+ /**
473
+ * 1.9 DORA metrics over [from,to] (started_at range), org-scoped + rollup-aware.
474
+ *
475
+ * All four metrics derive from a per-execution roll-up of TERMINAL PIPELINE
476
+ * events (one row per execution_id+pipeline_id; FAILED wins, then SUCCEEDED,
477
+ * then CANCELED/STOPPED — mirroring `listPipelineExecutions`). The scan is
478
+ * gated by the `p.org_id ${pred}` join exactly like the sibling reports, so a
479
+ * rollup passes the org→team subtree and a foreign org's executions never
480
+ * enter the aggregate.
481
+ *
482
+ * DF/CFR/lead-time count only CORE-window executions ([from,to]). MTTR is
483
+ * per-INCIDENT: consecutive failures collapse into one incident and the
484
+ * recovery lookup may see the next success up to MTTR_RESTORE_LOOKAHEAD past
485
+ * `to`, so a failure near the edge isn't right-censored into "never restored".
486
+ * The scan bound is therefore `[from, to + look-ahead]`; the started_at range
487
+ * still rides the same index as the sibling reports.
488
+ *
489
+ * DISCLOSURE: by default DF/CFR/MTTR are RUN-based (any successful PIPELINE
490
+ * run = a "deployment"), and Lead Time is additionally a run-time PROXY
491
+ * flagged `approx: true`. Pass `environment` or `deploysOnly` to scope to
492
+ * executions tagged with a real deploy target — the response `basis` reports
493
+ * which was used. See the DoraMetrics doc + docs/dora-metrics.md.
494
+ *
495
+ * @param opts.pipelineId restrict to one pipeline (per-pipeline DORA)
496
+ * @param opts.environment count only executions deployed to this target
497
+ * @param opts.deploysOnly count only executions tagged with ANY environment
498
+ */
499
+ async getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
500
+ const { pred, multi } = this.orgScope(orgId, orgIds);
501
+ const { pipelineId, environment, deploysOnly } = opts;
502
+ // Optional deploy-scoping / per-pipeline predicates, folded into the execs
503
+ // scan so failures AND their recovery successes are filtered consistently.
504
+ const { pipelineClause, deployClause, basis } = doraScopeClauses(opts);
505
+ // Scan the CORE window plus a look-ahead tail: the extra tail exists only
506
+ // so a late failure can still find its recovery (see the restore CTE).
507
+ const execs = execsCte({
508
+ pred,
509
+ pipelineClause,
510
+ deployClause,
511
+ from,
512
+ columns: sql `
513
+ e.pipeline_id,
514
+ ${DORA_TERMINAL_STATUS_CASE} AS status,
515
+ MIN(e.started_at) AS started_at,
516
+ MAX(e.completed_at) AS ended_at,
517
+ MAX(e.duration_ms) AS duration_ms`,
518
+ toBound: sql `${to}::timestamptz + ${MTTR_RESTORE_LOOKAHEAD}::interval`,
519
+ });
520
+ const exec = () => withTenantTx((tx) => tx.execute(sql `
521
+ WITH execs AS (${execs}
522
+ ),
523
+ -- Core-window executions ([from,to]); DF/CFR/lead-time count only these.
524
+ -- The look-ahead rows above are used ONLY as MTTR recovery candidates.
525
+ core AS (
526
+ SELECT * FROM execs WHERE started_at <= ${to}::timestamptz
527
+ ),
528
+ df AS (
529
+ SELECT COUNT(*) FILTER (WHERE status = 'SUCCEEDED')::int AS deployments
530
+ FROM core
531
+ ),
532
+ cfr AS (
533
+ SELECT
534
+ COUNT(*) FILTER (WHERE status = 'FAILED')::int AS failed,
535
+ COUNT(*) FILTER (WHERE status IN ('SUCCEEDED', 'FAILED'))::int AS total
536
+ FROM core
537
+ ),
538
+ lt AS (
539
+ SELECT
540
+ COUNT(*)::int AS deployments,
541
+ PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY duration_ms)::float AS median_ms
542
+ FROM core
543
+ WHERE status = 'SUCCEEDED' AND duration_ms IS NOT NULL
544
+ ),
545
+ -- For each core-window failure, find the END of its recovering run: the
546
+ -- next SUCCEEDED run of the same pipeline that ENDED after this failure
547
+ -- ended (visible into the look-ahead tail). SELECT and MEASURE both key
548
+ -- off ended_at so they stay consistent -- the incident gap is
549
+ -- restored_at (success end) minus incident_started (first failure end),
550
+ -- so picking the recovery by ended_at (not started_at) rules out the
551
+ -- negative gap that a concurrent success which STARTED after the failure
552
+ -- but ENDED before it would otherwise fold into AVG. Measuring from the
553
+ -- failure's END (not start) also keeps the failed run's own duration out
554
+ -- of restore time. Ordering by ended_at makes the incident collapse fall
555
+ -- out naturally: a green run ending between two failures splits them.
556
+ restore AS (
557
+ SELECT
558
+ f.pipeline_id,
559
+ f.ended_at AS fail_ended,
560
+ (SELECT s.ended_at FROM execs s
561
+ WHERE s.pipeline_id = f.pipeline_id AND s.status = 'SUCCEEDED'
562
+ AND s.ended_at > f.ended_at
563
+ ORDER BY s.ended_at ASC LIMIT 1) AS restored_at
564
+ FROM core f
565
+ WHERE f.status = 'FAILED'
566
+ ),
567
+ -- Collapse to INCIDENTS: failures sharing the same recovery (i.e. with
568
+ -- no green run between them) are one incident, starting at the first
569
+ -- failure's end. Unrecovered failures share restored_at = NULL and form
570
+ -- the single trailing open incident per pipeline.
571
+ incidents AS (
572
+ SELECT pipeline_id, restored_at, MIN(fail_ended) AS incident_started
573
+ FROM restore
574
+ GROUP BY pipeline_id, restored_at
575
+ ),
576
+ mttr AS (
577
+ SELECT
578
+ COUNT(*)::int AS failures,
579
+ -- restored must equal the count of incidents that actually
580
+ -- contribute to avg_seconds. Guard on incident_started too: a
581
+ -- failure with a NULL completed_at yields a NULL incident_started
582
+ -- that contributes NULL (not a real gap) to AVG, so it must not be
583
+ -- counted as restored either -- otherwise restored could exceed
584
+ -- the number of measured incidents.
585
+ COUNT(*) FILTER (
586
+ WHERE restored_at IS NOT NULL AND incident_started IS NOT NULL
587
+ )::int AS restored,
588
+ AVG(EXTRACT(EPOCH FROM (restored_at - incident_started)))
589
+ FILTER (WHERE restored_at IS NOT NULL AND incident_started IS NOT NULL)::float AS avg_seconds
590
+ FROM incidents
591
+ )
592
+ SELECT
593
+ df.deployments AS df_deployments,
594
+ cfr.failed AS cfr_failed,
595
+ cfr.total AS cfr_total,
596
+ lt.deployments AS lt_deployments,
597
+ lt.median_ms AS lt_median_ms,
598
+ mttr.failures AS mttr_failures,
599
+ mttr.restored AS mttr_restored,
600
+ mttr.avg_seconds AS mttr_avg_seconds
601
+ FROM df, cfr, lt, mttr
602
+ `).then(r => this.shapeDora(drizzleRows(r.rows)[0], from, to, basis, { pipelineId, environment })));
603
+ const key = `${orgId}:dora:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${deploysOnly ? 'd' : ''}`;
604
+ return this.runReport(key, multi, exec);
605
+ }
606
+ /** Shape a single DORA aggregate row into the public {@link DoraMetrics}. */
607
+ shapeDora(row, from, to, basis, filters) {
608
+ // `FROM df, cfr, lt, mttr` always yields exactly one row (each CTE is a
609
+ // single-row aggregate), but guard against an empty result defensively.
610
+ const r = row ?? {};
611
+ const deployments = Number(r.df_deployments) || 0;
612
+ // Floor the divisor at one day: a window shorter than a day (incl. the
613
+ // degenerate from==to) has no meaningful sub-day rate, so it's treated as a
614
+ // single day rather than extrapolated or mislabeled as a raw count.
615
+ // Floor at one day and guard against unparseable dates (Date.parse → NaN,
616
+ // which would otherwise propagate through perDay). Falls back to a 1-day
617
+ // window so a bad range yields the raw count as the rate, never NaN.
618
+ const spanDays = (Date.parse(to) - Date.parse(from)) / 86400000;
619
+ const days = Number.isFinite(spanDays) ? Math.max(spanDays, 1) : 1;
620
+ // Band on the UNROUNDED rate; round only for display. Rounding first would
621
+ // mislabel exact weekly/monthly boundaries (e.g. 1 deploy / 30 days →
622
+ // 0.0333 rounds to 0.03 < 1/30 → wrongly "low" instead of "medium").
623
+ const rawPerDay = deployments / days;
624
+ const perDay = Number(rawPerDay.toFixed(2));
625
+ const failed = Number(r.cfr_failed) || 0;
626
+ const total = Number(r.cfr_total) || 0;
627
+ const rawPct = total > 0 ? (failed / total) * 100 : 0;
628
+ const pct = Number(rawPct.toFixed(1));
629
+ const failures = Number(r.mttr_failures) || 0;
630
+ const restored = Number(r.mttr_restored) || 0;
631
+ const avgSeconds = failures > 0 && r.mttr_avg_seconds != null
632
+ ? Number(Number(r.mttr_avg_seconds).toFixed(1))
633
+ : null;
634
+ const ltDeployments = Number(r.lt_deployments) || 0;
635
+ const medianSeconds = r.lt_median_ms != null
636
+ ? Number((Number(r.lt_median_ms) / 1000).toFixed(1))
637
+ : null;
638
+ return {
639
+ window: { from, to },
640
+ basis,
641
+ filters: { pipelineId: filters.pipelineId ?? null, environment: filters.environment ?? null },
642
+ deploymentFrequency: { deployments, perDay, level: doraLevelForFrequency(rawPerDay, deployments) },
643
+ changeFailureRate: { failed, total, pct, level: doraLevelForChangeFailure(rawPct, total) },
644
+ meanTimeToRestore: { failures, restored, avgSeconds, level: doraLevelForRestore(avgSeconds) },
645
+ leadTime: { deployments: ltDeployments, medianSeconds, approx: true, level: doraLevelForLeadTime(medianSeconds) },
646
+ };
647
+ }
648
+ /**
649
+ * 1.9b DORA trend — deployment frequency + change-failure rate bucketed by
650
+ * `interval` (day/week/month) for a sparkline. Per-execution rollup (one row
651
+ * per execution, FAILED wins) bucketed on the execution's started_at. Shares
652
+ * the `getDoraMetrics` scoping (org/rollup, pipelineId, deploy-scoping); MTTR
653
+ * and lead time are intentionally omitted (too heavy to bucket meaningfully).
654
+ */
655
+ async getDoraTrend(orgId, interval, from, to, orgIds, opts = {}) {
656
+ const { pred, multi } = this.orgScope(orgId, orgIds);
657
+ const { pipelineId, environment, deploysOnly } = opts;
658
+ const { pipelineClause, deployClause } = doraScopeClauses(opts);
659
+ // Same execs roll-up as getDoraMetrics (shared builder — status set +
660
+ // predicate can't drift); the trend needs only started_at over the core
661
+ // window (no MTTR look-ahead, no ended_at/duration columns).
662
+ const execs = execsCte({
663
+ pred,
664
+ pipelineClause,
665
+ deployClause,
666
+ from,
667
+ columns: sql `
668
+ ${DORA_TERMINAL_STATUS_CASE} AS status,
669
+ MIN(e.started_at) AS started_at`,
670
+ toBound: sql `${to}::timestamptz`,
671
+ });
672
+ const exec = () => withTenantTx((tx) => tx.execute(sql `
673
+ WITH execs AS (${execs}
674
+ )
675
+ SELECT
676
+ DATE_TRUNC(${interval}, started_at)::text AS period,
677
+ COUNT(*) FILTER (WHERE status = 'SUCCEEDED')::int AS deployments,
678
+ COUNT(*) FILTER (WHERE status = 'FAILED')::int AS failed,
679
+ COUNT(*) FILTER (WHERE status IN ('SUCCEEDED', 'FAILED'))::int AS total,
680
+ -- quoted alias so the raw row key is exactly the DoraTrendPoint field
681
+ COALESCE(ROUND(COUNT(*) FILTER (WHERE status = 'FAILED')::numeric
682
+ / NULLIF(COUNT(*) FILTER (WHERE status IN ('SUCCEEDED', 'FAILED')), 0) * 100, 1), 0)::float AS "changeFailurePct"
683
+ FROM execs
684
+ GROUP BY period ORDER BY period
685
+ `).then(r => drizzleRows(r.rows)));
686
+ const key = `${orgId}:dora-trend:${interval}:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${deploysOnly ? 'd' : ''}`;
687
+ return this.runReport(key, multi, exec);
688
+ }
344
689
  // ── Category 2: Plugin Inventory & Builds ──
345
690
  /** 2.1 Plugin summary — counts and breakdowns. */
346
691
  async getPluginSummary(orgId) {
@@ -447,4 +792,4 @@ export class ReportingService {
447
792
  }
448
793
  }
449
794
  export const reportingService = new ReportingService();
450
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoSixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hILE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQWtKekgsMkRBQTJEO0FBRTNEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLDBFQUEwRTtJQUMxRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQWE7UUFDL0IsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO1lBQzlDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO1NBQ2hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBcUI7UUFDdEMsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSwyRUFBMkU7UUFDM0Usc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsNERBQTREO1FBQzVELHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsZ0RBQWdEO1FBQ2hELE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNuRyxxREFBcUQ7WUFDckQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sWUFBWSxHQUFHLE1BQU0sRUFBRTtpQkFDMUIsTUFBTSxDQUFDO2dCQUNOLFVBQVUsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtnQkFDOUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLO2FBQ3JDLENBQUM7aUJBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFakUsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEUsbUVBQW1FO1lBQ25FLE1BQU0sSUFBSSxHQUFvRCxFQUFFLENBQUM7WUFDakUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0saUJBQWlCLEdBQWEsRUFBRSxDQUFDO1lBRXZDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsWUFBWSxFQUFFLENBQUM7b0JBQ2YsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDekMsU0FBUztnQkFDWCxDQUFDO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1Isc0VBQXNFO29CQUN0RSx1RUFBdUU7b0JBQ3ZFLGtEQUFrRDtvQkFDbEQsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO29CQUMvQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7b0JBQ3JCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDOUIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDOUIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMxQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7b0JBQzVCLHNFQUFzRTtvQkFDdEUsZ0VBQWdFO29CQUNoRSxtRUFBbUU7b0JBQ25FLHVFQUF1RTtvQkFDdkUsc0VBQXNFO29CQUN0RSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTO3dCQUM1QyxDQUFDLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQzt3QkFDbkQsQ0FBQyxDQUFDLFNBQVM7b0JBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDbEUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDeEUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO29CQUM1QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTO3dCQUNoQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzt3QkFDbkMsQ0FBQyxDQUFDLFNBQVM7aUJBQ2QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELHlFQUF5RTtZQUN6RSw2REFBNkQ7WUFDN0QsMkVBQTJFO1lBQzNFLDJFQUEyRTtZQUMzRSxpREFBaUQ7WUFDakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO3FCQUNqRCxtQkFBbUIsRUFBRTtxQkFDckIsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFUCxPQUFPO2dCQUNMLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDN0IsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLHVCQUF1QixFQUFFLGlCQUFpQjtnQkFDMUMsWUFBWSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDM0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLDhEQUE4RDtRQUM5RCx5RUFBeUU7UUFDekUscUVBQXFFO1FBQ3JFLElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELEVBQUU7Z0JBQ3hFLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUNyQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDNUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxzREFBc0Q7UUFDdEQsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVELHFEQUFxRDtJQUVyRDs7Ozs7OztPQU9HO0lBQ0ssUUFBUSxDQUFDLEtBQWEsRUFBRSxNQUFpQjtRQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxLQUFLO1lBQ2hCLENBQUMsQ0FBQyxHQUFHLENBQUEsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFBLElBQUksQ0FBQyxHQUFHO1lBQzdELENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxTQUFTLENBQUksUUFBZ0IsRUFBRSxLQUFjLEVBQUUsSUFBc0I7UUFDM0UsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQztZQUNwRCxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLE1BQWlCO1FBQ3RELE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7Ozs7Ozs7O2VBUzNDLE1BQU0sQ0FBQyxRQUFRO2VBQ2YsTUFBTSxDQUFDLGFBQWE7O3lCQUVWLElBQUk7OztPQUd0QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixLQUFhLEVBQ2IsVUFBa0IsRUFDbEIsTUFBaUIsRUFDakIsS0FBc0MsRUFDdEMsUUFBZ0IsRUFBRTtRQUVsQixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7WUFDMUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsS0FBSyxDQUFDLElBQUkscUNBQXFDLEtBQUssQ0FBQyxFQUFFLGVBQWU7WUFDbEcsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7OztlQWMzQyxNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJLHdCQUF3QixVQUFVO1lBQ25ELFdBQVc7OztnQkFHUCxLQUFLO09BQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLHdCQUF3QixVQUFVLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BJLENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLE1BQWlCO1FBQy9GLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7dUJBRW5DLFFBQVE7Ozs7OztlQU1oQixNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJOztnQ0FFRyxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLE1BQWlCO1FBQ2pGLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7Ozs7Ozs7ZUFRM0MsTUFBTSxDQUFDLGFBQWE7ZUFDcEIsTUFBTSxDQUFDLFFBQVE7eUJBQ0wsSUFBSTtnQ0FDRyxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsTUFBaUI7UUFDL0UsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7O2VBTzNDLE1BQU0sQ0FBQyxhQUFhO2VBQ3BCLE1BQU0sQ0FBQyxRQUFRO3lCQUNMLElBQUk7Z0NBQ0csSUFBSSxxQ0FBcUMsRUFBRTs7T0FFcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssbUJBQW1CLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsTUFBaUI7UUFDbEYsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7OztlQUszQyxNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJO2dDQUNHLElBQUkscUNBQXFDLEVBQUU7O09BRXBFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxzQkFBc0IsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsOERBQThEO0lBQzlELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFFLEVBQVUsRUFBRSxNQUFpQjtRQUNoRixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7Ozs7ZUFPM0MsTUFBTSxDQUFDLGFBQWE7ZUFDcEIsTUFBTSxDQUFDLFFBQVE7eUJBQ0wsSUFBSTtnQ0FDRyxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssb0JBQW9CLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLFFBQWdCLEVBQUU7UUFDekUsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxXQUFXLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQzdFLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7OztlQU0xQixNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTsyQkFDSCxLQUFLO2dDQUNBLElBQUkscUNBQXFDLEVBQUU7O2dCQUUzRCxLQUFLO09BQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVELDhDQUE4QztJQUU5QyxrREFBa0Q7SUFDbEQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDbEMsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRSxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7OzttQ0FHekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRO3VDQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVE7bUNBQzFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYzttQ0FDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjOzJCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUk7ZUFDOUIsTUFBTSxDQUFDLE1BQU07Z0JBQ1osTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sS0FBSztPQUN2QyxDQUFDLENBQUMsQ0FBQztZQUNKLE9BQU8sQ0FBQyxXQUFXLENBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuSSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQWE7UUFDdkMsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FDbEUsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7WUFFN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVO1lBQ3hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVzs7ZUFFdEIsTUFBTSxDQUFDLE1BQU07Z0JBQ1osTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sS0FBSyxRQUFRLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUTttQkFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXOztPQUVsRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVELDBDQUEwQztJQUMxQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYTtRQUNuQyxPQUFPLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUM5RCxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOztZQUU3QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUk7O2dCQUVkLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTztvQkFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTO2VBQzVCLE1BQU0sQ0FBQyxNQUFNO2dCQUNaLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxNQUFNLEtBQUssUUFBUSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVE7bUJBQ3pELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSTs7T0FFOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBYSxFQUFFLFFBQWdCLEVBQUUsSUFBWSxFQUFFLEVBQVU7UUFDakYsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxrQkFBa0IsUUFBUSxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FDdkYsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7dUJBRWxCLFFBQVE7Ozs7O2VBS2hCLE1BQU0sQ0FBQyxhQUFhOzJCQUNSLEtBQUs7O2dDQUVBLElBQUkscUNBQXFDLEVBQUU7O09BRXBFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQXVCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ3pELENBQUM7SUFDSixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFFLEVBQVU7UUFDNUQsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUM1RSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7ZUFNMUIsTUFBTSxDQUFDLGFBQWE7MkJBQ1IsS0FBSztnQ0FDQSxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsUUFBZ0IsRUFBRTtRQUNoRixPQUFPLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLG1CQUFtQixJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUNyRixZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7ZUFNMUIsTUFBTSxDQUFDLGFBQWE7MkJBQ1IsS0FBSztnQ0FDQSxJQUFJLHFDQUFxQyxFQUFFOzs7Z0JBRzNELEtBQUs7T0FDZCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlQ2FjaGVTZXJ2aWNlLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgc2NydWJBd3NJZGVudGlmaWVycywgc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBpbkFycmF5LCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGZvciByZXBvcnRpbmcgYWdncmVnYXRpb25zLiBUd28gdGllcnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVEwg4oCUIGNoYW5nZXMgb24gcGx1Z2luIENSVURcbiAqIC0gRXhlY3V0aW9uL2J1aWxkIHF1ZXJpZXMgd2l0aCBkYXRlIHJhbmdlczogMiBtaW4gVFRMIOKAlCBuZXcgZXZlbnRzIGFycml2ZSBjb250aW51b3VzbHlcbiAqL1xuY29uc3QgaW52ZW50b3J5Q2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDppbnY6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlkgfHwgJzMwMCcsIDEwKSk7XG5jb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX1RJTUVTRVJJRVMgfHwgJzEyMCcsIDEwKSk7XG5cbi8vIOKUgOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRHVyYXRpb25TdGF0cyB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBhdmdNczogbnVtYmVyO1xuICBtaW5NczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBwOTVNczogbnVtYmVyO1xuICBleGVjdXRpb25zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFN0YWdlRmFpbHVyZSB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTdGFnZUJvdHRsZW5lY2sge1xuICBpZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXJyb3JFbnRyeSB7XG4gIGVycm9yUGF0dGVybjogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBhZmZlY3RlZFBpcGVsaW5lczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU3VtbWFyeSB7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGFjdGl2ZTogbnVtYmVyO1xuICBpbmFjdGl2ZTogbnVtYmVyO1xuICBwdWJsaWM6IG51bWJlcjtcbiAgcHJpdmF0ZTogbnVtYmVyO1xuICB1bmlxdWVOYW1lczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24ge1xuICBwbHVnaW5UeXBlOiBzdHJpbmc7XG4gIGNvbXB1dGVUeXBlOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBCdWlsZFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRHVyYXRpb24ge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIGJ1aWxkczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqIEV2ZW50IHBheWxvYWQgYWNjZXB0ZWQgYnkgYFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzYC4gTWlycm9ycyB0aGUgcm91dGUncyBab2Qgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEV2ZW50IHtcbiAgLyoqIFN0YWJsZSBwaXBlbGluZSBpZCB0aGUgZXZlbnRzIExhbWJkYSByZWFkIGZyb20gdGhlIGBQSVBFTElORV9FVkVOVF9JRGBcbiAgICogIHRhZyAoPSB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCkuIFRoZSByZWdpc3RyeSBqb2luIGtleS4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuICBldmVudFR5cGU6ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uIChBY3Rpb24gZXZlbnRzKS4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAgICogd2l0aCBzYW1wbGUgaWRzIHNvIGFuIG9wZXJhdG9yIGNhbiBzZWUgd2hlbiBFdmVudEJyaWRnZSBpcyBkZWxpdmVyaW5nXG4gICAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gICAqXG4gICAqIFJldHVybnMgY291bnRzICsgYSBzYW1wbGUgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICAvLyBSdW4gaW5zZXJ0IGluc2lkZSB0aGUgdHgsIGJ1dCBDT0xMRUNUIGFmZmVjdGVkIG9yZ3MgYW5kIGludmFsaWRhdGVcbiAgICAvLyBjYWNoZXMgQUZURVIgdGhlIHR4IHJlc29sdmVzLiBLZWVwaW5nIGludmFsaWRhdGlvbiBpbnNpZGUgdGhlIHR4IGhlbGRcbiAgICAvLyB0aGUgcGcgbG9ja3Mgb3BlbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZSByb3VuZC10cmlwcyAoUmVkaXMgb3JcbiAgICAvLyBpbi1tZW1vcnkgaW52YWxpZGF0aW9ucyBhcmUgdW5yZWxhdGVkIHRvIHRoZSB0eCBidXQgc3RpbGwgc2VyaWFsaXplZFxuICAgIC8vIGl0cyBjb21taXQpLiBDYWNoZSBUVEwgaXMgMi01IG1pbiBzbyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaXNcbiAgICAvLyBhbiBhY2NlcHRhYmxlIHRyYWRlIGZvciB0aWdodGVyIGxvY2sgd2luZG93cy5cbiAgICBjb25zdCB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcywgYWZmZWN0ZWRPcmdzIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgc2tpcHBlZExvY2FsKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgLy8gcmVnaXN0cnkucGlwZWxpbmVJZCA9PT0gZXZlbnQucGlwZWxpbmVJZDsgdXNlIHRoZSByZWdpc3RyeSdzIHNvIHRoZVxuICAgICAgICAgIC8vIEZLIGlzIGFsd2F5cyBhIHJvdyB0aGF0IGV4aXN0cywgYW5kIHB1bGwgb3JnSWQgZnJvbSB0aGUgcmVnaXN0cnkgZm9yXG4gICAgICAgICAgLy8gdGVuYW5jeSAobmV2ZXIgdHJ1c3QgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnKS5cbiAgICAgICAgICBwaXBlbGluZUlkOiByZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiByZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBldmVudFNvdXJjZTogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICAgICAgZXhlY3V0aW9uSWQ6IGV2ZW50LmV4ZWN1dGlvbklkLFxuICAgICAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgICAgIGFjdGlvbk5hbWU6IGV2ZW50LmFjdGlvbk5hbWUsXG4gICAgICAgICAgLy8gSEFSRCBDT05TVFJBSU5UOiBhbiBBV1MgYWNjb3VudCBpZCBtdXN0IE5FVkVSIGJlIHBlcnNpc3RlZC4gVGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGFuZCBtdXN0IG5vdCB0cnVzdCB1cHN0cmVhbTpcbiAgICAgICAgICAvLyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGZhaWx1cmUgZGV0YWlsICYgbWVzc2FnZXMgcm91dGluZWx5IGNhcnJ5XG4gICAgICAgICAgLy8gQVJOcyAoYXJuOmF3czrigKY6PGFjY291bnQtaWQ+OuKApikgYW5kIGJhcmUgMTItZGlnaXQgYWNjb3VudCBpZHMuIFNjcnViXG4gICAgICAgICAgLy8gYm90aCBmcmVlLWZvcm0gZmllbGRzIGhlcmUgYmVmb3JlIGluc2VydCAocGVyLWV2ZW50LCBub24tbXV0YXRpbmcpLlxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXZlbnQuZXJyb3JNZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBldmVudC5zdGFydGVkQXQgPyBuZXcgRGF0ZShldmVudC5zdGFydGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBldmVudC5jb21wbGV0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LmNvbXBsZXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVycyhldmVudC5kZXRhaWwpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAgIC8vIHR3aWNlLiBgb25Db25mbGljdERvTm90aGluZ2AgKyB0aGUgcGFydGlhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIChwaXBlbGluZV9pZCwgZXhlY3V0aW9uX2lkLCBldmVudF90eXBlLCBzdGF0dXMsIHN0YWdlX25hbWUsIGFjdGlvbl9uYW1lKVxuICAgICAgLy8gbWFrZXMgcmUtZGVsaXZlcnkgaWRlbXBvdGVudC4gYHJldHVybmluZ2AgZ2l2ZXMgdGhlIFJFQUwgaW5zZXJ0ZWQgc2V0IHNvXG4gICAgICAvLyBjb3VudHMgKyBjYWNoZSBpbnZhbGlkYXRpb24gaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgICBjb25zdCBpbnNlcnRlZFJvd3MgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lRXZlbnQpLnZhbHVlcyhyb3dzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc2VydGVkOiBpbnNlcnRlZFJvd3MubGVuZ3RoLFxuICAgICAgICBza2lwcGVkOiBza2lwcGVkTG9jYWwsXG4gICAgICAgIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiB1bnJlZ2lzdGVyZWRMb2NhbCxcbiAgICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChpbnNlcnRlZFJvd3MubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTdXJmYWNlIHRoZSBzaWxlbnQgc2tpcDogYW4gdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkIHVzdWFsbHkgbWVhbnMgdGhlXG4gICAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgICAvLyBQSVBFTElORV9FVkVOVF9JRCB0YWcgaXMgbWlzc2luZy91bnJlYWRhYmxlIGJ5IHRoZSBMYW1iZGEpLiBMb2dnaW5nIGl0XG4gICAgLy8gbWFrZXMgYSBicm9rZW4gam9pbiB2aXNpYmxlIGluc3RlYWQgb2YgbG9va2luZyBsaWtlIFwibm8gYWN0aXZpdHlcIi5cbiAgICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV2ZW50cyBza2lwcGVkOiBwaXBlbGluZSBpZCBub3QgZm91bmQgaW4gcmVnaXN0cnknLCB7XG4gICAgICAgIGNvdW50OiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGgsXG4gICAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIG9yZy1zY29wZSBwcmVkaWNhdGUgZm9yIGEgcmVwb3J0IHF1ZXJ5LiBXaXRoIGBvcmdJZHNgICh0aGVcbiAgICogb3JnIOKGkiB0ZWFtIHJvbGx1cCDigJQgYSBwYXJlbnQncyBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWApIGl0IGJlY29tZXMgYW5cbiAgICogYElOICguLi4pYCBvdmVyIHRoZSBzdWJ0cmVlOyBvdGhlcndpc2UgdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2AuIFJldHVybnMgYVxuICAgKiBgbXVsdGlgIGZsYWcgc28gY2FsbGVycyBjYW4gcnVuIG11bHRpLW9yZyByZWFkcyB1bmRlciBzeXNhZG1pbiBjb250ZXh0XG4gICAqICh0aGUgc3VidHJlZSBzcGFucyBvcmdzIG91dHNpZGUgdGhlIHJlcXVlc3QncyBSTFMgc2NvcGUpIGFuZCBzYWx0IHRoZVxuICAgKiBjYWNoZSBrZXkuXG4gICAqL1xuICBwcml2YXRlIG9yZ1Njb3BlKG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaWRzID0gb3JnSWRzICYmIG9yZ0lkcy5sZW5ndGggPiAwID8gb3JnSWRzIDogW29yZ0lkXTtcbiAgICBjb25zdCBtdWx0aSA9IGlkcy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHByZWQgPSBtdWx0aVxuICAgICAgPyBzcWxgSU4gKCR7c3FsLmpvaW4oaWRzLm1hcCgoaWQpID0+IHNxbGAke2lkfWApLCBzcWxgLCBgKX0pYFxuICAgICAgOiBzcWxgPSAke2lkc1swXX1gO1xuICAgIHJldHVybiB7IHByZWQsIG11bHRpIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcmVwb3J0IHJlYWQuIFNpbmdsZS1vcmcgcmVhZHMgdXNlIHRoZSBwZXItb3JnIGNhY2hlIChpbnZhbGlkYXRlZCBvblxuICAgKiB0aGF0IG9yZydzIGV2ZW50IGluZ2VzdCkuIFJvbGx1cCAobXVsdGktb3JnKSByZWFkcyAqKmJ5cGFzcyB0aGUgY2FjaGUqKiBhbmRcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQ6IHRoZXkncmUgYWRtaW4tb25seSBhbmQgbG93ZXItZnJlcXVlbmN5LCBhbmQgYVxuICAgKiBjaGlsZCBvcmcncyBldmVudCBpbmdlc3QgY2FuJ3QgaW52YWxpZGF0ZSBhIHBhcmVudCdzIHJvbGx1cCBlbnRyeSAocmVwb3J0aW5nXG4gICAqIGhhcyBubyBvcmcgdHJlZSksIHNvIGNhY2hpbmcgdGhlbSB3b3VsZCBzZXJ2ZSBzdGFsZSBhZ2dyZWdhdGVzLiBBbHdheXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJ1blJlcG9ydDxUPihjYWNoZUtleTogc3RyaW5nLCBtdWx0aTogYm9vbGVhbiwgZXhlYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBtdWx0aVxuICAgICAgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBleGVjKVxuICAgICAgOiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoY2FjaGVLZXksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMSBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEV4ZWN1dGlvbkNvdW50PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpleGVjLWNvdW50YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuMWIgUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gcmFuZ2U/LmZyb20gJiYgcmFuZ2U/LnRvXG4gICAgICA/IHNxbGBBTkQgZS5zdGFydGVkX2F0ID49ICR7cmFuZ2UuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHtyYW5nZS50b306OnRpbWVzdGFtcHR6YFxuICAgICAgOiBzcWxgYDtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UGlwZWxpbmVFeGVjdXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4yIFN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUgZm9yIGFuIG9yZy4gKi9cbiAgYXN5bmMgZ2V0U3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06ZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFcnJvckVudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAyOiBQbHVnaW4gSW52ZW50b3J5ICYgQnVpbGRzIOKUgOKUgFxuXG4gIC8qKiAyLjEgUGx1Z2luIHN1bW1hcnkg4oCUIGNvdW50cyBhbmQgYnJlYWtkb3ducy4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uYWNjZXNzTW9kaWZpZXJ9ID0gJ3B1YmxpYycpOjppbnQgQVMgcHVibGljLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwcml2YXRlJyk6OmludCBBUyBwcml2YXRlLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUICR7c2NoZW1hLnBsdWdpbi5uYW1lfSk6OmludCBBUyB1bmlxdWVfbmFtZXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgYCkpO1xuICAgICAgcmV0dXJuIChkcml6emxlUm93czxQbHVnaW5TdW1tYXJ5Pihyb3dzLnJvd3MpWzBdIHx8IHsgdG90YWw6IDAsIGFjdGl2ZTogMCwgaW5hY3RpdmU6IDAsIHB1YmxpYzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogMi4yIFR5cGUgJiBjb21wdXRlIGRpc3RyaWJ1dGlvbi4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuMyBWZXJzaW9uIGNvdW50cyBwZXIgcGx1Z2luIG5hbWUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgTUFYKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufSkgQVMgbGF0ZXN0X3ZlcnNpb24sXG4gICAgICAgICAgYm9vbF9vcigke3NjaGVtYS5wbHVnaW4uaXNEZWZhdWx0fSkgQVMgaGFzX2RlZmF1bHRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLm5hbWV9XG4gICAgICAgIE9SREVSIEJZIHZlcnNpb25fY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFZlcnNpb25Db3VudD4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogMi40IEJ1aWxkIHN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUuXG4gICAqXG4gICAqIFNUQVRVUyBDQVNJTkcgTk9URTogVGhpcyBxdWVyeSBmaWx0ZXJzIGJ5IGBldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJ2BcbiAgICogYW5kIHVzZXMgbG93ZXJjYXNlIHN0YXR1cyB2YWx1ZXMgKGAnY29tcGxldGVkJ2AsIGAnZmFpbGVkJ2ApLCB3aGlsZVxuICAgKiBgZ2V0U3VjY2Vzc1JhdGVgICgxLjIpIGZpbHRlcnMgYnkgYGV2ZW50X3R5cGUgPSAnUElQRUxJTkUnYCB3aXRoXG4gICAqIHVwcGVyY2FzZSBBV1Mtc3R5bGUgc3RhdHVzZXMgKGAnU1VDQ0VFREVEJ2AsIGAnRkFJTEVEJ2AsIGAnQ0FOQ0VMRUQnYCkuXG4gICAqIFRoZSBjYXNpbmcgZHJpZnQgaXMgaW50ZW50aW9uYWwgYW5kIHRyYWNrcyB0aGUgcHJvZHVjZXI6XG4gICAqICAgLSBgcGx1Z2luLWJ1aWxkYCBldmVudHMgY29tZSBmcm9tIG91ciBvd24gYnVpbGQgcGlwZWxpbmUgKGxvd2VyY2FzZSlcbiAgICogICAtIGBQSVBFTElORWAgZXZlbnRzIGNvbWUgZnJvbSBBV1MgQ29kZVBpcGVsaW5lICh1cHBlcmNhc2UpXG4gICAqIFRoZSBpbmdlc3QgWm9kIHNjaGVtYSBhdCBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzXG4gICAqIFNIT1VMRCBlbnVtIHRoZXNlIHBlci1ldmVudFNvdXJjZSBzbyB3ZSBjYXRjaCBkcmlmdCBhdCBpbmdlc3QgcmF0aGVyXG4gICAqIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIHplcm8gcm93cyBoZXJlLiBTZWUgZmluZGluZ3MgTjcxLlxuICAgKi9cbiAgYXN5bmMgZ2V0QnVpbGRTdWNjZXNzUmF0ZShvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPEJ1aWxkVGltZVNlcmllc0VudHJ5W10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpidWlsZC1zdWNjZXNzOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdmYWlsZWQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJ1xuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ2NvbXBsZXRlZCcsICdmYWlsZWQnKVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkVGltZVNlcmllc0VudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjUgQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gKi9cbiAgYXN5bmMgZ2V0QnVpbGREdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPEJ1aWxkRHVyYXRpb25bXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmJ1aWxkLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBidWlsZHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGREdXJhdGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi42IEJ1aWxkIGZhaWx1cmVzIOKAlCB0b3AgZXJyb3IgbWVzc2FnZXMuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjApOiBQcm9taXNlPEJ1aWxkRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YnVpbGQtZmFpbHVyZXM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgZS5lcnJvcl9tZXNzYWdlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSwgZS5lcnJvcl9tZXNzYWdlXG4gICAgICAgIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZEZhaWx1cmU+KHIucm93cykpKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXBvcnRpbmdTZXJ2aWNlID0gbmV3IFJlcG9ydGluZ1NlcnZpY2UoKTtcbiJdfQ==
795
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoSixPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hILE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQXdIekgsK0VBQStFO0FBQy9FOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFtQnpDLDZFQUE2RTtBQUM3RSw0REFBNEQ7QUFDNUQsd0ZBQXdGO0FBQ3hGLFNBQVMscUJBQXFCLENBQUMsTUFBYyxFQUFFLFdBQW1CO0lBQ2hFLElBQUksV0FBVyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNsQyxJQUFJLE1BQU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDaEMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNuQyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3RDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUNELHlFQUF5RTtBQUN6RSxTQUFTLHlCQUF5QixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQzNELElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDN0IsSUFBSSxHQUFHLElBQUksRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdCLElBQUksR0FBRyxJQUFJLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMvQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCwwRUFBMEU7QUFDMUUsU0FBUyxtQkFBbUIsQ0FBQyxVQUF5QjtJQUNwRCxJQUFJLFVBQVUsSUFBSSxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxVQUFVLEdBQUcsSUFBSTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3RDLElBQUksVUFBVSxHQUFHLEtBQUs7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN0QyxJQUFJLFVBQVUsR0FBRyxNQUFNO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDekMsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBQ0QseUVBQXlFO0FBQ3pFLFNBQVMsb0JBQW9CLENBQUMsYUFBNEI7SUFDeEQsSUFBSSxhQUFhLElBQUksSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDLElBQUksYUFBYSxHQUFHLEtBQUs7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUMxQyxJQUFJLGFBQWEsR0FBRyxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDMUMsSUFBSSxhQUFhLEdBQUcsT0FBTztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzdDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQTs7Ozs7Z0JBS3JCLENBQUM7QUFFakI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBaUI7SUFDekMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3RELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLHVCQUF1QixVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBLEVBQUUsQ0FBQztJQUNuRixNQUFNLFlBQVksR0FBRyxXQUFXO1FBQzlCLENBQUMsQ0FBQyxHQUFHLENBQUEsdUJBQXVCLFdBQVcsRUFBRTtRQUN6QyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUEsK0JBQStCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxFQUFFLENBQUM7SUFDN0QsTUFBTSxLQUFLLEdBQXFCLFdBQVcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxRQUFRLENBQUMsSUFPakI7SUFDQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDNUUsT0FBTyxHQUFHLENBQUE7OztZQUdBLE9BQU87ZUFDSixNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJOzs7Ozs7WUFNakIsY0FBYztZQUNkLFlBQVk7Z0NBQ1EsSUFBSTtnQ0FDSixPQUFPOytDQUNRLENBQUM7QUFDaEQsQ0FBQztBQXlJRCwyREFBMkQ7QUFFM0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFFM0IsMEVBQTBFO0lBQzFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUMvQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDaEIsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7WUFDOUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFxQjtRQUN0Qyx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSw0REFBNEQ7UUFDNUQscUVBQXFFO1FBQ3JFLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxnREFBZ0Q7UUFDaEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ25HLHFEQUFxRDtZQUNyRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxFQUFFO2lCQUMxQixNQUFNLENBQUM7Z0JBQ04sVUFBVSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO2dCQUM5QyxLQUFLLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUs7YUFDckMsQ0FBQztpQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2lCQUM3QixLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUVqRSxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoRSxtRUFBbUU7WUFDbkUsTUFBTSxJQUFJLEdBQW9ELEVBQUUsQ0FBQztZQUNqRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckIsTUFBTSxpQkFBaUIsR0FBYSxFQUFFLENBQUM7WUFFdkMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxZQUFZLEVBQUUsQ0FBQztvQkFDZixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN6QyxTQUFTO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDUixzRUFBc0U7b0JBQ3RFLHVFQUF1RTtvQkFDdkUsa0RBQWtEO29CQUNsRCxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7b0JBQy9CLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztvQkFDckIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDcEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtvQkFDNUIsc0VBQXNFO29CQUN0RSxnRUFBZ0U7b0JBQ2hFLG1FQUFtRTtvQkFDbkUsdUVBQXVFO29CQUN2RSxzRUFBc0U7b0JBQ3RFLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxLQUFLLFNBQVM7d0JBQzVDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO3dCQUNuRCxDQUFDLENBQUMsU0FBUztvQkFDYixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUNsRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUN4RSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7b0JBQzVCLHdFQUF3RTtvQkFDeEUsc0VBQXNFO29CQUN0RSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTO3dCQUN0QyxDQUFDLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQzt3QkFDaEQsQ0FBQyxDQUFDLFNBQVM7b0JBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUzt3QkFDdEMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7d0JBQ2hELENBQUMsQ0FBQyxTQUFTO29CQUNiLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxLQUFLLFNBQVM7d0JBQzFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO3dCQUNsRCxDQUFDLENBQUMsU0FBUztvQkFDYixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTO3dCQUNoQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzt3QkFDbkMsQ0FBQyxDQUFDLFNBQVM7aUJBQ2QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELHlFQUF5RTtZQUN6RSw2REFBNkQ7WUFDN0QsMkVBQTJFO1lBQzNFLDJFQUEyRTtZQUMzRSxpREFBaUQ7WUFDakQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNsQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO3FCQUNqRCxtQkFBbUIsRUFBRTtxQkFDckIsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFUCxPQUFPO2dCQUNMLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDN0IsT0FBTyxFQUFFLFlBQVk7Z0JBQ3JCLHVCQUF1QixFQUFFLGlCQUFpQjtnQkFDMUMsWUFBWSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDM0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLDhEQUE4RDtRQUM5RCx5RUFBeUU7UUFDekUscUVBQXFFO1FBQ3JFLElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNERBQTRELEVBQUU7Z0JBQ3hFLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUNyQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDNUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxzREFBc0Q7UUFDdEQsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0YsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVELHFEQUFxRDtJQUVyRDs7Ozs7OztPQU9HO0lBQ0ssUUFBUSxDQUFDLEtBQWEsRUFBRSxNQUFpQjtRQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksR0FBRyxLQUFLO1lBQ2hCLENBQUMsQ0FBQyxHQUFHLENBQUEsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFBLElBQUksQ0FBQyxHQUFHO1lBQzdELENBQUMsQ0FBQyxHQUFHLENBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxTQUFTLENBQUksUUFBZ0IsRUFBRSxLQUFjLEVBQUUsSUFBc0I7UUFDM0UsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQztZQUNwRCxDQUFDLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLE1BQWlCO1FBQ3RELE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7Ozs7Ozs7O2VBUzNDLE1BQU0sQ0FBQyxRQUFRO2VBQ2YsTUFBTSxDQUFDLGFBQWE7O3lCQUVWLElBQUk7OztPQUd0QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixLQUFhLEVBQ2IsVUFBa0IsRUFDbEIsTUFBaUIsRUFDakIsS0FBc0MsRUFDdEMsUUFBZ0IsRUFBRTtRQUVsQixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7WUFDMUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsS0FBSyxDQUFDLElBQUkscUNBQXFDLEtBQUssQ0FBQyxFQUFFLGVBQWU7WUFDbEcsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7OztlQWMzQyxNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJLHdCQUF3QixVQUFVO1lBQ25ELFdBQVc7OztnQkFHUCxLQUFLO09BQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLHdCQUF3QixVQUFVLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BJLENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLE1BQWlCO1FBQy9GLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7dUJBRW5DLFFBQVE7Ozs7OztlQU1oQixNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJOztnQ0FFRyxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLE1BQWlCO1FBQ2pGLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTs7Ozs7Ozs7ZUFRM0MsTUFBTSxDQUFDLGFBQWE7ZUFDcEIsTUFBTSxDQUFDLFFBQVE7eUJBQ0wsSUFBSTtnQ0FDRyxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsTUFBaUI7UUFDL0UsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7Ozs7O2VBTzNDLE1BQU0sQ0FBQyxhQUFhO2VBQ3BCLE1BQU0sQ0FBQyxRQUFRO3lCQUNMLElBQUk7Z0NBQ0csSUFBSSxxQ0FBcUMsRUFBRTs7T0FFcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssbUJBQW1CLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBYSxFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsTUFBaUI7UUFDbEYsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFBOzs7OztlQUszQyxNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTt5QkFDTCxJQUFJO2dDQUNHLElBQUkscUNBQXFDLEVBQUU7O09BRXBFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxzQkFBc0IsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsOERBQThEO0lBQzlELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFFLEVBQVUsRUFBRSxNQUFpQjtRQUNoRixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7Ozs7ZUFPM0MsTUFBTSxDQUFDLGFBQWE7ZUFDcEIsTUFBTSxDQUFDLFFBQVE7eUJBQ0wsSUFBSTtnQ0FDRyxJQUFJLHFDQUFxQyxFQUFFOztPQUVwRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssb0JBQW9CLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLFFBQWdCLEVBQUU7UUFDekUsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxXQUFXLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQzdFLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7OztlQU0xQixNQUFNLENBQUMsYUFBYTtlQUNwQixNQUFNLENBQUMsUUFBUTsyQkFDSCxLQUFLO2dDQUNBLElBQUkscUNBQXFDLEVBQUU7O2dCQUUzRCxLQUFLO09BQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBCRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2xCLEtBQWEsRUFDYixJQUFZLEVBQ1osRUFBVSxFQUNWLE1BQWlCLEVBQ2pCLE9BQW9CLEVBQUU7UUFFdEIsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDdEQsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RSwwRUFBMEU7UUFDMUUsdUVBQXVFO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUNyQixJQUFJO1lBQ0osY0FBYztZQUNkLFlBQVk7WUFDWixJQUFJO1lBQ0osT0FBTyxFQUFFLEdBQUcsQ0FBQTs7Y0FFSix5QkFBeUI7Ozs4Q0FHTztZQUN4QyxPQUFPLEVBQUUsR0FBRyxDQUFBLEdBQUcsRUFBRSxtQkFBbUIsc0JBQXNCLFlBQVk7U0FDdkUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQTt5QkFDakMsS0FBSzs7Ozs7b0RBS3NCLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E0RS9DLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0csTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxJQUFJLEVBQUUsSUFBSSxVQUFVLElBQUksRUFBRSxJQUFJLFdBQVcsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdHLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCw2RUFBNkU7SUFDckUsU0FBUyxDQUNmLEdBQXdCLEVBQ3hCLElBQVksRUFDWixFQUFVLEVBQ1YsS0FBMkIsRUFDM0IsT0FBc0Q7UUFFdEQsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSxNQUFNLENBQUMsR0FBWSxHQUFHLElBQUksRUFBRSxDQUFDO1FBRTdCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELHVFQUF1RTtRQUN2RSw0RUFBNEU7UUFDNUUsb0VBQW9FO1FBQ3BFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsMkVBQTJFO1FBQzNFLHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLElBQUksSUFBSTtZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLElBQUks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QUUsR0FBRyxFQUFFLENBQ3JGLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7OztlQU0xQixNQUFNLENBQUMsYUFBYTsyQkFDUixLQUFLO2dDQUNBLElBQUkscUNBQXFDLEVBQUU7OztnQkFHM0QsS0FBSztPQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVDYWNoZVNlcnZpY2UsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBzY3J1YkF3c0lkZW50aWZpZXJzLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGluQXJyYXksIHNxbCwgdHlwZSBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGZvciByZXBvcnRpbmcgYWdncmVnYXRpb25zLiBUd28gdGllcnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVEwg4oCUIGNoYW5nZXMgb24gcGx1Z2luIENSVURcbiAqIC0gRXhlY3V0aW9uL2J1aWxkIHF1ZXJpZXMgd2l0aCBkYXRlIHJhbmdlczogMiBtaW4gVFRMIOKAlCBuZXcgZXZlbnRzIGFycml2ZSBjb250aW51b3VzbHlcbiAqL1xuY29uc3QgaW52ZW50b3J5Q2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDppbnY6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlkgfHwgJzMwMCcsIDEwKSk7XG5jb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX1RJTUVTRVJJRVMgfHwgJzEyMCcsIDEwKSk7XG5cbi8vIOKUgOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRHVyYXRpb25TdGF0cyB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBhdmdNczogbnVtYmVyO1xuICBtaW5NczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBwOTVNczogbnVtYmVyO1xuICBleGVjdXRpb25zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFN0YWdlRmFpbHVyZSB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTdGFnZUJvdHRsZW5lY2sge1xuICBpZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXJyb3JFbnRyeSB7XG4gIGVycm9yUGF0dGVybjogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBhZmZlY3RlZFBpcGVsaW5lczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU3VtbWFyeSB7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGFjdGl2ZTogbnVtYmVyO1xuICBpbmFjdGl2ZTogbnVtYmVyO1xuICBwdWJsaWM6IG51bWJlcjtcbiAgcHJpdmF0ZTogbnVtYmVyO1xuICB1bmlxdWVOYW1lczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24ge1xuICBwbHVnaW5UeXBlOiBzdHJpbmc7XG4gIGNvbXB1dGVUeXBlOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBCdWlsZFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRHVyYXRpb24ge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIGJ1aWxkczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqIFJhdyBzaW5nbGUtcm93IHNoYXBlIHJldHVybmVkIGJ5IHRoZSBET1JBIGFnZ3JlZ2F0ZSBxdWVyeSAocHJlLXNoYXBpbmcpLiAqL1xuLyoqXG4gKiBIb3cgZmFyIHBhc3QgdGhlIHJlcG9ydCdzIGB0b2AgYm91bmQgdGhlIERPUkEgTVRUUiBxdWVyeSBtYXkgbG9vayBmb3IgYVxuICogZmFpbHVyZSdzIHJlY292ZXJpbmcgcnVuLiBCb3VuZHMgdGhlIHNjYW4gd2hpbGUgc3RvcHBpbmcgYSBmYWlsdXJlIG5lYXIgdGhlXG4gKiB3aW5kb3cgZWRnZSBmcm9tIGJlaW5nIHNwdXJpb3VzbHkgc2NvcmVkIFwibmV2ZXIgcmVzdG9yZWRcIi4gQSBmYWlsdXJlIHRoYXRcbiAqIGhhcyBub3QgcmVjb3ZlcmVkIHdpdGhpbiB0aGlzIHdpbmRvdyBzdGF5cyBjb3VudGVkIGFzIGFuIG9wZW4gaW5jaWRlbnQuXG4gKi9cbmNvbnN0IE1UVFJfUkVTVE9SRV9MT09LQUhFQUQgPSAnMzAgZGF5cyc7XG5cbi8qKlxuICogRE9SQSBwZXJmb3JtYW5jZSBiYW5kLiBgbnVsbGAgPSBpbnN1ZmZpY2llbnQgZGF0YSB0byBjbGFzc2lmeSAobm9cbiAqIGRlcGxveW1lbnRzL2ZhaWx1cmVzL2xlYWQtdGltZSBzYW1wbGUgaW4gdGhlIHdpbmRvdyksIHNvIHRoZSBVSSBzaG93cyBhXG4gKiBuZXV0cmFsIHN0YXRlIHJhdGhlciB0aGFuIG1pc2xhYmVsaW5nIGFuIGVtcHR5IHdpbmRvdyBhcyBcImxvd1wiLlxuICovXG5leHBvcnQgdHlwZSBEb3JhTGV2ZWwgPSAnZWxpdGUnIHwgJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8IG51bGw7XG5cbi8qKiBPcHRpb25hbCBzY29waW5nIGZvciB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXREb3JhTWV0cmljc30uICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFPcHRpb25zIHtcbiAgLyoqIFJlc3RyaWN0IHRvIGEgc2luZ2xlIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSkuICovXG4gIHBpcGVsaW5lSWQ/OiBzdHJpbmc7XG4gIC8qKiBDb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyBlbnZpcm9ubWVudCAoZGVwbG95LXNjb3BlZCkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKiogQ291bnQgb25seSBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIEFOWSBlbnZpcm9ubWVudCAocmVhbCBkZXBsb3ltZW50cykuICovXG4gIGRlcGxveXNPbmx5PzogYm9vbGVhbjtcbn1cblxuLy8gRE9SQSBwZXJmb3JtYW5jZSBiYW5kcyAodGhyZXNob2xkcyBmcm9tIHRoZSBET1JBL0FjY2VsZXJhdGUgcmVwb3J0cykuIEVhY2hcbi8vIGhlbHBlciByZXR1cm5zIGBudWxsYCB3aGVuIHRoZXJlJ3Mgbm8gc2FtcGxlIHRvIGNsYXNzaWZ5LlxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yRnJlcXVlbmN5KHBlckRheTogbnVtYmVyLCBkZXBsb3ltZW50czogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKGRlcGxveW1lbnRzIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGVyRGF5ID49IDEpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGVyRGF5ID49IDEgLyA3KSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGVyRGF5ID49IDEgLyAzMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogQ2hhbmdlIGZhaWx1cmUgcmF0ZSBieSBwZXJjZW50OiBlbGl0ZSDiiaQ1JSwgaGlnaCDiiaQxMCUsIG1lZGl1bSDiiaQxNSUuICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHBjdDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKHRvdGFsIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGN0IDw9IDUpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGN0IDw9IDEwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGN0IDw9IDE1KSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBUaW1lIHRvIHJlc3RvcmUgYnkgc2Vjb25kczogZWxpdGUgPDFoLCBoaWdoIDwxIGRheSwgbWVkaXVtIDwxIHdlZWsuICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JSZXN0b3JlKGF2Z1NlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAoYXZnU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKGF2Z1NlY29uZHMgPCAzNjAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIExlYWQgdGltZSBieSBzZWNvbmRzOiBlbGl0ZSA8MSBkYXksIGhpZ2ggPDEgd2VlaywgbWVkaXVtIDwxIG1vbnRoLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yTGVhZFRpbWUobWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChtZWRpYW5TZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgMjU5MjAwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG5cbi8qKlxuICogU2hhcmVkIHBlci1leGVjdXRpb24gdGVybWluYWwtc3RhdHVzIHJvbGwtdXAgZm9yIHRoZSBET1JBIGBleGVjc2AgQ1RFczpcbiAqIEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgZWxzZSBDQU5DRUxFRC9TVE9QUEVELiBLZXB0IGluIG9uZSBwbGFjZSBzb1xuICogZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBjYW4ndCBkcmlmdCBvbiB0aGUgcHJlY2VkZW5jZS5cbiAqL1xuY29uc3QgRE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRSA9IHNxbGBcbiAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ0ZBSUxFRCdcbiAgICAgICAgICAgICAgV0hFTiBib29sX29yKGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgICAgRUxTRSAnQ0FOQ0VMRUQnXG4gICAgICAgICAgICBFTkRgO1xuXG4vKipcbiAqIE9wdGlvbmFsIHBlci1waXBlbGluZSAvIGRlcGxveS1zY29waW5nIHByZWRpY2F0ZXMgKyB0aGUgcmVzdWx0aW5nIGBiYXNpc2AsXG4gKiBzaGFyZWQgYnkgZ2V0RG9yYU1ldHJpY3MgYW5kIGdldERvcmFUcmVuZCBzbyB0aGUgZW52L2RlcGxveXNPbmx5IHByZWNlZGVuY2VcbiAqIGNhbid0IGRpdmVyZ2UuIGBlbnZpcm9ubWVudGAgKG9uZSB0YXJnZXQpIHdpbnMgb3ZlciBgZGVwbG95c09ubHlgIChhbnkgZW52KS5cbiAqL1xuZnVuY3Rpb24gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzOiBEb3JhT3B0aW9ucykge1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50LCBkZXBsb3lzT25seSB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgZGVwbG95Q2xhdXNlID0gZW52aXJvbm1lbnRcbiAgICA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YFxuICAgIDogZGVwbG95c09ubHkgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgIDogc3FsYGA7XG4gIGNvbnN0IGJhc2lzOiAnZGVwbG95JyB8ICdydW4nID0gZW52aXJvbm1lbnQgfHwgZGVwbG95c09ubHkgPyAnZGVwbG95JyA6ICdydW4nO1xuICByZXR1cm4geyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBiYXNpcyB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBgZXhlY3NgIENURSBib2R5IOKAlCB0aGUgcGVyLWV4ZWN1dGlvbiB0ZXJtaW5hbCByb2xsLXVwIHRoYXQgQk9USCBET1JBXG4gKiBtZXRob2RzIHNjYW4uIE9ubHkgdGhlIFNFTEVDVGVkIGNvbHVtbnMgYW5kIHRoZSB1cHBlciByYW5nZSBib3VuZCBkaWZmZXJcbiAqIChnZXREb3JhTWV0cmljcyBuZWVkcyBwaXBlbGluZV9pZC9lbmRlZF9hdC9kdXJhdGlvbl9tcyBwbHVzIGEgbG9vay1haGVhZCB0YWlsXG4gKiBmb3IgTVRUUiByZWNvdmVyeTsgZ2V0RG9yYVRyZW5kIG5lZWRzIG9ubHkgc3RhcnRlZF9hdCBvdmVyIHRoZSBjb3JlIHdpbmRvdyksXG4gKiBzbyB0aG9zZSBhcmUgdGhlIHBhcmFtZXRlcnMuIFRoZSBgZXZlbnRfdHlwZT0nUElQRUxJTkUnYCBnYXRlLCB0aGVcbiAqIFNVQ0NFRURFRC9GQUlMRUQvQ0FOQ0VMRUQvU1RPUFBFRCBzdGF0dXMgc2V0LCB0aGUgYGV4ZWN1dGlvbl9pZGAgZmlsdGVyLCB0aGVcbiAqIG9yZyArIGRlcGxveS9waXBlbGluZSBzY29wZSBjbGF1c2VzLCBhbmQgdGhlIGBHUk9VUCBCWWAgYWxsIGxpdmUgaGVyZSBzbyB0aGVcbiAqIHR3byBjYWxsZXJzIGNhbid0IGRyaWZ0IG9uIHRoZSBzdGF0dXMgc2V0IG9yIHRoZSBwcmVkaWNhdGUuXG4gKlxuICogQHBhcmFtIGNvbHVtbnMgIHRyYWlsaW5nIFNFTEVDVCBjb2x1bW5zIChhZnRlciBgZS5leGVjdXRpb25faWQsYClcbiAqIEBwYXJhbSB0b0JvdW5kICB0aGUgYDw9YCB1cHBlci1ib3VuZCBleHByZXNzaW9uIG9uIGBlLnN0YXJ0ZWRfYXRgXG4gKiAgICAgICAgICAgICAgICAgKGNvcmUgd2luZG93IGZvciB0aGUgdHJlbmQ7IGNvcmUgKyBsb29rLWFoZWFkIGZvciBtZXRyaWNzKVxuICovXG5mdW5jdGlvbiBleGVjc0N0ZShhcmdzOiB7XG4gIHByZWQ6IFNRTDtcbiAgY29sdW1uczogU1FMO1xuICBwaXBlbGluZUNsYXVzZTogU1FMO1xuICBkZXBsb3lDbGF1c2U6IFNRTDtcbiAgZnJvbTogc3RyaW5nO1xuICB0b0JvdW5kOiBTUUw7XG59KTogU1FMIHtcbiAgY29uc3QgeyBwcmVkLCBjb2x1bW5zLCBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBmcm9tLCB0b0JvdW5kIH0gPSBhcmdzO1xuICByZXR1cm4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke2NvbHVtbnN9XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICAtLSBTVE9QUEVEIChtYW51YWxseSBhYm9ydGVkKSBqb2lucyBDQU5DRUxFRCBpbiB0aGUgRUxTRSBidWNrZXQ7IGJvdGhcbiAgICAgICAgICAtLSBhcmUgdGVybWluYWwgbm9uLWRlcGxveSBvdXRjb21lcy4gU1VQRVJTRURFRCBzdGF5cyBleGNsdWRlZCAoYVxuICAgICAgICAgIC0tIHJlcGxhY2VkIGV4ZWN1dGlvbiwgbm90IGFuIG91dGNvbWUpLlxuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCcpXG4gICAgICAgICAgQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX1cbiAgICAgICAgICAke2RlcGxveUNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvQm91bmR9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkLCBlLnBpcGVsaW5lX2lkYDtcbn1cblxuaW50ZXJmYWNlIERvcmFSb3cge1xuICBkZl9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNmcl9mYWlsZWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjZnJfdG90YWw/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBsdF9kZXBsb3ltZW50cz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGx0X21lZGlhbl9tcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfZmFpbHVyZXM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX3Jlc3RvcmVkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9hdmdfc2Vjb25kcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LCBvcmctc2NvcGVkIChzaW5nbGUtb3JnIG9yIHJvbGx1cCBzdWJ0cmVlKS5cbiAqXG4gKiBBIFwiZGVwbG95bWVudFwiIGlzIGEgVEVSTUlOQUwgcGlwZWxpbmUtbGV2ZWwgZXZlbnQsIHJvbGxlZCB1cCB0byBvbmUgcm93IHBlclxuICogYGV4ZWN1dGlvbl9pZGAgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRC9TVE9QUEVEIOKAlCBzYW1lXG4gKiBwcmVjZWRlbmNlIGFzIGBsaXN0UGlwZWxpbmVFeGVjdXRpb25zYCkuXG4gKlxuICogRElTQ0xPU1VSRSDigJQgdGhlc2UgYXJlIFJVTi1CQVNFRCBhcHByb3hpbWF0aW9ucyBvZiBET1JBLiBBIFwiZGVwbG95bWVudFwiIGhlcmVcbiAqIGlzIGFueSBzdWNjZXNzZnVsIHBpcGVsaW5lIFJVTiwgbm90IGEgdmVyaWZpZWQgcHJvZHVjdGlvbiBkZXBsb3ltZW50OiB0aGVcbiAqIGV2ZW50IHN0cmVhbSBjYXJyaWVzIG5vIGRlcGxveS1zdGFnZS9lbnZpcm9ubWVudCBtYXJrZXIsIHNvIGEgQ0ktb25seVxuICogYnVpbGQvdGVzdCBwaXBlbGluZSBjb3VudHMgdGhlIHNhbWUgYXMgb25lIHRoYXQgc2hpcHMgdG8gcHJvZC4gVGhhdCBtYWtlc1xuICogYGRlcGxveW1lbnRGcmVxdWVuY3lgIGEgcGlwZWxpbmUtdGhyb3VnaHB1dCBzaWduYWwgYW5kIGBjaGFuZ2VGYWlsdXJlUmF0ZWAgYVxuICogcGlwZWxpbmUtZmFpbHVyZSByYXRlIChidWlsZC90ZXN0IGZhaWx1cmVzIGNhdWdodCBpbiBDSSBjb3VudCB0b28pLCBhbmQgTVRUUlxuICogYSBwaXBlbGluZS1yZWNvdmVyeSB0aW1lLiBPbmx5IGBsZWFkVGltZWAgY2FycmllcyBhbiBleHBsaWNpdCBgYXBwcm94YCBmbGFnXG4gKiAoaXQgaXMgYWRkaXRpb25hbGx5IGEgcnVuLXRpbWUgcHJveHkpLCBidXQgQUxMIGZvdXIgc2hhcmUgdGhlIHJ1buKJoGRlcGxveVxuICogY2F2ZWF0IHVudGlsIGRlcGxveS9jb21taXQgbWV0YWRhdGEgaXMgY2FwdHVyZWQuIFNlZSBkb2NzL2RvcmEtbWV0cmljcy5tZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhTWV0cmljcyB7XG4gIC8qKiBUaGUgW2Zyb20sdG9dIHdpbmRvdyBlY2hvZWQgYmFjayAoc3RhcnRlZF9hdCByYW5nZSkuICovXG4gIHdpbmRvdzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG51bWJlcnMgY291bnQgcmVhbCBkZXBsb3ltZW50cyBvciBwaXBlbGluZSBydW5zOlxuICAgKiAtIGAnZGVwbG95J2Ag4oCUIHNjb3BlZCB0byBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGEgZGVwbG95IGBlbnZpcm9ubWVudGBcbiAgICogICAodmlhIGBlbnZpcm9ubWVudGAvYGRlcGxveXNPbmx5YCk7IGEgZ2VudWluZSBkZXBsb3ltZW50IHNpZ25hbC5cbiAgICogLSBgJ3J1bidgIOKAlCBkZWZhdWx0OiBldmVyeSBzdWNjZXNzZnVsIFBJUEVMSU5FIHJ1biBjb3VudHMgKG5vIGRlcGxveVxuICAgKiAgIG1hcmtlciBhcHBsaWVkKS4gREYvQ0ZSL01UVFIgdGhlbiByZWZsZWN0IHBpcGVsaW5lIGFjdGl2aXR5LCBub3QgZGVwbG95cy5cbiAgICovXG4gIGJhc2lzOiAnZGVwbG95JyB8ICdydW4nO1xuICAvKiogVGhlIHNjb3BpbmcgYXBwbGllZCAoZWNob2VkIGZvciB0aGUgVUkpOyBgbnVsbGAgd2hlbiB1bnNjb3BlZC4gKi9cbiAgZmlsdGVyczogeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBlbnZpcm9ubWVudDogc3RyaW5nIHwgbnVsbCB9O1xuICAvKiogRGVwbG95bWVudCBGcmVxdWVuY3kg4oCUIFNVQ0NFRURFRCB0ZXJtaW5hbCBkZXBsb3ltZW50cyBpbiB0aGUgd2luZG93LiAqL1xuICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7XG4gICAgLyoqIENvdW50IG9mIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ltZW50cyBwZXIgZGF5IG92ZXIgdGhlIHdpbmRvdy4gKi9cbiAgICBwZXJEYXk6IG51bWJlcjtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIENoYW5nZSBGYWlsdXJlIFJhdGUg4oCUIGZhaWxlZCAvIChzdWNjZWVkZWQgKyBmYWlsZWQpOyBDQU5DRUxFRCBleGNsdWRlZC4gKi9cbiAgY2hhbmdlRmFpbHVyZVJhdGU6IHtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICAvKiogc3VjY2VlZGVkICsgZmFpbGVkICh0aGUgQ0ZSIGRlbm9taW5hdG9yKS4gKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50YWdlLCAw4oCTMTAwLCAxIGRlY2ltYWwuICovXG4gICAgcGN0OiBudW1iZXI7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGRlcGxveW1lbnRzIHRvIGp1ZGdlLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBNZWFuIFRpbWUgVG8gUmVzdG9yZSDigJQgYXZnIGdhcCBmcm9tIGEgZmFpbHVyZSBJTkNJREVOVCB0byBpdHMgcmVjb3ZlcnkuXG4gICAqICBDb25zZWN1dGl2ZSBmYWlsZWQgcnVucyBvZiBhIHBpcGVsaW5lICh3aXRoIG5vIGdyZWVuIHJ1biBiZXR3ZWVuKSBjb2xsYXBzZVxuICAgKiAgaW50byBvbmUgaW5jaWRlbnQ7IHRoZSBnYXAgaXMgbWVhc3VyZWQgZnJvbSB0aGUgZmlyc3QgZmFpbHVyZSdzIEVORCB0byB0aGVcbiAgICogIHJlY292ZXJpbmcgcnVuJ3MgRU5ELiBUaGUgcmVjb3ZlcnkgaXMgdmlzaWJsZSB1cCB0byBhIGxvb2stYWhlYWQgcGFzdCBgdG9gXG4gICAqICBzbyBhIGZhaWx1cmUgbmVhciB0aGUgd2luZG93IGVkZ2UgaXNuJ3Qgc3B1cmlvdXNseSBjb3VudGVkIHVucmVzdG9yZWQuICovXG4gIG1lYW5UaW1lVG9SZXN0b3JlOiB7XG4gICAgLyoqIEZhaWx1cmUgaW5jaWRlbnRzIGluIHRoZSB3aW5kb3cgKG1heGltYWwgcnVucyBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcykuICovXG4gICAgZmFpbHVyZXM6IG51bWJlcjtcbiAgICAvKiogSW5jaWRlbnRzIHRoYXQgd2VyZSBmb2xsb3dlZCBieSBhIHN1Y2NlZWRlZCBydW4gKHJlY292ZXJlZCkuICovXG4gICAgcmVzdG9yZWQ6IG51bWJlcjtcbiAgICAvKiogQXZlcmFnZSByZXN0b3JlIGdhcCBpbiBzZWNvbmRzOyBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBpbmNpZGVudHMuICovXG4gICAgYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gaW5jaWRlbnRzLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBMZWFkIFRpbWUg4oCUIFBST1hZOiBtZWRpYW4gcGlwZWxpbmUgUlVOIFRJTUUgb2Ygc3VjY2VlZGVkIGRlcGxveW1lbnRzLlxuICAgKiAgTk9UIHRydWUgY29tbWl04oaScHJvZCBsZWFkIHRpbWUgKGV4ZWN1dGlvbnMgZG9uJ3QgY2FwdHVyZSBjb21taXQgdGltZSksXG4gICAqICBoZW5jZSBgYXBwcm94OiB0cnVlYCBzbyB0aGUgVUkvZG9jcyBjYW4gbGFiZWwgaXQuICovXG4gIGxlYWRUaW1lOiB7XG4gICAgLyoqIFN1Y2NlZWRlZCBkZXBsb3ltZW50cyB3aXRoIGEgZHVyYXRpb24gKHRoZSBtZWRpYW4gc2FtcGxlKS4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIC8qKiBNZWRpYW4gcnVuIHRpbWUgaW4gc2Vjb25kczsgbnVsbCB3aGVuIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbDtcbiAgICBhcHByb3g6IHRydWU7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIHN1Y2Nlc3NmdWwgZGVwbG95bWVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbn1cblxuLyoqIE9uZSBpbnRlcnZhbCBidWNrZXQgb2YgdGhlIERPUkEgdHJlbmQgKGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlIGZhaWx1cmUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhVHJlbmRQb2ludCB7XG4gIC8qKiBCdWNrZXQgc3RhcnQgKERBVEVfVFJVTkMgb2Ygc3RhcnRlZF9hdCksIElTTyB0ZXh0LiAqL1xuICBwZXJpb2Q6IHN0cmluZztcbiAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95bWVudHMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCBkZXBsb3ltZW50cyBpbiB0aGUgYnVja2V0LiAqL1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgLyoqIHN1Y2NlZWRlZCArIGZhaWxlZCBpbiB0aGUgYnVja2V0LiAqL1xuICB0b3RhbDogbnVtYmVyO1xuICAvKiogZmFpbGVkL3RvdGFsIGFzIGEgcGVyY2VudCAoMCB3aGVuIHRvdGFsIGlzIDApLiAqL1xuICBjaGFuZ2VGYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbi8qKiBFdmVudCBwYXlsb2FkIGFjY2VwdGVkIGJ5IGBSZXBvcnRpbmdTZXJ2aWNlLmluZ2VzdEV2ZW50c2AuIE1pcnJvcnMgdGhlIHJvdXRlJ3MgWm9kIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RFdmVudCB7XG4gIC8qKiBTdGFibGUgcGlwZWxpbmUgaWQgdGhlIGV2ZW50cyBMYW1iZGEgcmVhZCBmcm9tIHRoZSBgUElQRUxJTkVfRVZFTlRfSURgXG4gICAqICB0YWcgKD0gdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGUgcmVnaXN0cnkgam9pbiBrZXkuICovXG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcbiAgZXZlbnRUeXBlOiAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiAoQWN0aW9uIGV2ZW50cykuICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgb2YgdGhlIGNoYW5nZSBiZWluZyBzaGlwcGVkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSByZWYvYnJhbmNoIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIERlcGxveSB0YXJnZXQgKGUuZy4gXCJwcm9kdWN0aW9uXCIpLiBJdHMgcHJlc2VuY2UgbWFya3MgYSByZWFsIGRlcGxveW1lbnQuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENvdW50cyArIHRoZSAocG9zc2libHkgdHJ1bmNhdGVkKSBsaXN0IG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgdGhlIGNhbGxlciBjYW4gbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSZXN1bHQge1xuICBpbnNlcnRlZDogbnVtYmVyO1xuICBza2lwcGVkOiBudW1iZXI7XG4gIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSAIFNlcnZpY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmVhZC1vbmx5IHJlcG9ydGluZyBzZXJ2aWNlIGZvciBwaXBlbGluZSBleGVjdXRpb24gYW5kIHBsdWdpbiBpbnZlbnRvcnkgYWdncmVnYXRpb25zLlxuICogRG9lcyBub3QgZXh0ZW5kIENydWRTZXJ2aWNlIOKAlCByZXBvcnRzIGFyZSBhZ2dyZWdhdGUgcXVlcmllcywgbm90IGVudGl0eSBDUlVELlxuICpcbiAqIEFsbCBxdWVyaWVzIGFyZSBjYWNoZWQgaW4tbWVtb3J5IHRvIGF2b2lkIHJlcGVhdGVkIGV4cGVuc2l2ZSBTUUwgYWdncmVnYXRpb25zOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMXG4gKiAtIFRpbWVzZXJpZXMgcXVlcmllcyAoZXhlY3V0aW9uL2J1aWxkIG1ldHJpY3Mgd2l0aCBkYXRlIHJhbmdlcyk6IDIgbWluIFRUTFxuICovXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgaW52ZW50b3J5Q2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICAgIHRpbWVzZXJpZXNDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAgICogd2l0aCBzYW1wbGUgaWRzIHNvIGFuIG9wZXJhdG9yIGNhbiBzZWUgd2hlbiBFdmVudEJyaWRnZSBpcyBkZWxpdmVyaW5nXG4gICAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gICAqXG4gICAqIFJldHVybnMgY291bnRzICsgYSBzYW1wbGUgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBmb3Igb2JzZXJ2YWJpbGl0eS5cbiAgICovXG4gIGFzeW5jIGluZ2VzdEV2ZW50cyhldmVudHM6IEluZ2VzdEV2ZW50W10pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAgIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gICAgLy8gcGlwZWxpbmUtcmVnaXN0cnkgbG9va3VwIGJlbG93LCBzbyB0aGUgcm91dGUgbGF5ZXIgTVVTVCBlc3RhYmxpc2ggYVxuICAgIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAgIC8vIHRoaXMgbWV0aG9kLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgICAvLyB0aGUgcmlnaHQgZ2F0ZSBmb3IgdGhpcyBzZXJ2ZXItaW50ZXJuYWwgY3Jvc3MtdGVuYW50IGVuZHBvaW50LiBTZWVcbiAgICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgICAvLyBSdW4gaW5zZXJ0IGluc2lkZSB0aGUgdHgsIGJ1dCBDT0xMRUNUIGFmZmVjdGVkIG9yZ3MgYW5kIGludmFsaWRhdGVcbiAgICAvLyBjYWNoZXMgQUZURVIgdGhlIHR4IHJlc29sdmVzLiBLZWVwaW5nIGludmFsaWRhdGlvbiBpbnNpZGUgdGhlIHR4IGhlbGRcbiAgICAvLyB0aGUgcGcgbG9ja3Mgb3BlbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYWNoZSByb3VuZC10cmlwcyAoUmVkaXMgb3JcbiAgICAvLyBpbi1tZW1vcnkgaW52YWxpZGF0aW9ucyBhcmUgdW5yZWxhdGVkIHRvIHRoZSB0eCBidXQgc3RpbGwgc2VyaWFsaXplZFxuICAgIC8vIGl0cyBjb21taXQpLiBDYWNoZSBUVEwgaXMgMi01IG1pbiBzbyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaXNcbiAgICAvLyBhbiBhY2NlcHRhYmxlIHRyYWRlIGZvciB0aWdodGVyIGxvY2sgd2luZG93cy5cbiAgICBjb25zdCB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcywgYWZmZWN0ZWRPcmdzIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQoZXZlbnRzLm1hcChlID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAgIC5zZWxlY3Qoe1xuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICB9KVxuICAgICAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeSlcbiAgICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcblxuICAgICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgICAgY29uc3Qgcm93czogQXJyYXk8dHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydD4gPSBbXTtcbiAgICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgICAgc2tpcHBlZExvY2FsKys7XG4gICAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgLy8gcmVnaXN0cnkucGlwZWxpbmVJZCA9PT0gZXZlbnQucGlwZWxpbmVJZDsgdXNlIHRoZSByZWdpc3RyeSdzIHNvIHRoZVxuICAgICAgICAgIC8vIEZLIGlzIGFsd2F5cyBhIHJvdyB0aGF0IGV4aXN0cywgYW5kIHB1bGwgb3JnSWQgZnJvbSB0aGUgcmVnaXN0cnkgZm9yXG4gICAgICAgICAgLy8gdGVuYW5jeSAobmV2ZXIgdHJ1c3QgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnKS5cbiAgICAgICAgICBwaXBlbGluZUlkOiByZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiByZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgICBldmVudFNvdXJjZTogZXZlbnQuZXZlbnRTb3VyY2UsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICAgICAgZXhlY3V0aW9uSWQ6IGV2ZW50LmV4ZWN1dGlvbklkLFxuICAgICAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgICAgICAgIGFjdGlvbk5hbWU6IGV2ZW50LmFjdGlvbk5hbWUsXG4gICAgICAgICAgLy8gSEFSRCBDT05TVFJBSU5UOiBhbiBBV1MgYWNjb3VudCBpZCBtdXN0IE5FVkVSIGJlIHBlcnNpc3RlZC4gVGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGFuZCBtdXN0IG5vdCB0cnVzdCB1cHN0cmVhbTpcbiAgICAgICAgICAvLyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGZhaWx1cmUgZGV0YWlsICYgbWVzc2FnZXMgcm91dGluZWx5IGNhcnJ5XG4gICAgICAgICAgLy8gQVJOcyAoYXJuOmF3czrigKY6PGFjY291bnQtaWQ+OuKApikgYW5kIGJhcmUgMTItZGlnaXQgYWNjb3VudCBpZHMuIFNjcnViXG4gICAgICAgICAgLy8gYm90aCBmcmVlLWZvcm0gZmllbGRzIGhlcmUgYmVmb3JlIGluc2VydCAocGVyLWV2ZW50LCBub24tbXV0YXRpbmcpLlxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXZlbnQuZXJyb3JNZXNzYWdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBldmVudC5zdGFydGVkQXQgPyBuZXcgRGF0ZShldmVudC5zdGFydGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBldmVudC5jb21wbGV0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LmNvbXBsZXRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkdXJhdGlvbk1zOiBldmVudC5kdXJhdGlvbk1zLFxuICAgICAgICAgIC8vIERlcGxveS1hdHRyaWJ1dGlvbiBmaWVsZHMg4oCUIHNjcnViYmVkIGxpa2UgdGhlIG90aGVyIGZyZWUtZm9ybSBzdHJpbmdzXG4gICAgICAgICAgLy8gc28gYW4gQVJOL2FjY291bnQgaWQgY2FuIG5ldmVyIGVudGVyIHZpYSBhIHJlZiBvciBlbnZpcm9ubWVudCBuYW1lLlxuICAgICAgICAgIGNvbW1pdFNoYTogZXZlbnQuY29tbWl0U2hhICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuY29tbWl0U2hhKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tbWl0UmVmOiBldmVudC5jb21taXRSZWYgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5jb21taXRSZWYpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbnZpcm9ubWVudDogZXZlbnQuZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5lbnZpcm9ubWVudClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRldGFpbDogZXZlbnQuZGV0YWlsICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVycyhldmVudC5kZXRhaWwpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAgIC8vIHR3aWNlLiBgb25Db25mbGljdERvTm90aGluZ2AgKyB0aGUgcGFydGlhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIChwaXBlbGluZV9pZCwgZXhlY3V0aW9uX2lkLCBldmVudF90eXBlLCBzdGF0dXMsIHN0YWdlX25hbWUsIGFjdGlvbl9uYW1lKVxuICAgICAgLy8gbWFrZXMgcmUtZGVsaXZlcnkgaWRlbXBvdGVudC4gYHJldHVybmluZ2AgZ2l2ZXMgdGhlIFJFQUwgaW5zZXJ0ZWQgc2V0IHNvXG4gICAgICAvLyBjb3VudHMgKyBjYWNoZSBpbnZhbGlkYXRpb24gaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgICBjb25zdCBpbnNlcnRlZFJvd3MgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lRXZlbnQpLnZhbHVlcyhyb3dzKVxuICAgICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgICAucmV0dXJuaW5nKHsgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkIH0pXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGluc2VydGVkOiBpbnNlcnRlZFJvd3MubGVuZ3RoLFxuICAgICAgICBza2lwcGVkOiBza2lwcGVkTG9jYWwsXG4gICAgICAgIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzOiB1bnJlZ2lzdGVyZWRMb2NhbCxcbiAgICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChpbnNlcnRlZFJvd3MubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTdXJmYWNlIHRoZSBzaWxlbnQgc2tpcDogYW4gdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkIHVzdWFsbHkgbWVhbnMgdGhlXG4gICAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgICAvLyBQSVBFTElORV9FVkVOVF9JRCB0YWcgaXMgbWlzc2luZy91bnJlYWRhYmxlIGJ5IHRoZSBMYW1iZGEpLiBMb2dnaW5nIGl0XG4gICAgLy8gbWFrZXMgYSBicm9rZW4gam9pbiB2aXNpYmxlIGluc3RlYWQgb2YgbG9va2luZyBsaWtlIFwibm8gYWN0aXZpdHlcIi5cbiAgICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV2ZW50cyBza2lwcGVkOiBwaXBlbGluZSBpZCBub3QgZm91bmQgaW4gcmVnaXN0cnknLCB7XG4gICAgICAgIGNvdW50OiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGgsXG4gICAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAgIC8vIHNob3J0IGVub3VnaCB0aGF0IGEgbWlzc2VkIGludmFsaWRhdGlvbiBzZWxmLWhlYWxzLlxuICAgIGlmIChhZmZlY3RlZE9yZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICAgIHRoaXMuaW52YWxpZGF0ZU9yZyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkOiBvcmcsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgfSksXG4gICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuICAvKipcbiAgICogQnVpbGQgdGhlIG9yZy1zY29wZSBwcmVkaWNhdGUgZm9yIGEgcmVwb3J0IHF1ZXJ5LiBXaXRoIGBvcmdJZHNgICh0aGVcbiAgICogb3JnIOKGkiB0ZWFtIHJvbGx1cCDigJQgYSBwYXJlbnQncyBgW3NlbGYsIC4uLmRlc2NlbmRhbnRzXWApIGl0IGJlY29tZXMgYW5cbiAgICogYElOICguLi4pYCBvdmVyIHRoZSBzdWJ0cmVlOyBvdGhlcndpc2UgdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2AuIFJldHVybnMgYVxuICAgKiBgbXVsdGlgIGZsYWcgc28gY2FsbGVycyBjYW4gcnVuIG11bHRpLW9yZyByZWFkcyB1bmRlciBzeXNhZG1pbiBjb250ZXh0XG4gICAqICh0aGUgc3VidHJlZSBzcGFucyBvcmdzIG91dHNpZGUgdGhlIHJlcXVlc3QncyBSTFMgc2NvcGUpIGFuZCBzYWx0IHRoZVxuICAgKiBjYWNoZSBrZXkuXG4gICAqL1xuICBwcml2YXRlIG9yZ1Njb3BlKG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaWRzID0gb3JnSWRzICYmIG9yZ0lkcy5sZW5ndGggPiAwID8gb3JnSWRzIDogW29yZ0lkXTtcbiAgICBjb25zdCBtdWx0aSA9IGlkcy5sZW5ndGggPiAxO1xuICAgIGNvbnN0IHByZWQgPSBtdWx0aVxuICAgICAgPyBzcWxgSU4gKCR7c3FsLmpvaW4oaWRzLm1hcCgoaWQpID0+IHNxbGAke2lkfWApLCBzcWxgLCBgKX0pYFxuICAgICAgOiBzcWxgPSAke2lkc1swXX1gO1xuICAgIHJldHVybiB7IHByZWQsIG11bHRpIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcmVwb3J0IHJlYWQuIFNpbmdsZS1vcmcgcmVhZHMgdXNlIHRoZSBwZXItb3JnIGNhY2hlIChpbnZhbGlkYXRlZCBvblxuICAgKiB0aGF0IG9yZydzIGV2ZW50IGluZ2VzdCkuIFJvbGx1cCAobXVsdGktb3JnKSByZWFkcyAqKmJ5cGFzcyB0aGUgY2FjaGUqKiBhbmRcbiAgICogcnVuIHVuZGVyIHN5c2FkbWluIGNvbnRleHQ6IHRoZXkncmUgYWRtaW4tb25seSBhbmQgbG93ZXItZnJlcXVlbmN5LCBhbmQgYVxuICAgKiBjaGlsZCBvcmcncyBldmVudCBpbmdlc3QgY2FuJ3QgaW52YWxpZGF0ZSBhIHBhcmVudCdzIHJvbGx1cCBlbnRyeSAocmVwb3J0aW5nXG4gICAqIGhhcyBubyBvcmcgdHJlZSksIHNvIGNhY2hpbmcgdGhlbSB3b3VsZCBzZXJ2ZSBzdGFsZSBhZ2dyZWdhdGVzLiBBbHdheXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJ1blJlcG9ydDxUPihjYWNoZUtleTogc3RyaW5nLCBtdWx0aTogYm9vbGVhbiwgZXhlYzogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBtdWx0aVxuICAgICAgPyBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCBleGVjKVxuICAgICAgOiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoY2FjaGVLZXksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMSBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEV4ZWN1dGlvbkNvdW50PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpleGVjLWNvdW50YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuMWIgUGVyLXBpcGVsaW5lIGV4ZWN1dGlvbiBoaXN0b3J5IOKAlCBESVNUSU5DVCBleGVjdXRpb25zIGZvciBvbmUgcGlwZWxpbmUsXG4gICAqIG5ld2VzdCBmaXJzdC4gR3JvdXBzIGFsbCBldmVudHMgYnkgYGV4ZWN1dGlvbl9pZGAgaW4gYSBzaW5nbGUgc2NhbiBhbmRcbiAgICogcm9sbHMgZWFjaCBleGVjdXRpb24gdXAgdG8gb25lIHJvdzpcbiAgICogICAtIHN0YXR1czogZGVyaXZlZCBmcm9tIHRoZSBQSVBFTElORS10eXBlIGV2ZW50cy4gRkFJTEVEIHdpbnMsIHRoZW5cbiAgICogICAgIFNVQ0NFRURFRCwgdGhlbiBDQU5DRUxFRDsgYW4gZXhlY3V0aW9uIHdpdGggbm8gdGVybWluYWwgUElQRUxJTkUgZXZlbnRcbiAgICogICAgIGlzIHN0aWxsIGBpbi1wcm9ncmVzc2AuXG4gICAqICAgLSBzdGFydGVkQXQvZW5kZWRBdC9kdXJhdGlvbk1zOiBmcm9tIHRoZSBQSVBFTElORSBsaWZlY3ljbGUgZXZlbnRzLlxuICAgKiAgIC0gZmFpbGluZ1N0YWdlL2ZhaWxpbmdBY3Rpb246IHRoZSBmaXJzdCBGQUlMRUQgU1RBR0UvQUNUSU9OIGV2ZW50IChjaGVhcCDigJRcbiAgICogICAgIHNhbWUgc2Nhbiwgbm8gZXh0cmEgcXVlcnkpLlxuICAgKlxuICAgKiBPUkctU0NPUElORzogaWRlbnRpY2FsIHRvIHRoZSBzaWJsaW5nIGV4ZWN1dGlvbiByZXBvcnRzIOKAlCBqb2lucyB0aGUgcGlwZWxpbmVcbiAgICogcmVnaXN0cnkgdGFibGUgKGBwaXBlbGluZWApIGFuZCBnYXRlcyBvbiBgcC5vcmdfaWQgJHtwcmVkfWAsIHdoZXJlIGBwcmVkYCBpc1xuICAgKiB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYCBvciAod2l0aCBhIHJvbGx1cCkgYW4gYElOICguLi4pYCBvdmVyIHRoZSBvcmfihpJ0ZWFtXG4gICAqIHN1YnRyZWUuIEEgcGlwZWxpbmVJZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBvcmcgeWllbGRzIHplcm8gcm93cy5cbiAgICovXG4gIGFzeW5jIGxpc3RQaXBlbGluZUV4ZWN1dGlvbnMoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0sXG4gICAgbGltaXQ6IG51bWJlciA9IDUwLFxuICApOiBQcm9taXNlPFBpcGVsaW5lRXhlY3V0aW9uW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gcmFuZ2U/LmZyb20gJiYgcmFuZ2U/LnRvXG4gICAgICA/IHNxbGBBTkQgZS5zdGFydGVkX2F0ID49ICR7cmFuZ2UuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHtyYW5nZS50b306OnRpbWVzdGFtcHR6YFxuICAgICAgOiBzcWxgYDtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8UGlwZWxpbmVFeGVjdXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4yIFN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUgZm9yIGFuIG9yZy4gKi9cbiAgYXN5bmMgZ2V0U3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8VGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCk6IFByb21pc2U8RXJyb3JFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06ZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFcnJvckVudHJ5PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjkgRE9SQSBtZXRyaWNzIG92ZXIgW2Zyb20sdG9dIChzdGFydGVkX2F0IHJhbmdlKSwgb3JnLXNjb3BlZCArIHJvbGx1cC1hd2FyZS5cbiAgICpcbiAgICogQWxsIGZvdXIgbWV0cmljcyBkZXJpdmUgZnJvbSBhIHBlci1leGVjdXRpb24gcm9sbC11cCBvZiBURVJNSU5BTCBQSVBFTElORVxuICAgKiBldmVudHMgKG9uZSByb3cgcGVyIGV4ZWN1dGlvbl9pZCtwaXBlbGluZV9pZDsgRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELFxuICAgKiB0aGVuIENBTkNFTEVEL1NUT1BQRUQg4oCUIG1pcnJvcmluZyBgbGlzdFBpcGVsaW5lRXhlY3V0aW9uc2ApLiBUaGUgc2NhbiBpc1xuICAgKiBnYXRlZCBieSB0aGUgYHAub3JnX2lkICR7cHJlZH1gIGpvaW4gZXhhY3RseSBsaWtlIHRoZSBzaWJsaW5nIHJlcG9ydHMsIHNvIGFcbiAgICogcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ24gb3JnJ3MgZXhlY3V0aW9ucyBuZXZlclxuICAgKiBlbnRlciB0aGUgYWdncmVnYXRlLlxuICAgKlxuICAgKiBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgQ09SRS13aW5kb3cgZXhlY3V0aW9ucyAoW2Zyb20sdG9dKS4gTVRUUiBpc1xuICAgKiBwZXItSU5DSURFTlQ6IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGNvbGxhcHNlIGludG8gb25lIGluY2lkZW50IGFuZCB0aGVcbiAgICogcmVjb3ZlcnkgbG9va3VwIG1heSBzZWUgdGhlIG5leHQgc3VjY2VzcyB1cCB0byBNVFRSX1JFU1RPUkVfTE9PS0FIRUFEIHBhc3RcbiAgICogYHRvYCwgc28gYSBmYWlsdXJlIG5lYXIgdGhlIGVkZ2UgaXNuJ3QgcmlnaHQtY2Vuc29yZWQgaW50byBcIm5ldmVyIHJlc3RvcmVkXCIuXG4gICAqIFRoZSBzY2FuIGJvdW5kIGlzIHRoZXJlZm9yZSBgW2Zyb20sIHRvICsgbG9vay1haGVhZF1gOyB0aGUgc3RhcnRlZF9hdCByYW5nZVxuICAgKiBzdGlsbCByaWRlcyB0aGUgc2FtZSBpbmRleCBhcyB0aGUgc2libGluZyByZXBvcnRzLlxuICAgKlxuICAgKiBESVNDTE9TVVJFOiBieSBkZWZhdWx0IERGL0NGUi9NVFRSIGFyZSBSVU4tYmFzZWQgKGFueSBzdWNjZXNzZnVsIFBJUEVMSU5FXG4gICAqIHJ1biA9IGEgXCJkZXBsb3ltZW50XCIpLCBhbmQgTGVhZCBUaW1lIGlzIGFkZGl0aW9uYWxseSBhIHJ1bi10aW1lIFBST1hZXG4gICAqIGZsYWdnZWQgYGFwcHJveDogdHJ1ZWAuIFBhc3MgYGVudmlyb25tZW50YCBvciBgZGVwbG95c09ubHlgIHRvIHNjb3BlIHRvXG4gICAqIGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggYSByZWFsIGRlcGxveSB0YXJnZXQg4oCUIHRoZSByZXNwb25zZSBgYmFzaXNgIHJlcG9ydHNcbiAgICogd2hpY2ggd2FzIHVzZWQuIFNlZSB0aGUgRG9yYU1ldHJpY3MgZG9jICsgZG9jcy9kb3JhLW1ldHJpY3MubWQuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAgICogQHBhcmFtIG9wdHMuZW52aXJvbm1lbnQgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyB0YXJnZXRcbiAgICogQHBhcmFtIG9wdHMuZGVwbG95c09ubHkgICBjb3VudCBvbmx5IGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggQU5ZIGVudmlyb25tZW50XG4gICAqL1xuICBhc3luYyBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYU1ldHJpY3M+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICAgIC8vIE9wdGlvbmFsIGRlcGxveS1zY29waW5nIC8gcGVyLXBpcGVsaW5lIHByZWRpY2F0ZXMsIGZvbGRlZCBpbnRvIHRoZSBleGVjc1xuICAgIC8vIHNjYW4gc28gZmFpbHVyZXMgQU5EIHRoZWlyIHJlY292ZXJ5IHN1Y2Nlc3NlcyBhcmUgZmlsdGVyZWQgY29uc2lzdGVudGx5LlxuICAgIGNvbnN0IHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSwgYmFzaXMgfSA9IGRvcmFTY29wZUNsYXVzZXMob3B0cyk7XG4gICAgLy8gU2NhbiB0aGUgQ09SRSB3aW5kb3cgcGx1cyBhIGxvb2stYWhlYWQgdGFpbDogdGhlIGV4dHJhIHRhaWwgZXhpc3RzIG9ubHlcbiAgICAvLyBzbyBhIGxhdGUgZmFpbHVyZSBjYW4gc3RpbGwgZmluZCBpdHMgcmVjb3ZlcnkgKHNlZSB0aGUgcmVzdG9yZSBDVEUpLlxuICAgIGNvbnN0IGV4ZWNzID0gZXhlY3NDdGUoe1xuICAgICAgcHJlZCxcbiAgICAgIHBpcGVsaW5lQ2xhdXNlLFxuICAgICAgZGVwbG95Q2xhdXNlLFxuICAgICAgZnJvbSxcbiAgICAgIGNvbHVtbnM6IHNxbGBcbiAgICAgICAgICAgIGUucGlwZWxpbmVfaWQsXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGVuZGVkX2F0LFxuICAgICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEFTIGR1cmF0aW9uX21zYCxcbiAgICAgIHRvQm91bmQ6IHNxbGAke3RvfTo6dGltZXN0YW1wdHogKyAke01UVFJfUkVTVE9SRV9MT09LQUhFQUR9OjppbnRlcnZhbGAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApLFxuICAgICAgICAtLSBDb3JlLXdpbmRvdyBleGVjdXRpb25zIChbZnJvbSx0b10pOyBERi9DRlIvbGVhZC10aW1lIGNvdW50IG9ubHkgdGhlc2UuXG4gICAgICAgIC0tIFRoZSBsb29rLWFoZWFkIHJvd3MgYWJvdmUgYXJlIHVzZWQgT05MWSBhcyBNVFRSIHJlY292ZXJ5IGNhbmRpZGF0ZXMuXG4gICAgICAgIGNvcmUgQVMgKFxuICAgICAgICAgIFNFTEVDVCAqIEZST00gZXhlY3MgV0hFUkUgc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgKSxcbiAgICAgICAgZGYgQVMgKFxuICAgICAgICAgIFNFTEVDVCBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGNmciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICksXG4gICAgICAgIGx0IEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZGVwbG95bWVudHMsXG4gICAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6ZmxvYXQgQVMgbWVkaWFuX21zXG4gICAgICAgICAgRlJPTSBjb3JlXG4gICAgICAgICAgV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcgQU5EIGR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICksXG4gICAgICAgIC0tIEZvciBlYWNoIGNvcmUtd2luZG93IGZhaWx1cmUsIGZpbmQgdGhlIEVORCBvZiBpdHMgcmVjb3ZlcmluZyBydW46IHRoZVxuICAgICAgICAtLSBuZXh0IFNVQ0NFRURFRCBydW4gb2YgdGhlIHNhbWUgcGlwZWxpbmUgdGhhdCBFTkRFRCBhZnRlciB0aGlzIGZhaWx1cmVcbiAgICAgICAgLS0gZW5kZWQgKHZpc2libGUgaW50byB0aGUgbG9vay1haGVhZCB0YWlsKS4gU0VMRUNUIGFuZCBNRUFTVVJFIGJvdGgga2V5XG4gICAgICAgIC0tIG9mZiBlbmRlZF9hdCBzbyB0aGV5IHN0YXkgY29uc2lzdGVudCAtLSB0aGUgaW5jaWRlbnQgZ2FwIGlzXG4gICAgICAgIC0tIHJlc3RvcmVkX2F0IChzdWNjZXNzIGVuZCkgbWludXMgaW5jaWRlbnRfc3RhcnRlZCAoZmlyc3QgZmFpbHVyZSBlbmQpLFxuICAgICAgICAtLSBzbyBwaWNraW5nIHRoZSByZWNvdmVyeSBieSBlbmRlZF9hdCAobm90IHN0YXJ0ZWRfYXQpIHJ1bGVzIG91dCB0aGVcbiAgICAgICAgLS0gbmVnYXRpdmUgZ2FwIHRoYXQgYSBjb25jdXJyZW50IHN1Y2Nlc3Mgd2hpY2ggU1RBUlRFRCBhZnRlciB0aGUgZmFpbHVyZVxuICAgICAgICAtLSBidXQgRU5ERUQgYmVmb3JlIGl0IHdvdWxkIG90aGVyd2lzZSBmb2xkIGludG8gQVZHLiBNZWFzdXJpbmcgZnJvbSB0aGVcbiAgICAgICAgLS0gZmFpbHVyZSdzIEVORCAobm90IHN0YXJ0KSBhbHNvIGtlZXBzIHRoZSBmYWlsZWQgcnVuJ3Mgb3duIGR1cmF0aW9uIG91dFxuICAgICAgICAtLSBvZiByZXN0b3JlIHRpbWUuIE9yZGVyaW5nIGJ5IGVuZGVkX2F0IG1ha2VzIHRoZSBpbmNpZGVudCBjb2xsYXBzZSBmYWxsXG4gICAgICAgIC0tIG91dCBuYXR1cmFsbHk6IGEgZ3JlZW4gcnVuIGVuZGluZyBiZXR3ZWVuIHR3byBmYWlsdXJlcyBzcGxpdHMgdGhlbS5cbiAgICAgICAgcmVzdG9yZSBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBmLnBpcGVsaW5lX2lkLFxuICAgICAgICAgICAgZi5lbmRlZF9hdCBBUyBmYWlsX2VuZGVkLFxuICAgICAgICAgICAgKFNFTEVDVCBzLmVuZGVkX2F0IEZST00gZXhlY3Mgc1xuICAgICAgICAgICAgICBXSEVSRSBzLnBpcGVsaW5lX2lkID0gZi5waXBlbGluZV9pZCBBTkQgcy5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgICAgIEFORCBzLmVuZGVkX2F0ID4gZi5lbmRlZF9hdFxuICAgICAgICAgICAgICBPUkRFUiBCWSBzLmVuZGVkX2F0IEFTQyBMSU1JVCAxKSBBUyByZXN0b3JlZF9hdFxuICAgICAgICAgIEZST00gY29yZSBmXG4gICAgICAgICAgV0hFUkUgZi5zdGF0dXMgPSAnRkFJTEVEJ1xuICAgICAgICApLFxuICAgICAgICAtLSBDb2xsYXBzZSB0byBJTkNJREVOVFM6IGZhaWx1cmVzIHNoYXJpbmcgdGhlIHNhbWUgcmVjb3ZlcnkgKGkuZS4gd2l0aFxuICAgICAgICAtLSBubyBncmVlbiBydW4gYmV0d2VlbiB0aGVtKSBhcmUgb25lIGluY2lkZW50LCBzdGFydGluZyBhdCB0aGUgZmlyc3RcbiAgICAgICAgLS0gZmFpbHVyZSdzIGVuZC4gVW5yZWNvdmVyZWQgZmFpbHVyZXMgc2hhcmUgcmVzdG9yZWRfYXQgPSBOVUxMIGFuZCBmb3JtXG4gICAgICAgIC0tIHRoZSBzaW5nbGUgdHJhaWxpbmcgb3BlbiBpbmNpZGVudCBwZXIgcGlwZWxpbmUuXG4gICAgICAgIGluY2lkZW50cyBBUyAoXG4gICAgICAgICAgU0VMRUNUIHBpcGVsaW5lX2lkLCByZXN0b3JlZF9hdCwgTUlOKGZhaWxfZW5kZWQpIEFTIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICBGUk9NIHJlc3RvcmVcbiAgICAgICAgICBHUk9VUCBCWSBwaXBlbGluZV9pZCwgcmVzdG9yZWRfYXRcbiAgICAgICAgKSxcbiAgICAgICAgbXR0ciBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgICAgLS0gcmVzdG9yZWQgbXVzdCBlcXVhbCB0aGUgY291bnQgb2YgaW5jaWRlbnRzIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgICAgIC0tIGNvbnRyaWJ1dGUgdG8gYXZnX3NlY29uZHMuIEd1YXJkIG9uIGluY2lkZW50X3N0YXJ0ZWQgdG9vOiBhXG4gICAgICAgICAgICAtLSBmYWlsdXJlIHdpdGggYSBOVUxMIGNvbXBsZXRlZF9hdCB5aWVsZHMgYSBOVUxMIGluY2lkZW50X3N0YXJ0ZWRcbiAgICAgICAgICAgIC0tIHRoYXQgY29udHJpYnV0ZXMgTlVMTCAobm90IGEgcmVhbCBnYXApIHRvIEFWRywgc28gaXQgbXVzdCBub3QgYmVcbiAgICAgICAgICAgIC0tIGNvdW50ZWQgYXMgcmVzdG9yZWQgZWl0aGVyIC0tIG90aGVyd2lzZSByZXN0b3JlZCBjb3VsZCBleGNlZWRcbiAgICAgICAgICAgIC0tIHRoZSBudW1iZXIgb2YgbWVhc3VyZWQgaW5jaWRlbnRzLlxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChcbiAgICAgICAgICAgICAgV0hFUkUgcmVzdG9yZWRfYXQgSVMgTk9UIE5VTEwgQU5EIGluY2lkZW50X3N0YXJ0ZWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAgICk6OmludCBBUyByZXN0b3JlZCxcbiAgICAgICAgICAgIEFWRyhFWFRSQUNUKEVQT0NIIEZST00gKHJlc3RvcmVkX2F0IC0gaW5jaWRlbnRfc3RhcnRlZCkpKVxuICAgICAgICAgICAgICBGSUxURVIgKFdIRVJFIHJlc3RvcmVkX2F0IElTIE5PVCBOVUxMIEFORCBpbmNpZGVudF9zdGFydGVkIElTIE5PVCBOVUxMKTo6ZmxvYXQgQVMgYXZnX3NlY29uZHNcbiAgICAgICAgICBGUk9NIGluY2lkZW50c1xuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGRmLmRlcGxveW1lbnRzIEFTIGRmX2RlcGxveW1lbnRzLFxuICAgICAgICAgIGNmci5mYWlsZWQgQVMgY2ZyX2ZhaWxlZCxcbiAgICAgICAgICBjZnIudG90YWwgQVMgY2ZyX3RvdGFsLFxuICAgICAgICAgIGx0LmRlcGxveW1lbnRzIEFTIGx0X2RlcGxveW1lbnRzLFxuICAgICAgICAgIGx0Lm1lZGlhbl9tcyBBUyBsdF9tZWRpYW5fbXMsXG4gICAgICAgICAgbXR0ci5mYWlsdXJlcyBBUyBtdHRyX2ZhaWx1cmVzLFxuICAgICAgICAgIG10dHIucmVzdG9yZWQgQVMgbXR0cl9yZXN0b3JlZCxcbiAgICAgICAgICBtdHRyLmF2Z19zZWNvbmRzIEFTIG10dHJfYXZnX3NlY29uZHNcbiAgICAgICAgRlJPTSBkZiwgY2ZyLCBsdCwgbXR0clxuICAgICAgYCkudGhlbihyID0+IHRoaXMuc2hhcGVEb3JhKGRyaXp6bGVSb3dzPERvcmFSb3c+KHIucm93cylbMF0sIGZyb20sIHRvLCBiYXNpcywgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9KSkpO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhOiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveXNPbmx5ID8gJ2QnIDogJyd9YDtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogU2hhcGUgYSBzaW5nbGUgRE9SQSBhZ2dyZWdhdGUgcm93IGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9LiAqL1xuICBwcml2YXRlIHNoYXBlRG9yYShcbiAgICByb3c6IERvcmFSb3cgfCB1bmRlZmluZWQsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgYmFzaXM6IERvcmFNZXRyaWNzWydiYXNpcyddLFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZD86IHN0cmluZzsgZW52aXJvbm1lbnQ/OiBzdHJpbmcgfSxcbiAgKTogRG9yYU1ldHJpY3Mge1xuICAgIC8vIGBGUk9NIGRmLCBjZnIsIGx0LCBtdHRyYCBhbHdheXMgeWllbGRzIGV4YWN0bHkgb25lIHJvdyAoZWFjaCBDVEUgaXMgYVxuICAgIC8vIHNpbmdsZS1yb3cgYWdncmVnYXRlKSwgYnV0IGd1YXJkIGFnYWluc3QgYW4gZW1wdHkgcmVzdWx0IGRlZmVuc2l2ZWx5LlxuICAgIGNvbnN0IHI6IERvcmFSb3cgPSByb3cgPz8ge307XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IE51bWJlcihyLmRmX2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIC8vIEZsb29yIHRoZSBkaXZpc29yIGF0IG9uZSBkYXk6IGEgd2luZG93IHNob3J0ZXIgdGhhbiBhIGRheSAoaW5jbC4gdGhlXG4gICAgLy8gZGVnZW5lcmF0ZSBmcm9tPT10bykgaGFzIG5vIG1lYW5pbmdmdWwgc3ViLWRheSByYXRlLCBzbyBpdCdzIHRyZWF0ZWQgYXMgYVxuICAgIC8vIHNpbmdsZSBkYXkgcmF0aGVyIHRoYW4gZXh0cmFwb2xhdGVkIG9yIG1pc2xhYmVsZWQgYXMgYSByYXcgY291bnQuXG4gICAgLy8gRmxvb3IgYXQgb25lIGRheSBhbmQgZ3VhcmQgYWdhaW5zdCB1bnBhcnNlYWJsZSBkYXRlcyAoRGF0ZS5wYXJzZSDihpIgTmFOLFxuICAgIC8vIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBwcm9wYWdhdGUgdGhyb3VnaCBwZXJEYXkpLiBGYWxscyBiYWNrIHRvIGEgMS1kYXlcbiAgICAvLyB3aW5kb3cgc28gYSBiYWQgcmFuZ2UgeWllbGRzIHRoZSByYXcgY291bnQgYXMgdGhlIHJhdGUsIG5ldmVyIE5hTi5cbiAgICBjb25zdCBzcGFuRGF5cyA9IChEYXRlLnBhcnNlKHRvKSAtIERhdGUucGFyc2UoZnJvbSkpIC8gODY0MDAwMDA7XG4gICAgY29uc3QgZGF5cyA9IE51bWJlci5pc0Zpbml0ZShzcGFuRGF5cykgPyBNYXRoLm1heChzcGFuRGF5cywgMSkgOiAxO1xuICAgIC8vIEJhbmQgb24gdGhlIFVOUk9VTkRFRCByYXRlOyByb3VuZCBvbmx5IGZvciBkaXNwbGF5LiBSb3VuZGluZyBmaXJzdCB3b3VsZFxuICAgIC8vIG1pc2xhYmVsIGV4YWN0IHdlZWtseS9tb250aGx5IGJvdW5kYXJpZXMgKGUuZy4gMSBkZXBsb3kgLyAzMCBkYXlzIOKGklxuICAgIC8vIDAuMDMzMyByb3VuZHMgdG8gMC4wMyA8IDEvMzAg4oaSIHdyb25nbHkgXCJsb3dcIiBpbnN0ZWFkIG9mIFwibWVkaXVtXCIpLlxuICAgIGNvbnN0IHJhd1BlckRheSA9IGRlcGxveW1lbnRzIC8gZGF5cztcbiAgICBjb25zdCBwZXJEYXkgPSBOdW1iZXIocmF3UGVyRGF5LnRvRml4ZWQoMikpO1xuXG4gICAgY29uc3QgZmFpbGVkID0gTnVtYmVyKHIuY2ZyX2ZhaWxlZCkgfHwgMDtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihyLmNmcl90b3RhbCkgfHwgMDtcbiAgICBjb25zdCByYXdQY3QgPSB0b3RhbCA+IDAgPyAoZmFpbGVkIC8gdG90YWwpICogMTAwIDogMDtcbiAgICBjb25zdCBwY3QgPSBOdW1iZXIocmF3UGN0LnRvRml4ZWQoMSkpO1xuXG4gICAgY29uc3QgZmFpbHVyZXMgPSBOdW1iZXIoci5tdHRyX2ZhaWx1cmVzKSB8fCAwO1xuICAgIGNvbnN0IHJlc3RvcmVkID0gTnVtYmVyKHIubXR0cl9yZXN0b3JlZCkgfHwgMDtcbiAgICBjb25zdCBhdmdTZWNvbmRzID0gZmFpbHVyZXMgPiAwICYmIHIubXR0cl9hdmdfc2Vjb25kcyAhPSBudWxsXG4gICAgICA/IE51bWJlcihOdW1iZXIoci5tdHRyX2F2Z19zZWNvbmRzKS50b0ZpeGVkKDEpKVxuICAgICAgOiBudWxsO1xuXG4gICAgY29uc3QgbHREZXBsb3ltZW50cyA9IE51bWJlcihyLmx0X2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIGNvbnN0IG1lZGlhblNlY29uZHMgPSByLmx0X21lZGlhbl9tcyAhPSBudWxsXG4gICAgICA/IE51bWJlcigoTnVtYmVyKHIubHRfbWVkaWFuX21zKSAvIDEwMDApLnRvRml4ZWQoMSkpXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93OiB7IGZyb20sIHRvIH0sXG4gICAgICBiYXNpcyxcbiAgICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICAgIGRlcGxveW1lbnRGcmVxdWVuY3k6IHsgZGVwbG95bWVudHMsIHBlckRheSwgbGV2ZWw6IGRvcmFMZXZlbEZvckZyZXF1ZW5jeShyYXdQZXJEYXksIGRlcGxveW1lbnRzKSB9LFxuICAgICAgY2hhbmdlRmFpbHVyZVJhdGU6IHsgZmFpbGVkLCB0b3RhbCwgcGN0LCBsZXZlbDogZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShyYXdQY3QsIHRvdGFsKSB9LFxuICAgICAgbWVhblRpbWVUb1Jlc3RvcmU6IHsgZmFpbHVyZXMsIHJlc3RvcmVkLCBhdmdTZWNvbmRzLCBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShhdmdTZWNvbmRzKSB9LFxuICAgICAgbGVhZFRpbWU6IHsgZGVwbG95bWVudHM6IGx0RGVwbG95bWVudHMsIG1lZGlhblNlY29uZHMsIGFwcHJveDogdHJ1ZSwgbGV2ZWw6IGRvcmFMZXZlbEZvckxlYWRUaW1lKG1lZGlhblNlY29uZHMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjliIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgY2hhbmdlLWZhaWx1cmUgcmF0ZSBidWNrZXRlZCBieVxuICAgKiBgaW50ZXJ2YWxgIChkYXkvd2Vlay9tb250aCkgZm9yIGEgc3BhcmtsaW5lLiBQZXItZXhlY3V0aW9uIHJvbGx1cCAob25lIHJvd1xuICAgKiBwZXIgZXhlY3V0aW9uLCBGQUlMRUQgd2lucykgYnVja2V0ZWQgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQuIFNoYXJlc1xuICAgKiB0aGUgYGdldERvcmFNZXRyaWNzYCBzY29waW5nIChvcmcvcm9sbHVwLCBwaXBlbGluZUlkLCBkZXBsb3ktc2NvcGluZyk7IE1UVFJcbiAgICogYW5kIGxlYWQgdGltZSBhcmUgaW50ZW50aW9uYWxseSBvbWl0dGVkICh0b28gaGVhdnkgdG8gYnVja2V0IG1lYW5pbmdmdWxseSkuXG4gICAqL1xuICBhc3luYyBnZXREb3JhVHJlbmQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnRlcnZhbDogc3RyaW5nLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gICAgY29uc3QgeyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlIH0gPSBkb3JhU2NvcGVDbGF1c2VzKG9wdHMpO1xuICAgIC8vIFNhbWUgZXhlY3Mgcm9sbC11cCBhcyBnZXREb3JhTWV0cmljcyAoc2hhcmVkIGJ1aWxkZXIg4oCUIHN0YXR1cyBzZXQgK1xuICAgIC8vIHByZWRpY2F0ZSBjYW4ndCBkcmlmdCk7IHRoZSB0cmVuZCBuZWVkcyBvbmx5IHN0YXJ0ZWRfYXQgb3ZlciB0aGUgY29yZVxuICAgIC8vIHdpbmRvdyAobm8gTVRUUiBsb29rLWFoZWFkLCBubyBlbmRlZF9hdC9kdXJhdGlvbiBjb2x1bW5zKS5cbiAgICBjb25zdCBleGVjcyA9IGV4ZWNzQ3RlKHtcbiAgICAgIHByZWQsXG4gICAgICBwaXBlbGluZUNsYXVzZSxcbiAgICAgIGRlcGxveUNsYXVzZSxcbiAgICAgIGZyb20sXG4gICAgICBjb2x1bW5zOiBzcWxgXG4gICAgICAgICAgICAke0RPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0V9IEFTIHN0YXR1cyxcbiAgICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEFTIHN0YXJ0ZWRfYXRgLFxuICAgICAgdG9Cb3VuZDogc3FsYCR7dG99Ojp0aW1lc3RhbXB0emAsXG4gICAgfSk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBXSVRIIGV4ZWNzIEFTICgke2V4ZWNzfVxuICAgICAgICApXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIHN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgICBDT0FMRVNDRShST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcImNoYW5nZUZhaWx1cmVQY3RcIlxuICAgICAgICBGUk9NIGV4ZWNzXG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxEb3JhVHJlbmRQb2ludD4oci5yb3dzKSkpO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveXNPbmx5ID8gJ2QnIDogJyd9YDtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMjogUGx1Z2luIEludmVudG9yeSAmIEJ1aWxkcyDilIDilIBcblxuICAvKiogMi4xIFBsdWdpbiBzdW1tYXJ5IOKAlCBjb3VudHMgYW5kIGJyZWFrZG93bnMuICovXG4gIGFzeW5jIGdldFBsdWdpblN1bW1hcnkob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luU3VtbWFyeT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXN1bW1hcnlgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIE5PVCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGluYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwdWJsaWMnKTo6aW50IEFTIHB1YmxpYyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIHByaXZhdGU6IDAsIHVuaXF1ZU5hbWVzOiAwIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIDIuMiBUeXBlICYgY29tcHV0ZSBkaXN0cmlidXRpb24uICovXG4gIGFzeW5jIGdldFBsdWdpbkRpc3RyaWJ1dGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbltdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tZGlzdHJpYnV0aW9uYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0gQVMgcGx1Z2luX3R5cGUsXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfSBBUyBjb21wdXRlX3R5cGUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBjb3VudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0sICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX1cbiAgICAgICAgT1JERVIgQlkgY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiAyLjMgVmVyc2lvbiBjb3VudHMgcGVyIHBsdWdpbiBuYW1lLiAqL1xuICBhc3luYyBnZXRQbHVnaW5WZXJzaW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxWZXJzaW9uQ291bnRbXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXZlcnNpb25zYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ubmFtZX0sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB2ZXJzaW9uX2NvdW50LFxuICAgICAgICAgIE1BWCgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0pIEFTIGxhdGVzdF92ZXJzaW9uLFxuICAgICAgICAgIGJvb2xfb3IoJHtzY2hlbWEucGx1Z2luLmlzRGVmYXVsdH0pIEFTIGhhc19kZWZhdWx0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5uYW1lfVxuICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uX2NvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxWZXJzaW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIDIuNCBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChgJHtvcmdJZH06YnVpbGQtc3VjY2Vzczoke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi41IEJ1aWxkIGR1cmF0aW9uIHBlciBwbHVnaW4uICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogUHJvbWlzZTxCdWlsZER1cmF0aW9uW10+IHtcbiAgICByZXR1cm4gdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgYnVpbGRzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRHVyYXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuNiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiAqL1xuICBhc3luYyBnZXRCdWlsZEZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiB0aW1lc2VyaWVzQ2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OmJ1aWxkLWZhaWx1cmVzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUsIGUuZXJyb3JfbWVzc2FnZVxuICAgICAgICBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRGYWlsdXJlPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVwb3J0aW5nU2VydmljZSA9IG5ldyBSZXBvcnRpbmdTZXJ2aWNlKCk7XG4iXX0=
@@ -1701,6 +1701,63 @@ export declare const schema: {
1701
1701
  identity: undefined;
1702
1702
  generated: undefined;
1703
1703
  }, {}, {}>;
1704
+ commitSha: import("drizzle-orm/pg-core").PgColumn<{
1705
+ name: "commit_sha";
1706
+ tableName: "pipeline_events";
1707
+ dataType: "string";
1708
+ columnType: "PgVarchar";
1709
+ data: string;
1710
+ driverParam: string;
1711
+ notNull: false;
1712
+ hasDefault: false;
1713
+ isPrimaryKey: false;
1714
+ isAutoincrement: false;
1715
+ hasRuntimeDefault: false;
1716
+ enumValues: [string, ...string[]];
1717
+ baseColumn: never;
1718
+ identity: undefined;
1719
+ generated: undefined;
1720
+ }, {}, {
1721
+ length: 255;
1722
+ }>;
1723
+ commitRef: import("drizzle-orm/pg-core").PgColumn<{
1724
+ name: "commit_ref";
1725
+ tableName: "pipeline_events";
1726
+ dataType: "string";
1727
+ columnType: "PgVarchar";
1728
+ data: string;
1729
+ driverParam: string;
1730
+ notNull: false;
1731
+ hasDefault: false;
1732
+ isPrimaryKey: false;
1733
+ isAutoincrement: false;
1734
+ hasRuntimeDefault: false;
1735
+ enumValues: [string, ...string[]];
1736
+ baseColumn: never;
1737
+ identity: undefined;
1738
+ generated: undefined;
1739
+ }, {}, {
1740
+ length: 255;
1741
+ }>;
1742
+ environment: import("drizzle-orm/pg-core").PgColumn<{
1743
+ name: "environment";
1744
+ tableName: "pipeline_events";
1745
+ dataType: "string";
1746
+ columnType: "PgVarchar";
1747
+ data: string;
1748
+ driverParam: string;
1749
+ notNull: false;
1750
+ hasDefault: false;
1751
+ isPrimaryKey: false;
1752
+ isAutoincrement: false;
1753
+ hasRuntimeDefault: false;
1754
+ enumValues: [string, ...string[]];
1755
+ baseColumn: never;
1756
+ identity: undefined;
1757
+ generated: undefined;
1758
+ }, {}, {
1759
+ length: 255;
1760
+ }>;
1704
1761
  detail: import("drizzle-orm/pg-core").PgColumn<{
1705
1762
  name: "detail";
1706
1763
  tableName: "pipeline_events";
@@ -814,6 +814,63 @@ export declare const pipelineEvent: import("drizzle-orm/pg-core").PgTableWithCol
814
814
  identity: undefined;
815
815
  generated: undefined;
816
816
  }, {}, {}>;
817
+ commitSha: import("drizzle-orm/pg-core").PgColumn<{
818
+ name: "commit_sha";
819
+ tableName: "pipeline_events";
820
+ dataType: "string";
821
+ columnType: "PgVarchar";
822
+ data: string;
823
+ driverParam: string;
824
+ notNull: false;
825
+ hasDefault: false;
826
+ isPrimaryKey: false;
827
+ isAutoincrement: false;
828
+ hasRuntimeDefault: false;
829
+ enumValues: [string, ...string[]];
830
+ baseColumn: never;
831
+ identity: undefined;
832
+ generated: undefined;
833
+ }, {}, {
834
+ length: 255;
835
+ }>;
836
+ commitRef: import("drizzle-orm/pg-core").PgColumn<{
837
+ name: "commit_ref";
838
+ tableName: "pipeline_events";
839
+ dataType: "string";
840
+ columnType: "PgVarchar";
841
+ data: string;
842
+ driverParam: string;
843
+ notNull: false;
844
+ hasDefault: false;
845
+ isPrimaryKey: false;
846
+ isAutoincrement: false;
847
+ hasRuntimeDefault: false;
848
+ enumValues: [string, ...string[]];
849
+ baseColumn: never;
850
+ identity: undefined;
851
+ generated: undefined;
852
+ }, {}, {
853
+ length: 255;
854
+ }>;
855
+ environment: import("drizzle-orm/pg-core").PgColumn<{
856
+ name: "environment";
857
+ tableName: "pipeline_events";
858
+ dataType: "string";
859
+ columnType: "PgVarchar";
860
+ data: string;
861
+ driverParam: string;
862
+ notNull: false;
863
+ hasDefault: false;
864
+ isPrimaryKey: false;
865
+ isAutoincrement: false;
866
+ hasRuntimeDefault: false;
867
+ enumValues: [string, ...string[]];
868
+ baseColumn: never;
869
+ identity: undefined;
870
+ generated: undefined;
871
+ }, {}, {
872
+ length: 255;
873
+ }>;
817
874
  detail: import("drizzle-orm/pg-core").PgColumn<{
818
875
  name: "detail";
819
876
  tableName: "pipeline_events";
@@ -133,6 +133,14 @@ export const pipelineEvent = pgTable('pipeline_events', {
133
133
  startedAt: timestamp('started_at', { withTimezone: true }),
134
134
  completedAt: timestamp('completed_at', { withTimezone: true }),
135
135
  durationMs: integer('duration_ms'),
136
+ // DORA deploy-attribution (all nullable; populated at ingest when the source
137
+ // event carries them — legacy/CI-only events leave them NULL). `environment`
138
+ // is the deploy target (e.g. "production"); its presence marks an execution
139
+ // as a real deployment, letting DORA scope past generic pipeline runs.
140
+ // `commitSha`/`commitRef` capture the source revision for lead-time work.
141
+ commitSha: varchar('commit_sha', { length: 255 }),
142
+ commitRef: varchar('commit_ref', { length: 255 }),
143
+ environment: varchar('environment', { length: 255 }),
136
144
  detail: jsonb('detail').$type(),
137
145
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
138
146
  }, (table) => ({
@@ -162,5 +170,14 @@ export const pipelineEvent = pgTable('pipeline_events', {
162
170
  dedupIdx: uniqueIndex('event_dedup_idx')
163
171
  .on(sql `coalesce(${table.pipelineId}::text, '')`, table.executionId, table.eventType, table.status, sql `coalesce(${table.stageName}, '')`, sql `coalesce(${table.actionName}, '')`)
164
172
  .where(sql `execution_id IS NOT NULL`),
173
+ // DORA deploy-scoped reads: only PIPELINE-level executions tagged with a
174
+ // deploy environment. `event_type` is in the index because the events Lambda
175
+ // tags EVERY event of a deployed pipeline (STAGE/ACTION too), while the DORA
176
+ // scan wants only `event_type='PIPELINE'` — including it restores selectivity.
177
+ // Partial (environment IS NOT NULL) keeps it small — legacy/CI-only events
178
+ // aren't indexed. MIGRATION REQUIRED: drizzle-kit generate.
179
+ envTypeStartedIdx: index('event_env_type_started_idx')
180
+ .on(table.environment, table.eventType, table.startedAt)
181
+ .where(sql `environment IS NOT NULL`),
165
182
  }));
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2Uvc2NoZW1hL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUEwQjNIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRTtJQUMzQyxjQUFjO0lBQ2QsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFFM0Msa0NBQWtDO0lBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBRVosZUFBZTtJQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkQsVUFBVSxFQUFFO1NBQ1osT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixP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QUFHLENBQUEsMEJBQTBCLENBQUM7Q0FDeEMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIsIFNZU1RFTV9PUkdfSUQsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogUGlwZWxpbmUgYnVpbGRlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgc3RvcmVkIGluIGRhdGFiYXNlLlxuICogTWlycm9ycyB0aGUgY2Fub25pY2FsIEJ1aWxkZXJQcm9wcyBmcm9tIHBpcGVsaW5lLWNvcmUgKEpTT04tc2VyaWFsaXphYmxlIGZvcm0pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQnVpbGRlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuICByZWFkb25seSBzeW50aDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHJvbGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgc3RhZ2VzPzogUGlwZWxpbmVTdGFnZUNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFN0YWdlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIGRhdGFiYXNlIChKU09OLXNlcmlhbGl6YWJsZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFnZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG59XG5cbi8qKlxuICogVGFibGUgZm9yIHN0b3JpbmcgcGlwZWxpbmUgaW5zdGFuY2VzIGFuZCB0aGVpciBmdWxsIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRmVhdHVyZXMgKiAtIEZ1bGwgQnVpbGRlclByb3BzIHNlcmlhbGl6YXRpb24gZm9yIHJlY29uc3RydWN0aW9uXG4gKiAtIE9yZ2FuaXphdGlvbi1sZXZlbCBpc29sYXRpb25cbiAqIC0gUGlwZWxpbmUgc3RhdHVzIHRyYWNraW5nXG4gKiAtIEV4ZWN1dGlvbiBoaXN0b3J5IHRyYWNraW5nXG4gKiAtIEZsZXhpYmxlIHRhZ2dpbmcgc3lzdGVtXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lc1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmUgPSBwZ1RhYmxlKCdwaXBlbGluZXMnLCB7XG4gIC8vIFByaW1hcnkga2V5XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG5cbiAgLy8gT3JnYW5pemF0aW9uIGFuZCBhY2Nlc3MgY29udHJvbFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBdWRpdCBmaWVsZHNcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBDb3JlIHBpcGVsaW5lIGluZm9ybWF0aW9uXG4gIHByb2plY3Q6IHZhcmNoYXIoJ3Byb2plY3QnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIGtleXdvcmRzOiBqc29uYigna2V5d29yZHMnKVxuICAgIC4kdHlwZTxzdHJpbmdbXT4oKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGlwZWxpbmUgY29uZmlndXJhdGlvblxuICBwcm9wczoganNvbmIoJ3Byb3BzJylcbiAgICAuJHR5cGU8UGlwZWxpbmVCdWlsZGVyQ29uZmlnPigpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcilcbiAgICAubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKVxuICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKVxuICAgIC5kZWZhdWx0KHRydWUpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBEZWxldGlvbiB0cmFja2luZyAoc29mdCBkZWxldGUpXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBJbmRleGVzIGZvciBjb21tb24gcXVlcmllc1xuICBwcm9qZWN0SWR4OiBpbmRleCgncGlwZWxpbmVfcHJvamVjdF9pZHgnKS5vbih0YWJsZS5wcm9qZWN0KSxcbiAgb3JnYW5pemF0aW9uSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnYW5pemF0aW9uX2lkeCcpLm9uKHRhYmxlLm9yZ2FuaXphdGlvbiksXG4gIG9yZ0lkSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgYWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLmlzQWN0aXZlKSxcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgncGlwZWxpbmVfY3JlYXRlZF9hdF9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQXQpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwaXBlbGluZV91cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBjb21tb24gYWNjZXNzIHBhdHRlcm4gKG9yZ0lkICsgaXNBY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGZpbHRlcmVkIHF1ZXJpZXMgKG9yZ0lkICsgYWNjZXNzTW9kaWZpZXIgKyBpc0FjdGl2ZSlcbiAgb3JnQWNjZXNzQWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2FjY2Vzc19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmFjY2Vzc01vZGlmaWVyLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gUGFydGlhbCBpbmRleCBmb3IgYWN0aXZlLW9ubHkgcXVlcmllcyAoc21hbGxlciwgZmFzdGVyIHRoYW4gZnVsbCBpbmRleClcbiAgYWN0aXZlT25seU9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX2FjdGl2ZV9vbmx5X29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KS53aGVyZShzcWxgaXNfYWN0aXZlID0gdHJ1ZWApLFxuXG4gIC8vIFVuaXF1ZSBjb25zdHJhaW50IG9uIHByb2plY3QgKyBvcmdhbml6YXRpb24gKyBvcmdJZFxuICBwcm9qZWN0T3JnVW5pcXVlOiB1bmlxdWVJbmRleCgncGlwZWxpbmVfcHJvamVjdF9vcmdfdW5pcXVlJylcbiAgICAub24odGFibGUucHJvamVjdCwgdGFibGUub3JnYW5pemF0aW9uLCB0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8qKlxuICogUGlwZWxpbmUgZGVwbG95bWVudCByZWdpc3RyeS5cbiAqIE1hcHMgZGVwbG95ZWQgQ29kZVBpcGVsaW5lIEFSTnMgYmFjayB0byBwaXBlbGluZSByZWNvcmRzIGFuZCBvcmcgSURzLlxuICogUG9wdWxhdGVkIGJ5IHRoZSBkZXBsb3kgY29tbWFuZCBhZnRlciBzdWNjZXNzZnVsIENESyBkZXBsb3kuXG4gKiBVc2VkIGJ5IHRoZSBwaXBlbGluZS1ldmVudHMgTGFtYmRhIHRvIHJlc29sdmUgRXZlbnRCcmlkZ2UgZXZlbnRzIHRvIG9yZy1zY29wZWQgcmVjb3Jkcy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lUmVnaXN0cnkgPSBwZ1RhYmxlKCdwaXBlbGluZV9yZWdpc3RyeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgLy8gVGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgcmVjb3JkIGlkIOKAlCBhIFNUQUJMRSB1dWlkIGNyZWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgLy8gcmVjb3JkLCBrbm93biBhdCBDREsgc3ludGgsIGFuZCBhcHBsaWVkIHRvIHRoZSBsaXZlIENvZGVQaXBlbGluZSBhcyB0aGVcbiAgLy8gYFBJUEVMSU5FX0VWRU5UX0lEYCB0YWcuIFRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoYXQgdGFnIGFuZCByZXBvcnRzXG4gIC8vIGFnYWluc3QgdGhpcyBpZCwgc28gaXQgSVMgdGhlIGV2ZW50IGpvaW4ga2V5IChyZXBsYWNpbmcgdGhlIG1hc2tlZCBBUk4g4oCUXG4gIC8vIGl0IGNhcnJpZXMgbm8gQVdTIGFjY291bnQvcmVnaW9uLCBzbyBubyBtYXNraW5nIGlzIG5lZWRlZCkuIFVuaXF1ZTogb25lXG4gIC8vIHJlZ2lzdHJ5IHJvdyBwZXIgcGlwZWxpbmUgKyB0aGUgdXBzZXJ0IGtleSBmb3IgKHJlKXJlZ2lzdHJhdGlvbi5cbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlZ2lvbjogdmFyY2hhcigncmVnaW9uJywgeyBsZW5ndGg6IDMwIH0pLFxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pLFxuICBsYXN0RGVwbG95ZWQ6IHRpbWVzdGFtcCgnbGFzdF9kZXBsb3llZCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdGFja05hbWU6IHZhcmNoYXIoJ3N0YWNrX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnSWRJZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBvcmdSZWdpb25JZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfcmVnaW9uX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5yZWdpb24pLFxufSkpO1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFNvdXJjZSA9ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcblxuLyoqXG4gKiBFdmVudCB0eXBlIGdyYW51bGFyaXR5IGxldmVscyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcblxuLyoqXG4gKiBQaXBlbGluZSBleGVjdXRpb24gYW5kIGJ1aWxkIGV2ZW50cy5cbiAqIENhcHR1cmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgc3RhdGUgY2hhbmdlcyBmcm9tIEV2ZW50QnJpZGdlXG4gKiBhbmQgcGx1Z2luIERvY2tlciBidWlsZCBvdXRjb21lcyBmcm9tIEJ1bGxNUS5cbiAqIEFsbCBldmVudHMgYXJlIG9yZy1zY29wZWQgZm9yIG11bHRpLXRlbmFudCByZXBvcnRpbmcuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX2V2ZW50c1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVFdmVudCA9IHBnVGFibGUoJ3BpcGVsaW5lX2V2ZW50cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBldmVudFNvdXJjZTogdmFyY2hhcignZXZlbnRfc291cmNlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50U291cmNlPigpLm5vdE51bGwoKSxcbiAgZXZlbnRUeXBlOiB2YXJjaGFyKCdldmVudF90eXBlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50VHlwZT4oKS5ub3ROdWxsKCksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHN0YWdlTmFtZTogdmFyY2hhcignc3RhZ2VfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGFjdGlvbk5hbWU6IHZhcmNoYXIoJ2FjdGlvbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXJyb3JNZXNzYWdlOiB0ZXh0KCdlcnJvcl9tZXNzYWdlJyksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkdXJhdGlvbk1zOiBpbnRlZ2VyKCdkdXJhdGlvbl9tcycpLFxuICBkZXRhaWw6IGpzb25iKCdkZXRhaWwnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwaXBlbGluZUlkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfaWRfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCksXG4gIG9yZ0lkSWR4OiBpbmRleCgnZXZlbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgZXZlbnRUeXBlSWR4OiBpbmRleCgnZXZlbnRfdHlwZV9pZHgnKS5vbih0YWJsZS5ldmVudFR5cGUpLFxuICBzdGF0dXNJZHg6IGluZGV4KCdldmVudF9zdGF0dXNfaWR4Jykub24odGFibGUuc3RhdHVzKSxcbiAgZXhlY3V0aW9uSWRJZHg6IGluZGV4KCdldmVudF9leGVjdXRpb25faWRfaWR4Jykub24odGFibGUuZXhlY3V0aW9uSWQpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdldmVudF9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1R5cGVDcmVhdGVkSWR4OiBpbmRleCgnZXZlbnRfb3JnX3R5cGVfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRUeXBlLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTb3VyY2VTdGF0dXNJZHg6IGluZGV4KCdldmVudF9vcmdfc291cmNlX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRTb3VyY2UsIHRhYmxlLnN0YXR1cyksXG4gIC8vIElkZW1wb3RlbmN5OiBFdmVudEJyaWRnZSDihpIgU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAvLyBjYW4gYmUgZGVsaXZlcmVkIHR3aWNlLiBUaGlzIHBhcnRpYWwgdW5pcXVlIGluZGV4IGRlZHVwcyByZS1kZWxpdmVyaWVzXG4gIC8vIChwYWlyZWQgd2l0aCBgb25Db25mbGljdERvTm90aGluZ2AgaW4gcmVwb3J0aW5nLXNlcnZpY2UuaW5nZXN0RXZlbnRzKS5cbiAgLy8gUGFydGlhbCAoZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMKSBiZWNhdXNlIHRoYXQncyB0aGUgbmF0dXJhbCBwZXItZXZlbnRcbiAgLy8ga2V5OyBldmVudHMgd2l0aG91dCBhbiBleGVjdXRpb25JZCAocmFyZSkgYXJlbid0IGRlZHVwZWQsIHdoaWNoIGlzIHNhZmUuXG4gIC8vIEluY2x1ZGVzIHBpcGVsaW5lX2lkIHNvIGEgKHRoZW9yZXRpY2FsKSBleGVjdXRpb24taWQgcmV1c2UgYWNyb3NzIHBpcGVsaW5lc1xuICAvLyBjYW4ndCBjb2xsaWRlIG5vdyB0aGF0IHRoZSBBUk4gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHJvdy5cbiAgLy9cbiAgLy8gQ09BTEVTQ0UgdGhlIG51bGxhYmxlIHBhcnRzIHRvIHNlbnRpbmVscyAoZXhwcmVzc2lvbiBpbmRleCk6IFBJUEVMSU5FL1NUQUdFL1xuICAvLyBCVUlMRCBldmVudHMgbGVhdmUgc3RhZ2VfbmFtZS9hY3Rpb25fbmFtZSBOVUxMIChwbHVnaW4tYnVpbGQgYWxzbyBwaXBlbGluZV9pZFxuICAvLyBOVUxMKSwgYW5kIFBvc3RncmVzIHRyZWF0cyBOVUxMcyBhcyBESVNUSU5DVCBpbiBhIHVuaXF1ZSBpbmRleCDigJQgc28gdGhlIHBsYWluXG4gIC8vIGNvbHVtbiBpbmRleCBuZXZlciBtYXRjaGVzIGZvciB0aG9zZSB0eXBlcyBhbmQgb25Db25mbGljdERvTm90aGluZyBjYW4ndCBkZWR1cFxuICAvLyB0aGVpciBhdC1sZWFzdC1vbmNlIHJlLWRlbGl2ZXJpZXMuIENvbGxhcHNpbmcgTlVMTOKGkicnIG1ha2VzIGVxdWFsIGV2ZW50cyBlcXVhbC5cbiAgLy8gKGRyaXp6bGUncyB1bmlxdWVJbmRleCBjYW4ndCBleHByZXNzIE5VTExTIE5PVCBESVNUSU5DVCBvbiBhIHBhcnRpYWwgaW5kZXgsIHNvXG4gIC8vIHdlIHVzZSB0aGUgZXF1aXZhbGVudCBleHByZXNzaW9uIGluZGV4LikgTUlHUkFUSU9OIFJFUVVJUkVEOiBkcml6emxlLWtpdCBnZW5lcmF0ZS5cbiAgZGVkdXBJZHg6IHVuaXF1ZUluZGV4KCdldmVudF9kZWR1cF9pZHgnKVxuICAgIC5vbihcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLnBpcGVsaW5lSWR9Ojp0ZXh0LCAnJylgLFxuICAgICAgdGFibGUuZXhlY3V0aW9uSWQsXG4gICAgICB0YWJsZS5ldmVudFR5cGUsXG4gICAgICB0YWJsZS5zdGF0dXMsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS5zdGFnZU5hbWV9LCAnJylgLFxuICAgICAgc3FsYGNvYWxlc2NlKCR7dGFibGUuYWN0aW9uTmFtZX0sICcnKWAsXG4gICAgKVxuICAgIC53aGVyZShzcWxgZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMYCksXG59KSk7XG5cbi8qKlxuICogVHlwZVNjcmlwdCB0eXBlcyByZXByZXNlbnRpbmcgZGF0YWJhc2Ugcm93c1xuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZSA9IHR5cGVvZiBwaXBlbGluZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUluc2VydCA9IHR5cGVvZiBwaXBlbGluZS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnkgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZVJlZ2lzdHJ5SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lUmVnaXN0cnkuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVFdmVudEluc2VydCA9IHR5cGVvZiBwaXBlbGluZUV2ZW50LiRpbmZlckluc2VydDtcblxuLyoqXG4gKiBIZWxwZXIgdHlwZXMgZm9yIHdvcmtpbmcgd2l0aCBwYXJ0aWFsIHVwZGF0ZXNcbiAqL1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVVcGRhdGUgPSBQYXJ0aWFsPE9taXQ8UGlwZWxpbmVJbnNlcnQsICdpZCcgfCAnY3JlYXRlZEF0JyB8ICdjcmVhdGVkQnknPj47XG4iXX0=
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YWJhc2Uvc2NoZW1hL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUEwQjNIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRTtJQUMzQyxjQUFjO0lBQ2QsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUU7SUFFM0Msa0NBQWtDO0lBQ2xDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3RDLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBRVosZUFBZTtJQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkQsVUFBVSxFQUFFO1NBQ1osT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixP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RixxRkFBcUY7SUFDckYsUUFBUSxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztTQUNyQyxFQUFFLENBQ0QsR0FBRyxDQUFBLFlBQVksS0FBSyxDQUFDLFVBQVUsYUFBYSxFQUM1QyxLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsU0FBUyxFQUNmLEtBQUssQ0FBQyxNQUFNLEVBQ1osR0FBRyxDQUFBLFlBQVksS0FBSyxDQUFDLFNBQVMsT0FBTyxFQUNyQyxHQUFHLENBQUEsWUFBWSxLQUFLLENBQUMsVUFBVSxPQUFPLENBQ3ZDO1NBQ0EsS0FBSyxDQUFDLEdBQUcsQ0FBQSwwQkFBMEIsQ0FBQztJQUN2Qyx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLDREQUE0RDtJQUM1RCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUM7U0FDbkQsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQ3ZELEtBQUssQ0FBQyxHQUFHLENBQUEseUJBQXlCLENBQUM7Q0FDdkMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWNjZXNzTW9kaWZpZXIsIFNZU1RFTV9PUkdfSUQsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4IH0gZnJvbSAnZHJpenpsZS1vcm0vcGctY29yZSc7XG5cbi8qKlxuICogUGlwZWxpbmUgYnVpbGRlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgc3RvcmVkIGluIGRhdGFiYXNlLlxuICogTWlycm9ycyB0aGUgY2Fub25pY2FsIEJ1aWxkZXJQcm9wcyBmcm9tIHBpcGVsaW5lLWNvcmUgKEpTT04tc2VyaWFsaXphYmxlIGZvcm0pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQnVpbGRlckNvbmZpZyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuICByZWFkb25seSBzeW50aDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHJvbGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgc3RhZ2VzPzogUGlwZWxpbmVTdGFnZUNvbmZpZ1tdO1xufVxuXG4vKipcbiAqIFN0YWdlIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIGRhdGFiYXNlIChKU09OLXNlcmlhbGl6YWJsZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVTdGFnZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG59XG5cbi8qKlxuICogVGFibGUgZm9yIHN0b3JpbmcgcGlwZWxpbmUgaW5zdGFuY2VzIGFuZCB0aGVpciBmdWxsIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRmVhdHVyZXMgKiAtIEZ1bGwgQnVpbGRlclByb3BzIHNlcmlhbGl6YXRpb24gZm9yIHJlY29uc3RydWN0aW9uXG4gKiAtIE9yZ2FuaXphdGlvbi1sZXZlbCBpc29sYXRpb25cbiAqIC0gUGlwZWxpbmUgc3RhdHVzIHRyYWNraW5nXG4gKiAtIEV4ZWN1dGlvbiBoaXN0b3J5IHRyYWNraW5nXG4gKiAtIEZsZXhpYmxlIHRhZ2dpbmcgc3lzdGVtXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lc1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmUgPSBwZ1RhYmxlKCdwaXBlbGluZXMnLCB7XG4gIC8vIFByaW1hcnkga2V5XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG5cbiAgLy8gT3JnYW5pemF0aW9uIGFuZCBhY2Nlc3MgY29udHJvbFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KVxuICAgIC5kZWZhdWx0KFNZU1RFTV9PUkdfSUQpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBdWRpdCBmaWVsZHNcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdChTWVNURU1fT1JHX0lEKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBDb3JlIHBpcGVsaW5lIGluZm9ybWF0aW9uXG4gIHByb2plY3Q6IHZhcmNoYXIoJ3Byb2plY3QnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZGVzY3JpcHRpb246IHRleHQoJ2Rlc2NyaXB0aW9uJyksXG4gIGtleXdvcmRzOiBqc29uYigna2V5d29yZHMnKVxuICAgIC4kdHlwZTxzdHJpbmdbXT4oKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGlwZWxpbmUgY29uZmlndXJhdGlvblxuICBwcm9wczoganNvbmIoJ3Byb3BzJylcbiAgICAuJHR5cGU8UGlwZWxpbmVCdWlsZGVyQ29uZmlnPigpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcilcbiAgICAubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKVxuICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKVxuICAgIC5kZWZhdWx0KHRydWUpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBEZWxldGlvbiB0cmFja2luZyAoc29mdCBkZWxldGUpXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBJbmRleGVzIGZvciBjb21tb24gcXVlcmllc1xuICBwcm9qZWN0SWR4OiBpbmRleCgncGlwZWxpbmVfcHJvamVjdF9pZHgnKS5vbih0YWJsZS5wcm9qZWN0KSxcbiAgb3JnYW5pemF0aW9uSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnYW5pemF0aW9uX2lkeCcpLm9uKHRhYmxlLm9yZ2FuaXphdGlvbiksXG4gIG9yZ0lkSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgYWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLmlzQWN0aXZlKSxcbiAgY3JlYXRlZEF0SWR4OiBpbmRleCgncGlwZWxpbmVfY3JlYXRlZF9hdF9pZHgnKS5vbih0YWJsZS5jcmVhdGVkQXQpLFxuICB1cGRhdGVkQXRJZHg6IGluZGV4KCdwaXBlbGluZV91cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBjb21tb24gYWNjZXNzIHBhdHRlcm4gKG9yZ0lkICsgaXNBY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ3BpcGVsaW5lX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGZpbHRlcmVkIHF1ZXJpZXMgKG9yZ0lkICsgYWNjZXNzTW9kaWZpZXIgKyBpc0FjdGl2ZSlcbiAgb3JnQWNjZXNzQWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2FjY2Vzc19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmFjY2Vzc01vZGlmaWVyLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gUGFydGlhbCBpbmRleCBmb3IgYWN0aXZlLW9ubHkgcXVlcmllcyAoc21hbGxlciwgZmFzdGVyIHRoYW4gZnVsbCBpbmRleClcbiAgYWN0aXZlT25seU9yZ0lkeDogaW5kZXgoJ3BpcGVsaW5lX2FjdGl2ZV9vbmx5X29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KS53aGVyZShzcWxgaXNfYWN0aXZlID0gdHJ1ZWApLFxuXG4gIC8vIFVuaXF1ZSBjb25zdHJhaW50IG9uIHByb2plY3QgKyBvcmdhbml6YXRpb24gKyBvcmdJZFxuICBwcm9qZWN0T3JnVW5pcXVlOiB1bmlxdWVJbmRleCgncGlwZWxpbmVfcHJvamVjdF9vcmdfdW5pcXVlJylcbiAgICAub24odGFibGUucHJvamVjdCwgdGFibGUub3JnYW5pemF0aW9uLCB0YWJsZS5vcmdJZCksXG59KSk7XG5cbi8qKlxuICogUGlwZWxpbmUgZGVwbG95bWVudCByZWdpc3RyeS5cbiAqIE1hcHMgZGVwbG95ZWQgQ29kZVBpcGVsaW5lIEFSTnMgYmFjayB0byBwaXBlbGluZSByZWNvcmRzIGFuZCBvcmcgSURzLlxuICogUG9wdWxhdGVkIGJ5IHRoZSBkZXBsb3kgY29tbWFuZCBhZnRlciBzdWNjZXNzZnVsIENESyBkZXBsb3kuXG4gKiBVc2VkIGJ5IHRoZSBwaXBlbGluZS1ldmVudHMgTGFtYmRhIHRvIHJlc29sdmUgRXZlbnRCcmlkZ2UgZXZlbnRzIHRvIG9yZy1zY29wZWQgcmVjb3Jkcy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfcmVnaXN0cnlcbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lUmVnaXN0cnkgPSBwZ1RhYmxlKCdwaXBlbGluZV9yZWdpc3RyeScsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgLy8gVGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgcmVjb3JkIGlkIOKAlCBhIFNUQUJMRSB1dWlkIGNyZWF0ZWQgd2l0aCB0aGUgcGlwZWxpbmVcbiAgLy8gcmVjb3JkLCBrbm93biBhdCBDREsgc3ludGgsIGFuZCBhcHBsaWVkIHRvIHRoZSBsaXZlIENvZGVQaXBlbGluZSBhcyB0aGVcbiAgLy8gYFBJUEVMSU5FX0VWRU5UX0lEYCB0YWcuIFRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoYXQgdGFnIGFuZCByZXBvcnRzXG4gIC8vIGFnYWluc3QgdGhpcyBpZCwgc28gaXQgSVMgdGhlIGV2ZW50IGpvaW4ga2V5IChyZXBsYWNpbmcgdGhlIG1hc2tlZCBBUk4g4oCUXG4gIC8vIGl0IGNhcnJpZXMgbm8gQVdTIGFjY291bnQvcmVnaW9uLCBzbyBubyBtYXNraW5nIGlzIG5lZWRlZCkuIFVuaXF1ZTogb25lXG4gIC8vIHJlZ2lzdHJ5IHJvdyBwZXIgcGlwZWxpbmUgKyB0aGUgdXBzZXJ0IGtleSBmb3IgKHJlKXJlZ2lzdHJhdGlvbi5cbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcGlwZWxpbmVOYW1lOiB2YXJjaGFyKCdwaXBlbGluZV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHJlZ2lvbjogdmFyY2hhcigncmVnaW9uJywgeyBsZW5ndGg6IDMwIH0pLFxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pLFxuICBsYXN0RGVwbG95ZWQ6IHRpbWVzdGFtcCgnbGFzdF9kZXBsb3llZCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdGFja05hbWU6IHZhcmNoYXIoJ3N0YWNrX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnSWRJZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBvcmdSZWdpb25JZHg6IGluZGV4KCdyZWdpc3RyeV9vcmdfcmVnaW9uX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5yZWdpb24pLFxufSkpO1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZGVudGlmaWVycyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFNvdXJjZSA9ICdjb2RlcGlwZWxpbmUnIHwgJ2NvZGVidWlsZCcgfCAncGx1Z2luLWJ1aWxkJztcblxuLyoqXG4gKiBFdmVudCB0eXBlIGdyYW51bGFyaXR5IGxldmVscyBmb3IgcGlwZWxpbmVfZXZlbnRzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSAnUElQRUxJTkUnIHwgJ1NUQUdFJyB8ICdBQ1RJT04nIHwgJ0JVSUxEJztcblxuLyoqXG4gKiBQaXBlbGluZSBleGVjdXRpb24gYW5kIGJ1aWxkIGV2ZW50cy5cbiAqIENhcHR1cmVzIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgc3RhdGUgY2hhbmdlcyBmcm9tIEV2ZW50QnJpZGdlXG4gKiBhbmQgcGx1Z2luIERvY2tlciBidWlsZCBvdXRjb21lcyBmcm9tIEJ1bGxNUS5cbiAqIEFsbCBldmVudHMgYXJlIG9yZy1zY29wZWQgZm9yIG11bHRpLXRlbmFudCByZXBvcnRpbmcuXG4gKlxuICogQHRhYmxlIHBpcGVsaW5lX2V2ZW50c1xuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVFdmVudCA9IHBnVGFibGUoJ3BpcGVsaW5lX2V2ZW50cycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgcGlwZWxpbmVJZDogdXVpZCgncGlwZWxpbmVfaWQnKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBldmVudFNvdXJjZTogdmFyY2hhcignZXZlbnRfc291cmNlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50U291cmNlPigpLm5vdE51bGwoKSxcbiAgZXZlbnRUeXBlOiB2YXJjaGFyKCdldmVudF90eXBlJywgeyBsZW5ndGg6IDUwIH0pLiR0eXBlPEV2ZW50VHlwZT4oKS5ub3ROdWxsKCksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHN0YWdlTmFtZTogdmFyY2hhcignc3RhZ2VfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGFjdGlvbk5hbWU6IHZhcmNoYXIoJ2FjdGlvbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXJyb3JNZXNzYWdlOiB0ZXh0KCdlcnJvcl9tZXNzYWdlJyksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkdXJhdGlvbk1zOiBpbnRlZ2VyKCdkdXJhdGlvbl9tcycpLFxuICAvLyBET1JBIGRlcGxveS1hdHRyaWJ1dGlvbiAoYWxsIG51bGxhYmxlOyBwb3B1bGF0ZWQgYXQgaW5nZXN0IHdoZW4gdGhlIHNvdXJjZVxuICAvLyBldmVudCBjYXJyaWVzIHRoZW0g4oCUIGxlZ2FjeS9DSS1vbmx5IGV2ZW50cyBsZWF2ZSB0aGVtIE5VTEwpLiBgZW52aXJvbm1lbnRgXG4gIC8vIGlzIHRoZSBkZXBsb3kgdGFyZ2V0IChlLmcuIFwicHJvZHVjdGlvblwiKTsgaXRzIHByZXNlbmNlIG1hcmtzIGFuIGV4ZWN1dGlvblxuICAvLyBhcyBhIHJlYWwgZGVwbG95bWVudCwgbGV0dGluZyBET1JBIHNjb3BlIHBhc3QgZ2VuZXJpYyBwaXBlbGluZSBydW5zLlxuICAvLyBgY29tbWl0U2hhYC9gY29tbWl0UmVmYCBjYXB0dXJlIHRoZSBzb3VyY2UgcmV2aXNpb24gZm9yIGxlYWQtdGltZSB3b3JrLlxuICBjb21taXRTaGE6IHZhcmNoYXIoJ2NvbW1pdF9zaGEnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjb21taXRSZWY6IHZhcmNoYXIoJ2NvbW1pdF9yZWYnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBlbnZpcm9ubWVudDogdmFyY2hhcignZW52aXJvbm1lbnQnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBkZXRhaWw6IGpzb25iKCdkZXRhaWwnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwaXBlbGluZUlkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfaWRfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCksXG4gIG9yZ0lkSWR4OiBpbmRleCgnZXZlbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgZXZlbnRUeXBlSWR4OiBpbmRleCgnZXZlbnRfdHlwZV9pZHgnKS5vbih0YWJsZS5ldmVudFR5cGUpLFxuICBzdGF0dXNJZHg6IGluZGV4KCdldmVudF9zdGF0dXNfaWR4Jykub24odGFibGUuc3RhdHVzKSxcbiAgZXhlY3V0aW9uSWRJZHg6IGluZGV4KCdldmVudF9leGVjdXRpb25faWRfaWR4Jykub24odGFibGUuZXhlY3V0aW9uSWQpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdldmVudF9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1R5cGVDcmVhdGVkSWR4OiBpbmRleCgnZXZlbnRfb3JnX3R5cGVfY3JlYXRlZF9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRUeXBlLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTb3VyY2VTdGF0dXNJZHg6IGluZGV4KCdldmVudF9vcmdfc291cmNlX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuZXZlbnRTb3VyY2UsIHRhYmxlLnN0YXR1cyksXG4gIC8vIElkZW1wb3RlbmN5OiBFdmVudEJyaWRnZSDihpIgU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAvLyBjYW4gYmUgZGVsaXZlcmVkIHR3aWNlLiBUaGlzIHBhcnRpYWwgdW5pcXVlIGluZGV4IGRlZHVwcyByZS1kZWxpdmVyaWVzXG4gIC8vIChwYWlyZWQgd2l0aCBgb25Db25mbGljdERvTm90aGluZ2AgaW4gcmVwb3J0aW5nLXNlcnZpY2UuaW5nZXN0RXZlbnRzKS5cbiAgLy8gUGFydGlhbCAoZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMKSBiZWNhdXNlIHRoYXQncyB0aGUgbmF0dXJhbCBwZXItZXZlbnRcbiAgLy8ga2V5OyBldmVudHMgd2l0aG91dCBhbiBleGVjdXRpb25JZCAocmFyZSkgYXJlbid0IGRlZHVwZWQsIHdoaWNoIGlzIHNhZmUuXG4gIC8vIEluY2x1ZGVzIHBpcGVsaW5lX2lkIHNvIGEgKHRoZW9yZXRpY2FsKSBleGVjdXRpb24taWQgcmV1c2UgYWNyb3NzIHBpcGVsaW5lc1xuICAvLyBjYW4ndCBjb2xsaWRlIG5vdyB0aGF0IHRoZSBBUk4gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHJvdy5cbiAgLy9cbiAgLy8gQ09BTEVTQ0UgdGhlIG51bGxhYmxlIHBhcnRzIHRvIHNlbnRpbmVscyAoZXhwcmVzc2lvbiBpbmRleCk6IFBJUEVMSU5FL1NUQUdFL1xuICAvLyBCVUlMRCBldmVudHMgbGVhdmUgc3RhZ2VfbmFtZS9hY3Rpb25fbmFtZSBOVUxMIChwbHVnaW4tYnVpbGQgYWxzbyBwaXBlbGluZV9pZFxuICAvLyBOVUxMKSwgYW5kIFBvc3RncmVzIHRyZWF0cyBOVUxMcyBhcyBESVNUSU5DVCBpbiBhIHVuaXF1ZSBpbmRleCDigJQgc28gdGhlIHBsYWluXG4gIC8vIGNvbHVtbiBpbmRleCBuZXZlciBtYXRjaGVzIGZvciB0aG9zZSB0eXBlcyBhbmQgb25Db25mbGljdERvTm90aGluZyBjYW4ndCBkZWR1cFxuICAvLyB0aGVpciBhdC1sZWFzdC1vbmNlIHJlLWRlbGl2ZXJpZXMuIENvbGxhcHNpbmcgTlVMTOKGkicnIG1ha2VzIGVxdWFsIGV2ZW50cyBlcXVhbC5cbiAgLy8gKGRyaXp6bGUncyB1bmlxdWVJbmRleCBjYW4ndCBleHByZXNzIE5VTExTIE5PVCBESVNUSU5DVCBvbiBhIHBhcnRpYWwgaW5kZXgsIHNvXG4gIC8vIHdlIHVzZSB0aGUgZXF1aXZhbGVudCBleHByZXNzaW9uIGluZGV4LikgTUlHUkFUSU9OIFJFUVVJUkVEOiBkcml6emxlLWtpdCBnZW5lcmF0ZS5cbiAgZGVkdXBJZHg6IHVuaXF1ZUluZGV4KCdldmVudF9kZWR1cF9pZHgnKVxuICAgIC5vbihcbiAgICAgIHNxbGBjb2FsZXNjZSgke3RhYmxlLnBpcGVsaW5lSWR9Ojp0ZXh0LCAnJylgLFxuICAgICAgdGFibGUuZXhlY3V0aW9uSWQsXG4gICAgICB0YWJsZS5ldmVudFR5cGUsXG4gICAgICB0YWJsZS5zdGF0dXMsXG4gICAgICBzcWxgY29hbGVzY2UoJHt0YWJsZS5zdGFnZU5hbWV9LCAnJylgLFxuICAgICAgc3FsYGNvYWxlc2NlKCR7dGFibGUuYWN0aW9uTmFtZX0sICcnKWAsXG4gICAgKVxuICAgIC53aGVyZShzcWxgZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMYCksXG4gIC8vIERPUkEgZGVwbG95LXNjb3BlZCByZWFkczogb25seSBQSVBFTElORS1sZXZlbCBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGFcbiAgLy8gZGVwbG95IGVudmlyb25tZW50LiBgZXZlbnRfdHlwZWAgaXMgaW4gdGhlIGluZGV4IGJlY2F1c2UgdGhlIGV2ZW50cyBMYW1iZGFcbiAgLy8gdGFncyBFVkVSWSBldmVudCBvZiBhIGRlcGxveWVkIHBpcGVsaW5lIChTVEFHRS9BQ1RJT04gdG9vKSwgd2hpbGUgdGhlIERPUkFcbiAgLy8gc2NhbiB3YW50cyBvbmx5IGBldmVudF90eXBlPSdQSVBFTElORSdgIOKAlCBpbmNsdWRpbmcgaXQgcmVzdG9yZXMgc2VsZWN0aXZpdHkuXG4gIC8vIFBhcnRpYWwgKGVudmlyb25tZW50IElTIE5PVCBOVUxMKSBrZWVwcyBpdCBzbWFsbCDigJQgbGVnYWN5L0NJLW9ubHkgZXZlbnRzXG4gIC8vIGFyZW4ndCBpbmRleGVkLiBNSUdSQVRJT04gUkVRVUlSRUQ6IGRyaXp6bGUta2l0IGdlbmVyYXRlLlxuICBlbnZUeXBlU3RhcnRlZElkeDogaW5kZXgoJ2V2ZW50X2Vudl90eXBlX3N0YXJ0ZWRfaWR4JylcbiAgICAub24odGFibGUuZW52aXJvbm1lbnQsIHRhYmxlLmV2ZW50VHlwZSwgdGFibGUuc3RhcnRlZEF0KVxuICAgIC53aGVyZShzcWxgZW52aXJvbm1lbnQgSVMgTk9UIE5VTExgKSxcbn0pKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IHR5cGVzIHJlcHJlc2VudGluZyBkYXRhYmFzZSByb3dzXG4gKi9cbmV4cG9ydCB0eXBlIFBpcGVsaW5lID0gdHlwZW9mIHBpcGVsaW5lLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lSW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmVSZWdpc3RyeSA9IHR5cGVvZiBwaXBlbGluZVJlZ2lzdHJ5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnlJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lRXZlbnQgPSB0eXBlb2YgcGlwZWxpbmVFdmVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlcyBmb3Igd29ya2luZyB3aXRoIHBhcnRpYWwgdXBkYXRlc1xuICovXG5leHBvcnQgdHlwZSBQaXBlbGluZVVwZGF0ZSA9IFBhcnRpYWw8T21pdDxQaXBlbGluZUluc2VydCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ2NyZWF0ZWRCeSc+PjtcbiJdfQ==
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "dependencies": {
25
25
  "drizzle-orm": "0.45.2",
26
26
  "pg": "8.22.0",
27
- "@pipeline-builder/api-core": "3.4.91"
27
+ "@pipeline-builder/api-core": "3.4.93"
28
28
  },
29
29
  "keywords": [
30
30
  "ci-cd",
@@ -80,7 +80,7 @@
80
80
  "access": "public",
81
81
  "registry": "https://registry.npmjs.org/"
82
82
  },
83
- "version": "3.4.94",
83
+ "version": "3.4.96",
84
84
  "bugs": {
85
85
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
86
86
  },