@pipeline-builder/pipeline-data 4.1.24 → 4.1.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/lib/api/alert-destinations.d.ts +17 -0
  2. package/lib/api/alert-destinations.js +36 -0
  3. package/lib/api/reporting/analytics-queries.d.ts +274 -0
  4. package/lib/api/reporting/analytics-queries.js +598 -0
  5. package/lib/api/reporting/daily-rollup.d.ts +41 -0
  6. package/lib/api/reporting/daily-rollup.js +173 -0
  7. package/lib/api/reporting/deploy-rollup.d.ts +78 -0
  8. package/lib/api/reporting/deploy-rollup.js +203 -0
  9. package/lib/api/reporting/dora-scoring.d.ts +14 -0
  10. package/lib/api/reporting/dora-scoring.js +25 -1
  11. package/lib/api/reporting/dora.js +30 -6
  12. package/lib/api/reporting/failure-classifier.d.ts +54 -0
  13. package/lib/api/reporting/failure-classifier.js +179 -0
  14. package/lib/api/reporting/ingest.d.ts +2 -2
  15. package/lib/api/reporting/ingest.js +129 -4
  16. package/lib/api/reporting/last-deploy.d.ts +31 -0
  17. package/lib/api/reporting/last-deploy.js +93 -0
  18. package/lib/api/reporting/needs-attention.d.ts +93 -0
  19. package/lib/api/reporting/needs-attention.js +152 -0
  20. package/lib/api/reporting/plugin-exposure.d.ts +129 -0
  21. package/lib/api/reporting/plugin-exposure.js +312 -0
  22. package/lib/api/reporting/retention-sweep.js +9 -1
  23. package/lib/api/reporting/sql-helpers.d.ts +35 -2
  24. package/lib/api/reporting/sql-helpers.js +39 -1
  25. package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
  26. package/lib/api/reporting/stakeholder/compose.js +234 -0
  27. package/lib/api/reporting/stakeholder/index.d.ts +14 -0
  28. package/lib/api/reporting/stakeholder/index.js +17 -0
  29. package/lib/api/reporting/stakeholder/period.d.ts +102 -0
  30. package/lib/api/reporting/stakeholder/period.js +273 -0
  31. package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
  32. package/lib/api/reporting/stakeholder/report-html.js +208 -0
  33. package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
  34. package/lib/api/reporting/stakeholder/sections.js +249 -0
  35. package/lib/api/reporting/stakeholder/store.d.ts +450 -0
  36. package/lib/api/reporting/stakeholder/store.js +981 -0
  37. package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
  38. package/lib/api/reporting/stakeholder/templates.js +104 -0
  39. package/lib/api/reporting/types.d.ts +73 -0
  40. package/lib/api/reporting/types.js +1 -1
  41. package/lib/api/reporting-service.d.ts +94 -5
  42. package/lib/api/reporting-service.js +169 -10
  43. package/lib/api/soft-delete-sweep.d.ts +11 -2
  44. package/lib/api/soft-delete-sweep.js +17 -6
  45. package/lib/database/drizzle-schema.d.ts +2263 -385
  46. package/lib/database/drizzle-schema.js +18 -7
  47. package/lib/database/index.d.ts +1 -1
  48. package/lib/database/index.js +4 -2
  49. package/lib/database/schema/compliance.d.ts +0 -682
  50. package/lib/database/schema/compliance.js +6 -66
  51. package/lib/database/schema/ecosystem.d.ts +20 -157
  52. package/lib/database/schema/ecosystem.js +23 -16
  53. package/lib/database/schema/pipeline.d.ts +200 -0
  54. package/lib/database/schema/pipeline.js +100 -1
  55. package/lib/database/schema/plugin.d.ts +20 -1
  56. package/lib/database/schema/plugin.js +13 -1
  57. package/lib/database/schema/reporting-analytics.d.ts +1212 -0
  58. package/lib/database/schema/reporting-analytics.js +250 -0
  59. package/lib/database/schema/reporting-stakeholder.d.ts +1405 -0
  60. package/lib/database/schema/reporting-stakeholder.js +251 -0
  61. package/lib/index.d.ts +10 -1
  62. package/lib/index.js +15 -1
  63. package/lib/testing/exports.json +67 -4
  64. package/package.json +4 -3
@@ -7,16 +7,19 @@ import { schema } from '../database/drizzle-schema.js';
7
7
  import { withTenantTx, runWithTenantContext } from '../database/tenancy.js';
8
8
  // Extracted for size — see ./reporting/. Everything public is re-exported below
9
9
  // so `@pipeline-builder/pipeline-data`'s surface is unchanged by the split.
10
+ import { getAdoption, getFailureAnalysis, getOutdatedPlugins, getPipelineBreakdown, getPipelineConfigChanges, getPipelineStreaks, getPluginVulnerabilities, getPromotionView, getResourceConsumption, getStagePerformance, getUntrackedPipelines, getVulnerablePipelines, } from './reporting/analytics-queries.js';
10
11
  import { inventoryCache, invalidateOrgReports } from './reporting/caches.js';
11
12
  import { DORA_INCIDENT_WINDOW_HOURS, resolveIncidentWindowHours } from './reporting/dora-scoring.js';
12
13
  import { getDoraMetrics as doraMetrics, getDoraTrend as doraTrend, getBuildHealth as buildHealth, } from './reporting/dora.js';
13
14
  // Aliased: the module functions and the delegating methods below share names.
14
15
  import { ingestEvents as ingest } from './reporting/ingest.js';
16
+ import { getLastDeployedCommit as lastDeployedCommit } from './reporting/last-deploy.js';
17
+ import { evaluateNeedsAttention, thresholdsFrom } from './reporting/needs-attention.js';
15
18
  import { getPluginRuntime as pluginRuntime, getPluginRuntimeAggregate as pluginRuntimeAggregate, hasVerifiedPluginUse as verifiedPluginUse, } from './reporting/plugin-runtime.js';
16
19
  import { report } from './reporting/query-scope.js';
17
20
  import { purgeExpiredReportingData as purgeReportingRetention } from './reporting/retention-sweep.js';
18
21
  import { REPORTING_EVENT_RETENTION_DAYS, REPORTING_DORA_RETENTION_DAYS } from './reporting/retention.js';
19
- import { assertReportInterval, scrubOptional, optionalStartedAtRange, startedAtWindow } from './reporting/sql-helpers.js';
22
+ import { assertReportInterval, bucketKey, periodBucket, scrubOptional, optionalStartedAtRange, startedAtWindow } from './reporting/sql-helpers.js';
20
23
  const logger = createLogger('reporting-service');
