@workflow/builders 5.0.0-beta.44 → 5.0.0-beta.46

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.
@@ -15,6 +15,7 @@ import { applySwcTransform, } from './apply-swc-transform.js';
15
15
  import { createWorkflowEntrypointOptionsCode, createWorkflowRouteHandlersCode, } from './constants.js';
16
16
  import { getEsbuildTsconfigOptions } from './esbuild-tsconfig.js';
17
17
  import { fastDiscoverEntries, } from './fast-discovery.js';
18
+ import { hashManifestSource, mergeWorkflowManifest, } from './manifest-ids.js';
18
19
  import { getImportPath, resolveModuleSpecifier, stripPackageVersion, } from './module-specifier.js';
19
20
  import { createNodeModuleErrorPlugin } from './node-module-esbuild-plugin.js';
20
21
  import { createPseudoPackagePlugin } from './pseudo-package-esbuild-plugin.js';
@@ -131,40 +132,6 @@ function moduleIdentityKey(file, moduleSpecifierRoot) {
131
132
  }
132
133
  return file.replace(/\\/g, '/');
133
134
  }
134
- function formatIdLocation(location) {
135
- return `${location.filePath}#${location.name}`;
136
- }
137
- function assertUniqueManifestIds(entriesByFile, ids, getId, label) {
138
- for (const [filePath, entries] of Object.entries(entriesByFile || {})) {
139
- for (const [name, data] of Object.entries(entries)) {
140
- const id = getId(data);
141
- const existing = ids.get(id);
142
- const current = { filePath, name };
143
- if (existing &&
144
- (existing.filePath !== current.filePath ||
145
- existing.name !== current.name)) {
146
- const idName = label === 'step' ? 'workflow step ID' : 'workflow ID';
147
- const functionName = `${label} function`;
148
- const capitalizedLabel = label === 'step' ? 'Step' : 'Workflow';
149
- throw new WorkflowBuildError(`Duplicate ${idName} "${id}" generated for ${formatIdLocation(existing)} and ${formatIdLocation(current)}.`, {
150
- hint: `${capitalizedLabel} IDs must be unique across a build. ` +
151
- `If you own one of the colliding files, rename the ${functionName} or export ` +
152
- `the package file through a unique package subpath. If the collision is in a ` +
153
- `transitive dependency you don't control, file an issue with the upstream ` +
154
- `package or pin to a non-colliding version.`,
155
- });
156
- }
157
- ids.set(id, current);
158
- }
159
- }
160
- }
161
- function mergeWorkflowManifest(target, incoming, stepIds, workflowIds) {
162
- assertUniqueManifestIds(incoming.steps, stepIds, (data) => data.stepId, 'step');
163
- assertUniqueManifestIds(incoming.workflows, workflowIds, (data) => data.workflowId, 'workflow');
164
- target.workflows = Object.assign(target.workflows || {}, incoming.workflows);
165
- target.steps = Object.assign(target.steps || {}, incoming.steps);
166
- target.classes = Object.assign(target.classes || {}, incoming.classes);
167
- }
168
135
  /**
169
136
  * Base class for workflow builders. Provides common build logic for transforming
170
137
  * workflow source files into deployable bundles using esbuild and SWC.
@@ -583,17 +550,19 @@ export class BaseBuilder {
583
550
  if (cached &&
584
551
  cached.size === stats.size &&
585
552
  cached.mtimeMs === stats.mtimeMs) {
586
- return cached.manifest;
553
+ return { manifest: cached.manifest, contentHash: cached.contentHash };
587
554
  }
588
555
  const source = await readFile(file, 'utf8');
589
556
  const relativeFilepath = this.getRelativeFilepath(file);
590
557
  const { workflowManifest } = await applySwcTransform(relativeFilepath, source, mode, file, this.transformProjectRoot, this.moduleSpecifierRoot);
558
+ const contentHash = hashManifestSource(source);
591
559
  this.manifestTransformCache.set(cacheKey, {
592
560
  size: stats.size,
593
561
  mtimeMs: stats.mtimeMs,
594
562
  manifest: workflowManifest,
563
+ contentHash,
595
564
  });
596
- return workflowManifest;
565
+ return { manifest: workflowManifest, contentHash };
597
566
  }
598
567
  createRouteImportSpecifier(file, routeDir) {
599
568
  const { importPath, isPackage } = getImportPath(file, this.config.workingDir);
@@ -662,8 +631,8 @@ export const __steps_registered = true;
662
631
  const stepIds = new Map();
663
632
  const workflowIds = new Map();
664
633
  await Promise.all(manifestFiles.map(async (file) => {
665
- const fileManifest = await this.getCachedManifestTransform(file, 'step');
666
- mergeWorkflowManifest(workflowManifest, fileManifest, stepIds, workflowIds);
634
+ const { manifest: fileManifest, contentHash } = await this.getCachedManifestTransform(file, 'step');
635
+ mergeWorkflowManifest(workflowManifest, fileManifest, stepIds, workflowIds, contentHash);
667
636
  }));
668
637
  await this.ensureSwcIgnored();
669
638
  this.logBaseBuilderInfo('Created step registrations', `${Date.now() - stepsBundleStart}ms`);
@@ -896,7 +865,7 @@ export const __steps_registered = true;
896
865
  const workflowOnlyFiles = workflowFiles.filter((f) => !stepFiles.includes(f));
897
866
  await Promise.all(workflowOnlyFiles.map(async (workflowFile) => {
898
867
  try {
899
- const fileManifest = await this.getCachedManifestTransform(workflowFile, 'workflow');
868
+ const { manifest: fileManifest } = await this.getCachedManifestTransform(workflowFile, 'workflow');
900
869
  if (fileManifest.workflows) {
901
870
  workflowManifest.workflows = Object.assign(workflowManifest.workflows || {}, fileManifest.workflows);
902
871
  }
@@ -922,7 +891,7 @@ export const __steps_registered = true;
922
891
  *
923
892
  * @param bundleFinalOutput - If false, skips the final bundling step (used by Next.js)
924
893
  */
925
- async createWorkflowsBundle({ inputFiles, format = 'esm', outfile, bundleFinalOutput = true, keepInterimBundleContext = this.config.watch, tsconfigPath, discoveredEntries, }) {
894
+ async createWorkflowsBundle({ inputFiles, format = 'esm', outfile, bundleFinalOutput = true, keepInterimBundleContext = this.config.watch, includeMetafile = false, tsconfigPath, discoveredEntries, }) {
926
895
  const discovered = discoveredEntries ??
927
896
  (await this.discoverEntries(inputFiles, dirname(outfile), tsconfigPath));
928
897
  const workflowFiles = [...discovered.discoveredWorkflows].sort();
@@ -1009,6 +978,7 @@ export const __steps_registered = true;
1009
978
  treeShaking: true,
1010
979
  keepNames: true,
1011
980
  minify: false,
981
+ metafile: includeMetafile,
1012
982
  // Initialize the workflow registry at the beginning of the bundle
1013
983
  // This must be in banner (not the virtual entry) because esbuild's bundling
1014
984
  // can reorder code, and the .set() calls need the Map to exist first
@@ -1189,9 +1159,14 @@ ${createWorkflowRouteHandlersCode(`workflowEntrypoint(workflowCode${workflowEntr
1189
1159
  interimBundleCtx,
1190
1160
  bundleFinal,
1191
1161
  interimBundleText,
1162
+ interimBundleMetafile: interimBundle.metafile,
1192
1163
  };
1193
1164
  }
1194
- return { manifest: workflowManifest, interimBundleText };
1165
+ return {
1166
+ manifest: workflowManifest,
1167
+ interimBundleText,
1168
+ interimBundleMetafile: interimBundle.metafile,
1169
+ };
1195
1170
  }
1196
1171
  catch (error) {
1197
1172
  shouldDisposeInterimBundleCtx = true;
@@ -1827,4 +1802,4 @@ export const OPTIONS = handler;`;
1827
1802
  return result;
1828
1803
  }
1829
1804
  }
1830
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixNQUFNLEVBQ04sRUFBRSxFQUNGLElBQUksRUFDSixTQUFTLEdBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyx1QkFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsK0JBQStCLEdBQ2hDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUVM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QUFDLEdBQUc7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDM0IsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtpQkFDL0QsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixPQUFvQztRQUVwQyxNQUFNLE1BQU0sR0FBd0QsRUFBRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFNUIsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgcmVhbHBhdGgsXG4gIHJlbmFtZSxcbiAgcm0sXG4gIHN0YXQsXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBidWlsZExvZ2dlciB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL2xvZ2dlcic7XG5pbXBvcnQgeyBXb3JrZmxvd0J1aWxkRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBsdXJhbGl6ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGVuaGFuY2VkUmVzb2x2ZU9yaWdpbmFsIGZyb20gJ2VuaGFuY2VkLXJlc29sdmUnO1xuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB7IGZpbmRVcCB9IGZyb20gJ2ZpbmQtdXAnO1xuaW1wb3J0IHsgZ2xvYiB9IGZyb20gJ3RpbnlnbG9iYnknO1xuaW1wb3J0IHtcbiAgYXBwbHlTd2NUcmFuc2Zvcm0sXG4gIHR5cGUgV29ya2Zsb3dNYW5pZmVzdCxcbn0gZnJvbSAnLi9hcHBseS1zd2MtdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlLFxuICBjcmVhdGVXb3JrZmxvd1JvdXRlSGFuZGxlcnNDb2RlLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRFc2J1aWxkVHNjb25maWdPcHRpb25zIH0gZnJvbSAnLi9lc2J1aWxkLXRzY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRGlzY292ZXJlZEVudHJpZXMsXG4gIGZhc3REaXNjb3ZlckVudHJpZXMsXG59IGZyb20gJy4vZmFzdC1kaXNjb3ZlcnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW1wb3J0UGF0aCxcbiAgcmVzb2x2ZU1vZHVsZVNwZWNpZmllcixcbiAgc3RyaXBQYWNrYWdlVmVyc2lvbixcbn0gZnJvbSAnLi9tb2R1bGUtc3BlY2lmaWVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbiB9IGZyb20gJy4vbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbiB9IGZyb20gJy4vcHNldWRvLXBhY2thZ2UtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlU3djUGx1Z2luIH0gZnJvbSAnLi9zd2MtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB9IGZyb20gJy4vdHJhbnNmb3JtLXV0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgU291cmNlbWFwTW9kZSwgV29ya2Zsb3dDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RXb3JrZmxvd0dyYXBocyB9IGZyb20gJy4vd29ya2Zsb3dzLWV4dHJhY3Rvci5qcyc7XG5pbXBvcnQgeyBoYXNTYW1lQ29udGVudCwgd3JpdGVGaWxlSWZDaGFuZ2VkIH0gZnJvbSAnLi93cml0ZS1pZi1jaGFuZ2VkLmpzJztcblxuY29uc3QgZW5oYW5jZWRSZXNvbHZlID0gcHJvbWlzaWZ5KGVuaGFuY2VkUmVzb2x2ZU9yaWdpbmFsKTtcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbi8qKlxuICogT3JkZXIgdGhlIHBlci1maWxlIG1hbmlmZXN0IHNlY3Rpb25zIGRldGVybWluaXN0aWNhbGx5LlxuICpcbiAqIEVudHJ5IGRpc2NvdmVyeSBydW5zIGNvbmN1cnJlbnRseSwgc28gdGhlIGluc2VydGlvbiBvcmRlciBvZiB0aGVzZSBtYXBzXG4gKiB2YXJpZXMgYmV0d2VlbiBvdGhlcndpc2UgaWRlbnRpY2FsIGJ1aWxkcyBhbmQgdGhlIHNlcmlhbGl6ZWQgbWFuaWZlc3QgY29tZXNcbiAqIG91dCBieXRlLWRpZmZlcmVudCBldmVyeSB0aW1lLiBTb3J0aW5nIG1ha2VzIHRoZSBtYW5pZmVzdCByZXByb2R1Y2libGUsIGFuZFxuICogbGV0cyB0aGUgdW5jaGFuZ2VkLXdyaXRlIGd1YXJkIGluIGB3cml0ZUZpbGVJZkNoYW5nZWRgIGFjdHVhbGx5IGZpcmUgZm9yIGl0LlxuICpcbiAqIENvbXBhcmVkIGJ5IGNvZGUgdW5pdCByYXRoZXIgdGhhbiBgbG9jYWxlQ29tcGFyZWAsIHdob3NlIHJlc3VsdCBkZXBlbmRzIG9uXG4gKiB0aGUgaG9zdCBsb2NhbGUuXG4gKi9cbmZ1bmN0aW9uIHNvcnRNYW5pZmVzdEVudHJpZXM8VD4oXG4gIHNlY3Rpb246IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFQ+PlxuKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgVD4+IHtcbiAgY29uc3QgYnlLZXkgPSAoW2FdOiBbc3RyaW5nLCB1bmtub3duXSwgW2JdOiBbc3RyaW5nLCB1bmtub3duXSkgPT5cbiAgICBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pXG4gICAgICAuc29ydChieUtleSlcbiAgICAgIC5tYXAoKFtmaWxlLCBlbnRyaWVzXSkgPT4gW1xuICAgICAgICBmaWxlLFxuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZW50cmllcykuc29ydChieUtleSkpLFxuICAgICAgXSlcbiAgKTtcbn1cblxuZXhwb3J0IHR5cGUgeyBEaXNjb3ZlcmVkRW50cmllcyB9IGZyb20gJy4vZmFzdC1kaXNjb3ZlcnkuanMnO1xuXG4vKipcbiAqIExlZ2FjeSBvcHQtaW4gZm9yIHNvdXJjZSBtYXBzIG9uIHRoZSBmaW5hbCB3b3JrZmxvdyB3cmFwcGVyICsgd2ViaG9va1xuICogYnVuZGxlcyAod2hpY2ggZGVmYXVsdCB0byBvZmYsIHVubGlrZSB0aGUgc3RlcC9pbnRlcmltIHdvcmtmbG93IGJ1bmRsZXNcbiAqIHRoYXQgZGVmYXVsdCB0byBpbmxpbmUpLiBTdXBlcnNlZGVkIGJ5IHRoZSBgc291cmNlbWFwYCBjb25maWcgb3B0aW9uIGFuZFxuICogdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlOyBrZXB0IGZvciBiYWNrLWNvbXBhdC5cbiAqL1xuY29uc3QgRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcgPVxuICBwcm9jZXNzLmVudi5XT1JLRkxPV19FTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyA9PT0gJzEnO1xuXG5jb25zdCBWQUxJRF9TT1VSQ0VNQVBfU1RSSU5HUyA9IG5ldyBTZXQoW1xuICAnaW5saW5lJyxcbiAgJ2xpbmtlZCcsXG4gICdleHRlcm5hbCcsXG4gICdib3RoJyxcbl0pO1xuXG4vKipcbiAqIFBhcnNlIHRoZSB2YWx1ZSBvZiB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaW50byBhXG4gKiBgU291cmNlbWFwTW9kZWAuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGVudiB2YXIgaXMgdW5zZXQsIGVtcHR5LCBvclxuICogdW5yZWNvZ25pemVkIChhIHdhcm5pbmcgaXMgZW1pdHRlZCBmb3IgdW5yZWNvZ25pemVkIHZhbHVlcykuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlbWFwRW52KFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBTb3VyY2VtYXBNb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgY2FzZSAnMCc6XG4gICAgY2FzZSAnZmFsc2UnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNhc2UgJzEnOlxuICAgIGNhc2UgJ3RydWUnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChWQUxJRF9TT1VSQ0VNQVBfU1RSSU5HUy5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBTb3VyY2VtYXBNb2RlO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgSWdub3JpbmcgdW5yZWNvZ25pemVkIFdPUktGTE9XX1NPVVJDRU1BUD0ke3ZhbHVlfS4gYCArXG4gICAgICAgICAgYEV4cGVjdGVkIG9uZSBvZjogdHJ1ZSwgZmFsc2UsIDAsIDEsIGlubGluZSwgbGlua2VkLCBleHRlcm5hbCwgYm90aC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIHRoZSB2YWx1ZSBvZiB0aGUgYFdPUktGTE9XX0RJU0NPVkVSX05PREVfTU9EVUxFU2AgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIGludG8gYSBib29sZWFuLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBlbnYgdmFyIGlzIHVuc2V0IG9yIGVtcHR5IHNvXG4gKiBjYWxsZXJzIGNhbiBmYWxsIGJhY2sgdG8gY29uZmlnL2RlZmF1bHQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGlzY292ZXJOb2RlTW9kdWxlc0VudihcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZhbHVlICE9PSAnMCcgJiYgdmFsdWUgIT09ICdmYWxzZSc7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEJ1aWxkRHVyYXRpb24oZHVyYXRpb25NczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGR1cmF0aW9uTXMgPCAxMDAwKSB7XG4gICAgcmV0dXJuIGAke2R1cmF0aW9uTXN9bXNgO1xuICB9XG5cbiAgcmV0dXJuIGAkeyhkdXJhdGlvbk1zIC8gMTAwMCkudG9GaXhlZCgxKX1zYDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYW4gYXJyYXkgb2YgZmlsZSBwYXRocyBieSBhcHBlbmRpbmcgdGhlIGByZWFscGF0aCgpYCBvZiBlYWNoIGVudHJ5XG4gKiAodG8gaGFuZGxlIHN5bWxpbmtzLCBlLmcuIHBucG0vd29ya3NwYWNlIGxheW91dHMpIGFuZCBkZWR1cGxpY2F0aW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoUmVhbHBhdGhzKGVudHJpZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRyaWVzLm1hcChhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVhbHBhdGgoZW50cnkpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQgPyBbZW50cnksIHJlc29sdmVkXSA6IFtlbnRyeV07XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKS5mbGF0KClcbiAgICApXG4gICk7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIFwid2hhdCBtb2R1bGUgZG9lcyB0aGlzIGZpbGUgcmVwcmVzZW50P1wiIGtleSB1c2VkIHRvIGRlZHVwZVxuICogdmlydHVhbC1lbnRyeSBpbXBvcnRzLlxuICpcbiAqIElmIHRoZSBmaWxlIHJlc29sdmVzIHRvIGEgcmVhbCBwYWNrYWdlIHNwZWNpZmllciAoYHdvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zYCxcbiAqIGBAaW50ZXJuYWwvYWdlbnQvc2VydmVyYCwgZXRjLiksIHdlIHJldHVybiB0aGUgYmFyZSBzcGVjaWZpZXIgKHZlcnNpb25cbiAqIHN0cmlwcGVkKSBiZWNhdXNlIGVzYnVpbGQncyBwYWNrYWdlIHJlc29sdXRpb24gd2lsbCBjb2xsYXBzZSBhbGxcbiAqIGltcG9ydGVycyBvZiB0aGF0IHNwZWNpZmllciB0byB0aGUgc2FtZSBwaHlzaWNhbCBtb2R1bGUgcmVnYXJkbGVzcyBvZlxuICogd2hpY2ggb24tZGlzayBjb3B5IChzcmMgdnMgZGlzdCkgYW55IG9uZSBpbXBvcnRlciB3cm90ZS5cbiAqXG4gKiBPdGhlcndpc2Ugd2UgZmFsbCBiYWNrIHRvIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGguIERpc3RpbmN0IGxvY2FsLWFwcFxuICogZmlsZXMgaGF2ZSBkaXN0aW5jdCBwYXRocywgc28gdGhpcyBzdGlsbCBkZWR1cGVzIGEgZmlsZSBhZ2FpbnN0IGl0c2VsZlxuICogKGUuZy4gaWYgaXQgc2hvd3MgdXAgaW4gYm90aCBgc3RlcEZpbGVzYCBhbmQgYHNlcmRlT25seUZpbGVzYCkgd2l0aG91dFxuICogY29uZmxhdGluZyB1bnJlbGF0ZWQgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIG1vZHVsZUlkZW50aXR5S2V5KGZpbGU6IHN0cmluZywgbW9kdWxlU3BlY2lmaWVyUm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgeyBtb2R1bGVTcGVjaWZpZXIgfSA9IHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoZmlsZSwgbW9kdWxlU3BlY2lmaWVyUm9vdCk7XG4gIGlmIChtb2R1bGVTcGVjaWZpZXIpIHtcbiAgICAvLyBTdHJpcCB0aGUgXCJAPHZlcnNpb24+XCIgc3VmZml4IHNvIHNvdXJjZSBhbmQgZGlzdCBjb3BpZXMgb2YgdGhlIHNhbWVcbiAgICAvLyBleHBvcnQgY29sbGFwc2UgdG8gdGhlIHNhbWUga2V5LlxuICAgIHJldHVybiBzdHJpcFBhY2thZ2VWZXJzaW9uKG1vZHVsZVNwZWNpZmllcik7XG4gIH1cbiAgcmV0dXJuIGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuXG50eXBlIE1hbmlmZXN0RW50cnlMb2NhdGlvbiA9IHtcbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBDYWNoZWRNYW5pZmVzdFRyYW5zZm9ybSA9IHtcbiAgc2l6ZTogbnVtYmVyO1xuICBtdGltZU1zOiBudW1iZXI7XG4gIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xufTtcblxuZnVuY3Rpb24gZm9ybWF0SWRMb2NhdGlvbihsb2NhdGlvbjogTWFuaWZlc3RFbnRyeUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2F0aW9uLmZpbGVQYXRofSMke2xvY2F0aW9uLm5hbWV9YDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHM8VEVudHJ5PihcbiAgZW50cmllc0J5RmlsZTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgVEVudHJ5Pj4gfCB1bmRlZmluZWQsXG4gIGlkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPixcbiAgZ2V0SWQ6IChlbnRyeTogVEVudHJ5KSA9PiBzdHJpbmcsXG4gIGxhYmVsOiAnc3RlcCcgfCAnd29ya2Zsb3cnXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXNCeUZpbGUgfHwge30pKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZGF0YSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGlkcy5nZXQoaWQpO1xuICAgICAgY29uc3QgY3VycmVudCA9IHsgZmlsZVBhdGgsIG5hbWUgfTtcbiAgICAgIGlmIChcbiAgICAgICAgZXhpc3RpbmcgJiZcbiAgICAgICAgKGV4aXN0aW5nLmZpbGVQYXRoICE9PSBjdXJyZW50LmZpbGVQYXRoIHx8XG4gICAgICAgICAgZXhpc3RpbmcubmFtZSAhPT0gY3VycmVudC5uYW1lKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGlkTmFtZSA9IGxhYmVsID09PSAnc3RlcCcgPyAnd29ya2Zsb3cgc3RlcCBJRCcgOiAnd29ya2Zsb3cgSUQnO1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBgJHtsYWJlbH0gZnVuY3Rpb25gO1xuICAgICAgICBjb25zdCBjYXBpdGFsaXplZExhYmVsID0gbGFiZWwgPT09ICdzdGVwJyA/ICdTdGVwJyA6ICdXb3JrZmxvdyc7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoXG4gICAgICAgICAgYER1cGxpY2F0ZSAke2lkTmFtZX0gXCIke2lkfVwiIGdlbmVyYXRlZCBmb3IgJHtmb3JtYXRJZExvY2F0aW9uKGV4aXN0aW5nKX0gYW5kICR7Zm9ybWF0SWRMb2NhdGlvbihjdXJyZW50KX0uYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OlxuICAgICAgICAgICAgICBgJHtjYXBpdGFsaXplZExhYmVsfSBJRHMgbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGEgYnVpbGQuIGAgK1xuICAgICAgICAgICAgICBgSWYgeW91IG93biBvbmUgb2YgdGhlIGNvbGxpZGluZyBmaWxlcywgcmVuYW1lIHRoZSAke2Z1bmN0aW9uTmFtZX0gb3IgZXhwb3J0IGAgK1xuICAgICAgICAgICAgICBgdGhlIHBhY2thZ2UgZmlsZSB0aHJvdWdoIGEgdW5pcXVlIHBhY2thZ2Ugc3VicGF0aC4gSWYgdGhlIGNvbGxpc2lvbiBpcyBpbiBhIGAgK1xuICAgICAgICAgICAgICBgdHJhbnNpdGl2ZSBkZXBlbmRlbmN5IHlvdSBkb24ndCBjb250cm9sLCBmaWxlIGFuIGlzc3VlIHdpdGggdGhlIHVwc3RyZWFtIGAgK1xuICAgICAgICAgICAgICBgcGFja2FnZSBvciBwaW4gdG8gYSBub24tY29sbGlkaW5nIHZlcnNpb24uYCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZHMuc2V0KGlkLCBjdXJyZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICB0YXJnZXQ6IFdvcmtmbG93TWFuaWZlc3QsXG4gIGluY29taW5nOiBXb3JrZmxvd01hbmlmZXN0LFxuICBzdGVwSWRzOiBNYXA8c3RyaW5nLCBNYW5pZmVzdEVudHJ5TG9jYXRpb24+LFxuICB3b3JrZmxvd0lkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPlxuKTogdm9pZCB7XG4gIGFzc2VydFVuaXF1ZU1hbmlmZXN0SWRzKFxuICAgIGluY29taW5nLnN0ZXBzLFxuICAgIHN0ZXBJZHMsXG4gICAgKGRhdGEpID0+IGRhdGEuc3RlcElkLFxuICAgICdzdGVwJ1xuICApO1xuICBhc3NlcnRVbmlxdWVNYW5pZmVzdElkcyhcbiAgICBpbmNvbWluZy53b3JrZmxvd3MsXG4gICAgd29ya2Zsb3dJZHMsXG4gICAgKGRhdGEpID0+IGRhdGEud29ya2Zsb3dJZCxcbiAgICAnd29ya2Zsb3cnXG4gICk7XG5cbiAgdGFyZ2V0LndvcmtmbG93cyA9IE9iamVjdC5hc3NpZ24odGFyZ2V0LndvcmtmbG93cyB8fCB7fSwgaW5jb21pbmcud29ya2Zsb3dzKTtcbiAgdGFyZ2V0LnN0ZXBzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQuc3RlcHMgfHwge30sIGluY29taW5nLnN0ZXBzKTtcbiAgdGFyZ2V0LmNsYXNzZXMgPSBPYmplY3QuYXNzaWduKHRhcmdldC5jbGFzc2VzIHx8IHt9LCBpbmNvbWluZy5jbGFzc2VzKTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciB3b3JrZmxvdyBidWlsZGVycy4gUHJvdmlkZXMgY29tbW9uIGJ1aWxkIGxvZ2ljIGZvciB0cmFuc2Zvcm1pbmdcbiAqIHdvcmtmbG93IHNvdXJjZSBmaWxlcyBpbnRvIGRlcGxveWFibGUgYnVuZGxlcyB1c2luZyBlc2J1aWxkIGFuZCBTV0MuXG4gKlxuICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYnVpbGQoKSBtZXRob2QgdG8gZGVmaW5lIGJ1aWxkZXItc3BlY2lmaWMgbG9naWMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQnVpbGRlciB7XG4gIHByb3RlY3RlZCBjb25maWc6IFdvcmtmbG93Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBUcmFja3Mgd2hpY2ggZXh0ZXJuYWwgcGFja2FnZXMgaGF2ZSBhbHJlYWR5IGJlZW4gd2FybmVkIGFib3V0XG4gICAqIHRvIGF2b2lkIGR1cGxpY2F0ZSB3YXJuaW5ncyBhY3Jvc3MgbXVsdGlwbGUgZGlzY292ZXJFbnRyaWVzKCkgY2FsbHMuXG4gICAqL1xuICBwcml2YXRlIHdhcm5lZEV4dGVybmFsUGFja2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSB3b3JrZmxvd0J1aWxkU3RhcnRUaW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbWFuaWZlc3RUcmFuc2Zvcm1DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNYW5pZmVzdFRyYW5zZm9ybT4oKTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFdvcmtmbG93Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zZm9ybVByb2plY3RSb290KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb2plY3RSb290IHx8IHRoaXMuY29uZmlnLndvcmtpbmdEaXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IG1vZHVsZVNwZWNpZmllclJvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubW9kdWxlU3BlY2lmaWVyUm9vdCB8fCB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290O1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBidWlsZExvZ2dlci5kZWJ1ZyhhcmdzLm1hcChTdHJpbmcpLmpvaW4oJyAnKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0V29ya2Zsb3dCdWlsZFRpbWVyKCk6IHZvaWQge1xuICAgIHRoaXMud29ya2Zsb3dCdWlsZFN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtmbG93QnVpbGREdXJhdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiBEYXRlLm5vdygpIC0gKHRoaXMud29ya2Zsb3dCdWlsZFN0YXJ0VGltZSA/PyBEYXRlLm5vdygpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRXb3JrZmxvd0J1aWxkVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXb3JrZmxvd0J1aWxkU3VtbWFyeSh7XG4gICAgc3RlcENvdW50LFxuICAgIHdvcmtmbG93Q291bnQsXG4gIH06IHtcbiAgICBzdGVwQ291bnQ6IG51bWJlcjtcbiAgICB3b3JrZmxvd0NvdW50OiBudW1iZXI7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50cyA9IGAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9YDtcbiAgICByZXR1cm4gYOKckyBDb21waWxlZCB3b3JrZmxvd3MgaW4gJHtmb3JtYXRCdWlsZER1cmF0aW9uKHRoaXMuZ2V0V29ya2Zsb3dCdWlsZER1cmF0aW9uKCkpfSAoJHtjb3VudHN9KWA7XG4gIH1cblxuICBwcml2YXRlIGxvZ0NyZWF0ZVdvcmtmbG93c0J1bmRsZUluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZUxvZ3MpIHtcbiAgICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdlYmhvb2tCdW5kbGVMb2dzKSB7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlTWFuaWZlc3RMb2dzKSB7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBvdXRwdXR0aW5nIENKUywgZXNidWlsZCByZXBsYWNlcyBgaW1wb3J0Lm1ldGFgIHdpdGggYW4gZW1wdHkgb2JqZWN0LFxuICAgKiBtYWtpbmcgYGltcG9ydC5tZXRhLnVybGAgKGFuZCBgaW1wb3J0Lm1ldGEucmVzb2x2ZWApIHVuZGVmaW5lZC4gVGhpcyBtZXRob2RcbiAgICogcmV0dXJucyBiYW5uZXIgY29kZSBhbmQgYGRlZmluZWAgZW50cmllcyB0aGF0IHBvbHlmaWxsIHRoZW0gdXNpbmcgQ0pTXG4gICAqIGVxdWl2YWxlbnRzIChgX19maWxlbmFtZWAsIGByZXF1aXJlLnJlc29sdmVgKSBzbyB1c2VyIGNvZGUgKGUuZy4gUHJpc21hKVxuICAgKiB0aGF0IHJlbGllcyBvbiBgaW1wb3J0Lm1ldGEudXJsYCB3b3JrcyBjb3JyZWN0bHkgaW4gYnVuZGxlZCBDSlMgb3V0cHV0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDanNJbXBvcnRNZXRhUG9seWZpbGwoZm9ybWF0OiBzdHJpbmcpOiB7XG4gICAgYmFubmVyOiBzdHJpbmc7XG4gICAgZGVmaW5lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9IHtcbiAgICBpZiAoZm9ybWF0ICE9PSAnY2pzJykgcmV0dXJuIHsgYmFubmVyOiAnJywgZGVmaW5lOiB7fSB9O1xuICAgIHJldHVybiB7XG4gICAgICBiYW5uZXI6XG4gICAgICAgICd2YXIgX19pbXBvcnRfbWV0YV91cmwgPSB0eXBlb2YgX19maWxlbmFtZSAhPT0gXCJ1bmRlZmluZWRcIiA/IHJlcXVpcmUoXCJ1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKS5ocmVmIDogdW5kZWZpbmVkO1xcbicgK1xuICAgICAgICAndmFyIF9faW1wb3J0X21ldGFfcmVzb2x2ZSA9IHR5cGVvZiByZXF1aXJlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBfX2ZpbGVuYW1lICE9PSBcInVuZGVmaW5lZFwiICcgK1xuICAgICAgICAnPyAocykgPT4gcmVxdWlyZShcInVybFwiKS5wYXRoVG9GaWxlVVJMKHJlcXVpcmUucmVzb2x2ZShzKSkuaHJlZiA6IHVuZGVmaW5lZDtcXG4nLFxuICAgICAgZGVmaW5lOiB7XG4gICAgICAgICdpbXBvcnQubWV0YS51cmwnOiAnX19pbXBvcnRfbWV0YV91cmwnLFxuICAgICAgICAnaW1wb3J0Lm1ldGEucmVzb2x2ZSc6ICdfX2ltcG9ydF9tZXRhX3Jlc29sdmUnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gb3V0cHV0dGluZyBmdWxseS1idW5kbGVkIEVTTSwgQ0pTIGRlcGVuZGVuY2llcyB0aGF0IGNhbGwgcmVxdWlyZSgpXG4gICAqIGZvciBOb2RlLmpzIGJ1aWx0aW5zIChlLmcuIGRlYnVnIOKGkiByZXF1aXJlKCd0dHknKSkgYnJlYWsgYmVjYXVzZSBlc2J1aWxkJ3NcbiAgICogQ0pTLXRvLUVTTSBfX3JlcXVpcmUgc2hpbSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIGEgcmVhbCByZXF1aXJlIGZ1bmN0aW9uLlxuICAgKiBUaGlzIGJhbm5lciBwcm92aWRlcyBvbmUgdmlhIGNyZWF0ZVJlcXVpcmUgc28gYnVuZGxlZCBDSlMgY29kZSB3b3JrcyBpbiBFU00uXG4gICAqL1xuICBwcml2YXRlIGdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmb3JtYXQgIT09ICdlc20nKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuICdpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIGFzIF9fY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xcbnZhciByZXF1aXJlID0gX19jcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XFxuJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyB0aGUgY29tcGxldGUgYnVpbGQgcHJvY2VzcyBmb3Igd29ya2Zsb3dzLlxuICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgdG8gZGVmaW5lIHRoZWlyIHNwZWNpZmljIGJ1aWxkIHN0ZXBzLlxuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRmluZHMgdHNjb25maWcuanNvbi9qc2NvbmZpZy5qc29uIGZvciB0aGUgcHJvamVjdC5cbiAgICogVXNlZCBieSBlc2J1aWxkIHRvIHByb3Blcmx5IHJlc29sdmUgbW9kdWxlIGltcG9ydHMgZHVyaW5nIGJ1bmRsaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZpbmRUc0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjd2QgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgcmV0dXJuIGZpbmRVcChbJ3RzY29uZmlnLmpzb24nLCAnanNjb25maWcuanNvbiddLCB7IGN3ZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgY29uZmlndXJlZCBkaXJlY3Rvcmllcy5cbiAgICogU2VhcmNoZXMgZm9yIFR5cGVTY3JpcHQgYW5kIEphdmFTY3JpcHQgZmlsZXMgd2hpbGUgZXhjbHVkaW5nIGNvbW1vbiBidWlsZFxuICAgKiBhbmQgZGVwZW5kZW5jeSBkaXJlY3Rvcmllcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBpZ25vcmUgPSBbXG4gICAgICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgICAgICcqKi8uZ2l0LyoqJyxcbiAgICAgICcqKi8ubmV4dC8qKicsXG4gICAgICAnKiovLm5pdHJvLyoqJyxcbiAgICAgICcqKi8ubnV4dC8qKicsXG4gICAgICAnKiovLm91dHB1dC8qKicsXG4gICAgICAnKiovLnZlcmNlbC8qKicsXG4gICAgICAnKiovLndvcmtmbG93LWRhdGEvKionLFxuICAgICAgJyoqLy53b3JrZmxvdy12aXRlc3QvKionLFxuICAgICAgJyoqLy53ZWxsLWtub3duL3dvcmtmbG93LyoqJyxcbiAgICAgICcqKi8uc3djLyoqJyxcbiAgICAgICcqKi8uc3ZlbHRlLWtpdC8qKicsXG4gICAgICAnKiovLnR1cmJvLyoqJyxcbiAgICAgICcqKi8uY2FjaGUvKionLFxuICAgICAgJyoqLy55YXJuLyoqJyxcbiAgICAgICcqKi8ucG5wbS1zdG9yZS8qKicsXG4gICAgXTtcblxuICAgIC8vIFVzZSByZWxhdGl2ZSBwYXR0ZXJucyB3aXRoIGBjd2RgIHBlciBkaXJlY3Rvcnkgc28gdGhhdCBgZG90OiB0cnVlYFxuICAgIC8vIGFwcGxpZXMgY29uc2lzdGVudGx5IHRvIGJvdGggdGhlIHNlYXJjaCBwYXR0ZXJuICphbmQqIHRoZSBpZ25vcmVcbiAgICAvLyBwYXR0ZXJucy4gV2hlbiBhYnNvbHV0ZSBwYXR0ZXJucyBhcmUgdXNlZCB3aXRoIHRpbnlnbG9iYnksIHRoZSBgKipgXG4gICAgLy8gaW4gaWdub3JlIHBhdHRlcm5zIGRvZXMgbm90IG1hdGNoIGRvdC1wcmVmaXhlZCBwYXRoIHNlZ21lbnRzLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuY29uZmlnLmRpcnMubWFwKChkaXIpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBkaXIpO1xuICAgICAgICByZXR1cm4gZ2xvYihbJyoqLyoue3RzLHRzeCxtdHMsY3RzLGpzLGpzeCxtanMsY2pzfSddLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICAgIGlnbm9yZSxcbiAgICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhY2hlcyBkaXNjb3ZlcmVkIHdvcmtmbG93IGVudHJpZXMgYnkgaW5wdXQgYXJyYXkgcmVmZXJlbmNlLlxuICAgKiBVc2VzIFdlYWtNYXAgdG8gYWxsb3cgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gaW5wdXQgYXJyYXlzIGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZC5cbiAgICogVGhpcyBjYWNoZSBpcyBpbnZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGlucHV0cyBhcnJheSByZWZlcmVuY2UgY2hhbmdlc1xuICAgKiAoZS5nLiwgd2hlbiBmaWxlcyBhcmUgYWRkZWQvcmVtb3ZlZCBkdXJpbmcgd2F0Y2ggbW9kZSkuXG4gICAqL1xuICBwcml2YXRlIGRpc2NvdmVyZWRFbnRyaWVzOiBXZWFrTWFwPHN0cmluZ1tdLCBEaXNjb3ZlcmVkRW50cmllcz4gPVxuICAgIG5ldyBXZWFrTWFwKCk7XG5cbiAgcHVibGljIGNsZWFyRGlzY292ZXJlZEVudHJpZXNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhck1hbmlmZXN0VHJhbnNmb3JtQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5tYW5pZmVzdFRyYW5zZm9ybUNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUHNldWRvLXBhY2thZ2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBjaGVja2VkIGZvciB3b3JrZmxvdyBwYXR0ZXJucy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBTRVVET19QQUNLQUdFUyA9IG5ldyBTZXQoW1xuICAgICdzZXJ2ZXItb25seScsXG4gICAgJ2NsaWVudC1vbmx5JyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBlYWNoIHBhY2thZ2UgaW4gZXh0ZXJuYWxQYWNrYWdlcyBmb3Igd29ya2Zsb3cgcGF0dGVybnMgYW5kIGVtaXRzXG4gICAqIHdhcm5pbmdzIGlmIGFueSBjb250YWluIFwidXNlIHN0ZXBcIiwgXCJ1c2Ugd29ya2Zsb3dcIiBkaXJlY3RpdmVzLCBvclxuICAgKiBzZXJpYWxpemF0aW9uIGNsYXNzZXMuIFRoZXNlIHBhdHRlcm5zIHdpbGwgbm90IGJlIHRyYW5zZm9ybWVkIGJ5IHRoZVxuICAgKiB3b3JrZmxvdyBjb21waWxlciB3aGVuIHRoZSBwYWNrYWdlIGlzIGV4dGVybmFsaXplZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FybkFib3V0RXh0ZXJuYWxXb3JrZmxvd1BhY2thZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4dGVybmFsUGFja2FnZXMgPSB0aGlzLmNvbmZpZy5leHRlcm5hbFBhY2thZ2VzO1xuICAgIGlmICghZXh0ZXJuYWxQYWNrYWdlcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBleHRlcm5hbFBhY2thZ2VzKSB7XG4gICAgICBpZiAoQmFzZUJ1aWxkZXIuUFNFVURPX1BBQ0tBR0VTLmhhcyhwa2cpKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLndhcm5lZEV4dGVybmFsUGFja2FnZXMuaGFzKHBrZykpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHBrZy5zdGFydHNXaXRoKCcuJykgfHxcbiAgICAgICAgcGtnLnN0YXJ0c1dpdGgoJy8nKSB8fFxuICAgICAgICBwa2cuc3RhcnRzV2l0aCgnJCcpIHx8XG4gICAgICAgIHBrZy5pbmNsdWRlcygnKicpIHx8XG4gICAgICAgIHBrZy5pbmNsdWRlcygnOicpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENoZWNrIHBhY2thZ2UuanNvbiBkZXBlbmRlbmNpZXMgZm9yIEB3b3JrZmxvdy9zZXJkZSAoZmFzdCBwYXRoKVxuICAgICAgICBsZXQgaGFzV29ya2Zsb3dTZXJkZURlcCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKGAke3BrZ30vcGFja2FnZS5qc29uYCwge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwa2dKc29uU291cmNlID0gYXdhaXQgcmVhZEZpbGUocGtnSnNvblBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb24gPSBKU09OLnBhcnNlKHBrZ0pzb25Tb3VyY2UpIGFzIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcz86IHVua25vd247XG4gICAgICAgICAgICBwZWVyRGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICB0eXBlb2YgcGtnSnNvbi5kZXBlbmRlbmNpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBwa2dKc29uLmRlcGVuZGVuY2llcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkocGtnSnNvbi5kZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAgID8gKHBrZ0pzb24uZGVwZW5kZW5jaWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgICA6IHt9O1xuICAgICAgICAgIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXMgPVxuICAgICAgICAgICAgdHlwZW9mIHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkocGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzKVxuICAgICAgICAgICAgICA/IChwa2dKc29uLnBlZXJEZXBlbmRlbmNpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgaGFzV29ya2Zsb3dTZXJkZURlcCA9XG4gICAgICAgICAgICBPYmplY3QuaGFzT3duKGRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpIHx8XG4gICAgICAgICAgICBPYmplY3QuaGFzT3duKHBlZXJEZXBlbmRlbmNpZXMsICdAd29ya2Zsb3cvc2VyZGUnKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gcGFja2FnZS5qc29uIG5vdCByZXNvbHZhYmxlIC0gY29udGludWUgdG8gc291cmNlIGNoZWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBzb3VyY2UgcGF0dGVybnMgKHRob3JvdWdoIHBhdGgpLlxuICAgICAgICAvLyBOb3RlOiByZXF1aXJlLnJlc29sdmUgb25seSBpbnNwZWN0cyB0aGUgcGFja2FnZSdzIG1haW4gZW50cnkgcG9pbnQuXG4gICAgICAgIC8vIElmIHdvcmtmbG93IGNvbnN0cnVjdHMgbGl2ZSBpbiBzdWItcGF0aHMgKGUuZy4gYG15LXBrZy93b3JrZmxvd3NgKSxcbiAgICAgICAgLy8gdGhleSB3b24ndCBiZSBkZXRlY3RlZCBoZXJlLiBUaGUgQHdvcmtmbG93L3NlcmRlIGRlcCBjaGVjayBhYm92ZVxuICAgICAgICAvLyBwYXJ0aWFsbHkgY292ZXJzIHNlcmRlIGNhc2VzLiBUaGlzIGlzIGFjY2VwdGFibGUgYXMgYSBiZXN0LWVmZm9ydFxuICAgICAgICAvLyBoZXVyaXN0aWM7IHRoZSBwcmltYXJ5IGZpeCBpcyBhdXRvLXJlbW92YWwgaW4gd2l0aFdvcmtmbG93KCkuXG4gICAgICAgIGxldCBoYXNVc2VTdGVwID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNVc2VXb3JrZmxvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzU2VyZGUgPSBoYXNXb3JrZmxvd1NlcmRlRGVwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHJlcXVpcmUucmVzb2x2ZShwa2csIHtcbiAgICAgICAgICAgIHBhdGhzOiBbdGhpcy5jb25maWcud29ya2luZ0Rpcl0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZW50cnlQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICAgICAgICBoYXNVc2VTdGVwID0gcGF0dGVybnMuaGFzVXNlU3RlcDtcbiAgICAgICAgICBoYXNVc2VXb3JrZmxvdyA9IHBhdHRlcm5zLmhhc1VzZVdvcmtmbG93O1xuICAgICAgICAgIGlmICghaGFzU2VyZGUpIHtcbiAgICAgICAgICAgIGhhc1NlcmRlID0gcGF0dGVybnMuaGFzU2VyZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBFbnRyeSBmaWxlIG5vdCByZXNvbHZhYmxlIG9yIG5vdCByZWFkYWJsZSAtIHVzZSB3aGF0IHdlIGhhdmVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzVXNlU3RlcCAmJiAhaGFzVXNlV29ya2Zsb3cgJiYgIWhhc1NlcmRlKSBjb250aW51ZTtcblxuICAgICAgICAvLyBCdWlsZCBhIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHdoYXQgd2FzIGZvdW5kXG4gICAgICAgIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGhhc1VzZVdvcmtmbG93KSBpc3N1ZXMucHVzaCgnXCJ1c2Ugd29ya2Zsb3dcIiBmdW5jdGlvbnMnKTtcbiAgICAgICAgaWYgKGhhc1VzZVN0ZXApIGlzc3Vlcy5wdXNoKCdcInVzZSBzdGVwXCIgZnVuY3Rpb25zJyk7XG4gICAgICAgIGlmIChoYXNTZXJkZSkgaXNzdWVzLnB1c2goJ3NlcmlhbGl6YXRpb24gY2xhc3NlcycpO1xuXG4gICAgICAgIHRoaXMud2FybmVkRXh0ZXJuYWxQYWNrYWdlcy5hZGQocGtnKTtcblxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFxcbiR7Y2hhbGsueWVsbG93KCfimqAnKX0gV2FybmluZzogJHtjaGFsay5ib2xkKGBcIiR7cGtnfVwiYCl9IGlzIGxpc3RlZCBpbiAke2NoYWxrLmJvbGQoJ2V4dGVybmFsUGFja2FnZXMnKX0gKCR7Y2hhbGsuYm9sZCgnc2VydmVyRXh0ZXJuYWxQYWNrYWdlcycpfSBpbiBOZXh0LmpzKSBidXQgY29udGFpbnMgd29ya2Zsb3cgY29kZSAoJHtpc3N1ZXMuam9pbignLCAnKX0pLmAgK1xuICAgICAgICAgICAgYFxcbiAgVGhpcyBjb2RlIHdpbGwgJHtjaGFsay5ib2xkKCdub3QnKX0gYmUgdHJhbnNmb3JtZWQgYnkgdGhlIHdvcmtmbG93IGNvbXBpbGVyLCB3aGljaCBjYW4gY2F1c2UgcnVudGltZSBmYWlsdXJlcy5gICtcbiAgICAgICAgICAgIGBcXG4gIFJlbW92ZSAke2NoYWxrLmJvbGQoYFwiJHtwa2d9XCJgKX0gZnJvbSAke2NoYWxrLmJvbGQoJ2V4dGVybmFsUGFja2FnZXMnKX0gKCR7Y2hhbGsuYm9sZCgnc2VydmVyRXh0ZXJuYWxQYWNrYWdlcycpfSBpbiBOZXh0LmpzKSB0byBmaXggdGhpcy5cXG5gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIHNraXAgdGhpcyBwYWNrYWdlIHNpbGVudGx5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRpc2NvdmVyRW50cmllcyhcbiAgICBpbnB1dHM6IHN0cmluZ1tdLFxuICAgIG91dGRpcjogc3RyaW5nLFxuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZ1xuICApOiBQcm9taXNlPERpc2NvdmVyZWRFbnRyaWVzPiB7XG4gICAgY29uc3QgcHJldmlvdXNSZXN1bHQgPSB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzLmdldChpbnB1dHMpO1xuXG4gICAgaWYgKHByZXZpb3VzUmVzdWx0KSB7XG4gICAgICByZXR1cm4gcHJldmlvdXNSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlOiBEaXNjb3ZlcmVkRW50cmllcyA9IHtcbiAgICAgIGRpc2NvdmVyZWRTdGVwczogbmV3IFNldCgpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldCgpLFxuICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IG5ldyBTZXQoKSxcbiAgICAgIGRpc2NvdmVyZWRGaWxlczogbmV3IFNldCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBkaXNjb3ZlclN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFJlc29sdmUgdGhlIFNESyBydW50aW1lIHNlcmRlIGVudHJ5IHBvaW50IHNvIHRoYXQgdGhlIGRpc2NvdmVyeSBwYXNzXG4gICAgLy8gZGlzY292ZXJzIGNsYXNzZXMgbGlrZSBgUnVuYCB0aGF0IGxpdmUgaW5zaWRlIFNESyBwYWNrYWdlcy4gV2l0aG91dCB0aGlzLFxuICAgIC8vIGZpbGVzIGxpa2UgYHJ1bi5qc2AgYXJlIG9ubHkgZGlzY292ZXJlZCB3aGVuIHVzZXIgY29kZSBpbXBvcnRzIHRoZW0uXG4gICAgLy8gVGhpcyBpcyByZXNvbHZlZCBoZXJlIChyYXRoZXIgdGhhbiBpbiBjYWxsZXJzKSBzbyB0aGF0IHRoZSBvcmlnaW5hbFxuICAgIC8vIGBpbnB1dHNgIGFycmF5IHJlZmVyZW5jZSBpcyBwcmVzZXJ2ZWQgZm9yIFdlYWtNYXAgY2FjaGluZzogY2FsbGVyc1xuICAgIC8vIGxpa2UgY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGFuZCBjcmVhdGVTdGVwc0J1bmRsZSBjYW4gc2hhcmUgdGhlIHNhbWVcbiAgICAvLyBjYWNoZSBlbnRyeSB3aGVuIHRoZXkgcGFzcyB0aGUgc2FtZSBpbnB1dEZpbGVzIGFycmF5LlxuICAgIGNvbnN0IHJlc29sdmVkV29ya2Zsb3dSdW50aW1lID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgb3V0ZGlyLFxuICAgICAgJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUvcnVuJ1xuICAgICkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlbnRyeVBvaW50cyA9IHJlc29sdmVkV29ya2Zsb3dSdW50aW1lXG4gICAgICA/IFsuLi5pbnB1dHMsIHJlc29sdmVkV29ya2Zsb3dSdW50aW1lXVxuICAgICAgOiBpbnB1dHM7XG5cbiAgICBjb25zdCBlZmZlY3RpdmVUc2NvbmZpZ1BhdGggPVxuICAgICAgdHNjb25maWdQYXRoID8/IChhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKSk7XG5cbiAgICBhd2FpdCBmYXN0RGlzY292ZXJFbnRyaWVzKHtcbiAgICAgIGVudHJ5UG9pbnRzLFxuICAgICAgc3RhdGUsXG4gICAgICBkZWZhdWx0VHNjb25maWdQYXRoOiBlZmZlY3RpdmVUc2NvbmZpZ1BhdGgsXG4gICAgICB3b3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgZGlzY292ZXJXb3JrZmxvd3NJbk5vZGVNb2R1bGVzOlxuICAgICAgICB0aGlzLnJlc29sdmVEaXNjb3ZlcldvcmtmbG93c0luTm9kZU1vZHVsZXMoKSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgYERpc2NvdmVyaW5nIHdvcmtmbG93IGRpcmVjdGl2ZXNgLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIGRpc2NvdmVyU3RhcnR9bXNgXG4gICAgKTtcblxuICAgIC8vIFdhcm4gYWJvdXQgZXh0ZXJuYWwgcGFja2FnZXMgdGhhdCBjb250YWluIHdvcmtmbG93IGNvZGVcbiAgICBhd2FpdCB0aGlzLndhcm5BYm91dEV4dGVybmFsV29ya2Zsb3dQYWNrYWdlcygpO1xuXG4gICAgdGhpcy5kaXNjb3ZlcmVkRW50cmllcy5zZXQoaW5wdXRzLCBzdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBnZW5lcmF0ZWQgd3JpdGUgbWF5IGJlIHNraXBwZWQgd2hlbiBpdCB3b3VsZCBub3QgY2hhbmdlIHRoZVxuICAgKiBmaWxlLiBEZWZhdWx0cyB0byBgdHJ1ZWA6IHRoZSBnZW5lcmF0ZWQgcm91dGVzIGxpdmUgaW5zaWRlIHRoZSBkaXJlY3RvcnlcbiAgICogdGhlIGRldiBzZXJ2ZXIgd2F0Y2hlcywgc28gcmV3cml0aW5nIGlkZW50aWNhbCBieXRlcyBzdGlsbCBpbnZhbGlkYXRlcyBpdHNcbiAgICogd2F0Y2hlciBhbmQgZm9yY2VzIGEgcmVjb21waWxlIG9mIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbS5cbiAgICpcbiAgICogVGFyZ2V0cyB3aG9zZSBjb25zdW1lcnMgdHJlYXQgdGhlIG10aW1lIG9mIGEgZ2VuZXJhdGVkIGZpbGUgYXMgYSBjaGFuZ2VcbiAgICogc2lnbmFsIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byBgZmFsc2VgLCBvdGhlcndpc2Ugc2tpcHBpbmcgdGhlIHdyaXRlIGFsc29cbiAgICogc3VwcHJlc3NlcyB0aGUgc2lnbmFsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBza2lwc1VuY2hhbmdlZEdlbmVyYXRlZFdyaXRlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZ2VuZXJhdGVkIGZpbGVzIGF0b21pY2FsbHkgd2hlcmUgcG9zc2libGUuIE9uIFdpbmRvd3MsIE5leHQuanMgY2FuXG4gICAqIGJyaWVmbHkgaG9sZCBnZW5lcmF0ZWQgcm91dGUgZmlsZXMgb3BlbiB3aGlsZSBjb21waWxpbmcgdGhlbSwgd2hpY2ggbWFrZXNcbiAgICogcmVuYW1lLW92ZXItZXhpc3RpbmcgZmFpbCB3aXRoIEVQRVJNL0VBQ0NFUy4gSW4gdGhhdCBjYXNlLCBmYWxsIGJhY2sgdG8gYVxuICAgKiBkaXJlY3Qgb3ZlcndyaXRlIHNvIHdhdGNoIHJlYnVpbGRzIGNhbiBzdGlsbCBtYWtlIHByb2dyZXNzLlxuICAgKlxuICAgKiBTa2lwcyB3cml0ZXMgdGhhdCB3b3VsZCBub3QgY2hhbmdlIHRoZSBmaWxlLCB1bmxlc3MgdGhlIHRhcmdldCBvcHRzIG91dFxuICAgKiB2aWEge0BsaW5rIHNraXBzVW5jaGFuZ2VkR2VuZXJhdGVkV3JpdGVzfS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB3cml0ZUdlbmVyYXRlZEZpbGUoXG4gICAgdGFyZ2V0UGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNraXBzVW5jaGFuZ2VkR2VuZXJhdGVkV3JpdGVzICYmXG4gICAgICAoYXdhaXQgaGFzU2FtZUNvbnRlbnQodGFyZ2V0UGF0aCwgY29udGVudCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFBhdGggPSBgJHt0YXJnZXRQYXRofS4ke3JhbmRvbVVVSUQoKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcFBhdGgsIGNvbnRlbnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZW5hbWUodGVtcFBhdGgsIHRhcmdldFBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPVxuICAgICAgICBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvclxuICAgICAgICAgID8gKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgIChlcnJvckNvZGUgPT09ICdFUEVSTScgfHwgZXJyb3JDb2RlID09PSAnRUFDQ0VTJylcbiAgICAgICkge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0UGF0aCwgY29udGVudCk7XG4gICAgICAgIGF3YWl0IHJtKHRlbXBQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGRlYnVnIGluZm9ybWF0aW9uIHRvIGEgSlNPTiBmaWxlIGZvciB0cm91Ymxlc2hvb3RpbmcgYnVpbGQgaXNzdWVzLlxuICAgKiBVc2VzIGF0b21pYyB3cml0ZSAodGVtcCBmaWxlICsgcmVuYW1lKSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuXG4gICAqIG11bHRpcGxlIGJ1aWxkcyBydW4gY29uY3VycmVudGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURlYnVnRmlsZShcbiAgICBvdXRmaWxlOiBzdHJpbmcsXG4gICAgZGVidWdEYXRhOiBvYmplY3QsXG4gICAgbWVyZ2U/OiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuY29uZmlnLmRlYnVnRmlsZVByZWZpeCB8fCAnJztcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gYCR7ZGlybmFtZShvdXRmaWxlKX0vJHtwcmVmaXh9JHtiYXNlbmFtZShvdXRmaWxlKX0uZGVidWcuanNvbmA7XG4gICAgbGV0IGV4aXN0aW5nID0ge307XG5cbiAgICB0cnkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IHlldCBvciBpcyBjb3JydXB0ZWQgLSBzdGFydCBmcmVzaC5cbiAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgZm9yIEVOT0VOVCAoZmlsZSBub3QgZm91bmQpIGFzIHRoYXQncyBleHBlY3RlZCBvbiBmaXJzdCBydW4uXG4gICAgICAgICAgaWYgKChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgcmVhZGluZyBkZWJ1ZyBmaWxlLCBzdGFydGluZyBmcmVzaDonLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkRGF0YSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4uZGVidWdEYXRhLFxuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgICAgICAyXG4gICAgICApO1xuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlR2VuZXJhdGVkRmlsZSh0YXJnZXRQYXRoLCBtZXJnZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gd3JpdGUgZGVidWcgZmlsZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYW5kIG9wdGlvbmFsbHkgdGhyb3dzIG9uIGVzYnVpbGQgZXJyb3JzIGFuZCB3YXJuaW5ncy5cbiAgICogQHBhcmFtIHRocm93T25FcnJvciAtIElmIHRydWUsIHRocm93cyBhbiBlcnJvciB3aGVuIGVzYnVpbGQgZXJyb3JzIGFyZSBwcmVzZW50XG4gICAqL1xuICBwcml2YXRlIGxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICByZXN1bHQ6IHsgZXJyb3JzPzogYW55W107IHdhcm5pbmdzPzogYW55W10gfSxcbiAgICBwaGFzZTogc3RyaW5nLFxuICAgIHRocm93T25FcnJvciA9IHRydWUsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHN1cHByZXNzV2FybmluZ3M/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lcnJvcnMgJiYgcmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGDinYwgZXNidWlsZCBlcnJvcnMgaW4gJHtwaGFzZX06YCk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlcnJvciBvZiByZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHtlcnJvci50ZXh0fWApO1xuICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goZXJyb3IudGV4dCk7XG4gICAgICAgIGlmIChlcnJvci5sb2NhdGlvbikge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gYCAgICBhdCAke2Vycm9yLmxvY2F0aW9uLmZpbGV9OiR7ZXJyb3IubG9jYXRpb24ubGluZX06JHtlcnJvci5sb2NhdGlvbi5jb2x1bW59YDtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGxvY2F0aW9uKTtcbiAgICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2gobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93QnVpbGRFcnJvcihcbiAgICAgICAgICBgQnVpbGQgZmFpbGVkIGR1cmluZyAke3BoYXNlfTpcXG4ke2Vycm9yTWVzc2FnZXMuam9pbignXFxuJyl9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiBgUmV2aWV3IHRoZSBlc2J1aWxkIGVycm9ycyBhYm92ZSDigJQgdGhleSBjb21lIGZyb20gdGhlICR7cGhhc2V9IGJ1bmRsZS4gRml4IHRoZSBvZmZlbmRpbmcgc291cmNlIGZpbGVzIGFuZCByZS1ydW4gdGhlIGJ1aWxkLmAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFvcHRpb25zPy5zdXBwcmVzc1dhcm5pbmdzICYmXG4gICAgICByZXN1bHQud2FybmluZ3MgJiZcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCEgIGVzYnVpbGQgd2FybmluZ3MgaW4gJHtwaGFzZX06YCk7XG4gICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2YgcmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgICAke3dhcm5pbmcudGV4dH1gKTtcbiAgICAgICAgaWYgKHdhcm5pbmcubG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgICAgIGF0ICR7d2FybmluZy5sb2NhdGlvbi5maWxlfToke3dhcm5pbmcubG9jYXRpb24ubGluZX06JHt3YXJuaW5nLmxvY2F0aW9uLmNvbHVtbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBhYnNvbHV0ZSBmaWxlIHBhdGggdG8gYSBub3JtYWxpemVkIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVGaWxlcGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBhYnNvbHV0ZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgIC9cXFxcL2csXG4gICAgICAnLydcbiAgICApO1xuICAgIC8vIEhhbmRsZSBmaWxlcyBkaXNjb3ZlcmVkIG91dHNpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgIC5qb2luKCcvJyk7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENhY2hlZE1hbmlmZXN0VHJhbnNmb3JtKFxuICAgIGZpbGU6IHN0cmluZyxcbiAgICBtb2RlOiAnd29ya2Zsb3cnIHwgJ3N0ZXAnXG4gICk6IFByb21pc2U8V29ya2Zsb3dNYW5pZmVzdD4ge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChmaWxlKTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke21vZGV9OiR7ZmlsZX1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubWFuaWZlc3RUcmFuc2Zvcm1DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChcbiAgICAgIGNhY2hlZCAmJlxuICAgICAgY2FjaGVkLnNpemUgPT09IHN0YXRzLnNpemUgJiZcbiAgICAgIGNhY2hlZC5tdGltZU1zID09PSBzdGF0cy5tdGltZU1zXG4gICAgKSB7XG4gICAgICByZXR1cm4gY2FjaGVkLm1hbmlmZXN0O1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG4gICAgY29uc3QgcmVsYXRpdmVGaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVGaWxlcGF0aChmaWxlKTtcbiAgICBjb25zdCB7IHdvcmtmbG93TWFuaWZlc3QgfSA9IGF3YWl0IGFwcGx5U3djVHJhbnNmb3JtKFxuICAgICAgcmVsYXRpdmVGaWxlcGF0aCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIG1vZGUsXG4gICAgICBmaWxlLFxuICAgICAgdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICk7XG4gICAgdGhpcy5tYW5pZmVzdFRyYW5zZm9ybUNhY2hlLnNldChjYWNoZUtleSwge1xuICAgICAgc2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgIG10aW1lTXM6IHN0YXRzLm10aW1lTXMsXG4gICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICB9KTtcbiAgICByZXR1cm4gd29ya2Zsb3dNYW5pZmVzdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllcihmaWxlOiBzdHJpbmcsIHJvdXRlRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgaW1wb3J0UGF0aCwgaXNQYWNrYWdlIH0gPSBnZXRJbXBvcnRQYXRoKFxuICAgICAgZmlsZSxcbiAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICApO1xuICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgIHJldHVybiBpbXBvcnRQYXRoO1xuICAgIH1cblxuICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShyb3V0ZURpciwgZmlsZSkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVTdGVwU291cmNlUmVnaXN0cmF0aW9uRmlsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBvdXRmaWxlLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgfToge1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgZGlzY292ZXJlZEVudHJpZXM/OiBEaXNjb3ZlcmVkRW50cmllcztcbiAgfSk6IFByb21pc2U8V29ya2Zsb3dNYW5pZmVzdD4ge1xuICAgIGNvbnN0IHN0ZXBzQnVuZGxlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtmbG93TWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBidWlsdEluU3RlcHMgPSAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnO1xuICAgIGNvbnN0IHJlc29sdmVkQnVpbHRJblN0ZXBzID0gKGF3YWl0IGVuaGFuY2VkUmVzb2x2ZShcbiAgICAgIGRpcm5hbWUob3V0ZmlsZSksXG4gICAgICBidWlsdEluU3RlcHNcbiAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBidWlsdC1pbiBzdGVwcyBzb3VyY2VzLlxcblxcbkNhdXNlZCBieTogJHtTdHJpbmcoZXJyKX1gLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ3J1biBgcG5wbSBpbnN0YWxsIHdvcmtmbG93YCB0byByZXNvbHZlIHRoaXMgaXNzdWUuJyxcbiAgICAgICAgICBjYXVzZTogZXJyLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pKSBhcyBzdHJpbmc7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID1cbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzID8/XG4gICAgICAoYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoaW5wdXRGaWxlcywgZGlybmFtZShvdXRmaWxlKSwgdHNjb25maWdQYXRoKSk7XG4gICAgY29uc3Qgc3RlcEZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFN0ZXBzXS5zb3J0KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3NdLnNvcnQoKTtcbiAgICBjb25zdCBzZXJkZUZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXNdLnNvcnQoKTtcbiAgICBjb25zdCBzdGVwRmlsZXNTZXQgPSBuZXcgU2V0KHN0ZXBGaWxlcyk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBzZXJkZUZpbGVzLmZpbHRlcigoZikgPT4gIXN0ZXBGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgICBzb3VyY2VJbXBvcnRzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZW1pdHRlZEltcG9ydElkZW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oW2J1aWx0SW5TdGVwc10pO1xuICAgIGNvbnN0IGltcG9ydFN0YXRlbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgcm91dGVEaXIgPSBkaXJuYW1lKG91dGZpbGUpO1xuICAgIGNvbnN0IGFkZFJlZ2lzdHJhdGlvbkltcG9ydCA9IChzcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgaW1wb3J0U3RhdGVtZW50cy5wdXNoKGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfTtgKTtcbiAgICB9O1xuICAgIGNvbnN0IGFkZFJlZ2lzdHJhdGlvbkZpbGVJbXBvcnQgPSAoZmlsZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IG1vZHVsZUlkZW50aXR5S2V5KGZpbGUsIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCk7XG4gICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpO1xuICAgICAgYWRkUmVnaXN0cmF0aW9uSW1wb3J0KHRoaXMuY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXIoZmlsZSwgcm91dGVEaXIpKTtcbiAgICB9O1xuXG4gICAgYWRkUmVnaXN0cmF0aW9uSW1wb3J0KGJ1aWx0SW5TdGVwcyk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHN0ZXBGaWxlcykge1xuICAgICAgYWRkUmVnaXN0cmF0aW9uRmlsZUltcG9ydChmaWxlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHNlcmRlT25seUZpbGVzKSB7XG4gICAgICBhZGRSZWdpc3RyYXRpb25GaWxlSW1wb3J0KGZpbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuJHtpbXBvcnRTdGF0ZW1lbnRzLmpvaW4oJ1xcbicpfVxuXG5leHBvcnQgY29uc3QgX19zdGVwc19yZWdpc3RlcmVkID0gdHJ1ZTtcbmA7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShvdXRmaWxlKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUob3V0ZmlsZSwgb3V0cHV0KTtcblxuICAgIGNvbnN0IG1hbmlmZXN0RmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbLi4uc3RlcEZpbGVzLCAuLi5zZXJkZU9ubHlGaWxlcywgcmVzb2x2ZWRCdWlsdEluU3RlcHNdKVxuICAgICkuc29ydCgpO1xuICAgIGNvbnN0IHN0ZXBJZHMgPSBuZXcgTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPigpO1xuICAgIGNvbnN0IHdvcmtmbG93SWRzID0gbmV3IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4oKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmlmZXN0RmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVNYW5pZmVzdCA9IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkTWFuaWZlc3RUcmFuc2Zvcm0oXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICAnc3RlcCdcbiAgICAgICAgKTtcbiAgICAgICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgZmlsZU1hbmlmZXN0LFxuICAgICAgICAgIHN0ZXBJZHMsXG4gICAgICAgICAgd29ya2Zsb3dJZHNcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3djSWdub3JlZCgpO1xuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgJ0NyZWF0ZWQgc3RlcCByZWdpc3RyYXRpb25zJyxcbiAgICAgIGAke0RhdGUubm93KCkgLSBzdGVwc0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gICAgcmV0dXJuIHdvcmtmbG93TWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1bmRsZSBmb3Igd29ya2Zsb3cgc3RlcCBmdW5jdGlvbnMuXG4gICAqIFN0ZXBzIGhhdmUgZnVsbCBOb2RlLmpzIHJ1bnRpbWUgYWNjZXNzIGFuZCBoYW5kbGUgc2lkZSBlZmZlY3RzLCBBUEkgY2FsbHMsIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIGV4dGVybmFsaXplTm9uU3RlcHMgLSBJZiB0cnVlLCBvbmx5IGJ1bmRsZXMgc3RlcCBlbnRyeSBwb2ludHMgYW5kIGV4dGVybmFsaXplcyBvdGhlciBjb2RlXG4gICAqIEBwYXJhbSBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyAtIElmIHRydWUsIGVtaXRzIGEgc291cmNlIGltcG9ydCByZWdpc3RyYXRpb24gZmlsZSBpbnN0ZWFkIG9mIGJ1bmRsaW5nIHN0ZXAgcmVnaXN0cmF0aW9uc1xuICAgKiBAcGFyYW0gYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyAtIElmIHRydWUsIGFsc28gYnVuZGxlcyBwcm9qZWN0LWxvY2FsIGZpbGVzIGltcG9ydGVkIGJ5IHN0ZXAgZW50cmllcyBmb3IgZGlyZWN0IHJ1bnRpbWUgbG9hZGluZ1xuICAgKiBAcmV0dXJucyBCdWlsZCBjb250ZXh0IChmb3Igd2F0Y2ggbW9kZSkgYW5kIHRoZSBjb2xsZWN0ZWQgd29ya2Zsb3cgbWFuaWZlc3RcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVTdGVwc0J1bmRsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRmaWxlLFxuICAgIGV4dGVybmFsaXplTm9uU3RlcHMsXG4gICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyxcbiAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyxcbiAgICByZXdyaXRlVHNFeHRlbnNpb25zLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICBza2lwRXNtUmVxdWlyZUJhbm5lciA9IGZhbHNlLFxuICB9OiB7XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBmb3JtYXQ/OiAnY2pzJyB8ICdlc20nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzPzogYm9vbGVhbjtcbiAgICByZXdyaXRlVHNFeHRlbnNpb25zPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgc2tpcCB0aGUgYGNyZWF0ZVJlcXVpcmVgIGJhbm5lciBvbiB0aGUgc3RlcHMgYnVuZGxlLlxuICAgICAqIFVzZWQgYnkgYGNyZWF0ZUNvbWJpbmVkQnVuZGxlYCB3aXRoIGBidW5kbGVGaW5hbE91dHB1dDogdHJ1ZWAgd2hlcmVcbiAgICAgKiB0aGUgb3V0ZXIgZXNidWlsZCBwYXNzIHByb3ZpZGVzIGl0cyBvd24gYmFubmVyLCBwcmV2ZW50aW5nIHRoZVxuICAgICAqIGBfX2NyZWF0ZVJlcXVpcmVgIGlkZW50aWZpZXIgZnJvbSBiZWluZyBkZWNsYXJlZCB0d2ljZSBhZnRlciBpbmxpbmluZy5cbiAgICAgKi9cbiAgICBza2lwRXNtUmVxdWlyZUJhbm5lcj86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICBjb250ZXh0OiBlc2J1aWxkLkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfT4ge1xuICAgIGNvbnN0IHN0ZXBzQnVuZGxlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtmbG93TWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBidWlsdEluU3RlcHMgPSAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRCdWlsdEluU3RlcHMgPSBhd2FpdCBlbmhhbmNlZFJlc29sdmUoXG4gICAgICBkaXJuYW1lKG91dGZpbGUpLFxuICAgICAgJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJ1xuICAgICkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93QnVpbGRFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIGJ1aWx0LWluIHN0ZXBzIHNvdXJjZXMuXFxuXFxuQ2F1c2VkIGJ5OiAke1N0cmluZyhlcnIpfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAncnVuIGBwbnBtIGluc3RhbGwgd29ya2Zsb3dgIHRvIHJlc29sdmUgdGhpcyBpc3N1ZS4nLFxuICAgICAgICAgIGNhdXNlOiBlcnIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBEaXNjb3Zlcnkgb2Ygd29ya2Zsb3cvc3RlcC9zZXJkZSBlbnRyaWVzLiBUaGUgU0RLIHJ1bnRpbWUgZW50cnkgcG9pbnRcbiAgICAvLyAod29ya2Zsb3cvcnVudGltZSkgaXMgcmVzb2x2ZWQgaW5zaWRlIGRpc2NvdmVyRW50cmllcygpIGl0c2VsZiBzbyB0aGF0XG4gICAgLy8gY2FsbGVycyBjYW4gcGFzcyB0aGUgb3JpZ2luYWwgaW5wdXRGaWxlcyByZWZlcmVuY2UgYW5kIGJlbmVmaXQgZnJvbVxuICAgIC8vIFdlYWtNYXAgY2FjaGluZyBhY3Jvc3MgY3JlYXRlV29ya2Zsb3dzQnVuZGxlIC8gY3JlYXRlU3RlcHNCdW5kbGUgY2FsbHMuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHN0ZXBGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwc10uc29ydCgpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGFscmVhZHkgc3RlcCBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHN0ZXAgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSB3b3JrZmxvd3MgYW5kIHNlcmlhbGl6ZWQgd2hlbiByZXR1cm5pbmcgZGF0YSB0byB3b3JrZmxvd3MuXG4gICAgY29uc3Qgc3RlcEZpbGVzU2V0ID0gbmV3IFNldChzdGVwRmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICFzdGVwRmlsZXNTZXQuaGFzKGYpKTtcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzICYmXG4gICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzICYmXG4gICAgICAhYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llc1xuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgICBtYW5pZmVzdDogYXdhaXQgdGhpcy5jcmVhdGVTdGVwU291cmNlUmVnaXN0cmF0aW9uRmlsZSh7XG4gICAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgICBvdXRmaWxlLFxuICAgICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllczogZGlzY292ZXJlZCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGxvZyB0aGUgc3RlcCBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgfSk7XG5cbiAgICAvLyBIZWxwZXIgdG8gY3JlYXRlIGltcG9ydCBzdGF0ZW1lbnQgZnJvbSBmaWxlIHBhdGhcbiAgICAvLyBGb3Igd29ya3NwYWNlL25vZGVfbW9kdWxlcyBwYWNrYWdlcywgdXNlcyB0aGUgcGFja2FnZSBuYW1lIHNvIGVzYnVpbGRcbiAgICAvLyB3aWxsIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlLmpzb24gZXhwb3J0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25kaXRpb25zXG4gICAgY29uc3QgY3JlYXRlSW1wb3J0ID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFdvcmtzcGFjZVJvb3QgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya3NwYWNlRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gT25seSB1c2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGZvciB3b3Jrc3BhY2Ugc3ltbGlua3MgKGZpbGVzXG4gICAgICAvLyBvdXRzaWRlIG5vZGVfbW9kdWxlcyBpbiBhIHBhY2thZ2VzLyovc3JjLyBkaXJlY3RvcnkpLiBGb3IgdGFyYmFsbC1cbiAgICAgIC8vIGluc3RhbGxlZCBwYWNrYWdlcyAoZmlsZXMgaW5zaWRlIG5vZGVfbW9kdWxlcy8pLCBmYWxsIHRocm91Z2ggdG9cbiAgICAgIC8vIGdldEltcG9ydFBhdGggd2hpY2ggcmV0dXJucyBwYWNrYWdlIHNwZWNpZmllcnM7IHRoaXMgYWxsb3dzIHRoZVxuICAgICAgLy8gU1dDIHBsdWdpbidzIGV4dGVybmFsaXplTm9uU3RlcHMgdG8gd29yayBjb3JyZWN0bHkuXG4gICAgICBjb25zdCBpc1dvcmtzcGFjZVNvdXJjZUJhY2tlZFBhY2thZ2VGaWxlID1cbiAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKSAmJlxuICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZS5pbmNsdWRlcygnL3NyYy8nKSAmJlxuICAgICAgICAhbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgJiZcbiAgICAgICAgIShcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZSA9PT0gbm9ybWFsaXplZFdvcmtzcGFjZVJvb3QgfHxcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZS5zdGFydHNXaXRoKGAke25vcm1hbGl6ZWRXb3Jrc3BhY2VSb290fS9gKVxuICAgICAgICApO1xuICAgICAgY29uc3QgaXNTb3VyY2VCYWNrZWRQYWNrYWdlRmlsZSA9IGlzV29ya3NwYWNlU291cmNlQmFja2VkUGFja2FnZUZpbGU7XG5cbiAgICAgIGlmIChpc1NvdXJjZUJhY2tlZFBhY2thZ2VGaWxlKSB7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlUm9vdCxcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZVxuICAgICAgICApLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICAgKTtcblxuICAgICAgaWYgKGlzUGFja2FnZSkge1xuICAgICAgICAvLyBVc2UgcGFja2FnZSBuYW1lIC0gZXNidWlsZCB3aWxsIHJlc29sdmUgdmlhIHBhY2thZ2UuanNvbiBleHBvcnRzXG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke2ltcG9ydFBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBwYXRocyB0byBmb3J3YXJkIHNsYXNoZXMgYmVmb3JlIGNhbGxpbmcgcmVsYXRpdmUoKVxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBvbiBXaW5kb3dzIHdoZXJlIHJlbGF0aXZlKCkgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGggbWl4ZWQgcGF0aCBmb3JtYXRzXG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGZpbGVcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vIHNvIGVzYnVpbGQgcmVzb2x2ZXMgdGhlbSBjb3JyZWN0bHkuXG4gICAgICAvLyBQYXRocyBsaWtlIFwiLm91dHB1dC8uLi5cIiBhcmUgbm90IHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYW5kIG11c3RcbiAgICAgIC8vIGJlY29tZSBcIi4vLm91dHB1dC8uLi5cIi5cbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgdmlydHVhbCBlbnRyeSB0aGF0IGltcG9ydHMgYWxsIGZpbGVzLiBBbGwgc3RlcCBkZWZpbml0aW9uc1xuICAgIC8vIHdpbGwgZ2V0IHJlZ2lzdGVyZWQgdGhhbmtzIHRvIHRoZSBzd2MgdHJhbnNmb3JtLlxuICAgIC8vXG4gICAgLy8gRGVkdXBlIGltcG9ydHMgYnkgY2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eSBzbyB3ZSBuZXZlciBlbWl0IHR3b1xuICAgIC8vIGltcG9ydCBsaW5lcyB0aGF0IHJlc29sdmUgdG8gdGhlIHNhbWUgcGh5c2ljYWwgbW9kdWxlLiBQcmUtc2VlZCB0aGVcbiAgICAvLyBzZXQgd2l0aCB0aGUgYnVpbHQtaW4gc3RlcHMgaW1wb3J0IHNvIGEgd29ya3NwYWNlIHN0ZXAgZmlsZSBhdFxuICAgIC8vIGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvaW50ZXJuYWwvYnVpbHRpbnMudHNgIGRvZXNuJ3QgZW1pdCBhIHNlY29uZCxcbiAgICAvLyByZWxhdGl2ZS1wYXRoIGNvbXBldGluZyBpbXBvcnQ7IGVzYnVpbGQgd291bGQgb3RoZXJ3aXNlIHRyYW5zZm9ybVxuICAgIC8vIGJvdGggY29waWVzIGFuZCB0aGUgc3djIHBsdWdpbiB3b3VsZCBnZW5lcmF0ZSBkdXBsaWNhdGUgc3RlcCBJRHMuXG4gICAgY29uc3QgZW1pdHRlZEltcG9ydElkZW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oW2J1aWx0SW5TdGVwc10pO1xuICAgIGNvbnN0IGJ1aWxkSW1wb3J0cyA9IChmaWxlczogc3RyaW5nW10pOiBzdHJpbmcgPT5cbiAgICAgIGZpbGVzXG4gICAgICAgIC5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IG1vZHVsZUlkZW50aXR5S2V5KGZpbGUsIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCk7XG4gICAgICAgICAgaWYgKGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmhhcyhpZGVudGl0eSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKGNyZWF0ZUltcG9ydClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3Qgc3RlcEltcG9ydHMgPSBidWlsZEltcG9ydHMoc3RlcEZpbGVzKTtcblxuICAgIC8vIEluY2x1ZGUgc2VyZGUtb25seSBmaWxlcyBmb3IgY2xhc3MgcmVnaXN0cmF0aW9uIHNpZGUgZWZmZWN0c1xuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyhzZXJkZU9ubHlGaWxlcyk7XG5cbiAgICBjb25zdCBlbnRyeUNvbnRlbnQgPSBgXG4gICAgLy8gQnVpbHQgaW4gc3RlcHNcbiAgICBpbXBvcnQgJyR7YnVpbHRJblN0ZXBzfSc7XG4gICAgLy8gVXNlciBzdGVwc1xuICAgICR7c3RlcEltcG9ydHN9XG4gICAgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXG4gICAgJHtzZXJkZUltcG9ydHN9XG4gICAgLy8gU2VudGluZWwgZXhwb3J0IHNvIGJ1bmRsZXJzIChyb2xsdXApIGRvbid0IHRyZWUtc2hha2UgdGhpcyBtb2R1bGVcbiAgICAvLyB3aGVuIGl0J3MgaW1wb3J0ZWQgYXMgYSBzaWRlLWVmZmVjdC1vbmx5IGRlcGVuZGVuY3kuXG4gICAgZXhwb3J0IGNvbnN0IF9fc3RlcHNfcmVnaXN0ZXJlZCA9IHRydWU7YDtcblxuICAgIC8vIEJ1bmRsZSB3aXRoIGVzYnVpbGQgYW5kIG91ciBjdXN0b20gU1dDIHBsdWdpblxuICAgIGNvbnN0IGVudHJpZXNUb0J1bmRsZSA9IGV4dGVybmFsaXplTm9uU3RlcHNcbiAgICAgID8gW1xuICAgICAgICAgIC4uLnN0ZXBGaWxlcyxcbiAgICAgICAgICAuLi5zZXJkZUZpbGVzLFxuICAgICAgICAgIC4uLihyZXNvbHZlZEJ1aWx0SW5TdGVwcyA/IFtyZXNvbHZlZEJ1aWx0SW5TdGVwc10gOiBbXSksXG4gICAgICAgIF1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzVG9CdW5kbGUgPSBlbnRyaWVzVG9CdW5kbGVcbiAgICAgID8gYXdhaXQgd2l0aFJlYWxwYXRocyhlbnRyaWVzVG9CdW5kbGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub3JtYWxpemVkU2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLnN0ZXBGaWxlcyxcbiAgICAgIC4uLnNlcmRlT25seUZpbGVzLFxuICAgICAgLi4uKHJlc29sdmVkQnVpbHRJblN0ZXBzID8gW3Jlc29sdmVkQnVpbHRJblN0ZXBzXSA6IFtdKSxcbiAgICBdKTtcbiAgICBjb25zdCBlc2J1aWxkVHNjb25maWdPcHRpb25zID1cbiAgICAgIGF3YWl0IGdldEVzYnVpbGRUc2NvbmZpZ09wdGlvbnModHNjb25maWdQYXRoKTtcbiAgICBjb25zdCB7IGJhbm5lcjogaW1wb3J0TWV0YUJhbm5lciwgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lIH0gPVxuICAgICAgdGhpcy5nZXRDanNJbXBvcnRNZXRhUG9seWZpbGwoZm9ybWF0KTtcbiAgICBjb25zdCBlc21SZXF1aXJlQmFubmVyID0gc2tpcEVzbVJlcXVpcmVCYW5uZXJcbiAgICAgID8gJydcbiAgICAgIDogdGhpcy5nZXRFc21SZXF1aXJlQmFubmVyKGZvcm1hdCk7XG5cbiAgICBjb25zdCBlc2J1aWxkQ3R4ID0gYXdhaXQgZXNidWlsZC5jb250ZXh0KHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7aW1wb3J0TWV0YUJhbm5lcn0ke2VzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogZW50cnlDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICBjb25kaXRpb25zOiBbJ25vZGUnXSxcbiAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGxvZ0xldmVsOiAnZXJyb3InLFxuICAgICAgLy8gVXNlIHRzY29uZmlnIGZvciBwYXRoIGFsaWFzIHJlc29sdXRpb24uXG4gICAgICAvLyBGb3Igc3ltbGlua2VkIGNvbmZpZ3MgdGhpcyB1c2VzIHRzY29uZmlnUmF3IHRvIHByZXNlcnZlIGN3ZC1yZWxhdGl2ZSBhbGlhc2VzLlxuICAgICAgLi4uZXNidWlsZFRzY29uZmlnT3B0aW9ucyxcbiAgICAgIGRlZmluZTogaW1wb3J0TWV0YURlZmluZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICAvLyBTb3VyY2UgbWFwcyBmb3IgYmV0dGVyIHN0YWNrIHRyYWNlcyBpbiBzdGVwIGV4ZWN1dGlvbi4gU3RlcHMgZXhlY3V0ZVxuICAgICAgLy8gaW4gTm9kZS5qcyBjb250ZXh0IGFuZCBpbmxpbmUgc291cmNlbWFwcyBnaXZlIG1lYW5pbmdmdWwgc3RhY2sgdHJhY2VzXG4gICAgICAvLyB3aXRoIHByb3BlciBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMgd2hlbiBlcnJvcnMgb2NjdXIgaW4gZGVlcGx5XG4gICAgICAvLyBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMgYWNyb3NzIG11bHRpcGxlIGZpbGVzLiBEZWZhdWx0cyB0byBpbmxpbmUgaW5cbiAgICAgIC8vIGRldmVsb3BtZW50IGFuZCBvZmYgaW4gcHJvZHVjdGlvbiAoc2VlIGBkZWZhdWx0U291cmNlbWFwTW9kZWApIHRvIGtlZXBcbiAgICAgIC8vIHByb2R1Y3Rpb24gZnVuY3Rpb24gYnVuZGxlcyBzbWFsbDsgb3ZlcnJpZGUgd2l0aCB0aGUgYHNvdXJjZW1hcGBcbiAgICAgIC8vIGNvbmZpZyBvcHRpb24gb3IgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIuXG4gICAgICBzb3VyY2VtYXA6IHRoaXMucmVzb2x2ZVNvdXJjZW1hcCh0aGlzLmRlZmF1bHRTb3VyY2VtYXBNb2RlKSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgLy8gSGFuZGxlIHBzZXVkby1wYWNrYWdlcyBsaWtlICdzZXJ2ZXItb25seScgYW5kICdjbGllbnQtb25seScgYnkgcHJvdmlkaW5nXG4gICAgICAgIC8vIGVtcHR5IG1vZHVsZXMuIE11c3QgcnVuIGZpcnN0IHRvIGludGVyY2VwdCB0aGVzZSBiZWZvcmUgb3RoZXIgcmVzb2x1dGlvbi5cbiAgICAgICAgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbigpLFxuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IG5vcm1hbGl6ZWRFbnRyaWVzVG9CdW5kbGUsXG4gICAgICAgICAgb3V0ZGlyOiBvdXRmaWxlID8gZGlybmFtZShvdXRmaWxlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcm9qZWN0Um9vdDogdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJSb290OiB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3QsXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBvbkFmdGVyVHJhbnNmb3JtOiB0aGlzLmNvbmZpZy5vbkFmdGVyVHJhbnNmb3JtLFxuICAgICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmV3cml0ZVRzRXh0ZW5zaW9ucyxcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogbm9ybWFsaXplZFNpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICAvLyBQbHVnaW4gc2hvdWxkIGNhdGNoIG1vc3QgdGhpbmdzLCBidXQgdGhpcyBsZXRzIHVzZXJzIGhhcmQgb3ZlcnJpZGVcbiAgICAgIC8vIGlmIHRoZSBwbHVnaW4gbWlzc2VzIGFueXRoaW5nIHRoYXQgc2hvdWxkIGJlIGV4dGVybmFsaXplZFxuICAgICAgZXh0ZXJuYWw6IFsnYnVuJywgJ2J1bjoqJywgLi4uKHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXMgfHwgW10pXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0ZXBzUmVzdWx0ID0gYXdhaXQgZXNidWlsZEN0eC5yZWJ1aWxkKCk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhzdGVwc1Jlc3VsdCwgJ3N0ZXBzIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgJ0NyZWF0ZWQgc3RlcHMgYnVuZGxlJyxcbiAgICAgIGAke0RhdGUubm93KCkgLSBzdGVwc0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgd29ya2Zsb3ctb25seSBmaWxlcyB0aGF0IG1heSBoYXZlIGJlZW4gdHJlZS1zaGFrZW4gZnJvbSB0aGUgYnVuZGxlLlxuICAgIC8vIFRoZXNlIGZpbGVzIGhhdmUgbm8gc3RlcHMsIHNvIGVzYnVpbGQgcmVtb3ZlcyB0aGVtLCBidXQgd2Ugc3RpbGwgbmVlZCB0aGVpclxuICAgIC8vIHdvcmtmbG93IG1ldGFkYXRhIGZvciB0aGUgbWFuaWZlc3QuIFRyYW5zZm9ybSB0aGVtIHNlcGFyYXRlbHkuXG4gICAgY29uc3Qgd29ya2Zsb3dPbmx5RmlsZXMgPSB3b3JrZmxvd0ZpbGVzLmZpbHRlcihcbiAgICAgIChmKSA9PiAhc3RlcEZpbGVzLmluY2x1ZGVzKGYpXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHdvcmtmbG93T25seUZpbGVzLm1hcChhc3luYyAod29ya2Zsb3dGaWxlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZU1hbmlmZXN0ID0gYXdhaXQgdGhpcy5nZXRDYWNoZWRNYW5pZmVzdFRyYW5zZm9ybShcbiAgICAgICAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgICAgICAgICd3b3JrZmxvdydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmaWxlTWFuaWZlc3Qud29ya2Zsb3dzKSB7XG4gICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LndvcmtmbG93cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Qud29ya2Zsb3dzIHx8IHt9LFxuICAgICAgICAgICAgICBmaWxlTWFuaWZlc3Qud29ya2Zsb3dzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsZU1hbmlmZXN0LmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyB8fCB7fSxcbiAgICAgICAgICAgICAgZmlsZU1hbmlmZXN0LmNsYXNzZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGJ1dCBjb250aW51ZSAtIGRvbid0IGZhaWwgYnVpbGQgZm9yIHdvcmtmbG93LW9ubHkgZmlsZSBpc3N1ZXNcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgV2FybmluZzogRmFpbGVkIHRvIGV4dHJhY3Qgd29ya2Zsb3cgbWV0YWRhdGEgZnJvbSAke3dvcmtmbG93RmlsZX06YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3djSWdub3JlZCgpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICByZXR1cm4geyBjb250ZXh0OiBlc2J1aWxkQ3R4LCBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCB9O1xuICAgIH1cbiAgICBhd2FpdCBlc2J1aWxkQ3R4LmRpc3Bvc2UoKTtcbiAgICByZXR1cm4geyBjb250ZXh0OiB1bmRlZmluZWQsIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1bmRsZSBmb3Igd29ya2Zsb3cgb3JjaGVzdHJhdGlvbiBmdW5jdGlvbnMuXG4gICAqIFdvcmtmbG93cyBydW4gaW4gYSBzYW5kYm94ZWQgVk0gYW5kIGNvb3JkaW5hdGUgc3RlcCBleGVjdXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBidW5kbGVGaW5hbE91dHB1dCAtIElmIGZhbHNlLCBza2lwcyB0aGUgZmluYWwgYnVuZGxpbmcgc3RlcCAodXNlZCBieSBOZXh0LmpzKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdvcmtmbG93c0J1bmRsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRmaWxlLFxuICAgIGJ1bmRsZUZpbmFsT3V0cHV0ID0gdHJ1ZSxcbiAgICBrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQgPSB0aGlzLmNvbmZpZy53YXRjaCxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gIH06IHtcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgb3V0ZmlsZTogc3RyaW5nO1xuICAgIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gICAgYnVuZGxlRmluYWxPdXRwdXQ/OiBib29sZWFuO1xuICAgIGtlZXBJbnRlcmltQnVuZGxlQ29udGV4dD86IGJvb2xlYW47XG4gICAgZGlzY292ZXJlZEVudHJpZXM/OiBEaXNjb3ZlcmVkRW50cmllcztcbiAgfSk6IFByb21pc2U8e1xuICAgIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xuICAgIGludGVyaW1CdW5kbGVDdHg/OiBlc2J1aWxkLkJ1aWxkQ29udGV4dDtcbiAgICBidW5kbGVGaW5hbD86IChpbnRlcmltQnVuZGxlUmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgLyoqIFRoZSByYXcgd29ya2Zsb3cgVk0gY29kZSAoYmVmb3JlIHdyYXBwaW5nIHdpdGggZW50cnlwb2ludCkgKi9cbiAgICBpbnRlcmltQnVuZGxlVGV4dD86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgZGlzY292ZXJlZEVudHJpZXMgPz9cbiAgICAgIChhd2FpdCB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dEZpbGVzLCBkaXJuYW1lKG91dGZpbGUpLCB0c2NvbmZpZ1BhdGgpKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93c10uc29ydCgpO1xuICAgIGNvbnN0IHNlcmRlRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlc10uc29ydCgpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZSBmaWxlcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHdvcmtmbG93IGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvbi5cbiAgICAvLyBDbGFzc2VzIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSBzdGVwcyBvciB3aGVuIHNlcmlhbGl6aW5nIGRhdGEgdG8gc2VuZCB0byBzdGVwcy5cbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzU2V0ID0gbmV3IFNldCh3b3JrZmxvd0ZpbGVzKTtcbiAgICBjb25zdCBzZXJkZU9ubHlGaWxlcyA9IHNlcmRlRmlsZXMuZmlsdGVyKChmKSA9PiAhd29ya2Zsb3dGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgLy8gbG9nIHRoZSB3b3JrZmxvdyBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7IHdvcmtmbG93RmlsZXMsIHNlcmRlT25seUZpbGVzIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHBhY2thZ2VzLCB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgc28gZXNidWlsZCB3aWxsIHJlc29sdmUgdGhyb3VnaFxuICAgIC8vIHBhY2thZ2UuanNvbiBleHBvcnRzIHdpdGggY29uZGl0aW9uczogWyd3b3JrZmxvdyddXG4gICAgY29uc3QgY3JlYXRlSW1wb3J0ID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgICAgLy8gVXNlIHBhY2thZ2UgbmFtZSAtIGVzYnVpbGQgd2lsbCByZXNvbHZlIHZpYSBwYWNrYWdlLmpzb24gZXhwb3J0c1xuICAgICAgICAvLyBhbmQgYXBwbHkgdGhlICd3b3JrZmxvdycgY29uZGl0aW9uXG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke2ltcG9ydFBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBwYXRocyB0byBmb3J3YXJkIHNsYXNoZXMgYmVmb3JlIGNhbGxpbmcgcmVsYXRpdmUoKVxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBvbiBXaW5kb3dzIHdoZXJlIHJlbGF0aXZlKCkgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGggbWl4ZWQgcGF0aCBmb3JtYXRzXG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGZpbGVcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vIHNvIGVzYnVpbGQgcmVzb2x2ZXMgdGhlbSBjb3JyZWN0bHkuXG4gICAgICAvLyBQYXRocyBsaWtlIFwiLm91dHB1dC8uLi5cIiBhcmUgbm90IHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYW5kIG11c3RcbiAgICAgIC8vIGJlY29tZSBcIi4vLm91dHB1dC8uLi5cIi5cbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgdmlydHVhbCBlbnRyeSB0aGF0IGltcG9ydHMgYWxsIHdvcmtmbG93IGZpbGVzLiBEZWR1cGUgYnlcbiAgICAvLyBjYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5IHNvIHNvdXJjZS9kaXN0IGNvcGllcyBvZiB0aGUgc2FtZSB3b3Jrc3BhY2VcbiAgICAvLyBwYWNrYWdlIGV4cG9ydCBkb24ndCBib3RoIGdldCBpbXBvcnRlZCAod2hpY2ggd291bGQgbWFrZSB0aGUgc3djXG4gICAgLy8gcGx1Z2luIGdlbmVyYXRlIGR1cGxpY2F0ZSB3b3JrZmxvdyBJRHMpLlxuICAgIGNvbnN0IGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgYnVpbGRJbXBvcnRzID0gKGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZyA9PlxuICAgICAgZmlsZXNcbiAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aXR5ID0gbW9kdWxlSWRlbnRpdHlLZXkoZmlsZSwgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290KTtcbiAgICAgICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmFkZChpZGVudGl0eSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoY3JlYXRlSW1wb3J0KVxuICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAvLyBUaGUgU1dDIHBsdWdpbiBpbiB3b3JrZmxvdyBtb2RlIGVtaXRzIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KHdvcmtmbG93SWQsIGZuKWBcbiAgICAvLyBjYWxscyBkaXJlY3RseSwgc28gd2Ugb25seSBuZWVkIHRvIGltcG9ydCB0aGUgZmlsZXMgKE1hcCBpcyBpbml0aWFsaXplZCB2aWEgYmFubmVyKVxuICAgIGNvbnN0IHdvcmtmbG93SW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyh3b3JrZmxvd0ZpbGVzKTtcblxuICAgIC8vIEluY2x1ZGUgc2VyZGUtb25seSBmaWxlcyBmb3IgY2xhc3MgcmVnaXN0cmF0aW9uIHNpZGUgZWZmZWN0c1xuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyhzZXJkZU9ubHlGaWxlcyk7XG5cbiAgICBjb25zdCBpbXBvcnRzID0gc2VyZGVJbXBvcnRzXG4gICAgICA/IGAke3dvcmtmbG93SW1wb3J0c31cXG4vLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cXG4ke3NlcmRlSW1wb3J0c31gXG4gICAgICA6IHdvcmtmbG93SW1wb3J0cztcblxuICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzID0gYXdhaXQgd2l0aFJlYWxwYXRocyhbXG4gICAgICAuLi53b3JrZmxvd0ZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgXSk7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW4gaW4gd29ya2Zsb3cgbW9kZS5cbiAgICAvLyB0aGlzIGJ1bmRsZSB3aWxsIGJlIHJ1biBpbnNpZGUgYSB2bSBpc29sYXRlXG4gICAgY29uc3QgaW50ZXJpbUJ1bmRsZUN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogaW1wb3J0cyxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGZvcm1hdDogJ2NqcycsIC8vIFJ1bnMgaW5zaWRlIHRoZSBWTSB3aGljaCBleHBlY3RzIGNqc1xuICAgICAgcGxhdGZvcm06ICduZXV0cmFsJywgLy8gVGhlIHBsYXRmb3JtIGlzIG5laXRoZXIgbm9kZSBub3IgYnJvd3NlclxuICAgICAgbWFpbkZpZWxkczogWydtb2R1bGUnLCAnbWFpbiddLCAvLyBUbyBzdXBwb3J0IG5wbSBzdHlsZSBpbXBvcnRzXG4gICAgICBjb25kaXRpb25zOiBbJ3dvcmtmbG93J10sIC8vIEFsbG93IHBhY2thZ2VzIHRvIGV4cG9ydCAnd29ya2Zsb3cnIGNvbXBsaWFudCB2ZXJzaW9uc1xuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHdvcmtmbG93IHJlZ2lzdHJ5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1bmRsZVxuICAgICAgLy8gVGhpcyBtdXN0IGJlIGluIGJhbm5lciAobm90IHRoZSB2aXJ0dWFsIGVudHJ5KSBiZWNhdXNlIGVzYnVpbGQncyBidW5kbGluZ1xuICAgICAgLy8gY2FuIHJlb3JkZXIgY29kZSwgYW5kIHRoZSAuc2V0KCkgY2FsbHMgbmVlZCB0aGUgTWFwIHRvIGV4aXN0IGZpcnN0XG4gICAgICBiYW5uZXI6IHtcbiAgICAgICAganM6ICdnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MgPSBuZXcgTWFwKCk7JyxcbiAgICAgIH0sXG4gICAgICAvLyBTb3VyY2UgbWFwcyBmb3IgYmV0dGVyIHN0YWNrIHRyYWNlcyBpbiB3b3JrZmxvdyBWTSBleGVjdXRpb24uIFRoaXNcbiAgICAgIC8vIGludGVybWVkaWF0ZSBidW5kbGUgaXMgZXhlY3V0ZWQgdmlhIHJ1bkluQ29udGV4dCgpIGluIGEgVk0sIHNvIGlubGluZVxuICAgICAgLy8gc291cmNlIG1hcHMgZ2l2ZSBtZWFuaW5nZnVsIHN0YWNrIHRyYWNlcyBpbnN0ZWFkIG9mXG4gICAgICAvLyBcImV2YWxtYWNoaW5lLjxhbm9ueW1vdXM+XCIuIERlZmF1bHRzIHRvIGlubGluZSBpbiBkZXZlbG9wbWVudCBhbmQgb2ZmIGluXG4gICAgICAvLyBwcm9kdWN0aW9uIChzZWUgYGRlZmF1bHRTb3VyY2VtYXBNb2RlYCkgdG8ga2VlcCBwcm9kdWN0aW9uIGZ1bmN0aW9uXG4gICAgICAvLyBidW5kbGVzIHNtYWxsOyBvdmVycmlkZSB3aXRoIHRoZSBgc291cmNlbWFwYCBjb25maWcgb3B0aW9uIG9yIHRoZVxuICAgICAgLy8gYFdPUktGTE9XX1NPVVJDRU1BUGAgZW52IHZhci4gVGhlIHJ1bnRpbWUgcmVtYXBzIHN0YWNrcyBvbmx5IHdoZW4gYVxuICAgICAgLy8gbWFwIGlzIHByZXNlbnQsIHNvIGRpc2FibGluZyBtYXBzIGRlZ3JhZGVzIGdyYWNlZnVsbHkuXG4gICAgICBzb3VyY2VtYXA6IHRoaXMucmVzb2x2ZVNvdXJjZW1hcCh0aGlzLmRlZmF1bHRTb3VyY2VtYXBNb2RlKSxcbiAgICAgIC8vIFVzZSB0c2NvbmZpZyBmb3IgcGF0aCBhbGlhcyByZXNvbHV0aW9uLlxuICAgICAgLy8gRm9yIHN5bWxpbmtlZCBjb25maWdzIHRoaXMgdXNlcyB0c2NvbmZpZ1JhdyB0byBwcmVzZXJ2ZSBjd2QtcmVsYXRpdmUgYWxpYXNlcy5cbiAgICAgIC4uLmVzYnVpbGRUc2NvbmZpZ09wdGlvbnMsXG4gICAgICByZXNvbHZlRXh0ZW5zaW9uczogW1xuICAgICAgICAnLnRzJyxcbiAgICAgICAgJy50c3gnLFxuICAgICAgICAnLm10cycsXG4gICAgICAgICcuY3RzJyxcbiAgICAgICAgJy5qcycsXG4gICAgICAgICcuanN4JyxcbiAgICAgICAgJy5tanMnLFxuICAgICAgICAnLmNqcycsXG4gICAgICBdLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICAvLyBIYW5kbGUgcHNldWRvLXBhY2thZ2VzIGxpa2UgJ3NlcnZlci1vbmx5JyBhbmQgJ2NsaWVudC1vbmx5JyBieSBwcm92aWRpbmdcbiAgICAgICAgLy8gZW1wdHkgbW9kdWxlcy4gTXVzdCBydW4gZmlyc3QgdG8gaW50ZXJjZXB0IHRoZXNlIGJlZm9yZSBvdGhlciByZXNvbHV0aW9uLlxuICAgICAgICBjcmVhdGVQc2V1ZG9QYWNrYWdlUGx1Z2luKCksXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3dvcmtmbG93JyxcbiAgICAgICAgICBwcm9qZWN0Um9vdDogdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJSb290OiB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3QsXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBvbkFmdGVyVHJhbnNmb3JtOiB0aGlzLmNvbmZpZy5vbkFmdGVyVHJhbnNmb3JtLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkV29ya2Zsb3dTaWRlRWZmZWN0RW50cmllcyxcbiAgICAgICAgfSksXG4gICAgICAgIC8vIFRoaXMgcGx1Z2luIG11c3QgcnVuIGFmdGVyIHRoZSBzd2MgcGx1Z2luIHRvIGVuc3VyZSBkZWFkIGNvZGUgZWxpbWluYXRpb25cbiAgICAgICAgLy8gaGFwcGVucyBmaXJzdCwgcHJldmVudGluZyBmYWxzZSBwb3NpdGl2ZXMgb24gTm9kZS5qcyBpbXBvcnRzIGluIHVudXNlZCBjb2RlIHBhdGhzXG4gICAgICAgIGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpLFxuICAgICAgXSxcbiAgICAgIC8vIE5PVEU6IFdlIGludGVudGlvbmFsbHkgZG8gTk9UIHVzZSB0aGUgZXh0ZXJuYWwgb3B0aW9uIGhlcmUgZm9yIHdvcmtmbG93IGJ1bmRsZXMuXG4gICAgICAvLyBXaGVuIHBhY2thZ2VzIGFyZSBtYXJrZWQgZXh0ZXJuYWwgd2l0aCBmb3JtYXQ6ICdjanMnLCBlc2J1aWxkIGdlbmVyYXRlcyByZXF1aXJlKCkgY2FsbHMuXG4gICAgICAvLyBIb3dldmVyLCB0aGUgd29ya2Zsb3cgVk0gKHZtLnJ1bkluQ29udGV4dCkgZG9lcyBub3QgaGF2ZSByZXF1aXJlKCkgZGVmaW5lZCAtIGl0IG9ubHlcbiAgICAgIC8vIHByb3ZpZGVzIG1vZHVsZS5leHBvcnRzIGFuZCBleHBvcnRzLiBFeHRlcm5hbCBwYWNrYWdlcyB3b3VsZCBmYWlsIGF0IHJ1bnRpbWUgd2l0aDpcbiAgICAgIC8vICAgUmVmZXJlbmNlRXJyb3I6IHJlcXVpcmUgaXMgbm90IGRlZmluZWRcbiAgICAgIC8vIEluc3RlYWQsIHdlIGJ1bmRsZSBldmVyeXRoaW5nIGFuZCByZWx5IG9uOlxuICAgICAgLy8gLSBjcmVhdGVQc2V1ZG9QYWNrYWdlUGx1Z2luKCkgdG8gaGFuZGxlIHNlcnZlci1vbmx5L2NsaWVudC1vbmx5IHdpdGggZW1wdHkgbW9kdWxlc1xuICAgICAgLy8gLSBjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4oKSB0byBjYXRjaCBOb2RlLmpzIGJ1aWx0aW4gaW1wb3J0cyBhdCBidWlsZCB0aW1lXG4gICAgfSk7XG4gICAgbGV0IHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gIWtlZXBJbnRlcmltQnVuZGxlQ29udGV4dDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW50ZXJpbUJ1bmRsZSA9IGF3YWl0IGludGVyaW1CdW5kbGVDdHgucmVidWlsZCgpO1xuXG4gICAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICAgICAgaW50ZXJpbUJ1bmRsZSxcbiAgICAgICAgJ2ludGVybWVkaWF0ZSB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICB0cnVlLFxuICAgICAgICB7XG4gICAgICAgICAgc3VwcHJlc3NXYXJuaW5nczogdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVXYXJuaW5ncyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMubG9nQ3JlYXRlV29ya2Zsb3dzQnVuZGxlSW5mbyhcbiAgICAgICAgJ0NyZWF0ZWQgaW50ZXJtZWRpYXRlIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidW5kbGVTdGFydFRpbWV9bXNgXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcud29ya2Zsb3dNYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndvcmtmbG93TWFuaWZlc3RQYXRoXG4gICAgICAgICk7XG4gICAgICAgIGxldCBwcmVmaXggPSAnJztcblxuICAgICAgICBpZiAocmVzb2x2ZWRQYXRoLmVuZHNXaXRoKCcuY2pzJykpIHtcbiAgICAgICAgICBwcmVmaXggPSAnbW9kdWxlLmV4cG9ydHMgPSAnO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLmpzJykgfHxcbiAgICAgICAgICByZXNvbHZlZFBhdGguZW5kc1dpdGgoJy5tanMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBwcmVmaXggPSAnZXhwb3J0IGRlZmF1bHQgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocmVzb2x2ZWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgICByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgcHJlZml4ICsgSlNPTi5zdHJpbmdpZnkod29ya2Zsb3dNYW5pZmVzdCwgbnVsbCwgMilcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIWludGVyaW1CdW5kbGUub3V0cHV0RmlsZXMgfHxcbiAgICAgICAgaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlcy5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKCdObyBvdXRwdXQgZmlsZXMgZ2VuZXJhdGVkIGZyb20gZXNidWlsZCcsIHtcbiAgICAgICAgICBoaW50OiAnVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIG1pc2NvbmZpZ3VyZWQgZW50cnkgcG9pbnQgb3IgYW4gZW1wdHkgd29ya2Zsb3cgZGlyZWN0b3J5LiBDaGVjayB0aGF0IHlvdXIgd29ya2Zsb3cgZmlsZXMgY29udGFpbiBhIGBcInVzZSB3b3JrZmxvd1wiYCBvciBgXCJ1c2Ugc3RlcFwiYCBkaXJlY3RpdmUuJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlcmRlIGNvbXBsaWFuY2Ugd2FybmluZ3M6IGNoZWNrIGlmIHdvcmtmbG93IGJ1bmRsZSBoYXMgTm9kZS5qcyBpbXBvcnRzXG4gICAgICAvLyBhbG9uZ3NpZGUgc2VyZGUtcmVnaXN0ZXJlZCBjbGFzc2VzICh0aGVzZSB3aWxsIGZhaWwgYXQgcnVudGltZSBpbiB0aGUgc2FuZGJveClcbiAgICAgIGlmIChcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcykubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHsgYW5hbHl6ZVNlcmRlQ29tcGxpYW5jZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3NlcmRlLWNoZWNrZXIuanMnKTtcbiAgICAgICAgY29uc3QgYnVuZGxlVGV4dCA9IGludGVyaW1CdW5kbGUub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAgICAgY29uc3Qgc2VyZGVSZXN1bHQgPSBhbmFseXplU2VyZGVDb21wbGlhbmNlKHtcbiAgICAgICAgICBzb3VyY2VDb2RlOiAnJyxcbiAgICAgICAgICB3b3JrZmxvd0NvZGU6IGJ1bmRsZVRleHQsXG4gICAgICAgICAgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBEZS1kdXBlIHdhcm5pbmdzOiBncm91cCBpZGVudGljYWwgaXNzdWVzIGFjcm9zcyBjbGFzc2VzXG4gICAgICAgIGNvbnN0IGlzc3Vlc1RvQ2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgICAgICAgZm9yIChjb25zdCBjbHMgb2Ygc2VyZGVSZXN1bHQuY2xhc3Nlcykge1xuICAgICAgICAgIGlmICghY2xzLmNvbXBsaWFudCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBjbHMuaXNzdWVzKSB7XG4gICAgICAgICAgICAgIGxldCBhZmZlY3RlZENsYXNzZXMgPSBpc3N1ZXNUb0NsYXNzZXMuZ2V0KGlzc3VlKTtcbiAgICAgICAgICAgICAgaWYgKCFhZmZlY3RlZENsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZENsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICBpc3N1ZXNUb0NsYXNzZXMuc2V0KGlzc3VlLCBhZmZlY3RlZENsYXNzZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3Nlcy5hZGQoY2xzLmNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2lzc3VlLCBhZmZlY3RlZENsYXNzZXNdIG9mIGlzc3Vlc1RvQ2xhc3Nlcykge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbLi4uYWZmZWN0ZWRDbGFzc2VzXTtcbiAgICAgICAgICBjb25zdCBjbGFzc0xhYmVsID1cbiAgICAgICAgICAgIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgID8gYGNsYXNzIFwiJHtjbGFzc05hbWVzWzBdfVwiYFxuICAgICAgICAgICAgICA6IGBjbGFzc2VzICR7Y2xhc3NOYW1lcy5tYXAoKG5hbWUpID0+IGBcIiR7bmFtZX1cImApLmpvaW4oJywgJyl9YDtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coYOKaoCBTZXJkZSB3YXJuaW5nIGZvciAke2NsYXNzTGFiZWx9OiBgKSArIGlzc3VlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSA9IGNyZWF0ZVdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlKFxuICAgICAgICB7XG4gICAgICAgICAgYmFzZVBhdGg6IHRoaXMuY29uZmlnLmJhc2VQYXRoLFxuICAgICAgICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdDogJ3dvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0JyxcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgYnVuZGxlRmluYWwgPSBhc3luYyAoaW50ZXJpbUJ1bmRsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlQ29kZSA9IGludGVyaW1CdW5kbGU7XG5cbiAgICAgICAgY29uc3Qgd29ya2Zsb3dGdW5jdGlvbkNvZGUgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IHdvcmtmbG93RW50cnlwb2ludCB9IGZyb20gJ3dvcmtmbG93L3J1bnRpbWUnO1xuXG5jb25zdCB3b3JrZmxvd1JvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG5jb25zdCB3b3JrZmxvd0NvZGUgPSBcXGAke3dvcmtmbG93QnVuZGxlQ29kZS5yZXBsYWNlKC9bXFxcXGAkXS9nLCAnXFxcXCQmJyl9XFxgO1xuXG4ke2NyZWF0ZVdvcmtmbG93Um91dGVIYW5kbGVyc0NvZGUoYHdvcmtmbG93RW50cnlwb2ludCh3b3JrZmxvd0NvZGUke3dvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlfSlgKX1gO1xuXG4gICAgICAgIC8vIHdlIHNraXAgdGhlIGZpbmFsIGJ1bmRsaW5nIHN0ZXAgZm9yIE5leHQuanMgc28gaXQgY2FuIGJ1bmRsZSBpdHNlbGZcbiAgICAgICAgaWYgKCFidW5kbGVGaW5hbE91dHB1dCkge1xuICAgICAgICAgIGlmICghb3V0ZmlsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhcmlhbnQ6IG1pc3Npbmcgb3V0ZmlsZSBmb3Igd29ya2Zsb3cgYnVuZGxlYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICBjb25zdCBvdXRwdXREaXIgPSBkaXJuYW1lKG91dGZpbGUpO1xuICAgICAgICAgIGF3YWl0IG1rZGlyKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlR2VuZXJhdGVkRmlsZShvdXRmaWxlLCB3b3JrZmxvd0Z1bmN0aW9uQ29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVuZGxlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBOb3cgYnVuZGxlIHRoaXMgc28gd2UgY2FuIHJlc29sdmUgdGhlIEB3b3JrZmxvdy9jb3JlIGRlcGVuZGVuY3lcbiAgICAgICAgLy8gd2UgY291bGQgcmVtb3ZlIHRoaXMgaWYgd2UgZG8gbmZ0IHRyYWNpbmcgb3Igc2ltaWxhciBpbnN0ZWFkXG4gICAgICAgIGNvbnN0IGZpbmFsRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcihmb3JtYXQpO1xuICAgICAgICBjb25zdCBmaW5hbFdvcmtmbG93UmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7ZmluYWxFc21SZXF1aXJlQmFubmVyfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGRpbjoge1xuICAgICAgICAgICAgY29udGVudHM6IHdvcmtmbG93RnVuY3Rpb25Db2RlLFxuICAgICAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG91dGZpbGUsXG4gICAgICAgICAgLy8gU291cmNlIG1hcHMgZm9yIHRoZSBmaW5hbCB3b3JrZmxvdyBidW5kbGUgd3JhcHBlciAobm90IGltcG9ydGFudCBzaW5jZSB0aGlzIGNvZGVcbiAgICAgICAgICAvLyBkb2Vzbid0IHJ1biBpbiB0aGUgVk0gLSBvbmx5IHRoZSBpbnRlcm1lZGlhdGUgYnVuZGxlIHNvdXJjZW1hcCBpcyByZWxldmFudClcbiAgICAgICAgICBzb3VyY2VtYXA6IHRoaXMucmVzb2x2ZVNvdXJjZW1hcChFTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyksXG4gICAgICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgICAgICBleHRlcm5hbDogWydAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVyLXdlYi1pZGVudGl0eSddLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICAgICAgICBmaW5hbFdvcmtmbG93UmVzdWx0LFxuICAgICAgICAgICdmaW5hbCB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3VwcHJlc3NXYXJuaW5nczogdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVXYXJuaW5ncyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nQ3JlYXRlV29ya2Zsb3dzQnVuZGxlSW5mbyhcbiAgICAgICAgICAnQ3JlYXRlZCBmaW5hbCB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICAgIGAke0RhdGUubm93KCkgLSBidW5kbGVTdGFydFRpbWV9bXNgXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgY29uc3QgaW50ZXJpbUJ1bmRsZVRleHQgPSBpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgICBhd2FpdCBidW5kbGVGaW5hbChpbnRlcmltQnVuZGxlVGV4dCk7XG5cbiAgICAgIGlmIChrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQpIHtcbiAgICAgICAgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgIGJ1bmRsZUZpbmFsLFxuICAgICAgICAgIGludGVyaW1CdW5kbGVUZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsIGludGVyaW1CdW5kbGVUZXh0IH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpbnRlcmltQnVuZGxlQ3R4LmRpc3Bvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZGlzcG9zZUVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1dhcm5pbmc6IEZhaWxlZCB0byBkaXNwb3NlIHdvcmtmbG93IGJ1bmRsZSBjb250ZXh0JyxcbiAgICAgICAgICAgIGRpc3Bvc2VFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVjI6IENyZWF0ZXMgYSBjb21iaW5lZCBidW5kbGUgdGhhdCBpbmNsdWRlcyBib3RoIHN0ZXAgcmVnaXN0cmF0aW9ucyBhbmRcbiAgICogd29ya2Zsb3cgb3JjaGVzdHJhdGlvbiBpbiBhIHNpbmdsZSByb3V0ZS4gVGhlIGNvbWJpbmVkIGVudHJ5cG9pbnQgZXhlY3V0ZXNcbiAgICogc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUsIHJlZHVjaW5nIGZ1bmN0aW9uIGludm9jYXRpb25zIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcmV1c2VzIGNyZWF0ZVN0ZXBzQnVuZGxlIChmb3Igc3RlcCByZWdpc3RyYXRpb25zKSBhbmRcbiAgICogY3JlYXRlV29ya2Zsb3dzQnVuZGxlIChmb3Igd29ya2Zsb3cgVk0gY29kZSksIHRoZW4gY29tYmluZXMgdGhlbSBpbnRvXG4gICAqIGEgc2luZ2xlIHJvdXRlIGZpbGUgdXNpbmcgd29ya2Zsb3dFbnRyeXBvaW50KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ29tYmluZWRCdW5kbGUoe1xuICAgIGlucHV0RmlsZXMsXG4gICAgc3RlcHNPdXRmaWxlLFxuICAgIGZsb3dPdXRmaWxlLFxuICAgIGZvcm1hdCA9ICdlc20nLFxuICAgIGJ1bmRsZUZpbmFsT3V0cHV0ID0gdHJ1ZSxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcyxcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICB9OiB7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgc3RlcCByZWdpc3RyYXRpb25zIGJ1bmRsZSAoc2lkZSBlZmZlY3RzIG9ubHkpICovXG4gICAgc3RlcHNPdXRmaWxlOiBzdHJpbmc7XG4gICAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgY29tYmluZWQgcm91dGUgZmlsZSAqL1xuICAgIGZsb3dPdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBidW5kbGVGaW5hbE91dHB1dD86IGJvb2xlYW47XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTx7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gICAgc3RlcHNDb250ZXh0PzogZXNidWlsZC5CdWlsZENvbnRleHQ7XG4gICAgaW50ZXJpbUJ1bmRsZUN0eD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGJ1bmRsZUZpbmFsPzogKGludGVyaW1CdW5kbGVSZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXM7XG4gICAgc3RlcHNNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgICB3b3JrZmxvd3NNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfT4ge1xuICAgIHRoaXMuc3RhcnRXb3JrZmxvd0J1aWxkVGltZXIoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBkaXJuYW1lKGZsb3dPdXRmaWxlKSxcbiAgICAgICAgdHNjb25maWdQYXRoXG4gICAgICApKTtcblxuICAgIC8vIDEuIEJ1aWxkIHN0ZXAgcmVnaXN0cmF0aW9ucyBidW5kbGUgKHVzZWQgYXMgc2VwYXJhdGUgZmlsZSBmb3JcbiAgICAvLyBidW5kbGVGaW5hbE91dHB1dDogZmFsc2UsIG9yIHJlYWQgYmFjayBmb3IgaW5saW5lIGNvbnRlbnQgd2hlbiB0cnVlKVxuICAgIGNvbnN0IHsgY29udGV4dDogc3RlcHNDb250ZXh0LCBtYW5pZmVzdDogc3RlcHNNYW5pZmVzdCB9ID1cbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU3RlcHNCdW5kbGUoe1xuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBvdXRmaWxlOiBzdGVwc091dGZpbGUsXG4gICAgICAgIC8vIFdoZW4gYnVuZGxlRmluYWxPdXRwdXQgaXMgdHJ1ZSwgdXNlIEVTTSBmb3IgdGhlIHN0ZXBzIGJ1bmRsZVxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBmaW5hbCBvdXRwdXQgZm9ybWF0LiBUaGUgZmluYWwgZXNidWlsZCBwYXNzXG4gICAgICAgIC8vIGNvbnZlcnRzIGV2ZXJ5dGhpbmcgdG8gdGhlIHRhcmdldCBmb3JtYXQuIFVzaW5nIENKUyBoZXJlIGNhdXNlc1xuICAgICAgICAvLyBhIG1vZHVsZS5leHBvcnRzIGNvbGxpc2lvbjogdGhlIHN0ZXBzIGJ1bmRsZSdzIHRvcC1sZXZlbFxuICAgICAgICAvLyBtb2R1bGUuZXhwb3J0cyBvdmVyd3JpdGVzIHRoZSBjb21iaW5lZCByb3V0ZSdzIG1vZHVsZS5leHBvcnRzXG4gICAgICAgIC8vIHdoZW4gZXNidWlsZCBpbmxpbmVzIHRoZSBzdGVwcyB3aXRob3V0IGEgX19jb21tb25KUyB3cmFwcGVyLlxuICAgICAgICBmb3JtYXQ6IGJ1bmRsZUZpbmFsT3V0cHV0ID8gJ2VzbScgOiBmb3JtYXQsXG4gICAgICAgIGV4dGVybmFsaXplTm9uU3RlcHMsXG4gICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgLy8gU2tpcCB0aGUgY3JlYXRlUmVxdWlyZSBiYW5uZXIgaGVyZTogd2hlbiBidW5kbGVGaW5hbE91dHB1dCBpcyB0cnVlXG4gICAgICAgIC8vIHRoZSBvdXRlciBlc2J1aWxkIHBhc3Mgd2lsbCBpbmxpbmUgdGhpcyBidW5kbGUgYW5kIGFkZCBpdHMgb3duXG4gICAgICAgIC8vIGJhbm5lci4gRW1pdHRpbmcgaXQgdHdpY2UgZGVjbGFyZXMgX19jcmVhdGVSZXF1aXJlIHR3aWNlLlxuICAgICAgICBza2lwRXNtUmVxdWlyZUJhbm5lcjogYnVuZGxlRmluYWxPdXRwdXQsXG4gICAgICB9KTtcblxuICAgIC8vIDIuIEJ1aWxkIHdvcmtmbG93IFZNIGNvZGVcbiAgICBjb25zdCB0ZW1wV29ya2Zsb3dPdXRmaWxlID0gYCR7Zmxvd091dGZpbGV9Ll9fd2ZfdG1wLmpzYDtcbiAgICBjb25zdCB3b3JrZmxvd3NSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdvcmtmbG93c0J1bmRsZSh7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0ZmlsZTogdGVtcFdvcmtmbG93T3V0ZmlsZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSxcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdvcmtmbG93Vk1Db2RlID0gd29ya2Zsb3dzUmVzdWx0LmludGVyaW1CdW5kbGVUZXh0O1xuICAgIGlmICghd29ya2Zsb3dWTUNvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGRpZCBub3QgcmV0dXJuIGludGVyaW1CdW5kbGVUZXh0Jyk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgdGhlIHdyYXBwZXIgZmlsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVubGluayB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzL3Byb21pc2VzJyk7XG4gICAgICBhd2FpdCB1bmxpbmsodGVtcFdvcmtmbG93T3V0ZmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyAzLiBHZW5lcmF0ZSBjb21iaW5lZCByb3V0ZSBmaWxlXG4gICAgY29uc3Qgc3RlcHNSZWxhdGl2ZVBhdGggPSBgLi8ke2Jhc2VuYW1lKHN0ZXBzT3V0ZmlsZSkucmVwbGFjZSgvXFxcXC9nLCAnLycpfWA7XG4gICAgY29uc3QgZXNjYXBlZFZNQ29kZSA9IHdvcmtmbG93Vk1Db2RlLnJlcGxhY2UoL1tcXFxcYCRdL2csICdcXFxcJCYnKTtcbiAgICBjb25zdCB3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSA9IGNyZWF0ZVdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlKHtcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdDogJ3dvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0JyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbWJpbmVkRnVuY3Rpb25Db2RlID0gYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBfX3N0ZXBzX3JlZ2lzdGVyZWQgfSBmcm9tICcke3N0ZXBzUmVsYXRpdmVQYXRofSc7XG5pbXBvcnQgeyB3b3JrZmxvd0VudHJ5cG9pbnQgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztcblxuY29uc3Qgd29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4vLyBQcmV2ZW50IHJvbGx1cCBmcm9tIHRyZWUtc2hha2luZyB0aGUgc3RlcHMgc2lkZS1lZmZlY3QgaW1wb3J0XG52b2lkIF9fc3RlcHNfcmVnaXN0ZXJlZDtcblxuY29uc3Qgd29ya2Zsb3dDb2RlID0gXFxgJHtlc2NhcGVkVk1Db2RlfVxcYDtcblxuJHtjcmVhdGVXb3JrZmxvd1JvdXRlSGFuZGxlcnNDb2RlKGB3b3JrZmxvd0VudHJ5cG9pbnQod29ya2Zsb3dDb2RlJHt3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZX0pYCl9YDtcblxuICAgIGlmICghYnVuZGxlRmluYWxPdXRwdXQpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKGZsb3dPdXRmaWxlLCBjb21iaW5lZEZ1bmN0aW9uQ29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJ1bmRsZSB0aGUgY29tYmluZWQgY29kZSBmb3Igc3RhbmRhbG9uZSB1c2VcbiAgICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB7IGJhbm5lcjogaW1wb3J0TWV0YUJhbm5lciwgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lIH0gPVxuICAgICAgICB0aGlzLmdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQpO1xuICAgICAgLy8gRVNNIGJhbm5lciBwcm92aWRlcyBgcmVxdWlyZWAgdmlhIGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKSBzb1xuICAgICAgLy8gQ0pTIGRlcGVuZGVuY2llcyB0aGF0IGNhbGwgcmVxdWlyZSgpIGZvciBOb2RlLmpzIGJ1aWx0aW5zIGtlZXAgd29ya2luZ1xuICAgICAgLy8gaW4gdGhlIEVTTSBvdXRwdXQgcHJvZHVjZWQgYnkgYnVuZGxlRmluYWxPdXRwdXQ6IHRydWUuXG4gICAgICBjb25zdCBmaW5hbEVzbVJlcXVpcmVCYW5uZXIgPSB0aGlzLmdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0KTtcbiAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGJhbm5lcjoge1xuICAgICAgICAgIGpzOiBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxcbi8qIGVzbGludC1kaXNhYmxlICovXFxuJHtpbXBvcnRNZXRhQmFubmVyfSR7ZmluYWxFc21SZXF1aXJlQmFubmVyfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZGluOiB7XG4gICAgICAgICAgY29udGVudHM6IGNvbWJpbmVkRnVuY3Rpb25Db2RlLFxuICAgICAgICAgIHJlc29sdmVEaXI6IGRpcm5hbWUoZmxvd091dGZpbGUpLFxuICAgICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgIH0sXG4gICAgICAgIG91dGZpbGU6IGZsb3dPdXRmaWxlLFxuICAgICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgICAgd3JpdGU6IHRydWUsXG4gICAgICAgIGtlZXBOYW1lczogdHJ1ZSxcbiAgICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgICAgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lLFxuICAgICAgICBleHRlcm5hbDogWydAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVyLXdlYi1pZGVudGl0eSddLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhmaW5hbFJlc3VsdCwgJ2NvbWJpbmVkIGJ1bmRsZScsIHRydWUpO1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAgICdDcmVhdGVkIGNvbWJpbmVkIGJ1bmRsZScsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidW5kbGVTdGFydFRpbWV9bXNgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIG1hbmlmZXN0c1xuICAgIGNvbnN0IG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge1xuICAgICAgLi4uc3RlcHNNYW5pZmVzdCxcbiAgICAgIHdvcmtmbG93czoge1xuICAgICAgICAuLi5zdGVwc01hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgICAgLi4ud29ya2Zsb3dzUmVzdWx0Lm1hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgIH0sXG4gICAgICBjbGFzc2VzOiB7XG4gICAgICAgIC4uLnN0ZXBzTWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgICAgLi4ud29ya2Zsb3dzUmVzdWx0Lm1hbmlmZXN0LmNsYXNzZXMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSBjdXN0b20gYnVuZGxlRmluYWwgZm9yIHdhdGNoIG1vZGUgdGhhdCB1c2VzIHdvcmtmbG93RW50cnlwb2ludFxuICAgIGNvbnN0IGNvbWJpbmVkQnVuZGxlRmluYWwgPSBhc3luYyAoaW50ZXJpbUJ1bmRsZVRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IGludGVyaW1CdW5kbGVUZXh0LnJlcGxhY2UoL1tcXFxcYCRdL2csICdcXFxcJCYnKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlID0gY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUoXG4gICAgICAgIHtcbiAgICAgICAgICBiYXNlUGF0aDogdGhpcy5jb25maWcuYmFzZVBhdGgsXG4gICAgICAgICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0OiAnd29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgY29kZSA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgX19zdGVwc19yZWdpc3RlcmVkIH0gZnJvbSAnJHtzdGVwc1JlbGF0aXZlUGF0aH0nO1xuaW1wb3J0IHsgd29ya2Zsb3dFbnRyeXBvaW50IH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG5cbmNvbnN0IHdvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxudm9pZCBfX3N0ZXBzX3JlZ2lzdGVyZWQ7XG5cbmNvbnN0IHdvcmtmbG93Q29kZSA9IFxcYCR7ZXNjYXBlZH1cXGA7XG5cbiR7Y3JlYXRlV29ya2Zsb3dSb3V0ZUhhbmRsZXJzQ29kZShgd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KWApfWA7XG5cbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGRpcm5hbWUoZmxvd091dGZpbGUpO1xuICAgICAgYXdhaXQgbWtkaXIob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKGZsb3dPdXRmaWxlLCBjb2RlKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgc3RlcHNDb250ZXh0LFxuICAgICAgICBpbnRlcmltQnVuZGxlQ3R4OiB3b3JrZmxvd3NSZXN1bHQuaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgYnVuZGxlRmluYWw6IGNvbWJpbmVkQnVuZGxlRmluYWwsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgc3RlcHNNYW5pZmVzdCxcbiAgICAgICAgd29ya2Zsb3dzTWFuaWZlc3Q6IHdvcmtmbG93c1Jlc3VsdC5tYW5pZmVzdCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgZGlzY292ZXJlZEVudHJpZXM6IGVmZmVjdGl2ZURpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgc3RlcHNNYW5pZmVzdCxcbiAgICAgIHdvcmtmbG93c01hbmlmZXN0OiB3b3JrZmxvd3NSZXN1bHQubWFuaWZlc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xpZW50IGxpYnJhcnkgYnVuZGxlIGZvciB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqIFRoZSBjbGllbnQgbGlicmFyeSBhbGxvd3MgaW1wb3J0aW5nIGFuZCBjYWxsaW5nIHdvcmtmbG93cyBmcm9tIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAqIE9ubHkgZ2VuZXJhdGVkIGlmIGNsaWVudEJ1bmRsZVBhdGggaXMgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDbGllbnRMaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCkge1xuICAgICAgLy8gU2lsZW50bHkgZXhpdCBzaW5jZSBubyBjbGllbnQgYnVuZGxlIHdhcyByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdHZW5lcmF0aW5nIGEgY2xpZW50IGxpYnJhcnkgYXQnLFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aFxuICAgICk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnTk9URTogVGhlIHJlY29tbWVuZGVkIHdheSB0byB1c2Ugd29ya2Zsb3cgd2l0aCBhIGZyYW1ld29yayBsaWtlIE5leHRKUyBpcyB1c2luZyB0aGUgbG9hZGVyL3BsdWdpbiB3aXRoIHdlYnBhY2svdHVyYm9icGFjay9yb2xsdXAnXG4gICAgKTtcblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBjbGllbnQgYnVuZGxlXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZSh0aGlzLmNvbmZpZy5jbGllbnRCdW5kbGVQYXRoKTtcbiAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0SW5wdXRGaWxlcygpO1xuXG4gICAgLy8gRGlzY292ZXIgc2VyZGUgZmlsZXMgZnJvbSB0aGUgaW5wdXQgZmlsZXMnIGRlcGVuZGVuY3kgdHJlZSBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNsaWVudCBidW5kbGUgc28gdGhleSBjYW4gYmUgc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcGFzc2luZyBkYXRhIHRvIHdvcmtmbG93cyB2aWEgc3RhcnQoKSBhbmQgZGVzZXJpYWxpemVkIHdoZW4gcmVjZWl2aW5nIHdvcmtmbG93IHJlc3VsdHMuXG4gICAgY29uc3QgeyBkaXNjb3ZlcmVkU2VyZGVGaWxlcyB9ID0gYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0cHV0RGlyXG4gICAgKTtcblxuICAgIC8vIElkZW50aWZ5IHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSBpbnB1dEZpbGVzIChkZWR1cGxpY2F0ZWQpXG4gICAgY29uc3QgaW5wdXRGaWxlc05vcm1hbGl6ZWQgPSBuZXcgU2V0KFxuICAgICAgaW5wdXRGaWxlcy5tYXAoKGYpID0+IGYucmVwbGFjZSgvXFxcXC9nLCAnLycpKVxuICAgICk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBbLi4uZGlzY292ZXJlZFNlcmRlRmlsZXNdLmZpbHRlcihcbiAgICAgIChmKSA9PiAhaW5wdXRGaWxlc05vcm1hbGl6ZWQuaGFzKGYpXG4gICAgKTtcblxuICAgIC8vIFJlLWV4cG9ydHMgZm9yIGlucHV0IGZpbGVzICh1c2VyJ3Mgd29ya2Zsb3cvc3RlcCBkZWZpbml0aW9ucykuXG4gICAgLy8gVGhlc2UgbXVzdCB1c2UgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBiZWNhdXNlIHNvbWUgZnJhbWV3b3JrcyBwYXNzXG4gICAgLy8gZ2VuZXJhdGVkIGZpbGVzIGxpa2UgXCIub3V0cHV0L3NlcnZlci9pbmRleC5tanNcIiBhcyBpbnB1dCBmaWxlcy5cbiAgICBjb25zdCByZWV4cG9ydHMgPSBpbnB1dEZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgZXhwb3J0ICogZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIFNpZGUtZWZmZWN0IGltcG9ydHMgZm9yIHNlcmRlIGZpbGVzIG5vdCBpbiBpbnB1dEZpbGVzIChmb3IgY2xhc3MgcmVnaXN0cmF0aW9uKVxuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IHNlcmRlT25seUZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29tYmluZTogc2VyZGUgaW1wb3J0cyAoZm9yIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHMpICsgcmUtZXhwb3J0c1xuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IHNlcmRlSW1wb3J0c1xuICAgICAgPyBgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXFxuJHtzZXJkZUltcG9ydHN9XFxuJHtyZWV4cG9ydHN9YFxuICAgICAgOiByZWV4cG9ydHM7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW5cbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLmlucHV0RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcbiAgICBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJy8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbicsXG4gICAgICB9LFxuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGVudHJ5Q29udGVudCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgb3V0ZmlsZTogdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBleHRlcm5hbDogWydAd29ya2Zsb3cvY29yZSddLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIG9uQWZ0ZXJUcmFuc2Zvcm06IHRoaXMuY29uZmlnLm9uQWZ0ZXJUcmFuc2Zvcm0sXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IG5vcm1hbGl6ZWRDbGllbnRTaWRlRWZmZWN0RW50cmllcyxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoY2xpZW50UmVzdWx0LCAnY2xpZW50IGxpYnJhcnkgYnVuZGxlJyk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN3Y0lnbm9yZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgd2ViaG9vayBoYW5kbGVyIGJ1bmRsZSBmb3IgcmVzdW1pbmcgd29ya2Zsb3dzIHZpYSBIVFRQIGNhbGxiYWNrcy5cbiAgICpcbiAgICogQHBhcmFtIGJ1bmRsZSAtIElmIHRydWUsIGJ1bmRsZXMgZGVwZW5kZW5jaWVzIChuZWVkZWQgZm9yIEJ1aWxkIE91dHB1dCBBUEkpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgb3V0ZmlsZSxcbiAgICBidW5kbGUgPSBmYWxzZSxcbiAgfToge1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBidW5kbGU/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dDcmVhdGVXZWJob29rQnVuZGxlSW5mbygnQ3JlYXRpbmcgd2ViaG9vayByb3V0ZScpO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUob3V0ZmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGEgc3RhdGljIHJvdXRlIHRoYXQgY2FsbHMgcmVzdW1lV2ViaG9va1xuICAgIC8vIFRoaXMgcm91dGUgd29ya3MgZm9yIGJvdGggTmV4dC5qcyBhbmQgVmVyY2VsIEJ1aWxkIE91dHB1dCBBUElcbiAgICAvLyBCdW5kbGVkIEJ1aWxkIE91dHB1dCBBUEkgd2ViaG9vayBmdW5jdGlvbnMgbmVlZCB3b3JsZC50cyBzdGF0aWNhbGx5XG4gICAgLy8gcHJlc2VudCBzbyBnZXRXb3JsZExhenkoKSBjYW4gdXNlIHRoZSBnbG9iYWwgZ2V0V29ybGQgcmVnaXN0cmF0aW9uXG4gICAgLy8gaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gYSBtaXNzaW5nIHNpYmxpbmcgaW1wb3J0KFwiLi93b3JsZC5qc1wiKS5cbiAgICBjb25zdCByb3V0ZUNvbnRlbnQgPSBgJHtidW5kbGUgPyBcImltcG9ydCAnd29ya2Zsb3cvcnVudGltZSc7XFxuXCIgOiAnJ31pbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnd29ya2Zsb3cvYXBpJztcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihyZXF1ZXN0KSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAvLyBFeHRyYWN0IHRva2VuIGZyb20gcGF0aG5hbWU6IC8ud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rL3t0b2tlbn1cbiAgY29uc3QgcGF0aFBhcnRzID0gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHRva2VuID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV0pO1xuXG4gIGlmICghdG9rZW4pIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXN1bWVXZWJob29rKHRva2VuLCByZXF1ZXN0KTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVE9ETzogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludmFsaWQgdG9rZW4gYW5kIG90aGVyIGVycm9yc1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyByZXN1bWVXZWJob29rJywgZXJyb3IpO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDQwNCB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgR0VUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQT1NUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQVVQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IFBBVENIID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBERUxFVEUgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IEhFQUQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IE9QVElPTlMgPSBoYW5kbGVyO2A7XG5cbiAgICBpZiAoIWJ1bmRsZSkge1xuICAgICAgLy8gRm9yIE5leHQuanMsIHdyaXRlIHRoZSB1bmJ1bmRsZWQgZmlsZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlSWZDaGFuZ2VkKG91dGZpbGUsIHJvdXRlQ29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIEJ1aWxkIE91dHB1dCBBUEksIGJ1bmRsZSB3aXRoIGVzYnVpbGQgdG8gcmVzb2x2ZSBpbXBvcnRzXG5cbiAgICBjb25zdCB3ZWJob29rRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcignZXNtJyk7XG4gICAgY29uc3Qgd2ViaG9va0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7d2ViaG9va0VzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogcm91dGVDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAnd2ViaG9vay1yb3V0ZS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgY29uZGl0aW9uczogWydpbXBvcnQnLCAnbW9kdWxlJywgJ25vZGUnLCAnZGVmYXVsdCddLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHNvdXJjZW1hcDogdGhpcy5yZXNvbHZlU291cmNlbWFwKEVNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HKSxcbiAgICAgIG1haW5GaWVsZHM6IFsnbW9kdWxlJywgJ21haW4nXSxcbiAgICAgIC8vIERvbid0IGV4dGVybmFsaXplIGFueXRoaW5nIC0gYnVuZGxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIHdvcmtmbG93IHBhY2thZ2VzXG4gICAgICBleHRlcm5hbDogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhyZXN1bHQsICd3ZWJob29rIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oXG4gICAgICAnQ3JlYXRlZCB3ZWJob29rIGJ1bmRsZScsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gd2ViaG9va0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhY2thZ2UuanNvbiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQYWNrYWdlSnNvbihcbiAgICBkaXI6IHN0cmluZyxcbiAgICB0eXBlOiAnY29tbW9uanMnIHwgJ21vZHVsZSdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSB7IHR5cGUgfTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgLnZjLWNvbmZpZy5qc29uIGZpbGUgZm9yIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVWY0NvbmZpZyhcbiAgICBkaXI6IHN0cmluZyxcbiAgICBjb25maWc6IHtcbiAgICAgIHJ1bnRpbWU/OiBzdHJpbmc7XG4gICAgICBoYW5kbGVyPzogc3RyaW5nO1xuICAgICAgbGF1bmNoZXJUeXBlPzogc3RyaW5nO1xuICAgICAgYXJjaGl0ZWN0dXJlPzogc3RyaW5nO1xuICAgICAgc2hvdWxkQWRkSGVscGVycz86IGJvb2xlYW47XG4gICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0PzogYm9vbGVhbjtcbiAgICAgIG1heER1cmF0aW9uPzogbnVtYmVyIHwgJ21heCc7XG4gICAgICBleHBlcmltZW50YWxUcmlnZ2Vycz86IEFycmF5PHtcbiAgICAgICAgdHlwZTogJ3F1ZXVlL3YyYmV0YSc7XG4gICAgICAgIHRvcGljOiBzdHJpbmc7XG4gICAgICAgIGNvbnN1bWVyOiBzdHJpbmc7XG4gICAgICAgIG1heERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgICAgIG1heENvbmN1cnJlbmN5PzogbnVtYmVyO1xuICAgICAgICByZXRyeUFmdGVyU2Vjb25kcz86IG51bWJlcjtcbiAgICAgICAgaW5pdGlhbERlbGF5U2Vjb25kcz86IG51bWJlcjtcbiAgICAgIH0+O1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmNDb25maWcgPSB7XG4gICAgICBydW50aW1lOiBjb25maWcucnVudGltZSA/PyAnbm9kZWpzMjIueCcsXG4gICAgICBoYW5kbGVyOiBjb25maWcuaGFuZGxlciA/PyAnaW5kZXgubWpzJyxcbiAgICAgIGxhdW5jaGVyVHlwZTogY29uZmlnLmxhdW5jaGVyVHlwZSA/PyAnTm9kZWpzJyxcbiAgICAgIGFyY2hpdGVjdHVyZTogY29uZmlnLmFyY2hpdGVjdHVyZSA/PyAnYXJtNjQnLFxuICAgICAgc2hvdWxkQWRkSGVscGVyczogY29uZmlnLnNob3VsZEFkZEhlbHBlcnMgPz8gdHJ1ZSxcbiAgICAgIC4uLihjb25maWcubWF4RHVyYXRpb24gIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIG1heER1cmF0aW9uOiBjb25maWcubWF4RHVyYXRpb24sXG4gICAgICB9KSxcbiAgICAgIC4uLihjb25maWcuc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydDogY29uZmlnLnNob3VsZEFkZFNvdXJjZW1hcFN1cHBvcnQsXG4gICAgICB9KSxcbiAgICAgIC4uLihjb25maWcuZXhwZXJpbWVudGFsVHJpZ2dlcnMgJiYge1xuICAgICAgICBleHBlcmltZW50YWxUcmlnZ2VyczogY29uZmlnLmV4cGVyaW1lbnRhbFRyaWdnZXJzLFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgIGpvaW4oZGlyLCAnLnZjLWNvbmZpZy5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh2Y0NvbmZpZywgbnVsbCwgMilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZSBkaXJlY3RvcnkgZm9yIGEgZmlsZSBwYXRoIGV4aXN0cywgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGVuc3VyZVN3Y0lnbm9yZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVQcm9qZWN0U3djR2l0aWdub3JlRW50cnkoKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVN3Y0RpcmVjdG9yeUdpdGlnbm9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVQcm9qZWN0U3djR2l0aWdub3JlRW50cnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0aWdub3JlUGF0aCA9IGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgJy5naXRpZ25vcmUnKTtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGdpdGlnbm9yZVBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc1N3Y0VudHJ5ID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pLnNvbWUoKGxpbmUpID0+IHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcuc3djJyB8fFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcuc3djLycgfHxcbiAgICAgICAgICB0cmltbWVkID09PSAnLy5zd2MnIHx8XG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy8uc3djLydcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaGFzU3djRW50cnkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXBhcmF0b3IgPVxuICAgICAgICBjb250ZW50Lmxlbmd0aCA+IDAgJiYgIWNvbnRlbnQuZW5kc1dpdGgoJ1xcbicpID8gJ1xcbicgOiAnJztcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShnaXRpZ25vcmVQYXRoLCBgJHtjb250ZW50fSR7c2VwYXJhdG9yfS8uc3djXFxuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBXZSdyZSBpbnRlbnRpb25hbGx5IHNpbGVudGx5IGlnbm9yaW5nIHRoaXMgZXJyb3IgLSB1cGRhdGluZyAuZ2l0aWdub3JlIGlzbid0IGNyaXRpY2FsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTd2NEaXJlY3RvcnlHaXRpZ25vcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnLnN3YycsICcuZ2l0aWdub3JlJyksXG4gICAgICAgICcqXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdlJ3JlIGludGVudGlvbmFsbHkgc2lsZW50bHkgaWdub3JpbmcgdGhpcyBlcnJvciAtIGNyZWF0aW5nIC5naXRpZ25vcmUgaXNuJ3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWFuaWZlc3Qgc2hvdWxkIGJlIGV4cG9zZWQgYXMgYSBwdWJsaWMgSFRUUCByb3V0ZS5cbiAgICogQ29udHJvbGxlZCBieSB0aGUgYFdPUktGTE9XX1BVQkxJQ19NQU5JRkVTVGAgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNob3VsZEV4cG9zZVB1YmxpY01hbmlmZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19QVUJMSUNfTUFOSUZFU1QgPT09ICcxJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd29ya2Zsb3cgbWFuaWZlc3QgZGlhZ25vc3RpY3MgcGF0aCwgd2hlbiB0aGlzIGJ1aWxkZXIgc2hvdWxkXG4gICAqIGVtaXQgb25lLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmRpYWdub3N0aWNzRGlyKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgdGhpcy5jb25maWcuZGlhZ25vc3RpY3NEaXIsXG4gICAgICAgICd3b3JrZmxvd3MtbWFuaWZlc3QuanNvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmJ1aWxkVGFyZ2V0ID09PSAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUGF0aChcbiAgICAgICAgJy52ZXJjZWwvb3V0cHV0L2RpYWdub3N0aWNzL3dvcmtmbG93cy1tYW5pZmVzdC5qc29uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGEgZGV2ZWxvcG1lbnQvd2F0Y2ggYnVpbGQgKGUuZy4gYG5leHQgZGV2YCwgYG5pdHJvIGRldmAsXG4gICAqIG9yIGEgVml0ZS1iYXNlZCBkZXYgc2VydmVyIGZvciBhc3Ryby9zdmVsdGVraXQvdml0ZSkuIGBjb25maWcud2F0Y2hgIGlzXG4gICAqIHBsdW1iZWQgYnkgdGhlIGJ1aWxkZXJzIHRoYXQgb3duIGEgZGV2IHNlcnZlciAobmV4dCwgbml0cm8sIG5lc3QpOyB0aGVcbiAgICogVml0ZS1iYXNlZCBpbnRlZ3JhdGlvbnMgZG9uJ3Qgc2V0IGl0IGJ1dCBydW4gd2l0aFxuICAgKiBgTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdgLiBXaGVuIG5laXRoZXIgc2lnbmFsIGlzIHByZXNlbnQgd2UgdHJlYXQgdGhlXG4gICAqIGJ1aWxkIGFzIHByb2R1Y3Rpb24sIHNvIENMSS9WZXJjZWwgcHJvZHVjdGlvbiBidWlsZHMgZGVmYXVsdCB0byBvZmYuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzRGV2ZWxvcG1lbnRCdWlsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud2F0Y2ggPT09IHRydWUgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBzb3VyY2UgbWFwIG1vZGUgZm9yIHRoZSBzdGFjay1yZWxldmFudCBidW5kbGVzIChzdGVwcyArIHRoZVxuICAgKiBpbnRlcm1lZGlhdGUgd29ya2Zsb3cgVk0gYnVuZGxlKTogaW5saW5lIHNvdXJjZSBtYXBzIGluIGRldmVsb3BtZW50IHNvXG4gICAqIHN0YWNrIHRyYWNlcyBwb2ludCBhdCBzb3VyY2UgZmlsZXMsIGFuZCBvZmYgaW4gcHJvZHVjdGlvbiBzbyBmdW5jdGlvblxuICAgKiBidW5kbGVzIHN0YXkgc21hbGwgKGhlbHBzIHN0YXkgdW5kZXIgdGhlIFZlcmNlbCAyNTBNQiBmdW5jdGlvbiBsaW1pdCkgYW5kXG4gICAqIHNraXAgdGhlIHNvdXJjZS1tYXAtc3VwcG9ydCBydW50aW1lIHNoaW0uIFRoZSBgc291cmNlbWFwYCBjb25maWcgb3B0aW9uXG4gICAqIGFuZCBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnYgdmFyIG92ZXJyaWRlIHRoaXMgaW4gZWl0aGVyIGVudmlyb25tZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkZWZhdWx0U291cmNlbWFwTW9kZSgpOiBTb3VyY2VtYXBNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5pc0RldmVsb3BtZW50QnVpbGQgPyAnaW5saW5lJyA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBzb3VyY2UgbWFwIG1vZGUgZm9yIGEgZ2l2ZW4gY2FsbCBzaXRlLiBQcmVjZWRlbmNlOlxuICAgKiBleHBsaWNpdCBgc291cmNlbWFwYCBjb25maWcgPiBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnYgdmFyID4gdGhlIGNhbGxcbiAgICogc2l0ZSdzIGRlZmF1bHQuIFJldHVybmVkIHZhbHVlIGlzIHBhc3NlZCBkaXJlY3RseSB0byBlc2J1aWxkJ3NcbiAgICogYHNvdXJjZW1hcGAgb3B0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVTb3VyY2VtYXAoZGVmYXVsdE1vZGU6IFNvdXJjZW1hcE1vZGUpOiBTb3VyY2VtYXBNb2RlIHtcbiAgICBpZiAodGhpcy5jb25maWcuc291cmNlbWFwICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmNvbmZpZy5zb3VyY2VtYXA7XG4gICAgY29uc3QgZW52TW9kZSA9IHBhcnNlU291cmNlbWFwRW52KHByb2Nlc3MuZW52LldPUktGTE9XX1NPVVJDRU1BUCk7XG4gICAgaWYgKGVudk1vZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGVudk1vZGU7XG4gICAgcmV0dXJuIGRlZmF1bHRNb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgd2hldGhlciB3b3JrZmxvdy9zdGVwIGZpbGVzIHVuZGVyIGBub2RlX21vZHVsZXNgIGFyZSBkaXNjb3ZlcmVkLlxuICAgKiBQcmVjZWRlbmNlOiBleHBsaWNpdCBgZGlzY292ZXJXb3JrZmxvd3NJbk5vZGVNb2R1bGVzYCBjb25maWcgPiB0aGVcbiAgICogYFdPUktGTE9XX0RJU0NPVkVSX05PREVfTU9EVUxFU2AgZW52IHZhciAoYDBgL2BmYWxzZWAgZGlzYWJsZXMpID4gdGhlXG4gICAqIGRlZmF1bHQgKGB0cnVlYCwgZGlzY292ZXIgdGhlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZURpc2NvdmVyV29ya2Zsb3dzSW5Ob2RlTW9kdWxlcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGlzY292ZXJXb3JrZmxvd3NJbk5vZGVNb2R1bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kaXNjb3ZlcldvcmtmbG93c0luTm9kZU1vZHVsZXM7XG4gICAgfVxuICAgIGNvbnN0IGVudlZhbHVlID0gcGFyc2VEaXNjb3Zlck5vZGVNb2R1bGVzRW52KFxuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfRElTQ09WRVJfTk9ERV9NT0RVTEVTXG4gICAgKTtcbiAgICBpZiAoZW52VmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGVudlZhbHVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlc29sdmVkIHNvdXJjZSBtYXAgbW9kZSBlbWl0cyBhbnkgc291cmNlIG1hcHMgYXQgYWxsLlxuICAgKiBVc2VkIGJ5IGNvbnN1bWVycyBsaWtlIHRoZSBWZXJjZWwgYnVpbGRlciB0byBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlXG4gICAqIHRoZSBzb3VyY2UtbWFwLXN1cHBvcnQgcnVudGltZSBzaGltIGluIGdlbmVyYXRlZCBmdW5jdGlvbnMuIFVzZXMgdGhlIHNhbWVcbiAgICogZW52aXJvbm1lbnQtYXdhcmUgZGVmYXVsdCAoYGRlZmF1bHRTb3VyY2VtYXBNb2RlYCkgYXMgdGhlIHN0ZXAvd29ya2Zsb3dcbiAgICogYnVuZGxlcywgc28gYSBwcm9kdWN0aW9uIGJ1aWxkIHdpdGggbm8gb3ZlcnJpZGUgb21pdHMgdGhlIHNoaW0uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNvdXJjZW1hcHNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTb3VyY2VtYXAodGhpcy5kZWZhdWx0U291cmNlbWFwTW9kZSkgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBtYW5pZmVzdCBKU09OIGZpbGUgY29udGFpbmluZyBzdGVwL3dvcmtmbG93L2NsYXNzIG1ldGFkYXRhXG4gICAqIGFuZCBncmFwaCBkYXRhIGZvciB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbWFuaWZlc3QgSlNPTiBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBtYW5pZmVzdCBjcmVhdGlvbiBmYWlsZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlTWFuaWZlc3Qoe1xuICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICBtYW5pZmVzdERpcixcbiAgICBtYW5pZmVzdCxcbiAgfToge1xuICAgIHdvcmtmbG93QnVuZGxlUGF0aDogc3RyaW5nO1xuICAgIG1hbmlmZXN0RGlyOiBzdHJpbmc7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJ1aWxkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubG9nQ3JlYXRlTWFuaWZlc3RJbmZvKCdDcmVhdGluZyBtYW5pZmVzdC4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93R3JhcGhzID0gYXdhaXQgZXh0cmFjdFdvcmtmbG93R3JhcGhzKHdvcmtmbG93QnVuZGxlUGF0aCk7XG5cbiAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5jb252ZXJ0U3RlcHNNYW5pZmVzdChtYW5pZmVzdC5zdGVwcyk7XG4gICAgICBjb25zdCB3b3JrZmxvd3MgPSB0aGlzLmNvbnZlcnRXb3JrZmxvd3NNYW5pZmVzdChcbiAgICAgICAgbWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICB3b3JrZmxvd0dyYXBoc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmNvbnZlcnRDbGFzc2VzTWFuaWZlc3QobWFuaWZlc3QuY2xhc3Nlcyk7XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgc3RlcHM6IHNvcnRNYW5pZmVzdEVudHJpZXMoc3RlcHMpLFxuICAgICAgICB3b3JrZmxvd3M6IHNvcnRNYW5pZmVzdEVudHJpZXMod29ya2Zsb3dzKSxcbiAgICAgICAgY2xhc3Nlczogc29ydE1hbmlmZXN0RW50cmllcyhjbGFzc2VzKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnN0cmluZ2lmeShvdXRwdXQsIG51bGwsIDIpO1xuXG4gICAgICBhd2FpdCBta2RpcihtYW5pZmVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGVJZkNoYW5nZWQoXG4gICAgICAgIGpvaW4obWFuaWZlc3REaXIsICdtYW5pZmVzdC5qc29uJyksXG4gICAgICAgIG1hbmlmZXN0SnNvblxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggPSB0aGlzLmdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk7XG4gICAgICBpZiAoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3RvcnkoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGVJZkNoYW5nZWQoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgsIG1hbmlmZXN0SnNvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE9iamVjdC52YWx1ZXMoc3RlcHMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgcykgPT4gYWNjICsgT2JqZWN0LmtleXMocykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgY29uc3Qgd29ya2Zsb3dDb3VudCA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3dzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHcpID0+IGFjYyArIE9iamVjdC5rZXlzKHcpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzQ291bnQgPSBPYmplY3QudmFsdWVzKGNsYXNzZXMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgYykgPT4gYWNjICsgT2JqZWN0LmtleXMoYykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyhcbiAgICAgICAgYENyZWF0ZWQgbWFuaWZlc3Qgd2l0aCAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9LCBhbmQgJHtjbGFzc0NvdW50fSAke3BsdXJhbGl6ZSgnY2xhc3MnLCAnY2xhc3NlcycsIGNsYXNzQ291bnQpfWAsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidWlsZFN0YXJ0fW1zYFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9ncykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICB0aGlzLmdldFdvcmtmbG93QnVpbGRTdW1tYXJ5KHtcbiAgICAgICAgICAgIHN0ZXBDb3VudCxcbiAgICAgICAgICAgIHdvcmtmbG93Q291bnQsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzZXRXb3JrZmxvd0J1aWxkVGltZXIoKTtcblxuICAgICAgcmV0dXJuIG1hbmlmZXN0SnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBtYW5pZmVzdDonLFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICk7XG4gICAgICB0aGlzLnJlc2V0V29ya2Zsb3dCdWlsZFRpbWVyKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0ZXBzTWFuaWZlc3QoXG4gICAgc3RlcHM6IFdvcmtmbG93TWFuaWZlc3RbJ3N0ZXBzJ11cbiAgKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIXN0ZXBzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKHN0ZXBzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHsgc3RlcElkOiBkYXRhLnN0ZXBJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V29ya2Zsb3dzTWFuaWZlc3QoXG4gICAgd29ya2Zsb3dzOiBXb3JrZmxvd01hbmlmZXN0Wyd3b3JrZmxvd3MnXSxcbiAgICBncmFwaHM6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9PlxuICAgID5cbiAgKTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgPlxuICA+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgICA+XG4gICAgPiA9IHt9O1xuICAgIGlmICghd29ya2Zsb3dzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gQnVpbGQgYSBub3JtYWxpemVkIGxvb2t1cCBmb3IgZ3JhcGhzIHNpbmNlIHRoZSBncmFwaCBleHRyYWN0b3IgdXNlc1xuICAgIC8vIHBhdGhzIGZyb20gd29ya2Zsb3dJZCAoZS5nLiBcIi4vd29ya2Zsb3dzL2hlbGxvLWFnZW50XCIpIHdoaWxlIHRoZVxuICAgIC8vIG1hbmlmZXN0IHVzZXMgc291cmNlIGZpbGUgcGF0aHMgKGUuZy4gXCJ3b3JrZmxvd3MvaGVsbG8tYWdlbnQudHNcIikuXG4gICAgLy8gTm9ybWFsaXplIGJ5IHN0cmlwcGluZyBsZWFkaW5nIFwiLi9cIiBhbmQgZmlsZSBleHRlbnNpb25zLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWRHcmFwaHMgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkPHN0cmluZywgeyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH0+XG4gICAgPigpO1xuICAgIGZvciAoY29uc3QgW2dyYXBoUGF0aCwgZ3JhcGhFbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhncmFwaHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZ3JhcGhQYXRoXG4gICAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuICAgICAgbm9ybWFsaXplZEdyYXBocy5zZXQobm9ybWFsaXplZCwgZ3JhcGhFbnRyaWVzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSBtYW5pZmVzdCBmaWxlIHBhdGggZm9yIGxvb2t1cFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gZmlsZVBhdGhcbiAgICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XG5cbiAgICAgIGNvbnN0IGdyYXBoRW50cmllcyA9XG4gICAgICAgIGdyYXBoc1tmaWxlUGF0aF0gfHwgbm9ybWFsaXplZEdyYXBocy5nZXQobm9ybWFsaXplZEZpbGVQYXRoKTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHtcbiAgICAgICAgICB3b3JrZmxvd0lkOiBkYXRhLndvcmtmbG93SWQsXG4gICAgICAgICAgZ3JhcGg6IGdyYXBoRW50cmllcz8uW25hbWVdPy5ncmFwaCB8fCB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDbGFzc2VzTWFuaWZlc3QoXG4gICAgY2xhc3NlczogV29ya2Zsb3dNYW5pZmVzdFsnY2xhc3NlcyddXG4gICk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY2xhc3NJZDogc3RyaW5nIH0+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IGNsYXNzSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIWNsYXNzZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY2xhc3NlcykpIHtcbiAgICAgIHJlc3VsdFtmaWxlUGF0aF0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHJlc3VsdFtmaWxlUGF0aF1bbmFtZV0gPSB7IGNsYXNzSWQ6IGRhdGEuY2xhc3NJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
1805
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixNQUFNLEVBQ04sRUFBRSxFQUNGLElBQUksRUFDSixTQUFTLEdBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyx1QkFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsK0JBQStCLEdBQ2hDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUVMLG1CQUFtQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxrQkFBa0IsRUFFbEIscUJBQXFCLEdBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLGFBQWEsRUFDYixzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRSxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUMzRCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUUvQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsT0FBMEM7SUFFMUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBb0IsRUFBRSxDQUFDLENBQUMsQ0FBb0IsRUFBRSxFQUFFLENBQy9ELENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDWCxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDeEIsSUFBSTtRQUNKLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDeEQsQ0FBQyxDQUNMLENBQUM7QUFDSixDQUFDO0FBSUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLDZCQUE2QixHQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxLQUFLLEdBQUcsQ0FBQztBQUU3RCxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3RDLFFBQVE7SUFDUixRQUFRO0lBQ1IsVUFBVTtJQUNWLE1BQU07Q0FDUCxDQUFDLENBQUM7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBeUI7SUFFekIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDMUQsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssR0FBRyxDQUFDO1FBQ1QsS0FBSyxPQUFPO1lBQ1YsT0FBTyxLQUFLLENBQUM7UUFDZixLQUFLLEdBQUcsQ0FBQztRQUNULEtBQUssTUFBTTtZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLEtBQXNCLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQ1YsNENBQTRDLEtBQUssSUFBSTtnQkFDbkQscUVBQXFFLENBQ3hFLENBQUM7WUFDRixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDJCQUEyQixDQUNsQyxLQUF5QjtJQUV6QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRCxPQUFPLEtBQUssS0FBSyxHQUFHLElBQUksS0FBSyxLQUFLLE9BQU8sQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxVQUFrQjtJQUM3QyxJQUFJLFVBQVUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsVUFBVSxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FBQyxPQUFpQjtJQUM1QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQ2YsSUFBSSxHQUFHLENBQ0wsQ0FDRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDMUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUMsSUFBSSxFQUFFLENBQ1QsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsbUJBQTJCO0lBQ2xFLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUM5RSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLHNFQUFzRTtRQUN0RSxtQ0FBbUM7UUFDbkMsT0FBTyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBY0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLFdBQVc7SUFDckIsTUFBTSxDQUFpQjtJQUVqQzs7O09BR0c7SUFDSyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzNDLHNCQUFzQixDQUFxQjtJQUMzQyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBbUMsQ0FBQztJQUU1RSxZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFjLG9CQUFvQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFjLG1CQUFtQjtRQUMvQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ3RFLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxHQUFHLElBQWU7UUFDN0MsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztJQUMxQyxDQUFDO0lBRU8sdUJBQXVCLENBQUMsRUFDOUIsU0FBUyxFQUNULGFBQWEsR0FJZDtRQUNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzlJLE9BQU8sMkJBQTJCLG1CQUFtQixDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLEtBQUssTUFBTSxHQUFHLENBQUM7SUFDdkcsQ0FBQztJQUVPLDRCQUE0QixDQUFDLEdBQUcsSUFBZTtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsR0FBRyxJQUFlO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxHQUFHLElBQWU7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHdCQUF3QixDQUFDLE1BQWM7UUFJN0MsSUFBSSxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxPQUFPO1lBQ0wsTUFBTSxFQUNKLDBIQUEwSDtnQkFDMUgsa0dBQWtHO2dCQUNsRywrRUFBK0U7WUFDakYsTUFBTSxFQUFFO2dCQUNOLGlCQUFpQixFQUFFLG1CQUFtQjtnQkFDdEMscUJBQXFCLEVBQUUsdUJBQXVCO2FBQy9DO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG1CQUFtQixDQUFDLE1BQWM7UUFDeEMsSUFBSSxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sb0hBQW9ILENBQUM7SUFDOUgsQ0FBQztJQVFEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BELE9BQU8sTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxhQUFhO1FBQzNCLE1BQU0sTUFBTSxHQUFHO1lBQ2Isb0JBQW9CO1lBQ3BCLFlBQVk7WUFDWixhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWE7WUFDYixlQUFlO1lBQ2YsZUFBZTtZQUNmLHNCQUFzQjtZQUN0Qix3QkFBd0I7WUFDeEIsNEJBQTRCO1lBQzVCLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsY0FBYztZQUNkLGNBQWM7WUFDZCxhQUFhO1lBQ2IsbUJBQW1CO1NBQ3BCLENBQUM7UUFFRixxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxnRUFBZ0U7UUFDaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUMsQ0FBQyxzQ0FBc0MsQ0FBQyxFQUFFO2dCQUNwRCxHQUFHO2dCQUNILE1BQU07Z0JBQ04sUUFBUSxFQUFFLElBQUk7Z0JBQ2QsR0FBRyxFQUFFLElBQUk7YUFDVixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssaUJBQWlCLEdBQ3ZCLElBQUksT0FBTyxFQUFFLENBQUM7SUFFVCwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNoRCxhQUFhO1FBQ2IsYUFBYTtLQUNkLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGlDQUFpQztRQUM3QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU07WUFBRSxPQUFPO1FBRXRDLEtBQUssTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ25ELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUVuRCxJQUNFLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUNuQixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUNqQixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILGtFQUFrRTtnQkFDbEUsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQztvQkFDSCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxlQUFlLEVBQUU7d0JBQ3pELEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO3FCQUNoQyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FHdkMsQ0FBQztvQkFDRixNQUFNLFlBQVksR0FDaEIsT0FBTyxPQUFPLENBQUMsWUFBWSxLQUFLLFFBQVE7d0JBQ3hDLE9BQU8sQ0FBQyxZQUFZLEtBQUssSUFBSTt3QkFDN0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7d0JBQ2xDLENBQUMsQ0FBRSxPQUFPLENBQUMsWUFBd0M7d0JBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxnQkFBZ0IsR0FDcEIsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLEtBQUssUUFBUTt3QkFDNUMsT0FBTyxDQUFDLGdCQUFnQixLQUFLLElBQUk7d0JBQ2pDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7d0JBQ3RDLENBQUMsQ0FBRSxPQUFPLENBQUMsZ0JBQTRDO3dCQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNULG1CQUFtQjt3QkFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7NEJBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDdkQsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AseURBQXlEO2dCQUMzRCxDQUFDO2dCQUVELHlDQUF5QztnQkFDekMsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLG1FQUFtRTtnQkFDbkUsb0VBQW9FO2dCQUNwRSxnRUFBZ0U7Z0JBQ2hFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixJQUFJLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQztnQkFDbkMsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO3dCQUNyQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztxQkFDaEMsQ0FBQyxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2hELFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUNqQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNkLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO29CQUMvQixDQUFDO2dCQUNILENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLCtEQUErRDtnQkFDakUsQ0FBQztnQkFFRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsUUFBUTtvQkFBRSxTQUFTO2dCQUUxRCxpREFBaUQ7Z0JBQ2pELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxjQUFjO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxVQUFVO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxRQUFRO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFckMsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyw0Q0FBNEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDaE4sc0JBQXNCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDZFQUE2RTtvQkFDcEgsY0FBYyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsQ0FDcEosQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1Asa0VBQWtFO1lBQ3BFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLEtBQUssQ0FBQyxlQUFlLENBQzdCLE1BQWdCLEVBQ2hCLE1BQWMsRUFDZCxZQUFxQjtRQUVyQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFzQjtZQUMvQixlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDMUIsbUJBQW1CLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDOUIsb0JBQW9CLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDL0IsZUFBZSxFQUFFLElBQUksR0FBRyxFQUFFO1NBQzNCLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFakMsdUVBQXVFO1FBQ3ZFLDRFQUE0RTtRQUM1RSx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsd0RBQXdEO1FBQ3hELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxlQUFlLENBQ25ELE1BQU0sRUFDTiw0QkFBNEIsQ0FDN0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekIsTUFBTSxXQUFXLEdBQUcsdUJBQXVCO1lBQ3pDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLHVCQUF1QixDQUFDO1lBQ3RDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFWCxNQUFNLHFCQUFxQixHQUN6QixZQUFZLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFFbEQsTUFBTSxtQkFBbUIsQ0FBQztZQUN4QixXQUFXO1lBQ1gsS0FBSztZQUNMLG1CQUFtQixFQUFFLHFCQUFxQjtZQUMxQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO1lBQ2xDLDhCQUE4QixFQUM1QixJQUFJLENBQUMscUNBQXFDLEVBQUU7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixpQ0FBaUMsRUFDakMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsYUFBYSxJQUFJLENBQ2xDLENBQUM7UUFFRiwwREFBMEQ7UUFDMUQsTUFBTSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztRQUUvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxJQUFjLDZCQUE2QjtRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLEtBQUssQ0FBQyxrQkFBa0IsQ0FDaEMsVUFBa0IsRUFDbEIsT0FBZTtRQUVmLElBQ0UsSUFBSSxDQUFDLDZCQUE2QjtZQUNsQyxDQUFDLE1BQU0sY0FBYyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUMzQyxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsTUFBTSxDQUFDO1FBQ3JELE1BQU0sU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFNBQVMsR0FDYixLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxLQUFLO2dCQUNuRCxDQUFDLENBQUUsS0FBK0IsQ0FBQyxJQUFJO2dCQUN2QyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLElBQ0UsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPO2dCQUM1QixDQUFDLFNBQVMsS0FBSyxPQUFPLElBQUksU0FBUyxLQUFLLFFBQVEsQ0FBQyxFQUNqRCxDQUFDO2dCQUNELE1BQU0sU0FBUyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUMxQixPQUFlLEVBQ2YsU0FBaUIsRUFDakIsS0FBZTtRQUVmLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDbEYsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWxCLElBQUksQ0FBQztZQUNILElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDO29CQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDbkQsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDWCx3REFBd0Q7b0JBQ3hELCtFQUErRTtvQkFDL0UsSUFBSyxDQUEyQixDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkQsT0FBTyxDQUFDLElBQUksQ0FBQywyQ0FBMkMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDL0QsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQy9CO2dCQUNFLEdBQUcsUUFBUTtnQkFDWCxHQUFHLFNBQVM7YUFDYixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztZQUVGLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCLENBQ3hCLE1BQTRDLEVBQzVDLEtBQWEsRUFDYixZQUFZLEdBQUcsSUFBSSxFQUNuQixPQUVDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDL0MsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1lBQ25DLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2pDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxRQUFRLEdBQUcsVUFBVSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNqRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsdUJBQXVCLEtBQUssTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQzVEO29CQUNFLElBQUksRUFBRSx3REFBd0QsS0FBSywrREFBK0Q7aUJBQ25JLENBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFDRSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0I7WUFDMUIsTUFBTSxDQUFDLFFBQVE7WUFDZixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzFCLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyQixPQUFPLENBQUMsSUFBSSxDQUNWLFVBQVUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FDdEYsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxZQUFvQjtRQUM5QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEUsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FDdkUsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO1FBQ0Ysd0RBQXdEO1FBQ3hELElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxZQUFZO2lCQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDO2lCQUNWLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztpQkFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQ3RDLElBQVksRUFDWixJQUF5QjtRQUV6QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQ0UsTUFBTTtZQUNOLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUk7WUFDMUIsTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsT0FBTyxFQUNoQyxDQUFDO1lBQ0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEUsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLGlCQUFpQixDQUNsRCxnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxDQUFDLG9CQUFvQixFQUN6QixJQUFJLENBQUMsbUJBQW1CLENBQ3pCLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUN4QyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsV0FBVztTQUNaLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVTLDBCQUEwQixDQUFDLElBQVksRUFBRSxRQUFnQjtRQUNqRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsQ0FDN0MsSUFBSSxFQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFUyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFDL0MsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLEVBQ1osaUJBQWlCLEdBTWxCO1FBQ0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLDRCQUE0QixDQUFDO1FBQ2xELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FDakQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUNoQixZQUFZLENBQ2IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkRBQTJELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN4RTtnQkFDRSxJQUFJLEVBQUUsb0RBQW9EO2dCQUMxRCxLQUFLLEVBQUUsR0FBRzthQUNYLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFXLENBQUM7UUFFZCxNQUFNLFVBQVUsR0FDZCxpQkFBaUI7WUFDakIsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ2pDLFNBQVM7WUFDVCxhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztRQUVILE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsU0FBaUIsRUFBUSxFQUFFO1lBQ3hELGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQztRQUNGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxJQUFZLEVBQVEsRUFBRTtZQUN2RCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkUsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsT0FBTztZQUNULENBQUM7WUFDRCx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMscUJBQXFCLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQztRQUVGLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbEMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHOztFQUVqQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7Q0FHNUIsQ0FBQztRQUNFLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUM5QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsY0FBYyxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FDakUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQixNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsR0FDM0MsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELHFCQUFxQixDQUNuQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE9BQU8sRUFDUCxXQUFXLEVBQ1gsV0FBVyxDQUNaLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsa0JBQWtCLENBQ3JCLDRCQUE0QixFQUM1QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsSUFBSSxDQUNyQyxDQUFDO1FBQ0YsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFDaEMsVUFBVSxFQUNWLE1BQU0sR0FBRyxLQUFLLEVBQ2QsT0FBTyxFQUNQLG1CQUFtQixFQUNuQixxQ0FBcUMsRUFDckMsNkJBQTZCLEVBQzdCLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLG9CQUFvQixHQUFHLEtBQUssR0FrQjdCO1FBSUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLDRCQUE0QixDQUFDO1FBRWxELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxlQUFlLENBQ2hELE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDaEIsNEJBQTRCLENBQzdCLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxNQUFNLElBQUksa0JBQWtCLENBQzFCLDJEQUEyRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFDeEU7Z0JBQ0UsSUFBSSxFQUFFLG9EQUFvRDtnQkFDMUQsS0FBSyxFQUFFLEdBQUc7YUFDWCxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSxNQUFNLFVBQVUsR0FDZCxpQkFBaUI7WUFDakIsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUvRCwyRkFBMkY7UUFDM0YsK0VBQStFO1FBQy9FLHNGQUFzRjtRQUN0RixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxJQUNFLDZCQUE2QjtZQUM3QixtQkFBbUI7WUFDbkIsQ0FBQyxxQ0FBcUMsRUFDdEMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFDcEQsVUFBVTtvQkFDVixPQUFPO29CQUNQLFlBQVk7b0JBQ1osaUJBQWlCLEVBQUUsVUFBVTtpQkFDOUIsQ0FBQzthQUNILENBQUM7UUFDSixDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUU7WUFDakMsU0FBUztZQUNULGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsbURBQW1EO1FBQ25ELHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUNwQyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtpQkFDbkQsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7aUJBQ25CLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEIsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6RCwrREFBK0Q7WUFDL0QscUVBQXFFO1lBQ3JFLG1FQUFtRTtZQUNuRSxrRUFBa0U7WUFDbEUsc0RBQXNEO1lBQ3RELE1BQU0sa0NBQWtDLEdBQ3RDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7Z0JBQzlDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQ3pDLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO2dCQUNuRCxDQUFDLENBQ0MsdUJBQXVCLEtBQUssdUJBQXVCO29CQUNuRCx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsR0FBRyx1QkFBdUIsR0FBRyxDQUFDLENBQ2xFLENBQUM7WUFDSixNQUFNLHlCQUF5QixHQUFHLGtDQUFrQyxDQUFDO1lBRXJFLElBQUkseUJBQXlCLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUN6Qix1QkFBdUIsRUFDdkIsdUJBQXVCLENBQ3hCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3RFLFlBQVksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNyQyxDQUFDO2dCQUNELE9BQU8sV0FBVyxZQUFZLElBQUksQ0FBQztZQUNyQyxDQUFDO1lBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxhQUFhLENBQzdDLElBQUksRUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDdkIsQ0FBQztZQUVGLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsbUVBQW1FO2dCQUNuRSxPQUFPLFdBQVcsVUFBVSxJQUFJLENBQUM7WUFDbkMsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxvRUFBb0U7WUFDcEUsc0dBQXNHO1lBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRCw2REFBNkQ7WUFDN0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FDdkUsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO1lBQ0YsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFlBQVksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxPQUFPLFdBQVcsWUFBWSxJQUFJLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUYsc0VBQXNFO1FBQ3RFLG1EQUFtRDtRQUNuRCxFQUFFO1FBQ0YsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxpRUFBaUU7UUFDakUsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxvRUFBb0U7UUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFlLEVBQVUsRUFBRSxDQUMvQyxLQUFLO2FBQ0YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDZixNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkUsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hELHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhCLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1QywrREFBK0Q7UUFDL0QsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sWUFBWSxHQUFHOztjQUVYLFlBQVk7O01BRXBCLFdBQVc7O01BRVgsWUFBWTs7OzRDQUcwQixDQUFDO1FBRXpDLGdEQUFnRDtRQUNoRCxNQUFNLGVBQWUsR0FBRyxtQkFBbUI7WUFDekMsQ0FBQyxDQUFDO2dCQUNFLEdBQUcsU0FBUztnQkFDWixHQUFHLFVBQVU7Z0JBQ2IsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN4RDtZQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLHlCQUF5QixHQUFHLGVBQWU7WUFDL0MsQ0FBQyxDQUFDLE1BQU0sYUFBYSxDQUFDLGVBQWUsQ0FBQztZQUN0QyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLGFBQWEsQ0FBQztZQUN0RCxHQUFHLFNBQVM7WUFDWixHQUFHLGNBQWM7WUFDakIsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUN4RCxDQUFDLENBQUM7UUFDSCxNQUFNLHNCQUFzQixHQUMxQixNQUFNLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQzFELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxNQUFNLGdCQUFnQixHQUFHLG9CQUFvQjtZQUMzQyxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRTtnQkFDTixFQUFFLEVBQUUsbUVBQW1FLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFO2FBQzdHO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNsQyxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixNQUFNLEVBQUUsSUFBSTthQUNiO1lBQ0QsT0FBTztZQUNQLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDckMsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNO1lBQ04sUUFBUSxFQUFFLE1BQU07WUFDaEIsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixNQUFNLEVBQUUsS0FBSztZQUNiLEdBQUcsRUFBRSxVQUFVO1lBQ2YsUUFBUSxFQUFFLE9BQU87WUFDakIsMENBQTBDO1lBQzFDLGdGQUFnRjtZQUNoRixHQUFHLHNCQUFzQjtZQUN6QixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07YUFDUDtZQUNELHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUsc0VBQXNFO1lBQ3RFLHFFQUFxRTtZQUNyRSx5RUFBeUU7WUFDekUsbUVBQW1FO1lBQ25FLHFEQUFxRDtZQUNyRCxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUMzRCxPQUFPLEVBQUU7Z0JBQ1AsMkVBQTJFO2dCQUMzRSw0RUFBNEU7Z0JBQzVFLHlCQUF5QixFQUFFO2dCQUMzQixlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLE1BQU07b0JBQ1osZUFBZSxFQUFFLHlCQUF5QjtvQkFDMUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUM5QyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtvQkFDdEMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtvQkFDN0MsZ0JBQWdCO29CQUNoQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtvQkFDOUMscUNBQXFDO29CQUNyQyxtQkFBbUI7b0JBQ25CLGlCQUFpQixFQUFFLDJCQUEyQjtpQkFDL0MsQ0FBQzthQUNIO1lBQ0QscUVBQXFFO1lBQ3JFLDREQUE0RDtZQUM1RCxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ3BFLENBQUMsQ0FBQztRQUVILE1BQU0sV0FBVyxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLHNCQUFzQixFQUN0QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsSUFBSSxDQUNyQyxDQUFDO1FBRUYsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxpRUFBaUU7UUFDakUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUM1QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUM5QixDQUFDO1FBQ0YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLEdBQzlCLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzNCLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUN4QyxnQkFBZ0IsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUNoQyxZQUFZLENBQUMsU0FBUyxDQUN2QixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3pCLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUN0QyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUM5QixZQUFZLENBQUMsT0FBTyxDQUNyQixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZiw0RUFBNEU7Z0JBQzVFLE9BQU8sQ0FBQyxJQUFJLENBQ1YscURBQXFELFlBQVksR0FBRyxFQUNwRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQ3ZELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFDRCxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFDcEMsVUFBVSxFQUNWLE1BQU0sR0FBRyxLQUFLLEVBQ2QsT0FBTyxFQUNQLGlCQUFpQixHQUFHLElBQUksRUFDeEIsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQzVDLGVBQWUsR0FBRyxLQUFLLEVBQ3ZCLFlBQVksRUFDWixpQkFBaUIsR0FVbEI7UUFTQyxNQUFNLFVBQVUsR0FDZCxpQkFBaUI7WUFDakIsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRSxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFL0QsK0ZBQStGO1FBQy9GLG1GQUFtRjtRQUNuRiw0RUFBNEU7UUFDNUUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFFLHVDQUF1QztRQUN2QyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFdEUsbURBQW1EO1FBQ25ELHNFQUFzRTtRQUN0RSxxREFBcUQ7UUFDckQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsQ0FDN0MsSUFBSSxFQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1lBRUYsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxtRUFBbUU7Z0JBQ25FLHFDQUFxQztnQkFDckMsT0FBTyxXQUFXLFVBQVUsSUFBSSxDQUFDO1lBQ25DLENBQUM7WUFFRCxxQ0FBcUM7WUFDckMsb0VBQW9FO1lBQ3BFLHNHQUFzRztZQUN0RyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEQsNkRBQTZEO1lBQzdELElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQ3ZFLEtBQUssRUFDTCxHQUFHLENBQ0osQ0FBQztZQUNGLDBFQUEwRTtZQUMxRSxzRUFBc0U7WUFDdEUsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxZQUFZLEdBQUcsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsT0FBTyxXQUFXLFlBQVksSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQztRQUVGLG9FQUFvRTtRQUNwRSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDJDQUEyQztRQUMzQyxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFlLEVBQVUsRUFBRSxDQUMvQyxLQUFLO2FBQ0YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDZixNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkUsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hELHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhCLDZGQUE2RjtRQUM3RixzRkFBc0Y7UUFDdEYsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXBELCtEQUErRDtRQUMvRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFbEQsTUFBTSxPQUFPLEdBQUcsWUFBWTtZQUMxQixDQUFDLENBQUMsR0FBRyxlQUFlLDBEQUEwRCxZQUFZLEVBQUU7WUFDNUYsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUVwQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkMsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sc0JBQXNCLEdBQzFCLE1BQU0seUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLGFBQWEsQ0FBQztZQUM5RCxHQUFHLGFBQWE7WUFDaEIsR0FBRyxjQUFjO1NBQ2xCLENBQUMsQ0FBQztRQUVILGtFQUFrRTtRQUNsRSw4Q0FBOEM7UUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDN0MsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNsQyxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixNQUFNLEVBQUUsSUFBSTthQUNiO1lBQ0QsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO1lBQ3JDLE1BQU0sRUFBRSxLQUFLLEVBQUUsdUNBQXVDO1lBQ3RELFFBQVEsRUFBRSxTQUFTLEVBQUUsMkNBQTJDO1lBQ2hFLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRSwrQkFBK0I7WUFDL0QsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUseURBQXlEO1lBQ25GLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxLQUFLO1lBQ1osV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLGtFQUFrRTtZQUNsRSw0RUFBNEU7WUFDNUUscUVBQXFFO1lBQ3JFLE1BQU0sRUFBRTtnQkFDTixFQUFFLEVBQUUsNkNBQTZDO2FBQ2xEO1lBQ0QscUVBQXFFO1lBQ3JFLHdFQUF3RTtZQUN4RSxzREFBc0Q7WUFDdEQsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSxvRUFBb0U7WUFDcEUsc0VBQXNFO1lBQ3RFLHlEQUF5RDtZQUN6RCxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUMzRCwwQ0FBMEM7WUFDMUMsZ0ZBQWdGO1lBQ2hGLEdBQUcsc0JBQXNCO1lBQ3pCLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07YUFDUDtZQUNELE9BQU8sRUFBRTtnQkFDUCwyRUFBMkU7Z0JBQzNFLDRFQUE0RTtnQkFDNUUseUJBQXlCLEVBQUU7Z0JBQzNCLGVBQWUsQ0FBQztvQkFDZCxJQUFJLEVBQUUsVUFBVTtvQkFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7b0JBQ3RDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQzdDLGdCQUFnQjtvQkFDaEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7b0JBQzlDLGlCQUFpQixFQUFFLG1DQUFtQztpQkFDdkQsQ0FBQztnQkFDRiw0RUFBNEU7Z0JBQzVFLG9GQUFvRjtnQkFDcEYsMkJBQTJCLEVBQUU7YUFDOUI7WUFDRCxtRkFBbUY7WUFDbkYsMkZBQTJGO1lBQzNGLHVGQUF1RjtZQUN2RixxRkFBcUY7WUFDckYsMkNBQTJDO1lBQzNDLDZDQUE2QztZQUM3QyxxRkFBcUY7WUFDckYsaUZBQWlGO1NBQ2xGLENBQUMsQ0FBQztRQUNILElBQUksNkJBQTZCLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXZELElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsYUFBYSxFQUNiLDhCQUE4QixFQUM5QixJQUFJLEVBQ0o7Z0JBQ0UsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUM7YUFDcEUsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLDRCQUE0QixDQUMvQixzQ0FBc0MsRUFDdEMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsZUFBZSxJQUFJLENBQ3BDLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUMxQixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDakMsQ0FBQztnQkFDRixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBRWhCLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNsQyxNQUFNLEdBQUcsbUJBQW1CLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sSUFDTCxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDNUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDN0IsQ0FBQztvQkFDRCxNQUFNLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzdCLENBQUM7Z0JBRUQsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sU0FBUyxDQUNiLFlBQVksRUFDWixNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUU5QixJQUNFLENBQUMsYUFBYSxDQUFDLFdBQVc7Z0JBQzFCLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdEMsQ0FBQztnQkFDRCxNQUFNLElBQUksa0JBQWtCLENBQUMsd0NBQXdDLEVBQUU7b0JBQ3JFLElBQUksRUFBRSx5S0FBeUs7aUJBQ2hMLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCwwRUFBMEU7WUFDMUUsaUZBQWlGO1lBQ2pGLElBQ0UsZ0JBQWdCLENBQUMsT0FBTztnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNoRCxDQUFDO2dCQUNELE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztvQkFDekMsVUFBVSxFQUFFLEVBQUU7b0JBQ2QsWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCwwREFBMEQ7Z0JBQzFELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO2dCQUN2RCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBQy9CLElBQUksZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQ0FDckIsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0NBQ3BDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDOzRCQUM5QyxDQUFDOzRCQUNELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNyQyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3ZELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztvQkFDeEMsTUFBTSxVQUFVLEdBQ2QsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO3dCQUNyQixDQUFDLENBQUMsVUFBVSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUc7d0JBQzVCLENBQUMsQ0FBQyxXQUFXLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEUsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QixVQUFVLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FDNUQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sNkJBQTZCLEdBQUcsbUNBQW1DLENBQ3ZFO2dCQUNFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQzlCLHdCQUF3QixFQUFFLGtDQUFrQzthQUM3RCxDQUNGLENBQUM7WUFFRixNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsYUFBcUIsRUFBRSxFQUFFO2dCQUNsRCxNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQztnQkFFekMsTUFBTSxvQkFBb0IsR0FBRzs7Ozs7eUJBS1osa0JBQWtCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUM7O0VBRXBFLCtCQUErQixDQUFDLGtDQUFrQyw2QkFBNkIsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFFaEcsc0VBQXNFO2dCQUN0RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztvQkFDcEUsQ0FBQztvQkFDRCxxQ0FBcUM7b0JBQ3JDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBRTVDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUM3RCxPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVuQyxrRUFBa0U7Z0JBQ2xFLCtEQUErRDtnQkFDL0QsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUM5QyxNQUFNLEVBQUU7d0JBQ04sRUFBRSxFQUFFLG1FQUFtRSxxQkFBcUIsRUFBRTtxQkFDL0Y7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLFFBQVEsRUFBRSxvQkFBb0I7d0JBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7d0JBQ2xDLFVBQVUsRUFBRSxrQkFBa0I7d0JBQzlCLE1BQU0sRUFBRSxJQUFJO3FCQUNiO29CQUNELE9BQU87b0JBQ1AsbUZBQW1GO29CQUNuRiw4RUFBOEU7b0JBQzlFLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUM7b0JBQy9ELGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7b0JBQ3JDLE1BQU0sRUFBRSxJQUFJO29CQUNaLE1BQU07b0JBQ04sUUFBUSxFQUFFLE1BQU07b0JBQ2hCLE1BQU0sRUFBRSxRQUFRO29CQUNoQixLQUFLLEVBQUUsSUFBSTtvQkFDWCxTQUFTLEVBQUUsSUFBSTtvQkFDZixNQUFNLEVBQUUsS0FBSztvQkFDYixRQUFRLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQztpQkFDeEQsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixJQUFJLEVBQ0o7b0JBQ0UsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUM7aUJBQ3BFLENBQ0YsQ0FBQztnQkFDRixJQUFJLENBQUMsNEJBQTRCLENBQy9CLCtCQUErQixFQUMvQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLElBQUksQ0FDcEMsQ0FBQztZQUNKLENBQUMsQ0FBQztZQUNGLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDNUQsTUFBTSxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUVyQyxJQUFJLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLDZCQUE2QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsT0FBTztvQkFDTCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixnQkFBZ0I7b0JBQ2hCLFdBQVc7b0JBQ1gsaUJBQWlCO29CQUNqQixxQkFBcUIsRUFBRSxhQUFhLENBQUMsUUFBUTtpQkFDOUMsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPO2dCQUNMLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLGlCQUFpQjtnQkFDakIscUJBQXFCLEVBQUUsYUFBYSxDQUFDLFFBQVE7YUFDOUMsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsNkJBQTZCLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSw2QkFBNkIsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsQ0FBQztnQkFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO29CQUN0QixPQUFPLENBQUMsSUFBSSxDQUNWLG9EQUFvRCxFQUNwRCxZQUFZLENBQ2IsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFDbkMsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxHQUFHLEtBQUssRUFDZCxpQkFBaUIsR0FBRyxJQUFJLEVBQ3hCLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUNBQXFDLEVBQ3JDLDZCQUE2QixFQUM3QixpQkFBaUIsR0FjbEI7UUFTQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixNQUFNLDBCQUEwQixHQUM5QixpQkFBaUI7WUFDakIsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQ3pCLFVBQVUsRUFDVixPQUFPLENBQUMsV0FBVyxDQUFDLEVBQ3BCLFlBQVksQ0FDYixDQUFDLENBQUM7UUFFTCxnRUFBZ0U7UUFDaEUsdUVBQXVFO1FBQ3ZFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsR0FDdEQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDM0IsVUFBVTtZQUNWLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLCtEQUErRDtZQUMvRCxnRUFBZ0U7WUFDaEUsa0VBQWtFO1lBQ2xFLDJEQUEyRDtZQUMzRCxnRUFBZ0U7WUFDaEUsK0RBQStEO1lBQy9ELE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzFDLG1CQUFtQjtZQUNuQixxQ0FBcUM7WUFDckMsNkJBQTZCO1lBQzdCLFlBQVk7WUFDWixpQkFBaUIsRUFBRSwwQkFBMEI7WUFDN0MscUVBQXFFO1lBQ3JFLGlFQUFpRTtZQUNqRSw0REFBNEQ7WUFDNUQsb0JBQW9CLEVBQUUsaUJBQWlCO1NBQ3hDLENBQUMsQ0FBQztRQUVMLDRCQUE0QjtRQUM1QixNQUFNLG1CQUFtQixHQUFHLEdBQUcsV0FBVyxjQUFjLENBQUM7UUFDekQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDdkQsVUFBVTtZQUNWLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsTUFBTTtZQUNOLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsWUFBWTtZQUNaLGlCQUFpQixFQUFFLDBCQUEwQjtTQUM5QyxDQUFDLENBQUM7UUFFSCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUM7UUFDekQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdCQUF3QjtRQUMxQixDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sNkJBQTZCLEdBQUcsbUNBQW1DLENBQUM7WUFDeEUsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUM5Qix3QkFBd0IsRUFBRSxrQ0FBa0M7U0FDN0QsQ0FBQyxDQUFDO1FBRUgsTUFBTSxvQkFBb0IsR0FBRzs7c0NBRUssaUJBQWlCOzs7Ozs7Ozt5QkFROUIsYUFBYTs7RUFFcEMsK0JBQStCLENBQUMsa0NBQWtDLDZCQUE2QixHQUFHLENBQUMsRUFBRSxDQUFDO1FBRXBHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFBTSxDQUFDO1lBQ04sOENBQThDO1lBQzlDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUMxRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsc0VBQXNFO1lBQ3RFLHlFQUF5RTtZQUN6RSx5REFBeUQ7WUFDekQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN0QyxNQUFNLEVBQUU7b0JBQ04sRUFBRSxFQUFFLG1FQUFtRSxnQkFBZ0IsR0FBRyxxQkFBcUIsRUFBRTtpQkFDbEg7Z0JBQ0QsS0FBSyxFQUFFO29CQUNMLFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDO29CQUNoQyxVQUFVLEVBQUUsa0JBQWtCO29CQUM5QixNQUFNLEVBQUUsSUFBSTtpQkFDYjtnQkFDRCxPQUFPLEVBQUUsV0FBVztnQkFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDckMsTUFBTSxFQUFFLElBQUk7Z0JBQ1osTUFBTTtnQkFDTixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLFFBQVEsRUFBRSxDQUFDLDJDQUEyQyxDQUFDO2FBQ3hELENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUNyQix5QkFBeUIsRUFDekIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsZUFBZSxJQUFJLENBQ3BDLENBQUM7UUFDSixDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxHQUFHLGFBQWE7WUFDaEIsU0FBUyxFQUFFO2dCQUNULEdBQUcsYUFBYSxDQUFDLFNBQVM7Z0JBQzFCLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2FBQ3RDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEdBQUcsYUFBYSxDQUFDLE9BQU87Z0JBQ3hCLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQ3BDO1NBQ0YsQ0FBQztRQUVGLDBFQUEwRTtRQUMxRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssRUFBRSxpQkFBeUIsRUFBRSxFQUFFO1lBQzlELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsTUFBTSw2QkFBNkIsR0FBRyxtQ0FBbUMsQ0FDdkU7Z0JBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFDOUIsd0JBQXdCLEVBQUUsa0NBQWtDO2FBQzdELENBQ0YsQ0FBQztZQUNGLE1BQU0sSUFBSSxHQUFHOztzQ0FFbUIsaUJBQWlCOzs7Ozs7O3lCQU85QixPQUFPOztFQUU5QiwrQkFBK0IsQ0FBQyxrQ0FBa0MsNkJBQTZCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFbEcsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsT0FBTztnQkFDTCxRQUFRO2dCQUNSLFlBQVk7Z0JBQ1osZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLGdCQUFnQjtnQkFDbEQsV0FBVyxFQUFFLG1CQUFtQjtnQkFDaEMsaUJBQWlCLEVBQUUsMEJBQTBCO2dCQUM3QyxhQUFhO2dCQUNiLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxRQUFRO2FBQzVDLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLFFBQVE7WUFDUixpQkFBaUIsRUFBRSwwQkFBMEI7WUFDN0MsYUFBYTtZQUNiLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxRQUFRO1NBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNsQyxxREFBcUQ7WUFDckQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLGdDQUFnQyxFQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUM3QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixrSUFBa0ksQ0FDbkksQ0FBQztRQUVGLHFEQUFxRDtRQUNyRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTlDLG1HQUFtRztRQUNuRywrRUFBK0U7UUFDL0UsK0ZBQStGO1FBQy9GLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FDekQsVUFBVSxFQUNWLFNBQVMsQ0FDVixDQUFDO1FBRUYsb0VBQW9FO1FBQ3BFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQ2xDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQzdDLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQ3JELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDcEMsQ0FBQztRQUVGLGlFQUFpRTtRQUNqRSx3RUFBd0U7UUFDeEUsa0VBQWtFO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLFVBQVU7YUFDekIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEUsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FDN0QsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFlBQVksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxPQUFPLGtCQUFrQixZQUFZLElBQUksQ0FBQztRQUM1QyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFZCxpRkFBaUY7UUFDakYsTUFBTSxZQUFZLEdBQUcsY0FBYzthQUNoQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNaLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUM3RCxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sV0FBVyxZQUFZLElBQUksQ0FBQztRQUNyQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFZCxzRUFBc0U7UUFDdEUsTUFBTSxZQUFZLEdBQUcsWUFBWTtZQUMvQixDQUFDLENBQUMsd0RBQXdELFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDdEYsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLGdEQUFnRDtRQUNoRCxNQUFNLGlDQUFpQyxHQUFHLE1BQU0sYUFBYSxDQUFDO1lBQzVELEdBQUcsVUFBVTtZQUNiLEdBQUcsY0FBYztTQUNsQixDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDdkMsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxrRUFBa0U7YUFDdkU7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ2xDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLE1BQU0sRUFBRSxJQUFJO2FBQ2I7WUFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7WUFDckMsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLEdBQUcsRUFBRSxVQUFVO1lBQ2YsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsSUFBSTtZQUNqQixRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUM1QixpQkFBaUIsRUFBRTtnQkFDakIsS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2FBQ1A7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsZUFBZSxDQUFDO29CQUNkLElBQUksRUFBRSxNQUFNO29CQUNaLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CO29CQUN0QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUM3QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtvQkFDOUMsaUJBQWlCLEVBQUUsaUNBQWlDO2lCQUNyRCxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFL0QsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUNsQyxPQUFPLEVBQ1AsTUFBTSxHQUFHLEtBQUssR0FJZjtRQUNDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzFELE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELGlEQUFpRDtRQUNqRCxnRUFBZ0U7UUFDaEUsc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsTUFBTSxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dDQTRCeEMsQ0FBQztRQUU3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWix3Q0FBd0M7WUFDeEMsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDaEQsT0FBTztRQUNULENBQUM7UUFFRCwrREFBK0Q7UUFFL0QsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2pDLE1BQU0sRUFBRTtnQkFDTixFQUFFLEVBQUUsbUVBQW1FLHVCQUF1QixFQUFFO2FBQ2pHO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNsQyxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixNQUFNLEVBQUUsSUFBSTthQUNiO1lBQ0QsT0FBTztZQUNQLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDckMsTUFBTSxFQUFFLElBQUk7WUFDWixHQUFHLEVBQUUsVUFBVTtZQUNmLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixNQUFNLEVBQUUsS0FBSztZQUNiLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07YUFDUDtZQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUM7WUFDL0QsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUM5Qiw2RUFBNkU7WUFDN0UsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLDBCQUEwQixDQUM3Qix3QkFBd0IsRUFDeEIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLElBQUksQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQyxpQkFBaUIsQ0FDL0IsR0FBVyxFQUNYLElBQTJCO1FBRTNCLE1BQU0sV0FBVyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDN0IsTUFBTSxTQUFTLENBQ2IsSUFBSSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsRUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLGNBQWMsQ0FDNUIsR0FBVyxFQUNYLE1BaUJDO1FBRUQsTUFBTSxRQUFRLEdBQUc7WUFDZixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxZQUFZO1lBQ3ZDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLFdBQVc7WUFDdEMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksUUFBUTtZQUM3QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksSUFBSSxPQUFPO1lBQzVDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO1lBQ2pELEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSTtnQkFDdEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2FBQ2hDLENBQUM7WUFDRixHQUFHLENBQUMsTUFBTSxDQUFDLHlCQUF5QixLQUFLLFNBQVMsSUFBSTtnQkFDcEQseUJBQXlCLEVBQUUsTUFBTSxDQUFDLHlCQUF5QjthQUM1RCxDQUFDO1lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSTtnQkFDakMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjthQUNsRCxDQUFDO1NBQ0gsQ0FBQztRQUVGLE1BQU0sU0FBUyxDQUNiLElBQUksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsRUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVyxDQUFDLElBQVk7UUFDaEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFnQjtRQUM5QyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRVMsS0FBSyxDQUFDLGdCQUFnQjtRQUM5QixNQUFNLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVPLEtBQUssQ0FBQyw4QkFBOEI7UUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQztZQUNILElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFLLEtBQStCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN2RCxPQUFPO2dCQUNULENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQ0wsT0FBTyxLQUFLLE1BQU07b0JBQ2xCLE9BQU8sS0FBSyxPQUFPO29CQUNuQixPQUFPLEtBQUssT0FBTztvQkFDbkIsT0FBTyxLQUFLLFFBQVEsQ0FDckIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVELE1BQU0sU0FBUyxDQUFDLGFBQWEsRUFBRSxHQUFHLE9BQU8sR0FBRyxTQUFTLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCx3RkFBd0Y7UUFDMUYsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsMkJBQTJCO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxDQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQ2xELEtBQUssQ0FDTixDQUFDO1FBQ0osQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdGQUF3RjtRQUMxRixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWMsMEJBQTBCO1FBQ3RDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsS0FBSyxHQUFHLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7T0FHRztJQUNPLDBCQUEwQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDL0IsT0FBTyxPQUFPLENBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUMxQix5QkFBeUIsQ0FDMUIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLHlCQUF5QixFQUFFLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUNyQixvREFBb0QsQ0FDckQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQWMsa0JBQWtCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLGFBQWEsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQWMsb0JBQW9CO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxnQkFBZ0IsQ0FBQyxXQUEwQjtRQUNuRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRSxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDMUMsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08scUNBQXFDO1FBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyw4QkFBOEIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUM7UUFDcEQsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUMzQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLEtBQUssU0FBUztZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQWMsaUJBQWlCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEtBQUssQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQzdCLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsUUFBUSxHQUtUO1FBQ0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQztZQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0scUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUV2RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDN0MsUUFBUSxDQUFDLFNBQVMsRUFDbEIsY0FBYyxDQUNmLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTlELE1BQU0sTUFBTSxHQUFHO2dCQUNiLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixLQUFLLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDO2dCQUNqQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxDQUFDO2dCQUN6QyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxDQUFDO2FBQ3RDLENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFckQsTUFBTSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsTUFBTSxrQkFBa0IsQ0FDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFDbEMsWUFBWSxDQUNiLENBQUM7WUFFRixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2xFLElBQUksdUJBQXVCLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQ3BELE1BQU0sa0JBQWtCLENBQUMsdUJBQXVCLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUMzQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDdkMsQ0FBQyxDQUNGLENBQUM7WUFDRixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FDbkQsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQ3ZDLENBQUMsQ0FDRixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQzlDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUN2QyxDQUFDLENBQ0YsQ0FBQztZQUVGLElBQUksQ0FBQyxxQkFBcUIsQ0FDeEIseUJBQXlCLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxhQUFhLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLFNBQVMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQ3BOLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsSUFBSSxDQUMvQixDQUFDO1lBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLENBQUMsdUJBQXVCLENBQUM7b0JBQzNCLFNBQVM7b0JBQ1QsYUFBYTtpQkFDZCxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUUvQixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNEJBQTRCLEVBQzVCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDdkQsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLEtBQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUF1RCxFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUUxQixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsU0FBd0MsRUFDeEMsTUFHQztRQVFELE1BQU0sTUFBTSxHQU1SLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFOUIsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsMkRBQTJEO1FBQzNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBRzdCLENBQUM7UUFDSixLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sVUFBVSxHQUFHLFNBQVM7aUJBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2lCQUNwQixPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0Qiw4Q0FBOEM7WUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRO2lCQUNoQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztpQkFDcEIsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1QixNQUFNLFlBQVksR0FDaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRS9ELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRztvQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMzQixLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2lCQUMvRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sc0JBQXNCLENBQzVCLE9BQW9DO1FBRXBDLE1BQU0sTUFBTSxHQUF3RCxFQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUU1QixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICByZWFscGF0aCxcbiAgcmVuYW1lLFxuICBybSxcbiAgc3RhdCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IGJ1aWxkTG9nZ2VyIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvbG9nZ2VyJztcbmltcG9ydCB7IFdvcmtmbG93QnVpbGRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGx1cmFsaXplIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZW5oYW5jZWRSZXNvbHZlT3JpZ2luYWwgZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSAnZmluZC11cCc7XG5pbXBvcnQgeyBnbG9iIH0gZnJvbSAndGlueWdsb2JieSc7XG5pbXBvcnQge1xuICBhcHBseVN3Y1RyYW5zZm9ybSxcbiAgdHlwZSBXb3JrZmxvd01hbmlmZXN0LFxufSBmcm9tICcuL2FwcGx5LXN3Yy10cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUsXG4gIGNyZWF0ZVdvcmtmbG93Um91dGVIYW5kbGVyc0NvZGUsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdldEVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgfSBmcm9tICcuL2VzYnVpbGQtdHNjb25maWcuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBEaXNjb3ZlcmVkRW50cmllcyxcbiAgZmFzdERpc2NvdmVyRW50cmllcyxcbn0gZnJvbSAnLi9mYXN0LWRpc2NvdmVyeS5qcyc7XG5pbXBvcnQge1xuICBoYXNoTWFuaWZlc3RTb3VyY2UsXG4gIHR5cGUgTWFuaWZlc3RFbnRyeUxvY2F0aW9uLFxuICBtZXJnZVdvcmtmbG93TWFuaWZlc3QsXG59IGZyb20gJy4vbWFuaWZlc3QtaWRzLmpzJztcbmltcG9ydCB7XG4gIGdldEltcG9ydFBhdGgsXG4gIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIsXG4gIHN0cmlwUGFja2FnZVZlcnNpb24sXG59IGZyb20gJy4vbW9kdWxlLXNwZWNpZmllci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4gfSBmcm9tICcuL25vZGUtbW9kdWxlLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4gfSBmcm9tICcuL3BzZXVkby1wYWNrYWdlLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN3Y1BsdWdpbiB9IGZyb20gJy4vc3djLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGRldGVjdFdvcmtmbG93UGF0dGVybnMgfSBmcm9tICcuL3RyYW5zZm9ybS11dGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZW1hcE1vZGUsIFdvcmtmbG93Q29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0V29ya2Zsb3dHcmFwaHMgfSBmcm9tICcuL3dvcmtmbG93cy1leHRyYWN0b3IuanMnO1xuaW1wb3J0IHsgaGFzU2FtZUNvbnRlbnQsIHdyaXRlRmlsZUlmQ2hhbmdlZCB9IGZyb20gJy4vd3JpdGUtaWYtY2hhbmdlZC5qcyc7XG5cbmNvbnN0IGVuaGFuY2VkUmVzb2x2ZSA9IHByb21pc2lmeShlbmhhbmNlZFJlc29sdmVPcmlnaW5hbCk7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG4vKipcbiAqIE9yZGVyIHRoZSBwZXItZmlsZSBtYW5pZmVzdCBzZWN0aW9ucyBkZXRlcm1pbmlzdGljYWxseS5cbiAqXG4gKiBFbnRyeSBkaXNjb3ZlcnkgcnVucyBjb25jdXJyZW50bHksIHNvIHRoZSBpbnNlcnRpb24gb3JkZXIgb2YgdGhlc2UgbWFwc1xuICogdmFyaWVzIGJldHdlZW4gb3RoZXJ3aXNlIGlkZW50aWNhbCBidWlsZHMgYW5kIHRoZSBzZXJpYWxpemVkIG1hbmlmZXN0IGNvbWVzXG4gKiBvdXQgYnl0ZS1kaWZmZXJlbnQgZXZlcnkgdGltZS4gU29ydGluZyBtYWtlcyB0aGUgbWFuaWZlc3QgcmVwcm9kdWNpYmxlLCBhbmRcbiAqIGxldHMgdGhlIHVuY2hhbmdlZC13cml0ZSBndWFyZCBpbiBgd3JpdGVGaWxlSWZDaGFuZ2VkYCBhY3R1YWxseSBmaXJlIGZvciBpdC5cbiAqXG4gKiBDb21wYXJlZCBieSBjb2RlIHVuaXQgcmF0aGVyIHRoYW4gYGxvY2FsZUNvbXBhcmVgLCB3aG9zZSByZXN1bHQgZGVwZW5kcyBvblxuICogdGhlIGhvc3QgbG9jYWxlLlxuICovXG5mdW5jdGlvbiBzb3J0TWFuaWZlc3RFbnRyaWVzPFQ+KFxuICBzZWN0aW9uOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBUPj5cbik6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFQ+PiB7XG4gIGNvbnN0IGJ5S2V5ID0gKFthXTogW3N0cmluZywgdW5rbm93bl0sIFtiXTogW3N0cmluZywgdW5rbm93bl0pID0+XG4gICAgYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhzZWN0aW9uKVxuICAgICAgLnNvcnQoYnlLZXkpXG4gICAgICAubWFwKChbZmlsZSwgZW50cmllc10pID0+IFtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLnNvcnQoYnlLZXkpKSxcbiAgICAgIF0pXG4gICk7XG59XG5cbmV4cG9ydCB0eXBlIHsgRGlzY292ZXJlZEVudHJpZXMgfSBmcm9tICcuL2Zhc3QtZGlzY292ZXJ5LmpzJztcblxuLyoqXG4gKiBMZWdhY3kgb3B0LWluIGZvciBzb3VyY2UgbWFwcyBvbiB0aGUgZmluYWwgd29ya2Zsb3cgd3JhcHBlciArIHdlYmhvb2tcbiAqIGJ1bmRsZXMgKHdoaWNoIGRlZmF1bHQgdG8gb2ZmLCB1bmxpa2UgdGhlIHN0ZXAvaW50ZXJpbSB3b3JrZmxvdyBidW5kbGVzXG4gKiB0aGF0IGRlZmF1bHQgdG8gaW5saW5lKS4gU3VwZXJzZWRlZCBieSB0aGUgYHNvdXJjZW1hcGAgY29uZmlnIG9wdGlvbiBhbmRcbiAqIHRoZSBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnZpcm9ubWVudCB2YXJpYWJsZTsga2VwdCBmb3IgYmFjay1jb21wYXQuXG4gKi9cbmNvbnN0IEVNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HID1cbiAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcgPT09ICcxJztcblxuY29uc3QgVkFMSURfU09VUkNFTUFQX1NUUklOR1MgPSBuZXcgU2V0KFtcbiAgJ2lubGluZScsXG4gICdsaW5rZWQnLFxuICAnZXh0ZXJuYWwnLFxuICAnYm90aCcsXG5dKTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgdmFsdWUgb2YgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlIGludG8gYVxuICogYFNvdXJjZW1hcE1vZGVgLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBlbnYgdmFyIGlzIHVuc2V0LCBlbXB0eSwgb3JcbiAqIHVucmVjb2duaXplZCAoYSB3YXJuaW5nIGlzIGVtaXR0ZWQgZm9yIHVucmVjb2duaXplZCB2YWx1ZXMpLlxuICovXG5mdW5jdGlvbiBwYXJzZVNvdXJjZW1hcEVudihcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogU291cmNlbWFwTW9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgc3dpdGNoICh2YWx1ZSkge1xuICAgIGNhc2UgJzAnOlxuICAgIGNhc2UgJ2ZhbHNlJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlICcxJzpcbiAgICBjYXNlICd0cnVlJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAoVkFMSURfU09VUkNFTUFQX1NUUklOR1MuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgYXMgU291cmNlbWFwTW9kZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYElnbm9yaW5nIHVucmVjb2duaXplZCBXT1JLRkxPV19TT1VSQ0VNQVA9JHt2YWx1ZX0uIGAgK1xuICAgICAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6IHRydWUsIGZhbHNlLCAwLCAxLCBpbmxpbmUsIGxpbmtlZCwgZXh0ZXJuYWwsIGJvdGguYFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgdmFsdWUgb2YgdGhlIGBXT1JLRkxPV19ESVNDT1ZFUl9OT0RFX01PRFVMRVNgIGVudmlyb25tZW50IHZhcmlhYmxlXG4gKiBpbnRvIGEgYm9vbGVhbi4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgZW52IHZhciBpcyB1bnNldCBvciBlbXB0eSBzb1xuICogY2FsbGVycyBjYW4gZmFsbCBiYWNrIHRvIGNvbmZpZy9kZWZhdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZURpc2NvdmVyTm9kZU1vZHVsZXNFbnYoXG4gIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB2YWx1ZSAhPT0gJzAnICYmIHZhbHVlICE9PSAnZmFsc2UnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRCdWlsZER1cmF0aW9uKGR1cmF0aW9uTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkdXJhdGlvbk1zIDwgMTAwMCkge1xuICAgIHJldHVybiBgJHtkdXJhdGlvbk1zfW1zYDtcbiAgfVxuXG4gIHJldHVybiBgJHsoZHVyYXRpb25NcyAvIDEwMDApLnRvRml4ZWQoMSl9c2A7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGFycmF5IG9mIGZpbGUgcGF0aHMgYnkgYXBwZW5kaW5nIHRoZSBgcmVhbHBhdGgoKWAgb2YgZWFjaCBlbnRyeVxuICogKHRvIGhhbmRsZSBzeW1saW5rcywgZS5nLiBwbnBtL3dvcmtzcGFjZSBsYXlvdXRzKSBhbmQgZGVkdXBsaWNhdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFJlYWxwYXRocyhlbnRyaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbmV3IFNldChcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZW50cmllcy5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlYWxwYXRoKGVudHJ5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gW2VudHJ5LCByZXNvbHZlZF0gOiBbZW50cnldO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBcIndoYXQgbW9kdWxlIGRvZXMgdGhpcyBmaWxlIHJlcHJlc2VudD9cIiBrZXkgdXNlZCB0byBkZWR1cGVcbiAqIHZpcnR1YWwtZW50cnkgaW1wb3J0cy5cbiAqXG4gKiBJZiB0aGUgZmlsZSByZXNvbHZlcyB0byBhIHJlYWwgcGFja2FnZSBzcGVjaWZpZXIgKGB3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc2AsXG4gKiBgQGludGVybmFsL2FnZW50L3NlcnZlcmAsIGV0Yy4pLCB3ZSByZXR1cm4gdGhlIGJhcmUgc3BlY2lmaWVyICh2ZXJzaW9uXG4gKiBzdHJpcHBlZCkgYmVjYXVzZSBlc2J1aWxkJ3MgcGFja2FnZSByZXNvbHV0aW9uIHdpbGwgY29sbGFwc2UgYWxsXG4gKiBpbXBvcnRlcnMgb2YgdGhhdCBzcGVjaWZpZXIgdG8gdGhlIHNhbWUgcGh5c2ljYWwgbW9kdWxlIHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoaWNoIG9uLWRpc2sgY29weSAoc3JjIHZzIGRpc3QpIGFueSBvbmUgaW1wb3J0ZXIgd3JvdGUuXG4gKlxuICogT3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoLiBEaXN0aW5jdCBsb2NhbC1hcHBcbiAqIGZpbGVzIGhhdmUgZGlzdGluY3QgcGF0aHMsIHNvIHRoaXMgc3RpbGwgZGVkdXBlcyBhIGZpbGUgYWdhaW5zdCBpdHNlbGZcbiAqIChlLmcuIGlmIGl0IHNob3dzIHVwIGluIGJvdGggYHN0ZXBGaWxlc2AgYW5kIGBzZXJkZU9ubHlGaWxlc2ApIHdpdGhvdXRcbiAqIGNvbmZsYXRpbmcgdW5yZWxhdGVkIGZpbGVzLlxuICovXG5mdW5jdGlvbiBtb2R1bGVJZGVudGl0eUtleShmaWxlOiBzdHJpbmcsIG1vZHVsZVNwZWNpZmllclJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgbW9kdWxlU3BlY2lmaWVyIH0gPSByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGUsIG1vZHVsZVNwZWNpZmllclJvb3QpO1xuICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgLy8gU3RyaXAgdGhlIFwiQDx2ZXJzaW9uPlwiIHN1ZmZpeCBzbyBzb3VyY2UgYW5kIGRpc3QgY29waWVzIG9mIHRoZSBzYW1lXG4gICAgLy8gZXhwb3J0IGNvbGxhcHNlIHRvIHRoZSBzYW1lIGtleS5cbiAgICByZXR1cm4gc3RyaXBQYWNrYWdlVmVyc2lvbihtb2R1bGVTcGVjaWZpZXIpO1xuICB9XG4gIHJldHVybiBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxudHlwZSBDYWNoZWRNYW5pZmVzdFRyYW5zZm9ybSA9IHtcbiAgc2l6ZTogbnVtYmVyO1xuICBtdGltZU1zOiBudW1iZXI7XG4gIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xuICAvKipcbiAgICogRmluZ2VycHJpbnQgb2YgdGhlIHNvdXJjZSBjb250ZW50cyB0aGF0IHByb2R1Y2VkIGBtYW5pZmVzdGAsIHVzZWQgdG9cbiAgICogZGVkdXBsaWNhdGUgZXF1aXZhbGVudCBjb3BpZXMgb2YgdGhlIHNhbWUgbW9kdWxlIGFjcm9zcyBmaWxlcyAoc2VlXG4gICAqIGBtZXJnZVdvcmtmbG93TWFuaWZlc3RgIGluIGBtYW5pZmVzdC1pZHMudHNgKS5cbiAgICovXG4gIGNvbnRlbnRIYXNoOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHdvcmtmbG93IGJ1aWxkZXJzLiBQcm92aWRlcyBjb21tb24gYnVpbGQgbG9naWMgZm9yIHRyYW5zZm9ybWluZ1xuICogd29ya2Zsb3cgc291cmNlIGZpbGVzIGludG8gZGVwbG95YWJsZSBidW5kbGVzIHVzaW5nIGVzYnVpbGQgYW5kIFNXQy5cbiAqXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBidWlsZCgpIG1ldGhvZCB0byBkZWZpbmUgYnVpbGRlci1zcGVjaWZpYyBsb2dpYy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VCdWlsZGVyIHtcbiAgcHJvdGVjdGVkIGNvbmZpZzogV29ya2Zsb3dDb25maWc7XG5cbiAgLyoqXG4gICAqIFRyYWNrcyB3aGljaCBleHRlcm5hbCBwYWNrYWdlcyBoYXZlIGFscmVhZHkgYmVlbiB3YXJuZWQgYWJvdXRcbiAgICogdG8gYXZvaWQgZHVwbGljYXRlIHdhcm5pbmdzIGFjcm9zcyBtdWx0aXBsZSBkaXNjb3ZlckVudHJpZXMoKSBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgd2FybmVkRXh0ZXJuYWxQYWNrYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHdvcmtmbG93QnVpbGRTdGFydFRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBtYW5pZmVzdFRyYW5zZm9ybUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZE1hbmlmZXN0VHJhbnNmb3JtPigpO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogV29ya2Zsb3dDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNmb3JtUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvamVjdFJvb3QgfHwgdGhpcy5jb25maWcud29ya2luZ0RpcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbW9kdWxlU3BlY2lmaWVyUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5tb2R1bGVTcGVjaWZpZXJSb290IHx8IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3Q7XG4gIH1cblxuICBwcm90ZWN0ZWQgbG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGJ1aWxkTG9nZ2VyLmRlYnVnKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRXb3JrZmxvd0J1aWxkVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V29ya2Zsb3dCdWlsZER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIERhdGUubm93KCkgLSAodGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID8/IERhdGUubm93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFdvcmtmbG93QnVpbGRUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtmbG93QnVpbGRTdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtmbG93QnVpbGRTdW1tYXJ5KHtcbiAgICBzdGVwQ291bnQsXG4gICAgd29ya2Zsb3dDb3VudCxcbiAgfToge1xuICAgIHN0ZXBDb3VudDogbnVtYmVyO1xuICAgIHdvcmtmbG93Q291bnQ6IG51bWJlcjtcbiAgfSk6IHN0cmluZyB7XG4gICAgY29uc3QgY291bnRzID0gYCR7c3RlcENvdW50fSAke3BsdXJhbGl6ZSgnc3RlcCcsICdzdGVwcycsIHN0ZXBDb3VudCl9LCAke3dvcmtmbG93Q291bnR9ICR7cGx1cmFsaXplKCd3b3JrZmxvdycsICd3b3JrZmxvd3MnLCB3b3JrZmxvd0NvdW50KX1gO1xuICAgIHJldHVybiBg4pyTIENvbXBpbGVkIHdvcmtmbG93cyBpbiAke2Zvcm1hdEJ1aWxkRHVyYXRpb24odGhpcy5nZXRXb3JrZmxvd0J1aWxkRHVyYXRpb24oKSl9ICgke2NvdW50c30pYDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nQ3JlYXRlV29ya2Zsb3dzQnVuZGxlSW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlTG9ncykge1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dDcmVhdGVXZWJob29rQnVuZGxlSW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV2ViaG9va0J1bmRsZUxvZ3MpIHtcbiAgICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nQ3JlYXRlTWFuaWZlc3RJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVNYW5pZmVzdExvZ3MpIHtcbiAgICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIG91dHB1dHRpbmcgQ0pTLCBlc2J1aWxkIHJlcGxhY2VzIGBpbXBvcnQubWV0YWAgd2l0aCBhbiBlbXB0eSBvYmplY3QsXG4gICAqIG1ha2luZyBgaW1wb3J0Lm1ldGEudXJsYCAoYW5kIGBpbXBvcnQubWV0YS5yZXNvbHZlYCkgdW5kZWZpbmVkLiBUaGlzIG1ldGhvZFxuICAgKiByZXR1cm5zIGJhbm5lciBjb2RlIGFuZCBgZGVmaW5lYCBlbnRyaWVzIHRoYXQgcG9seWZpbGwgdGhlbSB1c2luZyBDSlNcbiAgICogZXF1aXZhbGVudHMgKGBfX2ZpbGVuYW1lYCwgYHJlcXVpcmUucmVzb2x2ZWApIHNvIHVzZXIgY29kZSAoZS5nLiBQcmlzbWEpXG4gICAqIHRoYXQgcmVsaWVzIG9uIGBpbXBvcnQubWV0YS51cmxgIHdvcmtzIGNvcnJlY3RseSBpbiBidW5kbGVkIENKUyBvdXRwdXQuXG4gICAqL1xuICBwcml2YXRlIGdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQ6IHN0cmluZyk6IHtcbiAgICBiYW5uZXI6IHN0cmluZztcbiAgICBkZWZpbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0ge1xuICAgIGlmIChmb3JtYXQgIT09ICdjanMnKSByZXR1cm4geyBiYW5uZXI6ICcnLCBkZWZpbmU6IHt9IH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhbm5lcjpcbiAgICAgICAgJ3ZhciBfX2ltcG9ydF9tZXRhX3VybCA9IHR5cGVvZiBfX2ZpbGVuYW1lICE9PSBcInVuZGVmaW5lZFwiID8gcmVxdWlyZShcInVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWYgOiB1bmRlZmluZWQ7XFxuJyArXG4gICAgICAgICd2YXIgX19pbXBvcnRfbWV0YV9yZXNvbHZlID0gdHlwZW9mIHJlcXVpcmUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIF9fZmlsZW5hbWUgIT09IFwidW5kZWZpbmVkXCIgJyArXG4gICAgICAgICc/IChzKSA9PiByZXF1aXJlKFwidXJsXCIpLnBhdGhUb0ZpbGVVUkwocmVxdWlyZS5yZXNvbHZlKHMpKS5ocmVmIDogdW5kZWZpbmVkO1xcbicsXG4gICAgICBkZWZpbmU6IHtcbiAgICAgICAgJ2ltcG9ydC5tZXRhLnVybCc6ICdfX2ltcG9ydF9tZXRhX3VybCcsXG4gICAgICAgICdpbXBvcnQubWV0YS5yZXNvbHZlJzogJ19faW1wb3J0X21ldGFfcmVzb2x2ZScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBvdXRwdXR0aW5nIGZ1bGx5LWJ1bmRsZWQgRVNNLCBDSlMgZGVwZW5kZW5jaWVzIHRoYXQgY2FsbCByZXF1aXJlKClcbiAgICogZm9yIE5vZGUuanMgYnVpbHRpbnMgKGUuZy4gZGVidWcg4oaSIHJlcXVpcmUoJ3R0eScpKSBicmVhayBiZWNhdXNlIGVzYnVpbGQnc1xuICAgKiBDSlMtdG8tRVNNIF9fcmVxdWlyZSBzaGltIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gYSByZWFsIHJlcXVpcmUgZnVuY3Rpb24uXG4gICAqIFRoaXMgYmFubmVyIHByb3ZpZGVzIG9uZSB2aWEgY3JlYXRlUmVxdWlyZSBzbyBidW5kbGVkIENKUyBjb2RlIHdvcmtzIGluIEVTTS5cbiAgICovXG4gIHByaXZhdGUgZ2V0RXNtUmVxdWlyZUJhbm5lcihmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZvcm1hdCAhPT0gJ2VzbScpIHJldHVybiAnJztcbiAgICByZXR1cm4gJ2ltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgYXMgX19jcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XFxudmFyIHJlcXVpcmUgPSBfX2NyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcXG4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIHRoZSBjb21wbGV0ZSBidWlsZCBwcm9jZXNzIGZvciB3b3JrZmxvd3MuXG4gICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyB0byBkZWZpbmUgdGhlaXIgc3BlY2lmaWMgYnVpbGQgc3RlcHMuXG4gICAqL1xuICBhYnN0cmFjdCBidWlsZCgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBGaW5kcyB0c2NvbmZpZy5qc29uL2pzY29uZmlnLmpzb24gZm9yIHRoZSBwcm9qZWN0LlxuICAgKiBVc2VkIGJ5IGVzYnVpbGQgdG8gcHJvcGVybHkgcmVzb2x2ZSBtb2R1bGUgaW1wb3J0cyBkdXJpbmcgYnVuZGxpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZmluZFRzQ29uZmlnUGF0aCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGN3ZCA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICByZXR1cm4gZmluZFVwKFsndHNjb25maWcuanNvbicsICdqc2NvbmZpZy5qc29uJ10sIHsgY3dkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdmVycyBhbGwgc291cmNlIGZpbGVzIGluIHRoZSBjb25maWd1cmVkIGRpcmVjdG9yaWVzLlxuICAgKiBTZWFyY2hlcyBmb3IgVHlwZVNjcmlwdCBhbmQgSmF2YVNjcmlwdCBmaWxlcyB3aGlsZSBleGNsdWRpbmcgY29tbW9uIGJ1aWxkXG4gICAqIGFuZCBkZXBlbmRlbmN5IGRpcmVjdG9yaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldElucHV0RmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGlnbm9yZSA9IFtcbiAgICAgICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAgICAgJyoqLy5naXQvKionLFxuICAgICAgJyoqLy5uZXh0LyoqJyxcbiAgICAgICcqKi8ubml0cm8vKionLFxuICAgICAgJyoqLy5udXh0LyoqJyxcbiAgICAgICcqKi8ub3V0cHV0LyoqJyxcbiAgICAgICcqKi8udmVyY2VsLyoqJyxcbiAgICAgICcqKi8ud29ya2Zsb3ctZGF0YS8qKicsXG4gICAgICAnKiovLndvcmtmbG93LXZpdGVzdC8qKicsXG4gICAgICAnKiovLndlbGwta25vd24vd29ya2Zsb3cvKionLFxuICAgICAgJyoqLy5zd2MvKionLFxuICAgICAgJyoqLy5zdmVsdGUta2l0LyoqJyxcbiAgICAgICcqKi8udHVyYm8vKionLFxuICAgICAgJyoqLy5jYWNoZS8qKicsXG4gICAgICAnKiovLnlhcm4vKionLFxuICAgICAgJyoqLy5wbnBtLXN0b3JlLyoqJyxcbiAgICBdO1xuXG4gICAgLy8gVXNlIHJlbGF0aXZlIHBhdHRlcm5zIHdpdGggYGN3ZGAgcGVyIGRpcmVjdG9yeSBzbyB0aGF0IGBkb3Q6IHRydWVgXG4gICAgLy8gYXBwbGllcyBjb25zaXN0ZW50bHkgdG8gYm90aCB0aGUgc2VhcmNoIHBhdHRlcm4gKmFuZCogdGhlIGlnbm9yZVxuICAgIC8vIHBhdHRlcm5zLiBXaGVuIGFic29sdXRlIHBhdHRlcm5zIGFyZSB1c2VkIHdpdGggdGlueWdsb2JieSwgdGhlIGAqKmBcbiAgICAvLyBpbiBpZ25vcmUgcGF0dGVybnMgZG9lcyBub3QgbWF0Y2ggZG90LXByZWZpeGVkIHBhdGggc2VnbWVudHMuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdGhpcy5jb25maWcuZGlycy5tYXAoKGRpcikgPT4ge1xuICAgICAgICBjb25zdCBjd2QgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGRpcik7XG4gICAgICAgIHJldHVybiBnbG9iKFsnKiovKi57dHMsdHN4LG10cyxjdHMsanMsanN4LG1qcyxjanN9J10sIHtcbiAgICAgICAgICBjd2QsXG4gICAgICAgICAgaWdub3JlLFxuICAgICAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FjaGVzIGRpc2NvdmVyZWQgd29ya2Zsb3cgZW50cmllcyBieSBpbnB1dCBhcnJheSByZWZlcmVuY2UuXG4gICAqIFVzZXMgV2Vha01hcCB0byBhbGxvdyBnYXJiYWdlIGNvbGxlY3Rpb24gd2hlbiBpbnB1dCBhcnJheXMgYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkLlxuICAgKiBUaGlzIGNhY2hlIGlzIGludmFsaWRhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaW5wdXRzIGFycmF5IHJlZmVyZW5jZSBjaGFuZ2VzXG4gICAqIChlLmcuLCB3aGVuIGZpbGVzIGFyZSBhZGRlZC9yZW1vdmVkIGR1cmluZyB3YXRjaCBtb2RlKS5cbiAgICovXG4gIHByaXZhdGUgZGlzY292ZXJlZEVudHJpZXM6IFdlYWtNYXA8c3RyaW5nW10sIERpc2NvdmVyZWRFbnRyaWVzPiA9XG4gICAgbmV3IFdlYWtNYXAoKTtcblxuICBwdWJsaWMgY2xlYXJEaXNjb3ZlcmVkRW50cmllc0NhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY292ZXJlZEVudHJpZXMgPSBuZXcgV2Vha01hcCgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTWFuaWZlc3RUcmFuc2Zvcm1DYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmlmZXN0VHJhbnNmb3JtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQc2V1ZG8tcGFja2FnZXMgdGhhdCBzaG91bGQgbm90IGJlIGNoZWNrZWQgZm9yIHdvcmtmbG93IHBhdHRlcm5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUFNFVURPX1BBQ0tBR0VTID0gbmV3IFNldChbXG4gICAgJ3NlcnZlci1vbmx5JyxcbiAgICAnY2xpZW50LW9ubHknLFxuICBdKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGVhY2ggcGFja2FnZSBpbiBleHRlcm5hbFBhY2thZ2VzIGZvciB3b3JrZmxvdyBwYXR0ZXJucyBhbmQgZW1pdHNcbiAgICogd2FybmluZ3MgaWYgYW55IGNvbnRhaW4gXCJ1c2Ugc3RlcFwiLCBcInVzZSB3b3JrZmxvd1wiIGRpcmVjdGl2ZXMsIG9yXG4gICAqIHNlcmlhbGl6YXRpb24gY2xhc3Nlcy4gVGhlc2UgcGF0dGVybnMgd2lsbCBub3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlXG4gICAqIHdvcmtmbG93IGNvbXBpbGVyIHdoZW4gdGhlIHBhY2thZ2UgaXMgZXh0ZXJuYWxpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YXJuQWJvdXRFeHRlcm5hbFdvcmtmbG93UGFja2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXh0ZXJuYWxQYWNrYWdlcyA9IHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXM7XG4gICAgaWYgKCFleHRlcm5hbFBhY2thZ2VzPy5sZW5ndGgpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIGV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgIGlmIChCYXNlQnVpbGRlci5QU0VVRE9fUEFDS0FHRVMuaGFzKHBrZykpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMud2FybmVkRXh0ZXJuYWxQYWNrYWdlcy5oYXMocGtnKSkgY29udGludWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGtnLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgICAgICBwa2cuc3RhcnRzV2l0aCgnLycpIHx8XG4gICAgICAgIHBrZy5zdGFydHNXaXRoKCckJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCcqJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCc6JylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgcGFja2FnZS5qc29uIGRlcGVuZGVuY2llcyBmb3IgQHdvcmtmbG93L3NlcmRlIChmYXN0IHBhdGgpXG4gICAgICAgIGxldCBoYXNXb3JrZmxvd1NlcmRlRGVwID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS9wYWNrYWdlLmpzb25gLCB7XG4gICAgICAgICAgICBwYXRoczogW3RoaXMuY29uZmlnLndvcmtpbmdEaXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwa2dKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgY29uc3QgcGtnSnNvbiA9IEpTT04ucGFyc2UocGtnSnNvblNvdXJjZSkgYXMge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICAgIHBlZXJEZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID1cbiAgICAgICAgICAgIHR5cGVvZiBwa2dKc29uLmRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHBrZ0pzb24uZGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgICAgPyAocGtnSnNvbi5kZXBlbmRlbmNpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICB0eXBlb2YgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLnBlZXJEZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAgID8gKHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICBoYXNXb3JrZmxvd1NlcmRlRGVwID1cbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24oZGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJykgfHxcbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBwYWNrYWdlLmpzb24gbm90IHJlc29sdmFibGUgLSBjb250aW51ZSB0byBzb3VyY2UgY2hlY2tcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHNvdXJjZSBwYXR0ZXJucyAodGhvcm91Z2ggcGF0aCkuXG4gICAgICAgIC8vIE5vdGU6IHJlcXVpcmUucmVzb2x2ZSBvbmx5IGluc3BlY3RzIHRoZSBwYWNrYWdlJ3MgbWFpbiBlbnRyeSBwb2ludC5cbiAgICAgICAgLy8gSWYgd29ya2Zsb3cgY29uc3RydWN0cyBsaXZlIGluIHN1Yi1wYXRocyAoZS5nLiBgbXktcGtnL3dvcmtmbG93c2ApLFxuICAgICAgICAvLyB0aGV5IHdvbid0IGJlIGRldGVjdGVkIGhlcmUuIFRoZSBAd29ya2Zsb3cvc2VyZGUgZGVwIGNoZWNrIGFib3ZlXG4gICAgICAgIC8vIHBhcnRpYWxseSBjb3ZlcnMgc2VyZGUgY2FzZXMuIFRoaXMgaXMgYWNjZXB0YWJsZSBhcyBhIGJlc3QtZWZmb3J0XG4gICAgICAgIC8vIGhldXJpc3RpYzsgdGhlIHByaW1hcnkgZml4IGlzIGF1dG8tcmVtb3ZhbCBpbiB3aXRoV29ya2Zsb3coKS5cbiAgICAgICAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc1VzZVdvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBrZywge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgICAgICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgICAgICAgaWYgKCFoYXNTZXJkZSkge1xuICAgICAgICAgICAgaGFzU2VyZGUgPSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEVudHJ5IGZpbGUgbm90IHJlc29sdmFibGUgb3Igbm90IHJlYWRhYmxlIC0gdXNlIHdoYXQgd2UgaGF2ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNVc2VTdGVwICYmICFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzU2VyZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2Ygd2hhdCB3YXMgZm91bmRcbiAgICAgICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoaGFzVXNlV29ya2Zsb3cpIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICAgICAgICBpZiAoaGFzVXNlU3RlcCkgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgICAgICAgaWYgKGhhc1NlcmRlKSBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG5cbiAgICAgICAgdGhpcy53YXJuZWRFeHRlcm5hbFBhY2thZ2VzLmFkZChwa2cpO1xuXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgXFxuJHtjaGFsay55ZWxsb3coJ+KaoCcpfSBXYXJuaW5nOiAke2NoYWxrLmJvbGQoYFwiJHtwa2d9XCJgKX0gaXMgbGlzdGVkIGluICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIGJ1dCBjb250YWlucyB3b3JrZmxvdyBjb2RlICgke2lzc3Vlcy5qb2luKCcsICcpfSkuYCArXG4gICAgICAgICAgICBgXFxuICBUaGlzIGNvZGUgd2lsbCAke2NoYWxrLmJvbGQoJ25vdCcpfSBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgd29ya2Zsb3cgY29tcGlsZXIsIHdoaWNoIGNhbiBjYXVzZSBydW50aW1lIGZhaWx1cmVzLmAgK1xuICAgICAgICAgICAgYFxcbiAgUmVtb3ZlICR7Y2hhbGsuYm9sZChgXCIke3BrZ31cImApfSBmcm9tICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIHRvIGZpeCB0aGlzLlxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydDogaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgc2tpcCB0aGlzIHBhY2thZ2Ugc2lsZW50bHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGlzY292ZXJFbnRyaWVzKFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGlzY292ZXJlZEVudHJpZXM+IHtcbiAgICBjb25zdCBwcmV2aW91c1Jlc3VsdCA9IHRoaXMuZGlzY292ZXJlZEVudHJpZXMuZ2V0KGlucHV0cyk7XG5cbiAgICBpZiAocHJldmlvdXNSZXN1bHQpIHtcbiAgICAgIHJldHVybiBwcmV2aW91c1Jlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGU6IERpc2NvdmVyZWRFbnRyaWVzID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldCgpLFxuICAgICAgZGlzY292ZXJlZEZpbGVzOiBuZXcgU2V0KCksXG4gICAgfTtcblxuICAgIGNvbnN0IGRpc2NvdmVyU3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgU0RLIHJ1bnRpbWUgc2VyZGUgZW50cnkgcG9pbnQgc28gdGhhdCB0aGUgZGlzY292ZXJ5IHBhc3NcbiAgICAvLyBkaXNjb3ZlcnMgY2xhc3NlcyBsaWtlIGBSdW5gIHRoYXQgbGl2ZSBpbnNpZGUgU0RLIHBhY2thZ2VzLiBXaXRob3V0IHRoaXMsXG4gICAgLy8gZmlsZXMgbGlrZSBgcnVuLmpzYCBhcmUgb25seSBkaXNjb3ZlcmVkIHdoZW4gdXNlciBjb2RlIGltcG9ydHMgdGhlbS5cbiAgICAvLyBUaGlzIGlzIHJlc29sdmVkIGhlcmUgKHJhdGhlciB0aGFuIGluIGNhbGxlcnMpIHNvIHRoYXQgdGhlIG9yaWdpbmFsXG4gICAgLy8gYGlucHV0c2AgYXJyYXkgcmVmZXJlbmNlIGlzIHByZXNlcnZlZCBmb3IgV2Vha01hcCBjYWNoaW5nOiBjYWxsZXJzXG4gICAgLy8gbGlrZSBjcmVhdGVXb3JrZmxvd3NCdW5kbGUgYW5kIGNyZWF0ZVN0ZXBzQnVuZGxlIGNhbiBzaGFyZSB0aGUgc2FtZVxuICAgIC8vIGNhY2hlIGVudHJ5IHdoZW4gdGhleSBwYXNzIHRoZSBzYW1lIGlucHV0RmlsZXMgYXJyYXkuXG4gICAgY29uc3QgcmVzb2x2ZWRXb3JrZmxvd1J1bnRpbWUgPSBhd2FpdCBlbmhhbmNlZFJlc29sdmUoXG4gICAgICBvdXRkaXIsXG4gICAgICAnQHdvcmtmbG93L2NvcmUvcnVudGltZS9ydW4nXG4gICAgKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGVudHJ5UG9pbnRzID0gcmVzb2x2ZWRXb3JrZmxvd1J1bnRpbWVcbiAgICAgID8gWy4uLmlucHV0cywgcmVzb2x2ZWRXb3JrZmxvd1J1bnRpbWVdXG4gICAgICA6IGlucHV0cztcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVRzY29uZmlnUGF0aCA9XG4gICAgICB0c2NvbmZpZ1BhdGggPz8gKGF3YWl0IHRoaXMuZmluZFRzQ29uZmlnUGF0aCgpKTtcblxuICAgIGF3YWl0IGZhc3REaXNjb3ZlckVudHJpZXMoe1xuICAgICAgZW50cnlQb2ludHMsXG4gICAgICBzdGF0ZSxcbiAgICAgIGRlZmF1bHRUc2NvbmZpZ1BhdGg6IGVmZmVjdGl2ZVRzY29uZmlnUGF0aCxcbiAgICAgIHdvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICBkaXNjb3ZlcldvcmtmbG93c0luTm9kZU1vZHVsZXM6XG4gICAgICAgIHRoaXMucmVzb2x2ZURpc2NvdmVyV29ya2Zsb3dzSW5Ob2RlTW9kdWxlcygpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICBgRGlzY292ZXJpbmcgd29ya2Zsb3cgZGlyZWN0aXZlc2AsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gZGlzY292ZXJTdGFydH1tc2BcbiAgICApO1xuXG4gICAgLy8gV2FybiBhYm91dCBleHRlcm5hbCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gd29ya2Zsb3cgY29kZVxuICAgIGF3YWl0IHRoaXMud2FybkFib3V0RXh0ZXJuYWxXb3JrZmxvd1BhY2thZ2VzKCk7XG5cbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzLnNldChpbnB1dHMsIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGdlbmVyYXRlZCB3cml0ZSBtYXkgYmUgc2tpcHBlZCB3aGVuIGl0IHdvdWxkIG5vdCBjaGFuZ2UgdGhlXG4gICAqIGZpbGUuIERlZmF1bHRzIHRvIGB0cnVlYDogdGhlIGdlbmVyYXRlZCByb3V0ZXMgbGl2ZSBpbnNpZGUgdGhlIGRpcmVjdG9yeVxuICAgKiB0aGUgZGV2IHNlcnZlciB3YXRjaGVzLCBzbyByZXdyaXRpbmcgaWRlbnRpY2FsIGJ5dGVzIHN0aWxsIGludmFsaWRhdGVzIGl0c1xuICAgKiB3YXRjaGVyIGFuZCBmb3JjZXMgYSByZWNvbXBpbGUgb2YgZXZlcnl0aGluZyBkb3duc3RyZWFtLlxuICAgKlxuICAgKiBUYXJnZXRzIHdob3NlIGNvbnN1bWVycyB0cmVhdCB0aGUgbXRpbWUgb2YgYSBnZW5lcmF0ZWQgZmlsZSBhcyBhIGNoYW5nZVxuICAgKiBzaWduYWwgbXVzdCBvdmVycmlkZSB0aGlzIHRvIGBmYWxzZWAsIG90aGVyd2lzZSBza2lwcGluZyB0aGUgd3JpdGUgYWxzb1xuICAgKiBzdXBwcmVzc2VzIHRoZSBzaWduYWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNraXBzVW5jaGFuZ2VkR2VuZXJhdGVkV3JpdGVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBnZW5lcmF0ZWQgZmlsZXMgYXRvbWljYWxseSB3aGVyZSBwb3NzaWJsZS4gT24gV2luZG93cywgTmV4dC5qcyBjYW5cbiAgICogYnJpZWZseSBob2xkIGdlbmVyYXRlZCByb3V0ZSBmaWxlcyBvcGVuIHdoaWxlIGNvbXBpbGluZyB0aGVtLCB3aGljaCBtYWtlc1xuICAgKiByZW5hbWUtb3Zlci1leGlzdGluZyBmYWlsIHdpdGggRVBFUk0vRUFDQ0VTLiBJbiB0aGF0IGNhc2UsIGZhbGwgYmFjayB0byBhXG4gICAqIGRpcmVjdCBvdmVyd3JpdGUgc28gd2F0Y2ggcmVidWlsZHMgY2FuIHN0aWxsIG1ha2UgcHJvZ3Jlc3MuXG4gICAqXG4gICAqIFNraXBzIHdyaXRlcyB0aGF0IHdvdWxkIG5vdCBjaGFuZ2UgdGhlIGZpbGUsIHVubGVzcyB0aGUgdGFyZ2V0IG9wdHMgb3V0XG4gICAqIHZpYSB7QGxpbmsgc2tpcHNVbmNoYW5nZWRHZW5lcmF0ZWRXcml0ZXN9LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHdyaXRlR2VuZXJhdGVkRmlsZShcbiAgICB0YXJnZXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2tpcHNVbmNoYW5nZWRHZW5lcmF0ZWRXcml0ZXMgJiZcbiAgICAgIChhd2FpdCBoYXNTYW1lQ29udGVudCh0YXJnZXRQYXRoLCBjb250ZW50KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wUGF0aCA9IGAke3RhcmdldFBhdGh9LiR7cmFuZG9tVVVJRCgpfS50bXBgO1xuICAgIGF3YWl0IHdyaXRlRmlsZSh0ZW1wUGF0aCwgY29udGVudCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlbmFtZSh0ZW1wUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yQ29kZSA9XG4gICAgICAgIGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ2NvZGUnIGluIGVycm9yXG4gICAgICAgICAgPyAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiZcbiAgICAgICAgKGVycm9yQ29kZSA9PT0gJ0VQRVJNJyB8fCBlcnJvckNvZGUgPT09ICdFQUNDRVMnKVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRQYXRoLCBjb250ZW50KTtcbiAgICAgICAgYXdhaXQgcm0odGVtcFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZGVidWcgaW5mb3JtYXRpb24gdG8gYSBKU09OIGZpbGUgZm9yIHRyb3VibGVzaG9vdGluZyBidWlsZCBpc3N1ZXMuXG4gICAqIFVzZXMgYXRvbWljIHdyaXRlICh0ZW1wIGZpbGUgKyByZW5hbWUpIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdoZW5cbiAgICogbXVsdGlwbGUgYnVpbGRzIHJ1biBjb25jdXJyZW50bHkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdyaXRlRGVidWdGaWxlKFxuICAgIG91dGZpbGU6IHN0cmluZyxcbiAgICBkZWJ1Z0RhdGE6IG9iamVjdCxcbiAgICBtZXJnZT86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gdGhpcy5jb25maWcuZGVidWdGaWxlUHJlZml4IHx8ICcnO1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBgJHtkaXJuYW1lKG91dGZpbGUpfS8ke3ByZWZpeH0ke2Jhc2VuYW1lKG91dGZpbGUpfS5kZWJ1Zy5qc29uYDtcbiAgICBsZXQgZXhpc3RpbmcgPSB7fTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUodGFyZ2V0UGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICBleGlzdGluZyA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QgeWV0IG9yIGlzIGNvcnJ1cHRlZCAtIHN0YXJ0IGZyZXNoLlxuICAgICAgICAgIC8vIERvbid0IGxvZyBlcnJvciBmb3IgRU5PRU5UIChmaWxlIG5vdCBmb3VuZCkgYXMgdGhhdCdzIGV4cGVjdGVkIG9uIGZpcnN0IHJ1bi5cbiAgICAgICAgICBpZiAoKGUgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciByZWFkaW5nIGRlYnVnIGZpbGUsIHN0YXJ0aW5nIGZyZXNoOicsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXJnZWREYXRhID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5leGlzdGluZyxcbiAgICAgICAgICAuLi5kZWJ1Z0RhdGEsXG4gICAgICAgIH0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIDJcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKHRhcmdldFBhdGgsIG1lcmdlZERhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byB3cml0ZSBkZWJ1ZyBmaWxlOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhbmQgb3B0aW9uYWxseSB0aHJvd3Mgb24gZXNidWlsZCBlcnJvcnMgYW5kIHdhcm5pbmdzLlxuICAgKiBAcGFyYW0gdGhyb3dPbkVycm9yIC0gSWYgdHJ1ZSwgdGhyb3dzIGFuIGVycm9yIHdoZW4gZXNidWlsZCBlcnJvcnMgYXJlIHByZXNlbnRcbiAgICovXG4gIHByaXZhdGUgbG9nRXNidWlsZE1lc3NhZ2VzKFxuICAgIHJlc3VsdDogeyBlcnJvcnM/OiBhbnlbXTsgd2FybmluZ3M/OiBhbnlbXSB9LFxuICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgdGhyb3dPbkVycm9yID0gdHJ1ZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgc3VwcHJlc3NXYXJuaW5ncz86IGJvb2xlYW47XG4gICAgfVxuICApOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0LmVycm9ycyAmJiByZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYOKdjCBlc2J1aWxkIGVycm9ycyBpbiAke3BoYXNlfTpgKTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIHJlc3VsdC5lcnJvcnMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAke2Vycm9yLnRleHR9YCk7XG4gICAgICAgIGVycm9yTWVzc2FnZXMucHVzaChlcnJvci50ZXh0KTtcbiAgICAgICAgaWYgKGVycm9yLmxvY2F0aW9uKSB7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgICAgIGF0ICR7ZXJyb3IubG9jYXRpb24uZmlsZX06JHtlcnJvci5sb2NhdGlvbi5saW5lfToke2Vycm9yLmxvY2F0aW9uLmNvbHVtbn1gO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IobG9jYXRpb24pO1xuICAgICAgICAgIGVycm9yTWVzc2FnZXMucHVzaChsb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRocm93T25FcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICAgIGBCdWlsZCBmYWlsZWQgZHVyaW5nICR7cGhhc2V9OlxcbiR7ZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhpbnQ6IGBSZXZpZXcgdGhlIGVzYnVpbGQgZXJyb3JzIGFib3ZlIOKAlCB0aGV5IGNvbWUgZnJvbSB0aGUgJHtwaGFzZX0gYnVuZGxlLiBGaXggdGhlIG9mZmVuZGluZyBzb3VyY2UgZmlsZXMgYW5kIHJlLXJ1biB0aGUgYnVpbGQuYCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIW9wdGlvbnM/LnN1cHByZXNzV2FybmluZ3MgJiZcbiAgICAgIHJlc3VsdC53YXJuaW5ncyAmJlxuICAgICAgcmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihgISAgZXNidWlsZCB3YXJuaW5ncyBpbiAke3BoYXNlfTpgKTtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiByZXN1bHQud2FybmluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7d2FybmluZy50ZXh0fWApO1xuICAgICAgICBpZiAod2FybmluZy5sb2NhdGlvbikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGAgICAgYXQgJHt3YXJuaW5nLmxvY2F0aW9uLmZpbGV9OiR7d2FybmluZy5sb2NhdGlvbi5saW5lfToke3dhcm5pbmcubG9jYXRpb24uY29sdW1ufWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFic29sdXRlIGZpbGUgcGF0aCB0byBhIG5vcm1hbGl6ZWQgcmVsYXRpdmUgcGF0aCBmb3IgdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZWxhdGl2ZUZpbGVwYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGFic29sdXRlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFdvcmtpbmdEaXIgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUobm9ybWFsaXplZFdvcmtpbmdEaXIsIG5vcm1hbGl6ZWRGaWxlKS5yZXBsYWNlKFxuICAgICAgL1xcXFwvZyxcbiAgICAgICcvJ1xuICAgICk7XG4gICAgLy8gSGFuZGxlIGZpbGVzIGRpc2NvdmVyZWQgb3V0c2lkZSB0aGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGhcbiAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gJy4uJylcbiAgICAgICAgLmpvaW4oJy8nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2FjaGVkTWFuaWZlc3RUcmFuc2Zvcm0oXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIG1vZGU6ICd3b3JrZmxvdycgfCAnc3RlcCdcbiAgKTogUHJvbWlzZTx7IG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0OyBjb250ZW50SGFzaDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQoZmlsZSk7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHttb2RlfToke2ZpbGV9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLm1hbmlmZXN0VHJhbnNmb3JtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoXG4gICAgICBjYWNoZWQgJiZcbiAgICAgIGNhY2hlZC5zaXplID09PSBzdGF0cy5zaXplICYmXG4gICAgICBjYWNoZWQubXRpbWVNcyA9PT0gc3RhdHMubXRpbWVNc1xuICAgICkge1xuICAgICAgcmV0dXJuIHsgbWFuaWZlc3Q6IGNhY2hlZC5tYW5pZmVzdCwgY29udGVudEhhc2g6IGNhY2hlZC5jb250ZW50SGFzaCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG4gICAgY29uc3QgcmVsYXRpdmVGaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVGaWxlcGF0aChmaWxlKTtcbiAgICBjb25zdCB7IHdvcmtmbG93TWFuaWZlc3QgfSA9IGF3YWl0IGFwcGx5U3djVHJhbnNmb3JtKFxuICAgICAgcmVsYXRpdmVGaWxlcGF0aCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIG1vZGUsXG4gICAgICBmaWxlLFxuICAgICAgdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICk7XG4gICAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoTWFuaWZlc3RTb3VyY2Uoc291cmNlKTtcbiAgICB0aGlzLm1hbmlmZXN0VHJhbnNmb3JtQ2FjaGUuc2V0KGNhY2hlS2V5LCB7XG4gICAgICBzaXplOiBzdGF0cy5zaXplLFxuICAgICAgbXRpbWVNczogc3RhdHMubXRpbWVNcyxcbiAgICAgIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0LFxuICAgICAgY29udGVudEhhc2gsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsIGNvbnRlbnRIYXNoIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXIoZmlsZTogc3RyaW5nLCByb3V0ZURpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgIGZpbGUsXG4gICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgKTtcbiAgICBpZiAoaXNQYWNrYWdlKSB7XG4gICAgICByZXR1cm4gaW1wb3J0UGF0aDtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUocm91dGVEaXIsIGZpbGUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlU3RlcFNvdXJjZVJlZ2lzdHJhdGlvbkZpbGUoe1xuICAgIGlucHV0RmlsZXMsXG4gICAgb3V0ZmlsZSxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gIH06IHtcbiAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzPzogRGlzY292ZXJlZEVudHJpZXM7XG4gIH0pOiBQcm9taXNlPFdvcmtmbG93TWFuaWZlc3Q+IHtcbiAgICBjb25zdCBzdGVwc0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgYnVpbHRJblN0ZXBzID0gJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJztcbiAgICBjb25zdCByZXNvbHZlZEJ1aWx0SW5TdGVwcyA9IChhd2FpdCBlbmhhbmNlZFJlc29sdmUoXG4gICAgICBkaXJuYW1lKG91dGZpbGUpLFxuICAgICAgYnVpbHRJblN0ZXBzXG4gICAgKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlc29sdmUgYnVpbHQtaW4gc3RlcHMgc291cmNlcy5cXG5cXG5DYXVzZWQgYnk6ICR7U3RyaW5nKGVycil9YCxcbiAgICAgICAge1xuICAgICAgICAgIGhpbnQ6ICdydW4gYHBucG0gaW5zdGFsbCB3b3JrZmxvd2AgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLicsXG4gICAgICAgICAgY2F1c2U6IGVycixcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KSkgYXMgc3RyaW5nO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHN0ZXBGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwc10uc29ydCgpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG4gICAgY29uc3Qgc3RlcEZpbGVzU2V0ID0gbmV3IFNldChzdGVwRmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICFzdGVwRmlsZXNTZXQuaGFzKGYpKTtcblxuICAgIGF3YWl0IHRoaXMud3JpdGVEZWJ1Z0ZpbGUob3V0ZmlsZSwge1xuICAgICAgc3RlcEZpbGVzLFxuICAgICAgd29ya2Zsb3dGaWxlcyxcbiAgICAgIHNlcmRlT25seUZpbGVzLFxuICAgICAgc291cmNlSW1wb3J0czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KFtidWlsdEluU3RlcHNdKTtcbiAgICBjb25zdCBpbXBvcnRTdGF0ZW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJvdXRlRGlyID0gZGlybmFtZShvdXRmaWxlKTtcbiAgICBjb25zdCBhZGRSZWdpc3RyYXRpb25JbXBvcnQgPSAoc3BlY2lmaWVyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGltcG9ydFN0YXRlbWVudHMucHVzaChgaW1wb3J0ICR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX07YCk7XG4gICAgfTtcbiAgICBjb25zdCBhZGRSZWdpc3RyYXRpb25GaWxlSW1wb3J0ID0gKGZpbGU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSBtb2R1bGVJZGVudGl0eUtleShmaWxlLCB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3QpO1xuICAgICAgaWYgKGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmhhcyhpZGVudGl0eSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZW1pdHRlZEltcG9ydElkZW50aXRpZXMuYWRkKGlkZW50aXR5KTtcbiAgICAgIGFkZFJlZ2lzdHJhdGlvbkltcG9ydCh0aGlzLmNyZWF0ZVJvdXRlSW1wb3J0U3BlY2lmaWVyKGZpbGUsIHJvdXRlRGlyKSk7XG4gICAgfTtcblxuICAgIGFkZFJlZ2lzdHJhdGlvbkltcG9ydChidWlsdEluU3RlcHMpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBzdGVwRmlsZXMpIHtcbiAgICAgIGFkZFJlZ2lzdHJhdGlvbkZpbGVJbXBvcnQoZmlsZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBzZXJkZU9ubHlGaWxlcykge1xuICAgICAgYWRkUmVnaXN0cmF0aW9uRmlsZUltcG9ydChmaWxlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXQgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbiR7aW1wb3J0U3RhdGVtZW50cy5qb2luKCdcXG4nKX1cblxuZXhwb3J0IGNvbnN0IF9fc3RlcHNfcmVnaXN0ZXJlZCA9IHRydWU7XG5gO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUob3V0ZmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKG91dGZpbGUsIG91dHB1dCk7XG5cbiAgICBjb25zdCBtYW5pZmVzdEZpbGVzID0gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoWy4uLnN0ZXBGaWxlcywgLi4uc2VyZGVPbmx5RmlsZXMsIHJlc29sdmVkQnVpbHRJblN0ZXBzXSlcbiAgICApLnNvcnQoKTtcbiAgICBjb25zdCBzdGVwSWRzID0gbmV3IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4oKTtcbiAgICBjb25zdCB3b3JrZmxvd0lkcyA9IG5ldyBNYXA8c3RyaW5nLCBNYW5pZmVzdEVudHJ5TG9jYXRpb24+KCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYW5pZmVzdEZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB7IG1hbmlmZXN0OiBmaWxlTWFuaWZlc3QsIGNvbnRlbnRIYXNoIH0gPVxuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Q2FjaGVkTWFuaWZlc3RUcmFuc2Zvcm0oZmlsZSwgJ3N0ZXAnKTtcbiAgICAgICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgZmlsZU1hbmlmZXN0LFxuICAgICAgICAgIHN0ZXBJZHMsXG4gICAgICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICAgICAgY29udGVudEhhc2hcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3djSWdub3JlZCgpO1xuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgJ0NyZWF0ZWQgc3RlcCByZWdpc3RyYXRpb25zJyxcbiAgICAgIGAke0RhdGUubm93KCkgLSBzdGVwc0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gICAgcmV0dXJuIHdvcmtmbG93TWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1bmRsZSBmb3Igd29ya2Zsb3cgc3RlcCBmdW5jdGlvbnMuXG4gICAqIFN0ZXBzIGhhdmUgZnVsbCBOb2RlLmpzIHJ1bnRpbWUgYWNjZXNzIGFuZCBoYW5kbGUgc2lkZSBlZmZlY3RzLCBBUEkgY2FsbHMsIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIGV4dGVybmFsaXplTm9uU3RlcHMgLSBJZiB0cnVlLCBvbmx5IGJ1bmRsZXMgc3RlcCBlbnRyeSBwb2ludHMgYW5kIGV4dGVybmFsaXplcyBvdGhlciBjb2RlXG4gICAqIEBwYXJhbSBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyAtIElmIHRydWUsIGVtaXRzIGEgc291cmNlIGltcG9ydCByZWdpc3RyYXRpb24gZmlsZSBpbnN0ZWFkIG9mIGJ1bmRsaW5nIHN0ZXAgcmVnaXN0cmF0aW9uc1xuICAgKiBAcGFyYW0gYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyAtIElmIHRydWUsIGFsc28gYnVuZGxlcyBwcm9qZWN0LWxvY2FsIGZpbGVzIGltcG9ydGVkIGJ5IHN0ZXAgZW50cmllcyBmb3IgZGlyZWN0IHJ1bnRpbWUgbG9hZGluZ1xuICAgKiBAcmV0dXJucyBCdWlsZCBjb250ZXh0IChmb3Igd2F0Y2ggbW9kZSkgYW5kIHRoZSBjb2xsZWN0ZWQgd29ya2Zsb3cgbWFuaWZlc3RcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVTdGVwc0J1bmRsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRmaWxlLFxuICAgIGV4dGVybmFsaXplTm9uU3RlcHMsXG4gICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyxcbiAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyxcbiAgICByZXdyaXRlVHNFeHRlbnNpb25zLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICBza2lwRXNtUmVxdWlyZUJhbm5lciA9IGZhbHNlLFxuICB9OiB7XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBmb3JtYXQ/OiAnY2pzJyB8ICdlc20nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzPzogYm9vbGVhbjtcbiAgICByZXdyaXRlVHNFeHRlbnNpb25zPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgc2tpcCB0aGUgYGNyZWF0ZVJlcXVpcmVgIGJhbm5lciBvbiB0aGUgc3RlcHMgYnVuZGxlLlxuICAgICAqIFVzZWQgYnkgYGNyZWF0ZUNvbWJpbmVkQnVuZGxlYCB3aXRoIGBidW5kbGVGaW5hbE91dHB1dDogdHJ1ZWAgd2hlcmVcbiAgICAgKiB0aGUgb3V0ZXIgZXNidWlsZCBwYXNzIHByb3ZpZGVzIGl0cyBvd24gYmFubmVyLCBwcmV2ZW50aW5nIHRoZVxuICAgICAqIGBfX2NyZWF0ZVJlcXVpcmVgIGlkZW50aWZpZXIgZnJvbSBiZWluZyBkZWNsYXJlZCB0d2ljZSBhZnRlciBpbmxpbmluZy5cbiAgICAgKi9cbiAgICBza2lwRXNtUmVxdWlyZUJhbm5lcj86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICBjb250ZXh0OiBlc2J1aWxkLkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfT4ge1xuICAgIGNvbnN0IHN0ZXBzQnVuZGxlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtmbG93TWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBidWlsdEluU3RlcHMgPSAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRCdWlsdEluU3RlcHMgPSBhd2FpdCBlbmhhbmNlZFJlc29sdmUoXG4gICAgICBkaXJuYW1lKG91dGZpbGUpLFxuICAgICAgJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJ1xuICAgICkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93QnVpbGRFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIGJ1aWx0LWluIHN0ZXBzIHNvdXJjZXMuXFxuXFxuQ2F1c2VkIGJ5OiAke1N0cmluZyhlcnIpfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAncnVuIGBwbnBtIGluc3RhbGwgd29ya2Zsb3dgIHRvIHJlc29sdmUgdGhpcyBpc3N1ZS4nLFxuICAgICAgICAgIGNhdXNlOiBlcnIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBEaXNjb3Zlcnkgb2Ygd29ya2Zsb3cvc3RlcC9zZXJkZSBlbnRyaWVzLiBUaGUgU0RLIHJ1bnRpbWUgZW50cnkgcG9pbnRcbiAgICAvLyAod29ya2Zsb3cvcnVudGltZSkgaXMgcmVzb2x2ZWQgaW5zaWRlIGRpc2NvdmVyRW50cmllcygpIGl0c2VsZiBzbyB0aGF0XG4gICAgLy8gY2FsbGVycyBjYW4gcGFzcyB0aGUgb3JpZ2luYWwgaW5wdXRGaWxlcyByZWZlcmVuY2UgYW5kIGJlbmVmaXQgZnJvbVxuICAgIC8vIFdlYWtNYXAgY2FjaGluZyBhY3Jvc3MgY3JlYXRlV29ya2Zsb3dzQnVuZGxlIC8gY3JlYXRlU3RlcHNCdW5kbGUgY2FsbHMuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHN0ZXBGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwc10uc29ydCgpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGFscmVhZHkgc3RlcCBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHN0ZXAgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSB3b3JrZmxvd3MgYW5kIHNlcmlhbGl6ZWQgd2hlbiByZXR1cm5pbmcgZGF0YSB0byB3b3JrZmxvd3MuXG4gICAgY29uc3Qgc3RlcEZpbGVzU2V0ID0gbmV3IFNldChzdGVwRmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICFzdGVwRmlsZXNTZXQuaGFzKGYpKTtcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzICYmXG4gICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzICYmXG4gICAgICAhYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llc1xuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgICBtYW5pZmVzdDogYXdhaXQgdGhpcy5jcmVhdGVTdGVwU291cmNlUmVnaXN0cmF0aW9uRmlsZSh7XG4gICAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgICBvdXRmaWxlLFxuICAgICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllczogZGlzY292ZXJlZCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGxvZyB0aGUgc3RlcCBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgfSk7XG5cbiAgICAvLyBIZWxwZXIgdG8gY3JlYXRlIGltcG9ydCBzdGF0ZW1lbnQgZnJvbSBmaWxlIHBhdGhcbiAgICAvLyBGb3Igd29ya3NwYWNlL25vZGVfbW9kdWxlcyBwYWNrYWdlcywgdXNlcyB0aGUgcGFja2FnZSBuYW1lIHNvIGVzYnVpbGRcbiAgICAvLyB3aWxsIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlLmpzb24gZXhwb3J0cyB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25kaXRpb25zXG4gICAgY29uc3QgY3JlYXRlSW1wb3J0ID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFdvcmtzcGFjZVJvb3QgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya3NwYWNlRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gT25seSB1c2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGZvciB3b3Jrc3BhY2Ugc3ltbGlua3MgKGZpbGVzXG4gICAgICAvLyBvdXRzaWRlIG5vZGVfbW9kdWxlcyBpbiBhIHBhY2thZ2VzLyovc3JjLyBkaXJlY3RvcnkpLiBGb3IgdGFyYmFsbC1cbiAgICAgIC8vIGluc3RhbGxlZCBwYWNrYWdlcyAoZmlsZXMgaW5zaWRlIG5vZGVfbW9kdWxlcy8pLCBmYWxsIHRocm91Z2ggdG9cbiAgICAgIC8vIGdldEltcG9ydFBhdGggd2hpY2ggcmV0dXJucyBwYWNrYWdlIHNwZWNpZmllcnM7IHRoaXMgYWxsb3dzIHRoZVxuICAgICAgLy8gU1dDIHBsdWdpbidzIGV4dGVybmFsaXplTm9uU3RlcHMgdG8gd29yayBjb3JyZWN0bHkuXG4gICAgICBjb25zdCBpc1dvcmtzcGFjZVNvdXJjZUJhY2tlZFBhY2thZ2VGaWxlID1cbiAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKSAmJlxuICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZS5pbmNsdWRlcygnL3NyYy8nKSAmJlxuICAgICAgICAhbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgJiZcbiAgICAgICAgIShcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZSA9PT0gbm9ybWFsaXplZFdvcmtzcGFjZVJvb3QgfHxcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZS5zdGFydHNXaXRoKGAke25vcm1hbGl6ZWRXb3Jrc3BhY2VSb290fS9gKVxuICAgICAgICApO1xuICAgICAgY29uc3QgaXNTb3VyY2VCYWNrZWRQYWNrYWdlRmlsZSA9IGlzV29ya3NwYWNlU291cmNlQmFja2VkUGFja2FnZUZpbGU7XG5cbiAgICAgIGlmIChpc1NvdXJjZUJhY2tlZFBhY2thZ2VGaWxlKSB7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlUm9vdCxcbiAgICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZVxuICAgICAgICApLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICAgKTtcblxuICAgICAgaWYgKGlzUGFja2FnZSkge1xuICAgICAgICAvLyBVc2UgcGFja2FnZSBuYW1lIC0gZXNidWlsZCB3aWxsIHJlc29sdmUgdmlhIHBhY2thZ2UuanNvbiBleHBvcnRzXG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke2ltcG9ydFBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBwYXRocyB0byBmb3J3YXJkIHNsYXNoZXMgYmVmb3JlIGNhbGxpbmcgcmVsYXRpdmUoKVxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBvbiBXaW5kb3dzIHdoZXJlIHJlbGF0aXZlKCkgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGggbWl4ZWQgcGF0aCBmb3JtYXRzXG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGZpbGVcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vIHNvIGVzYnVpbGQgcmVzb2x2ZXMgdGhlbSBjb3JyZWN0bHkuXG4gICAgICAvLyBQYXRocyBsaWtlIFwiLm91dHB1dC8uLi5cIiBhcmUgbm90IHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYW5kIG11c3RcbiAgICAgIC8vIGJlY29tZSBcIi4vLm91dHB1dC8uLi5cIi5cbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgdmlydHVhbCBlbnRyeSB0aGF0IGltcG9ydHMgYWxsIGZpbGVzLiBBbGwgc3RlcCBkZWZpbml0aW9uc1xuICAgIC8vIHdpbGwgZ2V0IHJlZ2lzdGVyZWQgdGhhbmtzIHRvIHRoZSBzd2MgdHJhbnNmb3JtLlxuICAgIC8vXG4gICAgLy8gRGVkdXBlIGltcG9ydHMgYnkgY2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eSBzbyB3ZSBuZXZlciBlbWl0IHR3b1xuICAgIC8vIGltcG9ydCBsaW5lcyB0aGF0IHJlc29sdmUgdG8gdGhlIHNhbWUgcGh5c2ljYWwgbW9kdWxlLiBQcmUtc2VlZCB0aGVcbiAgICAvLyBzZXQgd2l0aCB0aGUgYnVpbHQtaW4gc3RlcHMgaW1wb3J0IHNvIGEgd29ya3NwYWNlIHN0ZXAgZmlsZSBhdFxuICAgIC8vIGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvaW50ZXJuYWwvYnVpbHRpbnMudHNgIGRvZXNuJ3QgZW1pdCBhIHNlY29uZCxcbiAgICAvLyByZWxhdGl2ZS1wYXRoIGNvbXBldGluZyBpbXBvcnQ7IGVzYnVpbGQgd291bGQgb3RoZXJ3aXNlIHRyYW5zZm9ybVxuICAgIC8vIGJvdGggY29waWVzIGFuZCB0aGUgc3djIHBsdWdpbiB3b3VsZCBnZW5lcmF0ZSBkdXBsaWNhdGUgc3RlcCBJRHMuXG4gICAgY29uc3QgZW1pdHRlZEltcG9ydElkZW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oW2J1aWx0SW5TdGVwc10pO1xuICAgIGNvbnN0IGJ1aWxkSW1wb3J0cyA9IChmaWxlczogc3RyaW5nW10pOiBzdHJpbmcgPT5cbiAgICAgIGZpbGVzXG4gICAgICAgIC5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IG1vZHVsZUlkZW50aXR5S2V5KGZpbGUsIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCk7XG4gICAgICAgICAgaWYgKGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmhhcyhpZGVudGl0eSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKGNyZWF0ZUltcG9ydClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3Qgc3RlcEltcG9ydHMgPSBidWlsZEltcG9ydHMoc3RlcEZpbGVzKTtcblxuICAgIC8vIEluY2x1ZGUgc2VyZGUtb25seSBmaWxlcyBmb3IgY2xhc3MgcmVnaXN0cmF0aW9uIHNpZGUgZWZmZWN0c1xuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyhzZXJkZU9ubHlGaWxlcyk7XG5cbiAgICBjb25zdCBlbnRyeUNvbnRlbnQgPSBgXG4gICAgLy8gQnVpbHQgaW4gc3RlcHNcbiAgICBpbXBvcnQgJyR7YnVpbHRJblN0ZXBzfSc7XG4gICAgLy8gVXNlciBzdGVwc1xuICAgICR7c3RlcEltcG9ydHN9XG4gICAgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXG4gICAgJHtzZXJkZUltcG9ydHN9XG4gICAgLy8gU2VudGluZWwgZXhwb3J0IHNvIGJ1bmRsZXJzIChyb2xsdXApIGRvbid0IHRyZWUtc2hha2UgdGhpcyBtb2R1bGVcbiAgICAvLyB3aGVuIGl0J3MgaW1wb3J0ZWQgYXMgYSBzaWRlLWVmZmVjdC1vbmx5IGRlcGVuZGVuY3kuXG4gICAgZXhwb3J0IGNvbnN0IF9fc3RlcHNfcmVnaXN0ZXJlZCA9IHRydWU7YDtcblxuICAgIC8vIEJ1bmRsZSB3aXRoIGVzYnVpbGQgYW5kIG91ciBjdXN0b20gU1dDIHBsdWdpblxuICAgIGNvbnN0IGVudHJpZXNUb0J1bmRsZSA9IGV4dGVybmFsaXplTm9uU3RlcHNcbiAgICAgID8gW1xuICAgICAgICAgIC4uLnN0ZXBGaWxlcyxcbiAgICAgICAgICAuLi5zZXJkZUZpbGVzLFxuICAgICAgICAgIC4uLihyZXNvbHZlZEJ1aWx0SW5TdGVwcyA/IFtyZXNvbHZlZEJ1aWx0SW5TdGVwc10gOiBbXSksXG4gICAgICAgIF1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzVG9CdW5kbGUgPSBlbnRyaWVzVG9CdW5kbGVcbiAgICAgID8gYXdhaXQgd2l0aFJlYWxwYXRocyhlbnRyaWVzVG9CdW5kbGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub3JtYWxpemVkU2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLnN0ZXBGaWxlcyxcbiAgICAgIC4uLnNlcmRlT25seUZpbGVzLFxuICAgICAgLi4uKHJlc29sdmVkQnVpbHRJblN0ZXBzID8gW3Jlc29sdmVkQnVpbHRJblN0ZXBzXSA6IFtdKSxcbiAgICBdKTtcbiAgICBjb25zdCBlc2J1aWxkVHNjb25maWdPcHRpb25zID1cbiAgICAgIGF3YWl0IGdldEVzYnVpbGRUc2NvbmZpZ09wdGlvbnModHNjb25maWdQYXRoKTtcbiAgICBjb25zdCB7IGJhbm5lcjogaW1wb3J0TWV0YUJhbm5lciwgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lIH0gPVxuICAgICAgdGhpcy5nZXRDanNJbXBvcnRNZXRhUG9seWZpbGwoZm9ybWF0KTtcbiAgICBjb25zdCBlc21SZXF1aXJlQmFubmVyID0gc2tpcEVzbVJlcXVpcmVCYW5uZXJcbiAgICAgID8gJydcbiAgICAgIDogdGhpcy5nZXRFc21SZXF1aXJlQmFubmVyKGZvcm1hdCk7XG5cbiAgICBjb25zdCBlc2J1aWxkQ3R4ID0gYXdhaXQgZXNidWlsZC5jb250ZXh0KHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7aW1wb3J0TWV0YUJhbm5lcn0ke2VzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogZW50cnlDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICBjb25kaXRpb25zOiBbJ25vZGUnXSxcbiAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGxvZ0xldmVsOiAnZXJyb3InLFxuICAgICAgLy8gVXNlIHRzY29uZmlnIGZvciBwYXRoIGFsaWFzIHJlc29sdXRpb24uXG4gICAgICAvLyBGb3Igc3ltbGlua2VkIGNvbmZpZ3MgdGhpcyB1c2VzIHRzY29uZmlnUmF3IHRvIHByZXNlcnZlIGN3ZC1yZWxhdGl2ZSBhbGlhc2VzLlxuICAgICAgLi4uZXNidWlsZFRzY29uZmlnT3B0aW9ucyxcbiAgICAgIGRlZmluZTogaW1wb3J0TWV0YURlZmluZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICAvLyBTb3VyY2UgbWFwcyBmb3IgYmV0dGVyIHN0YWNrIHRyYWNlcyBpbiBzdGVwIGV4ZWN1dGlvbi4gU3RlcHMgZXhlY3V0ZVxuICAgICAgLy8gaW4gTm9kZS5qcyBjb250ZXh0IGFuZCBpbmxpbmUgc291cmNlbWFwcyBnaXZlIG1lYW5pbmdmdWwgc3RhY2sgdHJhY2VzXG4gICAgICAvLyB3aXRoIHByb3BlciBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMgd2hlbiBlcnJvcnMgb2NjdXIgaW4gZGVlcGx5XG4gICAgICAvLyBuZXN0ZWQgZnVuY3Rpb24gY2FsbHMgYWNyb3NzIG11bHRpcGxlIGZpbGVzLiBEZWZhdWx0cyB0byBpbmxpbmUgaW5cbiAgICAgIC8vIGRldmVsb3BtZW50IGFuZCBvZmYgaW4gcHJvZHVjdGlvbiAoc2VlIGBkZWZhdWx0U291cmNlbWFwTW9kZWApIHRvIGtlZXBcbiAgICAgIC8vIHByb2R1Y3Rpb24gZnVuY3Rpb24gYnVuZGxlcyBzbWFsbDsgb3ZlcnJpZGUgd2l0aCB0aGUgYHNvdXJjZW1hcGBcbiAgICAgIC8vIGNvbmZpZyBvcHRpb24gb3IgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIuXG4gICAgICBzb3VyY2VtYXA6IHRoaXMucmVzb2x2ZVNvdXJjZW1hcCh0aGlzLmRlZmF1bHRTb3VyY2VtYXBNb2RlKSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgLy8gSGFuZGxlIHBzZXVkby1wYWNrYWdlcyBsaWtlICdzZXJ2ZXItb25seScgYW5kICdjbGllbnQtb25seScgYnkgcHJvdmlkaW5nXG4gICAgICAgIC8vIGVtcHR5IG1vZHVsZXMuIE11c3QgcnVuIGZpcnN0IHRvIGludGVyY2VwdCB0aGVzZSBiZWZvcmUgb3RoZXIgcmVzb2x1dGlvbi5cbiAgICAgICAgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbigpLFxuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IG5vcm1hbGl6ZWRFbnRyaWVzVG9CdW5kbGUsXG4gICAgICAgICAgb3V0ZGlyOiBvdXRmaWxlID8gZGlybmFtZShvdXRmaWxlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwcm9qZWN0Um9vdDogdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJSb290OiB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3QsXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBvbkFmdGVyVHJhbnNmb3JtOiB0aGlzLmNvbmZpZy5vbkFmdGVyVHJhbnNmb3JtLFxuICAgICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmV3cml0ZVRzRXh0ZW5zaW9ucyxcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogbm9ybWFsaXplZFNpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICAvLyBQbHVnaW4gc2hvdWxkIGNhdGNoIG1vc3QgdGhpbmdzLCBidXQgdGhpcyBsZXRzIHVzZXJzIGhhcmQgb3ZlcnJpZGVcbiAgICAgIC8vIGlmIHRoZSBwbHVnaW4gbWlzc2VzIGFueXRoaW5nIHRoYXQgc2hvdWxkIGJlIGV4dGVybmFsaXplZFxuICAgICAgZXh0ZXJuYWw6IFsnYnVuJywgJ2J1bjoqJywgLi4uKHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXMgfHwgW10pXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0ZXBzUmVzdWx0ID0gYXdhaXQgZXNidWlsZEN0eC5yZWJ1aWxkKCk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhzdGVwc1Jlc3VsdCwgJ3N0ZXBzIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgJ0NyZWF0ZWQgc3RlcHMgYnVuZGxlJyxcbiAgICAgIGAke0RhdGUubm93KCkgLSBzdGVwc0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgd29ya2Zsb3ctb25seSBmaWxlcyB0aGF0IG1heSBoYXZlIGJlZW4gdHJlZS1zaGFrZW4gZnJvbSB0aGUgYnVuZGxlLlxuICAgIC8vIFRoZXNlIGZpbGVzIGhhdmUgbm8gc3RlcHMsIHNvIGVzYnVpbGQgcmVtb3ZlcyB0aGVtLCBidXQgd2Ugc3RpbGwgbmVlZCB0aGVpclxuICAgIC8vIHdvcmtmbG93IG1ldGFkYXRhIGZvciB0aGUgbWFuaWZlc3QuIFRyYW5zZm9ybSB0aGVtIHNlcGFyYXRlbHkuXG4gICAgY29uc3Qgd29ya2Zsb3dPbmx5RmlsZXMgPSB3b3JrZmxvd0ZpbGVzLmZpbHRlcihcbiAgICAgIChmKSA9PiAhc3RlcEZpbGVzLmluY2x1ZGVzKGYpXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHdvcmtmbG93T25seUZpbGVzLm1hcChhc3luYyAod29ya2Zsb3dGaWxlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBtYW5pZmVzdDogZmlsZU1hbmlmZXN0IH0gPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRDYWNoZWRNYW5pZmVzdFRyYW5zZm9ybSh3b3JrZmxvd0ZpbGUsICd3b3JrZmxvdycpO1xuICAgICAgICAgIGlmIChmaWxlTWFuaWZlc3Qud29ya2Zsb3dzKSB7XG4gICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LndvcmtmbG93cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Qud29ya2Zsb3dzIHx8IHt9LFxuICAgICAgICAgICAgICBmaWxlTWFuaWZlc3Qud29ya2Zsb3dzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsZU1hbmlmZXN0LmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyB8fCB7fSxcbiAgICAgICAgICAgICAgZmlsZU1hbmlmZXN0LmNsYXNzZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGJ1dCBjb250aW51ZSAtIGRvbid0IGZhaWwgYnVpbGQgZm9yIHdvcmtmbG93LW9ubHkgZmlsZSBpc3N1ZXNcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgV2FybmluZzogRmFpbGVkIHRvIGV4dHJhY3Qgd29ya2Zsb3cgbWV0YWRhdGEgZnJvbSAke3dvcmtmbG93RmlsZX06YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3djSWdub3JlZCgpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICByZXR1cm4geyBjb250ZXh0OiBlc2J1aWxkQ3R4LCBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCB9O1xuICAgIH1cbiAgICBhd2FpdCBlc2J1aWxkQ3R4LmRpc3Bvc2UoKTtcbiAgICByZXR1cm4geyBjb250ZXh0OiB1bmRlZmluZWQsIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1bmRsZSBmb3Igd29ya2Zsb3cgb3JjaGVzdHJhdGlvbiBmdW5jdGlvbnMuXG4gICAqIFdvcmtmbG93cyBydW4gaW4gYSBzYW5kYm94ZWQgVk0gYW5kIGNvb3JkaW5hdGUgc3RlcCBleGVjdXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBidW5kbGVGaW5hbE91dHB1dCAtIElmIGZhbHNlLCBza2lwcyB0aGUgZmluYWwgYnVuZGxpbmcgc3RlcCAodXNlZCBieSBOZXh0LmpzKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdvcmtmbG93c0J1bmRsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRmaWxlLFxuICAgIGJ1bmRsZUZpbmFsT3V0cHV0ID0gdHJ1ZSxcbiAgICBrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQgPSB0aGlzLmNvbmZpZy53YXRjaCxcbiAgICBpbmNsdWRlTWV0YWZpbGUgPSBmYWxzZSxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gIH06IHtcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgb3V0ZmlsZTogc3RyaW5nO1xuICAgIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gICAgYnVuZGxlRmluYWxPdXRwdXQ/OiBib29sZWFuO1xuICAgIGtlZXBJbnRlcmltQnVuZGxlQ29udGV4dD86IGJvb2xlYW47XG4gICAgaW5jbHVkZU1ldGFmaWxlPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTx7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gICAgaW50ZXJpbUJ1bmRsZUN0eD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGJ1bmRsZUZpbmFsPzogKGludGVyaW1CdW5kbGVSZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAvKiogVGhlIHJhdyB3b3JrZmxvdyBWTSBjb2RlIChiZWZvcmUgd3JhcHBpbmcgd2l0aCBlbnRyeXBvaW50KSAqL1xuICAgIGludGVyaW1CdW5kbGVUZXh0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgaW5pdGlhbCB3b3JrZmxvdyBWTSBidWlsZCBncmFwaCwgd2hlbiByZXF1ZXN0ZWQgYnkgYSBjYWxsZXIuICovXG4gICAgaW50ZXJpbUJ1bmRsZU1ldGFmaWxlPzogZXNidWlsZC5NZXRhZmlsZTtcbiAgfT4ge1xuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgZGlzY292ZXJlZEVudHJpZXMgPz9cbiAgICAgIChhd2FpdCB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dEZpbGVzLCBkaXJuYW1lKG91dGZpbGUpLCB0c2NvbmZpZ1BhdGgpKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93c10uc29ydCgpO1xuICAgIGNvbnN0IHNlcmRlRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlc10uc29ydCgpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZSBmaWxlcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHdvcmtmbG93IGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvbi5cbiAgICAvLyBDbGFzc2VzIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSBzdGVwcyBvciB3aGVuIHNlcmlhbGl6aW5nIGRhdGEgdG8gc2VuZCB0byBzdGVwcy5cbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzU2V0ID0gbmV3IFNldCh3b3JrZmxvd0ZpbGVzKTtcbiAgICBjb25zdCBzZXJkZU9ubHlGaWxlcyA9IHNlcmRlRmlsZXMuZmlsdGVyKChmKSA9PiAhd29ya2Zsb3dGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgLy8gbG9nIHRoZSB3b3JrZmxvdyBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7IHdvcmtmbG93RmlsZXMsIHNlcmRlT25seUZpbGVzIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHBhY2thZ2VzLCB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgc28gZXNidWlsZCB3aWxsIHJlc29sdmUgdGhyb3VnaFxuICAgIC8vIHBhY2thZ2UuanNvbiBleHBvcnRzIHdpdGggY29uZGl0aW9uczogWyd3b3JrZmxvdyddXG4gICAgY29uc3QgY3JlYXRlSW1wb3J0ID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgICAgLy8gVXNlIHBhY2thZ2UgbmFtZSAtIGVzYnVpbGQgd2lsbCByZXNvbHZlIHZpYSBwYWNrYWdlLmpzb24gZXhwb3J0c1xuICAgICAgICAvLyBhbmQgYXBwbHkgdGhlICd3b3JrZmxvdycgY29uZGl0aW9uXG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke2ltcG9ydFBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBwYXRocyB0byBmb3J3YXJkIHNsYXNoZXMgYmVmb3JlIGNhbGxpbmcgcmVsYXRpdmUoKVxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBvbiBXaW5kb3dzIHdoZXJlIHJlbGF0aXZlKCkgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGggbWl4ZWQgcGF0aCBmb3JtYXRzXG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGZpbGVcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vIHNvIGVzYnVpbGQgcmVzb2x2ZXMgdGhlbSBjb3JyZWN0bHkuXG4gICAgICAvLyBQYXRocyBsaWtlIFwiLm91dHB1dC8uLi5cIiBhcmUgbm90IHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYW5kIG11c3RcbiAgICAgIC8vIGJlY29tZSBcIi4vLm91dHB1dC8uLi5cIi5cbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgdmlydHVhbCBlbnRyeSB0aGF0IGltcG9ydHMgYWxsIHdvcmtmbG93IGZpbGVzLiBEZWR1cGUgYnlcbiAgICAvLyBjYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5IHNvIHNvdXJjZS9kaXN0IGNvcGllcyBvZiB0aGUgc2FtZSB3b3Jrc3BhY2VcbiAgICAvLyBwYWNrYWdlIGV4cG9ydCBkb24ndCBib3RoIGdldCBpbXBvcnRlZCAod2hpY2ggd291bGQgbWFrZSB0aGUgc3djXG4gICAgLy8gcGx1Z2luIGdlbmVyYXRlIGR1cGxpY2F0ZSB3b3JrZmxvdyBJRHMpLlxuICAgIGNvbnN0IGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgYnVpbGRJbXBvcnRzID0gKGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZyA9PlxuICAgICAgZmlsZXNcbiAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aXR5ID0gbW9kdWxlSWRlbnRpdHlLZXkoZmlsZSwgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290KTtcbiAgICAgICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmFkZChpZGVudGl0eSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoY3JlYXRlSW1wb3J0KVxuICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAvLyBUaGUgU1dDIHBsdWdpbiBpbiB3b3JrZmxvdyBtb2RlIGVtaXRzIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KHdvcmtmbG93SWQsIGZuKWBcbiAgICAvLyBjYWxscyBkaXJlY3RseSwgc28gd2Ugb25seSBuZWVkIHRvIGltcG9ydCB0aGUgZmlsZXMgKE1hcCBpcyBpbml0aWFsaXplZCB2aWEgYmFubmVyKVxuICAgIGNvbnN0IHdvcmtmbG93SW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyh3b3JrZmxvd0ZpbGVzKTtcblxuICAgIC8vIEluY2x1ZGUgc2VyZGUtb25seSBmaWxlcyBmb3IgY2xhc3MgcmVnaXN0cmF0aW9uIHNpZGUgZWZmZWN0c1xuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyhzZXJkZU9ubHlGaWxlcyk7XG5cbiAgICBjb25zdCBpbXBvcnRzID0gc2VyZGVJbXBvcnRzXG4gICAgICA/IGAke3dvcmtmbG93SW1wb3J0c31cXG4vLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cXG4ke3NlcmRlSW1wb3J0c31gXG4gICAgICA6IHdvcmtmbG93SW1wb3J0cztcblxuICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzID0gYXdhaXQgd2l0aFJlYWxwYXRocyhbXG4gICAgICAuLi53b3JrZmxvd0ZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgXSk7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW4gaW4gd29ya2Zsb3cgbW9kZS5cbiAgICAvLyB0aGlzIGJ1bmRsZSB3aWxsIGJlIHJ1biBpbnNpZGUgYSB2bSBpc29sYXRlXG4gICAgY29uc3QgaW50ZXJpbUJ1bmRsZUN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogaW1wb3J0cyxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGZvcm1hdDogJ2NqcycsIC8vIFJ1bnMgaW5zaWRlIHRoZSBWTSB3aGljaCBleHBlY3RzIGNqc1xuICAgICAgcGxhdGZvcm06ICduZXV0cmFsJywgLy8gVGhlIHBsYXRmb3JtIGlzIG5laXRoZXIgbm9kZSBub3IgYnJvd3NlclxuICAgICAgbWFpbkZpZWxkczogWydtb2R1bGUnLCAnbWFpbiddLCAvLyBUbyBzdXBwb3J0IG5wbSBzdHlsZSBpbXBvcnRzXG4gICAgICBjb25kaXRpb25zOiBbJ3dvcmtmbG93J10sIC8vIEFsbG93IHBhY2thZ2VzIHRvIGV4cG9ydCAnd29ya2Zsb3cnIGNvbXBsaWFudCB2ZXJzaW9uc1xuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIG1ldGFmaWxlOiBpbmNsdWRlTWV0YWZpbGUsXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSB3b3JrZmxvdyByZWdpc3RyeSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidW5kbGVcbiAgICAgIC8vIFRoaXMgbXVzdCBiZSBpbiBiYW5uZXIgKG5vdCB0aGUgdmlydHVhbCBlbnRyeSkgYmVjYXVzZSBlc2J1aWxkJ3MgYnVuZGxpbmdcbiAgICAgIC8vIGNhbiByZW9yZGVyIGNvZGUsIGFuZCB0aGUgLnNldCgpIGNhbGxzIG5lZWQgdGhlIE1hcCB0byBleGlzdCBmaXJzdFxuICAgICAgYmFubmVyOiB7XG4gICAgICAgIGpzOiAnZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpOycsXG4gICAgICB9LFxuICAgICAgLy8gU291cmNlIG1hcHMgZm9yIGJldHRlciBzdGFjayB0cmFjZXMgaW4gd29ya2Zsb3cgVk0gZXhlY3V0aW9uLiBUaGlzXG4gICAgICAvLyBpbnRlcm1lZGlhdGUgYnVuZGxlIGlzIGV4ZWN1dGVkIHZpYSBydW5JbkNvbnRleHQoKSBpbiBhIFZNLCBzbyBpbmxpbmVcbiAgICAgIC8vIHNvdXJjZSBtYXBzIGdpdmUgbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMgaW5zdGVhZCBvZlxuICAgICAgLy8gXCJldmFsbWFjaGluZS48YW5vbnltb3VzPlwiLiBEZWZhdWx0cyB0byBpbmxpbmUgaW4gZGV2ZWxvcG1lbnQgYW5kIG9mZiBpblxuICAgICAgLy8gcHJvZHVjdGlvbiAoc2VlIGBkZWZhdWx0U291cmNlbWFwTW9kZWApIHRvIGtlZXAgcHJvZHVjdGlvbiBmdW5jdGlvblxuICAgICAgLy8gYnVuZGxlcyBzbWFsbDsgb3ZlcnJpZGUgd2l0aCB0aGUgYHNvdXJjZW1hcGAgY29uZmlnIG9wdGlvbiBvciB0aGVcbiAgICAgIC8vIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIuIFRoZSBydW50aW1lIHJlbWFwcyBzdGFja3Mgb25seSB3aGVuIGFcbiAgICAgIC8vIG1hcCBpcyBwcmVzZW50LCBzbyBkaXNhYmxpbmcgbWFwcyBkZWdyYWRlcyBncmFjZWZ1bGx5LlxuICAgICAgc291cmNlbWFwOiB0aGlzLnJlc29sdmVTb3VyY2VtYXAodGhpcy5kZWZhdWx0U291cmNlbWFwTW9kZSksXG4gICAgICAvLyBVc2UgdHNjb25maWcgZm9yIHBhdGggYWxpYXMgcmVzb2x1dGlvbi5cbiAgICAgIC8vIEZvciBzeW1saW5rZWQgY29uZmlncyB0aGlzIHVzZXMgdHNjb25maWdSYXcgdG8gcHJlc2VydmUgY3dkLXJlbGF0aXZlIGFsaWFzZXMuXG4gICAgICAuLi5lc2J1aWxkVHNjb25maWdPcHRpb25zLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgLy8gSGFuZGxlIHBzZXVkby1wYWNrYWdlcyBsaWtlICdzZXJ2ZXItb25seScgYW5kICdjbGllbnQtb25seScgYnkgcHJvdmlkaW5nXG4gICAgICAgIC8vIGVtcHR5IG1vZHVsZXMuIE11c3QgcnVuIGZpcnN0IHRvIGludGVyY2VwdCB0aGVzZSBiZWZvcmUgb3RoZXIgcmVzb2x1dGlvbi5cbiAgICAgICAgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbigpLFxuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgb25BZnRlclRyYW5zZm9ybTogdGhpcy5jb25maWcub25BZnRlclRyYW5zZm9ybSxcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogbm9ybWFsaXplZFdvcmtmbG93U2lkZUVmZmVjdEVudHJpZXMsXG4gICAgICAgIH0pLFxuICAgICAgICAvLyBUaGlzIHBsdWdpbiBtdXN0IHJ1biBhZnRlciB0aGUgc3djIHBsdWdpbiB0byBlbnN1cmUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uXG4gICAgICAgIC8vIGhhcHBlbnMgZmlyc3QsIHByZXZlbnRpbmcgZmFsc2UgcG9zaXRpdmVzIG9uIE5vZGUuanMgaW1wb3J0cyBpbiB1bnVzZWQgY29kZSBwYXRoc1xuICAgICAgICBjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4oKSxcbiAgICAgIF0sXG4gICAgICAvLyBOT1RFOiBXZSBpbnRlbnRpb25hbGx5IGRvIE5PVCB1c2UgdGhlIGV4dGVybmFsIG9wdGlvbiBoZXJlIGZvciB3b3JrZmxvdyBidW5kbGVzLlxuICAgICAgLy8gV2hlbiBwYWNrYWdlcyBhcmUgbWFya2VkIGV4dGVybmFsIHdpdGggZm9ybWF0OiAnY2pzJywgZXNidWlsZCBnZW5lcmF0ZXMgcmVxdWlyZSgpIGNhbGxzLlxuICAgICAgLy8gSG93ZXZlciwgdGhlIHdvcmtmbG93IFZNICh2bS5ydW5JbkNvbnRleHQpIGRvZXMgbm90IGhhdmUgcmVxdWlyZSgpIGRlZmluZWQgLSBpdCBvbmx5XG4gICAgICAvLyBwcm92aWRlcyBtb2R1bGUuZXhwb3J0cyBhbmQgZXhwb3J0cy4gRXh0ZXJuYWwgcGFja2FnZXMgd291bGQgZmFpbCBhdCBydW50aW1lIHdpdGg6XG4gICAgICAvLyAgIFJlZmVyZW5jZUVycm9yOiByZXF1aXJlIGlzIG5vdCBkZWZpbmVkXG4gICAgICAvLyBJbnN0ZWFkLCB3ZSBidW5kbGUgZXZlcnl0aGluZyBhbmQgcmVseSBvbjpcbiAgICAgIC8vIC0gY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbigpIHRvIGhhbmRsZSBzZXJ2ZXItb25seS9jbGllbnQtb25seSB3aXRoIGVtcHR5IG1vZHVsZXNcbiAgICAgIC8vIC0gY3JlYXRlTm9kZU1vZHVsZUVycm9yUGx1Z2luKCkgdG8gY2F0Y2ggTm9kZS5qcyBidWlsdGluIGltcG9ydHMgYXQgYnVpbGQgdGltZVxuICAgIH0pO1xuICAgIGxldCBzaG91bGREaXNwb3NlSW50ZXJpbUJ1bmRsZUN0eCA9ICFrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGludGVyaW1CdW5kbGUgPSBhd2FpdCBpbnRlcmltQnVuZGxlQ3R4LnJlYnVpbGQoKTtcblxuICAgICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoXG4gICAgICAgIGludGVyaW1CdW5kbGUsXG4gICAgICAgICdpbnRlcm1lZGlhdGUgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAge1xuICAgICAgICAgIHN1cHByZXNzV2FybmluZ3M6IHRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlV2FybmluZ3MsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ0NyZWF0ZVdvcmtmbG93c0J1bmRsZUluZm8oXG4gICAgICAgICdDcmVhdGVkIGludGVybWVkaWF0ZSB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICBgJHtEYXRlLm5vdygpIC0gYnVuZGxlU3RhcnRUaW1lfW1zYFxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLndvcmtmbG93TWFuaWZlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmUoXG4gICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICB0aGlzLmNvbmZpZy53b3JrZmxvd01hbmlmZXN0UGF0aFxuICAgICAgICApO1xuICAgICAgICBsZXQgcHJlZml4ID0gJyc7XG5cbiAgICAgICAgaWYgKHJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLmNqcycpKSB7XG4gICAgICAgICAgcHJlZml4ID0gJ21vZHVsZS5leHBvcnRzID0gJztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICByZXNvbHZlZFBhdGguZW5kc1dpdGgoJy5qcycpIHx8XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLmVuZHNXaXRoKCcubWpzJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJlZml4ID0gJ2V4cG9ydCBkZWZhdWx0ICc7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBta2RpcihkaXJuYW1lKHJlc29sdmVkUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgIHByZWZpeCArIEpTT04uc3RyaW5naWZ5KHdvcmtmbG93TWFuaWZlc3QsIG51bGwsIDIpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlU3djSWdub3JlZCgpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICFpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzIHx8XG4gICAgICAgIGludGVyaW1CdW5kbGUub3V0cHV0RmlsZXMubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93QnVpbGRFcnJvcignTm8gb3V0cHV0IGZpbGVzIGdlbmVyYXRlZCBmcm9tIGVzYnVpbGQnLCB7XG4gICAgICAgICAgaGludDogJ1RoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYSBtaXNjb25maWd1cmVkIGVudHJ5IHBvaW50IG9yIGFuIGVtcHR5IHdvcmtmbG93IGRpcmVjdG9yeS4gQ2hlY2sgdGhhdCB5b3VyIHdvcmtmbG93IGZpbGVzIGNvbnRhaW4gYSBgXCJ1c2Ugd29ya2Zsb3dcImAgb3IgYFwidXNlIHN0ZXBcImAgZGlyZWN0aXZlLicsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJkZSBjb21wbGlhbmNlIHdhcm5pbmdzOiBjaGVjayBpZiB3b3JrZmxvdyBidW5kbGUgaGFzIE5vZGUuanMgaW1wb3J0c1xuICAgICAgLy8gYWxvbmdzaWRlIHNlcmRlLXJlZ2lzdGVyZWQgY2xhc3NlcyAodGhlc2Ugd2lsbCBmYWlsIGF0IHJ1bnRpbWUgaW4gdGhlIHNhbmRib3gpXG4gICAgICBpZiAoXG4gICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyAmJlxuICAgICAgICBPYmplY3Qua2V5cyh3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMpLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7IGFuYWx5emVTZXJkZUNvbXBsaWFuY2UgfSA9IGF3YWl0IGltcG9ydCgnLi9zZXJkZS1jaGVja2VyLmpzJyk7XG4gICAgICAgIGNvbnN0IGJ1bmRsZVRleHQgPSBpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgICAgIGNvbnN0IHNlcmRlUmVzdWx0ID0gYW5hbHl6ZVNlcmRlQ29tcGxpYW5jZSh7XG4gICAgICAgICAgc291cmNlQ29kZTogJycsXG4gICAgICAgICAgd29ya2Zsb3dDb2RlOiBidW5kbGVUZXh0LFxuICAgICAgICAgIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRGUtZHVwZSB3YXJuaW5nczogZ3JvdXAgaWRlbnRpY2FsIGlzc3VlcyBhY3Jvc3MgY2xhc3Nlc1xuICAgICAgICBjb25zdCBpc3N1ZXNUb0NsYXNzZXMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgICAgIGZvciAoY29uc3QgY2xzIG9mIHNlcmRlUmVzdWx0LmNsYXNzZXMpIHtcbiAgICAgICAgICBpZiAoIWNscy5jb21wbGlhbnQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgY2xzLmlzc3Vlcykge1xuICAgICAgICAgICAgICBsZXQgYWZmZWN0ZWRDbGFzc2VzID0gaXNzdWVzVG9DbGFzc2VzLmdldChpc3N1ZSk7XG4gICAgICAgICAgICAgIGlmICghYWZmZWN0ZWRDbGFzc2VzKSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgaXNzdWVzVG9DbGFzc2VzLnNldChpc3N1ZSwgYWZmZWN0ZWRDbGFzc2VzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhZmZlY3RlZENsYXNzZXMuYWRkKGNscy5jbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtpc3N1ZSwgYWZmZWN0ZWRDbGFzc2VzXSBvZiBpc3N1ZXNUb0NsYXNzZXMpIHtcbiAgICAgICAgICBjb25zdCBjbGFzc05hbWVzID0gWy4uLmFmZmVjdGVkQ2xhc3Nlc107XG4gICAgICAgICAgY29uc3QgY2xhc3NMYWJlbCA9XG4gICAgICAgICAgICBjbGFzc05hbWVzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICA/IGBjbGFzcyBcIiR7Y2xhc3NOYW1lc1swXX1cImBcbiAgICAgICAgICAgICAgOiBgY2xhc3NlcyAke2NsYXNzTmFtZXMubWFwKChuYW1lKSA9PiBgXCIke25hbWV9XCJgKS5qb2luKCcsICcpfWA7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KGDimqAgU2VyZGUgd2FybmluZyBmb3IgJHtjbGFzc0xhYmVsfTogYCkgKyBpc3N1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgPSBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZShcbiAgICAgICAge1xuICAgICAgICAgIGJhc2VQYXRoOiB0aGlzLmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgICAgICByb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQ6ICd3b3JrZmxvd1JvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCcsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGJ1bmRsZUZpbmFsID0gYXN5bmMgKGludGVyaW1CdW5kbGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB3b3JrZmxvd0J1bmRsZUNvZGUgPSBpbnRlcmltQnVuZGxlO1xuXG4gICAgICAgIGNvbnN0IHdvcmtmbG93RnVuY3Rpb25Db2RlID0gYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyB3b3JrZmxvd0VudHJ5cG9pbnQgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztcblxuY29uc3Qgd29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuY29uc3Qgd29ya2Zsb3dDb2RlID0gXFxgJHt3b3JrZmxvd0J1bmRsZUNvZGUucmVwbGFjZSgvW1xcXFxgJF0vZywgJ1xcXFwkJicpfVxcYDtcblxuJHtjcmVhdGVXb3JrZmxvd1JvdXRlSGFuZGxlcnNDb2RlKGB3b3JrZmxvd0VudHJ5cG9pbnQod29ya2Zsb3dDb2RlJHt3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZX0pYCl9YDtcblxuICAgICAgICAvLyB3ZSBza2lwIHRoZSBmaW5hbCBidW5kbGluZyBzdGVwIGZvciBOZXh0LmpzIHNvIGl0IGNhbiBidW5kbGUgaXRzZWxmXG4gICAgICAgIGlmICghYnVuZGxlRmluYWxPdXRwdXQpIHtcbiAgICAgICAgICBpZiAoIW91dGZpbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YXJpYW50OiBtaXNzaW5nIG91dGZpbGUgZm9yIHdvcmtmbG93IGJ1bmRsZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbnN1cmUgdGhlIG91dHB1dCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZShvdXRmaWxlKTtcbiAgICAgICAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUob3V0ZmlsZSwgd29ya2Zsb3dGdW5jdGlvbkNvZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gTm93IGJ1bmRsZSB0aGlzIHNvIHdlIGNhbiByZXNvbHZlIHRoZSBAd29ya2Zsb3cvY29yZSBkZXBlbmRlbmN5XG4gICAgICAgIC8vIHdlIGNvdWxkIHJlbW92ZSB0aGlzIGlmIHdlIGRvIG5mdCB0cmFjaW5nIG9yIHNpbWlsYXIgaW5zdGVhZFxuICAgICAgICBjb25zdCBmaW5hbEVzbVJlcXVpcmVCYW5uZXIgPSB0aGlzLmdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0KTtcbiAgICAgICAgY29uc3QgZmluYWxXb3JrZmxvd1Jlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgICAgIGJhbm5lcjoge1xuICAgICAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ZpbmFsRXNtUmVxdWlyZUJhbm5lcn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RkaW46IHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiB3b3JrZmxvd0Z1bmN0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlc29sdmVEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvdXRmaWxlLFxuICAgICAgICAgIC8vIFNvdXJjZSBtYXBzIGZvciB0aGUgZmluYWwgd29ya2Zsb3cgYnVuZGxlIHdyYXBwZXIgKG5vdCBpbXBvcnRhbnQgc2luY2UgdGhpcyBjb2RlXG4gICAgICAgICAgLy8gZG9lc24ndCBydW4gaW4gdGhlIFZNIC0gb25seSB0aGUgaW50ZXJtZWRpYXRlIGJ1bmRsZSBzb3VyY2VtYXAgaXMgcmVsZXZhbnQpXG4gICAgICAgICAgc291cmNlbWFwOiB0aGlzLnJlc29sdmVTb3VyY2VtYXAoRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcpLFxuICAgICAgICAgIGFic1dvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICAgICAgd3JpdGU6IHRydWUsXG4gICAgICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgICAgZXh0ZXJuYWw6IFsnQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlci13ZWItaWRlbnRpdHknXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoXG4gICAgICAgICAgZmluYWxXb3JrZmxvd1Jlc3VsdCxcbiAgICAgICAgICAnZmluYWwgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3M6IHRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlV2FybmluZ3MsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ0NyZWF0ZVdvcmtmbG93c0J1bmRsZUluZm8oXG4gICAgICAgICAgJ0NyZWF0ZWQgZmluYWwgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICBgJHtEYXRlLm5vdygpIC0gYnVuZGxlU3RhcnRUaW1lfW1zYFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGVyaW1CdW5kbGVUZXh0ID0gaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgICAgYXdhaXQgYnVuZGxlRmluYWwoaW50ZXJpbUJ1bmRsZVRleHQpO1xuXG4gICAgICBpZiAoa2VlcEludGVyaW1CdW5kbGVDb250ZXh0KSB7XG4gICAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICBidW5kbGVGaW5hbCxcbiAgICAgICAgICBpbnRlcmltQnVuZGxlVGV4dCxcbiAgICAgICAgICBpbnRlcmltQnVuZGxlTWV0YWZpbGU6IGludGVyaW1CdW5kbGUubWV0YWZpbGUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgaW50ZXJpbUJ1bmRsZVRleHQsXG4gICAgICAgIGludGVyaW1CdW5kbGVNZXRhZmlsZTogaW50ZXJpbUJ1bmRsZS5tZXRhZmlsZSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpbnRlcmltQnVuZGxlQ3R4LmRpc3Bvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZGlzcG9zZUVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1dhcm5pbmc6IEZhaWxlZCB0byBkaXNwb3NlIHdvcmtmbG93IGJ1bmRsZSBjb250ZXh0JyxcbiAgICAgICAgICAgIGRpc3Bvc2VFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVjI6IENyZWF0ZXMgYSBjb21iaW5lZCBidW5kbGUgdGhhdCBpbmNsdWRlcyBib3RoIHN0ZXAgcmVnaXN0cmF0aW9ucyBhbmRcbiAgICogd29ya2Zsb3cgb3JjaGVzdHJhdGlvbiBpbiBhIHNpbmdsZSByb3V0ZS4gVGhlIGNvbWJpbmVkIGVudHJ5cG9pbnQgZXhlY3V0ZXNcbiAgICogc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUsIHJlZHVjaW5nIGZ1bmN0aW9uIGludm9jYXRpb25zIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcmV1c2VzIGNyZWF0ZVN0ZXBzQnVuZGxlIChmb3Igc3RlcCByZWdpc3RyYXRpb25zKSBhbmRcbiAgICogY3JlYXRlV29ya2Zsb3dzQnVuZGxlIChmb3Igd29ya2Zsb3cgVk0gY29kZSksIHRoZW4gY29tYmluZXMgdGhlbSBpbnRvXG4gICAqIGEgc2luZ2xlIHJvdXRlIGZpbGUgdXNpbmcgd29ya2Zsb3dFbnRyeXBvaW50KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ29tYmluZWRCdW5kbGUoe1xuICAgIGlucHV0RmlsZXMsXG4gICAgc3RlcHNPdXRmaWxlLFxuICAgIGZsb3dPdXRmaWxlLFxuICAgIGZvcm1hdCA9ICdlc20nLFxuICAgIGJ1bmRsZUZpbmFsT3V0cHV0ID0gdHJ1ZSxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcyxcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICB9OiB7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgc3RlcCByZWdpc3RyYXRpb25zIGJ1bmRsZSAoc2lkZSBlZmZlY3RzIG9ubHkpICovXG4gICAgc3RlcHNPdXRmaWxlOiBzdHJpbmc7XG4gICAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgY29tYmluZWQgcm91dGUgZmlsZSAqL1xuICAgIGZsb3dPdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBidW5kbGVGaW5hbE91dHB1dD86IGJvb2xlYW47XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTx7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gICAgc3RlcHNDb250ZXh0PzogZXNidWlsZC5CdWlsZENvbnRleHQ7XG4gICAgaW50ZXJpbUJ1bmRsZUN0eD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGJ1bmRsZUZpbmFsPzogKGludGVyaW1CdW5kbGVSZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXM7XG4gICAgc3RlcHNNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgICB3b3JrZmxvd3NNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfT4ge1xuICAgIHRoaXMuc3RhcnRXb3JrZmxvd0J1aWxkVGltZXIoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBkaXJuYW1lKGZsb3dPdXRmaWxlKSxcbiAgICAgICAgdHNjb25maWdQYXRoXG4gICAgICApKTtcblxuICAgIC8vIDEuIEJ1aWxkIHN0ZXAgcmVnaXN0cmF0aW9ucyBidW5kbGUgKHVzZWQgYXMgc2VwYXJhdGUgZmlsZSBmb3JcbiAgICAvLyBidW5kbGVGaW5hbE91dHB1dDogZmFsc2UsIG9yIHJlYWQgYmFjayBmb3IgaW5saW5lIGNvbnRlbnQgd2hlbiB0cnVlKVxuICAgIGNvbnN0IHsgY29udGV4dDogc3RlcHNDb250ZXh0LCBtYW5pZmVzdDogc3RlcHNNYW5pZmVzdCB9ID1cbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU3RlcHNCdW5kbGUoe1xuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBvdXRmaWxlOiBzdGVwc091dGZpbGUsXG4gICAgICAgIC8vIFdoZW4gYnVuZGxlRmluYWxPdXRwdXQgaXMgdHJ1ZSwgdXNlIEVTTSBmb3IgdGhlIHN0ZXBzIGJ1bmRsZVxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBmaW5hbCBvdXRwdXQgZm9ybWF0LiBUaGUgZmluYWwgZXNidWlsZCBwYXNzXG4gICAgICAgIC8vIGNvbnZlcnRzIGV2ZXJ5dGhpbmcgdG8gdGhlIHRhcmdldCBmb3JtYXQuIFVzaW5nIENKUyBoZXJlIGNhdXNlc1xuICAgICAgICAvLyBhIG1vZHVsZS5leHBvcnRzIGNvbGxpc2lvbjogdGhlIHN0ZXBzIGJ1bmRsZSdzIHRvcC1sZXZlbFxuICAgICAgICAvLyBtb2R1bGUuZXhwb3J0cyBvdmVyd3JpdGVzIHRoZSBjb21iaW5lZCByb3V0ZSdzIG1vZHVsZS5leHBvcnRzXG4gICAgICAgIC8vIHdoZW4gZXNidWlsZCBpbmxpbmVzIHRoZSBzdGVwcyB3aXRob3V0IGEgX19jb21tb25KUyB3cmFwcGVyLlxuICAgICAgICBmb3JtYXQ6IGJ1bmRsZUZpbmFsT3V0cHV0ID8gJ2VzbScgOiBmb3JtYXQsXG4gICAgICAgIGV4dGVybmFsaXplTm9uU3RlcHMsXG4gICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgLy8gU2tpcCB0aGUgY3JlYXRlUmVxdWlyZSBiYW5uZXIgaGVyZTogd2hlbiBidW5kbGVGaW5hbE91dHB1dCBpcyB0cnVlXG4gICAgICAgIC8vIHRoZSBvdXRlciBlc2J1aWxkIHBhc3Mgd2lsbCBpbmxpbmUgdGhpcyBidW5kbGUgYW5kIGFkZCBpdHMgb3duXG4gICAgICAgIC8vIGJhbm5lci4gRW1pdHRpbmcgaXQgdHdpY2UgZGVjbGFyZXMgX19jcmVhdGVSZXF1aXJlIHR3aWNlLlxuICAgICAgICBza2lwRXNtUmVxdWlyZUJhbm5lcjogYnVuZGxlRmluYWxPdXRwdXQsXG4gICAgICB9KTtcblxuICAgIC8vIDIuIEJ1aWxkIHdvcmtmbG93IFZNIGNvZGVcbiAgICBjb25zdCB0ZW1wV29ya2Zsb3dPdXRmaWxlID0gYCR7Zmxvd091dGZpbGV9Ll9fd2ZfdG1wLmpzYDtcbiAgICBjb25zdCB3b3JrZmxvd3NSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdvcmtmbG93c0J1bmRsZSh7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0ZmlsZTogdGVtcFdvcmtmbG93T3V0ZmlsZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSxcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdvcmtmbG93Vk1Db2RlID0gd29ya2Zsb3dzUmVzdWx0LmludGVyaW1CdW5kbGVUZXh0O1xuICAgIGlmICghd29ya2Zsb3dWTUNvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGRpZCBub3QgcmV0dXJuIGludGVyaW1CdW5kbGVUZXh0Jyk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgdGhlIHdyYXBwZXIgZmlsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHVubGluayB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzL3Byb21pc2VzJyk7XG4gICAgICBhd2FpdCB1bmxpbmsodGVtcFdvcmtmbG93T3V0ZmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyAzLiBHZW5lcmF0ZSBjb21iaW5lZCByb3V0ZSBmaWxlXG4gICAgY29uc3Qgc3RlcHNSZWxhdGl2ZVBhdGggPSBgLi8ke2Jhc2VuYW1lKHN0ZXBzT3V0ZmlsZSkucmVwbGFjZSgvXFxcXC9nLCAnLycpfWA7XG4gICAgY29uc3QgZXNjYXBlZFZNQ29kZSA9IHdvcmtmbG93Vk1Db2RlLnJlcGxhY2UoL1tcXFxcYCRdL2csICdcXFxcJCYnKTtcbiAgICBjb25zdCB3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSA9IGNyZWF0ZVdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlKHtcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdDogJ3dvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0JyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbWJpbmVkRnVuY3Rpb25Db2RlID0gYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBfX3N0ZXBzX3JlZ2lzdGVyZWQgfSBmcm9tICcke3N0ZXBzUmVsYXRpdmVQYXRofSc7XG5pbXBvcnQgeyB3b3JrZmxvd0VudHJ5cG9pbnQgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztcblxuY29uc3Qgd29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4vLyBQcmV2ZW50IHJvbGx1cCBmcm9tIHRyZWUtc2hha2luZyB0aGUgc3RlcHMgc2lkZS1lZmZlY3QgaW1wb3J0XG52b2lkIF9fc3RlcHNfcmVnaXN0ZXJlZDtcblxuY29uc3Qgd29ya2Zsb3dDb2RlID0gXFxgJHtlc2NhcGVkVk1Db2RlfVxcYDtcblxuJHtjcmVhdGVXb3JrZmxvd1JvdXRlSGFuZGxlcnNDb2RlKGB3b3JrZmxvd0VudHJ5cG9pbnQod29ya2Zsb3dDb2RlJHt3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZX0pYCl9YDtcblxuICAgIGlmICghYnVuZGxlRmluYWxPdXRwdXQpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKGZsb3dPdXRmaWxlLCBjb21iaW5lZEZ1bmN0aW9uQ29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJ1bmRsZSB0aGUgY29tYmluZWQgY29kZSBmb3Igc3RhbmRhbG9uZSB1c2VcbiAgICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB7IGJhbm5lcjogaW1wb3J0TWV0YUJhbm5lciwgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lIH0gPVxuICAgICAgICB0aGlzLmdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQpO1xuICAgICAgLy8gRVNNIGJhbm5lciBwcm92aWRlcyBgcmVxdWlyZWAgdmlhIGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKSBzb1xuICAgICAgLy8gQ0pTIGRlcGVuZGVuY2llcyB0aGF0IGNhbGwgcmVxdWlyZSgpIGZvciBOb2RlLmpzIGJ1aWx0aW5zIGtlZXAgd29ya2luZ1xuICAgICAgLy8gaW4gdGhlIEVTTSBvdXRwdXQgcHJvZHVjZWQgYnkgYnVuZGxlRmluYWxPdXRwdXQ6IHRydWUuXG4gICAgICBjb25zdCBmaW5hbEVzbVJlcXVpcmVCYW5uZXIgPSB0aGlzLmdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0KTtcbiAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGJhbm5lcjoge1xuICAgICAgICAgIGpzOiBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxcbi8qIGVzbGludC1kaXNhYmxlICovXFxuJHtpbXBvcnRNZXRhQmFubmVyfSR7ZmluYWxFc21SZXF1aXJlQmFubmVyfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZGluOiB7XG4gICAgICAgICAgY29udGVudHM6IGNvbWJpbmVkRnVuY3Rpb25Db2RlLFxuICAgICAgICAgIHJlc29sdmVEaXI6IGRpcm5hbWUoZmxvd091dGZpbGUpLFxuICAgICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgIH0sXG4gICAgICAgIG91dGZpbGU6IGZsb3dPdXRmaWxlLFxuICAgICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgICAgd3JpdGU6IHRydWUsXG4gICAgICAgIGtlZXBOYW1lczogdHJ1ZSxcbiAgICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgICAgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lLFxuICAgICAgICBleHRlcm5hbDogWydAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVyLXdlYi1pZGVudGl0eSddLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhmaW5hbFJlc3VsdCwgJ2NvbWJpbmVkIGJ1bmRsZScsIHRydWUpO1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAgICdDcmVhdGVkIGNvbWJpbmVkIGJ1bmRsZScsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidW5kbGVTdGFydFRpbWV9bXNgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIG1hbmlmZXN0c1xuICAgIGNvbnN0IG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge1xuICAgICAgLi4uc3RlcHNNYW5pZmVzdCxcbiAgICAgIHdvcmtmbG93czoge1xuICAgICAgICAuLi5zdGVwc01hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgICAgLi4ud29ya2Zsb3dzUmVzdWx0Lm1hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgIH0sXG4gICAgICBjbGFzc2VzOiB7XG4gICAgICAgIC4uLnN0ZXBzTWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgICAgLi4ud29ya2Zsb3dzUmVzdWx0Lm1hbmlmZXN0LmNsYXNzZXMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSBjdXN0b20gYnVuZGxlRmluYWwgZm9yIHdhdGNoIG1vZGUgdGhhdCB1c2VzIHdvcmtmbG93RW50cnlwb2ludFxuICAgIGNvbnN0IGNvbWJpbmVkQnVuZGxlRmluYWwgPSBhc3luYyAoaW50ZXJpbUJ1bmRsZVRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZXNjYXBlZCA9IGludGVyaW1CdW5kbGVUZXh0LnJlcGxhY2UoL1tcXFxcYCRdL2csICdcXFxcJCYnKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlID0gY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUoXG4gICAgICAgIHtcbiAgICAgICAgICBiYXNlUGF0aDogdGhpcy5jb25maWcuYmFzZVBhdGgsXG4gICAgICAgICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0OiAnd29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQnLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY29uc3QgY29kZSA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgX19zdGVwc19yZWdpc3RlcmVkIH0gZnJvbSAnJHtzdGVwc1JlbGF0aXZlUGF0aH0nO1xuaW1wb3J0IHsgd29ya2Zsb3dFbnRyeXBvaW50IH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG5cbmNvbnN0IHdvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxudm9pZCBfX3N0ZXBzX3JlZ2lzdGVyZWQ7XG5cbmNvbnN0IHdvcmtmbG93Q29kZSA9IFxcYCR7ZXNjYXBlZH1cXGA7XG5cbiR7Y3JlYXRlV29ya2Zsb3dSb3V0ZUhhbmRsZXJzQ29kZShgd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KWApfWA7XG5cbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGRpcm5hbWUoZmxvd091dGZpbGUpO1xuICAgICAgYXdhaXQgbWtkaXIob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKGZsb3dPdXRmaWxlLCBjb2RlKTtcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgc3RlcHNDb250ZXh0LFxuICAgICAgICBpbnRlcmltQnVuZGxlQ3R4OiB3b3JrZmxvd3NSZXN1bHQuaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgYnVuZGxlRmluYWw6IGNvbWJpbmVkQnVuZGxlRmluYWwsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBlZmZlY3RpdmVEaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgc3RlcHNNYW5pZmVzdCxcbiAgICAgICAgd29ya2Zsb3dzTWFuaWZlc3Q6IHdvcmtmbG93c1Jlc3VsdC5tYW5pZmVzdCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgZGlzY292ZXJlZEVudHJpZXM6IGVmZmVjdGl2ZURpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgc3RlcHNNYW5pZmVzdCxcbiAgICAgIHdvcmtmbG93c01hbmlmZXN0OiB3b3JrZmxvd3NSZXN1bHQubWFuaWZlc3QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xpZW50IGxpYnJhcnkgYnVuZGxlIGZvciB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqIFRoZSBjbGllbnQgbGlicmFyeSBhbGxvd3MgaW1wb3J0aW5nIGFuZCBjYWxsaW5nIHdvcmtmbG93cyBmcm9tIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAqIE9ubHkgZ2VuZXJhdGVkIGlmIGNsaWVudEJ1bmRsZVBhdGggaXMgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDbGllbnRMaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCkge1xuICAgICAgLy8gU2lsZW50bHkgZXhpdCBzaW5jZSBubyBjbGllbnQgYnVuZGxlIHdhcyByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdHZW5lcmF0aW5nIGEgY2xpZW50IGxpYnJhcnkgYXQnLFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aFxuICAgICk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnTk9URTogVGhlIHJlY29tbWVuZGVkIHdheSB0byB1c2Ugd29ya2Zsb3cgd2l0aCBhIGZyYW1ld29yayBsaWtlIE5leHRKUyBpcyB1c2luZyB0aGUgbG9hZGVyL3BsdWdpbiB3aXRoIHdlYnBhY2svdHVyYm9icGFjay9yb2xsdXAnXG4gICAgKTtcblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBjbGllbnQgYnVuZGxlXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZSh0aGlzLmNvbmZpZy5jbGllbnRCdW5kbGVQYXRoKTtcbiAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0SW5wdXRGaWxlcygpO1xuXG4gICAgLy8gRGlzY292ZXIgc2VyZGUgZmlsZXMgZnJvbSB0aGUgaW5wdXQgZmlsZXMnIGRlcGVuZGVuY3kgdHJlZSBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNsaWVudCBidW5kbGUgc28gdGhleSBjYW4gYmUgc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcGFzc2luZyBkYXRhIHRvIHdvcmtmbG93cyB2aWEgc3RhcnQoKSBhbmQgZGVzZXJpYWxpemVkIHdoZW4gcmVjZWl2aW5nIHdvcmtmbG93IHJlc3VsdHMuXG4gICAgY29uc3QgeyBkaXNjb3ZlcmVkU2VyZGVGaWxlcyB9ID0gYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0cHV0RGlyXG4gICAgKTtcblxuICAgIC8vIElkZW50aWZ5IHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSBpbnB1dEZpbGVzIChkZWR1cGxpY2F0ZWQpXG4gICAgY29uc3QgaW5wdXRGaWxlc05vcm1hbGl6ZWQgPSBuZXcgU2V0KFxuICAgICAgaW5wdXRGaWxlcy5tYXAoKGYpID0+IGYucmVwbGFjZSgvXFxcXC9nLCAnLycpKVxuICAgICk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBbLi4uZGlzY292ZXJlZFNlcmRlRmlsZXNdLmZpbHRlcihcbiAgICAgIChmKSA9PiAhaW5wdXRGaWxlc05vcm1hbGl6ZWQuaGFzKGYpXG4gICAgKTtcblxuICAgIC8vIFJlLWV4cG9ydHMgZm9yIGlucHV0IGZpbGVzICh1c2VyJ3Mgd29ya2Zsb3cvc3RlcCBkZWZpbml0aW9ucykuXG4gICAgLy8gVGhlc2UgbXVzdCB1c2UgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBiZWNhdXNlIHNvbWUgZnJhbWV3b3JrcyBwYXNzXG4gICAgLy8gZ2VuZXJhdGVkIGZpbGVzIGxpa2UgXCIub3V0cHV0L3NlcnZlci9pbmRleC5tanNcIiBhcyBpbnB1dCBmaWxlcy5cbiAgICBjb25zdCByZWV4cG9ydHMgPSBpbnB1dEZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgZXhwb3J0ICogZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIFNpZGUtZWZmZWN0IGltcG9ydHMgZm9yIHNlcmRlIGZpbGVzIG5vdCBpbiBpbnB1dEZpbGVzIChmb3IgY2xhc3MgcmVnaXN0cmF0aW9uKVxuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IHNlcmRlT25seUZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29tYmluZTogc2VyZGUgaW1wb3J0cyAoZm9yIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHMpICsgcmUtZXhwb3J0c1xuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IHNlcmRlSW1wb3J0c1xuICAgICAgPyBgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXFxuJHtzZXJkZUltcG9ydHN9XFxuJHtyZWV4cG9ydHN9YFxuICAgICAgOiByZWV4cG9ydHM7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW5cbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLmlucHV0RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcbiAgICBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJy8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbicsXG4gICAgICB9LFxuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGVudHJ5Q29udGVudCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgb3V0ZmlsZTogdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBleHRlcm5hbDogWydAd29ya2Zsb3cvY29yZSddLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIG9uQWZ0ZXJUcmFuc2Zvcm06IHRoaXMuY29uZmlnLm9uQWZ0ZXJUcmFuc2Zvcm0sXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IG5vcm1hbGl6ZWRDbGllbnRTaWRlRWZmZWN0RW50cmllcyxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoY2xpZW50UmVzdWx0LCAnY2xpZW50IGxpYnJhcnkgYnVuZGxlJyk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN3Y0lnbm9yZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgd2ViaG9vayBoYW5kbGVyIGJ1bmRsZSBmb3IgcmVzdW1pbmcgd29ya2Zsb3dzIHZpYSBIVFRQIGNhbGxiYWNrcy5cbiAgICpcbiAgICogQHBhcmFtIGJ1bmRsZSAtIElmIHRydWUsIGJ1bmRsZXMgZGVwZW5kZW5jaWVzIChuZWVkZWQgZm9yIEJ1aWxkIE91dHB1dCBBUEkpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgb3V0ZmlsZSxcbiAgICBidW5kbGUgPSBmYWxzZSxcbiAgfToge1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBidW5kbGU/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dDcmVhdGVXZWJob29rQnVuZGxlSW5mbygnQ3JlYXRpbmcgd2ViaG9vayByb3V0ZScpO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUob3V0ZmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGEgc3RhdGljIHJvdXRlIHRoYXQgY2FsbHMgcmVzdW1lV2ViaG9va1xuICAgIC8vIFRoaXMgcm91dGUgd29ya3MgZm9yIGJvdGggTmV4dC5qcyBhbmQgVmVyY2VsIEJ1aWxkIE91dHB1dCBBUElcbiAgICAvLyBCdW5kbGVkIEJ1aWxkIE91dHB1dCBBUEkgd2ViaG9vayBmdW5jdGlvbnMgbmVlZCB3b3JsZC50cyBzdGF0aWNhbGx5XG4gICAgLy8gcHJlc2VudCBzbyBnZXRXb3JsZExhenkoKSBjYW4gdXNlIHRoZSBnbG9iYWwgZ2V0V29ybGQgcmVnaXN0cmF0aW9uXG4gICAgLy8gaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gYSBtaXNzaW5nIHNpYmxpbmcgaW1wb3J0KFwiLi93b3JsZC5qc1wiKS5cbiAgICBjb25zdCByb3V0ZUNvbnRlbnQgPSBgJHtidW5kbGUgPyBcImltcG9ydCAnd29ya2Zsb3cvcnVudGltZSc7XFxuXCIgOiAnJ31pbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnd29ya2Zsb3cvYXBpJztcblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihyZXF1ZXN0KSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAvLyBFeHRyYWN0IHRva2VuIGZyb20gcGF0aG5hbWU6IC8ud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rL3t0b2tlbn1cbiAgY29uc3QgcGF0aFBhcnRzID0gdXJsLnBhdGhuYW1lLnNwbGl0KCcvJyk7XG4gIGNvbnN0IHRva2VuID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV0pO1xuXG4gIGlmICghdG9rZW4pIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXN1bWVXZWJob29rKHRva2VuLCByZXF1ZXN0KTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVE9ETzogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludmFsaWQgdG9rZW4gYW5kIG90aGVyIGVycm9yc1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyByZXN1bWVXZWJob29rJywgZXJyb3IpO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDQwNCB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgR0VUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQT1NUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQVVQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IFBBVENIID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBERUxFVEUgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IEhFQUQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IE9QVElPTlMgPSBoYW5kbGVyO2A7XG5cbiAgICBpZiAoIWJ1bmRsZSkge1xuICAgICAgLy8gRm9yIE5leHQuanMsIHdyaXRlIHRoZSB1bmJ1bmRsZWQgZmlsZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlSWZDaGFuZ2VkKG91dGZpbGUsIHJvdXRlQ29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIEJ1aWxkIE91dHB1dCBBUEksIGJ1bmRsZSB3aXRoIGVzYnVpbGQgdG8gcmVzb2x2ZSBpbXBvcnRzXG5cbiAgICBjb25zdCB3ZWJob29rRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcignZXNtJyk7XG4gICAgY29uc3Qgd2ViaG9va0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7d2ViaG9va0VzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogcm91dGVDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAnd2ViaG9vay1yb3V0ZS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgY29uZGl0aW9uczogWydpbXBvcnQnLCAnbW9kdWxlJywgJ25vZGUnLCAnZGVmYXVsdCddLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHNvdXJjZW1hcDogdGhpcy5yZXNvbHZlU291cmNlbWFwKEVNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HKSxcbiAgICAgIG1haW5GaWVsZHM6IFsnbW9kdWxlJywgJ21haW4nXSxcbiAgICAgIC8vIERvbid0IGV4dGVybmFsaXplIGFueXRoaW5nIC0gYnVuZGxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIHdvcmtmbG93IHBhY2thZ2VzXG4gICAgICBleHRlcm5hbDogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhyZXN1bHQsICd3ZWJob29rIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oXG4gICAgICAnQ3JlYXRlZCB3ZWJob29rIGJ1bmRsZScsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gd2ViaG9va0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhY2thZ2UuanNvbiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQYWNrYWdlSnNvbihcbiAgICBkaXI6IHN0cmluZyxcbiAgICB0eXBlOiAnY29tbW9uanMnIHwgJ21vZHVsZSdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSB7IHR5cGUgfTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgLnZjLWNvbmZpZy5qc29uIGZpbGUgZm9yIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVWY0NvbmZpZyhcbiAgICBkaXI6IHN0cmluZyxcbiAgICBjb25maWc6IHtcbiAgICAgIHJ1bnRpbWU/OiBzdHJpbmc7XG4gICAgICBoYW5kbGVyPzogc3RyaW5nO1xuICAgICAgbGF1bmNoZXJUeXBlPzogc3RyaW5nO1xuICAgICAgYXJjaGl0ZWN0dXJlPzogc3RyaW5nO1xuICAgICAgc2hvdWxkQWRkSGVscGVycz86IGJvb2xlYW47XG4gICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0PzogYm9vbGVhbjtcbiAgICAgIG1heER1cmF0aW9uPzogbnVtYmVyIHwgJ21heCc7XG4gICAgICBleHBlcmltZW50YWxUcmlnZ2Vycz86IEFycmF5PHtcbiAgICAgICAgdHlwZTogJ3F1ZXVlL3YyYmV0YSc7XG4gICAgICAgIHRvcGljOiBzdHJpbmc7XG4gICAgICAgIGNvbnN1bWVyOiBzdHJpbmc7XG4gICAgICAgIG1heERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgICAgIG1heENvbmN1cnJlbmN5PzogbnVtYmVyO1xuICAgICAgICByZXRyeUFmdGVyU2Vjb25kcz86IG51bWJlcjtcbiAgICAgICAgaW5pdGlhbERlbGF5U2Vjb25kcz86IG51bWJlcjtcbiAgICAgIH0+O1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmNDb25maWcgPSB7XG4gICAgICBydW50aW1lOiBjb25maWcucnVudGltZSA/PyAnbm9kZWpzMjIueCcsXG4gICAgICBoYW5kbGVyOiBjb25maWcuaGFuZGxlciA/PyAnaW5kZXgubWpzJyxcbiAgICAgIGxhdW5jaGVyVHlwZTogY29uZmlnLmxhdW5jaGVyVHlwZSA/PyAnTm9kZWpzJyxcbiAgICAgIGFyY2hpdGVjdHVyZTogY29uZmlnLmFyY2hpdGVjdHVyZSA/PyAnYXJtNjQnLFxuICAgICAgc2hvdWxkQWRkSGVscGVyczogY29uZmlnLnNob3VsZEFkZEhlbHBlcnMgPz8gdHJ1ZSxcbiAgICAgIC4uLihjb25maWcubWF4RHVyYXRpb24gIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIG1heER1cmF0aW9uOiBjb25maWcubWF4RHVyYXRpb24sXG4gICAgICB9KSxcbiAgICAgIC4uLihjb25maWcuc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydDogY29uZmlnLnNob3VsZEFkZFNvdXJjZW1hcFN1cHBvcnQsXG4gICAgICB9KSxcbiAgICAgIC4uLihjb25maWcuZXhwZXJpbWVudGFsVHJpZ2dlcnMgJiYge1xuICAgICAgICBleHBlcmltZW50YWxUcmlnZ2VyczogY29uZmlnLmV4cGVyaW1lbnRhbFRyaWdnZXJzLFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgIGpvaW4oZGlyLCAnLnZjLWNvbmZpZy5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh2Y0NvbmZpZywgbnVsbCwgMilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZSBkaXJlY3RvcnkgZm9yIGEgZmlsZSBwYXRoIGV4aXN0cywgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGVuc3VyZVN3Y0lnbm9yZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVQcm9qZWN0U3djR2l0aWdub3JlRW50cnkoKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVN3Y0RpcmVjdG9yeUdpdGlnbm9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVQcm9qZWN0U3djR2l0aWdub3JlRW50cnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0aWdub3JlUGF0aCA9IGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgJy5naXRpZ25vcmUnKTtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGdpdGlnbm9yZVBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc1N3Y0VudHJ5ID0gY29udGVudC5zcGxpdCgvXFxyP1xcbi8pLnNvbWUoKGxpbmUpID0+IHtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcuc3djJyB8fFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcuc3djLycgfHxcbiAgICAgICAgICB0cmltbWVkID09PSAnLy5zd2MnIHx8XG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy8uc3djLydcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaGFzU3djRW50cnkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXBhcmF0b3IgPVxuICAgICAgICBjb250ZW50Lmxlbmd0aCA+IDAgJiYgIWNvbnRlbnQuZW5kc1dpdGgoJ1xcbicpID8gJ1xcbicgOiAnJztcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShnaXRpZ25vcmVQYXRoLCBgJHtjb250ZW50fSR7c2VwYXJhdG9yfS8uc3djXFxuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBXZSdyZSBpbnRlbnRpb25hbGx5IHNpbGVudGx5IGlnbm9yaW5nIHRoaXMgZXJyb3IgLSB1cGRhdGluZyAuZ2l0aWdub3JlIGlzbid0IGNyaXRpY2FsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTd2NEaXJlY3RvcnlHaXRpZ25vcmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnLnN3YycsICcuZ2l0aWdub3JlJyksXG4gICAgICAgICcqXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdlJ3JlIGludGVudGlvbmFsbHkgc2lsZW50bHkgaWdub3JpbmcgdGhpcyBlcnJvciAtIGNyZWF0aW5nIC5naXRpZ25vcmUgaXNuJ3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWFuaWZlc3Qgc2hvdWxkIGJlIGV4cG9zZWQgYXMgYSBwdWJsaWMgSFRUUCByb3V0ZS5cbiAgICogQ29udHJvbGxlZCBieSB0aGUgYFdPUktGTE9XX1BVQkxJQ19NQU5JRkVTVGAgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNob3VsZEV4cG9zZVB1YmxpY01hbmlmZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19QVUJMSUNfTUFOSUZFU1QgPT09ICcxJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgd29ya2Zsb3cgbWFuaWZlc3QgZGlhZ25vc3RpY3MgcGF0aCwgd2hlbiB0aGlzIGJ1aWxkZXIgc2hvdWxkXG4gICAqIGVtaXQgb25lLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmRpYWdub3N0aWNzRGlyKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgdGhpcy5jb25maWcuZGlhZ25vc3RpY3NEaXIsXG4gICAgICAgICd3b3JrZmxvd3MtbWFuaWZlc3QuanNvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmJ1aWxkVGFyZ2V0ID09PSAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUGF0aChcbiAgICAgICAgJy52ZXJjZWwvb3V0cHV0L2RpYWdub3N0aWNzL3dvcmtmbG93cy1tYW5pZmVzdC5qc29uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIGEgZGV2ZWxvcG1lbnQvd2F0Y2ggYnVpbGQgKGUuZy4gYG5leHQgZGV2YCwgYG5pdHJvIGRldmAsXG4gICAqIG9yIGEgVml0ZS1iYXNlZCBkZXYgc2VydmVyIGZvciBhc3Ryby9zdmVsdGVraXQvdml0ZSkuIGBjb25maWcud2F0Y2hgIGlzXG4gICAqIHBsdW1iZWQgYnkgdGhlIGJ1aWxkZXJzIHRoYXQgb3duIGEgZGV2IHNlcnZlciAobmV4dCwgbml0cm8sIG5lc3QpOyB0aGVcbiAgICogVml0ZS1iYXNlZCBpbnRlZ3JhdGlvbnMgZG9uJ3Qgc2V0IGl0IGJ1dCBydW4gd2l0aFxuICAgKiBgTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdgLiBXaGVuIG5laXRoZXIgc2lnbmFsIGlzIHByZXNlbnQgd2UgdHJlYXQgdGhlXG4gICAqIGJ1aWxkIGFzIHByb2R1Y3Rpb24sIHNvIENMSS9WZXJjZWwgcHJvZHVjdGlvbiBidWlsZHMgZGVmYXVsdCB0byBvZmYuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzRGV2ZWxvcG1lbnRCdWlsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud2F0Y2ggPT09IHRydWUgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBzb3VyY2UgbWFwIG1vZGUgZm9yIHRoZSBzdGFjay1yZWxldmFudCBidW5kbGVzIChzdGVwcyArIHRoZVxuICAgKiBpbnRlcm1lZGlhdGUgd29ya2Zsb3cgVk0gYnVuZGxlKTogaW5saW5lIHNvdXJjZSBtYXBzIGluIGRldmVsb3BtZW50IHNvXG4gICAqIHN0YWNrIHRyYWNlcyBwb2ludCBhdCBzb3VyY2UgZmlsZXMsIGFuZCBvZmYgaW4gcHJvZHVjdGlvbiBzbyBmdW5jdGlvblxuICAgKiBidW5kbGVzIHN0YXkgc21hbGwgKGhlbHBzIHN0YXkgdW5kZXIgdGhlIFZlcmNlbCAyNTBNQiBmdW5jdGlvbiBsaW1pdCkgYW5kXG4gICAqIHNraXAgdGhlIHNvdXJjZS1tYXAtc3VwcG9ydCBydW50aW1lIHNoaW0uIFRoZSBgc291cmNlbWFwYCBjb25maWcgb3B0aW9uXG4gICAqIGFuZCBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnYgdmFyIG92ZXJyaWRlIHRoaXMgaW4gZWl0aGVyIGVudmlyb25tZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkZWZhdWx0U291cmNlbWFwTW9kZSgpOiBTb3VyY2VtYXBNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5pc0RldmVsb3BtZW50QnVpbGQgPyAnaW5saW5lJyA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBzb3VyY2UgbWFwIG1vZGUgZm9yIGEgZ2l2ZW4gY2FsbCBzaXRlLiBQcmVjZWRlbmNlOlxuICAgKiBleHBsaWNpdCBgc291cmNlbWFwYCBjb25maWcgPiBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnYgdmFyID4gdGhlIGNhbGxcbiAgICogc2l0ZSdzIGRlZmF1bHQuIFJldHVybmVkIHZhbHVlIGlzIHBhc3NlZCBkaXJlY3RseSB0byBlc2J1aWxkJ3NcbiAgICogYHNvdXJjZW1hcGAgb3B0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVTb3VyY2VtYXAoZGVmYXVsdE1vZGU6IFNvdXJjZW1hcE1vZGUpOiBTb3VyY2VtYXBNb2RlIHtcbiAgICBpZiAodGhpcy5jb25maWcuc291cmNlbWFwICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmNvbmZpZy5zb3VyY2VtYXA7XG4gICAgY29uc3QgZW52TW9kZSA9IHBhcnNlU291cmNlbWFwRW52KHByb2Nlc3MuZW52LldPUktGTE9XX1NPVVJDRU1BUCk7XG4gICAgaWYgKGVudk1vZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGVudk1vZGU7XG4gICAgcmV0dXJuIGRlZmF1bHRNb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgd2hldGhlciB3b3JrZmxvdy9zdGVwIGZpbGVzIHVuZGVyIGBub2RlX21vZHVsZXNgIGFyZSBkaXNjb3ZlcmVkLlxuICAgKiBQcmVjZWRlbmNlOiBleHBsaWNpdCBgZGlzY292ZXJXb3JrZmxvd3NJbk5vZGVNb2R1bGVzYCBjb25maWcgPiB0aGVcbiAgICogYFdPUktGTE9XX0RJU0NPVkVSX05PREVfTU9EVUxFU2AgZW52IHZhciAoYDBgL2BmYWxzZWAgZGlzYWJsZXMpID4gdGhlXG4gICAqIGRlZmF1bHQgKGB0cnVlYCwgZGlzY292ZXIgdGhlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZURpc2NvdmVyV29ya2Zsb3dzSW5Ob2RlTW9kdWxlcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGlzY292ZXJXb3JrZmxvd3NJbk5vZGVNb2R1bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kaXNjb3ZlcldvcmtmbG93c0luTm9kZU1vZHVsZXM7XG4gICAgfVxuICAgIGNvbnN0IGVudlZhbHVlID0gcGFyc2VEaXNjb3Zlck5vZGVNb2R1bGVzRW52KFxuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfRElTQ09WRVJfTk9ERV9NT0RVTEVTXG4gICAgKTtcbiAgICBpZiAoZW52VmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGVudlZhbHVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJlc29sdmVkIHNvdXJjZSBtYXAgbW9kZSBlbWl0cyBhbnkgc291cmNlIG1hcHMgYXQgYWxsLlxuICAgKiBVc2VkIGJ5IGNvbnN1bWVycyBsaWtlIHRoZSBWZXJjZWwgYnVpbGRlciB0byBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlXG4gICAqIHRoZSBzb3VyY2UtbWFwLXN1cHBvcnQgcnVudGltZSBzaGltIGluIGdlbmVyYXRlZCBmdW5jdGlvbnMuIFVzZXMgdGhlIHNhbWVcbiAgICogZW52aXJvbm1lbnQtYXdhcmUgZGVmYXVsdCAoYGRlZmF1bHRTb3VyY2VtYXBNb2RlYCkgYXMgdGhlIHN0ZXAvd29ya2Zsb3dcbiAgICogYnVuZGxlcywgc28gYSBwcm9kdWN0aW9uIGJ1aWxkIHdpdGggbm8gb3ZlcnJpZGUgb21pdHMgdGhlIHNoaW0uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNvdXJjZW1hcHNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTb3VyY2VtYXAodGhpcy5kZWZhdWx0U291cmNlbWFwTW9kZSkgIT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBtYW5pZmVzdCBKU09OIGZpbGUgY29udGFpbmluZyBzdGVwL3dvcmtmbG93L2NsYXNzIG1ldGFkYXRhXG4gICAqIGFuZCBncmFwaCBkYXRhIGZvciB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbWFuaWZlc3QgSlNPTiBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBtYW5pZmVzdCBjcmVhdGlvbiBmYWlsZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlTWFuaWZlc3Qoe1xuICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICBtYW5pZmVzdERpcixcbiAgICBtYW5pZmVzdCxcbiAgfToge1xuICAgIHdvcmtmbG93QnVuZGxlUGF0aDogc3RyaW5nO1xuICAgIG1hbmlmZXN0RGlyOiBzdHJpbmc7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJ1aWxkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubG9nQ3JlYXRlTWFuaWZlc3RJbmZvKCdDcmVhdGluZyBtYW5pZmVzdC4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93R3JhcGhzID0gYXdhaXQgZXh0cmFjdFdvcmtmbG93R3JhcGhzKHdvcmtmbG93QnVuZGxlUGF0aCk7XG5cbiAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5jb252ZXJ0U3RlcHNNYW5pZmVzdChtYW5pZmVzdC5zdGVwcyk7XG4gICAgICBjb25zdCB3b3JrZmxvd3MgPSB0aGlzLmNvbnZlcnRXb3JrZmxvd3NNYW5pZmVzdChcbiAgICAgICAgbWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICB3b3JrZmxvd0dyYXBoc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmNvbnZlcnRDbGFzc2VzTWFuaWZlc3QobWFuaWZlc3QuY2xhc3Nlcyk7XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgICAgc3RlcHM6IHNvcnRNYW5pZmVzdEVudHJpZXMoc3RlcHMpLFxuICAgICAgICB3b3JrZmxvd3M6IHNvcnRNYW5pZmVzdEVudHJpZXMod29ya2Zsb3dzKSxcbiAgICAgICAgY2xhc3Nlczogc29ydE1hbmlmZXN0RW50cmllcyhjbGFzc2VzKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnN0cmluZ2lmeShvdXRwdXQsIG51bGwsIDIpO1xuXG4gICAgICBhd2FpdCBta2RpcihtYW5pZmVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGVJZkNoYW5nZWQoXG4gICAgICAgIGpvaW4obWFuaWZlc3REaXIsICdtYW5pZmVzdC5qc29uJyksXG4gICAgICAgIG1hbmlmZXN0SnNvblxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggPSB0aGlzLmdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk7XG4gICAgICBpZiAoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3RvcnkoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGVJZkNoYW5nZWQoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgsIG1hbmlmZXN0SnNvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE9iamVjdC52YWx1ZXMoc3RlcHMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgcykgPT4gYWNjICsgT2JqZWN0LmtleXMocykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgY29uc3Qgd29ya2Zsb3dDb3VudCA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3dzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHcpID0+IGFjYyArIE9iamVjdC5rZXlzKHcpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzQ291bnQgPSBPYmplY3QudmFsdWVzKGNsYXNzZXMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgYykgPT4gYWNjICsgT2JqZWN0LmtleXMoYykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyhcbiAgICAgICAgYENyZWF0ZWQgbWFuaWZlc3Qgd2l0aCAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9LCBhbmQgJHtjbGFzc0NvdW50fSAke3BsdXJhbGl6ZSgnY2xhc3MnLCAnY2xhc3NlcycsIGNsYXNzQ291bnQpfWAsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidWlsZFN0YXJ0fW1zYFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9ncykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICB0aGlzLmdldFdvcmtmbG93QnVpbGRTdW1tYXJ5KHtcbiAgICAgICAgICAgIHN0ZXBDb3VudCxcbiAgICAgICAgICAgIHdvcmtmbG93Q291bnQsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzZXRXb3JrZmxvd0J1aWxkVGltZXIoKTtcblxuICAgICAgcmV0dXJuIG1hbmlmZXN0SnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBtYW5pZmVzdDonLFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICk7XG4gICAgICB0aGlzLnJlc2V0V29ya2Zsb3dCdWlsZFRpbWVyKCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0ZXBzTWFuaWZlc3QoXG4gICAgc3RlcHM6IFdvcmtmbG93TWFuaWZlc3RbJ3N0ZXBzJ11cbiAgKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIXN0ZXBzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKHN0ZXBzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHsgc3RlcElkOiBkYXRhLnN0ZXBJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V29ya2Zsb3dzTWFuaWZlc3QoXG4gICAgd29ya2Zsb3dzOiBXb3JrZmxvd01hbmlmZXN0Wyd3b3JrZmxvd3MnXSxcbiAgICBncmFwaHM6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9PlxuICAgID5cbiAgKTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgPlxuICA+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgICA+XG4gICAgPiA9IHt9O1xuICAgIGlmICghd29ya2Zsb3dzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gQnVpbGQgYSBub3JtYWxpemVkIGxvb2t1cCBmb3IgZ3JhcGhzIHNpbmNlIHRoZSBncmFwaCBleHRyYWN0b3IgdXNlc1xuICAgIC8vIHBhdGhzIGZyb20gd29ya2Zsb3dJZCAoZS5nLiBcIi4vd29ya2Zsb3dzL2hlbGxvLWFnZW50XCIpIHdoaWxlIHRoZVxuICAgIC8vIG1hbmlmZXN0IHVzZXMgc291cmNlIGZpbGUgcGF0aHMgKGUuZy4gXCJ3b3JrZmxvd3MvaGVsbG8tYWdlbnQudHNcIikuXG4gICAgLy8gTm9ybWFsaXplIGJ5IHN0cmlwcGluZyBsZWFkaW5nIFwiLi9cIiBhbmQgZmlsZSBleHRlbnNpb25zLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWRHcmFwaHMgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkPHN0cmluZywgeyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH0+XG4gICAgPigpO1xuICAgIGZvciAoY29uc3QgW2dyYXBoUGF0aCwgZ3JhcGhFbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhncmFwaHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZ3JhcGhQYXRoXG4gICAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuICAgICAgbm9ybWFsaXplZEdyYXBocy5zZXQobm9ybWFsaXplZCwgZ3JhcGhFbnRyaWVzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSBtYW5pZmVzdCBmaWxlIHBhdGggZm9yIGxvb2t1cFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gZmlsZVBhdGhcbiAgICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XG5cbiAgICAgIGNvbnN0IGdyYXBoRW50cmllcyA9XG4gICAgICAgIGdyYXBoc1tmaWxlUGF0aF0gfHwgbm9ybWFsaXplZEdyYXBocy5nZXQobm9ybWFsaXplZEZpbGVQYXRoKTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHtcbiAgICAgICAgICB3b3JrZmxvd0lkOiBkYXRhLndvcmtmbG93SWQsXG4gICAgICAgICAgZ3JhcGg6IGdyYXBoRW50cmllcz8uW25hbWVdPy5ncmFwaCB8fCB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDbGFzc2VzTWFuaWZlc3QoXG4gICAgY2xhc3NlczogV29ya2Zsb3dNYW5pZmVzdFsnY2xhc3NlcyddXG4gICk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY2xhc3NJZDogc3RyaW5nIH0+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IGNsYXNzSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIWNsYXNzZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY2xhc3NlcykpIHtcbiAgICAgIHJlc3VsdFtmaWxlUGF0aF0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHJlc3VsdFtmaWxlUGF0aF1bbmFtZV0gPSB7IGNsYXNzSWQ6IGRhdGEuY2xhc3NJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=