@pipeline-builder/pipeline-data 3.4.99 → 3.4.100

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.
@@ -310,6 +310,12 @@ export declare class ReportingService {
310
310
  getAverageDuration(orgId: string, from: string, to: string, orgIds?: string[]): Promise<DurationStats[]>;
311
311
  /** 1.5 Stage failure heatmap — which stages fail most. */
312
312
  getStageFailures(orgId: string, from: string, to: string, orgIds?: string[]): Promise<StageFailure[]>;
313
+ /**
314
+ * Distinct deploy `environment` values observed in the window — powers the
315
+ * DORA environment-scope datalist. Org-scoped + rollup-aware like the sibling
316
+ * reports; only non-null environments (i.e. deploy-attributed executions).
317
+ */
318
+ getReportEnvironments(orgId: string, from: string, to: string, orgIds?: string[]): Promise<string[]>;
313
319
  /** 1.6 Stage bottlenecks — slowest stages per pipeline. */
314
320
  getStageBottlenecks(orgId: string, from: string, to: string, orgIds?: string[]): Promise<StageBottleneck[]>;
315
321
  /** 1.7 Action failure rate — which plugin steps fail most. */
@@ -451,6 +451,23 @@ export class ReportingService {
451
451
  `).then(r => drizzleRows(r.rows)));
452
452
  return this.runReport(`${orgId}:stage-failures:${from}:${to}`, multi, exec);
453
453
  }
454
+ /**
455
+ * Distinct deploy `environment` values observed in the window — powers the
456
+ * DORA environment-scope datalist. Org-scoped + rollup-aware like the sibling
457
+ * reports; only non-null environments (i.e. deploy-attributed executions).
458
+ */
459
+ async getReportEnvironments(orgId, from, to, orgIds) {
460
+ const { pred, multi } = this.orgScope(orgId, orgIds);
461
+ const exec = () => withTenantTx((tx) => tx.execute(sql `
462
+ SELECT DISTINCT e.environment AS environment
463
+ FROM ${schema.pipelineEvent} e
464
+ JOIN ${schema.pipeline} p ON p.id = e.pipeline_id
465
+ WHERE p.org_id ${pred} AND e.environment IS NOT NULL
466
+ AND e.started_at >= ${from}::timestamptz AND e.started_at <= ${to}::timestamptz
467
+ ORDER BY environment
468
+ `).then(r => drizzleRows(r.rows).map((row) => row.environment)));
469
+ return this.runReport(`${orgId}:report-envs:${from}:${to}`, multi, exec);
470
+ }
454
471
  /** 1.6 Stage bottlenecks — slowest stages per pipeline. */
455
472
  async getStageBottlenecks(orgId, from, to, orgIds) {
456
473
  const { pred, multi } = this.orgScope(orgId, orgIds);
@@ -864,4 +881,4 @@ export class ReportingService {
864
881
  }
865
882
  }
866
883
  export const reportingService = new ReportingService();
867
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQjtJQUM1QyxJQUFJLENBQUUsZ0JBQXNDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsUUFBUSxzQkFBc0IsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEgsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENB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QUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsSUFBSSxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkYsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUNhY2hlU2VydmljZSwgY3JlYXRlTG9nZ2VyLCBlcnJvck1lc3NhZ2UsIFJFUE9SVF9JTlRFUlZBTFMsIHNjcnViQXdzSWRlbnRpZmllcnMsIHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgaW5BcnJheSwgc3FsLCB0eXBlIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGRyaXp6bGVSb3dzIH0gZnJvbSAnLi9jcnVkLXNlcnZpY2UuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4LCBydW5XaXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1zZXJ2aWNlJyk7XG5cbi8qKlxuICogRGVmZW5zZS1pbi1kZXB0aCBndWFyZCBmb3IgdGhlIGBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCDigKYpYCBidWNrZXQgYXJndW1lbnQuXG4gKiBUaGUgcm91dGUgbGF5ZXIgKGBwYXJzZVJlcG9ydEludGVydmFsYCkgaXMgdGhlIHNlY3VyaXR5IGJvdW5kYXJ5IGFuZCBhbHJlYWR5XG4gKiByZWplY3RzIHVua25vd24gaW50ZXJ2YWxzOyB0aGlzIGFzc2VydCBtYWtlcyBhbiBpbnZhbGlkIHZhbHVlIGZhaWwgZmFzdCBhdCB0aGVcbiAqIHNlcnZpY2UgYm91bmRhcnkgd2l0aCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2Ygc3VyZmFjaW5nIGEgcmF3IFBvc3RncmVzIGVycm9yXG4gKiBpZiBhIGNhbGxlciBldmVyIGJ5cGFzc2VzIHRoZSByb3V0ZSB2YWxpZGF0aW9uLiBTaGFyZXMgYXBpLWNvcmUnc1xuICogUkVQT1JUX0lOVEVSVkFMUyBhbGxvdy1saXN0IHNvIHRoZSB0d28gY2FuJ3QgZHJpZnQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCEoUkVQT1JUX0lOVEVSVkFMUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMoaW50ZXJ2YWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcG9ydCBpbnRlcnZhbDogJHtpbnRlcnZhbH0uIEV4cGVjdGVkIG9uZSBvZjogJHtSRVBPUlRfSU5URVJWQUxTLmpvaW4oJywgJyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZSBmb3IgcmVwb3J0aW5nIGFnZ3JlZ2F0aW9ucy4gVHdvIHRpZXJzOlxuICogLSBJbnZlbnRvcnkgcXVlcmllcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKTogNSBtaW4gVFRMIOKAlCBjaGFuZ2VzIG9uIHBsdWdpbiBDUlVEXG4gKiAtIEV4ZWN1dGlvbi9idWlsZCBxdWVyaWVzIHdpdGggZGF0ZSByYW5nZXM6IDIgbWluIFRUTCDigJQgbmV3IGV2ZW50cyBhcnJpdmUgY29udGludW91c2x5XG4gKi9cbmNvbnN0IGludmVudG9yeUNhY2hlID0gY3JlYXRlQ2FjaGVTZXJ2aWNlKCdyZXBvcnQ6aW52OicsIHBhcnNlSW50KHByb2Nlc3MuZW52LkNBQ0hFX1RUTF9SRVBPUlRfSU5WRU5UT1JZIHx8ICczMDAnLCAxMCkpO1xuY29uc3QgdGltZXNlcmllc0NhY2hlID0gY3JlYXRlQ2FjaGVTZXJ2aWNlKCdyZXBvcnQ6dHM6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9USU1FU0VSSUVTIHx8ICcxMjAnLCAxMCkpO1xuXG4vLyDilIDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBFeGVjdXRpb25Db3VudCB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgdG90YWw6IG51bWJlcjtcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBjYW5jZWxlZDogbnVtYmVyO1xuICBmaXJzdEV4ZWN1dGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgbGFzdEV4ZWN1dGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIER1cmF0aW9uU3RhdHMge1xuICBpZDogc3RyaW5nO1xuICBwcm9qZWN0OiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWluTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbiAgcDk1TXM6IG51bWJlcjtcbiAgZXhlY3V0aW9uczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUGlwZWxpbmVFeGVjdXRpb24ge1xuICBleGVjdXRpb25JZDogc3RyaW5nO1xuICAvKiogUm9sbGVkLXVwIHRlcm1pbmFsIHN0YXR1czogc3VjY2VlZGVkIHwgZmFpbGVkIHwgY2FuY2VsZWQgfCBpbi1wcm9ncmVzcy4gKi9cbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgZW5kZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgZHVyYXRpb25NczogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEZpcnN0IGZhaWxpbmcgc3RhZ2UvYWN0aW9uIGZvciB0aGUgZXhlY3V0aW9uIChudWxsIHdoZW4gaXQgZGlkbid0IGZhaWwpLiAqL1xuICBmYWlsaW5nU3RhZ2U6IHN0cmluZyB8IG51bGw7XG4gIGZhaWxpbmdBY3Rpb246IHN0cmluZyB8IG51bGw7XG59XG5cbmludGVyZmFjZSBTdGFnZUZhaWx1cmUge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU3RhZ2VCb3R0bGVuZWNrIHtcbiAgaWQ6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBzdGFnZU5hbWU6IHN0cmluZztcbiAgYXZnTXM6IG51bWJlcjtcbiAgbWF4TXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEFjdGlvbkZhaWx1cmUge1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG4gIGZhaWx1cmVzOiBudW1iZXI7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVycm9yRW50cnkge1xuICBlcnJvclBhdHRlcm46IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgYWZmZWN0ZWRQaXBlbGluZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpblN1bW1hcnkge1xuICB0b3RhbDogbnVtYmVyO1xuICBhY3RpdmU6IG51bWJlcjtcbiAgaW5hY3RpdmU6IG51bWJlcjtcbiAgcHVibGljOiBudW1iZXI7XG4gIHByaXZhdGU6IG51bWJlcjtcbiAgdW5pcXVlTmFtZXM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uIHtcbiAgcGx1Z2luVHlwZTogc3RyaW5nO1xuICBjb21wdXRlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVmVyc2lvbkNvdW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uQ291bnQ6IG51bWJlcjtcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xuICBoYXNEZWZhdWx0OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRUaW1lU2VyaWVzRW50cnkge1xuICBwZXJpb2Q6IHN0cmluZztcbiAgc3VjY2VlZGVkOiBudW1iZXI7XG4gIGZhaWxlZDogbnVtYmVyO1xuICBzdWNjZXNzUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBCdWlsZER1cmF0aW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBidWlsZHM6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRmFpbHVyZSB7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIG9jY3VycmVuY2VzOiBudW1iZXI7XG4gIGxhc3RTZWVuOiBzdHJpbmc7XG59XG5cbi8qKiBSYXcgc2luZ2xlLXJvdyBzaGFwZSByZXR1cm5lZCBieSB0aGUgRE9SQSBhZ2dyZWdhdGUgcXVlcnkgKHByZS1zaGFwaW5nKS4gKi9cbi8qKlxuICogSG93IGZhciBwYXN0IHRoZSByZXBvcnQncyBgdG9gIGJvdW5kIHRoZSBET1JBIE1UVFIgcXVlcnkgbWF5IGxvb2sgZm9yIGFcbiAqIGZhaWx1cmUncyByZWNvdmVyaW5nIHJ1bi4gQm91bmRzIHRoZSBzY2FuIHdoaWxlIHN0b3BwaW5nIGEgZmFpbHVyZSBuZWFyIHRoZVxuICogd2luZG93IGVkZ2UgZnJvbSBiZWluZyBzcHVyaW91c2x5IHNjb3JlZCBcIm5ldmVyIHJlc3RvcmVkXCIuIEEgZmFpbHVyZSB0aGF0XG4gKiBoYXMgbm90IHJlY292ZXJlZCB3aXRoaW4gdGhpcyB3aW5kb3cgc3RheXMgY291bnRlZCBhcyBhbiBvcGVuIGluY2lkZW50LlxuICovXG5jb25zdCBNVFRSX1JFU1RPUkVfTE9PS0FIRUFEID0gJzMwIGRheXMnO1xuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZC4gYG51bGxgID0gaW5zdWZmaWNpZW50IGRhdGEgdG8gY2xhc3NpZnkgKG5vXG4gKiBkZXBsb3ltZW50cy9mYWlsdXJlcy9sZWFkLXRpbWUgc2FtcGxlIGluIHRoZSB3aW5kb3cpLCBzbyB0aGUgVUkgc2hvd3MgYVxuICogbmV1dHJhbCBzdGF0ZSByYXRoZXIgdGhhbiBtaXNsYWJlbGluZyBhbiBlbXB0eSB3aW5kb3cgYXMgXCJsb3dcIi5cbiAqL1xuZXhwb3J0IHR5cGUgRG9yYUxldmVsID0gJ2VsaXRlJyB8ICdoaWdoJyB8ICdtZWRpdW0nIHwgJ2xvdycgfCBudWxsO1xuXG4vKiogT3B0aW9uYWwgc2NvcGluZyBmb3Ige0BsaW5rIFJlcG9ydGluZ1NlcnZpY2UuZ2V0RG9yYU1ldHJpY3N9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb3JhT3B0aW9ucyB7XG4gIC8qKiBSZXN0cmljdCB0byBhIHNpbmdsZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpLiAqL1xuICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAvKiogQ291bnQgb25seSBleGVjdXRpb25zIGRlcGxveWVkIHRvIHRoaXMgZW52aXJvbm1lbnQgKGRlcGxveS1zY29wZWQpLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgLyoqIENvdW50IG9ubHkgZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBBTlkgZW52aXJvbm1lbnQgKHJlYWwgZGVwbG95bWVudHMpLiAqL1xuICBkZXBsb3lzT25seT86IGJvb2xlYW47XG59XG5cbi8vIERPUkEgcGVyZm9ybWFuY2UgYmFuZHMgKHRocmVzaG9sZHMgZnJvbSB0aGUgRE9SQS9BY2NlbGVyYXRlIHJlcG9ydHMpLiBFYWNoXG4vLyBoZWxwZXIgcmV0dXJucyBgbnVsbGAgd2hlbiB0aGVyZSdzIG5vIHNhbXBsZSB0byBjbGFzc2lmeS5cbi8qKiBEZXBsb3ltZW50IGZyZXF1ZW5jeSBieSBkZXBsb3lzL2RheTogZWxpdGUg4omlMS9kYXksIGhpZ2gg4omlMS93ZWVrLCBtZWRpdW0g4omlMS9tb250aC4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvckZyZXF1ZW5jeShwZXJEYXk6IG51bWJlciwgZGVwbG95bWVudHM6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmIChkZXBsb3ltZW50cyA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBlckRheSA+PSAxKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBlckRheSA+PSAxIC8gNykgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBlckRheSA+PSAxIC8gMzApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIENoYW5nZSBmYWlsdXJlIHJhdGUgYnkgcGVyY2VudDogZWxpdGUg4omkNSUsIGhpZ2gg4omkMTAlLCBtZWRpdW0g4omkMTUlLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShwY3Q6IG51bWJlciwgdG90YWw6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBjdCA8PSA1KSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBjdCA8PSAxMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBjdCA8PSAxNSkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogVGltZSB0byByZXN0b3JlIGJ5IHNlY29uZHM6IGVsaXRlIDwxaCwgaGlnaCA8MSBkYXksIG1lZGl1bSA8MSB3ZWVrLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yUmVzdG9yZShhdmdTZWNvbmRzOiBudW1iZXIgfCBudWxsKTogRG9yYUxldmVsIHtcbiAgaWYgKGF2Z1NlY29uZHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmIChhdmdTZWNvbmRzIDwgMzYwMCkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChhdmdTZWNvbmRzIDwgODY0MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChhdmdTZWNvbmRzIDwgNjA0ODAwKSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBMZWFkIHRpbWUgYnkgc2Vjb25kczogZWxpdGUgPDEgZGF5LCBoaWdoIDwxIHdlZWssIG1lZGl1bSA8MSBtb250aC4gKi9cbmZ1bmN0aW9uIGRvcmFMZXZlbEZvckxlYWRUaW1lKG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAobWVkaWFuU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgNjA0ODAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDI1OTIwMDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuXG4vKipcbiAqIFJvdW5kIGB2YWx1ZWAgdG8gYGRpZ2l0c2AgZGVjaW1hbCBwbGFjZXMsIHJldHVybmluZyBhIHJlYWwgbnVtYmVyLiBTbWFsbFxuICogbW9kdWxlLXByaXZhdGUgaGVscGVyIHNvIHRoZSBET1JBIHNoYXBpbmcgZG9lc24ndCByZXBlYXQgdGhlXG4gKiBgTnVtYmVyKE51bWJlcih4KS50b0ZpeGVkKG4pKWAgcGF0dGVybiAodG9GaXhlZCBhbG9uZSB5aWVsZHMgYSBzdHJpbmcpLlxuICovXG5mdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyLCBkaWdpdHM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZChkaWdpdHMpKTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgcGVyLWV4ZWN1dGlvbiB0ZXJtaW5hbC1zdGF0dXMgcm9sbC11cCBmb3IgdGhlIERPUkEgYGV4ZWNzYCBDVEVzOlxuICogRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELCBlbHNlIENBTkNFTEVEL1NUT1BQRUQuIEtlcHQgaW4gb25lIHBsYWNlIHNvXG4gKiBnZXREb3JhTWV0cmljcyBhbmQgZ2V0RG9yYVRyZW5kIGNhbid0IGRyaWZ0IG9uIHRoZSBwcmVjZWRlbmNlLlxuICovXG5jb25zdCBET1JBX1RFUk1JTkFMX1NUQVRVU19DQVNFID0gc3FsYFxuICAgICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5zdGF0dXMgPSAnRkFJTEVEJykgVEhFTiAnRkFJTEVEJ1xuICAgICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5zdGF0dXMgPSAnU1VDQ0VFREVEJykgVEhFTiAnU1VDQ0VFREVEJ1xuICAgICAgICAgICAgICBFTFNFICdDQU5DRUxFRCdcbiAgICAgICAgICAgIEVORGA7XG5cbi8qKlxuICogT3B0aW9uYWwgcGVyLXBpcGVsaW5lIC8gZGVwbG95LXNjb3BpbmcgcHJlZGljYXRlcyArIHRoZSByZXN1bHRpbmcgYGJhc2lzYCxcbiAqIHNoYXJlZCBieSBnZXREb3JhTWV0cmljcyBhbmQgZ2V0RG9yYVRyZW5kIHNvIHRoZSBlbnYvZGVwbG95c09ubHkgcHJlY2VkZW5jZVxuICogY2FuJ3QgZGl2ZXJnZS4gYGVudmlyb25tZW50YCAob25lIHRhcmdldCkgd2lucyBvdmVyIGBkZXBsb3lzT25seWAgKGFueSBlbnYpLlxuICovXG5mdW5jdGlvbiBkb3JhU2NvcGVDbGF1c2VzKG9wdHM6IERvcmFPcHRpb25zKSB7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBkZXBsb3lDbGF1c2UgPSBlbnZpcm9ubWVudFxuICAgID8gc3FsYEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gXG4gICAgOiBkZXBsb3lzT25seSA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTGAgOiBzcWxgYDtcbiAgY29uc3QgYmFzaXM6ICdkZXBsb3knIHwgJ3J1bicgPSBlbnZpcm9ubWVudCB8fCBkZXBsb3lzT25seSA/ICdkZXBsb3knIDogJ3J1bic7XG4gIHJldHVybiB7IHBpcGVsaW5lQ2xhdXNlLCBkZXBsb3lDbGF1c2UsIGJhc2lzIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGBleGVjc2AgQ1RFIGJvZHkg4oCUIHRoZSBwZXItZXhlY3V0aW9uIHRlcm1pbmFsIHJvbGwtdXAgdGhhdCBCT1RIIERPUkFcbiAqIG1ldGhvZHMgc2Nhbi4gT25seSB0aGUgU0VMRUNUZWQgY29sdW1ucyBhbmQgdGhlIHVwcGVyIHJhbmdlIGJvdW5kIGRpZmZlclxuICogKGdldERvcmFNZXRyaWNzIG5lZWRzIHBpcGVsaW5lX2lkL2VuZGVkX2F0L2R1cmF0aW9uX21zIHBsdXMgYSBsb29rLWFoZWFkIHRhaWxcbiAqIGZvciBNVFRSIHJlY292ZXJ5OyBnZXREb3JhVHJlbmQgbmVlZHMgb25seSBzdGFydGVkX2F0IG92ZXIgdGhlIGNvcmUgd2luZG93KSxcbiAqIHNvIHRob3NlIGFyZSB0aGUgcGFyYW1ldGVycy4gVGhlIGBldmVudF90eXBlPSdQSVBFTElORSdgIGdhdGUsIHRoZVxuICogU1VDQ0VFREVEL0ZBSUxFRC9DQU5DRUxFRC9TVE9QUEVEIHN0YXR1cyBzZXQsIHRoZSBgZXhlY3V0aW9uX2lkYCBmaWx0ZXIsIHRoZVxuICogb3JnICsgZGVwbG95L3BpcGVsaW5lIHNjb3BlIGNsYXVzZXMsIGFuZCB0aGUgYEdST1VQIEJZYCBhbGwgbGl2ZSBoZXJlIHNvIHRoZVxuICogdHdvIGNhbGxlcnMgY2FuJ3QgZHJpZnQgb24gdGhlIHN0YXR1cyBzZXQgb3IgdGhlIHByZWRpY2F0ZS5cbiAqXG4gKiBAcGFyYW0gY29sdW1ucyAgdHJhaWxpbmcgU0VMRUNUIGNvbHVtbnMgKGFmdGVyIGBlLmV4ZWN1dGlvbl9pZCxgKVxuICogQHBhcmFtIHRvQm91bmQgIHRoZSBgPD1gIHVwcGVyLWJvdW5kIGV4cHJlc3Npb24gb24gYGUuc3RhcnRlZF9hdGBcbiAqICAgICAgICAgICAgICAgICAoY29yZSB3aW5kb3cgZm9yIHRoZSB0cmVuZDsgY29yZSArIGxvb2stYWhlYWQgZm9yIG1ldHJpY3MpXG4gKi9cbmZ1bmN0aW9uIGV4ZWNzQ3RlKGFyZ3M6IHtcbiAgcHJlZDogU1FMO1xuICBjb2x1bW5zOiBTUUw7XG4gIHBpcGVsaW5lQ2xhdXNlOiBTUUw7XG4gIGRlcGxveUNsYXVzZTogU1FMO1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvQm91bmQ6IFNRTDtcbn0pOiBTUUwge1xuICBjb25zdCB7IHByZWQsIGNvbHVtbnMsIHBpcGVsaW5lQ2xhdXNlLCBkZXBsb3lDbGF1c2UsIGZyb20sIHRvQm91bmQgfSA9IGFyZ3M7XG4gIHJldHVybiBzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkLFxuICAgICAgICAgICR7Y29sdW1uc31cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJ1xuICAgICAgICAgIC0tIFNUT1BQRUQgKG1hbnVhbGx5IGFib3J0ZWQpIGpvaW5zIENBTkNFTEVEIGluIHRoZSBFTFNFIGJ1Y2tldDsgYm90aFxuICAgICAgICAgIC0tIGFyZSB0ZXJtaW5hbCBub24tZGVwbG95IG91dGNvbWVzLiBTVVBFUlNFREVEIHN0YXlzIGV4Y2x1ZGVkIChhXG4gICAgICAgICAgLS0gcmVwbGFjZWQgZXhlY3V0aW9uLCBub3QgYW4gb3V0Y29tZSkuXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJylcbiAgICAgICAgICBBTkQgZS5leGVjdXRpb25faWQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3BpcGVsaW5lQ2xhdXNlfVxuICAgICAgICAgICR7ZGVwbG95Q2xhdXNlfVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHpcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG9Cb3VuZH1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWQsIGUucGlwZWxpbmVfaWRgO1xufVxuXG5pbnRlcmZhY2UgRG9yYVJvdyB7XG4gIGRmX2RlcGxveW1lbnRzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgY2ZyX2ZhaWxlZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNmcl90b3RhbD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGx0X2RlcGxveW1lbnRzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbHRfbWVkaWFuX21zPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9mYWlsdXJlcz86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfcmVzdG9yZWQ/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX2F2Z19zZWNvbmRzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBET1JBIG1ldHJpY3Mgb3ZlciBhIFtmcm9tLHRvXSB3aW5kb3csIG9yZy1zY29wZWQgKHNpbmdsZS1vcmcgb3Igcm9sbHVwIHN1YnRyZWUpLlxuICpcbiAqIEEgXCJkZXBsb3ltZW50XCIgaXMgYSBURVJNSU5BTCBwaXBlbGluZS1sZXZlbCBldmVudCwgcm9sbGVkIHVwIHRvIG9uZSByb3cgcGVyXG4gKiBgZXhlY3V0aW9uX2lkYCAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEL1NUT1BQRUQg4oCUIHNhbWVcbiAqIHByZWNlZGVuY2UgYXMgYGxpc3RQaXBlbGluZUV4ZWN1dGlvbnNgKS5cbiAqXG4gKiBESVNDTE9TVVJFIOKAlCB0aGVzZSBhcmUgUlVOLUJBU0VEIGFwcHJveGltYXRpb25zIG9mIERPUkEuIEEgXCJkZXBsb3ltZW50XCIgaGVyZVxuICogaXMgYW55IHN1Y2Nlc3NmdWwgcGlwZWxpbmUgUlVOLCBub3QgYSB2ZXJpZmllZCBwcm9kdWN0aW9uIGRlcGxveW1lbnQ6IHRoZVxuICogZXZlbnQgc3RyZWFtIGNhcnJpZXMgbm8gZGVwbG95LXN0YWdlL2Vudmlyb25tZW50IG1hcmtlciwgc28gYSBDSS1vbmx5XG4gKiBidWlsZC90ZXN0IHBpcGVsaW5lIGNvdW50cyB0aGUgc2FtZSBhcyBvbmUgdGhhdCBzaGlwcyB0byBwcm9kLiBUaGF0IG1ha2VzXG4gKiBgZGVwbG95bWVudEZyZXF1ZW5jeWAgYSBwaXBlbGluZS10aHJvdWdocHV0IHNpZ25hbCBhbmQgYGNoYW5nZUZhaWx1cmVSYXRlYCBhXG4gKiBwaXBlbGluZS1mYWlsdXJlIHJhdGUgKGJ1aWxkL3Rlc3QgZmFpbHVyZXMgY2F1Z2h0IGluIENJIGNvdW50IHRvbyksIGFuZCBNVFRSXG4gKiBhIHBpcGVsaW5lLXJlY292ZXJ5IHRpbWUuIE9ubHkgYGxlYWRUaW1lYCBjYXJyaWVzIGFuIGV4cGxpY2l0IGBhcHByb3hgIGZsYWdcbiAqIChpdCBpcyBhZGRpdGlvbmFsbHkgYSBydW4tdGltZSBwcm94eSksIGJ1dCBBTEwgZm91ciBzaGFyZSB0aGUgcnVu4omgZGVwbG95XG4gKiBjYXZlYXQgdW50aWwgZGVwbG95L2NvbW1pdCBtZXRhZGF0YSBpcyBjYXB0dXJlZC4gU2VlIGRvY3MvZG9yYS1tZXRyaWNzLm1kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFNZXRyaWNzIHtcbiAgLyoqIFRoZSBbZnJvbSx0b10gd2luZG93IGVjaG9lZCBiYWNrIChzdGFydGVkX2F0IHJhbmdlKS4gKi9cbiAgd2luZG93OiB7IGZyb206IHN0cmluZzsgdG86IHN0cmluZyB9O1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbnVtYmVycyBjb3VudCByZWFsIGRlcGxveW1lbnRzIG9yIHBpcGVsaW5lIHJ1bnM6XG4gICAqIC0gYCdkZXBsb3knYCDigJQgc2NvcGVkIHRvIGV4ZWN1dGlvbnMgdGFnZ2VkIHdpdGggYSBkZXBsb3kgYGVudmlyb25tZW50YFxuICAgKiAgICh2aWEgYGVudmlyb25tZW50YC9gZGVwbG95c09ubHlgKTsgYSBnZW51aW5lIGRlcGxveW1lbnQgc2lnbmFsLlxuICAgKiAtIGAncnVuJ2Ag4oCUIGRlZmF1bHQ6IGV2ZXJ5IHN1Y2Nlc3NmdWwgUElQRUxJTkUgcnVuIGNvdW50cyAobm8gZGVwbG95XG4gICAqICAgbWFya2VyIGFwcGxpZWQpLiBERi9DRlIvTVRUUiB0aGVuIHJlZmxlY3QgcGlwZWxpbmUgYWN0aXZpdHksIG5vdCBkZXBsb3lzLlxuICAgKi9cbiAgYmFzaXM6ICdkZXBsb3knIHwgJ3J1bic7XG4gIC8qKiBUaGUgc2NvcGluZyBhcHBsaWVkIChlY2hvZWQgZm9yIHRoZSBVSSk7IGBudWxsYCB3aGVuIHVuc2NvcGVkLiAqL1xuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7IGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsIH07XG4gIC8qKiBEZXBsb3ltZW50IEZyZXF1ZW5jeSDigJQgU1VDQ0VFREVEIHRlcm1pbmFsIGRlcGxveW1lbnRzIGluIHRoZSB3aW5kb3cuICovXG4gIGRlcGxveW1lbnRGcmVxdWVuY3k6IHtcbiAgICAvKiogQ291bnQgb2Ygc3VjY2Vzc2Z1bCBkZXBsb3ltZW50cy4gKi9cbiAgICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAgIC8qKiBTdWNjZXNzZnVsIGRlcGxveW1lbnRzIHBlciBkYXkgb3ZlciB0aGUgd2luZG93LiAqL1xuICAgIHBlckRheTogbnVtYmVyO1xuICAgIC8qKiBQZXJmb3JtYW5jZSBiYW5kLCBvciBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBkZXBsb3ltZW50cy4gKi9cbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKiogQ2hhbmdlIEZhaWx1cmUgUmF0ZSDigJQgZmFpbGVkIC8gKHN1Y2NlZWRlZCArIGZhaWxlZCk7IENBTkNFTEVEIGV4Y2x1ZGVkLiAqL1xuICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIC8qKiBzdWNjZWVkZWQgKyBmYWlsZWQgKHRoZSBDRlIgZGVub21pbmF0b3IpLiAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgLyoqIGZhaWxlZC90b3RhbCBhcyBhIHBlcmNlbnRhZ2UsIDDigJMxMDAsIDEgZGVjaW1hbC4gKi9cbiAgICBwY3Q6IG51bWJlcjtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gZGVwbG95bWVudHMgdG8ganVkZ2UuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIE1lYW4gVGltZSBUbyBSZXN0b3JlIOKAlCBhdmcgZ2FwIGZyb20gYSBmYWlsdXJlIElOQ0lERU5UIHRvIGl0cyByZWNvdmVyeS5cbiAgICogIENvbnNlY3V0aXZlIGZhaWxlZCBydW5zIG9mIGEgcGlwZWxpbmUgKHdpdGggbm8gZ3JlZW4gcnVuIGJldHdlZW4pIGNvbGxhcHNlXG4gICAqICBpbnRvIG9uZSBpbmNpZGVudDsgdGhlIGdhcCBpcyBtZWFzdXJlZCBmcm9tIHRoZSBmaXJzdCBmYWlsdXJlJ3MgRU5EIHRvIHRoZVxuICAgKiAgcmVjb3ZlcmluZyBydW4ncyBFTkQuIFRoZSByZWNvdmVyeSBpcyB2aXNpYmxlIHVwIHRvIGEgbG9vay1haGVhZCBwYXN0IGB0b2BcbiAgICogIHNvIGEgZmFpbHVyZSBuZWFyIHRoZSB3aW5kb3cgZWRnZSBpc24ndCBzcHVyaW91c2x5IGNvdW50ZWQgdW5yZXN0b3JlZC4gKi9cbiAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICAvKiogRmFpbHVyZSBpbmNpZGVudHMgaW4gdGhlIHdpbmRvdyAobWF4aW1hbCBydW5zIG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzKS4gKi9cbiAgICBmYWlsdXJlczogbnVtYmVyO1xuICAgIC8qKiBJbmNpZGVudHMgdGhhdCB3ZXJlIGZvbGxvd2VkIGJ5IGEgc3VjY2VlZGVkIHJ1biAocmVjb3ZlcmVkKS4gKi9cbiAgICByZXN0b3JlZDogbnVtYmVyO1xuICAgIC8qKiBBdmVyYWdlIHJlc3RvcmUgZ2FwIGluIHNlY29uZHM7IG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGluY2lkZW50cy4gKi9cbiAgICBhdmdTZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBQZXJmb3JtYW5jZSBiYW5kLCBvciBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBpbmNpZGVudHMuICovXG4gICAgbGV2ZWw6IERvcmFMZXZlbDtcbiAgfTtcbiAgLyoqIExlYWQgVGltZSDigJQgUFJPWFk6IG1lZGlhbiBwaXBlbGluZSBSVU4gVElNRSBvZiBzdWNjZWVkZWQgZGVwbG95bWVudHMuXG4gICAqICBOT1QgdHJ1ZSBjb21taXTihpJwcm9kIGxlYWQgdGltZSAoZXhlY3V0aW9ucyBkb24ndCBjYXB0dXJlIGNvbW1pdCB0aW1lKSxcbiAgICogIGhlbmNlIGBhcHByb3g6IHRydWVgIHNvIHRoZSBVSS9kb2NzIGNhbiBsYWJlbCBpdC4gKi9cbiAgbGVhZFRpbWU6IHtcbiAgICAvKiogU3VjY2VlZGVkIGRlcGxveW1lbnRzIHdpdGggYSBkdXJhdGlvbiAodGhlIG1lZGlhbiBzYW1wbGUpLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgLyoqIE1lZGlhbiBydW4gdGltZSBpbiBzZWNvbmRzOyBudWxsIHdoZW4gbm8gc3VjY2Vzc2Z1bCBkZXBsb3ltZW50cy4gKi9cbiAgICBtZWRpYW5TZWNvbmRzOiBudW1iZXIgfCBudWxsO1xuICAgIGFwcHJveDogdHJ1ZTtcbiAgICAvKiogUGVyZm9ybWFuY2UgYmFuZCwgb3IgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gc3VjY2Vzc2Z1bCBkZXBsb3ltZW50cy4gKi9cbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xufVxuXG4vKiogT25lIGludGVydmFsIGJ1Y2tldCBvZiB0aGUgRE9SQSB0cmVuZCAoZGVwbG95bWVudCBmcmVxdWVuY3kgKyBjaGFuZ2UgZmFpbHVyZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFUcmVuZFBvaW50IHtcbiAgLyoqIEJ1Y2tldCBzdGFydCAoREFURV9UUlVOQyBvZiBzdGFydGVkX2F0KSwgSVNPIHRleHQuICovXG4gIHBlcmlvZDogc3RyaW5nO1xuICAvKiogU3VjY2Vzc2Z1bCBkZXBsb3ltZW50cyBpbiB0aGUgYnVja2V0LiAqL1xuICBkZXBsb3ltZW50czogbnVtYmVyO1xuICAvKiogRmFpbGVkIGRlcGxveW1lbnRzIGluIHRoZSBidWNrZXQuICovXG4gIGZhaWxlZDogbnVtYmVyO1xuICAvKiogc3VjY2VlZGVkICsgZmFpbGVkIGluIHRoZSBidWNrZXQuICovXG4gIHRvdGFsOiBudW1iZXI7XG4gIC8qKiBmYWlsZWQvdG90YWwgYXMgYSBwZXJjZW50ICgwIHdoZW4gdG90YWwgaXMgMCkuICovXG4gIGNoYW5nZUZhaWx1cmVQY3Q6IG51bWJlcjtcbn1cblxuLyoqIEV2ZW50IHBheWxvYWQgYWNjZXB0ZWQgYnkgYFJlcG9ydGluZ1NlcnZpY2UuaW5nZXN0RXZlbnRzYC4gTWlycm9ycyB0aGUgcm91dGUncyBab2Qgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdEV2ZW50IHtcbiAgLyoqIFN0YWJsZSBwaXBlbGluZSBpZCB0aGUgZXZlbnRzIExhbWJkYSByZWFkIGZyb20gdGhlIGBQSVBFTElORV9FVkVOVF9JRGBcbiAgICogIHRhZyAoPSB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCkuIFRoZSByZWdpc3RyeSBqb2luIGtleS4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuICBldmVudFR5cGU6ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uIChBY3Rpb24gZXZlbnRzKS4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICAvKiogU291cmNlIGNvbW1pdCBpZCBvZiB0aGUgY2hhbmdlIGJlaW5nIHNoaXBwZWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIHJlZi9icmFuY2ggKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gKi9cbiAgY29tbWl0UmVmPzogc3RyaW5nO1xuICAvKiogRGVwbG95IHRhcmdldCAoZS5nLiBcInByb2R1Y3Rpb25cIikuIEl0cyBwcmVzZW5jZSBtYXJrcyBhIHJlYWwgZGVwbG95bWVudC4gKi9cbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ291bnRzICsgdGhlIChwb3NzaWJseSB0cnVuY2F0ZWQpIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyB0aGUgY2FsbGVyIGNhbiBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJlc3VsdCB7XG4gIGluc2VydGVkOiBudW1iZXI7XG4gIHNraXBwZWQ6IG51bWJlcjtcbiAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHN0cmluZ1tdO1xufVxuXG4vLyDilIDilIDilIAgU2VydmljZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSZWFkLW9ubHkgcmVwb3J0aW5nIHNlcnZpY2UgZm9yIHBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgcGx1Z2luIGludmVudG9yeSBhZ2dyZWdhdGlvbnMuXG4gKiBEb2VzIG5vdCBleHRlbmQgQ3J1ZFNlcnZpY2Ug4oCUIHJlcG9ydHMgYXJlIGFnZ3JlZ2F0ZSBxdWVyaWVzLCBub3QgZW50aXR5IENSVUQuXG4gKlxuICogQWxsIHF1ZXJpZXMgYXJlIGNhY2hlZCBpbi1tZW1vcnkgdG8gYXZvaWQgcmVwZWF0ZWQgZXhwZW5zaXZlIFNRTCBhZ2dyZWdhdGlvbnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVExcbiAqIC0gVGltZXNlcmllcyBxdWVyaWVzIChleGVjdXRpb24vYnVpbGQgbWV0cmljcyB3aXRoIGRhdGUgcmFuZ2VzKTogMiBtaW4gVFRMXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdTZXJ2aWNlIHtcblxuICAvKiogSW52YWxpZGF0ZSBhbGwgY2FjaGVkIHJlcG9ydHMgZm9yIGFuIG9yZyAoY2FsbCBhZnRlciBldmVudCBpbmdlc3QpLiAqL1xuICBhc3luYyBpbnZhbGlkYXRlT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBpbnZlbnRvcnlDYWNoZS5pbnZhbGlkYXRlUGF0dGVybihgJHtvcmdJZH06KmApLFxuICAgICAgdGltZXNlcmllc0NhY2hlLmludmFsaWRhdGVQYXR0ZXJuKGAke29yZ0lkfToqYCksXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAgICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICAgKiBFdmVudHMgZm9yIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgYXJlIGRyb3BwZWQgKGFuZCBsb2dnZWQgYXQgV0FSTlxuICAgKiB3aXRoIHNhbXBsZSBpZHMgc28gYW4gb3BlcmF0b3IgY2FuIHNlZSB3aGVuIEV2ZW50QnJpZGdlIGlzIGRlbGl2ZXJpbmdcbiAgICogZXZlbnRzIGZvciBwaXBlbGluZXMgdGhhdCBoYXZlbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0KS5cbiAgICpcbiAgICogUmV0dXJucyBjb3VudHMgKyBhIHNhbXBsZSBvZiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGZvciBvYnNlcnZhYmlsaXR5LlxuICAgKi9cbiAgYXN5bmMgaW5nZXN0RXZlbnRzKGV2ZW50czogSW5nZXN0RXZlbnRbXSk6IFByb21pc2U8SW5nZXN0UmVzdWx0PiB7XG4gICAgLy8gTXVsdGktb3JnIGJhdGNoIGluc2VydDogdGhlIGNhbGxlciByZXNvbHZlcyB0byBtdWx0aXBsZSBvcmdzIHZpYSB0aGVcbiAgICAvLyBwaXBlbGluZS1yZWdpc3RyeSBsb29rdXAgYmVsb3csIHNvIHRoZSByb3V0ZSBsYXllciBNVVNUIGVzdGFibGlzaCBhXG4gICAgLy8gYHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIC4uLilgIHNjb3BlIGJlZm9yZSBjYWxsaW5nXG4gICAgLy8gdGhpcyBtZXRob2QuIFVuZGVyIEZPUkNFJ2QgUkxTLCBhIHNpbmdsZSB0eCB3aXRoIGBhcHAub3JnX2lkID0gPG9uZVxuICAgIC8vIG9yZz5gIGNvdWxkIG9ubHkgd3JpdGUgZXZlbnRzIGZvciB0aGF0IG9yZzsgYnlwYXNzIHZpYSBzeXNhZG1pbiBpc1xuICAgIC8vIHRoZSByaWdodCBnYXRlIGZvciB0aGlzIHNlcnZlci1pbnRlcm5hbCBjcm9zcy10ZW5hbnQgZW5kcG9pbnQuIFNlZVxuICAgIC8vIGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHMgZm9yIHRoZSB3cmFwcGVyLlxuICAgIC8vIFJ1biBpbnNlcnQgaW5zaWRlIHRoZSB0eCwgYnV0IENPTExFQ1QgYWZmZWN0ZWQgb3JncyBhbmQgaW52YWxpZGF0ZVxuICAgIC8vIGNhY2hlcyBBRlRFUiB0aGUgdHggcmVzb2x2ZXMuIEtlZXBpbmcgaW52YWxpZGF0aW9uIGluc2lkZSB0aGUgdHggaGVsZFxuICAgIC8vIHRoZSBwZyBsb2NrcyBvcGVuIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhY2hlIHJvdW5kLXRyaXBzIChSZWRpcyBvclxuICAgIC8vIGluLW1lbW9yeSBpbnZhbGlkYXRpb25zIGFyZSB1bnJlbGF0ZWQgdG8gdGhlIHR4IGJ1dCBzdGlsbCBzZXJpYWxpemVkXG4gICAgLy8gaXRzIGNvbW1pdCkuIENhY2hlIFRUTCBpcyAyLTUgbWluIHNvIGZpcmUtYW5kLWZvcmdldCBwb3N0LWNvbW1pdCBpc1xuICAgIC8vIGFuIGFjY2VwdGFibGUgdHJhZGUgZm9yIHRpZ2h0ZXIgbG9jayB3aW5kb3dzLlxuICAgIGNvbnN0IHsgaW5zZXJ0ZWQsIHNraXBwZWQsIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLCBhZmZlY3RlZE9yZ3MgfSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIEJhdGNoLXJlc29sdmUgYWxsIHVuaXF1ZSBwaXBlbGluZSBpZHMgaW4gb25lIHF1ZXJ5XG4gICAgICBjb25zdCB1bmlxdWVJZHMgPSBbLi4ubmV3IFNldChldmVudHMubWFwKGUgPT4gZS5waXBlbGluZUlkKSldO1xuICAgICAgY29uc3QgcmVnaXN0cnlSb3dzID0gYXdhaXQgdHhcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkub3JnSWQsXG4gICAgICAgIH0pXG4gICAgICAgIC5mcm9tKHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5KVxuICAgICAgICAud2hlcmUoaW5BcnJheShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLCB1bmlxdWVJZHMpKTtcblxuICAgICAgY29uc3QgaWRNYXAgPSBuZXcgTWFwKHJlZ2lzdHJ5Um93cy5tYXAociA9PiBbci5waXBlbGluZUlkLCByXSkpO1xuXG4gICAgICAvLyBCdWlsZCBpbnNlcnQgYmF0Y2ggKHNraXAgZXZlbnRzIHdob3NlIHBpcGVsaW5lIGlzbid0IHJlZ2lzdGVyZWQpXG4gICAgICBjb25zdCByb3dzOiBBcnJheTx0eXBlb2Ygc2NoZW1hLnBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0PiA9IFtdO1xuICAgICAgbGV0IHNraXBwZWRMb2NhbCA9IDA7XG4gICAgICBjb25zdCB1bnJlZ2lzdGVyZWRMb2NhbDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBpZE1hcC5nZXQoZXZlbnQucGlwZWxpbmVJZCk7XG4gICAgICAgIGlmICghcmVnaXN0cnkpIHtcbiAgICAgICAgICBza2lwcGVkTG9jYWwrKztcbiAgICAgICAgICB1bnJlZ2lzdGVyZWRMb2NhbC5wdXNoKGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAvLyByZWdpc3RyeS5waXBlbGluZUlkID09PSBldmVudC5waXBlbGluZUlkOyB1c2UgdGhlIHJlZ2lzdHJ5J3Mgc28gdGhlXG4gICAgICAgICAgLy8gRksgaXMgYWx3YXlzIGEgcm93IHRoYXQgZXhpc3RzLCBhbmQgcHVsbCBvcmdJZCBmcm9tIHRoZSByZWdpc3RyeSBmb3JcbiAgICAgICAgICAvLyB0ZW5hbmN5IChuZXZlciB0cnVzdCB0aGUgY2FsbGVyJ3MgY2xhaW1lZCBvcmcpLlxuICAgICAgICAgIHBpcGVsaW5lSWQ6IHJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgICAgICAgb3JnSWQ6IHJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgICAgIGV2ZW50U291cmNlOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICBzdGF0dXM6IGV2ZW50LnN0YXR1cyxcbiAgICAgICAgICBleGVjdXRpb25JZDogZXZlbnQuZXhlY3V0aW9uSWQsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICAgICAgYWN0aW9uTmFtZTogZXZlbnQuYWN0aW9uTmFtZSxcbiAgICAgICAgICAvLyBIQVJEIENPTlNUUkFJTlQ6IGFuIEFXUyBhY2NvdW50IGlkIG11c3QgTkVWRVIgYmUgcGVyc2lzdGVkLiBUaGlzIGlzXG4gICAgICAgICAgLy8gdGhlIERVUkFCTEUgcGVyc2lzdGVuY2UgYm91bmRhcnkgYW5kIG11c3Qgbm90IHRydXN0IHVwc3RyZWFtOlxuICAgICAgICAgIC8vIENvZGVQaXBlbGluZS9Db2RlQnVpbGQgZmFpbHVyZSBkZXRhaWwgJiBtZXNzYWdlcyByb3V0aW5lbHkgY2FycnlcbiAgICAgICAgICAvLyBBUk5zIChhcm46YXdzOuKApjo8YWNjb3VudC1pZD464oCmKSBhbmQgYmFyZSAxMi1kaWdpdCBhY2NvdW50IGlkcy4gU2NydWJcbiAgICAgICAgICAvLyBib3RoIGZyZWUtZm9ybSBmaWVsZHMgaGVyZSBiZWZvcmUgaW5zZXJ0IChwZXItZXZlbnQsIG5vbi1tdXRhdGluZykuXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBldmVudC5lcnJvck1lc3NhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5lcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydGVkQXQ6IGV2ZW50LnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IGV2ZW50LmNvbXBsZXRlZEF0ID8gbmV3IERhdGUoZXZlbnQuY29tcGxldGVkQXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgICAgICAgLy8gRGVwbG95LWF0dHJpYnV0aW9uIGZpZWxkcyDigJQgc2NydWJiZWQgbGlrZSB0aGUgb3RoZXIgZnJlZS1mb3JtIHN0cmluZ3NcbiAgICAgICAgICAvLyBzbyBhbiBBUk4vYWNjb3VudCBpZCBjYW4gbmV2ZXIgZW50ZXIgdmlhIGEgcmVmIG9yIGVudmlyb25tZW50IG5hbWUuXG4gICAgICAgICAgY29tbWl0U2hhOiBldmVudC5jb21taXRTaGEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzRnJvbVN0cmluZyhldmVudC5jb21taXRTaGEpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb21taXRSZWY6IGV2ZW50LmNvbW1pdFJlZiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LmNvbW1pdFJlZilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVudmlyb25tZW50OiBldmVudC5lbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LmVudmlyb25tZW50KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZGV0YWlsOiBldmVudC5kZXRhaWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBzY3J1YkF3c0lkZW50aWZpZXJzKGV2ZW50LmRldGFpbClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gU1FTIGlzIGF0LWxlYXN0LW9uY2UsIHNvIEV2ZW50QnJpZGdlIGNhbiBkZWxpdmVyIHRoZSBzYW1lIHN0YXRlLWNoYW5nZVxuICAgICAgLy8gdHdpY2UuIGBvbkNvbmZsaWN0RG9Ob3RoaW5nYCArIHRoZSBwYXJ0aWFsIHVuaXF1ZSBpbmRleCBvblxuICAgICAgLy8gKHBpcGVsaW5lX2lkLCBleGVjdXRpb25faWQsIGV2ZW50X3R5cGUsIHN0YXR1cywgc3RhZ2VfbmFtZSwgYWN0aW9uX25hbWUpXG4gICAgICAvLyBtYWtlcyByZS1kZWxpdmVyeSBpZGVtcG90ZW50LiBgcmV0dXJuaW5nYCBnaXZlcyB0aGUgUkVBTCBpbnNlcnRlZCBzZXQgc29cbiAgICAgIC8vIGNvdW50cyArIGNhY2hlIGludmFsaWRhdGlvbiBpZ25vcmUgZHVwbGljYXRlcy5cbiAgICAgIGNvbnN0IGluc2VydGVkUm93cyA9IHJvd3MubGVuZ3RoID4gMFxuICAgICAgICA/IGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGlwZWxpbmVFdmVudCkudmFsdWVzKHJvd3MpXG4gICAgICAgICAgLm9uQ29uZmxpY3REb05vdGhpbmcoKVxuICAgICAgICAgIC5yZXR1cm5pbmcoeyBvcmdJZDogc2NoZW1hLnBpcGVsaW5lRXZlbnQub3JnSWQgfSlcbiAgICAgICAgOiBbXTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zZXJ0ZWQ6IGluc2VydGVkUm93cy5sZW5ndGgsXG4gICAgICAgIHNraXBwZWQ6IHNraXBwZWRMb2NhbCxcbiAgICAgICAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHVucmVnaXN0ZXJlZExvY2FsLFxuICAgICAgICBhZmZlY3RlZE9yZ3M6IFsuLi5uZXcgU2V0KGluc2VydGVkUm93cy5tYXAociA9PiByLm9yZ0lkKSldLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFN1cmZhY2UgdGhlIHNpbGVudCBza2lwOiBhbiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWQgdXN1YWxseSBtZWFucyB0aGVcbiAgICAvLyBwaXBlbGluZSBoYXNuJ3QgY2FsbGVkIFBPU1QgL3BpcGVsaW5lcy9yZWdpc3RyeSB5ZXQgKG9yIGl0c1xuICAgIC8vIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyBpcyBtaXNzaW5nL3VucmVhZGFibGUgYnkgdGhlIExhbWJkYSkuIExvZ2dpbmcgaXRcbiAgICAvLyBtYWtlcyBhIGJyb2tlbiBqb2luIHZpc2libGUgaW5zdGVhZCBvZiBsb29raW5nIGxpa2UgXCJubyBhY3Rpdml0eVwiLlxuICAgIGlmICh1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignUGlwZWxpbmUgZXZlbnRzIHNraXBwZWQ6IHBpcGVsaW5lIGlkIG5vdCBmb3VuZCBpbiByZWdpc3RyeScsIHtcbiAgICAgICAgY291bnQ6IHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLmxlbmd0aCxcbiAgICAgICAgc2FtcGxlOiB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcy5zbGljZSgwLCAzKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFBvc3QtY29tbWl0IGNhY2hlIGludmFsaWRhdGlvbi4gRmlyZS1hbmQtZm9yZ2V0IHdpdGggbG9nZ2luZyDigJQgVFRMIGlzXG4gICAgLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBtaXNzZWQgaW52YWxpZGF0aW9uIHNlbGYtaGVhbHMuXG4gICAgaWYgKGFmZmVjdGVkT3Jncy5sZW5ndGggPiAwKSB7XG4gICAgICB2b2lkIFByb21pc2UuYWxsKGFmZmVjdGVkT3Jncy5tYXAoKG9yZykgPT5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlT3JnKG9yZykuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdSZXBvcnRpbmcgY2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZCcsIHsgb3JnSWQ6IG9yZywgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICB9KSxcbiAgICAgICkpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGluc2VydGVkLCBza2lwcGVkLCB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcyB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIENhdGVnb3J5IDE6IFBpcGVsaW5lIEV4ZWN1dGlvbiAmIFBlcmZvcm1hbmNlIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgb3JnLXNjb3BlIHByZWRpY2F0ZSBmb3IgYSByZXBvcnQgcXVlcnkuIFdpdGggYG9yZ0lkc2AgKHRoZVxuICAgKiBvcmcg4oaSIHRlYW0gcm9sbHVwIOKAlCBhIHBhcmVudCdzIGBbc2VsZiwgLi4uZGVzY2VuZGFudHNdYCkgaXQgYmVjb21lcyBhblxuICAgKiBgSU4gKC4uLilgIG92ZXIgdGhlIHN1YnRyZWU7IG90aGVyd2lzZSB0aGUgc2luZ2xlLW9yZyBgPSAkb3JnYC4gUmV0dXJucyBhXG4gICAqIGBtdWx0aWAgZmxhZyBzbyBjYWxsZXJzIGNhbiBydW4gbXVsdGktb3JnIHJlYWRzIHVuZGVyIHN5c2FkbWluIGNvbnRleHRcbiAgICogKHRoZSBzdWJ0cmVlIHNwYW5zIG9yZ3Mgb3V0c2lkZSB0aGUgcmVxdWVzdCdzIFJMUyBzY29wZSkgYW5kIHNhbHQgdGhlXG4gICAqIGNhY2hlIGtleS5cbiAgICovXG4gIHByaXZhdGUgb3JnU2NvcGUob3JnSWQ6IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pIHtcbiAgICBjb25zdCBpZHMgPSBvcmdJZHMgJiYgb3JnSWRzLmxlbmd0aCA+IDAgPyBvcmdJZHMgOiBbb3JnSWRdO1xuICAgIGNvbnN0IG11bHRpID0gaWRzLmxlbmd0aCA+IDE7XG4gICAgY29uc3QgcHJlZCA9IG11bHRpXG4gICAgICA/IHNxbGBJTiAoJHtzcWwuam9pbihpZHMubWFwKChpZCkgPT4gc3FsYCR7aWR9YCksIHNxbGAsIGApfSlgXG4gICAgICA6IHNxbGA9ICR7aWRzWzBdfWA7XG4gICAgcmV0dXJuIHsgcHJlZCwgbXVsdGkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByZXBvcnQgcmVhZC4gU2luZ2xlLW9yZyByZWFkcyB1c2UgdGhlIHBlci1vcmcgY2FjaGUgKGludmFsaWRhdGVkIG9uXG4gICAqIHRoYXQgb3JnJ3MgZXZlbnQgaW5nZXN0KS4gUm9sbHVwIChtdWx0aS1vcmcpIHJlYWRzICoqYnlwYXNzIHRoZSBjYWNoZSoqIGFuZFxuICAgKiBydW4gdW5kZXIgc3lzYWRtaW4gY29udGV4dDogdGhleSdyZSBhZG1pbi1vbmx5IGFuZCBsb3dlci1mcmVxdWVuY3ksIGFuZCBhXG4gICAqIGNoaWxkIG9yZydzIGV2ZW50IGluZ2VzdCBjYW4ndCBpbnZhbGlkYXRlIGEgcGFyZW50J3Mgcm9sbHVwIGVudHJ5IChyZXBvcnRpbmdcbiAgICogaGFzIG5vIG9yZyB0cmVlKSwgc28gY2FjaGluZyB0aGVtIHdvdWxkIHNlcnZlIHN0YWxlIGFnZ3JlZ2F0ZXMuIEFsd2F5cyBmcmVzaC5cbiAgICovXG4gIHByaXZhdGUgcnVuUmVwb3J0PFQ+KGNhY2hlS2V5OiBzdHJpbmcsIG11bHRpOiBib29sZWFuLCBleGVjOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG11bHRpXG4gICAgICA/IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGV4ZWMpXG4gICAgICA6IHRpbWVzZXJpZXNDYWNoZS5nZXRPclNldChjYWNoZUtleSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4xIEV4ZWN1dGlvbiBjb3VudCBwZXIgcGlwZWxpbmUgd2l0aCBzdGF0dXMgYnJlYWtkb3duLiAqL1xuICBhc3luYyBnZXRFeGVjdXRpb25Db3VudChvcmdJZDogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0pOiBQcm9taXNlPEV4ZWN1dGlvbkNvdW50W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIC8vIE9wdGlvbmFsIFtmcm9tLHRvXSB3aW5kb3cgb24gdGhlIGV4ZWN1dGlvbidzIHN0YXJ0ZWRfYXQsIG1pcnJvcmluZyB0aGVcbiAgICAvLyBzaWJsaW5nIHRpbWVzZXJpZXMgcmVwb3J0cyBzbyB0aGUgZGFzaGJvYXJkIGRhdGUtcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlXG4gICAgLy8gY291bnQgdG9vIChhbiBlbXB0eSByYW5nZSA9IGFsbC10aW1lLCBwcmVzZXJ2aW5nIHRoZSBwcmlvciBiZWhhdmlvcikuIFRoZVxuICAgIC8vIHJhbmdlIHJpZGVzIHRoZSBKT0lOIHNvIHBpcGVsaW5lcyB3aXRoIG5vIGluLXdpbmRvdyBldmVudHMgc3RpbGwgbGlzdFxuICAgIC8vIChMRUZUIHNlbWFudGljcyBwcmVzZXJ2ZWQgdmlhIHRoZSBpbm5lci1qb2luIGZpbHRlciDigJQgYSBwaXBlbGluZSB3aXRoIHplcm9cbiAgICAvLyBtYXRjaGluZyBldmVudHMgZHJvcHMgZnJvbSB0aGUgY291bnQsIHNhbWUgYXMgYmVmb3JlIGZvciBpdHMgd2luZG93KS5cbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IHJhbmdlPy5mcm9tICYmIHJhbmdlPy50b1xuICAgICAgPyBzcWxgQU5EIGUuc3RhcnRlZF9hdCA+PSAke3JhbmdlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7cmFuZ2UudG99Ojp0aW1lc3RhbXB0emBcbiAgICAgIDogc3FsYGA7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAub3JnYW5pemF0aW9uLCBwLnBpcGVsaW5lX25hbWUsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgZmlyc3RfZXhlY3V0aW9uLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3RfZXhlY3V0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmV9IHBcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlIE9OIGUucGlwZWxpbmVfaWQgPSBwLmlkXG4gICAgICAgICAgQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzICE9ICdTVEFSVEVEJ1xuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIHAuaXNfYWN0aXZlID0gdHJ1ZVxuICAgICAgICBHUk9VUCBCWSBwLmlkXG4gICAgICAgIE9SREVSIEJZIHRvdGFsIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxFeGVjdXRpb25Db3VudD4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06ZXhlYy1jb3VudDoke3JhbmdlPy5mcm9tID8/ICcnfToke3JhbmdlPy50byA/PyAnJ31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKipcbiAgICogMS4xYiBQZXItcGlwZWxpbmUgZXhlY3V0aW9uIGhpc3Rvcnkg4oCUIERJU1RJTkNUIGV4ZWN1dGlvbnMgZm9yIG9uZSBwaXBlbGluZSxcbiAgICogbmV3ZXN0IGZpcnN0LiBHcm91cHMgYWxsIGV2ZW50cyBieSBgZXhlY3V0aW9uX2lkYCBpbiBhIHNpbmdsZSBzY2FuIGFuZFxuICAgKiByb2xscyBlYWNoIGV4ZWN1dGlvbiB1cCB0byBvbmUgcm93OlxuICAgKiAgIC0gc3RhdHVzOiBkZXJpdmVkIGZyb20gdGhlIFBJUEVMSU5FLXR5cGUgZXZlbnRzLiBGQUlMRUQgd2lucywgdGhlblxuICAgKiAgICAgU1VDQ0VFREVELCB0aGVuIENBTkNFTEVEOyBhbiBleGVjdXRpb24gd2l0aCBubyB0ZXJtaW5hbCBQSVBFTElORSBldmVudFxuICAgKiAgICAgaXMgc3RpbGwgYGluLXByb2dyZXNzYC5cbiAgICogICAtIHN0YXJ0ZWRBdC9lbmRlZEF0L2R1cmF0aW9uTXM6IGZyb20gdGhlIFBJUEVMSU5FIGxpZmVjeWNsZSBldmVudHMuXG4gICAqICAgLSBmYWlsaW5nU3RhZ2UvZmFpbGluZ0FjdGlvbjogdGhlIGZpcnN0IEZBSUxFRCBTVEFHRS9BQ1RJT04gZXZlbnQgKGNoZWFwIOKAlFxuICAgKiAgICAgc2FtZSBzY2FuLCBubyBleHRyYSBxdWVyeSkuXG4gICAqXG4gICAqIE9SRy1TQ09QSU5HOiBpZGVudGljYWwgdG8gdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHMg4oCUIGpvaW5zIHRoZSBwaXBlbGluZVxuICAgKiByZWdpc3RyeSB0YWJsZSAoYHBpcGVsaW5lYCkgYW5kIGdhdGVzIG9uIGBwLm9yZ19pZCAke3ByZWR9YCwgd2hlcmUgYHByZWRgIGlzXG4gICAqIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgIG9yICh3aXRoIGEgcm9sbHVwKSBhbiBgSU4gKC4uLilgIG92ZXIgdGhlIG9yZ+KGknRlYW1cbiAgICogc3VidHJlZS4gQSBwaXBlbGluZUlkIGJlbG9uZ2luZyB0byBhbm90aGVyIG9yZyB5aWVsZHMgemVybyByb3dzLlxuICAgKi9cbiAgYXN5bmMgbGlzdFBpcGVsaW5lRXhlY3V0aW9ucyhcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSxcbiAgICBsaW1pdDogbnVtYmVyID0gNTAsXG4gICk6IFByb21pc2U8UGlwZWxpbmVFeGVjdXRpb25bXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgcmFuZ2VDbGF1c2UgPSByYW5nZT8uZnJvbSAmJiByYW5nZT8udG9cbiAgICAgID8gc3FsYEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtyYW5nZS5mcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3JhbmdlLnRvfTo6dGltZXN0YW1wdHpgXG4gICAgICA6IHNxbGBgO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5leGVjdXRpb25faWQsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpIFRIRU4gJ2ZhaWxlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKSBUSEVOICdzdWNjZWVkZWQnXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKSBUSEVOICdjYW5jZWxlZCdcbiAgICAgICAgICAgIEVMU0UgJ2luLXByb2dyZXNzJ1xuICAgICAgICAgIEVORCBBUyBzdGF0dXMsXG4gICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBzdGFydGVkX2F0LFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6dGV4dCBBUyBlbmRlZF9hdCxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnKTo6aW50IEFTIGR1cmF0aW9uX21zLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5zdGFnZV9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcpKVsxXSBBUyBmYWlsaW5nX3N0YWdlLFxuICAgICAgICAgIChBUlJBWV9BR0coZS5hY3Rpb25fbmFtZSkgRklMVEVSIChXSEVSRSBlLmV2ZW50X3R5cGUgPSAnQUNUSU9OJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfYWN0aW9uXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9IEFORCBlLmV4ZWN1dGlvbl9pZCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cmFuZ2VDbGF1c2V9XG4gICAgICAgIEdST1VQIEJZIGUuZXhlY3V0aW9uX2lkXG4gICAgICAgIE9SREVSIEJZIE1BWChlLmNyZWF0ZWRfYXQpIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxQaXBlbGluZUV4ZWN1dGlvbj4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06cGlwZWxpbmUtZXhlY3V0aW9uczoke3BpcGVsaW5lSWR9OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfToke2xpbWl0fWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjIgU3VjY2VzcyByYXRlIG92ZXIgdGltZSBmb3IgYW4gb3JnLiAqL1xuICBhc3luYyBnZXRTdWNjZXNzUmF0ZShvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnQ0FOQ0VMRUQnKTo6aW50IEFTIGNhbmNlbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORSdcbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJylcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN1Y2Nlc3MtcmF0ZToke2ludGVydmFsfToke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMyBBdmVyYWdlIGR1cmF0aW9uIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0QXZlcmFnZUR1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPER1cmF0aW9uU3RhdHNbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnByb2plY3QsIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUlOKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWluX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tcyxcbiAgICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45NSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBlLmR1cmF0aW9uX21zKTo6aW50IEFTIHA5NV9tcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGV4ZWN1dGlvbnNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5kdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcC5pZCBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPER1cmF0aW9uU3RhdHM+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmF2Zy1kdXJhdGlvbjoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuNSBTdGFnZSBmYWlsdXJlIGhlYXRtYXAg4oCUIHdoaWNoIHN0YWdlcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuc3RhZ2VfbmFtZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5zdGFnZV9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWZhaWx1cmVzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS42IFN0YWdlIGJvdHRsZW5lY2tzIOKAlCBzbG93ZXN0IHN0YWdlcyBwZXIgcGlwZWxpbmUuICovXG4gIGFzeW5jIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8U3RhZ2VCb3R0bGVuZWNrW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgcC5pZCwgcC5waXBlbGluZV9uYW1lLCBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQVZHKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgYXZnX21zLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKTo6aW50IEFTIG1heF9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkLCBlLnN0YWdlX25hbWUgT1JERVIgQlkgYXZnX21zIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxTdGFnZUJvdHRsZW5lY2s+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OnN0YWdlLWJvdHRsZW5lY2tzOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS43IEFjdGlvbiBmYWlsdXJlIHJhdGUg4oCUIHdoaWNoIHBsdWdpbiBzdGVwcyBmYWlsIG1vc3QuICovXG4gIGFzeW5jIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEFjdGlvbkZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmFjdGlvbl9uYW1lLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIGZhaWx1cmVfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLmFjdGlvbl9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmFjdGlvbl9uYW1lIE9SREVSIEJZIGZhaWx1cmVzIERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxBY3Rpb25GYWlsdXJlPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTphY3Rpb24tZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjggRXJyb3IgY2F0ZWdvcml6YXRpb24g4oCUIGdyb3VwIGZhaWx1cmUgbWVzc2FnZXMuIEV4ZWN1dGlvbiByZXBvcnQsIHNvXG4gICAqIHJvbGx1cC1hd2FyZSBleGFjdGx5IGxpa2UgdGhlIHNpYmxpbmcgZXhlY3V0aW9uIHJlcG9ydHM6IHdpdGggYG9yZ0lkc2BcbiAgICogKHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUpIHRoZSBvcmcgZ2F0ZSBiZWNvbWVzIGFuIGBJTiAoLi4uKWAgYW5kIHRoZSByZWFkIHJ1bnNcbiAgICogZnJlc2ggdW5kZXIgc3lzYWRtaW4gdmlhIGBydW5SZXBvcnRgOyBzaW5nbGUtb3JnIHJlYWRzIGtlZXAgdGhlIHBlci1vcmcgY2FjaGUuXG4gICAqL1xuICBhc3luYyBnZXRFcnJvcnMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxFcnJvckVudHJ5W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgU1VCU1RSSU5HKGUuZXJyb3JfbWVzc2FnZSBGUk9NIDEgRk9SIDIwMCkgQVMgZXJyb3JfcGF0dGVybixcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIG9jY3VycmVuY2VzLFxuICAgICAgICAgIENPVU5UKERJU1RJTkNUIGUucGlwZWxpbmVfaWQpOjppbnQgQVMgYWZmZWN0ZWRfcGlwZWxpbmVzLFxuICAgICAgICAgIE1BWChlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIGxhc3Rfc2VlblxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnIEFORCBlLmVycm9yX21lc3NhZ2UgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGVycm9yX3BhdHRlcm4gT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEVycm9yRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmVycm9yczoke2Zyb219OiR7dG99OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuOSBET1JBIG1ldHJpY3Mgb3ZlciBbZnJvbSx0b10gKHN0YXJ0ZWRfYXQgcmFuZ2UpLCBvcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlLlxuICAgKlxuICAgKiBBbGwgZm91ciBtZXRyaWNzIGRlcml2ZSBmcm9tIGEgcGVyLWV4ZWN1dGlvbiByb2xsLXVwIG9mIFRFUk1JTkFMIFBJUEVMSU5FXG4gICAqIGV2ZW50cyAob25lIHJvdyBwZXIgZXhlY3V0aW9uX2lkK3BpcGVsaW5lX2lkOyBGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQsXG4gICAqIHRoZW4gQ0FOQ0VMRUQvU1RPUFBFRCDigJQgbWlycm9yaW5nIGBsaXN0UGlwZWxpbmVFeGVjdXRpb25zYCkuIFRoZSBzY2FuIGlzXG4gICAqIGdhdGVkIGJ5IHRoZSBgcC5vcmdfaWQgJHtwcmVkfWAgam9pbiBleGFjdGx5IGxpa2UgdGhlIHNpYmxpbmcgcmVwb3J0cywgc28gYVxuICAgKiByb2xsdXAgcGFzc2VzIHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUgYW5kIGEgZm9yZWlnbiBvcmcncyBleGVjdXRpb25zIG5ldmVyXG4gICAqIGVudGVyIHRoZSBhZ2dyZWdhdGUuXG4gICAqXG4gICAqIERGL0NGUi9sZWFkLXRpbWUgY291bnQgb25seSBDT1JFLXdpbmRvdyBleGVjdXRpb25zIChbZnJvbSx0b10pLiBNVFRSIGlzXG4gICAqIHBlci1JTkNJREVOVDogY29uc2VjdXRpdmUgZmFpbHVyZXMgY29sbGFwc2UgaW50byBvbmUgaW5jaWRlbnQgYW5kIHRoZVxuICAgKiByZWNvdmVyeSBsb29rdXAgbWF5IHNlZSB0aGUgbmV4dCBzdWNjZXNzIHVwIHRvIE1UVFJfUkVTVE9SRV9MT09LQUhFQUQgcGFzdFxuICAgKiBgdG9gLCBzbyBhIGZhaWx1cmUgbmVhciB0aGUgZWRnZSBpc24ndCByaWdodC1jZW5zb3JlZCBpbnRvIFwibmV2ZXIgcmVzdG9yZWRcIi5cbiAgICogVGhlIHNjYW4gYm91bmQgaXMgdGhlcmVmb3JlIGBbZnJvbSwgdG8gKyBsb29rLWFoZWFkXWA7IHRoZSBzdGFydGVkX2F0IHJhbmdlXG4gICAqIHN0aWxsIHJpZGVzIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBzaWJsaW5nIHJlcG9ydHMuXG4gICAqXG4gICAqIERJU0NMT1NVUkU6IGJ5IGRlZmF1bHQgREYvQ0ZSL01UVFIgYXJlIFJVTi1iYXNlZCAoYW55IHN1Y2Nlc3NmdWwgUElQRUxJTkVcbiAgICogcnVuID0gYSBcImRlcGxveW1lbnRcIiksIGFuZCBMZWFkIFRpbWUgaXMgYWRkaXRpb25hbGx5IGEgcnVuLXRpbWUgUFJPWFlcbiAgICogZmxhZ2dlZCBgYXBwcm94OiB0cnVlYC4gUGFzcyBgZW52aXJvbm1lbnRgIG9yIGBkZXBsb3lzT25seWAgdG8gc2NvcGUgdG9cbiAgICogZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBhIHJlYWwgZGVwbG95IHRhcmdldCDigJQgdGhlIHJlc3BvbnNlIGBiYXNpc2AgcmVwb3J0c1xuICAgKiB3aGljaCB3YXMgdXNlZC4gU2VlIHRoZSBEb3JhTWV0cmljcyBkb2MgKyBkb2NzL2RvcmEtbWV0cmljcy5tZC5cbiAgICpcbiAgICogQHBhcmFtIG9wdHMucGlwZWxpbmVJZCAgICByZXN0cmljdCB0byBvbmUgcGlwZWxpbmUgKHBlci1waXBlbGluZSBET1JBKVxuICAgKiBAcGFyYW0gb3B0cy5lbnZpcm9ubWVudCAgIGNvdW50IG9ubHkgZXhlY3V0aW9ucyBkZXBsb3llZCB0byB0aGlzIHRhcmdldFxuICAgKiBAcGFyYW0gb3B0cy5kZXBsb3lzT25seSAgIGNvdW50IG9ubHkgZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBBTlkgZW52aXJvbm1lbnRcbiAgICovXG4gIGFzeW5jIGdldERvcmFNZXRyaWNzKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhTWV0cmljcz4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gICAgLy8gT3B0aW9uYWwgZGVwbG95LXNjb3BpbmcgLyBwZXItcGlwZWxpbmUgcHJlZGljYXRlcywgZm9sZGVkIGludG8gdGhlIGV4ZWNzXG4gICAgLy8gc2NhbiBzbyBmYWlsdXJlcyBBTkQgdGhlaXIgcmVjb3Zlcnkgc3VjY2Vzc2VzIGFyZSBmaWx0ZXJlZCBjb25zaXN0ZW50bHkuXG4gICAgY29uc3QgeyBwaXBlbGluZUNsYXVzZSwgZGVwbG95Q2xhdXNlLCBiYXNpcyB9ID0gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzKTtcbiAgICAvLyBTY2FuIHRoZSBDT1JFIHdpbmRvdyBwbHVzIGEgbG9vay1haGVhZCB0YWlsOiB0aGUgZXh0cmEgdGFpbCBleGlzdHMgb25seVxuICAgIC8vIHNvIGEgbGF0ZSBmYWlsdXJlIGNhbiBzdGlsbCBmaW5kIGl0cyByZWNvdmVyeSAoc2VlIHRoZSByZXN0b3JlIENURSkuXG4gICAgY29uc3QgZXhlY3MgPSBleGVjc0N0ZSh7XG4gICAgICBwcmVkLFxuICAgICAgcGlwZWxpbmVDbGF1c2UsXG4gICAgICBkZXBsb3lDbGF1c2UsXG4gICAgICBmcm9tLFxuICAgICAgY29sdW1uczogc3FsYFxuICAgICAgICAgICAgZS5waXBlbGluZV9pZCxcbiAgICAgICAgICAgICR7RE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRX0gQVMgc3RhdHVzLFxuICAgICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgQVMgc3RhcnRlZF9hdCxcbiAgICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgQVMgZW5kZWRfYXQsXG4gICAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgQVMgZHVyYXRpb25fbXNgLFxuICAgICAgdG9Cb3VuZDogc3FsYCR7dG99Ojp0aW1lc3RhbXB0eiArICR7TVRUUl9SRVNUT1JFX0xPT0tBSEVBRH06OmludGVydmFsYCxcbiAgICB9KTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFdJVEggZXhlY3MgQVMgKCR7ZXhlY3N9XG4gICAgICAgICksXG4gICAgICAgIC0tIENvcmUtd2luZG93IGV4ZWN1dGlvbnMgKFtmcm9tLHRvXSk7IERGL0NGUi9sZWFkLXRpbWUgY291bnQgb25seSB0aGVzZS5cbiAgICAgICAgLS0gVGhlIGxvb2stYWhlYWQgcm93cyBhYm92ZSBhcmUgdXNlZCBPTkxZIGFzIE1UVFIgcmVjb3ZlcnkgY2FuZGlkYXRlcy5cbiAgICAgICAgY29yZSBBUyAoXG4gICAgICAgICAgU0VMRUNUICogRlJPTSBleGVjcyBXSEVSRSBzdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICApLFxuICAgICAgICBkZiBBUyAoXG4gICAgICAgICAgU0VMRUNUIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgZGVwbG95bWVudHNcbiAgICAgICAgICBGUk9NIGNvcmVcbiAgICAgICAgKSxcbiAgICAgICAgY2ZyIEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpOjppbnQgQVMgdG90YWxcbiAgICAgICAgICBGUk9NIGNvcmVcbiAgICAgICAgKSxcbiAgICAgICAgbHQgQVMgKFxuICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgQ09VTlQoKik6OmludCBBUyBkZXBsb3ltZW50cyxcbiAgICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjUpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZHVyYXRpb25fbXMpOjpmbG9hdCBBUyBtZWRpYW5fbXNcbiAgICAgICAgICBGUk9NIGNvcmVcbiAgICAgICAgICBXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyBBTkQgZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgKSxcbiAgICAgICAgLS0gRm9yIGVhY2ggY29yZS13aW5kb3cgZmFpbHVyZSwgZmluZCB0aGUgRU5EIG9mIGl0cyByZWNvdmVyaW5nIHJ1bjogdGhlXG4gICAgICAgIC0tIG5leHQgU1VDQ0VFREVEIHJ1biBvZiB0aGUgc2FtZSBwaXBlbGluZSB0aGF0IEVOREVEIGFmdGVyIHRoaXMgZmFpbHVyZVxuICAgICAgICAtLSBlbmRlZCAodmlzaWJsZSBpbnRvIHRoZSBsb29rLWFoZWFkIHRhaWwpLiBTRUxFQ1QgYW5kIE1FQVNVUkUgYm90aCBrZXlcbiAgICAgICAgLS0gb2ZmIGVuZGVkX2F0IHNvIHRoZXkgc3RheSBjb25zaXN0ZW50IC0tIHRoZSBpbmNpZGVudCBnYXAgaXNcbiAgICAgICAgLS0gcmVzdG9yZWRfYXQgKHN1Y2Nlc3MgZW5kKSBtaW51cyBpbmNpZGVudF9zdGFydGVkIChmaXJzdCBmYWlsdXJlIGVuZCksXG4gICAgICAgIC0tIHNvIHBpY2tpbmcgdGhlIHJlY292ZXJ5IGJ5IGVuZGVkX2F0IChub3Qgc3RhcnRlZF9hdCkgcnVsZXMgb3V0IHRoZVxuICAgICAgICAtLSBuZWdhdGl2ZSBnYXAgdGhhdCBhIGNvbmN1cnJlbnQgc3VjY2VzcyB3aGljaCBTVEFSVEVEIGFmdGVyIHRoZSBmYWlsdXJlXG4gICAgICAgIC0tIGJ1dCBFTkRFRCBiZWZvcmUgaXQgd291bGQgb3RoZXJ3aXNlIGZvbGQgaW50byBBVkcuIE1lYXN1cmluZyBmcm9tIHRoZVxuICAgICAgICAtLSBmYWlsdXJlJ3MgRU5EIChub3Qgc3RhcnQpIGFsc28ga2VlcHMgdGhlIGZhaWxlZCBydW4ncyBvd24gZHVyYXRpb24gb3V0XG4gICAgICAgIC0tIG9mIHJlc3RvcmUgdGltZS4gT3JkZXJpbmcgYnkgZW5kZWRfYXQgbWFrZXMgdGhlIGluY2lkZW50IGNvbGxhcHNlIGZhbGxcbiAgICAgICAgLS0gb3V0IG5hdHVyYWxseTogYSBncmVlbiBydW4gZW5kaW5nIGJldHdlZW4gdHdvIGZhaWx1cmVzIHNwbGl0cyB0aGVtLlxuICAgICAgICByZXN0b3JlIEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIGYucGlwZWxpbmVfaWQsXG4gICAgICAgICAgICBmLmVuZGVkX2F0IEFTIGZhaWxfZW5kZWQsXG4gICAgICAgICAgICAoU0VMRUNUIHMuZW5kZWRfYXQgRlJPTSBleGVjcyBzXG4gICAgICAgICAgICAgIFdIRVJFIHMucGlwZWxpbmVfaWQgPSBmLnBpcGVsaW5lX2lkIEFORCBzLnN0YXR1cyA9ICdTVUNDRUVERUQnXG4gICAgICAgICAgICAgICAgQU5EIHMuZW5kZWRfYXQgPiBmLmVuZGVkX2F0XG4gICAgICAgICAgICAgIE9SREVSIEJZIHMuZW5kZWRfYXQgQVNDIExJTUlUIDEpIEFTIHJlc3RvcmVkX2F0XG4gICAgICAgICAgRlJPTSBjb3JlIGZcbiAgICAgICAgICBXSEVSRSBmLnN0YXR1cyA9ICdGQUlMRUQnXG4gICAgICAgICksXG4gICAgICAgIC0tIENvbGxhcHNlIHRvIElOQ0lERU5UUzogZmFpbHVyZXMgc2hhcmluZyB0aGUgc2FtZSByZWNvdmVyeSAoaS5lLiB3aXRoXG4gICAgICAgIC0tIG5vIGdyZWVuIHJ1biBiZXR3ZWVuIHRoZW0pIGFyZSBvbmUgaW5jaWRlbnQsIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdFxuICAgICAgICAtLSBmYWlsdXJlJ3MgZW5kLiBVbnJlY292ZXJlZCBmYWlsdXJlcyBzaGFyZSByZXN0b3JlZF9hdCA9IE5VTEwgYW5kIGZvcm1cbiAgICAgICAgLS0gdGhlIHNpbmdsZSB0cmFpbGluZyBvcGVuIGluY2lkZW50IHBlciBwaXBlbGluZS5cbiAgICAgICAgaW5jaWRlbnRzIEFTIChcbiAgICAgICAgICBTRUxFQ1QgcGlwZWxpbmVfaWQsIHJlc3RvcmVkX2F0LCBNSU4oZmFpbF9lbmRlZCkgQVMgaW5jaWRlbnRfc3RhcnRlZFxuICAgICAgICAgIEZST00gcmVzdG9yZVxuICAgICAgICAgIEdST1VQIEJZIHBpcGVsaW5lX2lkLCByZXN0b3JlZF9hdFxuICAgICAgICApLFxuICAgICAgICBtdHRyIEFTIChcbiAgICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgICAgICAtLSByZXN0b3JlZCBtdXN0IGVxdWFsIHRoZSBjb3VudCBvZiBpbmNpZGVudHMgdGhhdCBhY3R1YWxseVxuICAgICAgICAgICAgLS0gY29udHJpYnV0ZSB0byBhdmdfc2Vjb25kcy4gR3VhcmQgb24gaW5jaWRlbnRfc3RhcnRlZCB0b286IGFcbiAgICAgICAgICAgIC0tIGZhaWx1cmUgd2l0aCBhIE5VTEwgY29tcGxldGVkX2F0IHlpZWxkcyBhIE5VTEwgaW5jaWRlbnRfc3RhcnRlZFxuICAgICAgICAgICAgLS0gdGhhdCBjb250cmlidXRlcyBOVUxMIChub3QgYSByZWFsIGdhcCkgdG8gQVZHLCBzbyBpdCBtdXN0IG5vdCBiZVxuICAgICAgICAgICAgLS0gY291bnRlZCBhcyByZXN0b3JlZCBlaXRoZXIgLS0gb3RoZXJ3aXNlIHJlc3RvcmVkIGNvdWxkIGV4Y2VlZFxuICAgICAgICAgICAgLS0gdGhlIG51bWJlciBvZiBtZWFzdXJlZCBpbmNpZGVudHMuXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFxuICAgICAgICAgICAgICBXSEVSRSByZXN0b3JlZF9hdCBJUyBOT1QgTlVMTCBBTkQgaW5jaWRlbnRfc3RhcnRlZCBJUyBOT1QgTlVMTFxuICAgICAgICAgICAgKTo6aW50IEFTIHJlc3RvcmVkLFxuICAgICAgICAgICAgQVZHKEVYVFJBQ1QoRVBPQ0ggRlJPTSAocmVzdG9yZWRfYXQgLSBpbmNpZGVudF9zdGFydGVkKSkpXG4gICAgICAgICAgICAgIEZJTFRFUiAoV0hFUkUgcmVzdG9yZWRfYXQgSVMgTk9UIE5VTEwgQU5EIGluY2lkZW50X3N0YXJ0ZWQgSVMgTk9UIE5VTEwpOjpmbG9hdCBBUyBhdmdfc2Vjb25kc1xuICAgICAgICAgIEZST00gaW5jaWRlbnRzXG4gICAgICAgIClcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZGYuZGVwbG95bWVudHMgQVMgZGZfZGVwbG95bWVudHMsXG4gICAgICAgICAgY2ZyLmZhaWxlZCBBUyBjZnJfZmFpbGVkLFxuICAgICAgICAgIGNmci50b3RhbCBBUyBjZnJfdG90YWwsXG4gICAgICAgICAgbHQuZGVwbG95bWVudHMgQVMgbHRfZGVwbG95bWVudHMsXG4gICAgICAgICAgbHQubWVkaWFuX21zIEFTIGx0X21lZGlhbl9tcyxcbiAgICAgICAgICBtdHRyLmZhaWx1cmVzIEFTIG10dHJfZmFpbHVyZXMsXG4gICAgICAgICAgbXR0ci5yZXN0b3JlZCBBUyBtdHRyX3Jlc3RvcmVkLFxuICAgICAgICAgIG10dHIuYXZnX3NlY29uZHMgQVMgbXR0cl9hdmdfc2Vjb25kc1xuICAgICAgICBGUk9NIGRmLCBjZnIsIGx0LCBtdHRyXG4gICAgICBgKS50aGVuKHIgPT4gdGhpcy5zaGFwZURvcmEoZHJpenpsZVJvd3M8RG9yYVJvdz4oci5yb3dzKVswXSwgZnJvbSwgdG8sIGJhc2lzLCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50IH0pKSk7XG4gICAgLy8gYGVudmlyb25tZW50YCBXSU5TIG92ZXIgYGRlcGxveXNPbmx5YCBpbiBkb3JhU2NvcGVDbGF1c2VzLCBzbyB3aXRoIGFuXG4gICAgLy8gZW52aXJvbm1lbnQgc2V0IHRoZSBkZXBsb3lzT25seSBmbGFnIG5ldmVyIGFmZmVjdHMgdGhlIFNRTCDigJQgYXBwZW5kIHRoZVxuICAgIC8vICdkJyBtYXJrZXIgb25seSB3aGVuIGl0IGdlbnVpbmVseSBjaGFuZ2VzIHRoZSBxdWVyeSAoZW52aXJvbm1lbnQgYWJzZW50KSxcbiAgICAvLyBvdGhlcndpc2UgYHtlbnZpcm9ubWVudDoncHJvZCcsIGRlcGxveXNPbmx5OnRydWV9YCB3b3VsZCBtaW50IGEgcmVkdW5kYW50XG4gICAgLy8gY2FjaGUgZW50cnkgaWRlbnRpY2FsIHRvIGB7ZW52aXJvbm1lbnQ6J3Byb2QnfWAuXG4gICAgY29uc3QgZGVwbG95TWFya2VyID0gIWVudmlyb25tZW50ICYmIGRlcGxveXNPbmx5ID8gJ2QnIDogJyc7XG4gICAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmE6JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZGVwbG95TWFya2VyfWA7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGtleSwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIFNoYXBlIGEgc2luZ2xlIERPUkEgYWdncmVnYXRlIHJvdyBpbnRvIHRoZSBwdWJsaWMge0BsaW5rIERvcmFNZXRyaWNzfS4gKi9cbiAgcHJpdmF0ZSBzaGFwZURvcmEoXG4gICAgcm93OiBEb3JhUm93IHwgdW5kZWZpbmVkLFxuICAgIGZyb206IHN0cmluZyxcbiAgICB0bzogc3RyaW5nLFxuICAgIGJhc2lzOiBEb3JhTWV0cmljc1snYmFzaXMnXSxcbiAgICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ/OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gICk6IERvcmFNZXRyaWNzIHtcbiAgICAvLyBgRlJPTSBkZiwgY2ZyLCBsdCwgbXR0cmAgYWx3YXlzIHlpZWxkcyBleGFjdGx5IG9uZSByb3cgKGVhY2ggQ1RFIGlzIGFcbiAgICAvLyBzaW5nbGUtcm93IGFnZ3JlZ2F0ZSksIGJ1dCBndWFyZCBhZ2FpbnN0IGFuIGVtcHR5IHJlc3VsdCBkZWZlbnNpdmVseS5cbiAgICBjb25zdCByOiBEb3JhUm93ID0gcm93ID8/IHt9O1xuXG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBOdW1iZXIoci5kZl9kZXBsb3ltZW50cykgfHwgMDtcbiAgICAvLyBGbG9vciB0aGUgZGl2aXNvciBhdCBvbmUgZGF5OiBhIHdpbmRvdyBzaG9ydGVyIHRoYW4gYSBkYXkgKGluY2wuIHRoZVxuICAgIC8vIGRlZ2VuZXJhdGUgZnJvbT09dG8pIGhhcyBubyBtZWFuaW5nZnVsIHN1Yi1kYXkgcmF0ZSwgc28gaXQncyB0cmVhdGVkIGFzIGFcbiAgICAvLyBzaW5nbGUgZGF5IHJhdGhlciB0aGFuIGV4dHJhcG9sYXRlZCBvciBtaXNsYWJlbGVkIGFzIGEgcmF3IGNvdW50LlxuICAgIC8vIEZsb29yIGF0IG9uZSBkYXkgYW5kIGd1YXJkIGFnYWluc3QgdW5wYXJzZWFibGUgZGF0ZXMgKERhdGUucGFyc2Ug4oaSIE5hTixcbiAgICAvLyB3aGljaCB3b3VsZCBvdGhlcndpc2UgcHJvcGFnYXRlIHRocm91Z2ggcGVyRGF5KS4gRmFsbHMgYmFjayB0byBhIDEtZGF5XG4gICAgLy8gd2luZG93IHNvIGEgYmFkIHJhbmdlIHlpZWxkcyB0aGUgcmF3IGNvdW50IGFzIHRoZSByYXRlLCBuZXZlciBOYU4uXG4gICAgY29uc3Qgc3BhbkRheXMgPSAoRGF0ZS5wYXJzZSh0bykgLSBEYXRlLnBhcnNlKGZyb20pKSAvIDg2NDAwMDAwO1xuICAgIGNvbnN0IGRheXMgPSBOdW1iZXIuaXNGaW5pdGUoc3BhbkRheXMpID8gTWF0aC5tYXgoc3BhbkRheXMsIDEpIDogMTtcbiAgICAvLyBCYW5kIG9uIHRoZSBVTlJPVU5ERUQgcmF0ZTsgcm91bmQgb25seSBmb3IgZGlzcGxheS4gUm91bmRpbmcgZmlyc3Qgd291bGRcbiAgICAvLyBtaXNsYWJlbCBleGFjdCB3ZWVrbHkvbW9udGhseSBib3VuZGFyaWVzIChlLmcuIDEgZGVwbG95IC8gMzAgZGF5cyDihpJcbiAgICAvLyAwLjAzMzMgcm91bmRzIHRvIDAuMDMgPCAxLzMwIOKGkiB3cm9uZ2x5IFwibG93XCIgaW5zdGVhZCBvZiBcIm1lZGl1bVwiKS5cbiAgICBjb25zdCByYXdQZXJEYXkgPSBkZXBsb3ltZW50cyAvIGRheXM7XG4gICAgY29uc3QgcGVyRGF5ID0gcm91bmQocmF3UGVyRGF5LCAyKTtcblxuICAgIGNvbnN0IGZhaWxlZCA9IE51bWJlcihyLmNmcl9mYWlsZWQpIHx8IDA7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIoci5jZnJfdG90YWwpIHx8IDA7XG4gICAgY29uc3QgcmF3UGN0ID0gdG90YWwgPiAwID8gKGZhaWxlZCAvIHRvdGFsKSAqIDEwMCA6IDA7XG4gICAgY29uc3QgcGN0ID0gcm91bmQocmF3UGN0LCAxKTtcblxuICAgIC8vIEJhbmQgcmVzdG9yZS9sZWFkLXRpbWUgb24gdGhlIFJBVyAocHJlLXJvdW5kKSBzZWNvbmRzLCB0aGUgc2FtZSBcImJhbmQgb25cbiAgICAvLyB0aGUgdW5yb3VuZGVkIHZhbHVlXCIgcHJpbmNpcGxlIHVzZWQgZm9yIHBlckRheS9wY3QgYWJvdmU7IGtlZXAgdGhlIHJvdW5kZWRcbiAgICAvLyB2YWx1ZXMgZm9yIHRoZSByZXNwb25zZSBmaWVsZHMuIEltbWF0ZXJpYWwgYXQgdGhlIGhvdXIvZGF5IHRocmVzaG9sZHMsIGJ1dFxuICAgIC8vIGl0IG1ha2VzIHRoZSBwcmluY2lwbGUgdW5pZm9ybSBhY3Jvc3MgYWxsIGZvdXIgbWV0cmljcy5cbiAgICBjb25zdCBmYWlsdXJlcyA9IE51bWJlcihyLm10dHJfZmFpbHVyZXMpIHx8IDA7XG4gICAgY29uc3QgcmVzdG9yZWQgPSBOdW1iZXIoci5tdHRyX3Jlc3RvcmVkKSB8fCAwO1xuICAgIGNvbnN0IHJhd0F2Z1NlY29uZHMgPSBmYWlsdXJlcyA+IDAgJiYgci5tdHRyX2F2Z19zZWNvbmRzICE9IG51bGxcbiAgICAgID8gTnVtYmVyKHIubXR0cl9hdmdfc2Vjb25kcylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBhdmdTZWNvbmRzID0gcmF3QXZnU2Vjb25kcyAhPSBudWxsID8gcm91bmQocmF3QXZnU2Vjb25kcywgMSkgOiBudWxsO1xuXG4gICAgY29uc3QgbHREZXBsb3ltZW50cyA9IE51bWJlcihyLmx0X2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIGNvbnN0IHJhd01lZGlhblNlY29uZHMgPSByLmx0X21lZGlhbl9tcyAhPSBudWxsXG4gICAgICA/IE51bWJlcihyLmx0X21lZGlhbl9tcykgLyAxMDAwXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgbWVkaWFuU2Vjb25kcyA9IHJhd01lZGlhblNlY29uZHMgIT0gbnVsbCA/IHJvdW5kKHJhd01lZGlhblNlY29uZHMsIDEpIDogbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICB3aW5kb3c6IHsgZnJvbSwgdG8gfSxcbiAgICAgIGJhc2lzLFxuICAgICAgZmlsdGVyczogeyBwaXBlbGluZUlkOiBmaWx0ZXJzLnBpcGVsaW5lSWQgPz8gbnVsbCwgZW52aXJvbm1lbnQ6IGZpbHRlcnMuZW52aXJvbm1lbnQgPz8gbnVsbCB9LFxuICAgICAgZGVwbG95bWVudEZyZXF1ZW5jeTogeyBkZXBsb3ltZW50cywgcGVyRGF5LCBsZXZlbDogZG9yYUxldmVsRm9yRnJlcXVlbmN5KHJhd1BlckRheSwgZGVwbG95bWVudHMpIH0sXG4gICAgICBjaGFuZ2VGYWlsdXJlUmF0ZTogeyBmYWlsZWQsIHRvdGFsLCBwY3QsIGxldmVsOiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHJhd1BjdCwgdG90YWwpIH0sXG4gICAgICBtZWFuVGltZVRvUmVzdG9yZTogeyBmYWlsdXJlcywgcmVzdG9yZWQsIGF2Z1NlY29uZHMsIGxldmVsOiBkb3JhTGV2ZWxGb3JSZXN0b3JlKHJhd0F2Z1NlY29uZHMpIH0sXG4gICAgICBsZWFkVGltZTogeyBkZXBsb3ltZW50czogbHREZXBsb3ltZW50cywgbWVkaWFuU2Vjb25kcywgYXBwcm94OiB0cnVlLCBsZXZlbDogZG9yYUxldmVsRm9yTGVhZFRpbWUocmF3TWVkaWFuU2Vjb25kcykgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIDEuOWIgRE9SQSB0cmVuZCDigJQgZGVwbG95bWVudCBmcmVxdWVuY3kgKyBjaGFuZ2UtZmFpbHVyZSByYXRlIGJ1Y2tldGVkIGJ5XG4gICAqIGBpbnRlcnZhbGAgKGRheS93ZWVrL21vbnRoKSBmb3IgYSBzcGFya2xpbmUuIFBlci1leGVjdXRpb24gcm9sbHVwIChvbmUgcm93XG4gICAqIHBlciBleGVjdXRpb24sIEZBSUxFRCB3aW5zKSBidWNrZXRlZCBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdC4gU2hhcmVzXG4gICAqIHRoZSBgZ2V0RG9yYU1ldHJpY3NgIHNjb3BpbmcgKG9yZy9yb2xsdXAsIHBpcGVsaW5lSWQsIGRlcGxveS1zY29waW5nKTsgTVRUUlxuICAgKiBhbmQgbGVhZCB0aW1lIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQgKHRvbyBoZWF2eSB0byBidWNrZXQgbWVhbmluZ2Z1bGx5KS5cbiAgICovXG4gIGFzeW5jIGdldERvcmFUcmVuZChcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIGludGVydmFsOiBzdHJpbmcsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgb3JnSWRzPzogc3RyaW5nW10sXG4gICAgb3B0czogRG9yYU9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxEb3JhVHJlbmRQb2ludFtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50LCBkZXBsb3lzT25seSB9ID0gb3B0cztcbiAgICBjb25zdCB7IHBpcGVsaW5lQ2xhdXNlLCBkZXBsb3lDbGF1c2UgfSA9IGRvcmFTY29wZUNsYXVzZXMob3B0cyk7XG4gICAgLy8gU2FtZSBleGVjcyByb2xsLXVwIGFzIGdldERvcmFNZXRyaWNzIChzaGFyZWQgYnVpbGRlciDigJQgc3RhdHVzIHNldCArXG4gICAgLy8gcHJlZGljYXRlIGNhbid0IGRyaWZ0KTsgdGhlIHRyZW5kIG5lZWRzIG9ubHkgc3RhcnRlZF9hdCBvdmVyIHRoZSBjb3JlXG4gICAgLy8gd2luZG93IChubyBNVFRSIGxvb2stYWhlYWQsIG5vIGVuZGVkX2F0L2R1cmF0aW9uIGNvbHVtbnMpLlxuICAgIGNvbnN0IGV4ZWNzID0gZXhlY3NDdGUoe1xuICAgICAgcHJlZCxcbiAgICAgIHBpcGVsaW5lQ2xhdXNlLFxuICAgICAgZGVwbG95Q2xhdXNlLFxuICAgICAgZnJvbSxcbiAgICAgIGNvbHVtbnM6IHNxbGBcbiAgICAgICAgICAgICR7RE9SQV9URVJNSU5BTF9TVEFUVVNfQ0FTRX0gQVMgc3RhdHVzLFxuICAgICAgICAgICAgTUlOKGUuc3RhcnRlZF9hdCkgQVMgc3RhcnRlZF9hdGAsXG4gICAgICB0b0JvdW5kOiBzcWxgJHt0b306OnRpbWVzdGFtcHR6YCxcbiAgICB9KTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFdJVEggZXhlY3MgQVMgKCR7ZXhlY3N9XG4gICAgICAgIClcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgc3RhcnRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgZGVwbG95bWVudHMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgLS0gcXVvdGVkIGFsaWFzIHNvIHRoZSByYXcgcm93IGtleSBpcyBleGFjdGx5IHRoZSBEb3JhVHJlbmRQb2ludCBmaWVsZFxuICAgICAgICAgIENPQUxFU0NFKFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSksIDApICogMTAwLCAxKSwgMCk6OmZsb2F0IEFTIFwiY2hhbmdlRmFpbHVyZVBjdFwiXG4gICAgICAgIEZST00gZXhlY3NcbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPERvcmFUcmVuZFBvaW50PihyLnJvd3MpKSk7XG4gICAgLy8gT21pdCB0aGUgZGVwbG95c09ubHkgbWFya2VyIHdoZW4gZW52aXJvbm1lbnQgaXMgc2V0OiBpdCB3aW5zIGluXG4gICAgLy8gZG9yYVNjb3BlQ2xhdXNlcywgc28gdGhlIFNRTCAoYW5kIHRodXMgdGhlIGNvcnJlY3QgY2FjaGUga2V5KSBpcyBpZGVudGljYWxcbiAgICAvLyB0byB0aGUgZW52aXJvbm1lbnQtb25seSBjYXNlLiBPbmx5IGFwcGVuZCAnZCcgd2hlbiBpdCBjaGFuZ2VzIHRoZSBxdWVyeS5cbiAgICBjb25zdCBkZXBsb3lNYXJrZXIgPSAhZW52aXJvbm1lbnQgJiYgZGVwbG95c09ubHkgPyAnZCcgOiAnJztcbiAgICBjb25zdCBrZXkgPSBgJHtvcmdJZH06ZG9yYS10cmVuZDoke2ludGVydmFsfToke2Zyb219OiR7dG99OiR7cGlwZWxpbmVJZCA/PyAnJ306JHtlbnZpcm9ubWVudCA/PyAnJ306JHtkZXBsb3lNYXJrZXJ9YDtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMjogUGx1Z2luIEludmVudG9yeSAmIEJ1aWxkcyDilIDilIBcblxuICAvKiogMi4xIFBsdWdpbiBzdW1tYXJ5IOKAlCBjb3VudHMgYW5kIGJyZWFrZG93bnMuXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgYW4gb3JnLW93bmVkXG4gICAqICBhc3NldCBjb3VudCwgbm90IGFuIGV4ZWN1dGlvbi9idWlsZCBhY3Rpdml0eSByZXBvcnQsIHNvIGEgcGFyZW50J3MgdmlldyBpc1xuICAgKiAgaXRzIG93biBwbHVnaW5zIOKAlCB0ZWFtcyBtYW5hZ2UgdGhlaXIgb3duIGludmVudG9yeS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5TdW1tYXJ5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFBsdWdpblN1bW1hcnk+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1zdW1tYXJ5YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBhY3RpdmUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBOT1QgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSk6OmludCBBUyBpbmFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHVibGljJyk6OmludCBBUyBwdWJsaWMsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uYWNjZXNzTW9kaWZpZXJ9ID0gJ3ByaXZhdGUnKTo6aW50IEFTIHByaXZhdGUsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgJHtzY2hlbWEucGx1Z2luLm5hbWV9KTo6aW50IEFTIHVuaXF1ZV9uYW1lc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBsdWdpbn1cbiAgICAgICAgV0hFUkUgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSA9ICR7b3JnSWR9XG4gICAgICBgKSk7XG4gICAgICByZXR1cm4gKGRyaXp6bGVSb3dzPFBsdWdpblN1bW1hcnk+KHJvd3Mucm93cylbMF0gfHwgeyB0b3RhbDogMCwgYWN0aXZlOiAwLCBpbmFjdGl2ZTogMCwgcHVibGljOiAwLCBwcml2YXRlOiAwLCB1bmlxdWVOYW1lczogMCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAyLjIgVHlwZSAmIGNvbXB1dGUgZGlzdHJpYnV0aW9uLlxuICAgKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIHBlci1vcmcgKHNlZVxuICAgKiAgZ2V0UGx1Z2luU3VtbWFyeSkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiAgYXN5bmMgZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFR5cGVDb21wdXRlRGlzdHJpYnV0aW9uW10+IHtcbiAgICByZXR1cm4gaW52ZW50b3J5Q2FjaGUuZ2V0T3JTZXQoYCR7b3JnSWR9OnBsdWdpbi1kaXN0cmlidXRpb25gLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSBBUyBwbHVnaW5fdHlwZSxcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9IEFTIGNvbXB1dGVfdHlwZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGNvdW50XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5wbHVnaW5UeXBlfSwgJHtzY2hlbWEucGx1Z2luLmNvbXB1dGVUeXBlfVxuICAgICAgICBPUkRFUiBCWSBjb3VudCBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VHlwZUNvbXB1dGVEaXN0cmlidXRpb24+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIDIuMyBWZXJzaW9uIGNvdW50cyBwZXIgcGx1Z2luIG5hbWUuXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgcGVyLW9yZyAoc2VlXG4gICAqICBnZXRQbHVnaW5TdW1tYXJ5KS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5WZXJzaW9ucyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxWZXJzaW9uQ291bnRbXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXZlcnNpb25zYCwgKCkgPT5cbiAgICAgIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICAke3NjaGVtYS5wbHVnaW4ubmFtZX0sXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyB2ZXJzaW9uX2NvdW50LFxuICAgICAgICAgIE1BWCgke3NjaGVtYS5wbHVnaW4udmVyc2lvbn0pIEFTIGxhdGVzdF92ZXJzaW9uLFxuICAgICAgICAgIGJvb2xfb3IoJHtzY2hlbWEucGx1Z2luLmlzRGVmYXVsdH0pIEFTIGhhc19kZWZhdWx0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH0gQU5EICR7c2NoZW1hLnBsdWdpbi5pc0FjdGl2ZX0gPSB0cnVlXG4gICAgICAgIEdST1VQIEJZICR7c2NoZW1hLnBsdWdpbi5uYW1lfVxuICAgICAgICBPUkRFUiBCWSB2ZXJzaW9uX2NvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxWZXJzaW9uQ291bnQ+KHIucm93cykpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIDIuNCBCdWlsZCBzdWNjZXNzIHJhdGUgb3ZlciB0aW1lLlxuICAgKlxuICAgKiBTVEFUVVMgQ0FTSU5HIE5PVEU6IFRoaXMgcXVlcnkgZmlsdGVycyBieSBgZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCdgXG4gICAqIGFuZCB1c2VzIGxvd2VyY2FzZSBzdGF0dXMgdmFsdWVzIChgJ2NvbXBsZXRlZCdgLCBgJ2ZhaWxlZCdgKSwgd2hpbGVcbiAgICogYGdldFN1Y2Nlc3NSYXRlYCAoMS4yKSBmaWx0ZXJzIGJ5IGBldmVudF90eXBlID0gJ1BJUEVMSU5FJ2Agd2l0aFxuICAgKiB1cHBlcmNhc2UgQVdTLXN0eWxlIHN0YXR1c2VzIChgJ1NVQ0NFRURFRCdgLCBgJ0ZBSUxFRCdgLCBgJ0NBTkNFTEVEJ2ApLlxuICAgKiBUaGUgY2FzaW5nIGRyaWZ0IGlzIGludGVudGlvbmFsIGFuZCB0cmFja3MgdGhlIHByb2R1Y2VyOlxuICAgKiAgIC0gYHBsdWdpbi1idWlsZGAgZXZlbnRzIGNvbWUgZnJvbSBvdXIgb3duIGJ1aWxkIHBpcGVsaW5lIChsb3dlcmNhc2UpXG4gICAqICAgLSBgUElQRUxJTkVgIGV2ZW50cyBjb21lIGZyb20gQVdTIENvZGVQaXBlbGluZSAodXBwZXJjYXNlKVxuICAgKiBUaGUgaW5nZXN0IFpvZCBzY2hlbWEgYXQgYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50c1xuICAgKiBTSE9VTEQgZW51bSB0aGVzZSBwZXItZXZlbnRTb3VyY2Ugc28gd2UgY2F0Y2ggZHJpZnQgYXQgaW5nZXN0IHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IHByb2R1Y2luZyB6ZXJvIHJvd3MgaGVyZS4gU2VlIGZpbmRpbmdzIE43MS5cbiAgICovXG4gIGFzeW5jIGdldEJ1aWxkU3VjY2Vzc1JhdGUob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGRUaW1lU2VyaWVzRW50cnlbXT4ge1xuICAgIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgICAvLyBCdWlsZCBhY3Rpdml0eSByZXBvcnQg4oCUIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBleGVjdXRpb24gcmVwb3J0cy4gVGhlc2VcbiAgICAvLyByb3dzIGFyZSBnYXRlZCBvbiB0aGUgcGlwZWxpbmVfZXZlbnQgYG9yZ19pZGAgZGlyZWN0bHkgKG5vIHBpcGVsaW5lIGpvaW4pLFxuICAgIC8vIHNvIGBwcmVkYCBhcHBsaWVzIHRvIGBlLm9yZ19pZGAuXG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdmYWlsZWQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBST1VORChDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2NvbXBsZXRlZCcpOjpudW1lcmljXG4gICAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpOjpmbG9hdCBBUyBzdWNjZXNzX3BjdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgV0hFUkUgZS5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJ1xuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ2NvbXBsZXRlZCcsICdmYWlsZWQnKVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkVGltZVNlcmllc0VudHJ5PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpidWlsZC1zdWNjZXNzOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMi41IEJ1aWxkIGR1cmF0aW9uIHBlciBwbHVnaW4uIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlLiAqL1xuICBhc3luYyBnZXRCdWlsZER1cmF0aW9uKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEJ1aWxkRHVyYXRpb25bXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgYnVpbGRzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRHVyYXRpb24+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMi42IEJ1aWxkIGZhaWx1cmVzIOKAlCB0b3AgZXJyb3IgbWVzc2FnZXMuIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlLiAqL1xuICBhc3luYyBnZXRCdWlsZEZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgbGltaXQ6IG51bWJlciA9IDIwLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGRGYWlsdXJlW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5kZXRhaWwtPj4ncGx1Z2luTmFtZScgQVMgcGx1Z2luX25hbWUsXG4gICAgICAgICAgZS5lcnJvcl9tZXNzYWdlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnIEFORCBlLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwbHVnaW5fbmFtZSwgZS5lcnJvcl9tZXNzYWdlXG4gICAgICAgIE9SREVSIEJZIG9jY3VycmVuY2VzIERFU0NcbiAgICAgICAgTElNSVQgJHtsaW1pdH1cbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxCdWlsZEZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWZhaWx1cmVzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydGluZ1NlcnZpY2UgPSBuZXcgUmVwb3J0aW5nU2VydmljZSgpO1xuIl19
884
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcG9ydGluZy1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsSyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUVqRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQjtJQUM1QyxJQUFJLENBQUUsZ0JBQXNDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsUUFBUSxzQkFBc0IsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEgsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENB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QUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLG1CQUFtQixJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxxRkFBcUY7SUFDckYsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsRUFBVSxFQUFFLFFBQWdCLEVBQUUsRUFBRSxNQUFpQjtRQUNuRyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7Ozs7OztlQU0zQyxNQUFNLENBQUMsYUFBYTt5QkFDVixJQUFJO2dDQUNHLElBQUkscUNBQXFDLEVBQUU7OztnQkFHM0QsS0FBSztPQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLG1CQUFtQixJQUFJLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlQ2FjaGVTZXJ2aWNlLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgUkVQT1JUX0lOVEVSVkFMUywgc2NydWJBd3NJZGVudGlmaWVycywgc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBpbkFycmF5LCBzcWwsIHR5cGUgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgZHJpenpsZVJvd3MgfSBmcm9tICcuL2NydWQtc2VydmljZS5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHgsIHJ1bldpdGhUZW5hbnRDb250ZXh0IH0gZnJvbSAnLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVwb3J0aW5nLXNlcnZpY2UnKTtcblxuLyoqXG4gKiBEZWZlbnNlLWluLWRlcHRoIGd1YXJkIGZvciB0aGUgYERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIOKApilgIGJ1Y2tldCBhcmd1bWVudC5cbiAqIFRoZSByb3V0ZSBsYXllciAoYHBhcnNlUmVwb3J0SW50ZXJ2YWxgKSBpcyB0aGUgc2VjdXJpdHkgYm91bmRhcnkgYW5kIGFscmVhZHlcbiAqIHJlamVjdHMgdW5rbm93biBpbnRlcnZhbHM7IHRoaXMgYXNzZXJ0IG1ha2VzIGFuIGludmFsaWQgdmFsdWUgZmFpbCBmYXN0IGF0IHRoZVxuICogc2VydmljZSBib3VuZGFyeSB3aXRoIGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiBzdXJmYWNpbmcgYSByYXcgUG9zdGdyZXMgZXJyb3JcbiAqIGlmIGEgY2FsbGVyIGV2ZXIgYnlwYXNzZXMgdGhlIHJvdXRlIHZhbGlkYXRpb24uIFNoYXJlcyBhcGktY29yZSdzXG4gKiBSRVBPUlRfSU5URVJWQUxTIGFsbG93LWxpc3Qgc28gdGhlIHR3byBjYW4ndCBkcmlmdC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWw6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIShSRVBPUlRfSU5URVJWQUxTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhpbnRlcnZhbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVwb3J0IGludGVydmFsOiAke2ludGVydmFsfS4gRXhwZWN0ZWQgb25lIG9mOiAke1JFUE9SVF9JTlRFUlZBTFMuam9pbignLCAnKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIENhY2hlIGZvciByZXBvcnRpbmcgYWdncmVnYXRpb25zLiBUd28gdGllcnM6XG4gKiAtIEludmVudG9yeSBxdWVyaWVzIChwbHVnaW4gc3VtbWFyeS9kaXN0cmlidXRpb24vdmVyc2lvbnMpOiA1IG1pbiBUVEwg4oCUIGNoYW5nZXMgb24gcGx1Z2luIENSVURcbiAqIC0gRXhlY3V0aW9uL2J1aWxkIHF1ZXJpZXMgd2l0aCBkYXRlIHJhbmdlczogMiBtaW4gVFRMIOKAlCBuZXcgZXZlbnRzIGFycml2ZSBjb250aW51b3VzbHlcbiAqL1xuY29uc3QgaW52ZW50b3J5Q2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDppbnY6JywgcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlkgfHwgJzMwMCcsIDEwKSk7XG5jb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBwYXJzZUludChwcm9jZXNzLmVudi5DQUNIRV9UVExfUkVQT1JUX1RJTUVTRVJJRVMgfHwgJzEyMCcsIDEwKSk7XG5cbi8vIOKUgOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEV4ZWN1dGlvbkNvdW50IHtcbiAgaWQ6IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0b3RhbDogbnVtYmVyO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIGNhbmNlbGVkOiBudW1iZXI7XG4gIGZpcnN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xuICBsYXN0RXhlY3V0aW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgVGltZVNlcmllc0VudHJ5IHtcbiAgcGVyaW9kOiBzdHJpbmc7XG4gIHN1Y2NlZWRlZDogbnVtYmVyO1xuICBmYWlsZWQ6IG51bWJlcjtcbiAgY2FuY2VsZWQ6IG51bWJlcjtcbiAgc3VjY2Vzc1BjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRHVyYXRpb25TdGF0cyB7XG4gIGlkOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBhdmdNczogbnVtYmVyO1xuICBtaW5NczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xuICBwOTVNczogbnVtYmVyO1xuICBleGVjdXRpb25zOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBQaXBlbGluZUV4ZWN1dGlvbiB7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIC8qKiBSb2xsZWQtdXAgdGVybWluYWwgc3RhdHVzOiBzdWNjZWVkZWQgfCBmYWlsZWQgfCBjYW5jZWxlZCB8IGluLXByb2dyZXNzLiAqL1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBlbmRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICBkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsO1xuICAvKiogRmlyc3QgZmFpbGluZyBzdGFnZS9hY3Rpb24gZm9yIHRoZSBleGVjdXRpb24gKG51bGwgd2hlbiBpdCBkaWRuJ3QgZmFpbCkuICovXG4gIGZhaWxpbmdTdGFnZTogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbGluZ0FjdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIFN0YWdlRmFpbHVyZSB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBmYWlsdXJlczogbnVtYmVyO1xuICB0b3RhbDogbnVtYmVyO1xuICBmYWlsdXJlUGN0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTdGFnZUJvdHRsZW5lY2sge1xuICBpZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBhdmdNczogbnVtYmVyO1xuICBtYXhNczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQWN0aW9uRmFpbHVyZSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgZmFpbHVyZXM6IG51bWJlcjtcbiAgdG90YWw6IG51bWJlcjtcbiAgZmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRXJyb3JFbnRyeSB7XG4gIGVycm9yUGF0dGVybjogc3RyaW5nO1xuICBvY2N1cnJlbmNlczogbnVtYmVyO1xuICBhZmZlY3RlZFBpcGVsaW5lczogbnVtYmVyO1xuICBsYXN0U2Vlbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU3VtbWFyeSB7XG4gIHRvdGFsOiBudW1iZXI7XG4gIGFjdGl2ZTogbnVtYmVyO1xuICBpbmFjdGl2ZTogbnVtYmVyO1xuICBwdWJsaWM6IG51bWJlcjtcbiAgcHJpdmF0ZTogbnVtYmVyO1xuICB1bmlxdWVOYW1lczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHlwZUNvbXB1dGVEaXN0cmlidXRpb24ge1xuICBwbHVnaW5UeXBlOiBzdHJpbmc7XG4gIGNvbXB1dGVUeXBlOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBWZXJzaW9uQ291bnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb25Db3VudDogbnVtYmVyO1xuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7XG4gIGhhc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBCdWlsZFRpbWVTZXJpZXNFbnRyeSB7XG4gIHBlcmlvZDogc3RyaW5nO1xuICBzdWNjZWVkZWQ6IG51bWJlcjtcbiAgZmFpbGVkOiBudW1iZXI7XG4gIHN1Y2Nlc3NQY3Q6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkRHVyYXRpb24ge1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGF2Z01zOiBudW1iZXI7XG4gIG1heE1zOiBudW1iZXI7XG4gIGJ1aWxkczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRGYWlsdXJlIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgb2NjdXJyZW5jZXM6IG51bWJlcjtcbiAgbGFzdFNlZW46IHN0cmluZztcbn1cblxuLyoqIFJhdyBzaW5nbGUtcm93IHNoYXBlIHJldHVybmVkIGJ5IHRoZSBET1JBIGFnZ3JlZ2F0ZSBxdWVyeSAocHJlLXNoYXBpbmcpLiAqL1xuLyoqXG4gKiBIb3cgZmFyIHBhc3QgdGhlIHJlcG9ydCdzIGB0b2AgYm91bmQgdGhlIERPUkEgTVRUUiBxdWVyeSBtYXkgbG9vayBmb3IgYVxuICogZmFpbHVyZSdzIHJlY292ZXJpbmcgcnVuLiBCb3VuZHMgdGhlIHNjYW4gd2hpbGUgc3RvcHBpbmcgYSBmYWlsdXJlIG5lYXIgdGhlXG4gKiB3aW5kb3cgZWRnZSBmcm9tIGJlaW5nIHNwdXJpb3VzbHkgc2NvcmVkIFwibmV2ZXIgcmVzdG9yZWRcIi4gQSBmYWlsdXJlIHRoYXRcbiAqIGhhcyBub3QgcmVjb3ZlcmVkIHdpdGhpbiB0aGlzIHdpbmRvdyBzdGF5cyBjb3VudGVkIGFzIGFuIG9wZW4gaW5jaWRlbnQuXG4gKi9cbmNvbnN0IE1UVFJfUkVTVE9SRV9MT09LQUhFQUQgPSAnMzAgZGF5cyc7XG5cbi8qKlxuICogRE9SQSBwZXJmb3JtYW5jZSBiYW5kLiBgbnVsbGAgPSBpbnN1ZmZpY2llbnQgZGF0YSB0byBjbGFzc2lmeSAobm9cbiAqIGRlcGxveW1lbnRzL2ZhaWx1cmVzL2xlYWQtdGltZSBzYW1wbGUgaW4gdGhlIHdpbmRvdyksIHNvIHRoZSBVSSBzaG93cyBhXG4gKiBuZXV0cmFsIHN0YXRlIHJhdGhlciB0aGFuIG1pc2xhYmVsaW5nIGFuIGVtcHR5IHdpbmRvdyBhcyBcImxvd1wiLlxuICovXG5leHBvcnQgdHlwZSBEb3JhTGV2ZWwgPSAnZWxpdGUnIHwgJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8IG51bGw7XG5cbi8qKiBPcHRpb25hbCBzY29waW5nIGZvciB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5nZXREb3JhTWV0cmljc30uICovXG5leHBvcnQgaW50ZXJmYWNlIERvcmFPcHRpb25zIHtcbiAgLyoqIFJlc3RyaWN0IHRvIGEgc2luZ2xlIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSkuICovXG4gIHBpcGVsaW5lSWQ/OiBzdHJpbmc7XG4gIC8qKiBDb3VudCBvbmx5IGV4ZWN1dGlvbnMgZGVwbG95ZWQgdG8gdGhpcyBlbnZpcm9ubWVudCAoZGVwbG95LXNjb3BlZCkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKiogQ291bnQgb25seSBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIEFOWSBlbnZpcm9ubWVudCAocmVhbCBkZXBsb3ltZW50cykuICovXG4gIGRlcGxveXNPbmx5PzogYm9vbGVhbjtcbn1cblxuLy8gRE9SQSBwZXJmb3JtYW5jZSBiYW5kcyAodGhyZXNob2xkcyBmcm9tIHRoZSBET1JBL0FjY2VsZXJhdGUgcmVwb3J0cykuIEVhY2hcbi8vIGhlbHBlciByZXR1cm5zIGBudWxsYCB3aGVuIHRoZXJlJ3Mgbm8gc2FtcGxlIHRvIGNsYXNzaWZ5LlxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yRnJlcXVlbmN5KHBlckRheTogbnVtYmVyLCBkZXBsb3ltZW50czogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKGRlcGxveW1lbnRzIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGVyRGF5ID49IDEpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGVyRGF5ID49IDEgLyA3KSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGVyRGF5ID49IDEgLyAzMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogQ2hhbmdlIGZhaWx1cmUgcmF0ZSBieSBwZXJjZW50OiBlbGl0ZSDiiaQ1JSwgaGlnaCDiiaQxMCUsIG1lZGl1bSDiiaQxNSUuICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHBjdDogbnVtYmVyLCB0b3RhbDogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKHRvdGFsIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGN0IDw9IDUpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGN0IDw9IDEwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGN0IDw9IDE1KSByZXR1cm4gJ21lZGl1bSc7XG4gIHJldHVybiAnbG93Jztcbn1cbi8qKiBUaW1lIHRvIHJlc3RvcmUgYnkgc2Vjb25kczogZWxpdGUgPDFoLCBoaWdoIDwxIGRheSwgbWVkaXVtIDwxIHdlZWsuICovXG5mdW5jdGlvbiBkb3JhTGV2ZWxGb3JSZXN0b3JlKGF2Z1NlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAoYXZnU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKGF2Z1NlY29uZHMgPCAzNjAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIExlYWQgdGltZSBieSBzZWNvbmRzOiBlbGl0ZSA8MSBkYXksIGhpZ2ggPDEgd2VlaywgbWVkaXVtIDwxIG1vbnRoLiAqL1xuZnVuY3Rpb24gZG9yYUxldmVsRm9yTGVhZFRpbWUobWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChtZWRpYW5TZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgMjU5MjAwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG5cbi8qKlxuICogUm91bmQgYHZhbHVlYCB0byBgZGlnaXRzYCBkZWNpbWFsIHBsYWNlcywgcmV0dXJuaW5nIGEgcmVhbCBudW1iZXIuIFNtYWxsXG4gKiBtb2R1bGUtcHJpdmF0ZSBoZWxwZXIgc28gdGhlIERPUkEgc2hhcGluZyBkb2Vzbid0IHJlcGVhdCB0aGVcbiAqIGBOdW1iZXIoTnVtYmVyKHgpLnRvRml4ZWQobikpYCBwYXR0ZXJuICh0b0ZpeGVkIGFsb25lIHlpZWxkcyBhIHN0cmluZykuXG4gKi9cbmZ1bmN0aW9uIHJvdW5kKHZhbHVlOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKGRpZ2l0cykpO1xufVxuXG4vKipcbiAqIFNoYXJlZCBwZXItZXhlY3V0aW9uIHRlcm1pbmFsLXN0YXR1cyByb2xsLXVwIGZvciB0aGUgRE9SQSBgZXhlY3NgIENURXM6XG4gKiBGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQsIGVsc2UgQ0FOQ0VMRUQvU1RPUFBFRC4gS2VwdCBpbiBvbmUgcGxhY2Ugc29cbiAqIGdldERvcmFNZXRyaWNzIGFuZCBnZXREb3JhVHJlbmQgY2FuJ3QgZHJpZnQgb24gdGhlIHByZWNlZGVuY2UuXG4gKi9cbmNvbnN0IERPUkFfVEVSTUlOQUxfU1RBVFVTX0NBU0UgPSBzcWxgXG4gICAgICAgICAgICBDQVNFXG4gICAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLnN0YXR1cyA9ICdGQUlMRUQnKSBUSEVOICdGQUlMRUQnXG4gICAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLnN0YXR1cyA9ICdTVUNDRUVERUQnKSBUSEVOICdTVUNDRUVERUQnXG4gICAgICAgICAgICAgIEVMU0UgJ0NBTkNFTEVEJ1xuICAgICAgICAgICAgRU5EYDtcblxuLyoqXG4gKiBPcHRpb25hbCBwZXItcGlwZWxpbmUgLyBkZXBsb3ktc2NvcGluZyBwcmVkaWNhdGVzICsgdGhlIHJlc3VsdGluZyBgYmFzaXNgLFxuICogc2hhcmVkIGJ5IGdldERvcmFNZXRyaWNzIGFuZCBnZXREb3JhVHJlbmQgc28gdGhlIGVudi9kZXBsb3lzT25seSBwcmVjZWRlbmNlXG4gKiBjYW4ndCBkaXZlcmdlLiBgZW52aXJvbm1lbnRgIChvbmUgdGFyZ2V0KSB3aW5zIG92ZXIgYGRlcGxveXNPbmx5YCAoYW55IGVudikuXG4gKi9cbmZ1bmN0aW9uIGRvcmFTY29wZUNsYXVzZXMob3B0czogRG9yYU9wdGlvbnMpIHtcbiAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCwgZGVwbG95c09ubHkgfSA9IG9wdHM7XG4gIGNvbnN0IHBpcGVsaW5lQ2xhdXNlID0gcGlwZWxpbmVJZCA/IHNxbGBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1gIDogc3FsYGA7XG4gIGNvbnN0IGRlcGxveUNsYXVzZSA9IGVudmlyb25tZW50XG4gICAgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWBcbiAgICA6IGRlcGxveXNPbmx5ID8gc3FsYEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMYCA6IHNxbGBgO1xuICBjb25zdCBiYXNpczogJ2RlcGxveScgfCAncnVuJyA9IGVudmlyb25tZW50IHx8IGRlcGxveXNPbmx5ID8gJ2RlcGxveScgOiAncnVuJztcbiAgcmV0dXJuIHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSwgYmFzaXMgfTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgYGV4ZWNzYCBDVEUgYm9keSDigJQgdGhlIHBlci1leGVjdXRpb24gdGVybWluYWwgcm9sbC11cCB0aGF0IEJPVEggRE9SQVxuICogbWV0aG9kcyBzY2FuLiBPbmx5IHRoZSBTRUxFQ1RlZCBjb2x1bW5zIGFuZCB0aGUgdXBwZXIgcmFuZ2UgYm91bmQgZGlmZmVyXG4gKiAoZ2V0RG9yYU1ldHJpY3MgbmVlZHMgcGlwZWxpbmVfaWQvZW5kZWRfYXQvZHVyYXRpb25fbXMgcGx1cyBhIGxvb2stYWhlYWQgdGFpbFxuICogZm9yIE1UVFIgcmVjb3Zlcnk7IGdldERvcmFUcmVuZCBuZWVkcyBvbmx5IHN0YXJ0ZWRfYXQgb3ZlciB0aGUgY29yZSB3aW5kb3cpLFxuICogc28gdGhvc2UgYXJlIHRoZSBwYXJhbWV0ZXJzLiBUaGUgYGV2ZW50X3R5cGU9J1BJUEVMSU5FJ2AgZ2F0ZSwgdGhlXG4gKiBTVUNDRUVERUQvRkFJTEVEL0NBTkNFTEVEL1NUT1BQRUQgc3RhdHVzIHNldCwgdGhlIGBleGVjdXRpb25faWRgIGZpbHRlciwgdGhlXG4gKiBvcmcgKyBkZXBsb3kvcGlwZWxpbmUgc2NvcGUgY2xhdXNlcywgYW5kIHRoZSBgR1JPVVAgQllgIGFsbCBsaXZlIGhlcmUgc28gdGhlXG4gKiB0d28gY2FsbGVycyBjYW4ndCBkcmlmdCBvbiB0aGUgc3RhdHVzIHNldCBvciB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zICB0cmFpbGluZyBTRUxFQ1QgY29sdW1ucyAoYWZ0ZXIgYGUuZXhlY3V0aW9uX2lkLGApXG4gKiBAcGFyYW0gdG9Cb3VuZCAgdGhlIGA8PWAgdXBwZXItYm91bmQgZXhwcmVzc2lvbiBvbiBgZS5zdGFydGVkX2F0YFxuICogICAgICAgICAgICAgICAgIChjb3JlIHdpbmRvdyBmb3IgdGhlIHRyZW5kOyBjb3JlICsgbG9vay1haGVhZCBmb3IgbWV0cmljcylcbiAqL1xuZnVuY3Rpb24gZXhlY3NDdGUoYXJnczoge1xuICBwcmVkOiBTUUw7XG4gIGNvbHVtbnM6IFNRTDtcbiAgcGlwZWxpbmVDbGF1c2U6IFNRTDtcbiAgZGVwbG95Q2xhdXNlOiBTUUw7XG4gIGZyb206IHN0cmluZztcbiAgdG9Cb3VuZDogU1FMO1xufSk6IFNRTCB7XG4gIGNvbnN0IHsgcHJlZCwgY29sdW1ucywgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSwgZnJvbSwgdG9Cb3VuZCB9ID0gYXJncztcbiAgcmV0dXJuIHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5leGVjdXRpb25faWQsXG4gICAgICAgICAgJHtjb2x1bW5zfVxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnXG4gICAgICAgICAgLS0gU1RPUFBFRCAobWFudWFsbHkgYWJvcnRlZCkgam9pbnMgQ0FOQ0VMRUQgaW4gdGhlIEVMU0UgYnVja2V0OyBib3RoXG4gICAgICAgICAgLS0gYXJlIHRlcm1pbmFsIG5vbi1kZXBsb3kgb3V0Y29tZXMuIFNVUEVSU0VERUQgc3RheXMgZXhjbHVkZWQgKGFcbiAgICAgICAgICAtLSByZXBsYWNlZCBleGVjdXRpb24sIG5vdCBhbiBvdXRjb21lKS5cbiAgICAgICAgICBBTkQgZS5zdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnKVxuICAgICAgICAgIEFORCBlLmV4ZWN1dGlvbl9pZCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cGlwZWxpbmVDbGF1c2V9XG4gICAgICAgICAgJHtkZXBsb3lDbGF1c2V9XG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0elxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b0JvdW5kfVxuICAgICAgICBHUk9VUCBCWSBlLmV4ZWN1dGlvbl9pZCwgZS5waXBlbGluZV9pZGA7XG59XG5cbmludGVyZmFjZSBEb3JhUm93IHtcbiAgZGZfZGVwbG95bWVudHM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjZnJfZmFpbGVkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgY2ZyX3RvdGFsPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbHRfZGVwbG95bWVudHM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBsdF9tZWRpYW5fbXM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBtdHRyX2ZhaWx1cmVzPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgbXR0cl9yZXN0b3JlZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIG10dHJfYXZnX3NlY29uZHM/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIERPUkEgbWV0cmljcyBvdmVyIGEgW2Zyb20sdG9dIHdpbmRvdywgb3JnLXNjb3BlZCAoc2luZ2xlLW9yZyBvciByb2xsdXAgc3VidHJlZSkuXG4gKlxuICogQSBcImRlcGxveW1lbnRcIiBpcyBhIFRFUk1JTkFMIHBpcGVsaW5lLWxldmVsIGV2ZW50LCByb2xsZWQgdXAgdG8gb25lIHJvdyBwZXJcbiAqIGBleGVjdXRpb25faWRgIChGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQsIHRoZW4gQ0FOQ0VMRUQvU1RPUFBFRCDigJQgc2FtZVxuICogcHJlY2VkZW5jZSBhcyBgbGlzdFBpcGVsaW5lRXhlY3V0aW9uc2ApLlxuICpcbiAqIERJU0NMT1NVUkUg4oCUIHRoZXNlIGFyZSBSVU4tQkFTRUQgYXBwcm94aW1hdGlvbnMgb2YgRE9SQS4gQSBcImRlcGxveW1lbnRcIiBoZXJlXG4gKiBpcyBhbnkgc3VjY2Vzc2Z1bCBwaXBlbGluZSBSVU4sIG5vdCBhIHZlcmlmaWVkIHByb2R1Y3Rpb24gZGVwbG95bWVudDogdGhlXG4gKiBldmVudCBzdHJlYW0gY2FycmllcyBubyBkZXBsb3ktc3RhZ2UvZW52aXJvbm1lbnQgbWFya2VyLCBzbyBhIENJLW9ubHlcbiAqIGJ1aWxkL3Rlc3QgcGlwZWxpbmUgY291bnRzIHRoZSBzYW1lIGFzIG9uZSB0aGF0IHNoaXBzIHRvIHByb2QuIFRoYXQgbWFrZXNcbiAqIGBkZXBsb3ltZW50RnJlcXVlbmN5YCBhIHBpcGVsaW5lLXRocm91Z2hwdXQgc2lnbmFsIGFuZCBgY2hhbmdlRmFpbHVyZVJhdGVgIGFcbiAqIHBpcGVsaW5lLWZhaWx1cmUgcmF0ZSAoYnVpbGQvdGVzdCBmYWlsdXJlcyBjYXVnaHQgaW4gQ0kgY291bnQgdG9vKSwgYW5kIE1UVFJcbiAqIGEgcGlwZWxpbmUtcmVjb3ZlcnkgdGltZS4gT25seSBgbGVhZFRpbWVgIGNhcnJpZXMgYW4gZXhwbGljaXQgYGFwcHJveGAgZmxhZ1xuICogKGl0IGlzIGFkZGl0aW9uYWxseSBhIHJ1bi10aW1lIHByb3h5KSwgYnV0IEFMTCBmb3VyIHNoYXJlIHRoZSBydW7iiaBkZXBsb3lcbiAqIGNhdmVhdCB1bnRpbCBkZXBsb3kvY29tbWl0IG1ldGFkYXRhIGlzIGNhcHR1cmVkLiBTZWUgZG9jcy9kb3JhLW1ldHJpY3MubWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYU1ldHJpY3Mge1xuICAvKiogVGhlIFtmcm9tLHRvXSB3aW5kb3cgZWNob2VkIGJhY2sgKHN0YXJ0ZWRfYXQgcmFuZ2UpLiAqL1xuICB3aW5kb3c6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBudW1iZXJzIGNvdW50IHJlYWwgZGVwbG95bWVudHMgb3IgcGlwZWxpbmUgcnVuczpcbiAgICogLSBgJ2RlcGxveSdgIOKAlCBzY29wZWQgdG8gZXhlY3V0aW9ucyB0YWdnZWQgd2l0aCBhIGRlcGxveSBgZW52aXJvbm1lbnRgXG4gICAqICAgKHZpYSBgZW52aXJvbm1lbnRgL2BkZXBsb3lzT25seWApOyBhIGdlbnVpbmUgZGVwbG95bWVudCBzaWduYWwuXG4gICAqIC0gYCdydW4nYCDigJQgZGVmYXVsdDogZXZlcnkgc3VjY2Vzc2Z1bCBQSVBFTElORSBydW4gY291bnRzIChubyBkZXBsb3lcbiAgICogICBtYXJrZXIgYXBwbGllZCkuIERGL0NGUi9NVFRSIHRoZW4gcmVmbGVjdCBwaXBlbGluZSBhY3Rpdml0eSwgbm90IGRlcGxveXMuXG4gICAqL1xuICBiYXNpczogJ2RlcGxveScgfCAncnVuJztcbiAgLyoqIFRoZSBzY29waW5nIGFwcGxpZWQgKGVjaG9lZCBmb3IgdGhlIFVJKTsgYG51bGxgIHdoZW4gdW5zY29wZWQuICovXG4gIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDsgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGwgfTtcbiAgLyoqIERlcGxveW1lbnQgRnJlcXVlbmN5IOKAlCBTVUNDRUVERUQgdGVybWluYWwgZGVwbG95bWVudHMgaW4gdGhlIHdpbmRvdy4gKi9cbiAgZGVwbG95bWVudEZyZXF1ZW5jeToge1xuICAgIC8qKiBDb3VudCBvZiBzdWNjZXNzZnVsIGRlcGxveW1lbnRzLiAqL1xuICAgIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gICAgLyoqIFN1Y2Nlc3NmdWwgZGVwbG95bWVudHMgcGVyIGRheSBvdmVyIHRoZSB3aW5kb3cuICovXG4gICAgcGVyRGF5OiBudW1iZXI7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGRlcGxveW1lbnRzLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG4gIC8qKiBDaGFuZ2UgRmFpbHVyZSBSYXRlIOKAlCBmYWlsZWQgLyAoc3VjY2VlZGVkICsgZmFpbGVkKTsgQ0FOQ0VMRUQgZXhjbHVkZWQuICovXG4gIGNoYW5nZUZhaWx1cmVSYXRlOiB7XG4gICAgZmFpbGVkOiBudW1iZXI7XG4gICAgLyoqIHN1Y2NlZWRlZCArIGZhaWxlZCAodGhlIENGUiBkZW5vbWluYXRvcikuICovXG4gICAgdG90YWw6IG51bWJlcjtcbiAgICAvKiogZmFpbGVkL3RvdGFsIGFzIGEgcGVyY2VudGFnZSwgMOKAkzEwMCwgMSBkZWNpbWFsLiAqL1xuICAgIHBjdDogbnVtYmVyO1xuICAgIC8qKiBQZXJmb3JtYW5jZSBiYW5kLCBvciBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBkZXBsb3ltZW50cyB0byBqdWRnZS4gKi9cbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKiogTWVhbiBUaW1lIFRvIFJlc3RvcmUg4oCUIGF2ZyBnYXAgZnJvbSBhIGZhaWx1cmUgSU5DSURFTlQgdG8gaXRzIHJlY292ZXJ5LlxuICAgKiAgQ29uc2VjdXRpdmUgZmFpbGVkIHJ1bnMgb2YgYSBwaXBlbGluZSAod2l0aCBubyBncmVlbiBydW4gYmV0d2VlbikgY29sbGFwc2VcbiAgICogIGludG8gb25lIGluY2lkZW50OyB0aGUgZ2FwIGlzIG1lYXN1cmVkIGZyb20gdGhlIGZpcnN0IGZhaWx1cmUncyBFTkQgdG8gdGhlXG4gICAqICByZWNvdmVyaW5nIHJ1bidzIEVORC4gVGhlIHJlY292ZXJ5IGlzIHZpc2libGUgdXAgdG8gYSBsb29rLWFoZWFkIHBhc3QgYHRvYFxuICAgKiAgc28gYSBmYWlsdXJlIG5lYXIgdGhlIHdpbmRvdyBlZGdlIGlzbid0IHNwdXJpb3VzbHkgY291bnRlZCB1bnJlc3RvcmVkLiAqL1xuICBtZWFuVGltZVRvUmVzdG9yZToge1xuICAgIC8qKiBGYWlsdXJlIGluY2lkZW50cyBpbiB0aGUgd2luZG93IChtYXhpbWFsIHJ1bnMgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMpLiAqL1xuICAgIGZhaWx1cmVzOiBudW1iZXI7XG4gICAgLyoqIEluY2lkZW50cyB0aGF0IHdlcmUgZm9sbG93ZWQgYnkgYSBzdWNjZWVkZWQgcnVuIChyZWNvdmVyZWQpLiAqL1xuICAgIHJlc3RvcmVkOiBudW1iZXI7XG4gICAgLyoqIEF2ZXJhZ2UgcmVzdG9yZSBnYXAgaW4gc2Vjb25kczsgbnVsbCB3aGVuIHRoZXJlIHdlcmUgbm8gaW5jaWRlbnRzLiAqL1xuICAgIGF2Z1NlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqIFBlcmZvcm1hbmNlIGJhbmQsIG9yIG51bGwgd2hlbiB0aGVyZSB3ZXJlIG5vIGluY2lkZW50cy4gKi9cbiAgICBsZXZlbDogRG9yYUxldmVsO1xuICB9O1xuICAvKiogTGVhZCBUaW1lIOKAlCBQUk9YWTogbWVkaWFuIHBpcGVsaW5lIFJVTiBUSU1FIG9mIHN1Y2NlZWRlZCBkZXBsb3ltZW50cy5cbiAgICogIE5PVCB0cnVlIGNvbW1pdOKGknByb2QgbGVhZCB0aW1lIChleGVjdXRpb25zIGRvbid0IGNhcHR1cmUgY29tbWl0IHRpbWUpLFxuICAgKiAgaGVuY2UgYGFwcHJveDogdHJ1ZWAgc28gdGhlIFVJL2RvY3MgY2FuIGxhYmVsIGl0LiAqL1xuICBsZWFkVGltZToge1xuICAgIC8qKiBTdWNjZWVkZWQgZGVwbG95bWVudHMgd2l0aCBhIGR1cmF0aW9uICh0aGUgbWVkaWFuIHNhbXBsZSkuICovXG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICAvKiogTWVkaWFuIHJ1biB0aW1lIGluIHNlY29uZHM7IG51bGwgd2hlbiBubyBzdWNjZXNzZnVsIGRlcGxveW1lbnRzLiAqL1xuICAgIG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGw7XG4gICAgYXBwcm94OiB0cnVlO1xuICAgIC8qKiBQZXJmb3JtYW5jZSBiYW5kLCBvciBudWxsIHdoZW4gdGhlcmUgd2VyZSBubyBzdWNjZXNzZnVsIGRlcGxveW1lbnRzLiAqL1xuICAgIGxldmVsOiBEb3JhTGV2ZWw7XG4gIH07XG59XG5cbi8qKiBPbmUgaW50ZXJ2YWwgYnVja2V0IG9mIHRoZSBET1JBIHRyZW5kIChkZXBsb3ltZW50IGZyZXF1ZW5jeSArIGNoYW5nZSBmYWlsdXJlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9yYVRyZW5kUG9pbnQge1xuICAvKiogQnVja2V0IHN0YXJ0IChEQVRFX1RSVU5DIG9mIHN0YXJ0ZWRfYXQpLCBJU08gdGV4dC4gKi9cbiAgcGVyaW9kOiBzdHJpbmc7XG4gIC8qKiBTdWNjZXNzZnVsIGRlcGxveW1lbnRzIGluIHRoZSBidWNrZXQuICovXG4gIGRlcGxveW1lbnRzOiBudW1iZXI7XG4gIC8qKiBGYWlsZWQgZGVwbG95bWVudHMgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgZmFpbGVkOiBudW1iZXI7XG4gIC8qKiBzdWNjZWVkZWQgKyBmYWlsZWQgaW4gdGhlIGJ1Y2tldC4gKi9cbiAgdG90YWw6IG51bWJlcjtcbiAgLyoqIGZhaWxlZC90b3RhbCBhcyBhIHBlcmNlbnQgKDAgd2hlbiB0b3RhbCBpcyAwKS4gKi9cbiAgY2hhbmdlRmFpbHVyZVBjdDogbnVtYmVyO1xufVxuXG4vKiogRXZlbnQgcGF5bG9hZCBhY2NlcHRlZCBieSBgUmVwb3J0aW5nU2VydmljZS5pbmdlc3RFdmVudHNgLiBNaXJyb3JzIHRoZSByb3V0ZSdzIFpvZCBzaGFwZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0RXZlbnQge1xuICAvKiogU3RhYmxlIHBpcGVsaW5lIGlkIHRoZSBldmVudHMgTGFtYmRhIHJlYWQgZnJvbSB0aGUgYFBJUEVMSU5FX0VWRU5UX0lEYFxuICAgKiAgdGFnICg9IHRoZSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlIHJlZ2lzdHJ5IGpvaW4ga2V5LiAqL1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB8ICdjb2RlYnVpbGQnIHwgJ3BsdWdpbi1idWlsZCc7XG4gIGV2ZW50VHlwZTogJ1BJUEVMSU5FJyB8ICdTVEFHRScgfCAnQUNUSU9OJyB8ICdCVUlMRCc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBleGVjdXRpb25JZD86IHN0cmluZztcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBhY3Rpb25OYW1lPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZmFpbHVyZSByZWFzb24gKEFjdGlvbiBldmVudHMpLiAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIC8qKiBTb3VyY2UgY29tbWl0IGlkIG9mIHRoZSBjaGFuZ2UgYmVpbmcgc2hpcHBlZCAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiAqL1xuICBjb21taXRTaGE/OiBzdHJpbmc7XG4gIC8qKiBTb3VyY2UgcmVmL2JyYW5jaCAoRE9SQSBkZXBsb3kgYXR0cmlidXRpb24pLiAqL1xuICBjb21taXRSZWY/OiBzdHJpbmc7XG4gIC8qKiBEZXBsb3kgdGFyZ2V0IChlLmcuIFwicHJvZHVjdGlvblwiKS4gSXRzIHByZXNlbmNlIG1hcmtzIGEgcmVhbCBkZXBsb3ltZW50LiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKiBDb3VudHMgKyB0aGUgKHBvc3NpYmx5IHRydW5jYXRlZCkgbGlzdCBvZiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIHRoZSBjYWxsZXIgY2FuIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0UmVzdWx0IHtcbiAgaW5zZXJ0ZWQ6IG51bWJlcjtcbiAgc2tpcHBlZDogbnVtYmVyO1xuICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkczogc3RyaW5nW107XG59XG5cbi8vIOKUgOKUgOKUgCBTZXJ2aWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJlYWQtb25seSByZXBvcnRpbmcgc2VydmljZSBmb3IgcGlwZWxpbmUgZXhlY3V0aW9uIGFuZCBwbHVnaW4gaW52ZW50b3J5IGFnZ3JlZ2F0aW9ucy5cbiAqIERvZXMgbm90IGV4dGVuZCBDcnVkU2VydmljZSDigJQgcmVwb3J0cyBhcmUgYWdncmVnYXRlIHF1ZXJpZXMsIG5vdCBlbnRpdHkgQ1JVRC5cbiAqXG4gKiBBbGwgcXVlcmllcyBhcmUgY2FjaGVkIGluLW1lbW9yeSB0byBhdm9pZCByZXBlYXRlZCBleHBlbnNpdmUgU1FMIGFnZ3JlZ2F0aW9uczpcbiAqIC0gSW52ZW50b3J5IHF1ZXJpZXMgKHBsdWdpbiBzdW1tYXJ5L2Rpc3RyaWJ1dGlvbi92ZXJzaW9ucyk6IDUgbWluIFRUTFxuICogLSBUaW1lc2VyaWVzIHF1ZXJpZXMgKGV4ZWN1dGlvbi9idWlsZCBtZXRyaWNzIHdpdGggZGF0ZSByYW5nZXMpOiAyIG1pbiBUVExcbiAqL1xuZXhwb3J0IGNsYXNzIFJlcG9ydGluZ1NlcnZpY2Uge1xuXG4gIC8qKiBJbnZhbGlkYXRlIGFsbCBjYWNoZWQgcmVwb3J0cyBmb3IgYW4gb3JnIChjYWxsIGFmdGVyIGV2ZW50IGluZ2VzdCkuICovXG4gIGFzeW5jIGludmFsaWRhdGVPcmcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGludmVudG9yeUNhY2hlLmludmFsaWRhdGVQYXR0ZXJuKGAke29yZ0lkfToqYCksXG4gICAgICB0aW1lc2VyaWVzQ2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oYCR7b3JnSWR9OipgKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGluY29taW5nIGV2ZW50cyBhZ2FpbnN0IHRoZSBwaXBlbGluZSByZWdpc3RyeSwgYmF0Y2gtaW5zZXJ0IHRoZVxuICAgKiBtYXRjaGVkIG9uZXMsIGFuZCBpbnZhbGlkYXRlIHJlcG9ydGluZyBjYWNoZXMgZm9yIGFmZmVjdGVkIG9yZ3MuXG4gICAqIEV2ZW50cyBmb3IgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBhcmUgZHJvcHBlZCAoYW5kIGxvZ2dlZCBhdCBXQVJOXG4gICAqIHdpdGggc2FtcGxlIGlkcyBzbyBhbiBvcGVyYXRvciBjYW4gc2VlIHdoZW4gRXZlbnRCcmlkZ2UgaXMgZGVsaXZlcmluZ1xuICAgKiBldmVudHMgZm9yIHBpcGVsaW5lcyB0aGF0IGhhdmVuJ3QgY2FsbGVkIFBPU1QgL3BpcGVsaW5lcy9yZWdpc3RyeSB5ZXQpLlxuICAgKlxuICAgKiBSZXR1cm5zIGNvdW50cyArIGEgc2FtcGxlIG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgZm9yIG9ic2VydmFiaWxpdHkuXG4gICAqL1xuICBhc3luYyBpbmdlc3RFdmVudHMoZXZlbnRzOiBJbmdlc3RFdmVudFtdKTogUHJvbWlzZTxJbmdlc3RSZXN1bHQ+IHtcbiAgICAvLyBNdWx0aS1vcmcgYmF0Y2ggaW5zZXJ0OiB0aGUgY2FsbGVyIHJlc29sdmVzIHRvIG11bHRpcGxlIG9yZ3MgdmlhIHRoZVxuICAgIC8vIHBpcGVsaW5lLXJlZ2lzdHJ5IGxvb2t1cCBiZWxvdywgc28gdGhlIHJvdXRlIGxheWVyIE1VU1QgZXN0YWJsaXNoIGFcbiAgICAvLyBgcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgLi4uKWAgc2NvcGUgYmVmb3JlIGNhbGxpbmdcbiAgICAvLyB0aGlzIG1ldGhvZC4gVW5kZXIgRk9SQ0UnZCBSTFMsIGEgc2luZ2xlIHR4IHdpdGggYGFwcC5vcmdfaWQgPSA8b25lXG4gICAgLy8gb3JnPmAgY291bGQgb25seSB3cml0ZSBldmVudHMgZm9yIHRoYXQgb3JnOyBieXBhc3MgdmlhIHN5c2FkbWluIGlzXG4gICAgLy8gdGhlIHJpZ2h0IGdhdGUgZm9yIHRoaXMgc2VydmVyLWludGVybmFsIGNyb3NzLXRlbmFudCBlbmRwb2ludC4gU2VlXG4gICAgLy8gYXBpL3JlcG9ydGluZy9zcmMvcm91dGVzL2V2ZW50LWluZ2VzdC50cyBmb3IgdGhlIHdyYXBwZXIuXG4gICAgLy8gUnVuIGluc2VydCBpbnNpZGUgdGhlIHR4LCBidXQgQ09MTEVDVCBhZmZlY3RlZCBvcmdzIGFuZCBpbnZhbGlkYXRlXG4gICAgLy8gY2FjaGVzIEFGVEVSIHRoZSB0eCByZXNvbHZlcy4gS2VlcGluZyBpbnZhbGlkYXRpb24gaW5zaWRlIHRoZSB0eCBoZWxkXG4gICAgLy8gdGhlIHBnIGxvY2tzIG9wZW4gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FjaGUgcm91bmQtdHJpcHMgKFJlZGlzIG9yXG4gICAgLy8gaW4tbWVtb3J5IGludmFsaWRhdGlvbnMgYXJlIHVucmVsYXRlZCB0byB0aGUgdHggYnV0IHN0aWxsIHNlcmlhbGl6ZWRcbiAgICAvLyBpdHMgY29tbWl0KS4gQ2FjaGUgVFRMIGlzIDItNSBtaW4gc28gZmlyZS1hbmQtZm9yZ2V0IHBvc3QtY29tbWl0IGlzXG4gICAgLy8gYW4gYWNjZXB0YWJsZSB0cmFkZSBmb3IgdGlnaHRlciBsb2NrIHdpbmRvd3MuXG4gICAgY29uc3QgeyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMsIGFmZmVjdGVkT3JncyB9ID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgLy8gQmF0Y2gtcmVzb2x2ZSBhbGwgdW5pcXVlIHBpcGVsaW5lIGlkcyBpbiBvbmUgcXVlcnlcbiAgICAgIGNvbnN0IHVuaXF1ZUlkcyA9IFsuLi5uZXcgU2V0KGV2ZW50cy5tYXAoZSA9PiBlLnBpcGVsaW5lSWQpKV07XG4gICAgICBjb25zdCByZWdpc3RyeVJvd3MgPSBhd2FpdCB0eFxuICAgICAgICAuc2VsZWN0KHtcbiAgICAgICAgICBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICAgIG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5vcmdJZCxcbiAgICAgICAgfSlcbiAgICAgICAgLmZyb20oc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkpXG4gICAgICAgIC53aGVyZShpbkFycmF5KHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5LnBpcGVsaW5lSWQsIHVuaXF1ZUlkcykpO1xuXG4gICAgICBjb25zdCBpZE1hcCA9IG5ldyBNYXAocmVnaXN0cnlSb3dzLm1hcChyID0+IFtyLnBpcGVsaW5lSWQsIHJdKSk7XG5cbiAgICAgIC8vIEJ1aWxkIGluc2VydCBiYXRjaCAoc2tpcCBldmVudHMgd2hvc2UgcGlwZWxpbmUgaXNuJ3QgcmVnaXN0ZXJlZClcbiAgICAgIGNvbnN0IHJvd3M6IEFycmF5PHR5cGVvZiBzY2hlbWEucGlwZWxpbmVFdmVudC4kaW5mZXJJbnNlcnQ+ID0gW107XG4gICAgICBsZXQgc2tpcHBlZExvY2FsID0gMDtcbiAgICAgIGNvbnN0IHVucmVnaXN0ZXJlZExvY2FsOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICBjb25zdCByZWdpc3RyeSA9IGlkTWFwLmdldChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyeSkge1xuICAgICAgICAgIHNraXBwZWRMb2NhbCsrO1xuICAgICAgICAgIHVucmVnaXN0ZXJlZExvY2FsLnB1c2goZXZlbnQucGlwZWxpbmVJZCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByb3dzLnB1c2goe1xuICAgICAgICAgIC8vIHJlZ2lzdHJ5LnBpcGVsaW5lSWQgPT09IGV2ZW50LnBpcGVsaW5lSWQ7IHVzZSB0aGUgcmVnaXN0cnkncyBzbyB0aGVcbiAgICAgICAgICAvLyBGSyBpcyBhbHdheXMgYSByb3cgdGhhdCBleGlzdHMsIGFuZCBwdWxsIG9yZ0lkIGZyb20gdGhlIHJlZ2lzdHJ5IGZvclxuICAgICAgICAgIC8vIHRlbmFuY3kgKG5ldmVyIHRydXN0IHRoZSBjYWxsZXIncyBjbGFpbWVkIG9yZykuXG4gICAgICAgICAgcGlwZWxpbmVJZDogcmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgICBvcmdJZDogcmVnaXN0cnkub3JnSWQsXG4gICAgICAgICAgZXZlbnRTb3VyY2U6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgIHN0YXR1czogZXZlbnQuc3RhdHVzLFxuICAgICAgICAgIGV4ZWN1dGlvbklkOiBldmVudC5leGVjdXRpb25JZCxcbiAgICAgICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgICAgICBhY3Rpb25OYW1lOiBldmVudC5hY3Rpb25OYW1lLFxuICAgICAgICAgIC8vIEhBUkQgQ09OU1RSQUlOVDogYW4gQVdTIGFjY291bnQgaWQgbXVzdCBORVZFUiBiZSBwZXJzaXN0ZWQuIFRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgRFVSQUJMRSBwZXJzaXN0ZW5jZSBib3VuZGFyeSBhbmQgbXVzdCBub3QgdHJ1c3QgdXBzdHJlYW06XG4gICAgICAgICAgLy8gQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBmYWlsdXJlIGRldGFpbCAmIG1lc3NhZ2VzIHJvdXRpbmVseSBjYXJyeVxuICAgICAgICAgIC8vIEFSTnMgKGFybjphd3M64oCmOjxhY2NvdW50LWlkPjrigKYpIGFuZCBiYXJlIDEyLWRpZ2l0IGFjY291bnQgaWRzLiBTY3J1YlxuICAgICAgICAgIC8vIGJvdGggZnJlZS1mb3JtIGZpZWxkcyBoZXJlIGJlZm9yZSBpbnNlcnQgKHBlci1ldmVudCwgbm9uLW11dGF0aW5nKS5cbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGV2ZW50LmVycm9yTWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LmVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogZXZlbnQuc3RhcnRlZEF0ID8gbmV3IERhdGUoZXZlbnQuc3RhcnRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogZXZlbnQuY29tcGxldGVkQXQgPyBuZXcgRGF0ZShldmVudC5jb21wbGV0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZHVyYXRpb25NczogZXZlbnQuZHVyYXRpb25NcyxcbiAgICAgICAgICAvLyBEZXBsb3ktYXR0cmlidXRpb24gZmllbGRzIOKAlCBzY3J1YmJlZCBsaWtlIHRoZSBvdGhlciBmcmVlLWZvcm0gc3RyaW5nc1xuICAgICAgICAgIC8vIHNvIGFuIEFSTi9hY2NvdW50IGlkIGNhbiBuZXZlciBlbnRlciB2aWEgYSByZWYgb3IgZW52aXJvbm1lbnQgbmFtZS5cbiAgICAgICAgICBjb21taXRTaGE6IGV2ZW50LmNvbW1pdFNoYSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnNGcm9tU3RyaW5nKGV2ZW50LmNvbW1pdFNoYSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbW1pdFJlZjogZXZlbnQuY29tbWl0UmVmICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuY29tbWl0UmVmKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IGV2ZW50LmVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gc2NydWJBd3NJZGVudGlmaWVyc0Zyb21TdHJpbmcoZXZlbnQuZW52aXJvbm1lbnQpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LmRldGFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHNjcnViQXdzSWRlbnRpZmllcnMoZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTUVMgaXMgYXQtbGVhc3Qtb25jZSwgc28gRXZlbnRCcmlkZ2UgY2FuIGRlbGl2ZXIgdGhlIHNhbWUgc3RhdGUtY2hhbmdlXG4gICAgICAvLyB0d2ljZS4gYG9uQ29uZmxpY3REb05vdGhpbmdgICsgdGhlIHBhcnRpYWwgdW5pcXVlIGluZGV4IG9uXG4gICAgICAvLyAocGlwZWxpbmVfaWQsIGV4ZWN1dGlvbl9pZCwgZXZlbnRfdHlwZSwgc3RhdHVzLCBzdGFnZV9uYW1lLCBhY3Rpb25fbmFtZSlcbiAgICAgIC8vIG1ha2VzIHJlLWRlbGl2ZXJ5IGlkZW1wb3RlbnQuIGByZXR1cm5pbmdgIGdpdmVzIHRoZSBSRUFMIGluc2VydGVkIHNldCBzb1xuICAgICAgLy8gY291bnRzICsgY2FjaGUgaW52YWxpZGF0aW9uIGlnbm9yZSBkdXBsaWNhdGVzLlxuICAgICAgY29uc3QgaW5zZXJ0ZWRSb3dzID0gcm93cy5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5waXBlbGluZUV2ZW50KS52YWx1ZXMocm93cylcbiAgICAgICAgICAub25Db25mbGljdERvTm90aGluZygpXG4gICAgICAgICAgLnJldHVybmluZyh7IG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVFdmVudC5vcmdJZCB9KVxuICAgICAgICA6IFtdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnNlcnRlZDogaW5zZXJ0ZWRSb3dzLmxlbmd0aCxcbiAgICAgICAgc2tpcHBlZDogc2tpcHBlZExvY2FsLFxuICAgICAgICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkczogdW5yZWdpc3RlcmVkTG9jYWwsXG4gICAgICAgIGFmZmVjdGVkT3JnczogWy4uLm5ldyBTZXQoaW5zZXJ0ZWRSb3dzLm1hcChyID0+IHIub3JnSWQpKV0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gU3VyZmFjZSB0aGUgc2lsZW50IHNraXA6IGFuIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZCB1c3VhbGx5IG1lYW5zIHRoZVxuICAgIC8vIHBpcGVsaW5lIGhhc24ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCAob3IgaXRzXG4gICAgLy8gUElQRUxJTkVfRVZFTlRfSUQgdGFnIGlzIG1pc3NpbmcvdW5yZWFkYWJsZSBieSB0aGUgTGFtYmRhKS4gTG9nZ2luZyBpdFxuICAgIC8vIG1ha2VzIGEgYnJva2VuIGpvaW4gdmlzaWJsZSBpbnN0ZWFkIG9mIGxvb2tpbmcgbGlrZSBcIm5vIGFjdGl2aXR5XCIuXG4gICAgaWYgKHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdQaXBlbGluZSBldmVudHMgc2tpcHBlZDogcGlwZWxpbmUgaWQgbm90IGZvdW5kIGluIHJlZ2lzdHJ5Jywge1xuICAgICAgICBjb3VudDogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoLFxuICAgICAgICBzYW1wbGU6IHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLnNsaWNlKDAsIDMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9zdC1jb21taXQgY2FjaGUgaW52YWxpZGF0aW9uLiBGaXJlLWFuZC1mb3JnZXQgd2l0aCBsb2dnaW5nIOKAlCBUVEwgaXNcbiAgICAvLyBzaG9ydCBlbm91Z2ggdGhhdCBhIG1pc3NlZCBpbnZhbGlkYXRpb24gc2VsZi1oZWFscy5cbiAgICBpZiAoYWZmZWN0ZWRPcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvaWQgUHJvbWlzZS5hbGwoYWZmZWN0ZWRPcmdzLm1hcCgob3JnKSA9PlxuICAgICAgICB0aGlzLmludmFsaWRhdGVPcmcob3JnKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZDogb3JnLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIH0pLFxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaW5zZXJ0ZWQsIHNraXBwZWQsIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzIH07XG4gIH1cblxuICAvLyDilIDilIAgQ2F0ZWdvcnkgMTogUGlwZWxpbmUgRXhlY3V0aW9uICYgUGVyZm9ybWFuY2Ug4pSA4pSAXG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBvcmctc2NvcGUgcHJlZGljYXRlIGZvciBhIHJlcG9ydCBxdWVyeS4gV2l0aCBgb3JnSWRzYCAodGhlXG4gICAqIG9yZyDihpIgdGVhbSByb2xsdXAg4oCUIGEgcGFyZW50J3MgYFtzZWxmLCAuLi5kZXNjZW5kYW50c11gKSBpdCBiZWNvbWVzIGFuXG4gICAqIGBJTiAoLi4uKWAgb3ZlciB0aGUgc3VidHJlZTsgb3RoZXJ3aXNlIHRoZSBzaW5nbGUtb3JnIGA9ICRvcmdgLiBSZXR1cm5zIGFcbiAgICogYG11bHRpYCBmbGFnIHNvIGNhbGxlcnMgY2FuIHJ1biBtdWx0aS1vcmcgcmVhZHMgdW5kZXIgc3lzYWRtaW4gY29udGV4dFxuICAgKiAodGhlIHN1YnRyZWUgc3BhbnMgb3JncyBvdXRzaWRlIHRoZSByZXF1ZXN0J3MgUkxTIHNjb3BlKSBhbmQgc2FsdCB0aGVcbiAgICogY2FjaGUga2V5LlxuICAgKi9cbiAgcHJpdmF0ZSBvcmdTY29wZShvcmdJZDogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGlkcyA9IG9yZ0lkcyAmJiBvcmdJZHMubGVuZ3RoID4gMCA/IG9yZ0lkcyA6IFtvcmdJZF07XG4gICAgY29uc3QgbXVsdGkgPSBpZHMubGVuZ3RoID4gMTtcbiAgICBjb25zdCBwcmVkID0gbXVsdGlcbiAgICAgID8gc3FsYElOICgke3NxbC5qb2luKGlkcy5tYXAoKGlkKSA9PiBzcWxgJHtpZH1gKSwgc3FsYCwgYCl9KWBcbiAgICAgIDogc3FsYD0gJHtpZHNbMF19YDtcbiAgICByZXR1cm4geyBwcmVkLCBtdWx0aSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHJlcG9ydCByZWFkLiBTaW5nbGUtb3JnIHJlYWRzIHVzZSB0aGUgcGVyLW9yZyBjYWNoZSAoaW52YWxpZGF0ZWQgb25cbiAgICogdGhhdCBvcmcncyBldmVudCBpbmdlc3QpLiBSb2xsdXAgKG11bHRpLW9yZykgcmVhZHMgKipieXBhc3MgdGhlIGNhY2hlKiogYW5kXG4gICAqIHJ1biB1bmRlciBzeXNhZG1pbiBjb250ZXh0OiB0aGV5J3JlIGFkbWluLW9ubHkgYW5kIGxvd2VyLWZyZXF1ZW5jeSwgYW5kIGFcbiAgICogY2hpbGQgb3JnJ3MgZXZlbnQgaW5nZXN0IGNhbid0IGludmFsaWRhdGUgYSBwYXJlbnQncyByb2xsdXAgZW50cnkgKHJlcG9ydGluZ1xuICAgKiBoYXMgbm8gb3JnIHRyZWUpLCBzbyBjYWNoaW5nIHRoZW0gd291bGQgc2VydmUgc3RhbGUgYWdncmVnYXRlcy4gQWx3YXlzIGZyZXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBydW5SZXBvcnQ8VD4oY2FjaGVLZXk6IHN0cmluZywgbXVsdGk6IGJvb2xlYW4sIGV4ZWM6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbXVsdGlcbiAgICAgID8gcnVuV2l0aFRlbmFudENvbnRleHQoeyBpc1N1cGVyQWRtaW46IHRydWUgfSwgZXhlYylcbiAgICAgIDogdGltZXNlcmllc0NhY2hlLmdldE9yU2V0KGNhY2hlS2V5LCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjEgRXhlY3V0aW9uIGNvdW50IHBlciBwaXBlbGluZSB3aXRoIHN0YXR1cyBicmVha2Rvd24uICovXG4gIGFzeW5jIGdldEV4ZWN1dGlvbkNvdW50KG9yZ0lkOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCByYW5nZT86IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfSk6IFByb21pc2U8RXhlY3V0aW9uQ291bnRbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgLy8gT3B0aW9uYWwgW2Zyb20sdG9dIHdpbmRvdyBvbiB0aGUgZXhlY3V0aW9uJ3Mgc3RhcnRlZF9hdCwgbWlycm9yaW5nIHRoZVxuICAgIC8vIHNpYmxpbmcgdGltZXNlcmllcyByZXBvcnRzIHNvIHRoZSBkYXNoYm9hcmQgZGF0ZS1yYW5nZSBwaWNrZXIgbmFycm93cyB0aGVcbiAgICAvLyBjb3VudCB0b28gKGFuIGVtcHR5IHJhbmdlID0gYWxsLXRpbWUsIHByZXNlcnZpbmcgdGhlIHByaW9yIGJlaGF2aW9yKS4gVGhlXG4gICAgLy8gcmFuZ2UgcmlkZXMgdGhlIEpPSU4gc28gcGlwZWxpbmVzIHdpdGggbm8gaW4td2luZG93IGV2ZW50cyBzdGlsbCBsaXN0XG4gICAgLy8gKExFRlQgc2VtYW50aWNzIHByZXNlcnZlZCB2aWEgdGhlIGlubmVyLWpvaW4gZmlsdGVyIOKAlCBhIHBpcGVsaW5lIHdpdGggemVyb1xuICAgIC8vIG1hdGNoaW5nIGV2ZW50cyBkcm9wcyBmcm9tIHRoZSBjb3VudCwgc2FtZSBhcyBiZWZvcmUgZm9yIGl0cyB3aW5kb3cpLlxuICAgIGNvbnN0IHJhbmdlQ2xhdXNlID0gcmFuZ2U/LmZyb20gJiYgcmFuZ2U/LnRvXG4gICAgICA/IHNxbGBBTkQgZS5zdGFydGVkX2F0ID49ICR7cmFuZ2UuZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHtyYW5nZS50b306OnRpbWVzdGFtcHR6YFxuICAgICAgOiBzcWxgYDtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5vcmdhbml6YXRpb24sIHAucGlwZWxpbmVfbmFtZSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZWVkZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ0NBTkNFTEVEJyk6OmludCBBUyBjYW5jZWxlZCxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBmaXJzdF9leGVjdXRpb24sXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9leGVjdXRpb25cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZX0gcFxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGUgT04gZS5waXBlbGluZV9pZCA9IHAuaWRcbiAgICAgICAgICBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgIT0gJ1NUQVJURUQnXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgcC5pc19hY3RpdmUgPSB0cnVlXG4gICAgICAgIEdST1VQIEJZIHAuaWRcbiAgICAgICAgT1JERVIgQlkgdG90YWwgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEV4ZWN1dGlvbkNvdW50PihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpleGVjLWNvdW50OiR7cmFuZ2U/LmZyb20gPz8gJyd9OiR7cmFuZ2U/LnRvID8/ICcnfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAxLjFiIFBlci1waXBlbGluZSBleGVjdXRpb24gaGlzdG9yeSDigJQgRElTVElOQ1QgZXhlY3V0aW9ucyBmb3Igb25lIHBpcGVsaW5lLFxuICAgKiBuZXdlc3QgZmlyc3QuIEdyb3VwcyBhbGwgZXZlbnRzIGJ5IGBleGVjdXRpb25faWRgIGluIGEgc2luZ2xlIHNjYW4gYW5kXG4gICAqIHJvbGxzIGVhY2ggZXhlY3V0aW9uIHVwIHRvIG9uZSByb3c6XG4gICAqICAgLSBzdGF0dXM6IGRlcml2ZWQgZnJvbSB0aGUgUElQRUxJTkUtdHlwZSBldmVudHMuIEZBSUxFRCB3aW5zLCB0aGVuXG4gICAqICAgICBTVUNDRUVERUQsIHRoZW4gQ0FOQ0VMRUQ7IGFuIGV4ZWN1dGlvbiB3aXRoIG5vIHRlcm1pbmFsIFBJUEVMSU5FIGV2ZW50XG4gICAqICAgICBpcyBzdGlsbCBgaW4tcHJvZ3Jlc3NgLlxuICAgKiAgIC0gc3RhcnRlZEF0L2VuZGVkQXQvZHVyYXRpb25NczogZnJvbSB0aGUgUElQRUxJTkUgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICogICAtIGZhaWxpbmdTdGFnZS9mYWlsaW5nQWN0aW9uOiB0aGUgZmlyc3QgRkFJTEVEIFNUQUdFL0FDVElPTiBldmVudCAoY2hlYXAg4oCUXG4gICAqICAgICBzYW1lIHNjYW4sIG5vIGV4dHJhIHF1ZXJ5KS5cbiAgICpcbiAgICogT1JHLVNDT1BJTkc6IGlkZW50aWNhbCB0byB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0cyDigJQgam9pbnMgdGhlIHBpcGVsaW5lXG4gICAqIHJlZ2lzdHJ5IHRhYmxlIChgcGlwZWxpbmVgKSBhbmQgZ2F0ZXMgb24gYHAub3JnX2lkICR7cHJlZH1gLCB3aGVyZSBgcHJlZGAgaXNcbiAgICogdGhlIHNpbmdsZS1vcmcgYD0gJG9yZ2Agb3IgKHdpdGggYSByb2xsdXApIGFuIGBJTiAoLi4uKWAgb3ZlciB0aGUgb3Jn4oaSdGVhbVxuICAgKiBzdWJ0cmVlLiBBIHBpcGVsaW5lSWQgYmVsb25naW5nIHRvIGFub3RoZXIgb3JnIHlpZWxkcyB6ZXJvIHJvd3MuXG4gICAqL1xuICBhc3luYyBsaXN0UGlwZWxpbmVFeGVjdXRpb25zKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICAgIG9yZ0lkcz86IHN0cmluZ1tdLFxuICAgIHJhbmdlPzogeyBmcm9tPzogc3RyaW5nOyB0bz86IHN0cmluZyB9LFxuICAgIGxpbWl0OiBudW1iZXIgPSA1MCxcbiAgKTogUHJvbWlzZTxQaXBlbGluZUV4ZWN1dGlvbltdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCByYW5nZUNsYXVzZSA9IHJhbmdlPy5mcm9tICYmIHJhbmdlPy50b1xuICAgICAgPyBzcWxgQU5EIGUuc3RhcnRlZF9hdCA+PSAke3JhbmdlLmZyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7cmFuZ2UudG99Ojp0aW1lc3RhbXB0emBcbiAgICAgIDogc3FsYGA7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICBXSEVOIGJvb2xfb3IoZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykgVEhFTiAnZmFpbGVkJ1xuICAgICAgICAgICAgV0hFTiBib29sX29yKGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScgQU5EIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpIFRIRU4gJ3N1Y2NlZWRlZCdcbiAgICAgICAgICAgIFdIRU4gYm9vbF9vcihlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpIFRIRU4gJ2NhbmNlbGVkJ1xuICAgICAgICAgICAgRUxTRSAnaW4tcHJvZ3Jlc3MnXG4gICAgICAgICAgRU5EIEFTIHN0YXR1cyxcbiAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIHN0YXJ0ZWRfYXQsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjp0ZXh0IEFTIGVuZGVkX2F0LFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdQSVBFTElORScpOjppbnQgQVMgZHVyYXRpb25fbXMsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLnN0YWdlX25hbWUpIEZJTFRFUiAoV0hFUkUgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGF0dXMgPSAnRkFJTEVEJykpWzFdIEFTIGZhaWxpbmdfc3RhZ2UsXG4gICAgICAgICAgKEFSUkFZX0FHRyhlLmFjdGlvbl9uYW1lKSBGSUxURVIgKFdIRVJFIGUuZXZlbnRfdHlwZSA9ICdBQ1RJT04nIEFORCBlLnN0YXR1cyA9ICdGQUlMRUQnKSlbMV0gQVMgZmFpbGluZ19hY3Rpb25cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0gQU5EIGUuZXhlY3V0aW9uX2lkIElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtyYW5nZUNsYXVzZX1cbiAgICAgICAgR1JPVVAgQlkgZS5leGVjdXRpb25faWRcbiAgICAgICAgT1JERVIgQlkgTUFYKGUuY3JlYXRlZF9hdCkgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFBpcGVsaW5lRXhlY3V0aW9uPihyLnJvd3MpKSk7XG4gICAgcmV0dXJuIHRoaXMucnVuUmVwb3J0KGAke29yZ0lkfTpwaXBlbGluZS1leGVjdXRpb25zOiR7cGlwZWxpbmVJZH06JHtyYW5nZT8uZnJvbSA/PyAnJ306JHtyYW5nZT8udG8gPz8gJyd9OiR7bGltaXR9YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqIDEuMiBTdWNjZXNzIHJhdGUgb3ZlciB0aW1lIGZvciBhbiBvcmcuICovXG4gIGFzeW5jIGdldFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBlLnN0YXJ0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjppbnQgQVMgc3VjY2VlZGVkLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdDQU5DRUxFRCcpOjppbnQgQVMgY2FuY2VsZWQsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdTVUNDRUVERUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgc3VjY2Vzc19wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1BJUEVMSU5FJ1xuICAgICAgICAgIEFORCBlLnN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnKVxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgcGVyaW9kIE9SREVSIEJZIHBlcmlvZFxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRpbWVTZXJpZXNFbnRyeT4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06c3VjY2Vzcy1yYXRlOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS4zIEF2ZXJhZ2UgZHVyYXRpb24gcGVyIHBpcGVsaW5lLiAqL1xuICBhc3luYyBnZXRBdmVyYWdlRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8RHVyYXRpb25TdGF0c1tdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIHAuaWQsIHAucHJvamVjdCwgcC5waXBlbGluZV9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNSU4oZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtaW5fbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zLFxuICAgICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk1KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGUuZHVyYXRpb25fbXMpOjppbnQgQVMgcDk1X21zLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgZXhlY3V0aW9uc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnUElQRUxJTkUnIEFORCBlLmR1cmF0aW9uX21zIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwLmlkIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RHVyYXRpb25TdGF0cz4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06YXZnLWR1cmF0aW9uOiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogMS41IFN0YWdlIGZhaWx1cmUgaGVhdG1hcCDigJQgd2hpY2ggc3RhZ2VzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VGYWlsdXJlcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLnN0YWdlX25hbWUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgZmFpbHVyZV9wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGFnZV9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLnN0YWdlX25hbWUgT1JERVIgQlkgZmFpbHVyZXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFN0YWdlRmFpbHVyZT4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06c3RhZ2UtZmFpbHVyZXM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXN0aW5jdCBkZXBsb3kgYGVudmlyb25tZW50YCB2YWx1ZXMgb2JzZXJ2ZWQgaW4gdGhlIHdpbmRvdyDigJQgcG93ZXJzIHRoZVxuICAgKiBET1JBIGVudmlyb25tZW50LXNjb3BlIGRhdGFsaXN0LiBPcmctc2NvcGVkICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmdcbiAgICogcmVwb3J0czsgb25seSBub24tbnVsbCBlbnZpcm9ubWVudHMgKGkuZS4gZGVwbG95LWF0dHJpYnV0ZWQgZXhlY3V0aW9ucykuXG4gICAqL1xuICBhc3luYyBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUIERJU1RJTkNUIGUuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgT1JERVIgQlkgZW52aXJvbm1lbnRcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czx7IGVudmlyb25tZW50OiBzdHJpbmcgfT4oci5yb3dzKS5tYXAoKHJvdykgPT4gcm93LmVudmlyb25tZW50KSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06cmVwb3J0LWVudnM6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjYgU3RhZ2UgYm90dGxlbmVja3Mg4oCUIHNsb3dlc3Qgc3RhZ2VzIHBlciBwaXBlbGluZS4gKi9cbiAgYXN5bmMgZ2V0U3RhZ2VCb3R0bGVuZWNrcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxTdGFnZUJvdHRsZW5lY2tbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBwLmlkLCBwLnBpcGVsaW5lX25hbWUsIGUuc3RhZ2VfbmFtZSxcbiAgICAgICAgICBBVkcoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBhdmdfbXMsXG4gICAgICAgICAgTUFYKGUuZHVyYXRpb25fbXMpOjppbnQgQVMgbWF4X21zXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHAuaWQsIGUuc3RhZ2VfbmFtZSBPUkRFUiBCWSBhdmdfbXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFN0YWdlQm90dGxlbmVjaz4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06c3RhZ2UtYm90dGxlbmVja3M6JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAxLjcgQWN0aW9uIGZhaWx1cmUgcmF0ZSDigJQgd2hpY2ggcGx1Z2luIHN0ZXBzIGZhaWwgbW9zdC4gKi9cbiAgYXN5bmMgZ2V0QWN0aW9uRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uRmFpbHVyZVtdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuYWN0aW9uX25hbWUsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWx1cmVzLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdGQUlMRUQnKTo6bnVtZXJpY1xuICAgICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKTo6ZmxvYXQgQVMgZmFpbHVyZV9wY3RcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ0FDVElPTicgQU5EIGUuYWN0aW9uX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuYWN0aW9uX25hbWUgT1JERVIgQlkgZmFpbHVyZXMgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEFjdGlvbkZhaWx1cmU+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmFjdGlvbi1mYWlsdXJlczoke2Zyb219OiR7dG99YCwgbXVsdGksIGV4ZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuOCBFcnJvciBjYXRlZ29yaXphdGlvbiDigJQgZ3JvdXAgZmFpbHVyZSBtZXNzYWdlcy4gRXhlY3V0aW9uIHJlcG9ydCwgc29cbiAgICogcm9sbHVwLWF3YXJlIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyBleGVjdXRpb24gcmVwb3J0czogd2l0aCBgb3JnSWRzYFxuICAgKiAodGhlIG9yZ+KGknRlYW0gc3VidHJlZSkgdGhlIG9yZyBnYXRlIGJlY29tZXMgYW4gYElOICguLi4pYCBhbmQgdGhlIHJlYWQgcnVuc1xuICAgKiBmcmVzaCB1bmRlciBzeXNhZG1pbiB2aWEgYHJ1blJlcG9ydGA7IHNpbmdsZS1vcmcgcmVhZHMga2VlcCB0aGUgcGVyLW9yZyBjYWNoZS5cbiAgICovXG4gIGFzeW5jIGdldEVycm9ycyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSAyMCwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPEVycm9yRW50cnlbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBTVUJTVFJJTkcoZS5lcnJvcl9tZXNzYWdlIEZST00gMSBGT1IgMjAwKSBBUyBlcnJvcl9wYXR0ZXJuLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgb2NjdXJyZW5jZXMsXG4gICAgICAgICAgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBBUyBhZmZlY3RlZF9waXBlbGluZXMsXG4gICAgICAgICAgTUFYKGUuc3RhcnRlZF9hdCk6OnRleHQgQVMgbGFzdF9zZWVuXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuc3RhdHVzID0gJ0ZBSUxFRCcgQU5EIGUuZXJyb3JfbWVzc2FnZSBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBlLnN0YXJ0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuc3RhcnRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZXJyb3JfcGF0dGVybiBPUkRFUiBCWSBvY2N1cnJlbmNlcyBERVNDXG4gICAgICAgIExJTUlUICR7bGltaXR9XG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RXJyb3JFbnRyeT4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06ZXJyb3JzOiR7ZnJvbX06JHt0b306JHtsaW1pdH1gLCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKipcbiAgICogMS45IERPUkEgbWV0cmljcyBvdmVyIFtmcm9tLHRvXSAoc3RhcnRlZF9hdCByYW5nZSksIG9yZy1zY29wZWQgKyByb2xsdXAtYXdhcmUuXG4gICAqXG4gICAqIEFsbCBmb3VyIG1ldHJpY3MgZGVyaXZlIGZyb20gYSBwZXItZXhlY3V0aW9uIHJvbGwtdXAgb2YgVEVSTUlOQUwgUElQRUxJTkVcbiAgICogZXZlbnRzIChvbmUgcm93IHBlciBleGVjdXRpb25faWQrcGlwZWxpbmVfaWQ7IEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCxcbiAgICogdGhlbiBDQU5DRUxFRC9TVE9QUEVEIOKAlCBtaXJyb3JpbmcgYGxpc3RQaXBlbGluZUV4ZWN1dGlvbnNgKS4gVGhlIHNjYW4gaXNcbiAgICogZ2F0ZWQgYnkgdGhlIGBwLm9yZ19pZCAke3ByZWR9YCBqb2luIGV4YWN0bHkgbGlrZSB0aGUgc2libGluZyByZXBvcnRzLCBzbyBhXG4gICAqIHJvbGx1cCBwYXNzZXMgdGhlIG9yZ+KGknRlYW0gc3VidHJlZSBhbmQgYSBmb3JlaWduIG9yZydzIGV4ZWN1dGlvbnMgbmV2ZXJcbiAgICogZW50ZXIgdGhlIGFnZ3JlZ2F0ZS5cbiAgICpcbiAgICogREYvQ0ZSL2xlYWQtdGltZSBjb3VudCBvbmx5IENPUkUtd2luZG93IGV4ZWN1dGlvbnMgKFtmcm9tLHRvXSkuIE1UVFIgaXNcbiAgICogcGVyLUlOQ0lERU5UOiBjb25zZWN1dGl2ZSBmYWlsdXJlcyBjb2xsYXBzZSBpbnRvIG9uZSBpbmNpZGVudCBhbmQgdGhlXG4gICAqIHJlY292ZXJ5IGxvb2t1cCBtYXkgc2VlIHRoZSBuZXh0IHN1Y2Nlc3MgdXAgdG8gTVRUUl9SRVNUT1JFX0xPT0tBSEVBRCBwYXN0XG4gICAqIGB0b2AsIHNvIGEgZmFpbHVyZSBuZWFyIHRoZSBlZGdlIGlzbid0IHJpZ2h0LWNlbnNvcmVkIGludG8gXCJuZXZlciByZXN0b3JlZFwiLlxuICAgKiBUaGUgc2NhbiBib3VuZCBpcyB0aGVyZWZvcmUgYFtmcm9tLCB0byArIGxvb2stYWhlYWRdYDsgdGhlIHN0YXJ0ZWRfYXQgcmFuZ2VcbiAgICogc3RpbGwgcmlkZXMgdGhlIHNhbWUgaW5kZXggYXMgdGhlIHNpYmxpbmcgcmVwb3J0cy5cbiAgICpcbiAgICogRElTQ0xPU1VSRTogYnkgZGVmYXVsdCBERi9DRlIvTVRUUiBhcmUgUlVOLWJhc2VkIChhbnkgc3VjY2Vzc2Z1bCBQSVBFTElORVxuICAgKiBydW4gPSBhIFwiZGVwbG95bWVudFwiKSwgYW5kIExlYWQgVGltZSBpcyBhZGRpdGlvbmFsbHkgYSBydW4tdGltZSBQUk9YWVxuICAgKiBmbGFnZ2VkIGBhcHByb3g6IHRydWVgLiBQYXNzIGBlbnZpcm9ubWVudGAgb3IgYGRlcGxveXNPbmx5YCB0byBzY29wZSB0b1xuICAgKiBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIGEgcmVhbCBkZXBsb3kgdGFyZ2V0IOKAlCB0aGUgcmVzcG9uc2UgYGJhc2lzYCByZXBvcnRzXG4gICAqIHdoaWNoIHdhcyB1c2VkLiBTZWUgdGhlIERvcmFNZXRyaWNzIGRvYyArIGRvY3MvZG9yYS1tZXRyaWNzLm1kLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0cy5waXBlbGluZUlkICAgIHJlc3RyaWN0IHRvIG9uZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpXG4gICAqIEBwYXJhbSBvcHRzLmVudmlyb25tZW50ICAgY291bnQgb25seSBleGVjdXRpb25zIGRlcGxveWVkIHRvIHRoaXMgdGFyZ2V0XG4gICAqIEBwYXJhbSBvcHRzLmRlcGxveXNPbmx5ICAgY291bnQgb25seSBleGVjdXRpb25zIHRhZ2dlZCB3aXRoIEFOWSBlbnZpcm9ubWVudFxuICAgKi9cbiAgYXN5bmMgZ2V0RG9yYU1ldHJpY3MoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBmcm9tOiBzdHJpbmcsXG4gICAgdG86IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50LCBkZXBsb3lzT25seSB9ID0gb3B0cztcbiAgICAvLyBPcHRpb25hbCBkZXBsb3ktc2NvcGluZyAvIHBlci1waXBlbGluZSBwcmVkaWNhdGVzLCBmb2xkZWQgaW50byB0aGUgZXhlY3NcbiAgICAvLyBzY2FuIHNvIGZhaWx1cmVzIEFORCB0aGVpciByZWNvdmVyeSBzdWNjZXNzZXMgYXJlIGZpbHRlcmVkIGNvbnNpc3RlbnRseS5cbiAgICBjb25zdCB7IHBpcGVsaW5lQ2xhdXNlLCBkZXBsb3lDbGF1c2UsIGJhc2lzIH0gPSBkb3JhU2NvcGVDbGF1c2VzKG9wdHMpO1xuICAgIC8vIFNjYW4gdGhlIENPUkUgd2luZG93IHBsdXMgYSBsb29rLWFoZWFkIHRhaWw6IHRoZSBleHRyYSB0YWlsIGV4aXN0cyBvbmx5XG4gICAgLy8gc28gYSBsYXRlIGZhaWx1cmUgY2FuIHN0aWxsIGZpbmQgaXRzIHJlY292ZXJ5IChzZWUgdGhlIHJlc3RvcmUgQ1RFKS5cbiAgICBjb25zdCBleGVjcyA9IGV4ZWNzQ3RlKHtcbiAgICAgIHByZWQsXG4gICAgICBwaXBlbGluZUNsYXVzZSxcbiAgICAgIGRlcGxveUNsYXVzZSxcbiAgICAgIGZyb20sXG4gICAgICBjb2x1bW5zOiBzcWxgXG4gICAgICAgICAgICBlLnBpcGVsaW5lX2lkLFxuICAgICAgICAgICAgJHtET1JBX1RFUk1JTkFMX1NUQVRVU19DQVNFfSBBUyBzdGF0dXMsXG4gICAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBBUyBzdGFydGVkX2F0LFxuICAgICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBBUyBlbmRlZF9hdCxcbiAgICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBBUyBkdXJhdGlvbl9tc2AsXG4gICAgICB0b0JvdW5kOiBzcWxgJHt0b306OnRpbWVzdGFtcHR6ICsgJHtNVFRSX1JFU1RPUkVfTE9PS0FIRUFEfTo6aW50ZXJ2YWxgLFxuICAgIH0pO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgV0lUSCBleGVjcyBBUyAoJHtleGVjc31cbiAgICAgICAgKSxcbiAgICAgICAgLS0gQ29yZS13aW5kb3cgZXhlY3V0aW9ucyAoW2Zyb20sdG9dKTsgREYvQ0ZSL2xlYWQtdGltZSBjb3VudCBvbmx5IHRoZXNlLlxuICAgICAgICAtLSBUaGUgbG9vay1haGVhZCByb3dzIGFib3ZlIGFyZSB1c2VkIE9OTFkgYXMgTVRUUiByZWNvdmVyeSBjYW5kaWRhdGVzLlxuICAgICAgICBjb3JlIEFTIChcbiAgICAgICAgICBTRUxFQ1QgKiBGUk9NIGV4ZWNzIFdIRVJFIHN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgICksXG4gICAgICAgIGRmIEFTIChcbiAgICAgICAgICBTRUxFQ1QgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBkZXBsb3ltZW50c1xuICAgICAgICAgIEZST00gY29yZVxuICAgICAgICApLFxuICAgICAgICBjZnIgQVMgKFxuICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSk6OmludCBBUyB0b3RhbFxuICAgICAgICAgIEZST00gY29yZVxuICAgICAgICApLFxuICAgICAgICBsdCBBUyAoXG4gICAgICAgICAgU0VMRUNUXG4gICAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuNSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmZsb2F0IEFTIG1lZGlhbl9tc1xuICAgICAgICAgIEZST00gY29yZVxuICAgICAgICAgIFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnIEFORCBkdXJhdGlvbl9tcyBJUyBOT1QgTlVMTFxuICAgICAgICApLFxuICAgICAgICAtLSBGb3IgZWFjaCBjb3JlLXdpbmRvdyBmYWlsdXJlLCBmaW5kIHRoZSBFTkQgb2YgaXRzIHJlY292ZXJpbmcgcnVuOiB0aGVcbiAgICAgICAgLS0gbmV4dCBTVUNDRUVERUQgcnVuIG9mIHRoZSBzYW1lIHBpcGVsaW5lIHRoYXQgRU5ERUQgYWZ0ZXIgdGhpcyBmYWlsdXJlXG4gICAgICAgIC0tIGVuZGVkICh2aXNpYmxlIGludG8gdGhlIGxvb2stYWhlYWQgdGFpbCkuIFNFTEVDVCBhbmQgTUVBU1VSRSBib3RoIGtleVxuICAgICAgICAtLSBvZmYgZW5kZWRfYXQgc28gdGhleSBzdGF5IGNvbnNpc3RlbnQgLS0gdGhlIGluY2lkZW50IGdhcCBpc1xuICAgICAgICAtLSByZXN0b3JlZF9hdCAoc3VjY2VzcyBlbmQpIG1pbnVzIGluY2lkZW50X3N0YXJ0ZWQgKGZpcnN0IGZhaWx1cmUgZW5kKSxcbiAgICAgICAgLS0gc28gcGlja2luZyB0aGUgcmVjb3ZlcnkgYnkgZW5kZWRfYXQgKG5vdCBzdGFydGVkX2F0KSBydWxlcyBvdXQgdGhlXG4gICAgICAgIC0tIG5lZ2F0aXZlIGdhcCB0aGF0IGEgY29uY3VycmVudCBzdWNjZXNzIHdoaWNoIFNUQVJURUQgYWZ0ZXIgdGhlIGZhaWx1cmVcbiAgICAgICAgLS0gYnV0IEVOREVEIGJlZm9yZSBpdCB3b3VsZCBvdGhlcndpc2UgZm9sZCBpbnRvIEFWRy4gTWVhc3VyaW5nIGZyb20gdGhlXG4gICAgICAgIC0tIGZhaWx1cmUncyBFTkQgKG5vdCBzdGFydCkgYWxzbyBrZWVwcyB0aGUgZmFpbGVkIHJ1bidzIG93biBkdXJhdGlvbiBvdXRcbiAgICAgICAgLS0gb2YgcmVzdG9yZSB0aW1lLiBPcmRlcmluZyBieSBlbmRlZF9hdCBtYWtlcyB0aGUgaW5jaWRlbnQgY29sbGFwc2UgZmFsbFxuICAgICAgICAtLSBvdXQgbmF0dXJhbGx5OiBhIGdyZWVuIHJ1biBlbmRpbmcgYmV0d2VlbiB0d28gZmFpbHVyZXMgc3BsaXRzIHRoZW0uXG4gICAgICAgIHJlc3RvcmUgQVMgKFxuICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgZi5waXBlbGluZV9pZCxcbiAgICAgICAgICAgIGYuZW5kZWRfYXQgQVMgZmFpbF9lbmRlZCxcbiAgICAgICAgICAgIChTRUxFQ1Qgcy5lbmRlZF9hdCBGUk9NIGV4ZWNzIHNcbiAgICAgICAgICAgICAgV0hFUkUgcy5waXBlbGluZV9pZCA9IGYucGlwZWxpbmVfaWQgQU5EIHMuc3RhdHVzID0gJ1NVQ0NFRURFRCdcbiAgICAgICAgICAgICAgICBBTkQgcy5lbmRlZF9hdCA+IGYuZW5kZWRfYXRcbiAgICAgICAgICAgICAgT1JERVIgQlkgcy5lbmRlZF9hdCBBU0MgTElNSVQgMSkgQVMgcmVzdG9yZWRfYXRcbiAgICAgICAgICBGUk9NIGNvcmUgZlxuICAgICAgICAgIFdIRVJFIGYuc3RhdHVzID0gJ0ZBSUxFRCdcbiAgICAgICAgKSxcbiAgICAgICAgLS0gQ29sbGFwc2UgdG8gSU5DSURFTlRTOiBmYWlsdXJlcyBzaGFyaW5nIHRoZSBzYW1lIHJlY292ZXJ5IChpLmUuIHdpdGhcbiAgICAgICAgLS0gbm8gZ3JlZW4gcnVuIGJldHdlZW4gdGhlbSkgYXJlIG9uZSBpbmNpZGVudCwgc3RhcnRpbmcgYXQgdGhlIGZpcnN0XG4gICAgICAgIC0tIGZhaWx1cmUncyBlbmQuIFVucmVjb3ZlcmVkIGZhaWx1cmVzIHNoYXJlIHJlc3RvcmVkX2F0ID0gTlVMTCBhbmQgZm9ybVxuICAgICAgICAtLSB0aGUgc2luZ2xlIHRyYWlsaW5nIG9wZW4gaW5jaWRlbnQgcGVyIHBpcGVsaW5lLlxuICAgICAgICBpbmNpZGVudHMgQVMgKFxuICAgICAgICAgIFNFTEVDVCBwaXBlbGluZV9pZCwgcmVzdG9yZWRfYXQsIE1JTihmYWlsX2VuZGVkKSBBUyBpbmNpZGVudF9zdGFydGVkXG4gICAgICAgICAgRlJPTSByZXN0b3JlXG4gICAgICAgICAgR1JPVVAgQlkgcGlwZWxpbmVfaWQsIHJlc3RvcmVkX2F0XG4gICAgICAgICksXG4gICAgICAgIG10dHIgQVMgKFxuICAgICAgICAgIFNFTEVDVFxuICAgICAgICAgICAgQ09VTlQoKik6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgICAgIC0tIHJlc3RvcmVkIG11c3QgZXF1YWwgdGhlIGNvdW50IG9mIGluY2lkZW50cyB0aGF0IGFjdHVhbGx5XG4gICAgICAgICAgICAtLSBjb250cmlidXRlIHRvIGF2Z19zZWNvbmRzLiBHdWFyZCBvbiBpbmNpZGVudF9zdGFydGVkIHRvbzogYVxuICAgICAgICAgICAgLS0gZmFpbHVyZSB3aXRoIGEgTlVMTCBjb21wbGV0ZWRfYXQgeWllbGRzIGEgTlVMTCBpbmNpZGVudF9zdGFydGVkXG4gICAgICAgICAgICAtLSB0aGF0IGNvbnRyaWJ1dGVzIE5VTEwgKG5vdCBhIHJlYWwgZ2FwKSB0byBBVkcsIHNvIGl0IG11c3Qgbm90IGJlXG4gICAgICAgICAgICAtLSBjb3VudGVkIGFzIHJlc3RvcmVkIGVpdGhlciAtLSBvdGhlcndpc2UgcmVzdG9yZWQgY291bGQgZXhjZWVkXG4gICAgICAgICAgICAtLSB0aGUgbnVtYmVyIG9mIG1lYXN1cmVkIGluY2lkZW50cy5cbiAgICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoXG4gICAgICAgICAgICAgIFdIRVJFIHJlc3RvcmVkX2F0IElTIE5PVCBOVUxMIEFORCBpbmNpZGVudF9zdGFydGVkIElTIE5PVCBOVUxMXG4gICAgICAgICAgICApOjppbnQgQVMgcmVzdG9yZWQsXG4gICAgICAgICAgICBBVkcoRVhUUkFDVChFUE9DSCBGUk9NIChyZXN0b3JlZF9hdCAtIGluY2lkZW50X3N0YXJ0ZWQpKSlcbiAgICAgICAgICAgICAgRklMVEVSIChXSEVSRSByZXN0b3JlZF9hdCBJUyBOT1QgTlVMTCBBTkQgaW5jaWRlbnRfc3RhcnRlZCBJUyBOT1QgTlVMTCk6OmZsb2F0IEFTIGF2Z19zZWNvbmRzXG4gICAgICAgICAgRlJPTSBpbmNpZGVudHNcbiAgICAgICAgKVxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBkZi5kZXBsb3ltZW50cyBBUyBkZl9kZXBsb3ltZW50cyxcbiAgICAgICAgICBjZnIuZmFpbGVkIEFTIGNmcl9mYWlsZWQsXG4gICAgICAgICAgY2ZyLnRvdGFsIEFTIGNmcl90b3RhbCxcbiAgICAgICAgICBsdC5kZXBsb3ltZW50cyBBUyBsdF9kZXBsb3ltZW50cyxcbiAgICAgICAgICBsdC5tZWRpYW5fbXMgQVMgbHRfbWVkaWFuX21zLFxuICAgICAgICAgIG10dHIuZmFpbHVyZXMgQVMgbXR0cl9mYWlsdXJlcyxcbiAgICAgICAgICBtdHRyLnJlc3RvcmVkIEFTIG10dHJfcmVzdG9yZWQsXG4gICAgICAgICAgbXR0ci5hdmdfc2Vjb25kcyBBUyBtdHRyX2F2Z19zZWNvbmRzXG4gICAgICAgIEZST00gZGYsIGNmciwgbHQsIG10dHJcbiAgICAgIGApLnRoZW4ociA9PiB0aGlzLnNoYXBlRG9yYShkcml6emxlUm93czxEb3JhUm93PihyLnJvd3MpWzBdLCBmcm9tLCB0bywgYmFzaXMsIHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQgfSkpKTtcbiAgICAvLyBgZW52aXJvbm1lbnRgIFdJTlMgb3ZlciBgZGVwbG95c09ubHlgIGluIGRvcmFTY29wZUNsYXVzZXMsIHNvIHdpdGggYW5cbiAgICAvLyBlbnZpcm9ubWVudCBzZXQgdGhlIGRlcGxveXNPbmx5IGZsYWcgbmV2ZXIgYWZmZWN0cyB0aGUgU1FMIOKAlCBhcHBlbmQgdGhlXG4gICAgLy8gJ2QnIG1hcmtlciBvbmx5IHdoZW4gaXQgZ2VudWluZWx5IGNoYW5nZXMgdGhlIHF1ZXJ5IChlbnZpcm9ubWVudCBhYnNlbnQpLFxuICAgIC8vIG90aGVyd2lzZSBge2Vudmlyb25tZW50Oidwcm9kJywgZGVwbG95c09ubHk6dHJ1ZX1gIHdvdWxkIG1pbnQgYSByZWR1bmRhbnRcbiAgICAvLyBjYWNoZSBlbnRyeSBpZGVudGljYWwgdG8gYHtlbnZpcm9ubWVudDoncHJvZCd9YC5cbiAgICBjb25zdCBkZXBsb3lNYXJrZXIgPSAhZW52aXJvbm1lbnQgJiYgZGVwbG95c09ubHkgPyAnZCcgOiAnJztcbiAgICBjb25zdCBrZXkgPSBgJHtvcmdJZH06ZG9yYToke2Zyb219OiR7dG99OiR7cGlwZWxpbmVJZCA/PyAnJ306JHtlbnZpcm9ubWVudCA/PyAnJ306JHtkZXBsb3lNYXJrZXJ9YDtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG4gIH1cblxuICAvKiogU2hhcGUgYSBzaW5nbGUgRE9SQSBhZ2dyZWdhdGUgcm93IGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9LiAqL1xuICBwcml2YXRlIHNoYXBlRG9yYShcbiAgICByb3c6IERvcmFSb3cgfCB1bmRlZmluZWQsXG4gICAgZnJvbTogc3RyaW5nLFxuICAgIHRvOiBzdHJpbmcsXG4gICAgYmFzaXM6IERvcmFNZXRyaWNzWydiYXNpcyddLFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZD86IHN0cmluZzsgZW52aXJvbm1lbnQ/OiBzdHJpbmcgfSxcbiAgKTogRG9yYU1ldHJpY3Mge1xuICAgIC8vIGBGUk9NIGRmLCBjZnIsIGx0LCBtdHRyYCBhbHdheXMgeWllbGRzIGV4YWN0bHkgb25lIHJvdyAoZWFjaCBDVEUgaXMgYVxuICAgIC8vIHNpbmdsZS1yb3cgYWdncmVnYXRlKSwgYnV0IGd1YXJkIGFnYWluc3QgYW4gZW1wdHkgcmVzdWx0IGRlZmVuc2l2ZWx5LlxuICAgIGNvbnN0IHI6IERvcmFSb3cgPSByb3cgPz8ge307XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IE51bWJlcihyLmRmX2RlcGxveW1lbnRzKSB8fCAwO1xuICAgIC8vIEZsb29yIHRoZSBkaXZpc29yIGF0IG9uZSBkYXk6IGEgd2luZG93IHNob3J0ZXIgdGhhbiBhIGRheSAoaW5jbC4gdGhlXG4gICAgLy8gZGVnZW5lcmF0ZSBmcm9tPT10bykgaGFzIG5vIG1lYW5pbmdmdWwgc3ViLWRheSByYXRlLCBzbyBpdCdzIHRyZWF0ZWQgYXMgYVxuICAgIC8vIHNpbmdsZSBkYXkgcmF0aGVyIHRoYW4gZXh0cmFwb2xhdGVkIG9yIG1pc2xhYmVsZWQgYXMgYSByYXcgY291bnQuXG4gICAgLy8gRmxvb3IgYXQgb25lIGRheSBhbmQgZ3VhcmQgYWdhaW5zdCB1bnBhcnNlYWJsZSBkYXRlcyAoRGF0ZS5wYXJzZSDihpIgTmFOLFxuICAgIC8vIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBwcm9wYWdhdGUgdGhyb3VnaCBwZXJEYXkpLiBGYWxscyBiYWNrIHRvIGEgMS1kYXlcbiAgICAvLyB3aW5kb3cgc28gYSBiYWQgcmFuZ2UgeWllbGRzIHRoZSByYXcgY291bnQgYXMgdGhlIHJhdGUsIG5ldmVyIE5hTi5cbiAgICBjb25zdCBzcGFuRGF5cyA9IChEYXRlLnBhcnNlKHRvKSAtIERhdGUucGFyc2UoZnJvbSkpIC8gODY0MDAwMDA7XG4gICAgY29uc3QgZGF5cyA9IE51bWJlci5pc0Zpbml0ZShzcGFuRGF5cykgPyBNYXRoLm1heChzcGFuRGF5cywgMSkgOiAxO1xuICAgIC8vIEJhbmQgb24gdGhlIFVOUk9VTkRFRCByYXRlOyByb3VuZCBvbmx5IGZvciBkaXNwbGF5LiBSb3VuZGluZyBmaXJzdCB3b3VsZFxuICAgIC8vIG1pc2xhYmVsIGV4YWN0IHdlZWtseS9tb250aGx5IGJvdW5kYXJpZXMgKGUuZy4gMSBkZXBsb3kgLyAzMCBkYXlzIOKGklxuICAgIC8vIDAuMDMzMyByb3VuZHMgdG8gMC4wMyA8IDEvMzAg4oaSIHdyb25nbHkgXCJsb3dcIiBpbnN0ZWFkIG9mIFwibWVkaXVtXCIpLlxuICAgIGNvbnN0IHJhd1BlckRheSA9IGRlcGxveW1lbnRzIC8gZGF5cztcbiAgICBjb25zdCBwZXJEYXkgPSByb3VuZChyYXdQZXJEYXksIDIpO1xuXG4gICAgY29uc3QgZmFpbGVkID0gTnVtYmVyKHIuY2ZyX2ZhaWxlZCkgfHwgMDtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihyLmNmcl90b3RhbCkgfHwgMDtcbiAgICBjb25zdCByYXdQY3QgPSB0b3RhbCA+IDAgPyAoZmFpbGVkIC8gdG90YWwpICogMTAwIDogMDtcbiAgICBjb25zdCBwY3QgPSByb3VuZChyYXdQY3QsIDEpO1xuXG4gICAgLy8gQmFuZCByZXN0b3JlL2xlYWQtdGltZSBvbiB0aGUgUkFXIChwcmUtcm91bmQpIHNlY29uZHMsIHRoZSBzYW1lIFwiYmFuZCBvblxuICAgIC8vIHRoZSB1bnJvdW5kZWQgdmFsdWVcIiBwcmluY2lwbGUgdXNlZCBmb3IgcGVyRGF5L3BjdCBhYm92ZTsga2VlcCB0aGUgcm91bmRlZFxuICAgIC8vIHZhbHVlcyBmb3IgdGhlIHJlc3BvbnNlIGZpZWxkcy4gSW1tYXRlcmlhbCBhdCB0aGUgaG91ci9kYXkgdGhyZXNob2xkcywgYnV0XG4gICAgLy8gaXQgbWFrZXMgdGhlIHByaW5jaXBsZSB1bmlmb3JtIGFjcm9zcyBhbGwgZm91ciBtZXRyaWNzLlxuICAgIGNvbnN0IGZhaWx1cmVzID0gTnVtYmVyKHIubXR0cl9mYWlsdXJlcykgfHwgMDtcbiAgICBjb25zdCByZXN0b3JlZCA9IE51bWJlcihyLm10dHJfcmVzdG9yZWQpIHx8IDA7XG4gICAgY29uc3QgcmF3QXZnU2Vjb25kcyA9IGZhaWx1cmVzID4gMCAmJiByLm10dHJfYXZnX3NlY29uZHMgIT0gbnVsbFxuICAgICAgPyBOdW1iZXIoci5tdHRyX2F2Z19zZWNvbmRzKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGF2Z1NlY29uZHMgPSByYXdBdmdTZWNvbmRzICE9IG51bGwgPyByb3VuZChyYXdBdmdTZWNvbmRzLCAxKSA6IG51bGw7XG5cbiAgICBjb25zdCBsdERlcGxveW1lbnRzID0gTnVtYmVyKHIubHRfZGVwbG95bWVudHMpIHx8IDA7XG4gICAgY29uc3QgcmF3TWVkaWFuU2Vjb25kcyA9IHIubHRfbWVkaWFuX21zICE9IG51bGxcbiAgICAgID8gTnVtYmVyKHIubHRfbWVkaWFuX21zKSAvIDEwMDBcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBtZWRpYW5TZWNvbmRzID0gcmF3TWVkaWFuU2Vjb25kcyAhPSBudWxsID8gcm91bmQocmF3TWVkaWFuU2Vjb25kcywgMSkgOiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpbmRvdzogeyBmcm9tLCB0byB9LFxuICAgICAgYmFzaXMsXG4gICAgICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IGZpbHRlcnMucGlwZWxpbmVJZCA/PyBudWxsLCBlbnZpcm9ubWVudDogZmlsdGVycy5lbnZpcm9ubWVudCA/PyBudWxsIH0sXG4gICAgICBkZXBsb3ltZW50RnJlcXVlbmN5OiB7IGRlcGxveW1lbnRzLCBwZXJEYXksIGxldmVsOiBkb3JhTGV2ZWxGb3JGcmVxdWVuY3kocmF3UGVyRGF5LCBkZXBsb3ltZW50cykgfSxcbiAgICAgIGNoYW5nZUZhaWx1cmVSYXRlOiB7IGZhaWxlZCwgdG90YWwsIHBjdCwgbGV2ZWw6IGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocmF3UGN0LCB0b3RhbCkgfSxcbiAgICAgIG1lYW5UaW1lVG9SZXN0b3JlOiB7IGZhaWx1cmVzLCByZXN0b3JlZCwgYXZnU2Vjb25kcywgbGV2ZWw6IGRvcmFMZXZlbEZvclJlc3RvcmUocmF3QXZnU2Vjb25kcykgfSxcbiAgICAgIGxlYWRUaW1lOiB7IGRlcGxveW1lbnRzOiBsdERlcGxveW1lbnRzLCBtZWRpYW5TZWNvbmRzLCBhcHByb3g6IHRydWUsIGxldmVsOiBkb3JhTGV2ZWxGb3JMZWFkVGltZShyYXdNZWRpYW5TZWNvbmRzKSB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogMS45YiBET1JBIHRyZW5kIOKAlCBkZXBsb3ltZW50IGZyZXF1ZW5jeSArIGNoYW5nZS1mYWlsdXJlIHJhdGUgYnVja2V0ZWQgYnlcbiAgICogYGludGVydmFsYCAoZGF5L3dlZWsvbW9udGgpIGZvciBhIHNwYXJrbGluZS4gUGVyLWV4ZWN1dGlvbiByb2xsdXAgKG9uZSByb3dcbiAgICogcGVyIGV4ZWN1dGlvbiwgRkFJTEVEIHdpbnMpIGJ1Y2tldGVkIG9uIHRoZSBleGVjdXRpb24ncyBzdGFydGVkX2F0LiBTaGFyZXNcbiAgICogdGhlIGBnZXREb3JhTWV0cmljc2Agc2NvcGluZyAob3JnL3JvbGx1cCwgcGlwZWxpbmVJZCwgZGVwbG95LXNjb3BpbmcpOyBNVFRSXG4gICAqIGFuZCBsZWFkIHRpbWUgYXJlIGludGVudGlvbmFsbHkgb21pdHRlZCAodG9vIGhlYXZ5IHRvIGJ1Y2tldCBtZWFuaW5nZnVsbHkpLlxuICAgKi9cbiAgYXN5bmMgZ2V0RG9yYVRyZW5kKFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgaW50ZXJ2YWw6IHN0cmluZyxcbiAgICBmcm9tOiBzdHJpbmcsXG4gICAgdG86IHN0cmluZyxcbiAgICBvcmdJZHM/OiBzdHJpbmdbXSxcbiAgICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPERvcmFUcmVuZFBvaW50W10+IHtcbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQsIGRlcGxveXNPbmx5IH0gPSBvcHRzO1xuICAgIGNvbnN0IHsgcGlwZWxpbmVDbGF1c2UsIGRlcGxveUNsYXVzZSB9ID0gZG9yYVNjb3BlQ2xhdXNlcyhvcHRzKTtcbiAgICAvLyBTYW1lIGV4ZWNzIHJvbGwtdXAgYXMgZ2V0RG9yYU1ldHJpY3MgKHNoYXJlZCBidWlsZGVyIOKAlCBzdGF0dXMgc2V0ICtcbiAgICAvLyBwcmVkaWNhdGUgY2FuJ3QgZHJpZnQpOyB0aGUgdHJlbmQgbmVlZHMgb25seSBzdGFydGVkX2F0IG92ZXIgdGhlIGNvcmVcbiAgICAvLyB3aW5kb3cgKG5vIE1UVFIgbG9vay1haGVhZCwgbm8gZW5kZWRfYXQvZHVyYXRpb24gY29sdW1ucykuXG4gICAgY29uc3QgZXhlY3MgPSBleGVjc0N0ZSh7XG4gICAgICBwcmVkLFxuICAgICAgcGlwZWxpbmVDbGF1c2UsXG4gICAgICBkZXBsb3lDbGF1c2UsXG4gICAgICBmcm9tLFxuICAgICAgY29sdW1uczogc3FsYFxuICAgICAgICAgICAgJHtET1JBX1RFUk1JTkFMX1NUQVRVU19DQVNFfSBBUyBzdGF0dXMsXG4gICAgICAgICAgICBNSU4oZS5zdGFydGVkX2F0KSBBUyBzdGFydGVkX2F0YCxcbiAgICAgIHRvQm91bmQ6IHNxbGAke3RvfTo6dGltZXN0YW1wdHpgLFxuICAgIH0pO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgV0lUSCBleGVjcyBBUyAoJHtleGVjc31cbiAgICAgICAgKVxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBzdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBkZXBsb3ltZW50cyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSk6OmludCBBUyB0b3RhbCxcbiAgICAgICAgICAtLSBxdW90ZWQgYWxpYXMgc28gdGhlIHJhdyByb3cga2V5IGlzIGV4YWN0bHkgdGhlIERvcmFUcmVuZFBvaW50IGZpZWxkXG4gICAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKSwgMCkgKiAxMDAsIDEpLCAwKTo6ZmxvYXQgQVMgXCJjaGFuZ2VGYWlsdXJlUGN0XCJcbiAgICAgICAgRlJPTSBleGVjc1xuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RG9yYVRyZW5kUG9pbnQ+KHIucm93cykpKTtcbiAgICAvLyBPbWl0IHRoZSBkZXBsb3lzT25seSBtYXJrZXIgd2hlbiBlbnZpcm9ubWVudCBpcyBzZXQ6IGl0IHdpbnMgaW5cbiAgICAvLyBkb3JhU2NvcGVDbGF1c2VzLCBzbyB0aGUgU1FMIChhbmQgdGh1cyB0aGUgY29ycmVjdCBjYWNoZSBrZXkpIGlzIGlkZW50aWNhbFxuICAgIC8vIHRvIHRoZSBlbnZpcm9ubWVudC1vbmx5IGNhc2UuIE9ubHkgYXBwZW5kICdkJyB3aGVuIGl0IGNoYW5nZXMgdGhlIHF1ZXJ5LlxuICAgIGNvbnN0IGRlcGxveU1hcmtlciA9ICFlbnZpcm9ubWVudCAmJiBkZXBsb3lzT25seSA/ICdkJyA6ICcnO1xuICAgIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfToke2RlcGxveU1hcmtlcn1gO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYXRlZ29yeSAyOiBQbHVnaW4gSW52ZW50b3J5ICYgQnVpbGRzIOKUgOKUgFxuXG4gIC8qKiAyLjEgUGx1Z2luIHN1bW1hcnkg4oCUIGNvdW50cyBhbmQgYnJlYWtkb3ducy5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBhbiBvcmctb3duZWRcbiAgICogIGFzc2V0IGNvdW50LCBub3QgYW4gZXhlY3V0aW9uL2J1aWxkIGFjdGl2aXR5IHJlcG9ydCwgc28gYSBwYXJlbnQncyB2aWV3IGlzXG4gICAqICBpdHMgb3duIHBsdWdpbnMg4oCUIHRlYW1zIG1hbmFnZSB0aGVpciBvd24gaW52ZW50b3J5LiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblN1bW1hcnkob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8UGx1Z2luU3VtbWFyeT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLXN1bW1hcnlgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgdG90YWwsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGFjdGl2ZSxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIE5PVCAke3NjaGVtYS5wbHVnaW4uaXNBY3RpdmV9KTo6aW50IEFTIGluYWN0aXZlLFxuICAgICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgJHtzY2hlbWEucGx1Z2luLmFjY2Vzc01vZGlmaWVyfSA9ICdwdWJsaWMnKTo6aW50IEFTIHB1YmxpYyxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFICR7c2NoZW1hLnBsdWdpbi5hY2Nlc3NNb2RpZmllcn0gPSAncHJpdmF0ZScpOjppbnQgQVMgcHJpdmF0ZSxcbiAgICAgICAgICBDT1VOVChESVNUSU5DVCAke3NjaGVtYS5wbHVnaW4ubmFtZX0pOjppbnQgQVMgdW5pcXVlX25hbWVzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGx1Z2lufVxuICAgICAgICBXSEVSRSAke3NjaGVtYS5wbHVnaW4ub3JnSWR9ID0gJHtvcmdJZH1cbiAgICAgIGApKTtcbiAgICAgIHJldHVybiAoZHJpenpsZVJvd3M8UGx1Z2luU3VtbWFyeT4ocm93cy5yb3dzKVswXSB8fCB7IHRvdGFsOiAwLCBhY3RpdmU6IDAsIGluYWN0aXZlOiAwLCBwdWJsaWM6IDAsIHByaXZhdGU6IDAsIHVuaXF1ZU5hbWVzOiAwIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIDIuMiBUeXBlICYgY29tcHV0ZSBkaXN0cmlidXRpb24uXG4gICAqICBJTlRFTlRJT05BTExZIFNJTkdMRS1PUkcgKG5vIHJvbGx1cCk6IHBsdWdpbiBpbnZlbnRvcnkgaXMgcGVyLW9yZyAoc2VlXG4gICAqICBnZXRQbHVnaW5TdW1tYXJ5KS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuICBhc3luYyBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8VHlwZUNvbXB1dGVEaXN0cmlidXRpb25bXT4ge1xuICAgIHJldHVybiBpbnZlbnRvcnlDYWNoZS5nZXRPclNldChgJHtvcmdJZH06cGx1Z2luLWRpc3RyaWJ1dGlvbmAsICgpID0+XG4gICAgICB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9IEFTIHBsdWdpbl90eXBlLFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5jb21wdXRlVHlwZX0gQVMgY29tcHV0ZV90eXBlLFxuICAgICAgICAgIENPVU5UKCopOjppbnQgQVMgY291bnRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLnBsdWdpblR5cGV9LCAke3NjaGVtYS5wbHVnaW4uY29tcHV0ZVR5cGV9XG4gICAgICAgIE9SREVSIEJZIGNvdW50IERFU0NcbiAgICAgIGApLnRoZW4ociA9PiBkcml6emxlUm93czxUeXBlQ29tcHV0ZURpc3RyaWJ1dGlvbj4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKiogMi4zIFZlcnNpb24gY291bnRzIHBlciBwbHVnaW4gbmFtZS5cbiAgICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBwZXItb3JnIChzZWVcbiAgICogIGdldFBsdWdpblN1bW1hcnkpLiBTaW5nbGUgYD0gJG9yZ2Agc2NvcGUuICovXG4gIGFzeW5jIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFZlcnNpb25Db3VudFtdPiB7XG4gICAgcmV0dXJuIGludmVudG9yeUNhY2hlLmdldE9yU2V0KGAke29yZ0lkfTpwbHVnaW4tdmVyc2lvbnNgLCAoKSA9PlxuICAgICAgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7c2NoZW1hLnBsdWdpbi5uYW1lfSxcbiAgICAgICAgICBDT1VOVCgqKTo6aW50IEFTIHZlcnNpb25fY291bnQsXG4gICAgICAgICAgTUFYKCR7c2NoZW1hLnBsdWdpbi52ZXJzaW9ufSkgQVMgbGF0ZXN0X3ZlcnNpb24sXG4gICAgICAgICAgYm9vbF9vcigke3NjaGVtYS5wbHVnaW4uaXNEZWZhdWx0fSkgQVMgaGFzX2RlZmF1bHRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5wbHVnaW59XG4gICAgICAgIFdIRVJFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gPSAke29yZ0lkfSBBTkQgJHtzY2hlbWEucGx1Z2luLmlzQWN0aXZlfSA9IHRydWVcbiAgICAgICAgR1JPVVAgQlkgJHtzY2hlbWEucGx1Z2luLm5hbWV9XG4gICAgICAgIE9SREVSIEJZIHZlcnNpb25fY291bnQgREVTQ1xuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFZlcnNpb25Db3VudD4oci5yb3dzKSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogMi40IEJ1aWxkIHN1Y2Nlc3MgcmF0ZSBvdmVyIHRpbWUuXG4gICAqXG4gICAqIFNUQVRVUyBDQVNJTkcgTk9URTogVGhpcyBxdWVyeSBmaWx0ZXJzIGJ5IGBldmVudF9zb3VyY2UgPSAncGx1Z2luLWJ1aWxkJ2BcbiAgICogYW5kIHVzZXMgbG93ZXJjYXNlIHN0YXR1cyB2YWx1ZXMgKGAnY29tcGxldGVkJ2AsIGAnZmFpbGVkJ2ApLCB3aGlsZVxuICAgKiBgZ2V0U3VjY2Vzc1JhdGVgICgxLjIpIGZpbHRlcnMgYnkgYGV2ZW50X3R5cGUgPSAnUElQRUxJTkUnYCB3aXRoXG4gICAqIHVwcGVyY2FzZSBBV1Mtc3R5bGUgc3RhdHVzZXMgKGAnU1VDQ0VFREVEJ2AsIGAnRkFJTEVEJ2AsIGAnQ0FOQ0VMRUQnYCkuXG4gICAqIFRoZSBjYXNpbmcgZHJpZnQgaXMgaW50ZW50aW9uYWwgYW5kIHRyYWNrcyB0aGUgcHJvZHVjZXI6XG4gICAqICAgLSBgcGx1Z2luLWJ1aWxkYCBldmVudHMgY29tZSBmcm9tIG91ciBvd24gYnVpbGQgcGlwZWxpbmUgKGxvd2VyY2FzZSlcbiAgICogICAtIGBQSVBFTElORWAgZXZlbnRzIGNvbWUgZnJvbSBBV1MgQ29kZVBpcGVsaW5lICh1cHBlcmNhc2UpXG4gICAqIFRoZSBpbmdlc3QgWm9kIHNjaGVtYSBhdCBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzXG4gICAqIFNIT1VMRCBlbnVtIHRoZXNlIHBlci1ldmVudFNvdXJjZSBzbyB3ZSBjYXRjaCBkcmlmdCBhdCBpbmdlc3QgcmF0aGVyXG4gICAqIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIHplcm8gcm93cyBoZXJlLiBTZWUgZmluZGluZ3MgTjcxLlxuICAgKi9cbiAgYXN5bmMgZ2V0QnVpbGRTdWNjZXNzUmF0ZShvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZFRpbWVTZXJpZXNFbnRyeVtdPiB7XG4gICAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIC8vIEJ1aWxkIGFjdGl2aXR5IHJlcG9ydCDigJQgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIGV4ZWN1dGlvbiByZXBvcnRzLiBUaGVzZVxuICAgIC8vIHJvd3MgYXJlIGdhdGVkIG9uIHRoZSBwaXBlbGluZV9ldmVudCBgb3JnX2lkYCBkaXJlY3RseSAobm8gcGlwZWxpbmUgam9pbiksXG4gICAgLy8gc28gYHByZWRgIGFwcGxpZXMgdG8gYGUub3JnX2lkYC5cbiAgICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSB0aGlzLm9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICAgIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgREFURV9UUlVOQygke2ludGVydmFsfSwgZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBwZXJpb2QsXG4gICAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBlLnN0YXR1cyA9ICdjb21wbGV0ZWQnKTo6aW50IEFTIHN1Y2NlZWRlZCxcbiAgICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIGUuc3RhdHVzID0gJ2ZhaWxlZCcpOjppbnQgQVMgZmFpbGVkLFxuICAgICAgICAgIFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgZS5zdGF0dXMgPSAnY29tcGxldGVkJyk6Om51bWVyaWNcbiAgICAgICAgICAgIC8gTlVMTElGKENPVU5UKCopLCAwKSAqIDEwMCwgMSk6OmZsb2F0IEFTIHN1Y2Nlc3NfcGN0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBXSEVSRSBlLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3NvdXJjZSA9ICdwbHVnaW4tYnVpbGQnXG4gICAgICAgICAgQU5EIGUuc3RhdHVzIElOICgnY29tcGxldGVkJywgJ2ZhaWxlZCcpXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGRUaW1lU2VyaWVzRW50cnk+KHIucm93cykpKTtcbiAgICByZXR1cm4gdGhpcy5ydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLXN1Y2Nlc3M6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAyLjUgQnVpbGQgZHVyYXRpb24gcGVyIHBsdWdpbi4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8QnVpbGREdXJhdGlvbltdPiB7XG4gICAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gdGhpcy5vcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguZXhlY3V0ZShzcWxgXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgIGUuZGV0YWlsLT4+J3BsdWdpbk5hbWUnIEFTIHBsdWdpbl9uYW1lLFxuICAgICAgICAgIEFWRyhlLmR1cmF0aW9uX21zKTo6aW50IEFTIGF2Z19tcyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcyk6OmludCBBUyBtYXhfbXMsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBidWlsZHNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuZHVyYXRpb25fbXMgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lIE9SREVSIEJZIGF2Z19tcyBERVNDXG4gICAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8QnVpbGREdXJhdGlvbj4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtZHVyYXRpb246JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbiAgfVxuXG4gIC8qKiAyLjYgQnVpbGQgZmFpbHVyZXMg4oCUIHRvcCBlcnJvciBtZXNzYWdlcy4gQnVpbGQgYWN0aXZpdHkgcmVwb3J0IOKAlCByb2xsdXAtYXdhcmUuICovXG4gIGFzeW5jIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gMjAsIG9yZ0lkcz86IHN0cmluZ1tdKTogUHJvbWlzZTxCdWlsZEZhaWx1cmVbXT4ge1xuICAgIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IHRoaXMub3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gICAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmRldGFpbC0+PidwbHVnaW5OYW1lJyBBUyBwbHVnaW5fbmFtZSxcbiAgICAgICAgICBlLmVycm9yX21lc3NhZ2UsXG4gICAgICAgICAgQ09VTlQoKik6OmludCBBUyBvY2N1cnJlbmNlcyxcbiAgICAgICAgICBNQVgoZS5zdGFydGVkX2F0KTo6dGV4dCBBUyBsYXN0X3NlZW5cbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIFdIRVJFIGUub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfc291cmNlID0gJ3BsdWdpbi1idWlsZCcgQU5EIGUuc3RhdHVzID0gJ2ZhaWxlZCdcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIHBsdWdpbl9uYW1lLCBlLmVycm9yX21lc3NhZ2VcbiAgICAgICAgT1JERVIgQlkgb2NjdXJyZW5jZXMgREVTQ1xuICAgICAgICBMSU1JVCAke2xpbWl0fVxuICAgICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPEJ1aWxkRmFpbHVyZT4oci5yb3dzKSkpO1xuICAgIHJldHVybiB0aGlzLnJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtZmFpbHVyZXM6JHtmcm9tfToke3RvfToke2xpbWl0fWAsIG11bHRpLCBleGVjKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVwb3J0aW5nU2VydmljZSA9IG5ldyBSZXBvcnRpbmdTZXJ2aWNlKCk7XG4iXX0=
package/package.json CHANGED
@@ -80,7 +80,7 @@
80
80
  "access": "public",
81
81
  "registry": "https://registry.npmjs.org/"
82
82
  },
83
- "version": "3.4.99",
83
+ "version": "3.4.100",
84
84
  "bugs": {
85
85
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
86
86
  },