21
24
  export class ReportingService {
22
25
  /** Invalidate all cached reports for an org (call after event ingest). */
@@ -29,8 +32,17 @@ export class ReportingService {
29
32
  * See ./reporting/ingest.ts — the caller must already hold a sysadmin
30
33
  * tenant scope, because a batch spans whatever orgs the registry resolves to.
31
34
  */
32
- async ingestEvents(events, onMetric) {
33
- return ingest(events, onMetric);
35
+ async ingestEvents(events, onMetric, caller) {
36
+ return ingest(events, onMetric, caller);
37
+ }
38
+ /**
39
+ * The commit sha of this pipeline's last successful deploy — to `environment`
40
+ * when given, to anywhere otherwise. The exclusive lower bound for "commits
41
+ * since the last deploy". Tenancy is enforced from `caller` exactly as
42
+ * {@link ingestEvents} does it.
43
+ */
44
+ async getLastDeployedCommit(pipelineId, environment, caller) {
45
+ return lastDeployedCommit(pipelineId, environment, caller);
34
46
  }
35
47
  // ── Category 1: Pipeline Execution & Performance ──
36
48
  /** Execution count per pipeline with status breakdown. */
@@ -102,11 +114,14 @@ export class ReportingService {
102
114
  `);
103
115
  }
104
116
  /** Success rate over time for an org. */
105
- async getSuccessRate(orgId, interval, from, to, orgIds) {
117
+ async getSuccessRate(orgId, interval, from, to, orgIds, bucket = {}) {
106
118
  assertReportInterval(interval);
107
- return report(`success-rate:${interval}:${from}:${to}`, orgId, orgIds, (pred) => sql `
119
+ const { tz = 'UTC', weekStart = 'monday' } = bucket;
120
+ // The bucketing settings are part of the cache KEY: without them a Chicago
121
+ // request and a UTC request share an entry and one of them gets the other's weeks.
122
+ return report(`success-rate:${interval}:${from}:${to}:${bucketKey(tz, weekStart)}`, orgId, orgIds, (pred) => sql `
108
123
  SELECT
109
- DATE_TRUNC(${interval}, e.started_at)::text AS period,
124
+ ${periodBucket(interval, sql `e.started_at`, tz, weekStart)}::text AS period,
110
125
  COUNT(*) FILTER (WHERE e.status = 'SUCCEEDED')::int AS succeeded,
111
126
  COUNT(*) FILTER (WHERE e.status = 'FAILED')::int AS failed,
112
127
  COUNT(*) FILTER (WHERE e.status = 'CANCELED')::int AS canceled,
@@ -310,14 +325,15 @@ export class ReportingService {
310
325
  * SHOULD enum these per-eventSource so we catch drift at ingest rather
311
326
  * than silently producing zero rows here. See findings N71.
312
327
  */
313
- async getBuildSuccessRate(orgId, interval, from, to, orgIds) {
328
+ async getBuildSuccessRate(orgId, interval, from, to, orgIds, bucket = {}) {
314
329
  assertReportInterval(interval);
330
+ const { tz = 'UTC', weekStart = 'monday' } = bucket;
315
331
  // Build activity report — rollup-aware like the execution reports. These
316
332
  // rows are gated on the pipeline_event `org_id` directly (no pipeline join),
317
333
  // so `pred` applies to `e.org_id`.
318
- return report(`build-success:${interval}:${from}:${to}`, orgId, orgIds, (pred) => sql `
334
+ return report(`build-success:${interval}:${from}:${to}:${bucketKey(tz, weekStart)}`, orgId, orgIds, (pred) => sql `
319
335
  SELECT
320
- DATE_TRUNC(${interval}, e.started_at)::text AS period,
336
+ ${periodBucket(interval, sql `e.started_at`, tz, weekStart)}::text AS period,
321
337
  COUNT(*) FILTER (WHERE e.status = 'completed')::int AS succeeded,
322
338
  COUNT(*) FILTER (WHERE e.status = 'failed')::int AS failed,
323
339
  ROUND(COUNT(*) FILTER (WHERE e.status = 'completed')::numeric
@@ -663,6 +679,149 @@ export class ReportingService {
663
679
  async purgeExpiredReportingData(opts = {}) {
664
680
  return purgeReportingRetention(opts);
665
681
  }
682
+ // ── Category 5: the ANALYTICS reads ──────────────────────────────────────
683
+ //
684
+ // Thin delegations to ./reporting/analytics-queries.ts, so `reportingService`
685
+ // satisfies the report engine's `SectionDataSource` in full and a section never
686
+ // reaches past the service for its data. Every one of these reads a
687
+ // pre-aggregated table (`execution_daily_rollups`, `dora_deployments`,
688
+ // `pipeline_plugin_resolution`, `plugin_vuln_exposure`) rather than raw events —
689
+ // which is what makes a quarterly report affordable AND what makes it still
690
+ // answerable after retention has swept the events it came from.
691
+ /** Per-pipeline delivery, worst first. */
692
+ async getPipelineBreakdown(scope, limit = 10) {
693
+ return getPipelineBreakdown(scope, limit);
694
+ }
695
+ /** Failures by category, with the previous period's counts for the trend. */
696
+ async getFailureAnalysis(scope, previous) {
697
+ return getFailureAnalysis(scope, previous);
698
+ }
699
+ /** Per-stage timings for one pipeline, slowest first. */
700
+ async getStagePerformance(scope, pipelineId, previous) {
701
+ return getStagePerformance(scope, pipelineId, previous);
702
+ }
703
+ /** Build time by project and pipeline. Seconds, never money. */
704
+ async getResourceConsumption(scope, limit = 20) {
705
+ return getResourceConsumption(scope, limit);
706
+ }
707
+ /** Each commit's path across environments, and which ones stopped short. */
708
+ async getPromotionView(scope, productionEnv = 'production', limit = 25) {
709
+ return getPromotionView(scope, productionEnv, limit);
710
+ }
711
+ /** Pipelines behind on a plugin, worst gap first (the DECLARED side). */
712
+ async getOutdatedPlugins(scope, limit = 50) {
713
+ return getOutdatedPlugins(scope, limit);
714
+ }
715
+ /** Open plugin vulnerabilities per pipeline (says declared vs deployed). */
716
+ async getPluginVulnerabilities(scope, limit = 50) {
717
+ return getPluginVulnerabilities(scope, limit);
718
+ }
719
+ /** Adoption, creation source, and the deploy-tracking coverage denominator. */
720
+ async getAdoption(scope, timeSavedMinutes) {
721
+ return getAdoption(scope, timeSavedMinutes ?? (await this.timeSavedAssumption(scope.orgId)));
722
+ }
723
+ /**
724
+ * The needs-attention findings for the period.
725
+ *
726
+ * Assembled HERE rather than in the section, because the rules need six reads that
727
+ * must all describe the same window: this period's breakdown, the previous one's,
728
+ * failure streaks, config-change times, pipelines with an open Critical, and
729
+ * pipelines DORA cannot see. A section that fetched them itself would be the only
730
+ * place in the report where the window could drift between panels.
731
+ *
732
+ * Every input except the current breakdown is OPTIONAL to the evaluator, and each
733
+ * one's failure is absorbed: a rule with no data to run on is skipped, which is
734
+ * why one unavailable read costs one finding rather than the whole section. The
735
+ * alternative — a section that fails because the streak query timed out — replaces
736
+ * six findings with none.
737
+ */
738
+ async getNeedsAttention(scope, previous) {
739
+ const current = await getPipelineBreakdown(scope, ATTENTION_PIPELINE_LIMIT);
740
+ const prior = previous
741
+ ? await soften(getPipelineBreakdown({ ...scope, ...previous }, ATTENTION_PIPELINE_LIMIT), [])
742
+ : [];
743
+ const [streakRows, configChanges, vulnerable, untracked, thresholds] = await Promise.all([
744
+ soften(getPipelineStreaks(scope), []),
745
+ soften(getPipelineConfigChanges(scope), new Map()),
746
+ soften(getVulnerablePipelines(scope), []),
747
+ soften(getUntrackedPipelines(scope), []),
748
+ soften(this.attentionThresholds(scope.orgId), {}),
749
+ ]);
750
+ const items = evaluateNeedsAttention({
751
+ current,
752
+ previous: prior,
753
+ streaks: new Map(streakRows.map((r) => [r.pipelineId, {
754
+ consecutiveFailures: r.consecutiveFailures,
755
+ lastSuccessAt: r.lastSuccessAt,
756
+ }])),
757
+ configChanges,
758
+ vulnerablePipelines: new Set(vulnerable),
759
+ untrackedPipelines: new Set(untracked),
760
+ thresholds: thresholdsFrom(thresholds),
761
+ now: new Date(scope.to),
762
+ });
763
+ return {
764
+ items,
765
+ thresholds: thresholdsFrom(thresholds),
766
+ // What the rules were evaluated over, so a reader can tell an empty list
767
+ // ("nothing tripped") from an empty input ("nothing ran").
768
+ pipelinesEvaluated: current.length,
769
+ };
770
+ }
771
+ /**
772
+ * The org's stored needs-attention thresholds, or `{}`.
773
+ *
774
+ * Returned as a partial on purpose: `thresholdsFrom` fills the rest per field, so
775
+ * an org that configured one number keeps the defaults for the others instead of
776
+ * silently disabling four rules by setting one.
777
+ */
778
+ async attentionThresholds(orgId) {
779
+ const rows = await runWithTenantContext({ orgId, isSuperAdmin: false }, () => withTenantTx((tx) => tx.select({ t: schema.doraSettings.reportAttentionThresholds })
780
+ .from(schema.doraSettings)
781
+ .where(eq(schema.doraSettings.orgId, orgId))
782
+ .limit(1)));
783
+ const stored = rows[0]?.t;
784
+ return stored && typeof stored === 'object' ? stored : {};
785
+ }
786
+ /**
787
+ * The org's own minutes-saved-per-pipeline assumption, or null.
788
+ *
789
+ * Read here so the adoption section cannot accidentally be handed a
790
+ * platform-chosen default: the number only means something when the customer
791
+ * picked it, and `null` renders as "not estimated" rather than as zero.
792
+ */
793
+ async timeSavedAssumption(orgId) {
794
+ const rows = await runWithTenantContext({ orgId, isSuperAdmin: false }, () => withTenantTx((tx) => tx.select({ minutes: schema.doraSettings.timeSavedMinutesPerPipeline })
795
+ .from(schema.doraSettings)
796
+ .where(eq(schema.doraSettings.orgId, orgId))
797
+ .limit(1)));
798
+ return rows[0]?.minutes ?? null;
799
+ }
800
+ }
801
+ /**
802
+ * How many pipelines the needs-attention rules consider.
803
+ *
804
+ * The section is a short list of things to do, not a table of everything, so the
805
+ * evaluator sees the same worst-first slice the breakdown section shows. A pipeline
806
+ * outside the worst 25 by the breakdown's own ordering is not the one a lead should
807
+ * be told about first.
808
+ */
809
+ const ATTENTION_PIPELINE_LIMIT = 25;
810
+ /**
811
+ * Run a read, or fall back.
812
+ *
813
+ * Only for the needs-attention inputs, where an absent input SKIPS a rule and the
814
+ * evaluator says so. Never used for a number the report presents: a query that fails
815
+ * and silently reads as zero is how a report states something false.
816
+ */
817
+ async function soften(p, fallback) {
818
+ try {
819
+ return await p;
820
+ }
821
+ catch (err) {
822
+ logger.warn('Needs-attention input unavailable; its rule is skipped', { error: errorMessage(err) });
823
+ return fallback;
824
+ }
666
825
  }
667
826
  export const reportingService = new ReportingService();
668
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEgsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUNMLGNBQWMsSUFBSSxXQUFXLEVBQzdCLFlBQVksSUFBSSxTQUFTLEVBQ3pCLGNBQWMsSUFBSSxXQUFXLEdBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxZQUFZLElBQUksTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUNMLGdCQUFnQixJQUFJLGFBQWEsRUFDakMseUJBQXlCLElBQUksc0JBQXNCLEVBQ25ELG9CQUFvQixJQUFJLGlCQUFpQixHQUMxQyxNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUseUJBQXlCLElBQUks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ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgaXNvT3JOdWxsLCBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGVxLCBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4vY3J1ZC1zZXJ2aWNlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuLy8gRXh0cmFjdGVkIGZvciBzaXplIOKAlCBzZWUgLi9yZXBvcnRpbmcvLiBFdmVyeXRoaW5nIHB1YmxpYyBpcyByZS1leHBvcnRlZCBiZWxvd1xuLy8gc28gYEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFgJ3Mgc3VyZmFjZSBpcyB1bmNoYW5nZWQgYnkgdGhlIHNwbGl0LlxuaW1wb3J0IHsgaW52ZW50b3J5Q2FjaGUsIGludmFsaWRhdGVPcmdSZXBvcnRzIH0gZnJvbSAnLi9yZXBvcnRpbmcvY2FjaGVzLmpzJztcbmltcG9ydCB7IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyB9IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQge1xuICBnZXREb3JhTWV0cmljcyBhcyBkb3JhTWV0cmljcyxcbiAgZ2V0RG9yYVRyZW5kIGFzIGRvcmFUcmVuZCxcbiAgZ2V0QnVpbGRIZWFsdGggYXMgYnVpbGRIZWFsdGgsXG59IGZyb20gJy4vcmVwb3J0aW5nL2RvcmEuanMnO1xuLy8gQWxpYXNlZDogdGhlIG1vZHVsZSBmdW5jdGlvbnMgYW5kIHRoZSBkZWxlZ2F0aW5nIG1ldGhvZHMgYmVsb3cgc2hhcmUgbmFtZXMuXG5pbXBvcnQgeyBpbmdlc3RFdmVudHMgYXMgaW5nZXN0IH0gZnJvbSAnLi9yZXBvcnRpbmcvaW5nZXN0LmpzJztcbmltcG9ydCB7XG4gIGdldFBsdWdpblJ1bnRpbWUgYXMgcGx1Z2luUnVudGltZSxcbiAgZ2V0UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSBhcyBwbHVnaW5SdW50aW1lQWdncmVnYXRlLFxuICBoYXNWZXJpZmllZFBsdWdpblVzZSBhcyB2ZXJpZmllZFBsdWdpblVzZSxcbn0gZnJvbSAnLi9yZXBvcnRpbmcvcGx1Z2luLXJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgcmVwb3J0IH0gZnJvbSAnLi9yZXBvcnRpbmcvcXVlcnktc2NvcGUuanMnO1xuaW1wb3J0IHsgcHVyZ2VFeHBpcmVkUmVwb3J0aW5nRGF0YSBhcyBwdXJnZVJlcG9ydGluZ1JldGVudGlvbiB9IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi1zd2VlcC5qcyc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfRVZFTlRfUkVURU5USU9OX0RBWVMsIFJFUE9SVElOR19ET1JBX1JFVEVOVElPTl9EQVlTIH0gZnJvbSAnLi9yZXBvcnRpbmcvcmV0ZW50aW9uLmpzJztcbmltcG9ydCB7IGFzc2VydFJlcG9ydEludGVydmFsLCBzY3J1Yk9wdGlvbmFsLCBvcHRpb25hbFN0YXJ0ZWRBdFJhbmdlLCBzdGFydGVkQXRXaW5kb3cgfSBmcm9tICcuL3JlcG9ydGluZy9zcWwtaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4ZWN1dGlvbkNvdW50LCBUaW1lU2VyaWVzRW50cnksIER1cmF0aW9uU3RhdHMsIFBpcGVsaW5lRXhlY3V0aW9uLCBTdGFnZUZhaWx1cmUsIFN0YWdlQm90dGxlbmVjayxcbiAgQWN0aW9uRmFpbHVyZSwgRXJyb3JFbnRyeSwgUGx1Z2luU3VtbWFyeSwgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24sIFZlcnNpb25Db3VudCxcbiAgQnVpbGRUaW1lU2VyaWVzRW50cnksIEJ1aWxkRHVyYXRpb24sIEJ1aWxkRmFpbHVyZSxcbiAgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSwgUGx1Z2luUnVudGltZUZpbHRlciwgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zLCBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsXG4gIERvcmFPcHRpb25zLCBSZXBvcnRpbmdTZXR0aW5ncywgUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCwgSW5jaWRlbnRMaXN0SXRlbSwgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBEb3JhTWV0cmljcywgRG9yYVRyZW5kUG9pbnQsIEJ1aWxkSGVhbHRoLCBJbmNpZGVudElucHV0LFxuICBJbmdlc3RFdmVudCwgSW5nZXN0TWV0cmljLCBJbmdlc3RSZXN1bHQsIEluZ2VzdEhlYWx0aFN0YXR1cyxcbn0gZnJvbSAnLi9yZXBvcnRpbmcvdHlwZXMuanMnO1xuXG4vLyBUaGUgcmVwb3J0aW5nIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHBhY2thZ2UgQVBJLiBFbnVtZXJhdGVkIHJhdGhlciB0aGFuXG4vLyBgZXhwb3J0ICpgIGJlY2F1c2UgdGhlIHJlcG9ydGluZyBtb2R1bGVzIGFsc28gZXhwb3J0IGludGVybmFscyAob3JnU2NvcGUsXG4vLyBydW5SZXBvcnQsIHRoZSBjYWNoZXMsIHRoZSBET1JBIHJvdyBzaGFwZXMpIHRoYXQgbXVzdCBzdGF5IHByaXZhdGUuXG5leHBvcnQgdHlwZSB7XG4gIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLCBEb3JhRW52TWV0cmljcywgRG9yYUxldmVsLCBEb3JhTWV0cmljcywgRG9yYU9wdGlvbnMsIERvcmFUcmVuZFBvaW50LFxuICBJbmNpZGVudElucHV0LCBJbmNpZGVudExpc3RJdGVtLCBSZXBvcnRpbmdTZXR0aW5ncywgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBJbmdlc3RFdmVudCwgSW5nZXN0SGVhbHRoU3RhdHVzLCBJbmdlc3RNZXRyaWMsIEluZ2VzdFJlc3VsdCxcbiAgUGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSwgUGx1Z2luUnVudGltZUZpbHRlciwgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdSZXRlbnRpb25Db3VudHMsIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvblNldHRpbmdzLFxuICBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLFxufSBmcm9tICcuL3JlcG9ydGluZy90eXBlcy5qcyc7XG5cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctc2VydmljZScpO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nU2VydmljZSB7XG5cbiAgLyoqIEludmFsaWRhdGUgYWxsIGNhY2hlZCByZXBvcnRzIGZvciBhbiBvcmcgKGNhbGwgYWZ0ZXIgZXZlbnQgaW5nZXN0KS4gKi9cbiAgYXN5bmMgaW52YWxpZGF0ZU9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgaW52YWxpZGF0ZU9yZ1JlcG9ydHMob3JnSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgaW5jb21pbmcgZXZlbnRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBiYXRjaC1pbnNlcnQgdGhlXG4gICAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAgICogU2VlIC4vcmVwb3J0aW5nL2luZ2VzdC50cyDigJQgdGhlIGNhbGxlciBtdXN0IGFscmVhZHkgaG9sZCBhIHN5c2FkbWluXG4gICAqIHRlbmFudCBzY29wZSwgYmVjYXVzZSBhIGJhdGNoIHNwYW5zIHdoYXRldmVyIG9yZ3MgdGhlIHJlZ2lzdHJ5IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgYXN5bmMgaW5nZXN0RXZlbnRzKGV2ZW50czogSW5nZXN0RXZlbnRbXSwgb25NZXRyaWM/OiAobTogSW5nZXN0TWV0cmljKSA9PiB2b2lkKTogUHJvbWlzZTxJbmdlc3RSZXN1bHQ+IHtcbiAgICByZXR1cm4gaW5nZXN0KGV2ZW50cywgb25NZXRyaWMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDE6IFBpcGVsaW5lIEV4ZWN1dGlvbiAmIFBlcmZvcm1hbmNlIOKUgOKUgFxuXG5cbiAgLyoqIEV4ZWN1dGlvbiBjb3VudCBwZXIgcGlwZWxpbmUgd2l0aCBzdGF0dXMgYnJlYWtkb3duLiAqL1xuICBhc3luYyBnZXRFeGVjdXRpb25Db3VudChvcmdJZDogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0pOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICAvLyBPcHRpb25hbCBbZnJvbSx0b10gd2luZG93IG9uIHRoZSBleGVjdXRpb24ncyBzdGFydGVkX2F0LCBtaXJyb3JpbmcgdGhlXG4gICAgLy8gc2libGluZyB0aW1lc2VyaWVzIHJlcG9ydHMgc28gdGhlIGRhc2hib2FyZCBkYXRlLXJhbmdlIHBpY2tlciBuYXJyb3dzIHRoZVxuICAgIC8vIGNvdW50IHRvbyAoYW4gZW1wdHkgcmFuZ2UgPSBhbGwtdGltZSwgcHJlc2VydmluZyB0aGUgcHJpb3IgYmVoYXZpb3IpLiBUaGVcbiAgICAvLyByYW5nZSByaWRlcyB0aGUgSk9JTiBzbyBwaXBlbGluZXMgd2l0aCBubyBpbi13aW5kb3cgZXZlbnRzIHN0aWxsIGxpc3RcbiAgICAvLyAoTEVGVCBzZW1hbnRpY3MgcHJlc2VydmVkIHZpYSB0aGUgaW5uZXItam9pbiBmaWx0ZXIg4oCUIGEgcGlwZWxpbmUgd2l0aCB6ZXJvXG4gICAgLy8gbWF0Y2hpbmcgZXZlbnRzIGRyb3BzIGZyb20gdGhlIGNvdW50LCBzYW1lIGFzIGJlZm9yZSBmb3IgaXRzIHdpbmRvdykuXG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSBvcHRpb25hbFN0YXJ0ZWRBdFJhbmdlKHJhbmdlKTtcbiAgICByZXR1cm4gcmVwb3J0PEV4ZWN1dGlvbkNvdW50PihgZXhlYy1jb3VudDoke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAub3JnYW5pemF0aW9uLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgZmlyc3RfZXhlY3V0aW9uLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3RfZXhlY3V0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmV9IHBcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlIE9OIGUucGlwZWxpbmVfaWQgPSBwLmlkXG4gICAgICAgICAgQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzICE9ICdTVEFSVEVEJ1xuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIHAuaXNfYWN0aXZlID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSBwLmlkXG4gICAgICAgIE9SREVSIEJZIHRvdGFsIERFU0NcbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlci1waXBlbGluZSBleGVjdXRpb24gaGlzdG9yeSDigJQgRElTVElOQ1QgZXhlY3V0aW9ucyBmb3Igb25lIHBpcGVsaW5lLFxuICAgKiBuZXdlc3QgZmlyc3QuIEdyb3VwcyBhbGwgZXZlbnRzIGJ5IGBleGVjdXRpb25faWRgIGluIGEgc2luZ2xlIHNjYW4gYW5kXG4gICAqIHJvbGxzIGVhY2ggZXhlY3V0aW9uIHVwIHRvIG9uZSByb3c6XG4gICAqICAgLSBzdGF0dXM6IGRlcml2ZWQgZnJvbSB0aGUgUElQRUxJTkUtdHlwZSBldmVudHMuIEZBSUxFRCB3aW5zLCB0aGVuXG4gICAqICAgICBTVUNDRUVERUQsIHRoZW4gQ0FOQ0VMRUQ7IGFuIGV4ZWN1dGlvbiB3aXRoIG5vIHRlcm1pbmFsIFBJUEVMSU5FIGV2ZW50XG4gICAqICAgICBpcyBzdGlsbCBgaW4tcHJvZ3Jlc3NgLlxuICAgKiAgIC0gc3RhcnRlZEF0L2VuZGVkQXQvZHVyYXRpb25NczogZnJvbSB0aGUgUElQRUxJTkUgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICogICAtIGZhaWxpbmdTdGFnZS9mYWlsaW5nQWN0aW9uOiB0aGUgZmlyc3QgRkFJTEVEIFNUQUdFL0FDVElPTiBldmVudCAoY2hlYXAg4oCUXG4gICAqICAgICBzYW1lIHNjYW4sIG5vIGV4dHJhIHF1ZXJ5KS5cbiAgICpcbiAgICogT1JHLVNDT1BJTkc6IGlkZW50aWNhbCB0byB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0cyDigJQgam9pbnMgdGhlIHBpcGVsaW5lXG4gICAqIHJlZ2lzdHJ5IHRhYmxlIChgcGlwZWxpbmVgKSBhbmQgZ2F0ZXMgb24gYHAub3JnX2lkICR7cHJlZH1gLCB3aGVyZSBgcHJlZGAgaXNcbiAgICogdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2Agb3IgKHdpdGggYSByb2xsdXApIGFuIGBJTiAoLi4uKWAgb3ZlciB0aGUgb3Jn4oaSdGVhbVxuICAgKiBzdWJ0cmVlLiBBIHBpcGVsaW5lSWQgYmVsb25naW5nIHRvIGFub3RoZXIgb3JnIHlpZWxkcyB6ZXJvIHJvd3MuXG4gICAqL1xuICBhc3luYyBsaXN0UGlwZWxpbmVFeGVjdXRpb25zKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9LFxuICAgIGxpbWl0OiBudW1iZXIgPSA1MCxcbiAgKTogUHJvbWlzZTxQaXBlbGluZUV4ZWN1dGlvbltdPiB7XG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSBvcHRpb25hbFN0YXJ0ZWRBdFJhbmdlKHJhbmdlKTtcbiAgICByZXR1cm4gcmVwb3J0PFBpcGVsaW5lRXhlY3V0aW9uPihgcGlwZWxpbmUtZXhlY3V0aW9uczoke3BpcGVsaW5lSWR9OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfToke2xpbWl0fWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdmYWlsZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnc3VjY2VlZGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0NBTkNFTEVEJykgVEhFTiAnY2FuY2VsZWQnXG4gICAgICAgICAgICBFTFNFICdpbi1wcm9ncmVzcydcbiAgICAgICAgICBFTkQgQVMgc3RhdHVzLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OnRleHQgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyk6OmludCBBUyBkdXJhdGlvbl9tcyxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuc3RhZ2VfbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19zdGFnZSxcbiAgICAgICAgICAoQVJSQVlfQUdHKGUuYWN0aW9uX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX2FjdGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfSBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZFxuICAgICAgICBPUkRFUiBCWSBNQVgoZS5jcmVhdGVkX2F0KSBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBTdWNjZXNzIHJhdGUgb3ZlciB0aW1lIGZvciBhbiBvcmcuICovXG4gIGFzeW5jIGdldFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIHJldHVybiByZXBvcnQ8VGltZVNlcmllc0VudHJ5Pihgc3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJ1xuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnKVxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApO1xuICB9XG5cbiAgLyoqIEF2ZXJhZ2UgZHVyYXRpb24gcGVyIHBpcGVsaW5lLiAqL1xuICBhc3luYyBnZXRBdmVyYWdlRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8RHVyYXRpb25TdGF0c1tdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxEdXJhdGlvblN0YXRzPihgYXZnLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHAuaWQgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApO1xuICB9XG5cbiAgLyoqIFN0YWdlIGZhaWx1cmUgaGVhdG1hcCDigJQgd2hpY2ggc3RhZ2VzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUZhaWx1cmVbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8U3RhZ2VGYWlsdXJlPihgc3RhZ2UtZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBlLnN0YWdlX25hbWUgT1JERVIgQlkgZmFpbHVyZXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzdGluY3QgZGVwbG95IGBlbnZpcm9ubWVudGAgdmFsdWVzIG9ic2VydmVkIGluIHRoZSB3aW5kb3cg4oCUIHBvd2VycyB0aGVcbiAgICogRE9SQSBlbnZpcm9ubWVudC1zY29wZSBkYXRhbGlzdC4gT3JnLXNjb3BlZCArIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBzaWJsaW5nXG4gICAqIHJlcG9ydHM7IG9ubHkgbm9uLW51bGwgZW52aXJvbm1lbnRzIChpLmUuIGRlcGxveS1hdHRyaWJ1dGVkIGV4ZWN1dGlvbnMpLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVwb3J0RW52aXJvbm1lbnRzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJlcG9ydDx7IGVudmlyb25tZW50OiBzdHJpbmcgfT4oYHJlcG9ydC1lbnZzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1QgRElTVElOQ1QgZS5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgT1JERVIgQlkgZW52aXJvbm1lbnRcbiAgICAgIGApO1xuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3cuZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgLyoqIFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PFN0YWdlQm90dGxlbmVjaz4oYHN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnBpcGVsaW5lX25hbWUsIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApO1xuICB9XG5cbiAgLyoqIEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8QWN0aW9uRmFpbHVyZT4oYGFjdGlvbi1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5hY3Rpb25fbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBmYWlsdXJlX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5hY3Rpb25fbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIGUuYWN0aW9uX25hbWUgT1JERVIgQlkgZmFpbHVyZXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKipcbiAgICogRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuIEV4ZWN1dGlvbiByZXBvcnQsIHNvXG4gICAqIHJvbGx1cC1hd2FyZSBleGFjdGx5IGxpa2UgdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHM6IHdpdGggYG9yZ0lkc2BcbiAgICogKHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUpIHRoZSBvcmcgZ2F0ZSBiZWNvbWVzIGFuIGBJTiAoLi4uKWAgYW5kIHRoZSByZWFkIHJ1bnNcbiAgICogZnJlc2ggdW5kZXIgc3lzYWRtaW4gdmlhIGBydW5SZXBvcnRgOyBzaW5nbGUtb3JnIHJlYWRzIGtlZXAgdGhlIHBlci1vcmcgY2FjaGUuXG4gICAqL1xuICBhc3luYyBnZXRFcnJvcnMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxFcnJvckVudHJ5W10+IHtcbiAgICByZXR1cm4gcmVwb3J0PEVycm9yRW50cnk+KGBlcnJvcnM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIFNVQlNUUklORyhlLmVycm9yX21lc3NhZ2UgRlJPTSAxIEZPUiAyMDApIEFTIGVycm9yX3BhdHRlcm4sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCBlLnBpcGVsaW5lX2lkKTo6aW50IEFTIGFmZmVjdGVkX3BpcGVsaW5lcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJyBBTkQgZS5lcnJvcl9tZXNzYWdlIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgZXJyb3JfcGF0dGVybiBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm91ciBET1JBIG1lYXN1cmVzIHBsdXMgdGhlaXIgcGVyLWVudmlyb25tZW50IGJyZWFrZG93bi5cbiAgICogSW1wbGVtZW50YXRpb24gaW4gLi9yZXBvcnRpbmcvZG9yYS50cyDigJQgc2VlIHRoYXQgZmlsZSdzIGhlYWRlciBmb3Igd2h5LlxuICAgKi9cbiAgZ2V0RG9yYU1ldHJpY3MoXG4gICAgb3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhTWV0cmljcz4ge1xuICAgIHJldHVybiBkb3JhTWV0cmljcyhvcmdJZCwgZnJvbSwgdG8sIG9yZ0lkcywgb3B0cyk7XG4gIH1cblxuICAvKiogRE9SQSBtZWFzdXJlcyBidWNrZXRlZCBvdmVyIHRpbWUuICovXG4gIGdldERvcmFUcmVuZChcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFUcmVuZFBvaW50W10+IHtcbiAgICByZXR1cm4gZG9yYVRyZW5kKG9yZ0lkLCBpbnRlcnZhbCwgZnJvbSwgdG8sIG9yZ0lkcywgb3B0cyk7XG4gIH1cblxuICAvKiogUGVyLXBpcGVsaW5lIGJ1aWxkIGhlYWx0aCAoc3RhZ2UgcGFzcyByYXRlcyBvdmVyIGEgd2luZG93KS4gKi9cbiAgZ2V0QnVpbGRIZWFsdGgoXG4gICAgb3JnSWQ6IHN0cmluZywgcGlwZWxpbmVJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPEJ1aWxkSGVhbHRoPiB7XG4gICAgcmV0dXJuIGJ1aWxkSGVhbHRoKG9yZ0lkLCBwaXBlbGluZUlkLCBmcm9tLCB0bywgb3JnSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdldFBsdWdpblN1bW1hcnkob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luU3VtbWFyeT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXN1bW1hcnlgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIE5PVCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGluYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLnZpc2liaWxpdHl9ID0gJ3B1YmxpYycpOjppbnQgQVMgcHVibGljLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLnZpc2liaWxpdHl9ID0gJ29yZycpOjppbnQgQVMgb3JnLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLnZpc2liaWxpdHl9ID0gJ3ByaXZhdGUnKTo6aW50IEFTIHByaXZhdGUsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgJHtzY2hlbWEucGx1Z2luLm5hbWV9KTo6aW50IEFTIHVuaXF1ZV9uYW1lc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICBgKSk7XG4gICAgICByZXR1cm4gKGRyaXp6bGVSb3dzPFBsdWdpblN1bW1hcnk+KHJvd3Mucm93cylbMF0gfHwgeyB0b3RhbDogMCwgYWN0aXZlOiAwLCBpbmFjdGl2ZTogMCwgcHVibGljOiAwLCBvcmc6IDAsIHByaXZhdGU6IDAsIHVuaXF1ZU5hbWVzOiAwIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFR5cGUgJiBjb21wdXRlIGRpc3RyaWJ1dGlvbi5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpbkRpc3RyaWJ1dGlvbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbltdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tZGlzdHJpYnV0aW9uYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0gQVMgcGx1Z2luX3R5cGUsXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfSBBUyBjb21wdXRlX3R5cGUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBjb3VudFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ucGx1Z2luVHlwZX0sICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX1cbiAgICAgICAgT1JERVIgQlkgY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uPihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBWZXJzaW9uIGNvdW50cyBwZXIgcGx1Z2luIG5hbWUuXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgcGVyLW9yZyAoc2VlXG4gICAqICBnZXRQbHVnaW5TdW1tYXJ5KS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5WZXJzaW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxWZXJzaW9uQ291bnRbXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXZlcnNpb25zYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ubmFtZX0sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB2ZXJzaW9uX2NvdW50LFxuICAgICAgICAgIC0tIEhpZ2hlc3QgdmVyc2lvbiBieSBOVU1FUklDIHNlbXZlciBjb3JlIChub3QgbGV4aWNhbDogJzEwLjAuMCcgPiAnOS4wLjAnKS5cbiAgICAgICAgICAtLSBTdHJpcCBhbnkgLXByZXJlbGVhc2UvK2J1aWxkIHN1ZmZpeCBiZWZvcmUgdGhlIGludFtdIGNhc3Qgc28gaXQgY2FuJ3RcbiAgICAgICAgICAtLSBlcnJvciBvbiB2YWxpZCBzZW12ZXI7IGtlZXAgdGhlIG9yaWdpbmFsIHN0cmluZyBmb3IgZGlzcGxheS5cbiAgICAgICAgICAtLSBHVUFSRDogYSBub24tbnVtZXJpYy1kb3R0ZWQgdmVyc2lvbiAoJ2xhdGVzdCcsICcnLCAndjEnKSB3b3VsZCBtYWtlIHRoZVxuICAgICAgICAgIC0tIDo6aW50W10gY2FzdCB0aHJvdyBhbmQgYmxvdyB1cCB0aGUgV0hPTEUgb3JnIHN1bW1hcnkuIE9ubHkgY2FzdCByb3dzXG4gICAgICAgICAgLS0gd2hvc2Ugc3RyaXBwZWQgY29yZSBtYXRjaGVzIGEgbnVtZXJpYy1kb3R0ZWQgc2hhcGU7IHNvcnQgZXZlcnl0aGluZ1xuICAgICAgICAgIC0tIGVsc2UgdG8gdGhlIGJvdHRvbSB2aWEgYSBzZW50aW5lbCBBUlJBWVstMV0gc28gdGhlIHJvdyBzdGlsbCBjb3VudHMuXG4gICAgICAgICAgKGFycmF5X2FnZygke3NjaGVtYS5wbHVnaW4udmVyc2lvbn1cbiAgICAgICAgICAgICBPUkRFUiBCWSBDQVNFXG4gICAgICAgICAgICAgICBXSEVOIHJlZ2V4cF9yZXBsYWNlKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufSwgJ1stK10uKiQnLCAnJykgfiAnXlswLTldKyhbLl1bMC05XSspKiQnXG4gICAgICAgICAgICAgICAgIFRIRU4gc3RyaW5nX3RvX2FycmF5KHJlZ2V4cF9yZXBsYWNlKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufSwgJ1stK10uKiQnLCAnJyksICcuJyk6OmludFtdXG4gICAgICAgICAgICAgICBFTFNFIEFSUkFZWy0xXVxuICAgICAgICAgICAgIEVORCBERVNDXG4gICAgICAgICAgKSlbMV0gQVMgbGF0ZXN0X3ZlcnNpb24sXG4gICAgICAgICAgYm9vbF9vcigke3NjaGVtYS5wbHVnaW4uaXNEZWZhdWx0fSkgQVMgaGFzX2RlZmF1bHRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLm5hbWV9XG4gICAgICAgIE9SREVSIEJZIHZlcnNpb25fY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFZlcnNpb25Db3VudD4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgc3VjY2VzcyByYXRlIG92ZXIgdGltZS5cbiAgICpcbiAgICogU1RBVFVTIENBU0lORyBOT1RFOiBUaGlzIHF1ZXJ5IGZpbHRlcnMgYnkgYGV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnYFxuICAgKiBhbmQgdXNlcyBsb3dlcmNhc2Ugc3RhdHVzIHZhbHVlcyAoYCdjb21wbGV0ZWQnYCwgYCdmYWlsZWQnYCksIHdoaWxlXG4gICAqIGBnZXRTdWNjZXNzUmF0ZWAgKDEuMikgZmlsdGVycyBieSBgZXZlbnRfdHlwZSA9ICdQSVBFTElORSdgIHdpdGhcbiAgICogdXBwZXJjYXNlIEFXUy1zdHlsZSBzdGF0dXNlcyAoYCdTVUNDRUVERUQnYCwgYCdGQUlMRUQnYCwgYCdDQU5DRUxFRCdgKS5cbiAgICogVGhlIGNhc2luZyBkcmlmdCBpcyBpbnRlbnRpb25hbCBhbmQgdHJhY2tzIHRoZSBwcm9kdWNlcjpcbiAgICogICAtIGBwbHVnaW4tYnVpbGRgIGV2ZW50cyBjb21lIGZyb20gb3VyIG93biBidWlsZCBwaXBlbGluZSAobG93ZXJjYXNlKVxuICAgKiAgIC0gYFBJUEVMSU5FYCBldmVudHMgY29tZSBmcm9tIEFXUyBDb2RlUGlwZWxpbmUgKHVwcGVyY2FzZSlcbiAgICogVGhlIGluZ2VzdCBab2Qgc2NoZW1hIGF0IGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHNcbiAgICogU0hPVUxEIGVudW0gdGhlc2UgcGVyLWV2ZW50U291cmNlIHNvIHdlIGNhdGNoIGRyaWZ0IGF0IGluZ2VzdCByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBwcm9kdWNpbmcgemVybyByb3dzIGhlcmUuIFNlZSBmaW5kaW5ncyBONzEuXG4gICAqL1xuICBhc3luYyBnZXRCdWlsZFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkVGltZVNlcmllc0VudHJ5W10+IHtcbiAgICBhc3NlcnRSZXBvcnRJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgLy8gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUgbGlrZSB0aGUgZXhlY3V0aW9uIHJlcG9ydHMuIFRoZXNlXG4gICAgLy8gcm93cyBhcmUgZ2F0ZWQgb24gdGhlIHBpcGVsaW5lX2V2ZW50IGBvcmdfaWRgIGRpcmVjdGx5IChubyBwaXBlbGluZSBqb2luKSxcbiAgICAvLyBzbyBgcHJlZGAgYXBwbGllcyB0byBgZS5vcmdfaWRgLlxuICAgIHJldHVybiByZXBvcnQ8QnVpbGRUaW1lU2VyaWVzRW50cnk+KGBidWlsZC1zdWNjZXNzOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnZmFpbGVkJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdjb21wbGV0ZWQnLCAnZmFpbGVkJylcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBkdXJhdGlvbiBwZXIgcGx1Z2luLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGREdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZER1cmF0aW9uW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PEJ1aWxkRHVyYXRpb24+KGBidWlsZC1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGJ1aWxkc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKiBCdWlsZCBmYWlsdXJlcyDigJQgdG9wIGVycm9yIG1lc3NhZ2VzLiBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZS4gKi9cbiAgYXN5bmMgZ2V0QnVpbGRGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZEZhaWx1cmU+KGBidWlsZC1mYWlsdXJlczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgZS5lcnJvcl9tZXNzYWdlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGx1Z2luX25hbWUsIGUuZXJyb3JfbWVzc2FnZVxuICAgICAgICBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQbHVnaW4gcnVudGltZSB0ZWxlbWV0cnkg4oCUIHNlZSAuL3JlcG9ydGluZy9wbHVnaW4tcnVudGltZS50cyDilIDilIBcblxuICAvKipcbiAgICogUGx1Z2luIHJ1bnRpbWU6IHBlciBwbHVnaW4gdmVyc2lvbiBydW5zLCBzdWNjZXNzIHJhdGUgYW5kIHA1MC9wOTVcbiAgICogZHVyYXRpb24gb3ZlciBgW2Zyb20sIHRvXWAsIGZyb20gdGhlIG1hbmlmZXN0LWF0dHJpYnV0ZWQgQUNUSU9OIGV2ZW50cy5cbiAgICogUm9sbHVwLWF3YXJlLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGx1Z2luUnVudGltZShvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGZpbHRlcj86IFBsdWdpblJ1bnRpbWVGaWx0ZXIsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxQbHVnaW5SdW50aW1lU3RhdHNbXT4ge1xuICAgIHJldHVybiBwbHVnaW5SdW50aW1lKG9yZ0lkLCBmcm9tLCB0bywgZmlsdGVyLCBvcmdJZHMpO1xuICB9XG5cbiAgLyoqIENyb3NzLW9yZyAzMC1kYXkgcnVudGltZSBhZ2dyZWdhdGUgZm9yIGEgYChwdWJsaXNoZXIsIG5hbWUpYCBsaXN0aW5nIChwbHVnaW5fc3RhdHMgaW5wdXQpLiBTZXJ2aWNlIGNhbGxlcnMgb25seS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZShwdWJsaXNoZXI6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5SdW50aW1lQWdncmVnYXRlPiB7XG4gICAgcmV0dXJuIHBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUocHVibGlzaGVyLCBuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZXZpZXcgXCJ2ZXJpZmllZCB1c2VcIjogYG9yZ0lkYCByYW4gYChwdWJsaXNoZXIsIG5hbWUpYCBzdWNjZXNzZnVsbHkgd2l0aGluIDkwIGRheXMuIFNlcnZpY2UgY2FsbGVycyBvbmx5LiAqL1xuICBhc3luYyBoYXNWZXJpZmllZFBsdWdpblVzZShvcmdJZDogc3RyaW5nLCBwdWJsaXNoZXI6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHZlcmlmaWVkUGx1Z2luVXNlKG9yZ0lkLCBwdWJsaXNoZXIsIG5hbWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDM6IERPUkEgd3JpdGUgcGF0aHMgKHBvc3QtZGVwbG95IG91dGNvbWVzICsgaW5nZXN0IGhlYWx0aCkg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIG1hbnVhbCBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlcjogYSB1c2VyIG1hcmtzIGFcbiAgICogZGVwbG95bWVudCBgZmFpbGVkYCAoYSBwcm9kdWN0aW9uIGluY2lkZW50IGxpbmtlZCB0byB0aGUgZGVwbG95KSBvclxuICAgKiBgcmVzdG9yZWRgIChyZWNvdmVyZWQpLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvbiAoZXhlY3V0aW9uX2lkLCBvdXRjb21lKSBzbyBhXG4gICAqIGR1cGxpY2F0ZSBQT1NUIHJlZnJlc2hlcyBgYXRgIHJhdGhlciB0aGFuIGRvdWJsZS1jb3VudGluZywgd2hpbGUgYVxuICAgKiBmYWlsZWTihpJyZXN0b3JlZCBwYWlyIHN0YXlzIHR3byByb3dzLiBGZWVkcyB0aGUgcG9zdC1kZXBsb3kgQ0ZSIGNvbXBvbmVudCBhbmRcbiAgICogdGhlIHJlYWwgTVRUUi4gUnVucyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3JnIGNvbnRleHQgKFJMUyBXSVRIIENIRUNLKS5cbiAgICovXG4gIGFzeW5jIHJlY29yZERlcGxveW1lbnRPdXRjb21lKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgZXhlY3V0aW9uSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBvdXRjb21lOiAnZmFpbGVkJyB8ICdyZXN0b3JlZCc7IGF0OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZGVwbG95bWVudE91dGNvbWUpLnZhbHVlcyh7XG4gICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICBvcmdJZCxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHNjcnViT3B0aW9uYWwoaW5wdXQuZW52aXJvbm1lbnQpLFxuICAgICAgICBvdXRjb21lOiBpbnB1dC5vdXRjb21lLFxuICAgICAgICBhdDogbmV3IERhdGUoaW5wdXQuYXQpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLmV4ZWN1dGlvbklkLCBzY2hlbWEuZGVwbG95bWVudE91dGNvbWUub3V0Y29tZV0sXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIGF0OiBuZXcgRGF0ZShpbnB1dC5hdCksXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHNjcnViT3B0aW9uYWwoaW5wdXQuZW52aXJvbm1lbnQpID8/IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgICAvLyBPdXRjb21lIGNoYW5nZXMgdGhlIERPUkEgYWdncmVnYXRlIOKAlCBkcm9wIHRoZSBvcmcncyBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmdlc3QgYSBwcm9kdWN0aW9uIGluY2lkZW50IGZyb20gdGhlIG9yZydzIGluY2lkZW50IHRvb2xpbmdcbiAgICogKFBhZ2VyRHV0eSAvIERhdGFkb2cgLyBBbGVydG1hbmFnZXIgd2ViaG9vaykuIElkZW1wb3RlbnQg4oCUIGtleWVkIG9uXG4gICAqIChvcmdfaWQsIGluY2lkZW50X2lkKSBzbyBhIGxhdGVyIHJlc29sdmUgcmUtcG9zdCB1cHNlcnRzIGByZXNvbHZlZF9hdGBcbiAgICogKGFuZCByZWZyZXNoZXMgdGhlIG90aGVyIG11dGFibGUgZmllbGRzKSBpbnN0ZWFkIG9mIGluc2VydGluZyBhIGR1cGxpY2F0ZS5cbiAgICogRE9SQSBjb3JyZWxhdGVzIGVhY2ggaW5jaWRlbnQgdG8gdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHRvIGl0c1xuICAgKiBgZW52aXJvbm1lbnRgLCBwcm9kdWNpbmcgYW4gYXV0b21hdGVkIHBvc3QtZGVwbG95IGZhaWx1cmUgKyBhIHJlYWwgTVRUUi5cbiAgICogUnVucyB1bmRlciB0aGUgY2FsbGVyJ3Mgb3JnIGNvbnRleHQgKFJMUyBXSVRIIENIRUNLKTsgZnJlZS1mb3JtIGZpZWxkcyBhcmVcbiAgICogQVdTLWlkIHNjcnViYmVkIGF0IHRoaXMgcGVyc2lzdGVuY2UgYm91bmRhcnkgbGlrZSB0aGUgb3RoZXIgaW5nZXN0IHBhdGhzLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkSW5jaWRlbnQob3JnSWQ6IHN0cmluZywgaW5wdXQ6IEluY2lkZW50SW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmNpZGVudElkID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuaW5jaWRlbnRJZCk7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhpbnB1dC5lbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgc2V2ZXJpdHkgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhpbnB1dC5zZXZlcml0eSk7XG4gICAgY29uc3Qgb3BlbmVkQXQgPSBuZXcgRGF0ZShpbnB1dC5vcGVuZWRBdCk7XG4gICAgY29uc3QgcmVzb2x2ZWRBdCA9IGlucHV0LnJlc29sdmVkQXQgPyBuZXcgRGF0ZShpbnB1dC5yZXNvbHZlZEF0KSA6IG51bGw7XG4gICAgYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5pbmNpZGVudCkudmFsdWVzKHtcbiAgICAgICAgaW5jaWRlbnRJZCxcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICBvcGVuZWRBdCxcbiAgICAgICAgcmVzb2x2ZWRBdCxcbiAgICAgICAgc2V2ZXJpdHksXG4gICAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICB0YXJnZXQ6IFtzY2hlbWEuaW5jaWRlbnQub3JnSWQsIHNjaGVtYS5pbmNpZGVudC5pbmNpZGVudElkXSxcbiAgICAgICAgLy8gQSByZWRlbGl2ZXJlZCBGSVJJTkcgcG9zdCAobm8gcmVzb2x2ZWRBdCkgbXVzdCBub3Qgd2lwZSBhIHJlY29yZGVkXG4gICAgICAgIC8vIHJlc29sdmUg4oCUIHNlbmRlcnMgcmUtcG9zdCBmaXJpbmcgYWxlcnRzIG9uIGV2ZXJ5IHJlcGVhdCBpbnRlcnZhbCwgYW5kXG4gICAgICAgIC8vIGRlbGl2ZXJ5IG9yZGVyIGlzbid0IGd1YXJhbnRlZWQuIEtlZXAgdGhlIHN0b3JlZCByZXNvbHZlIHVubGVzcyB0aGVcbiAgICAgICAgLy8gcG9zdCBjYXJyaWVzIGl0cyBvd24sIG9yIHRoZSBpbmNpZGVudCB3YXMgUkUtT1BFTkVEIChhIGRpZmZlcmVudFxuICAgICAgICAvLyBvcGVuZWRBdCBtZWFucyBhIG5ldyBvY2N1cnJlbmNlLCB3aG9zZSByZXNvbHZlIHN0YXRlIGlzIHRoZSBwb3N0J3MpLlxuICAgICAgICBzZXQ6IHtcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBvcGVuZWRBdCxcbiAgICAgICAgICByZXNvbHZlZEF0OiBzcWxgQ0FTRSBXSEVOICR7c2NoZW1hLmluY2lkZW50Lm9wZW5lZEF0fSA9IGV4Y2x1ZGVkLm9wZW5lZF9hdFxuICAgICAgICAgICAgVEhFTiBDT0FMRVNDRShleGNsdWRlZC5yZXNvbHZlZF9hdCwgJHtzY2hlbWEuaW5jaWRlbnQucmVzb2x2ZWRBdH0pXG4gICAgICAgICAgICBFTFNFIGV4Y2x1ZGVkLnJlc29sdmVkX2F0IEVORGAsXG4gICAgICAgICAgc2V2ZXJpdHksXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgICAvLyBBIG5ldy91cGRhdGVkIGluY2lkZW50IGNoYW5nZXMgdGhlIERPUkEgYWdncmVnYXRlIOKAlCBkcm9wIGNhY2hlZCByZXBvcnRzLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZU9yZyhvcmdJZCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHBlci1vcmcgRE9SQSBzZXR0aW5ncy4gUmV0dXJucyB0aGUgc3RvcmVkXG4gICAqIGBpbmNpZGVudFdpbmRvd0hvdXJzYCBvdmVycmlkZSAob3IgYG51bGxgIHdoZW4gdW5zZXQpIHBsdXMgdGhlIGdsb2JhbCBlbnZcbiAgICogZGVmYXVsdCwgc28gdGhlIHNldHRpbmdzIFVJIGNhbiBzaG93IGJvdGguIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIHRlbmFudFxuICAgKiBjb250ZXh0IChSTFMtc2NvcGVkKTsgYSBzaW5nbGUtb3JnIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCByZXRlbnRpb25PcmdJZDogc3RyaW5nID0gb3JnSWQpOiBQcm9taXNlPFJlcG9ydGluZ1NldHRpbmdzPiB7XG4gICAgY29uc3Qgcm93cyA9IGRyaXp6bGVSb3dzPHtcbiAgICAgIGluY2lkZW50X3dpbmRvd19ob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCAke3NjaGVtYS5kb3JhU2V0dGluZ3MuaW5jaWRlbnRXaW5kb3dIb3Vyc30gQVMgaW5jaWRlbnRfd2luZG93X2hvdXJzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmV2ZW50UmV0ZW50aW9uRGF5c30gQVMgZXZlbnRfcmV0ZW50aW9uX2RheXMsXG4gICAgICAgICAgICAgICAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZG9yYVJldGVudGlvbkRheXN9IEFTIGRvcmFfcmV0ZW50aW9uX2RheXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5kb3JhU2V0dGluZ3N9XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZH0gPSAke29yZ0lkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgLy8gUmV0ZW50aW9uIGlzIGEgYmlsbGluZyBlbnRpdGxlbWVudCBzeW5jZWQgb250byB0aGUgYWNjb3VudCBST09UIG9ubHk7IGFcbiAgICAvLyB0ZWFtIHJlYWRzIGl0cyByb290J3Mgd2luZG93ICh0aGUgaW5jaWRlbnQgd2luZG93IHN0YXlzIHRoZSB0ZWFtJ3Mgb3duKS5cbiAgICBjb25zdCByZXRlbnRpb24gPSByZXRlbnRpb25PcmdJZCA9PT0gb3JnSWRcbiAgICAgID8gcm93XG4gICAgICA6IGF3YWl0IHRoaXMuI3JlYWRSZXRlbnRpb25PdmVycmlkZShyZXRlbnRpb25PcmdJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluY2lkZW50V2luZG93SG91cnM6IHJvdz8uaW5jaWRlbnRfd2luZG93X2hvdXJzICE9IG51bGwgPyBOdW1iZXIocm93LmluY2lkZW50X3dpbmRvd19ob3VycykgOiBudWxsLFxuICAgICAgZGVmYXVsdFdpbmRvd0hvdXJzOiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyxcbiAgICAgIGV2ZW50UmV0ZW50aW9uRGF5czogcmV0ZW50aW9uPy5ldmVudF9yZXRlbnRpb25fZGF5cyAhPSBudWxsID8gTnVtYmVyKHJldGVudGlvbi5ldmVudF9yZXRlbnRpb25fZGF5cykgOiBudWxsLFxuICAgICAgZG9yYVJldGVudGlvbkRheXM6IHJldGVudGlvbj8uZG9yYV9yZXRlbnRpb25fZGF5cyAhPSBudWxsID8gTnVtYmVyKHJldGVudGlvbi5kb3JhX3JldGVudGlvbl9kYXlzKSA6IG51bGwsXG4gICAgICBkZWZhdWx0RXZlbnRSZXRlbnRpb25EYXlzOiBSRVBPUlRJTkdfRVZFTlRfUkVURU5USU9OX0RBWVMsXG4gICAgICBkZWZhdWx0RG9yYVJldGVudGlvbkRheXM6IFJFUE9SVElOR19ET1JBX1JFVEVOVElPTl9EQVlTLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIFJPT1Qgb3JnJ3Mgc3RvcmVkIHJldGVudGlvbiBvdmVycmlkZS4gVGhlIGNhbGxlciAoYSB0ZWFtKSBjYW4ndCBzZWUgdGhlXG4gICAqIHJvb3QncyBgZG9yYV9zZXR0aW5nc2Agcm93IHVuZGVyIGl0cyBvd24gUkxTIHNjb3BlLCBzbyB0aGlzIG5hcnJvdyByZWFkIG9mXG4gICAqIHR3byBpbnRlZ2VyIGNvbHVtbnMg4oCUIGtleWVkIGJ5IHRoZSBleHBsaWNpdCwgSldULWRlcml2ZWQgcm9vdCBpZCDigJQgcnVucyBpbiBhXG4gICAqIHN5c2FkbWluIHNjb3BlLlxuICAgKi9cbiAgYXN5bmMgI3JlYWRSZXRlbnRpb25PdmVycmlkZShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsOyBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgYXN5bmMgKCkgPT4gZHJpenpsZVJvd3M8e1xuICAgICAgZXZlbnRfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgICBkb3JhX3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5ldmVudFJldGVudGlvbkRheXN9IEFTIGV2ZW50X3JldGVudGlvbl9kYXlzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmRvcmFSZXRlbnRpb25EYXlzfSBBUyBkb3JhX3JldGVudGlvbl9kYXlzXG4gICAgICAgIEZST00gJHtzY2hlbWEuZG9yYVNldHRpbmdzfVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKSk7XG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICAvKipcbiAgICogVXBzZXJ0IHBlci1vcmcgcmVwb3J0aW5nIHNldHRpbmdzIChpbmNpZGVudCB3aW5kb3cgK1xuICAgKiByZXRlbnRpb24gb3ZlcnJpZGVzKSwgaWRlbXBvdGVudCBvbiBgb3JnX2lkYC4gQSBwYXJ0aWFsIHdyaXRlIOKAlCBvbmx5IHRoZVxuICAgKiBmaWVsZHMgcHJlc2VudCBpbiBgcGF0Y2hgIGFyZSBzZXQgKHNvIHVwZGF0aW5nIHJldGVudGlvbiBuZXZlciBjbGVhcnMgdGhlXG4gICAqIGluY2lkZW50IHdpbmRvdywgYW5kIHZpY2UtdmVyc2EpLiBTZXQgc2VsZi1zZXJ2ZSBieSBhbiBvcmcgYWRtaW4gdmlhXG4gICAqIGBQVVQgL2FwaS9yZXBvcnRzL3NldHRpbmdzL2luY2lkZW50c2AuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0XG4gICAqIChSTFMgV0lUSCBDSEVDSyk7IGEgY2hhbmdlZCB2YWx1ZSBhZmZlY3RzIERPUkEgYWdncmVnYXRlcyBzbyB0aGUgb3JnJ3NcbiAgICogY2FjaGVkIHJlcG9ydHMgYXJlIGRyb3BwZWQuXG4gICAqL1xuICBhc3luYyBzZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZDogc3RyaW5nLCBwYXRjaDogUmVwb3J0aW5nU2V0dGluZ3NQYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHVwZGF0ZWRBdDogbmV3IERhdGUoKSB9O1xuICAgIGlmIChwYXRjaC5pbmNpZGVudFdpbmRvd0hvdXJzICE9PSB1bmRlZmluZWQpIHNldC5pbmNpZGVudFdpbmRvd0hvdXJzID0gcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycztcbiAgICBpZiAocGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5ldmVudFJldGVudGlvbkRheXMgPSBwYXRjaC5ldmVudFJldGVudGlvbkRheXM7XG4gICAgaWYgKHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzICE9PSB1bmRlZmluZWQpIHNldC5kb3JhUmV0ZW50aW9uRGF5cyA9IHBhdGNoLmRvcmFSZXRlbnRpb25EYXlzO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuZG9yYVNldHRpbmdzKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgaW5jaWRlbnRXaW5kb3dIb3VyczogcGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgICAgICAgZXZlbnRSZXRlbnRpb25EYXlzOiBwYXRjaC5ldmVudFJldGVudGlvbkRheXMsXG4gICAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkLFxuICAgICAgICBzZXQsXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHJlY2VudCBpbmNpZGVudHMgZm9yIGFuIG9yZyAob3JnLWFkbWluIHN1cmZhY2UpLCBuZXdlc3QgZmlyc3QsXG4gICAqIHBhZ2luYXRlZC4gRWFjaCByb3cgY2FycmllcyBpdHMgcmVzb2x2ZWQgc3RhdGUgYW5kIGl0cyBkZXBsb3kgY29ycmVsYXRpb24g4oCUXG4gICAqIHRoZSBtb3N0IHJlY2VudCBTVUNDRVNTRlVMIGRlcGxveSB0byB0aGUgaW5jaWRlbnQncyBgZW52aXJvbm1lbnRgIHdob3NlXG4gICAqIGBjb21wbGV0ZWRfYXRgIGZhbGxzIHdpdGhpbiB0aGUgZWZmZWN0aXZlIHBlci1vcmcgY29ycmVsYXRpb24gd2luZG93IGJlZm9yZVxuICAgKiBgb3BlbmVkX2F0YCAodGhlIHNhbWUgcnVsZSBET1JBJ3MgQ0ZSL01UVFIgY29ycmVsYXRpb24gYXBwbGllcykuIFNpbmdsZS1vcmdcbiAgICogKG5vIHJvbGx1cCkg4oCUIGFuIG9yZyBhZG1pbiB2aWV3cyB0aGVpciBvd24gb3JnJ3MgaW5jaWRlbnRzLiBSTFMtc2NvcGVkIHZpYVxuICAgKiB0aGUgYHAub3JnX2lkYC9gaS5vcmdfaWRgIHByZWRpY2F0ZXMgKyB0aGUgdGVuYW50IGNvbnRleHQuXG4gICAqL1xuICBhc3luYyBsaXN0SW5jaWRlbnRzKG9yZ0lkOiBzdHJpbmcsIG9wdHM6IHsgbGltaXQ6IG51bWJlcjsgb2Zmc2V0OiBudW1iZXIgfSk6IFByb21pc2U8SW5jaWRlbnRMaXN0SXRlbVtdPiB7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4ob3B0cy5saW1pdCwgMjAwKSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQpO1xuICAgIC8vIFRoZSBjb3JyZWxhdGlvbiB3aW5kb3cgaXMgZXhwcmVzc2VkIGluIFNFQ09ORFMgYXMgYSBkb3VibGUsIG5vdCBhc1xuICAgIC8vIGBtYWtlX2ludGVydmFsKGhvdXJzID0+IE46OmludClgLiBUaGUgd2luZG93IGlzIHZhbGlkYXRlZCBhcyBhbnkgcG9zaXRpdmVcbiAgICAvLyBudW1iZXIgKDAuNWggaXMgbGVnYWwpIGFuZCB0aGUgaW4tbWVtb3J5IERPUkEgY29ycmVsYXRpb24gdXNlcyBpdCBleGFjdGx5O1xuICAgIC8vIHRoZSBpbnQgY2FzdCBtYWRlIFBvc3RncmVzIHJlamVjdCBhIGZyYWN0aW9uYWwgdmFsdWUsIHNvIGEgMC41aCB3aW5kb3dcbiAgICAvLyByZXR1cm5lZCA1MDAgZnJvbSB0aGlzIGVuZHBvaW50IGFuZCBmcm9tIHRoZSBjb3JyZWxhdGlvbiBsb29rdXAgYmVsb3cuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBpLmluY2lkZW50X2lkIEFTIFwiaW5jaWRlbnRJZFwiLFxuICAgICAgICAgIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgICAgaS5zZXZlcml0eSBBUyBzZXZlcml0eSxcbiAgICAgICAgICBpLm9wZW5lZF9hdDo6dGV4dCBBUyBcIm9wZW5lZEF0XCIsXG4gICAgICAgICAgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyBcInJlc29sdmVkQXRcIixcbiAgICAgICAgICBpLmNyZWF0ZWRfYXQ6OnRleHQgQVMgXCJjcmVhdGVkQXRcIixcbiAgICAgICAgICAoaS5yZXNvbHZlZF9hdCBJUyBOT1QgTlVMTCkgQVMgcmVzb2x2ZWQsXG4gICAgICAgICAgY29yci5leGVjdXRpb25faWQgQVMgXCJjb3JyZWxhdGVkRXhlY3V0aW9uSWRcIixcbiAgICAgICAgICBjb3JyLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBcImRlcGxveUNvbXBsZXRlZEF0XCJcbiAgICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkLCBlLmNvbXBsZXRlZF9hdFxuICAgICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9IGkuZW52aXJvbm1lbnQgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSBpLm9wZW5lZF9hdFxuICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49IGkub3BlbmVkX2F0IC0gbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7d2luZG93SG91cnMgKiAzNjAwfTo6ZG91YmxlIHByZWNpc2lvbilcbiAgICAgICAgICBPUkRFUiBCWSBlLmNvbXBsZXRlZF9hdCBERVNDXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICApIGNvcnIgT04gdHJ1ZVxuICAgICAgICBXSEVSRSBpLm9yZ19pZCA9ICR7b3JnSWR9XG4gICAgICAgIE9SREVSIEJZIGkub3BlbmVkX2F0IERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH0gT0ZGU0VUICR7b2Zmc2V0fVxuICAgICAgYCkudGhlbigocikgPT4gZHJpenpsZVJvd3M8SW5jaWRlbnRMaXN0SXRlbT4oci5yb3dzKS5tYXAoKHJvdykgPT4gKHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIHJlc29sdmVkOiByb3cucmVzb2x2ZWQgPT09IHRydWUgfHwgKHJvdy5yZXNvbHZlZCBhcyB1bmtub3duKSA9PT0gJ3QnLFxuICAgICAgY29ycmVsYXRlZEV4ZWN1dGlvbklkOiByb3cuY29ycmVsYXRlZEV4ZWN1dGlvbklkID8/IG51bGwsXG4gICAgICBkZXBsb3lDb21wbGV0ZWRBdDogcm93LmRlcGxveUNvbXBsZXRlZEF0ID8/IG51bGwsXG4gICAgfSkpKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyaW5nLXRlc3QgZHJ5LXJ1bjogd291bGQgYSBzeW50aGV0aWMgaW5jaWRlbnQgb3BlbmluZyBOT1cgZm9yXG4gICAqIGBlbnZpcm9ubWVudGAgY29ycmVsYXRlIHRvIGEgcmVjZW50IHN1Y2Nlc3NmdWwgZGVwbG95IHVuZGVyIHRoZSBvcmcnc1xuICAgKiBlZmZlY3RpdmUgd2luZG93PyBUaGlzIGlzIGEgTk9OLXBlcnNpc3RpbmcgY29ycmVsYXRpb24gY2hlY2sg4oCUIGl0IHZlcmlmaWVzXG4gICAqIHRoZSBhZG1pbidzIGVudmlyb25tZW50IG5hbWluZyArIHdpbmRvdyBsaW5lIHVwIHdpdGggcmVhbCBkZXBsb3kgZXZlbnRzXG4gICAqIFdJVEhPVVQgd3JpdGluZyBhbiBpbmNpZGVudCAoc28gYSBcInRlc3RcIiBuZXZlciBwb2xsdXRlcyBDRlIvTVRUUikuIFJMUy1zY29wZWQuXG4gICAqL1xuICBhc3luYyB0ZXN0SW5jaWRlbnRDb3JyZWxhdGlvbihvcmdJZDogc3RyaW5nLCBlbnZpcm9ubWVudDogc3RyaW5nKTogUHJvbWlzZTxJbmNpZGVudFRlc3RSZXN1bHQ+IHtcbiAgICBjb25zdCBlbnYgPSBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhlbnZpcm9ubWVudCk7XG4gICAgY29uc3Qgb3BlbmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgY29uc3QgeyBpbmNpZGVudFdpbmRvd0hvdXJzIH0gPSBhd2FpdCB0aGlzLmdldFJlcG9ydGluZ1NldHRpbmdzKG9yZ0lkKTtcbiAgICBjb25zdCB3aW5kb3dIb3VycyA9IHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKGluY2lkZW50V2luZG93SG91cnMpO1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7IGV4ZWN1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDsgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsIH0+KChhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkID0gJHtvcmdJZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRSdcbiAgICAgICAgICBBTkQgZS5lbnZpcm9ubWVudCA9ICR7ZW52fSBBTkQgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJ1xuICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke29wZW5lZEF0fTo6dGltZXN0YW1wdHpcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6IC0gbWFrZV9pbnRlcnZhbChzZWNzID0+ICR7d2luZG93SG91cnMgKiAzNjAwfTo6ZG91YmxlIHByZWNpc2lvbilcbiAgICAgICAgT1JERVIgQlkgZS5jb21wbGV0ZWRfYXQgREVTQ1xuICAgICAgICBMSU1JVCAxXG4gICAgICBgKSkpLnJvd3MpO1xuICAgIGNvbnN0IGhpdCA9IHJvd3NbMF07XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudmlyb25tZW50OiBlbnYsXG4gICAgICBvcGVuZWRBdCxcbiAgICAgIHdpbmRvd0hvdXJzLFxuICAgICAgY29ycmVsYXRlZDogaGl0Py5leGVjdXRpb25faWQgIT0gbnVsbCxcbiAgICAgIGV4ZWN1dGlvbklkOiBoaXQ/LmV4ZWN1dGlvbl9pZCA/PyBudWxsLFxuICAgICAgZGVwbG95Q29tcGxldGVkQXQ6IGhpdD8uY29tcGxldGVkX2F0ID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcHNlcnQgcGVyLW9yZyBpbmdlc3Rpb24gaGVhbHRoOiB0aGUgQVdTIGV2ZW50cyBMYW1iZGEgcGVyaW9kaWNhbGx5XG4gICAqIHJlcG9ydHMgZm9yd2FyZGVkL2Ryb3BwZWQgY291bnRlcnMgKyB0aGUgbGFzdCBldmVudCB0aW1lc3RhbXAgc28gdGhlIFJlcG9ydHNcbiAgICogVUkgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuIE9uZSByb3cgcGVyIG9yZyAodXBzZXJ0IG9uIG9yZ19pZCkuXG4gICAqL1xuICBhc3luYyByZWNvcmRJbmdlc3RIZWFsdGgoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBpbnB1dDogeyBmb3J3YXJkZWQ/OiBudW1iZXI7IGRyb3BwZWQ/OiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhc3RFdmVudEF0ID0gaW5wdXQubGFzdEV2ZW50QXQgPyBuZXcgRGF0ZShpbnB1dC5sYXN0RXZlbnRBdCkgOiB1bmRlZmluZWQ7XG4gICAgYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5pbmdlc3RIZWFsdGgpLnZhbHVlcyh7XG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBmb3J3YXJkZWQ6IGlucHV0LmZvcndhcmRlZCxcbiAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmluZ2VzdEhlYWx0aC5vcmdJZCxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgICAgZHJvcHBlZDogaW5wdXQuZHJvcHBlZCxcbiAgICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIH0sXG4gICAgICB9KSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGJhY2sgb25lIG9yZydzIGluZ2VzdGlvbiBoZWFsdGggZm9yIHRoZSBSZXBvcnRzIFVJIGZyZXNobmVzc1xuICAgKiBpbmRpY2F0b3IuIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIG9yZyBoYXMgTk8gcm93IOKAlCBpLmUuIHRoZSBkZXBsb3ltZW50IGhhc1xuICAgKiBuZXZlciBpbmdlc3RlZCBhbnl0aGluZyDigJQgd2hpY2ggdGhlIFVJIG11c3QgcmVuZGVyIGFzIFwibm8gaW5nZXN0IHJlcG9ydGVkXG4gICAqIHlldFwiLCBuZXZlciBhcyBcInN0YWxlXCIuIFJMUy1zY29wZWQgdG8gdGhlIG9yZyBsaWtlIGV2ZXJ5IG90aGVyIHJlYWQuXG4gICAqL1xuICBhc3luYyBnZXRJbmdlc3RIZWFsdGgob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8SW5nZXN0SGVhbHRoU3RhdHVzIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eFxuICAgICAgICAuc2VsZWN0KClcbiAgICAgICAgLmZyb20oc2NoZW1hLmluZ2VzdEhlYWx0aClcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5pbmdlc3RIZWFsdGgub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSxcbiAgICApO1xuICAgIGNvbnN0IHJvdyA9IHJvd3NbMF07XG4gICAgaWYgKCFyb3cpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVkQXQ6IHJvdy51cGRhdGVkQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RFdmVudEF0OiBpc29Pck51bGwocm93Lmxhc3RFdmVudEF0KSxcbiAgICAgIGZvcndhcmRlZDogcm93LmZvcndhcmRlZCA/PyBudWxsLFxuICAgICAgZHJvcHBlZDogcm93LmRyb3BwZWQgPz8gbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gc3dlZXA6IGhhcmQtZGVsZXRlcyByb3dzIHBhc3QgdGhlaXIgcGVyLW9yZyByZXRlbnRpb25cbiAgICogd2luZG93IChzcGxpdCBzdGFuZGFyZC1ldmVudCB2cyBET1JBLXNvdXJjZSkuIENyb3NzLXRlbmFudCBob3VzZWtlZXBpbmcg4oCUXG4gICAqIGl0IGVzdGFibGlzaGVzIGl0cyBvd24gc3lzYWRtaW4gc2NvcGUuIFNlZSAuL3JlcG9ydGluZy9yZXRlbnRpb24tc3dlZXAudHMuXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhKG9wdHM6IFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVwb3J0aW5nUmV0ZW50aW9uQ291bnRzPiB7XG4gICAgcmV0dXJuIHB1cmdlUmVwb3J0aW5nUmV0ZW50aW9uKG9wdHMpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXBvcnRpbmdTZXJ2aWNlID0gbmV3IFJlcG9ydGluZ1NlcnZpY2UoKTtcbiJdfQ==
827
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEgsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUUsZ0ZBQWdGO0FBQ2hGLDRFQUE0RTtBQUM1RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixzQkFBc0IsR0FFdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUNMLGNBQWMsSUFBSSxXQUFXLEVBQzdCLFlBQVksSUFBSSxTQUFTLEVBQ3pCLGNBQWMsSUFBSSxXQUFXLEdBQzlCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsOEVBQThFO0FBQzlFLE9BQU8sRUFBRSxZQUFZLElBQUksTUFBTSxFQUFFLE1BQU0sdUJB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QUksQ0FBQyx3REFBd0QsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBpc29Pck51bGwsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgZXEsIHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vLyBFeHRyYWN0ZWQgZm9yIHNpemUg4oCUIHNlZSAuL3JlcG9ydGluZy8uIEV2ZXJ5dGhpbmcgcHVibGljIGlzIHJlLWV4cG9ydGVkIGJlbG93XG4vLyBzbyBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAncyBzdXJmYWNlIGlzIHVuY2hhbmdlZCBieSB0aGUgc3BsaXQuXG5pbXBvcnQge1xuICBnZXRBZG9wdGlvbixcbiAgZ2V0RmFpbHVyZUFuYWx5c2lzLFxuICBnZXRPdXRkYXRlZFBsdWdpbnMsXG4gIGdldFBpcGVsaW5lQnJlYWtkb3duLFxuICBnZXRQaXBlbGluZUNvbmZpZ0NoYW5nZXMsXG4gIGdldFBpcGVsaW5lU3RyZWFrcyxcbiAgZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzLFxuICBnZXRQcm9tb3Rpb25WaWV3LFxuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uLFxuICBnZXRTdGFnZVBlcmZvcm1hbmNlLFxuICBnZXRVbnRyYWNrZWRQaXBlbGluZXMsXG4gIGdldFZ1bG5lcmFibGVQaXBlbGluZXMsXG4gIHR5cGUgQW5hbHl0aWNzU2NvcGUsXG59IGZyb20gJy4vcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLmpzJztcbmltcG9ydCB7IGludmVudG9yeUNhY2hlLCBpbnZhbGlkYXRlT3JnUmVwb3J0cyB9IGZyb20gJy4vcmVwb3J0aW5nL2NhY2hlcy5qcyc7XG5pbXBvcnQgeyBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUywgcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMgfSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RG9yYU1ldHJpY3MgYXMgZG9yYU1ldHJpY3MsXG4gIGdldERvcmFUcmVuZCBhcyBkb3JhVHJlbmQsXG4gIGdldEJ1aWxkSGVhbHRoIGFzIGJ1aWxkSGVhbHRoLFxufSBmcm9tICcuL3JlcG9ydGluZy9kb3JhLmpzJztcbi8vIEFsaWFzZWQ6IHRoZSBtb2R1bGUgZnVuY3Rpb25zIGFuZCB0aGUgZGVsZWdhdGluZyBtZXRob2RzIGJlbG93IHNoYXJlIG5hbWVzLlxuaW1wb3J0IHsgaW5nZXN0RXZlbnRzIGFzIGluZ2VzdCB9IGZyb20gJy4vcmVwb3J0aW5nL2luZ2VzdC5qcyc7XG5pbXBvcnQgeyBnZXRMYXN0RGVwbG95ZWRDb21taXQgYXMgbGFzdERlcGxveWVkQ29tbWl0IH0gZnJvbSAnLi9yZXBvcnRpbmcvbGFzdC1kZXBsb3kuanMnO1xuaW1wb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZU5lZWRzQXR0ZW50aW9uLCB0aHJlc2hvbGRzRnJvbSB9IGZyb20gJy4vcmVwb3J0aW5nL25lZWRzLWF0dGVudGlvbi5qcyc7XG5pbXBvcnQge1xuICBnZXRQbHVnaW5SdW50aW1lIGFzIHBsdWdpblJ1bnRpbWUsXG4gIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUgYXMgcGx1Z2luUnVudGltZUFnZ3JlZ2F0ZSxcbiAgaGFzVmVyaWZpZWRQbHVnaW5Vc2UgYXMgdmVyaWZpZWRQbHVnaW5Vc2UsXG59IGZyb20gJy4vcmVwb3J0aW5nL3BsdWdpbi1ydW50aW1lLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vcmVwb3J0aW5nL3F1ZXJ5LXNjb3BlLmpzJztcbmltcG9ydCB7IHB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGEgYXMgcHVyZ2VSZXBvcnRpbmdSZXRlbnRpb24gfSBmcm9tICcuL3JlcG9ydGluZy9yZXRlbnRpb24tc3dlZXAuanMnO1xuaW1wb3J0IHsgUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLCBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyB9IGZyb20gJy4vcmVwb3J0aW5nL3JldGVudGlvbi5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgYnVja2V0S2V5LCBwZXJpb2RCdWNrZXQsIHNjcnViT3B0aW9uYWwsIG9wdGlvbmFsU3RhcnRlZEF0UmFuZ2UsIHN0YXJ0ZWRBdFdpbmRvdyB9IGZyb20gJy4vcmVwb3J0aW5nL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRXhlY3V0aW9uQ291bnQsIFRpbWVTZXJpZXNFbnRyeSwgRHVyYXRpb25TdGF0cywgUGlwZWxpbmVFeGVjdXRpb24sIFN0YWdlRmFpbHVyZSwgU3RhZ2VCb3R0bGVuZWNrLFxuICBBY3Rpb25GYWlsdXJlLCBFcnJvckVudHJ5LCBQbHVnaW5TdW1tYXJ5LCBUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbiwgVmVyc2lvbkNvdW50LFxuICBCdWlsZFRpbWVTZXJpZXNFbnRyeSwgQnVpbGREdXJhdGlvbiwgQnVpbGRGYWlsdXJlLFxuICBQbHVnaW5SdW50aW1lQWdncmVnYXRlLCBQbHVnaW5SdW50aW1lRmlsdGVyLCBQbHVnaW5SdW50aW1lU3RhdHMsXG4gIFJlcG9ydGluZ1JldGVudGlvbk9wdGlvbnMsIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cyxcbiAgRG9yYU9wdGlvbnMsIFJlcG9ydGluZ1NldHRpbmdzLCBSZXBvcnRpbmdTZXR0aW5nc1BhdGNoLCBJbmNpZGVudExpc3RJdGVtLCBJbmNpZGVudFRlc3RSZXN1bHQsXG4gIERvcmFNZXRyaWNzLCBEb3JhVHJlbmRQb2ludCwgQnVpbGRIZWFsdGgsIEluY2lkZW50SW5wdXQsXG4gIEluZ2VzdENhbGxlciwgSW5nZXN0RXZlbnQsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LCBJbmdlc3RIZWFsdGhTdGF0dXMsXG4gIEJ1Y2tldE9wdGlvbnMsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcblxuLy8gVGhlIHJlcG9ydGluZyB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBwYWNrYWdlIEFQSS4gRW51bWVyYXRlZCByYXRoZXIgdGhhblxuLy8gYGV4cG9ydCAqYCBiZWNhdXNlIHRoZSByZXBvcnRpbmcgbW9kdWxlcyBhbHNvIGV4cG9ydCBpbnRlcm5hbHMgKG9yZ1Njb3BlLFxuLy8gcnVuUmVwb3J0LCB0aGUgY2FjaGVzLCB0aGUgRE9SQSByb3cgc2hhcGVzKSB0aGF0IG11c3Qgc3RheSBwcml2YXRlLlxuZXhwb3J0IHR5cGUgeyBMYXN0RGVwbG95ZWRDb21taXQgfSBmcm9tICcuL3JlcG9ydGluZy9sYXN0LWRlcGxveS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJ1Y2tldE9wdGlvbnMsXG4gIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLCBEb3JhRW52TWV0cmljcywgRG9yYUxldmVsLCBEb3JhTWV0cmljcywgRG9yYU9wdGlvbnMsIERvcmFUcmVuZFBvaW50LFxuICBJbmNpZGVudElucHV0LCBJbmNpZGVudExpc3RJdGVtLCBSZXBvcnRpbmdTZXR0aW5ncywgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICBJbmdlc3RDYWxsZXIsIEluZ2VzdEV2ZW50LCBJbmdlc3RIZWFsdGhTdGF0dXMsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0LFxuICBQbHVnaW5SdW50aW1lQWdncmVnYXRlLCBQbHVnaW5SdW50aW1lRmlsdGVyLCBQbHVnaW5SdW50aW1lU3RhdHMsXG4gIFJlcG9ydGluZ1JldGVudGlvbkNvdW50cywgUmVwb3J0aW5nUmV0ZW50aW9uT3B0aW9ucywgUmVwb3J0aW5nUmV0ZW50aW9uU2V0dGluZ3MsXG4gIFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gsXG59IGZyb20gJy4vcmVwb3J0aW5nL3R5cGVzLmpzJztcblxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdTZXJ2aWNlIHtcblxuICAvKiogSW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlcG9ydHMgZm9yIGFuIG9yZyAoY2FsbCBhZnRlciBldmVudCBpbmdlc3QpLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBpbnZhbGlkYXRlT3JnUmVwb3J0cyhvcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAgICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICAgKiBTZWUgLi9yZXBvcnRpbmcvaW5nZXN0LnRzIOKAlCB0aGUgY2FsbGVyIG11c3QgYWxyZWFkeSBob2xkIGEgc3lzYWRtaW5cbiAgICogdGVuYW50IHNjb3BlLCBiZWNhdXNlIGEgYmF0Y2ggc3BhbnMgd2hhdGV2ZXIgb3JncyB0aGUgcmVnaXN0cnkgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICBhc3luYyBpbmdlc3RFdmVudHMoZXZlbnRzOiBJbmdlc3RFdmVudFtdLCBvbk1ldHJpYz86IChtOiBJbmdlc3RNZXRyaWMpID0+IHZvaWQsIGNhbGxlcj86IEluZ2VzdENhbGxlcik6IFByb21pc2U8SW5nZXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIGluZ2VzdChldmVudHMsIG9uTWV0cmljLCBjYWxsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc2hhIG9mIHRoaXMgcGlwZWxpbmUncyBsYXN0IHN1Y2Nlc3NmdWwgZGVwbG95IOKAlCB0byBgZW52aXJvbm1lbnRgXG4gICAqIHdoZW4gZ2l2ZW4sIHRvIGFueXdoZXJlIG90aGVyd2lzZS4gVGhlIGV4Y2x1c2l2ZSBsb3dlciBib3VuZCBmb3IgXCJjb21taXRzXG4gICAqIHNpbmNlIHRoZSBsYXN0IGRlcGxveVwiLiBUZW5hbmN5IGlzIGVuZm9yY2VkIGZyb20gYGNhbGxlcmAgZXhhY3RseSBhc1xuICAgKiB7QGxpbmsgaW5nZXN0RXZlbnRzfSBkb2VzIGl0LlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFzdERlcGxveWVkQ29tbWl0KHBpcGVsaW5lSWQ6IHN0cmluZywgZW52aXJvbm1lbnQ/OiBzdHJpbmcsIGNhbGxlcj86IEluZ2VzdENhbGxlcik6IFByb21pc2U8TGFzdERlcGxveWVkQ29tbWl0PiB7XG4gICAgcmV0dXJuIGxhc3REZXBsb3llZENvbW1pdChwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgY2FsbGVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAxOiBQaXBlbGluZSBFeGVjdXRpb24gJiBQZXJmb3JtYW5jZSDilIDilIBcblxuXG4gIC8qKiBFeGVjdXRpb24gY291bnQgcGVyIHBpcGVsaW5lIHdpdGggc3RhdHVzIGJyZWFrZG93bi4gKi9cbiAgYXN5bmMgZ2V0RXhlY3V0aW9uQ291bnQob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9KTogUHJvbWlzZTxFeGVjdXRpb25Db3VudFtdPiB7XG4gICAgLy8gT3B0aW9uYWwgW2Zyb20sdG9dIHdpbmRvdyBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdCwgbWlycm9yaW5nIHRoZVxuICAgIC8vIHNpYmxpbmcgdGltZXNlcmllcyByZXBvcnRzIHNvIHRoZSBkYXNoYm9hcmQgZGF0ZS1yYW5nZSBwaWNrZXIgbmFycm93cyB0aGVcbiAgICAvLyBjb3VudCB0b28gKGFuIGVtcHR5IHJhbmdlID0gYWxsLXRpbWUsIHByZXNlcnZpbmcgdGhlIHByaW9yIGJlaGF2aW9yKS4gVGhlXG4gICAgLy8gcmFuZ2UgcmlkZXMgdGhlIEpPSU4gc28gcGlwZWxpbmVzIHdpdGggbm8gaW4td2luZG93IGV2ZW50cyBzdGlsbCBsaXN0XG4gICAgLy8gKExFRlQgc2VtYW50aWNzIHByZXNlcnZlZCB2aWEgdGhlIGlubmVyLWpvaW4gZmlsdGVyIOKAlCBhIHBpcGVsaW5lIHdpdGggemVyb1xuICAgIC8vIG1hdGNoaW5nIGV2ZW50cyBkcm9wcyBmcm9tIHRoZSBjb3VudCwgc2FtZSBhcyBiZWZvcmUgZm9yIGl0cyB3aW5kb3cpLlxuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIHJlcG9ydDxFeGVjdXRpb25Db3VudD4oYGV4ZWMtY291bnQ6JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5wcm9qZWN0LCBwLm9yZ2FuaXphdGlvbiwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIE1JTihlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGZpcnN0X2V4ZWN1dGlvbixcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X2V4ZWN1dGlvblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lfSBwXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZSBPTiBlLnBpcGVsaW5lX2lkID0gcC5pZFxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyAhPSAnU1RBUlRFRCdcbiAgICAgICAgICAke3JhbmdlQ2xhdXNlfVxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBwLmlzX2FjdGl2ZSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgcC5pZFxuICAgICAgICBPUkRFUiBCWSB0b3RhbCBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXItcGlwZWxpbmUgZXhlY3V0aW9uIGhpc3Rvcnkg4oCUIERJU1RJTkNUIGV4ZWN1dGlvbnMgZm9yIG9uZSBwaXBlbGluZSxcbiAgICogbmV3ZXN0IGZpcnN0LiBHcm91cHMgYWxsIGV2ZW50cyBieSBgZXhlY3V0aW9uX2lkYCBpbiBhIHNpbmdsZSBzY2FuIGFuZFxuICAgKiByb2xscyBlYWNoIGV4ZWN1dGlvbiB1cCB0byBvbmUgcm93OlxuICAgKiAgIC0gc3RhdHVzOiBkZXJpdmVkIGZyb20gdGhlIFBJUEVMSU5FLXR5cGUgZXZlbnRzLiBGQUlMRUQgd2lucywgdGhlblxuICAgKiAgICAgU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEOyBhbiBleGVjdXRpb24gd2l0aCBubyB0ZXJtaW5hbCBQSVBFTElORSBldmVudFxuICAgKiAgICAgaXMgc3RpbGwgYGluLXByb2dyZXNzYC5cbiAgICogICAtIHN0YXJ0ZWRBdC9lbmRlZEF0L2R1cmF0aW9uTXM6IGZyb20gdGhlIFBJUEVMSU5FIGxpZmVjeWNsZSBldmVudHMuXG4gICAqICAgLSBmYWlsaW5nU3RhZ2UvZmFpbGluZ0FjdGlvbjogdGhlIGZpcnN0IEZBSUxFRCBTVEFHRS9BQ1RJT04gZXZlbnQgKGNoZWFwIOKAlFxuICAgKiAgICAgc2FtZSBzY2FuLCBubyBleHRyYSBxdWVyeSkuXG4gICAqXG4gICAqIE9SRy1TQ09QSU5HOiBpZGVudGljYWwgdG8gdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHMg4oCUIGpvaW5zIHRoZSBwaXBlbGluZVxuICAgKiByZWdpc3RyeSB0YWJsZSAoYHBpcGVsaW5lYCkgYW5kIGdhdGVzIG9uIGBwLm9yZ19pZCAke3ByZWR9YCwgd2hlcmUgYHByZWRgIGlzXG4gICAqIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgIG9yICh3aXRoIGEgcm9sbHVwKSBhbiBgSU4gKC4uLilgIG92ZXIgdGhlIG9yZ+KGknRlYW1cbiAgICogc3VidHJlZS4gQSBwaXBlbGluZUlkIGJlbG9uZ2luZyB0byBhbm90aGVyIG9yZyB5aWVsZHMgemVybyByb3dzLlxuICAgKi9cbiAgYXN5bmMgbGlzdFBpcGVsaW5lRXhlY3V0aW9ucyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSxcbiAgICBsaW1pdDogbnVtYmVyID0gNTAsXG4gICk6IFByb21pc2U8UGlwZWxpbmVFeGVjdXRpb25bXT4ge1xuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gb3B0aW9uYWxTdGFydGVkQXRSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIHJlcG9ydDxQaXBlbGluZUV4ZWN1dGlvbj4oYHBpcGVsaW5lLWV4ZWN1dGlvbnM6JHtwaXBlbGluZUlkfToke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ306JHtsaW1pdH1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykgVEhFTiAnZmFpbGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ3N1Y2NlZWRlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpIFRIRU4gJ2NhbmNlbGVkJ1xuICAgICAgICAgICAgRUxTRSAnaW4tcHJvZ3Jlc3MnXG4gICAgICAgICAgRU5EIEFTIHN0YXR1cyxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIGVuZGVkX2F0LFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjppbnQgQVMgZHVyYXRpb25fbXMsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLnN0YWdlX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfc3RhZ2UsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLmFjdGlvbl9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19hY3Rpb25cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0gQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWRcbiAgICAgICAgT1JERVIgQlkgTUFYKGUuY3JlYXRlZF9hdCkgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShcbiAgICBvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIGJ1Y2tldDogQnVja2V0T3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBUaGUgYnVja2V0aW5nIHNldHRpbmdzIGFyZSBwYXJ0IG9mIHRoZSBjYWNoZSBLRVk6IHdpdGhvdXQgdGhlbSBhIENoaWNhZ29cbiAgICAvLyByZXF1ZXN0IGFuZCBhIFVUQyByZXF1ZXN0IHNoYXJlIGFuIGVudHJ5IGFuZCBvbmUgb2YgdGhlbSBnZXRzIHRoZSBvdGhlcidzIHdlZWtzLlxuICAgIHJldHVybiByZXBvcnQ8VGltZVNlcmllc0VudHJ5Pihgc3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtidWNrZXRLZXkodHosIHdlZWtTdGFydCl9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtwZXJpb2RCdWNrZXQoaW50ZXJ2YWwsIHNxbGBlLnN0YXJ0ZWRfYXRgLCB0eiwgd2Vla1N0YXJ0KX06OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQXZlcmFnZSBkdXJhdGlvbiBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldEF2ZXJhZ2VEdXJhdGlvbihvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxEdXJhdGlvblN0YXRzW10+IHtcbiAgICByZXR1cm4gcmVwb3J0PER1cmF0aW9uU3RhdHM+KGBhdmctZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogU3RhZ2UgZmFpbHVyZSBoZWF0bWFwIOKAlCB3aGljaCBzdGFnZXMgZmFpbCBtb3N0LiAqL1xuICBhc3luYyBnZXRTdGFnZUZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFN0YWdlRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxTdGFnZUZhaWx1cmU+KGBzdGFnZS1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBkZXBsb3kgYGVudmlyb25tZW50YCB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIHdpbmRvdyDigJQgcG93ZXJzIHRoZVxuICAgKiBET1JBIGVudmlyb25tZW50LXNjb3BlIGRhdGFsaXN0LiBPcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmdcbiAgICogcmVwb3J0czsgb25seSBub24tbnVsbCBlbnZpcm9ubWVudHMgKGkuZS4gZGVwbG95LWF0dHJpYnV0ZWQgZXhlY3V0aW9ucykuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcmVwb3J0PHsgZW52aXJvbm1lbnQ6IHN0cmluZyB9PihgcmVwb3J0LWVudnM6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBPUkRFUiBCWSBlbnZpcm9ubWVudFxuICAgICAgYCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICAvKiogU3RhZ2UgYm90dGxlbmVja3Mg4oCUIHNsb3dlc3Qgc3RhZ2VzIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VCb3R0bGVuZWNrcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUJvdHRsZW5lY2tbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8U3RhZ2VCb3R0bGVuZWNrPihgc3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucGlwZWxpbmVfbmFtZSwgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQWN0aW9uIGZhaWx1cmUgcmF0ZSDigJQgd2hpY2ggcGx1Z2luIHN0ZXBzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0QWN0aW9uRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxBY3Rpb25GYWlsdXJlPihgYWN0aW9uLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgZS5hY3Rpb25fbmFtZSBPUkRFUiBCWSBmYWlsdXJlcyBERVNDXG4gICAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gRXhlY3V0aW9uIHJlcG9ydCwgc29cbiAgICogcm9sbHVwLWF3YXJlIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0czogd2l0aCBgb3JnSWRzYFxuICAgKiAodGhlIG9yZ+KGknRlYW0gc3VidHJlZSkgdGhlIG9yZyBnYXRlIGJlY29tZXMgYW4gYElOICguLi4pYCBhbmQgdGhlIHJlYWQgcnVuc1xuICAgKiBmcmVzaCB1bmRlciBzeXNhZG1pbiB2aWEgYHJ1blJlcG9ydGA7IHNpbmdsZS1vcmcgcmVhZHMga2VlcCB0aGUgcGVyLW9yZyBjYWNoZS5cbiAgICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEVycm9yRW50cnlbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8RXJyb3JFbnRyeT4oYGVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgb3JnSWQsIG9yZ0lkcywgKHByZWQpID0+IHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBlcnJvcl9wYXR0ZXJuIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3VyIERPUkEgbWVhc3VyZXMgcGx1cyB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLlxuICAgKiBJbXBsZW1lbnRhdGlvbiBpbiAuL3JlcG9ydGluZy9kb3JhLnRzIOKAlCBzZWUgdGhhdCBmaWxlJ3MgaGVhZGVyIGZvciB3aHkuXG4gICAqL1xuICBnZXREb3JhTWV0cmljcyhcbiAgICBvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gICAgcmV0dXJuIGRvcmFNZXRyaWNzKG9yZ0lkLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBET1JBIG1lYXN1cmVzIGJ1Y2tldGVkIG92ZXIgdGltZS4gKi9cbiAgZ2V0RG9yYVRyZW5kKFxuICAgIG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8RG9yYVRyZW5kUG9pbnRbXT4ge1xuICAgIHJldHVybiBkb3JhVHJlbmQob3JnSWQsIGludGVydmFsLCBmcm9tLCB0bywgb3JnSWRzLCBvcHRzKTtcbiAgfVxuXG4gIC8qKiBQZXItcGlwZWxpbmUgYnVpbGQgaGVhbHRoIChzdGFnZSBwYXNzIHJhdGVzIG92ZXIgYSB3aW5kb3cpLiAqL1xuICBnZXRCdWlsZEhlYWx0aChcbiAgICBvcmdJZDogc3RyaW5nLCBwaXBlbGluZUlkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QnVpbGRIZWFsdGg+IHtcbiAgICByZXR1cm4gYnVpbGRIZWFsdGgob3JnSWQsIHBpcGVsaW5lSWQsIGZyb20sIHRvLCBvcmdJZHMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UGx1Z2luU3VtbWFyeShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW5TdW1tYXJ5PiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tc3VtbWFyeWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgTk9UICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0pOjppbnQgQVMgaW5hY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAnb3JnJyk6OmludCBBUyBvcmcsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4udmlzaWJpbGl0eX0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIG9yZzogMCwgcHJpdmF0ZTogMCwgdW5pcXVlTmFtZXM6IDAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgLS0gSGlnaGVzdCB2ZXJzaW9uIGJ5IE5VTUVSSUMgc2VtdmVyIGNvcmUgKG5vdCBsZXhpY2FsOiAnMTAuMC4wJyA+ICc5LjAuMCcpLlxuICAgICAgICAgIC0tIFN0cmlwIGFueSAtcHJlcmVsZWFzZS8rYnVpbGQgc3VmZml4IGJlZm9yZSB0aGUgaW50W10gY2FzdCBzbyBpdCBjYW4ndFxuICAgICAgICAgIC0tIGVycm9yIG9uIHZhbGlkIHNlbXZlcjsga2VlcCB0aGUgb3JpZ2luYWwgc3RyaW5nIGZvciBkaXNwbGF5LlxuICAgICAgICAgIC0tIEdVQVJEOiBhIG5vbi1udW1lcmljLWRvdHRlZCB2ZXJzaW9uICgnbGF0ZXN0JywgJycsICd2MScpIHdvdWxkIG1ha2UgdGhlXG4gICAgICAgICAgLS0gOjppbnRbXSBjYXN0IHRocm93IGFuZCBibG93IHVwIHRoZSBXSE9MRSBvcmcgc3VtbWFyeS4gT25seSBjYXN0IHJvd3NcbiAgICAgICAgICAtLSB3aG9zZSBzdHJpcHBlZCBjb3JlIG1hdGNoZXMgYSBudW1lcmljLWRvdHRlZCBzaGFwZTsgc29ydCBldmVyeXRoaW5nXG4gICAgICAgICAgLS0gZWxzZSB0byB0aGUgYm90dG9tIHZpYSBhIHNlbnRpbmVsIEFSUkFZWy0xXSBzbyB0aGUgcm93IHN0aWxsIGNvdW50cy5cbiAgICAgICAgICAoYXJyYXlfYWdnKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufVxuICAgICAgICAgICAgIE9SREVSIEJZIENBU0VcbiAgICAgICAgICAgICAgIFdIRU4gcmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSB+ICdeWzAtOV0rKFsuXVswLTldKykqJCdcbiAgICAgICAgICAgICAgICAgVEhFTiBzdHJpbmdfdG9fYXJyYXkocmVnZXhwX3JlcGxhY2UoJHtzY2hlbWEucGx1Z2luLnZlcnNpb259LCAnWy0rXS4qJCcsICcnKSwgJy4nKTo6aW50W11cbiAgICAgICAgICAgICAgIEVMU0UgQVJSQVlbLTFdXG4gICAgICAgICAgICAgRU5EIERFU0NcbiAgICAgICAgICApKVsxXSBBUyBsYXRlc3RfdmVyc2lvbixcbiAgICAgICAgICBib29sX29yKCR7c2NoZW1hLnBsdWdpbi5pc0RlZmF1bHR9KSBBUyBoYXNfZGVmYXVsdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9IEFORCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9ID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSAke3NjaGVtYS5wbHVnaW4ubmFtZX1cbiAgICAgICAgT1JERVIgQlkgdmVyc2lvbl9jb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VmVyc2lvbkNvdW50PihyLnJvd3MpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUoXG4gICAgb3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICBidWNrZXQ6IEJ1Y2tldE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgdHogPSAnVVRDJywgd2Vla1N0YXJ0ID0gJ21vbmRheScgfSA9IGJ1Y2tldDtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZFRpbWVTZXJpZXNFbnRyeT4oYGJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke2J1Y2tldEtleSh0eiwgd2Vla1N0YXJ0KX1gLCBvcmdJZCwgb3JnSWRzLCAocHJlZCkgPT4gc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3BlcmlvZEJ1Y2tldChpbnRlcnZhbCwgc3FsYGUuc3RhcnRlZF9hdGAsIHR6LCB3ZWVrU3RhcnQpfTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EICR7c3RhcnRlZEF0V2luZG93KGZyb20sIHRvKX1cbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgcmV0dXJuIHJlcG9ydDxCdWlsZER1cmF0aW9uPihgYnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBidWlsZHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgJHtzdGFydGVkQXRXaW5kb3coZnJvbSwgdG8pfVxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCk7XG4gIH1cblxuICAvKiogQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIHJldHVybiByZXBvcnQ8QnVpbGRGYWlsdXJlPihgYnVpbGQtZmFpbHVyZXM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG9yZ0lkLCBvcmdJZHMsIChwcmVkKSA9PiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIGUuZXJyb3JfbWVzc2FnZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJyBBTkQgZS5zdGF0dXMgPSAnZmFpbGVkJ1xuICAgICAgICAgIEFORCAke3N0YXJ0ZWRBdFdpbmRvdyhmcm9tLCB0byl9XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCk7XG4gIH1cblxuICAvLyDilIDilIAgUGx1Z2luIHJ1bnRpbWUgdGVsZW1ldHJ5IOKAlCBzZWUgLi9yZXBvcnRpbmcvcGx1Z2luLXJ1bnRpbWUudHMg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFBsdWdpbiBydW50aW1lOiBwZXIgcGx1Z2luIHZlcnNpb24gcnVucywgc3VjY2VzcyByYXRlIGFuZCBwNTAvcDk1XG4gICAqIGR1cmF0aW9uIG92ZXIgYFtmcm9tLCB0b11gLCBmcm9tIHRoZSBtYW5pZmVzdC1hdHRyaWJ1dGVkIEFDVElPTiBldmVudHMuXG4gICAqIFJvbGx1cC1hd2FyZS5cbiAgICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWUob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBmaWx0ZXI/OiBQbHVnaW5SdW50aW1lRmlsdGVyLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8UGx1Z2luUnVudGltZVN0YXRzW10+IHtcbiAgICByZXR1cm4gcGx1Z2luUnVudGltZShvcmdJZCwgZnJvbSwgdG8sIGZpbHRlciwgb3JnSWRzKTtcbiAgfVxuXG4gIC8qKiBDcm9zcy1vcmcgMzAtZGF5IHJ1bnRpbWUgYWdncmVnYXRlIGZvciBhIGAocHVibGlzaGVyLCBuYW1lKWAgbGlzdGluZyAocGx1Z2luX3N0YXRzIGlucHV0KS4gU2VydmljZSBjYWxsZXJzIG9ubHkuICovXG4gIGFzeW5jIGdldFBsdWdpblJ1bnRpbWVBZ2dyZWdhdGUocHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luUnVudGltZUFnZ3JlZ2F0ZT4ge1xuICAgIHJldHVybiBwbHVnaW5SdW50aW1lQWdncmVnYXRlKHB1Ymxpc2hlciwgbmFtZSk7XG4gIH1cblxuICAvKiogUmV2aWV3IFwidmVyaWZpZWQgdXNlXCI6IGBvcmdJZGAgcmFuIGAocHVibGlzaGVyLCBuYW1lKWAgc3VjY2Vzc2Z1bGx5IHdpdGhpbiA5MCBkYXlzLiBTZXJ2aWNlIGNhbGxlcnMgb25seS4gKi9cbiAgYXN5bmMgaGFzVmVyaWZpZWRQbHVnaW5Vc2Uob3JnSWQ6IHN0cmluZywgcHVibGlzaGVyOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZmllZFBsdWdpblVzZShvcmdJZCwgcHVibGlzaGVyLCBuYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAzOiBET1JBIHdyaXRlIHBhdGhzIChwb3N0LWRlcGxveSBvdXRjb21lcyArIGluZ2VzdCBoZWFsdGgpIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSBtYW51YWwgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXI6IGEgdXNlciBtYXJrcyBhXG4gICAqIGRlcGxveW1lbnQgYGZhaWxlZGAgKGEgcHJvZHVjdGlvbiBpbmNpZGVudCBsaW5rZWQgdG8gdGhlIGRlcGxveSkgb3JcbiAgICogYHJlc3RvcmVkYCAocmVjb3ZlcmVkKS4gSWRlbXBvdGVudCDigJQga2V5ZWQgb24gKGV4ZWN1dGlvbl9pZCwgb3V0Y29tZSkgc28gYVxuICAgKiBkdXBsaWNhdGUgUE9TVCByZWZyZXNoZXMgYGF0YCByYXRoZXIgdGhhbiBkb3VibGUtY291bnRpbmcsIHdoaWxlIGFcbiAgICogZmFpbGVk4oaScmVzdG9yZWQgcGFpciBzdGF5cyB0d28gcm93cy4gRmVlZHMgdGhlIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQgYW5kXG4gICAqIHRoZSByZWFsIE1UVFIuIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSykuXG4gICAqL1xuICBhc3luYyByZWNvcmREZXBsb3ltZW50T3V0Y29tZShcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgb3V0Y29tZTogJ2ZhaWxlZCcgfCAncmVzdG9yZWQnOyBhdDogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lKS52YWx1ZXMoe1xuICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSxcbiAgICAgICAgb3V0Y29tZTogaW5wdXQub3V0Y29tZSxcbiAgICAgICAgYXQ6IG5ldyBEYXRlKGlucHV0LmF0KSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogW3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZS5leGVjdXRpb25JZCwgc2NoZW1hLmRlcGxveW1lbnRPdXRjb21lLm91dGNvbWVdLFxuICAgICAgICBzZXQ6IHtcbiAgICAgICAgICBhdDogbmV3IERhdGUoaW5wdXQuYXQpLFxuICAgICAgICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGlucHV0LmVudmlyb25tZW50KSA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgLy8gT3V0Y29tZSBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCB0aGUgb3JnJ3MgY2FjaGVkIHJlcG9ydHMuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5nZXN0IGEgcHJvZHVjdGlvbiBpbmNpZGVudCBmcm9tIHRoZSBvcmcncyBpbmNpZGVudCB0b29saW5nXG4gICAqIChQYWdlckR1dHkgLyBEYXRhZG9nIC8gQWxlcnRtYW5hZ2VyIHdlYmhvb2spLiBJZGVtcG90ZW50IOKAlCBrZXllZCBvblxuICAgKiAob3JnX2lkLCBpbmNpZGVudF9pZCkgc28gYSBsYXRlciByZXNvbHZlIHJlLXBvc3QgdXBzZXJ0cyBgcmVzb2x2ZWRfYXRgXG4gICAqIChhbmQgcmVmcmVzaGVzIHRoZSBvdGhlciBtdXRhYmxlIGZpZWxkcykgaW5zdGVhZCBvZiBpbnNlcnRpbmcgYSBkdXBsaWNhdGUuXG4gICAqIERPUkEgY29ycmVsYXRlcyBlYWNoIGluY2lkZW50IHRvIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB0byBpdHNcbiAgICogYGVudmlyb25tZW50YCwgcHJvZHVjaW5nIGFuIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlICsgYSByZWFsIE1UVFIuXG4gICAqIFJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIG9yZyBjb250ZXh0IChSTFMgV0lUSCBDSEVDSyk7IGZyZWUtZm9ybSBmaWVsZHMgYXJlXG4gICAqIEFXUy1pZCBzY3J1YmJlZCBhdCB0aGlzIHBlcnNpc3RlbmNlIGJvdW5kYXJ5IGxpa2UgdGhlIG90aGVyIGluZ2VzdCBwYXRocy5cbiAgICovXG4gIGFzeW5jIHJlY29yZEluY2lkZW50KG9yZ0lkOiBzdHJpbmcsIGlucHV0OiBJbmNpZGVudElucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5jaWRlbnRJZCA9IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGlucHV0LmluY2lkZW50SWQpO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IHNldmVyaXR5ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoaW5wdXQuc2V2ZXJpdHkpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoaW5wdXQub3BlbmVkQXQpO1xuICAgIGNvbnN0IHJlc29sdmVkQXQgPSBpbnB1dC5yZXNvbHZlZEF0ID8gbmV3IERhdGUoaW5wdXQucmVzb2x2ZWRBdCkgOiBudWxsO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuaW5jaWRlbnQpLnZhbHVlcyh7XG4gICAgICAgIGluY2lkZW50SWQsXG4gICAgICAgIG9yZ0lkLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgIHJlc29sdmVkQXQsXG4gICAgICAgIHNldmVyaXR5LFxuICAgICAgfSkub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbc2NoZW1hLmluY2lkZW50Lm9yZ0lkLCBzY2hlbWEuaW5jaWRlbnQuaW5jaWRlbnRJZF0sXG4gICAgICAgIC8vIEEgcmVkZWxpdmVyZWQgRklSSU5HIHBvc3QgKG5vIHJlc29sdmVkQXQpIG11c3Qgbm90IHdpcGUgYSByZWNvcmRlZFxuICAgICAgICAvLyByZXNvbHZlIOKAlCBzZW5kZXJzIHJlLXBvc3QgZmlyaW5nIGFsZXJ0cyBvbiBldmVyeSByZXBlYXQgaW50ZXJ2YWwsIGFuZFxuICAgICAgICAvLyBkZWxpdmVyeSBvcmRlciBpc24ndCBndWFyYW50ZWVkLiBLZWVwIHRoZSBzdG9yZWQgcmVzb2x2ZSB1bmxlc3MgdGhlXG4gICAgICAgIC8vIHBvc3QgY2FycmllcyBpdHMgb3duLCBvciB0aGUgaW5jaWRlbnQgd2FzIFJFLU9QRU5FRCAoYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gb3BlbmVkQXQgbWVhbnMgYSBuZXcgb2NjdXJyZW5jZSwgd2hvc2UgcmVzb2x2ZSBzdGF0ZSBpcyB0aGUgcG9zdCdzKS5cbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgb3BlbmVkQXQsXG4gICAgICAgICAgcmVzb2x2ZWRBdDogc3FsYENBU0UgV0hFTiAke3NjaGVtYS5pbmNpZGVudC5vcGVuZWRBdH0gPSBleGNsdWRlZC5vcGVuZWRfYXRcbiAgICAgICAgICAgIFRIRU4gQ09BTEVTQ0UoZXhjbHVkZWQucmVzb2x2ZWRfYXQsICR7c2NoZW1hLmluY2lkZW50LnJlc29sdmVkQXR9KVxuICAgICAgICAgICAgRUxTRSBleGNsdWRlZC5yZXNvbHZlZF9hdCBFTkRgLFxuICAgICAgICAgIHNldmVyaXR5LFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgLy8gQSBuZXcvdXBkYXRlZCBpbmNpZGVudCBjaGFuZ2VzIHRoZSBET1JBIGFnZ3JlZ2F0ZSDigJQgZHJvcCBjYWNoZWQgcmVwb3J0cy5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVPcmcob3JnSWQpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBwZXItb3JnIERPUkEgc2V0dGluZ3MuIFJldHVybnMgdGhlIHN0b3JlZFxuICAgKiBgaW5jaWRlbnRXaW5kb3dIb3Vyc2Agb3ZlcnJpZGUgKG9yIGBudWxsYCB3aGVuIHVuc2V0KSBwbHVzIHRoZSBnbG9iYWwgZW52XG4gICAqIGRlZmF1bHQsIHNvIHRoZSBzZXR0aW5ncyBVSSBjYW4gc2hvdyBib3RoLiBSdW5zIHVuZGVyIHRoZSBjYWxsZXIncyB0ZW5hbnRcbiAgICogY29udGV4dCAoUkxTLXNjb3BlZCk7IGEgc2luZ2xlLW9yZyByZWFkLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQ6IHN0cmluZywgcmV0ZW50aW9uT3JnSWQ6IHN0cmluZyA9IG9yZ0lkKTogUHJvbWlzZTxSZXBvcnRpbmdTZXR0aW5ncz4ge1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czx7XG4gICAgICBpbmNpZGVudF93aW5kb3dfaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgICBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGRvcmFfcmV0ZW50aW9uX2RheXM6IG51bWJlciB8IG51bGw7XG4gICAgfT4oKGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1QgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmluY2lkZW50V2luZG93SG91cnN9IEFTIGluY2lkZW50X3dpbmRvd19ob3VycyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5ldmVudFJldGVudGlvbkRheXN9IEFTIGV2ZW50X3JldGVudGlvbl9kYXlzLFxuICAgICAgICAgICAgICAgJHtzY2hlbWEuZG9yYVNldHRpbmdzLmRvcmFSZXRlbnRpb25EYXlzfSBBUyBkb3JhX3JldGVudGlvbl9kYXlzXG4gICAgICAgIEZST00gJHtzY2hlbWEuZG9yYVNldHRpbmdzfVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKTtcbiAgICBjb25zdCByb3cgPSByb3dzWzBdO1xuICAgIC8vIFJldGVudGlvbiBpcyBhIGJpbGxpbmcgZW50aXRsZW1lbnQgc3luY2VkIG9udG8gdGhlIGFjY291bnQgUk9PVCBvbmx5OyBhXG4gICAgLy8gdGVhbSByZWFkcyBpdHMgcm9vdCdzIHdpbmRvdyAodGhlIGluY2lkZW50IHdpbmRvdyBzdGF5cyB0aGUgdGVhbSdzIG93bikuXG4gICAgY29uc3QgcmV0ZW50aW9uID0gcmV0ZW50aW9uT3JnSWQgPT09IG9yZ0lkXG4gICAgICA/IHJvd1xuICAgICAgOiBhd2FpdCB0aGlzLiNyZWFkUmV0ZW50aW9uT3ZlcnJpZGUocmV0ZW50aW9uT3JnSWQpO1xuICAgIHJldHVybiB7XG4gICAgICBpbmNpZGVudFdpbmRvd0hvdXJzOiByb3c/LmluY2lkZW50X3dpbmRvd19ob3VycyAhPSBudWxsID8gTnVtYmVyKHJvdy5pbmNpZGVudF93aW5kb3dfaG91cnMpIDogbnVsbCxcbiAgICAgIGRlZmF1bHRXaW5kb3dIb3VyczogRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsXG4gICAgICBldmVudFJldGVudGlvbkRheXM6IHJldGVudGlvbj8uZXZlbnRfcmV0ZW50aW9uX2RheXMgIT0gbnVsbCA/IE51bWJlcihyZXRlbnRpb24uZXZlbnRfcmV0ZW50aW9uX2RheXMpIDogbnVsbCxcbiAgICAgIGRvcmFSZXRlbnRpb25EYXlzOiByZXRlbnRpb24/LmRvcmFfcmV0ZW50aW9uX2RheXMgIT0gbnVsbCA/IE51bWJlcihyZXRlbnRpb24uZG9yYV9yZXRlbnRpb25fZGF5cykgOiBudWxsLFxuICAgICAgZGVmYXVsdEV2ZW50UmV0ZW50aW9uRGF5czogUkVQT1JUSU5HX0VWRU5UX1JFVEVOVElPTl9EQVlTLFxuICAgICAgZGVmYXVsdERvcmFSZXRlbnRpb25EYXlzOiBSRVBPUlRJTkdfRE9SQV9SRVRFTlRJT05fREFZUyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBST09UIG9yZydzIHN0b3JlZCByZXRlbnRpb24gb3ZlcnJpZGUuIFRoZSBjYWxsZXIgKGEgdGVhbSkgY2FuJ3Qgc2VlIHRoZVxuICAgKiByb290J3MgYGRvcmFfc2V0dGluZ3NgIHJvdyB1bmRlciBpdHMgb3duIFJMUyBzY29wZSwgc28gdGhpcyBuYXJyb3cgcmVhZCBvZlxuICAgKiB0d28gaW50ZWdlciBjb2x1bW5zIOKAlCBrZXllZCBieSB0aGUgZXhwbGljaXQsIEpXVC1kZXJpdmVkIHJvb3QgaWQg4oCUIHJ1bnMgaW4gYVxuICAgKiBzeXNhZG1pbiBzY29wZS5cbiAgICovXG4gIGFzeW5jICNyZWFkUmV0ZW50aW9uT3ZlcnJpZGUob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8eyBldmVudF9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDsgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbCB9IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGFzeW5jICgpID0+IGRyaXp6bGVSb3dzPHtcbiAgICAgIGV2ZW50X3JldGVudGlvbl9kYXlzOiBudW1iZXIgfCBudWxsO1xuICAgICAgZG9yYV9yZXRlbnRpb25fZGF5czogbnVtYmVyIHwgbnVsbDtcbiAgICB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCAke3NjaGVtYS5kb3JhU2V0dGluZ3MuZXZlbnRSZXRlbnRpb25EYXlzfSBBUyBldmVudF9yZXRlbnRpb25fZGF5cyxcbiAgICAgICAgICAgICAgICR7c2NoZW1hLmRvcmFTZXR0aW5ncy5kb3JhUmV0ZW50aW9uRGF5c30gQVMgZG9yYV9yZXRlbnRpb25fZGF5c1xuICAgICAgICBGUk9NICR7c2NoZW1hLmRvcmFTZXR0aW5nc31cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEuZG9yYVNldHRpbmdzLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgIGApKSkucm93cykpO1xuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwc2VydCBwZXItb3JnIHJlcG9ydGluZyBzZXR0aW5ncyAoaW5jaWRlbnQgd2luZG93ICtcbiAgICogcmV0ZW50aW9uIG92ZXJyaWRlcyksIGlkZW1wb3RlbnQgb24gYG9yZ19pZGAuIEEgcGFydGlhbCB3cml0ZSDigJQgb25seSB0aGVcbiAgICogZmllbGRzIHByZXNlbnQgaW4gYHBhdGNoYCBhcmUgc2V0IChzbyB1cGRhdGluZyByZXRlbnRpb24gbmV2ZXIgY2xlYXJzIHRoZVxuICAgKiBpbmNpZGVudCB3aW5kb3csIGFuZCB2aWNlLXZlcnNhKS4gU2V0IHNlbGYtc2VydmUgYnkgYW4gb3JnIGFkbWluIHZpYVxuICAgKiBgUFVUIC9hcGkvcmVwb3J0cy9zZXR0aW5ncy9pbmNpZGVudHNgLiBSdW5zIHVuZGVyIHRoZSBjYWxsZXIncyBvcmcgY29udGV4dFxuICAgKiAoUkxTIFdJVEggQ0hFQ0spOyBhIGNoYW5nZWQgdmFsdWUgYWZmZWN0cyBET1JBIGFnZ3JlZ2F0ZXMgc28gdGhlIG9yZydzXG4gICAqIGNhY2hlZCByZXBvcnRzIGFyZSBkcm9wcGVkLlxuICAgKi9cbiAgYXN5bmMgc2V0UmVwb3J0aW5nU2V0dGluZ3Mob3JnSWQ6IHN0cmluZywgcGF0Y2g6IFJlcG9ydGluZ1NldHRpbmdzUGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkgfTtcbiAgICBpZiAocGF0Y2guaW5jaWRlbnRXaW5kb3dIb3VycyAhPT0gdW5kZWZpbmVkKSBzZXQuaW5jaWRlbnRXaW5kb3dIb3VycyA9IHBhdGNoLmluY2lkZW50V2luZG93SG91cnM7XG4gICAgaWYgKHBhdGNoLmV2ZW50UmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkKSBzZXQuZXZlbnRSZXRlbnRpb25EYXlzID0gcGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzO1xuICAgIGlmIChwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkKSBzZXQuZG9yYVJldGVudGlvbkRheXMgPSBwYXRjaC5kb3JhUmV0ZW50aW9uRGF5cztcbiAgICBhd2FpdCBydW5XaXRoVGVuYW50Q29udGV4dCh7IG9yZ0lkLCBpc1N1cGVyQWRtaW46IGZhbHNlIH0sICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5pbnNlcnQoc2NoZW1hLmRvcmFTZXR0aW5ncykudmFsdWVzKHtcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIGluY2lkZW50V2luZG93SG91cnM6IHBhdGNoLmluY2lkZW50V2luZG93SG91cnMsXG4gICAgICAgIGV2ZW50UmV0ZW50aW9uRGF5czogcGF0Y2guZXZlbnRSZXRlbnRpb25EYXlzLFxuICAgICAgICBkb3JhUmV0ZW50aW9uRGF5czogcGF0Y2guZG9yYVJldGVudGlvbkRheXMsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgIH0pLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgIHRhcmdldDogc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCxcbiAgICAgICAgc2V0LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZ0lkKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybignUmVwb3J0aW5nIGNhY2hlIGludmFsaWRhdGlvbiBmYWlsZWQnLCB7IG9yZ0lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCByZWNlbnQgaW5jaWRlbnRzIGZvciBhbiBvcmcgKG9yZy1hZG1pbiBzdXJmYWNlKSwgbmV3ZXN0IGZpcnN0LFxuICAgKiBwYWdpbmF0ZWQuIEVhY2ggcm93IGNhcnJpZXMgaXRzIHJlc29sdmVkIHN0YXRlIGFuZCBpdHMgZGVwbG95IGNvcnJlbGF0aW9uIOKAlFxuICAgKiB0aGUgbW9zdCByZWNlbnQgU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gdGhlIGluY2lkZW50J3MgYGVudmlyb25tZW50YCB3aG9zZVxuICAgKiBgY29tcGxldGVkX2F0YCBmYWxscyB3aXRoaW4gdGhlIGVmZmVjdGl2ZSBwZXItb3JnIGNvcnJlbGF0aW9uIHdpbmRvdyBiZWZvcmVcbiAgICogYG9wZW5lZF9hdGAgKHRoZSBzYW1lIHJ1bGUgRE9SQSdzIENGUi9NVFRSIGNvcnJlbGF0aW9uIGFwcGxpZXMpLiBTaW5nbGUtb3JnXG4gICAqIChubyByb2xsdXApIOKAlCBhbiBvcmcgYWRtaW4gdmlld3MgdGhlaXIgb3duIG9yZydzIGluY2lkZW50cy4gUkxTLXNjb3BlZCB2aWFcbiAgICogdGhlIGBwLm9yZ19pZGAvYGkub3JnX2lkYCBwcmVkaWNhdGVzICsgdGhlIHRlbmFudCBjb250ZXh0LlxuICAgKi9cbiAgYXN5bmMgbGlzdEluY2lkZW50cyhvcmdJZDogc3RyaW5nLCBvcHRzOiB7IGxpbWl0OiBudW1iZXI7IG9mZnNldDogbnVtYmVyIH0pOiBQcm9taXNlPEluY2lkZW50TGlzdEl0ZW1bXT4ge1xuICAgIGNvbnN0IHsgaW5jaWRlbnRXaW5kb3dIb3VycyB9ID0gYXdhaXQgdGhpcy5nZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZCk7XG4gICAgY29uc3Qgd2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhpbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWF4KDEsIE1hdGgubWluKG9wdHMubGltaXQsIDIwMCkpO1xuICAgIGNvbnN0IG9mZnNldCA9IE1hdGgubWF4KDAsIG9wdHMub2Zmc2V0KTtcbiAgICAvLyBUaGUgY29ycmVsYXRpb24gd2luZG93IGlzIGV4cHJlc3NlZCBpbiBTRUNPTkRTIGFzIGEgZG91YmxlLCBub3QgYXNcbiAgICAvLyBgbWFrZV9pbnRlcnZhbChob3VycyA9PiBOOjppbnQpYC4gVGhlIHdpbmRvdyBpcyB2YWxpZGF0ZWQgYXMgYW55IHBvc2l0aXZlXG4gICAgLy8gbnVtYmVyICgwLjVoIGlzIGxlZ2FsKSBhbmQgdGhlIGluLW1lbW9yeSBET1JBIGNvcnJlbGF0aW9uIHVzZXMgaXQgZXhhY3RseTtcbiAgICAvLyB0aGUgaW50IGNhc3QgbWFkZSBQb3N0Z3JlcyByZWplY3QgYSBmcmFjdGlvbmFsIHZhbHVlLCBzbyBhIDAuNWggd2luZG93XG4gICAgLy8gcmV0dXJuZWQgNTAwIGZyb20gdGhpcyBlbmRwb2ludCBhbmQgZnJvbSB0aGUgY29ycmVsYXRpb24gbG9va3VwIGJlbG93LlxuICAgIHJldHVybiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgaS5pbmNpZGVudF9pZCBBUyBcImluY2lkZW50SWRcIixcbiAgICAgICAgICBpLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGkuc2V2ZXJpdHkgQVMgc2V2ZXJpdHksXG4gICAgICAgICAgaS5vcGVuZWRfYXQ6OnRleHQgQVMgXCJvcGVuZWRBdFwiLFxuICAgICAgICAgIGkucmVzb2x2ZWRfYXQ6OnRleHQgQVMgXCJyZXNvbHZlZEF0XCIsXG4gICAgICAgICAgaS5jcmVhdGVkX2F0Ojp0ZXh0IEFTIFwiY3JlYXRlZEF0XCIsXG4gICAgICAgICAgKGkucmVzb2x2ZWRfYXQgSVMgTk9UIE5VTEwpIEFTIHJlc29sdmVkLFxuICAgICAgICAgIGNvcnIuZXhlY3V0aW9uX2lkIEFTIFwiY29ycmVsYXRlZEV4ZWN1dGlvbklkXCIsXG4gICAgICAgICAgY29yci5jb21wbGV0ZWRfYXQ6OnRleHQgQVMgXCJkZXBsb3lDb21wbGV0ZWRBdFwiXG4gICAgICAgIEZST00gJHtzY2hlbWEuaW5jaWRlbnR9IGlcbiAgICAgICAgTEVGVCBKT0lOIExBVEVSQUwgKFxuICAgICAgICAgIFNFTEVDVCBlLmV4ZWN1dGlvbl9pZCwgZS5jb21wbGV0ZWRfYXRcbiAgICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgICAgV0hFUkUgcC5vcmdfaWQgPSAke29yZ0lkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJ1xuICAgICAgICAgICAgQU5EIGUuZW52aXJvbm1lbnQgPSBpLmVudmlyb25tZW50IEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnXG4gICAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gaS5vcGVuZWRfYXRcbiAgICAgICAgICAgIEFORCBlLmNvbXBsZXRlZF9hdCA+PSBpLm9wZW5lZF9hdCAtIG1ha2VfaW50ZXJ2YWwoc2VjcyA9PiAke3dpbmRvd0hvdXJzICogMzYwMH06OmRvdWJsZSBwcmVjaXNpb24pXG4gICAgICAgICAgT1JERVIgQlkgZS5jb21wbGV0ZWRfYXQgREVTQ1xuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgKSBjb3JyIE9OIHRydWVcbiAgICAgICAgV0hFUkUgaS5vcmdfaWQgPSAke29yZ0lkfVxuICAgICAgICBPUkRFUiBCWSBpLm9wZW5lZF9hdCBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9IE9GRlNFVCAke29mZnNldH1cbiAgICAgIGApLnRoZW4oKHIpID0+IGRyaXp6bGVSb3dzPEluY2lkZW50TGlzdEl0ZW0+KHIucm93cykubWFwKChyb3cpID0+ICh7XG4gICAgICAuLi5yb3csXG4gICAgICByZXNvbHZlZDogcm93LnJlc29sdmVkID09PSB0cnVlIHx8IChyb3cucmVzb2x2ZWQgYXMgdW5rbm93bikgPT09ICd0JyxcbiAgICAgIGNvcnJlbGF0ZWRFeGVjdXRpb25JZDogcm93LmNvcnJlbGF0ZWRFeGVjdXRpb25JZCA/PyBudWxsLFxuICAgICAgZGVwbG95Q29tcGxldGVkQXQ6IHJvdy5kZXBsb3lDb21wbGV0ZWRBdCA/PyBudWxsLFxuICAgIH0pKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpcmluZy10ZXN0IGRyeS1ydW46IHdvdWxkIGEgc3ludGhldGljIGluY2lkZW50IG9wZW5pbmcgTk9XIGZvclxuICAgKiBgZW52aXJvbm1lbnRgIGNvcnJlbGF0ZSB0byBhIHJlY2VudCBzdWNjZXNzZnVsIGRlcGxveSB1bmRlciB0aGUgb3JnJ3NcbiAgICogZWZmZWN0aXZlIHdpbmRvdz8gVGhpcyBpcyBhIE5PTi1wZXJzaXN0aW5nIGNvcnJlbGF0aW9uIGNoZWNrIOKAlCBpdCB2ZXJpZmllc1xuICAgKiB0aGUgYWRtaW4ncyBlbnZpcm9ubWVudCBuYW1pbmcgKyB3aW5kb3cgbGluZSB1cCB3aXRoIHJlYWwgZGVwbG95IGV2ZW50c1xuICAgKiBXSVRIT1VUIHdyaXRpbmcgYW4gaW5jaWRlbnQgKHNvIGEgXCJ0ZXN0XCIgbmV2ZXIgcG9sbHV0ZXMgQ0ZSL01UVFIpLiBSTFMtc2NvcGVkLlxuICAgKi9cbiAgYXN5bmMgdGVzdEluY2lkZW50Q29ycmVsYXRpb24ob3JnSWQ6IHN0cmluZywgZW52aXJvbm1lbnQ6IHN0cmluZyk6IFByb21pc2U8SW5jaWRlbnRUZXN0UmVzdWx0PiB7XG4gICAgY29uc3QgZW52ID0gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZW52aXJvbm1lbnQpO1xuICAgIGNvbnN0IG9wZW5lZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHsgaW5jaWRlbnRXaW5kb3dIb3VycyB9ID0gYXdhaXQgdGhpcy5nZXRSZXBvcnRpbmdTZXR0aW5ncyhvcmdJZCk7XG4gICAgY29uc3Qgd2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhpbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8eyBleGVjdXRpb25faWQ6IHN0cmluZyB8IG51bGw7IGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbCB9PigoYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVCBlLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsIGUuY29tcGxldGVkX2F0Ojp0ZXh0IEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCA9ICR7b3JnSWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnXG4gICAgICAgICAgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudn0gQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHtvcGVuZWRBdH06OnRpbWVzdGFtcHR6XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7b3BlbmVkQXR9Ojp0aW1lc3RhbXB0eiAtIG1ha2VfaW50ZXJ2YWwoc2VjcyA9PiAke3dpbmRvd0hvdXJzICogMzYwMH06OmRvdWJsZSBwcmVjaXNpb24pXG4gICAgICAgIE9SREVSIEJZIGUuY29tcGxldGVkX2F0IERFU0NcbiAgICAgICAgTElNSVQgMVxuICAgICAgYCkpKS5yb3dzKTtcbiAgICBjb25zdCBoaXQgPSByb3dzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgb3BlbmVkQXQsXG4gICAgICB3aW5kb3dIb3VycyxcbiAgICAgIGNvcnJlbGF0ZWQ6IGhpdD8uZXhlY3V0aW9uX2lkICE9IG51bGwsXG4gICAgICBleGVjdXRpb25JZDogaGl0Py5leGVjdXRpb25faWQgPz8gbnVsbCxcbiAgICAgIGRlcGxveUNvbXBsZXRlZEF0OiBoaXQ/LmNvbXBsZXRlZF9hdCA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBzZXJ0IHBlci1vcmcgaW5nZXN0aW9uIGhlYWx0aDogdGhlIEFXUyBldmVudHMgTGFtYmRhIHBlcmlvZGljYWxseVxuICAgKiByZXBvcnRzIGZvcndhcmRlZC9kcm9wcGVkIGNvdW50ZXJzICsgdGhlIGxhc3QgZXZlbnQgdGltZXN0YW1wIHNvIHRoZSBSZXBvcnRzXG4gICAqIFVJIGNhbiBzaG93IGZsb3dpbmcgLyBzdGFsZSAvIGRyb3BwaW5nLiBPbmUgcm93IHBlciBvcmcgKHVwc2VydCBvbiBvcmdfaWQpLlxuICAgKi9cbiAgYXN5bmMgcmVjb3JkSW5nZXN0SGVhbHRoKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaW5wdXQ6IHsgZm9yd2FyZGVkPzogbnVtYmVyOyBkcm9wcGVkPzogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsYXN0RXZlbnRBdCA9IGlucHV0Lmxhc3RFdmVudEF0ID8gbmV3IERhdGUoaW5wdXQubGFzdEV2ZW50QXQpIDogdW5kZWZpbmVkO1xuICAgIGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChzY2hlbWEuaW5nZXN0SGVhbHRoKS52YWx1ZXMoe1xuICAgICAgICBvcmdJZCxcbiAgICAgICAgZm9yd2FyZGVkOiBpbnB1dC5mb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGlucHV0LmRyb3BwZWQsXG4gICAgICAgIGxhc3RFdmVudEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICB9KS5vbkNvbmZsaWN0RG9VcGRhdGUoe1xuICAgICAgICB0YXJnZXQ6IHNjaGVtYS5pbmdlc3RIZWFsdGgub3JnSWQsXG4gICAgICAgIHNldDoge1xuICAgICAgICAgIGZvcndhcmRlZDogaW5wdXQuZm9yd2FyZGVkLFxuICAgICAgICAgIGRyb3BwZWQ6IGlucHV0LmRyb3BwZWQsXG4gICAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB9LFxuICAgICAgfSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBiYWNrIG9uZSBvcmcncyBpbmdlc3Rpb24gaGVhbHRoIGZvciB0aGUgUmVwb3J0cyBVSSBmcmVzaG5lc3NcbiAgICogaW5kaWNhdG9yLiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBvcmcgaGFzIE5PIHJvdyDigJQgaS5lLiB0aGUgZGVwbG95bWVudCBoYXNcbiAgICogbmV2ZXIgaW5nZXN0ZWQgYW55dGhpbmcg4oCUIHdoaWNoIHRoZSBVSSBtdXN0IHJlbmRlciBhcyBcIm5vIGluZ2VzdCByZXBvcnRlZFxuICAgKiB5ZXRcIiwgbmV2ZXIgYXMgXCJzdGFsZVwiLiBSTFMtc2NvcGVkIHRvIHRoZSBvcmcgbGlrZSBldmVyeSBvdGhlciByZWFkLlxuICAgKi9cbiAgYXN5bmMgZ2V0SW5nZXN0SGVhbHRoKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEluZ2VzdEhlYWx0aFN0YXR1cyB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHhcbiAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgIC5mcm9tKHNjaGVtYS5pbmdlc3RIZWFsdGgpXG4gICAgICAgIC53aGVyZShlcShzY2hlbWEuaW5nZXN0SGVhbHRoLm9yZ0lkLCBvcmdJZCkpXG4gICAgICAgIC5saW1pdCgxKSksXG4gICAgKTtcbiAgICBjb25zdCByb3cgPSByb3dzWzBdO1xuICAgIGlmICghcm93KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlZEF0OiByb3cudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0RXZlbnRBdDogaXNvT3JOdWxsKHJvdy5sYXN0RXZlbnRBdCksXG4gICAgICBmb3J3YXJkZWQ6IHJvdy5mb3J3YXJkZWQgPz8gbnVsbCxcbiAgICAgIGRyb3BwZWQ6IHJvdy5kcm9wcGVkID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnRpbmcgcmV0ZW50aW9uIHN3ZWVwOiBoYXJkLWRlbGV0ZXMgcm93cyBwYXN0IHRoZWlyIHBlci1vcmcgcmV0ZW50aW9uXG4gICAqIHdpbmRvdyAoc3BsaXQgc3RhbmRhcmQtZXZlbnQgdnMgRE9SQS1zb3VyY2UpLiBDcm9zcy10ZW5hbnQgaG91c2VrZWVwaW5nIOKAlFxuICAgKiBpdCBlc3RhYmxpc2hlcyBpdHMgb3duIHN5c2FkbWluIHNjb3BlLiBTZWUgLi9yZXBvcnRpbmcvcmV0ZW50aW9uLXN3ZWVwLnRzLlxuICAgKi9cbiAgYXN5bmMgcHVyZ2VFeHBpcmVkUmVwb3J0aW5nRGF0YShvcHRzOiBSZXBvcnRpbmdSZXRlbnRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFJlcG9ydGluZ1JldGVudGlvbkNvdW50cz4ge1xuICAgIHJldHVybiBwdXJnZVJlcG9ydGluZ1JldGVudGlvbihvcHRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSA1OiB0aGUgQU5BTFlUSUNTIHJlYWRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBUaGluIGRlbGVnYXRpb25zIHRvIC4vcmVwb3J0aW5nL2FuYWx5dGljcy1xdWVyaWVzLnRzLCBzbyBgcmVwb3J0aW5nU2VydmljZWBcbiAgLy8gc2F0aXNmaWVzIHRoZSByZXBvcnQgZW5naW5lJ3MgYFNlY3Rpb25EYXRhU291cmNlYCBpbiBmdWxsIGFuZCBhIHNlY3Rpb24gbmV2ZXJcbiAgLy8gcmVhY2hlcyBwYXN0IHRoZSBzZXJ2aWNlIGZvciBpdHMgZGF0YS4gRXZlcnkgb25lIG9mIHRoZXNlIHJlYWRzIGFcbiAgLy8gcHJlLWFnZ3JlZ2F0ZWQgdGFibGUgKGBleGVjdXRpb25fZGFpbHlfcm9sbHVwc2AsIGBkb3JhX2RlcGxveW1lbnRzYCxcbiAgLy8gYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCwgYHBsdWdpbl92dWxuX2V4cG9zdXJlYCkgcmF0aGVyIHRoYW4gcmF3IGV2ZW50cyDigJRcbiAgLy8gd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHF1YXJ0ZXJseSByZXBvcnQgYWZmb3JkYWJsZSBBTkQgd2hhdCBtYWtlcyBpdCBzdGlsbFxuICAvLyBhbnN3ZXJhYmxlIGFmdGVyIHJldGVudGlvbiBoYXMgc3dlcHQgdGhlIGV2ZW50cyBpdCBjYW1lIGZyb20uXG5cbiAgLyoqIFBlci1waXBlbGluZSBkZWxpdmVyeSwgd29yc3QgZmlyc3QuICovXG4gIGFzeW5jIGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQgPSAxMCkge1xuICAgIHJldHVybiBnZXRQaXBlbGluZUJyZWFrZG93bihzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIEZhaWx1cmVzIGJ5IGNhdGVnb3J5LCB3aXRoIHRoZSBwcmV2aW91cyBwZXJpb2QncyBjb3VudHMgZm9yIHRoZSB0cmVuZC4gKi9cbiAgYXN5bmMgZ2V0RmFpbHVyZUFuYWx5c2lzKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGdldEZhaWx1cmVBbmFseXNpcyhzY29wZSwgcHJldmlvdXMpO1xuICB9XG5cbiAgLyoqIFBlci1zdGFnZSB0aW1pbmdzIGZvciBvbmUgcGlwZWxpbmUsIHNsb3dlc3QgZmlyc3QuICovXG4gIGFzeW5jIGdldFN0YWdlUGVyZm9ybWFuY2Uoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwaXBlbGluZUlkOiBzdHJpbmcsIHByZXZpb3VzPzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBnZXRTdGFnZVBlcmZvcm1hbmNlKHNjb3BlLCBwaXBlbGluZUlkLCBwcmV2aW91cyk7XG4gIH1cblxuICAvKiogQnVpbGQgdGltZSBieSBwcm9qZWN0IGFuZCBwaXBlbGluZS4gU2Vjb25kcywgbmV2ZXIgbW9uZXkuICovXG4gIGFzeW5jIGdldFJlc291cmNlQ29uc3VtcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDIwKSB7XG4gICAgcmV0dXJuIGdldFJlc291cmNlQ29uc3VtcHRpb24oc2NvcGUsIGxpbWl0KTtcbiAgfVxuXG4gIC8qKiBFYWNoIGNvbW1pdCdzIHBhdGggYWNyb3NzIGVudmlyb25tZW50cywgYW5kIHdoaWNoIG9uZXMgc3RvcHBlZCBzaG9ydC4gKi9cbiAgYXN5bmMgZ2V0UHJvbW90aW9uVmlldyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIHByb2R1Y3Rpb25FbnYgPSAncHJvZHVjdGlvbicsIGxpbWl0ID0gMjUpIHtcbiAgICByZXR1cm4gZ2V0UHJvbW90aW9uVmlldyhzY29wZSwgcHJvZHVjdGlvbkVudiwgbGltaXQpO1xuICB9XG5cbiAgLyoqIFBpcGVsaW5lcyBiZWhpbmQgb24gYSBwbHVnaW4sIHdvcnN0IGdhcCBmaXJzdCAodGhlIERFQ0xBUkVEIHNpZGUpLiAqL1xuICBhc3luYyBnZXRPdXRkYXRlZFBsdWdpbnMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKSB7XG4gICAgcmV0dXJuIGdldE91dGRhdGVkUGx1Z2lucyhzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIE9wZW4gcGx1Z2luIHZ1bG5lcmFiaWxpdGllcyBwZXIgcGlwZWxpbmUgKHNheXMgZGVjbGFyZWQgdnMgZGVwbG95ZWQpLiAqL1xuICBhc3luYyBnZXRQbHVnaW5WdWxuZXJhYmlsaXRpZXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdCA9IDUwKSB7XG4gICAgcmV0dXJuIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyhzY29wZSwgbGltaXQpO1xuICB9XG5cbiAgLyoqIEFkb3B0aW9uLCBjcmVhdGlvbiBzb3VyY2UsIGFuZCB0aGUgZGVwbG95LXRyYWNraW5nIGNvdmVyYWdlIGRlbm9taW5hdG9yLiAqL1xuICBhc3luYyBnZXRBZG9wdGlvbihzY29wZTogQW5hbHl0aWNzU2NvcGUsIHRpbWVTYXZlZE1pbnV0ZXM/OiBudW1iZXIgfCBudWxsKSB7XG4gICAgcmV0dXJuIGdldEFkb3B0aW9uKHNjb3BlLCB0aW1lU2F2ZWRNaW51dGVzID8/IChhd2FpdCB0aGlzLnRpbWVTYXZlZEFzc3VtcHRpb24oc2NvcGUub3JnSWQpKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5lZWRzLWF0dGVudGlvbiBmaW5kaW5ncyBmb3IgdGhlIHBlcmlvZC5cbiAgICpcbiAgICogQXNzZW1ibGVkIEhFUkUgcmF0aGVyIHRoYW4gaW4gdGhlIHNlY3Rpb24sIGJlY2F1c2UgdGhlIHJ1bGVzIG5lZWQgc2l4IHJlYWRzIHRoYXRcbiAgICogbXVzdCBhbGwgZGVzY3JpYmUgdGhlIHNhbWUgd2luZG93OiB0aGlzIHBlcmlvZCdzIGJyZWFrZG93biwgdGhlIHByZXZpb3VzIG9uZSdzLFxuICAgKiBmYWlsdXJlIHN0cmVha3MsIGNvbmZpZy1jaGFuZ2UgdGltZXMsIHBpcGVsaW5lcyB3aXRoIGFuIG9wZW4gQ3JpdGljYWwsIGFuZFxuICAgKiBwaXBlbGluZXMgRE9SQSBjYW5ub3Qgc2VlLiBBIHNlY3Rpb24gdGhhdCBmZXRjaGVkIHRoZW0gaXRzZWxmIHdvdWxkIGJlIHRoZSBvbmx5XG4gICAqIHBsYWNlIGluIHRoZSByZXBvcnQgd2hlcmUgdGhlIHdpbmRvdyBjb3VsZCBkcmlmdCBiZXR3ZWVuIHBhbmVscy5cbiAgICpcbiAgICogRXZlcnkgaW5wdXQgZXhjZXB0IHRoZSBjdXJyZW50IGJyZWFrZG93biBpcyBPUFRJT05BTCB0byB0aGUgZXZhbHVhdG9yLCBhbmQgZWFjaFxuICAgKiBvbmUncyBmYWlsdXJlIGlzIGFic29yYmVkOiBhIHJ1bGUgd2l0aCBubyBkYXRhIHRvIHJ1biBvbiBpcyBza2lwcGVkLCB3aGljaCBpc1xuICAgKiB3aHkgb25lIHVuYXZhaWxhYmxlIHJlYWQgY29zdHMgb25lIGZpbmRpbmcgcmF0aGVyIHRoYW4gdGhlIHdob2xlIHNlY3Rpb24uIFRoZVxuICAgKiBhbHRlcm5hdGl2ZSDigJQgYSBzZWN0aW9uIHRoYXQgZmFpbHMgYmVjYXVzZSB0aGUgc3RyZWFrIHF1ZXJ5IHRpbWVkIG91dCDigJQgcmVwbGFjZXNcbiAgICogc2l4IGZpbmRpbmdzIHdpdGggbm9uZS5cbiAgICovXG4gIGFzeW5jIGdldE5lZWRzQXR0ZW50aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJldmlvdXM/OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9KSB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlLCBBVFRFTlRJT05fUElQRUxJTkVfTElNSVQpO1xuICAgIGNvbnN0IHByaW9yID0gcHJldmlvdXNcbiAgICAgID8gYXdhaXQgc29mdGVuKGdldFBpcGVsaW5lQnJlYWtkb3duKHsgLi4uc2NvcGUsIC4uLnByZXZpb3VzIH0sIEFUVEVOVElPTl9QSVBFTElORV9MSU1JVCksIFtdKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBbc3RyZWFrUm93cywgY29uZmlnQ2hhbmdlcywgdnVsbmVyYWJsZSwgdW50cmFja2VkLCB0aHJlc2hvbGRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHNvZnRlbihnZXRQaXBlbGluZVN0cmVha3Moc2NvcGUpLCBbXSksXG4gICAgICBzb2Z0ZW4oZ2V0UGlwZWxpbmVDb25maWdDaGFuZ2VzKHNjb3BlKSwgbmV3IE1hcDxzdHJpbmcsIERhdGU+KCkpLFxuICAgICAgc29mdGVuKGdldFZ1bG5lcmFibGVQaXBlbGluZXMoc2NvcGUpLCBbXSksXG4gICAgICBzb2Z0ZW4oZ2V0VW50cmFja2VkUGlwZWxpbmVzKHNjb3BlKSwgW10pLFxuICAgICAgc29mdGVuKHRoaXMuYXR0ZW50aW9uVGhyZXNob2xkcyhzY29wZS5vcmdJZCksIHt9KSxcbiAgICBdKTtcbiAgICBjb25zdCBpdGVtcyA9IGV2YWx1YXRlTmVlZHNBdHRlbnRpb24oe1xuICAgICAgY3VycmVudCxcbiAgICAgIHByZXZpb3VzOiBwcmlvcixcbiAgICAgIHN0cmVha3M6IG5ldyBNYXAoc3RyZWFrUm93cy5tYXAoKHIpID0+IFtyLnBpcGVsaW5lSWQsIHtcbiAgICAgICAgY29uc2VjdXRpdmVGYWlsdXJlczogci5jb25zZWN1dGl2ZUZhaWx1cmVzLFxuICAgICAgICBsYXN0U3VjY2Vzc0F0OiByLmxhc3RTdWNjZXNzQXQsXG4gICAgICB9XSkpLFxuICAgICAgY29uZmlnQ2hhbmdlcyxcbiAgICAgIHZ1bG5lcmFibGVQaXBlbGluZXM6IG5ldyBTZXQodnVsbmVyYWJsZSksXG4gICAgICB1bnRyYWNrZWRQaXBlbGluZXM6IG5ldyBTZXQodW50cmFja2VkKSxcbiAgICAgIHRocmVzaG9sZHM6IHRocmVzaG9sZHNGcm9tKHRocmVzaG9sZHMpLFxuICAgICAgbm93OiBuZXcgRGF0ZShzY29wZS50byksXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zLFxuICAgICAgdGhyZXNob2xkczogdGhyZXNob2xkc0Zyb20odGhyZXNob2xkcyksXG4gICAgICAvLyBXaGF0IHRoZSBydWxlcyB3ZXJlIGV2YWx1YXRlZCBvdmVyLCBzbyBhIHJlYWRlciBjYW4gdGVsbCBhbiBlbXB0eSBsaXN0XG4gICAgICAvLyAoXCJub3RoaW5nIHRyaXBwZWRcIikgZnJvbSBhbiBlbXB0eSBpbnB1dCAoXCJub3RoaW5nIHJhblwiKS5cbiAgICAgIHBpcGVsaW5lc0V2YWx1YXRlZDogY3VycmVudC5sZW5ndGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3JnJ3Mgc3RvcmVkIG5lZWRzLWF0dGVudGlvbiB0aHJlc2hvbGRzLCBvciBge31gLlxuICAgKlxuICAgKiBSZXR1cm5lZCBhcyBhIHBhcnRpYWwgb24gcHVycG9zZTogYHRocmVzaG9sZHNGcm9tYCBmaWxscyB0aGUgcmVzdCBwZXIgZmllbGQsIHNvXG4gICAqIGFuIG9yZyB0aGF0IGNvbmZpZ3VyZWQgb25lIG51bWJlciBrZWVwcyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBvdGhlcnMgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBkaXNhYmxpbmcgZm91ciBydWxlcyBieSBzZXR0aW5nIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXR0ZW50aW9uVGhyZXNob2xkcyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbjogZmFsc2UgfSwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7IHQ6IHNjaGVtYS5kb3JhU2V0dGluZ3MucmVwb3J0QXR0ZW50aW9uVGhyZXNob2xkcyB9KVxuICAgICAgICAuZnJvbShzY2hlbWEuZG9yYVNldHRpbmdzKVxuICAgICAgICAud2hlcmUoZXEoc2NoZW1hLmRvcmFTZXR0aW5ncy5vcmdJZCwgb3JnSWQpKVxuICAgICAgICAubGltaXQoMSkpKTtcbiAgICBjb25zdCBzdG9yZWQgPSAocm93cyBhcyBBcnJheTx7IHQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsIH0+KVswXT8udDtcbiAgICByZXR1cm4gc3RvcmVkICYmIHR5cGVvZiBzdG9yZWQgPT09ICdvYmplY3QnID8gc3RvcmVkIDoge307XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9yZydzIG93biBtaW51dGVzLXNhdmVkLXBlci1waXBlbGluZSBhc3N1bXB0aW9uLCBvciBudWxsLlxuICAgKlxuICAgKiBSZWFkIGhlcmUgc28gdGhlIGFkb3B0aW9uIHNlY3Rpb24gY2Fubm90IGFjY2lkZW50YWxseSBiZSBoYW5kZWQgYVxuICAgKiBwbGF0Zm9ybS1jaG9zZW4gZGVmYXVsdDogdGhlIG51bWJlciBvbmx5IG1lYW5zIHNvbWV0aGluZyB3aGVuIHRoZSBjdXN0b21lclxuICAgKiBwaWNrZWQgaXQsIGFuZCBgbnVsbGAgcmVuZGVycyBhcyBcIm5vdCBlc3RpbWF0ZWRcIiByYXRoZXIgdGhhbiBhcyB6ZXJvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0aW1lU2F2ZWRBc3N1bXB0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgcnVuV2l0aFRlbmFudENvbnRleHQoeyBvcmdJZCwgaXNTdXBlckFkbWluOiBmYWxzZSB9LCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHsgbWludXRlczogc2NoZW1hLmRvcmFTZXR0aW5ncy50aW1lU2F2ZWRNaW51dGVzUGVyUGlwZWxpbmUgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLmRvcmFTZXR0aW5ncylcbiAgICAgICAgLndoZXJlKGVxKHNjaGVtYS5kb3JhU2V0dGluZ3Mub3JnSWQsIG9yZ0lkKSlcbiAgICAgICAgLmxpbWl0KDEpKSk7XG4gICAgcmV0dXJuIChyb3dzIGFzIEFycmF5PHsgbWludXRlczogbnVtYmVyIHwgbnVsbCB9PilbMF0/Lm1pbnV0ZXMgPz8gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEhvdyBtYW55IHBpcGVsaW5lcyB0aGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzIGNvbnNpZGVyLlxuICpcbiAqIFRoZSBzZWN0aW9uIGlzIGEgc2hvcnQgbGlzdCBvZiB0aGluZ3MgdG8gZG8sIG5vdCBhIHRhYmxlIG9mIGV2ZXJ5dGhpbmcsIHNvIHRoZVxuICogZXZhbHVhdG9yIHNlZXMgdGhlIHNhbWUgd29yc3QtZmlyc3Qgc2xpY2UgdGhlIGJyZWFrZG93biBzZWN0aW9uIHNob3dzLiBBIHBpcGVsaW5lXG4gKiBvdXRzaWRlIHRoZSB3b3JzdCAyNSBieSB0aGUgYnJlYWtkb3duJ3Mgb3duIG9yZGVyaW5nIGlzIG5vdCB0aGUgb25lIGEgbGVhZCBzaG91bGRcbiAqIGJlIHRvbGQgYWJvdXQgZmlyc3QuXG4gKi9cbmNvbnN0IEFUVEVOVElPTl9QSVBFTElORV9MSU1JVCA9IDI1O1xuXG4vKipcbiAqIFJ1biBhIHJlYWQsIG9yIGZhbGwgYmFjay5cbiAqXG4gKiBPbmx5IGZvciB0aGUgbmVlZHMtYXR0ZW50aW9uIGlucHV0cywgd2hlcmUgYW4gYWJzZW50IGlucHV0IFNLSVBTIGEgcnVsZSBhbmQgdGhlXG4gKiBldmFsdWF0b3Igc2F5cyBzby4gTmV2ZXIgdXNlZCBmb3IgYSBudW1iZXIgdGhlIHJlcG9ydCBwcmVzZW50czogYSBxdWVyeSB0aGF0IGZhaWxzXG4gKiBhbmQgc2lsZW50bHkgcmVhZHMgYXMgemVybyBpcyBob3cgYSByZXBvcnQgc3RhdGVzIHNvbWV0aGluZyBmYWxzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc29mdGVuPFQ+KHA6IFByb21pc2U8VD4sIGZhbGxiYWNrOiBUKTogUHJvbWlzZTxUPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdOZWVkcy1hdHRlbnRpb24gaW5wdXQgdW5hdmFpbGFibGU7IGl0cyBydWxlIGlzIHNraXBwZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gZmFsbGJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19